ICS React Native App
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Initial

ICSMobileApp b464b660

+2975
+48
Assignment.md
··· 1 + **React Native Developer Assessment** 2 + 3 + **Introduction** 4 + The purpose of this assignment is to evaluate your familiarity with React Native, mobile development best practices, and to showcase your approach to clean, reusable, and maintainable code. This will also help us understand your sense of design and user experience for mobile applications. 5 + 6 + **Requirement** 7 + Create a simple mobile banking application. 8 + You can use the provided BankingMockAPI (see README for API details and setup instructions) as a source of data for your application. The app should allow a user to: 9 + 10 + 1. **Authenticate** (login) using credentials. 11 + 2. **View a list of their bank accounts** (e.g., checking, savings, etc.). 12 + 3. **View transactions** related to each account (display a list of transactions for a selected account). It should include ability to: 13 + - search 14 + - sort 15 + - paginate between transactions 16 + 17 + 4. **View a list of their bank cards** (optional). 18 + 19 + You are free to design the UI as you see fit, but the app should have at least the following screens: 20 + - Login screen 21 + - Accounts overview screen 22 + - Account details/transactions screen 23 + 24 + **Architecture** 25 + There are no strict requirements for architecture. Please design your application as you see fit, but focus on: 26 + - Clean, modular, and reusable code 27 + - Mobile development best practices 28 + - State management (your choice: Context, Redux, Redux-Toolkit etc.) 29 + - Clear separation of concerns 30 + 31 + **Notes** 32 + - The main technology for this assessment is **React Native**. You may use Expo or bare React Native CLI. 33 + - Use TypeScript for type safety. 34 + - The application should provide a good user experience on both iOS and Android. 35 + - Please include a **README** file that explains your architectural decisions (e.g., why you chose a specific state management solution), instructions on how to run your solution, and details about the NodeJS and NPM/Yarn versions used. 36 + - Please include **unit tests** for at least some key components/hooks/screens. 37 + - Ensure the application runs without errors before submitting. 38 + - The UI should be simple, intuitive, and visually appealing. 39 + 40 + **Bonus Points** 41 + - Refresh token before it expires to keep the user logged in 42 + - Add pull-to-refresh or loading indicators where appropriate 43 + - Add "infinite" scroll for transactions 44 + - Add basic input validation and error handling for authentication. 45 + - e2e tests 46 + - Accessibility (voiceover, keyboard navigation, etc.) 47 + - Setup CI/CD 48 + - Feel free to add extra features or polish to demonstrate your skills
+9
Dockerfile
··· 1 + FROM node:18 2 + WORKDIR /usr/src/app 3 + COPY package*.json ./ 4 + RUN npm install 5 + COPY . . 6 + RUN mkdir -p /usr/src/app/data && chmod 777 /usr/src/app/data 7 + USER node 8 + EXPOSE 3001 9 + CMD ["node", "server.js"]
+155
README.md
··· 1 + # BankingMockAPI 2 + 3 + ## Getting Started 4 + 5 + ### Prerequisites 6 + - [Node.js](https://nodejs.org/) (v18 or higher) 7 + - [Docker](https://www.docker.com/) (optional, for containerized setup) 8 + 9 + ### Installation 10 + 11 + 1. Clone the repository: 12 + ```bash 13 + git clone <repo-url> 14 + cd BankingMockAPI 15 + ``` 16 + 2. Install dependencies: 17 + ```bash 18 + npm install 19 + ``` 20 + 21 + ### Running the Server 22 + 23 + #### With Node.js 24 + ```bash 25 + node server.js 26 + ``` 27 + The server will start on [http://localhost:3001](http://localhost:3001) by default. 28 + 29 + #### With Docker 30 + ```bash 31 + docker build -t banking-mock-api . 32 + docker run --name banking-mock-api -d -p 3001:3001 banking-mock-api 33 + ``` 34 + 35 + Same as mentioned aboe the api will be available at on [http://localhost:3001](http://localhost:3001) 36 + 37 + Use following commands to stop or start the container: 38 + ```bash 39 + docker container stop banking-mock-api 40 + docker container start banking-mock-api 41 + ``` 42 + 43 + 44 + ## API Endpoints 45 + 46 + ### Authentication 47 + 48 + #### `POST /login` 49 + Authenticate user and receive JWT and refresh token. 50 + - **Body:** 51 + ```json 52 + { 53 + "username": "test@test.test", 54 + "password": "password@123" 55 + } 56 + ``` 57 + - **Response:** 58 + ```json 59 + { 60 + "token": "<JWT>", 61 + "refreshToken": "<refresh_token>" 62 + } 63 + ``` 64 + 65 + #### `POST /refresh-token` 66 + Get a new JWT using a refresh token. 67 + - **Body:** 68 + ```json 69 + { 70 + "refreshToken": "<refresh_token>" 71 + } 72 + ``` 73 + - **Response:** 74 + ```json 75 + { 76 + "token": "<new_JWT>", 77 + "refreshToken": "<new_refresh_token>" 78 + } 79 + ``` 80 + 81 + 82 + ### Accounts 83 + 84 + #### `GET /accounts` 85 + Get all accounts for the authenticated user. 86 + - **Headers:** 87 + - `Authorization: Bearer <JWT>` 88 + - **Response:** 89 + ```json 90 + [ 91 + { 92 + "id": 1, 93 + "user_id": 1, 94 + "name": "Checking", 95 + "balance": 1500.5 96 + }, 97 + ... 98 + ] 99 + ``` 100 + 101 + ### Cards 102 + 103 + #### `GET /cards` 104 + Get all cards for the authenticated user. 105 + - **Headers:** 106 + - `Authorization: Bearer <JWT>` 107 + - **Response:** 108 + ```json 109 + [ 110 + { 111 + "id": 1, 112 + "user_id": 1, 113 + "number": "4111111111111111", 114 + "expiry": "12/26", 115 + "cvv": "123" 116 + }, 117 + ... 118 + ] 119 + ``` 120 + 121 + ### Transactions 122 + 123 + #### `GET /transactions` 124 + Get transactions for the authenticated user, with search, sort, and pagination. 125 + - **Headers:** 126 + - `Authorization: Bearer <JWT>` 127 + - **Query Parameters:** 128 + - `search` (optional): Search by description or type 129 + - `sort` (optional): Field to sort by (default: `date`) 130 + - `order` (optional): `asc` or `desc` (default: `desc`) 131 + - `page` (optional): Page number (default: `1`) 132 + - `limit` (optional): Items per page (default: `10`) 133 + - **Response:** 134 + ```json 135 + [ 136 + { 137 + "id": 1, 138 + "user_id": 1, 139 + "account_id": 1, 140 + "amount": -50.25, 141 + "type": "debit", 142 + "description": "Grocery Store", 143 + "date": "2024-06-01T10:00:00Z" 144 + }, 145 + ... 146 + ] 147 + ``` 148 + 149 + ## Default Test User 150 + - **Username:** `test@test.test` 151 + - **Password:** `password@123` 152 + 153 + ## Database 154 + - The SQLite database is used. 155 + - The database is reset and seeded with test data every time the server starts.
data/.DS_Store

This is a binary file and will not be displayed.

