├── .editorconfig ├── .github ├── dependabot.yml └── workflows │ ├── node.js.yml │ └── release.yml ├── .gitignore ├── .npmignore ├── CONTRIBUTING.md ├── HISTORY.md ├── LICENSE ├── README.md ├── benchmarks ├── benchmarks.js ├── index.html ├── run.js └── runInBrowser.js ├── bind.d.ts ├── bind.js ├── dedupe.d.ts ├── dedupe.js ├── index.d.ts ├── index.js ├── package-lock.json ├── package.json └── tests ├── bind.js ├── bind.test-d.ts ├── dedupe.js ├── dedupe.test-d.ts ├── index.js └── index.test-d.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | root = true 4 | 5 | [*] 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = false 9 | insert_final_newline = true 10 | indent_style = tab 11 | 12 | [*.json] 13 | indent_style = space 14 | indent_size = 2 15 | 16 | [*.yml] 17 | indent_style = space 18 | indent_size = 2 19 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: / 5 | schedule: 6 | interval: daily 7 | - package-ecosystem: npm 8 | directory: / 9 | rebase-strategy: disabled 10 | versioning-strategy: increase 11 | schedule: 12 | interval: daily 13 | -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | name: Node.js CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | 9 | jobs: 10 | test: 11 | name: Run tests on supported Node.js versions 12 | runs-on: ubuntu-latest 13 | 14 | strategy: 15 | fail-fast: false 16 | matrix: 17 | # See supported Node.js versions at https://nodejs.org/en/about/previous-releases 18 | node-version: [18, 20, 21] 19 | 20 | steps: 21 | - name: Check out repository 22 | uses: actions/checkout@v4 23 | 24 | - name: Set up Node.js 25 | uses: actions/setup-node@v4 26 | with: 27 | node-version: ${{ matrix.node-version }} 28 | cache: npm 29 | 30 | - name: Install dependencies 31 | run: npm ci 32 | 33 | - name: Run tests 34 | run: npm test 35 | 36 | check-types: 37 | name: Check type definitions 38 | runs-on: ubuntu-latest 39 | 40 | steps: 41 | - name: Check out repository 42 | uses: actions/checkout@v4 43 | 44 | - name: Set up Node.js 45 | uses: actions/setup-node@v4 46 | with: 47 | node-version: 20 48 | cache: npm 49 | 50 | - name: Install dependencies 51 | run: npm ci 52 | 53 | - name: Check type definitions 54 | run: npm run check-types 55 | 56 | benchmarks: 57 | name: Run benchmarks 58 | runs-on: ubuntu-latest 59 | 60 | steps: 61 | - name: Check out repository 62 | uses: actions/checkout@v4 63 | 64 | - name: Set up Node.js 65 | uses: actions/setup-node@v4 66 | with: 67 | node-version: 20 68 | cache: npm 69 | 70 | - name: Install dependencies 71 | run: npm ci 72 | 73 | - name: Run benchmarks 74 | run: npm run bench 75 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | permissions: 7 | id-token: write 8 | 9 | jobs: 10 | publish: 11 | name: Publish package to NPM 12 | runs-on: ubuntu-latest 13 | environment: release 14 | 15 | steps: 16 | - name: Check out repository 17 | uses: actions/checkout@v4 18 | with: 19 | fetch-depth: 0 20 | persist-credentials: false 21 | 22 | - name: Set up Node.js 23 | uses: actions/setup-node@v4 24 | with: 25 | node-version: 20 26 | cache: npm 27 | registry-url: https://registry.npmjs.org 28 | 29 | - name: Publish to NPM 30 | run: npm publish 31 | env: 32 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 33 | NPM_CONFIG_PROVENANCE: true 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory 14 | coverage 15 | 16 | # Compiled binary addons (http://nodejs.org/api/addons.html) 17 | build/Release 18 | 19 | # Dependency directory 20 | node_modules 21 | 22 | # Users Environment Variables 23 | .lock-wscript 24 | 25 | # Mac OS X DS_Store 26 | .DS_Store 27 | 28 | benchmarks/runInBrowser.bundle.js 29 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /.*/ 2 | /.* 3 | /benchmarks/ 4 | /tests/ 5 | /CONTRIBUTING.md 6 | /HISTORY.md 7 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Thanks for your interest in classNames. Issues, PRs and suggestions welcome :) 4 | 5 | Before working on a PR, please consider the following: 6 | 7 | * Speed is a serious concern for this package as it is likely to be called a 8 | significant number of times in any project that uses it. As such, new features 9 | will only be accepted if they improve (or at least do not negatively impact) 10 | performance. 11 | * To demonstrate performance differences please set up a 12 | [JSPerf](http://jsperf.com) test and link to it from your issue / PR. 13 | * Tests must be added for any change or new feature before it will be accepted. 14 | 15 | A benchmark utility is included so that changes may be tested against the 16 | current published version. To run the benchmarks, run `npm install` in the 17 | root directory then run `npm run bench`. 18 | 19 | Please be aware though that local benchmarks are just a smoke-signal; they will 20 | run in the v8 version that your local Node.js uses, while classNames is _most_ 21 | often run across a wide variety of browsers and browser versions. 22 | 23 | It is recommended to test possible regressions in performance in all major 24 | browsers. This can be done by running `npm run bench-browser`, the benchmark 25 | will then be served from http://localhost:8080. 26 | -------------------------------------------------------------------------------- /HISTORY.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## v2.5.1 / 2023-12-29 4 | 5 | - Remove `workspaces` field from package ([#350](https://github.com/JedWatson/classnames/pull/350)) 6 | 7 | ## v2.5.0 / 2023-12-27 8 | 9 | - Restore ability to pass a TypeScript `interface` ([#341](https://github.com/JedWatson/classnames/pull/341)) 10 | - Add `exports` field to package ([#342](https://github.com/JedWatson/classnames/pull/342)) 11 | 12 | ## v2.4.0 / 2023-12-26 13 | 14 | - Use string concatenation to increase performance thanks [Jon Koops](https://github.com/jonkoops) ([#336](https://github.com/JedWatson/classnames/pull/336)) 15 | 16 | ## v2.3.3 / 2023-12-21 17 | 18 | - Fix default export, thanks [Remco Haszing](https://github.com/remcohaszing) ([#301](https://github.com/JedWatson/classnames/pull/301)) 19 | - Fix types for read-only arrays, thanks [Ben Thompson](https://github.com/BenGearset) ([#307](https://github.com/JedWatson/classnames/pull/307)) 20 | - Replace README examples with functional-style components, thanks [JoeDGit](https://github.com/JoeDGit) ([#303](https://github.com/JedWatson/classnames/pull/303)) 21 | 22 | ## v2.3.2 / 2022-09-13 23 | 24 | - Fix TypeScript types when using require, thanks [Mark Dalgleish](https://github.com/markdalgleish) ([#276](https://github.com/JedWatson/classnames/pull/276)) 25 | - Fix toString as `[Object object]` in a vm, thanks [Remco Haszing](https://github.com/remcohaszing) ([#281](https://github.com/JedWatson/classnames/pull/281)) 26 | 27 | ## v2.3.1 / 2021-04-03 28 | 29 | - Fix bind/dedupe TypeScript types exports 30 | - Fix mapping Value types, thanks [Remco Haszing](https://github.com/remcohaszing) 31 | - Removed non-existent named exports from types, thanks [Remco Haszing](https://github.com/remcohaszing) 32 | 33 | ## v2.3.0 / 2021-04-01 34 | 35 | - Added TypeScript types 36 | - Added consistent support for custom `.toString()` methods on arguments, thanks [Stanislav Titenko](https://github.com/resetko) 37 | 38 | ## v2.2.6 / 2018-06-08 39 | 40 | - Fixed compatibility issue with usage in an es module environment 41 | 42 | ## v2.2.5 / 2016-05-02 43 | 44 | - Improved performance of `dedupe` variant even further, thanks [Andres Suarez](https://github.com/zertosh) 45 | 46 | ## v2.2.4 / 2016-04-25 47 | 48 | - Improved performance of `dedupe` variant by about 2x, thanks [Bartosz Gościński](https://github.com/bgoscinski) 49 | 50 | ## v2.2.3 / 2016-01-05 51 | 52 | - Updated `bind` variant to use `[].join(' ')` as per the main script in 2.2.2 53 | 54 | ## v2.2.2 / 2016-01-04 55 | 56 | - Switched from string concatenation to `[].join(' ')` for a slight performance gain in the main function. 57 | 58 | ## v2.2.1 / 2015-11-26 59 | 60 | - Add deps parameter to the AMD module, fixes an issue using the Dojo loader, thanks [Chris Jordan](https://github.com/flipperkid) 61 | 62 | ## v2.2.0 / 2015-10-18 63 | 64 | - added a new `bind` variant for use with [css-modules](https://github.com/css-modules/css-modules) and similar abstractions, thanks to [Kirill Yakovenko](https://github.com/blia) 65 | 66 | ## v2.1.5 / 2015-09-30 67 | 68 | - reverted a new usage of `Object.keys` in `dedupe.js` that slipped through in the last release 69 | 70 | ## v2.1.4 / 2015-09-30 71 | 72 | - new case added to benchmarks 73 | - safer `hasOwnProperty` check 74 | - AMD module is now named, so you can do the following: 75 | 76 | ``` 77 | define(["classnames"], function (classNames) { 78 | var style = classNames("foo", "bar"); 79 | // ... 80 | }); 81 | ``` 82 | 83 | ## v2.1.3 / 2015-07-02 84 | 85 | - updated UMD wrapper to support AMD and CommonJS on the same pacge 86 | 87 | ## v2.1.2 / 2015-05-28 88 | 89 | - added a proper UMD wrapper 90 | 91 | ## v2.1.1 / 2015-05-06 92 | 93 | - minor performance improvement thanks to type caching 94 | - improved benchmarking and results output 95 | 96 | ## v2.1.0 / 2015-05-05 97 | 98 | - added alternate `dedupe` version of classNames, which is slower (10x) but ensures that if a class is added then overridden by a falsy value in a subsequent argument, it is excluded from the result. 99 | 100 | ## v2.0.0 / 2015-05-03 101 | 102 | - performance improvement; switched to `Array.isArray` for type detection, which is much faster in modern browsers. A polyfill is now required for IE8 support, see the Readme for details. 103 | 104 | ## v1.2.2 / 2015-04-28 105 | 106 | - license comment updates to simplify certain build scenarios 107 | 108 | ## v1.2.1 / 2015-04-22 109 | 110 | - added safe exporting for requireJS usage 111 | - clarified Bower usage and instructions 112 | 113 | ## v1.2.0 / 2015-03-17 114 | 115 | - added comprehensive support for array arguments, including nested arrays 116 | - simplified code slightly 117 | 118 | ## Previous 119 | 120 | Please see the git history for the details of previous versions. 121 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Jed Watson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Classnames 2 | 3 | > A simple JavaScript utility for conditionally joining classNames together. 4 | 5 |

6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |

