├── .coveralls.yml ├── .github └── workflows │ └── test.yml ├── .gitignore ├── .prettierrc.js ├── LICENSE ├── README.md ├── data ├── ip2region.db └── ipv6wry.db ├── install.sh ├── package.json ├── pnpm-lock.yaml ├── src ├── lib │ ├── index.ts │ ├── ipv4.ts │ ├── ipv6.ts │ └── utils.ts └── test │ ├── test_ipv4.ts │ ├── test_ipv6.ts │ └── test_lib.ts ├── tsconfig.json └── update_db.sh /.coveralls.yml: -------------------------------------------------------------------------------- 1 | repo_token: B6hQzVkUvOTRZ6jJvpBICLkIthqh8U7Oe -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [master] 9 | pull_request: 10 | branches: [master] 11 | 12 | jobs: 13 | build: 14 | strategy: 15 | matrix: 16 | os: [windows-latest, ubuntu-latest, macos-latest] 17 | node-version: [14.x, 16.x, 18.x] 18 | 19 | runs-on: ${{ matrix.os }} 20 | 21 | steps: 22 | - uses: actions/checkout@v3 23 | - uses: pnpm/action-setup@v2 24 | with: 25 | version: 7 26 | run_install: false 27 | - uses: actions/setup-node@v3 28 | with: 29 | node-version: ${{ matrix.node-version }} 30 | cache: 'pnpm' 31 | - run: pnpm install --frozen-lockfile 32 | - run: pnpm test 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | package-lock.json 61 | dist 62 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | // .prettierrc.js 2 | module.exports = { 3 | printWidth: 120, 4 | trailingComma: "es5", 5 | }; 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 郭宇翔 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 | [![NPM version][npm-image]][npm-url] 2 | [![build status][travis-image]][travis-url] 3 | [![Test coverage][coveralls-image]][coveralls-url] 4 | [![David deps][david-image]][david-url] 5 | [![node version][node-image]][node-url] 6 | [![npm download][download-image]][download-url] 7 | [![npm license][license-image]][download-url] 8 | 9 | [npm-image]: https://img.shields.io/npm/v/ip2region.svg?style=flat-square 10 | [npm-url]: https://npmjs.org/package/ip2region 11 | [travis-image]: https://img.shields.io/travis/yourtion/node-ip2region.svg?style=flat-square 12 | [travis-url]: https://travis-ci.org/yourtion/node-ip2region 13 | [coveralls-image]: https://img.shields.io/coveralls/yourtion/node-ip2region.svg?style=flat-square 14 | [coveralls-url]: https://coveralls.io/r/yourtion/node-ip2region?branch=master 15 | [david-image]: https://img.shields.io/david/yourtion/node-ip2region.svg?style=flat-square 16 | [david-url]: https://david-dm.org/yourtion/node-ip2region 17 | [node-image]: https://img.shields.io/badge/node.js-%3E=12.0-green.svg?style=flat-square 18 | [node-url]: http://nodejs.org/download/ 19 | [download-image]: https://img.shields.io/npm/dm/ip2region.svg?style=flat-square 20 | [download-url]: https://npmjs.org/package/ip2region 21 | [license-image]: https://img.shields.io/npm/l/ip2region.svg 22 | 23 | # node-ip2region 24 | 25 | IP 地址到区域运营商 IP(支持 IPv6) to region on Node.js 26 | 27 | ## 安装使用使用 28 | 29 | ```bash 30 | $ npm install ip2region --save 31 | ``` 32 | 33 | ```typescript 34 | // const IP2Region = require('ip2region').default; 35 | import IP2Region from "ip2region"; 36 | const query = new IP2Region(); 37 | const res = query.search('120.24.78.68'); 38 | console.log(res); 39 | > { country: '中国', province: '广东省', city: '深圳市', isp: '阿里云' } 40 | const res2 = query.search('240e:47d:c20:1627:30a3:ba0d:a5e6:ec19'); 41 | console.log(res2); 42 | > { country: "中国", province: "广东省", city: "", isp: "中国电信" } 43 | ``` 44 | 45 | ### 配置 46 | 47 | - `ipv4db`: ipv4 数据库地址 48 | - `ipv6db`: ipv6 数据库地址 49 | - `disableIpv6`: 关闭 ipv6 查询功能(减少内存占用) 50 | 51 | ```typescript 52 | import IP2Region from "ip2region"; 53 | const query = new IP2Region({ 54 | ipv4db: "/tmp/db4.db", 55 | ipv6db: "/tmp/db6.db", 56 | disableIpv6: true, 57 | }); 58 | ``` 59 | -------------------------------------------------------------------------------- /data/ip2region.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yourtion/node-ip2region/41d91ef8996fe3e8d3aa3c1a0a62601c2af5b8ab/data/ip2region.db -------------------------------------------------------------------------------- /data/ipv6wry.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yourtion/node-ip2region/41d91ef8996fe3e8d3aa3c1a0a62601c2af5b8ab/data/ipv6wry.db -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #/bin/sh 2 | 3 | set -e 4 | 5 | # install 7z for unzip ipv6 6 | sudo apt install p7zip-full 7 | 8 | # install pnpm 9 | npm i -g pnpm 10 | # setup package 11 | pnpm install 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ip2region", 3 | "version": "2.3.0", 4 | "description": "ip/ipv6 to geo database, IP(支持IPv6)地址到区域运营商", 5 | "keywords": [ 6 | "ip", 7 | "ipaddress-to-address", 8 | "ip-address", 9 | "ip-location", 10 | "ip-region", 11 | "ip-lookup", 12 | "ip-search", 13 | "ip-geo", 14 | "ipv6", 15 | "ipv6address-to-address", 16 | "ipv6-address", 17 | "ipv6-location", 18 | "ipv6-region", 19 | "ipv6-lookup", 20 | "ipv6-search", 21 | "ipv6-geo" 22 | ], 23 | "main": "dist/lib/index.js", 24 | "repository": { 25 | "type": "git", 26 | "url": "git+https://github.com/yourtion/node-ip2region.git" 27 | }, 28 | "bugs": { 29 | "url": "https://github.com/yourtion/node-ip2region/issues" 30 | }, 31 | "files": [ 32 | "dist/lib", 33 | "data/ip2region.db", 34 | "data/ipv6wry.db" 35 | ], 36 | "homepage": "https://github.com/yourtion/node-ip2region#readme", 37 | "scripts": { 38 | "dev": "export NODE_ENV=dev && jest --verbose --watch", 39 | "test": "jest --coverage", 40 | "tag": "git tag v`node -p 'require(\"./package\").version'`", 41 | "format": "prettier --write \"src/**/*.ts\"", 42 | "clean": "rm -rf dist", 43 | "compile": "npm run clean && tsc", 44 | "prepublishOnly": "npm run format && npm run compile && npm test && coveralls < coverage/lcov.info", 45 | "postpublish": "npm run tag && git push && git push --tags" 46 | }, 47 | "author": "Yourtion ", 48 | "license": "MIT", 49 | "peerDependencies": { 50 | "@types/node": "*" 51 | }, 52 | "devDependencies": { 53 | "@types/jest": "^29.5.12", 54 | "@types/node": "^22.5.0", 55 | "coveralls": "^3.1.0", 56 | "jest": "^29.7.0", 57 | "prettier": "^3.3.3", 58 | "ts-jest": "^29.2.5", 59 | "typescript": "^5.5.4" 60 | }, 61 | "jest": { 62 | "transform": { 63 | "^.+\\.tsx?$": "ts-jest" 64 | }, 65 | "testRegex": "./src/test/test", 66 | "collectCoverageFrom": [ 67 | "src/lib/**/*.ts" 68 | ], 69 | "coverageThreshold": { 70 | "global": { 71 | "branches": 80, 72 | "functions": 95, 73 | "lines": 80, 74 | "statements": 80 75 | } 76 | }, 77 | "moduleFileExtensions": [ 78 | "ts", 79 | "js", 80 | "json" 81 | ] 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@types/jest': 12 | specifier: ^29.5.12 13 | version: 29.5.12 14 | '@types/node': 15 | specifier: ^22.5.0 16 | version: 22.5.0 17 | coveralls: 18 | specifier: ^3.1.0 19 | version: 3.1.1 20 | jest: 21 | specifier: ^29.7.0 22 | version: 29.7.0(@types/node@22.5.0)(node-notifier@8.0.2)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) 23 | prettier: 24 | specifier: ^3.3.3 25 | version: 3.3.3 26 | ts-jest: 27 | specifier: ^29.2.5 28 | version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.5.0)(node-notifier@8.0.2)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)))(typescript@5.5.4) 29 | typescript: 30 | specifier: ^5.5.4 31 | version: 5.5.4 32 | 33 | packages: 34 | 35 | '@ampproject/remapping@2.3.0': 36 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 37 | engines: {node: '>=6.0.0'} 38 | 39 | '@babel/code-frame@7.24.7': 40 | resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} 41 | engines: {node: '>=6.9.0'} 42 | 43 | '@babel/compat-data@7.25.4': 44 | resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} 45 | engines: {node: '>=6.9.0'} 46 | 47 | '@babel/core@7.25.2': 48 | resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} 49 | engines: {node: '>=6.9.0'} 50 | 51 | '@babel/generator@7.25.5': 52 | resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} 53 | engines: {node: '>=6.9.0'} 54 | 55 | '@babel/helper-compilation-targets@7.25.2': 56 | resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} 57 | engines: {node: '>=6.9.0'} 58 | 59 | '@babel/helper-module-imports@7.24.7': 60 | resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} 61 | engines: {node: '>=6.9.0'} 62 | 63 | '@babel/helper-module-transforms@7.25.2': 64 | resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} 65 | engines: {node: '>=6.9.0'} 66 | peerDependencies: 67 | '@babel/core': ^7.0.0 68 | 69 | '@babel/helper-plugin-utils@7.24.8': 70 | resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} 71 | engines: {node: '>=6.9.0'} 72 | 73 | '@babel/helper-simple-access@7.24.7': 74 | resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} 75 | engines: {node: '>=6.9.0'} 76 | 77 | '@babel/helper-string-parser@7.24.8': 78 | resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} 79 | engines: {node: '>=6.9.0'} 80 | 81 | '@babel/helper-validator-identifier@7.24.7': 82 | resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} 83 | engines: {node: '>=6.9.0'} 84 | 85 | '@babel/helper-validator-option@7.24.8': 86 | resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} 87 | engines: {node: '>=6.9.0'} 88 | 89 | '@babel/helpers@7.25.0': 90 | resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} 91 | engines: {node: '>=6.9.0'} 92 | 93 | '@babel/highlight@7.24.7': 94 | resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} 95 | engines: {node: '>=6.9.0'} 96 | 97 | '@babel/parser@7.25.4': 98 | resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} 99 | engines: {node: '>=6.0.0'} 100 | hasBin: true 101 | 102 | '@babel/plugin-syntax-async-generators@7.8.4': 103 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 104 | peerDependencies: 105 | '@babel/core': ^7.0.0-0 106 | 107 | '@babel/plugin-syntax-bigint@7.8.3': 108 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 109 | peerDependencies: 110 | '@babel/core': ^7.0.0-0 111 | 112 | '@babel/plugin-syntax-class-properties@7.12.13': 113 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 114 | peerDependencies: 115 | '@babel/core': ^7.0.0-0 116 | 117 | '@babel/plugin-syntax-class-static-block@7.14.5': 118 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} 119 | engines: {node: '>=6.9.0'} 120 | peerDependencies: 121 | '@babel/core': ^7.0.0-0 122 | 123 | '@babel/plugin-syntax-import-attributes@7.24.7': 124 | resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} 125 | engines: {node: '>=6.9.0'} 126 | peerDependencies: 127 | '@babel/core': ^7.0.0-0 128 | 129 | '@babel/plugin-syntax-import-meta@7.10.4': 130 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 131 | peerDependencies: 132 | '@babel/core': ^7.0.0-0 133 | 134 | '@babel/plugin-syntax-json-strings@7.8.3': 135 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 136 | peerDependencies: 137 | '@babel/core': ^7.0.0-0 138 | 139 | '@babel/plugin-syntax-jsx@7.24.7': 140 | resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} 141 | engines: {node: '>=6.9.0'} 142 | peerDependencies: 143 | '@babel/core': ^7.0.0-0 144 | 145 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4': 146 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 147 | peerDependencies: 148 | '@babel/core': ^7.0.0-0 149 | 150 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': 151 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 152 | peerDependencies: 153 | '@babel/core': ^7.0.0-0 154 | 155 | '@babel/plugin-syntax-numeric-separator@7.10.4': 156 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 157 | peerDependencies: 158 | '@babel/core': ^7.0.0-0 159 | 160 | '@babel/plugin-syntax-object-rest-spread@7.8.3': 161 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 162 | peerDependencies: 163 | '@babel/core': ^7.0.0-0 164 | 165 | '@babel/plugin-syntax-optional-catch-binding@7.8.3': 166 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 167 | peerDependencies: 168 | '@babel/core': ^7.0.0-0 169 | 170 | '@babel/plugin-syntax-optional-chaining@7.8.3': 171 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 172 | peerDependencies: 173 | '@babel/core': ^7.0.0-0 174 | 175 | '@babel/plugin-syntax-private-property-in-object@7.14.5': 176 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} 177 | engines: {node: '>=6.9.0'} 178 | peerDependencies: 179 | '@babel/core': ^7.0.0-0 180 | 181 | '@babel/plugin-syntax-top-level-await@7.14.5': 182 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 183 | engines: {node: '>=6.9.0'} 184 | peerDependencies: 185 | '@babel/core': ^7.0.0-0 186 | 187 | '@babel/plugin-syntax-typescript@7.25.4': 188 | resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} 189 | engines: {node: '>=6.9.0'} 190 | peerDependencies: 191 | '@babel/core': ^7.0.0-0 192 | 193 | '@babel/template@7.25.0': 194 | resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} 195 | engines: {node: '>=6.9.0'} 196 | 197 | '@babel/traverse@7.25.4': 198 | resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} 199 | engines: {node: '>=6.9.0'} 200 | 201 | '@babel/types@7.25.4': 202 | resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} 203 | engines: {node: '>=6.9.0'} 204 | 205 | '@bcoe/v8-coverage@0.2.3': 206 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 207 | 208 | '@cspotcode/source-map-support@0.8.1': 209 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 210 | engines: {node: '>=12'} 211 | 212 | '@istanbuljs/load-nyc-config@1.1.0': 213 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 214 | engines: {node: '>=8'} 215 | 216 | '@istanbuljs/schema@0.1.3': 217 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 218 | engines: {node: '>=8'} 219 | 220 | '@jest/console@29.7.0': 221 | resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} 222 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 223 | 224 | '@jest/core@29.7.0': 225 | resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} 226 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 227 | peerDependencies: 228 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 229 | peerDependenciesMeta: 230 | node-notifier: 231 | optional: true 232 | 233 | '@jest/environment@29.7.0': 234 | resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} 235 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 236 | 237 | '@jest/expect-utils@29.7.0': 238 | resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} 239 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 240 | 241 | '@jest/expect@29.7.0': 242 | resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} 243 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 244 | 245 | '@jest/fake-timers@29.7.0': 246 | resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} 247 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 248 | 249 | '@jest/globals@29.7.0': 250 | resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} 251 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 252 | 253 | '@jest/reporters@29.7.0': 254 | resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} 255 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 256 | peerDependencies: 257 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 258 | peerDependenciesMeta: 259 | node-notifier: 260 | optional: true 261 | 262 | '@jest/schemas@29.6.3': 263 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 264 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 265 | 266 | '@jest/source-map@29.6.3': 267 | resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} 268 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 269 | 270 | '@jest/test-result@29.7.0': 271 | resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} 272 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 273 | 274 | '@jest/test-sequencer@29.7.0': 275 | resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} 276 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 277 | 278 | '@jest/transform@29.7.0': 279 | resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} 280 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 281 | 282 | '@jest/types@29.6.3': 283 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 284 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 285 | 286 | '@jridgewell/gen-mapping@0.3.5': 287 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 288 | engines: {node: '>=6.0.0'} 289 | 290 | '@jridgewell/resolve-uri@3.1.2': 291 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 292 | engines: {node: '>=6.0.0'} 293 | 294 | '@jridgewell/set-array@1.2.1': 295 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 296 | engines: {node: '>=6.0.0'} 297 | 298 | '@jridgewell/sourcemap-codec@1.5.0': 299 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 300 | 301 | '@jridgewell/trace-mapping@0.3.25': 302 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 303 | 304 | '@jridgewell/trace-mapping@0.3.9': 305 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 306 | 307 | '@sinclair/typebox@0.27.8': 308 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 309 | 310 | '@sinonjs/commons@3.0.1': 311 | resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} 312 | 313 | '@sinonjs/fake-timers@10.3.0': 314 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 315 | 316 | '@tsconfig/node10@1.0.11': 317 | resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} 318 | 319 | '@tsconfig/node12@1.0.11': 320 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 321 | 322 | '@tsconfig/node14@1.0.3': 323 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 324 | 325 | '@tsconfig/node16@1.0.4': 326 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 327 | 328 | '@types/babel__core@7.20.5': 329 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 330 | 331 | '@types/babel__generator@7.6.8': 332 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 333 | 334 | '@types/babel__template@7.4.4': 335 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 336 | 337 | '@types/babel__traverse@7.20.6': 338 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 339 | 340 | '@types/graceful-fs@4.1.9': 341 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 342 | 343 | '@types/istanbul-lib-coverage@2.0.6': 344 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 345 | 346 | '@types/istanbul-lib-report@3.0.3': 347 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 348 | 349 | '@types/istanbul-reports@3.0.4': 350 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 351 | 352 | '@types/jest@29.5.12': 353 | resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} 354 | 355 | '@types/node@22.5.0': 356 | resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==} 357 | 358 | '@types/stack-utils@2.0.3': 359 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 360 | 361 | '@types/yargs-parser@21.0.3': 362 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 363 | 364 | '@types/yargs@17.0.33': 365 | resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} 366 | 367 | acorn-walk@8.3.3: 368 | resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} 369 | engines: {node: '>=0.4.0'} 370 | 371 | acorn@8.12.1: 372 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 373 | engines: {node: '>=0.4.0'} 374 | hasBin: true 375 | 376 | ajv@6.12.6: 377 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 378 | 379 | ansi-escapes@4.3.2: 380 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 381 | engines: {node: '>=8'} 382 | 383 | ansi-regex@5.0.1: 384 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 385 | engines: {node: '>=8'} 386 | 387 | ansi-styles@3.2.1: 388 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 389 | engines: {node: '>=4'} 390 | 391 | ansi-styles@4.3.0: 392 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 393 | engines: {node: '>=8'} 394 | 395 | ansi-styles@5.2.0: 396 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 397 | engines: {node: '>=10'} 398 | 399 | anymatch@3.1.3: 400 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 401 | engines: {node: '>= 8'} 402 | 403 | arg@4.1.3: 404 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 405 | 406 | argparse@1.0.10: 407 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 408 | 409 | asn1@0.2.6: 410 | resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} 411 | 412 | assert-plus@1.0.0: 413 | resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} 414 | engines: {node: '>=0.8'} 415 | 416 | async@3.2.6: 417 | resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 418 | 419 | asynckit@0.4.0: 420 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 421 | 422 | aws-sign2@0.7.0: 423 | resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} 424 | 425 | aws4@1.13.1: 426 | resolution: {integrity: sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==} 427 | 428 | babel-jest@29.7.0: 429 | resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} 430 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 431 | peerDependencies: 432 | '@babel/core': ^7.8.0 433 | 434 | babel-plugin-istanbul@6.1.1: 435 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 436 | engines: {node: '>=8'} 437 | 438 | babel-plugin-jest-hoist@29.6.3: 439 | resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} 440 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 441 | 442 | babel-preset-current-node-syntax@1.1.0: 443 | resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} 444 | peerDependencies: 445 | '@babel/core': ^7.0.0 446 | 447 | babel-preset-jest@29.6.3: 448 | resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} 449 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 450 | peerDependencies: 451 | '@babel/core': ^7.0.0 452 | 453 | balanced-match@1.0.2: 454 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 455 | 456 | bcrypt-pbkdf@1.0.2: 457 | resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} 458 | 459 | brace-expansion@1.1.11: 460 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 461 | 462 | brace-expansion@2.0.1: 463 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 464 | 465 | braces@3.0.3: 466 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 467 | engines: {node: '>=8'} 468 | 469 | browserslist@4.23.3: 470 | resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} 471 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 472 | hasBin: true 473 | 474 | bs-logger@0.2.6: 475 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 476 | engines: {node: '>= 6'} 477 | 478 | bser@2.1.1: 479 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 480 | 481 | buffer-from@1.1.2: 482 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 483 | 484 | callsites@3.1.0: 485 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 486 | engines: {node: '>=6'} 487 | 488 | camelcase@5.3.1: 489 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 490 | engines: {node: '>=6'} 491 | 492 | camelcase@6.3.0: 493 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 494 | engines: {node: '>=10'} 495 | 496 | caniuse-lite@1.0.30001653: 497 | resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} 498 | 499 | caseless@0.12.0: 500 | resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} 501 | 502 | chalk@2.4.2: 503 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 504 | engines: {node: '>=4'} 505 | 506 | chalk@4.1.2: 507 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 508 | engines: {node: '>=10'} 509 | 510 | char-regex@1.0.2: 511 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 512 | engines: {node: '>=10'} 513 | 514 | ci-info@3.9.0: 515 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 516 | engines: {node: '>=8'} 517 | 518 | cjs-module-lexer@1.4.0: 519 | resolution: {integrity: sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==} 520 | 521 | cliui@8.0.1: 522 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 523 | engines: {node: '>=12'} 524 | 525 | co@4.6.0: 526 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 527 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 528 | 529 | collect-v8-coverage@1.0.2: 530 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 531 | 532 | color-convert@1.9.3: 533 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 534 | 535 | color-convert@2.0.1: 536 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 537 | engines: {node: '>=7.0.0'} 538 | 539 | color-name@1.1.3: 540 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 541 | 542 | color-name@1.1.4: 543 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 544 | 545 | combined-stream@1.0.8: 546 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 547 | engines: {node: '>= 0.8'} 548 | 549 | concat-map@0.0.1: 550 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 551 | 552 | convert-source-map@2.0.0: 553 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 554 | 555 | core-util-is@1.0.2: 556 | resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} 557 | 558 | coveralls@3.1.1: 559 | resolution: {integrity: sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==} 560 | engines: {node: '>=6'} 561 | hasBin: true 562 | 563 | create-jest@29.7.0: 564 | resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} 565 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 566 | hasBin: true 567 | 568 | create-require@1.1.1: 569 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 570 | 571 | cross-spawn@7.0.3: 572 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 573 | engines: {node: '>= 8'} 574 | 575 | dashdash@1.14.1: 576 | resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} 577 | engines: {node: '>=0.10'} 578 | 579 | debug@4.3.6: 580 | resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} 581 | engines: {node: '>=6.0'} 582 | peerDependencies: 583 | supports-color: '*' 584 | peerDependenciesMeta: 585 | supports-color: 586 | optional: true 587 | 588 | dedent@1.5.3: 589 | resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} 590 | peerDependencies: 591 | babel-plugin-macros: ^3.1.0 592 | peerDependenciesMeta: 593 | babel-plugin-macros: 594 | optional: true 595 | 596 | deepmerge@4.3.1: 597 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 598 | engines: {node: '>=0.10.0'} 599 | 600 | delayed-stream@1.0.0: 601 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 602 | engines: {node: '>=0.4.0'} 603 | 604 | detect-newline@3.1.0: 605 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 606 | engines: {node: '>=8'} 607 | 608 | diff-sequences@29.6.3: 609 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 610 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 611 | 612 | diff@4.0.2: 613 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 614 | engines: {node: '>=0.3.1'} 615 | 616 | ecc-jsbn@0.1.2: 617 | resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} 618 | 619 | ejs@3.1.10: 620 | resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} 621 | engines: {node: '>=0.10.0'} 622 | hasBin: true 623 | 624 | electron-to-chromium@1.5.13: 625 | resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} 626 | 627 | emittery@0.13.1: 628 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 629 | engines: {node: '>=12'} 630 | 631 | emoji-regex@8.0.0: 632 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 633 | 634 | error-ex@1.3.2: 635 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 636 | 637 | escalade@3.1.2: 638 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 639 | engines: {node: '>=6'} 640 | 641 | escape-string-regexp@1.0.5: 642 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 643 | engines: {node: '>=0.8.0'} 644 | 645 | escape-string-regexp@2.0.0: 646 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 647 | engines: {node: '>=8'} 648 | 649 | esprima@4.0.1: 650 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 651 | engines: {node: '>=4'} 652 | hasBin: true 653 | 654 | execa@5.1.1: 655 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 656 | engines: {node: '>=10'} 657 | 658 | exit@0.1.2: 659 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 660 | engines: {node: '>= 0.8.0'} 661 | 662 | expect@29.7.0: 663 | resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} 664 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 665 | 666 | extend@3.0.2: 667 | resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 668 | 669 | extsprintf@1.3.0: 670 | resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} 671 | engines: {'0': node >=0.6.0} 672 | 673 | fast-deep-equal@3.1.3: 674 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 675 | 676 | fast-json-stable-stringify@2.1.0: 677 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 678 | 679 | fb-watchman@2.0.2: 680 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 681 | 682 | filelist@1.0.4: 683 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} 684 | 685 | fill-range@7.1.1: 686 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 687 | engines: {node: '>=8'} 688 | 689 | find-up@4.1.0: 690 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 691 | engines: {node: '>=8'} 692 | 693 | forever-agent@0.6.1: 694 | resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} 695 | 696 | form-data@2.3.3: 697 | resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} 698 | engines: {node: '>= 0.12'} 699 | 700 | fs.realpath@1.0.0: 701 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 702 | 703 | fsevents@2.3.3: 704 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 705 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 706 | os: [darwin] 707 | 708 | function-bind@1.1.2: 709 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 710 | 711 | gensync@1.0.0-beta.2: 712 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 713 | engines: {node: '>=6.9.0'} 714 | 715 | get-caller-file@2.0.5: 716 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 717 | engines: {node: 6.* || 8.* || >= 10.*} 718 | 719 | get-package-type@0.1.0: 720 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 721 | engines: {node: '>=8.0.0'} 722 | 723 | get-stream@6.0.1: 724 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 725 | engines: {node: '>=10'} 726 | 727 | getpass@0.1.7: 728 | resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} 729 | 730 | glob@7.2.3: 731 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 732 | deprecated: Glob versions prior to v9 are no longer supported 733 | 734 | globals@11.12.0: 735 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 736 | engines: {node: '>=4'} 737 | 738 | graceful-fs@4.2.11: 739 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 740 | 741 | growly@1.3.0: 742 | resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} 743 | 744 | har-schema@2.0.0: 745 | resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} 746 | engines: {node: '>=4'} 747 | 748 | har-validator@5.1.5: 749 | resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} 750 | engines: {node: '>=6'} 751 | deprecated: this library is no longer supported 752 | 753 | has-flag@3.0.0: 754 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 755 | engines: {node: '>=4'} 756 | 757 | has-flag@4.0.0: 758 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 759 | engines: {node: '>=8'} 760 | 761 | hasown@2.0.2: 762 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 763 | engines: {node: '>= 0.4'} 764 | 765 | html-escaper@2.0.2: 766 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 767 | 768 | http-signature@1.2.0: 769 | resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} 770 | engines: {node: '>=0.8', npm: '>=1.3.7'} 771 | 772 | human-signals@2.1.0: 773 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 774 | engines: {node: '>=10.17.0'} 775 | 776 | import-local@3.2.0: 777 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 778 | engines: {node: '>=8'} 779 | hasBin: true 780 | 781 | imurmurhash@0.1.4: 782 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 783 | engines: {node: '>=0.8.19'} 784 | 785 | inflight@1.0.6: 786 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 787 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 788 | 789 | inherits@2.0.4: 790 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 791 | 792 | is-arrayish@0.2.1: 793 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 794 | 795 | is-core-module@2.15.1: 796 | resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} 797 | engines: {node: '>= 0.4'} 798 | 799 | is-docker@2.2.1: 800 | resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} 801 | engines: {node: '>=8'} 802 | hasBin: true 803 | 804 | is-fullwidth-code-point@3.0.0: 805 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 806 | engines: {node: '>=8'} 807 | 808 | is-generator-fn@2.1.0: 809 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 810 | engines: {node: '>=6'} 811 | 812 | is-number@7.0.0: 813 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 814 | engines: {node: '>=0.12.0'} 815 | 816 | is-stream@2.0.1: 817 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 818 | engines: {node: '>=8'} 819 | 820 | is-typedarray@1.0.0: 821 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 822 | 823 | is-wsl@2.2.0: 824 | resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 825 | engines: {node: '>=8'} 826 | 827 | isexe@2.0.0: 828 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 829 | 830 | isstream@0.1.2: 831 | resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} 832 | 833 | istanbul-lib-coverage@3.2.2: 834 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 835 | engines: {node: '>=8'} 836 | 837 | istanbul-lib-instrument@5.2.1: 838 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 839 | engines: {node: '>=8'} 840 | 841 | istanbul-lib-instrument@6.0.3: 842 | resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} 843 | engines: {node: '>=10'} 844 | 845 | istanbul-lib-report@3.0.1: 846 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 847 | engines: {node: '>=10'} 848 | 849 | istanbul-lib-source-maps@4.0.1: 850 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 851 | engines: {node: '>=10'} 852 | 853 | istanbul-reports@3.1.7: 854 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 855 | engines: {node: '>=8'} 856 | 857 | jake@10.9.2: 858 | resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} 859 | engines: {node: '>=10'} 860 | hasBin: true 861 | 862 | jest-changed-files@29.7.0: 863 | resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} 864 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 865 | 866 | jest-circus@29.7.0: 867 | resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} 868 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 869 | 870 | jest-cli@29.7.0: 871 | resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} 872 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 873 | hasBin: true 874 | peerDependencies: 875 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 876 | peerDependenciesMeta: 877 | node-notifier: 878 | optional: true 879 | 880 | jest-config@29.7.0: 881 | resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} 882 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 883 | peerDependencies: 884 | '@types/node': '*' 885 | ts-node: '>=9.0.0' 886 | peerDependenciesMeta: 887 | '@types/node': 888 | optional: true 889 | ts-node: 890 | optional: true 891 | 892 | jest-diff@29.7.0: 893 | resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} 894 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 895 | 896 | jest-docblock@29.7.0: 897 | resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} 898 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 899 | 900 | jest-each@29.7.0: 901 | resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} 902 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 903 | 904 | jest-environment-node@29.7.0: 905 | resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} 906 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 907 | 908 | jest-get-type@29.6.3: 909 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 910 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 911 | 912 | jest-haste-map@29.7.0: 913 | resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} 914 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 915 | 916 | jest-leak-detector@29.7.0: 917 | resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} 918 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 919 | 920 | jest-matcher-utils@29.7.0: 921 | resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} 922 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 923 | 924 | jest-message-util@29.7.0: 925 | resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} 926 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 927 | 928 | jest-mock@29.7.0: 929 | resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} 930 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 931 | 932 | jest-pnp-resolver@1.2.3: 933 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 934 | engines: {node: '>=6'} 935 | peerDependencies: 936 | jest-resolve: '*' 937 | peerDependenciesMeta: 938 | jest-resolve: 939 | optional: true 940 | 941 | jest-regex-util@29.6.3: 942 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 943 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 944 | 945 | jest-resolve-dependencies@29.7.0: 946 | resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} 947 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 948 | 949 | jest-resolve@29.7.0: 950 | resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} 951 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 952 | 953 | jest-runner@29.7.0: 954 | resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} 955 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 956 | 957 | jest-runtime@29.7.0: 958 | resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} 959 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 960 | 961 | jest-snapshot@29.7.0: 962 | resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} 963 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 964 | 965 | jest-util@29.7.0: 966 | resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} 967 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 968 | 969 | jest-validate@29.7.0: 970 | resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} 971 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 972 | 973 | jest-watcher@29.7.0: 974 | resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} 975 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 976 | 977 | jest-worker@29.7.0: 978 | resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} 979 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 980 | 981 | jest@29.7.0: 982 | resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} 983 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 984 | hasBin: true 985 | peerDependencies: 986 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 987 | peerDependenciesMeta: 988 | node-notifier: 989 | optional: true 990 | 991 | js-tokens@4.0.0: 992 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 993 | 994 | js-yaml@3.14.1: 995 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 996 | hasBin: true 997 | 998 | jsbn@0.1.1: 999 | resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} 1000 | 1001 | jsesc@2.5.2: 1002 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1003 | engines: {node: '>=4'} 1004 | hasBin: true 1005 | 1006 | json-parse-even-better-errors@2.3.1: 1007 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1008 | 1009 | json-schema-traverse@0.4.1: 1010 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1011 | 1012 | json-schema@0.4.0: 1013 | resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} 1014 | 1015 | json-stringify-safe@5.0.1: 1016 | resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} 1017 | 1018 | json5@2.2.3: 1019 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1020 | engines: {node: '>=6'} 1021 | hasBin: true 1022 | 1023 | jsprim@1.4.2: 1024 | resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} 1025 | engines: {node: '>=0.6.0'} 1026 | 1027 | kleur@3.0.3: 1028 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1029 | engines: {node: '>=6'} 1030 | 1031 | lcov-parse@1.0.0: 1032 | resolution: {integrity: sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==} 1033 | hasBin: true 1034 | 1035 | leven@3.1.0: 1036 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 1037 | engines: {node: '>=6'} 1038 | 1039 | lines-and-columns@1.2.4: 1040 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1041 | 1042 | locate-path@5.0.0: 1043 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1044 | engines: {node: '>=8'} 1045 | 1046 | lodash.memoize@4.1.2: 1047 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 1048 | 1049 | log-driver@1.2.7: 1050 | resolution: {integrity: sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==} 1051 | engines: {node: '>=0.8.6'} 1052 | 1053 | lru-cache@5.1.1: 1054 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1055 | 1056 | make-dir@4.0.0: 1057 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1058 | engines: {node: '>=10'} 1059 | 1060 | make-error@1.3.6: 1061 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1062 | 1063 | makeerror@1.0.12: 1064 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 1065 | 1066 | merge-stream@2.0.0: 1067 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1068 | 1069 | micromatch@4.0.8: 1070 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1071 | engines: {node: '>=8.6'} 1072 | 1073 | mime-db@1.52.0: 1074 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1075 | engines: {node: '>= 0.6'} 1076 | 1077 | mime-types@2.1.35: 1078 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1079 | engines: {node: '>= 0.6'} 1080 | 1081 | mimic-fn@2.1.0: 1082 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1083 | engines: {node: '>=6'} 1084 | 1085 | minimatch@3.1.2: 1086 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1087 | 1088 | minimatch@5.1.6: 1089 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 1090 | engines: {node: '>=10'} 1091 | 1092 | minimist@1.2.8: 1093 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1094 | 1095 | ms@2.1.2: 1096 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1097 | 1098 | natural-compare@1.4.0: 1099 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1100 | 1101 | node-int64@0.4.0: 1102 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 1103 | 1104 | node-notifier@8.0.2: 1105 | resolution: {integrity: sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==} 1106 | 1107 | node-releases@2.0.18: 1108 | resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 1109 | 1110 | normalize-path@3.0.0: 1111 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1112 | engines: {node: '>=0.10.0'} 1113 | 1114 | npm-run-path@4.0.1: 1115 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1116 | engines: {node: '>=8'} 1117 | 1118 | oauth-sign@0.9.0: 1119 | resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} 1120 | 1121 | once@1.4.0: 1122 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1123 | 1124 | onetime@5.1.2: 1125 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1126 | engines: {node: '>=6'} 1127 | 1128 | p-limit@2.3.0: 1129 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1130 | engines: {node: '>=6'} 1131 | 1132 | p-limit@3.1.0: 1133 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1134 | engines: {node: '>=10'} 1135 | 1136 | p-locate@4.1.0: 1137 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1138 | engines: {node: '>=8'} 1139 | 1140 | p-try@2.2.0: 1141 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1142 | engines: {node: '>=6'} 1143 | 1144 | parse-json@5.2.0: 1145 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1146 | engines: {node: '>=8'} 1147 | 1148 | path-exists@4.0.0: 1149 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1150 | engines: {node: '>=8'} 1151 | 1152 | path-is-absolute@1.0.1: 1153 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1154 | engines: {node: '>=0.10.0'} 1155 | 1156 | path-key@3.1.1: 1157 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1158 | engines: {node: '>=8'} 1159 | 1160 | path-parse@1.0.7: 1161 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1162 | 1163 | performance-now@2.1.0: 1164 | resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} 1165 | 1166 | picocolors@1.0.1: 1167 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 1168 | 1169 | picomatch@2.3.1: 1170 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1171 | engines: {node: '>=8.6'} 1172 | 1173 | pirates@4.0.6: 1174 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1175 | engines: {node: '>= 6'} 1176 | 1177 | pkg-dir@4.2.0: 1178 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1179 | engines: {node: '>=8'} 1180 | 1181 | prettier@3.3.3: 1182 | resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 1183 | engines: {node: '>=14'} 1184 | hasBin: true 1185 | 1186 | pretty-format@29.7.0: 1187 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 1188 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1189 | 1190 | prompts@2.4.2: 1191 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1192 | engines: {node: '>= 6'} 1193 | 1194 | psl@1.9.0: 1195 | resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} 1196 | 1197 | punycode@2.3.1: 1198 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1199 | engines: {node: '>=6'} 1200 | 1201 | pure-rand@6.1.0: 1202 | resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} 1203 | 1204 | qs@6.5.3: 1205 | resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} 1206 | engines: {node: '>=0.6'} 1207 | 1208 | react-is@18.3.1: 1209 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 1210 | 1211 | request@2.88.2: 1212 | resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} 1213 | engines: {node: '>= 6'} 1214 | deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 1215 | 1216 | require-directory@2.1.1: 1217 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1218 | engines: {node: '>=0.10.0'} 1219 | 1220 | resolve-cwd@3.0.0: 1221 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1222 | engines: {node: '>=8'} 1223 | 1224 | resolve-from@5.0.0: 1225 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1226 | engines: {node: '>=8'} 1227 | 1228 | resolve.exports@2.0.2: 1229 | resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} 1230 | engines: {node: '>=10'} 1231 | 1232 | resolve@1.22.8: 1233 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1234 | hasBin: true 1235 | 1236 | safe-buffer@5.2.1: 1237 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1238 | 1239 | safer-buffer@2.1.2: 1240 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1241 | 1242 | semver@6.3.1: 1243 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1244 | hasBin: true 1245 | 1246 | semver@7.6.3: 1247 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1248 | engines: {node: '>=10'} 1249 | hasBin: true 1250 | 1251 | shebang-command@2.0.0: 1252 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1253 | engines: {node: '>=8'} 1254 | 1255 | shebang-regex@3.0.0: 1256 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1257 | engines: {node: '>=8'} 1258 | 1259 | shellwords@0.1.1: 1260 | resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} 1261 | 1262 | signal-exit@3.0.7: 1263 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1264 | 1265 | sisteransi@1.0.5: 1266 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1267 | 1268 | slash@3.0.0: 1269 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1270 | engines: {node: '>=8'} 1271 | 1272 | source-map-support@0.5.13: 1273 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 1274 | 1275 | source-map@0.6.1: 1276 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1277 | engines: {node: '>=0.10.0'} 1278 | 1279 | sprintf-js@1.0.3: 1280 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1281 | 1282 | sshpk@1.18.0: 1283 | resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} 1284 | engines: {node: '>=0.10.0'} 1285 | hasBin: true 1286 | 1287 | stack-utils@2.0.6: 1288 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 1289 | engines: {node: '>=10'} 1290 | 1291 | string-length@4.0.2: 1292 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 1293 | engines: {node: '>=10'} 1294 | 1295 | string-width@4.2.3: 1296 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1297 | engines: {node: '>=8'} 1298 | 1299 | strip-ansi@6.0.1: 1300 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1301 | engines: {node: '>=8'} 1302 | 1303 | strip-bom@4.0.0: 1304 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 1305 | engines: {node: '>=8'} 1306 | 1307 | strip-final-newline@2.0.0: 1308 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1309 | engines: {node: '>=6'} 1310 | 1311 | strip-json-comments@3.1.1: 1312 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1313 | engines: {node: '>=8'} 1314 | 1315 | supports-color@5.5.0: 1316 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1317 | engines: {node: '>=4'} 1318 | 1319 | supports-color@7.2.0: 1320 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1321 | engines: {node: '>=8'} 1322 | 1323 | supports-color@8.1.1: 1324 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1325 | engines: {node: '>=10'} 1326 | 1327 | supports-preserve-symlinks-flag@1.0.0: 1328 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1329 | engines: {node: '>= 0.4'} 1330 | 1331 | test-exclude@6.0.0: 1332 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1333 | engines: {node: '>=8'} 1334 | 1335 | tmpl@1.0.5: 1336 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 1337 | 1338 | to-fast-properties@2.0.0: 1339 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1340 | engines: {node: '>=4'} 1341 | 1342 | to-regex-range@5.0.1: 1343 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1344 | engines: {node: '>=8.0'} 1345 | 1346 | tough-cookie@2.5.0: 1347 | resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} 1348 | engines: {node: '>=0.8'} 1349 | 1350 | ts-jest@29.2.5: 1351 | resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} 1352 | engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} 1353 | hasBin: true 1354 | peerDependencies: 1355 | '@babel/core': '>=7.0.0-beta.0 <8' 1356 | '@jest/transform': ^29.0.0 1357 | '@jest/types': ^29.0.0 1358 | babel-jest: ^29.0.0 1359 | esbuild: '*' 1360 | jest: ^29.0.0 1361 | typescript: '>=4.3 <6' 1362 | peerDependenciesMeta: 1363 | '@babel/core': 1364 | optional: true 1365 | '@jest/transform': 1366 | optional: true 1367 | '@jest/types': 1368 | optional: true 1369 | babel-jest: 1370 | optional: true 1371 | esbuild: 1372 | optional: true 1373 | 1374 | ts-node@10.9.2: 1375 | resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 1376 | hasBin: true 1377 | peerDependencies: 1378 | '@swc/core': '>=1.2.50' 1379 | '@swc/wasm': '>=1.2.50' 1380 | '@types/node': '*' 1381 | typescript: '>=2.7' 1382 | peerDependenciesMeta: 1383 | '@swc/core': 1384 | optional: true 1385 | '@swc/wasm': 1386 | optional: true 1387 | 1388 | tunnel-agent@0.6.0: 1389 | resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} 1390 | 1391 | tweetnacl@0.14.5: 1392 | resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} 1393 | 1394 | type-detect@4.0.8: 1395 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1396 | engines: {node: '>=4'} 1397 | 1398 | type-fest@0.21.3: 1399 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1400 | engines: {node: '>=10'} 1401 | 1402 | typescript@5.5.4: 1403 | resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} 1404 | engines: {node: '>=14.17'} 1405 | hasBin: true 1406 | 1407 | undici-types@6.19.8: 1408 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 1409 | 1410 | update-browserslist-db@1.1.0: 1411 | resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} 1412 | hasBin: true 1413 | peerDependencies: 1414 | browserslist: '>= 4.21.0' 1415 | 1416 | uri-js@4.4.1: 1417 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1418 | 1419 | uuid@3.4.0: 1420 | resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} 1421 | deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. 1422 | hasBin: true 1423 | 1424 | uuid@8.3.2: 1425 | resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} 1426 | hasBin: true 1427 | 1428 | v8-compile-cache-lib@3.0.1: 1429 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 1430 | 1431 | v8-to-istanbul@9.3.0: 1432 | resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} 1433 | engines: {node: '>=10.12.0'} 1434 | 1435 | verror@1.10.0: 1436 | resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} 1437 | engines: {'0': node >=0.6.0} 1438 | 1439 | walker@1.0.8: 1440 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 1441 | 1442 | which@2.0.2: 1443 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1444 | engines: {node: '>= 8'} 1445 | hasBin: true 1446 | 1447 | wrap-ansi@7.0.0: 1448 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1449 | engines: {node: '>=10'} 1450 | 1451 | wrappy@1.0.2: 1452 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1453 | 1454 | write-file-atomic@4.0.2: 1455 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 1456 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1457 | 1458 | y18n@5.0.8: 1459 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1460 | engines: {node: '>=10'} 1461 | 1462 | yallist@3.1.1: 1463 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1464 | 1465 | yargs-parser@21.1.1: 1466 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1467 | engines: {node: '>=12'} 1468 | 1469 | yargs@17.7.2: 1470 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1471 | engines: {node: '>=12'} 1472 | 1473 | yn@3.1.1: 1474 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 1475 | engines: {node: '>=6'} 1476 | 1477 | yocto-queue@0.1.0: 1478 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1479 | engines: {node: '>=10'} 1480 | 1481 | snapshots: 1482 | 1483 | '@ampproject/remapping@2.3.0': 1484 | dependencies: 1485 | '@jridgewell/gen-mapping': 0.3.5 1486 | '@jridgewell/trace-mapping': 0.3.25 1487 | 1488 | '@babel/code-frame@7.24.7': 1489 | dependencies: 1490 | '@babel/highlight': 7.24.7 1491 | picocolors: 1.0.1 1492 | 1493 | '@babel/compat-data@7.25.4': {} 1494 | 1495 | '@babel/core@7.25.2': 1496 | dependencies: 1497 | '@ampproject/remapping': 2.3.0 1498 | '@babel/code-frame': 7.24.7 1499 | '@babel/generator': 7.25.5 1500 | '@babel/helper-compilation-targets': 7.25.2 1501 | '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) 1502 | '@babel/helpers': 7.25.0 1503 | '@babel/parser': 7.25.4 1504 | '@babel/template': 7.25.0 1505 | '@babel/traverse': 7.25.4 1506 | '@babel/types': 7.25.4 1507 | convert-source-map: 2.0.0 1508 | debug: 4.3.6 1509 | gensync: 1.0.0-beta.2 1510 | json5: 2.2.3 1511 | semver: 6.3.1 1512 | transitivePeerDependencies: 1513 | - supports-color 1514 | 1515 | '@babel/generator@7.25.5': 1516 | dependencies: 1517 | '@babel/types': 7.25.4 1518 | '@jridgewell/gen-mapping': 0.3.5 1519 | '@jridgewell/trace-mapping': 0.3.25 1520 | jsesc: 2.5.2 1521 | 1522 | '@babel/helper-compilation-targets@7.25.2': 1523 | dependencies: 1524 | '@babel/compat-data': 7.25.4 1525 | '@babel/helper-validator-option': 7.24.8 1526 | browserslist: 4.23.3 1527 | lru-cache: 5.1.1 1528 | semver: 6.3.1 1529 | 1530 | '@babel/helper-module-imports@7.24.7': 1531 | dependencies: 1532 | '@babel/traverse': 7.25.4 1533 | '@babel/types': 7.25.4 1534 | transitivePeerDependencies: 1535 | - supports-color 1536 | 1537 | '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': 1538 | dependencies: 1539 | '@babel/core': 7.25.2 1540 | '@babel/helper-module-imports': 7.24.7 1541 | '@babel/helper-simple-access': 7.24.7 1542 | '@babel/helper-validator-identifier': 7.24.7 1543 | '@babel/traverse': 7.25.4 1544 | transitivePeerDependencies: 1545 | - supports-color 1546 | 1547 | '@babel/helper-plugin-utils@7.24.8': {} 1548 | 1549 | '@babel/helper-simple-access@7.24.7': 1550 | dependencies: 1551 | '@babel/traverse': 7.25.4 1552 | '@babel/types': 7.25.4 1553 | transitivePeerDependencies: 1554 | - supports-color 1555 | 1556 | '@babel/helper-string-parser@7.24.8': {} 1557 | 1558 | '@babel/helper-validator-identifier@7.24.7': {} 1559 | 1560 | '@babel/helper-validator-option@7.24.8': {} 1561 | 1562 | '@babel/helpers@7.25.0': 1563 | dependencies: 1564 | '@babel/template': 7.25.0 1565 | '@babel/types': 7.25.4 1566 | 1567 | '@babel/highlight@7.24.7': 1568 | dependencies: 1569 | '@babel/helper-validator-identifier': 7.24.7 1570 | chalk: 2.4.2 1571 | js-tokens: 4.0.0 1572 | picocolors: 1.0.1 1573 | 1574 | '@babel/parser@7.25.4': 1575 | dependencies: 1576 | '@babel/types': 7.25.4 1577 | 1578 | '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': 1579 | dependencies: 1580 | '@babel/core': 7.25.2 1581 | '@babel/helper-plugin-utils': 7.24.8 1582 | 1583 | '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': 1584 | dependencies: 1585 | '@babel/core': 7.25.2 1586 | '@babel/helper-plugin-utils': 7.24.8 1587 | 1588 | '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': 1589 | dependencies: 1590 | '@babel/core': 7.25.2 1591 | '@babel/helper-plugin-utils': 7.24.8 1592 | 1593 | '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': 1594 | dependencies: 1595 | '@babel/core': 7.25.2 1596 | '@babel/helper-plugin-utils': 7.24.8 1597 | 1598 | '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': 1599 | dependencies: 1600 | '@babel/core': 7.25.2 1601 | '@babel/helper-plugin-utils': 7.24.8 1602 | 1603 | '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': 1604 | dependencies: 1605 | '@babel/core': 7.25.2 1606 | '@babel/helper-plugin-utils': 7.24.8 1607 | 1608 | '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': 1609 | dependencies: 1610 | '@babel/core': 7.25.2 1611 | '@babel/helper-plugin-utils': 7.24.8 1612 | 1613 | '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': 1614 | dependencies: 1615 | '@babel/core': 7.25.2 1616 | '@babel/helper-plugin-utils': 7.24.8 1617 | 1618 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': 1619 | dependencies: 1620 | '@babel/core': 7.25.2 1621 | '@babel/helper-plugin-utils': 7.24.8 1622 | 1623 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': 1624 | dependencies: 1625 | '@babel/core': 7.25.2 1626 | '@babel/helper-plugin-utils': 7.24.8 1627 | 1628 | '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': 1629 | dependencies: 1630 | '@babel/core': 7.25.2 1631 | '@babel/helper-plugin-utils': 7.24.8 1632 | 1633 | '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': 1634 | dependencies: 1635 | '@babel/core': 7.25.2 1636 | '@babel/helper-plugin-utils': 7.24.8 1637 | 1638 | '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': 1639 | dependencies: 1640 | '@babel/core': 7.25.2 1641 | '@babel/helper-plugin-utils': 7.24.8 1642 | 1643 | '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': 1644 | dependencies: 1645 | '@babel/core': 7.25.2 1646 | '@babel/helper-plugin-utils': 7.24.8 1647 | 1648 | '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': 1649 | dependencies: 1650 | '@babel/core': 7.25.2 1651 | '@babel/helper-plugin-utils': 7.24.8 1652 | 1653 | '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': 1654 | dependencies: 1655 | '@babel/core': 7.25.2 1656 | '@babel/helper-plugin-utils': 7.24.8 1657 | 1658 | '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': 1659 | dependencies: 1660 | '@babel/core': 7.25.2 1661 | '@babel/helper-plugin-utils': 7.24.8 1662 | 1663 | '@babel/template@7.25.0': 1664 | dependencies: 1665 | '@babel/code-frame': 7.24.7 1666 | '@babel/parser': 7.25.4 1667 | '@babel/types': 7.25.4 1668 | 1669 | '@babel/traverse@7.25.4': 1670 | dependencies: 1671 | '@babel/code-frame': 7.24.7 1672 | '@babel/generator': 7.25.5 1673 | '@babel/parser': 7.25.4 1674 | '@babel/template': 7.25.0 1675 | '@babel/types': 7.25.4 1676 | debug: 4.3.6 1677 | globals: 11.12.0 1678 | transitivePeerDependencies: 1679 | - supports-color 1680 | 1681 | '@babel/types@7.25.4': 1682 | dependencies: 1683 | '@babel/helper-string-parser': 7.24.8 1684 | '@babel/helper-validator-identifier': 7.24.7 1685 | to-fast-properties: 2.0.0 1686 | 1687 | '@bcoe/v8-coverage@0.2.3': {} 1688 | 1689 | '@cspotcode/source-map-support@0.8.1': 1690 | dependencies: 1691 | '@jridgewell/trace-mapping': 0.3.9 1692 | optional: true 1693 | 1694 | '@istanbuljs/load-nyc-config@1.1.0': 1695 | dependencies: 1696 | camelcase: 5.3.1 1697 | find-up: 4.1.0 1698 | get-package-type: 0.1.0 1699 | js-yaml: 3.14.1 1700 | resolve-from: 5.0.0 1701 | 1702 | '@istanbuljs/schema@0.1.3': {} 1703 | 1704 | '@jest/console@29.7.0': 1705 | dependencies: 1706 | '@jest/types': 29.6.3 1707 | '@types/node': 22.5.0 1708 | chalk: 4.1.2 1709 | jest-message-util: 29.7.0 1710 | jest-util: 29.7.0 1711 | slash: 3.0.0 1712 | 1713 | '@jest/core@29.7.0(node-notifier@8.0.2)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))': 1714 | dependencies: 1715 | '@jest/console': 29.7.0 1716 | '@jest/reporters': 29.7.0(node-notifier@8.0.2) 1717 | '@jest/test-result': 29.7.0 1718 | '@jest/transform': 29.7.0 1719 | '@jest/types': 29.6.3 1720 | '@types/node': 22.5.0 1721 | ansi-escapes: 4.3.2 1722 | chalk: 4.1.2 1723 | ci-info: 3.9.0 1724 | exit: 0.1.2 1725 | graceful-fs: 4.2.11 1726 | jest-changed-files: 29.7.0 1727 | jest-config: 29.7.0(@types/node@22.5.0)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) 1728 | jest-haste-map: 29.7.0 1729 | jest-message-util: 29.7.0 1730 | jest-regex-util: 29.6.3 1731 | jest-resolve: 29.7.0 1732 | jest-resolve-dependencies: 29.7.0 1733 | jest-runner: 29.7.0 1734 | jest-runtime: 29.7.0 1735 | jest-snapshot: 29.7.0 1736 | jest-util: 29.7.0 1737 | jest-validate: 29.7.0 1738 | jest-watcher: 29.7.0 1739 | micromatch: 4.0.8 1740 | pretty-format: 29.7.0 1741 | slash: 3.0.0 1742 | strip-ansi: 6.0.1 1743 | optionalDependencies: 1744 | node-notifier: 8.0.2 1745 | transitivePeerDependencies: 1746 | - babel-plugin-macros 1747 | - supports-color 1748 | - ts-node 1749 | 1750 | '@jest/environment@29.7.0': 1751 | dependencies: 1752 | '@jest/fake-timers': 29.7.0 1753 | '@jest/types': 29.6.3 1754 | '@types/node': 22.5.0 1755 | jest-mock: 29.7.0 1756 | 1757 | '@jest/expect-utils@29.7.0': 1758 | dependencies: 1759 | jest-get-type: 29.6.3 1760 | 1761 | '@jest/expect@29.7.0': 1762 | dependencies: 1763 | expect: 29.7.0 1764 | jest-snapshot: 29.7.0 1765 | transitivePeerDependencies: 1766 | - supports-color 1767 | 1768 | '@jest/fake-timers@29.7.0': 1769 | dependencies: 1770 | '@jest/types': 29.6.3 1771 | '@sinonjs/fake-timers': 10.3.0 1772 | '@types/node': 22.5.0 1773 | jest-message-util: 29.7.0 1774 | jest-mock: 29.7.0 1775 | jest-util: 29.7.0 1776 | 1777 | '@jest/globals@29.7.0': 1778 | dependencies: 1779 | '@jest/environment': 29.7.0 1780 | '@jest/expect': 29.7.0 1781 | '@jest/types': 29.6.3 1782 | jest-mock: 29.7.0 1783 | transitivePeerDependencies: 1784 | - supports-color 1785 | 1786 | '@jest/reporters@29.7.0(node-notifier@8.0.2)': 1787 | dependencies: 1788 | '@bcoe/v8-coverage': 0.2.3 1789 | '@jest/console': 29.7.0 1790 | '@jest/test-result': 29.7.0 1791 | '@jest/transform': 29.7.0 1792 | '@jest/types': 29.6.3 1793 | '@jridgewell/trace-mapping': 0.3.25 1794 | '@types/node': 22.5.0 1795 | chalk: 4.1.2 1796 | collect-v8-coverage: 1.0.2 1797 | exit: 0.1.2 1798 | glob: 7.2.3 1799 | graceful-fs: 4.2.11 1800 | istanbul-lib-coverage: 3.2.2 1801 | istanbul-lib-instrument: 6.0.3 1802 | istanbul-lib-report: 3.0.1 1803 | istanbul-lib-source-maps: 4.0.1 1804 | istanbul-reports: 3.1.7 1805 | jest-message-util: 29.7.0 1806 | jest-util: 29.7.0 1807 | jest-worker: 29.7.0 1808 | slash: 3.0.0 1809 | string-length: 4.0.2 1810 | strip-ansi: 6.0.1 1811 | v8-to-istanbul: 9.3.0 1812 | optionalDependencies: 1813 | node-notifier: 8.0.2 1814 | transitivePeerDependencies: 1815 | - supports-color 1816 | 1817 | '@jest/schemas@29.6.3': 1818 | dependencies: 1819 | '@sinclair/typebox': 0.27.8 1820 | 1821 | '@jest/source-map@29.6.3': 1822 | dependencies: 1823 | '@jridgewell/trace-mapping': 0.3.25 1824 | callsites: 3.1.0 1825 | graceful-fs: 4.2.11 1826 | 1827 | '@jest/test-result@29.7.0': 1828 | dependencies: 1829 | '@jest/console': 29.7.0 1830 | '@jest/types': 29.6.3 1831 | '@types/istanbul-lib-coverage': 2.0.6 1832 | collect-v8-coverage: 1.0.2 1833 | 1834 | '@jest/test-sequencer@29.7.0': 1835 | dependencies: 1836 | '@jest/test-result': 29.7.0 1837 | graceful-fs: 4.2.11 1838 | jest-haste-map: 29.7.0 1839 | slash: 3.0.0 1840 | 1841 | '@jest/transform@29.7.0': 1842 | dependencies: 1843 | '@babel/core': 7.25.2 1844 | '@jest/types': 29.6.3 1845 | '@jridgewell/trace-mapping': 0.3.25 1846 | babel-plugin-istanbul: 6.1.1 1847 | chalk: 4.1.2 1848 | convert-source-map: 2.0.0 1849 | fast-json-stable-stringify: 2.1.0 1850 | graceful-fs: 4.2.11 1851 | jest-haste-map: 29.7.0 1852 | jest-regex-util: 29.6.3 1853 | jest-util: 29.7.0 1854 | micromatch: 4.0.8 1855 | pirates: 4.0.6 1856 | slash: 3.0.0 1857 | write-file-atomic: 4.0.2 1858 | transitivePeerDependencies: 1859 | - supports-color 1860 | 1861 | '@jest/types@29.6.3': 1862 | dependencies: 1863 | '@jest/schemas': 29.6.3 1864 | '@types/istanbul-lib-coverage': 2.0.6 1865 | '@types/istanbul-reports': 3.0.4 1866 | '@types/node': 22.5.0 1867 | '@types/yargs': 17.0.33 1868 | chalk: 4.1.2 1869 | 1870 | '@jridgewell/gen-mapping@0.3.5': 1871 | dependencies: 1872 | '@jridgewell/set-array': 1.2.1 1873 | '@jridgewell/sourcemap-codec': 1.5.0 1874 | '@jridgewell/trace-mapping': 0.3.25 1875 | 1876 | '@jridgewell/resolve-uri@3.1.2': {} 1877 | 1878 | '@jridgewell/set-array@1.2.1': {} 1879 | 1880 | '@jridgewell/sourcemap-codec@1.5.0': {} 1881 | 1882 | '@jridgewell/trace-mapping@0.3.25': 1883 | dependencies: 1884 | '@jridgewell/resolve-uri': 3.1.2 1885 | '@jridgewell/sourcemap-codec': 1.5.0 1886 | 1887 | '@jridgewell/trace-mapping@0.3.9': 1888 | dependencies: 1889 | '@jridgewell/resolve-uri': 3.1.2 1890 | '@jridgewell/sourcemap-codec': 1.5.0 1891 | optional: true 1892 | 1893 | '@sinclair/typebox@0.27.8': {} 1894 | 1895 | '@sinonjs/commons@3.0.1': 1896 | dependencies: 1897 | type-detect: 4.0.8 1898 | 1899 | '@sinonjs/fake-timers@10.3.0': 1900 | dependencies: 1901 | '@sinonjs/commons': 3.0.1 1902 | 1903 | '@tsconfig/node10@1.0.11': 1904 | optional: true 1905 | 1906 | '@tsconfig/node12@1.0.11': 1907 | optional: true 1908 | 1909 | '@tsconfig/node14@1.0.3': 1910 | optional: true 1911 | 1912 | '@tsconfig/node16@1.0.4': 1913 | optional: true 1914 | 1915 | '@types/babel__core@7.20.5': 1916 | dependencies: 1917 | '@babel/parser': 7.25.4 1918 | '@babel/types': 7.25.4 1919 | '@types/babel__generator': 7.6.8 1920 | '@types/babel__template': 7.4.4 1921 | '@types/babel__traverse': 7.20.6 1922 | 1923 | '@types/babel__generator@7.6.8': 1924 | dependencies: 1925 | '@babel/types': 7.25.4 1926 | 1927 | '@types/babel__template@7.4.4': 1928 | dependencies: 1929 | '@babel/parser': 7.25.4 1930 | '@babel/types': 7.25.4 1931 | 1932 | '@types/babel__traverse@7.20.6': 1933 | dependencies: 1934 | '@babel/types': 7.25.4 1935 | 1936 | '@types/graceful-fs@4.1.9': 1937 | dependencies: 1938 | '@types/node': 22.5.0 1939 | 1940 | '@types/istanbul-lib-coverage@2.0.6': {} 1941 | 1942 | '@types/istanbul-lib-report@3.0.3': 1943 | dependencies: 1944 | '@types/istanbul-lib-coverage': 2.0.6 1945 | 1946 | '@types/istanbul-reports@3.0.4': 1947 | dependencies: 1948 | '@types/istanbul-lib-report': 3.0.3 1949 | 1950 | '@types/jest@29.5.12': 1951 | dependencies: 1952 | expect: 29.7.0 1953 | pretty-format: 29.7.0 1954 | 1955 | '@types/node@22.5.0': 1956 | dependencies: 1957 | undici-types: 6.19.8 1958 | 1959 | '@types/stack-utils@2.0.3': {} 1960 | 1961 | '@types/yargs-parser@21.0.3': {} 1962 | 1963 | '@types/yargs@17.0.33': 1964 | dependencies: 1965 | '@types/yargs-parser': 21.0.3 1966 | 1967 | acorn-walk@8.3.3: 1968 | dependencies: 1969 | acorn: 8.12.1 1970 | optional: true 1971 | 1972 | acorn@8.12.1: 1973 | optional: true 1974 | 1975 | ajv@6.12.6: 1976 | dependencies: 1977 | fast-deep-equal: 3.1.3 1978 | fast-json-stable-stringify: 2.1.0 1979 | json-schema-traverse: 0.4.1 1980 | uri-js: 4.4.1 1981 | 1982 | ansi-escapes@4.3.2: 1983 | dependencies: 1984 | type-fest: 0.21.3 1985 | 1986 | ansi-regex@5.0.1: {} 1987 | 1988 | ansi-styles@3.2.1: 1989 | dependencies: 1990 | color-convert: 1.9.3 1991 | 1992 | ansi-styles@4.3.0: 1993 | dependencies: 1994 | color-convert: 2.0.1 1995 | 1996 | ansi-styles@5.2.0: {} 1997 | 1998 | anymatch@3.1.3: 1999 | dependencies: 2000 | normalize-path: 3.0.0 2001 | picomatch: 2.3.1 2002 | 2003 | arg@4.1.3: 2004 | optional: true 2005 | 2006 | argparse@1.0.10: 2007 | dependencies: 2008 | sprintf-js: 1.0.3 2009 | 2010 | asn1@0.2.6: 2011 | dependencies: 2012 | safer-buffer: 2.1.2 2013 | 2014 | assert-plus@1.0.0: {} 2015 | 2016 | async@3.2.6: {} 2017 | 2018 | asynckit@0.4.0: {} 2019 | 2020 | aws-sign2@0.7.0: {} 2021 | 2022 | aws4@1.13.1: {} 2023 | 2024 | babel-jest@29.7.0(@babel/core@7.25.2): 2025 | dependencies: 2026 | '@babel/core': 7.25.2 2027 | '@jest/transform': 29.7.0 2028 | '@types/babel__core': 7.20.5 2029 | babel-plugin-istanbul: 6.1.1 2030 | babel-preset-jest: 29.6.3(@babel/core@7.25.2) 2031 | chalk: 4.1.2 2032 | graceful-fs: 4.2.11 2033 | slash: 3.0.0 2034 | transitivePeerDependencies: 2035 | - supports-color 2036 | 2037 | babel-plugin-istanbul@6.1.1: 2038 | dependencies: 2039 | '@babel/helper-plugin-utils': 7.24.8 2040 | '@istanbuljs/load-nyc-config': 1.1.0 2041 | '@istanbuljs/schema': 0.1.3 2042 | istanbul-lib-instrument: 5.2.1 2043 | test-exclude: 6.0.0 2044 | transitivePeerDependencies: 2045 | - supports-color 2046 | 2047 | babel-plugin-jest-hoist@29.6.3: 2048 | dependencies: 2049 | '@babel/template': 7.25.0 2050 | '@babel/types': 7.25.4 2051 | '@types/babel__core': 7.20.5 2052 | '@types/babel__traverse': 7.20.6 2053 | 2054 | babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2): 2055 | dependencies: 2056 | '@babel/core': 7.25.2 2057 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) 2058 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) 2059 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) 2060 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) 2061 | '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) 2062 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) 2063 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) 2064 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) 2065 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) 2066 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) 2067 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) 2068 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) 2069 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) 2070 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) 2071 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) 2072 | 2073 | babel-preset-jest@29.6.3(@babel/core@7.25.2): 2074 | dependencies: 2075 | '@babel/core': 7.25.2 2076 | babel-plugin-jest-hoist: 29.6.3 2077 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) 2078 | 2079 | balanced-match@1.0.2: {} 2080 | 2081 | bcrypt-pbkdf@1.0.2: 2082 | dependencies: 2083 | tweetnacl: 0.14.5 2084 | 2085 | brace-expansion@1.1.11: 2086 | dependencies: 2087 | balanced-match: 1.0.2 2088 | concat-map: 0.0.1 2089 | 2090 | brace-expansion@2.0.1: 2091 | dependencies: 2092 | balanced-match: 1.0.2 2093 | 2094 | braces@3.0.3: 2095 | dependencies: 2096 | fill-range: 7.1.1 2097 | 2098 | browserslist@4.23.3: 2099 | dependencies: 2100 | caniuse-lite: 1.0.30001653 2101 | electron-to-chromium: 1.5.13 2102 | node-releases: 2.0.18 2103 | update-browserslist-db: 1.1.0(browserslist@4.23.3) 2104 | 2105 | bs-logger@0.2.6: 2106 | dependencies: 2107 | fast-json-stable-stringify: 2.1.0 2108 | 2109 | bser@2.1.1: 2110 | dependencies: 2111 | node-int64: 0.4.0 2112 | 2113 | buffer-from@1.1.2: {} 2114 | 2115 | callsites@3.1.0: {} 2116 | 2117 | camelcase@5.3.1: {} 2118 | 2119 | camelcase@6.3.0: {} 2120 | 2121 | caniuse-lite@1.0.30001653: {} 2122 | 2123 | caseless@0.12.0: {} 2124 | 2125 | chalk@2.4.2: 2126 | dependencies: 2127 | ansi-styles: 3.2.1 2128 | escape-string-regexp: 1.0.5 2129 | supports-color: 5.5.0 2130 | 2131 | chalk@4.1.2: 2132 | dependencies: 2133 | ansi-styles: 4.3.0 2134 | supports-color: 7.2.0 2135 | 2136 | char-regex@1.0.2: {} 2137 | 2138 | ci-info@3.9.0: {} 2139 | 2140 | cjs-module-lexer@1.4.0: {} 2141 | 2142 | cliui@8.0.1: 2143 | dependencies: 2144 | string-width: 4.2.3 2145 | strip-ansi: 6.0.1 2146 | wrap-ansi: 7.0.0 2147 | 2148 | co@4.6.0: {} 2149 | 2150 | collect-v8-coverage@1.0.2: {} 2151 | 2152 | color-convert@1.9.3: 2153 | dependencies: 2154 | color-name: 1.1.3 2155 | 2156 | color-convert@2.0.1: 2157 | dependencies: 2158 | color-name: 1.1.4 2159 | 2160 | color-name@1.1.3: {} 2161 | 2162 | color-name@1.1.4: {} 2163 | 2164 | combined-stream@1.0.8: 2165 | dependencies: 2166 | delayed-stream: 1.0.0 2167 | 2168 | concat-map@0.0.1: {} 2169 | 2170 | convert-source-map@2.0.0: {} 2171 | 2172 | core-util-is@1.0.2: {} 2173 | 2174 | coveralls@3.1.1: 2175 | dependencies: 2176 | js-yaml: 3.14.1 2177 | lcov-parse: 1.0.0 2178 | log-driver: 1.2.7 2179 | minimist: 1.2.8 2180 | request: 2.88.2 2181 | 2182 | create-jest@29.7.0(@types/node@22.5.0)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)): 2183 | dependencies: 2184 | '@jest/types': 29.6.3 2185 | chalk: 4.1.2 2186 | exit: 0.1.2 2187 | graceful-fs: 4.2.11 2188 | jest-config: 29.7.0(@types/node@22.5.0)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) 2189 | jest-util: 29.7.0 2190 | prompts: 2.4.2 2191 | transitivePeerDependencies: 2192 | - '@types/node' 2193 | - babel-plugin-macros 2194 | - supports-color 2195 | - ts-node 2196 | 2197 | create-require@1.1.1: 2198 | optional: true 2199 | 2200 | cross-spawn@7.0.3: 2201 | dependencies: 2202 | path-key: 3.1.1 2203 | shebang-command: 2.0.0 2204 | which: 2.0.2 2205 | 2206 | dashdash@1.14.1: 2207 | dependencies: 2208 | assert-plus: 1.0.0 2209 | 2210 | debug@4.3.6: 2211 | dependencies: 2212 | ms: 2.1.2 2213 | 2214 | dedent@1.5.3: {} 2215 | 2216 | deepmerge@4.3.1: {} 2217 | 2218 | delayed-stream@1.0.0: {} 2219 | 2220 | detect-newline@3.1.0: {} 2221 | 2222 | diff-sequences@29.6.3: {} 2223 | 2224 | diff@4.0.2: 2225 | optional: true 2226 | 2227 | ecc-jsbn@0.1.2: 2228 | dependencies: 2229 | jsbn: 0.1.1 2230 | safer-buffer: 2.1.2 2231 | 2232 | ejs@3.1.10: 2233 | dependencies: 2234 | jake: 10.9.2 2235 | 2236 | electron-to-chromium@1.5.13: {} 2237 | 2238 | emittery@0.13.1: {} 2239 | 2240 | emoji-regex@8.0.0: {} 2241 | 2242 | error-ex@1.3.2: 2243 | dependencies: 2244 | is-arrayish: 0.2.1 2245 | 2246 | escalade@3.1.2: {} 2247 | 2248 | escape-string-regexp@1.0.5: {} 2249 | 2250 | escape-string-regexp@2.0.0: {} 2251 | 2252 | esprima@4.0.1: {} 2253 | 2254 | execa@5.1.1: 2255 | dependencies: 2256 | cross-spawn: 7.0.3 2257 | get-stream: 6.0.1 2258 | human-signals: 2.1.0 2259 | is-stream: 2.0.1 2260 | merge-stream: 2.0.0 2261 | npm-run-path: 4.0.1 2262 | onetime: 5.1.2 2263 | signal-exit: 3.0.7 2264 | strip-final-newline: 2.0.0 2265 | 2266 | exit@0.1.2: {} 2267 | 2268 | expect@29.7.0: 2269 | dependencies: 2270 | '@jest/expect-utils': 29.7.0 2271 | jest-get-type: 29.6.3 2272 | jest-matcher-utils: 29.7.0 2273 | jest-message-util: 29.7.0 2274 | jest-util: 29.7.0 2275 | 2276 | extend@3.0.2: {} 2277 | 2278 | extsprintf@1.3.0: {} 2279 | 2280 | fast-deep-equal@3.1.3: {} 2281 | 2282 | fast-json-stable-stringify@2.1.0: {} 2283 | 2284 | fb-watchman@2.0.2: 2285 | dependencies: 2286 | bser: 2.1.1 2287 | 2288 | filelist@1.0.4: 2289 | dependencies: 2290 | minimatch: 5.1.6 2291 | 2292 | fill-range@7.1.1: 2293 | dependencies: 2294 | to-regex-range: 5.0.1 2295 | 2296 | find-up@4.1.0: 2297 | dependencies: 2298 | locate-path: 5.0.0 2299 | path-exists: 4.0.0 2300 | 2301 | forever-agent@0.6.1: {} 2302 | 2303 | form-data@2.3.3: 2304 | dependencies: 2305 | asynckit: 0.4.0 2306 | combined-stream: 1.0.8 2307 | mime-types: 2.1.35 2308 | 2309 | fs.realpath@1.0.0: {} 2310 | 2311 | fsevents@2.3.3: 2312 | optional: true 2313 | 2314 | function-bind@1.1.2: {} 2315 | 2316 | gensync@1.0.0-beta.2: {} 2317 | 2318 | get-caller-file@2.0.5: {} 2319 | 2320 | get-package-type@0.1.0: {} 2321 | 2322 | get-stream@6.0.1: {} 2323 | 2324 | getpass@0.1.7: 2325 | dependencies: 2326 | assert-plus: 1.0.0 2327 | 2328 | glob@7.2.3: 2329 | dependencies: 2330 | fs.realpath: 1.0.0 2331 | inflight: 1.0.6 2332 | inherits: 2.0.4 2333 | minimatch: 3.1.2 2334 | once: 1.4.0 2335 | path-is-absolute: 1.0.1 2336 | 2337 | globals@11.12.0: {} 2338 | 2339 | graceful-fs@4.2.11: {} 2340 | 2341 | growly@1.3.0: 2342 | optional: true 2343 | 2344 | har-schema@2.0.0: {} 2345 | 2346 | har-validator@5.1.5: 2347 | dependencies: 2348 | ajv: 6.12.6 2349 | har-schema: 2.0.0 2350 | 2351 | has-flag@3.0.0: {} 2352 | 2353 | has-flag@4.0.0: {} 2354 | 2355 | hasown@2.0.2: 2356 | dependencies: 2357 | function-bind: 1.1.2 2358 | 2359 | html-escaper@2.0.2: {} 2360 | 2361 | http-signature@1.2.0: 2362 | dependencies: 2363 | assert-plus: 1.0.0 2364 | jsprim: 1.4.2 2365 | sshpk: 1.18.0 2366 | 2367 | human-signals@2.1.0: {} 2368 | 2369 | import-local@3.2.0: 2370 | dependencies: 2371 | pkg-dir: 4.2.0 2372 | resolve-cwd: 3.0.0 2373 | 2374 | imurmurhash@0.1.4: {} 2375 | 2376 | inflight@1.0.6: 2377 | dependencies: 2378 | once: 1.4.0 2379 | wrappy: 1.0.2 2380 | 2381 | inherits@2.0.4: {} 2382 | 2383 | is-arrayish@0.2.1: {} 2384 | 2385 | is-core-module@2.15.1: 2386 | dependencies: 2387 | hasown: 2.0.2 2388 | 2389 | is-docker@2.2.1: 2390 | optional: true 2391 | 2392 | is-fullwidth-code-point@3.0.0: {} 2393 | 2394 | is-generator-fn@2.1.0: {} 2395 | 2396 | is-number@7.0.0: {} 2397 | 2398 | is-stream@2.0.1: {} 2399 | 2400 | is-typedarray@1.0.0: {} 2401 | 2402 | is-wsl@2.2.0: 2403 | dependencies: 2404 | is-docker: 2.2.1 2405 | optional: true 2406 | 2407 | isexe@2.0.0: {} 2408 | 2409 | isstream@0.1.2: {} 2410 | 2411 | istanbul-lib-coverage@3.2.2: {} 2412 | 2413 | istanbul-lib-instrument@5.2.1: 2414 | dependencies: 2415 | '@babel/core': 7.25.2 2416 | '@babel/parser': 7.25.4 2417 | '@istanbuljs/schema': 0.1.3 2418 | istanbul-lib-coverage: 3.2.2 2419 | semver: 6.3.1 2420 | transitivePeerDependencies: 2421 | - supports-color 2422 | 2423 | istanbul-lib-instrument@6.0.3: 2424 | dependencies: 2425 | '@babel/core': 7.25.2 2426 | '@babel/parser': 7.25.4 2427 | '@istanbuljs/schema': 0.1.3 2428 | istanbul-lib-coverage: 3.2.2 2429 | semver: 7.6.3 2430 | transitivePeerDependencies: 2431 | - supports-color 2432 | 2433 | istanbul-lib-report@3.0.1: 2434 | dependencies: 2435 | istanbul-lib-coverage: 3.2.2 2436 | make-dir: 4.0.0 2437 | supports-color: 7.2.0 2438 | 2439 | istanbul-lib-source-maps@4.0.1: 2440 | dependencies: 2441 | debug: 4.3.6 2442 | istanbul-lib-coverage: 3.2.2 2443 | source-map: 0.6.1 2444 | transitivePeerDependencies: 2445 | - supports-color 2446 | 2447 | istanbul-reports@3.1.7: 2448 | dependencies: 2449 | html-escaper: 2.0.2 2450 | istanbul-lib-report: 3.0.1 2451 | 2452 | jake@10.9.2: 2453 | dependencies: 2454 | async: 3.2.6 2455 | chalk: 4.1.2 2456 | filelist: 1.0.4 2457 | minimatch: 3.1.2 2458 | 2459 | jest-changed-files@29.7.0: 2460 | dependencies: 2461 | execa: 5.1.1 2462 | jest-util: 29.7.0 2463 | p-limit: 3.1.0 2464 | 2465 | jest-circus@29.7.0: 2466 | dependencies: 2467 | '@jest/environment': 29.7.0 2468 | '@jest/expect': 29.7.0 2469 | '@jest/test-result': 29.7.0 2470 | '@jest/types': 29.6.3 2471 | '@types/node': 22.5.0 2472 | chalk: 4.1.2 2473 | co: 4.6.0 2474 | dedent: 1.5.3 2475 | is-generator-fn: 2.1.0 2476 | jest-each: 29.7.0 2477 | jest-matcher-utils: 29.7.0 2478 | jest-message-util: 29.7.0 2479 | jest-runtime: 29.7.0 2480 | jest-snapshot: 29.7.0 2481 | jest-util: 29.7.0 2482 | p-limit: 3.1.0 2483 | pretty-format: 29.7.0 2484 | pure-rand: 6.1.0 2485 | slash: 3.0.0 2486 | stack-utils: 2.0.6 2487 | transitivePeerDependencies: 2488 | - babel-plugin-macros 2489 | - supports-color 2490 | 2491 | jest-cli@29.7.0(@types/node@22.5.0)(node-notifier@8.0.2)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)): 2492 | dependencies: 2493 | '@jest/core': 29.7.0(node-notifier@8.0.2)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) 2494 | '@jest/test-result': 29.7.0 2495 | '@jest/types': 29.6.3 2496 | chalk: 4.1.2 2497 | create-jest: 29.7.0(@types/node@22.5.0)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) 2498 | exit: 0.1.2 2499 | import-local: 3.2.0 2500 | jest-config: 29.7.0(@types/node@22.5.0)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) 2501 | jest-util: 29.7.0 2502 | jest-validate: 29.7.0 2503 | yargs: 17.7.2 2504 | optionalDependencies: 2505 | node-notifier: 8.0.2 2506 | transitivePeerDependencies: 2507 | - '@types/node' 2508 | - babel-plugin-macros 2509 | - supports-color 2510 | - ts-node 2511 | 2512 | jest-config@29.7.0(@types/node@22.5.0)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)): 2513 | dependencies: 2514 | '@babel/core': 7.25.2 2515 | '@jest/test-sequencer': 29.7.0 2516 | '@jest/types': 29.6.3 2517 | babel-jest: 29.7.0(@babel/core@7.25.2) 2518 | chalk: 4.1.2 2519 | ci-info: 3.9.0 2520 | deepmerge: 4.3.1 2521 | glob: 7.2.3 2522 | graceful-fs: 4.2.11 2523 | jest-circus: 29.7.0 2524 | jest-environment-node: 29.7.0 2525 | jest-get-type: 29.6.3 2526 | jest-regex-util: 29.6.3 2527 | jest-resolve: 29.7.0 2528 | jest-runner: 29.7.0 2529 | jest-util: 29.7.0 2530 | jest-validate: 29.7.0 2531 | micromatch: 4.0.8 2532 | parse-json: 5.2.0 2533 | pretty-format: 29.7.0 2534 | slash: 3.0.0 2535 | strip-json-comments: 3.1.1 2536 | optionalDependencies: 2537 | '@types/node': 22.5.0 2538 | ts-node: 10.9.2(@types/node@22.5.0)(typescript@5.5.4) 2539 | transitivePeerDependencies: 2540 | - babel-plugin-macros 2541 | - supports-color 2542 | 2543 | jest-diff@29.7.0: 2544 | dependencies: 2545 | chalk: 4.1.2 2546 | diff-sequences: 29.6.3 2547 | jest-get-type: 29.6.3 2548 | pretty-format: 29.7.0 2549 | 2550 | jest-docblock@29.7.0: 2551 | dependencies: 2552 | detect-newline: 3.1.0 2553 | 2554 | jest-each@29.7.0: 2555 | dependencies: 2556 | '@jest/types': 29.6.3 2557 | chalk: 4.1.2 2558 | jest-get-type: 29.6.3 2559 | jest-util: 29.7.0 2560 | pretty-format: 29.7.0 2561 | 2562 | jest-environment-node@29.7.0: 2563 | dependencies: 2564 | '@jest/environment': 29.7.0 2565 | '@jest/fake-timers': 29.7.0 2566 | '@jest/types': 29.6.3 2567 | '@types/node': 22.5.0 2568 | jest-mock: 29.7.0 2569 | jest-util: 29.7.0 2570 | 2571 | jest-get-type@29.6.3: {} 2572 | 2573 | jest-haste-map@29.7.0: 2574 | dependencies: 2575 | '@jest/types': 29.6.3 2576 | '@types/graceful-fs': 4.1.9 2577 | '@types/node': 22.5.0 2578 | anymatch: 3.1.3 2579 | fb-watchman: 2.0.2 2580 | graceful-fs: 4.2.11 2581 | jest-regex-util: 29.6.3 2582 | jest-util: 29.7.0 2583 | jest-worker: 29.7.0 2584 | micromatch: 4.0.8 2585 | walker: 1.0.8 2586 | optionalDependencies: 2587 | fsevents: 2.3.3 2588 | 2589 | jest-leak-detector@29.7.0: 2590 | dependencies: 2591 | jest-get-type: 29.6.3 2592 | pretty-format: 29.7.0 2593 | 2594 | jest-matcher-utils@29.7.0: 2595 | dependencies: 2596 | chalk: 4.1.2 2597 | jest-diff: 29.7.0 2598 | jest-get-type: 29.6.3 2599 | pretty-format: 29.7.0 2600 | 2601 | jest-message-util@29.7.0: 2602 | dependencies: 2603 | '@babel/code-frame': 7.24.7 2604 | '@jest/types': 29.6.3 2605 | '@types/stack-utils': 2.0.3 2606 | chalk: 4.1.2 2607 | graceful-fs: 4.2.11 2608 | micromatch: 4.0.8 2609 | pretty-format: 29.7.0 2610 | slash: 3.0.0 2611 | stack-utils: 2.0.6 2612 | 2613 | jest-mock@29.7.0: 2614 | dependencies: 2615 | '@jest/types': 29.6.3 2616 | '@types/node': 22.5.0 2617 | jest-util: 29.7.0 2618 | 2619 | jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): 2620 | optionalDependencies: 2621 | jest-resolve: 29.7.0 2622 | 2623 | jest-regex-util@29.6.3: {} 2624 | 2625 | jest-resolve-dependencies@29.7.0: 2626 | dependencies: 2627 | jest-regex-util: 29.6.3 2628 | jest-snapshot: 29.7.0 2629 | transitivePeerDependencies: 2630 | - supports-color 2631 | 2632 | jest-resolve@29.7.0: 2633 | dependencies: 2634 | chalk: 4.1.2 2635 | graceful-fs: 4.2.11 2636 | jest-haste-map: 29.7.0 2637 | jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) 2638 | jest-util: 29.7.0 2639 | jest-validate: 29.7.0 2640 | resolve: 1.22.8 2641 | resolve.exports: 2.0.2 2642 | slash: 3.0.0 2643 | 2644 | jest-runner@29.7.0: 2645 | dependencies: 2646 | '@jest/console': 29.7.0 2647 | '@jest/environment': 29.7.0 2648 | '@jest/test-result': 29.7.0 2649 | '@jest/transform': 29.7.0 2650 | '@jest/types': 29.6.3 2651 | '@types/node': 22.5.0 2652 | chalk: 4.1.2 2653 | emittery: 0.13.1 2654 | graceful-fs: 4.2.11 2655 | jest-docblock: 29.7.0 2656 | jest-environment-node: 29.7.0 2657 | jest-haste-map: 29.7.0 2658 | jest-leak-detector: 29.7.0 2659 | jest-message-util: 29.7.0 2660 | jest-resolve: 29.7.0 2661 | jest-runtime: 29.7.0 2662 | jest-util: 29.7.0 2663 | jest-watcher: 29.7.0 2664 | jest-worker: 29.7.0 2665 | p-limit: 3.1.0 2666 | source-map-support: 0.5.13 2667 | transitivePeerDependencies: 2668 | - supports-color 2669 | 2670 | jest-runtime@29.7.0: 2671 | dependencies: 2672 | '@jest/environment': 29.7.0 2673 | '@jest/fake-timers': 29.7.0 2674 | '@jest/globals': 29.7.0 2675 | '@jest/source-map': 29.6.3 2676 | '@jest/test-result': 29.7.0 2677 | '@jest/transform': 29.7.0 2678 | '@jest/types': 29.6.3 2679 | '@types/node': 22.5.0 2680 | chalk: 4.1.2 2681 | cjs-module-lexer: 1.4.0 2682 | collect-v8-coverage: 1.0.2 2683 | glob: 7.2.3 2684 | graceful-fs: 4.2.11 2685 | jest-haste-map: 29.7.0 2686 | jest-message-util: 29.7.0 2687 | jest-mock: 29.7.0 2688 | jest-regex-util: 29.6.3 2689 | jest-resolve: 29.7.0 2690 | jest-snapshot: 29.7.0 2691 | jest-util: 29.7.0 2692 | slash: 3.0.0 2693 | strip-bom: 4.0.0 2694 | transitivePeerDependencies: 2695 | - supports-color 2696 | 2697 | jest-snapshot@29.7.0: 2698 | dependencies: 2699 | '@babel/core': 7.25.2 2700 | '@babel/generator': 7.25.5 2701 | '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) 2702 | '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) 2703 | '@babel/types': 7.25.4 2704 | '@jest/expect-utils': 29.7.0 2705 | '@jest/transform': 29.7.0 2706 | '@jest/types': 29.6.3 2707 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) 2708 | chalk: 4.1.2 2709 | expect: 29.7.0 2710 | graceful-fs: 4.2.11 2711 | jest-diff: 29.7.0 2712 | jest-get-type: 29.6.3 2713 | jest-matcher-utils: 29.7.0 2714 | jest-message-util: 29.7.0 2715 | jest-util: 29.7.0 2716 | natural-compare: 1.4.0 2717 | pretty-format: 29.7.0 2718 | semver: 7.6.3 2719 | transitivePeerDependencies: 2720 | - supports-color 2721 | 2722 | jest-util@29.7.0: 2723 | dependencies: 2724 | '@jest/types': 29.6.3 2725 | '@types/node': 22.5.0 2726 | chalk: 4.1.2 2727 | ci-info: 3.9.0 2728 | graceful-fs: 4.2.11 2729 | picomatch: 2.3.1 2730 | 2731 | jest-validate@29.7.0: 2732 | dependencies: 2733 | '@jest/types': 29.6.3 2734 | camelcase: 6.3.0 2735 | chalk: 4.1.2 2736 | jest-get-type: 29.6.3 2737 | leven: 3.1.0 2738 | pretty-format: 29.7.0 2739 | 2740 | jest-watcher@29.7.0: 2741 | dependencies: 2742 | '@jest/test-result': 29.7.0 2743 | '@jest/types': 29.6.3 2744 | '@types/node': 22.5.0 2745 | ansi-escapes: 4.3.2 2746 | chalk: 4.1.2 2747 | emittery: 0.13.1 2748 | jest-util: 29.7.0 2749 | string-length: 4.0.2 2750 | 2751 | jest-worker@29.7.0: 2752 | dependencies: 2753 | '@types/node': 22.5.0 2754 | jest-util: 29.7.0 2755 | merge-stream: 2.0.0 2756 | supports-color: 8.1.1 2757 | 2758 | jest@29.7.0(@types/node@22.5.0)(node-notifier@8.0.2)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)): 2759 | dependencies: 2760 | '@jest/core': 29.7.0(node-notifier@8.0.2)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) 2761 | '@jest/types': 29.6.3 2762 | import-local: 3.2.0 2763 | jest-cli: 29.7.0(@types/node@22.5.0)(node-notifier@8.0.2)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) 2764 | optionalDependencies: 2765 | node-notifier: 8.0.2 2766 | transitivePeerDependencies: 2767 | - '@types/node' 2768 | - babel-plugin-macros 2769 | - supports-color 2770 | - ts-node 2771 | 2772 | js-tokens@4.0.0: {} 2773 | 2774 | js-yaml@3.14.1: 2775 | dependencies: 2776 | argparse: 1.0.10 2777 | esprima: 4.0.1 2778 | 2779 | jsbn@0.1.1: {} 2780 | 2781 | jsesc@2.5.2: {} 2782 | 2783 | json-parse-even-better-errors@2.3.1: {} 2784 | 2785 | json-schema-traverse@0.4.1: {} 2786 | 2787 | json-schema@0.4.0: {} 2788 | 2789 | json-stringify-safe@5.0.1: {} 2790 | 2791 | json5@2.2.3: {} 2792 | 2793 | jsprim@1.4.2: 2794 | dependencies: 2795 | assert-plus: 1.0.0 2796 | extsprintf: 1.3.0 2797 | json-schema: 0.4.0 2798 | verror: 1.10.0 2799 | 2800 | kleur@3.0.3: {} 2801 | 2802 | lcov-parse@1.0.0: {} 2803 | 2804 | leven@3.1.0: {} 2805 | 2806 | lines-and-columns@1.2.4: {} 2807 | 2808 | locate-path@5.0.0: 2809 | dependencies: 2810 | p-locate: 4.1.0 2811 | 2812 | lodash.memoize@4.1.2: {} 2813 | 2814 | log-driver@1.2.7: {} 2815 | 2816 | lru-cache@5.1.1: 2817 | dependencies: 2818 | yallist: 3.1.1 2819 | 2820 | make-dir@4.0.0: 2821 | dependencies: 2822 | semver: 7.6.3 2823 | 2824 | make-error@1.3.6: {} 2825 | 2826 | makeerror@1.0.12: 2827 | dependencies: 2828 | tmpl: 1.0.5 2829 | 2830 | merge-stream@2.0.0: {} 2831 | 2832 | micromatch@4.0.8: 2833 | dependencies: 2834 | braces: 3.0.3 2835 | picomatch: 2.3.1 2836 | 2837 | mime-db@1.52.0: {} 2838 | 2839 | mime-types@2.1.35: 2840 | dependencies: 2841 | mime-db: 1.52.0 2842 | 2843 | mimic-fn@2.1.0: {} 2844 | 2845 | minimatch@3.1.2: 2846 | dependencies: 2847 | brace-expansion: 1.1.11 2848 | 2849 | minimatch@5.1.6: 2850 | dependencies: 2851 | brace-expansion: 2.0.1 2852 | 2853 | minimist@1.2.8: {} 2854 | 2855 | ms@2.1.2: {} 2856 | 2857 | natural-compare@1.4.0: {} 2858 | 2859 | node-int64@0.4.0: {} 2860 | 2861 | node-notifier@8.0.2: 2862 | dependencies: 2863 | growly: 1.3.0 2864 | is-wsl: 2.2.0 2865 | semver: 7.6.3 2866 | shellwords: 0.1.1 2867 | uuid: 8.3.2 2868 | which: 2.0.2 2869 | optional: true 2870 | 2871 | node-releases@2.0.18: {} 2872 | 2873 | normalize-path@3.0.0: {} 2874 | 2875 | npm-run-path@4.0.1: 2876 | dependencies: 2877 | path-key: 3.1.1 2878 | 2879 | oauth-sign@0.9.0: {} 2880 | 2881 | once@1.4.0: 2882 | dependencies: 2883 | wrappy: 1.0.2 2884 | 2885 | onetime@5.1.2: 2886 | dependencies: 2887 | mimic-fn: 2.1.0 2888 | 2889 | p-limit@2.3.0: 2890 | dependencies: 2891 | p-try: 2.2.0 2892 | 2893 | p-limit@3.1.0: 2894 | dependencies: 2895 | yocto-queue: 0.1.0 2896 | 2897 | p-locate@4.1.0: 2898 | dependencies: 2899 | p-limit: 2.3.0 2900 | 2901 | p-try@2.2.0: {} 2902 | 2903 | parse-json@5.2.0: 2904 | dependencies: 2905 | '@babel/code-frame': 7.24.7 2906 | error-ex: 1.3.2 2907 | json-parse-even-better-errors: 2.3.1 2908 | lines-and-columns: 1.2.4 2909 | 2910 | path-exists@4.0.0: {} 2911 | 2912 | path-is-absolute@1.0.1: {} 2913 | 2914 | path-key@3.1.1: {} 2915 | 2916 | path-parse@1.0.7: {} 2917 | 2918 | performance-now@2.1.0: {} 2919 | 2920 | picocolors@1.0.1: {} 2921 | 2922 | picomatch@2.3.1: {} 2923 | 2924 | pirates@4.0.6: {} 2925 | 2926 | pkg-dir@4.2.0: 2927 | dependencies: 2928 | find-up: 4.1.0 2929 | 2930 | prettier@3.3.3: {} 2931 | 2932 | pretty-format@29.7.0: 2933 | dependencies: 2934 | '@jest/schemas': 29.6.3 2935 | ansi-styles: 5.2.0 2936 | react-is: 18.3.1 2937 | 2938 | prompts@2.4.2: 2939 | dependencies: 2940 | kleur: 3.0.3 2941 | sisteransi: 1.0.5 2942 | 2943 | psl@1.9.0: {} 2944 | 2945 | punycode@2.3.1: {} 2946 | 2947 | pure-rand@6.1.0: {} 2948 | 2949 | qs@6.5.3: {} 2950 | 2951 | react-is@18.3.1: {} 2952 | 2953 | request@2.88.2: 2954 | dependencies: 2955 | aws-sign2: 0.7.0 2956 | aws4: 1.13.1 2957 | caseless: 0.12.0 2958 | combined-stream: 1.0.8 2959 | extend: 3.0.2 2960 | forever-agent: 0.6.1 2961 | form-data: 2.3.3 2962 | har-validator: 5.1.5 2963 | http-signature: 1.2.0 2964 | is-typedarray: 1.0.0 2965 | isstream: 0.1.2 2966 | json-stringify-safe: 5.0.1 2967 | mime-types: 2.1.35 2968 | oauth-sign: 0.9.0 2969 | performance-now: 2.1.0 2970 | qs: 6.5.3 2971 | safe-buffer: 5.2.1 2972 | tough-cookie: 2.5.0 2973 | tunnel-agent: 0.6.0 2974 | uuid: 3.4.0 2975 | 2976 | require-directory@2.1.1: {} 2977 | 2978 | resolve-cwd@3.0.0: 2979 | dependencies: 2980 | resolve-from: 5.0.0 2981 | 2982 | resolve-from@5.0.0: {} 2983 | 2984 | resolve.exports@2.0.2: {} 2985 | 2986 | resolve@1.22.8: 2987 | dependencies: 2988 | is-core-module: 2.15.1 2989 | path-parse: 1.0.7 2990 | supports-preserve-symlinks-flag: 1.0.0 2991 | 2992 | safe-buffer@5.2.1: {} 2993 | 2994 | safer-buffer@2.1.2: {} 2995 | 2996 | semver@6.3.1: {} 2997 | 2998 | semver@7.6.3: {} 2999 | 3000 | shebang-command@2.0.0: 3001 | dependencies: 3002 | shebang-regex: 3.0.0 3003 | 3004 | shebang-regex@3.0.0: {} 3005 | 3006 | shellwords@0.1.1: 3007 | optional: true 3008 | 3009 | signal-exit@3.0.7: {} 3010 | 3011 | sisteransi@1.0.5: {} 3012 | 3013 | slash@3.0.0: {} 3014 | 3015 | source-map-support@0.5.13: 3016 | dependencies: 3017 | buffer-from: 1.1.2 3018 | source-map: 0.6.1 3019 | 3020 | source-map@0.6.1: {} 3021 | 3022 | sprintf-js@1.0.3: {} 3023 | 3024 | sshpk@1.18.0: 3025 | dependencies: 3026 | asn1: 0.2.6 3027 | assert-plus: 1.0.0 3028 | bcrypt-pbkdf: 1.0.2 3029 | dashdash: 1.14.1 3030 | ecc-jsbn: 0.1.2 3031 | getpass: 0.1.7 3032 | jsbn: 0.1.1 3033 | safer-buffer: 2.1.2 3034 | tweetnacl: 0.14.5 3035 | 3036 | stack-utils@2.0.6: 3037 | dependencies: 3038 | escape-string-regexp: 2.0.0 3039 | 3040 | string-length@4.0.2: 3041 | dependencies: 3042 | char-regex: 1.0.2 3043 | strip-ansi: 6.0.1 3044 | 3045 | string-width@4.2.3: 3046 | dependencies: 3047 | emoji-regex: 8.0.0 3048 | is-fullwidth-code-point: 3.0.0 3049 | strip-ansi: 6.0.1 3050 | 3051 | strip-ansi@6.0.1: 3052 | dependencies: 3053 | ansi-regex: 5.0.1 3054 | 3055 | strip-bom@4.0.0: {} 3056 | 3057 | strip-final-newline@2.0.0: {} 3058 | 3059 | strip-json-comments@3.1.1: {} 3060 | 3061 | supports-color@5.5.0: 3062 | dependencies: 3063 | has-flag: 3.0.0 3064 | 3065 | supports-color@7.2.0: 3066 | dependencies: 3067 | has-flag: 4.0.0 3068 | 3069 | supports-color@8.1.1: 3070 | dependencies: 3071 | has-flag: 4.0.0 3072 | 3073 | supports-preserve-symlinks-flag@1.0.0: {} 3074 | 3075 | test-exclude@6.0.0: 3076 | dependencies: 3077 | '@istanbuljs/schema': 0.1.3 3078 | glob: 7.2.3 3079 | minimatch: 3.1.2 3080 | 3081 | tmpl@1.0.5: {} 3082 | 3083 | to-fast-properties@2.0.0: {} 3084 | 3085 | to-regex-range@5.0.1: 3086 | dependencies: 3087 | is-number: 7.0.0 3088 | 3089 | tough-cookie@2.5.0: 3090 | dependencies: 3091 | psl: 1.9.0 3092 | punycode: 2.3.1 3093 | 3094 | ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.5.0)(node-notifier@8.0.2)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)))(typescript@5.5.4): 3095 | dependencies: 3096 | bs-logger: 0.2.6 3097 | ejs: 3.1.10 3098 | fast-json-stable-stringify: 2.1.0 3099 | jest: 29.7.0(@types/node@22.5.0)(node-notifier@8.0.2)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) 3100 | jest-util: 29.7.0 3101 | json5: 2.2.3 3102 | lodash.memoize: 4.1.2 3103 | make-error: 1.3.6 3104 | semver: 7.6.3 3105 | typescript: 5.5.4 3106 | yargs-parser: 21.1.1 3107 | optionalDependencies: 3108 | '@babel/core': 7.25.2 3109 | '@jest/transform': 29.7.0 3110 | '@jest/types': 29.6.3 3111 | babel-jest: 29.7.0(@babel/core@7.25.2) 3112 | 3113 | ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4): 3114 | dependencies: 3115 | '@cspotcode/source-map-support': 0.8.1 3116 | '@tsconfig/node10': 1.0.11 3117 | '@tsconfig/node12': 1.0.11 3118 | '@tsconfig/node14': 1.0.3 3119 | '@tsconfig/node16': 1.0.4 3120 | '@types/node': 22.5.0 3121 | acorn: 8.12.1 3122 | acorn-walk: 8.3.3 3123 | arg: 4.1.3 3124 | create-require: 1.1.1 3125 | diff: 4.0.2 3126 | make-error: 1.3.6 3127 | typescript: 5.5.4 3128 | v8-compile-cache-lib: 3.0.1 3129 | yn: 3.1.1 3130 | optional: true 3131 | 3132 | tunnel-agent@0.6.0: 3133 | dependencies: 3134 | safe-buffer: 5.2.1 3135 | 3136 | tweetnacl@0.14.5: {} 3137 | 3138 | type-detect@4.0.8: {} 3139 | 3140 | type-fest@0.21.3: {} 3141 | 3142 | typescript@5.5.4: {} 3143 | 3144 | undici-types@6.19.8: {} 3145 | 3146 | update-browserslist-db@1.1.0(browserslist@4.23.3): 3147 | dependencies: 3148 | browserslist: 4.23.3 3149 | escalade: 3.1.2 3150 | picocolors: 1.0.1 3151 | 3152 | uri-js@4.4.1: 3153 | dependencies: 3154 | punycode: 2.3.1 3155 | 3156 | uuid@3.4.0: {} 3157 | 3158 | uuid@8.3.2: 3159 | optional: true 3160 | 3161 | v8-compile-cache-lib@3.0.1: 3162 | optional: true 3163 | 3164 | v8-to-istanbul@9.3.0: 3165 | dependencies: 3166 | '@jridgewell/trace-mapping': 0.3.25 3167 | '@types/istanbul-lib-coverage': 2.0.6 3168 | convert-source-map: 2.0.0 3169 | 3170 | verror@1.10.0: 3171 | dependencies: 3172 | assert-plus: 1.0.0 3173 | core-util-is: 1.0.2 3174 | extsprintf: 1.3.0 3175 | 3176 | walker@1.0.8: 3177 | dependencies: 3178 | makeerror: 1.0.12 3179 | 3180 | which@2.0.2: 3181 | dependencies: 3182 | isexe: 2.0.0 3183 | 3184 | wrap-ansi@7.0.0: 3185 | dependencies: 3186 | ansi-styles: 4.3.0 3187 | string-width: 4.2.3 3188 | strip-ansi: 6.0.1 3189 | 3190 | wrappy@1.0.2: {} 3191 | 3192 | write-file-atomic@4.0.2: 3193 | dependencies: 3194 | imurmurhash: 0.1.4 3195 | signal-exit: 3.0.7 3196 | 3197 | y18n@5.0.8: {} 3198 | 3199 | yallist@3.1.1: {} 3200 | 3201 | yargs-parser@21.1.1: {} 3202 | 3203 | yargs@17.7.2: 3204 | dependencies: 3205 | cliui: 8.0.1 3206 | escalade: 3.1.2 3207 | get-caller-file: 2.0.5 3208 | require-directory: 2.1.1 3209 | string-width: 4.2.3 3210 | y18n: 5.0.8 3211 | yargs-parser: 21.1.1 3212 | 3213 | yn@3.1.1: 3214 | optional: true 3215 | 3216 | yocto-queue@0.1.0: {} 3217 | -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | import Ipv4ToRegion, { Ipv4ToRegionResult, Ipv4ToRegionRes } from "./ipv4"; 2 | import Ipv6ToRegion, { Ipv6ToRegionResult, Ipv6ToRegionRes } from "./ipv6"; 3 | import { isIP } from "net"; 4 | 5 | /** IP2Region 配置 */ 6 | export interface IP2RegionOpts { 7 | /** ipv4 数据库地址 */ 8 | ipv4db?: string; 9 | /** ipv6 数据库地址 */ 10 | ipv6db?: string; 11 | /** 关闭 ipv6 */ 12 | disableIpv6?: boolean; 13 | } 14 | 15 | export interface IP2RegionResult { 16 | /** 国家 */ 17 | country: string; 18 | /** 省份 */ 19 | province: string; 20 | /** 城市 */ 21 | city: string; 22 | /** ISP 供应商 */ 23 | isp: string; 24 | } 25 | 26 | export default class IP2Region { 27 | private ipv4: Ipv4ToRegion; 28 | private ipv6: Ipv6ToRegion | null = null; 29 | 30 | constructor(opts: IP2RegionOpts = {}) { 31 | this.ipv4 = new Ipv4ToRegion(opts.ipv4db); 32 | if (!opts.disableIpv6) { 33 | this.ipv6 = new Ipv6ToRegion(opts.ipv6db); 34 | this.ipv6.setIpv4Ins(this.ipv4); 35 | } 36 | } 37 | 38 | /** 39 | * 原始搜索 40 | * @param ipaddr IP 地址 41 | */ 42 | searchRaw(ipaddr: string): Ipv6ToRegionResult | Ipv4ToRegionResult | null; 43 | /** 44 | * 原始搜索 45 | * @param ipaddr IP 地址 46 | * @param parse 是否解析 47 | */ 48 | searchRaw(ipaddr: string, parse: boolean): Ipv4ToRegionRes | Ipv6ToRegionRes | null; 49 | searchRaw(ipaddr: string, parse = true) { 50 | const v = isIP(ipaddr); 51 | if (v === 6 && this.ipv6) { 52 | return this.ipv6.search(ipaddr, parse); 53 | } 54 | return this.ipv4.search(ipaddr, parse); 55 | } 56 | 57 | /** 58 | * 搜索 59 | * @param ipaddr IP 地址 60 | */ 61 | search(ipaddr: string): IP2RegionResult | null { 62 | const res = this.searchRaw(ipaddr); 63 | if (res === null) return res; 64 | return { country: res.country, province: res.province, city: res.city, isp: res.isp }; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/lib/ipv4.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import { createDebug, ipv4ToLong } from "./utils"; 4 | import { existsSync, readFileSync } from "fs"; 5 | import { resolve as pathResolve, isAbsolute } from "path"; 6 | import { isIPv4 } from "net"; 7 | 8 | const debug = createDebug("ipv4"); 9 | /** 10 | * IP 结果 11 | */ 12 | export interface Ipv4ToRegionRes { 13 | /** 城市 id */ 14 | city: number; 15 | /** 区域字符串 */ 16 | region: string; 17 | } 18 | /** 19 | * IP 解析结果 20 | */ 21 | export interface Ipv4ToRegionResult { 22 | /** 城市 id */ 23 | id: number; 24 | /** 国家 */ 25 | country: string; 26 | /** 区域 */ 27 | region: string; 28 | /** 省份 */ 29 | province: string; 30 | /** 城市 */ 31 | city: string; 32 | /** ISP 供应商 */ 33 | isp: string; 34 | } 35 | 36 | /** 37 | * IP v4 解析 38 | */ 39 | export default class Ipv4ToRegion { 40 | /** 数据库文件位置 */ 41 | private dbFilePath: string; 42 | // init basic search environment 43 | private superBlock = Buffer.allocUnsafe(8); 44 | private indexBlockLength = 12; 45 | private data: Buffer; 46 | 47 | private firstIndexPtr: number; 48 | private lastIndexPtr: number; 49 | private totalBlocks: number; 50 | 51 | constructor(dbPath?: string) { 52 | const p = dbPath || "../../data/ip2region.db"; 53 | this.dbFilePath = isAbsolute(p) ? p : pathResolve(__dirname, p); 54 | if (!existsSync(this.dbFilePath)) { 55 | throw new Error("[Ipv4ToRegion] db file not exists : " + this.dbFilePath); 56 | } 57 | 58 | this.data = readFileSync(this.dbFilePath); 59 | this.data.copy(this.superBlock, 0, 0, 8); 60 | 61 | this.firstIndexPtr = this.superBlock.readUInt32LE(0); 62 | this.lastIndexPtr = this.superBlock.readUInt32LE(4); 63 | this.totalBlocks = (this.lastIndexPtr - this.firstIndexPtr) / this.indexBlockLength + 1; 64 | 65 | debug(this.totalBlocks); 66 | } 67 | 68 | parseResult(res: Ipv4ToRegionRes | null) { 69 | if (res === null) return res; 70 | // 城市Id|国家|区域|省份|城市|ISP 71 | const data = res.region.split("|"); 72 | return { 73 | id: res.city, 74 | country: data[0] !== "0" ? data[0] : "", 75 | region: data[1] !== "0" ? data[1] : "", 76 | province: data[2] !== "0" ? data[2] : "", 77 | city: data[3] !== "0" ? data[3] : "", 78 | isp: data[4] !== "0" ? data[4] : "", 79 | }; 80 | } 81 | 82 | searchLong(ip: number): Ipv4ToRegionRes | null { 83 | let low = 0; 84 | let mid = 0; 85 | let high = this.totalBlocks; 86 | let dataPos = 0; 87 | let pos = 0; 88 | let sip = 0; 89 | let eip = 0; 90 | 91 | // binary search 92 | while (low <= high) { 93 | mid = (low + high) >> 1; 94 | pos = this.firstIndexPtr + mid * this.indexBlockLength; 95 | sip = this.data.readUInt32LE(pos); 96 | 97 | debug(" sip : " + sip + " eip : " + eip); 98 | if (ip < sip) { 99 | high = mid - 1; 100 | } else { 101 | eip = this.data.readUInt32LE(pos + 4); 102 | 103 | if (ip > eip) { 104 | low = mid + 1; 105 | } else { 106 | dataPos = this.data.readUInt32LE(pos + 8); 107 | break; 108 | } 109 | } 110 | } 111 | 112 | // read data 113 | if (dataPos === 0) return null; 114 | 115 | const dataLen = (dataPos >> 24) & 0xff; 116 | dataPos = dataPos & 0x00ffffff; 117 | const city_id = this.data.readUInt32LE(dataPos); 118 | const data = this.data.toString("utf8", dataPos + 4, dataPos + dataLen); 119 | 120 | debug(city_id); 121 | debug(data); 122 | return { city: city_id, region: data }; 123 | } 124 | 125 | search(ipaddr: string): Ipv4ToRegionResult; 126 | search(ipaddr: string, parse: boolean): Ipv4ToRegionRes; 127 | search(ipaddr: string, parse: boolean = true) { 128 | if (!isIPv4(ipaddr)) return null; 129 | const ip = ipv4ToLong(ipaddr); 130 | // first search (in header index) 131 | const ret = this.searchLong(ip); 132 | return parse ? this.parseResult(ret) : ret; 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /src/lib/ipv6.ts: -------------------------------------------------------------------------------- 1 | import { createDebug, ipv6ToLong } from "./utils"; 2 | import { existsSync, readFileSync } from "fs"; 3 | import { resolve as pathResolve, isAbsolute } from "path"; 4 | import { isIPv6 } from "net"; 5 | import Ipv4ToRegion, { Ipv4ToRegionRes, Ipv4ToRegionResult } from "./ipv4"; 6 | 7 | const debug = createDebug("ipv6"); 8 | 9 | /** 10 | * IP 结果 11 | */ 12 | export interface Ipv6ToRegionRes { 13 | /** 区域字符串 */ 14 | cArea: string; 15 | /** 运营商 */ 16 | aArea: string; 17 | } 18 | 19 | /** 20 | * IP 解析结果 21 | */ 22 | export interface Ipv6ToRegionResult { 23 | /** 国家 */ 24 | country: string; 25 | /** 省份 */ 26 | province: string; 27 | /** 城市 */ 28 | city: string; 29 | /** ISP 供应商 */ 30 | isp: string; 31 | /** 原始数据 */ 32 | data: string; 33 | } 34 | 35 | export default class Ipv6ToRegion { 36 | /** 数据库文件位置 */ 37 | private dbFilePath: string; 38 | private data: Buffer; 39 | 40 | private name: string; 41 | private offlen: number; 42 | //private iplen: number; 43 | //private v: number; 44 | private record: number; 45 | private indexStart: number; 46 | //private versionStart: number; 47 | private ipv4?: Ipv4ToRegion; 48 | 49 | constructor(dbPath?: string) { 50 | const p = dbPath || "../../data/ipv6wry.db"; 51 | this.dbFilePath = isAbsolute(p) ? p : pathResolve(__dirname, p); 52 | if (!existsSync(this.dbFilePath)) { 53 | throw new Error("[Ipv6ToRegion] db file not exists : " + this.dbFilePath); 54 | } 55 | this.data = readFileSync(this.dbFilePath); 56 | this.name = this.data.toString("utf-8", 0, 4); 57 | if (this.name !== "IPDB") { 58 | throw new Error("[Ipv6ToRegion] db file error"); 59 | } 60 | this.offlen = this.data.readInt8(6); 61 | //this.iplen = this.data.readInt8(7); 62 | //this.v = this.data.readInt8(4); 63 | this.record = Number(this.data.readBigInt64LE(8)); 64 | this.indexStart = Number(this.data.readBigInt64LE(16)); 65 | //this.versionStart = Number(this.data.readBigInt64LE(32)); 66 | } 67 | 68 | setIpv4Ins(ins: Ipv4ToRegion) { 69 | this.ipv4 = ins; 70 | } 71 | 72 | private searchIpv4(ip: bigint) { 73 | if (!this.ipv4) { 74 | return { cArea: "未知", aArea: "未知" }; 75 | } 76 | debug("searchIpv4", Number(ip)); 77 | return this.ipv4.searchLong(Number(ip)); 78 | } 79 | 80 | /** 81 | * 读取 Long 数据 82 | * @param offset 偏移量 83 | */ 84 | private readLongData(offset: number) { 85 | return this.data.readIntLE(offset, this.offlen); 86 | } 87 | 88 | /** 89 | * 使用二分法查找网络字节编码的IP地址的索引记录 90 | * @param ip IP地址 91 | * @param l 左边界 92 | * @param r 右边界 93 | */ 94 | private find(ip: bigint, l: number, r: number): number { 95 | if (r - l <= 1) { 96 | return l; 97 | } 98 | const m = (l + r) >> 1; 99 | const o = this.indexStart + m * (8 + this.offlen); 100 | const new_ip = this.data.readBigUInt64LE(o); 101 | // debug(new_ip); 102 | if (ip < new_ip) { 103 | return this.find(ip, l, m); 104 | } else { 105 | return this.find(ip, m, r); 106 | } 107 | } 108 | /** 109 | * 读取字符串信息 110 | * @param offset 偏移量 111 | */ 112 | private getString(offset = 0) { 113 | // 读取字符串信息,包括"国家"信息和"地区"信息,QQWry.Dat的记录区每条信息都是一个以"\0"结尾的字符串 114 | const o2 = this.data.indexOf("\0", offset); 115 | // 有可能只有国家信息没有地区信息, 116 | return this.data.toString("utf-8", offset, o2); 117 | } 118 | 119 | /** 120 | * 读取区域信息字符串 121 | * @param offset 偏移量 122 | */ 123 | private getAreaAddr(offset = 0): string { 124 | const byte = this.data.readInt8(offset); 125 | if (byte == 1 || byte == 2) { 126 | // 第一个字节为 1 或者 2 时,取得 2-4 字节作为一个偏移量调用自己 127 | const p = this.readLongData(offset + 1); 128 | return this.getAreaAddr(p); 129 | } else { 130 | return this.getString(offset); 131 | } 132 | } 133 | 134 | /** 135 | * 获取地址信息 136 | * @param offset 偏移量 137 | */ 138 | private getAddr(offset: number): Ipv6ToRegionRes { 139 | let o = offset; 140 | const byte = this.data.readInt8(o); 141 | debug(byte); 142 | if (byte === 1) { 143 | // 重定向模式 1 :[IP][0x01][国家和地区信息的绝对偏移地址],使用接下来的3字节作为偏移量调用字节取得信息 144 | return this.getAddr(this.readLongData(o + 1)); 145 | } else { 146 | // 重定向模式 2 + 正常模式:[IP][0x02][信息的绝对偏移][...] 147 | const cArea = this.getAreaAddr(o); 148 | debug(cArea); 149 | if (byte == 2) { 150 | o += 1 + this.offlen; 151 | } else { 152 | o = this.data.indexOf("\0", o) + 1; 153 | } 154 | const aArea = this.getAreaAddr(o); 155 | debug(aArea); 156 | return { cArea: cArea.replace(/\s/g, ""), aArea }; 157 | } 158 | } 159 | 160 | private parseResult(ret: Ipv4ToRegionRes | Ipv6ToRegionRes | null): Ipv4ToRegionResult | Ipv6ToRegionResult | null { 161 | if (ret === null) return ret; 162 | if ("city" in ret) { 163 | return this.ipv4 ? this.ipv4.parseResult(ret) : null; 164 | } 165 | let country = ""; 166 | let province = ""; 167 | let city = ""; 168 | let first = ret.cArea.indexOf("国"); 169 | if (first === 1) { 170 | first += 1; 171 | country = ret.cArea.slice(0, first); 172 | } else { 173 | first = 0; 174 | } 175 | let isCity = false; 176 | let second = ret.cArea.indexOf("省"); 177 | if (second >= 0) { 178 | second += 1; 179 | province = ret.cArea.slice(first, second); 180 | } else { 181 | // TODO: 重构省份处理程序 182 | const provinceArr = ["内蒙古", "广西", "西藏", "宁夏", "新疆"]; 183 | const goverCity = ["北京市", "天津市", "上海市", "重庆市"]; 184 | for (let gover of goverCity) { 185 | second = ret.cArea.indexOf(gover); 186 | if (second >= 0) { 187 | second = second + gover.length; 188 | province = ret.cArea.slice(first, second); 189 | isCity = true; 190 | break; 191 | } 192 | } 193 | if (isCity != true) { 194 | for (let p of provinceArr) { 195 | second = ret.cArea.indexOf(p); 196 | if (second >= 0) { 197 | second = second + p.length; 198 | province = ret.cArea.slice(first, second); 199 | break; 200 | } 201 | } 202 | } 203 | } 204 | if (isCity != true) { 205 | const city1 = ret.cArea.indexOf("市"); 206 | const city2 = ret.cArea.indexOf("州"); 207 | // console.log("second",ret,second, city1, city2) 208 | if (city1 >= 0 && city2 >= 0 && city1 < city2 && second < city1) { 209 | city = ret.cArea.slice(second, city1 + 1); 210 | } else if (city1 >= 0 && city2 >= 0 && city1 > city2 && second < city2) { 211 | if (city1 - city2 == 1) { 212 | city = ret.cArea.slice(second, city2 + 2); 213 | } else { 214 | city = ret.cArea.slice(second, city2 + 1); 215 | } 216 | } else if (city1 >= 0 && second < city1) { 217 | city = ret.cArea.slice(second, city1 + 1); 218 | } else if (city2 >= 0 && second < city2) { 219 | city = ret.cArea.slice(second, city2 + 1); 220 | } 221 | } 222 | province = province.trim(); 223 | city = city.trim(); 224 | return { isp: ret.aArea, data: ret.cArea, country, province, city }; 225 | } 226 | 227 | private getIpAddrLong(ip: bigint) { 228 | // 查找ip的索引偏移 229 | const idx = this.find(ip, 0, this.record); 230 | debug(idx); 231 | // 得到索引记录 232 | const ipOff = this.indexStart + idx * (8 + this.offlen); 233 | const ipRecOff = this.readLongData(ipOff + 8); 234 | debug({ ipOff, ipRecOff }); 235 | return this.getAddr(ipRecOff); 236 | } 237 | 238 | searchLong(ip6: bigint) { 239 | // 本机地址 240 | if (ip6 === 0x1n) { 241 | return { cArea: "IANA保留地址", aArea: "本机地址" }; 242 | } 243 | const ip = (ip6 >> 64n) & 0xffffffffffffffffn; 244 | debug("ip", ip); 245 | // IPv4映射地址 246 | if (ip == 0n) { 247 | debug("IPv4映射地址"); 248 | const realip = ip6 & 0xffffffffn; 249 | return this.searchIpv4(realip); 250 | } 251 | // 6to4 252 | if (((ip >> 48n) & 0xffffn) === 0x2002n) { 253 | debug("6to4"); 254 | const realip = (ip & 0x0000ffffffff0000n) >> 16n; 255 | return this.searchIpv4(realip); 256 | } 257 | // teredo 258 | if (((ip >> 32n) & 0xffffffffn) == 0x20010000n) { 259 | debug("teredo"); 260 | // const serverip = (ip & 0xFFFFFFFFn); 261 | const realip = ~ip6 & 0xffffffffn; 262 | return this.searchIpv4(realip); 263 | } 264 | // isatap 265 | if (((ip6 >> 32n) & 0xffffn) == 0x5efen) { 266 | debug("isatap"); 267 | const realip = ip6 & 0xffffffffn; 268 | return this.searchIpv4(realip); 269 | } 270 | debug("IPv6"); 271 | return this.getIpAddrLong(ip); 272 | } 273 | 274 | search(ipaddr: string, parse = true) { 275 | // 把IP地址转成数字 276 | const { ip, num } = ipv6ToLong(ipaddr); 277 | if (!isIPv6(ip)) return null; 278 | debug({ ipaddr, ip, num }); 279 | const ret = this.searchLong(num); 280 | debug(ret); 281 | return parse ? this.parseResult(ret) : ret; 282 | } 283 | } 284 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 创建 debug 3 | */ 4 | export function createDebug(name?: string) { 5 | if (process.env.NODE_ENV === "dev") return require("debug")(`ip2region:${name}:`); 6 | return () => {}; 7 | } 8 | 9 | // for ip2long 10 | const ipbase = [16777216, 65536, 256, 1]; 11 | /** 12 | * Convert ip to long (xxx.xxx.xxx.xxx to a integer) 13 | * 14 | * @param {string} ip IP Address 15 | * @returns {number} long value 16 | */ 17 | export function ipv4ToLong(ip: string) { 18 | let val = 0; 19 | ip.split(".").forEach((ele, i) => { 20 | val += ipbase[i] * parseInt(ele, 10); 21 | }); 22 | return val; 23 | } 24 | 25 | export function ipv6ToLong(ip: string) { 26 | let num = BigInt(0); 27 | let exp = BigInt(0); 28 | 29 | // 处理 IPv4 混合地址 30 | if (ip.includes(".")) { 31 | ip = ip 32 | .split(":") 33 | .map((part) => { 34 | if (part.includes(".")) { 35 | const digits = part.split(".").map((str) => Number(str).toString(16).padStart(2, "0")); 36 | return `${digits[0]}${digits[1]}:${digits[2]}${digits[3]}`; 37 | } else { 38 | return part; 39 | } 40 | }) 41 | .join(":"); 42 | } 43 | 44 | const parts = ip.split(":"); 45 | const index = parts.indexOf(""); 46 | 47 | if (index !== -1) { 48 | while (parts.length < 8) { 49 | parts.splice(index, 0, ""); 50 | } 51 | } 52 | const p = parts 53 | .map((part) => (part ? `0x${part}` : `0`)) 54 | .map(Number) 55 | .reverse(); 56 | for (const n of p) { 57 | num += BigInt(n) * BigInt(2) ** BigInt(exp); 58 | exp += BigInt(16); 59 | } 60 | 61 | return { ip, num }; 62 | } 63 | -------------------------------------------------------------------------------- /src/test/test_ipv4.ts: -------------------------------------------------------------------------------- 1 | import Ipv4ToRegion from "../lib/ipv4"; 2 | 3 | const queryInMemoey = new Ipv4ToRegion(); 4 | 5 | const ALIYUN_IP = "120.24.78.68"; 6 | const ALIYUN = Object.freeze({ city: 2163, region: "中国|0|广东省|深圳市|阿里云" }); 7 | const ALIYUN2 = Object.freeze({ 8 | id: 2163, 9 | country: "中国", 10 | region: "", 11 | province: "广东省", 12 | city: "深圳市", 13 | isp: "阿里云", 14 | }); 15 | const NEIWAN_IP = "10.10.10.10"; 16 | const IPV6 = "2409:8946:2d51:1569:dfdb:6dcf:dd39:5d9a"; 17 | const NEIWAN = Object.freeze({ city: 0, region: "0|0|0|内网IP|内网IP" }); 18 | const NEIWAN2 = Object.freeze({ id: 0, country: "", region: "", province: "", city: "内网IP", isp: "内网IP" }); 19 | 20 | describe("search", function () { 21 | it("Found", function () { 22 | const res = queryInMemoey.search(ALIYUN_IP); 23 | expect(res).toMatchObject(ALIYUN2); 24 | }); 25 | 26 | it("Not Found", function () { 27 | const res = queryInMemoey.search(NEIWAN_IP); 28 | expect(res).toMatchObject(NEIWAN2); 29 | }); 30 | 31 | it("Not Found ipv6", function () { 32 | const res = queryInMemoey.search(IPV6); 33 | expect(res).toBeNull(); 34 | }); 35 | 36 | it("without Parse - Found", function () { 37 | const res = queryInMemoey.search(ALIYUN_IP, false); 38 | expect(res).toMatchObject(ALIYUN); 39 | }); 40 | 41 | it("without Parse - Not Found", function () { 42 | const res = queryInMemoey.search(NEIWAN_IP, false); 43 | expect(res).toMatchObject(NEIWAN); 44 | }); 45 | }); 46 | 47 | describe("More Tests", function () { 48 | it("Search Test", function () { 49 | queryInMemoey.searchLong(-1); 50 | queryInMemoey.searchLong(0); 51 | queryInMemoey.searchLong(1747920896); 52 | queryInMemoey.searchLong(3220758528); 53 | queryInMemoey.search(""); 54 | queryInMemoey.search("aa"); 55 | }); 56 | 57 | it("Error - init with db file", function () { 58 | const error = () => new Ipv4ToRegion("/tmp/db.db"); 59 | expect(error).toThrow("[Ipv4ToRegion] db file not exists : /tmp/db.db"); 60 | }); 61 | }); 62 | 63 | describe("BugFix - 1", function () { 64 | const ip = "218.70.78.68"; 65 | const ret = Object.freeze({ city: 2430, region: "中国|0|重庆|重庆市|电信" }); 66 | 67 | it("search", function () { 68 | expect(queryInMemoey.search(ip, false)).toMatchObject(ret); 69 | }); 70 | }); 71 | -------------------------------------------------------------------------------- /src/test/test_ipv6.ts: -------------------------------------------------------------------------------- 1 | import Ipv6ToRegion from "../lib/ipv6"; 2 | import Ipv4ToRegion from "../lib/ipv4"; 3 | 4 | const v4 = new Ipv4ToRegion(); 5 | const queryInMemoey = new Ipv6ToRegion(); 6 | queryInMemoey.setIpv4Ins(v4); 7 | 8 | const IP1 = "240e:47d:c20:1627:30a3:ba0d:a5e6:ec19"; 9 | const RET1 = Object.freeze({ 10 | city: "广州市", 11 | country: "中国", 12 | data: "中国广东省广州市番禺区", 13 | isp: "中国电信CTNET网络", 14 | province: "广东省", 15 | }); 16 | const NEIWAN_IP = "0:0:0:0:0:0:0:1"; 17 | const NEIWAN2 = Object.freeze({ city: "", country: "", data: "IANA保留地址", isp: "本机地址", province: "" }); 18 | const IP4on6 = "0000:0000:0000:0000:0000:0000:135.75.43.52"; 19 | const IP4on6_RET = Object.freeze({ city: 166, region: "美国|0|0|0|美国电话电报" }); 20 | const IP6to4 = "2002:0C9B:A665:0001:0000:0000:0C9B:A665"; 21 | const IP6to4_RET = Object.freeze({ city: 0, region: "美国|0|加利福尼亚|0|美国电话电报" }); 22 | const IPTeredo = "2001:0000:A665:0001:0000:0000:874b:2b34"; 23 | const IPTeredo_RET = Object.freeze({ city: 0, region: "印度尼西亚|0|大雅加达|雅加达|Indosat" }); 24 | const IPISATAP = "fe80::200:5efe:874b:2b34"; 25 | const IPISATAP_RET = Object.freeze({ city: 166, region: "美国|0|0|0|美国电话电报" }); 26 | const IP2 = "2406:840::1"; 27 | const RET2 = Object.freeze({ isp: "ZX Network Anycast网段", data: "全球", city: "", country: "", province: "" }); 28 | const ALIYUN = "2400:3200::1"; 29 | const ALIYUN_RET = Object.freeze({ 30 | city: "杭州市", 31 | country: "中国", 32 | data: "中国浙江省杭州市", 33 | isp: "阿里云计算有限公司", 34 | province: "浙江省", 35 | }); 36 | const UNKOOW = Object.freeze({ city: "", country: "", data: "未知", isp: "未知", province: "" }); 37 | 38 | describe("search", function () { 39 | it("Found", function () { 40 | const res = queryInMemoey.search(IP1); 41 | expect(res).toMatchObject(RET1); 42 | }); 43 | 44 | it("Not Found", function () { 45 | const res = queryInMemoey.search(NEIWAN_IP); 46 | expect(res).toMatchObject(NEIWAN2); 47 | }); 48 | 49 | it("Found - 4on6", function () { 50 | const res = queryInMemoey.search(IP4on6, false); 51 | expect(res).toMatchObject(IP4on6_RET); 52 | }); 53 | 54 | it("Found - 6to4", function () { 55 | const res = queryInMemoey.search(IP6to4, false); 56 | expect(res).toMatchObject(IP6to4_RET); 57 | }); 58 | 59 | it("Found - Teredo", function () { 60 | const res = queryInMemoey.search(IPTeredo, false); 61 | expect(res).toMatchObject(IPTeredo_RET); 62 | }); 63 | 64 | it("Found - ISATAP", function () { 65 | const res = queryInMemoey.search(IPISATAP, false); 66 | expect(res).toMatchObject(IPISATAP_RET); 67 | }); 68 | 69 | it("Found - ALIYUN", function () { 70 | const res = queryInMemoey.search(ALIYUN); 71 | expect(res).toMatchObject(ALIYUN_RET); 72 | }); 73 | 74 | it("Found", function () { 75 | const res = queryInMemoey.search(IP2); 76 | expect(res).toMatchObject(RET2); 77 | }); 78 | }); 79 | 80 | describe("More Tests", function () { 81 | it("Search Test", function () { 82 | queryInMemoey.search(""); 83 | queryInMemoey.search("aa"); 84 | }); 85 | 86 | it("No ipv4", function () { 87 | const ins = new Ipv6ToRegion(); 88 | expect(ins.search(IP4on6)).toMatchObject(UNKOOW); 89 | }); 90 | 91 | it("Error - init with db file", function () { 92 | const error = () => new Ipv6ToRegion("/tmp/db.db"); 93 | expect(error).toThrow("[Ipv6ToRegion] db file not exists : /tmp/db.db"); 94 | }); 95 | 96 | it("Error - db file error", function () { 97 | const error = () => new Ipv6ToRegion("ipv4.ts"); 98 | expect(error).toThrow("[Ipv6ToRegion] db file error"); 99 | }); 100 | }); 101 | 102 | describe("Parse Tests", function () { 103 | it("parse gover", function () { 104 | const ret = (queryInMemoey as any).parseResult({ cArea: "中国北京市", aArea: "" }); 105 | expect(ret).toMatchObject({ isp: "", data: "中国北京市", country: "中国", province: "北京市", city: "" }); 106 | }); 107 | 108 | it("parse province", function () { 109 | const ret = (queryInMemoey as any).parseResult({ cArea: "中国宁夏中卫市沙坡头区", aArea: "" }); 110 | expect(ret).toMatchObject({ 111 | isp: "", 112 | data: "中国宁夏中卫市沙坡头区", 113 | country: "中国", 114 | province: "宁夏", 115 | city: "中卫市", 116 | }); 117 | }); 118 | 119 | it("parse city ", function () { 120 | const ret = (queryInMemoey as any).parseResult({ cArea: "中国湖北省恩施土家族苗族自治州恩施市", aArea: "" }); 121 | expect(ret).toMatchObject({ 122 | isp: "", 123 | data: "中国湖北省恩施土家族苗族自治州恩施市", 124 | country: "中国", 125 | province: "湖北省", 126 | city: "恩施土家族苗族自治州", 127 | }); 128 | }); 129 | }); 130 | -------------------------------------------------------------------------------- /src/test/test_lib.ts: -------------------------------------------------------------------------------- 1 | import IP2Region from "../lib"; 2 | 3 | const queryInMemoey = new IP2Region(); 4 | 5 | const ALIYUN_IP = "120.24.78.68"; 6 | const ALIYUN = Object.freeze({ city: 2163, region: "中国|0|广东省|深圳市|阿里云" }); 7 | const ALIYUN2 = Object.freeze({ country: "中国", province: "广东省", city: "深圳市", isp: "阿里云" }); 8 | const DX_IP = "240e:47d:c20:1627:30a3:ba0d:a5e6:ec19"; 9 | const DX = Object.freeze({ cArea: "中国广东省广州市番禺区", aArea: "中国电信CTNET网络" }); 10 | const DX2 = Object.freeze({ country: "中国", province: "广东省", city: "广州市", isp: "中国电信CTNET网络" }); 11 | const IP4on6 = "0000:0000:0000:0000:0000:0000:135.75.43.52"; 12 | const IP4on6_RET = Object.freeze({ city: 166, region: "美国|0|0|0|美国电话电报" }); 13 | 14 | describe("ipv4", function () { 15 | it("Found", function () { 16 | const res = queryInMemoey.search(ALIYUN_IP); 17 | expect(res).toMatchObject(ALIYUN2); 18 | }); 19 | 20 | it("without Parse - Found", function () { 21 | const res = queryInMemoey.searchRaw(ALIYUN_IP, false); 22 | expect(res).toMatchObject(ALIYUN); 23 | }); 24 | 25 | it("Error - init with db file", function () { 26 | const error = () => new IP2Region({ ipv4db: "/tmp/db.db" }); 27 | expect(error).toThrow("[Ipv4ToRegion] db file not exists : /tmp/db.db"); 28 | }); 29 | }); 30 | 31 | describe("ipv6", function () { 32 | it("Found", function () { 33 | const res = queryInMemoey.search(DX_IP); 34 | expect(res).toMatchObject(DX2); 35 | }); 36 | 37 | it("without Parse - Found", function () { 38 | const res = queryInMemoey.searchRaw(DX_IP, false); 39 | expect(res).toMatchObject(DX); 40 | }); 41 | 42 | it("without Parse - Found IP4on6", function () { 43 | const res = queryInMemoey.searchRaw(IP4on6, false); 44 | expect(res).toMatchObject(IP4on6_RET); 45 | }); 46 | 47 | it("Error - init with db file", function () { 48 | const error = () => new IP2Region({ ipv6db: "/tmp/db.db" }); 49 | expect(error).toThrow("[Ipv6ToRegion] db file not exists : /tmp/db.db"); 50 | }); 51 | }); 52 | 53 | describe("More Tests", function () { 54 | it("disableIpv6", function () { 55 | const ins = new IP2Region({ disableIpv6: true }); 56 | expect(ins.search(DX_IP)).toBeNull(); 57 | expect(ins.search(ALIYUN_IP)).toMatchObject(ALIYUN2); 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "rootDir": "src", 4 | "outDir": "dist", 5 | "module": "commonjs", 6 | "moduleResolution": "node", 7 | "declaration": true, 8 | "strict": true, 9 | "target": "esnext", 10 | "esModuleInterop": true, 11 | "sourceMap": true, 12 | "allowUnusedLabels": false, 13 | "noUnusedLocals": true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /update_db.sh: -------------------------------------------------------------------------------- 1 | #/bin/sh 2 | 3 | set -e 4 | 5 | V4_IP_DB='https://raw.githubusercontent.com/lionsoul2014/ip2region/master/data/ip2region.db' 6 | ZXINC_IP_7Z='http://ip.zxinc.org/ip.7z' 7 | TMP_DIR='/tmp' 8 | 9 | # 更新 ipv4 库 10 | curl $V4_IP_DB > "${TMP_DIR}/ip2region.db" 11 | mv "${TMP_DIR}/ip2region.db" "data/ip2region.db" 12 | rm -f "${TMP_DIR}/ip2region.db" 13 | 14 | # 更新 ipv6 库 15 | rm -f "${TMP_DIR}/ip.7z" 16 | wget ${ZXINC_IP_7Z} -P "${TMP_DIR}" 17 | 7z x "${TMP_DIR}/ip.7z" -y -o"${TMP_DIR}/ip" 18 | cp ${TMP_DIR}/ip/ipv6wry.db ./data/ 19 | rm -f "${TMP_DIR}/ip.7z" 20 | rm -rf "${TMP_DIR}/ip" 21 | 22 | # 测试 23 | npm test 24 | --------------------------------------------------------------------------------