├── .eslintrc.json
├── .git-hooks
└── pre-commit
├── .gitignore
├── .prettierrc.json
├── LICENSE
├── README.md
├── package-lock.json
├── package.json
├── src
├── ast-apply.js
├── ast-get.js
├── constants.js
├── index.js
└── query.js
└── test
├── _util.js
├── ast-get.test.js
└── index.test.js
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "commonjs": true,
5 | "es6": true,
6 | "node": true
7 | },
8 | "parserOptions": {
9 | "ecmaVersion": 2018,
10 | "sourceType": "module"
11 | },
12 | "rules": {
13 | "no-const-assign": 1,
14 | "no-this-before-super": 1,
15 | "no-undef": 2,
16 | "no-unreachable": 0,
17 | "no-unused-vars": [1, { "args": "after-used", "ignoreRestSiblings": true }],
18 | "no-unused-expressions": 0,
19 | "constructor-super": 1,
20 | "valid-typeof": 1
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/.git-hooks/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | npx pretty-quick --staged
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
105 |
106 | build/
107 |
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "useTabs": true,
3 | "singleQuote": true,
4 | "trailingComma": "none",
5 | "arrowParens": "avoid"
6 | }
7 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Dan Burzo
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # qsx
2 |
3 | Extended CSS selectors for querying the DOM and extracting parts of it. Used by the [`hred` command-line tool](https://github.com/danburzo/hred).
4 |
5 | ## Installation
6 |
7 | The library is currently packaged in CJS (CommonJS) format, for Node.js.
8 |
9 | ```bash
10 | npm install qsx
11 | ```
12 |
13 | ## Usage
14 |
15 | ```js
16 | let qsx = require('qsx');
17 | qsx(el, ':scope > a');
18 | ```
19 |
20 | In Node.js, which lacks a built-in DOM environment, you can use [`jsdom`](https://github.com/jsdom/jsdom).
21 |
22 | ## The query language
23 |
24 | If you're familiar with CSS selectors and [`Element.querySelectorAll`](https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll), you are mostly good to go. `qsx` introduces only a few differences and extensions, listed below.
25 |
26 | ### Commas select parralel data
27 |
28 | The CSS selector `h2, h3` matches all elements that are either an `h2` or an `h3`. In `qsx`, however, it selects all `h2` elements, and all `h3` elements, in separate arrays.
29 |
30 | ```html
31 |
Installation
32 | With npm
33 | With yarn
34 | Usage
35 | From the command-line
36 |
37 |
49 | ```
50 |
51 | > Note: The [`:is()` pseudo-class](https://developer.mozilla.org/en-US/docs/Web/CSS/:is) would have provided a mechanism to restore the CSS semantics to the comma. `qsx(el, ':is(h2, h3)')` could have been used to mean `h2, h3`. Unfortunately, at the moment it's unevenly implemented across browsers [and in `jsdom`](https://github.com/jsdom/jsdom/issues/3013).
52 |
53 | ### Curly brackets introduce sub-scopes
54 |
55 | Whenever you use a pair of curly brackets `{...}`, you create a sub-scope.
56 |
57 | Here's a query to pick the first and last columns off each row in the table below:
58 |
59 | ```html
60 |
61 |
62 |
63 | 1.1 |
64 | 1.2 |
65 | 1.3 |
66 | 1.4 |
67 |
68 |
69 | 2.1 |
70 | 2.2 |
71 | 2.3 |
72 | 2.4 |
73 |
74 |
75 |
76 |
77 |
85 | ```
86 |
87 | Here's the equivalent query in vanilla `querySelectorAll` and JavaScript:
88 |
89 | ```js
90 | const arr = Array.from;
91 | arr(document.querySelectorAll('tr')).map(tr => [
92 | arr(tr.querySelectorAll(':scope > td:firstChild')).map(td => td.outerHTML),
93 | arr(tr.querySelectorAll(':scope > td:firstChild')).map(td => td.outerHTML)
94 | ]);
95 | ```
96 |
97 | ### Extracting HTML attributes and DOM properties
98 |
99 | By default, for each leaf element in the query, `qsx()` returns its `.outerHTML`. Instead, we can extract specific attributes and properties:
100 |
101 | - `@attr` (the attribute accessor) extracts the `attr` HTML attribute via `el.getAttribute('attr')`;
102 | - `@.prop` (the property accessor) reads the `prop` DOM property via `el.prop`;
103 | - `@*` (the attribute wildcard) extracts all the HTML attributes into an object via `el.attributes`.
104 |
105 | This query extracts the `href` and label off each anchor element:
106 |
107 | ```html
108 |
112 |
113 |
121 | ```
122 |
123 | Notice that, to prevent collisions between attribute and property names, the latter are always prefixed with `.` in the resulting JSON, similar to how they were defined in the query.
124 |
125 | Attributes, properties and scoped selectors can be combined at will. When present among other attributes / properties, scoped selectors are added under the `.scoped` key:
126 |
127 | ```js
128 | qsx(document, `li { a, @title }`);
129 | // =>
130 | [
131 | {
132 | title: 'item 1',
133 | '.scoped': ['First link']
134 | },
135 | {
136 | title: 'item 2',
137 | '.scoped': ['Second link']
138 | }
139 | ];
140 | ```
141 |
142 | ### `:scope` and combining selectors
143 |
144 | In stock `Element.querySelectorAll`, the `:scope` selector cannot be combined with the _next-sibling selector_ (`:scope + el`), nor the _subsequent-sibling selector_ (`:scope ~ el`).
145 |
146 | `qsx` does not impose this limitation, so you can group attributes from things like definition lists:
147 |
148 | ```html
149 |
150 | - First term
151 | - First definition
152 |
153 | - Second term
154 | - Second definition
155 |
156 |
186 | ```
187 |
188 | ### Alias selectors with `=>`
189 |
190 | Keys in the resulting JSON can be aliased to any other name, using `=> alias`.
191 |
192 | Alias HTML attributes and DOM properties:
193 |
194 | ```js
195 | qsx(el, 'a { @href => url, @.textContent => text }');
196 | ```
197 |
198 | Alias individual scoped selectors:
199 |
200 | ```js
201 | qsx(el, 'tr { td:first-child => first, td:last-child => last }');
202 | ```
203 |
204 | Alias whole `.scoped` object:
205 |
206 | ```js
207 | qsx(el, 'tr { @title, td:first-child, td:last-child } => cells');
208 | ```
209 |
210 | #### Spread operator
211 |
212 | The special alias `.` will cause the object to be merged into the current context:
213 |
214 | ```js
215 | qsx(el, 'tr { td:first-child, td:last-child } => .');
216 | ```
217 |
218 | Alternatively, you can use the `...` (spread) operator for the same purpose:
219 |
220 | ```js
221 | qsx(el, 'tr ...{ td:first-child, td:last-child }');
222 | ```
223 |
224 | ### Pick first result with `^`
225 |
226 | For more complex queries where there resulting JSON contains several nested arrays, but for which you want to select a single element, you can prefix a selector with `^` to select just the first matching element — like `querySelector()` rather than `querySelectorAll()`.
227 |
228 | ```js
229 | qsx(document, `li { ^ a, @title }`);
230 |
231 | // =>
232 | [
233 | {
234 | title: 'item 1',
235 | '.scoped': 'First link'
236 | },
237 | {
238 | title: 'item 2',
239 | '.scoped': 'Second link'
240 | }
241 | ];
242 | ```
243 |
244 | Some other situations will trigger first-result behavior even in the absence of the `^` prefix:
245 |
246 | - When requesting a direct attribute in a sub-scope: `a { @href }`
247 | - When using the `.` alias (as in `a { @href, @.textContent } => .`) or the spread `...` operator
248 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "qsx",
3 | "version": "3.3.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "qsx",
9 | "version": "3.3.0",
10 | "license": "MIT",
11 | "dependencies": {
12 | "symbol-tree": "^3.2.4"
13 | },
14 | "devDependencies": {
15 | "eslint": "^8.57.0",
16 | "jsdom": "^24.0.0",
17 | "prettier": "3.2.5",
18 | "pretty-quick": "^4.0.0"
19 | }
20 | },
21 | "node_modules/@aashutoshrathi/word-wrap": {
22 | "version": "1.2.6",
23 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
24 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
25 | "dev": true,
26 | "engines": {
27 | "node": ">=0.10.0"
28 | }
29 | },
30 | "node_modules/@eslint-community/eslint-utils": {
31 | "version": "4.4.0",
32 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
33 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
34 | "dev": true,
35 | "dependencies": {
36 | "eslint-visitor-keys": "^3.3.0"
37 | },
38 | "engines": {
39 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
40 | },
41 | "peerDependencies": {
42 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
43 | }
44 | },
45 | "node_modules/@eslint-community/regexpp": {
46 | "version": "4.10.0",
47 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
48 | "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
49 | "dev": true,
50 | "engines": {
51 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
52 | }
53 | },
54 | "node_modules/@eslint/eslintrc": {
55 | "version": "2.1.4",
56 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
57 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
58 | "dev": true,
59 | "dependencies": {
60 | "ajv": "^6.12.4",
61 | "debug": "^4.3.2",
62 | "espree": "^9.6.0",
63 | "globals": "^13.19.0",
64 | "ignore": "^5.2.0",
65 | "import-fresh": "^3.2.1",
66 | "js-yaml": "^4.1.0",
67 | "minimatch": "^3.1.2",
68 | "strip-json-comments": "^3.1.1"
69 | },
70 | "engines": {
71 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
72 | },
73 | "funding": {
74 | "url": "https://opencollective.com/eslint"
75 | }
76 | },
77 | "node_modules/@eslint/js": {
78 | "version": "8.57.0",
79 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
80 | "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
81 | "dev": true,
82 | "engines": {
83 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
84 | }
85 | },
86 | "node_modules/@humanwhocodes/config-array": {
87 | "version": "0.11.14",
88 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
89 | "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
90 | "dev": true,
91 | "dependencies": {
92 | "@humanwhocodes/object-schema": "^2.0.2",
93 | "debug": "^4.3.1",
94 | "minimatch": "^3.0.5"
95 | },
96 | "engines": {
97 | "node": ">=10.10.0"
98 | }
99 | },
100 | "node_modules/@humanwhocodes/module-importer": {
101 | "version": "1.0.1",
102 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
103 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
104 | "dev": true,
105 | "engines": {
106 | "node": ">=12.22"
107 | },
108 | "funding": {
109 | "type": "github",
110 | "url": "https://github.com/sponsors/nzakas"
111 | }
112 | },
113 | "node_modules/@humanwhocodes/object-schema": {
114 | "version": "2.0.3",
115 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
116 | "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
117 | "dev": true
118 | },
119 | "node_modules/@nodelib/fs.scandir": {
120 | "version": "2.1.5",
121 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
122 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
123 | "dev": true,
124 | "dependencies": {
125 | "@nodelib/fs.stat": "2.0.5",
126 | "run-parallel": "^1.1.9"
127 | },
128 | "engines": {
129 | "node": ">= 8"
130 | }
131 | },
132 | "node_modules/@nodelib/fs.stat": {
133 | "version": "2.0.5",
134 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
135 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
136 | "dev": true,
137 | "engines": {
138 | "node": ">= 8"
139 | }
140 | },
141 | "node_modules/@nodelib/fs.walk": {
142 | "version": "1.2.8",
143 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
144 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
145 | "dev": true,
146 | "dependencies": {
147 | "@nodelib/fs.scandir": "2.1.5",
148 | "fastq": "^1.6.0"
149 | },
150 | "engines": {
151 | "node": ">= 8"
152 | }
153 | },
154 | "node_modules/@ungap/structured-clone": {
155 | "version": "1.2.0",
156 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
157 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
158 | "dev": true
159 | },
160 | "node_modules/acorn": {
161 | "version": "8.11.3",
162 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
163 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
164 | "dev": true,
165 | "bin": {
166 | "acorn": "bin/acorn"
167 | },
168 | "engines": {
169 | "node": ">=0.4.0"
170 | }
171 | },
172 | "node_modules/acorn-jsx": {
173 | "version": "5.3.2",
174 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
175 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
176 | "dev": true,
177 | "peerDependencies": {
178 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
179 | }
180 | },
181 | "node_modules/agent-base": {
182 | "version": "7.1.1",
183 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
184 | "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
185 | "dev": true,
186 | "dependencies": {
187 | "debug": "^4.3.4"
188 | },
189 | "engines": {
190 | "node": ">= 14"
191 | }
192 | },
193 | "node_modules/ajv": {
194 | "version": "6.12.6",
195 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
196 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
197 | "dev": true,
198 | "dependencies": {
199 | "fast-deep-equal": "^3.1.1",
200 | "fast-json-stable-stringify": "^2.0.0",
201 | "json-schema-traverse": "^0.4.1",
202 | "uri-js": "^4.2.2"
203 | },
204 | "funding": {
205 | "type": "github",
206 | "url": "https://github.com/sponsors/epoberezkin"
207 | }
208 | },
209 | "node_modules/ansi-regex": {
210 | "version": "5.0.1",
211 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
212 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
213 | "dev": true,
214 | "engines": {
215 | "node": ">=8"
216 | }
217 | },
218 | "node_modules/argparse": {
219 | "version": "2.0.1",
220 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
221 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
222 | "dev": true
223 | },
224 | "node_modules/asynckit": {
225 | "version": "0.4.0",
226 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
227 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
228 | "dev": true
229 | },
230 | "node_modules/balanced-match": {
231 | "version": "1.0.2",
232 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
233 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
234 | "dev": true
235 | },
236 | "node_modules/brace-expansion": {
237 | "version": "1.1.11",
238 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
239 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
240 | "dev": true,
241 | "dependencies": {
242 | "balanced-match": "^1.0.0",
243 | "concat-map": "0.0.1"
244 | }
245 | },
246 | "node_modules/callsites": {
247 | "version": "3.1.0",
248 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
249 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
250 | "dev": true,
251 | "engines": {
252 | "node": ">=6"
253 | }
254 | },
255 | "node_modules/combined-stream": {
256 | "version": "1.0.8",
257 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
258 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
259 | "dev": true,
260 | "dependencies": {
261 | "delayed-stream": "~1.0.0"
262 | },
263 | "engines": {
264 | "node": ">= 0.8"
265 | }
266 | },
267 | "node_modules/concat-map": {
268 | "version": "0.0.1",
269 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
270 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
271 | "dev": true
272 | },
273 | "node_modules/cross-spawn": {
274 | "version": "7.0.3",
275 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
276 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
277 | "dev": true,
278 | "dependencies": {
279 | "path-key": "^3.1.0",
280 | "shebang-command": "^2.0.0",
281 | "which": "^2.0.1"
282 | },
283 | "engines": {
284 | "node": ">= 8"
285 | }
286 | },
287 | "node_modules/cssstyle": {
288 | "version": "4.0.1",
289 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz",
290 | "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==",
291 | "dev": true,
292 | "dependencies": {
293 | "rrweb-cssom": "^0.6.0"
294 | },
295 | "engines": {
296 | "node": ">=18"
297 | }
298 | },
299 | "node_modules/data-urls": {
300 | "version": "5.0.0",
301 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
302 | "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
303 | "dev": true,
304 | "dependencies": {
305 | "whatwg-mimetype": "^4.0.0",
306 | "whatwg-url": "^14.0.0"
307 | },
308 | "engines": {
309 | "node": ">=18"
310 | }
311 | },
312 | "node_modules/debug": {
313 | "version": "4.3.4",
314 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
315 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
316 | "dev": true,
317 | "dependencies": {
318 | "ms": "2.1.2"
319 | },
320 | "engines": {
321 | "node": ">=6.0"
322 | },
323 | "peerDependenciesMeta": {
324 | "supports-color": {
325 | "optional": true
326 | }
327 | }
328 | },
329 | "node_modules/decimal.js": {
330 | "version": "10.4.3",
331 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
332 | "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
333 | "dev": true
334 | },
335 | "node_modules/deep-is": {
336 | "version": "0.1.4",
337 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
338 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
339 | "dev": true
340 | },
341 | "node_modules/delayed-stream": {
342 | "version": "1.0.0",
343 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
344 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
345 | "dev": true,
346 | "engines": {
347 | "node": ">=0.4.0"
348 | }
349 | },
350 | "node_modules/doctrine": {
351 | "version": "3.0.0",
352 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
353 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
354 | "dev": true,
355 | "dependencies": {
356 | "esutils": "^2.0.2"
357 | },
358 | "engines": {
359 | "node": ">=6.0.0"
360 | }
361 | },
362 | "node_modules/entities": {
363 | "version": "4.5.0",
364 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
365 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
366 | "dev": true,
367 | "engines": {
368 | "node": ">=0.12"
369 | },
370 | "funding": {
371 | "url": "https://github.com/fb55/entities?sponsor=1"
372 | }
373 | },
374 | "node_modules/escape-string-regexp": {
375 | "version": "4.0.0",
376 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
377 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
378 | "dev": true,
379 | "engines": {
380 | "node": ">=10"
381 | },
382 | "funding": {
383 | "url": "https://github.com/sponsors/sindresorhus"
384 | }
385 | },
386 | "node_modules/eslint": {
387 | "version": "8.57.0",
388 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
389 | "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
390 | "dev": true,
391 | "dependencies": {
392 | "@eslint-community/eslint-utils": "^4.2.0",
393 | "@eslint-community/regexpp": "^4.6.1",
394 | "@eslint/eslintrc": "^2.1.4",
395 | "@eslint/js": "8.57.0",
396 | "@humanwhocodes/config-array": "^0.11.14",
397 | "@humanwhocodes/module-importer": "^1.0.1",
398 | "@nodelib/fs.walk": "^1.2.8",
399 | "@ungap/structured-clone": "^1.2.0",
400 | "ajv": "^6.12.4",
401 | "chalk": "^4.0.0",
402 | "cross-spawn": "^7.0.2",
403 | "debug": "^4.3.2",
404 | "doctrine": "^3.0.0",
405 | "escape-string-regexp": "^4.0.0",
406 | "eslint-scope": "^7.2.2",
407 | "eslint-visitor-keys": "^3.4.3",
408 | "espree": "^9.6.1",
409 | "esquery": "^1.4.2",
410 | "esutils": "^2.0.2",
411 | "fast-deep-equal": "^3.1.3",
412 | "file-entry-cache": "^6.0.1",
413 | "find-up": "^5.0.0",
414 | "glob-parent": "^6.0.2",
415 | "globals": "^13.19.0",
416 | "graphemer": "^1.4.0",
417 | "ignore": "^5.2.0",
418 | "imurmurhash": "^0.1.4",
419 | "is-glob": "^4.0.0",
420 | "is-path-inside": "^3.0.3",
421 | "js-yaml": "^4.1.0",
422 | "json-stable-stringify-without-jsonify": "^1.0.1",
423 | "levn": "^0.4.1",
424 | "lodash.merge": "^4.6.2",
425 | "minimatch": "^3.1.2",
426 | "natural-compare": "^1.4.0",
427 | "optionator": "^0.9.3",
428 | "strip-ansi": "^6.0.1",
429 | "text-table": "^0.2.0"
430 | },
431 | "bin": {
432 | "eslint": "bin/eslint.js"
433 | },
434 | "engines": {
435 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
436 | },
437 | "funding": {
438 | "url": "https://opencollective.com/eslint"
439 | }
440 | },
441 | "node_modules/eslint-scope": {
442 | "version": "7.2.2",
443 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
444 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
445 | "dev": true,
446 | "dependencies": {
447 | "esrecurse": "^4.3.0",
448 | "estraverse": "^5.2.0"
449 | },
450 | "engines": {
451 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
452 | },
453 | "funding": {
454 | "url": "https://opencollective.com/eslint"
455 | }
456 | },
457 | "node_modules/eslint-visitor-keys": {
458 | "version": "3.4.3",
459 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
460 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
461 | "dev": true,
462 | "engines": {
463 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
464 | },
465 | "funding": {
466 | "url": "https://opencollective.com/eslint"
467 | }
468 | },
469 | "node_modules/eslint/node_modules/ansi-styles": {
470 | "version": "4.3.0",
471 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
472 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
473 | "dev": true,
474 | "dependencies": {
475 | "color-convert": "^2.0.1"
476 | },
477 | "engines": {
478 | "node": ">=8"
479 | },
480 | "funding": {
481 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
482 | }
483 | },
484 | "node_modules/eslint/node_modules/chalk": {
485 | "version": "4.1.0",
486 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
487 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
488 | "dev": true,
489 | "dependencies": {
490 | "ansi-styles": "^4.1.0",
491 | "supports-color": "^7.1.0"
492 | },
493 | "engines": {
494 | "node": ">=10"
495 | },
496 | "funding": {
497 | "url": "https://github.com/chalk/chalk?sponsor=1"
498 | }
499 | },
500 | "node_modules/eslint/node_modules/color-convert": {
501 | "version": "2.0.1",
502 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
503 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
504 | "dev": true,
505 | "dependencies": {
506 | "color-name": "~1.1.4"
507 | },
508 | "engines": {
509 | "node": ">=7.0.0"
510 | }
511 | },
512 | "node_modules/eslint/node_modules/color-name": {
513 | "version": "1.1.4",
514 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
515 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
516 | "dev": true
517 | },
518 | "node_modules/eslint/node_modules/has-flag": {
519 | "version": "4.0.0",
520 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
521 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
522 | "dev": true,
523 | "engines": {
524 | "node": ">=8"
525 | }
526 | },
527 | "node_modules/eslint/node_modules/supports-color": {
528 | "version": "7.2.0",
529 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
530 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
531 | "dev": true,
532 | "dependencies": {
533 | "has-flag": "^4.0.0"
534 | },
535 | "engines": {
536 | "node": ">=8"
537 | }
538 | },
539 | "node_modules/espree": {
540 | "version": "9.6.1",
541 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
542 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
543 | "dev": true,
544 | "dependencies": {
545 | "acorn": "^8.9.0",
546 | "acorn-jsx": "^5.3.2",
547 | "eslint-visitor-keys": "^3.4.1"
548 | },
549 | "engines": {
550 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
551 | },
552 | "funding": {
553 | "url": "https://opencollective.com/eslint"
554 | }
555 | },
556 | "node_modules/esquery": {
557 | "version": "1.5.0",
558 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
559 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
560 | "dev": true,
561 | "dependencies": {
562 | "estraverse": "^5.1.0"
563 | },
564 | "engines": {
565 | "node": ">=0.10"
566 | }
567 | },
568 | "node_modules/esrecurse": {
569 | "version": "4.3.0",
570 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
571 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
572 | "dev": true,
573 | "dependencies": {
574 | "estraverse": "^5.2.0"
575 | },
576 | "engines": {
577 | "node": ">=4.0"
578 | }
579 | },
580 | "node_modules/estraverse": {
581 | "version": "5.3.0",
582 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
583 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
584 | "dev": true,
585 | "engines": {
586 | "node": ">=4.0"
587 | }
588 | },
589 | "node_modules/esutils": {
590 | "version": "2.0.3",
591 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
592 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
593 | "dev": true,
594 | "engines": {
595 | "node": ">=0.10.0"
596 | }
597 | },
598 | "node_modules/execa": {
599 | "version": "5.1.1",
600 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
601 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
602 | "dev": true,
603 | "dependencies": {
604 | "cross-spawn": "^7.0.3",
605 | "get-stream": "^6.0.0",
606 | "human-signals": "^2.1.0",
607 | "is-stream": "^2.0.0",
608 | "merge-stream": "^2.0.0",
609 | "npm-run-path": "^4.0.1",
610 | "onetime": "^5.1.2",
611 | "signal-exit": "^3.0.3",
612 | "strip-final-newline": "^2.0.0"
613 | },
614 | "engines": {
615 | "node": ">=10"
616 | },
617 | "funding": {
618 | "url": "https://github.com/sindresorhus/execa?sponsor=1"
619 | }
620 | },
621 | "node_modules/fast-deep-equal": {
622 | "version": "3.1.3",
623 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
624 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
625 | "dev": true
626 | },
627 | "node_modules/fast-json-stable-stringify": {
628 | "version": "2.1.0",
629 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
630 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
631 | "dev": true
632 | },
633 | "node_modules/fast-levenshtein": {
634 | "version": "2.0.6",
635 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
636 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
637 | "dev": true
638 | },
639 | "node_modules/fastq": {
640 | "version": "1.17.1",
641 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
642 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
643 | "dev": true,
644 | "dependencies": {
645 | "reusify": "^1.0.4"
646 | }
647 | },
648 | "node_modules/file-entry-cache": {
649 | "version": "6.0.1",
650 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
651 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
652 | "dev": true,
653 | "dependencies": {
654 | "flat-cache": "^3.0.4"
655 | },
656 | "engines": {
657 | "node": "^10.12.0 || >=12.0.0"
658 | }
659 | },
660 | "node_modules/find-up": {
661 | "version": "5.0.0",
662 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
663 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
664 | "dev": true,
665 | "dependencies": {
666 | "locate-path": "^6.0.0",
667 | "path-exists": "^4.0.0"
668 | },
669 | "engines": {
670 | "node": ">=10"
671 | },
672 | "funding": {
673 | "url": "https://github.com/sponsors/sindresorhus"
674 | }
675 | },
676 | "node_modules/flat-cache": {
677 | "version": "3.2.0",
678 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
679 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
680 | "dev": true,
681 | "dependencies": {
682 | "flatted": "^3.2.9",
683 | "keyv": "^4.5.3",
684 | "rimraf": "^3.0.2"
685 | },
686 | "engines": {
687 | "node": "^10.12.0 || >=12.0.0"
688 | }
689 | },
690 | "node_modules/flatted": {
691 | "version": "3.3.1",
692 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
693 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
694 | "dev": true
695 | },
696 | "node_modules/form-data": {
697 | "version": "4.0.0",
698 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
699 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
700 | "dev": true,
701 | "dependencies": {
702 | "asynckit": "^0.4.0",
703 | "combined-stream": "^1.0.8",
704 | "mime-types": "^2.1.12"
705 | },
706 | "engines": {
707 | "node": ">= 6"
708 | }
709 | },
710 | "node_modules/fs.realpath": {
711 | "version": "1.0.0",
712 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
713 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
714 | "dev": true
715 | },
716 | "node_modules/get-stream": {
717 | "version": "6.0.1",
718 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
719 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
720 | "dev": true,
721 | "engines": {
722 | "node": ">=10"
723 | },
724 | "funding": {
725 | "url": "https://github.com/sponsors/sindresorhus"
726 | }
727 | },
728 | "node_modules/glob": {
729 | "version": "7.2.3",
730 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
731 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
732 | "dev": true,
733 | "dependencies": {
734 | "fs.realpath": "^1.0.0",
735 | "inflight": "^1.0.4",
736 | "inherits": "2",
737 | "minimatch": "^3.1.1",
738 | "once": "^1.3.0",
739 | "path-is-absolute": "^1.0.0"
740 | },
741 | "engines": {
742 | "node": "*"
743 | },
744 | "funding": {
745 | "url": "https://github.com/sponsors/isaacs"
746 | }
747 | },
748 | "node_modules/glob-parent": {
749 | "version": "6.0.2",
750 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
751 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
752 | "dev": true,
753 | "dependencies": {
754 | "is-glob": "^4.0.3"
755 | },
756 | "engines": {
757 | "node": ">=10.13.0"
758 | }
759 | },
760 | "node_modules/globals": {
761 | "version": "13.24.0",
762 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
763 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
764 | "dev": true,
765 | "dependencies": {
766 | "type-fest": "^0.20.2"
767 | },
768 | "engines": {
769 | "node": ">=8"
770 | },
771 | "funding": {
772 | "url": "https://github.com/sponsors/sindresorhus"
773 | }
774 | },
775 | "node_modules/graphemer": {
776 | "version": "1.4.0",
777 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
778 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
779 | "dev": true
780 | },
781 | "node_modules/html-encoding-sniffer": {
782 | "version": "4.0.0",
783 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
784 | "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
785 | "dev": true,
786 | "dependencies": {
787 | "whatwg-encoding": "^3.1.1"
788 | },
789 | "engines": {
790 | "node": ">=18"
791 | }
792 | },
793 | "node_modules/http-proxy-agent": {
794 | "version": "7.0.2",
795 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
796 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
797 | "dev": true,
798 | "dependencies": {
799 | "agent-base": "^7.1.0",
800 | "debug": "^4.3.4"
801 | },
802 | "engines": {
803 | "node": ">= 14"
804 | }
805 | },
806 | "node_modules/https-proxy-agent": {
807 | "version": "7.0.4",
808 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
809 | "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
810 | "dev": true,
811 | "dependencies": {
812 | "agent-base": "^7.0.2",
813 | "debug": "4"
814 | },
815 | "engines": {
816 | "node": ">= 14"
817 | }
818 | },
819 | "node_modules/human-signals": {
820 | "version": "2.1.0",
821 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
822 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
823 | "dev": true,
824 | "engines": {
825 | "node": ">=10.17.0"
826 | }
827 | },
828 | "node_modules/iconv-lite": {
829 | "version": "0.6.3",
830 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
831 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
832 | "dev": true,
833 | "dependencies": {
834 | "safer-buffer": ">= 2.1.2 < 3.0.0"
835 | },
836 | "engines": {
837 | "node": ">=0.10.0"
838 | }
839 | },
840 | "node_modules/ignore": {
841 | "version": "5.3.1",
842 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
843 | "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
844 | "dev": true,
845 | "engines": {
846 | "node": ">= 4"
847 | }
848 | },
849 | "node_modules/import-fresh": {
850 | "version": "3.3.0",
851 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
852 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
853 | "dev": true,
854 | "dependencies": {
855 | "parent-module": "^1.0.0",
856 | "resolve-from": "^4.0.0"
857 | },
858 | "engines": {
859 | "node": ">=6"
860 | },
861 | "funding": {
862 | "url": "https://github.com/sponsors/sindresorhus"
863 | }
864 | },
865 | "node_modules/imurmurhash": {
866 | "version": "0.1.4",
867 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
868 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
869 | "dev": true,
870 | "engines": {
871 | "node": ">=0.8.19"
872 | }
873 | },
874 | "node_modules/inflight": {
875 | "version": "1.0.6",
876 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
877 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
878 | "dev": true,
879 | "dependencies": {
880 | "once": "^1.3.0",
881 | "wrappy": "1"
882 | }
883 | },
884 | "node_modules/inherits": {
885 | "version": "2.0.4",
886 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
887 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
888 | "dev": true
889 | },
890 | "node_modules/is-extglob": {
891 | "version": "2.1.1",
892 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
893 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
894 | "dev": true,
895 | "engines": {
896 | "node": ">=0.10.0"
897 | }
898 | },
899 | "node_modules/is-glob": {
900 | "version": "4.0.3",
901 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
902 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
903 | "dev": true,
904 | "dependencies": {
905 | "is-extglob": "^2.1.1"
906 | },
907 | "engines": {
908 | "node": ">=0.10.0"
909 | }
910 | },
911 | "node_modules/is-path-inside": {
912 | "version": "3.0.3",
913 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
914 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
915 | "dev": true,
916 | "engines": {
917 | "node": ">=8"
918 | }
919 | },
920 | "node_modules/is-potential-custom-element-name": {
921 | "version": "1.0.1",
922 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
923 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
924 | "dev": true
925 | },
926 | "node_modules/is-stream": {
927 | "version": "2.0.1",
928 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
929 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
930 | "dev": true,
931 | "engines": {
932 | "node": ">=8"
933 | },
934 | "funding": {
935 | "url": "https://github.com/sponsors/sindresorhus"
936 | }
937 | },
938 | "node_modules/isexe": {
939 | "version": "2.0.0",
940 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
941 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
942 | "dev": true
943 | },
944 | "node_modules/js-yaml": {
945 | "version": "4.1.0",
946 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
947 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
948 | "dev": true,
949 | "dependencies": {
950 | "argparse": "^2.0.1"
951 | },
952 | "bin": {
953 | "js-yaml": "bin/js-yaml.js"
954 | }
955 | },
956 | "node_modules/jsdom": {
957 | "version": "24.0.0",
958 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz",
959 | "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==",
960 | "dev": true,
961 | "dependencies": {
962 | "cssstyle": "^4.0.1",
963 | "data-urls": "^5.0.0",
964 | "decimal.js": "^10.4.3",
965 | "form-data": "^4.0.0",
966 | "html-encoding-sniffer": "^4.0.0",
967 | "http-proxy-agent": "^7.0.0",
968 | "https-proxy-agent": "^7.0.2",
969 | "is-potential-custom-element-name": "^1.0.1",
970 | "nwsapi": "^2.2.7",
971 | "parse5": "^7.1.2",
972 | "rrweb-cssom": "^0.6.0",
973 | "saxes": "^6.0.0",
974 | "symbol-tree": "^3.2.4",
975 | "tough-cookie": "^4.1.3",
976 | "w3c-xmlserializer": "^5.0.0",
977 | "webidl-conversions": "^7.0.0",
978 | "whatwg-encoding": "^3.1.1",
979 | "whatwg-mimetype": "^4.0.0",
980 | "whatwg-url": "^14.0.0",
981 | "ws": "^8.16.0",
982 | "xml-name-validator": "^5.0.0"
983 | },
984 | "engines": {
985 | "node": ">=18"
986 | },
987 | "peerDependencies": {
988 | "canvas": "^2.11.2"
989 | },
990 | "peerDependenciesMeta": {
991 | "canvas": {
992 | "optional": true
993 | }
994 | }
995 | },
996 | "node_modules/json-buffer": {
997 | "version": "3.0.1",
998 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
999 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
1000 | "dev": true
1001 | },
1002 | "node_modules/json-schema-traverse": {
1003 | "version": "0.4.1",
1004 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1005 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1006 | "dev": true
1007 | },
1008 | "node_modules/json-stable-stringify-without-jsonify": {
1009 | "version": "1.0.1",
1010 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1011 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
1012 | "dev": true
1013 | },
1014 | "node_modules/keyv": {
1015 | "version": "4.5.4",
1016 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
1017 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
1018 | "dev": true,
1019 | "dependencies": {
1020 | "json-buffer": "3.0.1"
1021 | }
1022 | },
1023 | "node_modules/levn": {
1024 | "version": "0.4.1",
1025 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1026 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1027 | "dev": true,
1028 | "dependencies": {
1029 | "prelude-ls": "^1.2.1",
1030 | "type-check": "~0.4.0"
1031 | },
1032 | "engines": {
1033 | "node": ">= 0.8.0"
1034 | }
1035 | },
1036 | "node_modules/locate-path": {
1037 | "version": "6.0.0",
1038 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
1039 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
1040 | "dev": true,
1041 | "dependencies": {
1042 | "p-locate": "^5.0.0"
1043 | },
1044 | "engines": {
1045 | "node": ">=10"
1046 | },
1047 | "funding": {
1048 | "url": "https://github.com/sponsors/sindresorhus"
1049 | }
1050 | },
1051 | "node_modules/lodash.merge": {
1052 | "version": "4.6.2",
1053 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
1054 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
1055 | "dev": true
1056 | },
1057 | "node_modules/merge-stream": {
1058 | "version": "2.0.0",
1059 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
1060 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
1061 | "dev": true
1062 | },
1063 | "node_modules/mime-db": {
1064 | "version": "1.52.0",
1065 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1066 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1067 | "dev": true,
1068 | "engines": {
1069 | "node": ">= 0.6"
1070 | }
1071 | },
1072 | "node_modules/mime-types": {
1073 | "version": "2.1.35",
1074 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1075 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1076 | "dev": true,
1077 | "dependencies": {
1078 | "mime-db": "1.52.0"
1079 | },
1080 | "engines": {
1081 | "node": ">= 0.6"
1082 | }
1083 | },
1084 | "node_modules/mimic-fn": {
1085 | "version": "2.1.0",
1086 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1087 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1088 | "dev": true,
1089 | "engines": {
1090 | "node": ">=6"
1091 | }
1092 | },
1093 | "node_modules/minimatch": {
1094 | "version": "3.1.2",
1095 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1096 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1097 | "dev": true,
1098 | "dependencies": {
1099 | "brace-expansion": "^1.1.7"
1100 | },
1101 | "engines": {
1102 | "node": "*"
1103 | }
1104 | },
1105 | "node_modules/mri": {
1106 | "version": "1.2.0",
1107 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
1108 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
1109 | "dev": true,
1110 | "engines": {
1111 | "node": ">=4"
1112 | }
1113 | },
1114 | "node_modules/ms": {
1115 | "version": "2.1.2",
1116 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1117 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1118 | "dev": true
1119 | },
1120 | "node_modules/natural-compare": {
1121 | "version": "1.4.0",
1122 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1123 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1124 | "dev": true
1125 | },
1126 | "node_modules/npm-run-path": {
1127 | "version": "4.0.1",
1128 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
1129 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
1130 | "dev": true,
1131 | "dependencies": {
1132 | "path-key": "^3.0.0"
1133 | },
1134 | "engines": {
1135 | "node": ">=8"
1136 | }
1137 | },
1138 | "node_modules/nwsapi": {
1139 | "version": "2.2.7",
1140 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
1141 | "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
1142 | "dev": true
1143 | },
1144 | "node_modules/once": {
1145 | "version": "1.4.0",
1146 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1147 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1148 | "dev": true,
1149 | "dependencies": {
1150 | "wrappy": "1"
1151 | }
1152 | },
1153 | "node_modules/onetime": {
1154 | "version": "5.1.2",
1155 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
1156 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
1157 | "dev": true,
1158 | "dependencies": {
1159 | "mimic-fn": "^2.1.0"
1160 | },
1161 | "engines": {
1162 | "node": ">=6"
1163 | },
1164 | "funding": {
1165 | "url": "https://github.com/sponsors/sindresorhus"
1166 | }
1167 | },
1168 | "node_modules/optionator": {
1169 | "version": "0.9.3",
1170 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
1171 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
1172 | "dev": true,
1173 | "dependencies": {
1174 | "@aashutoshrathi/word-wrap": "^1.2.3",
1175 | "deep-is": "^0.1.3",
1176 | "fast-levenshtein": "^2.0.6",
1177 | "levn": "^0.4.1",
1178 | "prelude-ls": "^1.2.1",
1179 | "type-check": "^0.4.0"
1180 | },
1181 | "engines": {
1182 | "node": ">= 0.8.0"
1183 | }
1184 | },
1185 | "node_modules/p-limit": {
1186 | "version": "3.1.0",
1187 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
1188 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
1189 | "dev": true,
1190 | "dependencies": {
1191 | "yocto-queue": "^0.1.0"
1192 | },
1193 | "engines": {
1194 | "node": ">=10"
1195 | },
1196 | "funding": {
1197 | "url": "https://github.com/sponsors/sindresorhus"
1198 | }
1199 | },
1200 | "node_modules/p-locate": {
1201 | "version": "5.0.0",
1202 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
1203 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
1204 | "dev": true,
1205 | "dependencies": {
1206 | "p-limit": "^3.0.2"
1207 | },
1208 | "engines": {
1209 | "node": ">=10"
1210 | },
1211 | "funding": {
1212 | "url": "https://github.com/sponsors/sindresorhus"
1213 | }
1214 | },
1215 | "node_modules/parent-module": {
1216 | "version": "1.0.1",
1217 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1218 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1219 | "dev": true,
1220 | "dependencies": {
1221 | "callsites": "^3.0.0"
1222 | },
1223 | "engines": {
1224 | "node": ">=6"
1225 | }
1226 | },
1227 | "node_modules/parse5": {
1228 | "version": "7.1.2",
1229 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
1230 | "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
1231 | "dev": true,
1232 | "dependencies": {
1233 | "entities": "^4.4.0"
1234 | },
1235 | "funding": {
1236 | "url": "https://github.com/inikulin/parse5?sponsor=1"
1237 | }
1238 | },
1239 | "node_modules/path-exists": {
1240 | "version": "4.0.0",
1241 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1242 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1243 | "dev": true,
1244 | "engines": {
1245 | "node": ">=8"
1246 | }
1247 | },
1248 | "node_modules/path-is-absolute": {
1249 | "version": "1.0.1",
1250 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1251 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
1252 | "dev": true,
1253 | "engines": {
1254 | "node": ">=0.10.0"
1255 | }
1256 | },
1257 | "node_modules/path-key": {
1258 | "version": "3.1.1",
1259 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1260 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1261 | "dev": true,
1262 | "engines": {
1263 | "node": ">=8"
1264 | }
1265 | },
1266 | "node_modules/picocolors": {
1267 | "version": "1.0.0",
1268 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1269 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
1270 | "dev": true
1271 | },
1272 | "node_modules/prelude-ls": {
1273 | "version": "1.2.1",
1274 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
1275 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
1276 | "dev": true,
1277 | "engines": {
1278 | "node": ">= 0.8.0"
1279 | }
1280 | },
1281 | "node_modules/prettier": {
1282 | "version": "3.2.5",
1283 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
1284 | "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
1285 | "dev": true,
1286 | "bin": {
1287 | "prettier": "bin/prettier.cjs"
1288 | },
1289 | "engines": {
1290 | "node": ">=14"
1291 | },
1292 | "funding": {
1293 | "url": "https://github.com/prettier/prettier?sponsor=1"
1294 | }
1295 | },
1296 | "node_modules/pretty-quick": {
1297 | "version": "4.0.0",
1298 | "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-4.0.0.tgz",
1299 | "integrity": "sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==",
1300 | "dev": true,
1301 | "dependencies": {
1302 | "execa": "^5.1.1",
1303 | "find-up": "^5.0.0",
1304 | "ignore": "^5.3.0",
1305 | "mri": "^1.2.0",
1306 | "picocolors": "^1.0.0",
1307 | "picomatch": "^3.0.1",
1308 | "tslib": "^2.6.2"
1309 | },
1310 | "bin": {
1311 | "pretty-quick": "lib/cli.mjs"
1312 | },
1313 | "engines": {
1314 | "node": ">=14"
1315 | },
1316 | "peerDependencies": {
1317 | "prettier": "^3.0.0"
1318 | }
1319 | },
1320 | "node_modules/pretty-quick/node_modules/picomatch": {
1321 | "version": "3.0.1",
1322 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz",
1323 | "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==",
1324 | "dev": true,
1325 | "engines": {
1326 | "node": ">=10"
1327 | },
1328 | "funding": {
1329 | "url": "https://github.com/sponsors/jonschlinkert"
1330 | }
1331 | },
1332 | "node_modules/psl": {
1333 | "version": "1.9.0",
1334 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
1335 | "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
1336 | "dev": true
1337 | },
1338 | "node_modules/punycode": {
1339 | "version": "2.3.1",
1340 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1341 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1342 | "dev": true,
1343 | "engines": {
1344 | "node": ">=6"
1345 | }
1346 | },
1347 | "node_modules/querystringify": {
1348 | "version": "2.2.0",
1349 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
1350 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
1351 | "dev": true
1352 | },
1353 | "node_modules/queue-microtask": {
1354 | "version": "1.2.3",
1355 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1356 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1357 | "dev": true,
1358 | "funding": [
1359 | {
1360 | "type": "github",
1361 | "url": "https://github.com/sponsors/feross"
1362 | },
1363 | {
1364 | "type": "patreon",
1365 | "url": "https://www.patreon.com/feross"
1366 | },
1367 | {
1368 | "type": "consulting",
1369 | "url": "https://feross.org/support"
1370 | }
1371 | ]
1372 | },
1373 | "node_modules/requires-port": {
1374 | "version": "1.0.0",
1375 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
1376 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
1377 | "dev": true
1378 | },
1379 | "node_modules/resolve-from": {
1380 | "version": "4.0.0",
1381 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1382 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1383 | "dev": true,
1384 | "engines": {
1385 | "node": ">=4"
1386 | }
1387 | },
1388 | "node_modules/reusify": {
1389 | "version": "1.0.4",
1390 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1391 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1392 | "dev": true,
1393 | "engines": {
1394 | "iojs": ">=1.0.0",
1395 | "node": ">=0.10.0"
1396 | }
1397 | },
1398 | "node_modules/rimraf": {
1399 | "version": "3.0.2",
1400 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1401 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1402 | "dev": true,
1403 | "dependencies": {
1404 | "glob": "^7.1.3"
1405 | },
1406 | "bin": {
1407 | "rimraf": "bin.js"
1408 | },
1409 | "funding": {
1410 | "url": "https://github.com/sponsors/isaacs"
1411 | }
1412 | },
1413 | "node_modules/rrweb-cssom": {
1414 | "version": "0.6.0",
1415 | "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
1416 | "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==",
1417 | "dev": true
1418 | },
1419 | "node_modules/run-parallel": {
1420 | "version": "1.2.0",
1421 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1422 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1423 | "dev": true,
1424 | "funding": [
1425 | {
1426 | "type": "github",
1427 | "url": "https://github.com/sponsors/feross"
1428 | },
1429 | {
1430 | "type": "patreon",
1431 | "url": "https://www.patreon.com/feross"
1432 | },
1433 | {
1434 | "type": "consulting",
1435 | "url": "https://feross.org/support"
1436 | }
1437 | ],
1438 | "dependencies": {
1439 | "queue-microtask": "^1.2.2"
1440 | }
1441 | },
1442 | "node_modules/safer-buffer": {
1443 | "version": "2.1.2",
1444 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1445 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1446 | "dev": true
1447 | },
1448 | "node_modules/saxes": {
1449 | "version": "6.0.0",
1450 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
1451 | "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
1452 | "dev": true,
1453 | "dependencies": {
1454 | "xmlchars": "^2.2.0"
1455 | },
1456 | "engines": {
1457 | "node": ">=v12.22.7"
1458 | }
1459 | },
1460 | "node_modules/shebang-command": {
1461 | "version": "2.0.0",
1462 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1463 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1464 | "dev": true,
1465 | "dependencies": {
1466 | "shebang-regex": "^3.0.0"
1467 | },
1468 | "engines": {
1469 | "node": ">=8"
1470 | }
1471 | },
1472 | "node_modules/shebang-regex": {
1473 | "version": "3.0.0",
1474 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1475 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1476 | "dev": true,
1477 | "engines": {
1478 | "node": ">=8"
1479 | }
1480 | },
1481 | "node_modules/signal-exit": {
1482 | "version": "3.0.7",
1483 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
1484 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
1485 | "dev": true
1486 | },
1487 | "node_modules/strip-ansi": {
1488 | "version": "6.0.1",
1489 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1490 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1491 | "dev": true,
1492 | "dependencies": {
1493 | "ansi-regex": "^5.0.1"
1494 | },
1495 | "engines": {
1496 | "node": ">=8"
1497 | }
1498 | },
1499 | "node_modules/strip-final-newline": {
1500 | "version": "2.0.0",
1501 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
1502 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
1503 | "dev": true,
1504 | "engines": {
1505 | "node": ">=6"
1506 | }
1507 | },
1508 | "node_modules/strip-json-comments": {
1509 | "version": "3.1.1",
1510 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
1511 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
1512 | "dev": true,
1513 | "engines": {
1514 | "node": ">=8"
1515 | },
1516 | "funding": {
1517 | "url": "https://github.com/sponsors/sindresorhus"
1518 | }
1519 | },
1520 | "node_modules/symbol-tree": {
1521 | "version": "3.2.4",
1522 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
1523 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
1524 | },
1525 | "node_modules/text-table": {
1526 | "version": "0.2.0",
1527 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1528 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1529 | "dev": true
1530 | },
1531 | "node_modules/tough-cookie": {
1532 | "version": "4.1.3",
1533 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
1534 | "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
1535 | "dev": true,
1536 | "dependencies": {
1537 | "psl": "^1.1.33",
1538 | "punycode": "^2.1.1",
1539 | "universalify": "^0.2.0",
1540 | "url-parse": "^1.5.3"
1541 | },
1542 | "engines": {
1543 | "node": ">=6"
1544 | }
1545 | },
1546 | "node_modules/tr46": {
1547 | "version": "5.0.0",
1548 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
1549 | "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
1550 | "dev": true,
1551 | "dependencies": {
1552 | "punycode": "^2.3.1"
1553 | },
1554 | "engines": {
1555 | "node": ">=18"
1556 | }
1557 | },
1558 | "node_modules/tslib": {
1559 | "version": "2.6.2",
1560 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
1561 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
1562 | "dev": true
1563 | },
1564 | "node_modules/type-check": {
1565 | "version": "0.4.0",
1566 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
1567 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
1568 | "dev": true,
1569 | "dependencies": {
1570 | "prelude-ls": "^1.2.1"
1571 | },
1572 | "engines": {
1573 | "node": ">= 0.8.0"
1574 | }
1575 | },
1576 | "node_modules/type-fest": {
1577 | "version": "0.20.2",
1578 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
1579 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
1580 | "dev": true,
1581 | "engines": {
1582 | "node": ">=10"
1583 | },
1584 | "funding": {
1585 | "url": "https://github.com/sponsors/sindresorhus"
1586 | }
1587 | },
1588 | "node_modules/universalify": {
1589 | "version": "0.2.0",
1590 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
1591 | "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
1592 | "dev": true,
1593 | "engines": {
1594 | "node": ">= 4.0.0"
1595 | }
1596 | },
1597 | "node_modules/uri-js": {
1598 | "version": "4.4.1",
1599 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1600 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1601 | "dev": true,
1602 | "dependencies": {
1603 | "punycode": "^2.1.0"
1604 | }
1605 | },
1606 | "node_modules/url-parse": {
1607 | "version": "1.5.10",
1608 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
1609 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
1610 | "dev": true,
1611 | "dependencies": {
1612 | "querystringify": "^2.1.1",
1613 | "requires-port": "^1.0.0"
1614 | }
1615 | },
1616 | "node_modules/w3c-xmlserializer": {
1617 | "version": "5.0.0",
1618 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
1619 | "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
1620 | "dev": true,
1621 | "dependencies": {
1622 | "xml-name-validator": "^5.0.0"
1623 | },
1624 | "engines": {
1625 | "node": ">=18"
1626 | }
1627 | },
1628 | "node_modules/webidl-conversions": {
1629 | "version": "7.0.0",
1630 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1631 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1632 | "dev": true,
1633 | "engines": {
1634 | "node": ">=12"
1635 | }
1636 | },
1637 | "node_modules/whatwg-encoding": {
1638 | "version": "3.1.1",
1639 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
1640 | "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
1641 | "dev": true,
1642 | "dependencies": {
1643 | "iconv-lite": "0.6.3"
1644 | },
1645 | "engines": {
1646 | "node": ">=18"
1647 | }
1648 | },
1649 | "node_modules/whatwg-mimetype": {
1650 | "version": "4.0.0",
1651 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
1652 | "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
1653 | "dev": true,
1654 | "engines": {
1655 | "node": ">=18"
1656 | }
1657 | },
1658 | "node_modules/whatwg-url": {
1659 | "version": "14.0.0",
1660 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz",
1661 | "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==",
1662 | "dev": true,
1663 | "dependencies": {
1664 | "tr46": "^5.0.0",
1665 | "webidl-conversions": "^7.0.0"
1666 | },
1667 | "engines": {
1668 | "node": ">=18"
1669 | }
1670 | },
1671 | "node_modules/which": {
1672 | "version": "2.0.2",
1673 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1674 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1675 | "dev": true,
1676 | "dependencies": {
1677 | "isexe": "^2.0.0"
1678 | },
1679 | "bin": {
1680 | "node-which": "bin/node-which"
1681 | },
1682 | "engines": {
1683 | "node": ">= 8"
1684 | }
1685 | },
1686 | "node_modules/wrappy": {
1687 | "version": "1.0.2",
1688 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1689 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1690 | "dev": true
1691 | },
1692 | "node_modules/ws": {
1693 | "version": "8.16.0",
1694 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
1695 | "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
1696 | "dev": true,
1697 | "engines": {
1698 | "node": ">=10.0.0"
1699 | },
1700 | "peerDependencies": {
1701 | "bufferutil": "^4.0.1",
1702 | "utf-8-validate": ">=5.0.2"
1703 | },
1704 | "peerDependenciesMeta": {
1705 | "bufferutil": {
1706 | "optional": true
1707 | },
1708 | "utf-8-validate": {
1709 | "optional": true
1710 | }
1711 | }
1712 | },
1713 | "node_modules/xml-name-validator": {
1714 | "version": "5.0.0",
1715 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
1716 | "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
1717 | "dev": true,
1718 | "engines": {
1719 | "node": ">=18"
1720 | }
1721 | },
1722 | "node_modules/xmlchars": {
1723 | "version": "2.2.0",
1724 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
1725 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
1726 | "dev": true
1727 | },
1728 | "node_modules/yocto-queue": {
1729 | "version": "0.1.0",
1730 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
1731 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
1732 | "dev": true,
1733 | "engines": {
1734 | "node": ">=10"
1735 | },
1736 | "funding": {
1737 | "url": "https://github.com/sponsors/sindresorhus"
1738 | }
1739 | }
1740 | },
1741 | "dependencies": {
1742 | "@aashutoshrathi/word-wrap": {
1743 | "version": "1.2.6",
1744 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
1745 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
1746 | "dev": true
1747 | },
1748 | "@eslint-community/eslint-utils": {
1749 | "version": "4.4.0",
1750 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
1751 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
1752 | "dev": true,
1753 | "requires": {
1754 | "eslint-visitor-keys": "^3.3.0"
1755 | }
1756 | },
1757 | "@eslint-community/regexpp": {
1758 | "version": "4.10.0",
1759 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
1760 | "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
1761 | "dev": true
1762 | },
1763 | "@eslint/eslintrc": {
1764 | "version": "2.1.4",
1765 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
1766 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
1767 | "dev": true,
1768 | "requires": {
1769 | "ajv": "^6.12.4",
1770 | "debug": "^4.3.2",
1771 | "espree": "^9.6.0",
1772 | "globals": "^13.19.0",
1773 | "ignore": "^5.2.0",
1774 | "import-fresh": "^3.2.1",
1775 | "js-yaml": "^4.1.0",
1776 | "minimatch": "^3.1.2",
1777 | "strip-json-comments": "^3.1.1"
1778 | }
1779 | },
1780 | "@eslint/js": {
1781 | "version": "8.57.0",
1782 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
1783 | "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
1784 | "dev": true
1785 | },
1786 | "@humanwhocodes/config-array": {
1787 | "version": "0.11.14",
1788 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
1789 | "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
1790 | "dev": true,
1791 | "requires": {
1792 | "@humanwhocodes/object-schema": "^2.0.2",
1793 | "debug": "^4.3.1",
1794 | "minimatch": "^3.0.5"
1795 | }
1796 | },
1797 | "@humanwhocodes/module-importer": {
1798 | "version": "1.0.1",
1799 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
1800 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
1801 | "dev": true
1802 | },
1803 | "@humanwhocodes/object-schema": {
1804 | "version": "2.0.3",
1805 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
1806 | "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
1807 | "dev": true
1808 | },
1809 | "@nodelib/fs.scandir": {
1810 | "version": "2.1.5",
1811 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
1812 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
1813 | "dev": true,
1814 | "requires": {
1815 | "@nodelib/fs.stat": "2.0.5",
1816 | "run-parallel": "^1.1.9"
1817 | }
1818 | },
1819 | "@nodelib/fs.stat": {
1820 | "version": "2.0.5",
1821 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
1822 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
1823 | "dev": true
1824 | },
1825 | "@nodelib/fs.walk": {
1826 | "version": "1.2.8",
1827 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
1828 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
1829 | "dev": true,
1830 | "requires": {
1831 | "@nodelib/fs.scandir": "2.1.5",
1832 | "fastq": "^1.6.0"
1833 | }
1834 | },
1835 | "@ungap/structured-clone": {
1836 | "version": "1.2.0",
1837 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
1838 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
1839 | "dev": true
1840 | },
1841 | "acorn": {
1842 | "version": "8.11.3",
1843 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
1844 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
1845 | "dev": true
1846 | },
1847 | "acorn-jsx": {
1848 | "version": "5.3.2",
1849 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
1850 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
1851 | "dev": true,
1852 | "requires": {}
1853 | },
1854 | "agent-base": {
1855 | "version": "7.1.1",
1856 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
1857 | "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
1858 | "dev": true,
1859 | "requires": {
1860 | "debug": "^4.3.4"
1861 | }
1862 | },
1863 | "ajv": {
1864 | "version": "6.12.6",
1865 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1866 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1867 | "dev": true,
1868 | "requires": {
1869 | "fast-deep-equal": "^3.1.1",
1870 | "fast-json-stable-stringify": "^2.0.0",
1871 | "json-schema-traverse": "^0.4.1",
1872 | "uri-js": "^4.2.2"
1873 | }
1874 | },
1875 | "ansi-regex": {
1876 | "version": "5.0.1",
1877 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1878 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1879 | "dev": true
1880 | },
1881 | "argparse": {
1882 | "version": "2.0.1",
1883 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1884 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
1885 | "dev": true
1886 | },
1887 | "asynckit": {
1888 | "version": "0.4.0",
1889 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1890 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
1891 | "dev": true
1892 | },
1893 | "balanced-match": {
1894 | "version": "1.0.2",
1895 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1896 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1897 | "dev": true
1898 | },
1899 | "brace-expansion": {
1900 | "version": "1.1.11",
1901 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1902 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1903 | "dev": true,
1904 | "requires": {
1905 | "balanced-match": "^1.0.0",
1906 | "concat-map": "0.0.1"
1907 | }
1908 | },
1909 | "callsites": {
1910 | "version": "3.1.0",
1911 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
1912 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
1913 | "dev": true
1914 | },
1915 | "combined-stream": {
1916 | "version": "1.0.8",
1917 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1918 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1919 | "dev": true,
1920 | "requires": {
1921 | "delayed-stream": "~1.0.0"
1922 | }
1923 | },
1924 | "concat-map": {
1925 | "version": "0.0.1",
1926 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1927 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1928 | "dev": true
1929 | },
1930 | "cross-spawn": {
1931 | "version": "7.0.3",
1932 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
1933 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
1934 | "dev": true,
1935 | "requires": {
1936 | "path-key": "^3.1.0",
1937 | "shebang-command": "^2.0.0",
1938 | "which": "^2.0.1"
1939 | }
1940 | },
1941 | "cssstyle": {
1942 | "version": "4.0.1",
1943 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz",
1944 | "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==",
1945 | "dev": true,
1946 | "requires": {
1947 | "rrweb-cssom": "^0.6.0"
1948 | }
1949 | },
1950 | "data-urls": {
1951 | "version": "5.0.0",
1952 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
1953 | "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
1954 | "dev": true,
1955 | "requires": {
1956 | "whatwg-mimetype": "^4.0.0",
1957 | "whatwg-url": "^14.0.0"
1958 | }
1959 | },
1960 | "debug": {
1961 | "version": "4.3.4",
1962 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1963 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1964 | "dev": true,
1965 | "requires": {
1966 | "ms": "2.1.2"
1967 | }
1968 | },
1969 | "decimal.js": {
1970 | "version": "10.4.3",
1971 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
1972 | "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
1973 | "dev": true
1974 | },
1975 | "deep-is": {
1976 | "version": "0.1.4",
1977 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
1978 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
1979 | "dev": true
1980 | },
1981 | "delayed-stream": {
1982 | "version": "1.0.0",
1983 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1984 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
1985 | "dev": true
1986 | },
1987 | "doctrine": {
1988 | "version": "3.0.0",
1989 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
1990 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
1991 | "dev": true,
1992 | "requires": {
1993 | "esutils": "^2.0.2"
1994 | }
1995 | },
1996 | "entities": {
1997 | "version": "4.5.0",
1998 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
1999 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
2000 | "dev": true
2001 | },
2002 | "escape-string-regexp": {
2003 | "version": "4.0.0",
2004 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
2005 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
2006 | "dev": true
2007 | },
2008 | "eslint": {
2009 | "version": "8.57.0",
2010 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
2011 | "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
2012 | "dev": true,
2013 | "requires": {
2014 | "@eslint-community/eslint-utils": "^4.2.0",
2015 | "@eslint-community/regexpp": "^4.6.1",
2016 | "@eslint/eslintrc": "^2.1.4",
2017 | "@eslint/js": "8.57.0",
2018 | "@humanwhocodes/config-array": "^0.11.14",
2019 | "@humanwhocodes/module-importer": "^1.0.1",
2020 | "@nodelib/fs.walk": "^1.2.8",
2021 | "@ungap/structured-clone": "^1.2.0",
2022 | "ajv": "^6.12.4",
2023 | "chalk": "^4.0.0",
2024 | "cross-spawn": "^7.0.2",
2025 | "debug": "^4.3.2",
2026 | "doctrine": "^3.0.0",
2027 | "escape-string-regexp": "^4.0.0",
2028 | "eslint-scope": "^7.2.2",
2029 | "eslint-visitor-keys": "^3.4.3",
2030 | "espree": "^9.6.1",
2031 | "esquery": "^1.4.2",
2032 | "esutils": "^2.0.2",
2033 | "fast-deep-equal": "^3.1.3",
2034 | "file-entry-cache": "^6.0.1",
2035 | "find-up": "^5.0.0",
2036 | "glob-parent": "^6.0.2",
2037 | "globals": "^13.19.0",
2038 | "graphemer": "^1.4.0",
2039 | "ignore": "^5.2.0",
2040 | "imurmurhash": "^0.1.4",
2041 | "is-glob": "^4.0.0",
2042 | "is-path-inside": "^3.0.3",
2043 | "js-yaml": "^4.1.0",
2044 | "json-stable-stringify-without-jsonify": "^1.0.1",
2045 | "levn": "^0.4.1",
2046 | "lodash.merge": "^4.6.2",
2047 | "minimatch": "^3.1.2",
2048 | "natural-compare": "^1.4.0",
2049 | "optionator": "^0.9.3",
2050 | "strip-ansi": "^6.0.1",
2051 | "text-table": "^0.2.0"
2052 | },
2053 | "dependencies": {
2054 | "ansi-styles": {
2055 | "version": "4.3.0",
2056 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2057 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2058 | "dev": true,
2059 | "requires": {
2060 | "color-convert": "^2.0.1"
2061 | }
2062 | },
2063 | "chalk": {
2064 | "version": "4.1.0",
2065 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
2066 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
2067 | "dev": true,
2068 | "requires": {
2069 | "ansi-styles": "^4.1.0",
2070 | "supports-color": "^7.1.0"
2071 | }
2072 | },
2073 | "color-convert": {
2074 | "version": "2.0.1",
2075 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2076 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2077 | "dev": true,
2078 | "requires": {
2079 | "color-name": "~1.1.4"
2080 | }
2081 | },
2082 | "color-name": {
2083 | "version": "1.1.4",
2084 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2085 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2086 | "dev": true
2087 | },
2088 | "has-flag": {
2089 | "version": "4.0.0",
2090 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2091 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2092 | "dev": true
2093 | },
2094 | "supports-color": {
2095 | "version": "7.2.0",
2096 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2097 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2098 | "dev": true,
2099 | "requires": {
2100 | "has-flag": "^4.0.0"
2101 | }
2102 | }
2103 | }
2104 | },
2105 | "eslint-scope": {
2106 | "version": "7.2.2",
2107 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
2108 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
2109 | "dev": true,
2110 | "requires": {
2111 | "esrecurse": "^4.3.0",
2112 | "estraverse": "^5.2.0"
2113 | }
2114 | },
2115 | "eslint-visitor-keys": {
2116 | "version": "3.4.3",
2117 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
2118 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
2119 | "dev": true
2120 | },
2121 | "espree": {
2122 | "version": "9.6.1",
2123 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
2124 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
2125 | "dev": true,
2126 | "requires": {
2127 | "acorn": "^8.9.0",
2128 | "acorn-jsx": "^5.3.2",
2129 | "eslint-visitor-keys": "^3.4.1"
2130 | }
2131 | },
2132 | "esquery": {
2133 | "version": "1.5.0",
2134 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
2135 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
2136 | "dev": true,
2137 | "requires": {
2138 | "estraverse": "^5.1.0"
2139 | }
2140 | },
2141 | "esrecurse": {
2142 | "version": "4.3.0",
2143 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
2144 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
2145 | "dev": true,
2146 | "requires": {
2147 | "estraverse": "^5.2.0"
2148 | }
2149 | },
2150 | "estraverse": {
2151 | "version": "5.3.0",
2152 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
2153 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
2154 | "dev": true
2155 | },
2156 | "esutils": {
2157 | "version": "2.0.3",
2158 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
2159 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
2160 | "dev": true
2161 | },
2162 | "execa": {
2163 | "version": "5.1.1",
2164 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
2165 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
2166 | "dev": true,
2167 | "requires": {
2168 | "cross-spawn": "^7.0.3",
2169 | "get-stream": "^6.0.0",
2170 | "human-signals": "^2.1.0",
2171 | "is-stream": "^2.0.0",
2172 | "merge-stream": "^2.0.0",
2173 | "npm-run-path": "^4.0.1",
2174 | "onetime": "^5.1.2",
2175 | "signal-exit": "^3.0.3",
2176 | "strip-final-newline": "^2.0.0"
2177 | }
2178 | },
2179 | "fast-deep-equal": {
2180 | "version": "3.1.3",
2181 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
2182 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
2183 | "dev": true
2184 | },
2185 | "fast-json-stable-stringify": {
2186 | "version": "2.1.0",
2187 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
2188 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
2189 | "dev": true
2190 | },
2191 | "fast-levenshtein": {
2192 | "version": "2.0.6",
2193 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
2194 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
2195 | "dev": true
2196 | },
2197 | "fastq": {
2198 | "version": "1.17.1",
2199 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
2200 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
2201 | "dev": true,
2202 | "requires": {
2203 | "reusify": "^1.0.4"
2204 | }
2205 | },
2206 | "file-entry-cache": {
2207 | "version": "6.0.1",
2208 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
2209 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
2210 | "dev": true,
2211 | "requires": {
2212 | "flat-cache": "^3.0.4"
2213 | }
2214 | },
2215 | "find-up": {
2216 | "version": "5.0.0",
2217 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
2218 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
2219 | "dev": true,
2220 | "requires": {
2221 | "locate-path": "^6.0.0",
2222 | "path-exists": "^4.0.0"
2223 | }
2224 | },
2225 | "flat-cache": {
2226 | "version": "3.2.0",
2227 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
2228 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
2229 | "dev": true,
2230 | "requires": {
2231 | "flatted": "^3.2.9",
2232 | "keyv": "^4.5.3",
2233 | "rimraf": "^3.0.2"
2234 | }
2235 | },
2236 | "flatted": {
2237 | "version": "3.3.1",
2238 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
2239 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
2240 | "dev": true
2241 | },
2242 | "form-data": {
2243 | "version": "4.0.0",
2244 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
2245 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
2246 | "dev": true,
2247 | "requires": {
2248 | "asynckit": "^0.4.0",
2249 | "combined-stream": "^1.0.8",
2250 | "mime-types": "^2.1.12"
2251 | }
2252 | },
2253 | "fs.realpath": {
2254 | "version": "1.0.0",
2255 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
2256 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
2257 | "dev": true
2258 | },
2259 | "get-stream": {
2260 | "version": "6.0.1",
2261 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
2262 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
2263 | "dev": true
2264 | },
2265 | "glob": {
2266 | "version": "7.2.3",
2267 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
2268 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
2269 | "dev": true,
2270 | "requires": {
2271 | "fs.realpath": "^1.0.0",
2272 | "inflight": "^1.0.4",
2273 | "inherits": "2",
2274 | "minimatch": "^3.1.1",
2275 | "once": "^1.3.0",
2276 | "path-is-absolute": "^1.0.0"
2277 | }
2278 | },
2279 | "glob-parent": {
2280 | "version": "6.0.2",
2281 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
2282 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
2283 | "dev": true,
2284 | "requires": {
2285 | "is-glob": "^4.0.3"
2286 | }
2287 | },
2288 | "globals": {
2289 | "version": "13.24.0",
2290 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
2291 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
2292 | "dev": true,
2293 | "requires": {
2294 | "type-fest": "^0.20.2"
2295 | }
2296 | },
2297 | "graphemer": {
2298 | "version": "1.4.0",
2299 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
2300 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
2301 | "dev": true
2302 | },
2303 | "html-encoding-sniffer": {
2304 | "version": "4.0.0",
2305 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
2306 | "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
2307 | "dev": true,
2308 | "requires": {
2309 | "whatwg-encoding": "^3.1.1"
2310 | }
2311 | },
2312 | "http-proxy-agent": {
2313 | "version": "7.0.2",
2314 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
2315 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
2316 | "dev": true,
2317 | "requires": {
2318 | "agent-base": "^7.1.0",
2319 | "debug": "^4.3.4"
2320 | }
2321 | },
2322 | "https-proxy-agent": {
2323 | "version": "7.0.4",
2324 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
2325 | "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
2326 | "dev": true,
2327 | "requires": {
2328 | "agent-base": "^7.0.2",
2329 | "debug": "4"
2330 | }
2331 | },
2332 | "human-signals": {
2333 | "version": "2.1.0",
2334 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
2335 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
2336 | "dev": true
2337 | },
2338 | "iconv-lite": {
2339 | "version": "0.6.3",
2340 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
2341 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
2342 | "dev": true,
2343 | "requires": {
2344 | "safer-buffer": ">= 2.1.2 < 3.0.0"
2345 | }
2346 | },
2347 | "ignore": {
2348 | "version": "5.3.1",
2349 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
2350 | "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
2351 | "dev": true
2352 | },
2353 | "import-fresh": {
2354 | "version": "3.3.0",
2355 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
2356 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
2357 | "dev": true,
2358 | "requires": {
2359 | "parent-module": "^1.0.0",
2360 | "resolve-from": "^4.0.0"
2361 | }
2362 | },
2363 | "imurmurhash": {
2364 | "version": "0.1.4",
2365 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2366 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2367 | "dev": true
2368 | },
2369 | "inflight": {
2370 | "version": "1.0.6",
2371 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2372 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
2373 | "dev": true,
2374 | "requires": {
2375 | "once": "^1.3.0",
2376 | "wrappy": "1"
2377 | }
2378 | },
2379 | "inherits": {
2380 | "version": "2.0.4",
2381 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
2382 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
2383 | "dev": true
2384 | },
2385 | "is-extglob": {
2386 | "version": "2.1.1",
2387 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
2388 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
2389 | "dev": true
2390 | },
2391 | "is-glob": {
2392 | "version": "4.0.3",
2393 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
2394 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
2395 | "dev": true,
2396 | "requires": {
2397 | "is-extglob": "^2.1.1"
2398 | }
2399 | },
2400 | "is-path-inside": {
2401 | "version": "3.0.3",
2402 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
2403 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
2404 | "dev": true
2405 | },
2406 | "is-potential-custom-element-name": {
2407 | "version": "1.0.1",
2408 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
2409 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
2410 | "dev": true
2411 | },
2412 | "is-stream": {
2413 | "version": "2.0.1",
2414 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
2415 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
2416 | "dev": true
2417 | },
2418 | "isexe": {
2419 | "version": "2.0.0",
2420 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2421 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
2422 | "dev": true
2423 | },
2424 | "js-yaml": {
2425 | "version": "4.1.0",
2426 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
2427 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
2428 | "dev": true,
2429 | "requires": {
2430 | "argparse": "^2.0.1"
2431 | }
2432 | },
2433 | "jsdom": {
2434 | "version": "24.0.0",
2435 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz",
2436 | "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==",
2437 | "dev": true,
2438 | "requires": {
2439 | "cssstyle": "^4.0.1",
2440 | "data-urls": "^5.0.0",
2441 | "decimal.js": "^10.4.3",
2442 | "form-data": "^4.0.0",
2443 | "html-encoding-sniffer": "^4.0.0",
2444 | "http-proxy-agent": "^7.0.0",
2445 | "https-proxy-agent": "^7.0.2",
2446 | "is-potential-custom-element-name": "^1.0.1",
2447 | "nwsapi": "^2.2.7",
2448 | "parse5": "^7.1.2",
2449 | "rrweb-cssom": "^0.6.0",
2450 | "saxes": "^6.0.0",
2451 | "symbol-tree": "^3.2.4",
2452 | "tough-cookie": "^4.1.3",
2453 | "w3c-xmlserializer": "^5.0.0",
2454 | "webidl-conversions": "^7.0.0",
2455 | "whatwg-encoding": "^3.1.1",
2456 | "whatwg-mimetype": "^4.0.0",
2457 | "whatwg-url": "^14.0.0",
2458 | "ws": "^8.16.0",
2459 | "xml-name-validator": "^5.0.0"
2460 | }
2461 | },
2462 | "json-buffer": {
2463 | "version": "3.0.1",
2464 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
2465 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
2466 | "dev": true
2467 | },
2468 | "json-schema-traverse": {
2469 | "version": "0.4.1",
2470 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2471 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2472 | "dev": true
2473 | },
2474 | "json-stable-stringify-without-jsonify": {
2475 | "version": "1.0.1",
2476 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
2477 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
2478 | "dev": true
2479 | },
2480 | "keyv": {
2481 | "version": "4.5.4",
2482 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
2483 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
2484 | "dev": true,
2485 | "requires": {
2486 | "json-buffer": "3.0.1"
2487 | }
2488 | },
2489 | "levn": {
2490 | "version": "0.4.1",
2491 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
2492 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
2493 | "dev": true,
2494 | "requires": {
2495 | "prelude-ls": "^1.2.1",
2496 | "type-check": "~0.4.0"
2497 | }
2498 | },
2499 | "locate-path": {
2500 | "version": "6.0.0",
2501 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
2502 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
2503 | "dev": true,
2504 | "requires": {
2505 | "p-locate": "^5.0.0"
2506 | }
2507 | },
2508 | "lodash.merge": {
2509 | "version": "4.6.2",
2510 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
2511 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
2512 | "dev": true
2513 | },
2514 | "merge-stream": {
2515 | "version": "2.0.0",
2516 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
2517 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
2518 | "dev": true
2519 | },
2520 | "mime-db": {
2521 | "version": "1.52.0",
2522 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
2523 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
2524 | "dev": true
2525 | },
2526 | "mime-types": {
2527 | "version": "2.1.35",
2528 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
2529 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
2530 | "dev": true,
2531 | "requires": {
2532 | "mime-db": "1.52.0"
2533 | }
2534 | },
2535 | "mimic-fn": {
2536 | "version": "2.1.0",
2537 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
2538 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
2539 | "dev": true
2540 | },
2541 | "minimatch": {
2542 | "version": "3.1.2",
2543 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
2544 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
2545 | "dev": true,
2546 | "requires": {
2547 | "brace-expansion": "^1.1.7"
2548 | }
2549 | },
2550 | "mri": {
2551 | "version": "1.2.0",
2552 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
2553 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
2554 | "dev": true
2555 | },
2556 | "ms": {
2557 | "version": "2.1.2",
2558 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
2559 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
2560 | "dev": true
2561 | },
2562 | "natural-compare": {
2563 | "version": "1.4.0",
2564 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2565 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
2566 | "dev": true
2567 | },
2568 | "npm-run-path": {
2569 | "version": "4.0.1",
2570 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
2571 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
2572 | "dev": true,
2573 | "requires": {
2574 | "path-key": "^3.0.0"
2575 | }
2576 | },
2577 | "nwsapi": {
2578 | "version": "2.2.7",
2579 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
2580 | "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
2581 | "dev": true
2582 | },
2583 | "once": {
2584 | "version": "1.4.0",
2585 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2586 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
2587 | "dev": true,
2588 | "requires": {
2589 | "wrappy": "1"
2590 | }
2591 | },
2592 | "onetime": {
2593 | "version": "5.1.2",
2594 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
2595 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
2596 | "dev": true,
2597 | "requires": {
2598 | "mimic-fn": "^2.1.0"
2599 | }
2600 | },
2601 | "optionator": {
2602 | "version": "0.9.3",
2603 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
2604 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
2605 | "dev": true,
2606 | "requires": {
2607 | "@aashutoshrathi/word-wrap": "^1.2.3",
2608 | "deep-is": "^0.1.3",
2609 | "fast-levenshtein": "^2.0.6",
2610 | "levn": "^0.4.1",
2611 | "prelude-ls": "^1.2.1",
2612 | "type-check": "^0.4.0"
2613 | }
2614 | },
2615 | "p-limit": {
2616 | "version": "3.1.0",
2617 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
2618 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
2619 | "dev": true,
2620 | "requires": {
2621 | "yocto-queue": "^0.1.0"
2622 | }
2623 | },
2624 | "p-locate": {
2625 | "version": "5.0.0",
2626 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
2627 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
2628 | "dev": true,
2629 | "requires": {
2630 | "p-limit": "^3.0.2"
2631 | }
2632 | },
2633 | "parent-module": {
2634 | "version": "1.0.1",
2635 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2636 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2637 | "dev": true,
2638 | "requires": {
2639 | "callsites": "^3.0.0"
2640 | }
2641 | },
2642 | "parse5": {
2643 | "version": "7.1.2",
2644 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
2645 | "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
2646 | "dev": true,
2647 | "requires": {
2648 | "entities": "^4.4.0"
2649 | }
2650 | },
2651 | "path-exists": {
2652 | "version": "4.0.0",
2653 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2654 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2655 | "dev": true
2656 | },
2657 | "path-is-absolute": {
2658 | "version": "1.0.1",
2659 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2660 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
2661 | "dev": true
2662 | },
2663 | "path-key": {
2664 | "version": "3.1.1",
2665 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2666 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2667 | "dev": true
2668 | },
2669 | "picocolors": {
2670 | "version": "1.0.0",
2671 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
2672 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
2673 | "dev": true
2674 | },
2675 | "prelude-ls": {
2676 | "version": "1.2.1",
2677 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
2678 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
2679 | "dev": true
2680 | },
2681 | "prettier": {
2682 | "version": "3.2.5",
2683 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
2684 | "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
2685 | "dev": true
2686 | },
2687 | "pretty-quick": {
2688 | "version": "4.0.0",
2689 | "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-4.0.0.tgz",
2690 | "integrity": "sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==",
2691 | "dev": true,
2692 | "requires": {
2693 | "execa": "^5.1.1",
2694 | "find-up": "^5.0.0",
2695 | "ignore": "^5.3.0",
2696 | "mri": "^1.2.0",
2697 | "picocolors": "^1.0.0",
2698 | "picomatch": "^3.0.1",
2699 | "tslib": "^2.6.2"
2700 | },
2701 | "dependencies": {
2702 | "picomatch": {
2703 | "version": "3.0.1",
2704 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz",
2705 | "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==",
2706 | "dev": true
2707 | }
2708 | }
2709 | },
2710 | "psl": {
2711 | "version": "1.9.0",
2712 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
2713 | "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
2714 | "dev": true
2715 | },
2716 | "punycode": {
2717 | "version": "2.3.1",
2718 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
2719 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
2720 | "dev": true
2721 | },
2722 | "querystringify": {
2723 | "version": "2.2.0",
2724 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
2725 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
2726 | "dev": true
2727 | },
2728 | "queue-microtask": {
2729 | "version": "1.2.3",
2730 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2731 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2732 | "dev": true
2733 | },
2734 | "requires-port": {
2735 | "version": "1.0.0",
2736 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
2737 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
2738 | "dev": true
2739 | },
2740 | "resolve-from": {
2741 | "version": "4.0.0",
2742 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2743 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2744 | "dev": true
2745 | },
2746 | "reusify": {
2747 | "version": "1.0.4",
2748 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
2749 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
2750 | "dev": true
2751 | },
2752 | "rimraf": {
2753 | "version": "3.0.2",
2754 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
2755 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
2756 | "dev": true,
2757 | "requires": {
2758 | "glob": "^7.1.3"
2759 | }
2760 | },
2761 | "rrweb-cssom": {
2762 | "version": "0.6.0",
2763 | "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
2764 | "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==",
2765 | "dev": true
2766 | },
2767 | "run-parallel": {
2768 | "version": "1.2.0",
2769 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2770 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2771 | "dev": true,
2772 | "requires": {
2773 | "queue-microtask": "^1.2.2"
2774 | }
2775 | },
2776 | "safer-buffer": {
2777 | "version": "2.1.2",
2778 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2779 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2780 | "dev": true
2781 | },
2782 | "saxes": {
2783 | "version": "6.0.0",
2784 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
2785 | "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
2786 | "dev": true,
2787 | "requires": {
2788 | "xmlchars": "^2.2.0"
2789 | }
2790 | },
2791 | "shebang-command": {
2792 | "version": "2.0.0",
2793 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2794 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2795 | "dev": true,
2796 | "requires": {
2797 | "shebang-regex": "^3.0.0"
2798 | }
2799 | },
2800 | "shebang-regex": {
2801 | "version": "3.0.0",
2802 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2803 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2804 | "dev": true
2805 | },
2806 | "signal-exit": {
2807 | "version": "3.0.7",
2808 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
2809 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
2810 | "dev": true
2811 | },
2812 | "strip-ansi": {
2813 | "version": "6.0.1",
2814 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2815 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2816 | "dev": true,
2817 | "requires": {
2818 | "ansi-regex": "^5.0.1"
2819 | }
2820 | },
2821 | "strip-final-newline": {
2822 | "version": "2.0.0",
2823 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
2824 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
2825 | "dev": true
2826 | },
2827 | "strip-json-comments": {
2828 | "version": "3.1.1",
2829 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2830 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2831 | "dev": true
2832 | },
2833 | "symbol-tree": {
2834 | "version": "3.2.4",
2835 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
2836 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
2837 | },
2838 | "text-table": {
2839 | "version": "0.2.0",
2840 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2841 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
2842 | "dev": true
2843 | },
2844 | "tough-cookie": {
2845 | "version": "4.1.3",
2846 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
2847 | "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
2848 | "dev": true,
2849 | "requires": {
2850 | "psl": "^1.1.33",
2851 | "punycode": "^2.1.1",
2852 | "universalify": "^0.2.0",
2853 | "url-parse": "^1.5.3"
2854 | }
2855 | },
2856 | "tr46": {
2857 | "version": "5.0.0",
2858 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
2859 | "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
2860 | "dev": true,
2861 | "requires": {
2862 | "punycode": "^2.3.1"
2863 | }
2864 | },
2865 | "tslib": {
2866 | "version": "2.6.2",
2867 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
2868 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
2869 | "dev": true
2870 | },
2871 | "type-check": {
2872 | "version": "0.4.0",
2873 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
2874 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
2875 | "dev": true,
2876 | "requires": {
2877 | "prelude-ls": "^1.2.1"
2878 | }
2879 | },
2880 | "type-fest": {
2881 | "version": "0.20.2",
2882 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
2883 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
2884 | "dev": true
2885 | },
2886 | "universalify": {
2887 | "version": "0.2.0",
2888 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
2889 | "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
2890 | "dev": true
2891 | },
2892 | "uri-js": {
2893 | "version": "4.4.1",
2894 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2895 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2896 | "dev": true,
2897 | "requires": {
2898 | "punycode": "^2.1.0"
2899 | }
2900 | },
2901 | "url-parse": {
2902 | "version": "1.5.10",
2903 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
2904 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
2905 | "dev": true,
2906 | "requires": {
2907 | "querystringify": "^2.1.1",
2908 | "requires-port": "^1.0.0"
2909 | }
2910 | },
2911 | "w3c-xmlserializer": {
2912 | "version": "5.0.0",
2913 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
2914 | "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
2915 | "dev": true,
2916 | "requires": {
2917 | "xml-name-validator": "^5.0.0"
2918 | }
2919 | },
2920 | "webidl-conversions": {
2921 | "version": "7.0.0",
2922 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
2923 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
2924 | "dev": true
2925 | },
2926 | "whatwg-encoding": {
2927 | "version": "3.1.1",
2928 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
2929 | "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
2930 | "dev": true,
2931 | "requires": {
2932 | "iconv-lite": "0.6.3"
2933 | }
2934 | },
2935 | "whatwg-mimetype": {
2936 | "version": "4.0.0",
2937 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
2938 | "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
2939 | "dev": true
2940 | },
2941 | "whatwg-url": {
2942 | "version": "14.0.0",
2943 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz",
2944 | "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==",
2945 | "dev": true,
2946 | "requires": {
2947 | "tr46": "^5.0.0",
2948 | "webidl-conversions": "^7.0.0"
2949 | }
2950 | },
2951 | "which": {
2952 | "version": "2.0.2",
2953 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2954 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2955 | "dev": true,
2956 | "requires": {
2957 | "isexe": "^2.0.0"
2958 | }
2959 | },
2960 | "wrappy": {
2961 | "version": "1.0.2",
2962 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2963 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
2964 | "dev": true
2965 | },
2966 | "ws": {
2967 | "version": "8.16.0",
2968 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
2969 | "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
2970 | "dev": true,
2971 | "requires": {}
2972 | },
2973 | "xml-name-validator": {
2974 | "version": "5.0.0",
2975 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
2976 | "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
2977 | "dev": true
2978 | },
2979 | "xmlchars": {
2980 | "version": "2.2.0",
2981 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
2982 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
2983 | "dev": true
2984 | },
2985 | "yocto-queue": {
2986 | "version": "0.1.0",
2987 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
2988 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
2989 | "dev": true
2990 | }
2991 | }
2992 | }
2993 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "qsx",
3 | "version": "3.3.0",
4 | "main": "src/index.js",
5 | "type": "module",
6 | "repository": "git@github.com:danburzo/qsx.git",
7 | "author": "Dan Burzo",
8 | "license": "MIT",
9 | "files": [
10 | "src/*"
11 | ],
12 | "devDependencies": {
13 | "eslint": "^8.57.0",
14 | "jsdom": "^24.0.0",
15 | "prettier": "3.2.5",
16 | "pretty-quick": "^4.0.0"
17 | },
18 | "scripts": {
19 | "prepare": "git config core.hooksPath .git-hooks",
20 | "test": "node --test 'test/**/*.test.js'",
21 | "lint": "eslint '{src,test}/**/*.js'"
22 | },
23 | "dependencies": {
24 | "symbol-tree": "^3.2.4"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/ast-apply.js:
--------------------------------------------------------------------------------
1 | import query from './query.js';
2 |
3 | /*
4 | Apply a query to an element
5 | ---------------------------
6 |
7 | @param root_el — query scope
8 | @param $node — current node in the query AST
9 | @param tree — reference to the query AST
10 | @param clean — (bool)
11 | */
12 | export default function applyAST(root_el, $node, tree) {
13 | /*
14 | Start by fetching the elements matching
15 | the current selector. Attribute selectors don't have a context
16 | of their own, and they apply to the root_el directly.
17 | */
18 | let matching_elements = $node.ctx ? query(root_el, $node.ctx) : [root_el];
19 | let matches = matching_elements.map(element => {
20 | // Attribute selector
21 | if ($node.attr) {
22 | let key = $node.attr;
23 | return key === '*'
24 | ? namedNodeMapToObject(element.attributes)
25 | : key.indexOf('.') === 0
26 | ? element[key.slice(1)]
27 | : element.getAttribute(key);
28 | }
29 |
30 | // Element selector, with possible children
31 | let $subselectors = tree.childrenToArray($node);
32 | if (!$subselectors.length) {
33 | return element.outerHTML;
34 | }
35 | let result = {};
36 | let sequential = [];
37 | $subselectors.forEach($subselector => {
38 | let subselector_result = applyAST(element, $subselector, tree);
39 | if ($subselector.alias) {
40 | if ($subselector.alias === '.') {
41 | result = {
42 | ...result,
43 | ...subselector_result
44 | };
45 | } else {
46 | result[$subselector.alias] = subselector_result;
47 | }
48 | } else {
49 | sequential.push(subselector_result);
50 | }
51 | });
52 | if (sequential.length) {
53 | // If there's a single sequential subselector,
54 | // flatten the wrapper array.
55 | if (sequential.length === 1) {
56 | sequential = sequential[0];
57 | }
58 | if (Object.keys(result).length === 0) {
59 | return sequential;
60 | }
61 | result[$node.alias && $node.alias !== '.' ? $node.alias : '.scoped'] =
62 | sequential;
63 | }
64 | return result;
65 | });
66 |
67 | /*
68 | Only return the first of the matches
69 | when the node is marked as such.
70 | */
71 | let first = $node.first || !$node.ctx || $node.alias === '.';
72 | return first ? matches[0] : matches;
73 | }
74 |
75 | function namedNodeMapToObject(map) {
76 | let res = {},
77 | it;
78 | for (let i = 0; i < map.length; i++) {
79 | it = map.item(i);
80 | res[it.prefix ? `${it.prefix}:${it.localName}` : it.localName] = it.value;
81 | }
82 | return res;
83 | }
84 |
--------------------------------------------------------------------------------
/src/ast-get.js:
--------------------------------------------------------------------------------
1 | import SymbolTree from 'symbol-tree';
2 | import { TOKENS, TOKENS_REGEX, STATE_INITIAL } from './constants.js';
3 |
4 | /*
5 | Returns the AST of a selector
6 | -----------------------------
7 | */
8 | export default function getAST(selector) {
9 | const tree = new SymbolTree();
10 | const node = (anon_route = false) => {
11 | let res = { ctx: '' };
12 | if (anon_route) {
13 | res.first = true;
14 | }
15 | return res;
16 | };
17 | let $root = node();
18 | let $curr = $root;
19 |
20 | const tokens = selector
21 | .replace(/\:is\(/g, ':matches(')
22 | .split(TOKENS_REGEX)
23 | .filter(v => v);
24 |
25 | let token;
26 | let fn_depth = 0;
27 | let ctx_depth = 0;
28 | let state = STATE_INITIAL;
29 |
30 | const assertInitialState = () => {
31 | if (state !== STATE_INITIAL) {
32 | throw new Error(`Unexpected ${token} after ${state}`);
33 | }
34 | };
35 |
36 | while ((token = tokens.shift())) {
37 | switch (token) {
38 | case TOKENS.FUNC_START:
39 | assertInitialState();
40 | fn_depth++;
41 | $curr.ctx += token;
42 | break;
43 | case TOKENS.FUNC_END:
44 | assertInitialState();
45 | if (fn_depth <= 0) {
46 | throw new Error(`Unexpected ${TOKENS.FUNC_END}`);
47 | }
48 | fn_depth--;
49 | $curr.ctx += token;
50 | break;
51 | case TOKENS.GROUP_START:
52 | assertInitialState();
53 | ctx_depth++;
54 | $curr = tree.appendChild($curr, node());
55 | break;
56 | case TOKENS.GROUP_END:
57 | assertInitialState();
58 | if (ctx_depth <= 0) {
59 | throw new Error(`Unexpected ${TOKENS.GROUP_END}`);
60 | }
61 | ctx_depth--;
62 | $curr = tree.parent($curr);
63 | break;
64 | case TOKENS.SEP:
65 | assertInitialState();
66 | if (!fn_depth) {
67 | if ($curr === $root) {
68 | $root = node(true);
69 | tree.appendChild($root, $curr);
70 | }
71 | $curr = tree.insertAfter($curr, node());
72 | } else {
73 | $curr.ctx += token;
74 | }
75 | break;
76 | case TOKENS.ATTR:
77 | assertInitialState();
78 | state = TOKENS.ATTR;
79 | break;
80 | case TOKENS.FIRST:
81 | assertInitialState();
82 | if ($curr.ctx) {
83 | $curr.ctx += token;
84 | } else {
85 | $curr.first = true;
86 | }
87 | break;
88 | case TOKENS.ALIAS:
89 | assertInitialState();
90 | state = TOKENS.ALIAS;
91 | break;
92 | case TOKENS.ALIAS_LEGACY:
93 | assertInitialState();
94 | state = TOKENS.ALIAS_LEGACY;
95 | break;
96 | case TOKENS.SPREAD:
97 | assertInitialState();
98 | $curr.alias = '.';
99 | break;
100 | default:
101 | switch (state) {
102 | case TOKENS.ATTR:
103 | $curr.attr = token.trim();
104 | if (!$curr.ctx && !$curr.alias) {
105 | $curr.alias = $curr.attr;
106 | }
107 | state = STATE_INITIAL;
108 | break;
109 | case TOKENS.ALIAS:
110 | case TOKENS.ALIAS_LEGACY:
111 | $curr.alias = token.trim();
112 | state = STATE_INITIAL;
113 | break;
114 | default:
115 | $curr.ctx += token;
116 | }
117 | }
118 | }
119 |
120 | // Some syntax errors
121 | if (state === TOKENS.ATTR) {
122 | throw new Error(`Missing after ${TOKENS.ATTR}`);
123 | }
124 | if (state === TOKENS.ALIAS) {
125 | throw new Error(`Missing after ${TOKENS.ALIAS}`);
126 | }
127 | if (fn_depth) {
128 | throw new Error(`Missing ${TOKENS.FUNC_END}`);
129 | }
130 | if (ctx_depth) {
131 | throw new Error(`Missing ${TOKENS.GROUP_END}`);
132 | }
133 |
134 | if (!$root.ctx) {
135 | $root.ctx = ':root';
136 | }
137 |
138 | return [$root, tree];
139 | }
140 |
--------------------------------------------------------------------------------
/src/constants.js:
--------------------------------------------------------------------------------
1 | export const TOKENS = {
2 | GROUP_START: '{',
3 | GROUP_END: '}',
4 | SEP: ',',
5 | FUNC_START: '(',
6 | FUNC_END: ')',
7 | ATTR: '@',
8 | FIRST: '^',
9 | ALIAS: '=>',
10 | ALIAS_LEGACY: '>>',
11 | SPREAD: '...'
12 | };
13 |
14 | export const TOKENS_REGEX = new RegExp(
15 | `\\s*(${Object.values(TOKENS)
16 | .map(v =>
17 | v
18 | .split('')
19 | .map(ch => `\\${ch}`)
20 | .join('')
21 | )
22 | .join('|')})\\s*`,
23 | 'g'
24 | );
25 |
26 | export const STATE_INITIAL = null;
27 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import getAST from './ast-get.js';
2 | import applyAST from './ast-apply.js';
3 |
4 | export default function qsx(el, selector) {
5 | let [$root, tree] = getAST(selector);
6 | return Array.isArray($root)
7 | ? $root.map($r => applyAST(el, $r, tree))
8 | : applyAST(el, $root, tree);
9 | }
10 |
--------------------------------------------------------------------------------
/src/query.js:
--------------------------------------------------------------------------------
1 | /*
2 | Query selector on an element
3 | ----------------------------
4 |
5 | Thin wrapper on top of querySelectorAll,
6 | to enable extensions such as:
7 |
8 | :scope + el
9 | :scope ~ el
10 | */
11 | export default function query(el, selector) {
12 | let scope_combi_re = /^\s*:scope\s+(\+|\~)(.+)/;
13 | let m = selector.match(scope_combi_re);
14 | if (!m) {
15 | return Array.from(el.querySelectorAll(selector));
16 | }
17 | if (m[1] === '+') {
18 | // next sibling combinator
19 | return el.nextElementSibling.matches(m[2])
20 | ? [el.nextElementSibling]
21 | : [];
22 | }
23 | if (m[1] === '~') {
24 | // subsequent sibling combinator
25 | let els = [];
26 | let sibling = el.nextElementSibling;
27 | while (sibling) {
28 | if (sibling.matches(m[2])) {
29 | els.push(sibling);
30 | }
31 | sibling = sibling.nextElementSibling;
32 | }
33 | return els;
34 | }
35 | throw new Error(`Invalid combinator: ${m[1]}`);
36 | }
37 |
--------------------------------------------------------------------------------
/test/_util.js:
--------------------------------------------------------------------------------
1 | import { JSDOM } from 'jsdom';
2 |
3 | export function dom(content) {
4 | return new JSDOM(content).window.document;
5 | }
6 |
7 | export function traverse($root, tree) {
8 | if (Array.isArray($root)) {
9 | return $root.map($r => traverse($r, tree));
10 | }
11 | let { [tree.symbol]: _, ...res } = $root;
12 | let children = tree.childrenToArray($root);
13 | if (children.length) {
14 | res.children = traverse(children, tree);
15 | }
16 | return res;
17 | }
18 |
--------------------------------------------------------------------------------
/test/ast-get.test.js:
--------------------------------------------------------------------------------
1 | import test from 'node:test';
2 | import assert from 'node:assert';
3 | import { traverse } from './_util.js';
4 | import getAST from '../src/ast-get.js';
5 |
6 | test('getAST()', () => {
7 | assert.deepEqual(traverse(...getAST('a @href')), {
8 | ctx: 'a',
9 | attr: 'href'
10 | });
11 |
12 | assert.deepEqual(traverse(...getAST('a @href => url')), {
13 | ctx: 'a',
14 | alias: 'url',
15 | attr: 'href'
16 | });
17 |
18 | assert.deepEqual(traverse(...getAST('a { @href }')), {
19 | ctx: 'a',
20 | children: [
21 | {
22 | ctx: '',
23 | alias: 'href',
24 | attr: 'href'
25 | }
26 | ]
27 | });
28 |
29 | assert.deepEqual(traverse(...getAST('a { @href, @.textContent }')), {
30 | ctx: 'a',
31 | children: [
32 | {
33 | ctx: '',
34 | alias: 'href',
35 | attr: 'href'
36 | },
37 | {
38 | ctx: '',
39 | alias: '.textContent',
40 | attr: '.textContent'
41 | }
42 | ]
43 | });
44 |
45 | assert.deepEqual(traverse(...getAST('a { @href => url }')), {
46 | ctx: 'a',
47 | children: [
48 | {
49 | ctx: '',
50 | alias: 'url',
51 | attr: 'href'
52 | }
53 | ]
54 | });
55 |
56 | assert.deepEqual(
57 | traverse(...getAST('a { @href >> url, @.textConten() => text }')),
58 | {
59 | ctx: 'a',
60 | children: [
61 | {
62 | ctx: '',
63 | attr: 'href',
64 | alias: 'url'
65 | },
66 | {
67 | ctx: '',
68 | attr: '.textContent',
69 | alias: 'text'
70 | }
71 | ]
72 | }
73 | );
74 |
75 | assert.deepEqual(
76 | traverse(
77 | ...getAST(`dt {
78 | a { @href, @.textContent },
79 | :scope + dd @.textContent
80 | }`)
81 | ),
82 | {
83 | ctx: 'dt',
84 | children: [
85 | {
86 | ctx: 'a',
87 | children: [
88 | {
89 | ctx: '',
90 | alias: 'href',
91 | attr: 'href'
92 | },
93 | {
94 | ctx: '',
95 | alias: '.textContent',
96 | attr: '.textContent'
97 | }
98 | ]
99 | },
100 | {
101 | ctx: ':scope + dd',
102 | attr: '.textContent'
103 | }
104 | ]
105 | }
106 | );
107 | });
108 |
109 | test('commas and CSS semantics', () => {
110 | assert.deepEqual(traverse(...getAST('h2, h3')), {
111 | ctx: ':root',
112 | first: true,
113 | children: [{ ctx: 'h2' }, { ctx: 'h3' }]
114 | });
115 | assert.deepEqual(traverse(...getAST('{ h2, h3 }')), {
116 | ctx: ':root',
117 | children: [{ ctx: 'h2' }, { ctx: 'h3' }]
118 | });
119 |
120 | assert.deepEqual(traverse(...getAST(':is(h2, h3)')), {
121 | ctx: ':matches(h2,h3)'
122 | });
123 | });
124 |
125 | test('Syntax errors', () => {
126 | assert.throws(() => {
127 | getAST('a { @href }}');
128 | }, /Unexpected \}/);
129 |
130 | assert.throws(() => {
131 | getAST('li { @title, a { @href }');
132 | }, /Missing \}/);
133 |
134 | assert.throws(() => {
135 | getAST('a:is(a, b))');
136 | }, /Unexpected \)/);
137 |
138 | assert.throws(() => {
139 | getAST('li:not(a, b');
140 | }, /Missing \)/);
141 |
142 | assert.throws(() => {
143 | getAST('a @{href}');
144 | }, /after \@/);
145 |
146 | assert.throws(() => {
147 | getAST('a >>{href}');
148 | }, /after \>\>/);
149 | });
150 |
151 | test('^ (first)', () => {
152 | assert.deepEqual(traverse(...getAST('a[href^="#"]')), {
153 | ctx: 'a[href^="#"]'
154 | });
155 |
156 | assert.deepEqual(traverse(...getAST('a { ^ span }')), {
157 | ctx: 'a',
158 | children: [
159 | {
160 | ctx: 'span',
161 | first: true
162 | }
163 | ]
164 | });
165 | });
166 |
167 | test('attribute wildcard', () => {
168 | assert.deepEqual(traverse(...getAST('a @*')), { ctx: 'a', attr: '*' });
169 |
170 | assert.deepEqual(traverse(...getAST('a { @* => . }')), {
171 | ctx: 'a',
172 | children: [{ ctx: '', attr: '*', alias: '.' }]
173 | });
174 |
175 | assert.deepEqual(traverse(...getAST('a { ...@* }')), {
176 | ctx: 'a',
177 | children: [{ ctx: '', attr: '*', alias: '.' }]
178 | });
179 | });
180 |
--------------------------------------------------------------------------------
/test/index.test.js:
--------------------------------------------------------------------------------
1 | import test from 'node:test';
2 | import assert from 'node:assert';
3 | import qsx from '../src/index.js';
4 | import { dom } from './_util.js';
5 |
6 | test('qsx()', () => {
7 | let doc = dom(`
8 |
9 | - Term 1
10 | - VeryDef 1
11 |
12 | - Term w/o def
13 |
14 | - Term 2
15 | - VeryDef 2
16 |
17 |
18 | `);
19 |
20 | assert.deepStrictEqual(qsx(doc, 'dt { a, :scope + dd }'), [
21 | [
22 | [`Term 1`],
23 | [`VeryDef 1`]
24 | ],
25 | [[`Term w/o def`], []],
26 | [
27 | [`Term 2`],
28 | [`VeryDef 2`]
29 | ]
30 | ]);
31 |
32 | assert.deepStrictEqual(qsx(doc, 'a @href'), ['#1', '#wo', '#2']);
33 | });
34 |
35 | test('qsx() dont include .scoped when only attrs', () => {
36 | let doc = dom(`
37 |
38 | `);
39 | assert.deepStrictEqual(qsx(doc, 'img { @alt, @src }'), [
40 | { alt: 'alternative text', src: '/path' }
41 | ]);
42 | });
43 |
44 | test('README examples', () => {
45 | let headings = dom`
46 | Installation
47 | With npm
48 | With yarn
49 | Usage
50 | From the command-line
51 | `;
52 |
53 | assert.deepStrictEqual(qsx(headings, 'h2, h3'), [
54 | ['Installation
', 'Usage
'],
55 | [
56 | 'With npm
',
57 | 'With yarn
',
58 | 'From the command-line
'
59 | ]
60 | ]);
61 |
62 | assert.deepStrictEqual(qsx(headings, 'h2 => h2s, h3 => h3s'), {
63 | h2s: ['Installation
', 'Usage
'],
64 | h3s: [
65 | 'With npm
',
66 | 'With yarn
',
67 | 'From the command-line
'
68 | ]
69 | });
70 |
71 | // assert.deepStrictEqual(
72 | // qsx(headings, ':is(h2, h3)'),
73 | // ['Installation
', 'With npm
', 'With yarn
', 'Usage
', 'From the command-line
'],
74 | // ':is() behaves like normal CSS semantics'
75 | // );
76 |
77 | let table = dom(`
78 |
79 |
80 |
81 | 1.1 |
82 | 1.2 |
83 | 1.3 |
84 | 1.4 |
85 |
86 |
87 | 2.1 |
88 | 2.2 |
89 | 2.3 |
90 | 2.4 |
91 |
92 |
93 |
94 | `);
95 |
96 | assert.deepStrictEqual(
97 | qsx(table, 'tr { :scope > td:first-child, :scope > td:last-child }'),
98 | [
99 | [['1.1 | '], ['1.4 | ']],
100 | [['2.1 | '], ['2.4 | ']]
101 | ]
102 | );
103 |
104 | let links = dom(`
105 |
109 | `);
110 |
111 | assert.deepStrictEqual(qsx(links, 'a { @href, @.textContent }'), [
112 | { href: '/first-link', '.textContent': 'First link' },
113 | { href: '/second-link', '.textContent': 'Second link' }
114 | ]);
115 |
116 | assert.deepStrictEqual(qsx(links, 'a @.textContent'), [
117 | 'First link',
118 | 'Second link'
119 | ]);
120 |
121 | assert.deepStrictEqual(qsx(links, 'a { @.textContent }'), [
122 | { '.textContent': 'First link' },
123 | { '.textContent': 'Second link' }
124 | ]);
125 |
126 | assert.deepStrictEqual(qsx(links, `li { a, @title }`), [
127 | {
128 | title: 'item 1',
129 | '.scoped': ['First link']
130 | },
131 | {
132 | title: 'item 2',
133 | '.scoped': ['Second link']
134 | }
135 | ]);
136 |
137 | assert.deepStrictEqual(qsx(links, `li { a, @title }`), [
138 | {
139 | title: 'item 1',
140 | '.scoped': ['First link']
141 | },
142 | {
143 | title: 'item 2',
144 | '.scoped': ['Second link']
145 | }
146 | ]);
147 |
148 | assert.deepStrictEqual(qsx(links, `li { ^ a, @title }`), [
149 | {
150 | title: 'item 1',
151 | '.scoped': 'First link'
152 | },
153 | {
154 | title: 'item 2',
155 | '.scoped': 'Second link'
156 | }
157 | ]);
158 |
159 | let terms = dom(`
160 |
161 | - First term
162 | - First definition
163 |
164 | - Second term
165 | - Second definition
166 |
167 | `);
168 |
169 | assert.deepStrictEqual(
170 | qsx(
171 | terms,
172 | `dt {
173 | a { @href, @.textContent },
174 | :scope + dd @.textContent
175 | }`
176 | ),
177 | [
178 | [
179 | [
180 | {
181 | href: '#ref1',
182 | '.textContent': 'First term'
183 | }
184 | ],
185 | ['First definition']
186 | ],
187 | [
188 | [
189 | {
190 | href: '#ref2',
191 | '.textContent': 'Second term'
192 | }
193 | ],
194 | ['Second definition']
195 | ]
196 | ]
197 | );
198 | });
199 |
200 | test('aliases', () => {
201 | let table = dom(`
202 |
203 |
204 |
205 | 1.1 |
206 | 1.2 |
207 | 1.3 |
208 | 1.4 |
209 |
210 |
211 | 2.1 |
212 | 2.2 |
213 | 2.3 |
214 | 2.4 |
215 |
216 |
217 |
218 | `);
219 |
220 | assert.deepStrictEqual(
221 | qsx(table, 'tr { ^ td:first-child => first, ^ td:last-child => last }'),
222 | [
223 | { first: '1.1 | ', last: '1.4 | ' },
224 | { first: '2.1 | ', last: '2.4 | ' }
225 | ]
226 | );
227 |
228 | assert.deepStrictEqual(
229 | qsx(table, 'tr { td:first-child => first, td:last-child => last } => .'),
230 | { first: ['1.1 | '], last: ['1.4 | '] }
231 | );
232 |
233 | assert.deepStrictEqual(
234 | qsx(table, 'tr ...{ td:first-child => first, td:last-child }'),
235 | { first: ['1.1 | '], '.scoped': ['1.4 | '] }
236 | );
237 |
238 | assert.deepStrictEqual(
239 | qsx(
240 | table,
241 | 'tr { @title => caption, ^ td:first-child, ^ td:last-child } => cells'
242 | ),
243 | [
244 | {
245 | caption: 'Row 1',
246 | cells: ['1.1 | ', '1.4 | ']
247 | },
248 | {
249 | caption: 'Row 2',
250 | cells: ['2.1 | ', '2.4 | ']
251 | }
252 | ]
253 | );
254 |
255 | assert.deepStrictEqual(
256 | qsx(
257 | table,
258 | 'tr => cells { @title => caption, ^ td:first-child, ^ td:last-child }'
259 | ),
260 | [
261 | {
262 | caption: 'Row 1',
263 | cells: ['1.1 | ', '1.4 | ']
264 | },
265 | {
266 | caption: 'Row 2',
267 | cells: ['2.1 | ', '2.4 | ']
268 | }
269 | ]
270 | );
271 | });
272 |
273 | test('Netscape Bookmark File', () => {
274 | let nbf = dom(`
275 |
276 | - Link title
277 | - Description
278 |
279 | `);
280 |
281 | assert.deepStrictEqual(
282 | qsx(
283 | nbf,
284 | `dt {
285 | ^ a @add_date => dateAdded,
286 | ^ :scope + dd @.textConten() => description
287 | }`
288 | ),
289 | [
290 | {
291 | dateAdded: '123',
292 | description: 'Description'
293 | }
294 | ]
295 | );
296 |
297 | assert.deepStrictEqual(
298 | qsx(
299 | nbf,
300 | `dt {
301 | ^ a @add_date => dateAdded,
302 | :scope + dd ...{ @.textContent, @name }
303 | }`
304 | ),
305 | [
306 | {
307 | dateAdded: '123',
308 | name: 'descr',
309 | '.textContent': 'Description'
310 | }
311 | ]
312 | );
313 | });
314 |
315 | test('attribute wildcard', () => {
316 | let links = dom`
317 |
321 | `;
322 |
323 | assert.deepStrictEqual(
324 | qsx(links, 'a @*'),
325 | [
326 | { href: '#dummy', 'data-hello': 'world', attr: 'value' },
327 | { href: '#dummy2', 'data-hello': 'world2', attr: 'value2' }
328 | ],
329 | 'used at top level'
330 | );
331 |
332 | assert.deepStrictEqual(
333 | qsx(links, 'a { @* => . }'),
334 | [
335 | { href: '#dummy', 'data-hello': 'world', attr: 'value' },
336 | { href: '#dummy2', 'data-hello': 'world2', attr: 'value2' }
337 | ],
338 | 'spread via alias'
339 | );
340 |
341 | assert.deepStrictEqual(
342 | qsx(links, 'a { ...@* }'),
343 | [
344 | { href: '#dummy', 'data-hello': 'world', attr: 'value' },
345 | { href: '#dummy2', 'data-hello': 'world2', attr: 'value2' }
346 | ],
347 | 'spread via ellipsis'
348 | );
349 |
350 | assert.deepStrictEqual(qsx(links, 'a { @.textConten() => _tc, ...@* }'), [
351 | {
352 | _tc: 'text1',
353 | href: '#dummy',
354 | 'data-hello': 'world',
355 | attr: 'value'
356 | },
357 | {
358 | _tc: 'text2',
359 | href: '#dummy2',
360 | 'data-hello': 'world2',
361 | attr: 'value2'
362 | }
363 | ]);
364 |
365 | assert.deepStrictEqual(qsx(links, 'a { ...@*, @.textConten() => href }'), [
366 | { href: 'text1', 'data-hello': 'world', attr: 'value' },
367 | { href: 'text2', 'data-hello': 'world2', attr: 'value2' }
368 | ]);
369 |
370 | assert.deepStrictEqual(qsx(links, '^div { a @* }'), [
371 | { href: '#dummy', 'data-hello': 'world', attr: 'value' },
372 | { href: '#dummy2', 'data-hello': 'world2', attr: 'value2' }
373 | ]);
374 | });
375 |
--------------------------------------------------------------------------------