17 | 18 | Install from the [npm registry](https://www.npmjs.com/) with your package manager: 19 | ```bash 20 | npm install classnames 21 | ``` 22 | 23 | Use with [Node.js](https://nodejs.org/en/), [Browserify](https://browserify.org/), or [webpack](https://webpack.github.io/): 24 | 25 | ```js 26 | const classNames = require('classnames'); 27 | classNames('foo', 'bar'); // => 'foo bar' 28 | ``` 29 | 30 | Alternatively, you can simply include `index.js` on your page with a standalone ` 10 | 11 | 12 | -------------------------------------------------------------------------------- /benchmarks/run.js: -------------------------------------------------------------------------------- 1 | import { runBenchmarks } from './benchmarks.js'; 2 | 3 | await runBenchmarks(); 4 | -------------------------------------------------------------------------------- /benchmarks/runInBrowser.js: -------------------------------------------------------------------------------- 1 | import { runBenchmarks } from './benchmarks.js'; 2 | 3 | const startButton = document.getElementById('start'); 4 | 5 | startButton.addEventListener('click', async () => { 6 | startButton.disabled = true; 7 | await runBenchmarks(); 8 | startButton.disabled = false; 9 | }); 10 | -------------------------------------------------------------------------------- /bind.d.ts: -------------------------------------------------------------------------------- 1 | import { ArgumentArray } from './index.js'; 2 | export type Binding = Record; 3 | export default function classNames(this: Binding | undefined, ...args: ArgumentArray): string; 4 | -------------------------------------------------------------------------------- /bind.js: -------------------------------------------------------------------------------- 1 | const hasOwn = {}.hasOwnProperty; 2 | 3 | export default function classNames () { 4 | let classes = ''; 5 | 6 | for (let i = 0; i < arguments.length; i++) { 7 | const arg = arguments[i]; 8 | if (arg) { 9 | classes = appendClass(classes, parseValue.call(this, arg)); 10 | } 11 | } 12 | 13 | return classes; 14 | } 15 | 16 | function parseValue (arg) { 17 | if (typeof arg === 'string') { 18 | return this && this[arg] || arg; 19 | } 20 | 21 | if (typeof arg !== 'object') { 22 | return ''; 23 | } 24 | 25 | if (Array.isArray(arg)) { 26 | return classNames.apply(this, arg); 27 | } 28 | 29 | if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) { 30 | return arg.toString(); 31 | } 32 | 33 | let classes = ''; 34 | 35 | for (const key in arg) { 36 | if (hasOwn.call(arg, key) && arg[key]) { 37 | classes = appendClass(classes, this && this[key] || key); 38 | } 39 | } 40 | 41 | return classes; 42 | } 43 | 44 | function appendClass (value, newClass) { 45 | if (!newClass) { 46 | return value; 47 | } 48 | 49 | return value ? (value + ' ' + newClass) : newClass; 50 | } 51 | -------------------------------------------------------------------------------- /dedupe.d.ts: -------------------------------------------------------------------------------- 1 | import classNames from './index.js'; 2 | export default classNames; 3 | -------------------------------------------------------------------------------- /dedupe.js: -------------------------------------------------------------------------------- 1 | // Don't inherit from Object so we can skip hasOwnProperty check later. 2 | function StorageObject () {} 3 | StorageObject.prototype = Object.create(null); 4 | 5 | export default function classNames () { 6 | const classSet = new StorageObject(); 7 | appendArray(classSet, arguments); 8 | 9 | let classes = ''; 10 | 11 | for (const key in classSet) { 12 | if (classSet[key]) { 13 | classes += classes ? (' ' + key) : key; 14 | } 15 | } 16 | 17 | return classes; 18 | } 19 | 20 | function appendValue (classSet, arg) { 21 | if (!arg) return; 22 | const argType = typeof arg; 23 | 24 | if (argType === 'string') { 25 | appendString(classSet, arg); 26 | } else if (Array.isArray(arg)) { 27 | appendArray(classSet, arg); 28 | } else if (argType === 'object') { 29 | appendObject(classSet, arg); 30 | } 31 | } 32 | 33 | const SPACE = /\s+/; 34 | 35 | function appendString (classSet, str) { 36 | const array = str.split(SPACE); 37 | const length = array.length; 38 | 39 | for (let i = 0; i < length; i++) { 40 | classSet[array[i]] = true; 41 | } 42 | } 43 | 44 | function appendArray (classSet, array) { 45 | const length = array.length; 46 | 47 | for (let i = 0; i < length; i++) { 48 | appendValue(classSet, array[i]); 49 | } 50 | } 51 | 52 | const hasOwn = {}.hasOwnProperty; 53 | 54 | function appendObject (classSet, object) { 55 | if ( 56 | object.toString !== Object.prototype.toString && 57 | !object.toString.toString().includes('[native code]') 58 | ) { 59 | classSet[object.toString()] = true; 60 | return; 61 | } 62 | 63 | for (const k in object) { 64 | if (hasOwn.call(object, k)) { 65 | // Set value to false instead of deleting it to avoid changing object structure. 66 | // https://www.smashingmagazine.com/2012/11/writing-fast-memory-efficient-javascript/#de-referencing-misconceptions 67 | classSet[k] = !!object[k]; 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | // LICENSE is MIT 2 | // 3 | // Copyright (c) 2018 4 | // Dave Keen 5 | // Adi Dahiya 6 | // Jason Killian 7 | // Sean Kelley 8 | // Michal Adamczyk 9 | // Marvin Hagemeister 10 | export type Value = string | boolean | undefined | null; 11 | export type Mapping = Record; 12 | export interface ArgumentArray extends Array {} 13 | export interface ReadonlyArgumentArray extends ReadonlyArray {} 14 | export type Argument = Value | Mapping | ArgumentArray | ReadonlyArgumentArray; 15 | /** 16 | * A simple JavaScript utility for conditionally joining classNames together. 17 | */ 18 | export default function classNames(...args: ArgumentArray): string; 19 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const hasOwn = {}.hasOwnProperty; 2 | 3 | export default function classNames () { 4 | let classes = ''; 5 | 6 | for (let i = 0; i < arguments.length; i++) { 7 | const arg = arguments[i]; 8 | if (arg) { 9 | classes = appendClass(classes, parseValue(arg)); 10 | } 11 | } 12 | 13 | return classes; 14 | } 15 | 16 | function parseValue (arg) { 17 | if (typeof arg === 'string') { 18 | return arg; 19 | } 20 | 21 | if (typeof arg !== 'object') { 22 | return ''; 23 | } 24 | 25 | if (Array.isArray(arg)) { 26 | return classNames.apply(null, arg); 27 | } 28 | 29 | if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) { 30 | return arg.toString(); 31 | } 32 | 33 | let classes = ''; 34 | 35 | for (const key in arg) { 36 | if (hasOwn.call(arg, key) && arg[key]) { 37 | classes = appendClass(classes, key); 38 | } 39 | } 40 | 41 | return classes; 42 | } 43 | 44 | function appendClass (value, newClass) { 45 | if (!newClass) { 46 | return value; 47 | } 48 | 49 | return value ? (value + ' ' + newClass) : newClass; 50 | } 51 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "classnames", 3 | "version": "2.5.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "dev": true, 7 | "packages": { 8 | "": { 9 | "name": "classnames", 10 | "version": "2.5.1", 11 | "dev": true, 12 | "license": "MIT", 13 | "devDependencies": { 14 | "@rollup/plugin-commonjs": "^28.0.3", 15 | "@rollup/plugin-json": "^6.1.0", 16 | "@rollup/plugin-node-resolve": "^16.0.1", 17 | "classnames-local": "file:.", 18 | "classnames-npm": "npm:classnames@*", 19 | "http-server": "^14.1.1", 20 | "markdown-table": "^3.0.4", 21 | "rollup": "^4.39.0", 22 | "tinybench": "^4.0.1", 23 | "tsd": "^0.31.2" 24 | } 25 | }, 26 | "node_modules/@babel/code-frame": { 27 | "version": "7.23.5", 28 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", 29 | "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", 30 | "dev": true, 31 | "dependencies": { 32 | "@babel/highlight": "^7.23.4", 33 | "chalk": "^2.4.2" 34 | }, 35 | "engines": { 36 | "node": ">=6.9.0" 37 | } 38 | }, 39 | "node_modules/@babel/code-frame/node_modules/ansi-styles": { 40 | "version": "3.2.1", 41 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 42 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 43 | "dev": true, 44 | "dependencies": { 45 | "color-convert": "^1.9.0" 46 | }, 47 | "engines": { 48 | "node": ">=4" 49 | } 50 | }, 51 | "node_modules/@babel/code-frame/node_modules/chalk": { 52 | "version": "2.4.2", 53 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 54 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 55 | "dev": true, 56 | "dependencies": { 57 | "ansi-styles": "^3.2.1", 58 | "escape-string-regexp": "^1.0.5", 59 | "supports-color": "^5.3.0" 60 | }, 61 | "engines": { 62 | "node": ">=4" 63 | } 64 | }, 65 | "node_modules/@babel/code-frame/node_modules/color-convert": { 66 | "version": "1.9.3", 67 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 68 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 69 | "dev": true, 70 | "dependencies": { 71 | "color-name": "1.1.3" 72 | } 73 | }, 74 | "node_modules/@babel/code-frame/node_modules/color-name": { 75 | "version": "1.1.3", 76 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 77 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 78 | "dev": true 79 | }, 80 | "node_modules/@babel/code-frame/node_modules/has-flag": { 81 | "version": "3.0.0", 82 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 83 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 84 | "dev": true, 85 | "engines": { 86 | "node": ">=4" 87 | } 88 | }, 89 | "node_modules/@babel/code-frame/node_modules/supports-color": { 90 | "version": "5.5.0", 91 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 92 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 93 | "dev": true, 94 | "dependencies": { 95 | "has-flag": "^3.0.0" 96 | }, 97 | "engines": { 98 | "node": ">=4" 99 | } 100 | }, 101 | "node_modules/@babel/helper-validator-identifier": { 102 | "version": "7.22.20", 103 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", 104 | "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", 105 | "dev": true, 106 | "engines": { 107 | "node": ">=6.9.0" 108 | } 109 | }, 110 | "node_modules/@babel/highlight": { 111 | "version": "7.23.4", 112 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", 113 | "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", 114 | "dev": true, 115 | "dependencies": { 116 | "@babel/helper-validator-identifier": "^7.22.20", 117 | "chalk": "^2.4.2", 118 | "js-tokens": "^4.0.0" 119 | }, 120 | "engines": { 121 | "node": ">=6.9.0" 122 | } 123 | }, 124 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 125 | "version": "3.2.1", 126 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 127 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 128 | "dev": true, 129 | "dependencies": { 130 | "color-convert": "^1.9.0" 131 | }, 132 | "engines": { 133 | "node": ">=4" 134 | } 135 | }, 136 | "node_modules/@babel/highlight/node_modules/chalk": { 137 | "version": "2.4.2", 138 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 139 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 140 | "dev": true, 141 | "dependencies": { 142 | "ansi-styles": "^3.2.1", 143 | "escape-string-regexp": "^1.0.5", 144 | "supports-color": "^5.3.0" 145 | }, 146 | "engines": { 147 | "node": ">=4" 148 | } 149 | }, 150 | "node_modules/@babel/highlight/node_modules/color-convert": { 151 | "version": "1.9.3", 152 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 153 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 154 | "dev": true, 155 | "dependencies": { 156 | "color-name": "1.1.3" 157 | } 158 | }, 159 | "node_modules/@babel/highlight/node_modules/color-name": { 160 | "version": "1.1.3", 161 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 162 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 163 | "dev": true 164 | }, 165 | "node_modules/@babel/highlight/node_modules/has-flag": { 166 | "version": "3.0.0", 167 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 168 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 169 | "dev": true, 170 | "engines": { 171 | "node": ">=4" 172 | } 173 | }, 174 | "node_modules/@babel/highlight/node_modules/supports-color": { 175 | "version": "5.5.0", 176 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 177 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 178 | "dev": true, 179 | "dependencies": { 180 | "has-flag": "^3.0.0" 181 | }, 182 | "engines": { 183 | "node": ">=4" 184 | } 185 | }, 186 | "node_modules/@jest/schemas": { 187 | "version": "29.6.3", 188 | "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", 189 | "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", 190 | "dev": true, 191 | "dependencies": { 192 | "@sinclair/typebox": "^0.27.8" 193 | }, 194 | "engines": { 195 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 196 | } 197 | }, 198 | "node_modules/@jridgewell/sourcemap-codec": { 199 | "version": "1.4.15", 200 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 201 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 202 | "dev": true 203 | }, 204 | "node_modules/@nodelib/fs.scandir": { 205 | "version": "2.1.5", 206 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 207 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 208 | "dev": true, 209 | "dependencies": { 210 | "@nodelib/fs.stat": "2.0.5", 211 | "run-parallel": "^1.1.9" 212 | }, 213 | "engines": { 214 | "node": ">= 8" 215 | } 216 | }, 217 | "node_modules/@nodelib/fs.stat": { 218 | "version": "2.0.5", 219 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 220 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 221 | "dev": true, 222 | "engines": { 223 | "node": ">= 8" 224 | } 225 | }, 226 | "node_modules/@nodelib/fs.walk": { 227 | "version": "1.2.8", 228 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 229 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 230 | "dev": true, 231 | "dependencies": { 232 | "@nodelib/fs.scandir": "2.1.5", 233 | "fastq": "^1.6.0" 234 | }, 235 | "engines": { 236 | "node": ">= 8" 237 | } 238 | }, 239 | "node_modules/@rollup/plugin-commonjs": { 240 | "version": "28.0.3", 241 | "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.3.tgz", 242 | "integrity": "sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==", 243 | "dev": true, 244 | "license": "MIT", 245 | "dependencies": { 246 | "@rollup/pluginutils": "^5.0.1", 247 | "commondir": "^1.0.1", 248 | "estree-walker": "^2.0.2", 249 | "fdir": "^6.2.0", 250 | "is-reference": "1.2.1", 251 | "magic-string": "^0.30.3", 252 | "picomatch": "^4.0.2" 253 | }, 254 | "engines": { 255 | "node": ">=16.0.0 || 14 >= 14.17" 256 | }, 257 | "peerDependencies": { 258 | "rollup": "^2.68.0||^3.0.0||^4.0.0" 259 | }, 260 | "peerDependenciesMeta": { 261 | "rollup": { 262 | "optional": true 263 | } 264 | } 265 | }, 266 | "node_modules/@rollup/plugin-json": { 267 | "version": "6.1.0", 268 | "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", 269 | "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", 270 | "dev": true, 271 | "dependencies": { 272 | "@rollup/pluginutils": "^5.1.0" 273 | }, 274 | "engines": { 275 | "node": ">=14.0.0" 276 | }, 277 | "peerDependencies": { 278 | "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 279 | }, 280 | "peerDependenciesMeta": { 281 | "rollup": { 282 | "optional": true 283 | } 284 | } 285 | }, 286 | "node_modules/@rollup/plugin-node-resolve": { 287 | "version": "16.0.1", 288 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", 289 | "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", 290 | "dev": true, 291 | "license": "MIT", 292 | "dependencies": { 293 | "@rollup/pluginutils": "^5.0.1", 294 | "@types/resolve": "1.20.2", 295 | "deepmerge": "^4.2.2", 296 | "is-module": "^1.0.0", 297 | "resolve": "^1.22.1" 298 | }, 299 | "engines": { 300 | "node": ">=14.0.0" 301 | }, 302 | "peerDependencies": { 303 | "rollup": "^2.78.0||^3.0.0||^4.0.0" 304 | }, 305 | "peerDependenciesMeta": { 306 | "rollup": { 307 | "optional": true 308 | } 309 | } 310 | }, 311 | "node_modules/@rollup/pluginutils": { 312 | "version": "5.1.0", 313 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", 314 | "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", 315 | "dev": true, 316 | "dependencies": { 317 | "@types/estree": "^1.0.0", 318 | "estree-walker": "^2.0.2", 319 | "picomatch": "^2.3.1" 320 | }, 321 | "engines": { 322 | "node": ">=14.0.0" 323 | }, 324 | "peerDependencies": { 325 | "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 326 | }, 327 | "peerDependenciesMeta": { 328 | "rollup": { 329 | "optional": true 330 | } 331 | } 332 | }, 333 | "node_modules/@rollup/pluginutils/node_modules/picomatch": { 334 | "version": "2.3.1", 335 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 336 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 337 | "dev": true, 338 | "engines": { 339 | "node": ">=8.6" 340 | }, 341 | "funding": { 342 | "url": "https://github.com/sponsors/jonschlinkert" 343 | } 344 | }, 345 | "node_modules/@rollup/rollup-android-arm-eabi": { 346 | "version": "4.39.0", 347 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", 348 | "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", 349 | "cpu": [ 350 | "arm" 351 | ], 352 | "dev": true, 353 | "license": "MIT", 354 | "optional": true, 355 | "os": [ 356 | "android" 357 | ] 358 | }, 359 | "node_modules/@rollup/rollup-android-arm64": { 360 | "version": "4.39.0", 361 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", 362 | "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", 363 | "cpu": [ 364 | "arm64" 365 | ], 366 | "dev": true, 367 | "license": "MIT", 368 | "optional": true, 369 | "os": [ 370 | "android" 371 | ] 372 | }, 373 | "node_modules/@rollup/rollup-darwin-arm64": { 374 | "version": "4.39.0", 375 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", 376 | "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", 377 | "cpu": [ 378 | "arm64" 379 | ], 380 | "dev": true, 381 | "license": "MIT", 382 | "optional": true, 383 | "os": [ 384 | "darwin" 385 | ] 386 | }, 387 | "node_modules/@rollup/rollup-darwin-x64": { 388 | "version": "4.39.0", 389 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", 390 | "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", 391 | "cpu": [ 392 | "x64" 393 | ], 394 | "dev": true, 395 | "license": "MIT", 396 | "optional": true, 397 | "os": [ 398 | "darwin" 399 | ] 400 | }, 401 | "node_modules/@rollup/rollup-freebsd-arm64": { 402 | "version": "4.39.0", 403 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", 404 | "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", 405 | "cpu": [ 406 | "arm64" 407 | ], 408 | "dev": true, 409 | "license": "MIT", 410 | "optional": true, 411 | "os": [ 412 | "freebsd" 413 | ] 414 | }, 415 | "node_modules/@rollup/rollup-freebsd-x64": { 416 | "version": "4.39.0", 417 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", 418 | "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", 419 | "cpu": [ 420 | "x64" 421 | ], 422 | "dev": true, 423 | "license": "MIT", 424 | "optional": true, 425 | "os": [ 426 | "freebsd" 427 | ] 428 | }, 429 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 430 | "version": "4.39.0", 431 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", 432 | "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", 433 | "cpu": [ 434 | "arm" 435 | ], 436 | "dev": true, 437 | "license": "MIT", 438 | "optional": true, 439 | "os": [ 440 | "linux" 441 | ] 442 | }, 443 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 444 | "version": "4.39.0", 445 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", 446 | "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", 447 | "cpu": [ 448 | "arm" 449 | ], 450 | "dev": true, 451 | "license": "MIT", 452 | "optional": true, 453 | "os": [ 454 | "linux" 455 | ] 456 | }, 457 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 458 | "version": "4.39.0", 459 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", 460 | "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", 461 | "cpu": [ 462 | "arm64" 463 | ], 464 | "dev": true, 465 | "license": "MIT", 466 | "optional": true, 467 | "os": [ 468 | "linux" 469 | ] 470 | }, 471 | "node_modules/@rollup/rollup-linux-arm64-musl": { 472 | "version": "4.39.0", 473 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", 474 | "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", 475 | "cpu": [ 476 | "arm64" 477 | ], 478 | "dev": true, 479 | "license": "MIT", 480 | "optional": true, 481 | "os": [ 482 | "linux" 483 | ] 484 | }, 485 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 486 | "version": "4.39.0", 487 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", 488 | "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", 489 | "cpu": [ 490 | "loong64" 491 | ], 492 | "dev": true, 493 | "license": "MIT", 494 | "optional": true, 495 | "os": [ 496 | "linux" 497 | ] 498 | }, 499 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 500 | "version": "4.39.0", 501 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", 502 | "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", 503 | "cpu": [ 504 | "ppc64" 505 | ], 506 | "dev": true, 507 | "license": "MIT", 508 | "optional": true, 509 | "os": [ 510 | "linux" 511 | ] 512 | }, 513 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 514 | "version": "4.39.0", 515 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", 516 | "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", 517 | "cpu": [ 518 | "riscv64" 519 | ], 520 | "dev": true, 521 | "license": "MIT", 522 | "optional": true, 523 | "os": [ 524 | "linux" 525 | ] 526 | }, 527 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 528 | "version": "4.39.0", 529 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", 530 | "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", 531 | "cpu": [ 532 | "riscv64" 533 | ], 534 | "dev": true, 535 | "license": "MIT", 536 | "optional": true, 537 | "os": [ 538 | "linux" 539 | ] 540 | }, 541 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 542 | "version": "4.39.0", 543 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", 544 | "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", 545 | "cpu": [ 546 | "s390x" 547 | ], 548 | "dev": true, 549 | "license": "MIT", 550 | "optional": true, 551 | "os": [ 552 | "linux" 553 | ] 554 | }, 555 | "node_modules/@rollup/rollup-linux-x64-gnu": { 556 | "version": "4.39.0", 557 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", 558 | "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", 559 | "cpu": [ 560 | "x64" 561 | ], 562 | "dev": true, 563 | "license": "MIT", 564 | "optional": true, 565 | "os": [ 566 | "linux" 567 | ] 568 | }, 569 | "node_modules/@rollup/rollup-linux-x64-musl": { 570 | "version": "4.39.0", 571 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", 572 | "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", 573 | "cpu": [ 574 | "x64" 575 | ], 576 | "dev": true, 577 | "license": "MIT", 578 | "optional": true, 579 | "os": [ 580 | "linux" 581 | ] 582 | }, 583 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 584 | "version": "4.39.0", 585 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", 586 | "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", 587 | "cpu": [ 588 | "arm64" 589 | ], 590 | "dev": true, 591 | "license": "MIT", 592 | "optional": true, 593 | "os": [ 594 | "win32" 595 | ] 596 | }, 597 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 598 | "version": "4.39.0", 599 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", 600 | "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", 601 | "cpu": [ 602 | "ia32" 603 | ], 604 | "dev": true, 605 | "license": "MIT", 606 | "optional": true, 607 | "os": [ 608 | "win32" 609 | ] 610 | }, 611 | "node_modules/@rollup/rollup-win32-x64-msvc": { 612 | "version": "4.39.0", 613 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", 614 | "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", 615 | "cpu": [ 616 | "x64" 617 | ], 618 | "dev": true, 619 | "license": "MIT", 620 | "optional": true, 621 | "os": [ 622 | "win32" 623 | ] 624 | }, 625 | "node_modules/@sinclair/typebox": { 626 | "version": "0.27.8", 627 | "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", 628 | "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", 629 | "dev": true 630 | }, 631 | "node_modules/@tsd/typescript": { 632 | "version": "5.4.3", 633 | "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.4.3.tgz", 634 | "integrity": "sha512-htCVCSQP58wZcLfQaT7ikW9hSjJN7ntIe0HzAfYpBauI0tYoIM0ow4XEZGFwYN266qEsJoOHhlnkNvz/gLrx4Q==", 635 | "dev": true, 636 | "engines": { 637 | "node": ">=14.17" 638 | } 639 | }, 640 | "node_modules/@types/eslint": { 641 | "version": "7.29.0", 642 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", 643 | "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", 644 | "dev": true, 645 | "dependencies": { 646 | "@types/estree": "*", 647 | "@types/json-schema": "*" 648 | } 649 | }, 650 | "node_modules/@types/estree": { 651 | "version": "1.0.7", 652 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", 653 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 654 | "dev": true, 655 | "license": "MIT" 656 | }, 657 | "node_modules/@types/json-schema": { 658 | "version": "7.0.15", 659 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 660 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 661 | "dev": true 662 | }, 663 | "node_modules/@types/minimist": { 664 | "version": "1.2.5", 665 | "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", 666 | "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", 667 | "dev": true 668 | }, 669 | "node_modules/@types/normalize-package-data": { 670 | "version": "2.4.4", 671 | "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", 672 | "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", 673 | "dev": true 674 | }, 675 | "node_modules/@types/resolve": { 676 | "version": "1.20.2", 677 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", 678 | "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", 679 | "dev": true 680 | }, 681 | "node_modules/ansi-escapes": { 682 | "version": "4.3.2", 683 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 684 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 685 | "dev": true, 686 | "dependencies": { 687 | "type-fest": "^0.21.3" 688 | }, 689 | "engines": { 690 | "node": ">=8" 691 | }, 692 | "funding": { 693 | "url": "https://github.com/sponsors/sindresorhus" 694 | } 695 | }, 696 | "node_modules/ansi-regex": { 697 | "version": "5.0.1", 698 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 699 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 700 | "dev": true, 701 | "engines": { 702 | "node": ">=8" 703 | } 704 | }, 705 | "node_modules/ansi-styles": { 706 | "version": "4.3.0", 707 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 708 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 709 | "dev": true, 710 | "dependencies": { 711 | "color-convert": "^2.0.1" 712 | }, 713 | "engines": { 714 | "node": ">=8" 715 | }, 716 | "funding": { 717 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 718 | } 719 | }, 720 | "node_modules/array-union": { 721 | "version": "2.1.0", 722 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 723 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 724 | "dev": true, 725 | "engines": { 726 | "node": ">=8" 727 | } 728 | }, 729 | "node_modules/arrify": { 730 | "version": "1.0.1", 731 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 732 | "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", 733 | "dev": true, 734 | "engines": { 735 | "node": ">=0.10.0" 736 | } 737 | }, 738 | "node_modules/async": { 739 | "version": "2.6.4", 740 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", 741 | "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", 742 | "dev": true, 743 | "dependencies": { 744 | "lodash": "^4.17.14" 745 | } 746 | }, 747 | "node_modules/basic-auth": { 748 | "version": "2.0.1", 749 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 750 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 751 | "dev": true, 752 | "dependencies": { 753 | "safe-buffer": "5.1.2" 754 | }, 755 | "engines": { 756 | "node": ">= 0.8" 757 | } 758 | }, 759 | "node_modules/braces": { 760 | "version": "3.0.3", 761 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 762 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 763 | "dev": true, 764 | "dependencies": { 765 | "fill-range": "^7.1.1" 766 | }, 767 | "engines": { 768 | "node": ">=8" 769 | } 770 | }, 771 | "node_modules/call-bind": { 772 | "version": "1.0.5", 773 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", 774 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", 775 | "dev": true, 776 | "dependencies": { 777 | "function-bind": "^1.1.2", 778 | "get-intrinsic": "^1.2.1", 779 | "set-function-length": "^1.1.1" 780 | }, 781 | "funding": { 782 | "url": "https://github.com/sponsors/ljharb" 783 | } 784 | }, 785 | "node_modules/camelcase": { 786 | "version": "5.3.1", 787 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 788 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 789 | "dev": true, 790 | "engines": { 791 | "node": ">=6" 792 | } 793 | }, 794 | "node_modules/camelcase-keys": { 795 | "version": "6.2.2", 796 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", 797 | "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", 798 | "dev": true, 799 | "dependencies": { 800 | "camelcase": "^5.3.1", 801 | "map-obj": "^4.0.0", 802 | "quick-lru": "^4.0.1" 803 | }, 804 | "engines": { 805 | "node": ">=8" 806 | }, 807 | "funding": { 808 | "url": "https://github.com/sponsors/sindresorhus" 809 | } 810 | }, 811 | "node_modules/chalk": { 812 | "version": "4.1.2", 813 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 814 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 815 | "dev": true, 816 | "dependencies": { 817 | "ansi-styles": "^4.1.0", 818 | "supports-color": "^7.1.0" 819 | }, 820 | "engines": { 821 | "node": ">=10" 822 | }, 823 | "funding": { 824 | "url": "https://github.com/chalk/chalk?sponsor=1" 825 | } 826 | }, 827 | "node_modules/classnames-local": { 828 | "resolved": "", 829 | "link": true 830 | }, 831 | "node_modules/classnames-npm": { 832 | "name": "classnames", 833 | "version": "2.5.1", 834 | "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", 835 | "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", 836 | "dev": true 837 | }, 838 | "node_modules/color-convert": { 839 | "version": "2.0.1", 840 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 841 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 842 | "dev": true, 843 | "dependencies": { 844 | "color-name": "~1.1.4" 845 | }, 846 | "engines": { 847 | "node": ">=7.0.0" 848 | } 849 | }, 850 | "node_modules/color-name": { 851 | "version": "1.1.4", 852 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 853 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 854 | "dev": true 855 | }, 856 | "node_modules/commondir": { 857 | "version": "1.0.1", 858 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 859 | "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", 860 | "dev": true 861 | }, 862 | "node_modules/corser": { 863 | "version": "2.0.1", 864 | "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", 865 | "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", 866 | "dev": true, 867 | "engines": { 868 | "node": ">= 0.4.0" 869 | } 870 | }, 871 | "node_modules/debug": { 872 | "version": "3.2.7", 873 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 874 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 875 | "dev": true, 876 | "dependencies": { 877 | "ms": "^2.1.1" 878 | } 879 | }, 880 | "node_modules/decamelize": { 881 | "version": "1.2.0", 882 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 883 | "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", 884 | "dev": true, 885 | "engines": { 886 | "node": ">=0.10.0" 887 | } 888 | }, 889 | "node_modules/decamelize-keys": { 890 | "version": "1.1.1", 891 | "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", 892 | "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", 893 | "dev": true, 894 | "dependencies": { 895 | "decamelize": "^1.1.0", 896 | "map-obj": "^1.0.0" 897 | }, 898 | "engines": { 899 | "node": ">=0.10.0" 900 | }, 901 | "funding": { 902 | "url": "https://github.com/sponsors/sindresorhus" 903 | } 904 | }, 905 | "node_modules/decamelize-keys/node_modules/map-obj": { 906 | "version": "1.0.1", 907 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 908 | "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", 909 | "dev": true, 910 | "engines": { 911 | "node": ">=0.10.0" 912 | } 913 | }, 914 | "node_modules/deepmerge": { 915 | "version": "4.3.1", 916 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 917 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 918 | "dev": true, 919 | "engines": { 920 | "node": ">=0.10.0" 921 | } 922 | }, 923 | "node_modules/define-data-property": { 924 | "version": "1.1.1", 925 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", 926 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", 927 | "dev": true, 928 | "dependencies": { 929 | "get-intrinsic": "^1.2.1", 930 | "gopd": "^1.0.1", 931 | "has-property-descriptors": "^1.0.0" 932 | }, 933 | "engines": { 934 | "node": ">= 0.4" 935 | } 936 | }, 937 | "node_modules/diff-sequences": { 938 | "version": "29.6.3", 939 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", 940 | "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", 941 | "dev": true, 942 | "engines": { 943 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 944 | } 945 | }, 946 | "node_modules/dir-glob": { 947 | "version": "3.0.1", 948 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 949 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 950 | "dev": true, 951 | "dependencies": { 952 | "path-type": "^4.0.0" 953 | }, 954 | "engines": { 955 | "node": ">=8" 956 | } 957 | }, 958 | "node_modules/emoji-regex": { 959 | "version": "8.0.0", 960 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 961 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 962 | "dev": true 963 | }, 964 | "node_modules/error-ex": { 965 | "version": "1.3.2", 966 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 967 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 968 | "dev": true, 969 | "dependencies": { 970 | "is-arrayish": "^0.2.1" 971 | } 972 | }, 973 | "node_modules/escape-string-regexp": { 974 | "version": "1.0.5", 975 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 976 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 977 | "dev": true, 978 | "engines": { 979 | "node": ">=0.8.0" 980 | } 981 | }, 982 | "node_modules/eslint-formatter-pretty": { 983 | "version": "4.1.0", 984 | "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", 985 | "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", 986 | "dev": true, 987 | "dependencies": { 988 | "@types/eslint": "^7.2.13", 989 | "ansi-escapes": "^4.2.1", 990 | "chalk": "^4.1.0", 991 | "eslint-rule-docs": "^1.1.5", 992 | "log-symbols": "^4.0.0", 993 | "plur": "^4.0.0", 994 | "string-width": "^4.2.0", 995 | "supports-hyperlinks": "^2.0.0" 996 | }, 997 | "engines": { 998 | "node": ">=10" 999 | }, 1000 | "funding": { 1001 | "url": "https://github.com/sponsors/sindresorhus" 1002 | } 1003 | }, 1004 | "node_modules/eslint-rule-docs": { 1005 | "version": "1.1.235", 1006 | "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", 1007 | "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", 1008 | "dev": true 1009 | }, 1010 | "node_modules/estree-walker": { 1011 | "version": "2.0.2", 1012 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1013 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1014 | "dev": true 1015 | }, 1016 | "node_modules/eventemitter3": { 1017 | "version": "4.0.7", 1018 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 1019 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", 1020 | "dev": true 1021 | }, 1022 | "node_modules/fast-glob": { 1023 | "version": "3.3.2", 1024 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1025 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1026 | "dev": true, 1027 | "dependencies": { 1028 | "@nodelib/fs.stat": "^2.0.2", 1029 | "@nodelib/fs.walk": "^1.2.3", 1030 | "glob-parent": "^5.1.2", 1031 | "merge2": "^1.3.0", 1032 | "micromatch": "^4.0.4" 1033 | }, 1034 | "engines": { 1035 | "node": ">=8.6.0" 1036 | } 1037 | }, 1038 | "node_modules/fastq": { 1039 | "version": "1.16.0", 1040 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", 1041 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 1042 | "dev": true, 1043 | "dependencies": { 1044 | "reusify": "^1.0.4" 1045 | } 1046 | }, 1047 | "node_modules/fdir": { 1048 | "version": "6.3.0", 1049 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", 1050 | "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", 1051 | "dev": true, 1052 | "peerDependencies": { 1053 | "picomatch": "^3 || ^4" 1054 | }, 1055 | "peerDependenciesMeta": { 1056 | "picomatch": { 1057 | "optional": true 1058 | } 1059 | } 1060 | }, 1061 | "node_modules/fill-range": { 1062 | "version": "7.1.1", 1063 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1064 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1065 | "dev": true, 1066 | "dependencies": { 1067 | "to-regex-range": "^5.0.1" 1068 | }, 1069 | "engines": { 1070 | "node": ">=8" 1071 | } 1072 | }, 1073 | "node_modules/find-up": { 1074 | "version": "4.1.0", 1075 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1076 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1077 | "dev": true, 1078 | "dependencies": { 1079 | "locate-path": "^5.0.0", 1080 | "path-exists": "^4.0.0" 1081 | }, 1082 | "engines": { 1083 | "node": ">=8" 1084 | } 1085 | }, 1086 | "node_modules/follow-redirects": { 1087 | "version": "1.15.6", 1088 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 1089 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 1090 | "dev": true, 1091 | "funding": [ 1092 | { 1093 | "type": "individual", 1094 | "url": "https://github.com/sponsors/RubenVerborgh" 1095 | } 1096 | ], 1097 | "engines": { 1098 | "node": ">=4.0" 1099 | }, 1100 | "peerDependenciesMeta": { 1101 | "debug": { 1102 | "optional": true 1103 | } 1104 | } 1105 | }, 1106 | "node_modules/fsevents": { 1107 | "version": "2.3.3", 1108 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1109 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1110 | "dev": true, 1111 | "hasInstallScript": true, 1112 | "optional": true, 1113 | "os": [ 1114 | "darwin" 1115 | ], 1116 | "engines": { 1117 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1118 | } 1119 | }, 1120 | "node_modules/function-bind": { 1121 | "version": "1.1.2", 1122 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1123 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1124 | "dev": true, 1125 | "funding": { 1126 | "url": "https://github.com/sponsors/ljharb" 1127 | } 1128 | }, 1129 | "node_modules/get-intrinsic": { 1130 | "version": "1.2.2", 1131 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", 1132 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", 1133 | "dev": true, 1134 | "dependencies": { 1135 | "function-bind": "^1.1.2", 1136 | "has-proto": "^1.0.1", 1137 | "has-symbols": "^1.0.3", 1138 | "hasown": "^2.0.0" 1139 | }, 1140 | "funding": { 1141 | "url": "https://github.com/sponsors/ljharb" 1142 | } 1143 | }, 1144 | "node_modules/glob-parent": { 1145 | "version": "5.1.2", 1146 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1147 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1148 | "dev": true, 1149 | "dependencies": { 1150 | "is-glob": "^4.0.1" 1151 | }, 1152 | "engines": { 1153 | "node": ">= 6" 1154 | } 1155 | }, 1156 | "node_modules/globby": { 1157 | "version": "11.1.0", 1158 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 1159 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 1160 | "dev": true, 1161 | "dependencies": { 1162 | "array-union": "^2.1.0", 1163 | "dir-glob": "^3.0.1", 1164 | "fast-glob": "^3.2.9", 1165 | "ignore": "^5.2.0", 1166 | "merge2": "^1.4.1", 1167 | "slash": "^3.0.0" 1168 | }, 1169 | "engines": { 1170 | "node": ">=10" 1171 | }, 1172 | "funding": { 1173 | "url": "https://github.com/sponsors/sindresorhus" 1174 | } 1175 | }, 1176 | "node_modules/gopd": { 1177 | "version": "1.0.1", 1178 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1179 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1180 | "dev": true, 1181 | "dependencies": { 1182 | "get-intrinsic": "^1.1.3" 1183 | }, 1184 | "funding": { 1185 | "url": "https://github.com/sponsors/ljharb" 1186 | } 1187 | }, 1188 | "node_modules/hard-rejection": { 1189 | "version": "2.1.0", 1190 | "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", 1191 | "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", 1192 | "dev": true, 1193 | "engines": { 1194 | "node": ">=6" 1195 | } 1196 | }, 1197 | "node_modules/has-flag": { 1198 | "version": "4.0.0", 1199 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1200 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1201 | "dev": true, 1202 | "engines": { 1203 | "node": ">=8" 1204 | } 1205 | }, 1206 | "node_modules/has-property-descriptors": { 1207 | "version": "1.0.1", 1208 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", 1209 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", 1210 | "dev": true, 1211 | "dependencies": { 1212 | "get-intrinsic": "^1.2.2" 1213 | }, 1214 | "funding": { 1215 | "url": "https://github.com/sponsors/ljharb" 1216 | } 1217 | }, 1218 | "node_modules/has-proto": { 1219 | "version": "1.0.1", 1220 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 1221 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 1222 | "dev": true, 1223 | "engines": { 1224 | "node": ">= 0.4" 1225 | }, 1226 | "funding": { 1227 | "url": "https://github.com/sponsors/ljharb" 1228 | } 1229 | }, 1230 | "node_modules/has-symbols": { 1231 | "version": "1.0.3", 1232 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1233 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1234 | "dev": true, 1235 | "engines": { 1236 | "node": ">= 0.4" 1237 | }, 1238 | "funding": { 1239 | "url": "https://github.com/sponsors/ljharb" 1240 | } 1241 | }, 1242 | "node_modules/hasown": { 1243 | "version": "2.0.0", 1244 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 1245 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 1246 | "dev": true, 1247 | "dependencies": { 1248 | "function-bind": "^1.1.2" 1249 | }, 1250 | "engines": { 1251 | "node": ">= 0.4" 1252 | } 1253 | }, 1254 | "node_modules/he": { 1255 | "version": "1.2.0", 1256 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1257 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1258 | "dev": true, 1259 | "bin": { 1260 | "he": "bin/he" 1261 | } 1262 | }, 1263 | "node_modules/hosted-git-info": { 1264 | "version": "4.1.0", 1265 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", 1266 | "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", 1267 | "dev": true, 1268 | "dependencies": { 1269 | "lru-cache": "^6.0.0" 1270 | }, 1271 | "engines": { 1272 | "node": ">=10" 1273 | } 1274 | }, 1275 | "node_modules/html-encoding-sniffer": { 1276 | "version": "3.0.0", 1277 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", 1278 | "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", 1279 | "dev": true, 1280 | "dependencies": { 1281 | "whatwg-encoding": "^2.0.0" 1282 | }, 1283 | "engines": { 1284 | "node": ">=12" 1285 | } 1286 | }, 1287 | "node_modules/http-proxy": { 1288 | "version": "1.18.1", 1289 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", 1290 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", 1291 | "dev": true, 1292 | "dependencies": { 1293 | "eventemitter3": "^4.0.0", 1294 | "follow-redirects": "^1.0.0", 1295 | "requires-port": "^1.0.0" 1296 | }, 1297 | "engines": { 1298 | "node": ">=8.0.0" 1299 | } 1300 | }, 1301 | "node_modules/http-server": { 1302 | "version": "14.1.1", 1303 | "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", 1304 | "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", 1305 | "dev": true, 1306 | "dependencies": { 1307 | "basic-auth": "^2.0.1", 1308 | "chalk": "^4.1.2", 1309 | "corser": "^2.0.1", 1310 | "he": "^1.2.0", 1311 | "html-encoding-sniffer": "^3.0.0", 1312 | "http-proxy": "^1.18.1", 1313 | "mime": "^1.6.0", 1314 | "minimist": "^1.2.6", 1315 | "opener": "^1.5.1", 1316 | "portfinder": "^1.0.28", 1317 | "secure-compare": "3.0.1", 1318 | "union": "~0.5.0", 1319 | "url-join": "^4.0.1" 1320 | }, 1321 | "bin": { 1322 | "http-server": "bin/http-server" 1323 | }, 1324 | "engines": { 1325 | "node": ">=12" 1326 | } 1327 | }, 1328 | "node_modules/iconv-lite": { 1329 | "version": "0.6.3", 1330 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1331 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1332 | "dev": true, 1333 | "dependencies": { 1334 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1335 | }, 1336 | "engines": { 1337 | "node": ">=0.10.0" 1338 | } 1339 | }, 1340 | "node_modules/ignore": { 1341 | "version": "5.3.0", 1342 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", 1343 | "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", 1344 | "dev": true, 1345 | "engines": { 1346 | "node": ">= 4" 1347 | } 1348 | }, 1349 | "node_modules/indent-string": { 1350 | "version": "4.0.0", 1351 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1352 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 1353 | "dev": true, 1354 | "engines": { 1355 | "node": ">=8" 1356 | } 1357 | }, 1358 | "node_modules/irregular-plurals": { 1359 | "version": "3.5.0", 1360 | "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", 1361 | "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", 1362 | "dev": true, 1363 | "engines": { 1364 | "node": ">=8" 1365 | } 1366 | }, 1367 | "node_modules/is-arrayish": { 1368 | "version": "0.2.1", 1369 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1370 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 1371 | "dev": true 1372 | }, 1373 | "node_modules/is-core-module": { 1374 | "version": "2.13.1", 1375 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 1376 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 1377 | "dev": true, 1378 | "dependencies": { 1379 | "hasown": "^2.0.0" 1380 | }, 1381 | "funding": { 1382 | "url": "https://github.com/sponsors/ljharb" 1383 | } 1384 | }, 1385 | "node_modules/is-extglob": { 1386 | "version": "2.1.1", 1387 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1388 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1389 | "dev": true, 1390 | "engines": { 1391 | "node": ">=0.10.0" 1392 | } 1393 | }, 1394 | "node_modules/is-fullwidth-code-point": { 1395 | "version": "3.0.0", 1396 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1397 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1398 | "dev": true, 1399 | "engines": { 1400 | "node": ">=8" 1401 | } 1402 | }, 1403 | "node_modules/is-glob": { 1404 | "version": "4.0.3", 1405 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1406 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1407 | "dev": true, 1408 | "dependencies": { 1409 | "is-extglob": "^2.1.1" 1410 | }, 1411 | "engines": { 1412 | "node": ">=0.10.0" 1413 | } 1414 | }, 1415 | "node_modules/is-module": { 1416 | "version": "1.0.0", 1417 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 1418 | "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", 1419 | "dev": true 1420 | }, 1421 | "node_modules/is-number": { 1422 | "version": "7.0.0", 1423 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1424 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1425 | "dev": true, 1426 | "engines": { 1427 | "node": ">=0.12.0" 1428 | } 1429 | }, 1430 | "node_modules/is-plain-obj": { 1431 | "version": "1.1.0", 1432 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 1433 | "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", 1434 | "dev": true, 1435 | "engines": { 1436 | "node": ">=0.10.0" 1437 | } 1438 | }, 1439 | "node_modules/is-reference": { 1440 | "version": "1.2.1", 1441 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", 1442 | "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", 1443 | "dev": true, 1444 | "dependencies": { 1445 | "@types/estree": "*" 1446 | } 1447 | }, 1448 | "node_modules/is-unicode-supported": { 1449 | "version": "0.1.0", 1450 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1451 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1452 | "dev": true, 1453 | "engines": { 1454 | "node": ">=10" 1455 | }, 1456 | "funding": { 1457 | "url": "https://github.com/sponsors/sindresorhus" 1458 | } 1459 | }, 1460 | "node_modules/jest-diff": { 1461 | "version": "29.7.0", 1462 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", 1463 | "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", 1464 | "dev": true, 1465 | "dependencies": { 1466 | "chalk": "^4.0.0", 1467 | "diff-sequences": "^29.6.3", 1468 | "jest-get-type": "^29.6.3", 1469 | "pretty-format": "^29.7.0" 1470 | }, 1471 | "engines": { 1472 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1473 | } 1474 | }, 1475 | "node_modules/jest-get-type": { 1476 | "version": "29.6.3", 1477 | "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", 1478 | "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", 1479 | "dev": true, 1480 | "engines": { 1481 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1482 | } 1483 | }, 1484 | "node_modules/js-tokens": { 1485 | "version": "4.0.0", 1486 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1487 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1488 | "dev": true 1489 | }, 1490 | "node_modules/json-parse-even-better-errors": { 1491 | "version": "2.3.1", 1492 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1493 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 1494 | "dev": true 1495 | }, 1496 | "node_modules/kind-of": { 1497 | "version": "6.0.3", 1498 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1499 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1500 | "dev": true, 1501 | "engines": { 1502 | "node": ">=0.10.0" 1503 | } 1504 | }, 1505 | "node_modules/lines-and-columns": { 1506 | "version": "1.2.4", 1507 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1508 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1509 | "dev": true 1510 | }, 1511 | "node_modules/locate-path": { 1512 | "version": "5.0.0", 1513 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1514 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1515 | "dev": true, 1516 | "dependencies": { 1517 | "p-locate": "^4.1.0" 1518 | }, 1519 | "engines": { 1520 | "node": ">=8" 1521 | } 1522 | }, 1523 | "node_modules/lodash": { 1524 | "version": "4.17.21", 1525 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1526 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1527 | "dev": true 1528 | }, 1529 | "node_modules/log-symbols": { 1530 | "version": "4.1.0", 1531 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1532 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1533 | "dev": true, 1534 | "dependencies": { 1535 | "chalk": "^4.1.0", 1536 | "is-unicode-supported": "^0.1.0" 1537 | }, 1538 | "engines": { 1539 | "node": ">=10" 1540 | }, 1541 | "funding": { 1542 | "url": "https://github.com/sponsors/sindresorhus" 1543 | } 1544 | }, 1545 | "node_modules/lru-cache": { 1546 | "version": "6.0.0", 1547 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1548 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1549 | "dev": true, 1550 | "dependencies": { 1551 | "yallist": "^4.0.0" 1552 | }, 1553 | "engines": { 1554 | "node": ">=10" 1555 | } 1556 | }, 1557 | "node_modules/magic-string": { 1558 | "version": "0.30.5", 1559 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", 1560 | "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", 1561 | "dev": true, 1562 | "dependencies": { 1563 | "@jridgewell/sourcemap-codec": "^1.4.15" 1564 | }, 1565 | "engines": { 1566 | "node": ">=12" 1567 | } 1568 | }, 1569 | "node_modules/map-obj": { 1570 | "version": "4.3.0", 1571 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", 1572 | "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", 1573 | "dev": true, 1574 | "engines": { 1575 | "node": ">=8" 1576 | }, 1577 | "funding": { 1578 | "url": "https://github.com/sponsors/sindresorhus" 1579 | } 1580 | }, 1581 | "node_modules/markdown-table": { 1582 | "version": "3.0.4", 1583 | "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", 1584 | "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", 1585 | "dev": true, 1586 | "funding": { 1587 | "type": "github", 1588 | "url": "https://github.com/sponsors/wooorm" 1589 | } 1590 | }, 1591 | "node_modules/meow": { 1592 | "version": "9.0.0", 1593 | "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", 1594 | "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", 1595 | "dev": true, 1596 | "dependencies": { 1597 | "@types/minimist": "^1.2.0", 1598 | "camelcase-keys": "^6.2.2", 1599 | "decamelize": "^1.2.0", 1600 | "decamelize-keys": "^1.1.0", 1601 | "hard-rejection": "^2.1.0", 1602 | "minimist-options": "4.1.0", 1603 | "normalize-package-data": "^3.0.0", 1604 | "read-pkg-up": "^7.0.1", 1605 | "redent": "^3.0.0", 1606 | "trim-newlines": "^3.0.0", 1607 | "type-fest": "^0.18.0", 1608 | "yargs-parser": "^20.2.3" 1609 | }, 1610 | "engines": { 1611 | "node": ">=10" 1612 | }, 1613 | "funding": { 1614 | "url": "https://github.com/sponsors/sindresorhus" 1615 | } 1616 | }, 1617 | "node_modules/meow/node_modules/type-fest": { 1618 | "version": "0.18.1", 1619 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", 1620 | "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", 1621 | "dev": true, 1622 | "engines": { 1623 | "node": ">=10" 1624 | }, 1625 | "funding": { 1626 | "url": "https://github.com/sponsors/sindresorhus" 1627 | } 1628 | }, 1629 | "node_modules/merge2": { 1630 | "version": "1.4.1", 1631 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1632 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1633 | "dev": true, 1634 | "engines": { 1635 | "node": ">= 8" 1636 | } 1637 | }, 1638 | "node_modules/micromatch": { 1639 | "version": "4.0.5", 1640 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1641 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1642 | "dev": true, 1643 | "dependencies": { 1644 | "braces": "^3.0.2", 1645 | "picomatch": "^2.3.1" 1646 | }, 1647 | "engines": { 1648 | "node": ">=8.6" 1649 | } 1650 | }, 1651 | "node_modules/micromatch/node_modules/picomatch": { 1652 | "version": "2.3.1", 1653 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1654 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1655 | "dev": true, 1656 | "engines": { 1657 | "node": ">=8.6" 1658 | }, 1659 | "funding": { 1660 | "url": "https://github.com/sponsors/jonschlinkert" 1661 | } 1662 | }, 1663 | "node_modules/mime": { 1664 | "version": "1.6.0", 1665 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1666 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1667 | "dev": true, 1668 | "bin": { 1669 | "mime": "cli.js" 1670 | }, 1671 | "engines": { 1672 | "node": ">=4" 1673 | } 1674 | }, 1675 | "node_modules/min-indent": { 1676 | "version": "1.0.1", 1677 | "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", 1678 | "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", 1679 | "dev": true, 1680 | "engines": { 1681 | "node": ">=4" 1682 | } 1683 | }, 1684 | "node_modules/minimist": { 1685 | "version": "1.2.8", 1686 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1687 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1688 | "dev": true, 1689 | "funding": { 1690 | "url": "https://github.com/sponsors/ljharb" 1691 | } 1692 | }, 1693 | "node_modules/minimist-options": { 1694 | "version": "4.1.0", 1695 | "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", 1696 | "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", 1697 | "dev": true, 1698 | "dependencies": { 1699 | "arrify": "^1.0.1", 1700 | "is-plain-obj": "^1.1.0", 1701 | "kind-of": "^6.0.3" 1702 | }, 1703 | "engines": { 1704 | "node": ">= 6" 1705 | } 1706 | }, 1707 | "node_modules/mkdirp": { 1708 | "version": "0.5.6", 1709 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1710 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1711 | "dev": true, 1712 | "dependencies": { 1713 | "minimist": "^1.2.6" 1714 | }, 1715 | "bin": { 1716 | "mkdirp": "bin/cmd.js" 1717 | } 1718 | }, 1719 | "node_modules/ms": { 1720 | "version": "2.1.3", 1721 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1722 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1723 | "dev": true 1724 | }, 1725 | "node_modules/normalize-package-data": { 1726 | "version": "3.0.3", 1727 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", 1728 | "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", 1729 | "dev": true, 1730 | "dependencies": { 1731 | "hosted-git-info": "^4.0.1", 1732 | "is-core-module": "^2.5.0", 1733 | "semver": "^7.3.4", 1734 | "validate-npm-package-license": "^3.0.1" 1735 | }, 1736 | "engines": { 1737 | "node": ">=10" 1738 | } 1739 | }, 1740 | "node_modules/object-inspect": { 1741 | "version": "1.13.1", 1742 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1743 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1744 | "dev": true, 1745 | "funding": { 1746 | "url": "https://github.com/sponsors/ljharb" 1747 | } 1748 | }, 1749 | "node_modules/opener": { 1750 | "version": "1.5.2", 1751 | "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", 1752 | "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", 1753 | "dev": true, 1754 | "bin": { 1755 | "opener": "bin/opener-bin.js" 1756 | } 1757 | }, 1758 | "node_modules/p-limit": { 1759 | "version": "2.3.0", 1760 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1761 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1762 | "dev": true, 1763 | "dependencies": { 1764 | "p-try": "^2.0.0" 1765 | }, 1766 | "engines": { 1767 | "node": ">=6" 1768 | }, 1769 | "funding": { 1770 | "url": "https://github.com/sponsors/sindresorhus" 1771 | } 1772 | }, 1773 | "node_modules/p-locate": { 1774 | "version": "4.1.0", 1775 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1776 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1777 | "dev": true, 1778 | "dependencies": { 1779 | "p-limit": "^2.2.0" 1780 | }, 1781 | "engines": { 1782 | "node": ">=8" 1783 | } 1784 | }, 1785 | "node_modules/p-try": { 1786 | "version": "2.2.0", 1787 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1788 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1789 | "dev": true, 1790 | "engines": { 1791 | "node": ">=6" 1792 | } 1793 | }, 1794 | "node_modules/parse-json": { 1795 | "version": "5.2.0", 1796 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1797 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1798 | "dev": true, 1799 | "dependencies": { 1800 | "@babel/code-frame": "^7.0.0", 1801 | "error-ex": "^1.3.1", 1802 | "json-parse-even-better-errors": "^2.3.0", 1803 | "lines-and-columns": "^1.1.6" 1804 | }, 1805 | "engines": { 1806 | "node": ">=8" 1807 | }, 1808 | "funding": { 1809 | "url": "https://github.com/sponsors/sindresorhus" 1810 | } 1811 | }, 1812 | "node_modules/path-exists": { 1813 | "version": "4.0.0", 1814 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1815 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1816 | "dev": true, 1817 | "engines": { 1818 | "node": ">=8" 1819 | } 1820 | }, 1821 | "node_modules/path-parse": { 1822 | "version": "1.0.7", 1823 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1824 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1825 | "dev": true 1826 | }, 1827 | "node_modules/path-type": { 1828 | "version": "4.0.0", 1829 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1830 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1831 | "dev": true, 1832 | "engines": { 1833 | "node": ">=8" 1834 | } 1835 | }, 1836 | "node_modules/picomatch": { 1837 | "version": "4.0.2", 1838 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1839 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1840 | "dev": true, 1841 | "engines": { 1842 | "node": ">=12" 1843 | }, 1844 | "funding": { 1845 | "url": "https://github.com/sponsors/jonschlinkert" 1846 | } 1847 | }, 1848 | "node_modules/plur": { 1849 | "version": "4.0.0", 1850 | "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", 1851 | "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", 1852 | "dev": true, 1853 | "dependencies": { 1854 | "irregular-plurals": "^3.2.0" 1855 | }, 1856 | "engines": { 1857 | "node": ">=10" 1858 | }, 1859 | "funding": { 1860 | "url": "https://github.com/sponsors/sindresorhus" 1861 | } 1862 | }, 1863 | "node_modules/portfinder": { 1864 | "version": "1.0.32", 1865 | "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", 1866 | "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", 1867 | "dev": true, 1868 | "dependencies": { 1869 | "async": "^2.6.4", 1870 | "debug": "^3.2.7", 1871 | "mkdirp": "^0.5.6" 1872 | }, 1873 | "engines": { 1874 | "node": ">= 0.12.0" 1875 | } 1876 | }, 1877 | "node_modules/pretty-format": { 1878 | "version": "29.7.0", 1879 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", 1880 | "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", 1881 | "dev": true, 1882 | "dependencies": { 1883 | "@jest/schemas": "^29.6.3", 1884 | "ansi-styles": "^5.0.0", 1885 | "react-is": "^18.0.0" 1886 | }, 1887 | "engines": { 1888 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1889 | } 1890 | }, 1891 | "node_modules/pretty-format/node_modules/ansi-styles": { 1892 | "version": "5.2.0", 1893 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 1894 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 1895 | "dev": true, 1896 | "engines": { 1897 | "node": ">=10" 1898 | }, 1899 | "funding": { 1900 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1901 | } 1902 | }, 1903 | "node_modules/qs": { 1904 | "version": "6.11.2", 1905 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", 1906 | "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", 1907 | "dev": true, 1908 | "dependencies": { 1909 | "side-channel": "^1.0.4" 1910 | }, 1911 | "engines": { 1912 | "node": ">=0.6" 1913 | }, 1914 | "funding": { 1915 | "url": "https://github.com/sponsors/ljharb" 1916 | } 1917 | }, 1918 | "node_modules/queue-microtask": { 1919 | "version": "1.2.3", 1920 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1921 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1922 | "dev": true, 1923 | "funding": [ 1924 | { 1925 | "type": "github", 1926 | "url": "https://github.com/sponsors/feross" 1927 | }, 1928 | { 1929 | "type": "patreon", 1930 | "url": "https://www.patreon.com/feross" 1931 | }, 1932 | { 1933 | "type": "consulting", 1934 | "url": "https://feross.org/support" 1935 | } 1936 | ] 1937 | }, 1938 | "node_modules/quick-lru": { 1939 | "version": "4.0.1", 1940 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", 1941 | "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", 1942 | "dev": true, 1943 | "engines": { 1944 | "node": ">=8" 1945 | } 1946 | }, 1947 | "node_modules/react-is": { 1948 | "version": "18.2.0", 1949 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", 1950 | "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", 1951 | "dev": true 1952 | }, 1953 | "node_modules/read-pkg": { 1954 | "version": "5.2.0", 1955 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", 1956 | "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", 1957 | "dev": true, 1958 | "dependencies": { 1959 | "@types/normalize-package-data": "^2.4.0", 1960 | "normalize-package-data": "^2.5.0", 1961 | "parse-json": "^5.0.0", 1962 | "type-fest": "^0.6.0" 1963 | }, 1964 | "engines": { 1965 | "node": ">=8" 1966 | } 1967 | }, 1968 | "node_modules/read-pkg-up": { 1969 | "version": "7.0.1", 1970 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", 1971 | "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", 1972 | "dev": true, 1973 | "dependencies": { 1974 | "find-up": "^4.1.0", 1975 | "read-pkg": "^5.2.0", 1976 | "type-fest": "^0.8.1" 1977 | }, 1978 | "engines": { 1979 | "node": ">=8" 1980 | }, 1981 | "funding": { 1982 | "url": "https://github.com/sponsors/sindresorhus" 1983 | } 1984 | }, 1985 | "node_modules/read-pkg-up/node_modules/type-fest": { 1986 | "version": "0.8.1", 1987 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1988 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1989 | "dev": true, 1990 | "engines": { 1991 | "node": ">=8" 1992 | } 1993 | }, 1994 | "node_modules/read-pkg/node_modules/hosted-git-info": { 1995 | "version": "2.8.9", 1996 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 1997 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 1998 | "dev": true 1999 | }, 2000 | "node_modules/read-pkg/node_modules/normalize-package-data": { 2001 | "version": "2.5.0", 2002 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 2003 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 2004 | "dev": true, 2005 | "dependencies": { 2006 | "hosted-git-info": "^2.1.4", 2007 | "resolve": "^1.10.0", 2008 | "semver": "2 || 3 || 4 || 5", 2009 | "validate-npm-package-license": "^3.0.1" 2010 | } 2011 | }, 2012 | "node_modules/read-pkg/node_modules/semver": { 2013 | "version": "5.7.2", 2014 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 2015 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 2016 | "dev": true, 2017 | "bin": { 2018 | "semver": "bin/semver" 2019 | } 2020 | }, 2021 | "node_modules/read-pkg/node_modules/type-fest": { 2022 | "version": "0.6.0", 2023 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", 2024 | "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", 2025 | "dev": true, 2026 | "engines": { 2027 | "node": ">=8" 2028 | } 2029 | }, 2030 | "node_modules/redent": { 2031 | "version": "3.0.0", 2032 | "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", 2033 | "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", 2034 | "dev": true, 2035 | "dependencies": { 2036 | "indent-string": "^4.0.0", 2037 | "strip-indent": "^3.0.0" 2038 | }, 2039 | "engines": { 2040 | "node": ">=8" 2041 | } 2042 | }, 2043 | "node_modules/requires-port": { 2044 | "version": "1.0.0", 2045 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 2046 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", 2047 | "dev": true 2048 | }, 2049 | "node_modules/resolve": { 2050 | "version": "1.22.8", 2051 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 2052 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 2053 | "dev": true, 2054 | "dependencies": { 2055 | "is-core-module": "^2.13.0", 2056 | "path-parse": "^1.0.7", 2057 | "supports-preserve-symlinks-flag": "^1.0.0" 2058 | }, 2059 | "bin": { 2060 | "resolve": "bin/resolve" 2061 | }, 2062 | "funding": { 2063 | "url": "https://github.com/sponsors/ljharb" 2064 | } 2065 | }, 2066 | "node_modules/reusify": { 2067 | "version": "1.0.4", 2068 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2069 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2070 | "dev": true, 2071 | "engines": { 2072 | "iojs": ">=1.0.0", 2073 | "node": ">=0.10.0" 2074 | } 2075 | }, 2076 | "node_modules/rollup": { 2077 | "version": "4.39.0", 2078 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", 2079 | "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", 2080 | "dev": true, 2081 | "license": "MIT", 2082 | "dependencies": { 2083 | "@types/estree": "1.0.7" 2084 | }, 2085 | "bin": { 2086 | "rollup": "dist/bin/rollup" 2087 | }, 2088 | "engines": { 2089 | "node": ">=18.0.0", 2090 | "npm": ">=8.0.0" 2091 | }, 2092 | "optionalDependencies": { 2093 | "@rollup/rollup-android-arm-eabi": "4.39.0", 2094 | "@rollup/rollup-android-arm64": "4.39.0", 2095 | "@rollup/rollup-darwin-arm64": "4.39.0", 2096 | "@rollup/rollup-darwin-x64": "4.39.0", 2097 | "@rollup/rollup-freebsd-arm64": "4.39.0", 2098 | "@rollup/rollup-freebsd-x64": "4.39.0", 2099 | "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", 2100 | "@rollup/rollup-linux-arm-musleabihf": "4.39.0", 2101 | "@rollup/rollup-linux-arm64-gnu": "4.39.0", 2102 | "@rollup/rollup-linux-arm64-musl": "4.39.0", 2103 | "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", 2104 | "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", 2105 | "@rollup/rollup-linux-riscv64-gnu": "4.39.0", 2106 | "@rollup/rollup-linux-riscv64-musl": "4.39.0", 2107 | "@rollup/rollup-linux-s390x-gnu": "4.39.0", 2108 | "@rollup/rollup-linux-x64-gnu": "4.39.0", 2109 | "@rollup/rollup-linux-x64-musl": "4.39.0", 2110 | "@rollup/rollup-win32-arm64-msvc": "4.39.0", 2111 | "@rollup/rollup-win32-ia32-msvc": "4.39.0", 2112 | "@rollup/rollup-win32-x64-msvc": "4.39.0", 2113 | "fsevents": "~2.3.2" 2114 | } 2115 | }, 2116 | "node_modules/run-parallel": { 2117 | "version": "1.2.0", 2118 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2119 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2120 | "dev": true, 2121 | "funding": [ 2122 | { 2123 | "type": "github", 2124 | "url": "https://github.com/sponsors/feross" 2125 | }, 2126 | { 2127 | "type": "patreon", 2128 | "url": "https://www.patreon.com/feross" 2129 | }, 2130 | { 2131 | "type": "consulting", 2132 | "url": "https://feross.org/support" 2133 | } 2134 | ], 2135 | "dependencies": { 2136 | "queue-microtask": "^1.2.2" 2137 | } 2138 | }, 2139 | "node_modules/safe-buffer": { 2140 | "version": "5.1.2", 2141 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2142 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2143 | "dev": true 2144 | }, 2145 | "node_modules/safer-buffer": { 2146 | "version": "2.1.2", 2147 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2148 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2149 | "dev": true 2150 | }, 2151 | "node_modules/secure-compare": { 2152 | "version": "3.0.1", 2153 | "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", 2154 | "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", 2155 | "dev": true 2156 | }, 2157 | "node_modules/semver": { 2158 | "version": "7.5.4", 2159 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 2160 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 2161 | "dev": true, 2162 | "dependencies": { 2163 | "lru-cache": "^6.0.0" 2164 | }, 2165 | "bin": { 2166 | "semver": "bin/semver.js" 2167 | }, 2168 | "engines": { 2169 | "node": ">=10" 2170 | } 2171 | }, 2172 | "node_modules/set-function-length": { 2173 | "version": "1.1.1", 2174 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", 2175 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", 2176 | "dev": true, 2177 | "dependencies": { 2178 | "define-data-property": "^1.1.1", 2179 | "get-intrinsic": "^1.2.1", 2180 | "gopd": "^1.0.1", 2181 | "has-property-descriptors": "^1.0.0" 2182 | }, 2183 | "engines": { 2184 | "node": ">= 0.4" 2185 | } 2186 | }, 2187 | "node_modules/side-channel": { 2188 | "version": "1.0.4", 2189 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2190 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2191 | "dev": true, 2192 | "dependencies": { 2193 | "call-bind": "^1.0.0", 2194 | "get-intrinsic": "^1.0.2", 2195 | "object-inspect": "^1.9.0" 2196 | }, 2197 | "funding": { 2198 | "url": "https://github.com/sponsors/ljharb" 2199 | } 2200 | }, 2201 | "node_modules/slash": { 2202 | "version": "3.0.0", 2203 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2204 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2205 | "dev": true, 2206 | "engines": { 2207 | "node": ">=8" 2208 | } 2209 | }, 2210 | "node_modules/spdx-correct": { 2211 | "version": "3.2.0", 2212 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", 2213 | "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", 2214 | "dev": true, 2215 | "dependencies": { 2216 | "spdx-expression-parse": "^3.0.0", 2217 | "spdx-license-ids": "^3.0.0" 2218 | } 2219 | }, 2220 | "node_modules/spdx-exceptions": { 2221 | "version": "2.3.0", 2222 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 2223 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 2224 | "dev": true 2225 | }, 2226 | "node_modules/spdx-expression-parse": { 2227 | "version": "3.0.1", 2228 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 2229 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 2230 | "dev": true, 2231 | "dependencies": { 2232 | "spdx-exceptions": "^2.1.0", 2233 | "spdx-license-ids": "^3.0.0" 2234 | } 2235 | }, 2236 | "node_modules/spdx-license-ids": { 2237 | "version": "3.0.16", 2238 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", 2239 | "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", 2240 | "dev": true 2241 | }, 2242 | "node_modules/string-width": { 2243 | "version": "4.2.3", 2244 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2245 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2246 | "dev": true, 2247 | "dependencies": { 2248 | "emoji-regex": "^8.0.0", 2249 | "is-fullwidth-code-point": "^3.0.0", 2250 | "strip-ansi": "^6.0.1" 2251 | }, 2252 | "engines": { 2253 | "node": ">=8" 2254 | } 2255 | }, 2256 | "node_modules/strip-ansi": { 2257 | "version": "6.0.1", 2258 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2259 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2260 | "dev": true, 2261 | "dependencies": { 2262 | "ansi-regex": "^5.0.1" 2263 | }, 2264 | "engines": { 2265 | "node": ">=8" 2266 | } 2267 | }, 2268 | "node_modules/strip-indent": { 2269 | "version": "3.0.0", 2270 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", 2271 | "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", 2272 | "dev": true, 2273 | "dependencies": { 2274 | "min-indent": "^1.0.0" 2275 | }, 2276 | "engines": { 2277 | "node": ">=8" 2278 | } 2279 | }, 2280 | "node_modules/supports-color": { 2281 | "version": "7.2.0", 2282 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2283 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2284 | "dev": true, 2285 | "dependencies": { 2286 | "has-flag": "^4.0.0" 2287 | }, 2288 | "engines": { 2289 | "node": ">=8" 2290 | } 2291 | }, 2292 | "node_modules/supports-hyperlinks": { 2293 | "version": "2.3.0", 2294 | "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", 2295 | "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", 2296 | "dev": true, 2297 | "dependencies": { 2298 | "has-flag": "^4.0.0", 2299 | "supports-color": "^7.0.0" 2300 | }, 2301 | "engines": { 2302 | "node": ">=8" 2303 | } 2304 | }, 2305 | "node_modules/supports-preserve-symlinks-flag": { 2306 | "version": "1.0.0", 2307 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2308 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2309 | "dev": true, 2310 | "engines": { 2311 | "node": ">= 0.4" 2312 | }, 2313 | "funding": { 2314 | "url": "https://github.com/sponsors/ljharb" 2315 | } 2316 | }, 2317 | "node_modules/tinybench": { 2318 | "version": "4.0.1", 2319 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-4.0.1.tgz", 2320 | "integrity": "sha512-Nb1srn7dvzkVx0J5h1vq8f48e3TIcbrS7e/UfAI/cDSef/n8yLh4zsAEsFkfpw6auTY+ZaspEvam/xs8nMnotQ==", 2321 | "dev": true, 2322 | "license": "MIT", 2323 | "engines": { 2324 | "node": ">=18.0.0" 2325 | } 2326 | }, 2327 | "node_modules/to-regex-range": { 2328 | "version": "5.0.1", 2329 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2330 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2331 | "dev": true, 2332 | "dependencies": { 2333 | "is-number": "^7.0.0" 2334 | }, 2335 | "engines": { 2336 | "node": ">=8.0" 2337 | } 2338 | }, 2339 | "node_modules/trim-newlines": { 2340 | "version": "3.0.1", 2341 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", 2342 | "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", 2343 | "dev": true, 2344 | "engines": { 2345 | "node": ">=8" 2346 | } 2347 | }, 2348 | "node_modules/tsd": { 2349 | "version": "0.31.2", 2350 | "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.2.tgz", 2351 | "integrity": "sha512-VplBAQwvYrHzVihtzXiUVXu5bGcr7uH1juQZ1lmKgkuGNGT+FechUCqmx9/zk7wibcqR2xaNEwCkDyKh+VVZnQ==", 2352 | "dev": true, 2353 | "dependencies": { 2354 | "@tsd/typescript": "~5.4.3", 2355 | "eslint-formatter-pretty": "^4.1.0", 2356 | "globby": "^11.0.1", 2357 | "jest-diff": "^29.0.3", 2358 | "meow": "^9.0.0", 2359 | "path-exists": "^4.0.0", 2360 | "read-pkg-up": "^7.0.0" 2361 | }, 2362 | "bin": { 2363 | "tsd": "dist/cli.js" 2364 | }, 2365 | "engines": { 2366 | "node": ">=14.16" 2367 | } 2368 | }, 2369 | "node_modules/type-fest": { 2370 | "version": "0.21.3", 2371 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 2372 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 2373 | "dev": true, 2374 | "engines": { 2375 | "node": ">=10" 2376 | }, 2377 | "funding": { 2378 | "url": "https://github.com/sponsors/sindresorhus" 2379 | } 2380 | }, 2381 | "node_modules/union": { 2382 | "version": "0.5.0", 2383 | "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", 2384 | "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", 2385 | "dev": true, 2386 | "dependencies": { 2387 | "qs": "^6.4.0" 2388 | }, 2389 | "engines": { 2390 | "node": ">= 0.8.0" 2391 | } 2392 | }, 2393 | "node_modules/url-join": { 2394 | "version": "4.0.1", 2395 | "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", 2396 | "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", 2397 | "dev": true 2398 | }, 2399 | "node_modules/validate-npm-package-license": { 2400 | "version": "3.0.4", 2401 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2402 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2403 | "dev": true, 2404 | "dependencies": { 2405 | "spdx-correct": "^3.0.0", 2406 | "spdx-expression-parse": "^3.0.0" 2407 | } 2408 | }, 2409 | "node_modules/whatwg-encoding": { 2410 | "version": "2.0.0", 2411 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", 2412 | "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", 2413 | "dev": true, 2414 | "dependencies": { 2415 | "iconv-lite": "0.6.3" 2416 | }, 2417 | "engines": { 2418 | "node": ">=12" 2419 | } 2420 | }, 2421 | "node_modules/yallist": { 2422 | "version": "4.0.0", 2423 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2424 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2425 | "dev": true 2426 | }, 2427 | "node_modules/yargs-parser": { 2428 | "version": "20.2.9", 2429 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 2430 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 2431 | "dev": true, 2432 | "engines": { 2433 | "node": ">=10" 2434 | } 2435 | } 2436 | } 2437 | } 2438 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "classnames", 3 | "version": "2.5.1", 4 | "description": "A simple utility for conditionally joining classNames together", 5 | "author": "Jed Watson", 6 | "license": "MIT", 7 | "repository": { 8 | "type": "git", 9 | "url": "git+https://github.com/JedWatson/classnames.git" 10 | }, 11 | "type": "module", 12 | "main": "./index.js", 13 | "types": "./index.d.ts", 14 | "exports": { 15 | "./package.json": "./package.json", 16 | ".": { 17 | "types": "./index.d.ts", 18 | "default": "./index.js" 19 | }, 20 | "./index.js": { 21 | "types": "./index.d.ts", 22 | "default": "./index.js" 23 | }, 24 | "./bind": { 25 | "types": "./bind.d.ts", 26 | "default": "./bind.js" 27 | }, 28 | "./bind.js": { 29 | "types": "./bind.d.ts", 30 | "default": "./bind.js" 31 | }, 32 | "./dedupe": { 33 | "types": "./dedupe.d.ts", 34 | "default": "./dedupe.js" 35 | }, 36 | "./dedupe.js": { 37 | "types": "./dedupe.d.ts", 38 | "default": "./dedupe.js" 39 | } 40 | }, 41 | "scripts": { 42 | "test": "node --test ./tests/*.js", 43 | "bench": "node ./benchmarks/run.js", 44 | "bench-browser": "rollup --plugin commonjs,json,node-resolve ./benchmarks/runInBrowser.js --file ./benchmarks/runInBrowser.bundle.js && http-server -c-1 ./benchmarks", 45 | "check-types": "tsd" 46 | }, 47 | "keywords": [ 48 | "react", 49 | "css", 50 | "classes", 51 | "classname", 52 | "classnames", 53 | "util", 54 | "utility" 55 | ], 56 | "files": [ 57 | "HISTORY.md", 58 | "LICENSE", 59 | "README.md", 60 | "*.d.ts", 61 | "*.js" 62 | ], 63 | "devDependencies": { 64 | "@rollup/plugin-commonjs": "^28.0.3", 65 | "@rollup/plugin-json": "^6.1.0", 66 | "@rollup/plugin-node-resolve": "^16.0.1", 67 | "classnames-local": "file:.", 68 | "classnames-npm": "npm:classnames@*", 69 | "http-server": "^14.1.1", 70 | "markdown-table": "^3.0.4", 71 | "rollup": "^4.39.0", 72 | "tinybench": "^4.0.1", 73 | "tsd": "^0.31.2" 74 | }, 75 | "tsd": { 76 | "directory": "./tests" 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /tests/bind.js: -------------------------------------------------------------------------------- 1 | import { describe, it } from 'node:test'; 2 | import assert from 'node:assert/strict'; 3 | import classNames from '../bind.js'; 4 | 5 | const cssModulesMock = { 6 | a: '#a', 7 | b: '#b', 8 | c: '#c', 9 | d: '#d', 10 | e: '#e', 11 | f: '#f' 12 | }; 13 | 14 | const classNamesBound = classNames.bind(cssModulesMock); 15 | 16 | describe('bind', () => { 17 | describe('classNames', () => { 18 | it('keeps object keys with truthy values', () => { 19 | assert.equal(classNames({ 20 | a: true, 21 | b: false, 22 | c: 0, 23 | d: null, 24 | e: undefined, 25 | f: 1 26 | }), 'a f'); 27 | }); 28 | 29 | it('joins arrays of class names and ignore falsy values', () => { 30 | assert.equal(classNames('a', 0, null, undefined, false, 'b'), 'a b'); 31 | }); 32 | 33 | it('supports heterogenous arguments', () => { 34 | assert.equal(classNames({a: true}, 'b', 0), 'a b'); 35 | }); 36 | 37 | it('should be trimmed', () => { 38 | assert.equal(classNames('', 'b', {}, ''), 'b'); 39 | }); 40 | 41 | it('returns an empty string for an empty configuration', () => { 42 | assert.equal(classNames({}), ''); 43 | }); 44 | 45 | it('supports an array of class names', () => { 46 | assert.equal(classNames(['a', 'b']), 'a b'); 47 | }); 48 | 49 | it('joins array arguments with string arguments', () => { 50 | assert.equal(classNames(['a', 'b'], 'c'), 'a b c'); 51 | assert.equal(classNames('c', ['a', 'b']), 'c a b'); 52 | }); 53 | 54 | it('handles multiple array arguments', () => { 55 | assert.equal(classNames(['a', 'b'], ['c', 'd']), 'a b c d'); 56 | }); 57 | 58 | it('handles arrays that include falsy and true values', () => { 59 | assert.equal(classNames(['a', 0, null, undefined, false, true, 'b']), 'a b'); 60 | }); 61 | 62 | it('handles arrays that include arrays', () => { 63 | assert.equal(classNames(['a', ['b', 'c']]), 'a b c'); 64 | }); 65 | 66 | it('handles arrays that include objects', () => { 67 | assert.equal(classNames(['a', {b: true, c: false}]), 'a b'); 68 | }); 69 | 70 | it('handles deep array recursion', () => { 71 | assert.equal(classNames(['a', ['b', ['c', {d: true}]]]), 'a b c d'); 72 | }); 73 | 74 | it('handles own toString() method defined on object', () => { 75 | assert.equal(classNames({ 76 | toString: () => { return 'classFromMethod'; } 77 | }), 'classFromMethod'); 78 | }); 79 | }); 80 | 81 | describe('classNamesBound', () => { 82 | it('keeps object keys with truthy values', () => { 83 | assert.equal(classNamesBound({ 84 | a: true, 85 | b: false, 86 | c: 0, 87 | d: null, 88 | e: undefined, 89 | f: 1 90 | }), '#a #f'); 91 | }); 92 | 93 | it('keeps class names undefined in bound hash', () => { 94 | assert.equal(classNamesBound({ 95 | a: true, 96 | b: false, 97 | c: 0, 98 | d: null, 99 | e: undefined, 100 | f: 1, 101 | x: true, 102 | y: null, 103 | z: 1 104 | }), '#a #f x z'); 105 | }); 106 | 107 | it('joins arrays of class names and ignore falsy values', () => { 108 | assert.equal(classNamesBound('a', 0, null, undefined, false, 1, 'b'), '#a #b'); 109 | }); 110 | 111 | it('supports heterogenous arguments', () => { 112 | assert.equal(classNamesBound({a: true}, 'b', 0), '#a #b'); 113 | }); 114 | 115 | it('should be trimmed', () => { 116 | assert.equal(classNamesBound('', 'b', {}, ''), '#b'); 117 | }); 118 | 119 | it('returns an empty string for an empty configuration', () => { 120 | assert.equal(classNamesBound({}), ''); 121 | }); 122 | 123 | it('supports an array of class names', () => { 124 | assert.equal(classNamesBound(['a', 'b']), '#a #b'); 125 | }); 126 | 127 | it('joins array arguments with string arguments', () => { 128 | assert.equal(classNamesBound(['a', 'b'], 'c'), '#a #b #c'); 129 | assert.equal(classNamesBound('c', ['a', 'b']), '#c #a #b'); 130 | }); 131 | 132 | it('handles multiple array arguments', () => { 133 | assert.equal(classNamesBound(['a', 'b'], ['c', 'd']), '#a #b #c #d'); 134 | }); 135 | 136 | it('handles arrays that include falsy and true values', () => { 137 | assert.equal(classNamesBound(['a', 0, null, undefined, false, true, 'b']), '#a #b'); 138 | }); 139 | 140 | it('handles arrays that include arrays', () => { 141 | assert.equal(classNamesBound(['a', ['b', 'c']]), '#a #b #c'); 142 | }); 143 | 144 | it('handles arrays that include objects', () => { 145 | assert.equal(classNamesBound(['a', {b: true, c: false}]), '#a #b'); 146 | }); 147 | 148 | it('handles deep array recursion', () => { 149 | assert.equal(classNamesBound(['a', ['b', ['c', {d: true}]]]), '#a #b #c #d'); 150 | }); 151 | 152 | it('handles own toString() method defined on object', () => { 153 | assert.equal(classNamesBound({ 154 | toString: () => { return 'classFromMethod'; } 155 | }), 'classFromMethod'); 156 | }); 157 | 158 | it('handles toString() method defined inherited in object', () => { 159 | class Class1 { toString() { return 'classFromMethod'; } } 160 | class Class2 extends Class1 {} 161 | 162 | assert.equal(classNamesBound(new Class2()), 'classFromMethod'); 163 | }); 164 | }); 165 | }) 166 | -------------------------------------------------------------------------------- /tests/bind.test-d.ts: -------------------------------------------------------------------------------- 1 | import {expectError} from 'tsd'; 2 | import bind from '../bind'; 3 | 4 | type Foo = { 5 | bar: boolean; 6 | }; 7 | 8 | const foo: Foo = { bar: true }; 9 | 10 | interface IFoo { 11 | bar: boolean; 12 | } 13 | 14 | const ifoo: IFoo = { bar: true }; 15 | 16 | // bind 17 | const bound = bind.bind({foo: 'bar'}); 18 | bind.bind(undefined); 19 | expectError(bind.bind(Symbol())); 20 | bound('foo'); 21 | bound(null); 22 | bound(undefined); 23 | bound(true); 24 | bound(false); 25 | bound({ conditional: true }); 26 | bound({ conditional: {} }); 27 | bound({ conditional: Symbol() }); 28 | bound([]); 29 | bound([['bar', null, undefined, true, false]]); 30 | bound(['bar', null, undefined, true, false]); 31 | bound('bar', null, undefined, true, false); 32 | bound('bar', ['abc', { foo: true }]); 33 | bound('bar', ['abc', { foo: true }], { def: false }); 34 | bound('abc', true, false, undefined, null, { foo: true }, ['abc', true, false, undefined, null, { foo: true }]); 35 | bound(foo); 36 | bound(ifoo); 37 | expectError(bound(Symbol())); 38 | expectError(bound(42)); 39 | -------------------------------------------------------------------------------- /tests/dedupe.js: -------------------------------------------------------------------------------- 1 | import { describe, it } from 'node:test'; 2 | import assert from 'node:assert/strict'; 3 | import dedupe from '../dedupe.js'; 4 | 5 | describe('dedupe', () => { 6 | it('keeps object keys with truthy values', () => { 7 | assert.equal(dedupe({ 8 | a: true, 9 | b: false, 10 | c: 0, 11 | d: null, 12 | e: undefined, 13 | f: 1 14 | }), 'a f'); 15 | }); 16 | 17 | it('should dedupe', () => { 18 | assert.equal(dedupe('foo', 'bar', 'foo', 'bar', { foo: true }), 'foo bar'); 19 | }); 20 | 21 | it('should make sure subsequent objects can remove/add classes', () => { 22 | assert.equal(dedupe('foo', { foo: false }, { foo: true, bar: true }), 'foo bar'); 23 | }); 24 | 25 | it('should make sure object with falsy value wipe out previous classes', () => { 26 | assert.equal(dedupe('foo foo', 0, null, undefined, false, 'b', { 'foo': false }), 'b'); 27 | assert.equal(dedupe('foo', 'foobar', 'bar', { foo: false }), 'foobar bar'); 28 | assert.equal(dedupe('foo', 'foo-bar', 'bar', { foo: false }), 'foo-bar bar'); 29 | assert.equal(dedupe('foo', '-moz-foo-bar', 'bar', { foo: false }), '-moz-foo-bar bar'); 30 | }); 31 | 32 | it('joins arrays of class names and ignore falsy values', () => { 33 | assert.equal(dedupe('a', 0, null, undefined, false, 'b'), 'a b'); 34 | }); 35 | 36 | it('supports heterogenous arguments', () => { 37 | assert.equal(dedupe({a: true}, 'b', 0), 'a b'); 38 | }); 39 | 40 | it('should be trimmed', () => { 41 | assert.equal(dedupe('', 'b', {}, ''), 'b'); 42 | }); 43 | 44 | it('returns an empty string for an empty configuration', () => { 45 | assert.equal(dedupe({}), ''); 46 | }); 47 | 48 | it('supports an array of class names', () => { 49 | assert.equal(dedupe(['a', 'b']), 'a b'); 50 | }); 51 | 52 | it('joins array arguments with string arguments', () => { 53 | assert.equal(dedupe(['a', 'b'], 'c'), 'a b c'); 54 | assert.equal(dedupe('c', ['a', 'b']), 'c a b'); 55 | }); 56 | 57 | it('handles multiple array arguments', () => { 58 | assert.equal(dedupe(['a', 'b'], ['c', 'd']), 'a b c d'); 59 | }); 60 | 61 | it('handles arrays that include falsy and true values', () => { 62 | assert.equal(dedupe(['a', 0, null, undefined, false, true, 'b']), 'a b'); 63 | }); 64 | 65 | it('handles arrays that include arrays', () => { 66 | assert.equal(dedupe(['a', ['b', 'c']]), 'a b c'); 67 | }); 68 | 69 | it('handles arrays that include objects', () => { 70 | assert.equal(dedupe(['a', {b: true, c: false}]), 'a b'); 71 | }); 72 | 73 | it('handles deep array recursion', () => { 74 | assert.equal(dedupe(['a', ['b', ['c', {d: true}]]]), 'a b c d'); 75 | }); 76 | 77 | it('handles own toString() method defined on object', () => { 78 | assert.equal(dedupe({ 79 | toString: () => { return 'classFromMethod'; } 80 | }), 'classFromMethod'); 81 | }); 82 | 83 | it('handles toString() method defined inherited in object', () => { 84 | class Class1 { toString() { return 'classFromMethod'; } } 85 | class Class2 extends Class1 {} 86 | 87 | assert.equal(dedupe(new Class2()), 'classFromMethod'); 88 | }); 89 | }); 90 | -------------------------------------------------------------------------------- /tests/dedupe.test-d.ts: -------------------------------------------------------------------------------- 1 | import {expectError} from 'tsd'; 2 | import dedupe from '../dedupe'; 3 | 4 | type Foo = { 5 | bar: boolean; 6 | }; 7 | 8 | const foo: Foo = { bar: true }; 9 | 10 | interface IFoo { 11 | bar: boolean; 12 | } 13 | 14 | const ifoo: IFoo = { bar: true }; 15 | 16 | // dedupe 17 | dedupe('foo'); 18 | dedupe(null); 19 | dedupe(undefined); 20 | dedupe(true); 21 | dedupe(false); 22 | dedupe({ conditional: true }); 23 | dedupe({ conditional: {} }); 24 | dedupe({ conditional: Symbol() }); 25 | dedupe([]); 26 | dedupe([['bar', null, undefined, true, false]]); 27 | dedupe(['bar', null, undefined, true, false]); 28 | dedupe('bar', null, undefined, true, false); 29 | dedupe('bar', ['abc', { foo: true }]); 30 | dedupe('bar', ['abc', { foo: true }], { def: false }); 31 | dedupe('abc', true, false, undefined, null, { foo: true }, ['abc', true, false, undefined, null, { foo: true }]); 32 | dedupe(foo); 33 | dedupe(ifoo); 34 | expectError(dedupe(Symbol())); 35 | expectError(dedupe(42)); 36 | -------------------------------------------------------------------------------- /tests/index.js: -------------------------------------------------------------------------------- 1 | import { describe, it } from 'node:test'; 2 | import assert from 'node:assert/strict'; 3 | import vm from 'node:vm'; 4 | import classNames from '../index.js'; 5 | 6 | describe('classNames', () => { 7 | it('keeps object keys with truthy values', () => { 8 | assert.equal(classNames({ 9 | a: true, 10 | b: false, 11 | c: 0, 12 | d: null, 13 | e: undefined, 14 | f: 1 15 | }), 'a f'); 16 | }); 17 | 18 | it('joins arrays of class names and ignore falsy values', () => { 19 | assert.equal(classNames('a', 0, null, undefined, false, 'b'), 'a b'); 20 | }); 21 | 22 | it('supports heterogenous arguments', () => { 23 | assert.equal(classNames({a: true}, 'b', 0), 'a b'); 24 | }); 25 | 26 | it('should be trimmed', () => { 27 | assert.equal(classNames('', 'b', {}, ''), 'b'); 28 | }); 29 | 30 | it('returns an empty string for an empty configuration', () => { 31 | assert.equal(classNames({}), ''); 32 | }); 33 | 34 | it('supports an array of class names', () => { 35 | assert.equal(classNames(['a', 'b']), 'a b'); 36 | }); 37 | 38 | it('joins array arguments with string arguments', () => { 39 | assert.equal(classNames(['a', 'b'], 'c'), 'a b c'); 40 | assert.equal(classNames('c', ['a', 'b']), 'c a b'); 41 | }); 42 | 43 | it('handles multiple array arguments', () => { 44 | assert.equal(classNames(['a', 'b'], ['c', 'd']), 'a b c d'); 45 | }); 46 | 47 | it('handles arrays that include falsy and true values', () => { 48 | assert.equal(classNames(['a', 0, null, undefined, false, true, 'b']), 'a b'); 49 | }); 50 | 51 | it('handles arrays that include arrays', () => { 52 | assert.equal(classNames(['a', ['b', 'c']]), 'a b c'); 53 | }); 54 | 55 | it('handles arrays that include objects', () => { 56 | assert.equal(classNames(['a', {b: true, c: false}]), 'a b'); 57 | }); 58 | 59 | it('handles deep array recursion', () => { 60 | assert.equal(classNames(['a', ['b', ['c', {d: true}]]]), 'a b c d'); 61 | }); 62 | 63 | it('handles arrays that are empty', () => { 64 | assert.equal(classNames('a', []), 'a'); 65 | }); 66 | 67 | it('handles nested arrays that have empty nested arrays', () => { 68 | assert.equal(classNames('a', [[]]), 'a'); 69 | }); 70 | 71 | it('handles all types of truthy and falsy property values as expected', () => { 72 | assert.equal(classNames({ 73 | // falsy: 74 | null: null, 75 | emptyString: '', 76 | noNumber: NaN, 77 | zero: 0, 78 | negativeZero: -0, 79 | false: false, 80 | undefined: undefined, 81 | 82 | // truthy (literally anything else): 83 | nonEmptyString: 'foobar', 84 | whitespace: ' ', 85 | function: Object.prototype.toString, 86 | emptyObject: {}, 87 | nonEmptyObject: {a: 1, b: 2}, 88 | emptyList: [], 89 | nonEmptyList: [1, 2, 3], 90 | greaterZero: 1 91 | }), 'nonEmptyString whitespace function emptyObject nonEmptyObject emptyList nonEmptyList greaterZero'); 92 | }); 93 | 94 | it('handles toString() method defined on object', () => { 95 | assert.equal(classNames({ 96 | toString: () => { return 'classFromMethod'; } 97 | }), 'classFromMethod'); 98 | }); 99 | 100 | it('handles toString() method defined inherited in object', () => { 101 | class Class1 { toString() { return 'classFromMethod'; } } 102 | class Class2 extends Class1 {} 103 | 104 | assert.equal(classNames(new Class2()), 'classFromMethod'); 105 | }); 106 | 107 | it('handles objects in a VM', () => { 108 | const context = { classNames, output: undefined }; 109 | vm.createContext(context); 110 | 111 | const code = 'output = classNames({ a: true, b: true });'; 112 | 113 | vm.runInContext(code, context); 114 | assert.equal(context.output, 'a b'); 115 | }); 116 | }); 117 | -------------------------------------------------------------------------------- /tests/index.test-d.ts: -------------------------------------------------------------------------------- 1 | import {expectError} from 'tsd'; 2 | import classNames from '..'; 3 | 4 | type Foo = { 5 | bar: boolean; 6 | }; 7 | 8 | const foo: Foo = { bar: true }; 9 | 10 | interface IFoo { 11 | bar: boolean; 12 | } 13 | 14 | const ifoo: IFoo = { bar: true }; 15 | 16 | // default 17 | classNames('foo'); 18 | classNames(null); 19 | classNames(undefined); 20 | classNames(true); 21 | classNames(false); 22 | classNames({ conditional: true }); 23 | classNames({ conditional: {} }); 24 | classNames({ conditional: Symbol() }); 25 | classNames([]); 26 | classNames([['bar', null, undefined, true, false]]); 27 | classNames(['bar', null, undefined, true, false]); 28 | classNames('bar', null, undefined, true, false); 29 | classNames('bar', ['abc', { foo: true }]); 30 | classNames('bar', ['abc', { foo: true }], { def: false }); 31 | classNames('abc', true, false, undefined, null, { foo: true }, ['abc', true, false, undefined, null, { foo: true }]); 32 | classNames('abc', true, false, undefined, null, { foo: true }, ['abc', true, false, undefined, null, { foo: true }], ['abc', 1234, true, false, undefined, null, { foo: true }] as const); 33 | classNames(foo); 34 | classNames(ifoo); 35 | expectError(classNames(Symbol())); 36 | expectError(classNames(42)); 37 | // should match tests/index.js 38 | classNames('c', ['a', 'b']); 39 | classNames('', 'b', {}, ''); 40 | classNames('a', null, undefined, true, 'b'); 41 | classNames('a', [[]]); 42 | classNames('a', []); 43 | classNames('c', ['a', 'b']); 44 | classNames(['a', 'b']); 45 | classNames(['a', 'b'], 'c'); 46 | classNames(['a', 'b'], ['c', 'd']); 47 | classNames(['a', 0, null, undefined, false, true, 'b']); 48 | classNames(['a', ['b', 'c']]); 49 | classNames(['a', ['b', ['c', {d: true}]]]); 50 | classNames(['a', {b: true, c: false}]); 51 | classNames({a: true}, 'b'); 52 | classNames({}, [{}, []]); 53 | --------------------------------------------------------------------------------