├── .github └── workflows │ ├── release.yml │ └── test.yml ├── .gitignore ├── license ├── logo.png ├── package-lock.json ├── package.json ├── readme.md ├── src ├── complexity.js ├── complexity.test.js ├── core.js ├── core.test.js ├── index.js ├── index.test.js ├── maintainability.js ├── maintainability.test.js ├── performance.js └── performance.test.js ├── tsconfig.json └── vite.config.js /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages 3 | 4 | name: NPM Publish 5 | 6 | on: 7 | release: 8 | types: [created] 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | - uses: actions/setup-node@v4 16 | with: 17 | cache: "npm" 18 | - run: npm install --no-fund --no-audit --ignore-scripts 19 | - run: npm run build 20 | - run: npm test 21 | 22 | publish-npm: 23 | needs: build 24 | runs-on: ubuntu-latest 25 | steps: 26 | - uses: actions/checkout@v4 27 | - uses: actions/setup-node@v4 28 | with: 29 | cache: "npm" 30 | registry-url: https://registry.npmjs.org/ 31 | - run: npm install --no-fund --no-audit --ignore-scripts 32 | - run: npm run build 33 | - run: npm publish 34 | env: 35 | NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 36 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Test 5 | 6 | on: 7 | push: 8 | branches: [main] 9 | pull_request: 10 | branches: [main] 11 | 12 | jobs: 13 | lint-js: 14 | name: Lint JS 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout code 18 | uses: actions/checkout@v4 19 | - name: Lint JS 20 | run: npx --yes oxlint@latest -D perf 21 | 22 | lint-package: 23 | name: Lint package 24 | runs-on: ubuntu-latest 25 | steps: 26 | - name: Checkout code 27 | uses: actions/checkout@v4 28 | - name: Use Node.js 29 | uses: actions/setup-node@v4 30 | with: 31 | cache: npm 32 | - run: npm install --no-fund --no-audit --ignore-scripts 33 | - run: npm run build 34 | - name: Run publint 35 | run: npx --yes publint 36 | 37 | check-types: 38 | name: Check types 39 | runs-on: ubuntu-latest 40 | steps: 41 | - name: Checkout code 42 | uses: actions/checkout@v4 43 | - name: Use Node.js 44 | uses: actions/setup-node@v4 45 | with: 46 | cache: npm 47 | - run: npm install --no-fund --no-audit --ignore-scripts 48 | - name: Check types 49 | run: npm run check 50 | 51 | test: 52 | name: Unit tests 53 | runs-on: ubuntu-latest 54 | steps: 55 | - uses: actions/checkout@v4 56 | - name: Use Node.js 57 | uses: actions/setup-node@v4 58 | with: 59 | cache: npm 60 | - run: npm install --no-fund --no-audit --ignore-scripts 61 | - run: npm run build 62 | - run: npm test 63 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .DS_Store -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Bart Veneman 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 13 | all 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 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/projectwallace/css-code-quality/39eb7b7090aa1ac80f91eb2b39361d32dec3f64f/logo.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@projectwallace/css-code-quality", 3 | "version": "3.0.2", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@projectwallace/css-code-quality", 9 | "version": "3.0.2", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@projectwallace/css-analyzer": "^7.1.1" 13 | }, 14 | "devDependencies": { 15 | "typescript": "^5.7.3", 16 | "uvu": "^0.5.6", 17 | "vite": "^6.2.0", 18 | "vite-plugin-dts": "^4.5.0" 19 | }, 20 | "engines": { 21 | "node": ">=16.0.0" 22 | } 23 | }, 24 | "node_modules/@babel/helper-string-parser": { 25 | "version": "7.25.9", 26 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 27 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 28 | "dev": true, 29 | "license": "MIT", 30 | "engines": { 31 | "node": ">=6.9.0" 32 | } 33 | }, 34 | "node_modules/@babel/helper-validator-identifier": { 35 | "version": "7.25.9", 36 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 37 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 38 | "dev": true, 39 | "license": "MIT", 40 | "engines": { 41 | "node": ">=6.9.0" 42 | } 43 | }, 44 | "node_modules/@babel/parser": { 45 | "version": "7.26.9", 46 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", 47 | "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", 48 | "dev": true, 49 | "license": "MIT", 50 | "dependencies": { 51 | "@babel/types": "^7.26.9" 52 | }, 53 | "bin": { 54 | "parser": "bin/babel-parser.js" 55 | }, 56 | "engines": { 57 | "node": ">=6.0.0" 58 | } 59 | }, 60 | "node_modules/@babel/types": { 61 | "version": "7.26.9", 62 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", 63 | "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", 64 | "dev": true, 65 | "license": "MIT", 66 | "dependencies": { 67 | "@babel/helper-string-parser": "^7.25.9", 68 | "@babel/helper-validator-identifier": "^7.25.9" 69 | }, 70 | "engines": { 71 | "node": ">=6.9.0" 72 | } 73 | }, 74 | "node_modules/@bramus/specificity": { 75 | "version": "2.4.2", 76 | "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", 77 | "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", 78 | "license": "MIT", 79 | "dependencies": { 80 | "css-tree": "^3.0.0" 81 | }, 82 | "bin": { 83 | "specificity": "bin/cli.js" 84 | } 85 | }, 86 | "node_modules/@esbuild/aix-ppc64": { 87 | "version": "0.25.0", 88 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", 89 | "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", 90 | "cpu": [ 91 | "ppc64" 92 | ], 93 | "dev": true, 94 | "license": "MIT", 95 | "optional": true, 96 | "os": [ 97 | "aix" 98 | ], 99 | "engines": { 100 | "node": ">=18" 101 | } 102 | }, 103 | "node_modules/@esbuild/android-arm": { 104 | "version": "0.25.0", 105 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", 106 | "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", 107 | "cpu": [ 108 | "arm" 109 | ], 110 | "dev": true, 111 | "license": "MIT", 112 | "optional": true, 113 | "os": [ 114 | "android" 115 | ], 116 | "engines": { 117 | "node": ">=18" 118 | } 119 | }, 120 | "node_modules/@esbuild/android-arm64": { 121 | "version": "0.25.0", 122 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", 123 | "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", 124 | "cpu": [ 125 | "arm64" 126 | ], 127 | "dev": true, 128 | "license": "MIT", 129 | "optional": true, 130 | "os": [ 131 | "android" 132 | ], 133 | "engines": { 134 | "node": ">=18" 135 | } 136 | }, 137 | "node_modules/@esbuild/android-x64": { 138 | "version": "0.25.0", 139 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", 140 | "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", 141 | "cpu": [ 142 | "x64" 143 | ], 144 | "dev": true, 145 | "license": "MIT", 146 | "optional": true, 147 | "os": [ 148 | "android" 149 | ], 150 | "engines": { 151 | "node": ">=18" 152 | } 153 | }, 154 | "node_modules/@esbuild/darwin-arm64": { 155 | "version": "0.25.0", 156 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", 157 | "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", 158 | "cpu": [ 159 | "arm64" 160 | ], 161 | "dev": true, 162 | "license": "MIT", 163 | "optional": true, 164 | "os": [ 165 | "darwin" 166 | ], 167 | "engines": { 168 | "node": ">=18" 169 | } 170 | }, 171 | "node_modules/@esbuild/darwin-x64": { 172 | "version": "0.25.0", 173 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", 174 | "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", 175 | "cpu": [ 176 | "x64" 177 | ], 178 | "dev": true, 179 | "license": "MIT", 180 | "optional": true, 181 | "os": [ 182 | "darwin" 183 | ], 184 | "engines": { 185 | "node": ">=18" 186 | } 187 | }, 188 | "node_modules/@esbuild/freebsd-arm64": { 189 | "version": "0.25.0", 190 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", 191 | "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", 192 | "cpu": [ 193 | "arm64" 194 | ], 195 | "dev": true, 196 | "license": "MIT", 197 | "optional": true, 198 | "os": [ 199 | "freebsd" 200 | ], 201 | "engines": { 202 | "node": ">=18" 203 | } 204 | }, 205 | "node_modules/@esbuild/freebsd-x64": { 206 | "version": "0.25.0", 207 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", 208 | "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", 209 | "cpu": [ 210 | "x64" 211 | ], 212 | "dev": true, 213 | "license": "MIT", 214 | "optional": true, 215 | "os": [ 216 | "freebsd" 217 | ], 218 | "engines": { 219 | "node": ">=18" 220 | } 221 | }, 222 | "node_modules/@esbuild/linux-arm": { 223 | "version": "0.25.0", 224 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", 225 | "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", 226 | "cpu": [ 227 | "arm" 228 | ], 229 | "dev": true, 230 | "license": "MIT", 231 | "optional": true, 232 | "os": [ 233 | "linux" 234 | ], 235 | "engines": { 236 | "node": ">=18" 237 | } 238 | }, 239 | "node_modules/@esbuild/linux-arm64": { 240 | "version": "0.25.0", 241 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", 242 | "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", 243 | "cpu": [ 244 | "arm64" 245 | ], 246 | "dev": true, 247 | "license": "MIT", 248 | "optional": true, 249 | "os": [ 250 | "linux" 251 | ], 252 | "engines": { 253 | "node": ">=18" 254 | } 255 | }, 256 | "node_modules/@esbuild/linux-ia32": { 257 | "version": "0.25.0", 258 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", 259 | "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", 260 | "cpu": [ 261 | "ia32" 262 | ], 263 | "dev": true, 264 | "license": "MIT", 265 | "optional": true, 266 | "os": [ 267 | "linux" 268 | ], 269 | "engines": { 270 | "node": ">=18" 271 | } 272 | }, 273 | "node_modules/@esbuild/linux-loong64": { 274 | "version": "0.25.0", 275 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", 276 | "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", 277 | "cpu": [ 278 | "loong64" 279 | ], 280 | "dev": true, 281 | "license": "MIT", 282 | "optional": true, 283 | "os": [ 284 | "linux" 285 | ], 286 | "engines": { 287 | "node": ">=18" 288 | } 289 | }, 290 | "node_modules/@esbuild/linux-mips64el": { 291 | "version": "0.25.0", 292 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", 293 | "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", 294 | "cpu": [ 295 | "mips64el" 296 | ], 297 | "dev": true, 298 | "license": "MIT", 299 | "optional": true, 300 | "os": [ 301 | "linux" 302 | ], 303 | "engines": { 304 | "node": ">=18" 305 | } 306 | }, 307 | "node_modules/@esbuild/linux-ppc64": { 308 | "version": "0.25.0", 309 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", 310 | "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", 311 | "cpu": [ 312 | "ppc64" 313 | ], 314 | "dev": true, 315 | "license": "MIT", 316 | "optional": true, 317 | "os": [ 318 | "linux" 319 | ], 320 | "engines": { 321 | "node": ">=18" 322 | } 323 | }, 324 | "node_modules/@esbuild/linux-riscv64": { 325 | "version": "0.25.0", 326 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", 327 | "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", 328 | "cpu": [ 329 | "riscv64" 330 | ], 331 | "dev": true, 332 | "license": "MIT", 333 | "optional": true, 334 | "os": [ 335 | "linux" 336 | ], 337 | "engines": { 338 | "node": ">=18" 339 | } 340 | }, 341 | "node_modules/@esbuild/linux-s390x": { 342 | "version": "0.25.0", 343 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", 344 | "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", 345 | "cpu": [ 346 | "s390x" 347 | ], 348 | "dev": true, 349 | "license": "MIT", 350 | "optional": true, 351 | "os": [ 352 | "linux" 353 | ], 354 | "engines": { 355 | "node": ">=18" 356 | } 357 | }, 358 | "node_modules/@esbuild/linux-x64": { 359 | "version": "0.25.0", 360 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", 361 | "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", 362 | "cpu": [ 363 | "x64" 364 | ], 365 | "dev": true, 366 | "license": "MIT", 367 | "optional": true, 368 | "os": [ 369 | "linux" 370 | ], 371 | "engines": { 372 | "node": ">=18" 373 | } 374 | }, 375 | "node_modules/@esbuild/netbsd-arm64": { 376 | "version": "0.25.0", 377 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", 378 | "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", 379 | "cpu": [ 380 | "arm64" 381 | ], 382 | "dev": true, 383 | "license": "MIT", 384 | "optional": true, 385 | "os": [ 386 | "netbsd" 387 | ], 388 | "engines": { 389 | "node": ">=18" 390 | } 391 | }, 392 | "node_modules/@esbuild/netbsd-x64": { 393 | "version": "0.25.0", 394 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", 395 | "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", 396 | "cpu": [ 397 | "x64" 398 | ], 399 | "dev": true, 400 | "license": "MIT", 401 | "optional": true, 402 | "os": [ 403 | "netbsd" 404 | ], 405 | "engines": { 406 | "node": ">=18" 407 | } 408 | }, 409 | "node_modules/@esbuild/openbsd-arm64": { 410 | "version": "0.25.0", 411 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", 412 | "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", 413 | "cpu": [ 414 | "arm64" 415 | ], 416 | "dev": true, 417 | "license": "MIT", 418 | "optional": true, 419 | "os": [ 420 | "openbsd" 421 | ], 422 | "engines": { 423 | "node": ">=18" 424 | } 425 | }, 426 | "node_modules/@esbuild/openbsd-x64": { 427 | "version": "0.25.0", 428 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", 429 | "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", 430 | "cpu": [ 431 | "x64" 432 | ], 433 | "dev": true, 434 | "license": "MIT", 435 | "optional": true, 436 | "os": [ 437 | "openbsd" 438 | ], 439 | "engines": { 440 | "node": ">=18" 441 | } 442 | }, 443 | "node_modules/@esbuild/sunos-x64": { 444 | "version": "0.25.0", 445 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", 446 | "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", 447 | "cpu": [ 448 | "x64" 449 | ], 450 | "dev": true, 451 | "license": "MIT", 452 | "optional": true, 453 | "os": [ 454 | "sunos" 455 | ], 456 | "engines": { 457 | "node": ">=18" 458 | } 459 | }, 460 | "node_modules/@esbuild/win32-arm64": { 461 | "version": "0.25.0", 462 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", 463 | "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", 464 | "cpu": [ 465 | "arm64" 466 | ], 467 | "dev": true, 468 | "license": "MIT", 469 | "optional": true, 470 | "os": [ 471 | "win32" 472 | ], 473 | "engines": { 474 | "node": ">=18" 475 | } 476 | }, 477 | "node_modules/@esbuild/win32-ia32": { 478 | "version": "0.25.0", 479 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", 480 | "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", 481 | "cpu": [ 482 | "ia32" 483 | ], 484 | "dev": true, 485 | "license": "MIT", 486 | "optional": true, 487 | "os": [ 488 | "win32" 489 | ], 490 | "engines": { 491 | "node": ">=18" 492 | } 493 | }, 494 | "node_modules/@esbuild/win32-x64": { 495 | "version": "0.25.0", 496 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", 497 | "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", 498 | "cpu": [ 499 | "x64" 500 | ], 501 | "dev": true, 502 | "license": "MIT", 503 | "optional": true, 504 | "os": [ 505 | "win32" 506 | ], 507 | "engines": { 508 | "node": ">=18" 509 | } 510 | }, 511 | "node_modules/@jridgewell/sourcemap-codec": { 512 | "version": "1.5.0", 513 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 514 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 515 | "dev": true, 516 | "license": "MIT" 517 | }, 518 | "node_modules/@microsoft/api-extractor": { 519 | "version": "7.50.1", 520 | "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.50.1.tgz", 521 | "integrity": "sha512-L18vz0ARLNaBLKwWe0DdEf7eijDsb7ERZspgZK7PxclLoQrc+9hJZo8y4OVfCHxNVyxlwVywY2WdE/3pOFViLQ==", 522 | "dev": true, 523 | "license": "MIT", 524 | "dependencies": { 525 | "@microsoft/api-extractor-model": "7.30.3", 526 | "@microsoft/tsdoc": "~0.15.1", 527 | "@microsoft/tsdoc-config": "~0.17.1", 528 | "@rushstack/node-core-library": "5.11.0", 529 | "@rushstack/rig-package": "0.5.3", 530 | "@rushstack/terminal": "0.15.0", 531 | "@rushstack/ts-command-line": "4.23.5", 532 | "lodash": "~4.17.15", 533 | "minimatch": "~3.0.3", 534 | "resolve": "~1.22.1", 535 | "semver": "~7.5.4", 536 | "source-map": "~0.6.1", 537 | "typescript": "5.7.3" 538 | }, 539 | "bin": { 540 | "api-extractor": "bin/api-extractor" 541 | } 542 | }, 543 | "node_modules/@microsoft/api-extractor-model": { 544 | "version": "7.30.3", 545 | "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.3.tgz", 546 | "integrity": "sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w==", 547 | "dev": true, 548 | "license": "MIT", 549 | "dependencies": { 550 | "@microsoft/tsdoc": "~0.15.1", 551 | "@microsoft/tsdoc-config": "~0.17.1", 552 | "@rushstack/node-core-library": "5.11.0" 553 | } 554 | }, 555 | "node_modules/@microsoft/tsdoc": { 556 | "version": "0.15.1", 557 | "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", 558 | "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", 559 | "dev": true, 560 | "license": "MIT" 561 | }, 562 | "node_modules/@microsoft/tsdoc-config": { 563 | "version": "0.17.1", 564 | "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", 565 | "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", 566 | "dev": true, 567 | "license": "MIT", 568 | "dependencies": { 569 | "@microsoft/tsdoc": "0.15.1", 570 | "ajv": "~8.12.0", 571 | "jju": "~1.4.0", 572 | "resolve": "~1.22.2" 573 | } 574 | }, 575 | "node_modules/@projectwallace/css-analyzer": { 576 | "version": "7.1.1", 577 | "resolved": "https://registry.npmjs.org/@projectwallace/css-analyzer/-/css-analyzer-7.1.1.tgz", 578 | "integrity": "sha512-p8mwFts19YsUT3HNiKYAuVguTOx0YehHyfVcH9KIzkqUIMhiB5HyxyJ9OzUeJaCQ2w/fpiPq3FeURH98YPEjWA==", 579 | "license": "MIT", 580 | "dependencies": { 581 | "@bramus/specificity": "^2.4.2", 582 | "css-tree": "^3.1.0" 583 | }, 584 | "engines": { 585 | "node": ">=18.0.0" 586 | } 587 | }, 588 | "node_modules/@rollup/pluginutils": { 589 | "version": "5.1.4", 590 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", 591 | "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", 592 | "dev": true, 593 | "license": "MIT", 594 | "dependencies": { 595 | "@types/estree": "^1.0.0", 596 | "estree-walker": "^2.0.2", 597 | "picomatch": "^4.0.2" 598 | }, 599 | "engines": { 600 | "node": ">=14.0.0" 601 | }, 602 | "peerDependencies": { 603 | "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 604 | }, 605 | "peerDependenciesMeta": { 606 | "rollup": { 607 | "optional": true 608 | } 609 | } 610 | }, 611 | "node_modules/@rollup/rollup-android-arm-eabi": { 612 | "version": "4.34.8", 613 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", 614 | "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", 615 | "cpu": [ 616 | "arm" 617 | ], 618 | "dev": true, 619 | "license": "MIT", 620 | "optional": true, 621 | "os": [ 622 | "android" 623 | ] 624 | }, 625 | "node_modules/@rollup/rollup-android-arm64": { 626 | "version": "4.34.8", 627 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", 628 | "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", 629 | "cpu": [ 630 | "arm64" 631 | ], 632 | "dev": true, 633 | "license": "MIT", 634 | "optional": true, 635 | "os": [ 636 | "android" 637 | ] 638 | }, 639 | "node_modules/@rollup/rollup-darwin-arm64": { 640 | "version": "4.34.8", 641 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", 642 | "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", 643 | "cpu": [ 644 | "arm64" 645 | ], 646 | "dev": true, 647 | "license": "MIT", 648 | "optional": true, 649 | "os": [ 650 | "darwin" 651 | ] 652 | }, 653 | "node_modules/@rollup/rollup-darwin-x64": { 654 | "version": "4.34.8", 655 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", 656 | "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", 657 | "cpu": [ 658 | "x64" 659 | ], 660 | "dev": true, 661 | "license": "MIT", 662 | "optional": true, 663 | "os": [ 664 | "darwin" 665 | ] 666 | }, 667 | "node_modules/@rollup/rollup-freebsd-arm64": { 668 | "version": "4.34.8", 669 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", 670 | "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", 671 | "cpu": [ 672 | "arm64" 673 | ], 674 | "dev": true, 675 | "license": "MIT", 676 | "optional": true, 677 | "os": [ 678 | "freebsd" 679 | ] 680 | }, 681 | "node_modules/@rollup/rollup-freebsd-x64": { 682 | "version": "4.34.8", 683 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", 684 | "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", 685 | "cpu": [ 686 | "x64" 687 | ], 688 | "dev": true, 689 | "license": "MIT", 690 | "optional": true, 691 | "os": [ 692 | "freebsd" 693 | ] 694 | }, 695 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 696 | "version": "4.34.8", 697 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", 698 | "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", 699 | "cpu": [ 700 | "arm" 701 | ], 702 | "dev": true, 703 | "license": "MIT", 704 | "optional": true, 705 | "os": [ 706 | "linux" 707 | ] 708 | }, 709 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 710 | "version": "4.34.8", 711 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", 712 | "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", 713 | "cpu": [ 714 | "arm" 715 | ], 716 | "dev": true, 717 | "license": "MIT", 718 | "optional": true, 719 | "os": [ 720 | "linux" 721 | ] 722 | }, 723 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 724 | "version": "4.34.8", 725 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", 726 | "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", 727 | "cpu": [ 728 | "arm64" 729 | ], 730 | "dev": true, 731 | "license": "MIT", 732 | "optional": true, 733 | "os": [ 734 | "linux" 735 | ] 736 | }, 737 | "node_modules/@rollup/rollup-linux-arm64-musl": { 738 | "version": "4.34.8", 739 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", 740 | "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", 741 | "cpu": [ 742 | "arm64" 743 | ], 744 | "dev": true, 745 | "license": "MIT", 746 | "optional": true, 747 | "os": [ 748 | "linux" 749 | ] 750 | }, 751 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 752 | "version": "4.34.8", 753 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", 754 | "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", 755 | "cpu": [ 756 | "loong64" 757 | ], 758 | "dev": true, 759 | "license": "MIT", 760 | "optional": true, 761 | "os": [ 762 | "linux" 763 | ] 764 | }, 765 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 766 | "version": "4.34.8", 767 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", 768 | "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", 769 | "cpu": [ 770 | "ppc64" 771 | ], 772 | "dev": true, 773 | "license": "MIT", 774 | "optional": true, 775 | "os": [ 776 | "linux" 777 | ] 778 | }, 779 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 780 | "version": "4.34.8", 781 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", 782 | "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", 783 | "cpu": [ 784 | "riscv64" 785 | ], 786 | "dev": true, 787 | "license": "MIT", 788 | "optional": true, 789 | "os": [ 790 | "linux" 791 | ] 792 | }, 793 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 794 | "version": "4.34.8", 795 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", 796 | "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", 797 | "cpu": [ 798 | "s390x" 799 | ], 800 | "dev": true, 801 | "license": "MIT", 802 | "optional": true, 803 | "os": [ 804 | "linux" 805 | ] 806 | }, 807 | "node_modules/@rollup/rollup-linux-x64-gnu": { 808 | "version": "4.34.8", 809 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", 810 | "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", 811 | "cpu": [ 812 | "x64" 813 | ], 814 | "dev": true, 815 | "license": "MIT", 816 | "optional": true, 817 | "os": [ 818 | "linux" 819 | ] 820 | }, 821 | "node_modules/@rollup/rollup-linux-x64-musl": { 822 | "version": "4.34.8", 823 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", 824 | "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", 825 | "cpu": [ 826 | "x64" 827 | ], 828 | "dev": true, 829 | "license": "MIT", 830 | "optional": true, 831 | "os": [ 832 | "linux" 833 | ] 834 | }, 835 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 836 | "version": "4.34.8", 837 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", 838 | "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", 839 | "cpu": [ 840 | "arm64" 841 | ], 842 | "dev": true, 843 | "license": "MIT", 844 | "optional": true, 845 | "os": [ 846 | "win32" 847 | ] 848 | }, 849 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 850 | "version": "4.34.8", 851 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", 852 | "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", 853 | "cpu": [ 854 | "ia32" 855 | ], 856 | "dev": true, 857 | "license": "MIT", 858 | "optional": true, 859 | "os": [ 860 | "win32" 861 | ] 862 | }, 863 | "node_modules/@rollup/rollup-win32-x64-msvc": { 864 | "version": "4.34.8", 865 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", 866 | "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", 867 | "cpu": [ 868 | "x64" 869 | ], 870 | "dev": true, 871 | "license": "MIT", 872 | "optional": true, 873 | "os": [ 874 | "win32" 875 | ] 876 | }, 877 | "node_modules/@rushstack/node-core-library": { 878 | "version": "5.11.0", 879 | "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.11.0.tgz", 880 | "integrity": "sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==", 881 | "dev": true, 882 | "license": "MIT", 883 | "dependencies": { 884 | "ajv": "~8.13.0", 885 | "ajv-draft-04": "~1.0.0", 886 | "ajv-formats": "~3.0.1", 887 | "fs-extra": "~11.3.0", 888 | "import-lazy": "~4.0.0", 889 | "jju": "~1.4.0", 890 | "resolve": "~1.22.1", 891 | "semver": "~7.5.4" 892 | }, 893 | "peerDependencies": { 894 | "@types/node": "*" 895 | }, 896 | "peerDependenciesMeta": { 897 | "@types/node": { 898 | "optional": true 899 | } 900 | } 901 | }, 902 | "node_modules/@rushstack/node-core-library/node_modules/ajv": { 903 | "version": "8.13.0", 904 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", 905 | "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", 906 | "dev": true, 907 | "license": "MIT", 908 | "dependencies": { 909 | "fast-deep-equal": "^3.1.3", 910 | "json-schema-traverse": "^1.0.0", 911 | "require-from-string": "^2.0.2", 912 | "uri-js": "^4.4.1" 913 | }, 914 | "funding": { 915 | "type": "github", 916 | "url": "https://github.com/sponsors/epoberezkin" 917 | } 918 | }, 919 | "node_modules/@rushstack/rig-package": { 920 | "version": "0.5.3", 921 | "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", 922 | "integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==", 923 | "dev": true, 924 | "license": "MIT", 925 | "dependencies": { 926 | "resolve": "~1.22.1", 927 | "strip-json-comments": "~3.1.1" 928 | } 929 | }, 930 | "node_modules/@rushstack/terminal": { 931 | "version": "0.15.0", 932 | "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.0.tgz", 933 | "integrity": "sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q==", 934 | "dev": true, 935 | "license": "MIT", 936 | "dependencies": { 937 | "@rushstack/node-core-library": "5.11.0", 938 | "supports-color": "~8.1.1" 939 | }, 940 | "peerDependencies": { 941 | "@types/node": "*" 942 | }, 943 | "peerDependenciesMeta": { 944 | "@types/node": { 945 | "optional": true 946 | } 947 | } 948 | }, 949 | "node_modules/@rushstack/ts-command-line": { 950 | "version": "4.23.5", 951 | "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.5.tgz", 952 | "integrity": "sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA==", 953 | "dev": true, 954 | "license": "MIT", 955 | "dependencies": { 956 | "@rushstack/terminal": "0.15.0", 957 | "@types/argparse": "1.0.38", 958 | "argparse": "~1.0.9", 959 | "string-argv": "~0.3.1" 960 | } 961 | }, 962 | "node_modules/@types/argparse": { 963 | "version": "1.0.38", 964 | "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", 965 | "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", 966 | "dev": true, 967 | "license": "MIT" 968 | }, 969 | "node_modules/@types/estree": { 970 | "version": "1.0.6", 971 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 972 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 973 | "dev": true, 974 | "license": "MIT" 975 | }, 976 | "node_modules/@volar/language-core": { 977 | "version": "2.4.11", 978 | "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", 979 | "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", 980 | "dev": true, 981 | "license": "MIT", 982 | "dependencies": { 983 | "@volar/source-map": "2.4.11" 984 | } 985 | }, 986 | "node_modules/@volar/source-map": { 987 | "version": "2.4.11", 988 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", 989 | "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", 990 | "dev": true, 991 | "license": "MIT" 992 | }, 993 | "node_modules/@volar/typescript": { 994 | "version": "2.4.11", 995 | "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", 996 | "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", 997 | "dev": true, 998 | "license": "MIT", 999 | "dependencies": { 1000 | "@volar/language-core": "2.4.11", 1001 | "path-browserify": "^1.0.1", 1002 | "vscode-uri": "^3.0.8" 1003 | } 1004 | }, 1005 | "node_modules/@vue/compiler-core": { 1006 | "version": "3.5.13", 1007 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", 1008 | "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", 1009 | "dev": true, 1010 | "license": "MIT", 1011 | "dependencies": { 1012 | "@babel/parser": "^7.25.3", 1013 | "@vue/shared": "3.5.13", 1014 | "entities": "^4.5.0", 1015 | "estree-walker": "^2.0.2", 1016 | "source-map-js": "^1.2.0" 1017 | } 1018 | }, 1019 | "node_modules/@vue/compiler-dom": { 1020 | "version": "3.5.13", 1021 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", 1022 | "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", 1023 | "dev": true, 1024 | "license": "MIT", 1025 | "dependencies": { 1026 | "@vue/compiler-core": "3.5.13", 1027 | "@vue/shared": "3.5.13" 1028 | } 1029 | }, 1030 | "node_modules/@vue/compiler-vue2": { 1031 | "version": "2.7.16", 1032 | "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", 1033 | "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", 1034 | "dev": true, 1035 | "license": "MIT", 1036 | "dependencies": { 1037 | "de-indent": "^1.0.2", 1038 | "he": "^1.2.0" 1039 | } 1040 | }, 1041 | "node_modules/@vue/language-core": { 1042 | "version": "2.2.0", 1043 | "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", 1044 | "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", 1045 | "dev": true, 1046 | "license": "MIT", 1047 | "dependencies": { 1048 | "@volar/language-core": "~2.4.11", 1049 | "@vue/compiler-dom": "^3.5.0", 1050 | "@vue/compiler-vue2": "^2.7.16", 1051 | "@vue/shared": "^3.5.0", 1052 | "alien-signals": "^0.4.9", 1053 | "minimatch": "^9.0.3", 1054 | "muggle-string": "^0.4.1", 1055 | "path-browserify": "^1.0.1" 1056 | }, 1057 | "peerDependencies": { 1058 | "typescript": "*" 1059 | }, 1060 | "peerDependenciesMeta": { 1061 | "typescript": { 1062 | "optional": true 1063 | } 1064 | } 1065 | }, 1066 | "node_modules/@vue/language-core/node_modules/brace-expansion": { 1067 | "version": "2.0.1", 1068 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1069 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1070 | "dev": true, 1071 | "license": "MIT", 1072 | "dependencies": { 1073 | "balanced-match": "^1.0.0" 1074 | } 1075 | }, 1076 | "node_modules/@vue/language-core/node_modules/minimatch": { 1077 | "version": "9.0.5", 1078 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1079 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1080 | "dev": true, 1081 | "license": "ISC", 1082 | "dependencies": { 1083 | "brace-expansion": "^2.0.1" 1084 | }, 1085 | "engines": { 1086 | "node": ">=16 || 14 >=14.17" 1087 | }, 1088 | "funding": { 1089 | "url": "https://github.com/sponsors/isaacs" 1090 | } 1091 | }, 1092 | "node_modules/@vue/shared": { 1093 | "version": "3.5.13", 1094 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", 1095 | "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", 1096 | "dev": true, 1097 | "license": "MIT" 1098 | }, 1099 | "node_modules/acorn": { 1100 | "version": "8.14.0", 1101 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1102 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1103 | "dev": true, 1104 | "license": "MIT", 1105 | "bin": { 1106 | "acorn": "bin/acorn" 1107 | }, 1108 | "engines": { 1109 | "node": ">=0.4.0" 1110 | } 1111 | }, 1112 | "node_modules/ajv": { 1113 | "version": "8.12.0", 1114 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", 1115 | "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", 1116 | "dev": true, 1117 | "license": "MIT", 1118 | "dependencies": { 1119 | "fast-deep-equal": "^3.1.1", 1120 | "json-schema-traverse": "^1.0.0", 1121 | "require-from-string": "^2.0.2", 1122 | "uri-js": "^4.2.2" 1123 | }, 1124 | "funding": { 1125 | "type": "github", 1126 | "url": "https://github.com/sponsors/epoberezkin" 1127 | } 1128 | }, 1129 | "node_modules/ajv-draft-04": { 1130 | "version": "1.0.0", 1131 | "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", 1132 | "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", 1133 | "dev": true, 1134 | "license": "MIT", 1135 | "peerDependencies": { 1136 | "ajv": "^8.5.0" 1137 | }, 1138 | "peerDependenciesMeta": { 1139 | "ajv": { 1140 | "optional": true 1141 | } 1142 | } 1143 | }, 1144 | "node_modules/ajv-formats": { 1145 | "version": "3.0.1", 1146 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", 1147 | "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", 1148 | "dev": true, 1149 | "license": "MIT", 1150 | "dependencies": { 1151 | "ajv": "^8.0.0" 1152 | }, 1153 | "peerDependencies": { 1154 | "ajv": "^8.0.0" 1155 | }, 1156 | "peerDependenciesMeta": { 1157 | "ajv": { 1158 | "optional": true 1159 | } 1160 | } 1161 | }, 1162 | "node_modules/alien-signals": { 1163 | "version": "0.4.14", 1164 | "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", 1165 | "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", 1166 | "dev": true, 1167 | "license": "MIT" 1168 | }, 1169 | "node_modules/argparse": { 1170 | "version": "1.0.10", 1171 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 1172 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 1173 | "dev": true, 1174 | "license": "MIT", 1175 | "dependencies": { 1176 | "sprintf-js": "~1.0.2" 1177 | } 1178 | }, 1179 | "node_modules/balanced-match": { 1180 | "version": "1.0.2", 1181 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1182 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1183 | "dev": true, 1184 | "license": "MIT" 1185 | }, 1186 | "node_modules/brace-expansion": { 1187 | "version": "1.1.11", 1188 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1189 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1190 | "dev": true, 1191 | "license": "MIT", 1192 | "dependencies": { 1193 | "balanced-match": "^1.0.0", 1194 | "concat-map": "0.0.1" 1195 | } 1196 | }, 1197 | "node_modules/compare-versions": { 1198 | "version": "6.1.1", 1199 | "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", 1200 | "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", 1201 | "dev": true, 1202 | "license": "MIT" 1203 | }, 1204 | "node_modules/concat-map": { 1205 | "version": "0.0.1", 1206 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1207 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1208 | "dev": true, 1209 | "license": "MIT" 1210 | }, 1211 | "node_modules/confbox": { 1212 | "version": "0.1.8", 1213 | "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", 1214 | "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", 1215 | "dev": true, 1216 | "license": "MIT" 1217 | }, 1218 | "node_modules/css-tree": { 1219 | "version": "3.1.0", 1220 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", 1221 | "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", 1222 | "license": "MIT", 1223 | "dependencies": { 1224 | "mdn-data": "2.12.2", 1225 | "source-map-js": "^1.0.1" 1226 | }, 1227 | "engines": { 1228 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 1229 | } 1230 | }, 1231 | "node_modules/de-indent": { 1232 | "version": "1.0.2", 1233 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", 1234 | "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", 1235 | "dev": true, 1236 | "license": "MIT" 1237 | }, 1238 | "node_modules/debug": { 1239 | "version": "4.4.0", 1240 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1241 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1242 | "dev": true, 1243 | "license": "MIT", 1244 | "dependencies": { 1245 | "ms": "^2.1.3" 1246 | }, 1247 | "engines": { 1248 | "node": ">=6.0" 1249 | }, 1250 | "peerDependenciesMeta": { 1251 | "supports-color": { 1252 | "optional": true 1253 | } 1254 | } 1255 | }, 1256 | "node_modules/dequal": { 1257 | "version": "2.0.2", 1258 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", 1259 | "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", 1260 | "dev": true, 1261 | "engines": { 1262 | "node": ">=6" 1263 | } 1264 | }, 1265 | "node_modules/diff": { 1266 | "version": "5.0.0", 1267 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 1268 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 1269 | "dev": true, 1270 | "engines": { 1271 | "node": ">=0.3.1" 1272 | } 1273 | }, 1274 | "node_modules/entities": { 1275 | "version": "4.5.0", 1276 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 1277 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 1278 | "dev": true, 1279 | "license": "BSD-2-Clause", 1280 | "engines": { 1281 | "node": ">=0.12" 1282 | }, 1283 | "funding": { 1284 | "url": "https://github.com/fb55/entities?sponsor=1" 1285 | } 1286 | }, 1287 | "node_modules/esbuild": { 1288 | "version": "0.25.0", 1289 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", 1290 | "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", 1291 | "dev": true, 1292 | "hasInstallScript": true, 1293 | "license": "MIT", 1294 | "bin": { 1295 | "esbuild": "bin/esbuild" 1296 | }, 1297 | "engines": { 1298 | "node": ">=18" 1299 | }, 1300 | "optionalDependencies": { 1301 | "@esbuild/aix-ppc64": "0.25.0", 1302 | "@esbuild/android-arm": "0.25.0", 1303 | "@esbuild/android-arm64": "0.25.0", 1304 | "@esbuild/android-x64": "0.25.0", 1305 | "@esbuild/darwin-arm64": "0.25.0", 1306 | "@esbuild/darwin-x64": "0.25.0", 1307 | "@esbuild/freebsd-arm64": "0.25.0", 1308 | "@esbuild/freebsd-x64": "0.25.0", 1309 | "@esbuild/linux-arm": "0.25.0", 1310 | "@esbuild/linux-arm64": "0.25.0", 1311 | "@esbuild/linux-ia32": "0.25.0", 1312 | "@esbuild/linux-loong64": "0.25.0", 1313 | "@esbuild/linux-mips64el": "0.25.0", 1314 | "@esbuild/linux-ppc64": "0.25.0", 1315 | "@esbuild/linux-riscv64": "0.25.0", 1316 | "@esbuild/linux-s390x": "0.25.0", 1317 | "@esbuild/linux-x64": "0.25.0", 1318 | "@esbuild/netbsd-arm64": "0.25.0", 1319 | "@esbuild/netbsd-x64": "0.25.0", 1320 | "@esbuild/openbsd-arm64": "0.25.0", 1321 | "@esbuild/openbsd-x64": "0.25.0", 1322 | "@esbuild/sunos-x64": "0.25.0", 1323 | "@esbuild/win32-arm64": "0.25.0", 1324 | "@esbuild/win32-ia32": "0.25.0", 1325 | "@esbuild/win32-x64": "0.25.0" 1326 | } 1327 | }, 1328 | "node_modules/estree-walker": { 1329 | "version": "2.0.2", 1330 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1331 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1332 | "dev": true, 1333 | "license": "MIT" 1334 | }, 1335 | "node_modules/fast-deep-equal": { 1336 | "version": "3.1.3", 1337 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1338 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1339 | "dev": true, 1340 | "license": "MIT" 1341 | }, 1342 | "node_modules/fs-extra": { 1343 | "version": "11.3.0", 1344 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", 1345 | "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", 1346 | "dev": true, 1347 | "license": "MIT", 1348 | "dependencies": { 1349 | "graceful-fs": "^4.2.0", 1350 | "jsonfile": "^6.0.1", 1351 | "universalify": "^2.0.0" 1352 | }, 1353 | "engines": { 1354 | "node": ">=14.14" 1355 | } 1356 | }, 1357 | "node_modules/fsevents": { 1358 | "version": "2.3.3", 1359 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1360 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1361 | "dev": true, 1362 | "hasInstallScript": true, 1363 | "optional": true, 1364 | "os": [ 1365 | "darwin" 1366 | ], 1367 | "engines": { 1368 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1369 | } 1370 | }, 1371 | "node_modules/function-bind": { 1372 | "version": "1.1.2", 1373 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1374 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1375 | "dev": true, 1376 | "license": "MIT", 1377 | "funding": { 1378 | "url": "https://github.com/sponsors/ljharb" 1379 | } 1380 | }, 1381 | "node_modules/graceful-fs": { 1382 | "version": "4.2.11", 1383 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1384 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1385 | "dev": true, 1386 | "license": "ISC" 1387 | }, 1388 | "node_modules/has-flag": { 1389 | "version": "4.0.0", 1390 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1391 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1392 | "dev": true, 1393 | "license": "MIT", 1394 | "engines": { 1395 | "node": ">=8" 1396 | } 1397 | }, 1398 | "node_modules/hasown": { 1399 | "version": "2.0.2", 1400 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1401 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1402 | "dev": true, 1403 | "license": "MIT", 1404 | "dependencies": { 1405 | "function-bind": "^1.1.2" 1406 | }, 1407 | "engines": { 1408 | "node": ">= 0.4" 1409 | } 1410 | }, 1411 | "node_modules/he": { 1412 | "version": "1.2.0", 1413 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1414 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1415 | "dev": true, 1416 | "license": "MIT", 1417 | "bin": { 1418 | "he": "bin/he" 1419 | } 1420 | }, 1421 | "node_modules/import-lazy": { 1422 | "version": "4.0.0", 1423 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", 1424 | "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", 1425 | "dev": true, 1426 | "license": "MIT", 1427 | "engines": { 1428 | "node": ">=8" 1429 | } 1430 | }, 1431 | "node_modules/is-core-module": { 1432 | "version": "2.16.1", 1433 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 1434 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 1435 | "dev": true, 1436 | "license": "MIT", 1437 | "dependencies": { 1438 | "hasown": "^2.0.2" 1439 | }, 1440 | "engines": { 1441 | "node": ">= 0.4" 1442 | }, 1443 | "funding": { 1444 | "url": "https://github.com/sponsors/ljharb" 1445 | } 1446 | }, 1447 | "node_modules/jju": { 1448 | "version": "1.4.0", 1449 | "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", 1450 | "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", 1451 | "dev": true, 1452 | "license": "MIT" 1453 | }, 1454 | "node_modules/json-schema-traverse": { 1455 | "version": "1.0.0", 1456 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1457 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 1458 | "dev": true, 1459 | "license": "MIT" 1460 | }, 1461 | "node_modules/jsonfile": { 1462 | "version": "6.1.0", 1463 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 1464 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 1465 | "dev": true, 1466 | "license": "MIT", 1467 | "dependencies": { 1468 | "universalify": "^2.0.0" 1469 | }, 1470 | "optionalDependencies": { 1471 | "graceful-fs": "^4.1.6" 1472 | } 1473 | }, 1474 | "node_modules/kleur": { 1475 | "version": "4.1.4", 1476 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", 1477 | "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", 1478 | "dev": true, 1479 | "engines": { 1480 | "node": ">=6" 1481 | } 1482 | }, 1483 | "node_modules/kolorist": { 1484 | "version": "1.8.0", 1485 | "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", 1486 | "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", 1487 | "dev": true 1488 | }, 1489 | "node_modules/local-pkg": { 1490 | "version": "0.5.1", 1491 | "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", 1492 | "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", 1493 | "dev": true, 1494 | "license": "MIT", 1495 | "dependencies": { 1496 | "mlly": "^1.7.3", 1497 | "pkg-types": "^1.2.1" 1498 | }, 1499 | "engines": { 1500 | "node": ">=14" 1501 | }, 1502 | "funding": { 1503 | "url": "https://github.com/sponsors/antfu" 1504 | } 1505 | }, 1506 | "node_modules/lodash": { 1507 | "version": "4.17.21", 1508 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1509 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1510 | "dev": true, 1511 | "license": "MIT" 1512 | }, 1513 | "node_modules/lru-cache": { 1514 | "version": "6.0.0", 1515 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1516 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1517 | "dev": true, 1518 | "license": "ISC", 1519 | "dependencies": { 1520 | "yallist": "^4.0.0" 1521 | }, 1522 | "engines": { 1523 | "node": ">=10" 1524 | } 1525 | }, 1526 | "node_modules/magic-string": { 1527 | "version": "0.30.17", 1528 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 1529 | "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 1530 | "dev": true, 1531 | "license": "MIT", 1532 | "dependencies": { 1533 | "@jridgewell/sourcemap-codec": "^1.5.0" 1534 | } 1535 | }, 1536 | "node_modules/mdn-data": { 1537 | "version": "2.12.2", 1538 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", 1539 | "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", 1540 | "license": "CC0-1.0" 1541 | }, 1542 | "node_modules/minimatch": { 1543 | "version": "3.0.8", 1544 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 1545 | "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 1546 | "dev": true, 1547 | "license": "ISC", 1548 | "dependencies": { 1549 | "brace-expansion": "^1.1.7" 1550 | }, 1551 | "engines": { 1552 | "node": "*" 1553 | } 1554 | }, 1555 | "node_modules/mlly": { 1556 | "version": "1.7.4", 1557 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", 1558 | "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", 1559 | "dev": true, 1560 | "license": "MIT", 1561 | "dependencies": { 1562 | "acorn": "^8.14.0", 1563 | "pathe": "^2.0.1", 1564 | "pkg-types": "^1.3.0", 1565 | "ufo": "^1.5.4" 1566 | } 1567 | }, 1568 | "node_modules/mri": { 1569 | "version": "1.2.0", 1570 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1571 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1572 | "dev": true, 1573 | "engines": { 1574 | "node": ">=4" 1575 | } 1576 | }, 1577 | "node_modules/ms": { 1578 | "version": "2.1.3", 1579 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1580 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1581 | "dev": true, 1582 | "license": "MIT" 1583 | }, 1584 | "node_modules/muggle-string": { 1585 | "version": "0.4.1", 1586 | "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", 1587 | "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", 1588 | "dev": true, 1589 | "license": "MIT" 1590 | }, 1591 | "node_modules/nanoid": { 1592 | "version": "3.3.8", 1593 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 1594 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 1595 | "dev": true, 1596 | "funding": [ 1597 | { 1598 | "type": "github", 1599 | "url": "https://github.com/sponsors/ai" 1600 | } 1601 | ], 1602 | "license": "MIT", 1603 | "bin": { 1604 | "nanoid": "bin/nanoid.cjs" 1605 | }, 1606 | "engines": { 1607 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1608 | } 1609 | }, 1610 | "node_modules/path-browserify": { 1611 | "version": "1.0.1", 1612 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 1613 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 1614 | "dev": true, 1615 | "license": "MIT" 1616 | }, 1617 | "node_modules/path-parse": { 1618 | "version": "1.0.7", 1619 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1620 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1621 | "dev": true, 1622 | "license": "MIT" 1623 | }, 1624 | "node_modules/pathe": { 1625 | "version": "2.0.3", 1626 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 1627 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 1628 | "dev": true, 1629 | "license": "MIT" 1630 | }, 1631 | "node_modules/picocolors": { 1632 | "version": "1.1.1", 1633 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1634 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1635 | "dev": true, 1636 | "license": "ISC" 1637 | }, 1638 | "node_modules/picomatch": { 1639 | "version": "4.0.2", 1640 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1641 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1642 | "dev": true, 1643 | "license": "MIT", 1644 | "engines": { 1645 | "node": ">=12" 1646 | }, 1647 | "funding": { 1648 | "url": "https://github.com/sponsors/jonschlinkert" 1649 | } 1650 | }, 1651 | "node_modules/pkg-types": { 1652 | "version": "1.3.1", 1653 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", 1654 | "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", 1655 | "dev": true, 1656 | "license": "MIT", 1657 | "dependencies": { 1658 | "confbox": "^0.1.8", 1659 | "mlly": "^1.7.4", 1660 | "pathe": "^2.0.1" 1661 | } 1662 | }, 1663 | "node_modules/postcss": { 1664 | "version": "8.5.3", 1665 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 1666 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1667 | "dev": true, 1668 | "funding": [ 1669 | { 1670 | "type": "opencollective", 1671 | "url": "https://opencollective.com/postcss/" 1672 | }, 1673 | { 1674 | "type": "tidelift", 1675 | "url": "https://tidelift.com/funding/github/npm/postcss" 1676 | }, 1677 | { 1678 | "type": "github", 1679 | "url": "https://github.com/sponsors/ai" 1680 | } 1681 | ], 1682 | "license": "MIT", 1683 | "dependencies": { 1684 | "nanoid": "^3.3.8", 1685 | "picocolors": "^1.1.1", 1686 | "source-map-js": "^1.2.1" 1687 | }, 1688 | "engines": { 1689 | "node": "^10 || ^12 || >=14" 1690 | } 1691 | }, 1692 | "node_modules/punycode": { 1693 | "version": "2.3.1", 1694 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1695 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1696 | "dev": true, 1697 | "license": "MIT", 1698 | "engines": { 1699 | "node": ">=6" 1700 | } 1701 | }, 1702 | "node_modules/require-from-string": { 1703 | "version": "2.0.2", 1704 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1705 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1706 | "dev": true, 1707 | "license": "MIT", 1708 | "engines": { 1709 | "node": ">=0.10.0" 1710 | } 1711 | }, 1712 | "node_modules/resolve": { 1713 | "version": "1.22.10", 1714 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 1715 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 1716 | "dev": true, 1717 | "license": "MIT", 1718 | "dependencies": { 1719 | "is-core-module": "^2.16.0", 1720 | "path-parse": "^1.0.7", 1721 | "supports-preserve-symlinks-flag": "^1.0.0" 1722 | }, 1723 | "bin": { 1724 | "resolve": "bin/resolve" 1725 | }, 1726 | "engines": { 1727 | "node": ">= 0.4" 1728 | }, 1729 | "funding": { 1730 | "url": "https://github.com/sponsors/ljharb" 1731 | } 1732 | }, 1733 | "node_modules/rollup": { 1734 | "version": "4.34.8", 1735 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", 1736 | "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", 1737 | "dev": true, 1738 | "license": "MIT", 1739 | "dependencies": { 1740 | "@types/estree": "1.0.6" 1741 | }, 1742 | "bin": { 1743 | "rollup": "dist/bin/rollup" 1744 | }, 1745 | "engines": { 1746 | "node": ">=18.0.0", 1747 | "npm": ">=8.0.0" 1748 | }, 1749 | "optionalDependencies": { 1750 | "@rollup/rollup-android-arm-eabi": "4.34.8", 1751 | "@rollup/rollup-android-arm64": "4.34.8", 1752 | "@rollup/rollup-darwin-arm64": "4.34.8", 1753 | "@rollup/rollup-darwin-x64": "4.34.8", 1754 | "@rollup/rollup-freebsd-arm64": "4.34.8", 1755 | "@rollup/rollup-freebsd-x64": "4.34.8", 1756 | "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", 1757 | "@rollup/rollup-linux-arm-musleabihf": "4.34.8", 1758 | "@rollup/rollup-linux-arm64-gnu": "4.34.8", 1759 | "@rollup/rollup-linux-arm64-musl": "4.34.8", 1760 | "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", 1761 | "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", 1762 | "@rollup/rollup-linux-riscv64-gnu": "4.34.8", 1763 | "@rollup/rollup-linux-s390x-gnu": "4.34.8", 1764 | "@rollup/rollup-linux-x64-gnu": "4.34.8", 1765 | "@rollup/rollup-linux-x64-musl": "4.34.8", 1766 | "@rollup/rollup-win32-arm64-msvc": "4.34.8", 1767 | "@rollup/rollup-win32-ia32-msvc": "4.34.8", 1768 | "@rollup/rollup-win32-x64-msvc": "4.34.8", 1769 | "fsevents": "~2.3.2" 1770 | } 1771 | }, 1772 | "node_modules/sade": { 1773 | "version": "1.8.0", 1774 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.0.tgz", 1775 | "integrity": "sha512-NRfCA8AVYuAA7Hu8bs18od6J4BdcXXwOv6OJuNgwbw8LcLK8JKwaM3WckLZ+MGyPJUS/ivVgK3twltrOIJJnug==", 1776 | "dev": true, 1777 | "dependencies": { 1778 | "mri": "^1.1.0" 1779 | }, 1780 | "engines": { 1781 | "node": ">=6" 1782 | } 1783 | }, 1784 | "node_modules/semver": { 1785 | "version": "7.5.4", 1786 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 1787 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 1788 | "dev": true, 1789 | "license": "ISC", 1790 | "dependencies": { 1791 | "lru-cache": "^6.0.0" 1792 | }, 1793 | "bin": { 1794 | "semver": "bin/semver.js" 1795 | }, 1796 | "engines": { 1797 | "node": ">=10" 1798 | } 1799 | }, 1800 | "node_modules/source-map": { 1801 | "version": "0.6.1", 1802 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1803 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1804 | "dev": true, 1805 | "license": "BSD-3-Clause", 1806 | "engines": { 1807 | "node": ">=0.10.0" 1808 | } 1809 | }, 1810 | "node_modules/source-map-js": { 1811 | "version": "1.2.1", 1812 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1813 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1814 | "license": "BSD-3-Clause", 1815 | "engines": { 1816 | "node": ">=0.10.0" 1817 | } 1818 | }, 1819 | "node_modules/sprintf-js": { 1820 | "version": "1.0.3", 1821 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1822 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 1823 | "dev": true, 1824 | "license": "BSD-3-Clause" 1825 | }, 1826 | "node_modules/string-argv": { 1827 | "version": "0.3.2", 1828 | "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", 1829 | "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", 1830 | "dev": true, 1831 | "license": "MIT", 1832 | "engines": { 1833 | "node": ">=0.6.19" 1834 | } 1835 | }, 1836 | "node_modules/strip-json-comments": { 1837 | "version": "3.1.1", 1838 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1839 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1840 | "dev": true, 1841 | "license": "MIT", 1842 | "engines": { 1843 | "node": ">=8" 1844 | }, 1845 | "funding": { 1846 | "url": "https://github.com/sponsors/sindresorhus" 1847 | } 1848 | }, 1849 | "node_modules/supports-color": { 1850 | "version": "8.1.1", 1851 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1852 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1853 | "dev": true, 1854 | "license": "MIT", 1855 | "dependencies": { 1856 | "has-flag": "^4.0.0" 1857 | }, 1858 | "engines": { 1859 | "node": ">=10" 1860 | }, 1861 | "funding": { 1862 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1863 | } 1864 | }, 1865 | "node_modules/supports-preserve-symlinks-flag": { 1866 | "version": "1.0.0", 1867 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1868 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1869 | "dev": true, 1870 | "license": "MIT", 1871 | "engines": { 1872 | "node": ">= 0.4" 1873 | }, 1874 | "funding": { 1875 | "url": "https://github.com/sponsors/ljharb" 1876 | } 1877 | }, 1878 | "node_modules/typescript": { 1879 | "version": "5.7.3", 1880 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", 1881 | "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", 1882 | "dev": true, 1883 | "license": "Apache-2.0", 1884 | "bin": { 1885 | "tsc": "bin/tsc", 1886 | "tsserver": "bin/tsserver" 1887 | }, 1888 | "engines": { 1889 | "node": ">=14.17" 1890 | } 1891 | }, 1892 | "node_modules/ufo": { 1893 | "version": "1.5.4", 1894 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", 1895 | "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", 1896 | "dev": true, 1897 | "license": "MIT" 1898 | }, 1899 | "node_modules/universalify": { 1900 | "version": "2.0.1", 1901 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 1902 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 1903 | "dev": true, 1904 | "license": "MIT", 1905 | "engines": { 1906 | "node": ">= 10.0.0" 1907 | } 1908 | }, 1909 | "node_modules/uri-js": { 1910 | "version": "4.4.1", 1911 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1912 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1913 | "dev": true, 1914 | "license": "BSD-2-Clause", 1915 | "dependencies": { 1916 | "punycode": "^2.1.0" 1917 | } 1918 | }, 1919 | "node_modules/uvu": { 1920 | "version": "0.5.6", 1921 | "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", 1922 | "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", 1923 | "dev": true, 1924 | "dependencies": { 1925 | "dequal": "^2.0.0", 1926 | "diff": "^5.0.0", 1927 | "kleur": "^4.0.3", 1928 | "sade": "^1.7.3" 1929 | }, 1930 | "bin": { 1931 | "uvu": "bin.js" 1932 | }, 1933 | "engines": { 1934 | "node": ">=8" 1935 | } 1936 | }, 1937 | "node_modules/vite": { 1938 | "version": "6.2.0", 1939 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", 1940 | "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", 1941 | "dev": true, 1942 | "license": "MIT", 1943 | "dependencies": { 1944 | "esbuild": "^0.25.0", 1945 | "postcss": "^8.5.3", 1946 | "rollup": "^4.30.1" 1947 | }, 1948 | "bin": { 1949 | "vite": "bin/vite.js" 1950 | }, 1951 | "engines": { 1952 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1953 | }, 1954 | "funding": { 1955 | "url": "https://github.com/vitejs/vite?sponsor=1" 1956 | }, 1957 | "optionalDependencies": { 1958 | "fsevents": "~2.3.3" 1959 | }, 1960 | "peerDependencies": { 1961 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 1962 | "jiti": ">=1.21.0", 1963 | "less": "*", 1964 | "lightningcss": "^1.21.0", 1965 | "sass": "*", 1966 | "sass-embedded": "*", 1967 | "stylus": "*", 1968 | "sugarss": "*", 1969 | "terser": "^5.16.0", 1970 | "tsx": "^4.8.1", 1971 | "yaml": "^2.4.2" 1972 | }, 1973 | "peerDependenciesMeta": { 1974 | "@types/node": { 1975 | "optional": true 1976 | }, 1977 | "jiti": { 1978 | "optional": true 1979 | }, 1980 | "less": { 1981 | "optional": true 1982 | }, 1983 | "lightningcss": { 1984 | "optional": true 1985 | }, 1986 | "sass": { 1987 | "optional": true 1988 | }, 1989 | "sass-embedded": { 1990 | "optional": true 1991 | }, 1992 | "stylus": { 1993 | "optional": true 1994 | }, 1995 | "sugarss": { 1996 | "optional": true 1997 | }, 1998 | "terser": { 1999 | "optional": true 2000 | }, 2001 | "tsx": { 2002 | "optional": true 2003 | }, 2004 | "yaml": { 2005 | "optional": true 2006 | } 2007 | } 2008 | }, 2009 | "node_modules/vite-plugin-dts": { 2010 | "version": "4.5.0", 2011 | "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.0.tgz", 2012 | "integrity": "sha512-M1lrPTdi7gilLYRZoLmGYnl4fbPryVYsehPN9JgaxjJKTs8/f7tuAlvCCvOLB5gRDQTTKnptBcB0ACsaw2wNLw==", 2013 | "dev": true, 2014 | "license": "MIT", 2015 | "dependencies": { 2016 | "@microsoft/api-extractor": "^7.49.1", 2017 | "@rollup/pluginutils": "^5.1.4", 2018 | "@volar/typescript": "^2.4.11", 2019 | "@vue/language-core": "2.2.0", 2020 | "compare-versions": "^6.1.1", 2021 | "debug": "^4.4.0", 2022 | "kolorist": "^1.8.0", 2023 | "local-pkg": "^0.5.1", 2024 | "magic-string": "^0.30.17" 2025 | }, 2026 | "peerDependencies": { 2027 | "typescript": "*", 2028 | "vite": "*" 2029 | }, 2030 | "peerDependenciesMeta": { 2031 | "vite": { 2032 | "optional": true 2033 | } 2034 | } 2035 | }, 2036 | "node_modules/vscode-uri": { 2037 | "version": "3.1.0", 2038 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", 2039 | "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", 2040 | "dev": true, 2041 | "license": "MIT" 2042 | }, 2043 | "node_modules/yallist": { 2044 | "version": "4.0.0", 2045 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2046 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2047 | "dev": true, 2048 | "license": "ISC" 2049 | } 2050 | }, 2051 | "dependencies": { 2052 | "@babel/helper-string-parser": { 2053 | "version": "7.25.9", 2054 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 2055 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 2056 | "dev": true 2057 | }, 2058 | "@babel/helper-validator-identifier": { 2059 | "version": "7.25.9", 2060 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 2061 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 2062 | "dev": true 2063 | }, 2064 | "@babel/parser": { 2065 | "version": "7.26.9", 2066 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", 2067 | "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", 2068 | "dev": true, 2069 | "requires": { 2070 | "@babel/types": "^7.26.9" 2071 | } 2072 | }, 2073 | "@babel/types": { 2074 | "version": "7.26.9", 2075 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", 2076 | "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", 2077 | "dev": true, 2078 | "requires": { 2079 | "@babel/helper-string-parser": "^7.25.9", 2080 | "@babel/helper-validator-identifier": "^7.25.9" 2081 | } 2082 | }, 2083 | "@bramus/specificity": { 2084 | "version": "2.4.2", 2085 | "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", 2086 | "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", 2087 | "requires": { 2088 | "css-tree": "^3.0.0" 2089 | } 2090 | }, 2091 | "@esbuild/aix-ppc64": { 2092 | "version": "0.25.0", 2093 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", 2094 | "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", 2095 | "dev": true, 2096 | "optional": true 2097 | }, 2098 | "@esbuild/android-arm": { 2099 | "version": "0.25.0", 2100 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", 2101 | "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", 2102 | "dev": true, 2103 | "optional": true 2104 | }, 2105 | "@esbuild/android-arm64": { 2106 | "version": "0.25.0", 2107 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", 2108 | "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", 2109 | "dev": true, 2110 | "optional": true 2111 | }, 2112 | "@esbuild/android-x64": { 2113 | "version": "0.25.0", 2114 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", 2115 | "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", 2116 | "dev": true, 2117 | "optional": true 2118 | }, 2119 | "@esbuild/darwin-arm64": { 2120 | "version": "0.25.0", 2121 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", 2122 | "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", 2123 | "dev": true, 2124 | "optional": true 2125 | }, 2126 | "@esbuild/darwin-x64": { 2127 | "version": "0.25.0", 2128 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", 2129 | "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", 2130 | "dev": true, 2131 | "optional": true 2132 | }, 2133 | "@esbuild/freebsd-arm64": { 2134 | "version": "0.25.0", 2135 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", 2136 | "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", 2137 | "dev": true, 2138 | "optional": true 2139 | }, 2140 | "@esbuild/freebsd-x64": { 2141 | "version": "0.25.0", 2142 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", 2143 | "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", 2144 | "dev": true, 2145 | "optional": true 2146 | }, 2147 | "@esbuild/linux-arm": { 2148 | "version": "0.25.0", 2149 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", 2150 | "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", 2151 | "dev": true, 2152 | "optional": true 2153 | }, 2154 | "@esbuild/linux-arm64": { 2155 | "version": "0.25.0", 2156 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", 2157 | "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", 2158 | "dev": true, 2159 | "optional": true 2160 | }, 2161 | "@esbuild/linux-ia32": { 2162 | "version": "0.25.0", 2163 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", 2164 | "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", 2165 | "dev": true, 2166 | "optional": true 2167 | }, 2168 | "@esbuild/linux-loong64": { 2169 | "version": "0.25.0", 2170 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", 2171 | "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", 2172 | "dev": true, 2173 | "optional": true 2174 | }, 2175 | "@esbuild/linux-mips64el": { 2176 | "version": "0.25.0", 2177 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", 2178 | "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", 2179 | "dev": true, 2180 | "optional": true 2181 | }, 2182 | "@esbuild/linux-ppc64": { 2183 | "version": "0.25.0", 2184 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", 2185 | "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", 2186 | "dev": true, 2187 | "optional": true 2188 | }, 2189 | "@esbuild/linux-riscv64": { 2190 | "version": "0.25.0", 2191 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", 2192 | "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", 2193 | "dev": true, 2194 | "optional": true 2195 | }, 2196 | "@esbuild/linux-s390x": { 2197 | "version": "0.25.0", 2198 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", 2199 | "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", 2200 | "dev": true, 2201 | "optional": true 2202 | }, 2203 | "@esbuild/linux-x64": { 2204 | "version": "0.25.0", 2205 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", 2206 | "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", 2207 | "dev": true, 2208 | "optional": true 2209 | }, 2210 | "@esbuild/netbsd-arm64": { 2211 | "version": "0.25.0", 2212 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", 2213 | "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", 2214 | "dev": true, 2215 | "optional": true 2216 | }, 2217 | "@esbuild/netbsd-x64": { 2218 | "version": "0.25.0", 2219 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", 2220 | "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", 2221 | "dev": true, 2222 | "optional": true 2223 | }, 2224 | "@esbuild/openbsd-arm64": { 2225 | "version": "0.25.0", 2226 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", 2227 | "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", 2228 | "dev": true, 2229 | "optional": true 2230 | }, 2231 | "@esbuild/openbsd-x64": { 2232 | "version": "0.25.0", 2233 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", 2234 | "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", 2235 | "dev": true, 2236 | "optional": true 2237 | }, 2238 | "@esbuild/sunos-x64": { 2239 | "version": "0.25.0", 2240 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", 2241 | "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", 2242 | "dev": true, 2243 | "optional": true 2244 | }, 2245 | "@esbuild/win32-arm64": { 2246 | "version": "0.25.0", 2247 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", 2248 | "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", 2249 | "dev": true, 2250 | "optional": true 2251 | }, 2252 | "@esbuild/win32-ia32": { 2253 | "version": "0.25.0", 2254 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", 2255 | "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", 2256 | "dev": true, 2257 | "optional": true 2258 | }, 2259 | "@esbuild/win32-x64": { 2260 | "version": "0.25.0", 2261 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", 2262 | "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", 2263 | "dev": true, 2264 | "optional": true 2265 | }, 2266 | "@jridgewell/sourcemap-codec": { 2267 | "version": "1.5.0", 2268 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 2269 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 2270 | "dev": true 2271 | }, 2272 | "@microsoft/api-extractor": { 2273 | "version": "7.50.1", 2274 | "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.50.1.tgz", 2275 | "integrity": "sha512-L18vz0ARLNaBLKwWe0DdEf7eijDsb7ERZspgZK7PxclLoQrc+9hJZo8y4OVfCHxNVyxlwVywY2WdE/3pOFViLQ==", 2276 | "dev": true, 2277 | "requires": { 2278 | "@microsoft/api-extractor-model": "7.30.3", 2279 | "@microsoft/tsdoc": "~0.15.1", 2280 | "@microsoft/tsdoc-config": "~0.17.1", 2281 | "@rushstack/node-core-library": "5.11.0", 2282 | "@rushstack/rig-package": "0.5.3", 2283 | "@rushstack/terminal": "0.15.0", 2284 | "@rushstack/ts-command-line": "4.23.5", 2285 | "lodash": "~4.17.15", 2286 | "minimatch": "~3.0.3", 2287 | "resolve": "~1.22.1", 2288 | "semver": "~7.5.4", 2289 | "source-map": "~0.6.1", 2290 | "typescript": "5.7.3" 2291 | } 2292 | }, 2293 | "@microsoft/api-extractor-model": { 2294 | "version": "7.30.3", 2295 | "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.3.tgz", 2296 | "integrity": "sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w==", 2297 | "dev": true, 2298 | "requires": { 2299 | "@microsoft/tsdoc": "~0.15.1", 2300 | "@microsoft/tsdoc-config": "~0.17.1", 2301 | "@rushstack/node-core-library": "5.11.0" 2302 | } 2303 | }, 2304 | "@microsoft/tsdoc": { 2305 | "version": "0.15.1", 2306 | "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", 2307 | "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", 2308 | "dev": true 2309 | }, 2310 | "@microsoft/tsdoc-config": { 2311 | "version": "0.17.1", 2312 | "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", 2313 | "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", 2314 | "dev": true, 2315 | "requires": { 2316 | "@microsoft/tsdoc": "0.15.1", 2317 | "ajv": "~8.12.0", 2318 | "jju": "~1.4.0", 2319 | "resolve": "~1.22.2" 2320 | } 2321 | }, 2322 | "@projectwallace/css-analyzer": { 2323 | "version": "7.1.1", 2324 | "resolved": "https://registry.npmjs.org/@projectwallace/css-analyzer/-/css-analyzer-7.1.1.tgz", 2325 | "integrity": "sha512-p8mwFts19YsUT3HNiKYAuVguTOx0YehHyfVcH9KIzkqUIMhiB5HyxyJ9OzUeJaCQ2w/fpiPq3FeURH98YPEjWA==", 2326 | "requires": { 2327 | "@bramus/specificity": "^2.4.2", 2328 | "css-tree": "^3.1.0" 2329 | } 2330 | }, 2331 | "@rollup/pluginutils": { 2332 | "version": "5.1.4", 2333 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", 2334 | "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", 2335 | "dev": true, 2336 | "requires": { 2337 | "@types/estree": "^1.0.0", 2338 | "estree-walker": "^2.0.2", 2339 | "picomatch": "^4.0.2" 2340 | } 2341 | }, 2342 | "@rollup/rollup-android-arm-eabi": { 2343 | "version": "4.34.8", 2344 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", 2345 | "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", 2346 | "dev": true, 2347 | "optional": true 2348 | }, 2349 | "@rollup/rollup-android-arm64": { 2350 | "version": "4.34.8", 2351 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", 2352 | "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", 2353 | "dev": true, 2354 | "optional": true 2355 | }, 2356 | "@rollup/rollup-darwin-arm64": { 2357 | "version": "4.34.8", 2358 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", 2359 | "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", 2360 | "dev": true, 2361 | "optional": true 2362 | }, 2363 | "@rollup/rollup-darwin-x64": { 2364 | "version": "4.34.8", 2365 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", 2366 | "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", 2367 | "dev": true, 2368 | "optional": true 2369 | }, 2370 | "@rollup/rollup-freebsd-arm64": { 2371 | "version": "4.34.8", 2372 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", 2373 | "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", 2374 | "dev": true, 2375 | "optional": true 2376 | }, 2377 | "@rollup/rollup-freebsd-x64": { 2378 | "version": "4.34.8", 2379 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", 2380 | "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", 2381 | "dev": true, 2382 | "optional": true 2383 | }, 2384 | "@rollup/rollup-linux-arm-gnueabihf": { 2385 | "version": "4.34.8", 2386 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", 2387 | "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", 2388 | "dev": true, 2389 | "optional": true 2390 | }, 2391 | "@rollup/rollup-linux-arm-musleabihf": { 2392 | "version": "4.34.8", 2393 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", 2394 | "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", 2395 | "dev": true, 2396 | "optional": true 2397 | }, 2398 | "@rollup/rollup-linux-arm64-gnu": { 2399 | "version": "4.34.8", 2400 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", 2401 | "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", 2402 | "dev": true, 2403 | "optional": true 2404 | }, 2405 | "@rollup/rollup-linux-arm64-musl": { 2406 | "version": "4.34.8", 2407 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", 2408 | "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", 2409 | "dev": true, 2410 | "optional": true 2411 | }, 2412 | "@rollup/rollup-linux-loongarch64-gnu": { 2413 | "version": "4.34.8", 2414 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", 2415 | "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", 2416 | "dev": true, 2417 | "optional": true 2418 | }, 2419 | "@rollup/rollup-linux-powerpc64le-gnu": { 2420 | "version": "4.34.8", 2421 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", 2422 | "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", 2423 | "dev": true, 2424 | "optional": true 2425 | }, 2426 | "@rollup/rollup-linux-riscv64-gnu": { 2427 | "version": "4.34.8", 2428 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", 2429 | "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", 2430 | "dev": true, 2431 | "optional": true 2432 | }, 2433 | "@rollup/rollup-linux-s390x-gnu": { 2434 | "version": "4.34.8", 2435 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", 2436 | "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", 2437 | "dev": true, 2438 | "optional": true 2439 | }, 2440 | "@rollup/rollup-linux-x64-gnu": { 2441 | "version": "4.34.8", 2442 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", 2443 | "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", 2444 | "dev": true, 2445 | "optional": true 2446 | }, 2447 | "@rollup/rollup-linux-x64-musl": { 2448 | "version": "4.34.8", 2449 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", 2450 | "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", 2451 | "dev": true, 2452 | "optional": true 2453 | }, 2454 | "@rollup/rollup-win32-arm64-msvc": { 2455 | "version": "4.34.8", 2456 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", 2457 | "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", 2458 | "dev": true, 2459 | "optional": true 2460 | }, 2461 | "@rollup/rollup-win32-ia32-msvc": { 2462 | "version": "4.34.8", 2463 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", 2464 | "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", 2465 | "dev": true, 2466 | "optional": true 2467 | }, 2468 | "@rollup/rollup-win32-x64-msvc": { 2469 | "version": "4.34.8", 2470 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", 2471 | "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", 2472 | "dev": true, 2473 | "optional": true 2474 | }, 2475 | "@rushstack/node-core-library": { 2476 | "version": "5.11.0", 2477 | "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.11.0.tgz", 2478 | "integrity": "sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==", 2479 | "dev": true, 2480 | "requires": { 2481 | "ajv": "~8.13.0", 2482 | "ajv-draft-04": "~1.0.0", 2483 | "ajv-formats": "~3.0.1", 2484 | "fs-extra": "~11.3.0", 2485 | "import-lazy": "~4.0.0", 2486 | "jju": "~1.4.0", 2487 | "resolve": "~1.22.1", 2488 | "semver": "~7.5.4" 2489 | }, 2490 | "dependencies": { 2491 | "ajv": { 2492 | "version": "8.13.0", 2493 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", 2494 | "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", 2495 | "dev": true, 2496 | "requires": { 2497 | "fast-deep-equal": "^3.1.3", 2498 | "json-schema-traverse": "^1.0.0", 2499 | "require-from-string": "^2.0.2", 2500 | "uri-js": "^4.4.1" 2501 | } 2502 | } 2503 | } 2504 | }, 2505 | "@rushstack/rig-package": { 2506 | "version": "0.5.3", 2507 | "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", 2508 | "integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==", 2509 | "dev": true, 2510 | "requires": { 2511 | "resolve": "~1.22.1", 2512 | "strip-json-comments": "~3.1.1" 2513 | } 2514 | }, 2515 | "@rushstack/terminal": { 2516 | "version": "0.15.0", 2517 | "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.0.tgz", 2518 | "integrity": "sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q==", 2519 | "dev": true, 2520 | "requires": { 2521 | "@rushstack/node-core-library": "5.11.0", 2522 | "supports-color": "~8.1.1" 2523 | } 2524 | }, 2525 | "@rushstack/ts-command-line": { 2526 | "version": "4.23.5", 2527 | "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.5.tgz", 2528 | "integrity": "sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA==", 2529 | "dev": true, 2530 | "requires": { 2531 | "@rushstack/terminal": "0.15.0", 2532 | "@types/argparse": "1.0.38", 2533 | "argparse": "~1.0.9", 2534 | "string-argv": "~0.3.1" 2535 | } 2536 | }, 2537 | "@types/argparse": { 2538 | "version": "1.0.38", 2539 | "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", 2540 | "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", 2541 | "dev": true 2542 | }, 2543 | "@types/estree": { 2544 | "version": "1.0.6", 2545 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 2546 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 2547 | "dev": true 2548 | }, 2549 | "@volar/language-core": { 2550 | "version": "2.4.11", 2551 | "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", 2552 | "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", 2553 | "dev": true, 2554 | "requires": { 2555 | "@volar/source-map": "2.4.11" 2556 | } 2557 | }, 2558 | "@volar/source-map": { 2559 | "version": "2.4.11", 2560 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", 2561 | "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", 2562 | "dev": true 2563 | }, 2564 | "@volar/typescript": { 2565 | "version": "2.4.11", 2566 | "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", 2567 | "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", 2568 | "dev": true, 2569 | "requires": { 2570 | "@volar/language-core": "2.4.11", 2571 | "path-browserify": "^1.0.1", 2572 | "vscode-uri": "^3.0.8" 2573 | } 2574 | }, 2575 | "@vue/compiler-core": { 2576 | "version": "3.5.13", 2577 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", 2578 | "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", 2579 | "dev": true, 2580 | "requires": { 2581 | "@babel/parser": "^7.25.3", 2582 | "@vue/shared": "3.5.13", 2583 | "entities": "^4.5.0", 2584 | "estree-walker": "^2.0.2", 2585 | "source-map-js": "^1.2.0" 2586 | } 2587 | }, 2588 | "@vue/compiler-dom": { 2589 | "version": "3.5.13", 2590 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", 2591 | "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", 2592 | "dev": true, 2593 | "requires": { 2594 | "@vue/compiler-core": "3.5.13", 2595 | "@vue/shared": "3.5.13" 2596 | } 2597 | }, 2598 | "@vue/compiler-vue2": { 2599 | "version": "2.7.16", 2600 | "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", 2601 | "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", 2602 | "dev": true, 2603 | "requires": { 2604 | "de-indent": "^1.0.2", 2605 | "he": "^1.2.0" 2606 | } 2607 | }, 2608 | "@vue/language-core": { 2609 | "version": "2.2.0", 2610 | "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", 2611 | "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", 2612 | "dev": true, 2613 | "requires": { 2614 | "@volar/language-core": "~2.4.11", 2615 | "@vue/compiler-dom": "^3.5.0", 2616 | "@vue/compiler-vue2": "^2.7.16", 2617 | "@vue/shared": "^3.5.0", 2618 | "alien-signals": "^0.4.9", 2619 | "minimatch": "^9.0.3", 2620 | "muggle-string": "^0.4.1", 2621 | "path-browserify": "^1.0.1" 2622 | }, 2623 | "dependencies": { 2624 | "brace-expansion": { 2625 | "version": "2.0.1", 2626 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 2627 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 2628 | "dev": true, 2629 | "requires": { 2630 | "balanced-match": "^1.0.0" 2631 | } 2632 | }, 2633 | "minimatch": { 2634 | "version": "9.0.5", 2635 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 2636 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 2637 | "dev": true, 2638 | "requires": { 2639 | "brace-expansion": "^2.0.1" 2640 | } 2641 | } 2642 | } 2643 | }, 2644 | "@vue/shared": { 2645 | "version": "3.5.13", 2646 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", 2647 | "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", 2648 | "dev": true 2649 | }, 2650 | "acorn": { 2651 | "version": "8.14.0", 2652 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 2653 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 2654 | "dev": true 2655 | }, 2656 | "ajv": { 2657 | "version": "8.12.0", 2658 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", 2659 | "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", 2660 | "dev": true, 2661 | "requires": { 2662 | "fast-deep-equal": "^3.1.1", 2663 | "json-schema-traverse": "^1.0.0", 2664 | "require-from-string": "^2.0.2", 2665 | "uri-js": "^4.2.2" 2666 | } 2667 | }, 2668 | "ajv-draft-04": { 2669 | "version": "1.0.0", 2670 | "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", 2671 | "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", 2672 | "dev": true, 2673 | "requires": {} 2674 | }, 2675 | "ajv-formats": { 2676 | "version": "3.0.1", 2677 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", 2678 | "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", 2679 | "dev": true, 2680 | "requires": { 2681 | "ajv": "^8.0.0" 2682 | } 2683 | }, 2684 | "alien-signals": { 2685 | "version": "0.4.14", 2686 | "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", 2687 | "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", 2688 | "dev": true 2689 | }, 2690 | "argparse": { 2691 | "version": "1.0.10", 2692 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 2693 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 2694 | "dev": true, 2695 | "requires": { 2696 | "sprintf-js": "~1.0.2" 2697 | } 2698 | }, 2699 | "balanced-match": { 2700 | "version": "1.0.2", 2701 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2702 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 2703 | "dev": true 2704 | }, 2705 | "brace-expansion": { 2706 | "version": "1.1.11", 2707 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2708 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2709 | "dev": true, 2710 | "requires": { 2711 | "balanced-match": "^1.0.0", 2712 | "concat-map": "0.0.1" 2713 | } 2714 | }, 2715 | "compare-versions": { 2716 | "version": "6.1.1", 2717 | "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", 2718 | "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", 2719 | "dev": true 2720 | }, 2721 | "concat-map": { 2722 | "version": "0.0.1", 2723 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2724 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 2725 | "dev": true 2726 | }, 2727 | "confbox": { 2728 | "version": "0.1.8", 2729 | "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", 2730 | "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", 2731 | "dev": true 2732 | }, 2733 | "css-tree": { 2734 | "version": "3.1.0", 2735 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", 2736 | "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", 2737 | "requires": { 2738 | "mdn-data": "2.12.2", 2739 | "source-map-js": "^1.0.1" 2740 | } 2741 | }, 2742 | "de-indent": { 2743 | "version": "1.0.2", 2744 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", 2745 | "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", 2746 | "dev": true 2747 | }, 2748 | "debug": { 2749 | "version": "4.4.0", 2750 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 2751 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 2752 | "dev": true, 2753 | "requires": { 2754 | "ms": "^2.1.3" 2755 | } 2756 | }, 2757 | "dequal": { 2758 | "version": "2.0.2", 2759 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", 2760 | "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", 2761 | "dev": true 2762 | }, 2763 | "diff": { 2764 | "version": "5.0.0", 2765 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 2766 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 2767 | "dev": true 2768 | }, 2769 | "entities": { 2770 | "version": "4.5.0", 2771 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 2772 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 2773 | "dev": true 2774 | }, 2775 | "esbuild": { 2776 | "version": "0.25.0", 2777 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", 2778 | "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", 2779 | "dev": true, 2780 | "requires": { 2781 | "@esbuild/aix-ppc64": "0.25.0", 2782 | "@esbuild/android-arm": "0.25.0", 2783 | "@esbuild/android-arm64": "0.25.0", 2784 | "@esbuild/android-x64": "0.25.0", 2785 | "@esbuild/darwin-arm64": "0.25.0", 2786 | "@esbuild/darwin-x64": "0.25.0", 2787 | "@esbuild/freebsd-arm64": "0.25.0", 2788 | "@esbuild/freebsd-x64": "0.25.0", 2789 | "@esbuild/linux-arm": "0.25.0", 2790 | "@esbuild/linux-arm64": "0.25.0", 2791 | "@esbuild/linux-ia32": "0.25.0", 2792 | "@esbuild/linux-loong64": "0.25.0", 2793 | "@esbuild/linux-mips64el": "0.25.0", 2794 | "@esbuild/linux-ppc64": "0.25.0", 2795 | "@esbuild/linux-riscv64": "0.25.0", 2796 | "@esbuild/linux-s390x": "0.25.0", 2797 | "@esbuild/linux-x64": "0.25.0", 2798 | "@esbuild/netbsd-arm64": "0.25.0", 2799 | "@esbuild/netbsd-x64": "0.25.0", 2800 | "@esbuild/openbsd-arm64": "0.25.0", 2801 | "@esbuild/openbsd-x64": "0.25.0", 2802 | "@esbuild/sunos-x64": "0.25.0", 2803 | "@esbuild/win32-arm64": "0.25.0", 2804 | "@esbuild/win32-ia32": "0.25.0", 2805 | "@esbuild/win32-x64": "0.25.0" 2806 | } 2807 | }, 2808 | "estree-walker": { 2809 | "version": "2.0.2", 2810 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 2811 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 2812 | "dev": true 2813 | }, 2814 | "fast-deep-equal": { 2815 | "version": "3.1.3", 2816 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2817 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2818 | "dev": true 2819 | }, 2820 | "fs-extra": { 2821 | "version": "11.3.0", 2822 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", 2823 | "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", 2824 | "dev": true, 2825 | "requires": { 2826 | "graceful-fs": "^4.2.0", 2827 | "jsonfile": "^6.0.1", 2828 | "universalify": "^2.0.0" 2829 | } 2830 | }, 2831 | "fsevents": { 2832 | "version": "2.3.3", 2833 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2834 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2835 | "dev": true, 2836 | "optional": true 2837 | }, 2838 | "function-bind": { 2839 | "version": "1.1.2", 2840 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 2841 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 2842 | "dev": true 2843 | }, 2844 | "graceful-fs": { 2845 | "version": "4.2.11", 2846 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 2847 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 2848 | "dev": true 2849 | }, 2850 | "has-flag": { 2851 | "version": "4.0.0", 2852 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2853 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2854 | "dev": true 2855 | }, 2856 | "hasown": { 2857 | "version": "2.0.2", 2858 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 2859 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 2860 | "dev": true, 2861 | "requires": { 2862 | "function-bind": "^1.1.2" 2863 | } 2864 | }, 2865 | "he": { 2866 | "version": "1.2.0", 2867 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 2868 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 2869 | "dev": true 2870 | }, 2871 | "import-lazy": { 2872 | "version": "4.0.0", 2873 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", 2874 | "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", 2875 | "dev": true 2876 | }, 2877 | "is-core-module": { 2878 | "version": "2.16.1", 2879 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 2880 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 2881 | "dev": true, 2882 | "requires": { 2883 | "hasown": "^2.0.2" 2884 | } 2885 | }, 2886 | "jju": { 2887 | "version": "1.4.0", 2888 | "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", 2889 | "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", 2890 | "dev": true 2891 | }, 2892 | "json-schema-traverse": { 2893 | "version": "1.0.0", 2894 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 2895 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 2896 | "dev": true 2897 | }, 2898 | "jsonfile": { 2899 | "version": "6.1.0", 2900 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 2901 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 2902 | "dev": true, 2903 | "requires": { 2904 | "graceful-fs": "^4.1.6", 2905 | "universalify": "^2.0.0" 2906 | } 2907 | }, 2908 | "kleur": { 2909 | "version": "4.1.4", 2910 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", 2911 | "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", 2912 | "dev": true 2913 | }, 2914 | "kolorist": { 2915 | "version": "1.8.0", 2916 | "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", 2917 | "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", 2918 | "dev": true 2919 | }, 2920 | "local-pkg": { 2921 | "version": "0.5.1", 2922 | "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", 2923 | "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", 2924 | "dev": true, 2925 | "requires": { 2926 | "mlly": "^1.7.3", 2927 | "pkg-types": "^1.2.1" 2928 | } 2929 | }, 2930 | "lodash": { 2931 | "version": "4.17.21", 2932 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2933 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2934 | "dev": true 2935 | }, 2936 | "lru-cache": { 2937 | "version": "6.0.0", 2938 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2939 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2940 | "dev": true, 2941 | "requires": { 2942 | "yallist": "^4.0.0" 2943 | } 2944 | }, 2945 | "magic-string": { 2946 | "version": "0.30.17", 2947 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 2948 | "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 2949 | "dev": true, 2950 | "requires": { 2951 | "@jridgewell/sourcemap-codec": "^1.5.0" 2952 | } 2953 | }, 2954 | "mdn-data": { 2955 | "version": "2.12.2", 2956 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", 2957 | "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" 2958 | }, 2959 | "minimatch": { 2960 | "version": "3.0.8", 2961 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 2962 | "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 2963 | "dev": true, 2964 | "requires": { 2965 | "brace-expansion": "^1.1.7" 2966 | } 2967 | }, 2968 | "mlly": { 2969 | "version": "1.7.4", 2970 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", 2971 | "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", 2972 | "dev": true, 2973 | "requires": { 2974 | "acorn": "^8.14.0", 2975 | "pathe": "^2.0.1", 2976 | "pkg-types": "^1.3.0", 2977 | "ufo": "^1.5.4" 2978 | } 2979 | }, 2980 | "mri": { 2981 | "version": "1.2.0", 2982 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 2983 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 2984 | "dev": true 2985 | }, 2986 | "ms": { 2987 | "version": "2.1.3", 2988 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2989 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2990 | "dev": true 2991 | }, 2992 | "muggle-string": { 2993 | "version": "0.4.1", 2994 | "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", 2995 | "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", 2996 | "dev": true 2997 | }, 2998 | "nanoid": { 2999 | "version": "3.3.8", 3000 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 3001 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 3002 | "dev": true 3003 | }, 3004 | "path-browserify": { 3005 | "version": "1.0.1", 3006 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 3007 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 3008 | "dev": true 3009 | }, 3010 | "path-parse": { 3011 | "version": "1.0.7", 3012 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 3013 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 3014 | "dev": true 3015 | }, 3016 | "pathe": { 3017 | "version": "2.0.3", 3018 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 3019 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 3020 | "dev": true 3021 | }, 3022 | "picocolors": { 3023 | "version": "1.1.1", 3024 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 3025 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 3026 | "dev": true 3027 | }, 3028 | "picomatch": { 3029 | "version": "4.0.2", 3030 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 3031 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 3032 | "dev": true 3033 | }, 3034 | "pkg-types": { 3035 | "version": "1.3.1", 3036 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", 3037 | "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", 3038 | "dev": true, 3039 | "requires": { 3040 | "confbox": "^0.1.8", 3041 | "mlly": "^1.7.4", 3042 | "pathe": "^2.0.1" 3043 | } 3044 | }, 3045 | "postcss": { 3046 | "version": "8.5.3", 3047 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 3048 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 3049 | "dev": true, 3050 | "requires": { 3051 | "nanoid": "^3.3.8", 3052 | "picocolors": "^1.1.1", 3053 | "source-map-js": "^1.2.1" 3054 | } 3055 | }, 3056 | "punycode": { 3057 | "version": "2.3.1", 3058 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 3059 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 3060 | "dev": true 3061 | }, 3062 | "require-from-string": { 3063 | "version": "2.0.2", 3064 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 3065 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 3066 | "dev": true 3067 | }, 3068 | "resolve": { 3069 | "version": "1.22.10", 3070 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 3071 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 3072 | "dev": true, 3073 | "requires": { 3074 | "is-core-module": "^2.16.0", 3075 | "path-parse": "^1.0.7", 3076 | "supports-preserve-symlinks-flag": "^1.0.0" 3077 | } 3078 | }, 3079 | "rollup": { 3080 | "version": "4.34.8", 3081 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", 3082 | "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", 3083 | "dev": true, 3084 | "requires": { 3085 | "@rollup/rollup-android-arm-eabi": "4.34.8", 3086 | "@rollup/rollup-android-arm64": "4.34.8", 3087 | "@rollup/rollup-darwin-arm64": "4.34.8", 3088 | "@rollup/rollup-darwin-x64": "4.34.8", 3089 | "@rollup/rollup-freebsd-arm64": "4.34.8", 3090 | "@rollup/rollup-freebsd-x64": "4.34.8", 3091 | "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", 3092 | "@rollup/rollup-linux-arm-musleabihf": "4.34.8", 3093 | "@rollup/rollup-linux-arm64-gnu": "4.34.8", 3094 | "@rollup/rollup-linux-arm64-musl": "4.34.8", 3095 | "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", 3096 | "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", 3097 | "@rollup/rollup-linux-riscv64-gnu": "4.34.8", 3098 | "@rollup/rollup-linux-s390x-gnu": "4.34.8", 3099 | "@rollup/rollup-linux-x64-gnu": "4.34.8", 3100 | "@rollup/rollup-linux-x64-musl": "4.34.8", 3101 | "@rollup/rollup-win32-arm64-msvc": "4.34.8", 3102 | "@rollup/rollup-win32-ia32-msvc": "4.34.8", 3103 | "@rollup/rollup-win32-x64-msvc": "4.34.8", 3104 | "@types/estree": "1.0.6", 3105 | "fsevents": "~2.3.2" 3106 | } 3107 | }, 3108 | "sade": { 3109 | "version": "1.8.0", 3110 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.0.tgz", 3111 | "integrity": "sha512-NRfCA8AVYuAA7Hu8bs18od6J4BdcXXwOv6OJuNgwbw8LcLK8JKwaM3WckLZ+MGyPJUS/ivVgK3twltrOIJJnug==", 3112 | "dev": true, 3113 | "requires": { 3114 | "mri": "^1.1.0" 3115 | } 3116 | }, 3117 | "semver": { 3118 | "version": "7.5.4", 3119 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 3120 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 3121 | "dev": true, 3122 | "requires": { 3123 | "lru-cache": "^6.0.0" 3124 | } 3125 | }, 3126 | "source-map": { 3127 | "version": "0.6.1", 3128 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3129 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3130 | "dev": true 3131 | }, 3132 | "source-map-js": { 3133 | "version": "1.2.1", 3134 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 3135 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" 3136 | }, 3137 | "sprintf-js": { 3138 | "version": "1.0.3", 3139 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3140 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 3141 | "dev": true 3142 | }, 3143 | "string-argv": { 3144 | "version": "0.3.2", 3145 | "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", 3146 | "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", 3147 | "dev": true 3148 | }, 3149 | "strip-json-comments": { 3150 | "version": "3.1.1", 3151 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3152 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3153 | "dev": true 3154 | }, 3155 | "supports-color": { 3156 | "version": "8.1.1", 3157 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 3158 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 3159 | "dev": true, 3160 | "requires": { 3161 | "has-flag": "^4.0.0" 3162 | } 3163 | }, 3164 | "supports-preserve-symlinks-flag": { 3165 | "version": "1.0.0", 3166 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3167 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3168 | "dev": true 3169 | }, 3170 | "typescript": { 3171 | "version": "5.7.3", 3172 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", 3173 | "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", 3174 | "dev": true 3175 | }, 3176 | "ufo": { 3177 | "version": "1.5.4", 3178 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", 3179 | "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", 3180 | "dev": true 3181 | }, 3182 | "universalify": { 3183 | "version": "2.0.1", 3184 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 3185 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 3186 | "dev": true 3187 | }, 3188 | "uri-js": { 3189 | "version": "4.4.1", 3190 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3191 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3192 | "dev": true, 3193 | "requires": { 3194 | "punycode": "^2.1.0" 3195 | } 3196 | }, 3197 | "uvu": { 3198 | "version": "0.5.6", 3199 | "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", 3200 | "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", 3201 | "dev": true, 3202 | "requires": { 3203 | "dequal": "^2.0.0", 3204 | "diff": "^5.0.0", 3205 | "kleur": "^4.0.3", 3206 | "sade": "^1.7.3" 3207 | } 3208 | }, 3209 | "vite": { 3210 | "version": "6.2.0", 3211 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", 3212 | "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", 3213 | "dev": true, 3214 | "requires": { 3215 | "esbuild": "^0.25.0", 3216 | "fsevents": "~2.3.3", 3217 | "postcss": "^8.5.3", 3218 | "rollup": "^4.30.1" 3219 | } 3220 | }, 3221 | "vite-plugin-dts": { 3222 | "version": "4.5.0", 3223 | "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.0.tgz", 3224 | "integrity": "sha512-M1lrPTdi7gilLYRZoLmGYnl4fbPryVYsehPN9JgaxjJKTs8/f7tuAlvCCvOLB5gRDQTTKnptBcB0ACsaw2wNLw==", 3225 | "dev": true, 3226 | "requires": { 3227 | "@microsoft/api-extractor": "^7.49.1", 3228 | "@rollup/pluginutils": "^5.1.4", 3229 | "@volar/typescript": "^2.4.11", 3230 | "@vue/language-core": "2.2.0", 3231 | "compare-versions": "^6.1.1", 3232 | "debug": "^4.4.0", 3233 | "kolorist": "^1.8.0", 3234 | "local-pkg": "^0.5.1", 3235 | "magic-string": "^0.30.17" 3236 | } 3237 | }, 3238 | "vscode-uri": { 3239 | "version": "3.1.0", 3240 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", 3241 | "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", 3242 | "dev": true 3243 | }, 3244 | "yallist": { 3245 | "version": "4.0.0", 3246 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3247 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 3248 | "dev": true 3249 | } 3250 | } 3251 | } 3252 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@projectwallace/css-code-quality", 3 | "description": "Calculate the Code Quality score of your CSS based on a range of different quality guards", 4 | "version": "3.0.2", 5 | "repository": { 6 | "type": "git", 7 | "url": "git+https://github.com:projectwallace/css-code-quality.git" 8 | }, 9 | "homepage": "https://github.com/projectwallace/css-code-quality", 10 | "issues": "https://github.com/projectwallace/css-code-quality/issues", 11 | "license": "MIT", 12 | "author": { 13 | "email": "bart@projectwallace.com", 14 | "name": "Bart Veneman" 15 | }, 16 | "keywords": [ 17 | "css", 18 | "codequality", 19 | "codesniffer", 20 | "quality", 21 | "complexity", 22 | "performance", 23 | "maintainability", 24 | "score" 25 | ], 26 | "engines": { 27 | "node": ">=16.0.0" 28 | }, 29 | "type": "module", 30 | "main": "./dist/index.js", 31 | "types": "./dist/index.d.ts", 32 | "exports": { 33 | ".": { 34 | "types": "./dist/index.d.ts", 35 | "import": "./dist/index.js" 36 | }, 37 | "./core": { 38 | "types": "./dist/core.d.ts", 39 | "import": "./dist/core.js" 40 | } 41 | }, 42 | "files": [ 43 | "dist" 44 | ], 45 | "scripts": { 46 | "test": "uvu", 47 | "build": "vite build", 48 | "check": "tsc --noEmit" 49 | }, 50 | "dependencies": { 51 | "@projectwallace/css-analyzer": "^7.1.1" 52 | }, 53 | "devDependencies": { 54 | "typescript": "^5.7.3", 55 | "uvu": "^0.5.6", 56 | "vite": "^6.2.0", 57 | "vite-plugin-dts": "^4.5.0" 58 | } 59 | } -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # CSS Code Quality calculator 2 | 3 |
4 | Analyzer logo 5 |
6 | 7 |
8 | 9 | version 10 | 11 | 12 | downloads 13 | 14 | 15 | install size 16 | 17 |
18 | 19 |
20 | Calculate the Code Quality score of your CSS based on a range of different quality guards. 21 |
22 | 23 | --- 24 | 25 | This package analyzes your CSS on a high level and comes up with a score, divided into three areas: 26 | 27 | - **Maintainability**: how difficult is it for someone looking at the CSS from a high level to find the exact spot to fix a bug? 28 | - **Complexity**: how difficult is it for someone to make a change and be confident that they can make that change without side effects? 29 | - **Performance**: How likely is the CSS to have a negative impact on performance, based on high-level metrics? (Not including using hardware accelerated transforms and the like, because other tools are more suited for that.) 30 | 31 | ## Installation 32 | 33 | ```bash 34 | npm install @projectwallace/css-code-quality 35 | ``` 36 | 37 | ## Usage 38 | 39 | ```js 40 | import { calculate } from "@projectwallace/css-code-quality"; 41 | 42 | let css = `my_css { /* ... */ }`; 43 | let result = calculate(css); 44 | 45 | /* 46 | The result shape looks something like this: 47 | 48 | { 49 | "violations": [ ], 50 | "passes": [ ], 51 | "performance": { 52 | "score": 90, 53 | "violations": [ ], 54 | "passes": [ ] 55 | }, 56 | "maintainability": { 57 | "score": 100, 58 | "violations": [ ], 59 | "passes": [ ] 60 | }, 61 | "complexity": { 62 | "score": 97, 63 | "violations": [ ], 64 | "passes": [ ] 65 | } 66 | } 67 | 68 | Each `passes` or `violations` array contains an object that looks like this: 69 | 70 | { 71 | "id": "EmptyRules", 72 | "score": 0, 73 | "value": 0 74 | }, 75 | { 76 | "id": "AverageSelectorsPerRule", 77 | "score": 0, 78 | "value": 1.5, 79 | "actuals": [ 80 | 2, 81 | 1 82 | ] 83 | } 84 | 85 | etc. etc. 86 | 87 | */ 88 | ``` 89 | 90 | ## Related projects 91 | 92 | - [CSS Analyzer](https://github.com/projectwallace/css-analyzer) - 93 | A CSS Analyzer that goes through your CSS to find all kinds of relevant statistics. 94 | - [Wallace CLI](https://github.com/projectwallace/wallace-cli) - CLI tool for 95 | @projectwallace/css-analyzer 96 | - [Constyble](https://github.com/projectwallace/constyble) - CSS Complexity linter 97 | - [Color Sorter](https://github.com/projectwallace/color-sorter) - Sort CSS colors 98 | by hue, saturation, lightness and opacity 99 | -------------------------------------------------------------------------------- /src/complexity.js: -------------------------------------------------------------------------------- 1 | import { compareSpecificity } from '@projectwallace/css-analyzer' 2 | 3 | export const guards = [ 4 | 5 | // Complexity per Selector should not differ too much from the most common Complexity 6 | /** @param {ReturnType} result */ 7 | result => { 8 | const mode = result.selectors.complexity.mode 9 | const selectorsAboveMode = result.selectors.complexity.items 10 | .filter(c => c > mode) 11 | .length 12 | 13 | const outcome = { 14 | id: 'MoreThanMostCommonSelectorComplexity', 15 | score: 0, 16 | value: result.selectors.total === 0 ? 0 : selectorsAboveMode / result.selectors.total, 17 | actuals: result.selectors.complexity.items, 18 | } 19 | 20 | if (selectorsAboveMode > result.selectors.total * 0.1) { 21 | const score = Math.floor(selectorsAboveMode * 0.01) 22 | outcome.score = Math.min(10, score) 23 | } 24 | 25 | return outcome 26 | }, 27 | 28 | // Specificity per Selector should not differ too much from the most common Specificity 29 | /** @param {ReturnType} result */ 30 | result => { 31 | const mode = result.selectors.specificity.mode 32 | /** @type {import('@projectwallace/css-analyzer').Specificity[]} */ 33 | // @ts-expect-error css-analyzer type is incorrect 34 | const items = result.selectors.specificity.items 35 | const selectorsAboveMode = items.filter(c => compareSpecificity(c, mode) < 0) 36 | .length 37 | 38 | const outcome = { 39 | id: 'MoreThanMostCommonSelectorSpecificity', 40 | score: 0, 41 | value: result.selectors.total === 0 ? 0 : selectorsAboveMode / result.selectors.total, 42 | actuals: result.selectors.specificity.items, 43 | } 44 | 45 | if (selectorsAboveMode > result.selectors.total * 0.1) { 46 | const score = Math.floor(selectorsAboveMode * 0.01) 47 | outcome.score = Math.min(10, score) 48 | } 49 | 50 | return outcome 51 | }, 52 | 53 | // Maximum Selector Complexity should be low 54 | /** @param {ReturnType} result */ 55 | result => { 56 | const MAX_SELECTOR_COMPLEXITY = 5 57 | const actual = result.selectors.complexity.max || 0 58 | 59 | const outcome = { 60 | id: 'MaxSelectorComplexity', 61 | score: 0, 62 | value: result.selectors.complexity.max, 63 | actuals: result.selectors.complexity.items, 64 | } 65 | 66 | // Deduct 0.5 points per complexity over 5, up to 5 points 67 | if (actual > MAX_SELECTOR_COMPLEXITY) { 68 | const score = Math.ceil((actual - MAX_SELECTOR_COMPLEXITY) * 0.5) 69 | outcome.score = Math.min(5, score) 70 | } 71 | 72 | return outcome 73 | }, 74 | 75 | // Average Selector Complexity should be low 76 | /** @param {ReturnType} result */ 77 | result => { 78 | const ALLOWED_COMPLEXITY = 2 79 | const actual = result.selectors.complexity.mean 80 | 81 | const outcome = { 82 | id: 'AverageSelectorComplexity', 83 | score: 0, 84 | value: actual, 85 | actuals: result.selectors.complexity.items, 86 | } 87 | 88 | // Deduct 2 points per selector over 2 89 | if (actual > ALLOWED_COMPLEXITY) { 90 | const score = Math.ceil((actual - ALLOWED_COMPLEXITY) * 2) 91 | outcome.score = Math.min(10, score) 92 | } 93 | 94 | return outcome 95 | }, 96 | 97 | /** @param {ReturnType} result */ 98 | result => { 99 | const ALLOWED = 0.01 100 | const actual = result.selectors.id.ratio 101 | const outcome = { 102 | id: 'IdSelectorRatio', 103 | score: 0, 104 | value: actual, 105 | actuals: Object.keys(result.selectors.id.unique) 106 | } 107 | 108 | if (actual > ALLOWED) { 109 | const score = Math.floor((actual - ALLOWED) * 10) 110 | outcome.score = Math.min(score, 5) 111 | } 112 | 113 | return outcome 114 | }, 115 | 116 | /** @param {ReturnType} result */ 117 | result => { 118 | const ALLOWED = 0.01 119 | const actual = result.declarations.importants.ratio 120 | const outcome = { 121 | id: 'ImportantRatio', 122 | score: 0, 123 | value: actual, 124 | actuals: result.declarations.importants.total, 125 | } 126 | 127 | if (actual > ALLOWED) { 128 | const score = Math.floor((actual - ALLOWED) * 10) 129 | outcome.score = Math.min(score, 5) 130 | } 131 | 132 | return outcome 133 | }, 134 | ] 135 | -------------------------------------------------------------------------------- /src/complexity.test.js: -------------------------------------------------------------------------------- 1 | import * as assert from 'uvu/assert' 2 | import { suite } from 'uvu' 3 | import { calculate } from './index.js' 4 | 5 | const Complexity = suite('Complexity') 6 | 7 | Complexity('should deduct points for a lot of Selectors more complex than most common Complexity', () => { 8 | const fixture = ` 9 | ${Array.from({ length: 1000 }) 10 | .fill('') 11 | .map(_ => `selector { }`) 12 | .join('') 13 | } 14 | 15 | ${Array.from({ length: 500 }) 16 | .fill('') 17 | .map(_ => `:where(selector) { }`) 18 | .join('') 19 | } 20 | ` 21 | const actual = calculate(fixture) 22 | 23 | assert.equal(actual.complexity.violations, [ 24 | { 25 | id: 'MoreThanMostCommonSelectorComplexity', 26 | score: 5, 27 | value: 1 / 3, 28 | actuals: (Array.from({ length: 1000 }).fill(1)).concat(Array.from({ length: 500 }).fill(2)), 29 | } 30 | ]) 31 | assert.is(actual.complexity.score, 95) 32 | }) 33 | 34 | Complexity('should deduct points for a lot of Selectors more complex than most common Specificity', () => { 35 | const fixture = ` 36 | ${Array.from({ length: 500 }) 37 | .fill('') 38 | .map(_ => `selector1 { }`) 39 | .join('') 40 | } 41 | 42 | ${Array.from({ length: 200 }) 43 | .fill('') 44 | .map(_ => `.selector { }`) 45 | .join('') 46 | } 47 | ` 48 | const actual = calculate(fixture) 49 | 50 | assert.equal(actual.complexity.violations, [ 51 | { 52 | id: 'MoreThanMostCommonSelectorSpecificity', 53 | score: 2, 54 | value: 200 / 700, 55 | actuals: (Array.from({ length: 500 }).fill([0, 0, 1])).concat(Array.from({ length: 200 }).fill([0, 1, 0])), 56 | } 57 | ]) 58 | assert.is(actual.complexity.score, 98) 59 | }) 60 | 61 | Complexity('deducts points for selectors with high complexity', () => { 62 | const fixture = ` 63 | a b c d e f {} 64 | ` 65 | const actual = calculate(fixture) 66 | 67 | assert.equal(actual.complexity.violations, [ 68 | { 69 | id: 'MaxSelectorComplexity', 70 | score: 3, 71 | value: 11, 72 | actuals: [11], 73 | }, 74 | { 75 | id: 'AverageSelectorComplexity', 76 | score: 10, 77 | value: 11, 78 | actuals: [11], 79 | } 80 | ]) 81 | assert.is(actual.complexity.score, 87) 82 | }) 83 | 84 | Complexity('deducts points for having a high ratio of ID selectors', () => { 85 | const fixture = ` 86 | a {} 87 | b {} 88 | c {} 89 | #a {} 90 | ` 91 | const actual = calculate(fixture) 92 | 93 | assert.equal(actual.complexity.violations, [ 94 | { 95 | id: 'IdSelectorRatio', 96 | score: 2, 97 | value: 0.25, 98 | actuals: ['#a'], 99 | } 100 | ]) 101 | assert.is(actual.complexity.score, 98) 102 | }) 103 | 104 | Complexity('deducts points for having a high ratio !importants', () => { 105 | const fixture = ` 106 | selector { 107 | a: b; 108 | c: d; 109 | e: f; 110 | g: h !important; 111 | } 112 | ` 113 | const actual = calculate(fixture) 114 | 115 | assert.equal(actual.complexity.violations, [ 116 | { 117 | id: 'ImportantRatio', 118 | score: 2, 119 | value: 0.25, 120 | actuals: 1, 121 | } 122 | ]) 123 | assert.is(actual.complexity.score, 98) 124 | }) 125 | 126 | Complexity.run() -------------------------------------------------------------------------------- /src/core.js: -------------------------------------------------------------------------------- 1 | import { guards as performanceGuards } from './performance.js' 2 | import { guards as maintainabilityGuards } from './maintainability.js' 3 | import { guards as complexityGuards } from './complexity.js' 4 | 5 | /** 6 | * @param {ReturnType} result 7 | * @param {performanceGuards | maintainabilityGuards | complexityGuards} guards 8 | */ 9 | function calculateScore(result, guards) { 10 | let score = 100 11 | let violations = [] 12 | let passes = [] 13 | 14 | for (const guard of guards) { 15 | const outcome = guard(result) 16 | 17 | if (outcome.score > 0) { 18 | score -= outcome.score 19 | violations.push(outcome) 20 | } else { 21 | passes.push(outcome) 22 | } 23 | } 24 | 25 | return { 26 | score: Math.max(score, 0), 27 | violations, 28 | passes, 29 | } 30 | } 31 | 32 | /** @param {ReturnType} analysis */ 33 | export function calculate(analysis) { 34 | const performance = calculateScore(analysis, performanceGuards) 35 | const maintainability = calculateScore(analysis, maintainabilityGuards) 36 | const complexity = calculateScore(analysis, complexityGuards) 37 | 38 | return { 39 | violations: performance.violations 40 | .concat(maintainability.violations) 41 | .concat(complexity.violations), 42 | passes: performance.passes 43 | .concat(maintainability.passes) 44 | .concat(complexity.passes), 45 | performance, 46 | maintainability, 47 | complexity, 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/core.test.js: -------------------------------------------------------------------------------- 1 | import * as assert from 'uvu/assert' 2 | import { suite } from 'uvu' 3 | import { calculate } from '../dist/core.js' 4 | 5 | const Core = suite('Core') 6 | 7 | Core('exports calculate', () => { 8 | assert.is(typeof calculate, 'function') 9 | }) 10 | 11 | Core.run() 12 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { analyze } from '@projectwallace/css-analyzer' 2 | import { calculate as calculateFromAnalysis } from './core.js' 3 | 4 | /** 5 | * @param {string} css 6 | */ 7 | export function calculate(css) { 8 | const analysis = analyze(css) 9 | return calculateFromAnalysis(analysis) 10 | } 11 | -------------------------------------------------------------------------------- /src/index.test.js: -------------------------------------------------------------------------------- 1 | import * as assert from 'uvu/assert' 2 | import { suite } from 'uvu' 3 | import { calculate } from './index.js' 4 | import { calculate as pkgCalculate } from '../dist/index.js' 5 | 6 | const Index = suite('Index') 7 | 8 | Index('exposes a calculcate function', () => { 9 | assert.is(typeof calculate, 'function') 10 | }) 11 | 12 | Index('smoke test', () => { 13 | let css = ` 14 | @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap'); 15 | 16 | .my_test, 17 | .my_extra_test { 18 | color: red; 19 | } 20 | 21 | #my_test { 22 | color: green; 23 | } 24 | ` 25 | let result = calculate(css) 26 | assert.equal(result, { 27 | "violations": [ 28 | { 29 | "id": "Imports", 30 | "score": 10, 31 | "value": 1, 32 | "actuals": [ 33 | "url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap')" 34 | ] 35 | }, 36 | { 37 | "id": "IdSelectorRatio", 38 | "score": 3, 39 | "value": 0.3333333333333333, 40 | "actuals": [ 41 | "#my_test" 42 | ] 43 | } 44 | ], 45 | "passes": [ 46 | { 47 | "id": "EmptyRules", 48 | "score": 0, 49 | "value": 0 50 | }, 51 | { 52 | "id": "SelectorDuplications", 53 | "score": 0, 54 | "value": 0 55 | }, 56 | { 57 | "id": "DeclarationDuplications", 58 | "score": 0, 59 | "value": 0 60 | }, 61 | { 62 | "id": "CssSize", 63 | "score": 0, 64 | "value": 180 65 | }, 66 | { 67 | "id": "TooMuchComments", 68 | "score": 0, 69 | "value": 0 70 | }, 71 | { 72 | "id": "TooMuchEmbeddedContent", 73 | "score": 0, 74 | "value": 0, 75 | }, 76 | { 77 | "id": "SourceLinesOfCode", 78 | "score": 0, 79 | "value": 6 80 | }, 81 | { 82 | "id": "AverageSelectorsPerRule", 83 | "score": 0, 84 | "value": 1.5, 85 | "actuals": [ 86 | 2, 87 | 1 88 | ] 89 | }, 90 | { 91 | "id": "AverageDeclarationsPerRule", 92 | "score": 0, 93 | "value": 1, 94 | "actuals": [ 95 | 1, 96 | 1 97 | ] 98 | }, 99 | { 100 | "id": "MaxSelectorsPerRule", 101 | "score": 0, 102 | "value": 2, 103 | "actuals": [ 104 | 2, 105 | 1 106 | ] 107 | }, 108 | { 109 | "id": "MaxDeclarationsPerRule", 110 | "score": 0, 111 | "value": 1, 112 | "actuals": [ 113 | 1, 114 | 1 115 | ] 116 | }, 117 | { 118 | "id": "MoreThanMostCommonSelectorsPerRule", 119 | "score": 0, 120 | "value": 1.5, 121 | "actuals": [ 122 | 2, 123 | 1 124 | ] 125 | }, 126 | { 127 | "id": "MoreThanMostCommonDeclarationsPerRule", 128 | "score": 0, 129 | "value": 1, 130 | "actuals": [ 131 | 1, 132 | 1 133 | ] 134 | }, 135 | { 136 | "id": "MoreThanMostCommonSelectorComplexity", 137 | "score": 0, 138 | "value": 0, 139 | "actuals": [ 140 | 1, 141 | 1, 142 | 1 143 | ] 144 | }, 145 | { 146 | "id": "MoreThanMostCommonSelectorSpecificity", 147 | "score": 0, 148 | "value": 0.3333333333333333, 149 | "actuals": [ 150 | [ 151 | 0, 152 | 1, 153 | 0 154 | ], 155 | [ 156 | 0, 157 | 1, 158 | 0 159 | ], 160 | [ 161 | 1, 162 | 0, 163 | 0 164 | ] 165 | ] 166 | }, 167 | { 168 | "id": "MaxSelectorComplexity", 169 | "score": 0, 170 | "value": 1, 171 | "actuals": [ 172 | 1, 173 | 1, 174 | 1 175 | ] 176 | }, 177 | { 178 | "id": "AverageSelectorComplexity", 179 | "score": 0, 180 | "value": 1, 181 | "actuals": [ 182 | 1, 183 | 1, 184 | 1 185 | ] 186 | }, 187 | { 188 | "id": "ImportantRatio", 189 | "score": 0, 190 | "value": 0, 191 | "actuals": 0 192 | } 193 | ], 194 | "performance": { 195 | "score": 90, 196 | "violations": [ 197 | { 198 | "id": "Imports", 199 | "score": 10, 200 | "value": 1, 201 | "actuals": [ 202 | "url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap')" 203 | ] 204 | } 205 | ], 206 | "passes": [ 207 | { 208 | "id": "EmptyRules", 209 | "score": 0, 210 | "value": 0 211 | }, 212 | { 213 | "id": "SelectorDuplications", 214 | "score": 0, 215 | "value": 0 216 | }, 217 | { 218 | "id": "DeclarationDuplications", 219 | "score": 0, 220 | "value": 0 221 | }, 222 | { 223 | "id": "CssSize", 224 | "score": 0, 225 | "value": 180 226 | }, 227 | { 228 | "id": "TooMuchComments", 229 | "score": 0, 230 | "value": 0 231 | }, 232 | { 233 | "id": "TooMuchEmbeddedContent", 234 | "score": 0, 235 | "value": 0, 236 | } 237 | ] 238 | }, 239 | "maintainability": { 240 | "score": 100, 241 | "violations": [], 242 | "passes": [ 243 | { 244 | "id": "SourceLinesOfCode", 245 | "score": 0, 246 | "value": 6 247 | }, 248 | { 249 | "id": "AverageSelectorsPerRule", 250 | "score": 0, 251 | "value": 1.5, 252 | "actuals": [ 253 | 2, 254 | 1 255 | ] 256 | }, 257 | { 258 | "id": "AverageDeclarationsPerRule", 259 | "score": 0, 260 | "value": 1, 261 | "actuals": [ 262 | 1, 263 | 1 264 | ] 265 | }, 266 | { 267 | "id": "MaxSelectorsPerRule", 268 | "score": 0, 269 | "value": 2, 270 | "actuals": [ 271 | 2, 272 | 1 273 | ] 274 | }, 275 | { 276 | "id": "MaxDeclarationsPerRule", 277 | "score": 0, 278 | "value": 1, 279 | "actuals": [ 280 | 1, 281 | 1 282 | ] 283 | }, 284 | { 285 | "id": "MoreThanMostCommonSelectorsPerRule", 286 | "score": 0, 287 | "value": 1.5, 288 | "actuals": [ 289 | 2, 290 | 1 291 | ] 292 | }, 293 | { 294 | "id": "MoreThanMostCommonDeclarationsPerRule", 295 | "score": 0, 296 | "value": 1, 297 | "actuals": [ 298 | 1, 299 | 1 300 | ] 301 | } 302 | ] 303 | }, 304 | "complexity": { 305 | "score": 97, 306 | "violations": [ 307 | { 308 | "id": "IdSelectorRatio", 309 | "score": 3, 310 | "value": 0.3333333333333333, 311 | "actuals": [ 312 | "#my_test" 313 | ] 314 | } 315 | ], 316 | "passes": [ 317 | { 318 | "id": "MoreThanMostCommonSelectorComplexity", 319 | "score": 0, 320 | "value": 0, 321 | "actuals": [ 322 | 1, 323 | 1, 324 | 1 325 | ] 326 | }, 327 | { 328 | "id": "MoreThanMostCommonSelectorSpecificity", 329 | "score": 0, 330 | "value": 0.3333333333333333, 331 | "actuals": [ 332 | [ 333 | 0, 334 | 1, 335 | 0 336 | ], 337 | [ 338 | 0, 339 | 1, 340 | 0 341 | ], 342 | [ 343 | 1, 344 | 0, 345 | 0 346 | ] 347 | ] 348 | }, 349 | { 350 | "id": "MaxSelectorComplexity", 351 | "score": 0, 352 | "value": 1, 353 | "actuals": [ 354 | 1, 355 | 1, 356 | 1 357 | ] 358 | }, 359 | { 360 | "id": "AverageSelectorComplexity", 361 | "score": 0, 362 | "value": 1, 363 | "actuals": [ 364 | 1, 365 | 1, 366 | 1 367 | ] 368 | }, 369 | { 370 | "id": "ImportantRatio", 371 | "score": 0, 372 | "value": 0, 373 | "actuals": 0 374 | } 375 | ] 376 | } 377 | }) 378 | }) 379 | 380 | Index.run() 381 | 382 | const Package = suite('NPM Package') 383 | 384 | Package('exposes a calculate function', () => { 385 | assert.is(typeof pkgCalculate, 'function') 386 | }) 387 | 388 | Package.run() -------------------------------------------------------------------------------- /src/maintainability.js: -------------------------------------------------------------------------------- 1 | export const guards = [ 2 | 3 | // Source Lines of Code should be low 4 | /** @param {ReturnType} result */ 5 | result => { 6 | const outcome = { 7 | id: 'SourceLinesOfCode', 8 | score: 0, 9 | value: result.stylesheet.sourceLinesOfCode, 10 | } 11 | 12 | if (result.stylesheet.sourceLinesOfCode > 10000) { 13 | // deduct 1 point per 1000 lines of code over 10,000 14 | const score = Math.floor((result.stylesheet.sourceLinesOfCode - 10000) / 1000) 15 | outcome.score = Math.min(15, score) 16 | } 17 | 18 | return outcome 19 | }, 20 | 21 | // Average count of Selectors per RuleSet should be low 22 | /** @param {ReturnType} result */ 23 | result => { 24 | const ALLOWED_SELECTORS_PER_RULESET = 2 25 | const actual = result.rules.selectors.mean 26 | 27 | const outcome = { 28 | id: 'AverageSelectorsPerRule', 29 | score: 0, 30 | value: actual, 31 | actuals: result.rules.selectors.items, 32 | } 33 | 34 | // Deduct 5 points per selector over 2 35 | if (actual > ALLOWED_SELECTORS_PER_RULESET) { 36 | const score = Math.floor((actual - ALLOWED_SELECTORS_PER_RULESET) * 5) 37 | outcome.score = Math.min(15, score) 38 | } 39 | 40 | return outcome 41 | }, 42 | 43 | // Average count of Declarations per RuleSet should be low 44 | /** @param {ReturnType} result */ 45 | result => { 46 | const ALLOWED_DECLARATIONS_PER_RULESET = 5 47 | 48 | const outcome = { 49 | id: 'AverageDeclarationsPerRule', 50 | score: 0, 51 | value: result.rules.declarations.mean, 52 | actuals: result.rules.declarations.items, 53 | } 54 | 55 | // Deduct 5 points per declaration over 5 56 | if (result.rules.declarations.mean > ALLOWED_DECLARATIONS_PER_RULESET) { 57 | const score = Math.floor((result.rules.declarations.mean - ALLOWED_DECLARATIONS_PER_RULESET) * 5) 58 | outcome.score = Math.min(15, score) 59 | } 60 | 61 | return outcome 62 | }, 63 | 64 | // Max number of Selectors per Rule should be low 65 | /** @param {ReturnType} result */ 66 | result => { 67 | const MAX_SELECTORS_PER_RULESET = 10 68 | let max = result.rules.selectors.max || 0 69 | 70 | const outcome = { 71 | id: 'MaxSelectorsPerRule', 72 | score: 0, 73 | value: max, 74 | actuals: result.rules.selectors.items, 75 | } 76 | 77 | // Deduct 0.5 points per selectors over 10 78 | if (max > MAX_SELECTORS_PER_RULESET) { 79 | const score = Math.ceil((max - MAX_SELECTORS_PER_RULESET) * 0.5) 80 | outcome.score = Math.min(score, 15) 81 | } 82 | 83 | return outcome 84 | }, 85 | 86 | // Max number of Declarations per Rule should be low 87 | /** @param {ReturnType} result */ 88 | result => { 89 | const MAX_DECLARATIONS_PER_RULESET = 10 90 | const max = result.rules.declarations.max || 0 91 | 92 | const outcome = { 93 | id: 'MaxDeclarationsPerRule', 94 | score: 0, 95 | value: max, 96 | actuals: result.rules.declarations.items, 97 | } 98 | 99 | // Deduct 0.5 points per declarations over 10 100 | if (max > MAX_DECLARATIONS_PER_RULESET) { 101 | const score = Math.ceil((max - MAX_DECLARATIONS_PER_RULESET) * 0.5) 102 | outcome.score = Math.min(15, score) 103 | } 104 | 105 | return outcome 106 | }, 107 | 108 | // Number of Selectors per RuleSet should not differ too much from the most common amount of 109 | // Selectors per RuleSet 110 | /** @param {ReturnType} result */ 111 | result => { 112 | const mode = result.rules.selectors.mode 113 | const rulesHavingMoreThanMode = result.rules.selectors.items 114 | .filter(item => item > mode) 115 | .length 116 | 117 | const outcome = { 118 | id: 'MoreThanMostCommonSelectorsPerRule', 119 | score: 0, 120 | value: result.rules.selectors.mode, 121 | actuals: result.rules.selectors.items, 122 | } 123 | 124 | // if more than 10% of RuleSets has more Selectors than most common: 125 | if (rulesHavingMoreThanMode > result.rules.total * 0.1) { 126 | // then deduct 0.01 for ever applicable RuleSet 127 | const score = Math.floor(rulesHavingMoreThanMode * 0.01) 128 | // with a maximum of 10 points 129 | outcome.score = Math.min(15, score) 130 | } 131 | 132 | return outcome 133 | }, 134 | 135 | // Number of Declarations per RuleSet should not differ too much from the most common amount of 136 | // Declarations per RuleSet 137 | /** @param {ReturnType} result */ 138 | result => { 139 | const mode = result.rules.selectors.mode 140 | const rulesHavingMoreThanMode = result.rules.declarations.items.filter(item => item > mode).length 141 | 142 | const outcome = { 143 | id: 'MoreThanMostCommonDeclarationsPerRule', 144 | score: 0, 145 | value: result.rules.declarations.mode, 146 | actuals: result.rules.declarations.items, 147 | } 148 | 149 | // if more than 10% of RuleSets has more Declarations than most common: 150 | if (rulesHavingMoreThanMode > result.rules.total * 0.1) { 151 | // then deduct 0.01 for ever applicable RuleSet 152 | const score = Math.floor(rulesHavingMoreThanMode * 0.01) 153 | // with a maximum of 10 points 154 | outcome.score = Math.min(15, score) 155 | } 156 | 157 | return outcome 158 | }, 159 | ] 160 | -------------------------------------------------------------------------------- /src/maintainability.test.js: -------------------------------------------------------------------------------- 1 | import { suite } from 'uvu' 2 | import * as assert from 'uvu/assert' 3 | import { calculate } from './index.js' 4 | 5 | const Maintainability = suite('Maintainability') 6 | 7 | Maintainability('does not deduct points for 1 SLoC', () => { 8 | const actual = calculate(`test {}`) 9 | assert.is(actual.maintainability.score, 100) 10 | assert.is(actual.maintainability.violations.length, 0) 11 | }) 12 | 13 | Maintainability('deducts points for having lots of SLoC', () => { 14 | const fixture = Array.from({ length: 10_000 }) 15 | .fill('') 16 | .map((_, index) => `selector-${index} { opacity: 0.${index}}`) 17 | .join('') 18 | const actual = calculate(fixture) 19 | 20 | assert.is(actual.maintainability.score, 90) 21 | assert.equal(actual.maintainability.violations, [ 22 | { 23 | id: 'SourceLinesOfCode', 24 | score: 10, 25 | value: 20_000, 26 | } 27 | ]) 28 | }) 29 | 30 | Maintainability('deducts no points for have few Selectors per RuleSet', () => { 31 | const actual = calculate(` 32 | test1 {} 33 | 34 | test2, 35 | test3 {} 36 | `) 37 | 38 | assert.is(actual.maintainability.score, 100) 39 | assert.is(actual.maintainability.violations.length, 0) 40 | }) 41 | 42 | Maintainability('deducts points for having too many Selectors per RuleSet', () => { 43 | const actual = calculate(` 44 | test1, 45 | test2, 46 | test3, 47 | test3b {} 48 | 49 | test4, 50 | test5, 51 | test6, 52 | test7, 53 | test8 {} 54 | `) 55 | 56 | assert.is(actual.maintainability.score, 88) 57 | assert.equal(actual.maintainability.violations, [ 58 | { 59 | id: 'AverageSelectorsPerRule', 60 | score: 12, 61 | value: 4.5, 62 | actuals: [4, 5], 63 | } 64 | ]) 65 | }) 66 | 67 | Maintainability('deducts points for having too many Selectors in a RuleSet', () => { 68 | const actual = calculate(` 69 | test1, 70 | test2, 71 | test3, 72 | test4, 73 | test5, 74 | test6, 75 | test7, 76 | test8, 77 | test9, 78 | test10, 79 | test11, 80 | test12, 81 | test13, 82 | test14, 83 | test15 {} 84 | 85 | testA {} 86 | `) 87 | 88 | assert.is(actual.maintainability.score, 82) 89 | assert.equal(actual.maintainability.violations, [ 90 | { 91 | id: 'AverageSelectorsPerRule', 92 | score: 15, 93 | value: 8, 94 | actuals: [15, 1], 95 | }, 96 | { 97 | id: 'MaxSelectorsPerRule', 98 | score: 3, 99 | value: 15, 100 | actuals: [15, 1], 101 | }, 102 | ]) 103 | }) 104 | 105 | Maintainability('deducts points for having too many Declarations in a single RuleSet', () => { 106 | const fixture = ` 107 | selector1 { 108 | color: tomato; 109 | } 110 | 111 | selector2 { 112 | ${Array.from({ length: 23 }) 113 | .fill('') 114 | .map(i => `z-index: ${i};`) 115 | .join('') 116 | }} 117 | ` 118 | const actual = calculate(fixture) 119 | 120 | assert.is(actual.maintainability.score, 78) 121 | assert.equal(actual.maintainability.violations, [ 122 | { 123 | id: "AverageDeclarationsPerRule", 124 | score: 15, 125 | value: 12, 126 | actuals: [1, 23], 127 | }, 128 | { 129 | id: 'MaxDeclarationsPerRule', 130 | score: 7, // Math.ceil((23 - 10) * 0.5) === Math.ceil(6.5) 131 | value: 23, 132 | actuals: [1, 23], 133 | }, 134 | ]) 135 | }) 136 | 137 | Maintainability('deducts points for having RuleSets with more Selectors than what is most common', () => { 138 | const fixture = ` 139 | ${Array.from({ length: 1000 }) 140 | .fill('') 141 | .map(index => `selector-${index} {}`) 142 | .join('') 143 | } 144 | 145 | ${Array.from({ length: 500 }) 146 | .fill('') 147 | .map(index => `selector-${index}a, selector-${index}-b {}`) 148 | .join('') 149 | } 150 | ` 151 | const actual = calculate(fixture) 152 | 153 | assert.equal(actual.maintainability.violations, [ 154 | { 155 | id: 'MoreThanMostCommonSelectorsPerRule', 156 | score: 5, 157 | value: 1, 158 | actuals: (Array.from({ length: 1000 }).fill(1)).concat(Array.from({ length: 500 }).fill(2)), 159 | }, 160 | ]) 161 | assert.is(actual.maintainability.score, 95) 162 | }) 163 | 164 | Maintainability('deducts points for having RuleSets with more Selectors than what is most common', () => { 165 | const fixture = ` 166 | ${Array.from({ length: 1000 }) 167 | .fill('') 168 | .map(index => `selector-${index}a { z-index: ${index}; }`) 169 | .join('') 170 | } 171 | 172 | ${Array.from({ length: 500 }) 173 | .fill('') 174 | .map(index => `selector-${index}b { z-index: ${index}; content: "${index}" }`) 175 | .join('') 176 | } 177 | ` 178 | const actual = calculate(fixture) 179 | 180 | assert.equal(actual.maintainability.violations, [ 181 | { 182 | id: 'MoreThanMostCommonDeclarationsPerRule', 183 | score: 5, 184 | value: 1, 185 | actuals: (Array.from({ length: 1000 }).fill(1)).concat(Array.from({ length: 500 }).fill(2)), 186 | }, 187 | ]) 188 | assert.is(actual.maintainability.score, 95) 189 | }) 190 | 191 | Maintainability.run() -------------------------------------------------------------------------------- /src/performance.js: -------------------------------------------------------------------------------- 1 | export const guards = [ 2 | 3 | // Should not contain @import rules 4 | /** @param {ReturnType} result */ 5 | result => ({ 6 | id: 'Imports', 7 | score: result.atrules.import.total * 10, 8 | value: result.atrules.import.total, 9 | actuals: Object.keys(result.atrules.import.unique), 10 | }), 11 | 12 | // Should not contain empty rules 13 | /** @param {ReturnType} result */ 14 | result => ({ 15 | id: 'EmptyRules', 16 | score: result.rules.empty.total, 17 | value: result.rules.empty.total, 18 | }), 19 | 20 | // Too many selectors appear multiple times 21 | /** @param {ReturnType} result */ 22 | result => { 23 | const outcome = { 24 | id: 'SelectorDuplications', 25 | score: 0, 26 | value: 1 - result.selectors.uniquenessRatio, 27 | } 28 | 29 | if (result.selectors.uniquenessRatio < 0.66) { 30 | outcome.score = Math.floor((1 - result.selectors.uniquenessRatio) * 10) 31 | } 32 | 33 | return outcome 34 | }, 35 | 36 | // Too many declarations appear multiple times 37 | /** @param {ReturnType} result */ 38 | result => { 39 | const outcome = { 40 | id: 'DeclarationDuplications', 41 | score: 0, 42 | value: 1 - result.declarations.uniquenessRatio, 43 | } 44 | 45 | if (result.declarations.uniquenessRatio < 0.66) { 46 | outcome.score = Math.floor((1 - result.declarations.uniquenessRatio) * 10) 47 | } 48 | 49 | return outcome 50 | }, 51 | 52 | // The total amount of CSS should not be too high 53 | /** @param {ReturnType} result */ 54 | result => ({ 55 | id: 'CssSize', 56 | score: result.stylesheet.size > 200_000 ? 5 : 0, 57 | value: result.stylesheet.size, 58 | }), 59 | 60 | // Should not contain (too much) comments 61 | // Deduct 1 point for every 250 bytes 62 | /** @param {ReturnType} result */ 63 | result => { 64 | const { comments } = result.stylesheet 65 | return { 66 | id: 'TooMuchComments', 67 | score: Math.min(10, Math.floor(comments.size / 250)), 68 | value: comments.size, 69 | } 70 | }, 71 | 72 | // Should not contain too much embedded content 73 | // Deduct 1 point for every 250 bytes 74 | /** @param {ReturnType} result */ 75 | (result) => { 76 | const { size } = result.stylesheet.embeddedContent 77 | return { 78 | id: 'TooMuchEmbeddedContent', 79 | score: Math.min(20, Math.floor(size.total / 250)), 80 | value: size.total, 81 | } 82 | }, 83 | ] 84 | -------------------------------------------------------------------------------- /src/performance.test.js: -------------------------------------------------------------------------------- 1 | import { suite } from 'uvu' 2 | import * as assert from 'uvu/assert' 3 | import { calculate } from './index.js' 4 | 5 | const Performance = suite('Performance') 6 | 7 | Performance('does not deduct points for not having @import', () => { 8 | const actual = calculate(` 9 | test { color: green; } 10 | `) 11 | assert.is(actual.performance.score, 100) 12 | assert.is(actual.performance.violations.length, 0) 13 | }) 14 | 15 | Performance('deducts points for having a single @import', () => { 16 | const actual = calculate(` 17 | @import url('some-url'); 18 | test { color: green; } 19 | `) 20 | assert.is(actual.performance.score, 90) 21 | assert.equal(actual.performance.violations, [ 22 | { 23 | id: 'Imports', 24 | value: 1, 25 | score: 10, 26 | actuals: [`url('some-url')`], 27 | }, 28 | ]) 29 | }) 30 | 31 | Performance('deducts points for having multiple @imports', () => { 32 | const actual = calculate(` 33 | @import url('some-url'); 34 | @import url('another-url'); 35 | test { color: green; } 36 | `) 37 | assert.is(actual.performance.score, 80) 38 | assert.equal(actual.performance.violations, [ 39 | { 40 | id: 'Imports', 41 | value: 2, 42 | score: 20, 43 | actuals: [`url('some-url')`, `url('another-url')`], 44 | }, 45 | ]) 46 | }) 47 | 48 | Performance('does not deduct points for not having empty rules', () => { 49 | const actual = calculate(`test { color: green; }`) 50 | assert.is(actual.performance.score, 100) 51 | assert.is(actual.performance.violations.length, 0) 52 | }) 53 | 54 | Performance('deducts points for having a single empty rule', () => { 55 | const actual = calculate(` 56 | test-empty {} 57 | test { color: green; } 58 | `) 59 | assert.is(actual.performance.score, 99) 60 | assert.equal(actual.performance.violations, [ 61 | { 62 | id: 'EmptyRules', 63 | score: 1, 64 | value: 1, 65 | } 66 | ]) 67 | }) 68 | 69 | Performance('deducts points for having multiple empty rules', () => { 70 | const actual = calculate(` 71 | test-empty1 {} 72 | test-empty2 {} 73 | test { color: green; } 74 | `) 75 | assert.is(actual.performance.score, 98) 76 | assert.equal(actual.performance.violations, [ 77 | { 78 | id: 'EmptyRules', 79 | score: 2, 80 | value: 2, 81 | }, 82 | ]) 83 | }) 84 | 85 | Performance('does not deduct points for having unique selectors', () => { 86 | const actual = calculate(` 87 | test1 { color: green; } 88 | test2 { color: red; } 89 | `) 90 | assert.is(actual.performance.score, 100) 91 | }) 92 | 93 | Performance('deducts points for having low selector uniqueness', () => { 94 | const actual = calculate(` 95 | test1 { color: green; } 96 | test1 { color: red; } 97 | test2 { color: magenta; } 98 | test2 { color: blue; } 99 | `) 100 | assert.is(actual.performance.score, 95) 101 | assert.equal(actual.performance.violations, [ 102 | { 103 | id: 'SelectorDuplications', 104 | score: 5, 105 | value: 2 / 4 106 | }, 107 | ]) 108 | }) 109 | 110 | Performance('does not deduct points for having unique declarations', () => { 111 | const actual = calculate(` 112 | test1 { color: green; } 113 | test2 { color: red; } 114 | `) 115 | assert.is(actual.performance.score, 100) 116 | }) 117 | 118 | Performance('deducts points for having low declaration uniqueness', () => { 119 | const actual = calculate(` 120 | test1 { color: green; } 121 | test2 { color: green; } 122 | test3 { color: red; } 123 | test4 { color: red; } 124 | `) 125 | assert.is(actual.performance.score, 95) 126 | assert.equal(actual.performance.violations, [ 127 | { 128 | id: 'DeclarationDuplications', 129 | score: 5, 130 | value: 2 / 4 131 | } 132 | ]) 133 | }) 134 | 135 | Performance('does not deduct points for small stylesheets', () => { 136 | const actual = calculate(` 137 | test { color: green; } 138 | `); 139 | assert.is(actual.performance.score, 100) 140 | }) 141 | 142 | Performance('deducts points for large stylesheets', () => { 143 | const fixture = Array.from({ length: 10_000 }) 144 | .fill('') 145 | .map((_, index) => `selector-${index} { opacity: 0.${index}}`) 146 | .join('') 147 | const actual = calculate(fixture) 148 | 149 | assert.is(actual.performance.score, 95) 150 | }) 151 | 152 | Performance('deducts points for having comments', () => { 153 | const fixture = Array.from({ length: 100 }) 154 | .fill('/* a comment to take up some space */') 155 | .map((comment, index) => `${comment} selector-${index} { opacity: 0.${index} }`) 156 | .join('') 157 | const actual = calculate(fixture) 158 | 159 | assert.is(actual.performance.score, 90) 160 | assert.equal(actual.performance.violations, [ 161 | { 162 | id: 'TooMuchComments', 163 | score: 10, 164 | value: 3300, 165 | }, 166 | ]) 167 | }) 168 | 169 | Performance('deducts points for having embedded content', () => { 170 | function generateEmbed(index) { 171 | return `data:image/svg+xml,%3Csvg%20id%3D%22Layer_${index}%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20195.6%20107.8%22%3E%3Cpath%20fill%3D%22%23B5B5B5%22%20class%3D%22st0%22%20d%3D%22M97.8%20107.8c-2.6%200-5.1-1-7.1-2.9L2.9%2017.1C-1%2013.2-1%206.8%202.9%202.9%206.8-1%2013.2-1%2017.1%202.9l80.7%2080.7%2080.7-80.7c3.9-3.9%2010.2-3.9%2014.1%200%203.9%203.9%203.9%2010.2%200%2014.1l-87.8%2087.8c-1.9%202-4.4%203-7%203z%22%2F%3E%3C%2Fsvg%3E` 172 | } 173 | const fixture = Array.from({ length: 100 }) 174 | .fill('') 175 | .map((_, index) => ` 176 | selector-${index} { 177 | background: url(${generateEmbed(index)}); 178 | } 179 | `) 180 | .join('') 181 | const actual = calculate(fixture) 182 | 183 | assert.is(actual.performance.score, 80) 184 | assert.equal(actual.performance.violations, [ 185 | { 186 | id: 'TooMuchEmbeddedContent', 187 | score: 20, 188 | value: 45990, 189 | }, 190 | ]) 191 | }) 192 | 193 | Performance.run() -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | // Base options: 4 | "skipLibCheck": true, 5 | "target": "es2022", 6 | "verbatimModuleSyntax": true, 7 | "allowJs": true, 8 | "checkJs": true, 9 | "moduleDetection": "force", 10 | 11 | // Strictness 12 | "strict": true, 13 | "noUncheckedIndexedAccess": true, 14 | 15 | // Type checking, not transpiling 16 | "module": "ESNext", 17 | "moduleResolution": "bundler", 18 | "allowSyntheticDefaultImports": true, 19 | "noEmit": true, 20 | 21 | // Code runs in the DOM 22 | "lib": ["ES2022", "DOM", "DOM.Iterable"], 23 | }, 24 | "include": [ 25 | "src/index.js", 26 | "src/core.js" 27 | ], 28 | "exclude": ["node_modules"] 29 | } 30 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite" 2 | import dts from "vite-plugin-dts" 3 | 4 | export default defineConfig({ 5 | build: { 6 | lib: { 7 | entry: [ 8 | './src/index.js', 9 | './src/core.js', 10 | ], 11 | fileName: () => `[name].js`, 12 | formats: ["es"], 13 | }, 14 | rollupOptions: { 15 | // make sure to externalize deps that shouldn't be bundled 16 | // into your library 17 | external: ["@projectwallace/css-analyzer"], 18 | }, 19 | }, 20 | plugins: [ 21 | dts(), 22 | ], 23 | }) 24 | --------------------------------------------------------------------------------