├── .github └── workflows │ ├── npm-publish.yml │ └── pull-request.yml ├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── index.d.ts ├── index.js ├── package-lock.json ├── package.json ├── src └── verify.ts ├── test ├── poll.spec.ts └── validationTransformer.spec.ts ├── tsconfig.json └── vitest.config.ts /.github/workflows/npm-publish.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: Node.js Package 5 | 6 | on: 7 | release: 8 | types: [created] 9 | 10 | jobs: 11 | publish-npm: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | - uses: actions/setup-node@v4 16 | with: 17 | node-version: 22 18 | registry-url: https://registry.npmjs.org/ 19 | - run: npm ci 20 | - run: npm run build 21 | - run: npm publish --access public 22 | env: 23 | NODE_AUTH_TOKEN: ${{secrets.npm_token}} 24 | -------------------------------------------------------------------------------- /.github/workflows/pull-request.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | test: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | - uses: actions/setup-node@v4 14 | with: 15 | node-version: 22 16 | - run: npm ci 17 | - run: npm install @rollup/rollup-linux-x64-gnu --save-dev 18 | - run: npm run build 19 | - run: npm run test 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | coverage/ 3 | lib/ 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 13 | 14 | # Runtime data 15 | pids 16 | *.pid 17 | *.seed 18 | *.pid.lock 19 | 20 | # Directory for instrumented libs generated by jscoverage/JSCover 21 | lib-cov 22 | 23 | # Coverage directory used by tools like istanbul 24 | coverage 25 | *.lcov 26 | 27 | # nyc test coverage 28 | .nyc_output 29 | 30 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 31 | .grunt 32 | 33 | # Bower dependency directory (https://bower.io/) 34 | bower_components 35 | 36 | # node-waf configuration 37 | .lock-wscript 38 | 39 | # Compiled binary addons (https://nodejs.org/api/addons.html) 40 | build/Release 41 | 42 | # Dependency directories 43 | node_modules/ 44 | jspm_packages/ 45 | 46 | # TypeScript v1 declaration files 47 | typings/ 48 | 49 | # TypeScript cache 50 | *.tsbuildinfo 51 | 52 | # Optional npm cache directory 53 | .npm 54 | 55 | # Optional eslint cache 56 | .eslintcache 57 | 58 | # Microbundle cache 59 | .rpt2_cache/ 60 | .rts2_cache_cjs/ 61 | .rts2_cache_es/ 62 | .rts2_cache_umd/ 63 | 64 | # Optional REPL history 65 | .node_repl_history 66 | 67 | # Output of 'npm pack' 68 | *.tgz 69 | 70 | # Yarn Integrity file 71 | .yarn-integrity 72 | 73 | # dotenv environment variables file 74 | .env 75 | .env.test 76 | 77 | # parcel-bundler cache (https://parceljs.org/) 78 | .cache 79 | 80 | # Next.js build output 81 | .next 82 | 83 | # Nuxt.js build / generate output 84 | .nuxt 85 | dist 86 | 87 | # Gatsby files 88 | .cache/ 89 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 90 | # https://nextjs.org/blog/next-9-1#public-directory-support 91 | # public 92 | 93 | # vuepress build output 94 | .vuepress/dist 95 | 96 | # Serverless directories 97 | .serverless/ 98 | 99 | # FuseBox cache 100 | .fusebox/ 101 | 102 | # DynamoDB Local files 103 | .dynamodb/ 104 | 105 | # TernJS port file 106 | .tern-port 107 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .github/ 2 | test/ 3 | coverage/ 4 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to the "@qavajs/validation" will be documented in this file. 4 | 5 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 6 | 7 | :rocket: - new feature 8 | 9 | :beetle: - bugfix 10 | 11 | :x: - deprecation/removal 12 | 13 | :pencil: - chore 14 | 15 | ## 1.2.1 16 | - :rocket: added capability to pass `softly` prefix and throw `SoftAssertionError` 17 | 18 | ## 1.2.0 19 | - :rocket: added capability to pass `soft` flag and throw `SoftAssertionError` 20 | 21 | ## 1.1.1 22 | - :rocket: added capability to pass _to_ suffix (e.g _equal to_) 23 | 24 | ## 1.1.0 25 | - :rocket: added source maps 26 | 27 | ## 1.0.0 28 | - :rocket: improved error message if poll promise is not resolved in time 29 | 30 | ## 0.10.0 31 | - :rocket: added _poll_ function to perform generic validation 32 | 33 | ## 0.9.0 34 | - :rocket: improved ajv report 35 | 36 | ## 0.8.0 37 | - :pencil: update dependencies 38 | 39 | ## 0.7.1 40 | - :beetle: fixed pollValidation dts 41 | - :beetle: introduced default poll error 42 | - :beetle: clear interval on fail validation 43 | 44 | ## 0.7.0 45 | - :rocket: added _case insensitive equal_ validation 46 | - :rocket: added poll validation 47 | 48 | ## 0.6.0 49 | - :rocket: added prefix to enable displaying error message 50 | 51 | ## 0.0.5 52 | - :rocket: added _match schema_ validation 53 | 54 | ## 0.0.4 55 | - :rocket: added _have property_ validation 56 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 qavajs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @qavajs/validation 2 | 3 | `npm install @qavajs/validation` 4 | 5 | @qavajs library that transforms plain english definition to validation functions 6 | 7 | Lib supports following validations: 8 | * equal - not strict equal (==) 9 | * strictly equal - strict equal (===) 10 | * deeply equal - deep equal (chai eql) 11 | * contain - contain a substring 12 | * match - match a regular expression 13 | * above / greater than - greater than 14 | * below / less than - less than 15 | * have type - type validation 16 | * have members - validation if array/object have exact members 17 | * include members - validation if array/object includes members 18 | * have property - have property validation 19 | * match schema - match [ajv](https://www.npmjs.com/package/ajv) schema 20 | * case insensitive equal - not strict equal (==) with casting to lower case 21 | 22 | All validations can be negated adding _not_ word. 23 | 24 | ## Test 25 | 26 | `npm run test` 27 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | export { getValidation, getPollValidation, verify, validationRegexp, poll } from './src/verify'; -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib/verify'); 2 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@qavajs/validation", 3 | "version": "1.2.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@qavajs/validation", 9 | "version": "1.2.1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "ajv": "^8.17.1", 13 | "chai": "^4.5.0" 14 | }, 15 | "devDependencies": { 16 | "@types/chai": "^4.3.20", 17 | "@types/node": "^22.15.3", 18 | "@vitest/coverage-v8": "^3.1.2", 19 | "typescript": "^5.8.3", 20 | "vitest": "^3.1.2" 21 | } 22 | }, 23 | "node_modules/@ampproject/remapping": { 24 | "version": "2.3.0", 25 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 26 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 27 | "dev": true, 28 | "license": "Apache-2.0", 29 | "dependencies": { 30 | "@jridgewell/gen-mapping": "^0.3.5", 31 | "@jridgewell/trace-mapping": "^0.3.24" 32 | }, 33 | "engines": { 34 | "node": ">=6.0.0" 35 | } 36 | }, 37 | "node_modules/@babel/helper-string-parser": { 38 | "version": "7.25.9", 39 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 40 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 41 | "dev": true, 42 | "license": "MIT", 43 | "engines": { 44 | "node": ">=6.9.0" 45 | } 46 | }, 47 | "node_modules/@babel/helper-validator-identifier": { 48 | "version": "7.25.9", 49 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 50 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 51 | "dev": true, 52 | "license": "MIT", 53 | "engines": { 54 | "node": ">=6.9.0" 55 | } 56 | }, 57 | "node_modules/@babel/parser": { 58 | "version": "7.26.3", 59 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", 60 | "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", 61 | "dev": true, 62 | "license": "MIT", 63 | "dependencies": { 64 | "@babel/types": "^7.26.3" 65 | }, 66 | "bin": { 67 | "parser": "bin/babel-parser.js" 68 | }, 69 | "engines": { 70 | "node": ">=6.0.0" 71 | } 72 | }, 73 | "node_modules/@babel/types": { 74 | "version": "7.26.3", 75 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", 76 | "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", 77 | "dev": true, 78 | "license": "MIT", 79 | "dependencies": { 80 | "@babel/helper-string-parser": "^7.25.9", 81 | "@babel/helper-validator-identifier": "^7.25.9" 82 | }, 83 | "engines": { 84 | "node": ">=6.9.0" 85 | } 86 | }, 87 | "node_modules/@bcoe/v8-coverage": { 88 | "version": "1.0.2", 89 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", 90 | "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", 91 | "dev": true, 92 | "license": "MIT", 93 | "engines": { 94 | "node": ">=18" 95 | } 96 | }, 97 | "node_modules/@esbuild/aix-ppc64": { 98 | "version": "0.25.3", 99 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", 100 | "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", 101 | "cpu": [ 102 | "ppc64" 103 | ], 104 | "dev": true, 105 | "license": "MIT", 106 | "optional": true, 107 | "os": [ 108 | "aix" 109 | ], 110 | "engines": { 111 | "node": ">=18" 112 | } 113 | }, 114 | "node_modules/@esbuild/android-arm": { 115 | "version": "0.25.3", 116 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", 117 | "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", 118 | "cpu": [ 119 | "arm" 120 | ], 121 | "dev": true, 122 | "license": "MIT", 123 | "optional": true, 124 | "os": [ 125 | "android" 126 | ], 127 | "engines": { 128 | "node": ">=18" 129 | } 130 | }, 131 | "node_modules/@esbuild/android-arm64": { 132 | "version": "0.25.3", 133 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", 134 | "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", 135 | "cpu": [ 136 | "arm64" 137 | ], 138 | "dev": true, 139 | "license": "MIT", 140 | "optional": true, 141 | "os": [ 142 | "android" 143 | ], 144 | "engines": { 145 | "node": ">=18" 146 | } 147 | }, 148 | "node_modules/@esbuild/android-x64": { 149 | "version": "0.25.3", 150 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", 151 | "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", 152 | "cpu": [ 153 | "x64" 154 | ], 155 | "dev": true, 156 | "license": "MIT", 157 | "optional": true, 158 | "os": [ 159 | "android" 160 | ], 161 | "engines": { 162 | "node": ">=18" 163 | } 164 | }, 165 | "node_modules/@esbuild/darwin-arm64": { 166 | "version": "0.25.3", 167 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", 168 | "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", 169 | "cpu": [ 170 | "arm64" 171 | ], 172 | "dev": true, 173 | "license": "MIT", 174 | "optional": true, 175 | "os": [ 176 | "darwin" 177 | ], 178 | "engines": { 179 | "node": ">=18" 180 | } 181 | }, 182 | "node_modules/@esbuild/darwin-x64": { 183 | "version": "0.25.3", 184 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", 185 | "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", 186 | "cpu": [ 187 | "x64" 188 | ], 189 | "dev": true, 190 | "license": "MIT", 191 | "optional": true, 192 | "os": [ 193 | "darwin" 194 | ], 195 | "engines": { 196 | "node": ">=18" 197 | } 198 | }, 199 | "node_modules/@esbuild/freebsd-arm64": { 200 | "version": "0.25.3", 201 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", 202 | "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", 203 | "cpu": [ 204 | "arm64" 205 | ], 206 | "dev": true, 207 | "license": "MIT", 208 | "optional": true, 209 | "os": [ 210 | "freebsd" 211 | ], 212 | "engines": { 213 | "node": ">=18" 214 | } 215 | }, 216 | "node_modules/@esbuild/freebsd-x64": { 217 | "version": "0.25.3", 218 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", 219 | "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", 220 | "cpu": [ 221 | "x64" 222 | ], 223 | "dev": true, 224 | "license": "MIT", 225 | "optional": true, 226 | "os": [ 227 | "freebsd" 228 | ], 229 | "engines": { 230 | "node": ">=18" 231 | } 232 | }, 233 | "node_modules/@esbuild/linux-arm": { 234 | "version": "0.25.3", 235 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", 236 | "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", 237 | "cpu": [ 238 | "arm" 239 | ], 240 | "dev": true, 241 | "license": "MIT", 242 | "optional": true, 243 | "os": [ 244 | "linux" 245 | ], 246 | "engines": { 247 | "node": ">=18" 248 | } 249 | }, 250 | "node_modules/@esbuild/linux-arm64": { 251 | "version": "0.25.3", 252 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", 253 | "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", 254 | "cpu": [ 255 | "arm64" 256 | ], 257 | "dev": true, 258 | "license": "MIT", 259 | "optional": true, 260 | "os": [ 261 | "linux" 262 | ], 263 | "engines": { 264 | "node": ">=18" 265 | } 266 | }, 267 | "node_modules/@esbuild/linux-ia32": { 268 | "version": "0.25.3", 269 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", 270 | "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", 271 | "cpu": [ 272 | "ia32" 273 | ], 274 | "dev": true, 275 | "license": "MIT", 276 | "optional": true, 277 | "os": [ 278 | "linux" 279 | ], 280 | "engines": { 281 | "node": ">=18" 282 | } 283 | }, 284 | "node_modules/@esbuild/linux-loong64": { 285 | "version": "0.25.3", 286 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", 287 | "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", 288 | "cpu": [ 289 | "loong64" 290 | ], 291 | "dev": true, 292 | "license": "MIT", 293 | "optional": true, 294 | "os": [ 295 | "linux" 296 | ], 297 | "engines": { 298 | "node": ">=18" 299 | } 300 | }, 301 | "node_modules/@esbuild/linux-mips64el": { 302 | "version": "0.25.3", 303 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", 304 | "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", 305 | "cpu": [ 306 | "mips64el" 307 | ], 308 | "dev": true, 309 | "license": "MIT", 310 | "optional": true, 311 | "os": [ 312 | "linux" 313 | ], 314 | "engines": { 315 | "node": ">=18" 316 | } 317 | }, 318 | "node_modules/@esbuild/linux-ppc64": { 319 | "version": "0.25.3", 320 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", 321 | "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", 322 | "cpu": [ 323 | "ppc64" 324 | ], 325 | "dev": true, 326 | "license": "MIT", 327 | "optional": true, 328 | "os": [ 329 | "linux" 330 | ], 331 | "engines": { 332 | "node": ">=18" 333 | } 334 | }, 335 | "node_modules/@esbuild/linux-riscv64": { 336 | "version": "0.25.3", 337 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", 338 | "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", 339 | "cpu": [ 340 | "riscv64" 341 | ], 342 | "dev": true, 343 | "license": "MIT", 344 | "optional": true, 345 | "os": [ 346 | "linux" 347 | ], 348 | "engines": { 349 | "node": ">=18" 350 | } 351 | }, 352 | "node_modules/@esbuild/linux-s390x": { 353 | "version": "0.25.3", 354 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", 355 | "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", 356 | "cpu": [ 357 | "s390x" 358 | ], 359 | "dev": true, 360 | "license": "MIT", 361 | "optional": true, 362 | "os": [ 363 | "linux" 364 | ], 365 | "engines": { 366 | "node": ">=18" 367 | } 368 | }, 369 | "node_modules/@esbuild/linux-x64": { 370 | "version": "0.25.3", 371 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", 372 | "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", 373 | "cpu": [ 374 | "x64" 375 | ], 376 | "dev": true, 377 | "license": "MIT", 378 | "optional": true, 379 | "os": [ 380 | "linux" 381 | ], 382 | "engines": { 383 | "node": ">=18" 384 | } 385 | }, 386 | "node_modules/@esbuild/netbsd-arm64": { 387 | "version": "0.25.3", 388 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", 389 | "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", 390 | "cpu": [ 391 | "arm64" 392 | ], 393 | "dev": true, 394 | "license": "MIT", 395 | "optional": true, 396 | "os": [ 397 | "netbsd" 398 | ], 399 | "engines": { 400 | "node": ">=18" 401 | } 402 | }, 403 | "node_modules/@esbuild/netbsd-x64": { 404 | "version": "0.25.3", 405 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", 406 | "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", 407 | "cpu": [ 408 | "x64" 409 | ], 410 | "dev": true, 411 | "license": "MIT", 412 | "optional": true, 413 | "os": [ 414 | "netbsd" 415 | ], 416 | "engines": { 417 | "node": ">=18" 418 | } 419 | }, 420 | "node_modules/@esbuild/openbsd-arm64": { 421 | "version": "0.25.3", 422 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", 423 | "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", 424 | "cpu": [ 425 | "arm64" 426 | ], 427 | "dev": true, 428 | "license": "MIT", 429 | "optional": true, 430 | "os": [ 431 | "openbsd" 432 | ], 433 | "engines": { 434 | "node": ">=18" 435 | } 436 | }, 437 | "node_modules/@esbuild/openbsd-x64": { 438 | "version": "0.25.3", 439 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", 440 | "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", 441 | "cpu": [ 442 | "x64" 443 | ], 444 | "dev": true, 445 | "license": "MIT", 446 | "optional": true, 447 | "os": [ 448 | "openbsd" 449 | ], 450 | "engines": { 451 | "node": ">=18" 452 | } 453 | }, 454 | "node_modules/@esbuild/sunos-x64": { 455 | "version": "0.25.3", 456 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", 457 | "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", 458 | "cpu": [ 459 | "x64" 460 | ], 461 | "dev": true, 462 | "license": "MIT", 463 | "optional": true, 464 | "os": [ 465 | "sunos" 466 | ], 467 | "engines": { 468 | "node": ">=18" 469 | } 470 | }, 471 | "node_modules/@esbuild/win32-arm64": { 472 | "version": "0.25.3", 473 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", 474 | "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", 475 | "cpu": [ 476 | "arm64" 477 | ], 478 | "dev": true, 479 | "license": "MIT", 480 | "optional": true, 481 | "os": [ 482 | "win32" 483 | ], 484 | "engines": { 485 | "node": ">=18" 486 | } 487 | }, 488 | "node_modules/@esbuild/win32-ia32": { 489 | "version": "0.25.3", 490 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", 491 | "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", 492 | "cpu": [ 493 | "ia32" 494 | ], 495 | "dev": true, 496 | "license": "MIT", 497 | "optional": true, 498 | "os": [ 499 | "win32" 500 | ], 501 | "engines": { 502 | "node": ">=18" 503 | } 504 | }, 505 | "node_modules/@esbuild/win32-x64": { 506 | "version": "0.25.3", 507 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", 508 | "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", 509 | "cpu": [ 510 | "x64" 511 | ], 512 | "dev": true, 513 | "license": "MIT", 514 | "optional": true, 515 | "os": [ 516 | "win32" 517 | ], 518 | "engines": { 519 | "node": ">=18" 520 | } 521 | }, 522 | "node_modules/@isaacs/cliui": { 523 | "version": "8.0.2", 524 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 525 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 526 | "dev": true, 527 | "license": "ISC", 528 | "dependencies": { 529 | "string-width": "^5.1.2", 530 | "string-width-cjs": "npm:string-width@^4.2.0", 531 | "strip-ansi": "^7.0.1", 532 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 533 | "wrap-ansi": "^8.1.0", 534 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 535 | }, 536 | "engines": { 537 | "node": ">=12" 538 | } 539 | }, 540 | "node_modules/@istanbuljs/schema": { 541 | "version": "0.1.3", 542 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 543 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 544 | "dev": true, 545 | "license": "MIT", 546 | "engines": { 547 | "node": ">=8" 548 | } 549 | }, 550 | "node_modules/@jridgewell/gen-mapping": { 551 | "version": "0.3.8", 552 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 553 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 554 | "dev": true, 555 | "license": "MIT", 556 | "dependencies": { 557 | "@jridgewell/set-array": "^1.2.1", 558 | "@jridgewell/sourcemap-codec": "^1.4.10", 559 | "@jridgewell/trace-mapping": "^0.3.24" 560 | }, 561 | "engines": { 562 | "node": ">=6.0.0" 563 | } 564 | }, 565 | "node_modules/@jridgewell/resolve-uri": { 566 | "version": "3.1.2", 567 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 568 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 569 | "dev": true, 570 | "license": "MIT", 571 | "engines": { 572 | "node": ">=6.0.0" 573 | } 574 | }, 575 | "node_modules/@jridgewell/set-array": { 576 | "version": "1.2.1", 577 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 578 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 579 | "dev": true, 580 | "license": "MIT", 581 | "engines": { 582 | "node": ">=6.0.0" 583 | } 584 | }, 585 | "node_modules/@jridgewell/sourcemap-codec": { 586 | "version": "1.5.0", 587 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 588 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 589 | "dev": true, 590 | "license": "MIT" 591 | }, 592 | "node_modules/@jridgewell/trace-mapping": { 593 | "version": "0.3.25", 594 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 595 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 596 | "dev": true, 597 | "license": "MIT", 598 | "dependencies": { 599 | "@jridgewell/resolve-uri": "^3.1.0", 600 | "@jridgewell/sourcemap-codec": "^1.4.14" 601 | } 602 | }, 603 | "node_modules/@pkgjs/parseargs": { 604 | "version": "0.11.0", 605 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 606 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 607 | "dev": true, 608 | "license": "MIT", 609 | "optional": true, 610 | "engines": { 611 | "node": ">=14" 612 | } 613 | }, 614 | "node_modules/@rollup/rollup-android-arm-eabi": { 615 | "version": "4.40.1", 616 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", 617 | "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", 618 | "cpu": [ 619 | "arm" 620 | ], 621 | "dev": true, 622 | "license": "MIT", 623 | "optional": true, 624 | "os": [ 625 | "android" 626 | ] 627 | }, 628 | "node_modules/@rollup/rollup-android-arm64": { 629 | "version": "4.40.1", 630 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", 631 | "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", 632 | "cpu": [ 633 | "arm64" 634 | ], 635 | "dev": true, 636 | "license": "MIT", 637 | "optional": true, 638 | "os": [ 639 | "android" 640 | ] 641 | }, 642 | "node_modules/@rollup/rollup-darwin-arm64": { 643 | "version": "4.40.1", 644 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", 645 | "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", 646 | "cpu": [ 647 | "arm64" 648 | ], 649 | "dev": true, 650 | "license": "MIT", 651 | "optional": true, 652 | "os": [ 653 | "darwin" 654 | ] 655 | }, 656 | "node_modules/@rollup/rollup-darwin-x64": { 657 | "version": "4.40.1", 658 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", 659 | "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", 660 | "cpu": [ 661 | "x64" 662 | ], 663 | "dev": true, 664 | "license": "MIT", 665 | "optional": true, 666 | "os": [ 667 | "darwin" 668 | ] 669 | }, 670 | "node_modules/@rollup/rollup-freebsd-arm64": { 671 | "version": "4.40.1", 672 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", 673 | "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", 674 | "cpu": [ 675 | "arm64" 676 | ], 677 | "dev": true, 678 | "license": "MIT", 679 | "optional": true, 680 | "os": [ 681 | "freebsd" 682 | ] 683 | }, 684 | "node_modules/@rollup/rollup-freebsd-x64": { 685 | "version": "4.40.1", 686 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", 687 | "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", 688 | "cpu": [ 689 | "x64" 690 | ], 691 | "dev": true, 692 | "license": "MIT", 693 | "optional": true, 694 | "os": [ 695 | "freebsd" 696 | ] 697 | }, 698 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 699 | "version": "4.40.1", 700 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", 701 | "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", 702 | "cpu": [ 703 | "arm" 704 | ], 705 | "dev": true, 706 | "license": "MIT", 707 | "optional": true, 708 | "os": [ 709 | "linux" 710 | ] 711 | }, 712 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 713 | "version": "4.40.1", 714 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", 715 | "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", 716 | "cpu": [ 717 | "arm" 718 | ], 719 | "dev": true, 720 | "license": "MIT", 721 | "optional": true, 722 | "os": [ 723 | "linux" 724 | ] 725 | }, 726 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 727 | "version": "4.40.1", 728 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", 729 | "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", 730 | "cpu": [ 731 | "arm64" 732 | ], 733 | "dev": true, 734 | "license": "MIT", 735 | "optional": true, 736 | "os": [ 737 | "linux" 738 | ] 739 | }, 740 | "node_modules/@rollup/rollup-linux-arm64-musl": { 741 | "version": "4.40.1", 742 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", 743 | "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", 744 | "cpu": [ 745 | "arm64" 746 | ], 747 | "dev": true, 748 | "license": "MIT", 749 | "optional": true, 750 | "os": [ 751 | "linux" 752 | ] 753 | }, 754 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 755 | "version": "4.40.1", 756 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", 757 | "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", 758 | "cpu": [ 759 | "loong64" 760 | ], 761 | "dev": true, 762 | "license": "MIT", 763 | "optional": true, 764 | "os": [ 765 | "linux" 766 | ] 767 | }, 768 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 769 | "version": "4.40.1", 770 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", 771 | "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", 772 | "cpu": [ 773 | "ppc64" 774 | ], 775 | "dev": true, 776 | "license": "MIT", 777 | "optional": true, 778 | "os": [ 779 | "linux" 780 | ] 781 | }, 782 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 783 | "version": "4.40.1", 784 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", 785 | "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", 786 | "cpu": [ 787 | "riscv64" 788 | ], 789 | "dev": true, 790 | "license": "MIT", 791 | "optional": true, 792 | "os": [ 793 | "linux" 794 | ] 795 | }, 796 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 797 | "version": "4.40.1", 798 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", 799 | "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", 800 | "cpu": [ 801 | "riscv64" 802 | ], 803 | "dev": true, 804 | "license": "MIT", 805 | "optional": true, 806 | "os": [ 807 | "linux" 808 | ] 809 | }, 810 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 811 | "version": "4.40.1", 812 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", 813 | "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", 814 | "cpu": [ 815 | "s390x" 816 | ], 817 | "dev": true, 818 | "license": "MIT", 819 | "optional": true, 820 | "os": [ 821 | "linux" 822 | ] 823 | }, 824 | "node_modules/@rollup/rollup-linux-x64-gnu": { 825 | "version": "4.40.1", 826 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", 827 | "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", 828 | "cpu": [ 829 | "x64" 830 | ], 831 | "dev": true, 832 | "license": "MIT", 833 | "optional": true, 834 | "os": [ 835 | "linux" 836 | ] 837 | }, 838 | "node_modules/@rollup/rollup-linux-x64-musl": { 839 | "version": "4.40.1", 840 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", 841 | "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", 842 | "cpu": [ 843 | "x64" 844 | ], 845 | "dev": true, 846 | "license": "MIT", 847 | "optional": true, 848 | "os": [ 849 | "linux" 850 | ] 851 | }, 852 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 853 | "version": "4.40.1", 854 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", 855 | "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", 856 | "cpu": [ 857 | "arm64" 858 | ], 859 | "dev": true, 860 | "license": "MIT", 861 | "optional": true, 862 | "os": [ 863 | "win32" 864 | ] 865 | }, 866 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 867 | "version": "4.40.1", 868 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", 869 | "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", 870 | "cpu": [ 871 | "ia32" 872 | ], 873 | "dev": true, 874 | "license": "MIT", 875 | "optional": true, 876 | "os": [ 877 | "win32" 878 | ] 879 | }, 880 | "node_modules/@rollup/rollup-win32-x64-msvc": { 881 | "version": "4.40.1", 882 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", 883 | "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", 884 | "cpu": [ 885 | "x64" 886 | ], 887 | "dev": true, 888 | "license": "MIT", 889 | "optional": true, 890 | "os": [ 891 | "win32" 892 | ] 893 | }, 894 | "node_modules/@types/chai": { 895 | "version": "4.3.20", 896 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", 897 | "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", 898 | "dev": true, 899 | "license": "MIT" 900 | }, 901 | "node_modules/@types/estree": { 902 | "version": "1.0.7", 903 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", 904 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 905 | "dev": true, 906 | "license": "MIT" 907 | }, 908 | "node_modules/@types/node": { 909 | "version": "22.15.3", 910 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", 911 | "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", 912 | "dev": true, 913 | "license": "MIT", 914 | "dependencies": { 915 | "undici-types": "~6.21.0" 916 | } 917 | }, 918 | "node_modules/@vitest/coverage-v8": { 919 | "version": "3.1.2", 920 | "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.2.tgz", 921 | "integrity": "sha512-XDdaDOeaTMAMYW7N63AqoK32sYUWbXnTkC6tEbVcu3RlU1bB9of32T+PGf8KZvxqLNqeXhafDFqCkwpf2+dyaQ==", 922 | "dev": true, 923 | "license": "MIT", 924 | "dependencies": { 925 | "@ampproject/remapping": "^2.3.0", 926 | "@bcoe/v8-coverage": "^1.0.2", 927 | "debug": "^4.4.0", 928 | "istanbul-lib-coverage": "^3.2.2", 929 | "istanbul-lib-report": "^3.0.1", 930 | "istanbul-lib-source-maps": "^5.0.6", 931 | "istanbul-reports": "^3.1.7", 932 | "magic-string": "^0.30.17", 933 | "magicast": "^0.3.5", 934 | "std-env": "^3.9.0", 935 | "test-exclude": "^7.0.1", 936 | "tinyrainbow": "^2.0.0" 937 | }, 938 | "funding": { 939 | "url": "https://opencollective.com/vitest" 940 | }, 941 | "peerDependencies": { 942 | "@vitest/browser": "3.1.2", 943 | "vitest": "3.1.2" 944 | }, 945 | "peerDependenciesMeta": { 946 | "@vitest/browser": { 947 | "optional": true 948 | } 949 | } 950 | }, 951 | "node_modules/@vitest/expect": { 952 | "version": "3.1.2", 953 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.2.tgz", 954 | "integrity": "sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==", 955 | "dev": true, 956 | "license": "MIT", 957 | "dependencies": { 958 | "@vitest/spy": "3.1.2", 959 | "@vitest/utils": "3.1.2", 960 | "chai": "^5.2.0", 961 | "tinyrainbow": "^2.0.0" 962 | }, 963 | "funding": { 964 | "url": "https://opencollective.com/vitest" 965 | } 966 | }, 967 | "node_modules/@vitest/expect/node_modules/assertion-error": { 968 | "version": "2.0.1", 969 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 970 | "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 971 | "dev": true, 972 | "license": "MIT", 973 | "engines": { 974 | "node": ">=12" 975 | } 976 | }, 977 | "node_modules/@vitest/expect/node_modules/chai": { 978 | "version": "5.2.0", 979 | "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", 980 | "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", 981 | "dev": true, 982 | "license": "MIT", 983 | "dependencies": { 984 | "assertion-error": "^2.0.1", 985 | "check-error": "^2.1.1", 986 | "deep-eql": "^5.0.1", 987 | "loupe": "^3.1.0", 988 | "pathval": "^2.0.0" 989 | }, 990 | "engines": { 991 | "node": ">=12" 992 | } 993 | }, 994 | "node_modules/@vitest/expect/node_modules/check-error": { 995 | "version": "2.1.1", 996 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 997 | "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 998 | "dev": true, 999 | "license": "MIT", 1000 | "engines": { 1001 | "node": ">= 16" 1002 | } 1003 | }, 1004 | "node_modules/@vitest/expect/node_modules/deep-eql": { 1005 | "version": "5.0.2", 1006 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 1007 | "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 1008 | "dev": true, 1009 | "license": "MIT", 1010 | "engines": { 1011 | "node": ">=6" 1012 | } 1013 | }, 1014 | "node_modules/@vitest/expect/node_modules/loupe": { 1015 | "version": "3.1.3", 1016 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", 1017 | "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", 1018 | "dev": true, 1019 | "license": "MIT" 1020 | }, 1021 | "node_modules/@vitest/expect/node_modules/pathval": { 1022 | "version": "2.0.0", 1023 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", 1024 | "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", 1025 | "dev": true, 1026 | "license": "MIT", 1027 | "engines": { 1028 | "node": ">= 14.16" 1029 | } 1030 | }, 1031 | "node_modules/@vitest/mocker": { 1032 | "version": "3.1.2", 1033 | "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.2.tgz", 1034 | "integrity": "sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==", 1035 | "dev": true, 1036 | "license": "MIT", 1037 | "dependencies": { 1038 | "@vitest/spy": "3.1.2", 1039 | "estree-walker": "^3.0.3", 1040 | "magic-string": "^0.30.17" 1041 | }, 1042 | "funding": { 1043 | "url": "https://opencollective.com/vitest" 1044 | }, 1045 | "peerDependencies": { 1046 | "msw": "^2.4.9", 1047 | "vite": "^5.0.0 || ^6.0.0" 1048 | }, 1049 | "peerDependenciesMeta": { 1050 | "msw": { 1051 | "optional": true 1052 | }, 1053 | "vite": { 1054 | "optional": true 1055 | } 1056 | } 1057 | }, 1058 | "node_modules/@vitest/pretty-format": { 1059 | "version": "3.1.2", 1060 | "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.2.tgz", 1061 | "integrity": "sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==", 1062 | "dev": true, 1063 | "license": "MIT", 1064 | "dependencies": { 1065 | "tinyrainbow": "^2.0.0" 1066 | }, 1067 | "funding": { 1068 | "url": "https://opencollective.com/vitest" 1069 | } 1070 | }, 1071 | "node_modules/@vitest/runner": { 1072 | "version": "3.1.2", 1073 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.2.tgz", 1074 | "integrity": "sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==", 1075 | "dev": true, 1076 | "license": "MIT", 1077 | "dependencies": { 1078 | "@vitest/utils": "3.1.2", 1079 | "pathe": "^2.0.3" 1080 | }, 1081 | "funding": { 1082 | "url": "https://opencollective.com/vitest" 1083 | } 1084 | }, 1085 | "node_modules/@vitest/snapshot": { 1086 | "version": "3.1.2", 1087 | "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.2.tgz", 1088 | "integrity": "sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==", 1089 | "dev": true, 1090 | "license": "MIT", 1091 | "dependencies": { 1092 | "@vitest/pretty-format": "3.1.2", 1093 | "magic-string": "^0.30.17", 1094 | "pathe": "^2.0.3" 1095 | }, 1096 | "funding": { 1097 | "url": "https://opencollective.com/vitest" 1098 | } 1099 | }, 1100 | "node_modules/@vitest/spy": { 1101 | "version": "3.1.2", 1102 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.2.tgz", 1103 | "integrity": "sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==", 1104 | "dev": true, 1105 | "license": "MIT", 1106 | "dependencies": { 1107 | "tinyspy": "^3.0.2" 1108 | }, 1109 | "funding": { 1110 | "url": "https://opencollective.com/vitest" 1111 | } 1112 | }, 1113 | "node_modules/@vitest/utils": { 1114 | "version": "3.1.2", 1115 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.2.tgz", 1116 | "integrity": "sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==", 1117 | "dev": true, 1118 | "license": "MIT", 1119 | "dependencies": { 1120 | "@vitest/pretty-format": "3.1.2", 1121 | "loupe": "^3.1.3", 1122 | "tinyrainbow": "^2.0.0" 1123 | }, 1124 | "funding": { 1125 | "url": "https://opencollective.com/vitest" 1126 | } 1127 | }, 1128 | "node_modules/@vitest/utils/node_modules/loupe": { 1129 | "version": "3.1.3", 1130 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", 1131 | "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", 1132 | "dev": true, 1133 | "license": "MIT" 1134 | }, 1135 | "node_modules/ajv": { 1136 | "version": "8.17.1", 1137 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", 1138 | "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", 1139 | "license": "MIT", 1140 | "dependencies": { 1141 | "fast-deep-equal": "^3.1.3", 1142 | "fast-uri": "^3.0.1", 1143 | "json-schema-traverse": "^1.0.0", 1144 | "require-from-string": "^2.0.2" 1145 | }, 1146 | "funding": { 1147 | "type": "github", 1148 | "url": "https://github.com/sponsors/epoberezkin" 1149 | } 1150 | }, 1151 | "node_modules/ansi-regex": { 1152 | "version": "6.0.1", 1153 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 1154 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 1155 | "dev": true, 1156 | "license": "MIT", 1157 | "engines": { 1158 | "node": ">=12" 1159 | }, 1160 | "funding": { 1161 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1162 | } 1163 | }, 1164 | "node_modules/ansi-styles": { 1165 | "version": "6.2.1", 1166 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 1167 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 1168 | "dev": true, 1169 | "license": "MIT", 1170 | "engines": { 1171 | "node": ">=12" 1172 | }, 1173 | "funding": { 1174 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1175 | } 1176 | }, 1177 | "node_modules/assertion-error": { 1178 | "version": "1.1.0", 1179 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 1180 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 1181 | "engines": { 1182 | "node": "*" 1183 | } 1184 | }, 1185 | "node_modules/balanced-match": { 1186 | "version": "1.0.2", 1187 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1188 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1189 | "dev": true, 1190 | "license": "MIT" 1191 | }, 1192 | "node_modules/brace-expansion": { 1193 | "version": "2.0.1", 1194 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1195 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1196 | "dev": true, 1197 | "license": "MIT", 1198 | "dependencies": { 1199 | "balanced-match": "^1.0.0" 1200 | } 1201 | }, 1202 | "node_modules/cac": { 1203 | "version": "6.7.14", 1204 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 1205 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 1206 | "dev": true, 1207 | "license": "MIT", 1208 | "engines": { 1209 | "node": ">=8" 1210 | } 1211 | }, 1212 | "node_modules/chai": { 1213 | "version": "4.5.0", 1214 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", 1215 | "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", 1216 | "license": "MIT", 1217 | "dependencies": { 1218 | "assertion-error": "^1.1.0", 1219 | "check-error": "^1.0.3", 1220 | "deep-eql": "^4.1.3", 1221 | "get-func-name": "^2.0.2", 1222 | "loupe": "^2.3.6", 1223 | "pathval": "^1.1.1", 1224 | "type-detect": "^4.1.0" 1225 | }, 1226 | "engines": { 1227 | "node": ">=4" 1228 | } 1229 | }, 1230 | "node_modules/check-error": { 1231 | "version": "1.0.3", 1232 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", 1233 | "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", 1234 | "dependencies": { 1235 | "get-func-name": "^2.0.2" 1236 | }, 1237 | "engines": { 1238 | "node": "*" 1239 | } 1240 | }, 1241 | "node_modules/color-convert": { 1242 | "version": "2.0.1", 1243 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1244 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1245 | "dev": true, 1246 | "license": "MIT", 1247 | "dependencies": { 1248 | "color-name": "~1.1.4" 1249 | }, 1250 | "engines": { 1251 | "node": ">=7.0.0" 1252 | } 1253 | }, 1254 | "node_modules/color-name": { 1255 | "version": "1.1.4", 1256 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1257 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1258 | "dev": true, 1259 | "license": "MIT" 1260 | }, 1261 | "node_modules/cross-spawn": { 1262 | "version": "7.0.6", 1263 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1264 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1265 | "dev": true, 1266 | "license": "MIT", 1267 | "dependencies": { 1268 | "path-key": "^3.1.0", 1269 | "shebang-command": "^2.0.0", 1270 | "which": "^2.0.1" 1271 | }, 1272 | "engines": { 1273 | "node": ">= 8" 1274 | } 1275 | }, 1276 | "node_modules/debug": { 1277 | "version": "4.4.0", 1278 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1279 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1280 | "dev": true, 1281 | "license": "MIT", 1282 | "dependencies": { 1283 | "ms": "^2.1.3" 1284 | }, 1285 | "engines": { 1286 | "node": ">=6.0" 1287 | }, 1288 | "peerDependenciesMeta": { 1289 | "supports-color": { 1290 | "optional": true 1291 | } 1292 | } 1293 | }, 1294 | "node_modules/deep-eql": { 1295 | "version": "4.1.3", 1296 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", 1297 | "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", 1298 | "dependencies": { 1299 | "type-detect": "^4.0.0" 1300 | }, 1301 | "engines": { 1302 | "node": ">=6" 1303 | } 1304 | }, 1305 | "node_modules/eastasianwidth": { 1306 | "version": "0.2.0", 1307 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1308 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1309 | "dev": true, 1310 | "license": "MIT" 1311 | }, 1312 | "node_modules/emoji-regex": { 1313 | "version": "9.2.2", 1314 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1315 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1316 | "dev": true, 1317 | "license": "MIT" 1318 | }, 1319 | "node_modules/es-module-lexer": { 1320 | "version": "1.7.0", 1321 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", 1322 | "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", 1323 | "dev": true, 1324 | "license": "MIT" 1325 | }, 1326 | "node_modules/esbuild": { 1327 | "version": "0.25.3", 1328 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", 1329 | "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", 1330 | "dev": true, 1331 | "hasInstallScript": true, 1332 | "license": "MIT", 1333 | "bin": { 1334 | "esbuild": "bin/esbuild" 1335 | }, 1336 | "engines": { 1337 | "node": ">=18" 1338 | }, 1339 | "optionalDependencies": { 1340 | "@esbuild/aix-ppc64": "0.25.3", 1341 | "@esbuild/android-arm": "0.25.3", 1342 | "@esbuild/android-arm64": "0.25.3", 1343 | "@esbuild/android-x64": "0.25.3", 1344 | "@esbuild/darwin-arm64": "0.25.3", 1345 | "@esbuild/darwin-x64": "0.25.3", 1346 | "@esbuild/freebsd-arm64": "0.25.3", 1347 | "@esbuild/freebsd-x64": "0.25.3", 1348 | "@esbuild/linux-arm": "0.25.3", 1349 | "@esbuild/linux-arm64": "0.25.3", 1350 | "@esbuild/linux-ia32": "0.25.3", 1351 | "@esbuild/linux-loong64": "0.25.3", 1352 | "@esbuild/linux-mips64el": "0.25.3", 1353 | "@esbuild/linux-ppc64": "0.25.3", 1354 | "@esbuild/linux-riscv64": "0.25.3", 1355 | "@esbuild/linux-s390x": "0.25.3", 1356 | "@esbuild/linux-x64": "0.25.3", 1357 | "@esbuild/netbsd-arm64": "0.25.3", 1358 | "@esbuild/netbsd-x64": "0.25.3", 1359 | "@esbuild/openbsd-arm64": "0.25.3", 1360 | "@esbuild/openbsd-x64": "0.25.3", 1361 | "@esbuild/sunos-x64": "0.25.3", 1362 | "@esbuild/win32-arm64": "0.25.3", 1363 | "@esbuild/win32-ia32": "0.25.3", 1364 | "@esbuild/win32-x64": "0.25.3" 1365 | } 1366 | }, 1367 | "node_modules/estree-walker": { 1368 | "version": "3.0.3", 1369 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 1370 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 1371 | "dev": true, 1372 | "license": "MIT", 1373 | "dependencies": { 1374 | "@types/estree": "^1.0.0" 1375 | } 1376 | }, 1377 | "node_modules/expect-type": { 1378 | "version": "1.2.1", 1379 | "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", 1380 | "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", 1381 | "dev": true, 1382 | "license": "Apache-2.0", 1383 | "engines": { 1384 | "node": ">=12.0.0" 1385 | } 1386 | }, 1387 | "node_modules/fast-deep-equal": { 1388 | "version": "3.1.3", 1389 | "license": "MIT" 1390 | }, 1391 | "node_modules/fast-uri": { 1392 | "version": "3.0.1", 1393 | "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", 1394 | "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", 1395 | "license": "MIT" 1396 | }, 1397 | "node_modules/fdir": { 1398 | "version": "6.4.4", 1399 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", 1400 | "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 1401 | "dev": true, 1402 | "license": "MIT", 1403 | "peerDependencies": { 1404 | "picomatch": "^3 || ^4" 1405 | }, 1406 | "peerDependenciesMeta": { 1407 | "picomatch": { 1408 | "optional": true 1409 | } 1410 | } 1411 | }, 1412 | "node_modules/foreground-child": { 1413 | "version": "3.2.1", 1414 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", 1415 | "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", 1416 | "dev": true, 1417 | "license": "ISC", 1418 | "dependencies": { 1419 | "cross-spawn": "^7.0.0", 1420 | "signal-exit": "^4.0.1" 1421 | }, 1422 | "engines": { 1423 | "node": ">=14" 1424 | }, 1425 | "funding": { 1426 | "url": "https://github.com/sponsors/isaacs" 1427 | } 1428 | }, 1429 | "node_modules/fsevents": { 1430 | "version": "2.3.3", 1431 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1432 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1433 | "dev": true, 1434 | "hasInstallScript": true, 1435 | "license": "MIT", 1436 | "optional": true, 1437 | "os": [ 1438 | "darwin" 1439 | ], 1440 | "engines": { 1441 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1442 | } 1443 | }, 1444 | "node_modules/get-func-name": { 1445 | "version": "2.0.2", 1446 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", 1447 | "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", 1448 | "engines": { 1449 | "node": "*" 1450 | } 1451 | }, 1452 | "node_modules/glob": { 1453 | "version": "10.4.5", 1454 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1455 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1456 | "dev": true, 1457 | "license": "ISC", 1458 | "dependencies": { 1459 | "foreground-child": "^3.1.0", 1460 | "jackspeak": "^3.1.2", 1461 | "minimatch": "^9.0.4", 1462 | "minipass": "^7.1.2", 1463 | "package-json-from-dist": "^1.0.0", 1464 | "path-scurry": "^1.11.1" 1465 | }, 1466 | "bin": { 1467 | "glob": "dist/esm/bin.mjs" 1468 | }, 1469 | "funding": { 1470 | "url": "https://github.com/sponsors/isaacs" 1471 | } 1472 | }, 1473 | "node_modules/has-flag": { 1474 | "version": "4.0.0", 1475 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1476 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1477 | "dev": true, 1478 | "license": "MIT", 1479 | "engines": { 1480 | "node": ">=8" 1481 | } 1482 | }, 1483 | "node_modules/html-escaper": { 1484 | "version": "2.0.2", 1485 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1486 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1487 | "dev": true, 1488 | "license": "MIT" 1489 | }, 1490 | "node_modules/is-fullwidth-code-point": { 1491 | "version": "3.0.0", 1492 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1493 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1494 | "dev": true, 1495 | "license": "MIT", 1496 | "engines": { 1497 | "node": ">=8" 1498 | } 1499 | }, 1500 | "node_modules/isexe": { 1501 | "version": "2.0.0", 1502 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1503 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1504 | "dev": true, 1505 | "license": "ISC" 1506 | }, 1507 | "node_modules/istanbul-lib-coverage": { 1508 | "version": "3.2.2", 1509 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", 1510 | "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", 1511 | "dev": true, 1512 | "license": "BSD-3-Clause", 1513 | "engines": { 1514 | "node": ">=8" 1515 | } 1516 | }, 1517 | "node_modules/istanbul-lib-report": { 1518 | "version": "3.0.1", 1519 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", 1520 | "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", 1521 | "dev": true, 1522 | "license": "BSD-3-Clause", 1523 | "dependencies": { 1524 | "istanbul-lib-coverage": "^3.0.0", 1525 | "make-dir": "^4.0.0", 1526 | "supports-color": "^7.1.0" 1527 | }, 1528 | "engines": { 1529 | "node": ">=10" 1530 | } 1531 | }, 1532 | "node_modules/istanbul-lib-source-maps": { 1533 | "version": "5.0.6", 1534 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", 1535 | "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", 1536 | "dev": true, 1537 | "license": "BSD-3-Clause", 1538 | "dependencies": { 1539 | "@jridgewell/trace-mapping": "^0.3.23", 1540 | "debug": "^4.1.1", 1541 | "istanbul-lib-coverage": "^3.0.0" 1542 | }, 1543 | "engines": { 1544 | "node": ">=10" 1545 | } 1546 | }, 1547 | "node_modules/istanbul-reports": { 1548 | "version": "3.1.7", 1549 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", 1550 | "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", 1551 | "dev": true, 1552 | "license": "BSD-3-Clause", 1553 | "dependencies": { 1554 | "html-escaper": "^2.0.0", 1555 | "istanbul-lib-report": "^3.0.0" 1556 | }, 1557 | "engines": { 1558 | "node": ">=8" 1559 | } 1560 | }, 1561 | "node_modules/jackspeak": { 1562 | "version": "3.4.3", 1563 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1564 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1565 | "dev": true, 1566 | "license": "BlueOak-1.0.0", 1567 | "dependencies": { 1568 | "@isaacs/cliui": "^8.0.2" 1569 | }, 1570 | "funding": { 1571 | "url": "https://github.com/sponsors/isaacs" 1572 | }, 1573 | "optionalDependencies": { 1574 | "@pkgjs/parseargs": "^0.11.0" 1575 | } 1576 | }, 1577 | "node_modules/json-schema-traverse": { 1578 | "version": "1.0.0", 1579 | "license": "MIT" 1580 | }, 1581 | "node_modules/loupe": { 1582 | "version": "2.3.7", 1583 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", 1584 | "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", 1585 | "dependencies": { 1586 | "get-func-name": "^2.0.1" 1587 | } 1588 | }, 1589 | "node_modules/lru-cache": { 1590 | "version": "10.4.3", 1591 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1592 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1593 | "dev": true, 1594 | "license": "ISC" 1595 | }, 1596 | "node_modules/magic-string": { 1597 | "version": "0.30.17", 1598 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 1599 | "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 1600 | "dev": true, 1601 | "license": "MIT", 1602 | "dependencies": { 1603 | "@jridgewell/sourcemap-codec": "^1.5.0" 1604 | } 1605 | }, 1606 | "node_modules/magicast": { 1607 | "version": "0.3.5", 1608 | "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", 1609 | "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", 1610 | "dev": true, 1611 | "license": "MIT", 1612 | "dependencies": { 1613 | "@babel/parser": "^7.25.4", 1614 | "@babel/types": "^7.25.4", 1615 | "source-map-js": "^1.2.0" 1616 | } 1617 | }, 1618 | "node_modules/make-dir": { 1619 | "version": "4.0.0", 1620 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", 1621 | "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", 1622 | "dev": true, 1623 | "license": "MIT", 1624 | "dependencies": { 1625 | "semver": "^7.5.3" 1626 | }, 1627 | "engines": { 1628 | "node": ">=10" 1629 | }, 1630 | "funding": { 1631 | "url": "https://github.com/sponsors/sindresorhus" 1632 | } 1633 | }, 1634 | "node_modules/minimatch": { 1635 | "version": "9.0.5", 1636 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1637 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1638 | "dev": true, 1639 | "license": "ISC", 1640 | "dependencies": { 1641 | "brace-expansion": "^2.0.1" 1642 | }, 1643 | "engines": { 1644 | "node": ">=16 || 14 >=14.17" 1645 | }, 1646 | "funding": { 1647 | "url": "https://github.com/sponsors/isaacs" 1648 | } 1649 | }, 1650 | "node_modules/minipass": { 1651 | "version": "7.1.2", 1652 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1653 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1654 | "dev": true, 1655 | "license": "ISC", 1656 | "engines": { 1657 | "node": ">=16 || 14 >=14.17" 1658 | } 1659 | }, 1660 | "node_modules/ms": { 1661 | "version": "2.1.3", 1662 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1663 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1664 | "dev": true, 1665 | "license": "MIT" 1666 | }, 1667 | "node_modules/nanoid": { 1668 | "version": "3.3.11", 1669 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 1670 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1671 | "dev": true, 1672 | "funding": [ 1673 | { 1674 | "type": "github", 1675 | "url": "https://github.com/sponsors/ai" 1676 | } 1677 | ], 1678 | "license": "MIT", 1679 | "bin": { 1680 | "nanoid": "bin/nanoid.cjs" 1681 | }, 1682 | "engines": { 1683 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1684 | } 1685 | }, 1686 | "node_modules/package-json-from-dist": { 1687 | "version": "1.0.0", 1688 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", 1689 | "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", 1690 | "dev": true, 1691 | "license": "BlueOak-1.0.0" 1692 | }, 1693 | "node_modules/path-key": { 1694 | "version": "3.1.1", 1695 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1696 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1697 | "dev": true, 1698 | "license": "MIT", 1699 | "engines": { 1700 | "node": ">=8" 1701 | } 1702 | }, 1703 | "node_modules/path-scurry": { 1704 | "version": "1.11.1", 1705 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1706 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1707 | "dev": true, 1708 | "license": "BlueOak-1.0.0", 1709 | "dependencies": { 1710 | "lru-cache": "^10.2.0", 1711 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1712 | }, 1713 | "engines": { 1714 | "node": ">=16 || 14 >=14.18" 1715 | }, 1716 | "funding": { 1717 | "url": "https://github.com/sponsors/isaacs" 1718 | } 1719 | }, 1720 | "node_modules/pathe": { 1721 | "version": "2.0.3", 1722 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 1723 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 1724 | "dev": true, 1725 | "license": "MIT" 1726 | }, 1727 | "node_modules/pathval": { 1728 | "version": "1.1.1", 1729 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 1730 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 1731 | "engines": { 1732 | "node": "*" 1733 | } 1734 | }, 1735 | "node_modules/picocolors": { 1736 | "version": "1.1.1", 1737 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1738 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1739 | "dev": true, 1740 | "license": "ISC" 1741 | }, 1742 | "node_modules/picomatch": { 1743 | "version": "4.0.2", 1744 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1745 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1746 | "dev": true, 1747 | "license": "MIT", 1748 | "engines": { 1749 | "node": ">=12" 1750 | }, 1751 | "funding": { 1752 | "url": "https://github.com/sponsors/jonschlinkert" 1753 | } 1754 | }, 1755 | "node_modules/postcss": { 1756 | "version": "8.5.3", 1757 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 1758 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1759 | "dev": true, 1760 | "funding": [ 1761 | { 1762 | "type": "opencollective", 1763 | "url": "https://opencollective.com/postcss/" 1764 | }, 1765 | { 1766 | "type": "tidelift", 1767 | "url": "https://tidelift.com/funding/github/npm/postcss" 1768 | }, 1769 | { 1770 | "type": "github", 1771 | "url": "https://github.com/sponsors/ai" 1772 | } 1773 | ], 1774 | "license": "MIT", 1775 | "dependencies": { 1776 | "nanoid": "^3.3.8", 1777 | "picocolors": "^1.1.1", 1778 | "source-map-js": "^1.2.1" 1779 | }, 1780 | "engines": { 1781 | "node": "^10 || ^12 || >=14" 1782 | } 1783 | }, 1784 | "node_modules/require-from-string": { 1785 | "version": "2.0.2", 1786 | "license": "MIT", 1787 | "engines": { 1788 | "node": ">=0.10.0" 1789 | } 1790 | }, 1791 | "node_modules/rollup": { 1792 | "version": "4.40.1", 1793 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", 1794 | "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", 1795 | "dev": true, 1796 | "license": "MIT", 1797 | "dependencies": { 1798 | "@types/estree": "1.0.7" 1799 | }, 1800 | "bin": { 1801 | "rollup": "dist/bin/rollup" 1802 | }, 1803 | "engines": { 1804 | "node": ">=18.0.0", 1805 | "npm": ">=8.0.0" 1806 | }, 1807 | "optionalDependencies": { 1808 | "@rollup/rollup-android-arm-eabi": "4.40.1", 1809 | "@rollup/rollup-android-arm64": "4.40.1", 1810 | "@rollup/rollup-darwin-arm64": "4.40.1", 1811 | "@rollup/rollup-darwin-x64": "4.40.1", 1812 | "@rollup/rollup-freebsd-arm64": "4.40.1", 1813 | "@rollup/rollup-freebsd-x64": "4.40.1", 1814 | "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", 1815 | "@rollup/rollup-linux-arm-musleabihf": "4.40.1", 1816 | "@rollup/rollup-linux-arm64-gnu": "4.40.1", 1817 | "@rollup/rollup-linux-arm64-musl": "4.40.1", 1818 | "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", 1819 | "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", 1820 | "@rollup/rollup-linux-riscv64-gnu": "4.40.1", 1821 | "@rollup/rollup-linux-riscv64-musl": "4.40.1", 1822 | "@rollup/rollup-linux-s390x-gnu": "4.40.1", 1823 | "@rollup/rollup-linux-x64-gnu": "4.40.1", 1824 | "@rollup/rollup-linux-x64-musl": "4.40.1", 1825 | "@rollup/rollup-win32-arm64-msvc": "4.40.1", 1826 | "@rollup/rollup-win32-ia32-msvc": "4.40.1", 1827 | "@rollup/rollup-win32-x64-msvc": "4.40.1", 1828 | "fsevents": "~2.3.2" 1829 | } 1830 | }, 1831 | "node_modules/semver": { 1832 | "version": "7.6.3", 1833 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1834 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1835 | "dev": true, 1836 | "license": "ISC", 1837 | "bin": { 1838 | "semver": "bin/semver.js" 1839 | }, 1840 | "engines": { 1841 | "node": ">=10" 1842 | } 1843 | }, 1844 | "node_modules/shebang-command": { 1845 | "version": "2.0.0", 1846 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1847 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1848 | "dev": true, 1849 | "license": "MIT", 1850 | "dependencies": { 1851 | "shebang-regex": "^3.0.0" 1852 | }, 1853 | "engines": { 1854 | "node": ">=8" 1855 | } 1856 | }, 1857 | "node_modules/shebang-regex": { 1858 | "version": "3.0.0", 1859 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1860 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1861 | "dev": true, 1862 | "license": "MIT", 1863 | "engines": { 1864 | "node": ">=8" 1865 | } 1866 | }, 1867 | "node_modules/siginfo": { 1868 | "version": "2.0.0", 1869 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 1870 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 1871 | "dev": true, 1872 | "license": "ISC" 1873 | }, 1874 | "node_modules/signal-exit": { 1875 | "version": "4.1.0", 1876 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1877 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1878 | "dev": true, 1879 | "license": "ISC", 1880 | "engines": { 1881 | "node": ">=14" 1882 | }, 1883 | "funding": { 1884 | "url": "https://github.com/sponsors/isaacs" 1885 | } 1886 | }, 1887 | "node_modules/source-map-js": { 1888 | "version": "1.2.1", 1889 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1890 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1891 | "dev": true, 1892 | "license": "BSD-3-Clause", 1893 | "engines": { 1894 | "node": ">=0.10.0" 1895 | } 1896 | }, 1897 | "node_modules/stackback": { 1898 | "version": "0.0.2", 1899 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 1900 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 1901 | "dev": true, 1902 | "license": "MIT" 1903 | }, 1904 | "node_modules/std-env": { 1905 | "version": "3.9.0", 1906 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", 1907 | "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", 1908 | "dev": true, 1909 | "license": "MIT" 1910 | }, 1911 | "node_modules/string-width": { 1912 | "version": "5.1.2", 1913 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1914 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1915 | "dev": true, 1916 | "license": "MIT", 1917 | "dependencies": { 1918 | "eastasianwidth": "^0.2.0", 1919 | "emoji-regex": "^9.2.2", 1920 | "strip-ansi": "^7.0.1" 1921 | }, 1922 | "engines": { 1923 | "node": ">=12" 1924 | }, 1925 | "funding": { 1926 | "url": "https://github.com/sponsors/sindresorhus" 1927 | } 1928 | }, 1929 | "node_modules/string-width-cjs": { 1930 | "name": "string-width", 1931 | "version": "4.2.3", 1932 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1933 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1934 | "dev": true, 1935 | "license": "MIT", 1936 | "dependencies": { 1937 | "emoji-regex": "^8.0.0", 1938 | "is-fullwidth-code-point": "^3.0.0", 1939 | "strip-ansi": "^6.0.1" 1940 | }, 1941 | "engines": { 1942 | "node": ">=8" 1943 | } 1944 | }, 1945 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1946 | "version": "5.0.1", 1947 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1948 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1949 | "dev": true, 1950 | "license": "MIT", 1951 | "engines": { 1952 | "node": ">=8" 1953 | } 1954 | }, 1955 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1956 | "version": "8.0.0", 1957 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1958 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1959 | "dev": true, 1960 | "license": "MIT" 1961 | }, 1962 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1963 | "version": "6.0.1", 1964 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1965 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1966 | "dev": true, 1967 | "license": "MIT", 1968 | "dependencies": { 1969 | "ansi-regex": "^5.0.1" 1970 | }, 1971 | "engines": { 1972 | "node": ">=8" 1973 | } 1974 | }, 1975 | "node_modules/strip-ansi": { 1976 | "version": "7.1.0", 1977 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1978 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1979 | "dev": true, 1980 | "license": "MIT", 1981 | "dependencies": { 1982 | "ansi-regex": "^6.0.1" 1983 | }, 1984 | "engines": { 1985 | "node": ">=12" 1986 | }, 1987 | "funding": { 1988 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1989 | } 1990 | }, 1991 | "node_modules/strip-ansi-cjs": { 1992 | "name": "strip-ansi", 1993 | "version": "6.0.1", 1994 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1995 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1996 | "dev": true, 1997 | "license": "MIT", 1998 | "dependencies": { 1999 | "ansi-regex": "^5.0.1" 2000 | }, 2001 | "engines": { 2002 | "node": ">=8" 2003 | } 2004 | }, 2005 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2006 | "version": "5.0.1", 2007 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2008 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2009 | "dev": true, 2010 | "license": "MIT", 2011 | "engines": { 2012 | "node": ">=8" 2013 | } 2014 | }, 2015 | "node_modules/supports-color": { 2016 | "version": "7.2.0", 2017 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2018 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2019 | "dev": true, 2020 | "license": "MIT", 2021 | "dependencies": { 2022 | "has-flag": "^4.0.0" 2023 | }, 2024 | "engines": { 2025 | "node": ">=8" 2026 | } 2027 | }, 2028 | "node_modules/test-exclude": { 2029 | "version": "7.0.1", 2030 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", 2031 | "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", 2032 | "dev": true, 2033 | "license": "ISC", 2034 | "dependencies": { 2035 | "@istanbuljs/schema": "^0.1.2", 2036 | "glob": "^10.4.1", 2037 | "minimatch": "^9.0.4" 2038 | }, 2039 | "engines": { 2040 | "node": ">=18" 2041 | } 2042 | }, 2043 | "node_modules/tinybench": { 2044 | "version": "2.9.0", 2045 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", 2046 | "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", 2047 | "dev": true, 2048 | "license": "MIT" 2049 | }, 2050 | "node_modules/tinyexec": { 2051 | "version": "0.3.2", 2052 | "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 2053 | "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 2054 | "dev": true, 2055 | "license": "MIT" 2056 | }, 2057 | "node_modules/tinyglobby": { 2058 | "version": "0.2.13", 2059 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", 2060 | "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", 2061 | "dev": true, 2062 | "license": "MIT", 2063 | "dependencies": { 2064 | "fdir": "^6.4.4", 2065 | "picomatch": "^4.0.2" 2066 | }, 2067 | "engines": { 2068 | "node": ">=12.0.0" 2069 | }, 2070 | "funding": { 2071 | "url": "https://github.com/sponsors/SuperchupuDev" 2072 | } 2073 | }, 2074 | "node_modules/tinypool": { 2075 | "version": "1.0.2", 2076 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", 2077 | "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", 2078 | "dev": true, 2079 | "license": "MIT", 2080 | "engines": { 2081 | "node": "^18.0.0 || >=20.0.0" 2082 | } 2083 | }, 2084 | "node_modules/tinyrainbow": { 2085 | "version": "2.0.0", 2086 | "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", 2087 | "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", 2088 | "dev": true, 2089 | "license": "MIT", 2090 | "engines": { 2091 | "node": ">=14.0.0" 2092 | } 2093 | }, 2094 | "node_modules/tinyspy": { 2095 | "version": "3.0.2", 2096 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", 2097 | "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", 2098 | "dev": true, 2099 | "license": "MIT", 2100 | "engines": { 2101 | "node": ">=14.0.0" 2102 | } 2103 | }, 2104 | "node_modules/type-detect": { 2105 | "version": "4.1.0", 2106 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", 2107 | "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", 2108 | "license": "MIT", 2109 | "engines": { 2110 | "node": ">=4" 2111 | } 2112 | }, 2113 | "node_modules/typescript": { 2114 | "version": "5.8.3", 2115 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 2116 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 2117 | "dev": true, 2118 | "license": "Apache-2.0", 2119 | "bin": { 2120 | "tsc": "bin/tsc", 2121 | "tsserver": "bin/tsserver" 2122 | }, 2123 | "engines": { 2124 | "node": ">=14.17" 2125 | } 2126 | }, 2127 | "node_modules/undici-types": { 2128 | "version": "6.21.0", 2129 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", 2130 | "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", 2131 | "dev": true, 2132 | "license": "MIT" 2133 | }, 2134 | "node_modules/vite": { 2135 | "version": "6.3.3", 2136 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.3.tgz", 2137 | "integrity": "sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==", 2138 | "dev": true, 2139 | "license": "MIT", 2140 | "dependencies": { 2141 | "esbuild": "^0.25.0", 2142 | "fdir": "^6.4.4", 2143 | "picomatch": "^4.0.2", 2144 | "postcss": "^8.5.3", 2145 | "rollup": "^4.34.9", 2146 | "tinyglobby": "^0.2.13" 2147 | }, 2148 | "bin": { 2149 | "vite": "bin/vite.js" 2150 | }, 2151 | "engines": { 2152 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2153 | }, 2154 | "funding": { 2155 | "url": "https://github.com/vitejs/vite?sponsor=1" 2156 | }, 2157 | "optionalDependencies": { 2158 | "fsevents": "~2.3.3" 2159 | }, 2160 | "peerDependencies": { 2161 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 2162 | "jiti": ">=1.21.0", 2163 | "less": "*", 2164 | "lightningcss": "^1.21.0", 2165 | "sass": "*", 2166 | "sass-embedded": "*", 2167 | "stylus": "*", 2168 | "sugarss": "*", 2169 | "terser": "^5.16.0", 2170 | "tsx": "^4.8.1", 2171 | "yaml": "^2.4.2" 2172 | }, 2173 | "peerDependenciesMeta": { 2174 | "@types/node": { 2175 | "optional": true 2176 | }, 2177 | "jiti": { 2178 | "optional": true 2179 | }, 2180 | "less": { 2181 | "optional": true 2182 | }, 2183 | "lightningcss": { 2184 | "optional": true 2185 | }, 2186 | "sass": { 2187 | "optional": true 2188 | }, 2189 | "sass-embedded": { 2190 | "optional": true 2191 | }, 2192 | "stylus": { 2193 | "optional": true 2194 | }, 2195 | "sugarss": { 2196 | "optional": true 2197 | }, 2198 | "terser": { 2199 | "optional": true 2200 | }, 2201 | "tsx": { 2202 | "optional": true 2203 | }, 2204 | "yaml": { 2205 | "optional": true 2206 | } 2207 | } 2208 | }, 2209 | "node_modules/vite-node": { 2210 | "version": "3.1.2", 2211 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.2.tgz", 2212 | "integrity": "sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==", 2213 | "dev": true, 2214 | "license": "MIT", 2215 | "dependencies": { 2216 | "cac": "^6.7.14", 2217 | "debug": "^4.4.0", 2218 | "es-module-lexer": "^1.6.0", 2219 | "pathe": "^2.0.3", 2220 | "vite": "^5.0.0 || ^6.0.0" 2221 | }, 2222 | "bin": { 2223 | "vite-node": "vite-node.mjs" 2224 | }, 2225 | "engines": { 2226 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2227 | }, 2228 | "funding": { 2229 | "url": "https://opencollective.com/vitest" 2230 | } 2231 | }, 2232 | "node_modules/vitest": { 2233 | "version": "3.1.2", 2234 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.2.tgz", 2235 | "integrity": "sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==", 2236 | "dev": true, 2237 | "license": "MIT", 2238 | "dependencies": { 2239 | "@vitest/expect": "3.1.2", 2240 | "@vitest/mocker": "3.1.2", 2241 | "@vitest/pretty-format": "^3.1.2", 2242 | "@vitest/runner": "3.1.2", 2243 | "@vitest/snapshot": "3.1.2", 2244 | "@vitest/spy": "3.1.2", 2245 | "@vitest/utils": "3.1.2", 2246 | "chai": "^5.2.0", 2247 | "debug": "^4.4.0", 2248 | "expect-type": "^1.2.1", 2249 | "magic-string": "^0.30.17", 2250 | "pathe": "^2.0.3", 2251 | "std-env": "^3.9.0", 2252 | "tinybench": "^2.9.0", 2253 | "tinyexec": "^0.3.2", 2254 | "tinyglobby": "^0.2.13", 2255 | "tinypool": "^1.0.2", 2256 | "tinyrainbow": "^2.0.0", 2257 | "vite": "^5.0.0 || ^6.0.0", 2258 | "vite-node": "3.1.2", 2259 | "why-is-node-running": "^2.3.0" 2260 | }, 2261 | "bin": { 2262 | "vitest": "vitest.mjs" 2263 | }, 2264 | "engines": { 2265 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2266 | }, 2267 | "funding": { 2268 | "url": "https://opencollective.com/vitest" 2269 | }, 2270 | "peerDependencies": { 2271 | "@edge-runtime/vm": "*", 2272 | "@types/debug": "^4.1.12", 2273 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 2274 | "@vitest/browser": "3.1.2", 2275 | "@vitest/ui": "3.1.2", 2276 | "happy-dom": "*", 2277 | "jsdom": "*" 2278 | }, 2279 | "peerDependenciesMeta": { 2280 | "@edge-runtime/vm": { 2281 | "optional": true 2282 | }, 2283 | "@types/debug": { 2284 | "optional": true 2285 | }, 2286 | "@types/node": { 2287 | "optional": true 2288 | }, 2289 | "@vitest/browser": { 2290 | "optional": true 2291 | }, 2292 | "@vitest/ui": { 2293 | "optional": true 2294 | }, 2295 | "happy-dom": { 2296 | "optional": true 2297 | }, 2298 | "jsdom": { 2299 | "optional": true 2300 | } 2301 | } 2302 | }, 2303 | "node_modules/vitest/node_modules/assertion-error": { 2304 | "version": "2.0.1", 2305 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 2306 | "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 2307 | "dev": true, 2308 | "license": "MIT", 2309 | "engines": { 2310 | "node": ">=12" 2311 | } 2312 | }, 2313 | "node_modules/vitest/node_modules/chai": { 2314 | "version": "5.2.0", 2315 | "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", 2316 | "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", 2317 | "dev": true, 2318 | "license": "MIT", 2319 | "dependencies": { 2320 | "assertion-error": "^2.0.1", 2321 | "check-error": "^2.1.1", 2322 | "deep-eql": "^5.0.1", 2323 | "loupe": "^3.1.0", 2324 | "pathval": "^2.0.0" 2325 | }, 2326 | "engines": { 2327 | "node": ">=12" 2328 | } 2329 | }, 2330 | "node_modules/vitest/node_modules/check-error": { 2331 | "version": "2.1.1", 2332 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 2333 | "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 2334 | "dev": true, 2335 | "license": "MIT", 2336 | "engines": { 2337 | "node": ">= 16" 2338 | } 2339 | }, 2340 | "node_modules/vitest/node_modules/deep-eql": { 2341 | "version": "5.0.2", 2342 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 2343 | "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 2344 | "dev": true, 2345 | "license": "MIT", 2346 | "engines": { 2347 | "node": ">=6" 2348 | } 2349 | }, 2350 | "node_modules/vitest/node_modules/loupe": { 2351 | "version": "3.1.3", 2352 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", 2353 | "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", 2354 | "dev": true, 2355 | "license": "MIT" 2356 | }, 2357 | "node_modules/vitest/node_modules/pathval": { 2358 | "version": "2.0.0", 2359 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", 2360 | "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", 2361 | "dev": true, 2362 | "license": "MIT", 2363 | "engines": { 2364 | "node": ">= 14.16" 2365 | } 2366 | }, 2367 | "node_modules/which": { 2368 | "version": "2.0.2", 2369 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2370 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2371 | "dev": true, 2372 | "license": "ISC", 2373 | "dependencies": { 2374 | "isexe": "^2.0.0" 2375 | }, 2376 | "bin": { 2377 | "node-which": "bin/node-which" 2378 | }, 2379 | "engines": { 2380 | "node": ">= 8" 2381 | } 2382 | }, 2383 | "node_modules/why-is-node-running": { 2384 | "version": "2.3.0", 2385 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", 2386 | "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", 2387 | "dev": true, 2388 | "license": "MIT", 2389 | "dependencies": { 2390 | "siginfo": "^2.0.0", 2391 | "stackback": "0.0.2" 2392 | }, 2393 | "bin": { 2394 | "why-is-node-running": "cli.js" 2395 | }, 2396 | "engines": { 2397 | "node": ">=8" 2398 | } 2399 | }, 2400 | "node_modules/wrap-ansi": { 2401 | "version": "8.1.0", 2402 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 2403 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 2404 | "dev": true, 2405 | "license": "MIT", 2406 | "dependencies": { 2407 | "ansi-styles": "^6.1.0", 2408 | "string-width": "^5.0.1", 2409 | "strip-ansi": "^7.0.1" 2410 | }, 2411 | "engines": { 2412 | "node": ">=12" 2413 | }, 2414 | "funding": { 2415 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2416 | } 2417 | }, 2418 | "node_modules/wrap-ansi-cjs": { 2419 | "name": "wrap-ansi", 2420 | "version": "7.0.0", 2421 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2422 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2423 | "dev": true, 2424 | "license": "MIT", 2425 | "dependencies": { 2426 | "ansi-styles": "^4.0.0", 2427 | "string-width": "^4.1.0", 2428 | "strip-ansi": "^6.0.0" 2429 | }, 2430 | "engines": { 2431 | "node": ">=10" 2432 | }, 2433 | "funding": { 2434 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2435 | } 2436 | }, 2437 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 2438 | "version": "5.0.1", 2439 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2440 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2441 | "dev": true, 2442 | "license": "MIT", 2443 | "engines": { 2444 | "node": ">=8" 2445 | } 2446 | }, 2447 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 2448 | "version": "4.3.0", 2449 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2450 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2451 | "dev": true, 2452 | "license": "MIT", 2453 | "dependencies": { 2454 | "color-convert": "^2.0.1" 2455 | }, 2456 | "engines": { 2457 | "node": ">=8" 2458 | }, 2459 | "funding": { 2460 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2461 | } 2462 | }, 2463 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 2464 | "version": "8.0.0", 2465 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2466 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2467 | "dev": true, 2468 | "license": "MIT" 2469 | }, 2470 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 2471 | "version": "4.2.3", 2472 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2473 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2474 | "dev": true, 2475 | "license": "MIT", 2476 | "dependencies": { 2477 | "emoji-regex": "^8.0.0", 2478 | "is-fullwidth-code-point": "^3.0.0", 2479 | "strip-ansi": "^6.0.1" 2480 | }, 2481 | "engines": { 2482 | "node": ">=8" 2483 | } 2484 | }, 2485 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 2486 | "version": "6.0.1", 2487 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2488 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2489 | "dev": true, 2490 | "license": "MIT", 2491 | "dependencies": { 2492 | "ansi-regex": "^5.0.1" 2493 | }, 2494 | "engines": { 2495 | "node": ">=8" 2496 | } 2497 | } 2498 | } 2499 | } 2500 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@qavajs/validation", 3 | "version": "1.2.1", 4 | "description": "Lib that transform plain english definition to validation functions", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "tsc", 8 | "test": "vitest --coverage run" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/qavajs/validation.git" 13 | }, 14 | "keywords": [ 15 | "QA", 16 | "Test Automation" 17 | ], 18 | "authors": [ 19 | "Alexandr Galichenko", 20 | "Alexandr Legchilov" 21 | ], 22 | "license": "MIT", 23 | "types": "./index.d.ts", 24 | "bugs": { 25 | "url": "https://github.com/qavajs/validation/issues" 26 | }, 27 | "homepage": "https://github.com/qavajs/validation#readme", 28 | "devDependencies": { 29 | "@types/chai": "^4.3.20", 30 | "@types/node": "^22.15.3", 31 | "typescript": "^5.8.3", 32 | "@vitest/coverage-v8": "^3.1.2", 33 | "vitest": "^3.1.2" 34 | }, 35 | "dependencies": { 36 | "ajv": "^8.17.1", 37 | "chai": "^4.5.0" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/verify.ts: -------------------------------------------------------------------------------- 1 | import { expect, Assertion, AssertionError} from 'chai'; 2 | import Ajv from 'ajv' 3 | 4 | export class SoftAssertionError extends AssertionError { 5 | name = 'SoftAssertionError'; 6 | } 7 | 8 | Assertion.addMethod('notStrictEqual', function (ER) { 9 | const obj = this._obj; 10 | 11 | this.assert( 12 | obj == ER, 13 | 'expected #{this} to equal #{exp}', 14 | 'expected #{this} to not equal #{exp}', 15 | ER, 16 | obj 17 | ); 18 | }); 19 | 20 | Assertion.addMethod('caseInsensitiveEqual', function (ER) { 21 | const obj = this._obj; 22 | 23 | this.assert( 24 | obj.toLowerCase() == ER.toLowerCase(), 25 | 'expected #{this} to equal #{exp}', 26 | 'expected #{this} to not equal #{exp}', 27 | ER, 28 | obj 29 | ); 30 | }); 31 | 32 | Assertion.addMethod('matchSchema', function (schema) { 33 | const obj = this._obj; 34 | const ajv = new Ajv(); 35 | const validate = ajv.compile(schema); 36 | const isValid = validate(obj); 37 | const messages = validate.errors 38 | ? validate.errors?.map(err => `${err.instancePath} ${err.message} (${err.schemaPath})`) 39 | : []; 40 | const errors = [ 41 | 'object does not match schema', 42 | ...messages 43 | ].join('\n'); 44 | this.assert( 45 | isValid, 46 | errors, 47 | 'expected #{this} to not match schema #{exp}', 48 | '', 49 | '' 50 | ); 51 | }); 52 | 53 | export const validations = { 54 | EQUAL: 'equal', 55 | DEEPLY_EQUAL: 'deeply equal', 56 | STRICTLY_EQUAL: 'strictly equal', 57 | HAVE_MEMBERS: 'have member', 58 | MATCH: 'match', 59 | CONTAIN: 'contain', 60 | ABOVE: 'above', 61 | BELOW: 'below', 62 | GREATER: 'greater than', 63 | LESS: 'less than', 64 | HAVE_TYPE: 'have type', 65 | INCLUDE_MEMBERS: 'include member', 66 | HAVE_PROPERTY: 'have property', 67 | MATCH_SCHEMA: 'match schema', 68 | CASE_INSENSITIVE_EQUAL: 'case insensitive equal', 69 | }; 70 | 71 | const isClause = '(?:is |do |does |to )?'; 72 | const notClause = '(?not |to not )?'; 73 | const toBeClause = '(?:to )?(?:be )?'; 74 | const softlyClause = '(?softly )?'; 75 | const validationClause = `(?:(?${Object.values(validations).join('|')})(?:s|es| to)?)`; 76 | 77 | export const validationExtractRegexp = new RegExp(`^${isClause}${notClause}${toBeClause}${softlyClause}${validationClause}$`); 78 | export const validationRegexp = new RegExp(`(${isClause}${notClause}${toBeClause}${softlyClause}${validationClause})`); 79 | 80 | type VerifyInput = { 81 | AR: any; 82 | ER: any; 83 | validation: string; 84 | reverse: boolean; 85 | soft: boolean; 86 | }; 87 | 88 | const aboveFn = (expectClause: any, ER: any) => expectClause.above(toNumber(ER)); 89 | const belowFn = (expectClause: any, ER: any) => expectClause.below(toNumber(ER)); 90 | const validationFns = { 91 | [validations.EQUAL]: (expectClause: any, ER: any) => expectClause.notStrictEqual(ER), 92 | [validations.STRICTLY_EQUAL]: (expectClause: any, ER: any) => expectClause.equal(ER), 93 | [validations.DEEPLY_EQUAL]: (expectClause: any, ER: any) => expectClause.eql(ER), 94 | [validations.HAVE_MEMBERS]: (expectClause: any, ER: any) => expectClause.have.members(ER), 95 | [validations.MATCH]: (expectClause: any, ER: any) => expectClause.match(toRegexp(ER)), 96 | [validations.CONTAIN]: (expectClause: any, ER: any) => expectClause.contain(ER), 97 | [validations.ABOVE]: aboveFn, 98 | [validations.BELOW]: belowFn, 99 | [validations.GREATER]: aboveFn, 100 | [validations.LESS]: belowFn, 101 | [validations.HAVE_TYPE]: (expectClause: any, ER: string) => expectClause.a(ER), 102 | [validations.INCLUDE_MEMBERS]: (expectClause: any, ER: string) => expectClause.include.members(ER), 103 | [validations.HAVE_PROPERTY]: (expectClause: any, ER: string) => expectClause.have.property(ER), 104 | [validations.MATCH_SCHEMA]: (expectClause: any, ER: string) => expectClause.matchSchema(ER), 105 | [validations.CASE_INSENSITIVE_EQUAL]: (expectClause: any, ER: any) => expectClause.caseInsensitiveEqual(ER), 106 | }; 107 | 108 | /** 109 | * Basic verification function 110 | * @param {VerifyInput} object with all needed data for validation 111 | */ 112 | export function verify({ AR, ER, validation, reverse, soft }: VerifyInput): void { 113 | const prefix = 'Fail'; 114 | const expectClause = reverse ? expect(AR, prefix).to.not : expect(AR, prefix).to; 115 | const validate = validationFns[validation]; 116 | try { 117 | validate(expectClause, ER); 118 | } catch (err) { 119 | if (soft && err instanceof Error) throw new SoftAssertionError(err.message, { cause: err }); 120 | throw err; 121 | } 122 | } 123 | 124 | export function getValidation(validationType: string, options?: { soft: boolean }): (AR: any, ER: any) => void { 125 | const match = validationExtractRegexp.exec(validationType); 126 | if (!match) throw new Error(`Validation '${validationType}' is not supported`); 127 | const { reverse, validation, soft } = match.groups as {[p: string]: string}; 128 | const softProp = options?.soft || !!soft; 129 | return function (AR: any, ER: any) { 130 | verify({ AR, ER, validation, reverse: Boolean(reverse), soft: softProp }); 131 | }; 132 | } 133 | 134 | export function getPollValidation(validationType: string, options?: { soft: boolean }): (AR: any, ER: any, options?: { timeout?: number, interval?: number }) => Promise { 135 | const match = validationExtractRegexp.exec(validationType); 136 | if (!match) throw new Error(`Poll validation '${validationType}' is not supported`); 137 | const { reverse, validation, soft } = match.groups as {[p: string]: string}; 138 | const softProp = options?.soft || !!soft; 139 | return async function (AR: any, ER: any, options?: { timeout?: number, interval?: number }) { 140 | const timeout = options?.timeout ?? 5000; 141 | const interval = options?.interval ?? 500; 142 | let lastError: Error = new Error(`Promise was not settled before timeout`); 143 | let intervalId: NodeJS.Timeout; 144 | const evaluatePromise = new Promise(resolve => { 145 | intervalId = setInterval(async () => { 146 | try { 147 | const actualValue = await AR(); 148 | verify({ 149 | AR: actualValue, 150 | ER, 151 | validation, 152 | reverse: Boolean(reverse), 153 | soft: softProp 154 | }); 155 | clearInterval(intervalId); 156 | resolve(); 157 | } catch (err: any) { 158 | lastError = err; 159 | } 160 | }, interval); 161 | }); 162 | const timeoutPromise = new Promise((_, reject) => setTimeout(() => { 163 | clearInterval(intervalId); 164 | reject(lastError) 165 | }, timeout)); 166 | return Promise.race([evaluatePromise, timeoutPromise]); 167 | }; 168 | } 169 | 170 | export async function poll(fn: Function, options?: { timeout?: number, interval?: number }) { 171 | const timeout = options?.timeout ?? 5000; 172 | const interval = options?.interval ?? 500; 173 | let lastError: Error = new Error('Unexpected error'); 174 | let intervalId: NodeJS.Timeout; 175 | const evaluatePromise = new Promise(resolve => { 176 | intervalId = setInterval(async () => { 177 | try { 178 | await fn(); 179 | clearInterval(intervalId); 180 | resolve(); 181 | } catch (err: any) { 182 | lastError = err; 183 | } 184 | }, interval); 185 | }); 186 | const timeoutPromise = new Promise((_, reject) => setTimeout(() => { 187 | clearInterval(intervalId); 188 | reject(lastError); 189 | }, timeout)); 190 | return Promise.race([evaluatePromise, timeoutPromise]); 191 | } 192 | 193 | function toNumber(n: any): number { 194 | const parsedNumber = parseFloat(n); 195 | if (Number.isNaN(parsedNumber)) { 196 | throw new Error(`${n} is not a number`); 197 | } 198 | return parsedNumber; 199 | } 200 | 201 | function toRegexp(r: string | RegExp): RegExp { 202 | return r instanceof RegExp ? r : new RegExp(r); 203 | } 204 | -------------------------------------------------------------------------------- /test/poll.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from 'vitest'; 2 | import { getPollValidation, poll } from '../src/verify'; 3 | 4 | function asyncActualValueString() { 5 | let index = 0; 6 | const values = [ 7 | 'uno', 8 | 'dos', 9 | 'tres' 10 | ]; 11 | return async function() { 12 | return values[index++] 13 | } 14 | } 15 | 16 | function asyncActualValueStringWithTimeout(timeout: number) { 17 | let index = 0; 18 | const values = [ 19 | 'uno', 20 | 'dos', 21 | 'tres' 22 | ]; 23 | return async function() { 24 | return new Promise(resolve => { 25 | setTimeout(() => { 26 | resolve(values[index++]) 27 | }, timeout) 28 | }) 29 | } 30 | } 31 | 32 | test('poll to equal', async () => { 33 | const actualFn = asyncActualValueString(); 34 | const validation = getPollValidation('to equal'); 35 | await validation(actualFn, 'tres', { timeout: 4000, interval: 500 }); 36 | }); 37 | 38 | test('poll to contain', async () => { 39 | const actualFn = asyncActualValueString(); 40 | const validation = getPollValidation('to contain'); 41 | await validation(actualFn, 'os', { timeout: 4000, interval: 500 }); 42 | }); 43 | 44 | test('poll timeout', async () => { 45 | const actualFn = asyncActualValueString(); 46 | const validation = getPollValidation('to equal'); 47 | await expect(() => validation(actualFn, 'fail', { timeout: 1000, interval: 500 })).rejects.toThrow("Fail: expected 'uno' to equal 'fail'") 48 | }); 49 | 50 | test('poll delay greater than interval', async () => { 51 | const actualFn = asyncActualValueStringWithTimeout(1000); 52 | const validation = getPollValidation('to equal'); 53 | await validation(actualFn, 'tres', { timeout: 4000, interval: 500 }); 54 | }); 55 | 56 | test('poll delay greater than timeout', async () => { 57 | const actualFn = asyncActualValueStringWithTimeout(3000); 58 | const validation = getPollValidation('to equal'); 59 | await expect(() => validation(actualFn, 'tres', { timeout: 2000, interval: 500 })).rejects.toThrow('Promise was not settled before timeout') 60 | }); 61 | 62 | test('should throw an error if validation is not supported', () => { 63 | const catcher = () => getPollValidation('to be cool'); 64 | expect(catcher).to.throw("Poll validation 'to be cool' is not supported"); 65 | }); 66 | 67 | test('should throw an error if validation is not supported', () => { 68 | const catcher = () => getPollValidation('to be cool'); 69 | expect(catcher).to.throw("Poll validation 'to be cool' is not supported"); 70 | }); 71 | 72 | test('generic poll', async () => { 73 | await poll(async () => true, { timeout: 2000, interval: 500 }); 74 | }); 75 | 76 | test('generic err', async () => { 77 | const catcher = () => poll(async () => { 78 | throw new Error('custom error') 79 | }, { timeout: 2000, interval: 500 }); 80 | await expect(catcher).rejects.toThrow('custom error'); 81 | }); -------------------------------------------------------------------------------- /test/validationTransformer.spec.ts: -------------------------------------------------------------------------------- 1 | import { AssertionError, expect } from 'chai'; 2 | import { test } from 'vitest'; 3 | import { getValidation, SoftAssertionError } from '../src/verify'; 4 | 5 | type TestParams = { 6 | testName: string; 7 | validation: string; 8 | positiveArgs: [any, any]; 9 | negativeArgs: [any, any]; 10 | expectedError: string; 11 | }; 12 | const tests: Array = [ 13 | { 14 | testName: 'equals', 15 | validation: 'equals', 16 | positiveArgs: [1, 1], 17 | negativeArgs: [1, 2], 18 | expectedError: 'expected 1 to equal 2', 19 | }, 20 | { 21 | testName: 'equal to', 22 | validation: 'equal to', 23 | positiveArgs: [1, 1], 24 | negativeArgs: [1, 2], 25 | expectedError: 'expected 1 to equal 2', 26 | }, 27 | { 28 | testName: 'equals with type cast', 29 | validation: 'equals', 30 | positiveArgs: [1, '1'], 31 | negativeArgs: [1, '2'], 32 | expectedError: 'expected 1 to equal \'2\'', 33 | }, 34 | { 35 | testName: 'to equal', 36 | validation: 'to equal', 37 | positiveArgs: [1, 1], 38 | negativeArgs: [1, 2], 39 | expectedError: 'expected 1 to equal 2', 40 | }, 41 | { 42 | testName: 'does not equal', 43 | validation: 'does not equal', 44 | positiveArgs: [1, 2], 45 | negativeArgs: [1, 1], 46 | expectedError: 'expected 1 to not equal 1', 47 | }, 48 | { 49 | testName: 'not to equal', 50 | validation: 'not to equal', 51 | positiveArgs: [1, 2], 52 | negativeArgs: [1, 1], 53 | expectedError: 'expected 1 to not equal 1', 54 | }, 55 | { 56 | testName: 'to not equal', 57 | validation: 'to not equal', 58 | positiveArgs: [1, 2], 59 | negativeArgs: [1, 1], 60 | expectedError: 'expected 1 to not equal 1', 61 | }, 62 | { 63 | testName: 'strictly equals', 64 | validation: 'strictly equals', 65 | positiveArgs: [1, 1], 66 | negativeArgs: [1, 2], 67 | expectedError: 'expected 1 to equal 2', 68 | }, 69 | { 70 | testName: 'strictly equals with type cast', 71 | validation: 'strictly equals', 72 | positiveArgs: [1, 1], 73 | negativeArgs: [1, '1'], 74 | expectedError: 'expected 1 to equal \'1\'', 75 | }, 76 | { 77 | testName: 'to strictly equal', 78 | validation: 'to strictly equal', 79 | positiveArgs: [1, 1], 80 | negativeArgs: [1, 2], 81 | expectedError: 'expected 1 to equal 2', 82 | }, 83 | { 84 | testName: 'does not strictly equal', 85 | validation: 'does not strictly equal', 86 | positiveArgs: [1, 2], 87 | negativeArgs: [1, 1], 88 | expectedError: 'expected 1 to not equal 1', 89 | }, 90 | { 91 | testName: 'not to strictly equal', 92 | validation: 'not to strictly equal', 93 | positiveArgs: [1, 2], 94 | negativeArgs: [1, 1], 95 | expectedError: 'expected 1 to not equal 1', 96 | }, 97 | { 98 | testName: 'to not strictly equal', 99 | validation: 'to not strictly equal', 100 | positiveArgs: [1, 2], 101 | negativeArgs: [1, 1], 102 | expectedError: 'expected 1 to not equal 1', 103 | }, 104 | { 105 | testName: 'deeply equals', 106 | validation: 'deeply equals', 107 | positiveArgs: [{x: 1}, {x: 1}], 108 | negativeArgs: [{x: 1}, {x: 2}], 109 | expectedError: 'expected { x: 1 } to deeply equal { x: 2 }', 110 | }, 111 | { 112 | testName: 'deeply equals array', 113 | validation: 'deeply equals', 114 | positiveArgs: [[1], [1]], 115 | negativeArgs: [[1], [2]], 116 | expectedError: 'expected [ 1 ] to deeply equal [ 2 ]', 117 | }, 118 | { 119 | testName: 'to deeply equal', 120 | validation: 'to deeply equal', 121 | positiveArgs: [{x: 1}, {x: 1}], 122 | negativeArgs: [{x: 1}, {x: 2}], 123 | expectedError: 'expected { x: 1 } to deeply equal { x: 2 }', 124 | }, 125 | { 126 | testName: 'does not deeply equal', 127 | validation: 'does not deeply equal', 128 | positiveArgs: [{x: 1}, {x: 2}], 129 | negativeArgs: [{x: 1}, {x: 1}], 130 | expectedError: 'expected { x: 1 } to not deeply equal { x: 1 }', 131 | }, 132 | { 133 | testName: 'does not deeply equal array', 134 | validation: 'does not deeply equal', 135 | positiveArgs: [[1], [2]], 136 | negativeArgs: [[], []], 137 | expectedError: 'expected [] to not deeply equal []', 138 | }, 139 | { 140 | testName: 'not to deeply equal', 141 | validation: 'not to deeply equal', 142 | positiveArgs: [{x: 1}, {x: 2}], 143 | negativeArgs: [{x: 1}, {x: 1}], 144 | expectedError: 'expected { x: 1 } to not deeply equal { x: 1 }', 145 | }, 146 | { 147 | testName: 'to not deeply equal', 148 | validation: 'to not deeply equal', 149 | positiveArgs: [{x: 1}, {x: 2}], 150 | negativeArgs: [{x: 1}, {x: 1}], 151 | expectedError: 'expected { x: 1 } to not deeply equal { x: 1 }', 152 | }, 153 | { 154 | testName: 'matches', 155 | validation: 'matches', 156 | positiveArgs: ['expression', '^expression$'], 157 | negativeArgs: ['expression', '^espresso$'], 158 | expectedError: "'expression' to match /^espresso$/", 159 | }, 160 | { 161 | testName: 'to match', 162 | validation: 'to match', 163 | positiveArgs: ['expression', /^expression$/], 164 | negativeArgs: ['expression', /^espresso$/], 165 | expectedError: "'expression' to match /^espresso$/", 166 | }, 167 | { 168 | testName: 'does not match', 169 | validation: 'does not match', 170 | positiveArgs: ['expression', '^espresso$'], 171 | negativeArgs: ['expression', '^expression$'], 172 | expectedError: "'expression' not to match /^expression$/", 173 | }, 174 | { 175 | testName: 'contains', 176 | validation: 'contains', 177 | positiveArgs: ['expression', 'expr'], 178 | negativeArgs: ['expression', 'esp'], 179 | expectedError: "expected 'expression' to include 'esp'", 180 | }, 181 | { 182 | testName: 'contains with type cast', 183 | validation: 'contains', 184 | positiveArgs: ['111111', 1], 185 | negativeArgs: ['1234', 5], 186 | expectedError: "expected '1234' to include 5", 187 | }, 188 | { 189 | testName: 'does not contain', 190 | validation: 'does not contain', 191 | positiveArgs: ['expression', 'esp'], 192 | negativeArgs: ['expression', 'expr'], 193 | expectedError: "expected 'expression' to not include 'expr'", 194 | }, 195 | { 196 | testName: 'have members', 197 | validation: 'have members', 198 | positiveArgs: [ 199 | [1, 2, 3], 200 | [3, 2, 1], 201 | ], 202 | negativeArgs: [[1, 2, 3], [4]], 203 | expectedError: 'expected [ 1, 2, 3 ] to have the same members as [ 4 ]', 204 | }, 205 | { 206 | testName: 'does not have members', 207 | validation: 'does not have members', 208 | positiveArgs: [[1, 2, 3], [4]], 209 | negativeArgs: [ 210 | [1, 2, 3], 211 | [3, 2, 1], 212 | ], 213 | expectedError: 'expected [ 1, 2, 3 ] to not have the same members as [ 3, 2, 1 ]', 214 | }, 215 | { 216 | testName: 'to include members', 217 | validation: 'include members', 218 | positiveArgs: [ 219 | [1, 2, 3], 220 | [2, 1], 221 | ], 222 | negativeArgs: [[1, 2, 3], [4]], 223 | expectedError: 'expected [ 1, 2, 3 ] to be a superset of [ 4 ]', 224 | }, 225 | { 226 | testName: 'not to include members', 227 | validation: 'not to include members', 228 | positiveArgs: [[1, 2, 3], [4]], 229 | negativeArgs: [ 230 | [1, 2, 3], 231 | [2, 1], 232 | ], 233 | expectedError: 'expected [ 1, 2, 3 ] to not be a superset of [ 2, 1 ]', 234 | }, 235 | { 236 | testName: 'to be above', 237 | validation: 'to be above', 238 | positiveArgs: [2, 1], 239 | negativeArgs: [1, 2], 240 | expectedError: 'expected 1 to be above 2', 241 | }, 242 | { 243 | testName: 'to be above with type cast', 244 | validation: 'to be above', 245 | positiveArgs: [2, '1'], 246 | negativeArgs: [1, 2], 247 | expectedError: 'expected 1 to be above 2', 248 | }, 249 | { 250 | testName: 'to be above throw error if ER is not a number', 251 | validation: 'to be above', 252 | positiveArgs: [2, '1'], 253 | negativeArgs: [1, 'two'], 254 | expectedError: 'two is not a number', 255 | }, 256 | { 257 | testName: 'not to be above', 258 | validation: 'not to be above', 259 | positiveArgs: [1, 1], 260 | negativeArgs: [2, 1], 261 | expectedError: 'expected 2 to be at most 1', 262 | }, 263 | { 264 | testName: 'to be below', 265 | validation: 'to be below', 266 | positiveArgs: [1, 2], 267 | negativeArgs: [2, 1], 268 | expectedError: 'expected 2 to be below 1', 269 | }, 270 | { 271 | testName: 'to be below with type cast', 272 | validation: 'to be below', 273 | positiveArgs: [1, '2'], 274 | negativeArgs: [2, 1], 275 | expectedError: 'expected 2 to be below 1', 276 | }, 277 | { 278 | testName: 'to be below throw an error if ER is not a number', 279 | validation: 'to be below', 280 | positiveArgs: [1, '2'], 281 | negativeArgs: [2, 'one'], 282 | expectedError: 'one is not a number', 283 | }, 284 | { 285 | testName: 'not to be below', 286 | validation: 'not to be below', 287 | positiveArgs: [1, 1], 288 | negativeArgs: [1, 2], 289 | expectedError: 'expected 1 to be at least 2', 290 | }, 291 | { 292 | testName: 'to be greater than', 293 | validation: 'to be greater than', 294 | positiveArgs: [2, 1], 295 | negativeArgs: [1, 2], 296 | expectedError: 'expected 1 to be above 2', 297 | }, 298 | { 299 | testName: 'is not greater than', 300 | validation: 'is not greater than', 301 | positiveArgs: [2, 2], 302 | negativeArgs: [2, 1], 303 | expectedError: 'expected 2 to be at most 1', 304 | }, 305 | { 306 | testName: 'to be less than', 307 | validation: 'to be less than', 308 | positiveArgs: [1, 2], 309 | negativeArgs: [2, 1], 310 | expectedError: 'expected 2 to be below 1', 311 | }, 312 | { 313 | testName: 'not to be less than', 314 | validation: 'not to be less than', 315 | positiveArgs: [1, 1], 316 | negativeArgs: [1, 2], 317 | expectedError: 'expected 1 to be at least 2', 318 | }, 319 | { 320 | testName: 'to have type', 321 | validation: 'to have type', 322 | positiveArgs: [1, 'number'], 323 | negativeArgs: [1, 'string'], 324 | expectedError: 'expected 1 to be a string', 325 | }, 326 | { 327 | testName: 'not to have type', 328 | validation: 'not to have type', 329 | positiveArgs: [{}, 'string'], 330 | negativeArgs: [{}, 'object'], 331 | expectedError: 'expected {} not to be an object', 332 | }, 333 | { 334 | testName: 'to have property', 335 | validation: 'to have property', 336 | positiveArgs: [{ prop: 42 }, 'prop'], 337 | negativeArgs: [{ prop: 42 }, 'anotherProp'], 338 | expectedError: 'expected { prop: 42 } to have property \'anotherProp\'', 339 | }, 340 | { 341 | testName: 'not to have property', 342 | validation: 'not to have property', 343 | positiveArgs: [{ prop: 42 }, 'anotherProp'], 344 | negativeArgs: [{ prop: 42 }, 'prop'], 345 | expectedError: 'expected { prop: 42 } to not have property \'prop\'', 346 | }, 347 | { 348 | testName: 'to match schema', 349 | validation: 'to match schema', 350 | positiveArgs: [{ prop: 42, str: 'abc' }, { 351 | type: 'object', 352 | properties: { 353 | prop: {type: 'integer'}, 354 | str: {type: 'string', pattern: '^abc$'} 355 | }, 356 | required: ['prop'], 357 | additionalProperties: false, 358 | }], 359 | negativeArgs: [{ prop: 42, str: 'ab' }, { 360 | type: 'object', 361 | properties: { 362 | prop: {type: 'integer'}, 363 | str: {type: 'string', pattern: '^abc$'} 364 | }, 365 | required: ['prop'], 366 | additionalProperties: false, 367 | }], 368 | expectedError: 'object does not match schema\n/str must match pattern "^abc$" (#/properties/str/pattern)', 369 | }, 370 | { 371 | testName: 'case insensitive equals', 372 | validation: 'case insensitive equals', 373 | positiveArgs: ['some text', 'Some Text'], 374 | negativeArgs: ['some text', 'Another Text'], 375 | expectedError: 'expected \'some text\' to equal \'Another Text\'', 376 | }, 377 | { 378 | testName: 'not to case insensitive equal', 379 | validation: 'not to case insensitive equal', 380 | positiveArgs: ['some text', 'Another Text'], 381 | negativeArgs: ['some text', 'Some Text'], 382 | expectedError: 'expected \'some text\' to not equal \'Some Text\'', 383 | }, 384 | ]; 385 | 386 | test.each(tests)('$testName', ({ validation, positiveArgs, negativeArgs, expectedError }: TestParams) => { 387 | const verify = getValidation(validation); 388 | const catcherPositive = () => verify(...positiveArgs); 389 | const catcherNegative = () => verify(...negativeArgs); 390 | expect(catcherPositive).to.not.throw(); 391 | expect(catcherNegative).to.throw(expectedError); 392 | }); 393 | 394 | test('should throw an error if validation is not supported', () => { 395 | const catcher = () => getValidation('to be cool'); 396 | expect(catcher).to.throw("Validation 'to be cool' is not supported"); 397 | }); 398 | 399 | test('should throw AssertionError in case of hard error', () => { 400 | const validation = getValidation('to equal'); 401 | const catcher = () => validation(1, 2); 402 | expect(catcher).to.throw(AssertionError, "Fail: expected 1 to equal 2"); 403 | }); 404 | 405 | test('should throw SoftAssertionError in case of soft error', () => { 406 | const validation = getValidation('to equal', { soft: true }); 407 | const catcher = () => validation(1, 2); 408 | expect(catcher).to.throw(SoftAssertionError, "Fail: expected 1 to equal 2"); 409 | }); 410 | 411 | test('should throw SoftAssertionError in case softly prefix', () => { 412 | const validation = getValidation('to softly equal', { soft: true }); 413 | const catcher = () => validation(1, 2); 414 | expect(catcher).to.throw(SoftAssertionError, "Fail: expected 1 to equal 2"); 415 | }); -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "src/**/*" 4 | ], 5 | "exclude": [ 6 | "test", 7 | "lib", 8 | "node_modules" 9 | ], 10 | "compilerOptions": { 11 | "target": "es2018", 12 | "module": "node16", 13 | "moduleResolution": "node16", 14 | "outDir": "./lib", 15 | "esModuleInterop": true, 16 | "forceConsistentCasingInFileNames": true, 17 | "strict": true, 18 | "skipLibCheck": true, 19 | "sourceMap": true, 20 | "experimentalDecorators": false, 21 | "resolveJsonModule": true, 22 | "pretty": true, 23 | "allowJs": true, 24 | "checkJs": true, 25 | "downlevelIteration": true, 26 | "lib": [ 27 | "dom", 28 | "es2015", 29 | "es2016", 30 | "es2017", 31 | "esnext", 32 | ], 33 | "types": [ 34 | "node" 35 | ] 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | test: { 3 | coverage: { 4 | provider: 'v8', 5 | include: ["src/**/*.ts"], 6 | exclude: ["/lib/", "/node_modules/"], 7 | branches: 80, 8 | functions: 90, 9 | lines: 90, 10 | statements: -10, 11 | }, 12 | testTimeout: 20000 13 | } 14 | } 15 | --------------------------------------------------------------------------------