+2460
package-lock.json
··· 1 + { 2 + "name": "bankingmockapi", 3 + "version": "1.0.0", 4 + "lockfileVersion": 3, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "bankingmockapi", 9 + "version": "1.0.0", 10 + "license": "ISC", 11 + "dependencies": { 12 + "bcryptjs": "^2.4.3", 13 + "body-parser": "^1.20.2", 14 + "cors": "^2.8.5", 15 + "express": "^4.21.2", 16 + "jsonwebtoken": "^9.0.2", 17 + "sqlite3": "^5.1.6" 18 + } 19 + }, 20 + "node_modules/@gar/promisify": { 21 + "version": "1.1.3", 22 + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", 23 + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", 24 + "license": "MIT", 25 + "optional": true 26 + }, 27 + "node_modules/@npmcli/fs": { 28 + "version": "1.1.1", 29 + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", 30 + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", 31 + "license": "ISC", 32 + "optional": true, 33 + "dependencies": { 34 + "@gar/promisify": "^1.0.1", 35 + "semver": "^7.3.5" 36 + } 37 + }, 38 + "node_modules/@npmcli/move-file": { 39 + "version": "1.1.2", 40 + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", 41 + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", 42 + "deprecated": "This functionality has been moved to @npmcli/fs", 43 + "license": "MIT", 44 + "optional": true, 45 + "dependencies": { 46 + "mkdirp": "^1.0.4", 47 + "rimraf": "^3.0.2" 48 + }, 49 + "engines": { 50 + "node": ">=10" 51 + } 52 + }, 53 + "node_modules/@tootallnate/once": { 54 + "version": "1.1.2", 55 + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 56 + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 57 + "license": "MIT", 58 + "optional": true, 59 + "engines": { 60 + "node": ">= 6" 61 + } 62 + }, 63 + "node_modules/abbrev": { 64 + "version": "1.1.1", 65 + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 66 + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 67 + "license": "ISC", 68 + "optional": true 69 + }, 70 + "node_modules/accepts": { 71 + "version": "1.3.8", 72 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 73 + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 74 + "license": "MIT", 75 + "dependencies": { 76 + "mime-types": "~2.1.34", 77 + "negotiator": "0.6.3" 78 + }, 79 + "engines": { 80 + "node": ">= 0.6" 81 + } 82 + }, 83 + "node_modules/agent-base": { 84 + "version": "6.0.2", 85 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 86 + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 87 + "license": "MIT", 88 + "optional": true, 89 + "dependencies": { 90 + "debug": "4" 91 + }, 92 + "engines": { 93 + "node": ">= 6.0.0" 94 + } 95 + }, 96 + "node_modules/agent-base/node_modules/debug": { 97 + "version": "4.4.1", 98 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 99 + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 100 + "license": "MIT", 101 + "optional": true, 102 + "dependencies": { 103 + "ms": "^2.1.3" 104 + }, 105 + "engines": { 106 + "node": ">=6.0" 107 + }, 108 + "peerDependenciesMeta": { 109 + "supports-color": { 110 + "optional": true 111 + } 112 + } 113 + }, 114 + "node_modules/agent-base/node_modules/ms": { 115 + "version": "2.1.3", 116 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 117 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 118 + "license": "MIT", 119 + "optional": true 120 + }, 121 + "node_modules/agentkeepalive": { 122 + "version": "4.6.0", 123 + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", 124 + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", 125 + "license": "MIT", 126 + "optional": true, 127 + "dependencies": { 128 + "humanize-ms": "^1.2.1" 129 + }, 130 + "engines": { 131 + "node": ">= 8.0.0" 132 + } 133 + }, 134 + "node_modules/aggregate-error": { 135 + "version": "3.1.0", 136 + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 137 + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 138 + "license": "MIT", 139 + "optional": true, 140 + "dependencies": { 141 + "clean-stack": "^2.0.0", 142 + "indent-string": "^4.0.0" 143 + }, 144 + "engines": { 145 + "node": ">=8" 146 + } 147 + }, 148 + "node_modules/ansi-regex": { 149 + "version": "5.0.1", 150 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 151 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 152 + "license": "MIT", 153 + "optional": true, 154 + "engines": { 155 + "node": ">=8" 156 + } 157 + }, 158 + "node_modules/aproba": { 159 + "version": "2.1.0", 160 + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", 161 + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", 162 + "license": "ISC", 163 + "optional": true 164 + }, 165 + "node_modules/are-we-there-yet": { 166 + "version": "3.0.1", 167 + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", 168 + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", 169 + "deprecated": "This package is no longer supported.", 170 + "license": "ISC", 171 + "optional": true, 172 + "dependencies": { 173 + "delegates": "^1.0.0", 174 + "readable-stream": "^3.6.0" 175 + }, 176 + "engines": { 177 + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 178 + } 179 + }, 180 + "node_modules/array-flatten": { 181 + "version": "1.1.1", 182 + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 183 + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", 184 + "license": "MIT" 185 + }, 186 + "node_modules/balanced-match": { 187 + "version": "1.0.2", 188 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 189 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 190 + "license": "MIT", 191 + "optional": true 192 + }, 193 + "node_modules/base64-js": { 194 + "version": "1.5.1", 195 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 196 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 197 + "funding": [ 198 + { 199 + "type": "github", 200 + "url": "https://github.com/sponsors/feross" 201 + }, 202 + { 203 + "type": "patreon", 204 + "url": "https://www.patreon.com/feross" 205 + }, 206 + { 207 + "type": "consulting", 208 + "url": "https://feross.org/support" 209 + } 210 + ], 211 + "license": "MIT" 212 + }, 213 + "node_modules/bcryptjs": { 214 + "version": "2.4.3", 215 + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", 216 + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", 217 + "license": "MIT" 218 + }, 219 + "node_modules/bindings": { 220 + "version": "1.5.0", 221 + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 222 + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 223 + "license": "MIT", 224 + "dependencies": { 225 + "file-uri-to-path": "1.0.0" 226 + } 227 + }, 228 + "node_modules/bl": { 229 + "version": "4.1.0", 230 + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 231 + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 232 + "license": "MIT", 233 + "dependencies": { 234 + "buffer": "^5.5.0", 235 + "inherits": "^2.0.4", 236 + "readable-stream": "^3.4.0" 237 + } 238 + }, 239 + "node_modules/body-parser": { 240 + "version": "1.20.3", 241 + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", 242 + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 243 + "license": "MIT", 244 + "dependencies": { 245 + "bytes": "3.1.2", 246 + "content-type": "~1.0.5", 247 + "debug": "2.6.9", 248 + "depd": "2.0.0", 249 + "destroy": "1.2.0", 250 + "http-errors": "2.0.0", 251 + "iconv-lite": "0.4.24", 252 + "on-finished": "2.4.1", 253 + "qs": "6.13.0", 254 + "raw-body": "2.5.2", 255 + "type-is": "~1.6.18", 256 + "unpipe": "1.0.0" 257 + }, 258 + "engines": { 259 + "node": ">= 0.8", 260 + "npm": "1.2.8000 || >= 1.4.16" 261 + } 262 + }, 263 + "node_modules/brace-expansion": { 264 + "version": "1.1.12", 265 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 266 + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 267 + "license": "MIT", 268 + "optional": true, 269 + "dependencies": { 270 + "balanced-match": "^1.0.0", 271 + "concat-map": "0.0.1" 272 + } 273 + }, 274 + "node_modules/buffer": { 275 + "version": "5.7.1", 276 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 277 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 278 + "funding": [ 279 + { 280 + "type": "github", 281 + "url": "https://github.com/sponsors/feross" 282 + }, 283 + { 284 + "type": "patreon", 285 + "url": "https://www.patreon.com/feross" 286 + }, 287 + { 288 + "type": "consulting", 289 + "url": "https://feross.org/support" 290 + } 291 + ], 292 + "license": "MIT", 293 + "dependencies": { 294 + "base64-js": "^1.3.1", 295 + "ieee754": "^1.1.13" 296 + } 297 + }, 298 + "node_modules/buffer-equal-constant-time": { 299 + "version": "1.0.1", 300 + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 301 + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", 302 + "license": "BSD-3-Clause" 303 + }, 304 + "node_modules/bytes": { 305 + "version": "3.1.2", 306 + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 307 + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 308 + "license": "MIT", 309 + "engines": { 310 + "node": ">= 0.8" 311 + } 312 + }, 313 + "node_modules/cacache": { 314 + "version": "15.3.0", 315 + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", 316 + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", 317 + "license": "ISC", 318 + "optional": true, 319 + "dependencies": { 320 + "@npmcli/fs": "^1.0.0", 321 + "@npmcli/move-file": "^1.0.1", 322 + "chownr": "^2.0.0", 323 + "fs-minipass": "^2.0.0", 324 + "glob": "^7.1.4", 325 + "infer-owner": "^1.0.4", 326 + "lru-cache": "^6.0.0", 327 + "minipass": "^3.1.1", 328 + "minipass-collect": "^1.0.2", 329 + "minipass-flush": "^1.0.5", 330 + "minipass-pipeline": "^1.2.2", 331 + "mkdirp": "^1.0.3", 332 + "p-map": "^4.0.0", 333 + "promise-inflight": "^1.0.1", 334 + "rimraf": "^3.0.2", 335 + "ssri": "^8.0.1", 336 + "tar": "^6.0.2", 337 + "unique-filename": "^1.1.1" 338 + }, 339 + "engines": { 340 + "node": ">= 10" 341 + } 342 + }, 343 + "node_modules/call-bind-apply-helpers": { 344 + "version": "1.0.2", 345 + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 346 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 347 + "license": "MIT", 348 + "dependencies": { 349 + "es-errors": "^1.3.0", 350 + "function-bind": "^1.1.2" 351 + }, 352 + "engines": { 353 + "node": ">= 0.4" 354 + } 355 + }, 356 + "node_modules/call-bound": { 357 + "version": "1.0.4", 358 + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 359 + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 360 + "license": "MIT", 361 + "dependencies": { 362 + "call-bind-apply-helpers": "^1.0.2", 363 + "get-intrinsic": "^1.3.0" 364 + }, 365 + "engines": { 366 + "node": ">= 0.4" 367 + }, 368 + "funding": { 369 + "url": "https://github.com/sponsors/ljharb" 370 + } 371 + }, 372 + "node_modules/chownr": { 373 + "version": "2.0.0", 374 + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 375 + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 376 + "license": "ISC", 377 + "engines": { 378 + "node": ">=10" 379 + } 380 + }, 381 + "node_modules/clean-stack": { 382 + "version": "2.2.0", 383 + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 384 + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 385 + "license": "MIT", 386 + "optional": true, 387 + "engines": { 388 + "node": ">=6" 389 + } 390 + }, 391 + "node_modules/color-support": { 392 + "version": "1.1.3", 393 + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 394 + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 395 + "license": "ISC", 396 + "optional": true, 397 + "bin": { 398 + "color-support": "bin.js" 399 + } 400 + }, 401 + "node_modules/concat-map": { 402 + "version": "0.0.1", 403 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 404 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 405 + "license": "MIT", 406 + "optional": true 407 + }, 408 + "node_modules/console-control-strings": { 409 + "version": "1.1.0", 410 + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 411 + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", 412 + "license": "ISC", 413 + "optional": true 414 + }, 415 + "node_modules/content-disposition": { 416 + "version": "0.5.4", 417 + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 418 + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 419 + "license": "MIT", 420 + "dependencies": { 421 + "safe-buffer": "5.2.1" 422 + }, 423 + "engines": { 424 + "node": ">= 0.6" 425 + } 426 + }, 427 + "node_modules/content-type": { 428 + "version": "1.0.5", 429 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 430 + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 431 + "license": "MIT", 432 + "engines": { 433 + "node": ">= 0.6" 434 + } 435 + }, 436 + "node_modules/cookie": { 437 + "version": "0.7.1", 438 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 439 + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 440 + "license": "MIT", 441 + "engines": { 442 + "node": ">= 0.6" 443 + } 444 + }, 445 + "node_modules/cookie-signature": { 446 + "version": "1.0.6", 447 + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 448 + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", 449 + "license": "MIT" 450 + }, 451 + "node_modules/cors": { 452 + "version": "2.8.5", 453 + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 454 + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 455 + "license": "MIT", 456 + "dependencies": { 457 + "object-assign": "^4", 458 + "vary": "^1" 459 + }, 460 + "engines": { 461 + "node": ">= 0.10" 462 + } 463 + }, 464 + "node_modules/debug": { 465 + "version": "2.6.9", 466 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 467 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 468 + "license": "MIT", 469 + "dependencies": { 470 + "ms": "2.0.0" 471 + } 472 + }, 473 + "node_modules/decompress-response": { 474 + "version": "6.0.0", 475 + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 476 + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 477 + "license": "MIT", 478 + "dependencies": { 479 + "mimic-response": "^3.1.0" 480 + }, 481 + "engines": { 482 + "node": ">=10" 483 + }, 484 + "funding": { 485 + "url": "https://github.com/sponsors/sindresorhus" 486 + } 487 + }, 488 + "node_modules/deep-extend": { 489 + "version": "0.6.0", 490 + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 491 + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 492 + "license": "MIT", 493 + "engines": { 494 + "node": ">=4.0.0" 495 + } 496 + }, 497 + "node_modules/delegates": { 498 + "version": "1.0.0", 499 + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 500 + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", 501 + "license": "MIT", 502 + "optional": true 503 + }, 504 + "node_modules/depd": { 505 + "version": "2.0.0", 506 + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 507 + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 508 + "license": "MIT", 509 + "engines": { 510 + "node": ">= 0.8" 511 + } 512 + }, 513 + "node_modules/destroy": { 514 + "version": "1.2.0", 515 + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 516 + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 517 + "license": "MIT", 518 + "engines": { 519 + "node": ">= 0.8", 520 + "npm": "1.2.8000 || >= 1.4.16" 521 + } 522 + }, 523 + "node_modules/detect-libc": { 524 + "version": "2.0.4", 525 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", 526 + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", 527 + "license": "Apache-2.0", 528 + "engines": { 529 + "node": ">=8" 530 + } 531 + }, 532 + "node_modules/dunder-proto": { 533 + "version": "1.0.1", 534 + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 535 + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 536 + "license": "MIT", 537 + "dependencies": { 538 + "call-bind-apply-helpers": "^1.0.1", 539 + "es-errors": "^1.3.0", 540 + "gopd": "^1.2.0" 541 + }, 542 + "engines": { 543 + "node": ">= 0.4" 544 + } 545 + }, 546 + "node_modules/ecdsa-sig-formatter": { 547 + "version": "1.0.11", 548 + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 549 + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 550 + "license": "Apache-2.0", 551 + "dependencies": { 552 + "safe-buffer": "^5.0.1" 553 + } 554 + }, 555 + "node_modules/ee-first": { 556 + "version": "1.1.1", 557 + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 558 + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 559 + "license": "MIT" 560 + }, 561 + "node_modules/emoji-regex": { 562 + "version": "8.0.0", 563 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 564 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 565 + "license": "MIT", 566 + "optional": true 567 + }, 568 + "node_modules/encodeurl": { 569 + "version": "2.0.0", 570 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 571 + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 572 + "license": "MIT", 573 + "engines": { 574 + "node": ">= 0.8" 575 + } 576 + }, 577 + "node_modules/encoding": { 578 + "version": "0.1.13", 579 + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 580 + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 581 + "license": "MIT", 582 + "optional": true, 583 + "dependencies": { 584 + "iconv-lite": "^0.6.2" 585 + } 586 + }, 587 + "node_modules/encoding/node_modules/iconv-lite": { 588 + "version": "0.6.3", 589 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 590 + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 591 + "license": "MIT", 592 + "optional": true, 593 + "dependencies": { 594 + "safer-buffer": ">= 2.1.2 < 3.0.0" 595 + }, 596 + "engines": { 597 + "node": ">=0.10.0" 598 + } 599 + }, 600 + "node_modules/end-of-stream": { 601 + "version": "1.4.5", 602 + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", 603 + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", 604 + "license": "MIT", 605 + "dependencies": { 606 + "once": "^1.4.0" 607 + } 608 + }, 609 + "node_modules/env-paths": { 610 + "version": "2.2.1", 611 + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 612 + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 613 + "license": "MIT", 614 + "optional": true, 615 + "engines": { 616 + "node": ">=6" 617 + } 618 + }, 619 + "node_modules/err-code": { 620 + "version": "2.0.3", 621 + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 622 + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", 623 + "license": "MIT", 624 + "optional": true 625 + }, 626 + "node_modules/es-define-property": { 627 + "version": "1.0.1", 628 + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 629 + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 630 + "license": "MIT", 631 + "engines": { 632 + "node": ">= 0.4" 633 + } 634 + }, 635 + "node_modules/es-errors": { 636 + "version": "1.3.0", 637 + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 638 + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 639 + "license": "MIT", 640 + "engines": { 641 + "node": ">= 0.4" 642 + } 643 + }, 644 + "node_modules/es-object-atoms": { 645 + "version": "1.1.1", 646 + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 647 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 648 + "license": "MIT", 649 + "dependencies": { 650 + "es-errors": "^1.3.0" 651 + }, 652 + "engines": { 653 + "node": ">= 0.4" 654 + } 655 + }, 656 + "node_modules/escape-html": { 657 + "version": "1.0.3", 658 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 659 + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 660 + "license": "MIT" 661 + }, 662 + "node_modules/etag": { 663 + "version": "1.8.1", 664 + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 665 + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 666 + "license": "MIT", 667 + "engines": { 668 + "node": ">= 0.6" 669 + } 670 + }, 671 + "node_modules/expand-template": { 672 + "version": "2.0.3", 673 + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 674 + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 675 + "license": "(MIT OR WTFPL)", 676 + "engines": { 677 + "node": ">=6" 678 + } 679 + }, 680 + "node_modules/express": { 681 + "version": "4.21.2", 682 + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", 683 + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", 684 + "license": "MIT", 685 + "dependencies": { 686 + "accepts": "~1.3.8", 687 + "array-flatten": "1.1.1", 688 + "body-parser": "1.20.3", 689 + "content-disposition": "0.5.4", 690 + "content-type": "~1.0.4", 691 + "cookie": "0.7.1", 692 + "cookie-signature": "1.0.6", 693 + "debug": "2.6.9", 694 + "depd": "2.0.0", 695 + "encodeurl": "~2.0.0", 696 + "escape-html": "~1.0.3", 697 + "etag": "~1.8.1", 698 + "finalhandler": "1.3.1", 699 + "fresh": "0.5.2", 700 + "http-errors": "2.0.0", 701 + "merge-descriptors": "1.0.3", 702 + "methods": "~1.1.2", 703 + "on-finished": "2.4.1", 704 + "parseurl": "~1.3.3", 705 + "path-to-regexp": "0.1.12", 706 + "proxy-addr": "~2.0.7", 707 + "qs": "6.13.0", 708 + "range-parser": "~1.2.1", 709 + "safe-buffer": "5.2.1", 710 + "send": "0.19.0", 711 + "serve-static": "1.16.2", 712 + "setprototypeof": "1.2.0", 713 + "statuses": "2.0.1", 714 + "type-is": "~1.6.18", 715 + "utils-merge": "1.0.1", 716 + "vary": "~1.1.2" 717 + }, 718 + "engines": { 719 + "node": ">= 0.10.0" 720 + }, 721 + "funding": { 722 + "type": "opencollective", 723 + "url": "https://opencollective.com/express" 724 + } 725 + }, 726 + "node_modules/file-uri-to-path": { 727 + "version": "1.0.0", 728 + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 729 + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", 730 + "license": "MIT" 731 + }, 732 + "node_modules/finalhandler": { 733 + "version": "1.3.1", 734 + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", 735 + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 736 + "license": "MIT", 737 + "dependencies": { 738 + "debug": "2.6.9", 739 + "encodeurl": "~2.0.0", 740 + "escape-html": "~1.0.3", 741 + "on-finished": "2.4.1", 742 + "parseurl": "~1.3.3", 743 + "statuses": "2.0.1", 744 + "unpipe": "~1.0.0" 745 + }, 746 + "engines": { 747 + "node": ">= 0.8" 748 + } 749 + }, 750 + "node_modules/forwarded": { 751 + "version": "0.2.0", 752 + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 753 + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 754 + "license": "MIT", 755 + "engines": { 756 + "node": ">= 0.6" 757 + } 758 + }, 759 + "node_modules/fresh": { 760 + "version": "0.5.2", 761 + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 762 + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 763 + "license": "MIT", 764 + "engines": { 765 + "node": ">= 0.6" 766 + } 767 + }, 768 + "node_modules/fs-constants": { 769 + "version": "1.0.0", 770 + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 771 + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 772 + "license": "MIT" 773 + }, 774 + "node_modules/fs-minipass": { 775 + "version": "2.1.0", 776 + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 777 + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 778 + "license": "ISC", 779 + "dependencies": { 780 + "minipass": "^3.0.0" 781 + }, 782 + "engines": { 783 + "node": ">= 8" 784 + } 785 + }, 786 + "node_modules/fs.realpath": { 787 + "version": "1.0.0", 788 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 789 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 790 + "license": "ISC", 791 + "optional": true 792 + }, 793 + "node_modules/function-bind": { 794 + "version": "1.1.2", 795 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 796 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 797 + "license": "MIT", 798 + "funding": { 799 + "url": "https://github.com/sponsors/ljharb" 800 + } 801 + }, 802 + "node_modules/gauge": { 803 + "version": "4.0.4", 804 + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", 805 + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", 806 + "deprecated": "This package is no longer supported.", 807 + "license": "ISC", 808 + "optional": true, 809 + "dependencies": { 810 + "aproba": "^1.0.3 || ^2.0.0", 811 + "color-support": "^1.1.3", 812 + "console-control-strings": "^1.1.0", 813 + "has-unicode": "^2.0.1", 814 + "signal-exit": "^3.0.7", 815 + "string-width": "^4.2.3", 816 + "strip-ansi": "^6.0.1", 817 + "wide-align": "^1.1.5" 818 + }, 819 + "engines": { 820 + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 821 + } 822 + }, 823 + "node_modules/get-intrinsic": { 824 + "version": "1.3.0", 825 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 826 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 827 + "license": "MIT", 828 + "dependencies": { 829 + "call-bind-apply-helpers": "^1.0.2", 830 + "es-define-property": "^1.0.1", 831 + "es-errors": "^1.3.0", 832 + "es-object-atoms": "^1.1.1", 833 + "function-bind": "^1.1.2", 834 + "get-proto": "^1.0.1", 835 + "gopd": "^1.2.0", 836 + "has-symbols": "^1.1.0", 837 + "hasown": "^2.0.2", 838 + "math-intrinsics": "^1.1.0" 839 + }, 840 + "engines": { 841 + "node": ">= 0.4" 842 + }, 843 + "funding": { 844 + "url": "https://github.com/sponsors/ljharb" 845 + } 846 + }, 847 + "node_modules/get-proto": { 848 + "version": "1.0.1", 849 + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 850 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 851 + "license": "MIT", 852 + "dependencies": { 853 + "dunder-proto": "^1.0.1", 854 + "es-object-atoms": "^1.0.0" 855 + }, 856 + "engines": { 857 + "node": ">= 0.4" 858 + } 859 + }, 860 + "node_modules/github-from-package": { 861 + "version": "0.0.0", 862 + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 863 + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", 864 + "license": "MIT" 865 + }, 866 + "node_modules/glob": { 867 + "version": "7.2.3", 868 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 869 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 870 + "deprecated": "Glob versions prior to v9 are no longer supported", 871 + "license": "ISC", 872 + "optional": true, 873 + "dependencies": { 874 + "fs.realpath": "^1.0.0", 875 + "inflight": "^1.0.4", 876 + "inherits": "2", 877 + "minimatch": "^3.1.1", 878 + "once": "^1.3.0", 879 + "path-is-absolute": "^1.0.0" 880 + }, 881 + "engines": { 882 + "node": "*" 883 + }, 884 + "funding": { 885 + "url": "https://github.com/sponsors/isaacs" 886 + } 887 + }, 888 + "node_modules/gopd": { 889 + "version": "1.2.0", 890 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 891 + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 892 + "license": "MIT", 893 + "engines": { 894 + "node": ">= 0.4" 895 + }, 896 + "funding": { 897 + "url": "https://github.com/sponsors/ljharb" 898 + } 899 + }, 900 + "node_modules/graceful-fs": { 901 + "version": "4.2.11", 902 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 903 + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 904 + "license": "ISC", 905 + "optional": true 906 + }, 907 + "node_modules/has-symbols": { 908 + "version": "1.1.0", 909 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 910 + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 911 + "license": "MIT", 912 + "engines": { 913 + "node": ">= 0.4" 914 + }, 915 + "funding": { 916 + "url": "https://github.com/sponsors/ljharb" 917 + } 918 + }, 919 + "node_modules/has-unicode": { 920 + "version": "2.0.1", 921 + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 922 + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", 923 + "license": "ISC", 924 + "optional": true 925 + }, 926 + "node_modules/hasown": { 927 + "version": "2.0.2", 928 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 929 + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 930 + "license": "MIT", 931 + "dependencies": { 932 + "function-bind": "^1.1.2" 933 + }, 934 + "engines": { 935 + "node": ">= 0.4" 936 + } 937 + }, 938 + "node_modules/http-cache-semantics": { 939 + "version": "4.2.0", 940 + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", 941 + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", 942 + "license": "BSD-2-Clause", 943 + "optional": true 944 + }, 945 + "node_modules/http-errors": { 946 + "version": "2.0.0", 947 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 948 + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 949 + "license": "MIT", 950 + "dependencies": { 951 + "depd": "2.0.0", 952 + "inherits": "2.0.4", 953 + "setprototypeof": "1.2.0", 954 + "statuses": "2.0.1", 955 + "toidentifier": "1.0.1" 956 + }, 957 + "engines": { 958 + "node": ">= 0.8" 959 + } 960 + }, 961 + "node_modules/http-proxy-agent": { 962 + "version": "4.0.1", 963 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 964 + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 965 + "license": "MIT", 966 + "optional": true, 967 + "dependencies": { 968 + "@tootallnate/once": "1", 969 + "agent-base": "6", 970 + "debug": "4" 971 + }, 972 + "engines": { 973 + "node": ">= 6" 974 + } 975 + }, 976 + "node_modules/http-proxy-agent/node_modules/debug": { 977 + "version": "4.4.1", 978 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 979 + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 980 + "license": "MIT", 981 + "optional": true, 982 + "dependencies": { 983 + "ms": "^2.1.3" 984 + }, 985 + "engines": { 986 + "node": ">=6.0" 987 + }, 988 + "peerDependenciesMeta": { 989 + "supports-color": { 990 + "optional": true 991 + } 992 + } 993 + }, 994 + "node_modules/http-proxy-agent/node_modules/ms": { 995 + "version": "2.1.3", 996 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 997 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 998 + "license": "MIT", 999 + "optional": true 1000 + }, 1001 + "node_modules/https-proxy-agent": { 1002 + "version": "5.0.1", 1003 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1004 + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1005 + "license": "MIT", 1006 + "optional": true, 1007 + "dependencies": { 1008 + "agent-base": "6", 1009 + "debug": "4" 1010 + }, 1011 + "engines": { 1012 + "node": ">= 6" 1013 + } 1014 + }, 1015 + "node_modules/https-proxy-agent/node_modules/debug": { 1016 + "version": "4.4.1", 1017 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 1018 + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 1019 + "license": "MIT", 1020 + "optional": true, 1021 + "dependencies": { 1022 + "ms": "^2.1.3" 1023 + }, 1024 + "engines": { 1025 + "node": ">=6.0" 1026 + }, 1027 + "peerDependenciesMeta": { 1028 + "supports-color": { 1029 + "optional": true 1030 + } 1031 + } 1032 + }, 1033 + "node_modules/https-proxy-agent/node_modules/ms": { 1034 + "version": "2.1.3", 1035 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1036 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1037 + "license": "MIT", 1038 + "optional": true 1039 + }, 1040 + "node_modules/humanize-ms": { 1041 + "version": "1.2.1", 1042 + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 1043 + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 1044 + "license": "MIT", 1045 + "optional": true, 1046 + "dependencies": { 1047 + "ms": "^2.0.0" 1048 + } 1049 + }, 1050 + "node_modules/iconv-lite": { 1051 + "version": "0.4.24", 1052 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1053 + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1054 + "license": "MIT", 1055 + "dependencies": { 1056 + "safer-buffer": ">= 2.1.2 < 3" 1057 + }, 1058 + "engines": { 1059 + "node": ">=0.10.0" 1060 + } 1061 + }, 1062 + "node_modules/ieee754": { 1063 + "version": "1.2.1", 1064 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1065 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1066 + "funding": [ 1067 + { 1068 + "type": "github", 1069 + "url": "https://github.com/sponsors/feross" 1070 + }, 1071 + { 1072 + "type": "patreon", 1073 + "url": "https://www.patreon.com/feross" 1074 + }, 1075 + { 1076 + "type": "consulting", 1077 + "url": "https://feross.org/support" 1078 + } 1079 + ], 1080 + "license": "BSD-3-Clause" 1081 + }, 1082 + "node_modules/imurmurhash": { 1083 + "version": "0.1.4", 1084 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1085 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1086 + "license": "MIT", 1087 + "optional": true, 1088 + "engines": { 1089 + "node": ">=0.8.19" 1090 + } 1091 + }, 1092 + "node_modules/indent-string": { 1093 + "version": "4.0.0", 1094 + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1095 + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 1096 + "license": "MIT", 1097 + "optional": true, 1098 + "engines": { 1099 + "node": ">=8" 1100 + } 1101 + }, 1102 + "node_modules/infer-owner": { 1103 + "version": "1.0.4", 1104 + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 1105 + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 1106 + "license": "ISC", 1107 + "optional": true 1108 + }, 1109 + "node_modules/inflight": { 1110 + "version": "1.0.6", 1111 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1112 + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1113 + "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.", 1114 + "license": "ISC", 1115 + "optional": true, 1116 + "dependencies": { 1117 + "once": "^1.3.0", 1118 + "wrappy": "1" 1119 + } 1120 + }, 1121 + "node_modules/inherits": { 1122 + "version": "2.0.4", 1123 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1124 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1125 + "license": "ISC" 1126 + }, 1127 + "node_modules/ini": { 1128 + "version": "1.3.8", 1129 + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1130 + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 1131 + "license": "ISC" 1132 + }, 1133 + "node_modules/ip-address": { 1134 + "version": "9.0.5", 1135 + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 1136 + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 1137 + "license": "MIT", 1138 + "optional": true, 1139 + "dependencies": { 1140 + "jsbn": "1.1.0", 1141 + "sprintf-js": "^1.1.3" 1142 + }, 1143 + "engines": { 1144 + "node": ">= 12" 1145 + } 1146 + }, 1147 + "node_modules/ipaddr.js": { 1148 + "version": "1.9.1", 1149 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1150 + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1151 + "license": "MIT", 1152 + "engines": { 1153 + "node": ">= 0.10" 1154 + } 1155 + }, 1156 + "node_modules/is-fullwidth-code-point": { 1157 + "version": "3.0.0", 1158 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1159 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1160 + "license": "MIT", 1161 + "optional": true, 1162 + "engines": { 1163 + "node": ">=8" 1164 + } 1165 + }, 1166 + "node_modules/is-lambda": { 1167 + "version": "1.0.1", 1168 + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 1169 + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", 1170 + "license": "MIT", 1171 + "optional": true 1172 + }, 1173 + "node_modules/isexe": { 1174 + "version": "2.0.0", 1175 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1176 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1177 + "license": "ISC", 1178 + "optional": true 1179 + }, 1180 + "node_modules/jsbn": { 1181 + "version": "1.1.0", 1182 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 1183 + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", 1184 + "license": "MIT", 1185 + "optional": true 1186 + }, 1187 + "node_modules/jsonwebtoken": { 1188 + "version": "9.0.2", 1189 + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 1190 + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 1191 + "license": "MIT", 1192 + "dependencies": { 1193 + "jws": "^3.2.2", 1194 + "lodash.includes": "^4.3.0", 1195 + "lodash.isboolean": "^3.0.3", 1196 + "lodash.isinteger": "^4.0.4", 1197 + "lodash.isnumber": "^3.0.3", 1198 + "lodash.isplainobject": "^4.0.6", 1199 + "lodash.isstring": "^4.0.1", 1200 + "lodash.once": "^4.0.0", 1201 + "ms": "^2.1.1", 1202 + "semver": "^7.5.4" 1203 + }, 1204 + "engines": { 1205 + "node": ">=12", 1206 + "npm": ">=6" 1207 + } 1208 + }, 1209 + "node_modules/jsonwebtoken/node_modules/ms": { 1210 + "version": "2.1.3", 1211 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1212 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1213 + "license": "MIT" 1214 + }, 1215 + "node_modules/jwa": { 1216 + "version": "1.4.2", 1217 + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", 1218 + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", 1219 + "license": "MIT", 1220 + "dependencies": { 1221 + "buffer-equal-constant-time": "^1.0.1", 1222 + "ecdsa-sig-formatter": "1.0.11", 1223 + "safe-buffer": "^5.0.1" 1224 + } 1225 + }, 1226 + "node_modules/jws": { 1227 + "version": "3.2.2", 1228 + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1229 + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1230 + "license": "MIT", 1231 + "dependencies": { 1232 + "jwa": "^1.4.1", 1233 + "safe-buffer": "^5.0.1" 1234 + } 1235 + }, 1236 + "node_modules/lodash.includes": { 1237 + "version": "4.3.0", 1238 + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1239 + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", 1240 + "license": "MIT" 1241 + }, 1242 + "node_modules/lodash.isboolean": { 1243 + "version": "3.0.3", 1244 + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1245 + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", 1246 + "license": "MIT" 1247 + }, 1248 + "node_modules/lodash.isinteger": { 1249 + "version": "4.0.4", 1250 + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1251 + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", 1252 + "license": "MIT" 1253 + }, 1254 + "node_modules/lodash.isnumber": { 1255 + "version": "3.0.3", 1256 + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1257 + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", 1258 + "license": "MIT" 1259 + }, 1260 + "node_modules/lodash.isplainobject": { 1261 + "version": "4.0.6", 1262 + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1263 + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", 1264 + "license": "MIT" 1265 + }, 1266 + "node_modules/lodash.isstring": { 1267 + "version": "4.0.1", 1268 + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1269 + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", 1270 + "license": "MIT" 1271 + }, 1272 + "node_modules/lodash.once": { 1273 + "version": "4.1.1", 1274 + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1275 + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", 1276 + "license": "MIT" 1277 + }, 1278 + "node_modules/lru-cache": { 1279 + "version": "6.0.0", 1280 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1281 + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1282 + "license": "ISC", 1283 + "optional": true, 1284 + "dependencies": { 1285 + "yallist": "^4.0.0" 1286 + }, 1287 + "engines": { 1288 + "node": ">=10" 1289 + } 1290 + }, 1291 + "node_modules/make-fetch-happen": { 1292 + "version": "9.1.0", 1293 + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", 1294 + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", 1295 + "license": "ISC", 1296 + "optional": true, 1297 + "dependencies": { 1298 + "agentkeepalive": "^4.1.3", 1299 + "cacache": "^15.2.0", 1300 + "http-cache-semantics": "^4.1.0", 1301 + "http-proxy-agent": "^4.0.1", 1302 + "https-proxy-agent": "^5.0.0", 1303 + "is-lambda": "^1.0.1", 1304 + "lru-cache": "^6.0.0", 1305 + "minipass": "^3.1.3", 1306 + "minipass-collect": "^1.0.2", 1307 + "minipass-fetch": "^1.3.2", 1308 + "minipass-flush": "^1.0.5", 1309 + "minipass-pipeline": "^1.2.4", 1310 + "negotiator": "^0.6.2", 1311 + "promise-retry": "^2.0.1", 1312 + "socks-proxy-agent": "^6.0.0", 1313 + "ssri": "^8.0.0" 1314 + }, 1315 + "engines": { 1316 + "node": ">= 10" 1317 + } 1318 + }, 1319 + "node_modules/math-intrinsics": { 1320 + "version": "1.1.0", 1321 + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 1322 + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 1323 + "license": "MIT", 1324 + "engines": { 1325 + "node": ">= 0.4" 1326 + } 1327 + }, 1328 + "node_modules/media-typer": { 1329 + "version": "0.3.0", 1330 + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1331 + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1332 + "license": "MIT", 1333 + "engines": { 1334 + "node": ">= 0.6" 1335 + } 1336 + }, 1337 + "node_modules/merge-descriptors": { 1338 + "version": "1.0.3", 1339 + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 1340 + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", 1341 + "license": "MIT", 1342 + "funding": { 1343 + "url": "https://github.com/sponsors/sindresorhus" 1344 + } 1345 + }, 1346 + "node_modules/methods": { 1347 + "version": "1.1.2", 1348 + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1349 + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1350 + "license": "MIT", 1351 + "engines": { 1352 + "node": ">= 0.6" 1353 + } 1354 + }, 1355 + "node_modules/mime": { 1356 + "version": "1.6.0", 1357 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1358 + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1359 + "license": "MIT", 1360 + "bin": { 1361 + "mime": "cli.js" 1362 + }, 1363 + "engines": { 1364 + "node": ">=4" 1365 + } 1366 + }, 1367 + "node_modules/mime-db": { 1368 + "version": "1.52.0", 1369 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1370 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1371 + "license": "MIT", 1372 + "engines": { 1373 + "node": ">= 0.6" 1374 + } 1375 + }, 1376 + "node_modules/mime-types": { 1377 + "version": "2.1.35", 1378 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1379 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1380 + "license": "MIT", 1381 + "dependencies": { 1382 + "mime-db": "1.52.0" 1383 + }, 1384 + "engines": { 1385 + "node": ">= 0.6" 1386 + } 1387 + }, 1388 + "node_modules/mimic-response": { 1389 + "version": "3.1.0", 1390 + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 1391 + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 1392 + "license": "MIT", 1393 + "engines": { 1394 + "node": ">=10" 1395 + }, 1396 + "funding": { 1397 + "url": "https://github.com/sponsors/sindresorhus" 1398 + } 1399 + }, 1400 + "node_modules/minimatch": { 1401 + "version": "3.1.2", 1402 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1403 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1404 + "license": "ISC", 1405 + "optional": true, 1406 + "dependencies": { 1407 + "brace-expansion": "^1.1.7" 1408 + }, 1409 + "engines": { 1410 + "node": "*" 1411 + } 1412 + }, 1413 + "node_modules/minimist": { 1414 + "version": "1.2.8", 1415 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1416 + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1417 + "license": "MIT", 1418 + "funding": { 1419 + "url": "https://github.com/sponsors/ljharb" 1420 + } 1421 + }, 1422 + "node_modules/minipass": { 1423 + "version": "3.3.6", 1424 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1425 + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1426 + "license": "ISC", 1427 + "dependencies": { 1428 + "yallist": "^4.0.0" 1429 + }, 1430 + "engines": { 1431 + "node": ">=8" 1432 + } 1433 + }, 1434 + "node_modules/minipass-collect": { 1435 + "version": "1.0.2", 1436 + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", 1437 + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", 1438 + "license": "ISC", 1439 + "optional": true, 1440 + "dependencies": { 1441 + "minipass": "^3.0.0" 1442 + }, 1443 + "engines": { 1444 + "node": ">= 8" 1445 + } 1446 + }, 1447 + "node_modules/minipass-fetch": { 1448 + "version": "1.4.1", 1449 + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", 1450 + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", 1451 + "license": "MIT", 1452 + "optional": true, 1453 + "dependencies": { 1454 + "minipass": "^3.1.0", 1455 + "minipass-sized": "^1.0.3", 1456 + "minizlib": "^2.0.0" 1457 + }, 1458 + "engines": { 1459 + "node": ">=8" 1460 + }, 1461 + "optionalDependencies": { 1462 + "encoding": "^0.1.12" 1463 + } 1464 + }, 1465 + "node_modules/minipass-flush": { 1466 + "version": "1.0.5", 1467 + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 1468 + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 1469 + "license": "ISC", 1470 + "optional": true, 1471 + "dependencies": { 1472 + "minipass": "^3.0.0" 1473 + }, 1474 + "engines": { 1475 + "node": ">= 8" 1476 + } 1477 + }, 1478 + "node_modules/minipass-pipeline": { 1479 + "version": "1.2.4", 1480 + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", 1481 + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", 1482 + "license": "ISC", 1483 + "optional": true, 1484 + "dependencies": { 1485 + "minipass": "^3.0.0" 1486 + }, 1487 + "engines": { 1488 + "node": ">=8" 1489 + } 1490 + }, 1491 + "node_modules/minipass-sized": { 1492 + "version": "1.0.3", 1493 + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 1494 + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 1495 + "license": "ISC", 1496 + "optional": true, 1497 + "dependencies": { 1498 + "minipass": "^3.0.0" 1499 + }, 1500 + "engines": { 1501 + "node": ">=8" 1502 + } 1503 + }, 1504 + "node_modules/minizlib": { 1505 + "version": "2.1.2", 1506 + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 1507 + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1508 + "license": "MIT", 1509 + "dependencies": { 1510 + "minipass": "^3.0.0", 1511 + "yallist": "^4.0.0" 1512 + }, 1513 + "engines": { 1514 + "node": ">= 8" 1515 + } 1516 + }, 1517 + "node_modules/mkdirp": { 1518 + "version": "1.0.4", 1519 + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1520 + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1521 + "license": "MIT", 1522 + "bin": { 1523 + "mkdirp": "bin/cmd.js" 1524 + }, 1525 + "engines": { 1526 + "node": ">=10" 1527 + } 1528 + }, 1529 + "node_modules/mkdirp-classic": { 1530 + "version": "0.5.3", 1531 + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1532 + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 1533 + "license": "MIT" 1534 + }, 1535 + "node_modules/ms": { 1536 + "version": "2.0.0", 1537 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1538 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1539 + "license": "MIT" 1540 + }, 1541 + "node_modules/napi-build-utils": { 1542 + "version": "2.0.0", 1543 + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", 1544 + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", 1545 + "license": "MIT" 1546 + }, 1547 + "node_modules/negotiator": { 1548 + "version": "0.6.3", 1549 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1550 + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1551 + "license": "MIT", 1552 + "engines": { 1553 + "node": ">= 0.6" 1554 + } 1555 + }, 1556 + "node_modules/node-abi": { 1557 + "version": "3.75.0", 1558 + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", 1559 + "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", 1560 + "license": "MIT", 1561 + "dependencies": { 1562 + "semver": "^7.3.5" 1563 + }, 1564 + "engines": { 1565 + "node": ">=10" 1566 + } 1567 + }, 1568 + "node_modules/node-addon-api": { 1569 + "version": "7.1.1", 1570 + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", 1571 + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", 1572 + "license": "MIT" 1573 + }, 1574 + "node_modules/node-gyp": { 1575 + "version": "8.4.1", 1576 + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", 1577 + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", 1578 + "license": "MIT", 1579 + "optional": true, 1580 + "dependencies": { 1581 + "env-paths": "^2.2.0", 1582 + "glob": "^7.1.4", 1583 + "graceful-fs": "^4.2.6", 1584 + "make-fetch-happen": "^9.1.0", 1585 + "nopt": "^5.0.0", 1586 + "npmlog": "^6.0.0", 1587 + "rimraf": "^3.0.2", 1588 + "semver": "^7.3.5", 1589 + "tar": "^6.1.2", 1590 + "which": "^2.0.2" 1591 + }, 1592 + "bin": { 1593 + "node-gyp": "bin/node-gyp.js" 1594 + }, 1595 + "engines": { 1596 + "node": ">= 10.12.0" 1597 + } 1598 + }, 1599 + "node_modules/nopt": { 1600 + "version": "5.0.0", 1601 + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 1602 + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 1603 + "license": "ISC", 1604 + "optional": true, 1605 + "dependencies": { 1606 + "abbrev": "1" 1607 + }, 1608 + "bin": { 1609 + "nopt": "bin/nopt.js" 1610 + }, 1611 + "engines": { 1612 + "node": ">=6" 1613 + } 1614 + }, 1615 + "node_modules/npmlog": { 1616 + "version": "6.0.2", 1617 + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", 1618 + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", 1619 + "deprecated": "This package is no longer supported.", 1620 + "license": "ISC", 1621 + "optional": true, 1622 + "dependencies": { 1623 + "are-we-there-yet": "^3.0.0", 1624 + "console-control-strings": "^1.1.0", 1625 + "gauge": "^4.0.3", 1626 + "set-blocking": "^2.0.0" 1627 + }, 1628 + "engines": { 1629 + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1630 + } 1631 + }, 1632 + "node_modules/object-assign": { 1633 + "version": "4.1.1", 1634 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1635 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1636 + "license": "MIT", 1637 + "engines": { 1638 + "node": ">=0.10.0" 1639 + } 1640 + }, 1641 + "node_modules/object-inspect": { 1642 + "version": "1.13.4", 1643 + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 1644 + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 1645 + "license": "MIT", 1646 + "engines": { 1647 + "node": ">= 0.4" 1648 + }, 1649 + "funding": { 1650 + "url": "https://github.com/sponsors/ljharb" 1651 + } 1652 + }, 1653 + "node_modules/on-finished": { 1654 + "version": "2.4.1", 1655 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1656 + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1657 + "license": "MIT", 1658 + "dependencies": { 1659 + "ee-first": "1.1.1" 1660 + }, 1661 + "engines": { 1662 + "node": ">= 0.8" 1663 + } 1664 + }, 1665 + "node_modules/once": { 1666 + "version": "1.4.0", 1667 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1668 + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1669 + "license": "ISC", 1670 + "dependencies": { 1671 + "wrappy": "1" 1672 + } 1673 + }, 1674 + "node_modules/p-map": { 1675 + "version": "4.0.0", 1676 + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 1677 + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 1678 + "license": "MIT", 1679 + "optional": true, 1680 + "dependencies": { 1681 + "aggregate-error": "^3.0.0" 1682 + }, 1683 + "engines": { 1684 + "node": ">=10" 1685 + }, 1686 + "funding": { 1687 + "url": "https://github.com/sponsors/sindresorhus" 1688 + } 1689 + }, 1690 + "node_modules/parseurl": { 1691 + "version": "1.3.3", 1692 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1693 + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1694 + "license": "MIT", 1695 + "engines": { 1696 + "node": ">= 0.8" 1697 + } 1698 + }, 1699 + "node_modules/path-is-absolute": { 1700 + "version": "1.0.1", 1701 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1702 + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1703 + "license": "MIT", 1704 + "optional": true, 1705 + "engines": { 1706 + "node": ">=0.10.0" 1707 + } 1708 + }, 1709 + "node_modules/path-to-regexp": { 1710 + "version": "0.1.12", 1711 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", 1712 + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", 1713 + "license": "MIT" 1714 + }, 1715 + "node_modules/prebuild-install": { 1716 + "version": "7.1.3", 1717 + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", 1718 + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", 1719 + "license": "MIT", 1720 + "dependencies": { 1721 + "detect-libc": "^2.0.0", 1722 + "expand-template": "^2.0.3", 1723 + "github-from-package": "0.0.0", 1724 + "minimist": "^1.2.3", 1725 + "mkdirp-classic": "^0.5.3", 1726 + "napi-build-utils": "^2.0.0", 1727 + "node-abi": "^3.3.0", 1728 + "pump": "^3.0.0", 1729 + "rc": "^1.2.7", 1730 + "simple-get": "^4.0.0", 1731 + "tar-fs": "^2.0.0", 1732 + "tunnel-agent": "^0.6.0" 1733 + }, 1734 + "bin": { 1735 + "prebuild-install": "bin.js" 1736 + }, 1737 + "engines": { 1738 + "node": ">=10" 1739 + } 1740 + }, 1741 + "node_modules/promise-inflight": { 1742 + "version": "1.0.1", 1743 + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 1744 + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", 1745 + "license": "ISC", 1746 + "optional": true 1747 + }, 1748 + "node_modules/promise-retry": { 1749 + "version": "2.0.1", 1750 + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 1751 + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 1752 + "license": "MIT", 1753 + "optional": true, 1754 + "dependencies": { 1755 + "err-code": "^2.0.2", 1756 + "retry": "^0.12.0" 1757 + }, 1758 + "engines": { 1759 + "node": ">=10" 1760 + } 1761 + }, 1762 + "node_modules/proxy-addr": { 1763 + "version": "2.0.7", 1764 + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1765 + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1766 + "license": "MIT", 1767 + "dependencies": { 1768 + "forwarded": "0.2.0", 1769 + "ipaddr.js": "1.9.1" 1770 + }, 1771 + "engines": { 1772 + "node": ">= 0.10" 1773 + } 1774 + }, 1775 + "node_modules/pump": { 1776 + "version": "3.0.3", 1777 + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", 1778 + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", 1779 + "license": "MIT", 1780 + "dependencies": { 1781 + "end-of-stream": "^1.1.0", 1782 + "once": "^1.3.1" 1783 + } 1784 + }, 1785 + "node_modules/qs": { 1786 + "version": "6.13.0", 1787 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 1788 + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 1789 + "license": "BSD-3-Clause", 1790 + "dependencies": { 1791 + "side-channel": "^1.0.6" 1792 + }, 1793 + "engines": { 1794 + "node": ">=0.6" 1795 + }, 1796 + "funding": { 1797 + "url": "https://github.com/sponsors/ljharb" 1798 + } 1799 + }, 1800 + "node_modules/range-parser": { 1801 + "version": "1.2.1", 1802 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1803 + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1804 + "license": "MIT", 1805 + "engines": { 1806 + "node": ">= 0.6" 1807 + } 1808 + }, 1809 + "node_modules/raw-body": { 1810 + "version": "2.5.2", 1811 + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1812 + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1813 + "license": "MIT", 1814 + "dependencies": { 1815 + "bytes": "3.1.2", 1816 + "http-errors": "2.0.0", 1817 + "iconv-lite": "0.4.24", 1818 + "unpipe": "1.0.0" 1819 + }, 1820 + "engines": { 1821 + "node": ">= 0.8" 1822 + } 1823 + }, 1824 + "node_modules/rc": { 1825 + "version": "1.2.8", 1826 + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1827 + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1828 + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", 1829 + "dependencies": { 1830 + "deep-extend": "^0.6.0", 1831 + "ini": "~1.3.0", 1832 + "minimist": "^1.2.0", 1833 + "strip-json-comments": "~2.0.1" 1834 + }, 1835 + "bin": { 1836 + "rc": "cli.js" 1837 + } 1838 + }, 1839 + "node_modules/readable-stream": { 1840 + "version": "3.6.2", 1841 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1842 + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1843 + "license": "MIT", 1844 + "dependencies": { 1845 + "inherits": "^2.0.3", 1846 + "string_decoder": "^1.1.1", 1847 + "util-deprecate": "^1.0.1" 1848 + }, 1849 + "engines": { 1850 + "node": ">= 6" 1851 + } 1852 + }, 1853 + "node_modules/retry": { 1854 + "version": "0.12.0", 1855 + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1856 + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 1857 + "license": "MIT", 1858 + "optional": true, 1859 + "engines": { 1860 + "node": ">= 4" 1861 + } 1862 + }, 1863 + "node_modules/rimraf": { 1864 + "version": "3.0.2", 1865 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1866 + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1867 + "deprecated": "Rimraf versions prior to v4 are no longer supported", 1868 + "license": "ISC", 1869 + "optional": true, 1870 + "dependencies": { 1871 + "glob": "^7.1.3" 1872 + }, 1873 + "bin": { 1874 + "rimraf": "bin.js" 1875 + }, 1876 + "funding": { 1877 + "url": "https://github.com/sponsors/isaacs" 1878 + } 1879 + }, 1880 + "node_modules/safe-buffer": { 1881 + "version": "5.2.1", 1882 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1883 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1884 + "funding": [ 1885 + { 1886 + "type": "github", 1887 + "url": "https://github.com/sponsors/feross" 1888 + }, 1889 + { 1890 + "type": "patreon", 1891 + "url": "https://www.patreon.com/feross" 1892 + }, 1893 + { 1894 + "type": "consulting", 1895 + "url": "https://feross.org/support" 1896 + } 1897 + ], 1898 + "license": "MIT" 1899 + }, 1900 + "node_modules/safer-buffer": { 1901 + "version": "2.1.2", 1902 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1903 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1904 + "license": "MIT" 1905 + }, 1906 + "node_modules/semver": { 1907 + "version": "7.7.2", 1908 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 1909 + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 1910 + "license": "ISC", 1911 + "bin": { 1912 + "semver": "bin/semver.js" 1913 + }, 1914 + "engines": { 1915 + "node": ">=10" 1916 + } 1917 + }, 1918 + "node_modules/send": { 1919 + "version": "0.19.0", 1920 + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", 1921 + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 1922 + "license": "MIT", 1923 + "dependencies": { 1924 + "debug": "2.6.9", 1925 + "depd": "2.0.0", 1926 + "destroy": "1.2.0", 1927 + "encodeurl": "~1.0.2", 1928 + "escape-html": "~1.0.3", 1929 + "etag": "~1.8.1", 1930 + "fresh": "0.5.2", 1931 + "http-errors": "2.0.0", 1932 + "mime": "1.6.0", 1933 + "ms": "2.1.3", 1934 + "on-finished": "2.4.1", 1935 + "range-parser": "~1.2.1", 1936 + "statuses": "2.0.1" 1937 + }, 1938 + "engines": { 1939 + "node": ">= 0.8.0" 1940 + } 1941 + }, 1942 + "node_modules/send/node_modules/encodeurl": { 1943 + "version": "1.0.2", 1944 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1945 + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 1946 + "license": "MIT", 1947 + "engines": { 1948 + "node": ">= 0.8" 1949 + } 1950 + }, 1951 + "node_modules/send/node_modules/ms": { 1952 + "version": "2.1.3", 1953 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1954 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1955 + "license": "MIT" 1956 + }, 1957 + "node_modules/serve-static": { 1958 + "version": "1.16.2", 1959 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", 1960 + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 1961 + "license": "MIT", 1962 + "dependencies": { 1963 + "encodeurl": "~2.0.0", 1964 + "escape-html": "~1.0.3", 1965 + "parseurl": "~1.3.3", 1966 + "send": "0.19.0" 1967 + }, 1968 + "engines": { 1969 + "node": ">= 0.8.0" 1970 + } 1971 + }, 1972 + "node_modules/set-blocking": { 1973 + "version": "2.0.0", 1974 + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1975 + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", 1976 + "license": "ISC", 1977 + "optional": true 1978 + }, 1979 + "node_modules/setprototypeof": { 1980 + "version": "1.2.0", 1981 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1982 + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1983 + "license": "ISC" 1984 + }, 1985 + "node_modules/side-channel": { 1986 + "version": "1.1.0", 1987 + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 1988 + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 1989 + "license": "MIT", 1990 + "dependencies": { 1991 + "es-errors": "^1.3.0", 1992 + "object-inspect": "^1.13.3", 1993 + "side-channel-list": "^1.0.0", 1994 + "side-channel-map": "^1.0.1", 1995 + "side-channel-weakmap": "^1.0.2" 1996 + }, 1997 + "engines": { 1998 + "node": ">= 0.4" 1999 + }, 2000 + "funding": { 2001 + "url": "https://github.com/sponsors/ljharb" 2002 + } 2003 + }, 2004 + "node_modules/side-channel-list": { 2005 + "version": "1.0.0", 2006 + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 2007 + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 2008 + "license": "MIT", 2009 + "dependencies": { 2010 + "es-errors": "^1.3.0", 2011 + "object-inspect": "^1.13.3" 2012 + }, 2013 + "engines": { 2014 + "node": ">= 0.4" 2015 + }, 2016 + "funding": { 2017 + "url": "https://github.com/sponsors/ljharb" 2018 + } 2019 + }, 2020 + "node_modules/side-channel-map": { 2021 + "version": "1.0.1", 2022 + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 2023 + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 2024 + "license": "MIT", 2025 + "dependencies": { 2026 + "call-bound": "^1.0.2", 2027 + "es-errors": "^1.3.0", 2028 + "get-intrinsic": "^1.2.5", 2029 + "object-inspect": "^1.13.3" 2030 + }, 2031 + "engines": { 2032 + "node": ">= 0.4" 2033 + }, 2034 + "funding": { 2035 + "url": "https://github.com/sponsors/ljharb" 2036 + } 2037 + }, 2038 + "node_modules/side-channel-weakmap": { 2039 + "version": "1.0.2", 2040 + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 2041 + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 2042 + "license": "MIT", 2043 + "dependencies": { 2044 + "call-bound": "^1.0.2", 2045 + "es-errors": "^1.3.0", 2046 + "get-intrinsic": "^1.2.5", 2047 + "object-inspect": "^1.13.3", 2048 + "side-channel-map": "^1.0.1" 2049 + }, 2050 + "engines": { 2051 + "node": ">= 0.4" 2052 + }, 2053 + "funding": { 2054 + "url": "https://github.com/sponsors/ljharb" 2055 + } 2056 + }, 2057 + "node_modules/signal-exit": { 2058 + "version": "3.0.7", 2059 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2060 + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2061 + "license": "ISC", 2062 + "optional": true 2063 + }, 2064 + "node_modules/simple-concat": { 2065 + "version": "1.0.1", 2066 + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 2067 + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 2068 + "funding": [ 2069 + { 2070 + "type": "github", 2071 + "url": "https://github.com/sponsors/feross" 2072 + }, 2073 + { 2074 + "type": "patreon", 2075 + "url": "https://www.patreon.com/feross" 2076 + }, 2077 + { 2078 + "type": "consulting", 2079 + "url": "https://feross.org/support" 2080 + } 2081 + ], 2082 + "license": "MIT" 2083 + }, 2084 + "node_modules/simple-get": { 2085 + "version": "4.0.1", 2086 + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 2087 + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 2088 + "funding": [ 2089 + { 2090 + "type": "github", 2091 + "url": "https://github.com/sponsors/feross" 2092 + }, 2093 + { 2094 + "type": "patreon", 2095 + "url": "https://www.patreon.com/feross" 2096 + }, 2097 + { 2098 + "type": "consulting", 2099 + "url": "https://feross.org/support" 2100 + } 2101 + ], 2102 + "license": "MIT", 2103 + "dependencies": { 2104 + "decompress-response": "^6.0.0", 2105 + "once": "^1.3.1", 2106 + "simple-concat": "^1.0.0" 2107 + } 2108 + }, 2109 + "node_modules/smart-buffer": { 2110 + "version": "4.2.0", 2111 + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 2112 + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 2113 + "license": "MIT", 2114 + "optional": true, 2115 + "engines": { 2116 + "node": ">= 6.0.0", 2117 + "npm": ">= 3.0.0" 2118 + } 2119 + }, 2120 + "node_modules/socks": { 2121 + "version": "2.8.6", 2122 + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz", 2123 + "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==", 2124 + "license": "MIT", 2125 + "optional": true, 2126 + "dependencies": { 2127 + "ip-address": "^9.0.5", 2128 + "smart-buffer": "^4.2.0" 2129 + }, 2130 + "engines": { 2131 + "node": ">= 10.0.0", 2132 + "npm": ">= 3.0.0" 2133 + } 2134 + }, 2135 + "node_modules/socks-proxy-agent": { 2136 + "version": "6.2.1", 2137 + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", 2138 + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", 2139 + "license": "MIT", 2140 + "optional": true, 2141 + "dependencies": { 2142 + "agent-base": "^6.0.2", 2143 + "debug": "^4.3.3", 2144 + "socks": "^2.6.2" 2145 + }, 2146 + "engines": { 2147 + "node": ">= 10" 2148 + } 2149 + }, 2150 + "node_modules/socks-proxy-agent/node_modules/debug": { 2151 + "version": "4.4.1", 2152 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 2153 + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 2154 + "license": "MIT", 2155 + "optional": true, 2156 + "dependencies": { 2157 + "ms": "^2.1.3" 2158 + }, 2159 + "engines": { 2160 + "node": ">=6.0" 2161 + }, 2162 + "peerDependenciesMeta": { 2163 + "supports-color": { 2164 + "optional": true 2165 + } 2166 + } 2167 + }, 2168 + "node_modules/socks-proxy-agent/node_modules/ms": { 2169 + "version": "2.1.3", 2170 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2171 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2172 + "license": "MIT", 2173 + "optional": true 2174 + }, 2175 + "node_modules/sprintf-js": { 2176 + "version": "1.1.3", 2177 + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 2178 + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", 2179 + "license": "BSD-3-Clause", 2180 + "optional": true 2181 + }, 2182 + "node_modules/sqlite3": { 2183 + "version": "5.1.7", 2184 + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", 2185 + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", 2186 + "hasInstallScript": true, 2187 + "license": "BSD-3-Clause", 2188 + "dependencies": { 2189 + "bindings": "^1.5.0", 2190 + "node-addon-api": "^7.0.0", 2191 + "prebuild-install": "^7.1.1", 2192 + "tar": "^6.1.11" 2193 + }, 2194 + "optionalDependencies": { 2195 + "node-gyp": "8.x" 2196 + }, 2197 + "peerDependencies": { 2198 + "node-gyp": "8.x" 2199 + }, 2200 + "peerDependenciesMeta": { 2201 + "node-gyp": { 2202 + "optional": true 2203 + } 2204 + } 2205 + }, 2206 + "node_modules/ssri": { 2207 + "version": "8.0.1", 2208 + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", 2209 + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", 2210 + "license": "ISC", 2211 + "optional": true, 2212 + "dependencies": { 2213 + "minipass": "^3.1.1" 2214 + }, 2215 + "engines": { 2216 + "node": ">= 8" 2217 + } 2218 + }, 2219 + "node_modules/statuses": { 2220 + "version": "2.0.1", 2221 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2222 + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2223 + "license": "MIT", 2224 + "engines": { 2225 + "node": ">= 0.8" 2226 + } 2227 + }, 2228 + "node_modules/string_decoder": { 2229 + "version": "1.3.0", 2230 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2231 + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2232 + "license": "MIT", 2233 + "dependencies": { 2234 + "safe-buffer": "~5.2.0" 2235 + } 2236 + }, 2237 + "node_modules/string-width": { 2238 + "version": "4.2.3", 2239 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2240 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2241 + "license": "MIT", 2242 + "optional": true, 2243 + "dependencies": { 2244 + "emoji-regex": "^8.0.0", 2245 + "is-fullwidth-code-point": "^3.0.0", 2246 + "strip-ansi": "^6.0.1" 2247 + }, 2248 + "engines": { 2249 + "node": ">=8" 2250 + } 2251 + }, 2252 + "node_modules/strip-ansi": { 2253 + "version": "6.0.1", 2254 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2255 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2256 + "license": "MIT", 2257 + "optional": true, 2258 + "dependencies": { 2259 + "ansi-regex": "^5.0.1" 2260 + }, 2261 + "engines": { 2262 + "node": ">=8" 2263 + } 2264 + }, 2265 + "node_modules/strip-json-comments": { 2266 + "version": "2.0.1", 2267 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2268 + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 2269 + "license": "MIT", 2270 + "engines": { 2271 + "node": ">=0.10.0" 2272 + } 2273 + }, 2274 + "node_modules/tar": { 2275 + "version": "6.2.1", 2276 + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 2277 + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 2278 + "license": "ISC", 2279 + "dependencies": { 2280 + "chownr": "^2.0.0", 2281 + "fs-minipass": "^2.0.0", 2282 + "minipass": "^5.0.0", 2283 + "minizlib": "^2.1.1", 2284 + "mkdirp": "^1.0.3", 2285 + "yallist": "^4.0.0" 2286 + }, 2287 + "engines": { 2288 + "node": ">=10" 2289 + } 2290 + }, 2291 + "node_modules/tar-fs": { 2292 + "version": "2.1.3", 2293 + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", 2294 + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", 2295 + "license": "MIT", 2296 + "dependencies": { 2297 + "chownr": "^1.1.1", 2298 + "mkdirp-classic": "^0.5.2", 2299 + "pump": "^3.0.0", 2300 + "tar-stream": "^2.1.4" 2301 + } 2302 + }, 2303 + "node_modules/tar-fs/node_modules/chownr": { 2304 + "version": "1.1.4", 2305 + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 2306 + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 2307 + "license": "ISC" 2308 + }, 2309 + "node_modules/tar-stream": { 2310 + "version": "2.2.0", 2311 + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 2312 + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 2313 + "license": "MIT", 2314 + "dependencies": { 2315 + "bl": "^4.0.3", 2316 + "end-of-stream": "^1.4.1", 2317 + "fs-constants": "^1.0.0", 2318 + "inherits": "^2.0.3", 2319 + "readable-stream": "^3.1.1" 2320 + }, 2321 + "engines": { 2322 + "node": ">=6" 2323 + } 2324 + }, 2325 + "node_modules/tar/node_modules/minipass": { 2326 + "version": "5.0.0", 2327 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 2328 + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 2329 + "license": "ISC", 2330 + "engines": { 2331 + "node": ">=8" 2332 + } 2333 + }, 2334 + "node_modules/toidentifier": { 2335 + "version": "1.0.1", 2336 + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2337 + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2338 + "license": "MIT", 2339 + "engines": { 2340 + "node": ">=0.6" 2341 + } 2342 + }, 2343 + "node_modules/tunnel-agent": { 2344 + "version": "0.6.0", 2345 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2346 + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 2347 + "license": "Apache-2.0", 2348 + "dependencies": { 2349 + "safe-buffer": "^5.0.1" 2350 + }, 2351 + "engines": { 2352 + "node": "*" 2353 + } 2354 + }, 2355 + "node_modules/type-is": { 2356 + "version": "1.6.18", 2357 + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2358 + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2359 + "license": "MIT", 2360 + "dependencies": { 2361 + "media-typer": "0.3.0", 2362 + "mime-types": "~2.1.24" 2363 + }, 2364 + "engines": { 2365 + "node": ">= 0.6" 2366 + } 2367 + }, 2368 + "node_modules/unique-filename": { 2369 + "version": "1.1.1", 2370 + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 2371 + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 2372 + "license": "ISC", 2373 + "optional": true, 2374 + "dependencies": { 2375 + "unique-slug": "^2.0.0" 2376 + } 2377 + }, 2378 + "node_modules/unique-slug": { 2379 + "version": "2.0.2", 2380 + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", 2381 + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", 2382 + "license": "ISC", 2383 + "optional": true, 2384 + "dependencies": { 2385 + "imurmurhash": "^0.1.4" 2386 + } 2387 + }, 2388 + "node_modules/unpipe": { 2389 + "version": "1.0.0", 2390 + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2391 + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 2392 + "license": "MIT", 2393 + "engines": { 2394 + "node": ">= 0.8" 2395 + } 2396 + }, 2397 + "node_modules/util-deprecate": { 2398 + "version": "1.0.2", 2399 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2400 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2401 + "license": "MIT" 2402 + }, 2403 + "node_modules/utils-merge": { 2404 + "version": "1.0.1", 2405 + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2406 + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 2407 + "license": "MIT", 2408 + "engines": { 2409 + "node": ">= 0.4.0" 2410 + } 2411 + }, 2412 + "node_modules/vary": { 2413 + "version": "1.1.2", 2414 + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2415 + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 2416 + "license": "MIT", 2417 + "engines": { 2418 + "node": ">= 0.8" 2419 + } 2420 + }, 2421 + "node_modules/which": { 2422 + "version": "2.0.2", 2423 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2424 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2425 + "license": "ISC", 2426 + "optional": true, 2427 + "dependencies": { 2428 + "isexe": "^2.0.0" 2429 + }, 2430 + "bin": { 2431 + "node-which": "bin/node-which" 2432 + }, 2433 + "engines": { 2434 + "node": ">= 8" 2435 + } 2436 + }, 2437 + "node_modules/wide-align": { 2438 + "version": "1.1.5", 2439 + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 2440 + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 2441 + "license": "ISC", 2442 + "optional": true, 2443 + "dependencies": { 2444 + "string-width": "^1.0.2 || 2 || 3 || 4" 2445 + } 2446 + }, 2447 + "node_modules/wrappy": { 2448 + "version": "1.0.2", 2449 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2450 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2451 + "license": "ISC" 2452 + }, 2453 + "node_modules/yallist": { 2454 + "version": "4.0.0", 2455 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2456 + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2457 + "license": "ISC" 2458 + } 2459 + } 2460 + }
+20
package.json
··· 1 + { 2 + "name": "bankingmockapi", 3 + "version": "1.0.0", 4 + "main": "index.js", 5 + "scripts": { 6 + "test": "echo \"Error: no test specified\" && exit 1" 7 + }, 8 + "keywords": [], 9 + "author": "", 10 + "license": "ISC", 11 + "description": "", 12 + "dependencies": { 13 + "bcryptjs": "^2.4.3", 14 + "body-parser": "^1.20.2", 15 + "cors": "^2.8.5", 16 + "express": "^4.21.2", 17 + "jsonwebtoken": "^9.0.2", 18 + "sqlite3": "^5.1.6" 19 + } 20 + }
+283
server.js
··· 1 + const express = require("express"); 2 + const jwt = require("jsonwebtoken"); 3 + const bodyParser = require("body-parser"); 4 + const sqlite3 = require("sqlite3").verbose(); 5 + const bcrypt = require("bcryptjs"); 6 + const cors = require("cors"); 7 + 8 + const app = express(); 9 + const SECRET = "supersecretkey"; 10 + const REFRESH_SECRET = "refreshsupersecretkey"; 11 + const TOKEN_EXPIRY = "5m"; 12 + const PORT = process.env.PORT || 3001; 13 + 14 + app.use(cors()); 15 + app.use(bodyParser.json()); 16 + 17 + // SQLite setup 18 + const db = new sqlite3.Database("./data/banking.db"); 19 + 20 + // Seed data 21 + db.serialize(() => { 22 + const username = "test@test.test"; 23 + const password = "password@123"; 24 + 25 + // clear db on every start 26 + db.run("DROP TABLE IF EXISTS users"); 27 + db.run("DROP TABLE IF EXISTS accounts"); 28 + db.run("DROP TABLE IF EXISTS cards"); 29 + db.run("DROP TABLE IF EXISTS transactions"); 30 + 31 + db.run(`CREATE TABLE IF NOT EXISTS users ( 32 + id INTEGER PRIMARY KEY AUTOINCREMENT, 33 + username TEXT UNIQUE, 34 + password TEXT 35 + )`); 36 + db.run(`CREATE TABLE IF NOT EXISTS accounts ( 37 + id INTEGER PRIMARY KEY AUTOINCREMENT, 38 + user_id INTEGER, 39 + name TEXT 40 + )`); 41 + db.run(`CREATE TABLE IF NOT EXISTS cards ( 42 + id INTEGER PRIMARY KEY AUTOINCREMENT, 43 + user_id INTEGER, 44 + number TEXT, 45 + expiry TEXT, 46 + cvv TEXT 47 + )`); 48 + db.run(`CREATE TABLE IF NOT EXISTS transactions ( 49 + id INTEGER PRIMARY KEY AUTOINCREMENT, 50 + user_id INTEGER, 51 + account_id INTEGER, 52 + amount REAL, 53 + type TEXT, 54 + description TEXT, 55 + date TEXT 56 + )`); 57 + 58 + // Insert a test user if not exists 59 + db.get("SELECT * FROM users WHERE username = ?", [username], (err, row) => { 60 + if (!row) { 61 + const hash = bcrypt.hashSync(password, 10); 62 + db.run( 63 + "INSERT INTO users (username, password) VALUES (?, ?)", 64 + [username, hash], 65 + function (err) { 66 + const userId = this.lastID; 67 + // Seed accounts 68 + db.run("INSERT INTO accounts (user_id, name) VALUES (?, ?)", [ 69 + userId, 70 + "Checking", 71 + ]); 72 + db.run("INSERT INTO accounts (user_id, name) VALUES (?, ?)", [ 73 + userId, 74 + "Savings", 75 + ]); 76 + // Seed cards 77 + db.run( 78 + "INSERT INTO cards (user_id, number, expiry, cvv) VALUES (?, ?, ?, ?)", 79 + [userId, "4111111111111111", "12/26", "123"] 80 + ); 81 + db.run( 82 + "INSERT INTO cards (user_id, number, expiry, cvv) VALUES (?, ?, ?, ?)", 83 + [userId, "5500000000000004", "11/25", "456"] 84 + ); 85 + // Seed transactions 86 + db.run( 87 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, -50.25, "debit", "Grocery Store", "2024-06-01T10:00:00Z")', 88 + [userId] 89 + ); 90 + db.run( 91 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, 2000.00, "credit", "Salary", "2024-06-02T09:00:00Z")', 92 + [userId] 93 + ); 94 + db.run( 95 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 2, -100.00, "debit", "Online Shopping", "2024-06-03T15:30:00Z")', 96 + [userId] 97 + ); 98 + db.run( 99 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, -120.00, "debit", "Online Shopping", "2024-06-02T10:00:00Z")', 100 + [userId] 101 + ); 102 + db.run( 103 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, -35.60, "debit", "Restaurant - Italian Bistro", "2024-06-04T19:45:00Z")', 104 + [userId] 105 + ); 106 + db.run( 107 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 2, -75.00, "debit", "Electricity Bill", "2024-06-05T08:00:00Z")', 108 + [userId] 109 + ); 110 + db.run( 111 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, -20.00, "debit", "ATM Withdrawal", "2024-06-06T12:30:00Z")', 112 + [userId] 113 + ); 114 + db.run( 115 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 2, 500.00, "credit", "Transfer from Checking", "2024-06-07T14:00:00Z")', 116 + [userId] 117 + ); 118 + db.run( 119 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, -12.99, "debit", "Coffee Shop", "2024-06-08T09:15:00Z")', 120 + [userId] 121 + ); 122 + db.run( 123 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, -60.00, "debit", "Gas Station", "2024-06-09T17:20:00Z")', 124 + [userId] 125 + ); 126 + db.run( 127 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 2, 100.00, "credit", "Gift Received", "2024-06-10T11:00:00Z")', 128 + [userId] 129 + ); 130 + db.run( 131 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, -45.00, "debit", "Pharmacy", "2024-06-11T16:10:00Z")', 132 + [userId] 133 + ); 134 + db.run( 135 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 2, -150.00, "debit", "Online Subscription", "2024-06-12T07:30:00Z")', 136 + [userId] 137 + ); 138 + db.run( 139 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, -80.00, "debit", "Electronics Store", "2024-06-13T13:50:00Z")', 140 + [userId] 141 + ); 142 + db.run( 143 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 2, 250.00, "credit", "Freelance Payment", "2024-06-14T18:00:00Z")', 144 + [userId] 145 + ); 146 + db.run( 147 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, -22.50, "debit", "Bookstore", "2024-06-15T15:40:00Z")', 148 + [userId] 149 + ); 150 + db.run( 151 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 2, -90.00, "debit", "Water Bill", "2024-06-16T10:00:00Z")', 152 + [userId] 153 + ); 154 + db.run( 155 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 1, -5.75, "debit", "Bakery", "2024-06-17T08:25:00Z")', 156 + [userId] 157 + ); 158 + db.run( 159 + 'INSERT INTO transactions (user_id, account_id, amount, type, description, date) VALUES (?, 2, 300.00, "credit", "Stock Dividend", "2024-06-18T20:00:00Z")', 160 + [userId] 161 + ); 162 + } 163 + ); 164 + } 165 + }); 166 + }); 167 + 168 + function generateToken(user) { 169 + return jwt.sign({ id: user.id, username: user.username }, SECRET, { 170 + expiresIn: TOKEN_EXPIRY, 171 + }); 172 + } 173 + function generateRefreshToken(user) { 174 + return jwt.sign({ id: user.id, username: user.username }, REFRESH_SECRET, { 175 + expiresIn: "7d", 176 + }); 177 + } 178 + 179 + function authenticateToken(req, res, next) { 180 + const authHeader = req.headers["authorization"]; 181 + const token = authHeader && authHeader.split(" ")[1]; 182 + if (!token) return res.sendStatus(401); 183 + jwt.verify(token, SECRET, (err, user) => { 184 + if (err) return res.sendStatus(403); 185 + req.user = user; 186 + next(); 187 + }); 188 + } 189 + 190 + // Auth endpoints 191 + app.post("/login", (req, res) => { 192 + const { username, password } = req.body; 193 + db.get("SELECT * FROM users WHERE username = ?", [username], (err, user) => { 194 + if (!user || !bcrypt.compareSync(password, user.password)) { 195 + return res.status(401).json({ message: "Invalid credentials" }); 196 + } 197 + const token = generateToken(user); 198 + const refreshToken = generateRefreshToken(user); 199 + res.json({ token, refreshToken }); 200 + }); 201 + }); 202 + 203 + app.post("/refresh-token", (req, res) => { 204 + const { refreshToken } = req.body; 205 + if (!refreshToken) return res.sendStatus(401); 206 + jwt.verify(refreshToken, REFRESH_SECRET, (err, user) => { 207 + if (err) return res.sendStatus(403); 208 + const token = generateToken(user); 209 + const refreshToken = generateRefreshToken(user); 210 + 211 + res.json({ token, refreshToken }); 212 + }); 213 + }); 214 + 215 + // Protected endpoints 216 + app.get("/accounts", authenticateToken, (req, res) => { 217 + db.all( 218 + "SELECT * FROM accounts WHERE user_id = ?", 219 + [req.user.id], 220 + (err, accounts) => { 221 + if (err) return res.status(500).json({ error: "DB error" }); 222 + if (!accounts.length) return res.json([]); 223 + // For each account, calculate balance from transactions 224 + const accountIds = accounts.map((acc) => acc.id); 225 + db.all( 226 + `SELECT account_id, SUM(amount) as balance FROM transactions WHERE user_id = ? AND account_id IN (${accountIds 227 + .map(() => "?") 228 + .join(",")}) GROUP BY account_id`, 229 + [req.user.id, ...accountIds], 230 + (err, balances) => { 231 + if (err) return res.status(500).json({ error: "DB error" }); 232 + const balanceMap = {}; 233 + balances.forEach((b) => { 234 + balanceMap[b.account_id] = b.balance || 0; 235 + }); 236 + const result = accounts.map((acc) => ({ 237 + ...acc, 238 + balance: balanceMap[acc.id] || 0, 239 + })); 240 + res.json(result); 241 + } 242 + ); 243 + } 244 + ); 245 + }); 246 + 247 + app.get("/cards", authenticateToken, (req, res) => { 248 + db.all( 249 + "SELECT * FROM cards WHERE user_id = ?", 250 + [req.user.id], 251 + (err, rows) => { 252 + res.json(rows); 253 + } 254 + ); 255 + }); 256 + 257 + // Transactions: search, sort, paginate 258 + app.get("/transactions", authenticateToken, (req, res) => { 259 + const { 260 + search = "", 261 + sort = "date", 262 + order = "desc", 263 + page = 1, 264 + limit = 10, 265 + } = req.query; 266 + const offset = (parseInt(page) - 1) * parseInt(limit); 267 + let query = "SELECT * FROM transactions WHERE user_id = ?"; 268 + let params = [req.user.id]; 269 + if (search.length) { 270 + query += " AND (description LIKE ? OR type LIKE ?)"; 271 + params.push(`%${search}%`, `%${search}%`); 272 + } 273 + query += ` ORDER BY ${sort} ${order.toUpperCase()} LIMIT ? OFFSET ?`; 274 + params.push(parseInt(limit), offset); 275 + db.all(query, params, (err, rows) => { 276 + res.json(rows); 277 + }); 278 + }); 279 + 280 + // Start server 281 + app.listen(PORT, () => { 282 + console.log(`Server running on port ${PORT}`); 283 + });