├── .editorconfig ├── .github └── workflows │ └── checks.yml ├── .gitignore ├── .npmignore ├── .nvmrc ├── .prettierrc ├── LICENSE ├── README.md ├── benchmark └── bench.cjs ├── bin └── cli.js ├── index.d.ts ├── package-lock.json ├── package.json ├── screenshots └── calculate-specificity.png ├── src ├── core │ ├── calculate.js │ └── index.js ├── index.js └── util │ ├── compare.js │ ├── filter.js │ ├── index.js │ └── sort.js └── test ├── index.js ├── standalone.js └── types.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | end_of_line = lf 10 | max_line_length = 200 11 | quote_type = single 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.github/workflows/checks.yml: -------------------------------------------------------------------------------- 1 | name: Checks 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - "main" 8 | - "dev" 9 | 10 | jobs: 11 | lint: 12 | name: Lint (Prettier) 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout Code 16 | uses: actions/checkout@v4 17 | 18 | - name: Set up Node 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: "23" 22 | 23 | - name: Cache node_modules 24 | uses: actions/cache@v4 25 | with: 26 | path: ~/.npm 27 | key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 28 | restore-keys: | 29 | ${{ runner.os }}-node- 30 | 31 | - name: Install dependencies 32 | run: npm ci 33 | 34 | - name: Run Prettier 35 | run: npm run format 36 | 37 | - name: Commit Changes 38 | uses: stefanzweifel/git-auto-commit-action@v4 39 | with: 40 | commit_message: "🎨 Fix Lint Errors" 41 | 42 | build: 43 | name: Build 44 | runs-on: ubuntu-latest 45 | steps: 46 | - name: Checkout Code 47 | uses: actions/checkout@v4 48 | 49 | - name: Set up Node 50 | uses: actions/setup-node@v4 51 | with: 52 | node-version: "23" 53 | 54 | - name: Cache node_modules 55 | uses: actions/cache@v4 56 | with: 57 | path: ~/.npm 58 | key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 59 | restore-keys: | 60 | ${{ runner.os }}-node- 61 | 62 | - name: Install dependencies 63 | run: npm ci 64 | 65 | - name: Run Build 66 | run: npm run build 67 | 68 | test: 69 | name: Run Tests 70 | runs-on: ubuntu-latest 71 | steps: 72 | - name: Checkout Code 73 | uses: actions/checkout@v4 74 | 75 | - name: Set up Node 76 | uses: actions/setup-node@v4 77 | with: 78 | node-version: "23" 79 | 80 | - name: Cache node_modules 81 | uses: actions/cache@v4 82 | with: 83 | path: ~/.npm 84 | key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 85 | restore-keys: | 86 | ${{ runner.os }}-node- 87 | 88 | - name: Install dependencies 89 | run: npm ci 90 | 91 | - name: Run Tests 92 | run: npm run test 93 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/* 2 | node_modules 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test 2 | src 3 | .editorconfig 4 | .prettierrc 5 | .gitignore 6 | package-lock.json 7 | .github 8 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v23.8.0 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2022 Bramus Van Damme - https://www.bram.us/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is furnished 8 | to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Calculate CSS Specificity](./screenshots/calculate-specificity.png)](https://codepen.io/bramus/pen/WNXyoYm) 2 | 3 | # Specificity 4 | 5 | `@bramus/specificity` is a package to calculate the specificity of CSS Selectors. It also includes some convenience functions to compare, sort, and filter an array of specificity values. 6 | 7 | Supports [Selectors Level 4](https://www.w3.org/TR/selectors-4/), including those special cases `:is()`, `:where()`, `:not()`, etc. 8 | 9 | Demo: [https://codepen.io/bramus/pen/WNXyoYm](https://codepen.io/bramus/pen/WNXyoYm) 10 | 11 | ## Installation 12 | 13 | ```bash 14 | npm i @bramus/specificity 15 | ``` 16 | 17 | ## Usage / Example 18 | 19 | At its core, `@bramus/specificity` exposes a `Specificity` class. Its static `calculate` method can be used to calculate the specificity of a given CSS [Selector List](https://www.w3.org/TR/selectors-4/#grouping) string. 20 | 21 | ```js 22 | import Specificity from '@bramus/specificity'; 23 | 24 | const specificities = Specificity.calculate('header:where(#top) nav li:nth-child(2n), #doormat'); 25 | ``` 26 | 27 | Because `calculate` accepts a [Selector List](https://www.w3.org/TR/selectors-4/#grouping) — which can contain more than 1 [Selector](https://www.w3.org/TR/selectors-4/#selector) — it will always return an array, with each entry being a `Specificity` instance — one per found selector. 28 | 29 | ```js 30 | const specificities = Specificity.calculate('header:where(#top) nav li:nth-child(2n), #doormat'); 31 | specificities.map((s) => s.toString()); // ~> ["(0,1,3)","(1,0,0)"] 32 | ``` 33 | 34 | 💡 If you know you’re passing only a single Selector into `calculate()`, you can use JavaScript’s built-in destructuring to keep your variable names clean. 35 | 36 | ```js 37 | const [s] = Specificity.calculate('header:where(#top) nav li:nth-child(2n)'); 38 | s.toString(); // ~> "(0,1,3)" 39 | ``` 40 | 41 | 💡 Under the hood, `@bramus/specificity` uses [CSSTree](https://github.com/csstree/csstree) to do the parsing of strings to Selectors. As a result, the `calculate` method also accepts a [CSSTree AST](https://github.com/csstree/csstree/blob/master/docs/ast.md) of the types `Selector` and `SelectorList`. 42 | 43 | If you have a pre-parsed CSSTree AST of the type `Selector` you can pass it into `Specificity.calculateForAST()`. It [performs slightly better](#benchmark) than `Specificity.calculate()` as it needs to check fewer things. It differs from `Specificity.calculate()` in that it does not return an array of `Specificity` instances but only a single value. 44 | 45 | ## The Return Format 46 | 47 | A calculated specificity is represented as an instance of the `Specificity` class. The `Specificity` class includes methods to get the specificity value in a certain format, along with some convenience methods to compare it against other instances. 48 | 49 | ```js 50 | // 🚀 Thunderbirds are go! 51 | import Specificity from '@bramus/specificity'; 52 | 53 | // ✨ Calculate specificity for each Selector in the given Selector List 54 | const specificities = Specificity.calculate('header:where(#top) nav li:nth-child(2n), #doormat'); 55 | 56 | // 🚚 The values in the array are instances of the Specificity class 57 | const s = specificities[0]; // Instance of Specificity 58 | 59 | // 👀 Read the specificity value using one of its accessors 60 | s.value; // { a: 0, b: 1, c: 3 } 61 | s.a; // 0 62 | s.b; // 1 63 | s.c; // 3 64 | 65 | // 🛠 Convert the calculated value to various formats using one of the toXXX() instance methods 66 | s.toString(); // "(0,1,3)" 67 | s.toArray(); // [0, 1, 3] 68 | s.toObject(); // { a: 0, b: 1, c: 3 } 69 | 70 | // 💡 Extract the matched selector string 71 | s.selectorString(); // "header:where(#top) nav li:nth-child(2n)" 72 | 73 | // 🔀 Use one of its instance comparison methods to compare it to another Specificity instance 74 | s.isEqualTo(specificities[1]); // false 75 | s.isGreaterThan(specificities[1]); // false 76 | s.isLessThan(specificities[1]); // true 77 | 78 | // 💻 Don’t worry about JSON.stringify() 79 | JSON.stringify(s); 80 | // { 81 | // "selector": 'header:where(#top) nav li:nth-child(2n)', 82 | // "asObject": { "a": 0, "b": 1, "c": 3 }, 83 | // "asArray": [0, 1, 3], 84 | // "asString": "(0,1,3)", 85 | // } 86 | ``` 87 | 88 | ## Utility Functions (Static Methods) 89 | 90 | This package also exposes some utility functions to work with specificities. These utility functions are all exposed as static methods on the `Specificity` class. 91 | 92 | - Comparing: 93 | 94 | - `Specificity.compare(s1, s2)`: Compares s1 to s2. Returns a value that can be: 95 | - `> 0` = Sort s2 before s1 _(i.e. s1 is more specific than s2)_ 96 | - `0` = Keep original order of s1 and s2 _(i.e. s1 and s2 are equally specific)_ 97 | - `< 0` = Sort s1 before s2 _(i.e. s1 is less specific than s2)_ 98 | - `Specificity.equals(s1, s2)`: Returns `true` if s1 and s2 have the same specificity. If not, `false` is returned. 99 | - `Specificity.greaterThan(s1, s2)`: Returns `true` if s1 has a higher specificity than s2. If not, `false` is returned. 100 | - `Specificity.lessThan(s1, s2)`: Returns `true` if s1 has a lower specificity than s2. If not, `false` is returned. 101 | 102 | - Sorting: 103 | 104 | - `Specificity.sortAsc(s1, s2, …, sN)`: Sorts the given specificities in ascending order _(low specificity to high specificity)_ 105 | - `Specificity.sortDesc(s1, s2, …, sN)`: Sorts the given specificities in descending order _(high specificity to low specificity)_ 106 | 107 | - Filtering: 108 | - `Specificity.min(s1, s2, …, sN)`: Filters out the value with the lowest specificity 109 | - `Specificity.max(s1, s2, …, sN)`: Filters out the value with the highest specificity 110 | 111 | A specificity passed into any of these utility functions can be any of: 112 | 113 | - An instance of the included `Specificity` class 114 | - A simple Object such as `{'a': 1, 'b': 0, 'c': 2}` 115 | 116 | ## Utility Functions (Standalone) 117 | 118 | All static methods the `Specificity` class exposes are also exported as standalone functions using [Subpath Exports](https://nodejs.org/api/packages.html#subpath-exports). 119 | 120 | If you're only interested in including some of these functions into your project you can import them from their Subpath. As a result, your bundle size will be reduced greatly _(except for including the standalone `calculate`, as it returns an array of `Specificity` instances that relies on the whole lot)_ 121 | 122 | ```js 123 | import { calculate, calculateForAST } from '@bramus/specificity/core'; 124 | import { compare, equals, greaterThan, lessThan } from '@bramus/specificity/compare'; 125 | import { min, max } from '@bramus/specificity/filter'; 126 | import { sortAsc, sortDesc } from '@bramus/specificity/sort'; 127 | ``` 128 | 129 | ## Type Definitions 130 | 131 | Although `@bramus/specificity` is written in Vanilla JavaScript, it does include [Type Definitions](https://www.typescriptlang.org/docs/handbook/2/type-declarations.html) which are exposed via its `package.json`. 132 | 133 | ## Binary/CLI 134 | 135 | `@bramus/specificity` exposes a binary named `specificity` to calculate the specificity of a given selector list on the CLI. For each selector that it finds, it'll print out the calculated specificity as a string on a new line. 136 | 137 | ```bash 138 | $ specificity "header:where(#top) nav li:nth-child(2n), #doormat" 139 | (0,1,3) 140 | (1,0,0) 141 | ``` 142 | 143 | ## Benchmark 144 | 145 | A benchmark is included, which you can invoke using `npm run benchmark`. 146 | 147 | Sample results (tested on a MacBook Air M3): 148 | 149 | ``` 150 | Specificity.calculate(string) x 420,682 ops/sec ±0.34% (98 runs sampled) 151 | Specificity.calculate(ast) - using SelectorList x 8,994,080 ops/sec ±0.25% (98 runs sampled) 152 | Specificity.calculate(ast) - using Selector x 11,054,856 ops/sec ±0.39% (91 runs sampled) 153 | Specificity.calculateForAST(ast) x 12,652,322 ops/sec ±0.35% (96 runs sampled) 154 | ``` 155 | 156 | ## License 157 | 158 | `@bramus/specificity` is released under the MIT public license. See the enclosed `LICENSE` for details. 159 | 160 | ## Acknowledgements 161 | 162 | The idea to create this package was sparked by [the wonderful Specificity Calculator created by Kilian Valkhof / Polypane](https://polypane.app/css-specificity-calculator/), a highly educational tool that not only calculates the specificity, but also explains which parts are responsible for it. 163 | 164 | The heavy lifting of doing the actual parsing of Selectors is done by [CSSTree](https://github.com/csstree/csstree). 165 | -------------------------------------------------------------------------------- /benchmark/bench.cjs: -------------------------------------------------------------------------------- 1 | const Benchmark = require('./../node_modules/benchmark/benchmark.js'); 2 | const Specificity = require('./../dist/index.cjs').default; 3 | const parse = require('./../node_modules/css-tree/cjs/parser/parse-selector.cjs'); 4 | 5 | const selector = 'header:where(#top) nav li:nth-child(2n)'; 6 | const ast = parse(selector, { 7 | context: 'selectorList', 8 | }); 9 | 10 | const suite = new Benchmark.Suite('Benchmarking @bramus/specificity'); 11 | suite 12 | .add('Specificity.calculate(string)', function() { 13 | Specificity.calculate(selector); 14 | }) 15 | .add('Specificity.calculate(ast) - using SelectorList', function() { 16 | Specificity.calculate(ast); 17 | }) 18 | .add('Specificity.calculate(ast) - using Selector', function() { 19 | Specificity.calculate(ast.children.first); 20 | }) 21 | .add('Specificity.calculateForAST(ast)', function() { 22 | Specificity.calculateForAST(ast.children.first); 23 | }) 24 | .on('cycle', event => { 25 | console.log(String(event.target)); 26 | }) 27 | .run({ async: false }); 28 | -------------------------------------------------------------------------------- /bin/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import Specificity from '../dist/index.js'; 3 | 4 | if (!process.argv[2]) { 5 | console.error('❌ Missing selector argument'); 6 | process.exit(1); 7 | } 8 | 9 | try { 10 | const specificities = Specificity.calculate(process.argv[2]); 11 | console.log(specificities.map((specificity) => `${specificity}`).join('\n')); 12 | } catch (e) { 13 | console.error(`❌ ${e.message}`); 14 | } 15 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | // Types & Classes 2 | export type SpecificityArray = [number, number, number]; 3 | export type SpecificityObject = { a: number; b: number; c: number }; 4 | 5 | export default class Specificity { 6 | static calculate(selector: string | CSSTreeAST): Array; 7 | static calculateForAST(selectorAST: CSSTreeAST): Specificity; 8 | static compare(s1: SpecificityInstanceOrObject, s2: SpecificityInstanceOrObject): number; 9 | static equals(s1: SpecificityInstanceOrObject, s2: SpecificityInstanceOrObject): boolean; 10 | static lessThan(s1: SpecificityInstanceOrObject, s2: SpecificityInstanceOrObject): boolean; 11 | static greaterThan(s1: SpecificityInstanceOrObject, s2: SpecificityInstanceOrObject): boolean; 12 | static min(...specificities: SpecificityInstanceOrObject[]): SpecificityInstanceOrObject; 13 | static max(...specificities: SpecificityInstanceOrObject[]): SpecificityInstanceOrObject; 14 | static sortAsc(...specificities: SpecificityInstanceOrObject[]): SpecificityInstanceOrObject; 15 | static sortDesc(...specificities: SpecificityInstanceOrObject[]): SpecificityInstanceOrObject; 16 | constructor(value: SpecificityObject, selector?: any); 17 | value: SpecificityObject; 18 | selector: string | CSSTreeAST; 19 | set a(arg: number); 20 | get a(): number; 21 | set b(arg: number); 22 | get b(): number; 23 | set c(arg: number); 24 | get c(): number; 25 | selectorString(): string; 26 | toObject(): SpecificityObject; 27 | toArray(): SpecificityArray; 28 | toString(): string; 29 | toJSON(): { 30 | selector: string; 31 | asObject: SpecificityObject; 32 | asArray: SpecificityArray; 33 | asString: string; 34 | }; 35 | isEqualTo(otherSpecificity: SpecificityInstanceOrObject): boolean; 36 | isGreaterThan(otherSpecificity: SpecificityInstanceOrObject): boolean; 37 | isLessThan(otherSpecificity: SpecificityInstanceOrObject): boolean; 38 | } 39 | 40 | type SpecificityInstanceOrObject = Specificity | SpecificityObject; 41 | type CSSTreeAST = Object; // @TODO: Define shape 42 | 43 | // CORE 44 | export function calculate(selector: string | CSSTreeAST): Array; 45 | export function calculateForAST(selectorAST: CSSTreeAST): Specificity; 46 | 47 | // UTIL: COMPARE 48 | export function equals(s1: SpecificityInstanceOrObject, s2: SpecificityInstanceOrObject): boolean; 49 | export function greaterThan(s1: SpecificityInstanceOrObject, s2: SpecificityInstanceOrObject): boolean; 50 | export function lessThan(s1: SpecificityInstanceOrObject, s2: SpecificityInstanceOrObject): boolean; 51 | export function compare(s1: SpecificityInstanceOrObject, s2: SpecificityInstanceOrObject): number; 52 | 53 | // UTIL: FILTER 54 | export function min(specificities: SpecificityInstanceOrObject[]): SpecificityInstanceOrObject; 55 | export function max(specificities: SpecificityInstanceOrObject[]): SpecificityInstanceOrObject; 56 | 57 | // UTIL: SORT 58 | export function sortAsc(specificities: SpecificityInstanceOrObject[]): SpecificityInstanceOrObject[]; 59 | export function sortDesc(specificities: SpecificityInstanceOrObject[]): SpecificityInstanceOrObject[]; 60 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@bramus/specificity", 3 | "version": "2.4.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@bramus/specificity", 9 | "version": "2.4.1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "css-tree": "^3.0.0" 13 | }, 14 | "bin": { 15 | "specificity": "bin/cli.js" 16 | }, 17 | "devDependencies": { 18 | "benchmark": "^2.1.4", 19 | "esbuild": "^0.25.0", 20 | "microtime": "^3.1.1", 21 | "mocha": "^11.1.0", 22 | "prettier": "^3.5.1", 23 | "semver": "^7.7.1" 24 | } 25 | }, 26 | "node_modules/@esbuild/aix-ppc64": { 27 | "version": "0.25.0", 28 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", 29 | "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", 30 | "cpu": [ 31 | "ppc64" 32 | ], 33 | "dev": true, 34 | "license": "MIT", 35 | "optional": true, 36 | "os": [ 37 | "aix" 38 | ], 39 | "engines": { 40 | "node": ">=18" 41 | } 42 | }, 43 | "node_modules/@esbuild/android-arm": { 44 | "version": "0.25.0", 45 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", 46 | "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", 47 | "cpu": [ 48 | "arm" 49 | ], 50 | "dev": true, 51 | "license": "MIT", 52 | "optional": true, 53 | "os": [ 54 | "android" 55 | ], 56 | "engines": { 57 | "node": ">=18" 58 | } 59 | }, 60 | "node_modules/@esbuild/android-arm64": { 61 | "version": "0.25.0", 62 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", 63 | "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", 64 | "cpu": [ 65 | "arm64" 66 | ], 67 | "dev": true, 68 | "license": "MIT", 69 | "optional": true, 70 | "os": [ 71 | "android" 72 | ], 73 | "engines": { 74 | "node": ">=18" 75 | } 76 | }, 77 | "node_modules/@esbuild/android-x64": { 78 | "version": "0.25.0", 79 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", 80 | "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", 81 | "cpu": [ 82 | "x64" 83 | ], 84 | "dev": true, 85 | "license": "MIT", 86 | "optional": true, 87 | "os": [ 88 | "android" 89 | ], 90 | "engines": { 91 | "node": ">=18" 92 | } 93 | }, 94 | "node_modules/@esbuild/darwin-arm64": { 95 | "version": "0.25.0", 96 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", 97 | "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", 98 | "cpu": [ 99 | "arm64" 100 | ], 101 | "dev": true, 102 | "license": "MIT", 103 | "optional": true, 104 | "os": [ 105 | "darwin" 106 | ], 107 | "engines": { 108 | "node": ">=18" 109 | } 110 | }, 111 | "node_modules/@esbuild/darwin-x64": { 112 | "version": "0.25.0", 113 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", 114 | "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", 115 | "cpu": [ 116 | "x64" 117 | ], 118 | "dev": true, 119 | "license": "MIT", 120 | "optional": true, 121 | "os": [ 122 | "darwin" 123 | ], 124 | "engines": { 125 | "node": ">=18" 126 | } 127 | }, 128 | "node_modules/@esbuild/freebsd-arm64": { 129 | "version": "0.25.0", 130 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", 131 | "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", 132 | "cpu": [ 133 | "arm64" 134 | ], 135 | "dev": true, 136 | "license": "MIT", 137 | "optional": true, 138 | "os": [ 139 | "freebsd" 140 | ], 141 | "engines": { 142 | "node": ">=18" 143 | } 144 | }, 145 | "node_modules/@esbuild/freebsd-x64": { 146 | "version": "0.25.0", 147 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", 148 | "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", 149 | "cpu": [ 150 | "x64" 151 | ], 152 | "dev": true, 153 | "license": "MIT", 154 | "optional": true, 155 | "os": [ 156 | "freebsd" 157 | ], 158 | "engines": { 159 | "node": ">=18" 160 | } 161 | }, 162 | "node_modules/@esbuild/linux-arm": { 163 | "version": "0.25.0", 164 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", 165 | "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", 166 | "cpu": [ 167 | "arm" 168 | ], 169 | "dev": true, 170 | "license": "MIT", 171 | "optional": true, 172 | "os": [ 173 | "linux" 174 | ], 175 | "engines": { 176 | "node": ">=18" 177 | } 178 | }, 179 | "node_modules/@esbuild/linux-arm64": { 180 | "version": "0.25.0", 181 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", 182 | "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", 183 | "cpu": [ 184 | "arm64" 185 | ], 186 | "dev": true, 187 | "license": "MIT", 188 | "optional": true, 189 | "os": [ 190 | "linux" 191 | ], 192 | "engines": { 193 | "node": ">=18" 194 | } 195 | }, 196 | "node_modules/@esbuild/linux-ia32": { 197 | "version": "0.25.0", 198 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", 199 | "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", 200 | "cpu": [ 201 | "ia32" 202 | ], 203 | "dev": true, 204 | "license": "MIT", 205 | "optional": true, 206 | "os": [ 207 | "linux" 208 | ], 209 | "engines": { 210 | "node": ">=18" 211 | } 212 | }, 213 | "node_modules/@esbuild/linux-loong64": { 214 | "version": "0.25.0", 215 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", 216 | "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", 217 | "cpu": [ 218 | "loong64" 219 | ], 220 | "dev": true, 221 | "license": "MIT", 222 | "optional": true, 223 | "os": [ 224 | "linux" 225 | ], 226 | "engines": { 227 | "node": ">=18" 228 | } 229 | }, 230 | "node_modules/@esbuild/linux-mips64el": { 231 | "version": "0.25.0", 232 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", 233 | "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", 234 | "cpu": [ 235 | "mips64el" 236 | ], 237 | "dev": true, 238 | "license": "MIT", 239 | "optional": true, 240 | "os": [ 241 | "linux" 242 | ], 243 | "engines": { 244 | "node": ">=18" 245 | } 246 | }, 247 | "node_modules/@esbuild/linux-ppc64": { 248 | "version": "0.25.0", 249 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", 250 | "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", 251 | "cpu": [ 252 | "ppc64" 253 | ], 254 | "dev": true, 255 | "license": "MIT", 256 | "optional": true, 257 | "os": [ 258 | "linux" 259 | ], 260 | "engines": { 261 | "node": ">=18" 262 | } 263 | }, 264 | "node_modules/@esbuild/linux-riscv64": { 265 | "version": "0.25.0", 266 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", 267 | "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", 268 | "cpu": [ 269 | "riscv64" 270 | ], 271 | "dev": true, 272 | "license": "MIT", 273 | "optional": true, 274 | "os": [ 275 | "linux" 276 | ], 277 | "engines": { 278 | "node": ">=18" 279 | } 280 | }, 281 | "node_modules/@esbuild/linux-s390x": { 282 | "version": "0.25.0", 283 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", 284 | "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", 285 | "cpu": [ 286 | "s390x" 287 | ], 288 | "dev": true, 289 | "license": "MIT", 290 | "optional": true, 291 | "os": [ 292 | "linux" 293 | ], 294 | "engines": { 295 | "node": ">=18" 296 | } 297 | }, 298 | "node_modules/@esbuild/linux-x64": { 299 | "version": "0.25.0", 300 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", 301 | "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", 302 | "cpu": [ 303 | "x64" 304 | ], 305 | "dev": true, 306 | "license": "MIT", 307 | "optional": true, 308 | "os": [ 309 | "linux" 310 | ], 311 | "engines": { 312 | "node": ">=18" 313 | } 314 | }, 315 | "node_modules/@esbuild/netbsd-arm64": { 316 | "version": "0.25.0", 317 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", 318 | "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", 319 | "cpu": [ 320 | "arm64" 321 | ], 322 | "dev": true, 323 | "license": "MIT", 324 | "optional": true, 325 | "os": [ 326 | "netbsd" 327 | ], 328 | "engines": { 329 | "node": ">=18" 330 | } 331 | }, 332 | "node_modules/@esbuild/netbsd-x64": { 333 | "version": "0.25.0", 334 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", 335 | "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", 336 | "cpu": [ 337 | "x64" 338 | ], 339 | "dev": true, 340 | "license": "MIT", 341 | "optional": true, 342 | "os": [ 343 | "netbsd" 344 | ], 345 | "engines": { 346 | "node": ">=18" 347 | } 348 | }, 349 | "node_modules/@esbuild/openbsd-arm64": { 350 | "version": "0.25.0", 351 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", 352 | "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", 353 | "cpu": [ 354 | "arm64" 355 | ], 356 | "dev": true, 357 | "license": "MIT", 358 | "optional": true, 359 | "os": [ 360 | "openbsd" 361 | ], 362 | "engines": { 363 | "node": ">=18" 364 | } 365 | }, 366 | "node_modules/@esbuild/openbsd-x64": { 367 | "version": "0.25.0", 368 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", 369 | "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", 370 | "cpu": [ 371 | "x64" 372 | ], 373 | "dev": true, 374 | "license": "MIT", 375 | "optional": true, 376 | "os": [ 377 | "openbsd" 378 | ], 379 | "engines": { 380 | "node": ">=18" 381 | } 382 | }, 383 | "node_modules/@esbuild/sunos-x64": { 384 | "version": "0.25.0", 385 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", 386 | "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", 387 | "cpu": [ 388 | "x64" 389 | ], 390 | "dev": true, 391 | "license": "MIT", 392 | "optional": true, 393 | "os": [ 394 | "sunos" 395 | ], 396 | "engines": { 397 | "node": ">=18" 398 | } 399 | }, 400 | "node_modules/@esbuild/win32-arm64": { 401 | "version": "0.25.0", 402 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", 403 | "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", 404 | "cpu": [ 405 | "arm64" 406 | ], 407 | "dev": true, 408 | "license": "MIT", 409 | "optional": true, 410 | "os": [ 411 | "win32" 412 | ], 413 | "engines": { 414 | "node": ">=18" 415 | } 416 | }, 417 | "node_modules/@esbuild/win32-ia32": { 418 | "version": "0.25.0", 419 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", 420 | "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", 421 | "cpu": [ 422 | "ia32" 423 | ], 424 | "dev": true, 425 | "license": "MIT", 426 | "optional": true, 427 | "os": [ 428 | "win32" 429 | ], 430 | "engines": { 431 | "node": ">=18" 432 | } 433 | }, 434 | "node_modules/@esbuild/win32-x64": { 435 | "version": "0.25.0", 436 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", 437 | "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", 438 | "cpu": [ 439 | "x64" 440 | ], 441 | "dev": true, 442 | "license": "MIT", 443 | "optional": true, 444 | "os": [ 445 | "win32" 446 | ], 447 | "engines": { 448 | "node": ">=18" 449 | } 450 | }, 451 | "node_modules/@isaacs/cliui": { 452 | "version": "8.0.2", 453 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 454 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 455 | "dev": true, 456 | "license": "ISC", 457 | "dependencies": { 458 | "string-width": "^5.1.2", 459 | "string-width-cjs": "npm:string-width@^4.2.0", 460 | "strip-ansi": "^7.0.1", 461 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 462 | "wrap-ansi": "^8.1.0", 463 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 464 | }, 465 | "engines": { 466 | "node": ">=12" 467 | } 468 | }, 469 | "node_modules/@pkgjs/parseargs": { 470 | "version": "0.11.0", 471 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 472 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 473 | "dev": true, 474 | "license": "MIT", 475 | "optional": true, 476 | "engines": { 477 | "node": ">=14" 478 | } 479 | }, 480 | "node_modules/ansi-colors": { 481 | "version": "4.1.3", 482 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 483 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 484 | "dev": true, 485 | "license": "MIT", 486 | "engines": { 487 | "node": ">=6" 488 | } 489 | }, 490 | "node_modules/ansi-regex": { 491 | "version": "6.1.0", 492 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 493 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 494 | "dev": true, 495 | "license": "MIT", 496 | "engines": { 497 | "node": ">=12" 498 | }, 499 | "funding": { 500 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 501 | } 502 | }, 503 | "node_modules/ansi-styles": { 504 | "version": "4.3.0", 505 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 506 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 507 | "dev": true, 508 | "dependencies": { 509 | "color-convert": "^2.0.1" 510 | }, 511 | "engines": { 512 | "node": ">=8" 513 | }, 514 | "funding": { 515 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 516 | } 517 | }, 518 | "node_modules/anymatch": { 519 | "version": "3.1.2", 520 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 521 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 522 | "dev": true, 523 | "dependencies": { 524 | "normalize-path": "^3.0.0", 525 | "picomatch": "^2.0.4" 526 | }, 527 | "engines": { 528 | "node": ">= 8" 529 | } 530 | }, 531 | "node_modules/argparse": { 532 | "version": "2.0.1", 533 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 534 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 535 | "dev": true 536 | }, 537 | "node_modules/balanced-match": { 538 | "version": "1.0.2", 539 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 540 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 541 | "dev": true, 542 | "license": "MIT" 543 | }, 544 | "node_modules/benchmark": { 545 | "version": "2.1.4", 546 | "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", 547 | "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", 548 | "dev": true, 549 | "license": "MIT", 550 | "dependencies": { 551 | "lodash": "^4.17.4", 552 | "platform": "^1.3.3" 553 | } 554 | }, 555 | "node_modules/binary-extensions": { 556 | "version": "2.2.0", 557 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 558 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 559 | "dev": true, 560 | "engines": { 561 | "node": ">=8" 562 | } 563 | }, 564 | "node_modules/brace-expansion": { 565 | "version": "2.0.1", 566 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 567 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 568 | "dev": true, 569 | "license": "MIT", 570 | "dependencies": { 571 | "balanced-match": "^1.0.0" 572 | } 573 | }, 574 | "node_modules/braces": { 575 | "version": "3.0.2", 576 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 577 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 578 | "dev": true, 579 | "dependencies": { 580 | "fill-range": "^7.0.1" 581 | }, 582 | "engines": { 583 | "node": ">=8" 584 | } 585 | }, 586 | "node_modules/browser-stdout": { 587 | "version": "1.3.1", 588 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 589 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 590 | "dev": true 591 | }, 592 | "node_modules/camelcase": { 593 | "version": "6.3.0", 594 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 595 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 596 | "dev": true, 597 | "engines": { 598 | "node": ">=10" 599 | }, 600 | "funding": { 601 | "url": "https://github.com/sponsors/sindresorhus" 602 | } 603 | }, 604 | "node_modules/chalk": { 605 | "version": "4.1.2", 606 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 607 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 608 | "dev": true, 609 | "dependencies": { 610 | "ansi-styles": "^4.1.0", 611 | "supports-color": "^7.1.0" 612 | }, 613 | "engines": { 614 | "node": ">=10" 615 | }, 616 | "funding": { 617 | "url": "https://github.com/chalk/chalk?sponsor=1" 618 | } 619 | }, 620 | "node_modules/chalk/node_modules/supports-color": { 621 | "version": "7.2.0", 622 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 623 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 624 | "dev": true, 625 | "dependencies": { 626 | "has-flag": "^4.0.0" 627 | }, 628 | "engines": { 629 | "node": ">=8" 630 | } 631 | }, 632 | "node_modules/chokidar": { 633 | "version": "3.5.3", 634 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 635 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 636 | "dev": true, 637 | "funding": [ 638 | { 639 | "type": "individual", 640 | "url": "https://paulmillr.com/funding/" 641 | } 642 | ], 643 | "dependencies": { 644 | "anymatch": "~3.1.2", 645 | "braces": "~3.0.2", 646 | "glob-parent": "~5.1.2", 647 | "is-binary-path": "~2.1.0", 648 | "is-glob": "~4.0.1", 649 | "normalize-path": "~3.0.0", 650 | "readdirp": "~3.6.0" 651 | }, 652 | "engines": { 653 | "node": ">= 8.10.0" 654 | }, 655 | "optionalDependencies": { 656 | "fsevents": "~2.3.2" 657 | } 658 | }, 659 | "node_modules/cliui": { 660 | "version": "8.0.1", 661 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 662 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 663 | "dev": true, 664 | "license": "ISC", 665 | "dependencies": { 666 | "string-width": "^4.2.0", 667 | "strip-ansi": "^6.0.1", 668 | "wrap-ansi": "^7.0.0" 669 | }, 670 | "engines": { 671 | "node": ">=12" 672 | } 673 | }, 674 | "node_modules/cliui/node_modules/ansi-regex": { 675 | "version": "5.0.1", 676 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 677 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 678 | "dev": true, 679 | "license": "MIT", 680 | "engines": { 681 | "node": ">=8" 682 | } 683 | }, 684 | "node_modules/cliui/node_modules/emoji-regex": { 685 | "version": "8.0.0", 686 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 687 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 688 | "dev": true, 689 | "license": "MIT" 690 | }, 691 | "node_modules/cliui/node_modules/string-width": { 692 | "version": "4.2.3", 693 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 694 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 695 | "dev": true, 696 | "license": "MIT", 697 | "dependencies": { 698 | "emoji-regex": "^8.0.0", 699 | "is-fullwidth-code-point": "^3.0.0", 700 | "strip-ansi": "^6.0.1" 701 | }, 702 | "engines": { 703 | "node": ">=8" 704 | } 705 | }, 706 | "node_modules/cliui/node_modules/strip-ansi": { 707 | "version": "6.0.1", 708 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 709 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 710 | "dev": true, 711 | "license": "MIT", 712 | "dependencies": { 713 | "ansi-regex": "^5.0.1" 714 | }, 715 | "engines": { 716 | "node": ">=8" 717 | } 718 | }, 719 | "node_modules/cliui/node_modules/wrap-ansi": { 720 | "version": "7.0.0", 721 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 722 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 723 | "dev": true, 724 | "license": "MIT", 725 | "dependencies": { 726 | "ansi-styles": "^4.0.0", 727 | "string-width": "^4.1.0", 728 | "strip-ansi": "^6.0.0" 729 | }, 730 | "engines": { 731 | "node": ">=10" 732 | }, 733 | "funding": { 734 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 735 | } 736 | }, 737 | "node_modules/color-convert": { 738 | "version": "2.0.1", 739 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 740 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 741 | "dev": true, 742 | "dependencies": { 743 | "color-name": "~1.1.4" 744 | }, 745 | "engines": { 746 | "node": ">=7.0.0" 747 | } 748 | }, 749 | "node_modules/color-name": { 750 | "version": "1.1.4", 751 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 752 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 753 | "dev": true 754 | }, 755 | "node_modules/cross-spawn": { 756 | "version": "7.0.6", 757 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 758 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 759 | "dev": true, 760 | "license": "MIT", 761 | "dependencies": { 762 | "path-key": "^3.1.0", 763 | "shebang-command": "^2.0.0", 764 | "which": "^2.0.1" 765 | }, 766 | "engines": { 767 | "node": ">= 8" 768 | } 769 | }, 770 | "node_modules/css-tree": { 771 | "version": "3.1.0", 772 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", 773 | "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", 774 | "license": "MIT", 775 | "dependencies": { 776 | "mdn-data": "2.12.2", 777 | "source-map-js": "^1.0.1" 778 | }, 779 | "engines": { 780 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 781 | } 782 | }, 783 | "node_modules/debug": { 784 | "version": "4.4.0", 785 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 786 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 787 | "dev": true, 788 | "license": "MIT", 789 | "dependencies": { 790 | "ms": "^2.1.3" 791 | }, 792 | "engines": { 793 | "node": ">=6.0" 794 | }, 795 | "peerDependenciesMeta": { 796 | "supports-color": { 797 | "optional": true 798 | } 799 | } 800 | }, 801 | "node_modules/decamelize": { 802 | "version": "4.0.0", 803 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 804 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 805 | "dev": true, 806 | "engines": { 807 | "node": ">=10" 808 | }, 809 | "funding": { 810 | "url": "https://github.com/sponsors/sindresorhus" 811 | } 812 | }, 813 | "node_modules/diff": { 814 | "version": "5.2.0", 815 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", 816 | "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", 817 | "dev": true, 818 | "license": "BSD-3-Clause", 819 | "engines": { 820 | "node": ">=0.3.1" 821 | } 822 | }, 823 | "node_modules/eastasianwidth": { 824 | "version": "0.2.0", 825 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 826 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 827 | "dev": true, 828 | "license": "MIT" 829 | }, 830 | "node_modules/emoji-regex": { 831 | "version": "9.2.2", 832 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 833 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 834 | "dev": true, 835 | "license": "MIT" 836 | }, 837 | "node_modules/esbuild": { 838 | "version": "0.25.0", 839 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", 840 | "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", 841 | "dev": true, 842 | "hasInstallScript": true, 843 | "license": "MIT", 844 | "bin": { 845 | "esbuild": "bin/esbuild" 846 | }, 847 | "engines": { 848 | "node": ">=18" 849 | }, 850 | "optionalDependencies": { 851 | "@esbuild/aix-ppc64": "0.25.0", 852 | "@esbuild/android-arm": "0.25.0", 853 | "@esbuild/android-arm64": "0.25.0", 854 | "@esbuild/android-x64": "0.25.0", 855 | "@esbuild/darwin-arm64": "0.25.0", 856 | "@esbuild/darwin-x64": "0.25.0", 857 | "@esbuild/freebsd-arm64": "0.25.0", 858 | "@esbuild/freebsd-x64": "0.25.0", 859 | "@esbuild/linux-arm": "0.25.0", 860 | "@esbuild/linux-arm64": "0.25.0", 861 | "@esbuild/linux-ia32": "0.25.0", 862 | "@esbuild/linux-loong64": "0.25.0", 863 | "@esbuild/linux-mips64el": "0.25.0", 864 | "@esbuild/linux-ppc64": "0.25.0", 865 | "@esbuild/linux-riscv64": "0.25.0", 866 | "@esbuild/linux-s390x": "0.25.0", 867 | "@esbuild/linux-x64": "0.25.0", 868 | "@esbuild/netbsd-arm64": "0.25.0", 869 | "@esbuild/netbsd-x64": "0.25.0", 870 | "@esbuild/openbsd-arm64": "0.25.0", 871 | "@esbuild/openbsd-x64": "0.25.0", 872 | "@esbuild/sunos-x64": "0.25.0", 873 | "@esbuild/win32-arm64": "0.25.0", 874 | "@esbuild/win32-ia32": "0.25.0", 875 | "@esbuild/win32-x64": "0.25.0" 876 | } 877 | }, 878 | "node_modules/escalade": { 879 | "version": "3.2.0", 880 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 881 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 882 | "dev": true, 883 | "license": "MIT", 884 | "engines": { 885 | "node": ">=6" 886 | } 887 | }, 888 | "node_modules/escape-string-regexp": { 889 | "version": "4.0.0", 890 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 891 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 892 | "dev": true, 893 | "engines": { 894 | "node": ">=10" 895 | }, 896 | "funding": { 897 | "url": "https://github.com/sponsors/sindresorhus" 898 | } 899 | }, 900 | "node_modules/fill-range": { 901 | "version": "7.0.1", 902 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 903 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 904 | "dev": true, 905 | "dependencies": { 906 | "to-regex-range": "^5.0.1" 907 | }, 908 | "engines": { 909 | "node": ">=8" 910 | } 911 | }, 912 | "node_modules/find-up": { 913 | "version": "5.0.0", 914 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 915 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 916 | "dev": true, 917 | "dependencies": { 918 | "locate-path": "^6.0.0", 919 | "path-exists": "^4.0.0" 920 | }, 921 | "engines": { 922 | "node": ">=10" 923 | }, 924 | "funding": { 925 | "url": "https://github.com/sponsors/sindresorhus" 926 | } 927 | }, 928 | "node_modules/flat": { 929 | "version": "5.0.2", 930 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 931 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 932 | "dev": true, 933 | "bin": { 934 | "flat": "cli.js" 935 | } 936 | }, 937 | "node_modules/foreground-child": { 938 | "version": "3.3.0", 939 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 940 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 941 | "dev": true, 942 | "license": "ISC", 943 | "dependencies": { 944 | "cross-spawn": "^7.0.0", 945 | "signal-exit": "^4.0.1" 946 | }, 947 | "engines": { 948 | "node": ">=14" 949 | }, 950 | "funding": { 951 | "url": "https://github.com/sponsors/isaacs" 952 | } 953 | }, 954 | "node_modules/fsevents": { 955 | "version": "2.3.2", 956 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 957 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 958 | "dev": true, 959 | "hasInstallScript": true, 960 | "optional": true, 961 | "os": [ 962 | "darwin" 963 | ], 964 | "engines": { 965 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 966 | } 967 | }, 968 | "node_modules/get-caller-file": { 969 | "version": "2.0.5", 970 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 971 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 972 | "dev": true, 973 | "license": "ISC", 974 | "engines": { 975 | "node": "6.* || 8.* || >= 10.*" 976 | } 977 | }, 978 | "node_modules/glob": { 979 | "version": "10.4.5", 980 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 981 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 982 | "dev": true, 983 | "license": "ISC", 984 | "dependencies": { 985 | "foreground-child": "^3.1.0", 986 | "jackspeak": "^3.1.2", 987 | "minimatch": "^9.0.4", 988 | "minipass": "^7.1.2", 989 | "package-json-from-dist": "^1.0.0", 990 | "path-scurry": "^1.11.1" 991 | }, 992 | "bin": { 993 | "glob": "dist/esm/bin.mjs" 994 | }, 995 | "funding": { 996 | "url": "https://github.com/sponsors/isaacs" 997 | } 998 | }, 999 | "node_modules/glob-parent": { 1000 | "version": "5.1.2", 1001 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1002 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1003 | "dev": true, 1004 | "dependencies": { 1005 | "is-glob": "^4.0.1" 1006 | }, 1007 | "engines": { 1008 | "node": ">= 6" 1009 | } 1010 | }, 1011 | "node_modules/glob/node_modules/minimatch": { 1012 | "version": "9.0.5", 1013 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1014 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1015 | "dev": true, 1016 | "license": "ISC", 1017 | "dependencies": { 1018 | "brace-expansion": "^2.0.1" 1019 | }, 1020 | "engines": { 1021 | "node": ">=16 || 14 >=14.17" 1022 | }, 1023 | "funding": { 1024 | "url": "https://github.com/sponsors/isaacs" 1025 | } 1026 | }, 1027 | "node_modules/has-flag": { 1028 | "version": "4.0.0", 1029 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1030 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1031 | "dev": true, 1032 | "engines": { 1033 | "node": ">=8" 1034 | } 1035 | }, 1036 | "node_modules/he": { 1037 | "version": "1.2.0", 1038 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1039 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1040 | "dev": true, 1041 | "bin": { 1042 | "he": "bin/he" 1043 | } 1044 | }, 1045 | "node_modules/is-binary-path": { 1046 | "version": "2.1.0", 1047 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1048 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1049 | "dev": true, 1050 | "dependencies": { 1051 | "binary-extensions": "^2.0.0" 1052 | }, 1053 | "engines": { 1054 | "node": ">=8" 1055 | } 1056 | }, 1057 | "node_modules/is-extglob": { 1058 | "version": "2.1.1", 1059 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1060 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1061 | "dev": true, 1062 | "engines": { 1063 | "node": ">=0.10.0" 1064 | } 1065 | }, 1066 | "node_modules/is-fullwidth-code-point": { 1067 | "version": "3.0.0", 1068 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1069 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1070 | "dev": true, 1071 | "license": "MIT", 1072 | "engines": { 1073 | "node": ">=8" 1074 | } 1075 | }, 1076 | "node_modules/is-glob": { 1077 | "version": "4.0.3", 1078 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1079 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1080 | "dev": true, 1081 | "dependencies": { 1082 | "is-extglob": "^2.1.1" 1083 | }, 1084 | "engines": { 1085 | "node": ">=0.10.0" 1086 | } 1087 | }, 1088 | "node_modules/is-number": { 1089 | "version": "7.0.0", 1090 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1091 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1092 | "dev": true, 1093 | "engines": { 1094 | "node": ">=0.12.0" 1095 | } 1096 | }, 1097 | "node_modules/is-plain-obj": { 1098 | "version": "2.1.0", 1099 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1100 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1101 | "dev": true, 1102 | "engines": { 1103 | "node": ">=8" 1104 | } 1105 | }, 1106 | "node_modules/is-unicode-supported": { 1107 | "version": "0.1.0", 1108 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1109 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1110 | "dev": true, 1111 | "engines": { 1112 | "node": ">=10" 1113 | }, 1114 | "funding": { 1115 | "url": "https://github.com/sponsors/sindresorhus" 1116 | } 1117 | }, 1118 | "node_modules/isexe": { 1119 | "version": "2.0.0", 1120 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1121 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1122 | "dev": true, 1123 | "license": "ISC" 1124 | }, 1125 | "node_modules/jackspeak": { 1126 | "version": "3.4.3", 1127 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1128 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1129 | "dev": true, 1130 | "license": "BlueOak-1.0.0", 1131 | "dependencies": { 1132 | "@isaacs/cliui": "^8.0.2" 1133 | }, 1134 | "funding": { 1135 | "url": "https://github.com/sponsors/isaacs" 1136 | }, 1137 | "optionalDependencies": { 1138 | "@pkgjs/parseargs": "^0.11.0" 1139 | } 1140 | }, 1141 | "node_modules/js-yaml": { 1142 | "version": "4.1.0", 1143 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1144 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1145 | "dev": true, 1146 | "dependencies": { 1147 | "argparse": "^2.0.1" 1148 | }, 1149 | "bin": { 1150 | "js-yaml": "bin/js-yaml.js" 1151 | } 1152 | }, 1153 | "node_modules/locate-path": { 1154 | "version": "6.0.0", 1155 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1156 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1157 | "dev": true, 1158 | "dependencies": { 1159 | "p-locate": "^5.0.0" 1160 | }, 1161 | "engines": { 1162 | "node": ">=10" 1163 | }, 1164 | "funding": { 1165 | "url": "https://github.com/sponsors/sindresorhus" 1166 | } 1167 | }, 1168 | "node_modules/lodash": { 1169 | "version": "4.17.21", 1170 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1171 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1172 | "dev": true, 1173 | "license": "MIT" 1174 | }, 1175 | "node_modules/log-symbols": { 1176 | "version": "4.1.0", 1177 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1178 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1179 | "dev": true, 1180 | "dependencies": { 1181 | "chalk": "^4.1.0", 1182 | "is-unicode-supported": "^0.1.0" 1183 | }, 1184 | "engines": { 1185 | "node": ">=10" 1186 | }, 1187 | "funding": { 1188 | "url": "https://github.com/sponsors/sindresorhus" 1189 | } 1190 | }, 1191 | "node_modules/lru-cache": { 1192 | "version": "10.4.3", 1193 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1194 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1195 | "dev": true, 1196 | "license": "ISC" 1197 | }, 1198 | "node_modules/mdn-data": { 1199 | "version": "2.12.2", 1200 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", 1201 | "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", 1202 | "license": "CC0-1.0" 1203 | }, 1204 | "node_modules/microtime": { 1205 | "version": "3.1.1", 1206 | "resolved": "https://registry.npmjs.org/microtime/-/microtime-3.1.1.tgz", 1207 | "integrity": "sha512-to1r7o24cDsud9IhN6/8wGmMx5R2kT0w2Xwm5okbYI3d1dk6Xv0m+Z+jg2vS9pt+ocgQHTCtgs/YuyJhySzxNg==", 1208 | "dev": true, 1209 | "hasInstallScript": true, 1210 | "license": "MIT", 1211 | "dependencies": { 1212 | "node-addon-api": "^5.0.0", 1213 | "node-gyp-build": "^4.4.0" 1214 | }, 1215 | "engines": { 1216 | "node": ">= 14.13.0" 1217 | } 1218 | }, 1219 | "node_modules/minimatch": { 1220 | "version": "5.1.6", 1221 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 1222 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 1223 | "dev": true, 1224 | "license": "ISC", 1225 | "dependencies": { 1226 | "brace-expansion": "^2.0.1" 1227 | }, 1228 | "engines": { 1229 | "node": ">=10" 1230 | } 1231 | }, 1232 | "node_modules/minipass": { 1233 | "version": "7.1.2", 1234 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1235 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1236 | "dev": true, 1237 | "license": "ISC", 1238 | "engines": { 1239 | "node": ">=16 || 14 >=14.17" 1240 | } 1241 | }, 1242 | "node_modules/mocha": { 1243 | "version": "11.1.0", 1244 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", 1245 | "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==", 1246 | "dev": true, 1247 | "license": "MIT", 1248 | "dependencies": { 1249 | "ansi-colors": "^4.1.3", 1250 | "browser-stdout": "^1.3.1", 1251 | "chokidar": "^3.5.3", 1252 | "debug": "^4.3.5", 1253 | "diff": "^5.2.0", 1254 | "escape-string-regexp": "^4.0.0", 1255 | "find-up": "^5.0.0", 1256 | "glob": "^10.4.5", 1257 | "he": "^1.2.0", 1258 | "js-yaml": "^4.1.0", 1259 | "log-symbols": "^4.1.0", 1260 | "minimatch": "^5.1.6", 1261 | "ms": "^2.1.3", 1262 | "serialize-javascript": "^6.0.2", 1263 | "strip-json-comments": "^3.1.1", 1264 | "supports-color": "^8.1.1", 1265 | "workerpool": "^6.5.1", 1266 | "yargs": "^17.7.2", 1267 | "yargs-parser": "^21.1.1", 1268 | "yargs-unparser": "^2.0.0" 1269 | }, 1270 | "bin": { 1271 | "_mocha": "bin/_mocha", 1272 | "mocha": "bin/mocha.js" 1273 | }, 1274 | "engines": { 1275 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1276 | } 1277 | }, 1278 | "node_modules/ms": { 1279 | "version": "2.1.3", 1280 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1281 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1282 | "dev": true 1283 | }, 1284 | "node_modules/node-addon-api": { 1285 | "version": "5.1.0", 1286 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", 1287 | "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", 1288 | "dev": true, 1289 | "license": "MIT" 1290 | }, 1291 | "node_modules/node-gyp-build": { 1292 | "version": "4.8.4", 1293 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", 1294 | "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", 1295 | "dev": true, 1296 | "license": "MIT", 1297 | "bin": { 1298 | "node-gyp-build": "bin.js", 1299 | "node-gyp-build-optional": "optional.js", 1300 | "node-gyp-build-test": "build-test.js" 1301 | } 1302 | }, 1303 | "node_modules/normalize-path": { 1304 | "version": "3.0.0", 1305 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1306 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1307 | "dev": true, 1308 | "engines": { 1309 | "node": ">=0.10.0" 1310 | } 1311 | }, 1312 | "node_modules/p-limit": { 1313 | "version": "3.1.0", 1314 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1315 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1316 | "dev": true, 1317 | "dependencies": { 1318 | "yocto-queue": "^0.1.0" 1319 | }, 1320 | "engines": { 1321 | "node": ">=10" 1322 | }, 1323 | "funding": { 1324 | "url": "https://github.com/sponsors/sindresorhus" 1325 | } 1326 | }, 1327 | "node_modules/p-locate": { 1328 | "version": "5.0.0", 1329 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1330 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1331 | "dev": true, 1332 | "dependencies": { 1333 | "p-limit": "^3.0.2" 1334 | }, 1335 | "engines": { 1336 | "node": ">=10" 1337 | }, 1338 | "funding": { 1339 | "url": "https://github.com/sponsors/sindresorhus" 1340 | } 1341 | }, 1342 | "node_modules/package-json-from-dist": { 1343 | "version": "1.0.1", 1344 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1345 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 1346 | "dev": true, 1347 | "license": "BlueOak-1.0.0" 1348 | }, 1349 | "node_modules/path-exists": { 1350 | "version": "4.0.0", 1351 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1352 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1353 | "dev": true, 1354 | "engines": { 1355 | "node": ">=8" 1356 | } 1357 | }, 1358 | "node_modules/path-key": { 1359 | "version": "3.1.1", 1360 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1361 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1362 | "dev": true, 1363 | "license": "MIT", 1364 | "engines": { 1365 | "node": ">=8" 1366 | } 1367 | }, 1368 | "node_modules/path-scurry": { 1369 | "version": "1.11.1", 1370 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1371 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1372 | "dev": true, 1373 | "license": "BlueOak-1.0.0", 1374 | "dependencies": { 1375 | "lru-cache": "^10.2.0", 1376 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1377 | }, 1378 | "engines": { 1379 | "node": ">=16 || 14 >=14.18" 1380 | }, 1381 | "funding": { 1382 | "url": "https://github.com/sponsors/isaacs" 1383 | } 1384 | }, 1385 | "node_modules/picomatch": { 1386 | "version": "2.3.1", 1387 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1388 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1389 | "dev": true, 1390 | "engines": { 1391 | "node": ">=8.6" 1392 | }, 1393 | "funding": { 1394 | "url": "https://github.com/sponsors/jonschlinkert" 1395 | } 1396 | }, 1397 | "node_modules/platform": { 1398 | "version": "1.3.6", 1399 | "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", 1400 | "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", 1401 | "dev": true, 1402 | "license": "MIT" 1403 | }, 1404 | "node_modules/prettier": { 1405 | "version": "3.5.1", 1406 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz", 1407 | "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==", 1408 | "dev": true, 1409 | "license": "MIT", 1410 | "bin": { 1411 | "prettier": "bin/prettier.cjs" 1412 | }, 1413 | "engines": { 1414 | "node": ">=14" 1415 | }, 1416 | "funding": { 1417 | "url": "https://github.com/prettier/prettier?sponsor=1" 1418 | } 1419 | }, 1420 | "node_modules/randombytes": { 1421 | "version": "2.1.0", 1422 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1423 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1424 | "dev": true, 1425 | "license": "MIT", 1426 | "dependencies": { 1427 | "safe-buffer": "^5.1.0" 1428 | } 1429 | }, 1430 | "node_modules/readdirp": { 1431 | "version": "3.6.0", 1432 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1433 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1434 | "dev": true, 1435 | "dependencies": { 1436 | "picomatch": "^2.2.1" 1437 | }, 1438 | "engines": { 1439 | "node": ">=8.10.0" 1440 | } 1441 | }, 1442 | "node_modules/require-directory": { 1443 | "version": "2.1.1", 1444 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1445 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1446 | "dev": true, 1447 | "license": "MIT", 1448 | "engines": { 1449 | "node": ">=0.10.0" 1450 | } 1451 | }, 1452 | "node_modules/safe-buffer": { 1453 | "version": "5.2.1", 1454 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1455 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1456 | "dev": true, 1457 | "funding": [ 1458 | { 1459 | "type": "github", 1460 | "url": "https://github.com/sponsors/feross" 1461 | }, 1462 | { 1463 | "type": "patreon", 1464 | "url": "https://www.patreon.com/feross" 1465 | }, 1466 | { 1467 | "type": "consulting", 1468 | "url": "https://feross.org/support" 1469 | } 1470 | ], 1471 | "license": "MIT" 1472 | }, 1473 | "node_modules/semver": { 1474 | "version": "7.7.1", 1475 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 1476 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 1477 | "dev": true, 1478 | "license": "ISC", 1479 | "bin": { 1480 | "semver": "bin/semver.js" 1481 | }, 1482 | "engines": { 1483 | "node": ">=10" 1484 | } 1485 | }, 1486 | "node_modules/serialize-javascript": { 1487 | "version": "6.0.2", 1488 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", 1489 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", 1490 | "dev": true, 1491 | "license": "BSD-3-Clause", 1492 | "dependencies": { 1493 | "randombytes": "^2.1.0" 1494 | } 1495 | }, 1496 | "node_modules/shebang-command": { 1497 | "version": "2.0.0", 1498 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1499 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1500 | "dev": true, 1501 | "license": "MIT", 1502 | "dependencies": { 1503 | "shebang-regex": "^3.0.0" 1504 | }, 1505 | "engines": { 1506 | "node": ">=8" 1507 | } 1508 | }, 1509 | "node_modules/shebang-regex": { 1510 | "version": "3.0.0", 1511 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1512 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1513 | "dev": true, 1514 | "license": "MIT", 1515 | "engines": { 1516 | "node": ">=8" 1517 | } 1518 | }, 1519 | "node_modules/signal-exit": { 1520 | "version": "4.1.0", 1521 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1522 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1523 | "dev": true, 1524 | "license": "ISC", 1525 | "engines": { 1526 | "node": ">=14" 1527 | }, 1528 | "funding": { 1529 | "url": "https://github.com/sponsors/isaacs" 1530 | } 1531 | }, 1532 | "node_modules/source-map-js": { 1533 | "version": "1.0.2", 1534 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1535 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1536 | "engines": { 1537 | "node": ">=0.10.0" 1538 | } 1539 | }, 1540 | "node_modules/string-width": { 1541 | "version": "5.1.2", 1542 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1543 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1544 | "dev": true, 1545 | "license": "MIT", 1546 | "dependencies": { 1547 | "eastasianwidth": "^0.2.0", 1548 | "emoji-regex": "^9.2.2", 1549 | "strip-ansi": "^7.0.1" 1550 | }, 1551 | "engines": { 1552 | "node": ">=12" 1553 | }, 1554 | "funding": { 1555 | "url": "https://github.com/sponsors/sindresorhus" 1556 | } 1557 | }, 1558 | "node_modules/string-width-cjs": { 1559 | "name": "string-width", 1560 | "version": "4.2.3", 1561 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1562 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1563 | "dev": true, 1564 | "license": "MIT", 1565 | "dependencies": { 1566 | "emoji-regex": "^8.0.0", 1567 | "is-fullwidth-code-point": "^3.0.0", 1568 | "strip-ansi": "^6.0.1" 1569 | }, 1570 | "engines": { 1571 | "node": ">=8" 1572 | } 1573 | }, 1574 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1575 | "version": "5.0.1", 1576 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1577 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1578 | "dev": true, 1579 | "license": "MIT", 1580 | "engines": { 1581 | "node": ">=8" 1582 | } 1583 | }, 1584 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1585 | "version": "8.0.0", 1586 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1587 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1588 | "dev": true, 1589 | "license": "MIT" 1590 | }, 1591 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1592 | "version": "6.0.1", 1593 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1594 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1595 | "dev": true, 1596 | "license": "MIT", 1597 | "dependencies": { 1598 | "ansi-regex": "^5.0.1" 1599 | }, 1600 | "engines": { 1601 | "node": ">=8" 1602 | } 1603 | }, 1604 | "node_modules/strip-ansi": { 1605 | "version": "7.1.0", 1606 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1607 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1608 | "dev": true, 1609 | "license": "MIT", 1610 | "dependencies": { 1611 | "ansi-regex": "^6.0.1" 1612 | }, 1613 | "engines": { 1614 | "node": ">=12" 1615 | }, 1616 | "funding": { 1617 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1618 | } 1619 | }, 1620 | "node_modules/strip-ansi-cjs": { 1621 | "name": "strip-ansi", 1622 | "version": "6.0.1", 1623 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1624 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1625 | "dev": true, 1626 | "license": "MIT", 1627 | "dependencies": { 1628 | "ansi-regex": "^5.0.1" 1629 | }, 1630 | "engines": { 1631 | "node": ">=8" 1632 | } 1633 | }, 1634 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1635 | "version": "5.0.1", 1636 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1637 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1638 | "dev": true, 1639 | "license": "MIT", 1640 | "engines": { 1641 | "node": ">=8" 1642 | } 1643 | }, 1644 | "node_modules/strip-json-comments": { 1645 | "version": "3.1.1", 1646 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1647 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1648 | "dev": true, 1649 | "engines": { 1650 | "node": ">=8" 1651 | }, 1652 | "funding": { 1653 | "url": "https://github.com/sponsors/sindresorhus" 1654 | } 1655 | }, 1656 | "node_modules/supports-color": { 1657 | "version": "8.1.1", 1658 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1659 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1660 | "dev": true, 1661 | "dependencies": { 1662 | "has-flag": "^4.0.0" 1663 | }, 1664 | "engines": { 1665 | "node": ">=10" 1666 | }, 1667 | "funding": { 1668 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1669 | } 1670 | }, 1671 | "node_modules/to-regex-range": { 1672 | "version": "5.0.1", 1673 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1674 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1675 | "dev": true, 1676 | "dependencies": { 1677 | "is-number": "^7.0.0" 1678 | }, 1679 | "engines": { 1680 | "node": ">=8.0" 1681 | } 1682 | }, 1683 | "node_modules/which": { 1684 | "version": "2.0.2", 1685 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1686 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1687 | "dev": true, 1688 | "license": "ISC", 1689 | "dependencies": { 1690 | "isexe": "^2.0.0" 1691 | }, 1692 | "bin": { 1693 | "node-which": "bin/node-which" 1694 | }, 1695 | "engines": { 1696 | "node": ">= 8" 1697 | } 1698 | }, 1699 | "node_modules/workerpool": { 1700 | "version": "6.5.1", 1701 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", 1702 | "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", 1703 | "dev": true, 1704 | "license": "Apache-2.0" 1705 | }, 1706 | "node_modules/wrap-ansi": { 1707 | "version": "8.1.0", 1708 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1709 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1710 | "dev": true, 1711 | "license": "MIT", 1712 | "dependencies": { 1713 | "ansi-styles": "^6.1.0", 1714 | "string-width": "^5.0.1", 1715 | "strip-ansi": "^7.0.1" 1716 | }, 1717 | "engines": { 1718 | "node": ">=12" 1719 | }, 1720 | "funding": { 1721 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1722 | } 1723 | }, 1724 | "node_modules/wrap-ansi-cjs": { 1725 | "name": "wrap-ansi", 1726 | "version": "7.0.0", 1727 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1728 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1729 | "dev": true, 1730 | "license": "MIT", 1731 | "dependencies": { 1732 | "ansi-styles": "^4.0.0", 1733 | "string-width": "^4.1.0", 1734 | "strip-ansi": "^6.0.0" 1735 | }, 1736 | "engines": { 1737 | "node": ">=10" 1738 | }, 1739 | "funding": { 1740 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1741 | } 1742 | }, 1743 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 1744 | "version": "5.0.1", 1745 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1746 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1747 | "dev": true, 1748 | "license": "MIT", 1749 | "engines": { 1750 | "node": ">=8" 1751 | } 1752 | }, 1753 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 1754 | "version": "8.0.0", 1755 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1756 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1757 | "dev": true, 1758 | "license": "MIT" 1759 | }, 1760 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 1761 | "version": "4.2.3", 1762 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1763 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1764 | "dev": true, 1765 | "license": "MIT", 1766 | "dependencies": { 1767 | "emoji-regex": "^8.0.0", 1768 | "is-fullwidth-code-point": "^3.0.0", 1769 | "strip-ansi": "^6.0.1" 1770 | }, 1771 | "engines": { 1772 | "node": ">=8" 1773 | } 1774 | }, 1775 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 1776 | "version": "6.0.1", 1777 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1778 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1779 | "dev": true, 1780 | "license": "MIT", 1781 | "dependencies": { 1782 | "ansi-regex": "^5.0.1" 1783 | }, 1784 | "engines": { 1785 | "node": ">=8" 1786 | } 1787 | }, 1788 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 1789 | "version": "6.2.1", 1790 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 1791 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 1792 | "dev": true, 1793 | "license": "MIT", 1794 | "engines": { 1795 | "node": ">=12" 1796 | }, 1797 | "funding": { 1798 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1799 | } 1800 | }, 1801 | "node_modules/y18n": { 1802 | "version": "5.0.8", 1803 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1804 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1805 | "dev": true, 1806 | "license": "ISC", 1807 | "engines": { 1808 | "node": ">=10" 1809 | } 1810 | }, 1811 | "node_modules/yargs": { 1812 | "version": "17.7.2", 1813 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 1814 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 1815 | "dev": true, 1816 | "license": "MIT", 1817 | "dependencies": { 1818 | "cliui": "^8.0.1", 1819 | "escalade": "^3.1.1", 1820 | "get-caller-file": "^2.0.5", 1821 | "require-directory": "^2.1.1", 1822 | "string-width": "^4.2.3", 1823 | "y18n": "^5.0.5", 1824 | "yargs-parser": "^21.1.1" 1825 | }, 1826 | "engines": { 1827 | "node": ">=12" 1828 | } 1829 | }, 1830 | "node_modules/yargs-parser": { 1831 | "version": "21.1.1", 1832 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 1833 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 1834 | "dev": true, 1835 | "license": "ISC", 1836 | "engines": { 1837 | "node": ">=12" 1838 | } 1839 | }, 1840 | "node_modules/yargs-unparser": { 1841 | "version": "2.0.0", 1842 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1843 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1844 | "dev": true, 1845 | "dependencies": { 1846 | "camelcase": "^6.0.0", 1847 | "decamelize": "^4.0.0", 1848 | "flat": "^5.0.2", 1849 | "is-plain-obj": "^2.1.0" 1850 | }, 1851 | "engines": { 1852 | "node": ">=10" 1853 | } 1854 | }, 1855 | "node_modules/yargs/node_modules/ansi-regex": { 1856 | "version": "5.0.1", 1857 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1858 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1859 | "dev": true, 1860 | "license": "MIT", 1861 | "engines": { 1862 | "node": ">=8" 1863 | } 1864 | }, 1865 | "node_modules/yargs/node_modules/emoji-regex": { 1866 | "version": "8.0.0", 1867 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1868 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1869 | "dev": true, 1870 | "license": "MIT" 1871 | }, 1872 | "node_modules/yargs/node_modules/string-width": { 1873 | "version": "4.2.3", 1874 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1875 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1876 | "dev": true, 1877 | "license": "MIT", 1878 | "dependencies": { 1879 | "emoji-regex": "^8.0.0", 1880 | "is-fullwidth-code-point": "^3.0.0", 1881 | "strip-ansi": "^6.0.1" 1882 | }, 1883 | "engines": { 1884 | "node": ">=8" 1885 | } 1886 | }, 1887 | "node_modules/yargs/node_modules/strip-ansi": { 1888 | "version": "6.0.1", 1889 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1890 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1891 | "dev": true, 1892 | "license": "MIT", 1893 | "dependencies": { 1894 | "ansi-regex": "^5.0.1" 1895 | }, 1896 | "engines": { 1897 | "node": ">=8" 1898 | } 1899 | }, 1900 | "node_modules/yocto-queue": { 1901 | "version": "0.1.0", 1902 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1903 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1904 | "dev": true, 1905 | "engines": { 1906 | "node": ">=10" 1907 | }, 1908 | "funding": { 1909 | "url": "https://github.com/sponsors/sindresorhus" 1910 | } 1911 | } 1912 | }, 1913 | "dependencies": { 1914 | "@esbuild/aix-ppc64": { 1915 | "version": "0.25.0", 1916 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", 1917 | "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", 1918 | "dev": true, 1919 | "optional": true 1920 | }, 1921 | "@esbuild/android-arm": { 1922 | "version": "0.25.0", 1923 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", 1924 | "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", 1925 | "dev": true, 1926 | "optional": true 1927 | }, 1928 | "@esbuild/android-arm64": { 1929 | "version": "0.25.0", 1930 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", 1931 | "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", 1932 | "dev": true, 1933 | "optional": true 1934 | }, 1935 | "@esbuild/android-x64": { 1936 | "version": "0.25.0", 1937 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", 1938 | "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", 1939 | "dev": true, 1940 | "optional": true 1941 | }, 1942 | "@esbuild/darwin-arm64": { 1943 | "version": "0.25.0", 1944 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", 1945 | "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", 1946 | "dev": true, 1947 | "optional": true 1948 | }, 1949 | "@esbuild/darwin-x64": { 1950 | "version": "0.25.0", 1951 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", 1952 | "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", 1953 | "dev": true, 1954 | "optional": true 1955 | }, 1956 | "@esbuild/freebsd-arm64": { 1957 | "version": "0.25.0", 1958 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", 1959 | "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", 1960 | "dev": true, 1961 | "optional": true 1962 | }, 1963 | "@esbuild/freebsd-x64": { 1964 | "version": "0.25.0", 1965 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", 1966 | "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", 1967 | "dev": true, 1968 | "optional": true 1969 | }, 1970 | "@esbuild/linux-arm": { 1971 | "version": "0.25.0", 1972 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", 1973 | "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", 1974 | "dev": true, 1975 | "optional": true 1976 | }, 1977 | "@esbuild/linux-arm64": { 1978 | "version": "0.25.0", 1979 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", 1980 | "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", 1981 | "dev": true, 1982 | "optional": true 1983 | }, 1984 | "@esbuild/linux-ia32": { 1985 | "version": "0.25.0", 1986 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", 1987 | "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", 1988 | "dev": true, 1989 | "optional": true 1990 | }, 1991 | "@esbuild/linux-loong64": { 1992 | "version": "0.25.0", 1993 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", 1994 | "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", 1995 | "dev": true, 1996 | "optional": true 1997 | }, 1998 | "@esbuild/linux-mips64el": { 1999 | "version": "0.25.0", 2000 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", 2001 | "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", 2002 | "dev": true, 2003 | "optional": true 2004 | }, 2005 | "@esbuild/linux-ppc64": { 2006 | "version": "0.25.0", 2007 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", 2008 | "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", 2009 | "dev": true, 2010 | "optional": true 2011 | }, 2012 | "@esbuild/linux-riscv64": { 2013 | "version": "0.25.0", 2014 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", 2015 | "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", 2016 | "dev": true, 2017 | "optional": true 2018 | }, 2019 | "@esbuild/linux-s390x": { 2020 | "version": "0.25.0", 2021 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", 2022 | "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", 2023 | "dev": true, 2024 | "optional": true 2025 | }, 2026 | "@esbuild/linux-x64": { 2027 | "version": "0.25.0", 2028 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", 2029 | "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", 2030 | "dev": true, 2031 | "optional": true 2032 | }, 2033 | "@esbuild/netbsd-arm64": { 2034 | "version": "0.25.0", 2035 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", 2036 | "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", 2037 | "dev": true, 2038 | "optional": true 2039 | }, 2040 | "@esbuild/netbsd-x64": { 2041 | "version": "0.25.0", 2042 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", 2043 | "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", 2044 | "dev": true, 2045 | "optional": true 2046 | }, 2047 | "@esbuild/openbsd-arm64": { 2048 | "version": "0.25.0", 2049 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", 2050 | "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", 2051 | "dev": true, 2052 | "optional": true 2053 | }, 2054 | "@esbuild/openbsd-x64": { 2055 | "version": "0.25.0", 2056 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", 2057 | "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", 2058 | "dev": true, 2059 | "optional": true 2060 | }, 2061 | "@esbuild/sunos-x64": { 2062 | "version": "0.25.0", 2063 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", 2064 | "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", 2065 | "dev": true, 2066 | "optional": true 2067 | }, 2068 | "@esbuild/win32-arm64": { 2069 | "version": "0.25.0", 2070 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", 2071 | "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", 2072 | "dev": true, 2073 | "optional": true 2074 | }, 2075 | "@esbuild/win32-ia32": { 2076 | "version": "0.25.0", 2077 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", 2078 | "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", 2079 | "dev": true, 2080 | "optional": true 2081 | }, 2082 | "@esbuild/win32-x64": { 2083 | "version": "0.25.0", 2084 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", 2085 | "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", 2086 | "dev": true, 2087 | "optional": true 2088 | }, 2089 | "@isaacs/cliui": { 2090 | "version": "8.0.2", 2091 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 2092 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 2093 | "dev": true, 2094 | "requires": { 2095 | "string-width": "^5.1.2", 2096 | "string-width-cjs": "npm:string-width@^4.2.0", 2097 | "strip-ansi": "^7.0.1", 2098 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 2099 | "wrap-ansi": "^8.1.0", 2100 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 2101 | } 2102 | }, 2103 | "@pkgjs/parseargs": { 2104 | "version": "0.11.0", 2105 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 2106 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 2107 | "dev": true, 2108 | "optional": true 2109 | }, 2110 | "ansi-colors": { 2111 | "version": "4.1.3", 2112 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 2113 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 2114 | "dev": true 2115 | }, 2116 | "ansi-regex": { 2117 | "version": "6.1.0", 2118 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 2119 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 2120 | "dev": true 2121 | }, 2122 | "ansi-styles": { 2123 | "version": "4.3.0", 2124 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2125 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2126 | "dev": true, 2127 | "requires": { 2128 | "color-convert": "^2.0.1" 2129 | } 2130 | }, 2131 | "anymatch": { 2132 | "version": "3.1.2", 2133 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 2134 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 2135 | "dev": true, 2136 | "requires": { 2137 | "normalize-path": "^3.0.0", 2138 | "picomatch": "^2.0.4" 2139 | } 2140 | }, 2141 | "argparse": { 2142 | "version": "2.0.1", 2143 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 2144 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 2145 | "dev": true 2146 | }, 2147 | "balanced-match": { 2148 | "version": "1.0.2", 2149 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2150 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 2151 | "dev": true 2152 | }, 2153 | "benchmark": { 2154 | "version": "2.1.4", 2155 | "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", 2156 | "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", 2157 | "dev": true, 2158 | "requires": { 2159 | "lodash": "^4.17.4", 2160 | "platform": "^1.3.3" 2161 | } 2162 | }, 2163 | "binary-extensions": { 2164 | "version": "2.2.0", 2165 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 2166 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 2167 | "dev": true 2168 | }, 2169 | "brace-expansion": { 2170 | "version": "2.0.1", 2171 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 2172 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 2173 | "dev": true, 2174 | "requires": { 2175 | "balanced-match": "^1.0.0" 2176 | } 2177 | }, 2178 | "braces": { 2179 | "version": "3.0.2", 2180 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 2181 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 2182 | "dev": true, 2183 | "requires": { 2184 | "fill-range": "^7.0.1" 2185 | } 2186 | }, 2187 | "browser-stdout": { 2188 | "version": "1.3.1", 2189 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 2190 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 2191 | "dev": true 2192 | }, 2193 | "camelcase": { 2194 | "version": "6.3.0", 2195 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 2196 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 2197 | "dev": true 2198 | }, 2199 | "chalk": { 2200 | "version": "4.1.2", 2201 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 2202 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 2203 | "dev": true, 2204 | "requires": { 2205 | "ansi-styles": "^4.1.0", 2206 | "supports-color": "^7.1.0" 2207 | }, 2208 | "dependencies": { 2209 | "supports-color": { 2210 | "version": "7.2.0", 2211 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2212 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2213 | "dev": true, 2214 | "requires": { 2215 | "has-flag": "^4.0.0" 2216 | } 2217 | } 2218 | } 2219 | }, 2220 | "chokidar": { 2221 | "version": "3.5.3", 2222 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 2223 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 2224 | "dev": true, 2225 | "requires": { 2226 | "anymatch": "~3.1.2", 2227 | "braces": "~3.0.2", 2228 | "fsevents": "~2.3.2", 2229 | "glob-parent": "~5.1.2", 2230 | "is-binary-path": "~2.1.0", 2231 | "is-glob": "~4.0.1", 2232 | "normalize-path": "~3.0.0", 2233 | "readdirp": "~3.6.0" 2234 | } 2235 | }, 2236 | "cliui": { 2237 | "version": "8.0.1", 2238 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 2239 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 2240 | "dev": true, 2241 | "requires": { 2242 | "string-width": "^4.2.0", 2243 | "strip-ansi": "^6.0.1", 2244 | "wrap-ansi": "^7.0.0" 2245 | }, 2246 | "dependencies": { 2247 | "ansi-regex": { 2248 | "version": "5.0.1", 2249 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2250 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2251 | "dev": true 2252 | }, 2253 | "emoji-regex": { 2254 | "version": "8.0.0", 2255 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2256 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2257 | "dev": true 2258 | }, 2259 | "string-width": { 2260 | "version": "4.2.3", 2261 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2262 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2263 | "dev": true, 2264 | "requires": { 2265 | "emoji-regex": "^8.0.0", 2266 | "is-fullwidth-code-point": "^3.0.0", 2267 | "strip-ansi": "^6.0.1" 2268 | } 2269 | }, 2270 | "strip-ansi": { 2271 | "version": "6.0.1", 2272 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2273 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2274 | "dev": true, 2275 | "requires": { 2276 | "ansi-regex": "^5.0.1" 2277 | } 2278 | }, 2279 | "wrap-ansi": { 2280 | "version": "7.0.0", 2281 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2282 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2283 | "dev": true, 2284 | "requires": { 2285 | "ansi-styles": "^4.0.0", 2286 | "string-width": "^4.1.0", 2287 | "strip-ansi": "^6.0.0" 2288 | } 2289 | } 2290 | } 2291 | }, 2292 | "color-convert": { 2293 | "version": "2.0.1", 2294 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2295 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2296 | "dev": true, 2297 | "requires": { 2298 | "color-name": "~1.1.4" 2299 | } 2300 | }, 2301 | "color-name": { 2302 | "version": "1.1.4", 2303 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2304 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2305 | "dev": true 2306 | }, 2307 | "cross-spawn": { 2308 | "version": "7.0.6", 2309 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 2310 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 2311 | "dev": true, 2312 | "requires": { 2313 | "path-key": "^3.1.0", 2314 | "shebang-command": "^2.0.0", 2315 | "which": "^2.0.1" 2316 | } 2317 | }, 2318 | "css-tree": { 2319 | "version": "3.1.0", 2320 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", 2321 | "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", 2322 | "requires": { 2323 | "mdn-data": "2.12.2", 2324 | "source-map-js": "^1.0.1" 2325 | } 2326 | }, 2327 | "debug": { 2328 | "version": "4.4.0", 2329 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 2330 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 2331 | "dev": true, 2332 | "requires": { 2333 | "ms": "^2.1.3" 2334 | } 2335 | }, 2336 | "decamelize": { 2337 | "version": "4.0.0", 2338 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 2339 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 2340 | "dev": true 2341 | }, 2342 | "diff": { 2343 | "version": "5.2.0", 2344 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", 2345 | "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", 2346 | "dev": true 2347 | }, 2348 | "eastasianwidth": { 2349 | "version": "0.2.0", 2350 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 2351 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 2352 | "dev": true 2353 | }, 2354 | "emoji-regex": { 2355 | "version": "9.2.2", 2356 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 2357 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 2358 | "dev": true 2359 | }, 2360 | "esbuild": { 2361 | "version": "0.25.0", 2362 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", 2363 | "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", 2364 | "dev": true, 2365 | "requires": { 2366 | "@esbuild/aix-ppc64": "0.25.0", 2367 | "@esbuild/android-arm": "0.25.0", 2368 | "@esbuild/android-arm64": "0.25.0", 2369 | "@esbuild/android-x64": "0.25.0", 2370 | "@esbuild/darwin-arm64": "0.25.0", 2371 | "@esbuild/darwin-x64": "0.25.0", 2372 | "@esbuild/freebsd-arm64": "0.25.0", 2373 | "@esbuild/freebsd-x64": "0.25.0", 2374 | "@esbuild/linux-arm": "0.25.0", 2375 | "@esbuild/linux-arm64": "0.25.0", 2376 | "@esbuild/linux-ia32": "0.25.0", 2377 | "@esbuild/linux-loong64": "0.25.0", 2378 | "@esbuild/linux-mips64el": "0.25.0", 2379 | "@esbuild/linux-ppc64": "0.25.0", 2380 | "@esbuild/linux-riscv64": "0.25.0", 2381 | "@esbuild/linux-s390x": "0.25.0", 2382 | "@esbuild/linux-x64": "0.25.0", 2383 | "@esbuild/netbsd-arm64": "0.25.0", 2384 | "@esbuild/netbsd-x64": "0.25.0", 2385 | "@esbuild/openbsd-arm64": "0.25.0", 2386 | "@esbuild/openbsd-x64": "0.25.0", 2387 | "@esbuild/sunos-x64": "0.25.0", 2388 | "@esbuild/win32-arm64": "0.25.0", 2389 | "@esbuild/win32-ia32": "0.25.0", 2390 | "@esbuild/win32-x64": "0.25.0" 2391 | } 2392 | }, 2393 | "escalade": { 2394 | "version": "3.2.0", 2395 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 2396 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 2397 | "dev": true 2398 | }, 2399 | "escape-string-regexp": { 2400 | "version": "4.0.0", 2401 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2402 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2403 | "dev": true 2404 | }, 2405 | "fill-range": { 2406 | "version": "7.0.1", 2407 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2408 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2409 | "dev": true, 2410 | "requires": { 2411 | "to-regex-range": "^5.0.1" 2412 | } 2413 | }, 2414 | "find-up": { 2415 | "version": "5.0.0", 2416 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2417 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2418 | "dev": true, 2419 | "requires": { 2420 | "locate-path": "^6.0.0", 2421 | "path-exists": "^4.0.0" 2422 | } 2423 | }, 2424 | "flat": { 2425 | "version": "5.0.2", 2426 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 2427 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 2428 | "dev": true 2429 | }, 2430 | "foreground-child": { 2431 | "version": "3.3.0", 2432 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 2433 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 2434 | "dev": true, 2435 | "requires": { 2436 | "cross-spawn": "^7.0.0", 2437 | "signal-exit": "^4.0.1" 2438 | } 2439 | }, 2440 | "fsevents": { 2441 | "version": "2.3.2", 2442 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2443 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2444 | "dev": true, 2445 | "optional": true 2446 | }, 2447 | "get-caller-file": { 2448 | "version": "2.0.5", 2449 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 2450 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 2451 | "dev": true 2452 | }, 2453 | "glob": { 2454 | "version": "10.4.5", 2455 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 2456 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 2457 | "dev": true, 2458 | "requires": { 2459 | "foreground-child": "^3.1.0", 2460 | "jackspeak": "^3.1.2", 2461 | "minimatch": "^9.0.4", 2462 | "minipass": "^7.1.2", 2463 | "package-json-from-dist": "^1.0.0", 2464 | "path-scurry": "^1.11.1" 2465 | }, 2466 | "dependencies": { 2467 | "minimatch": { 2468 | "version": "9.0.5", 2469 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 2470 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 2471 | "dev": true, 2472 | "requires": { 2473 | "brace-expansion": "^2.0.1" 2474 | } 2475 | } 2476 | } 2477 | }, 2478 | "glob-parent": { 2479 | "version": "5.1.2", 2480 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2481 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2482 | "dev": true, 2483 | "requires": { 2484 | "is-glob": "^4.0.1" 2485 | } 2486 | }, 2487 | "has-flag": { 2488 | "version": "4.0.0", 2489 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2490 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2491 | "dev": true 2492 | }, 2493 | "he": { 2494 | "version": "1.2.0", 2495 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 2496 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 2497 | "dev": true 2498 | }, 2499 | "is-binary-path": { 2500 | "version": "2.1.0", 2501 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2502 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2503 | "dev": true, 2504 | "requires": { 2505 | "binary-extensions": "^2.0.0" 2506 | } 2507 | }, 2508 | "is-extglob": { 2509 | "version": "2.1.1", 2510 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2511 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 2512 | "dev": true 2513 | }, 2514 | "is-fullwidth-code-point": { 2515 | "version": "3.0.0", 2516 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2517 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2518 | "dev": true 2519 | }, 2520 | "is-glob": { 2521 | "version": "4.0.3", 2522 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2523 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2524 | "dev": true, 2525 | "requires": { 2526 | "is-extglob": "^2.1.1" 2527 | } 2528 | }, 2529 | "is-number": { 2530 | "version": "7.0.0", 2531 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2532 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2533 | "dev": true 2534 | }, 2535 | "is-plain-obj": { 2536 | "version": "2.1.0", 2537 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 2538 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 2539 | "dev": true 2540 | }, 2541 | "is-unicode-supported": { 2542 | "version": "0.1.0", 2543 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 2544 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 2545 | "dev": true 2546 | }, 2547 | "isexe": { 2548 | "version": "2.0.0", 2549 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2550 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2551 | "dev": true 2552 | }, 2553 | "jackspeak": { 2554 | "version": "3.4.3", 2555 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 2556 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 2557 | "dev": true, 2558 | "requires": { 2559 | "@isaacs/cliui": "^8.0.2", 2560 | "@pkgjs/parseargs": "^0.11.0" 2561 | } 2562 | }, 2563 | "js-yaml": { 2564 | "version": "4.1.0", 2565 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2566 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2567 | "dev": true, 2568 | "requires": { 2569 | "argparse": "^2.0.1" 2570 | } 2571 | }, 2572 | "locate-path": { 2573 | "version": "6.0.0", 2574 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2575 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2576 | "dev": true, 2577 | "requires": { 2578 | "p-locate": "^5.0.0" 2579 | } 2580 | }, 2581 | "lodash": { 2582 | "version": "4.17.21", 2583 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2584 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2585 | "dev": true 2586 | }, 2587 | "log-symbols": { 2588 | "version": "4.1.0", 2589 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 2590 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 2591 | "dev": true, 2592 | "requires": { 2593 | "chalk": "^4.1.0", 2594 | "is-unicode-supported": "^0.1.0" 2595 | } 2596 | }, 2597 | "lru-cache": { 2598 | "version": "10.4.3", 2599 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 2600 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 2601 | "dev": true 2602 | }, 2603 | "mdn-data": { 2604 | "version": "2.12.2", 2605 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", 2606 | "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" 2607 | }, 2608 | "microtime": { 2609 | "version": "3.1.1", 2610 | "resolved": "https://registry.npmjs.org/microtime/-/microtime-3.1.1.tgz", 2611 | "integrity": "sha512-to1r7o24cDsud9IhN6/8wGmMx5R2kT0w2Xwm5okbYI3d1dk6Xv0m+Z+jg2vS9pt+ocgQHTCtgs/YuyJhySzxNg==", 2612 | "dev": true, 2613 | "requires": { 2614 | "node-addon-api": "^5.0.0", 2615 | "node-gyp-build": "^4.4.0" 2616 | } 2617 | }, 2618 | "minimatch": { 2619 | "version": "5.1.6", 2620 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 2621 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 2622 | "dev": true, 2623 | "requires": { 2624 | "brace-expansion": "^2.0.1" 2625 | } 2626 | }, 2627 | "minipass": { 2628 | "version": "7.1.2", 2629 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 2630 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 2631 | "dev": true 2632 | }, 2633 | "mocha": { 2634 | "version": "11.1.0", 2635 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", 2636 | "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==", 2637 | "dev": true, 2638 | "requires": { 2639 | "ansi-colors": "^4.1.3", 2640 | "browser-stdout": "^1.3.1", 2641 | "chokidar": "^3.5.3", 2642 | "debug": "^4.3.5", 2643 | "diff": "^5.2.0", 2644 | "escape-string-regexp": "^4.0.0", 2645 | "find-up": "^5.0.0", 2646 | "glob": "^10.4.5", 2647 | "he": "^1.2.0", 2648 | "js-yaml": "^4.1.0", 2649 | "log-symbols": "^4.1.0", 2650 | "minimatch": "^5.1.6", 2651 | "ms": "^2.1.3", 2652 | "serialize-javascript": "^6.0.2", 2653 | "strip-json-comments": "^3.1.1", 2654 | "supports-color": "^8.1.1", 2655 | "workerpool": "^6.5.1", 2656 | "yargs": "^17.7.2", 2657 | "yargs-parser": "^21.1.1", 2658 | "yargs-unparser": "^2.0.0" 2659 | } 2660 | }, 2661 | "ms": { 2662 | "version": "2.1.3", 2663 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2664 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2665 | "dev": true 2666 | }, 2667 | "node-addon-api": { 2668 | "version": "5.1.0", 2669 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", 2670 | "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", 2671 | "dev": true 2672 | }, 2673 | "node-gyp-build": { 2674 | "version": "4.8.4", 2675 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", 2676 | "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", 2677 | "dev": true 2678 | }, 2679 | "normalize-path": { 2680 | "version": "3.0.0", 2681 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2682 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2683 | "dev": true 2684 | }, 2685 | "p-limit": { 2686 | "version": "3.1.0", 2687 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2688 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2689 | "dev": true, 2690 | "requires": { 2691 | "yocto-queue": "^0.1.0" 2692 | } 2693 | }, 2694 | "p-locate": { 2695 | "version": "5.0.0", 2696 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2697 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2698 | "dev": true, 2699 | "requires": { 2700 | "p-limit": "^3.0.2" 2701 | } 2702 | }, 2703 | "package-json-from-dist": { 2704 | "version": "1.0.1", 2705 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 2706 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 2707 | "dev": true 2708 | }, 2709 | "path-exists": { 2710 | "version": "4.0.0", 2711 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2712 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2713 | "dev": true 2714 | }, 2715 | "path-key": { 2716 | "version": "3.1.1", 2717 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2718 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2719 | "dev": true 2720 | }, 2721 | "path-scurry": { 2722 | "version": "1.11.1", 2723 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 2724 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 2725 | "dev": true, 2726 | "requires": { 2727 | "lru-cache": "^10.2.0", 2728 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2729 | } 2730 | }, 2731 | "picomatch": { 2732 | "version": "2.3.1", 2733 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2734 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2735 | "dev": true 2736 | }, 2737 | "platform": { 2738 | "version": "1.3.6", 2739 | "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", 2740 | "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", 2741 | "dev": true 2742 | }, 2743 | "prettier": { 2744 | "version": "3.5.1", 2745 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz", 2746 | "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==", 2747 | "dev": true 2748 | }, 2749 | "randombytes": { 2750 | "version": "2.1.0", 2751 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2752 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2753 | "dev": true, 2754 | "requires": { 2755 | "safe-buffer": "^5.1.0" 2756 | } 2757 | }, 2758 | "readdirp": { 2759 | "version": "3.6.0", 2760 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2761 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2762 | "dev": true, 2763 | "requires": { 2764 | "picomatch": "^2.2.1" 2765 | } 2766 | }, 2767 | "require-directory": { 2768 | "version": "2.1.1", 2769 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2770 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2771 | "dev": true 2772 | }, 2773 | "safe-buffer": { 2774 | "version": "5.2.1", 2775 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2776 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2777 | "dev": true 2778 | }, 2779 | "semver": { 2780 | "version": "7.7.1", 2781 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 2782 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 2783 | "dev": true 2784 | }, 2785 | "serialize-javascript": { 2786 | "version": "6.0.2", 2787 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", 2788 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", 2789 | "dev": true, 2790 | "requires": { 2791 | "randombytes": "^2.1.0" 2792 | } 2793 | }, 2794 | "shebang-command": { 2795 | "version": "2.0.0", 2796 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2797 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2798 | "dev": true, 2799 | "requires": { 2800 | "shebang-regex": "^3.0.0" 2801 | } 2802 | }, 2803 | "shebang-regex": { 2804 | "version": "3.0.0", 2805 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2806 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2807 | "dev": true 2808 | }, 2809 | "signal-exit": { 2810 | "version": "4.1.0", 2811 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2812 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2813 | "dev": true 2814 | }, 2815 | "source-map-js": { 2816 | "version": "1.0.2", 2817 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2818 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 2819 | }, 2820 | "string-width": { 2821 | "version": "5.1.2", 2822 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2823 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2824 | "dev": true, 2825 | "requires": { 2826 | "eastasianwidth": "^0.2.0", 2827 | "emoji-regex": "^9.2.2", 2828 | "strip-ansi": "^7.0.1" 2829 | } 2830 | }, 2831 | "string-width-cjs": { 2832 | "version": "npm:string-width@4.2.3", 2833 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2834 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2835 | "dev": true, 2836 | "requires": { 2837 | "emoji-regex": "^8.0.0", 2838 | "is-fullwidth-code-point": "^3.0.0", 2839 | "strip-ansi": "^6.0.1" 2840 | }, 2841 | "dependencies": { 2842 | "ansi-regex": { 2843 | "version": "5.0.1", 2844 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2845 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2846 | "dev": true 2847 | }, 2848 | "emoji-regex": { 2849 | "version": "8.0.0", 2850 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2851 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2852 | "dev": true 2853 | }, 2854 | "strip-ansi": { 2855 | "version": "6.0.1", 2856 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2857 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2858 | "dev": true, 2859 | "requires": { 2860 | "ansi-regex": "^5.0.1" 2861 | } 2862 | } 2863 | } 2864 | }, 2865 | "strip-ansi": { 2866 | "version": "7.1.0", 2867 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2868 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2869 | "dev": true, 2870 | "requires": { 2871 | "ansi-regex": "^6.0.1" 2872 | } 2873 | }, 2874 | "strip-ansi-cjs": { 2875 | "version": "npm:strip-ansi@6.0.1", 2876 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2877 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2878 | "dev": true, 2879 | "requires": { 2880 | "ansi-regex": "^5.0.1" 2881 | }, 2882 | "dependencies": { 2883 | "ansi-regex": { 2884 | "version": "5.0.1", 2885 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2886 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2887 | "dev": true 2888 | } 2889 | } 2890 | }, 2891 | "strip-json-comments": { 2892 | "version": "3.1.1", 2893 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2894 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2895 | "dev": true 2896 | }, 2897 | "supports-color": { 2898 | "version": "8.1.1", 2899 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2900 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2901 | "dev": true, 2902 | "requires": { 2903 | "has-flag": "^4.0.0" 2904 | } 2905 | }, 2906 | "to-regex-range": { 2907 | "version": "5.0.1", 2908 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2909 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2910 | "dev": true, 2911 | "requires": { 2912 | "is-number": "^7.0.0" 2913 | } 2914 | }, 2915 | "which": { 2916 | "version": "2.0.2", 2917 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2918 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2919 | "dev": true, 2920 | "requires": { 2921 | "isexe": "^2.0.0" 2922 | } 2923 | }, 2924 | "workerpool": { 2925 | "version": "6.5.1", 2926 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", 2927 | "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", 2928 | "dev": true 2929 | }, 2930 | "wrap-ansi": { 2931 | "version": "8.1.0", 2932 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 2933 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 2934 | "dev": true, 2935 | "requires": { 2936 | "ansi-styles": "^6.1.0", 2937 | "string-width": "^5.0.1", 2938 | "strip-ansi": "^7.0.1" 2939 | }, 2940 | "dependencies": { 2941 | "ansi-styles": { 2942 | "version": "6.2.1", 2943 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 2944 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 2945 | "dev": true 2946 | } 2947 | } 2948 | }, 2949 | "wrap-ansi-cjs": { 2950 | "version": "npm:wrap-ansi@7.0.0", 2951 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2952 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2953 | "dev": true, 2954 | "requires": { 2955 | "ansi-styles": "^4.0.0", 2956 | "string-width": "^4.1.0", 2957 | "strip-ansi": "^6.0.0" 2958 | }, 2959 | "dependencies": { 2960 | "ansi-regex": { 2961 | "version": "5.0.1", 2962 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2963 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2964 | "dev": true 2965 | }, 2966 | "emoji-regex": { 2967 | "version": "8.0.0", 2968 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2969 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2970 | "dev": true 2971 | }, 2972 | "string-width": { 2973 | "version": "4.2.3", 2974 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2975 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2976 | "dev": true, 2977 | "requires": { 2978 | "emoji-regex": "^8.0.0", 2979 | "is-fullwidth-code-point": "^3.0.0", 2980 | "strip-ansi": "^6.0.1" 2981 | } 2982 | }, 2983 | "strip-ansi": { 2984 | "version": "6.0.1", 2985 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2986 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2987 | "dev": true, 2988 | "requires": { 2989 | "ansi-regex": "^5.0.1" 2990 | } 2991 | } 2992 | } 2993 | }, 2994 | "y18n": { 2995 | "version": "5.0.8", 2996 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2997 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2998 | "dev": true 2999 | }, 3000 | "yargs": { 3001 | "version": "17.7.2", 3002 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 3003 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 3004 | "dev": true, 3005 | "requires": { 3006 | "cliui": "^8.0.1", 3007 | "escalade": "^3.1.1", 3008 | "get-caller-file": "^2.0.5", 3009 | "require-directory": "^2.1.1", 3010 | "string-width": "^4.2.3", 3011 | "y18n": "^5.0.5", 3012 | "yargs-parser": "^21.1.1" 3013 | }, 3014 | "dependencies": { 3015 | "ansi-regex": { 3016 | "version": "5.0.1", 3017 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3018 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3019 | "dev": true 3020 | }, 3021 | "emoji-regex": { 3022 | "version": "8.0.0", 3023 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3024 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 3025 | "dev": true 3026 | }, 3027 | "string-width": { 3028 | "version": "4.2.3", 3029 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3030 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3031 | "dev": true, 3032 | "requires": { 3033 | "emoji-regex": "^8.0.0", 3034 | "is-fullwidth-code-point": "^3.0.0", 3035 | "strip-ansi": "^6.0.1" 3036 | } 3037 | }, 3038 | "strip-ansi": { 3039 | "version": "6.0.1", 3040 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3041 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3042 | "dev": true, 3043 | "requires": { 3044 | "ansi-regex": "^5.0.1" 3045 | } 3046 | } 3047 | } 3048 | }, 3049 | "yargs-parser": { 3050 | "version": "21.1.1", 3051 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 3052 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 3053 | "dev": true 3054 | }, 3055 | "yargs-unparser": { 3056 | "version": "2.0.0", 3057 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 3058 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 3059 | "dev": true, 3060 | "requires": { 3061 | "camelcase": "^6.0.0", 3062 | "decamelize": "^4.0.0", 3063 | "flat": "^5.0.2", 3064 | "is-plain-obj": "^2.1.0" 3065 | } 3066 | }, 3067 | "yocto-queue": { 3068 | "version": "0.1.0", 3069 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3070 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3071 | "dev": true 3072 | } 3073 | } 3074 | } 3075 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@bramus/specificity", 3 | "version": "2.4.1", 4 | "description": "Calculate specificity of a CSS Selector", 5 | "type": "module", 6 | "main": "./dist/index.cjs", 7 | "module": "./dist/index.js", 8 | "exports": { 9 | ".": { 10 | "browser": "./dist/index.js", 11 | "import": "./dist/index.js", 12 | "require": "./dist/index.cjs" 13 | }, 14 | "./core": { 15 | "import": "./src/core/index.js" 16 | }, 17 | "./util": { 18 | "import": "./src/util/index.js" 19 | }, 20 | "./compare": { 21 | "import": "./src/util/compare.js" 22 | }, 23 | "./filter": { 24 | "import": "./src/util/filter.js" 25 | }, 26 | "./sort": { 27 | "import": "./src/util/sort.js" 28 | } 29 | }, 30 | "unpkg": "./dist/index.js", 31 | "jsdelivr": "./dist/index.js", 32 | "files": [ 33 | "bin", 34 | "src", 35 | "dist", 36 | "index.d.ts" 37 | ], 38 | "types": "./index.d.ts", 39 | "bin": { 40 | "specificity": "./bin/cli.js" 41 | }, 42 | "scripts": { 43 | "build-esm": "esbuild --bundle ./src/index.js --outfile=./dist/index.js --format=esm --sourcemap --minify", 44 | "build-cjs": "esbuild --bundle ./src/index.js --outfile=./dist/index.cjs --format=cjs --sourcemap --minify", 45 | "lint": "prettier --check '{src,test}/**/*.{ts,tsx,js,jsx}'", 46 | "format": "prettier --write '{src,test}/**/*.{ts,tsx,js,jsx}'", 47 | "build": "npm run build-esm && npm run build-cjs", 48 | "prepack": "npm run prevent-dirty-tree && npm run test", 49 | "prepublish": "npm run build", 50 | "pretest": "npm run build", 51 | "test": "mocha", 52 | "prebenchmark": "npm run build", 53 | "benchmark": "node ./benchmark/bench.cjs", 54 | "beta-version-patch": "npm version $(semver $npm_package_version -i prerelease --preid beta)", 55 | "beta-version-minor": "npm version $(semver $npm_package_version -i preminor --preid beta)", 56 | "beta-version-major": "npm version $(semver $npm_package_version -i premajor --preid beta)", 57 | "rc-version": "npm version $(semver $npm_package_version -i prerelease --preid rc)", 58 | "final-release": "npm version $(semver $npm_package_version -i)", 59 | "preversion": "npm run prevent-dirty-tree && npm run test", 60 | "prevent-dirty-tree": "exit $(git status --porcelain | wc -l)" 61 | }, 62 | "repository": { 63 | "type": "git", 64 | "url": "git+https://github.com/bramus/specificity.git" 65 | }, 66 | "keywords": [ 67 | "css", 68 | "specificity" 69 | ], 70 | "author": { 71 | "name": "Bramus Van Damme", 72 | "email": "bramus@bram.us", 73 | "twitter": "@bramus", 74 | "web": "https://www.bram.us/" 75 | }, 76 | "license": "MIT", 77 | "bugs": { 78 | "url": "https://github.com/bramus/specificity/issues" 79 | }, 80 | "homepage": "https://github.com/bramus/specificity#readme", 81 | "devDependencies": { 82 | "benchmark": "^2.1.4", 83 | "esbuild": "^0.25.0", 84 | "microtime": "^3.1.1", 85 | "mocha": "^11.1.0", 86 | "prettier": "^3.5.1", 87 | "semver": "^7.7.1" 88 | }, 89 | "dependencies": { 90 | "css-tree": "^3.0.0" 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /screenshots/calculate-specificity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bramus/specificity/af31c7ec981e07c99b3732d60792d65a07033d99/screenshots/calculate-specificity.png -------------------------------------------------------------------------------- /src/core/calculate.js: -------------------------------------------------------------------------------- 1 | import parse from 'css-tree/selector-parser'; 2 | import Specificity from '../index.js'; 3 | import { max } from './../util/index.js'; 4 | 5 | /** @param {import('css-tree').Selector} selectorAST */ 6 | const calculateForAST = (selectorAST) => { 7 | // Quit while you're ahead 8 | if (!selectorAST || selectorAST.type !== 'Selector') { 9 | throw new TypeError(`Passed in source is not a Selector AST`); 10 | } 11 | 12 | // https://www.w3.org/TR/selectors-4/#specificity-rules 13 | let a = 0; /* ID Selectors */ 14 | let b = 0; /* Class selectors, Attributes selectors, and Pseudo-classes */ 15 | let c = 0; /* Type selectors and Pseudo-elements */ 16 | 17 | selectorAST.children.forEach((child) => { 18 | switch (child.type) { 19 | case 'IdSelector': 20 | a += 1; 21 | break; 22 | 23 | case 'AttributeSelector': 24 | case 'ClassSelector': 25 | b += 1; 26 | break; 27 | 28 | case 'PseudoClassSelector': 29 | switch (child.name.toLowerCase()) { 30 | // “The specificity of a :where() pseudo-class is replaced by zero.” 31 | case 'where': 32 | // Noop :) 33 | break; 34 | 35 | case '-webkit-any': 36 | case 'any': 37 | if (child.children?.first) { 38 | b += 1; 39 | } 40 | break; 41 | 42 | // “The specificity of an :is(), :not(), or :has() pseudo-class is replaced by the specificity of the most specific complex selector in its selector list argument.“ 43 | case '-moz-any': 44 | case 'is': 45 | case 'matches': 46 | case 'not': 47 | case 'has': 48 | if (child.children?.first) { 49 | // Calculate Specificity from nested SelectorList 50 | const max1 = max(...calculate(child.children.first)); 51 | 52 | // Adjust orig specificity 53 | a += max1.a; 54 | b += max1.b; 55 | c += max1.c; 56 | } 57 | 58 | break; 59 | 60 | // “The specificity of an :nth-child() or :nth-last-child() selector is the specificity of the pseudo class itself (counting as one pseudo-class selector) plus the specificity of the most specific complex selector in its selector list argument” 61 | case 'nth-child': 62 | case 'nth-last-child': 63 | b += 1; 64 | 65 | if (child.children?.first?.selector) { 66 | // Calculate Specificity from SelectorList 67 | const max2 = max(...calculate(child.children.first.selector)); 68 | 69 | // Adjust orig specificity 70 | a += max2.a; 71 | b += max2.b; 72 | c += max2.c; 73 | } 74 | break; 75 | 76 | // “The specificity of :host is that of a pseudo-class. The specificity of :host() is that of a pseudo-class, plus the specificity of its argument.” 77 | // “The specificity of :host-context() is that of a pseudo-class, plus the specificity of its argument.” 78 | case 'host-context': 79 | case 'host': 80 | b += 1; 81 | 82 | if (child.children?.first?.children) { 83 | // Workaround to a css-tree bug in which it allows complex selectors instead of only compound selectors 84 | // We work around it by filtering out any Combinator and successive Selectors 85 | const childAST = { type: 'Selector', children: [] }; 86 | let foundCombinator = false; 87 | child.children.first.children.forEach((entry) => { 88 | if (foundCombinator) return false; 89 | if (entry.type === 'Combinator') { 90 | foundCombinator = true; 91 | return false; 92 | } 93 | childAST.children.push(entry); 94 | }); 95 | 96 | // Calculate Specificity from Selector 97 | const childSpecificity = calculate(childAST)[0]; 98 | 99 | // Adjust orig specificity 100 | a += childSpecificity.a; 101 | b += childSpecificity.b; 102 | c += childSpecificity.c; 103 | } 104 | break; 105 | 106 | // Improper use of Pseudo-Class Selectors instead of a Pseudo-Element 107 | // @ref https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements#index 108 | case 'after': 109 | case 'before': 110 | case 'first-letter': 111 | case 'first-line': 112 | c += 1; 113 | break; 114 | 115 | default: 116 | b += 1; 117 | break; 118 | } 119 | break; 120 | 121 | case 'PseudoElementSelector': 122 | switch (child.name) { 123 | // “The specificity of ::slotted() is that of a pseudo-element, plus the specificity of its argument.” 124 | case 'slotted': 125 | c += 1; 126 | 127 | if (child.children?.first?.children) { 128 | // Workaround to a css-tree bug in which it allows complex selectors instead of only compound selectors 129 | // We work around it by filtering out any Combinator and successive Selectors 130 | const childAST = { type: 'Selector', children: [] }; 131 | let foundCombinator = false; 132 | child.children.first.children.forEach((entry) => { 133 | if (foundCombinator) return false; 134 | if (entry.type === 'Combinator') { 135 | foundCombinator = true; 136 | return false; 137 | } 138 | childAST.children.push(entry); 139 | }); 140 | 141 | // Calculate Specificity from Selector 142 | const childSpecificity = calculate(childAST)[0]; 143 | 144 | // Adjust orig specificity 145 | a += childSpecificity.a; 146 | b += childSpecificity.b; 147 | c += childSpecificity.c; 148 | } 149 | break; 150 | 151 | case 'view-transition-group': 152 | case 'view-transition-image-pair': 153 | case 'view-transition-old': 154 | case 'view-transition-new': 155 | // The specificity of a view-transition selector with a * argument is zero. 156 | if (child.children?.first?.value === '*') { 157 | break; 158 | } 159 | // The specificity of a view-transition selector with an argument is the same 160 | // as for other pseudo - elements, and is equivalent to a type selector. 161 | c += 1; 162 | break; 163 | 164 | default: 165 | c += 1; 166 | break; 167 | } 168 | break; 169 | 170 | case 'TypeSelector': 171 | // Omit namespace 172 | let typeSelector = child.name; 173 | if (typeSelector.includes('|')) { 174 | typeSelector = typeSelector.split('|')[1]; 175 | } 176 | 177 | // “Ignore the universal selector” 178 | if (typeSelector !== '*') { 179 | c += 1; 180 | } 181 | break; 182 | 183 | default: 184 | // NOOP 185 | break; 186 | } 187 | }); 188 | 189 | return new Specificity({ a, b, c }, selectorAST); 190 | }; 191 | 192 | const convertToAST = (source) => { 193 | // The passed in argument was a String. 194 | // ~> Let's try and parse to an AST 195 | if (typeof source === 'string' || source instanceof String) { 196 | try { 197 | return parse(source, { 198 | context: 'selectorList', 199 | }); 200 | } catch (e) { 201 | throw new TypeError(`Could not convert passed in source '${source}' to SelectorList: ${e.message}`); 202 | } 203 | } 204 | 205 | // The passed in argument was an Object. 206 | // ~> Let's verify if it's a AST of the type Selector or SelectorList 207 | if (source instanceof Object) { 208 | if (source.type && ['Selector', 'SelectorList'].includes(source.type)) { 209 | return source; 210 | } 211 | 212 | // Manually parsing subtree when the child is of the type Raw, most likely due to https://github.com/csstree/csstree/issues/151 213 | if (source.type && source.type === 'Raw') { 214 | try { 215 | return parse(source.value, { 216 | context: 'selectorList', 217 | }); 218 | } catch (e) { 219 | throw new TypeError(`Could not convert passed in source to SelectorList: ${e.message}`); 220 | } 221 | } 222 | 223 | throw new TypeError(`Passed in source is an Object but no AST / AST of the type Selector or SelectorList`); 224 | } 225 | 226 | throw new TypeError(`Passed in source is not a String nor an Object. I don't know what to do with it.`); 227 | }; 228 | 229 | /** 230 | * @param {string} selector 231 | * @returns {Specificity[]} 232 | */ 233 | const calculate = (selector) => { 234 | // Quit while you're ahead 235 | if (!selector) { 236 | return []; 237 | } 238 | 239 | // Make sure we have a SelectorList AST 240 | // If not, an exception will be thrown 241 | const ast = convertToAST(selector); 242 | 243 | // Selector? 244 | if (ast.type === 'Selector') { 245 | return [calculateForAST(selector)]; 246 | } 247 | 248 | // SelectorList? 249 | // ~> Calculate Specificity for each contained Selector 250 | if (ast.type === 'SelectorList') { 251 | const specificities = []; 252 | ast.children.forEach((childAST) => { 253 | const specificity = calculateForAST(childAST); 254 | specificities.push(specificity); 255 | }); 256 | return specificities; 257 | } 258 | }; 259 | 260 | export { calculate, calculateForAST }; 261 | -------------------------------------------------------------------------------- /src/core/index.js: -------------------------------------------------------------------------------- 1 | export { calculate, calculateForAST } from './calculate.js'; 2 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import generate from 'css-tree/generator'; 2 | 3 | import { calculate, calculateForAST } from './core/index.js'; 4 | import { compare, equals, greaterThan, lessThan } from './util/compare.js'; 5 | import { min, max } from './util/filter.js'; 6 | import { sortAsc, sortDesc } from './util/sort.js'; 7 | 8 | class NotAllowedError extends Error { 9 | constructor() { 10 | super('Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()'); 11 | } 12 | } 13 | 14 | class Specificity { 15 | constructor(value, selector = null) { 16 | this.value = value; 17 | this.selector = selector; 18 | } 19 | 20 | get a() { 21 | return this.value.a; 22 | } 23 | 24 | set a(val) { 25 | throw new NotAllowedError(); 26 | } 27 | 28 | get b() { 29 | return this.value.b; 30 | } 31 | 32 | set b(val) { 33 | throw new NotAllowedError(); 34 | } 35 | 36 | get c() { 37 | return this.value.c; 38 | } 39 | 40 | set c(val) { 41 | throw new NotAllowedError(); 42 | } 43 | 44 | selectorString() { 45 | // this.selector already is a String 46 | if (typeof this.selector === 'string' || this.selector instanceof String) { 47 | return this.selector; 48 | } 49 | 50 | // this.selector is a Selector as parsed by CSSTree 51 | if (this.selector instanceof Object) { 52 | if (this.selector.type === 'Selector') { 53 | return generate(this.selector); 54 | } 55 | } 56 | 57 | // this.selector is something else … 58 | return ''; 59 | } 60 | 61 | toObject() { 62 | return this.value; 63 | } 64 | 65 | toArray() { 66 | return [this.value.a, this.value.b, this.value.c]; 67 | } 68 | 69 | toString() { 70 | return `(${this.value.a},${this.value.b},${this.value.c})`; 71 | } 72 | 73 | toJSON() { 74 | return { 75 | selector: this.selectorString(), 76 | asObject: this.toObject(), 77 | asArray: this.toArray(), 78 | asString: this.toString(), 79 | }; 80 | } 81 | 82 | isEqualTo(otherSpecificity) { 83 | return equals(this, otherSpecificity); 84 | } 85 | 86 | isGreaterThan(otherSpecificity) { 87 | return greaterThan(this, otherSpecificity); 88 | } 89 | 90 | isLessThan(otherSpecificity) { 91 | return lessThan(this, otherSpecificity); 92 | } 93 | 94 | static calculate(selector) { 95 | return calculate(selector); 96 | } 97 | 98 | static calculateForAST(selector) { 99 | return calculateForAST(selector); 100 | } 101 | 102 | static compare(s1, s2) { 103 | return compare(s1, s2); 104 | } 105 | 106 | static equals(s1, s2) { 107 | return equals(s1, s2); 108 | } 109 | 110 | static lessThan(s1, s2) { 111 | return lessThan(s1, s2); 112 | } 113 | 114 | static greaterThan(s1, s2) { 115 | return greaterThan(s1, s2); 116 | } 117 | 118 | static min(...specificities) { 119 | return min(...specificities); 120 | } 121 | 122 | static max(...specificities) { 123 | return max(...specificities); 124 | } 125 | 126 | static sortAsc(...specificities) { 127 | return sortAsc(...specificities); 128 | } 129 | 130 | static sortDesc(...specificities) { 131 | return sortDesc(...specificities); 132 | } 133 | } 134 | 135 | export default Specificity; 136 | -------------------------------------------------------------------------------- /src/util/compare.js: -------------------------------------------------------------------------------- 1 | const compare = (s1, s2) => { 2 | if (s1.a === s2.a) { 3 | if (s1.b === s2.b) { 4 | return s1.c - s2.c; 5 | } 6 | return s1.b - s2.b; 7 | } 8 | return s1.a - s2.a; 9 | }; 10 | 11 | const equals = (s1, s2) => { 12 | return compare(s1, s2) === 0; 13 | }; 14 | 15 | const greaterThan = (s1, s2) => { 16 | return compare(s1, s2) > 0; 17 | }; 18 | 19 | const lessThan = (s1, s2) => { 20 | return compare(s1, s2) < 0; 21 | }; 22 | 23 | export { compare, equals, greaterThan, lessThan }; 24 | -------------------------------------------------------------------------------- /src/util/filter.js: -------------------------------------------------------------------------------- 1 | import { sortAsc, sortDesc } from './sort.js'; 2 | 3 | const max = (...specificities) => { 4 | const sorted = sortDesc(...specificities); 5 | return sorted[0]; 6 | }; 7 | 8 | const min = (...specificities) => { 9 | const sorted = sortAsc(...specificities); 10 | return sorted[0]; 11 | }; 12 | 13 | export { max, min }; 14 | -------------------------------------------------------------------------------- /src/util/index.js: -------------------------------------------------------------------------------- 1 | export * from './compare.js'; 2 | export * from './sort.js'; 3 | export * from './filter.js'; 4 | -------------------------------------------------------------------------------- /src/util/sort.js: -------------------------------------------------------------------------------- 1 | import { compare } from './compare.js'; 2 | 3 | const sort = (specificities, order = 'ASC') => { 4 | const sorted = specificities.sort(compare); 5 | 6 | if (order === 'DESC') { 7 | return sorted.reverse(); 8 | } 9 | 10 | return sorted; 11 | }; 12 | 13 | const sortAsc = (...specificities) => { 14 | return sort(specificities, 'ASC'); 15 | }; 16 | 17 | const sortDesc = (...specificities) => { 18 | return sort(specificities, 'DESC'); 19 | }; 20 | 21 | export { sortAsc, sortDesc }; 22 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | import { deepEqual } from 'assert'; 2 | import { parse } from 'css-tree'; 3 | 4 | import Specificity from '../dist/index.js'; 5 | 6 | describe('CALCULATE', () => { 7 | describe('Examples from the spec', () => { 8 | it('* = (0,0,0)', () => { 9 | deepEqual(Specificity.calculate('*')[0].toObject(), { a: 0, b: 0, c: 0 }); 10 | }); 11 | it('li = (0,0,1)', () => { 12 | deepEqual(Specificity.calculate('li')[0].toObject(), { a: 0, b: 0, c: 1 }); 13 | }); 14 | it('ul li = (0,0,2)', () => { 15 | deepEqual(Specificity.calculate('ul li')[0].toObject(), { a: 0, b: 0, c: 2 }); 16 | }); 17 | it('UL OL+LI = (0,0,3)', () => { 18 | deepEqual(Specificity.calculate('UL OL+LI ')[0].toObject(), { a: 0, b: 0, c: 3 }); 19 | }); 20 | it('H1 + *[REL=up] = (0,1,1)', () => { 21 | deepEqual(Specificity.calculate('H1 + *[REL=up]')[0].toObject(), { a: 0, b: 1, c: 1 }); 22 | }); 23 | it('UL OL LI.red = (0,1,3)', () => { 24 | deepEqual(Specificity.calculate('UL OL LI.red')[0].toObject(), { a: 0, b: 1, c: 3 }); 25 | }); 26 | it('LI.red.level = (0,2,1)', () => { 27 | deepEqual(Specificity.calculate('LI.red.level')[0].toObject(), { a: 0, b: 2, c: 1 }); 28 | }); 29 | it('#x34y = (1,0,0)', () => { 30 | deepEqual(Specificity.calculate('#x34y')[0].toObject(), { a: 1, b: 0, c: 0 }); 31 | }); 32 | it('#s12:not(FOO) = (1,0,1)', () => { 33 | deepEqual(Specificity.calculate('#s12:not(FOO)')[0].toObject(), { a: 1, b: 0, c: 1 }); 34 | }); 35 | it('.foo :is(.bar, #baz) = (1,1,0)', () => { 36 | deepEqual(Specificity.calculate('.foo :is(.bar, #baz)')[0].toObject(), { a: 1, b: 1, c: 0 }); 37 | }); 38 | }); 39 | 40 | describe('Examples by Kilian', () => { 41 | it('header h1#sitetitle > .logo = (1,1,2)', () => { 42 | deepEqual(Specificity.calculate('header h1#sitetitle > .logo')[0].toObject(), { a: 1, b: 1, c: 2 }); 43 | }); 44 | it('ul > li:is(.highlighted, .active) = (0,1,2)', () => { 45 | deepEqual(Specificity.calculate('ul > li:is(.highlighted, .active)')[0].toObject(), { a: 0, b: 1, c: 2 }); 46 | }); 47 | it('header:where(#top) nav li:nth-child(2n + 1) = (0,1,3)', () => { 48 | deepEqual(Specificity.calculate('header:where(#top) nav li:nth-child(2n + 1)')[0].toObject(), { a: 0, b: 1, c: 3 }); 49 | }); 50 | }); 51 | 52 | describe('Examples by Kilian, remixed', () => { 53 | it('header:has(#top) nav li:nth-child(2n + 1) = (1,1,3)', () => { 54 | deepEqual(Specificity.calculate('header:has(#top) nav li:nth-child(2n + 1)')[0].toObject(), { a: 1, b: 1, c: 3 }); 55 | }); 56 | it('header:has(#top) nav li:nth-child(2n + 1 of .foo) = (1,2,3)', () => { 57 | deepEqual(Specificity.calculate('header:has(#top) nav li:nth-child(2n + 1 of .foo)')[0].toObject(), { a: 1, b: 2, c: 3 }); 58 | }); 59 | it('header:has(#top) nav li:nth-child(2n + 1 of .foo, #bar) = (2,1,3)', () => { 60 | deepEqual(Specificity.calculate('header:has(#top) nav li:nth-child(2n + 1 of .foo, #bar)')[0].toObject(), { a: 2, b: 1, c: 3 }); 61 | }); 62 | }); 63 | 64 | describe('Pseudo-Element Selector = (0,0,1)', () => { 65 | it('::after', () => { 66 | deepEqual(Specificity.calculate('::after')[0].toObject(), { a: 0, b: 0, c: 1 }); 67 | }); 68 | it('::cue', () => { 69 | deepEqual(Specificity.calculate('::cue')[0].toObject(), { a: 0, b: 0, c: 1 }); 70 | }); 71 | it('::before', () => { 72 | deepEqual(Specificity.calculate('::before')[0].toObject(), { a: 0, b: 0, c: 1 }); 73 | }); 74 | it('::first-line', () => { 75 | deepEqual(Specificity.calculate('::first-line')[0].toObject(), { a: 0, b: 0, c: 1 }); 76 | }); 77 | it('::first-letter', () => { 78 | deepEqual(Specificity.calculate('::first-letter')[0].toObject(), { a: 0, b: 0, c: 1 }); 79 | }); 80 | }); 81 | 82 | describe('Pseudo-Element Selector ::slotted', () => { 83 | it('::slotted', () => { 84 | deepEqual(Specificity.calculate('::slotted')[0].toObject(), { a: 0, b: 0, c: 1 }); 85 | }); 86 | it('::slotted() & do not crash', () => { 87 | deepEqual(Specificity.calculate('::slotted()')[0].toObject(), { a: 0, b: 0, c: 1 }); 88 | }); 89 | it('::slotted(div#foo)', () => { 90 | deepEqual(Specificity.calculate('::slotted(div#foo)')[0].toObject(), { a: 1, b: 0, c: 2 }); 91 | }); 92 | it('::slotted(#foo invalid)', () => { 93 | deepEqual(Specificity.calculate('::slotted(#foo invalid)')[0].toObject(), { a: 1, b: 0, c: 1 }); 94 | }); 95 | it('::slotted(#foo.bar)', () => { 96 | deepEqual(Specificity.calculate('::slotted(#foo.bar)')[0].toObject(), { a: 1, b: 1, c: 1 }); 97 | }); 98 | it('::slotted(#foo.bar invalid)', () => { 99 | deepEqual(Specificity.calculate('::slotted(#foo.bar invalid)')[0].toObject(), { a: 1, b: 1, c: 1 }); 100 | }); 101 | }); 102 | 103 | describe('Pseudo-Element Selector ::view-transition and friends', () => { 104 | // Default Specificity is 0,0,1... 105 | it('::view-transition', () => { 106 | deepEqual(Specificity.calculate('::view-transition')[0].toObject(), { a: 0, b: 0, c: 1 }); 107 | }); 108 | it('::view-transition-old() & do not crash', () => { 109 | deepEqual(Specificity.calculate('::view-transition-old()')[0].toObject(), { a: 0, b: 0, c: 1 }); 110 | }); 111 | it('::view-transition-group(test)', () => { 112 | deepEqual(Specificity.calculate('::view-transition-group(test)')[0].toObject(), { a: 0, b: 0, c: 1 }); 113 | }); 114 | it('::view-transition-image-pair(test)', () => { 115 | deepEqual(Specificity.calculate('::view-transition-image-pair(test)')[0].toObject(), { a: 0, b: 0, c: 1 }); 116 | }); 117 | it('::view-transition-old(test)', () => { 118 | deepEqual(Specificity.calculate('::view-transition-old(test)')[0].toObject(), { a: 0, b: 0, c: 1 }); 119 | }); 120 | it('::view-transition-new(test)', () => { 121 | deepEqual(Specificity.calculate('::view-transition-new(test)')[0].toObject(), { a: 0, b: 0, c: 1 }); 122 | }); 123 | 124 | // Specificity is 0,0,0 when name equals * 125 | it('::view-transition-group(*)', () => { 126 | deepEqual(Specificity.calculate('::view-transition-group(*)')[0].toObject(), { a: 0, b: 0, c: 0 }); 127 | }); 128 | it('::view-transition-image-pair(*)', () => { 129 | deepEqual(Specificity.calculate('::view-transition-image-pair(*)')[0].toObject(), { a: 0, b: 0, c: 0 }); 130 | }); 131 | it('::view-transition-old(*)', () => { 132 | deepEqual(Specificity.calculate('::view-transition-old(*)')[0].toObject(), { a: 0, b: 0, c: 0 }); 133 | }); 134 | it('::view-transition-new(*)', () => { 135 | deepEqual(Specificity.calculate('::view-transition-new(*)')[0].toObject(), { a: 0, b: 0, c: 0 }); 136 | }); 137 | }); 138 | 139 | // @ref https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements#index 140 | describe('Pseudo-Class improperly used instead of Pseudo-Element Selector = (0,0,1)', () => { 141 | it(':before', () => { 142 | deepEqual(Specificity.calculate(':before')[0].toObject(), { a: 0, b: 0, c: 1 }); 143 | }); 144 | it(':BEFORE', () => { 145 | deepEqual(Specificity.calculate(':BEFORE')[0].toObject(), { a: 0, b: 0, c: 1 }); 146 | }); 147 | it(':after', () => { 148 | deepEqual(Specificity.calculate(':after')[0].toObject(), { a: 0, b: 0, c: 1 }); 149 | }); 150 | it(':AFTER', () => { 151 | deepEqual(Specificity.calculate(':AFTER')[0].toObject(), { a: 0, b: 0, c: 1 }); 152 | }); 153 | it(':first-line', () => { 154 | deepEqual(Specificity.calculate(':first-line')[0].toObject(), { a: 0, b: 0, c: 1 }); 155 | }); 156 | it(':first-letter', () => { 157 | deepEqual(Specificity.calculate(':first-letter')[0].toObject(), { a: 0, b: 0, c: 1 }); 158 | }); 159 | }); 160 | 161 | describe('Pseudo-Class Selector = (0,1,0)', () => { 162 | it(':hover', () => { 163 | deepEqual(Specificity.calculate(':hover')[0].toObject(), { a: 0, b: 1, c: 0 }); 164 | }); 165 | it(':focus', () => { 166 | deepEqual(Specificity.calculate(':focus')[0].toObject(), { a: 0, b: 1, c: 0 }); 167 | }); 168 | it('p:nth-child(1) = (0,1,1)', () => { 169 | deepEqual(Specificity.calculate('p:nth-child(1)')[0].toObject(), { a: 0, b: 1, c: 1 }); 170 | }); 171 | it('p:nth-child(2n+1) = (0,1,1)', () => { 172 | deepEqual(Specificity.calculate('p:nth-child(2n+1)')[0].toObject(), { a: 0, b: 1, c: 1 }); 173 | }); 174 | it('p:nth-child = (0,1,1) & do not crash', () => { 175 | deepEqual(Specificity.calculate('p:nth-child')[0].toObject(), { a: 0, b: 1, c: 1 }); 176 | }); 177 | it('p:nth-child() = (0,1,1) & do not crash', () => { 178 | deepEqual(Specificity.calculate('p:nth-child()')[0].toObject(), { a: 0, b: 1, c: 1 }); 179 | }); 180 | }); 181 | 182 | describe('CSS :is(), :matches(), :-moz-any = Specificity of the most specific complex selector in its selector list argument', () => { 183 | it(':is(#foo, .bar, baz) = (1,0,0)', () => { 184 | deepEqual(Specificity.calculate(':is(#foo, .bar, baz)')[0].toObject(), { a: 1, b: 0, c: 0 }); 185 | }); 186 | it(':matches(#foo, .bar, baz) = (1,0,0)', () => { 187 | deepEqual(Specificity.calculate(':matches(#foo, .bar, baz)')[0].toObject(), { a: 1, b: 0, c: 0 }); 188 | }); 189 | it(':-moz-any(#foo, .bar, baz) = (1,0,0)', () => { 190 | deepEqual(Specificity.calculate(':-moz-any(#foo, .bar, baz)')[0].toObject(), { a: 1, b: 0, c: 0 }); 191 | }); 192 | it(':has() & do not crash', () => { 193 | deepEqual(Specificity.calculate(':has()')[0].toObject(), { a: 0, b: 0, c: 0 }); 194 | }); 195 | }); 196 | 197 | describe('CSS :any() = (0,1,0)', () => { 198 | it(':any(#foo, .bar, baz) = (0,1,0)', () => { 199 | deepEqual(Specificity.calculate(':any(#foo, .bar, baz)')[0].toObject(), { a: 0, b: 1, c: 0 }); 200 | }); 201 | it(':-webkit-any(#foo, .bar, baz) = (0,1,0)', () => { 202 | deepEqual(Specificity.calculate(':-webkit-any(#foo, .bar, baz)')[0].toObject(), { a: 0, b: 1, c: 0 }); 203 | }); 204 | }); 205 | 206 | describe('CSS empty :is, :matches, :any, :where = (0,0,0)', () => { 207 | it(':is = (0,0,0)', () => { 208 | deepEqual(Specificity.calculate(':is')[0].toObject(), { a: 0, b: 0, c: 0 }); 209 | }); 210 | it(':matches = (0,0,0)', () => { 211 | deepEqual(Specificity.calculate(':matches')[0].toObject(), { a: 0, b: 0, c: 0 }); 212 | }); 213 | it(':any = (0,0,0)', () => { 214 | deepEqual(Specificity.calculate(':any')[0].toObject(), { a: 0, b: 0, c: 0 }); 215 | }); 216 | it(':where = (0,0,0)', () => { 217 | deepEqual(Specificity.calculate(':where')[0].toObject(), { a: 0, b: 0, c: 0 }); 218 | }); 219 | 220 | it(':is() = (0,0,0)', () => { 221 | deepEqual(Specificity.calculate(':is()')[0].toObject(), { a: 0, b: 0, c: 0 }); 222 | }); 223 | it(':matches() = (0,0,0)', () => { 224 | deepEqual(Specificity.calculate(':matches()')[0].toObject(), { a: 0, b: 0, c: 0 }); 225 | }); 226 | it(':any() = (0,0,0)', () => { 227 | deepEqual(Specificity.calculate(':any()')[0].toObject(), { a: 0, b: 0, c: 0 }); 228 | }); 229 | it(':where() = (0,0,0)', () => { 230 | deepEqual(Specificity.calculate(':where()')[0].toObject(), { a: 0, b: 0, c: 0 }); 231 | }); 232 | }); 233 | 234 | describe('CSS :has() = Specificity of the most specific complex selector in its selector list argument', () => { 235 | it(':has(#foo, .bar, baz) = (1,0,0)', () => { 236 | deepEqual(Specificity.calculate(':has(#foo, .bar, baz)')[0].toObject(), { a: 1, b: 0, c: 0 }); 237 | }); 238 | }); 239 | 240 | describe('CSS :not() = Specificity of the most specific complex selector in its selector list argument', () => { 241 | it(':not(#foo, .bar, baz) = (1,0,0)', () => { 242 | deepEqual(Specificity.calculate(':not(#foo, .bar, baz)')[0].toObject(), { a: 1, b: 0, c: 0 }); 243 | }); 244 | }); 245 | 246 | describe('CSS :where() = Replaced by zero', () => { 247 | it(':where(#foo, .bar, baz) = (0,0,0)', () => { 248 | deepEqual(Specificity.calculate(':where(#foo, .bar, baz)')[0].toObject(), { a: 0, b: 0, c: 0 }); 249 | }); 250 | }); 251 | 252 | describe('CSS :host() / :host-context() = Pseudo-class, plus the specificity of its argument', () => { 253 | it(':host = (0,1,0)', () => { 254 | deepEqual(Specificity.calculate(':host')[0].toObject(), { a: 0, b: 1, c: 0 }); 255 | }); 256 | it(':host() = (0,1,0) & do not crash', () => { 257 | deepEqual(Specificity.calculate(':host()')[0].toObject(), { a: 0, b: 1, c: 0 }); 258 | }); 259 | it(':host(#foo.bar) = (1,2,0)', () => { 260 | deepEqual(Specificity.calculate(':host(#foo.bar)')[0].toObject(), { a: 1, b: 2, c: 0 }); 261 | }); 262 | it(':host(#foo.bar invalid) = (1,2,0)', () => { 263 | deepEqual(Specificity.calculate(':host(#foo.bar invalid)')[0].toObject(), { a: 1, b: 2, c: 0 }); 264 | }); 265 | it(':host-context() = (0,1,0) & do not crash', () => { 266 | deepEqual(Specificity.calculate(':host-context()')[0].toObject(), { a: 0, b: 1, c: 0 }); 267 | }); 268 | it(':host-context(#foo.bar) = (1,2,0)', () => { 269 | deepEqual(Specificity.calculate(':host-context(#foo.bar)')[0].toObject(), { a: 1, b: 2, c: 0 }); 270 | }); 271 | it(':host-context(#foo.bar invalid) = (1,2,0)', () => { 272 | deepEqual(Specificity.calculate(':host-context(#foo.bar invalid)')[0].toObject(), { a: 1, b: 2, c: 0 }); 273 | }); 274 | }); 275 | 276 | // @ref https://developer.mozilla.org/en-US/docs/Web/CSS/Type_selectors#namespaces 277 | describe('Namespaced Selectors', () => { 278 | it('ns|* = (0,0,0)', () => { 279 | deepEqual(Specificity.calculate('ns|*')[0].toObject(), { a: 0, b: 0, c: 0 }); 280 | }); 281 | it('ns|a = (0,0,1)', () => { 282 | deepEqual(Specificity.calculate('ns|a')[0].toObject(), { a: 0, b: 0, c: 1 }); 283 | }); 284 | }); 285 | 286 | describe('Calculate accepts multiple selectors (i.e. a SelectorList)', () => { 287 | it('foo, .bar = [(0,0,1),(0,1,0)]', () => { 288 | deepEqual(Specificity.calculate('foo, .bar')[0].toObject(), { a: 0, b: 0, c: 1 }); 289 | deepEqual(Specificity.calculate('foo, .bar')[1].toObject(), { a: 0, b: 1, c: 0 }); 290 | }); 291 | }); 292 | 293 | describe('Calculate accepts an empty value', () => { 294 | it('"" = []', () => { 295 | deepEqual(Specificity.calculate(''), []); 296 | }); 297 | }); 298 | 299 | describe('Calculate handles nesting selectors', () => { 300 | it('& = (0,0,0)', () => { 301 | deepEqual(Specificity.calculate('&')[0].toObject(), { a: 0, b: 0, c: 0 }); 302 | }); 303 | }); 304 | }); 305 | 306 | describe('CALCULATE_FOR_SELECTOR_AST', () => { 307 | describe('Examples from the spec', () => { 308 | it('* = (0,0,0)', () => { 309 | deepEqual(Specificity.calculateForAST(parse('*', { context: 'selector' })).toObject(), { a: 0, b: 0, c: 0 }); 310 | }); 311 | it('li = (0,0,1)', () => { 312 | deepEqual(Specificity.calculateForAST(parse('li', { context: 'selector' })).toObject(), { a: 0, b: 0, c: 1 }); 313 | }); 314 | it('ul li = (0,0,2)', () => { 315 | deepEqual(Specificity.calculateForAST(parse('ul li', { context: 'selector' })).toObject(), { a: 0, b: 0, c: 2 }); 316 | }); 317 | it('UL OL+LI = (0,0,3)', () => { 318 | deepEqual(Specificity.calculateForAST(parse('UL OL+LI ', { context: 'selector' })).toObject(), { a: 0, b: 0, c: 3 }); 319 | }); 320 | it('H1 + *[REL=up] = (0,1,1)', () => { 321 | deepEqual(Specificity.calculateForAST(parse('H1 + *[REL=up]', { context: 'selector' })).toObject(), { a: 0, b: 1, c: 1 }); 322 | }); 323 | it('UL OL LI.red = (0,1,3)', () => { 324 | deepEqual(Specificity.calculateForAST(parse('UL OL LI.red', { context: 'selector' })).toObject(), { a: 0, b: 1, c: 3 }); 325 | }); 326 | it('LI.red.level = (0,2,1)', () => { 327 | deepEqual(Specificity.calculateForAST(parse('LI.red.level', { context: 'selector' })).toObject(), { a: 0, b: 2, c: 1 }); 328 | }); 329 | it('#x34y = (1,0,0)', () => { 330 | deepEqual(Specificity.calculateForAST(parse('#x34y', { context: 'selector' })).toObject(), { a: 1, b: 0, c: 0 }); 331 | }); 332 | it('#s12:not(FOO) = (1,0,1)', () => { 333 | deepEqual(Specificity.calculateForAST(parse('#s12:not(FOO)', { context: 'selector' })).toObject(), { a: 1, b: 0, c: 1 }); 334 | }); 335 | it('.foo :is(.bar, #baz) = (1,1,0)', () => { 336 | deepEqual(Specificity.calculateForAST(parse('.foo :is(.bar, #baz)', { context: 'selector' })).toObject(), { a: 1, b: 1, c: 0 }); 337 | }); 338 | }); 339 | }); 340 | 341 | describe('COMPARE', () => { 342 | const sHigh = { a: 1, b: 0, c: 0 }; 343 | const sMed = { a: 0, b: 1, c: 0 }; 344 | const sLow = { a: 0, b: 0, c: 1 }; 345 | 346 | const [sHighObject, sMedObject, sLowObject] = Specificity.calculate('#foo, .foo, baz'); 347 | 348 | describe('compare (using plain Objects)', () => { 349 | it('compare(sHigh, sLow) = 1', () => { 350 | deepEqual(Specificity.compare(sHigh, sLow), 1); 351 | }); 352 | it('compare(sLow, sHigh) = -1', () => { 353 | deepEqual(Specificity.compare(sLow, sHigh), -1); 354 | }); 355 | it('compare(sMed, sMed) = 0', () => { 356 | deepEqual(Specificity.compare(sMed, sMed), 0); 357 | }); 358 | }); 359 | 360 | describe('compare (using Specificity Instances)', () => { 361 | it('compare(sHighObject, sLowObject) = 1', () => { 362 | deepEqual(Specificity.compare(sHighObject, sLowObject), 1); 363 | }); 364 | it('compare(sLowObject, sHighObject) = -1', () => { 365 | deepEqual(Specificity.compare(sLowObject, sHighObject), -1); 366 | }); 367 | it('compare(sMedObject, sMedObject) = 0', () => { 368 | deepEqual(Specificity.compare(sMedObject, sMedObject), 0); 369 | }); 370 | }); 371 | 372 | describe('greaterThan (using plain Objects)', () => { 373 | it('greaterThan(sHigh, sLow) = true', () => { 374 | deepEqual(Specificity.greaterThan(sHigh, sLow), true); 375 | }); 376 | it('greaterThan(sLow, sHigh) = false', () => { 377 | deepEqual(Specificity.greaterThan(sLow, sHigh), false); 378 | }); 379 | it('greaterThan(sMed, sMed) = false', () => { 380 | deepEqual(Specificity.greaterThan(sMed, sMed), false); 381 | }); 382 | }); 383 | 384 | describe('greaterThan (using Specificity Instances)', () => { 385 | it('greaterThan(sHighObject, sLowObject) = true', () => { 386 | deepEqual(Specificity.greaterThan(sHighObject, sLowObject), true); 387 | }); 388 | it('greaterThan(sLowObject, sHighObject) = false', () => { 389 | deepEqual(Specificity.greaterThan(sLowObject, sHighObject), false); 390 | }); 391 | it('greaterThan(sMedObject, sMedObject) = false', () => { 392 | deepEqual(Specificity.greaterThan(sMedObject, sMedObject), false); 393 | }); 394 | }); 395 | 396 | describe('lessThan (using plain Objects)', () => { 397 | it('lessThan(sHigh, sLow) = false', () => { 398 | deepEqual(Specificity.lessThan(sHigh, sLow), false); 399 | }); 400 | it('lessThan(sLow, sHigh) = true', () => { 401 | deepEqual(Specificity.lessThan(sLow, sHigh), true); 402 | }); 403 | it('lessThan(sMed, sMed) = false', () => { 404 | deepEqual(Specificity.lessThan(sMed, sMed), false); 405 | }); 406 | }); 407 | 408 | describe('Call lessThan with Specificity Instances', () => { 409 | it('lessThan(sHighObject, sLowObject) = false', () => { 410 | deepEqual(Specificity.lessThan(sHighObject, sLowObject), false); 411 | }); 412 | it('lessThan(sLowObject, sHighObject) = true', () => { 413 | deepEqual(Specificity.lessThan(sLowObject, sHighObject), true); 414 | }); 415 | it('lessThan(sMedObject, sMedObject) = false', () => { 416 | deepEqual(Specificity.lessThan(sMedObject, sMedObject), false); 417 | }); 418 | }); 419 | 420 | describe('equals (using plain Objects)', () => { 421 | it('equals(sHigh, sLow) = false', () => { 422 | deepEqual(Specificity.equals(sHigh, sLow), false); 423 | }); 424 | it('equals(sLow, sHigh) = false', () => { 425 | deepEqual(Specificity.equals(sLow, sHigh), false); 426 | }); 427 | it('equals(sMed, sMed) = true', () => { 428 | deepEqual(Specificity.equals(sMed, sMed), true); 429 | }); 430 | }); 431 | 432 | describe('equals (using Specificity Instances)', () => { 433 | it('equals(sHighObject, sLowObject) = false', () => { 434 | deepEqual(Specificity.equals(sHighObject, sLowObject), false); 435 | }); 436 | it('equals(sLowObject, sHighObject) = false', () => { 437 | deepEqual(Specificity.equals(sLowObject, sHighObject), false); 438 | }); 439 | it('equals(sMedObject, sMedObject) = true', () => { 440 | deepEqual(Specificity.equals(sMedObject, sMedObject), true); 441 | }); 442 | }); 443 | }); 444 | 445 | describe('SORT', () => { 446 | const sHigh = { a: 1, b: 0, c: 0 }; 447 | const sMed = { a: 0, b: 1, c: 0 }; 448 | const sLow = { a: 0, b: 0, c: 1 }; 449 | 450 | const notSorted = [sMed, sHigh, sLow]; 451 | const sortedHighToLow = [sHigh, sMed, sLow]; 452 | const sortedLowToHigh = [sLow, sMed, sHigh]; 453 | 454 | const notSortedObjects = Specificity.calculate('.bar, #foo, baz'); 455 | 456 | describe('sortAsc (using plain Objects)', () => { 457 | it('sortAsc(notSorted)', () => { 458 | deepEqual(Specificity.sortAsc(...notSorted), sortedLowToHigh); 459 | }); 460 | }); 461 | 462 | describe('sortAsc (using Specificity Instances)', () => { 463 | it('sortAsc(notSortedObjects)', () => { 464 | deepEqual( 465 | Specificity.sortAsc(...notSortedObjects).map((s) => s.value), 466 | sortedLowToHigh, 467 | ); 468 | }); 469 | }); 470 | 471 | describe('sortDesc (using plain Objects)', () => { 472 | it('sortDesc(notSorted)', () => { 473 | deepEqual(Specificity.sortDesc(...notSorted), sortedHighToLow); 474 | }); 475 | }); 476 | 477 | describe('sortDesc (using Specificity Instances)', () => { 478 | it('sortDesc(notSortedObjects)', () => { 479 | deepEqual( 480 | Specificity.sortDesc(...notSortedObjects).map((s) => s.value), 481 | sortedHighToLow, 482 | ); 483 | }); 484 | }); 485 | }); 486 | 487 | describe('FILTER', () => { 488 | const sHigh = { a: 1, b: 0, c: 0 }; 489 | const sMed = { a: 0, b: 1, c: 0 }; 490 | const sLow = { a: 0, b: 0, c: 1 }; 491 | 492 | const notSorted = [sMed, sHigh, sLow]; 493 | 494 | const notSortedObjects = Specificity.calculate('.bar, #foo, baz'); 495 | 496 | describe('max (using plain Objects)', () => { 497 | it('max(notSorted)', () => { 498 | deepEqual(Specificity.max(...notSorted), sHigh); 499 | }); 500 | }); 501 | 502 | describe('max (using Specificity Instances)', () => { 503 | it('max(notSortedObjects)', () => { 504 | deepEqual(Specificity.max(...notSortedObjects).value, sHigh); 505 | }); 506 | }); 507 | 508 | describe('min (using plain Objects)', () => { 509 | it('min(notSorted)', () => { 510 | deepEqual(Specificity.min(...notSorted), sLow); 511 | }); 512 | }); 513 | 514 | describe('min (using Specificity Instances)', () => { 515 | it('min(notSortedObjects)', () => { 516 | deepEqual(Specificity.min(...notSortedObjects).value, sLow); 517 | }); 518 | }); 519 | }); 520 | -------------------------------------------------------------------------------- /test/standalone.js: -------------------------------------------------------------------------------- 1 | import { deepEqual } from 'assert'; 2 | 3 | import packageinfo from './../package.json' with { type: 'json' }; 4 | 5 | describe('STANDALONE EXPORTS', async () => { 6 | const expected = { 7 | './core': ['calculate', 'calculateForAST'], 8 | './util': ['compare', 'equals', 'greaterThan', 'lessThan', 'max', 'min', 'sortAsc', 'sortDesc'], 9 | './compare': ['compare', 'equals', 'greaterThan', 'lessThan'], 10 | './filter': ['max', 'min'], 11 | './sort': ['sortAsc', 'sortDesc'], 12 | }; 13 | 14 | // Build list of exported subpaths 15 | const exported = {}; 16 | for (const [subpath_key, subpath_contents] of Object.entries(packageinfo.exports)) { 17 | if (subpath_key != '.' && subpath_contents['import']) { 18 | const imported = await import(`./../${subpath_contents['import']}`); 19 | exported[subpath_key] = Object.keys(imported); 20 | } 21 | } 22 | 23 | describe('The subpath exports export the correct set of functions', () => { 24 | for (const [key, functions] of Object.entries(expected)) { 25 | it(`${key} exports ${functions.length} functions (${exported[key]})`, () => { 26 | deepEqual(exported[key], functions); 27 | }); 28 | } 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /test/types.js: -------------------------------------------------------------------------------- 1 | import { deepEqual, throws } from 'assert'; 2 | import Specificity from '../dist/index.js'; 3 | 4 | describe('Specificity Class, manual instance', () => { 5 | const s = new Specificity({ a: 1, b: 2, c: 3 }, '#foo.bar.baz a b c'); 6 | 7 | describe('Instance Getters', () => { 8 | it('Specificity.value', () => { 9 | deepEqual(s.value, { a: 1, b: 2, c: 3 }); 10 | }); 11 | it('Specificity.a', () => { 12 | deepEqual(s.a, 1); 13 | }); 14 | it('Specificity.b', () => { 15 | deepEqual(s.b, 2); 16 | }); 17 | it('Specificity.c', () => { 18 | deepEqual(s.c, 3); 19 | }); 20 | }); 21 | describe('Instance Setters', () => { 22 | it('Specificity.a', () => { 23 | throws( 24 | () => { 25 | s.a = 1; 26 | }, 27 | { 28 | message: 'Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()', 29 | }, 30 | ); 31 | }); 32 | it('Specificity.b', () => { 33 | throws( 34 | () => { 35 | s.b = 1; 36 | }, 37 | { 38 | message: 'Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()', 39 | }, 40 | ); 41 | }); 42 | it('Specificity.c', () => { 43 | throws( 44 | () => { 45 | s.c = 1; 46 | }, 47 | { 48 | message: 'Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()', 49 | }, 50 | ); 51 | }); 52 | }); 53 | describe('Value Formatting', () => { 54 | it('Specificity.toString()', () => { 55 | deepEqual(s.toString(), '(1,2,3)'); 56 | }); 57 | it('Specificity.toArray()', () => { 58 | deepEqual(s.toArray(), [1, 2, 3]); 59 | }); 60 | it('Specificity.toObject()', () => { 61 | deepEqual(s.toObject(), { a: 1, b: 2, c: 3 }); 62 | }); 63 | it('Specificity.selectorString()', () => { 64 | deepEqual(s.selectorString(), '#foo.bar.baz a b c'); 65 | }); 66 | it('JSON.stringify(Specificity)', () => { 67 | deepEqual(JSON.parse(JSON.stringify(s)), { 68 | selector: '#foo.bar.baz a b c', 69 | asObject: { a: 1, b: 2, c: 3 }, 70 | asArray: [1, 2, 3], 71 | asString: '(1,2,3)', 72 | }); 73 | }); 74 | }); 75 | }); 76 | 77 | describe('Specificity Class, manual instance, no given selector', () => { 78 | const s = new Specificity({ a: 1, b: 2, c: 3 }); 79 | 80 | describe('Instance Getters', () => { 81 | it('Specificity.value', () => { 82 | deepEqual(s.value, { a: 1, b: 2, c: 3 }); 83 | }); 84 | it('Specificity.a', () => { 85 | deepEqual(s.a, 1); 86 | }); 87 | it('Specificity.b', () => { 88 | deepEqual(s.b, 2); 89 | }); 90 | it('Specificity.c', () => { 91 | deepEqual(s.c, 3); 92 | }); 93 | }); 94 | describe('Instance Setters', () => { 95 | it('Specificity.a', () => { 96 | throws( 97 | () => { 98 | s.a = 1; 99 | }, 100 | { 101 | message: 'Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()', 102 | }, 103 | ); 104 | }); 105 | it('Specificity.b', () => { 106 | throws( 107 | () => { 108 | s.b = 1; 109 | }, 110 | { 111 | message: 'Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()', 112 | }, 113 | ); 114 | }); 115 | it('Specificity.c', () => { 116 | throws( 117 | () => { 118 | s.c = 1; 119 | }, 120 | { 121 | message: 'Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()', 122 | }, 123 | ); 124 | }); 125 | }); 126 | describe('Value Formatting', () => { 127 | it('Specificity.toString()', () => { 128 | deepEqual(s.toString(), '(1,2,3)'); 129 | }); 130 | it('Specificity.toArray()', () => { 131 | deepEqual(s.toArray(), [1, 2, 3]); 132 | }); 133 | it('Specificity.toObject()', () => { 134 | deepEqual(s.toObject(), { a: 1, b: 2, c: 3 }); 135 | }); 136 | it('Specificity.selectorString()', () => { 137 | deepEqual(s.selectorString(), ''); 138 | }); 139 | it('JSON.stringify(Specificity)', () => { 140 | deepEqual(JSON.parse(JSON.stringify(s)), { 141 | selector: '', 142 | asObject: { a: 1, b: 2, c: 3 }, 143 | asArray: [1, 2, 3], 144 | asString: '(1,2,3)', 145 | }); 146 | }); 147 | }); 148 | }); 149 | 150 | describe('Specificity Class', () => { 151 | const s = Specificity.calculate('#foo.bar.baz a b c')[0]; 152 | 153 | describe('Instance Getters', () => { 154 | it('Specificity.value', () => { 155 | deepEqual(s.value, { a: 1, b: 2, c: 3 }); 156 | }); 157 | it('Specificity.a', () => { 158 | deepEqual(s.a, 1); 159 | }); 160 | it('Specificity.b', () => { 161 | deepEqual(s.b, 2); 162 | }); 163 | it('Specificity.c', () => { 164 | deepEqual(s.c, 3); 165 | }); 166 | }); 167 | describe('Instance Setters', () => { 168 | it('Specificity.a', () => { 169 | throws( 170 | () => { 171 | s.a = 1; 172 | }, 173 | { 174 | message: 'Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()', 175 | }, 176 | ); 177 | }); 178 | it('Specificity.b', () => { 179 | throws( 180 | () => { 181 | s.b = 1; 182 | }, 183 | { 184 | message: 'Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()', 185 | }, 186 | ); 187 | }); 188 | it('Specificity.c', () => { 189 | throws( 190 | () => { 191 | s.c = 1; 192 | }, 193 | { 194 | message: 'Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()', 195 | }, 196 | ); 197 | }); 198 | }); 199 | describe('Value Formatting', () => { 200 | it('Specificity.toString()', () => { 201 | deepEqual(s.toString(), '(1,2,3)'); 202 | }); 203 | it('Specificity.toArray()', () => { 204 | deepEqual(s.toArray(), [1, 2, 3]); 205 | }); 206 | it('Specificity.toObject()', () => { 207 | deepEqual(s.toObject(), { a: 1, b: 2, c: 3 }); 208 | }); 209 | it('Specificity.selectorString()', () => { 210 | deepEqual(s.selectorString(), '#foo.bar.baz a b c'); 211 | }); 212 | it('JSON.stringify(Specificity)', () => { 213 | deepEqual(JSON.parse(JSON.stringify(s)), { 214 | selector: '#foo.bar.baz a b c', 215 | asObject: { a: 1, b: 2, c: 3 }, 216 | asArray: [1, 2, 3], 217 | asString: '(1,2,3)', 218 | }); 219 | }); 220 | }); 221 | describe('Instance Comparison Methods', () => { 222 | const sHigh = Specificity.calculate('#foo#bar.baz a b c')[0]; 223 | const sLow = Specificity.calculate('#foo.baz a b c')[0]; 224 | 225 | it('Specificity.isGreaterThan()', () => { 226 | deepEqual(s.isGreaterThan(s), false); 227 | deepEqual(s.isGreaterThan(sHigh), false); 228 | deepEqual(s.isGreaterThan(sLow), true); 229 | }); 230 | it('Specificity.isLessThan()', () => { 231 | deepEqual(s.isLessThan(s), false); 232 | deepEqual(s.isLessThan(sHigh), true); 233 | deepEqual(s.isLessThan(sLow), false); 234 | }); 235 | it('Specificity.isEqualTo()', () => { 236 | deepEqual(s.isEqualTo(s), true); 237 | deepEqual(s.isEqualTo(sHigh), false); 238 | deepEqual(s.isEqualTo(sLow), false); 239 | }); 240 | }); 241 | 242 | describe('Static Instance Methods', () => { 243 | const sHigh = Specificity.calculate('#foo#bar.baz a b c')[0]; 244 | const sLow = Specificity.calculate('#foo.baz a b c')[0]; 245 | 246 | it('Specificity.min', () => { 247 | deepEqual(Specificity.min(sHigh, sLow), sLow); 248 | }); 249 | it('Specificity.max', () => { 250 | deepEqual(Specificity.max(sHigh, sLow), sHigh); 251 | }); 252 | }); 253 | }); 254 | --------------------------------------------------------------------------------