├── .github └── workflows │ ├── bun.yml │ └── node.js.yml ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src ├── ApiController.ts ├── HttpException.ts ├── api.ts ├── index.ts ├── use.ts └── useApi.ts ├── test ├── ApiController.test.ts ├── HttpException.test.ts ├── api.test.ts ├── index.test.ts ├── pages │ └── api │ │ ├── example.ts │ │ └── example2.ts ├── use.test.ts └── useApi.test.ts └── tsconfig.json /.github/workflows/bun.yml: -------------------------------------------------------------------------------- 1 | name: Bun CI 2 | 3 | on: 4 | push: 5 | branches: [ "main" ] 6 | pull_request: 7 | branches: [ "main" ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v3 16 | - uses: oven-sh/setup-bun@v1 17 | - run: bun install 18 | - run: bun run test:bun 19 | -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ main ] 9 | pull_request: 10 | branches: [ main ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [14.x, 20.x] 20 | 21 | steps: 22 | - uses: actions/checkout@v3 23 | - name: Use Node.js ${{ matrix.node-version }} 24 | uses: actions/setup-node@v3 25 | with: 26 | node-version: ${{ matrix.node-version }} 27 | cache: 'npm' 28 | - run: npm i 29 | - run: npm test 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | dist/ 3 | node_modules/ 4 | *.tgz 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | node_modules/ 3 | test/ 4 | tsconfig.json 5 | *.tgz 6 | .* 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2023 A-yon Lee 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Next-Controller 2 | 3 | Elegant API/MVC controller wrapper for Next.js framework. 4 | 5 | ## Why Using This Package? 6 | 7 | Next.js is an awesome framework, however it provides a primitive way to write 8 | API backend logics via a single function. It's simpler, but headache, we'll have 9 | to write all logics inside one single function, and handing all possible HTTP 10 | request methods, it might not be annoying at first, be it can be a real 11 | drawback when our program becomes big. 12 | 13 | Hence, `next-controller` is meant to solve this problem, it provides an elegant 14 | wrapper that allows us writing our backend code in a more traditional MVC 15 | controller way, and provides straight forward support of middleware, which is 16 | fully compatible with the Express ecosystem, meaning we can use Express 17 | middleware directly in a Next.js program. 18 | 19 | ## Does This Break Old Code? 20 | 21 | No, using this package will not alter any behavior of our existing program, in 22 | fact, it transforms the controller class to act like a regular function at 23 | run-time, but not like a regular function, it's all object-oriented. 24 | 25 | ## Install 26 | 27 | ### NPM 28 | 29 | ```sh 30 | npm i next-controller 31 | ``` 32 | 33 | ## Prerequisite 34 | 35 | - Node.js v14+ 36 | - TypeScript v5+ 37 | - In `tsconfig.json`, set `compilerOptions.module` to `NodeNext`. 38 | 39 | ## Example 40 | 41 | Just like usual, will create a TypeScript file in the `pages/api` directory, but 42 | instead of exporting a default function, we export a default class that extends 43 | the `ApiController` base-class and decorate it with `@api` decorator. 44 | 45 | ```ts 46 | // pages/api/example.ts 47 | import { api, ApiController } from "next-controller"; 48 | 49 | @api 50 | export default class extends ApiController { 51 | /** Handles POST request. */ 52 | async post(body: { foo: string }) { 53 | // The `req` and `res` objects are bound to the controller instance 54 | // once the request come. 55 | const { req, res } = this; 56 | 57 | // To response something back to the client, just return it. 58 | return { 59 | bar: "Hello, " + body.foo 60 | }; 61 | } 62 | 63 | /** Handles GET request. */ 64 | async get(query: { foo: string }) { 65 | // ... All rules are the same as handling a POST request. 66 | return { 67 | bar: "Hello, " + query.bar 68 | }; 69 | } 70 | } 71 | ``` 72 | 73 | Note: actually extends `ApiController` is optional, however if we do, we can use 74 | the `use()` method in the controller, which will be explained in the following 75 | sections. 76 | 77 | ## Method Support 78 | 79 | All major HTTP request methods are supported in the ApiController, but be aware 80 | that their signatures vary. 81 | 82 | ```ts 83 | declare interface ApiController { 84 | delete?(query: object, body?: any, headers?: HeadersInit): Promise; 85 | get?(query: object, headers?: HeadersInit): Promise; 86 | head?(query: object, headers?: HeadersInit): Promise; 87 | options?(query: object, headers?: HeadersInit): Promise; 88 | patch?(query: object, body: any, headers?: HeadersInit): Promise; 89 | post?(body: any, headers?: HeadersInit): Promise; // use `this.req.query` to access the query object if must. 90 | put?(query: object, body: any, headers?: HeadersInit): Promise; 91 | } 92 | ``` 93 | 94 | Note: all these methods are intended to handle corresponding http request types 95 | straight forward, so their signatures only contain those properties that are 96 | absolutely necessary, for other properties, e.g. `params` (and `query` in post), 97 | must be accessed via the `req` object. (*The default Next.js server patches* 98 | *route params directly to the `query` object.*) 99 | 100 | ## Middleware Support 101 | 102 | In a controller, we can use the `use()` method or the `@use` decorator to bind 103 | middleware. 104 | 105 | 1. `use()` 106 | 107 | This method must be used in the constructor of a controller, for example: 108 | 109 | ```ts 110 | import { api, ApiController } from "next-controller"; 111 | import * as expressSession from "express-session"; 112 | 113 | const session = expressSession(); 114 | 115 | @api 116 | export default class extends ApiController { 117 | constructor(req, res) { 118 | super(req, res); 119 | 120 | this.use(session); 121 | 122 | // Unlike traditional express middleware, we can actually wait for 123 | // the execution of the next middleware, and gets its returning value, 124 | // for example: 125 | this.use(async (req, res, next) => { 126 | const returns = await next(); 127 | // ... 128 | }); 129 | } 130 | } 131 | ``` 132 | 133 | 2. `@use` 134 | 135 | This decorator is used directly on the controller method, for example 136 | 137 | ```ts 138 | import { api, ApiController, use } from "next-controller"; 139 | import * as multer from "multer"; 140 | 141 | const upload = multer({ dest: 'uploads/' }); 142 | 143 | @api 144 | export default class extends ApiController { 145 | @use(upload.single("avatar")) 146 | async post(body: object) { 147 | // `this.req.file` will be the `avatar` file. 148 | } 149 | } 150 | ``` 151 | 152 | 153 | Note: the difference between `use()` and `@use` is that the former binds the 154 | middleware to all available methods, and the later only binds to the current 155 | method. If both methods are used, their order are respected as the same order as 156 | the above examples'. Also, the middleware bound by `use()` have access to the 157 | controller instance, which may be useful for some scenarios. 158 | 159 | ## Client-side Support 160 | 161 | We can use the controller class as a type in the client-side code in our Next.js 162 | program if we use the utility function `useApi()`, which provides dedicated 163 | transform of api calls and is well typed for IDE intellisense, for example: 164 | 165 | ```tsx 166 | // pages/example.tsx 167 | import { useState, useEffect } from "react"; 168 | import { useApi } from "next-controller"; 169 | import type ExampleController from "./api/example"; 170 | 171 | export default function Example() { 172 | const {state, setState} = useState<{ bar: string }>(null); 173 | 174 | useEffect(() => { 175 | (async () => { 176 | // `useApi` will automatically append `/api/` prefix to the URL, 177 | // and it will derive the `post()` and the `get()` methods from the 178 | // `ExampleController` class. 179 | const data = await useApi("example").get({ 180 | foo: "World!" 181 | }); 182 | 183 | setState(data); 184 | })(); 185 | }, []); 186 | 187 | return

{state?.bar || "Loading"}

; 188 | } 189 | ``` 190 | 191 | ## HttpException 192 | 193 | If the server responded an HTTP status code that is between `400` - `599`, it is 194 | considered that something went wrong and the request failed, either caused by 195 | the client-side or the server-side, such a situation is represented as an 196 | `HttpException`. 197 | 198 | ### Server-side Usage 199 | 200 | We can directly throw an `HttpException` instance in a controller, and the 201 | framework will automatically report the exception to the client. 202 | 203 | ```ts 204 | // pages/api/example.ts 205 | import { api, ApiController, HttpException } from "next-controller"; 206 | 207 | @api 208 | export default class extends ApiController { 209 | /** Handles POST request. */ 210 | async post(body: { foo: string }) { 211 | const { req, res } = this; 212 | 213 | if (!passCheck(body)) { 214 | throw new HttpException("The request body is unrecognized", 400); 215 | } 216 | 217 | return { 218 | bar: "Hello, " + body.foo 219 | }; 220 | } 221 | } 222 | ``` 223 | 224 | ### Client-side Usage 225 | 226 | We can catch the `HttpException` if using `useApi()` on the client-side. 227 | 228 | ```tsx 229 | // pages/example.tsx 230 | import { useState, useEffect } from "react"; 231 | import { useApi, HttpException } from "next-controller"; 232 | import type ExampleController from "./api/example"; 233 | 234 | export default function Example() { 235 | const {state, setState} = useState<{ bar: string }>(null); 236 | 237 | useEffect(() => { 238 | (async () => { 239 | try { 240 | const data = await useApi("example").post({ 241 | foo: "World!" 242 | }); 243 | 244 | setState(data); 245 | } catch (err) { 246 | if (err instanceof HttpException) { 247 | alert(`${err.message} (code: ${err.code})`); 248 | } else { 249 | // Other than HttpException, there could be other type of 250 | // exceptions during the request, for example, losing 251 | // internet connection. 252 | } 253 | } 254 | })(); 255 | }, []); 256 | 257 | return

{state?.bar || "Loading"}

; 258 | } 259 | ``` 260 | 261 | Note: if the server throw some error other than an HttpException, on the client 262 | side, it will be automatically transferred to an HttpException with code `500`. 263 | 264 | ## Global Catch 265 | 266 | If all the middleware are written with the signature `(req, res, next) => any` 267 | and all the `next()` functions are called with `await`, then we can use the 268 | simple solution to catch errors globally in the controller: 269 | 270 | ```ts 271 | @api 272 | export default class extends ApiController { 273 | constructor(req, res) { 274 | super(req, res); 275 | 276 | this.use(async (req, res, next) => { 277 | try { 278 | await next(); 279 | } catch (err) { 280 | if (!(err instanceof HttpException)) { 281 | console.error(err); 282 | } 283 | } 284 | }); 285 | 286 | this.use(/* other middleware */); 287 | } 288 | } 289 | ``` 290 | 291 | However, sometimes this is not guaranteed, especially when using some middleware 292 | from Express ecosystem. So to catch errors globally, we can instead implement an 293 | `onError()` method in the controller, it will catch any potential error no 294 | matter how the middleware is written. 295 | 296 | ```ts 297 | @api 298 | export default class extends ApiController { 299 | onError(err: any) { 300 | if (!(err instanceof HttpException)) { 301 | console.error(err); 302 | } 303 | } 304 | } 305 | ``` 306 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-controller", 3 | "version": "1.7.4", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "next-controller", 9 | "version": "1.7.4", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@ayonli/jsext": "^0.9.56", 13 | "capture-stack-trace": "^2.1.0", 14 | "js-magic": "^1.4.2", 15 | "qs": "^6.11.2" 16 | }, 17 | "devDependencies": { 18 | "@types/body-parser": "^1.19.0", 19 | "@types/mocha": "^10.0.1", 20 | "@types/node": "^22.1.0", 21 | "@types/node-fetch": "^2.5.8", 22 | "@types/qs": "^6.9.15", 23 | "axios": "^0.21.4", 24 | "body-parser": "^1.19.0", 25 | "mocha": "^10.2.0", 26 | "node-fetch": "^2.7.0", 27 | "ts-node": "^10.9.1", 28 | "tslib": "^2.6.2", 29 | "typescript": "^5.2.2" 30 | } 31 | }, 32 | "node_modules/@ayonli/jsext": { 33 | "version": "0.9.56", 34 | "resolved": "https://registry.npmjs.org/@ayonli/jsext/-/jsext-0.9.56.tgz", 35 | "integrity": "sha512-DKCgKnoqRs09Pd+jOmPIftZKpyrtzYiXxoVNQZMxPy4nGnruCoGECrpQ2Msj94APSmhjG4cQZj0dBaeHGfPOXw==", 36 | "dependencies": { 37 | "iconv-lite": "^0.6.3", 38 | "sudo-prompt": "^9.2.1", 39 | "ws": "^8.17.0" 40 | }, 41 | "engines": { 42 | "node": ">=12.20" 43 | } 44 | }, 45 | "node_modules/@ayonli/jsext/node_modules/iconv-lite": { 46 | "version": "0.6.3", 47 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 48 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 49 | "dependencies": { 50 | "safer-buffer": ">= 2.1.2 < 3.0.0" 51 | }, 52 | "engines": { 53 | "node": ">=0.10.0" 54 | } 55 | }, 56 | "node_modules/@cspotcode/source-map-support": { 57 | "version": "0.8.1", 58 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 59 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 60 | "dev": true, 61 | "dependencies": { 62 | "@jridgewell/trace-mapping": "0.3.9" 63 | }, 64 | "engines": { 65 | "node": ">=12" 66 | } 67 | }, 68 | "node_modules/@jridgewell/resolve-uri": { 69 | "version": "3.1.1", 70 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 71 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 72 | "dev": true, 73 | "engines": { 74 | "node": ">=6.0.0" 75 | } 76 | }, 77 | "node_modules/@jridgewell/sourcemap-codec": { 78 | "version": "1.4.15", 79 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 80 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 81 | "dev": true 82 | }, 83 | "node_modules/@jridgewell/trace-mapping": { 84 | "version": "0.3.9", 85 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 86 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 87 | "dev": true, 88 | "dependencies": { 89 | "@jridgewell/resolve-uri": "^3.0.3", 90 | "@jridgewell/sourcemap-codec": "^1.4.10" 91 | } 92 | }, 93 | "node_modules/@tsconfig/node10": { 94 | "version": "1.0.9", 95 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 96 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 97 | "dev": true 98 | }, 99 | "node_modules/@tsconfig/node12": { 100 | "version": "1.0.11", 101 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 102 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 103 | "dev": true 104 | }, 105 | "node_modules/@tsconfig/node14": { 106 | "version": "1.0.3", 107 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 108 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 109 | "dev": true 110 | }, 111 | "node_modules/@tsconfig/node16": { 112 | "version": "1.0.4", 113 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 114 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 115 | "dev": true 116 | }, 117 | "node_modules/@types/body-parser": { 118 | "version": "1.19.2", 119 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 120 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 121 | "dev": true, 122 | "dependencies": { 123 | "@types/connect": "*", 124 | "@types/node": "*" 125 | } 126 | }, 127 | "node_modules/@types/connect": { 128 | "version": "3.4.35", 129 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 130 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 131 | "dev": true, 132 | "dependencies": { 133 | "@types/node": "*" 134 | } 135 | }, 136 | "node_modules/@types/mocha": { 137 | "version": "10.0.1", 138 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", 139 | "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", 140 | "dev": true 141 | }, 142 | "node_modules/@types/node": { 143 | "version": "22.1.0", 144 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", 145 | "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", 146 | "dev": true, 147 | "dependencies": { 148 | "undici-types": "~6.13.0" 149 | } 150 | }, 151 | "node_modules/@types/node-fetch": { 152 | "version": "2.6.1", 153 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", 154 | "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", 155 | "dev": true, 156 | "dependencies": { 157 | "@types/node": "*", 158 | "form-data": "^3.0.0" 159 | } 160 | }, 161 | "node_modules/@types/qs": { 162 | "version": "6.9.15", 163 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", 164 | "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", 165 | "dev": true 166 | }, 167 | "node_modules/acorn": { 168 | "version": "8.10.0", 169 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 170 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", 171 | "dev": true, 172 | "bin": { 173 | "acorn": "bin/acorn" 174 | }, 175 | "engines": { 176 | "node": ">=0.4.0" 177 | } 178 | }, 179 | "node_modules/acorn-walk": { 180 | "version": "8.2.0", 181 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 182 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 183 | "dev": true, 184 | "engines": { 185 | "node": ">=0.4.0" 186 | } 187 | }, 188 | "node_modules/ansi-colors": { 189 | "version": "4.1.1", 190 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 191 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 192 | "dev": true, 193 | "engines": { 194 | "node": ">=6" 195 | } 196 | }, 197 | "node_modules/ansi-regex": { 198 | "version": "5.0.1", 199 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 200 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 201 | "dev": true, 202 | "engines": { 203 | "node": ">=8" 204 | } 205 | }, 206 | "node_modules/ansi-styles": { 207 | "version": "4.3.0", 208 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 209 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 210 | "dev": true, 211 | "dependencies": { 212 | "color-convert": "^2.0.1" 213 | }, 214 | "engines": { 215 | "node": ">=8" 216 | }, 217 | "funding": { 218 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 219 | } 220 | }, 221 | "node_modules/anymatch": { 222 | "version": "3.1.3", 223 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 224 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 225 | "dev": true, 226 | "dependencies": { 227 | "normalize-path": "^3.0.0", 228 | "picomatch": "^2.0.4" 229 | }, 230 | "engines": { 231 | "node": ">= 8" 232 | } 233 | }, 234 | "node_modules/arg": { 235 | "version": "4.1.3", 236 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 237 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 238 | "dev": true 239 | }, 240 | "node_modules/argparse": { 241 | "version": "2.0.1", 242 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 243 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 244 | "dev": true 245 | }, 246 | "node_modules/asynckit": { 247 | "version": "0.4.0", 248 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 249 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 250 | "dev": true 251 | }, 252 | "node_modules/axios": { 253 | "version": "0.21.4", 254 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", 255 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", 256 | "dev": true, 257 | "dependencies": { 258 | "follow-redirects": "^1.14.0" 259 | } 260 | }, 261 | "node_modules/balanced-match": { 262 | "version": "1.0.2", 263 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 264 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 265 | "dev": true 266 | }, 267 | "node_modules/binary-extensions": { 268 | "version": "2.2.0", 269 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 270 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 271 | "dev": true, 272 | "engines": { 273 | "node": ">=8" 274 | } 275 | }, 276 | "node_modules/body-parser": { 277 | "version": "1.19.2", 278 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", 279 | "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", 280 | "dev": true, 281 | "dependencies": { 282 | "bytes": "3.1.2", 283 | "content-type": "~1.0.4", 284 | "debug": "2.6.9", 285 | "depd": "~1.1.2", 286 | "http-errors": "1.8.1", 287 | "iconv-lite": "0.4.24", 288 | "on-finished": "~2.3.0", 289 | "qs": "6.9.7", 290 | "raw-body": "2.4.3", 291 | "type-is": "~1.6.18" 292 | }, 293 | "engines": { 294 | "node": ">= 0.8" 295 | } 296 | }, 297 | "node_modules/body-parser/node_modules/qs": { 298 | "version": "6.9.7", 299 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", 300 | "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", 301 | "dev": true, 302 | "engines": { 303 | "node": ">=0.6" 304 | }, 305 | "funding": { 306 | "url": "https://github.com/sponsors/ljharb" 307 | } 308 | }, 309 | "node_modules/brace-expansion": { 310 | "version": "2.0.1", 311 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 312 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 313 | "dev": true, 314 | "dependencies": { 315 | "balanced-match": "^1.0.0" 316 | } 317 | }, 318 | "node_modules/braces": { 319 | "version": "3.0.3", 320 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 321 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 322 | "dev": true, 323 | "dependencies": { 324 | "fill-range": "^7.1.1" 325 | }, 326 | "engines": { 327 | "node": ">=8" 328 | } 329 | }, 330 | "node_modules/browser-stdout": { 331 | "version": "1.3.1", 332 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 333 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 334 | "dev": true 335 | }, 336 | "node_modules/bytes": { 337 | "version": "3.1.2", 338 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 339 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 340 | "dev": true, 341 | "engines": { 342 | "node": ">= 0.8" 343 | } 344 | }, 345 | "node_modules/call-bind": { 346 | "version": "1.0.2", 347 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 348 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 349 | "dependencies": { 350 | "function-bind": "^1.1.1", 351 | "get-intrinsic": "^1.0.2" 352 | }, 353 | "funding": { 354 | "url": "https://github.com/sponsors/ljharb" 355 | } 356 | }, 357 | "node_modules/camelcase": { 358 | "version": "6.3.0", 359 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 360 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 361 | "dev": true, 362 | "engines": { 363 | "node": ">=10" 364 | }, 365 | "funding": { 366 | "url": "https://github.com/sponsors/sindresorhus" 367 | } 368 | }, 369 | "node_modules/capture-stack-trace": { 370 | "version": "2.1.0", 371 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-2.1.0.tgz", 372 | "integrity": "sha512-9tB0+L6plgUHqNMCVUJhxVLHlU3Why4IRtG1nBdBGg5UCFOtt+kMH0w5bhnLlDMIMsHbvvsK7zkYjAJsYqfqUw==", 373 | "engines": { 374 | "node": ">=14.16" 375 | }, 376 | "funding": { 377 | "url": "https://github.com/sponsors/sindresorhus" 378 | } 379 | }, 380 | "node_modules/chalk": { 381 | "version": "4.1.2", 382 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 383 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 384 | "dev": true, 385 | "dependencies": { 386 | "ansi-styles": "^4.1.0", 387 | "supports-color": "^7.1.0" 388 | }, 389 | "engines": { 390 | "node": ">=10" 391 | }, 392 | "funding": { 393 | "url": "https://github.com/chalk/chalk?sponsor=1" 394 | } 395 | }, 396 | "node_modules/chalk/node_modules/supports-color": { 397 | "version": "7.2.0", 398 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 399 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 400 | "dev": true, 401 | "dependencies": { 402 | "has-flag": "^4.0.0" 403 | }, 404 | "engines": { 405 | "node": ">=8" 406 | } 407 | }, 408 | "node_modules/chokidar": { 409 | "version": "3.5.3", 410 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 411 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 412 | "dev": true, 413 | "funding": [ 414 | { 415 | "type": "individual", 416 | "url": "https://paulmillr.com/funding/" 417 | } 418 | ], 419 | "dependencies": { 420 | "anymatch": "~3.1.2", 421 | "braces": "~3.0.2", 422 | "glob-parent": "~5.1.2", 423 | "is-binary-path": "~2.1.0", 424 | "is-glob": "~4.0.1", 425 | "normalize-path": "~3.0.0", 426 | "readdirp": "~3.6.0" 427 | }, 428 | "engines": { 429 | "node": ">= 8.10.0" 430 | }, 431 | "optionalDependencies": { 432 | "fsevents": "~2.3.2" 433 | } 434 | }, 435 | "node_modules/cliui": { 436 | "version": "7.0.4", 437 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 438 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 439 | "dev": true, 440 | "dependencies": { 441 | "string-width": "^4.2.0", 442 | "strip-ansi": "^6.0.0", 443 | "wrap-ansi": "^7.0.0" 444 | } 445 | }, 446 | "node_modules/color-convert": { 447 | "version": "2.0.1", 448 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 449 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 450 | "dev": true, 451 | "dependencies": { 452 | "color-name": "~1.1.4" 453 | }, 454 | "engines": { 455 | "node": ">=7.0.0" 456 | } 457 | }, 458 | "node_modules/color-name": { 459 | "version": "1.1.4", 460 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 461 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 462 | "dev": true 463 | }, 464 | "node_modules/combined-stream": { 465 | "version": "1.0.8", 466 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 467 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 468 | "dev": true, 469 | "dependencies": { 470 | "delayed-stream": "~1.0.0" 471 | }, 472 | "engines": { 473 | "node": ">= 0.8" 474 | } 475 | }, 476 | "node_modules/concat-map": { 477 | "version": "0.0.1", 478 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 479 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 480 | "dev": true 481 | }, 482 | "node_modules/content-type": { 483 | "version": "1.0.4", 484 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 485 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 486 | "dev": true, 487 | "engines": { 488 | "node": ">= 0.6" 489 | } 490 | }, 491 | "node_modules/create-require": { 492 | "version": "1.1.1", 493 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 494 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 495 | "dev": true 496 | }, 497 | "node_modules/debug": { 498 | "version": "2.6.9", 499 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 500 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 501 | "dev": true, 502 | "dependencies": { 503 | "ms": "2.0.0" 504 | } 505 | }, 506 | "node_modules/decamelize": { 507 | "version": "4.0.0", 508 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 509 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 510 | "dev": true, 511 | "engines": { 512 | "node": ">=10" 513 | }, 514 | "funding": { 515 | "url": "https://github.com/sponsors/sindresorhus" 516 | } 517 | }, 518 | "node_modules/delayed-stream": { 519 | "version": "1.0.0", 520 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 521 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 522 | "dev": true, 523 | "engines": { 524 | "node": ">=0.4.0" 525 | } 526 | }, 527 | "node_modules/depd": { 528 | "version": "1.1.2", 529 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 530 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 531 | "dev": true, 532 | "engines": { 533 | "node": ">= 0.6" 534 | } 535 | }, 536 | "node_modules/diff": { 537 | "version": "5.0.0", 538 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 539 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 540 | "dev": true, 541 | "engines": { 542 | "node": ">=0.3.1" 543 | } 544 | }, 545 | "node_modules/ee-first": { 546 | "version": "1.1.1", 547 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 548 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", 549 | "dev": true 550 | }, 551 | "node_modules/emoji-regex": { 552 | "version": "8.0.0", 553 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 554 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 555 | "dev": true 556 | }, 557 | "node_modules/escalade": { 558 | "version": "3.1.1", 559 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 560 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 561 | "dev": true, 562 | "engines": { 563 | "node": ">=6" 564 | } 565 | }, 566 | "node_modules/escape-string-regexp": { 567 | "version": "4.0.0", 568 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 569 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 570 | "dev": true, 571 | "engines": { 572 | "node": ">=10" 573 | }, 574 | "funding": { 575 | "url": "https://github.com/sponsors/sindresorhus" 576 | } 577 | }, 578 | "node_modules/fill-range": { 579 | "version": "7.1.1", 580 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 581 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 582 | "dev": true, 583 | "dependencies": { 584 | "to-regex-range": "^5.0.1" 585 | }, 586 | "engines": { 587 | "node": ">=8" 588 | } 589 | }, 590 | "node_modules/find-up": { 591 | "version": "5.0.0", 592 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 593 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 594 | "dev": true, 595 | "dependencies": { 596 | "locate-path": "^6.0.0", 597 | "path-exists": "^4.0.0" 598 | }, 599 | "engines": { 600 | "node": ">=10" 601 | }, 602 | "funding": { 603 | "url": "https://github.com/sponsors/sindresorhus" 604 | } 605 | }, 606 | "node_modules/flat": { 607 | "version": "5.0.2", 608 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 609 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 610 | "dev": true, 611 | "bin": { 612 | "flat": "cli.js" 613 | } 614 | }, 615 | "node_modules/follow-redirects": { 616 | "version": "1.15.6", 617 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 618 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 619 | "dev": true, 620 | "funding": [ 621 | { 622 | "type": "individual", 623 | "url": "https://github.com/sponsors/RubenVerborgh" 624 | } 625 | ], 626 | "engines": { 627 | "node": ">=4.0" 628 | }, 629 | "peerDependenciesMeta": { 630 | "debug": { 631 | "optional": true 632 | } 633 | } 634 | }, 635 | "node_modules/form-data": { 636 | "version": "3.0.1", 637 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 638 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 639 | "dev": true, 640 | "dependencies": { 641 | "asynckit": "^0.4.0", 642 | "combined-stream": "^1.0.8", 643 | "mime-types": "^2.1.12" 644 | }, 645 | "engines": { 646 | "node": ">= 6" 647 | } 648 | }, 649 | "node_modules/fs.realpath": { 650 | "version": "1.0.0", 651 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 652 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 653 | "dev": true 654 | }, 655 | "node_modules/fsevents": { 656 | "version": "2.3.3", 657 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 658 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 659 | "dev": true, 660 | "hasInstallScript": true, 661 | "optional": true, 662 | "os": [ 663 | "darwin" 664 | ], 665 | "engines": { 666 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 667 | } 668 | }, 669 | "node_modules/function-bind": { 670 | "version": "1.1.1", 671 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 672 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 673 | }, 674 | "node_modules/get-caller-file": { 675 | "version": "2.0.5", 676 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 677 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 678 | "dev": true, 679 | "engines": { 680 | "node": "6.* || 8.* || >= 10.*" 681 | } 682 | }, 683 | "node_modules/get-intrinsic": { 684 | "version": "1.1.1", 685 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 686 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 687 | "dependencies": { 688 | "function-bind": "^1.1.1", 689 | "has": "^1.0.3", 690 | "has-symbols": "^1.0.1" 691 | }, 692 | "funding": { 693 | "url": "https://github.com/sponsors/ljharb" 694 | } 695 | }, 696 | "node_modules/glob": { 697 | "version": "7.2.0", 698 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 699 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 700 | "dev": true, 701 | "dependencies": { 702 | "fs.realpath": "^1.0.0", 703 | "inflight": "^1.0.4", 704 | "inherits": "2", 705 | "minimatch": "^3.0.4", 706 | "once": "^1.3.0", 707 | "path-is-absolute": "^1.0.0" 708 | }, 709 | "engines": { 710 | "node": "*" 711 | }, 712 | "funding": { 713 | "url": "https://github.com/sponsors/isaacs" 714 | } 715 | }, 716 | "node_modules/glob-parent": { 717 | "version": "5.1.2", 718 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 719 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 720 | "dev": true, 721 | "dependencies": { 722 | "is-glob": "^4.0.1" 723 | }, 724 | "engines": { 725 | "node": ">= 6" 726 | } 727 | }, 728 | "node_modules/glob/node_modules/brace-expansion": { 729 | "version": "1.1.11", 730 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 731 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 732 | "dev": true, 733 | "dependencies": { 734 | "balanced-match": "^1.0.0", 735 | "concat-map": "0.0.1" 736 | } 737 | }, 738 | "node_modules/glob/node_modules/minimatch": { 739 | "version": "3.1.2", 740 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 741 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 742 | "dev": true, 743 | "dependencies": { 744 | "brace-expansion": "^1.1.7" 745 | }, 746 | "engines": { 747 | "node": "*" 748 | } 749 | }, 750 | "node_modules/has": { 751 | "version": "1.0.3", 752 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 753 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 754 | "dependencies": { 755 | "function-bind": "^1.1.1" 756 | }, 757 | "engines": { 758 | "node": ">= 0.4.0" 759 | } 760 | }, 761 | "node_modules/has-flag": { 762 | "version": "4.0.0", 763 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 764 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 765 | "dev": true, 766 | "engines": { 767 | "node": ">=8" 768 | } 769 | }, 770 | "node_modules/has-symbols": { 771 | "version": "1.0.3", 772 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 773 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 774 | "engines": { 775 | "node": ">= 0.4" 776 | }, 777 | "funding": { 778 | "url": "https://github.com/sponsors/ljharb" 779 | } 780 | }, 781 | "node_modules/he": { 782 | "version": "1.2.0", 783 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 784 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 785 | "dev": true, 786 | "bin": { 787 | "he": "bin/he" 788 | } 789 | }, 790 | "node_modules/http-errors": { 791 | "version": "1.8.1", 792 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 793 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 794 | "dev": true, 795 | "dependencies": { 796 | "depd": "~1.1.2", 797 | "inherits": "2.0.4", 798 | "setprototypeof": "1.2.0", 799 | "statuses": ">= 1.5.0 < 2", 800 | "toidentifier": "1.0.1" 801 | }, 802 | "engines": { 803 | "node": ">= 0.6" 804 | } 805 | }, 806 | "node_modules/iconv-lite": { 807 | "version": "0.4.24", 808 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 809 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 810 | "dev": true, 811 | "dependencies": { 812 | "safer-buffer": ">= 2.1.2 < 3" 813 | }, 814 | "engines": { 815 | "node": ">=0.10.0" 816 | } 817 | }, 818 | "node_modules/inflight": { 819 | "version": "1.0.6", 820 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 821 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 822 | "dev": true, 823 | "dependencies": { 824 | "once": "^1.3.0", 825 | "wrappy": "1" 826 | } 827 | }, 828 | "node_modules/inherits": { 829 | "version": "2.0.4", 830 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 831 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 832 | "dev": true 833 | }, 834 | "node_modules/is-binary-path": { 835 | "version": "2.1.0", 836 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 837 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 838 | "dev": true, 839 | "dependencies": { 840 | "binary-extensions": "^2.0.0" 841 | }, 842 | "engines": { 843 | "node": ">=8" 844 | } 845 | }, 846 | "node_modules/is-extglob": { 847 | "version": "2.1.1", 848 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 849 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 850 | "dev": true, 851 | "engines": { 852 | "node": ">=0.10.0" 853 | } 854 | }, 855 | "node_modules/is-fullwidth-code-point": { 856 | "version": "3.0.0", 857 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 858 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 859 | "dev": true, 860 | "engines": { 861 | "node": ">=8" 862 | } 863 | }, 864 | "node_modules/is-glob": { 865 | "version": "4.0.3", 866 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 867 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 868 | "dev": true, 869 | "dependencies": { 870 | "is-extglob": "^2.1.1" 871 | }, 872 | "engines": { 873 | "node": ">=0.10.0" 874 | } 875 | }, 876 | "node_modules/is-number": { 877 | "version": "7.0.0", 878 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 879 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 880 | "dev": true, 881 | "engines": { 882 | "node": ">=0.12.0" 883 | } 884 | }, 885 | "node_modules/is-plain-obj": { 886 | "version": "2.1.0", 887 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 888 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 889 | "dev": true, 890 | "engines": { 891 | "node": ">=8" 892 | } 893 | }, 894 | "node_modules/is-unicode-supported": { 895 | "version": "0.1.0", 896 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 897 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 898 | "dev": true, 899 | "engines": { 900 | "node": ">=10" 901 | }, 902 | "funding": { 903 | "url": "https://github.com/sponsors/sindresorhus" 904 | } 905 | }, 906 | "node_modules/js-magic": { 907 | "version": "1.4.2", 908 | "resolved": "https://registry.npmjs.org/js-magic/-/js-magic-1.4.2.tgz", 909 | "integrity": "sha512-d6Zu1wj/RlKIrtLfCDVqXyyaDEduw4wP8zcYAbs+qRqqQO0GGRo8f70W0fsqhMBkMrdc4vHMtIZ2pG9AvrgKQA==", 910 | "engines": { 911 | "node": ">=6" 912 | } 913 | }, 914 | "node_modules/js-yaml": { 915 | "version": "4.1.0", 916 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 917 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 918 | "dev": true, 919 | "dependencies": { 920 | "argparse": "^2.0.1" 921 | }, 922 | "bin": { 923 | "js-yaml": "bin/js-yaml.js" 924 | } 925 | }, 926 | "node_modules/locate-path": { 927 | "version": "6.0.0", 928 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 929 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 930 | "dev": true, 931 | "dependencies": { 932 | "p-locate": "^5.0.0" 933 | }, 934 | "engines": { 935 | "node": ">=10" 936 | }, 937 | "funding": { 938 | "url": "https://github.com/sponsors/sindresorhus" 939 | } 940 | }, 941 | "node_modules/log-symbols": { 942 | "version": "4.1.0", 943 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 944 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 945 | "dev": true, 946 | "dependencies": { 947 | "chalk": "^4.1.0", 948 | "is-unicode-supported": "^0.1.0" 949 | }, 950 | "engines": { 951 | "node": ">=10" 952 | }, 953 | "funding": { 954 | "url": "https://github.com/sponsors/sindresorhus" 955 | } 956 | }, 957 | "node_modules/make-error": { 958 | "version": "1.3.6", 959 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 960 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 961 | "dev": true 962 | }, 963 | "node_modules/media-typer": { 964 | "version": "0.3.0", 965 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 966 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 967 | "dev": true, 968 | "engines": { 969 | "node": ">= 0.6" 970 | } 971 | }, 972 | "node_modules/mime-db": { 973 | "version": "1.52.0", 974 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 975 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 976 | "dev": true, 977 | "engines": { 978 | "node": ">= 0.6" 979 | } 980 | }, 981 | "node_modules/mime-types": { 982 | "version": "2.1.35", 983 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 984 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 985 | "dev": true, 986 | "dependencies": { 987 | "mime-db": "1.52.0" 988 | }, 989 | "engines": { 990 | "node": ">= 0.6" 991 | } 992 | }, 993 | "node_modules/minimatch": { 994 | "version": "5.0.1", 995 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 996 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 997 | "dev": true, 998 | "dependencies": { 999 | "brace-expansion": "^2.0.1" 1000 | }, 1001 | "engines": { 1002 | "node": ">=10" 1003 | } 1004 | }, 1005 | "node_modules/mocha": { 1006 | "version": "10.2.0", 1007 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 1008 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 1009 | "dev": true, 1010 | "dependencies": { 1011 | "ansi-colors": "4.1.1", 1012 | "browser-stdout": "1.3.1", 1013 | "chokidar": "3.5.3", 1014 | "debug": "4.3.4", 1015 | "diff": "5.0.0", 1016 | "escape-string-regexp": "4.0.0", 1017 | "find-up": "5.0.0", 1018 | "glob": "7.2.0", 1019 | "he": "1.2.0", 1020 | "js-yaml": "4.1.0", 1021 | "log-symbols": "4.1.0", 1022 | "minimatch": "5.0.1", 1023 | "ms": "2.1.3", 1024 | "nanoid": "3.3.3", 1025 | "serialize-javascript": "6.0.0", 1026 | "strip-json-comments": "3.1.1", 1027 | "supports-color": "8.1.1", 1028 | "workerpool": "6.2.1", 1029 | "yargs": "16.2.0", 1030 | "yargs-parser": "20.2.4", 1031 | "yargs-unparser": "2.0.0" 1032 | }, 1033 | "bin": { 1034 | "_mocha": "bin/_mocha", 1035 | "mocha": "bin/mocha.js" 1036 | }, 1037 | "engines": { 1038 | "node": ">= 14.0.0" 1039 | }, 1040 | "funding": { 1041 | "type": "opencollective", 1042 | "url": "https://opencollective.com/mochajs" 1043 | } 1044 | }, 1045 | "node_modules/mocha/node_modules/debug": { 1046 | "version": "4.3.4", 1047 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1048 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1049 | "dev": true, 1050 | "dependencies": { 1051 | "ms": "2.1.2" 1052 | }, 1053 | "engines": { 1054 | "node": ">=6.0" 1055 | }, 1056 | "peerDependenciesMeta": { 1057 | "supports-color": { 1058 | "optional": true 1059 | } 1060 | } 1061 | }, 1062 | "node_modules/mocha/node_modules/debug/node_modules/ms": { 1063 | "version": "2.1.2", 1064 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1065 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1066 | "dev": true 1067 | }, 1068 | "node_modules/mocha/node_modules/ms": { 1069 | "version": "2.1.3", 1070 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1071 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1072 | "dev": true 1073 | }, 1074 | "node_modules/ms": { 1075 | "version": "2.0.0", 1076 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1077 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1078 | "dev": true 1079 | }, 1080 | "node_modules/nanoid": { 1081 | "version": "3.3.3", 1082 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 1083 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 1084 | "dev": true, 1085 | "bin": { 1086 | "nanoid": "bin/nanoid.cjs" 1087 | }, 1088 | "engines": { 1089 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1090 | } 1091 | }, 1092 | "node_modules/node-fetch": { 1093 | "version": "2.7.0", 1094 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1095 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1096 | "dev": true, 1097 | "dependencies": { 1098 | "whatwg-url": "^5.0.0" 1099 | }, 1100 | "engines": { 1101 | "node": "4.x || >=6.0.0" 1102 | }, 1103 | "peerDependencies": { 1104 | "encoding": "^0.1.0" 1105 | }, 1106 | "peerDependenciesMeta": { 1107 | "encoding": { 1108 | "optional": true 1109 | } 1110 | } 1111 | }, 1112 | "node_modules/normalize-path": { 1113 | "version": "3.0.0", 1114 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1115 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1116 | "dev": true, 1117 | "engines": { 1118 | "node": ">=0.10.0" 1119 | } 1120 | }, 1121 | "node_modules/object-inspect": { 1122 | "version": "1.12.0", 1123 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", 1124 | "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", 1125 | "funding": { 1126 | "url": "https://github.com/sponsors/ljharb" 1127 | } 1128 | }, 1129 | "node_modules/on-finished": { 1130 | "version": "2.3.0", 1131 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1132 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1133 | "dev": true, 1134 | "dependencies": { 1135 | "ee-first": "1.1.1" 1136 | }, 1137 | "engines": { 1138 | "node": ">= 0.8" 1139 | } 1140 | }, 1141 | "node_modules/once": { 1142 | "version": "1.4.0", 1143 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1144 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1145 | "dev": true, 1146 | "dependencies": { 1147 | "wrappy": "1" 1148 | } 1149 | }, 1150 | "node_modules/p-limit": { 1151 | "version": "3.1.0", 1152 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1153 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1154 | "dev": true, 1155 | "dependencies": { 1156 | "yocto-queue": "^0.1.0" 1157 | }, 1158 | "engines": { 1159 | "node": ">=10" 1160 | }, 1161 | "funding": { 1162 | "url": "https://github.com/sponsors/sindresorhus" 1163 | } 1164 | }, 1165 | "node_modules/p-locate": { 1166 | "version": "5.0.0", 1167 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1168 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1169 | "dev": true, 1170 | "dependencies": { 1171 | "p-limit": "^3.0.2" 1172 | }, 1173 | "engines": { 1174 | "node": ">=10" 1175 | }, 1176 | "funding": { 1177 | "url": "https://github.com/sponsors/sindresorhus" 1178 | } 1179 | }, 1180 | "node_modules/path-exists": { 1181 | "version": "4.0.0", 1182 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1183 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1184 | "dev": true, 1185 | "engines": { 1186 | "node": ">=8" 1187 | } 1188 | }, 1189 | "node_modules/path-is-absolute": { 1190 | "version": "1.0.1", 1191 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1192 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1193 | "dev": true, 1194 | "engines": { 1195 | "node": ">=0.10.0" 1196 | } 1197 | }, 1198 | "node_modules/picomatch": { 1199 | "version": "2.3.1", 1200 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1201 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1202 | "dev": true, 1203 | "engines": { 1204 | "node": ">=8.6" 1205 | }, 1206 | "funding": { 1207 | "url": "https://github.com/sponsors/jonschlinkert" 1208 | } 1209 | }, 1210 | "node_modules/qs": { 1211 | "version": "6.11.2", 1212 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", 1213 | "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", 1214 | "dependencies": { 1215 | "side-channel": "^1.0.4" 1216 | }, 1217 | "engines": { 1218 | "node": ">=0.6" 1219 | }, 1220 | "funding": { 1221 | "url": "https://github.com/sponsors/ljharb" 1222 | } 1223 | }, 1224 | "node_modules/randombytes": { 1225 | "version": "2.1.0", 1226 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1227 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1228 | "dev": true, 1229 | "dependencies": { 1230 | "safe-buffer": "^5.1.0" 1231 | } 1232 | }, 1233 | "node_modules/raw-body": { 1234 | "version": "2.4.3", 1235 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", 1236 | "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", 1237 | "dev": true, 1238 | "dependencies": { 1239 | "bytes": "3.1.2", 1240 | "http-errors": "1.8.1", 1241 | "iconv-lite": "0.4.24", 1242 | "unpipe": "1.0.0" 1243 | }, 1244 | "engines": { 1245 | "node": ">= 0.8" 1246 | } 1247 | }, 1248 | "node_modules/readdirp": { 1249 | "version": "3.6.0", 1250 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1251 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1252 | "dev": true, 1253 | "dependencies": { 1254 | "picomatch": "^2.2.1" 1255 | }, 1256 | "engines": { 1257 | "node": ">=8.10.0" 1258 | } 1259 | }, 1260 | "node_modules/require-directory": { 1261 | "version": "2.1.1", 1262 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1263 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1264 | "dev": true, 1265 | "engines": { 1266 | "node": ">=0.10.0" 1267 | } 1268 | }, 1269 | "node_modules/safe-buffer": { 1270 | "version": "5.2.1", 1271 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1272 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1273 | "dev": true, 1274 | "funding": [ 1275 | { 1276 | "type": "github", 1277 | "url": "https://github.com/sponsors/feross" 1278 | }, 1279 | { 1280 | "type": "patreon", 1281 | "url": "https://www.patreon.com/feross" 1282 | }, 1283 | { 1284 | "type": "consulting", 1285 | "url": "https://feross.org/support" 1286 | } 1287 | ] 1288 | }, 1289 | "node_modules/safer-buffer": { 1290 | "version": "2.1.2", 1291 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1292 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1293 | }, 1294 | "node_modules/serialize-javascript": { 1295 | "version": "6.0.0", 1296 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1297 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1298 | "dev": true, 1299 | "dependencies": { 1300 | "randombytes": "^2.1.0" 1301 | } 1302 | }, 1303 | "node_modules/setprototypeof": { 1304 | "version": "1.2.0", 1305 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1306 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1307 | "dev": true 1308 | }, 1309 | "node_modules/side-channel": { 1310 | "version": "1.0.4", 1311 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1312 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1313 | "dependencies": { 1314 | "call-bind": "^1.0.0", 1315 | "get-intrinsic": "^1.0.2", 1316 | "object-inspect": "^1.9.0" 1317 | }, 1318 | "funding": { 1319 | "url": "https://github.com/sponsors/ljharb" 1320 | } 1321 | }, 1322 | "node_modules/statuses": { 1323 | "version": "1.5.0", 1324 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1325 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 1326 | "dev": true, 1327 | "engines": { 1328 | "node": ">= 0.6" 1329 | } 1330 | }, 1331 | "node_modules/string-width": { 1332 | "version": "4.2.3", 1333 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1334 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1335 | "dev": true, 1336 | "dependencies": { 1337 | "emoji-regex": "^8.0.0", 1338 | "is-fullwidth-code-point": "^3.0.0", 1339 | "strip-ansi": "^6.0.1" 1340 | }, 1341 | "engines": { 1342 | "node": ">=8" 1343 | } 1344 | }, 1345 | "node_modules/strip-ansi": { 1346 | "version": "6.0.1", 1347 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1348 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1349 | "dev": true, 1350 | "dependencies": { 1351 | "ansi-regex": "^5.0.1" 1352 | }, 1353 | "engines": { 1354 | "node": ">=8" 1355 | } 1356 | }, 1357 | "node_modules/strip-json-comments": { 1358 | "version": "3.1.1", 1359 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1360 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1361 | "dev": true, 1362 | "engines": { 1363 | "node": ">=8" 1364 | }, 1365 | "funding": { 1366 | "url": "https://github.com/sponsors/sindresorhus" 1367 | } 1368 | }, 1369 | "node_modules/sudo-prompt": { 1370 | "version": "9.2.1", 1371 | "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", 1372 | "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" 1373 | }, 1374 | "node_modules/supports-color": { 1375 | "version": "8.1.1", 1376 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1377 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1378 | "dev": true, 1379 | "dependencies": { 1380 | "has-flag": "^4.0.0" 1381 | }, 1382 | "engines": { 1383 | "node": ">=10" 1384 | }, 1385 | "funding": { 1386 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1387 | } 1388 | }, 1389 | "node_modules/to-regex-range": { 1390 | "version": "5.0.1", 1391 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1392 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1393 | "dev": true, 1394 | "dependencies": { 1395 | "is-number": "^7.0.0" 1396 | }, 1397 | "engines": { 1398 | "node": ">=8.0" 1399 | } 1400 | }, 1401 | "node_modules/toidentifier": { 1402 | "version": "1.0.1", 1403 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1404 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1405 | "dev": true, 1406 | "engines": { 1407 | "node": ">=0.6" 1408 | } 1409 | }, 1410 | "node_modules/tr46": { 1411 | "version": "0.0.3", 1412 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1413 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", 1414 | "dev": true 1415 | }, 1416 | "node_modules/ts-node": { 1417 | "version": "10.9.1", 1418 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 1419 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 1420 | "dev": true, 1421 | "dependencies": { 1422 | "@cspotcode/source-map-support": "^0.8.0", 1423 | "@tsconfig/node10": "^1.0.7", 1424 | "@tsconfig/node12": "^1.0.7", 1425 | "@tsconfig/node14": "^1.0.0", 1426 | "@tsconfig/node16": "^1.0.2", 1427 | "acorn": "^8.4.1", 1428 | "acorn-walk": "^8.1.1", 1429 | "arg": "^4.1.0", 1430 | "create-require": "^1.1.0", 1431 | "diff": "^4.0.1", 1432 | "make-error": "^1.1.1", 1433 | "v8-compile-cache-lib": "^3.0.1", 1434 | "yn": "3.1.1" 1435 | }, 1436 | "bin": { 1437 | "ts-node": "dist/bin.js", 1438 | "ts-node-cwd": "dist/bin-cwd.js", 1439 | "ts-node-esm": "dist/bin-esm.js", 1440 | "ts-node-script": "dist/bin-script.js", 1441 | "ts-node-transpile-only": "dist/bin-transpile.js", 1442 | "ts-script": "dist/bin-script-deprecated.js" 1443 | }, 1444 | "peerDependencies": { 1445 | "@swc/core": ">=1.2.50", 1446 | "@swc/wasm": ">=1.2.50", 1447 | "@types/node": "*", 1448 | "typescript": ">=2.7" 1449 | }, 1450 | "peerDependenciesMeta": { 1451 | "@swc/core": { 1452 | "optional": true 1453 | }, 1454 | "@swc/wasm": { 1455 | "optional": true 1456 | } 1457 | } 1458 | }, 1459 | "node_modules/ts-node/node_modules/diff": { 1460 | "version": "4.0.2", 1461 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1462 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1463 | "dev": true, 1464 | "engines": { 1465 | "node": ">=0.3.1" 1466 | } 1467 | }, 1468 | "node_modules/tslib": { 1469 | "version": "2.6.2", 1470 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 1471 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", 1472 | "dev": true 1473 | }, 1474 | "node_modules/type-is": { 1475 | "version": "1.6.18", 1476 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1477 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1478 | "dev": true, 1479 | "dependencies": { 1480 | "media-typer": "0.3.0", 1481 | "mime-types": "~2.1.24" 1482 | }, 1483 | "engines": { 1484 | "node": ">= 0.6" 1485 | } 1486 | }, 1487 | "node_modules/typescript": { 1488 | "version": "5.2.2", 1489 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", 1490 | "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", 1491 | "dev": true, 1492 | "bin": { 1493 | "tsc": "bin/tsc", 1494 | "tsserver": "bin/tsserver" 1495 | }, 1496 | "engines": { 1497 | "node": ">=14.17" 1498 | } 1499 | }, 1500 | "node_modules/undici-types": { 1501 | "version": "6.13.0", 1502 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", 1503 | "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", 1504 | "dev": true 1505 | }, 1506 | "node_modules/unpipe": { 1507 | "version": "1.0.0", 1508 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1509 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 1510 | "dev": true, 1511 | "engines": { 1512 | "node": ">= 0.8" 1513 | } 1514 | }, 1515 | "node_modules/v8-compile-cache-lib": { 1516 | "version": "3.0.1", 1517 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 1518 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 1519 | "dev": true 1520 | }, 1521 | "node_modules/webidl-conversions": { 1522 | "version": "3.0.1", 1523 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1524 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", 1525 | "dev": true 1526 | }, 1527 | "node_modules/whatwg-url": { 1528 | "version": "5.0.0", 1529 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1530 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 1531 | "dev": true, 1532 | "dependencies": { 1533 | "tr46": "~0.0.3", 1534 | "webidl-conversions": "^3.0.0" 1535 | } 1536 | }, 1537 | "node_modules/workerpool": { 1538 | "version": "6.2.1", 1539 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 1540 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 1541 | "dev": true 1542 | }, 1543 | "node_modules/wrap-ansi": { 1544 | "version": "7.0.0", 1545 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1546 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1547 | "dev": true, 1548 | "dependencies": { 1549 | "ansi-styles": "^4.0.0", 1550 | "string-width": "^4.1.0", 1551 | "strip-ansi": "^6.0.0" 1552 | }, 1553 | "engines": { 1554 | "node": ">=10" 1555 | }, 1556 | "funding": { 1557 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1558 | } 1559 | }, 1560 | "node_modules/wrappy": { 1561 | "version": "1.0.2", 1562 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1563 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1564 | "dev": true 1565 | }, 1566 | "node_modules/ws": { 1567 | "version": "8.18.0", 1568 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 1569 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 1570 | "engines": { 1571 | "node": ">=10.0.0" 1572 | }, 1573 | "peerDependencies": { 1574 | "bufferutil": "^4.0.1", 1575 | "utf-8-validate": ">=5.0.2" 1576 | }, 1577 | "peerDependenciesMeta": { 1578 | "bufferutil": { 1579 | "optional": true 1580 | }, 1581 | "utf-8-validate": { 1582 | "optional": true 1583 | } 1584 | } 1585 | }, 1586 | "node_modules/y18n": { 1587 | "version": "5.0.8", 1588 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1589 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1590 | "dev": true, 1591 | "engines": { 1592 | "node": ">=10" 1593 | } 1594 | }, 1595 | "node_modules/yargs": { 1596 | "version": "16.2.0", 1597 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1598 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1599 | "dev": true, 1600 | "dependencies": { 1601 | "cliui": "^7.0.2", 1602 | "escalade": "^3.1.1", 1603 | "get-caller-file": "^2.0.5", 1604 | "require-directory": "^2.1.1", 1605 | "string-width": "^4.2.0", 1606 | "y18n": "^5.0.5", 1607 | "yargs-parser": "^20.2.2" 1608 | }, 1609 | "engines": { 1610 | "node": ">=10" 1611 | } 1612 | }, 1613 | "node_modules/yargs-parser": { 1614 | "version": "20.2.4", 1615 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1616 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1617 | "dev": true, 1618 | "engines": { 1619 | "node": ">=10" 1620 | } 1621 | }, 1622 | "node_modules/yargs-unparser": { 1623 | "version": "2.0.0", 1624 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1625 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1626 | "dev": true, 1627 | "dependencies": { 1628 | "camelcase": "^6.0.0", 1629 | "decamelize": "^4.0.0", 1630 | "flat": "^5.0.2", 1631 | "is-plain-obj": "^2.1.0" 1632 | }, 1633 | "engines": { 1634 | "node": ">=10" 1635 | } 1636 | }, 1637 | "node_modules/yn": { 1638 | "version": "3.1.1", 1639 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1640 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1641 | "dev": true, 1642 | "engines": { 1643 | "node": ">=6" 1644 | } 1645 | }, 1646 | "node_modules/yocto-queue": { 1647 | "version": "0.1.0", 1648 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1649 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1650 | "dev": true, 1651 | "engines": { 1652 | "node": ">=10" 1653 | }, 1654 | "funding": { 1655 | "url": "https://github.com/sponsors/sindresorhus" 1656 | } 1657 | } 1658 | }, 1659 | "dependencies": { 1660 | "@ayonli/jsext": { 1661 | "version": "0.9.56", 1662 | "resolved": "https://registry.npmjs.org/@ayonli/jsext/-/jsext-0.9.56.tgz", 1663 | "integrity": "sha512-DKCgKnoqRs09Pd+jOmPIftZKpyrtzYiXxoVNQZMxPy4nGnruCoGECrpQ2Msj94APSmhjG4cQZj0dBaeHGfPOXw==", 1664 | "requires": { 1665 | "iconv-lite": "^0.6.3", 1666 | "sudo-prompt": "^9.2.1", 1667 | "ws": "^8.17.0" 1668 | }, 1669 | "dependencies": { 1670 | "iconv-lite": { 1671 | "version": "0.6.3", 1672 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1673 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1674 | "requires": { 1675 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1676 | } 1677 | } 1678 | } 1679 | }, 1680 | "@cspotcode/source-map-support": { 1681 | "version": "0.8.1", 1682 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 1683 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 1684 | "dev": true, 1685 | "requires": { 1686 | "@jridgewell/trace-mapping": "0.3.9" 1687 | } 1688 | }, 1689 | "@jridgewell/resolve-uri": { 1690 | "version": "3.1.1", 1691 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 1692 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 1693 | "dev": true 1694 | }, 1695 | "@jridgewell/sourcemap-codec": { 1696 | "version": "1.4.15", 1697 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 1698 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 1699 | "dev": true 1700 | }, 1701 | "@jridgewell/trace-mapping": { 1702 | "version": "0.3.9", 1703 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 1704 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 1705 | "dev": true, 1706 | "requires": { 1707 | "@jridgewell/resolve-uri": "^3.0.3", 1708 | "@jridgewell/sourcemap-codec": "^1.4.10" 1709 | } 1710 | }, 1711 | "@tsconfig/node10": { 1712 | "version": "1.0.9", 1713 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 1714 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 1715 | "dev": true 1716 | }, 1717 | "@tsconfig/node12": { 1718 | "version": "1.0.11", 1719 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 1720 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 1721 | "dev": true 1722 | }, 1723 | "@tsconfig/node14": { 1724 | "version": "1.0.3", 1725 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 1726 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 1727 | "dev": true 1728 | }, 1729 | "@tsconfig/node16": { 1730 | "version": "1.0.4", 1731 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 1732 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 1733 | "dev": true 1734 | }, 1735 | "@types/body-parser": { 1736 | "version": "1.19.2", 1737 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 1738 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 1739 | "dev": true, 1740 | "requires": { 1741 | "@types/connect": "*", 1742 | "@types/node": "*" 1743 | } 1744 | }, 1745 | "@types/connect": { 1746 | "version": "3.4.35", 1747 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 1748 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 1749 | "dev": true, 1750 | "requires": { 1751 | "@types/node": "*" 1752 | } 1753 | }, 1754 | "@types/mocha": { 1755 | "version": "10.0.1", 1756 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", 1757 | "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", 1758 | "dev": true 1759 | }, 1760 | "@types/node": { 1761 | "version": "22.1.0", 1762 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", 1763 | "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", 1764 | "dev": true, 1765 | "requires": { 1766 | "undici-types": "~6.13.0" 1767 | } 1768 | }, 1769 | "@types/node-fetch": { 1770 | "version": "2.6.1", 1771 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", 1772 | "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", 1773 | "dev": true, 1774 | "requires": { 1775 | "@types/node": "*", 1776 | "form-data": "^3.0.0" 1777 | } 1778 | }, 1779 | "@types/qs": { 1780 | "version": "6.9.15", 1781 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", 1782 | "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", 1783 | "dev": true 1784 | }, 1785 | "acorn": { 1786 | "version": "8.10.0", 1787 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 1788 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", 1789 | "dev": true 1790 | }, 1791 | "acorn-walk": { 1792 | "version": "8.2.0", 1793 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 1794 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 1795 | "dev": true 1796 | }, 1797 | "ansi-colors": { 1798 | "version": "4.1.1", 1799 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 1800 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 1801 | "dev": true 1802 | }, 1803 | "ansi-regex": { 1804 | "version": "5.0.1", 1805 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1806 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1807 | "dev": true 1808 | }, 1809 | "ansi-styles": { 1810 | "version": "4.3.0", 1811 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1812 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1813 | "dev": true, 1814 | "requires": { 1815 | "color-convert": "^2.0.1" 1816 | } 1817 | }, 1818 | "anymatch": { 1819 | "version": "3.1.3", 1820 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1821 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1822 | "dev": true, 1823 | "requires": { 1824 | "normalize-path": "^3.0.0", 1825 | "picomatch": "^2.0.4" 1826 | } 1827 | }, 1828 | "arg": { 1829 | "version": "4.1.3", 1830 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 1831 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 1832 | "dev": true 1833 | }, 1834 | "argparse": { 1835 | "version": "2.0.1", 1836 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1837 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1838 | "dev": true 1839 | }, 1840 | "asynckit": { 1841 | "version": "0.4.0", 1842 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1843 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 1844 | "dev": true 1845 | }, 1846 | "axios": { 1847 | "version": "0.21.4", 1848 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", 1849 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", 1850 | "dev": true, 1851 | "requires": { 1852 | "follow-redirects": "^1.14.0" 1853 | } 1854 | }, 1855 | "balanced-match": { 1856 | "version": "1.0.2", 1857 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1858 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1859 | "dev": true 1860 | }, 1861 | "binary-extensions": { 1862 | "version": "2.2.0", 1863 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1864 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1865 | "dev": true 1866 | }, 1867 | "body-parser": { 1868 | "version": "1.19.2", 1869 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", 1870 | "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", 1871 | "dev": true, 1872 | "requires": { 1873 | "bytes": "3.1.2", 1874 | "content-type": "~1.0.4", 1875 | "debug": "2.6.9", 1876 | "depd": "~1.1.2", 1877 | "http-errors": "1.8.1", 1878 | "iconv-lite": "0.4.24", 1879 | "on-finished": "~2.3.0", 1880 | "qs": "6.9.7", 1881 | "raw-body": "2.4.3", 1882 | "type-is": "~1.6.18" 1883 | }, 1884 | "dependencies": { 1885 | "qs": { 1886 | "version": "6.9.7", 1887 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", 1888 | "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", 1889 | "dev": true 1890 | } 1891 | } 1892 | }, 1893 | "brace-expansion": { 1894 | "version": "2.0.1", 1895 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1896 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1897 | "dev": true, 1898 | "requires": { 1899 | "balanced-match": "^1.0.0" 1900 | } 1901 | }, 1902 | "braces": { 1903 | "version": "3.0.3", 1904 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1905 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1906 | "dev": true, 1907 | "requires": { 1908 | "fill-range": "^7.1.1" 1909 | } 1910 | }, 1911 | "browser-stdout": { 1912 | "version": "1.3.1", 1913 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 1914 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 1915 | "dev": true 1916 | }, 1917 | "bytes": { 1918 | "version": "3.1.2", 1919 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1920 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 1921 | "dev": true 1922 | }, 1923 | "call-bind": { 1924 | "version": "1.0.2", 1925 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1926 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1927 | "requires": { 1928 | "function-bind": "^1.1.1", 1929 | "get-intrinsic": "^1.0.2" 1930 | } 1931 | }, 1932 | "camelcase": { 1933 | "version": "6.3.0", 1934 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 1935 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 1936 | "dev": true 1937 | }, 1938 | "capture-stack-trace": { 1939 | "version": "2.1.0", 1940 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-2.1.0.tgz", 1941 | "integrity": "sha512-9tB0+L6plgUHqNMCVUJhxVLHlU3Why4IRtG1nBdBGg5UCFOtt+kMH0w5bhnLlDMIMsHbvvsK7zkYjAJsYqfqUw==" 1942 | }, 1943 | "chalk": { 1944 | "version": "4.1.2", 1945 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1946 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1947 | "dev": true, 1948 | "requires": { 1949 | "ansi-styles": "^4.1.0", 1950 | "supports-color": "^7.1.0" 1951 | }, 1952 | "dependencies": { 1953 | "supports-color": { 1954 | "version": "7.2.0", 1955 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1956 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1957 | "dev": true, 1958 | "requires": { 1959 | "has-flag": "^4.0.0" 1960 | } 1961 | } 1962 | } 1963 | }, 1964 | "chokidar": { 1965 | "version": "3.5.3", 1966 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1967 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1968 | "dev": true, 1969 | "requires": { 1970 | "anymatch": "~3.1.2", 1971 | "braces": "~3.0.2", 1972 | "fsevents": "~2.3.2", 1973 | "glob-parent": "~5.1.2", 1974 | "is-binary-path": "~2.1.0", 1975 | "is-glob": "~4.0.1", 1976 | "normalize-path": "~3.0.0", 1977 | "readdirp": "~3.6.0" 1978 | } 1979 | }, 1980 | "cliui": { 1981 | "version": "7.0.4", 1982 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1983 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1984 | "dev": true, 1985 | "requires": { 1986 | "string-width": "^4.2.0", 1987 | "strip-ansi": "^6.0.0", 1988 | "wrap-ansi": "^7.0.0" 1989 | } 1990 | }, 1991 | "color-convert": { 1992 | "version": "2.0.1", 1993 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1994 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1995 | "dev": true, 1996 | "requires": { 1997 | "color-name": "~1.1.4" 1998 | } 1999 | }, 2000 | "color-name": { 2001 | "version": "1.1.4", 2002 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2003 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2004 | "dev": true 2005 | }, 2006 | "combined-stream": { 2007 | "version": "1.0.8", 2008 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 2009 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 2010 | "dev": true, 2011 | "requires": { 2012 | "delayed-stream": "~1.0.0" 2013 | } 2014 | }, 2015 | "concat-map": { 2016 | "version": "0.0.1", 2017 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2018 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 2019 | "dev": true 2020 | }, 2021 | "content-type": { 2022 | "version": "1.0.4", 2023 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 2024 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 2025 | "dev": true 2026 | }, 2027 | "create-require": { 2028 | "version": "1.1.1", 2029 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 2030 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 2031 | "dev": true 2032 | }, 2033 | "debug": { 2034 | "version": "2.6.9", 2035 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2036 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2037 | "dev": true, 2038 | "requires": { 2039 | "ms": "2.0.0" 2040 | } 2041 | }, 2042 | "decamelize": { 2043 | "version": "4.0.0", 2044 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 2045 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 2046 | "dev": true 2047 | }, 2048 | "delayed-stream": { 2049 | "version": "1.0.0", 2050 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 2051 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 2052 | "dev": true 2053 | }, 2054 | "depd": { 2055 | "version": "1.1.2", 2056 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 2057 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 2058 | "dev": true 2059 | }, 2060 | "diff": { 2061 | "version": "5.0.0", 2062 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 2063 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 2064 | "dev": true 2065 | }, 2066 | "ee-first": { 2067 | "version": "1.1.1", 2068 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 2069 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", 2070 | "dev": true 2071 | }, 2072 | "emoji-regex": { 2073 | "version": "8.0.0", 2074 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2075 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2076 | "dev": true 2077 | }, 2078 | "escalade": { 2079 | "version": "3.1.1", 2080 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2081 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 2082 | "dev": true 2083 | }, 2084 | "escape-string-regexp": { 2085 | "version": "4.0.0", 2086 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2087 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2088 | "dev": true 2089 | }, 2090 | "fill-range": { 2091 | "version": "7.1.1", 2092 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 2093 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2094 | "dev": true, 2095 | "requires": { 2096 | "to-regex-range": "^5.0.1" 2097 | } 2098 | }, 2099 | "find-up": { 2100 | "version": "5.0.0", 2101 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2102 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2103 | "dev": true, 2104 | "requires": { 2105 | "locate-path": "^6.0.0", 2106 | "path-exists": "^4.0.0" 2107 | } 2108 | }, 2109 | "flat": { 2110 | "version": "5.0.2", 2111 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 2112 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 2113 | "dev": true 2114 | }, 2115 | "follow-redirects": { 2116 | "version": "1.15.6", 2117 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 2118 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 2119 | "dev": true 2120 | }, 2121 | "form-data": { 2122 | "version": "3.0.1", 2123 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 2124 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 2125 | "dev": true, 2126 | "requires": { 2127 | "asynckit": "^0.4.0", 2128 | "combined-stream": "^1.0.8", 2129 | "mime-types": "^2.1.12" 2130 | } 2131 | }, 2132 | "fs.realpath": { 2133 | "version": "1.0.0", 2134 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2135 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 2136 | "dev": true 2137 | }, 2138 | "fsevents": { 2139 | "version": "2.3.3", 2140 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2141 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2142 | "dev": true, 2143 | "optional": true 2144 | }, 2145 | "function-bind": { 2146 | "version": "1.1.1", 2147 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2148 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 2149 | }, 2150 | "get-caller-file": { 2151 | "version": "2.0.5", 2152 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 2153 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 2154 | "dev": true 2155 | }, 2156 | "get-intrinsic": { 2157 | "version": "1.1.1", 2158 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 2159 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 2160 | "requires": { 2161 | "function-bind": "^1.1.1", 2162 | "has": "^1.0.3", 2163 | "has-symbols": "^1.0.1" 2164 | } 2165 | }, 2166 | "glob": { 2167 | "version": "7.2.0", 2168 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2169 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2170 | "dev": true, 2171 | "requires": { 2172 | "fs.realpath": "^1.0.0", 2173 | "inflight": "^1.0.4", 2174 | "inherits": "2", 2175 | "minimatch": "^3.0.4", 2176 | "once": "^1.3.0", 2177 | "path-is-absolute": "^1.0.0" 2178 | }, 2179 | "dependencies": { 2180 | "brace-expansion": { 2181 | "version": "1.1.11", 2182 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2183 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2184 | "dev": true, 2185 | "requires": { 2186 | "balanced-match": "^1.0.0", 2187 | "concat-map": "0.0.1" 2188 | } 2189 | }, 2190 | "minimatch": { 2191 | "version": "3.1.2", 2192 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2193 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2194 | "dev": true, 2195 | "requires": { 2196 | "brace-expansion": "^1.1.7" 2197 | } 2198 | } 2199 | } 2200 | }, 2201 | "glob-parent": { 2202 | "version": "5.1.2", 2203 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2204 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2205 | "dev": true, 2206 | "requires": { 2207 | "is-glob": "^4.0.1" 2208 | } 2209 | }, 2210 | "has": { 2211 | "version": "1.0.3", 2212 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2213 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2214 | "requires": { 2215 | "function-bind": "^1.1.1" 2216 | } 2217 | }, 2218 | "has-flag": { 2219 | "version": "4.0.0", 2220 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2221 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2222 | "dev": true 2223 | }, 2224 | "has-symbols": { 2225 | "version": "1.0.3", 2226 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 2227 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 2228 | }, 2229 | "he": { 2230 | "version": "1.2.0", 2231 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 2232 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 2233 | "dev": true 2234 | }, 2235 | "http-errors": { 2236 | "version": "1.8.1", 2237 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 2238 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 2239 | "dev": true, 2240 | "requires": { 2241 | "depd": "~1.1.2", 2242 | "inherits": "2.0.4", 2243 | "setprototypeof": "1.2.0", 2244 | "statuses": ">= 1.5.0 < 2", 2245 | "toidentifier": "1.0.1" 2246 | } 2247 | }, 2248 | "iconv-lite": { 2249 | "version": "0.4.24", 2250 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2251 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2252 | "dev": true, 2253 | "requires": { 2254 | "safer-buffer": ">= 2.1.2 < 3" 2255 | } 2256 | }, 2257 | "inflight": { 2258 | "version": "1.0.6", 2259 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2260 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2261 | "dev": true, 2262 | "requires": { 2263 | "once": "^1.3.0", 2264 | "wrappy": "1" 2265 | } 2266 | }, 2267 | "inherits": { 2268 | "version": "2.0.4", 2269 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2270 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2271 | "dev": true 2272 | }, 2273 | "is-binary-path": { 2274 | "version": "2.1.0", 2275 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2276 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2277 | "dev": true, 2278 | "requires": { 2279 | "binary-extensions": "^2.0.0" 2280 | } 2281 | }, 2282 | "is-extglob": { 2283 | "version": "2.1.1", 2284 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2285 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2286 | "dev": true 2287 | }, 2288 | "is-fullwidth-code-point": { 2289 | "version": "3.0.0", 2290 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2291 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2292 | "dev": true 2293 | }, 2294 | "is-glob": { 2295 | "version": "4.0.3", 2296 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2297 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2298 | "dev": true, 2299 | "requires": { 2300 | "is-extglob": "^2.1.1" 2301 | } 2302 | }, 2303 | "is-number": { 2304 | "version": "7.0.0", 2305 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2306 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2307 | "dev": true 2308 | }, 2309 | "is-plain-obj": { 2310 | "version": "2.1.0", 2311 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 2312 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 2313 | "dev": true 2314 | }, 2315 | "is-unicode-supported": { 2316 | "version": "0.1.0", 2317 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 2318 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 2319 | "dev": true 2320 | }, 2321 | "js-magic": { 2322 | "version": "1.4.2", 2323 | "resolved": "https://registry.npmjs.org/js-magic/-/js-magic-1.4.2.tgz", 2324 | "integrity": "sha512-d6Zu1wj/RlKIrtLfCDVqXyyaDEduw4wP8zcYAbs+qRqqQO0GGRo8f70W0fsqhMBkMrdc4vHMtIZ2pG9AvrgKQA==" 2325 | }, 2326 | "js-yaml": { 2327 | "version": "4.1.0", 2328 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2329 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2330 | "dev": true, 2331 | "requires": { 2332 | "argparse": "^2.0.1" 2333 | } 2334 | }, 2335 | "locate-path": { 2336 | "version": "6.0.0", 2337 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2338 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2339 | "dev": true, 2340 | "requires": { 2341 | "p-locate": "^5.0.0" 2342 | } 2343 | }, 2344 | "log-symbols": { 2345 | "version": "4.1.0", 2346 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 2347 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 2348 | "dev": true, 2349 | "requires": { 2350 | "chalk": "^4.1.0", 2351 | "is-unicode-supported": "^0.1.0" 2352 | } 2353 | }, 2354 | "make-error": { 2355 | "version": "1.3.6", 2356 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 2357 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 2358 | "dev": true 2359 | }, 2360 | "media-typer": { 2361 | "version": "0.3.0", 2362 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2363 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 2364 | "dev": true 2365 | }, 2366 | "mime-db": { 2367 | "version": "1.52.0", 2368 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2369 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2370 | "dev": true 2371 | }, 2372 | "mime-types": { 2373 | "version": "2.1.35", 2374 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2375 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2376 | "dev": true, 2377 | "requires": { 2378 | "mime-db": "1.52.0" 2379 | } 2380 | }, 2381 | "minimatch": { 2382 | "version": "5.0.1", 2383 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 2384 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 2385 | "dev": true, 2386 | "requires": { 2387 | "brace-expansion": "^2.0.1" 2388 | } 2389 | }, 2390 | "mocha": { 2391 | "version": "10.2.0", 2392 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 2393 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 2394 | "dev": true, 2395 | "requires": { 2396 | "ansi-colors": "4.1.1", 2397 | "browser-stdout": "1.3.1", 2398 | "chokidar": "3.5.3", 2399 | "debug": "4.3.4", 2400 | "diff": "5.0.0", 2401 | "escape-string-regexp": "4.0.0", 2402 | "find-up": "5.0.0", 2403 | "glob": "7.2.0", 2404 | "he": "1.2.0", 2405 | "js-yaml": "4.1.0", 2406 | "log-symbols": "4.1.0", 2407 | "minimatch": "5.0.1", 2408 | "ms": "2.1.3", 2409 | "nanoid": "3.3.3", 2410 | "serialize-javascript": "6.0.0", 2411 | "strip-json-comments": "3.1.1", 2412 | "supports-color": "8.1.1", 2413 | "workerpool": "6.2.1", 2414 | "yargs": "16.2.0", 2415 | "yargs-parser": "20.2.4", 2416 | "yargs-unparser": "2.0.0" 2417 | }, 2418 | "dependencies": { 2419 | "debug": { 2420 | "version": "4.3.4", 2421 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2422 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2423 | "dev": true, 2424 | "requires": { 2425 | "ms": "2.1.2" 2426 | }, 2427 | "dependencies": { 2428 | "ms": { 2429 | "version": "2.1.2", 2430 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2431 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2432 | "dev": true 2433 | } 2434 | } 2435 | }, 2436 | "ms": { 2437 | "version": "2.1.3", 2438 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2439 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2440 | "dev": true 2441 | } 2442 | } 2443 | }, 2444 | "ms": { 2445 | "version": "2.0.0", 2446 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2447 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 2448 | "dev": true 2449 | }, 2450 | "nanoid": { 2451 | "version": "3.3.3", 2452 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 2453 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 2454 | "dev": true 2455 | }, 2456 | "node-fetch": { 2457 | "version": "2.7.0", 2458 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 2459 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 2460 | "dev": true, 2461 | "requires": { 2462 | "whatwg-url": "^5.0.0" 2463 | } 2464 | }, 2465 | "normalize-path": { 2466 | "version": "3.0.0", 2467 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2468 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2469 | "dev": true 2470 | }, 2471 | "object-inspect": { 2472 | "version": "1.12.0", 2473 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", 2474 | "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" 2475 | }, 2476 | "on-finished": { 2477 | "version": "2.3.0", 2478 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2479 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2480 | "dev": true, 2481 | "requires": { 2482 | "ee-first": "1.1.1" 2483 | } 2484 | }, 2485 | "once": { 2486 | "version": "1.4.0", 2487 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2488 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2489 | "dev": true, 2490 | "requires": { 2491 | "wrappy": "1" 2492 | } 2493 | }, 2494 | "p-limit": { 2495 | "version": "3.1.0", 2496 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2497 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2498 | "dev": true, 2499 | "requires": { 2500 | "yocto-queue": "^0.1.0" 2501 | } 2502 | }, 2503 | "p-locate": { 2504 | "version": "5.0.0", 2505 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2506 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2507 | "dev": true, 2508 | "requires": { 2509 | "p-limit": "^3.0.2" 2510 | } 2511 | }, 2512 | "path-exists": { 2513 | "version": "4.0.0", 2514 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2515 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2516 | "dev": true 2517 | }, 2518 | "path-is-absolute": { 2519 | "version": "1.0.1", 2520 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2521 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2522 | "dev": true 2523 | }, 2524 | "picomatch": { 2525 | "version": "2.3.1", 2526 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2527 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2528 | "dev": true 2529 | }, 2530 | "qs": { 2531 | "version": "6.11.2", 2532 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", 2533 | "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", 2534 | "requires": { 2535 | "side-channel": "^1.0.4" 2536 | } 2537 | }, 2538 | "randombytes": { 2539 | "version": "2.1.0", 2540 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2541 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2542 | "dev": true, 2543 | "requires": { 2544 | "safe-buffer": "^5.1.0" 2545 | } 2546 | }, 2547 | "raw-body": { 2548 | "version": "2.4.3", 2549 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", 2550 | "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", 2551 | "dev": true, 2552 | "requires": { 2553 | "bytes": "3.1.2", 2554 | "http-errors": "1.8.1", 2555 | "iconv-lite": "0.4.24", 2556 | "unpipe": "1.0.0" 2557 | } 2558 | }, 2559 | "readdirp": { 2560 | "version": "3.6.0", 2561 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2562 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2563 | "dev": true, 2564 | "requires": { 2565 | "picomatch": "^2.2.1" 2566 | } 2567 | }, 2568 | "require-directory": { 2569 | "version": "2.1.1", 2570 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2571 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2572 | "dev": true 2573 | }, 2574 | "safe-buffer": { 2575 | "version": "5.2.1", 2576 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2577 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2578 | "dev": true 2579 | }, 2580 | "safer-buffer": { 2581 | "version": "2.1.2", 2582 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2583 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2584 | }, 2585 | "serialize-javascript": { 2586 | "version": "6.0.0", 2587 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2588 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2589 | "dev": true, 2590 | "requires": { 2591 | "randombytes": "^2.1.0" 2592 | } 2593 | }, 2594 | "setprototypeof": { 2595 | "version": "1.2.0", 2596 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2597 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 2598 | "dev": true 2599 | }, 2600 | "side-channel": { 2601 | "version": "1.0.4", 2602 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2603 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2604 | "requires": { 2605 | "call-bind": "^1.0.0", 2606 | "get-intrinsic": "^1.0.2", 2607 | "object-inspect": "^1.9.0" 2608 | } 2609 | }, 2610 | "statuses": { 2611 | "version": "1.5.0", 2612 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2613 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 2614 | "dev": true 2615 | }, 2616 | "string-width": { 2617 | "version": "4.2.3", 2618 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2619 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2620 | "dev": true, 2621 | "requires": { 2622 | "emoji-regex": "^8.0.0", 2623 | "is-fullwidth-code-point": "^3.0.0", 2624 | "strip-ansi": "^6.0.1" 2625 | } 2626 | }, 2627 | "strip-ansi": { 2628 | "version": "6.0.1", 2629 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2630 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2631 | "dev": true, 2632 | "requires": { 2633 | "ansi-regex": "^5.0.1" 2634 | } 2635 | }, 2636 | "strip-json-comments": { 2637 | "version": "3.1.1", 2638 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2639 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2640 | "dev": true 2641 | }, 2642 | "sudo-prompt": { 2643 | "version": "9.2.1", 2644 | "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", 2645 | "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" 2646 | }, 2647 | "supports-color": { 2648 | "version": "8.1.1", 2649 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2650 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2651 | "dev": true, 2652 | "requires": { 2653 | "has-flag": "^4.0.0" 2654 | } 2655 | }, 2656 | "to-regex-range": { 2657 | "version": "5.0.1", 2658 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2659 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2660 | "dev": true, 2661 | "requires": { 2662 | "is-number": "^7.0.0" 2663 | } 2664 | }, 2665 | "toidentifier": { 2666 | "version": "1.0.1", 2667 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2668 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2669 | "dev": true 2670 | }, 2671 | "tr46": { 2672 | "version": "0.0.3", 2673 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2674 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", 2675 | "dev": true 2676 | }, 2677 | "ts-node": { 2678 | "version": "10.9.1", 2679 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 2680 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 2681 | "dev": true, 2682 | "requires": { 2683 | "@cspotcode/source-map-support": "^0.8.0", 2684 | "@tsconfig/node10": "^1.0.7", 2685 | "@tsconfig/node12": "^1.0.7", 2686 | "@tsconfig/node14": "^1.0.0", 2687 | "@tsconfig/node16": "^1.0.2", 2688 | "acorn": "^8.4.1", 2689 | "acorn-walk": "^8.1.1", 2690 | "arg": "^4.1.0", 2691 | "create-require": "^1.1.0", 2692 | "diff": "^4.0.1", 2693 | "make-error": "^1.1.1", 2694 | "v8-compile-cache-lib": "^3.0.1", 2695 | "yn": "3.1.1" 2696 | }, 2697 | "dependencies": { 2698 | "diff": { 2699 | "version": "4.0.2", 2700 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 2701 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 2702 | "dev": true 2703 | } 2704 | } 2705 | }, 2706 | "tslib": { 2707 | "version": "2.6.2", 2708 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 2709 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", 2710 | "dev": true 2711 | }, 2712 | "type-is": { 2713 | "version": "1.6.18", 2714 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2715 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2716 | "dev": true, 2717 | "requires": { 2718 | "media-typer": "0.3.0", 2719 | "mime-types": "~2.1.24" 2720 | } 2721 | }, 2722 | "typescript": { 2723 | "version": "5.2.2", 2724 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", 2725 | "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", 2726 | "dev": true 2727 | }, 2728 | "undici-types": { 2729 | "version": "6.13.0", 2730 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", 2731 | "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", 2732 | "dev": true 2733 | }, 2734 | "unpipe": { 2735 | "version": "1.0.0", 2736 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2737 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 2738 | "dev": true 2739 | }, 2740 | "v8-compile-cache-lib": { 2741 | "version": "3.0.1", 2742 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2743 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2744 | "dev": true 2745 | }, 2746 | "webidl-conversions": { 2747 | "version": "3.0.1", 2748 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2749 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", 2750 | "dev": true 2751 | }, 2752 | "whatwg-url": { 2753 | "version": "5.0.0", 2754 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2755 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 2756 | "dev": true, 2757 | "requires": { 2758 | "tr46": "~0.0.3", 2759 | "webidl-conversions": "^3.0.0" 2760 | } 2761 | }, 2762 | "workerpool": { 2763 | "version": "6.2.1", 2764 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 2765 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 2766 | "dev": true 2767 | }, 2768 | "wrap-ansi": { 2769 | "version": "7.0.0", 2770 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2771 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2772 | "dev": true, 2773 | "requires": { 2774 | "ansi-styles": "^4.0.0", 2775 | "string-width": "^4.1.0", 2776 | "strip-ansi": "^6.0.0" 2777 | } 2778 | }, 2779 | "wrappy": { 2780 | "version": "1.0.2", 2781 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2782 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2783 | "dev": true 2784 | }, 2785 | "ws": { 2786 | "version": "8.18.0", 2787 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 2788 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 2789 | "requires": {} 2790 | }, 2791 | "y18n": { 2792 | "version": "5.0.8", 2793 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2794 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2795 | "dev": true 2796 | }, 2797 | "yargs": { 2798 | "version": "16.2.0", 2799 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2800 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2801 | "dev": true, 2802 | "requires": { 2803 | "cliui": "^7.0.2", 2804 | "escalade": "^3.1.1", 2805 | "get-caller-file": "^2.0.5", 2806 | "require-directory": "^2.1.1", 2807 | "string-width": "^4.2.0", 2808 | "y18n": "^5.0.5", 2809 | "yargs-parser": "^20.2.2" 2810 | } 2811 | }, 2812 | "yargs-parser": { 2813 | "version": "20.2.4", 2814 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 2815 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 2816 | "dev": true 2817 | }, 2818 | "yargs-unparser": { 2819 | "version": "2.0.0", 2820 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 2821 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 2822 | "dev": true, 2823 | "requires": { 2824 | "camelcase": "^6.0.0", 2825 | "decamelize": "^4.0.0", 2826 | "flat": "^5.0.2", 2827 | "is-plain-obj": "^2.1.0" 2828 | } 2829 | }, 2830 | "yn": { 2831 | "version": "3.1.1", 2832 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2833 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2834 | "dev": true 2835 | }, 2836 | "yocto-queue": { 2837 | "version": "0.1.0", 2838 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2839 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2840 | "dev": true 2841 | } 2842 | } 2843 | } 2844 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-controller", 3 | "version": "1.7.4", 4 | "description": "Elegant API/MVC controller wrapper for Next.js framework.", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "scripts": { 8 | "prepublishOnly": "tsc", 9 | "test": "mocha -r ts-node/register test/*.test.ts", 10 | "test:bun": "bun run ./node_modules/mocha/bin/mocha test/*.test.ts" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/ayonli/next-controller.git" 15 | }, 16 | "keywords": [ 17 | "next.js", 18 | "api", 19 | "controller", 20 | "mvc", 21 | "middleware" 22 | ], 23 | "author": "A-yon ", 24 | "license": "MIT", 25 | "bugs": { 26 | "url": "https://github.com/ayonli/next-controller/issues" 27 | }, 28 | "homepage": "https://github.com/ayonli/next-controller#readme", 29 | "dependencies": { 30 | "@ayonli/jsext": "^0.9.56", 31 | "capture-stack-trace": "^2.1.0", 32 | "js-magic": "^1.4.2", 33 | "qs": "^6.11.2" 34 | }, 35 | "devDependencies": { 36 | "@types/body-parser": "^1.19.0", 37 | "@types/mocha": "^10.0.1", 38 | "@types/node": "^22.1.0", 39 | "@types/node-fetch": "^2.5.8", 40 | "@types/qs": "^6.9.15", 41 | "axios": "^0.21.4", 42 | "body-parser": "^1.19.0", 43 | "mocha": "^10.2.0", 44 | "node-fetch": "^2.7.0", 45 | "ts-node": "^10.9.1", 46 | "tslib": "^2.6.2", 47 | "typescript": "^5.2.2" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/ApiController.ts: -------------------------------------------------------------------------------- 1 | import * as qs from "qs"; 2 | import type { IncomingMessage, ServerResponse } from "node:http"; 3 | import type { Constructor } from "@ayonli/jsext"; 4 | import { as, hasOwn } from "@ayonli/jsext/object"; 5 | import HttpException, { HttpStatus } from "./HttpException"; 6 | 7 | export const _middleware = Symbol.for("middleware"); 8 | 9 | export type Middleware = ( 10 | req: IncomingMessage, 11 | res: ServerResponse, 12 | next: (err?: any) => Promise 13 | ) => any; 14 | 15 | export interface Request extends IncomingMessage { 16 | query?: qs.ParsedQs; 17 | body?: any; 18 | } 19 | 20 | export interface Response extends ServerResponse { 21 | send?: (data: any) => any; 22 | } 23 | 24 | export default class ApiController { 25 | private _middleware: Middleware[] = []; 26 | 27 | constructor( 28 | protected req: IncomingMessage, 29 | protected res: ServerResponse 30 | ) { } 31 | 32 | protected use(middleware: Middleware) { 33 | this._middleware.push(middleware); 34 | return this; 35 | } 36 | 37 | delete?(query: object, body?: any): Promise; 38 | get?(query: object): Promise; 39 | head?(query: object): Promise; 40 | options?(query: object): Promise; 41 | patch?(query: object, body: any): Promise; 42 | post?(body: any): Promise; 43 | put?(query: object, body: any): Promise; 44 | protected onError?(err: any): void; 45 | 46 | static onError?(err: any): void; 47 | 48 | static async __invoke(req: Request, res: Response) { 49 | const url = new URL(req.url as string, "http://localhost"); 50 | const query = qs.parse(url.search?.slice(1) || "", { 51 | ignoreQueryPrefix: true, 52 | allowDots: true, 53 | strictNullHandling: true, 54 | }); 55 | 56 | if (req.query) { 57 | Object.assign(req.query, query); 58 | } else { 59 | req.query = query; 60 | } 61 | 62 | const ins = new this(req, res); 63 | const method = (req.method as string).toLowerCase(); 64 | 65 | if (typeof (ins as any)[method] !== "function") { 66 | res.statusCode = 405; 67 | res.statusMessage = HttpStatus[405] || ""; 68 | res.end(res.statusMessage); 69 | return; 70 | } 71 | 72 | const invoke = ins.invoke || ApiController.prototype.invoke; 73 | await invoke.call(ins, method, req, res, async (req, res) => { 74 | try { 75 | let returns: any; 76 | 77 | // Invoke the handler method can get its returning value. 78 | if (method === "get" || method === "head") { 79 | returns = await (ins as any)[method](req.query); 80 | } else if (method === "post") { 81 | returns = await (ins as any)[method](req.body); 82 | } else { 83 | returns = await (ins as any)[method](req.query, req.body); 84 | } 85 | 86 | if (method === "head") { 87 | res.end(); 88 | return returns; 89 | } 90 | 91 | const isResponseTypeSet = res.hasHeader("Content-Type"); 92 | 93 | // Respond the returning value to the client respectively. 94 | if ([ 95 | "boolean", 96 | "number", 97 | "object" 98 | ].includes(typeof returns)) { 99 | if (typeof res["send"] === "function") { 100 | res["send"](returns); 101 | } else { 102 | if (!isResponseTypeSet) { 103 | res.setHeader("Content-Type", 104 | "application/json; charset=utf-8"); 105 | } 106 | 107 | res.end(JSON.stringify(returns)); 108 | } 109 | } else if (returns !== void 0) { 110 | if (!isResponseTypeSet) { 111 | res.setHeader("Content-Type", 112 | "text/plain; charset=utf-8"); 113 | } 114 | 115 | if (typeof res["send"] === "function") { 116 | res["send"](String(returns)); 117 | } else { 118 | res.end(String(returns)); 119 | } 120 | } 121 | 122 | // Returns the returning values so the previous middleware 123 | // can await for it. 124 | return returns; 125 | } catch (err) { 126 | res.setHeader("Content-Type", "text/plain; charset=utf-8"); 127 | 128 | if (err instanceof Error) { 129 | if (err.name === "HttpException") { 130 | res.statusCode = as(err, HttpException)?.code || 500; 131 | } else { 132 | res.statusCode = 500; 133 | } 134 | 135 | res.statusMessage = HttpStatus[res.statusCode] ?? ""; 136 | res.end(err.message); 137 | } else { 138 | res.statusCode = 500; 139 | res.statusMessage = HttpStatus[res.statusCode] ?? ""; 140 | res.end(String(err)); 141 | } 142 | 143 | // Re-throw the error so the previous middleware can catch 144 | // it. 145 | throw err; 146 | } 147 | }); 148 | } 149 | 150 | protected async invoke( 151 | method: string, 152 | req: Request, 153 | res: Response, 154 | handle: (req: Request, res: Response) => Promise 155 | ) { 156 | const ctor = this.constructor as Constructor; 157 | const middleware: Middleware[] = []; 158 | 159 | if (hasOwn(this, "_middleware")) { 160 | // If the controller isn't a subclass of ApiController, 161 | // `_middleware` could be missing. 162 | middleware.push(...this["_middleware"]); 163 | } 164 | 165 | if (hasOwn(ctor.prototype[method], _middleware)) { 166 | middleware.push(...(ctor.prototype[method][_middleware] || [])); 167 | } 168 | 169 | middleware.push(handle); 170 | 171 | try { 172 | const applyMiddleware = this.applyMiddleware 173 | || ApiController.prototype.applyMiddleware; 174 | await applyMiddleware.call(this, middleware, req, res); 175 | } catch (err) { 176 | this._handleError?.(err); 177 | } 178 | } 179 | 180 | protected async applyMiddleware( 181 | middleware: Middleware[], 182 | req: IncomingMessage, 183 | res: ServerResponse, 184 | ) { 185 | let _this = this; 186 | let i = 0; 187 | 188 | // Recursively invokes all the middleware. 189 | await (async function next() { 190 | // Express `next(err)` 191 | if (arguments.length && 192 | (arguments[0] instanceof Error || typeof arguments[0] === "string") 193 | ) { 194 | _this._handleError?.(arguments[0]); 195 | return; 196 | } 197 | 198 | const handle = middleware[i++]; 199 | 200 | if (handle?.length === 4) { // Express `(err, req, res, next) => void` 201 | // @ts-ignore 202 | return await handle.call(_this, null, req, res, next); 203 | } else if (handle) { 204 | return await handle.call(_this, req, res, next); 205 | } 206 | })(); 207 | } 208 | 209 | private _handleError(err: any) { 210 | if (typeof this.onError === "function") { 211 | this.onError(err); 212 | } else if (typeof (this.constructor as any).onError === "function") { 213 | (this.constructor as any).onError(err); 214 | } else if (err["name"] !== "HttpException") { 215 | console.error(err); 216 | } 217 | } 218 | } 219 | -------------------------------------------------------------------------------- /src/HttpException.ts: -------------------------------------------------------------------------------- 1 | import { Exception } from "@ayonli/jsext/error"; 2 | 3 | export default class HttpException extends Exception { 4 | constructor(code: number); 5 | constructor(message: string, code: number); 6 | constructor(message: string, options: { 7 | code: number; 8 | cause?: unknown; 9 | }); 10 | constructor(status: string | number, code?: number | { 11 | code: number; 12 | cause?: unknown; 13 | }) { 14 | let message: string; 15 | 16 | if (typeof status === "number") { 17 | code = status; 18 | message = HttpStatus[code] || ""; 19 | } else { 20 | message = status; 21 | } 22 | 23 | if (typeof code === "number") { 24 | super(message, code); 25 | } else if (typeof code === "object") { 26 | super(message, code); 27 | } 28 | } 29 | 30 | static from(err: string | Error) { 31 | if (err instanceof HttpException) { // make a copy 32 | const _err = Object.create(HttpException.prototype); 33 | 34 | Object.defineProperties(_err, { 35 | name: { 36 | value: "HttpException", 37 | configurable: true, 38 | writable: true, 39 | }, 40 | cause: { 41 | value: _err.cause, 42 | configurable: true, 43 | writable: true, 44 | }, 45 | code: { 46 | value: err.code, 47 | configurable: true, 48 | writable: true, 49 | }, 50 | message: { 51 | value: err.message, 52 | configurable: true, 53 | writable: true, 54 | }, 55 | stack: { 56 | value: err.stack, 57 | configurable: true, 58 | writable: true, 59 | }, 60 | }); 61 | 62 | return _err; 63 | } else if (err instanceof Error) { 64 | return new HttpException(err.message, { 65 | code: 500, 66 | cause: err, 67 | }); 68 | } else { 69 | return new HttpException(String(err), 500); 70 | } 71 | } 72 | } 73 | 74 | Object.defineProperty(HttpException.prototype, "name", { 75 | value: "HttpException", 76 | configurable: true, 77 | writable: true, 78 | }); 79 | 80 | export const HttpStatus: { [code: number]: string; } = { 81 | 100: 'Continue', 82 | 101: 'Switching Protocols', 83 | 102: 'Processing', 84 | 103: 'Early Hints', 85 | 200: 'OK', 86 | 201: 'Created', 87 | 202: 'Accepted', 88 | 203: 'Non-Authoritative Information', 89 | 204: 'No Content', 90 | 205: 'Reset Content', 91 | 206: 'Partial Content', 92 | 207: 'Multi-Status', 93 | 208: 'Already Reported', 94 | 226: 'IM Used', 95 | 300: 'Multiple Choices', 96 | 301: 'Moved Permanently', 97 | 302: 'Found', 98 | 303: 'See Other', 99 | 304: 'Not Modified', 100 | 305: 'Use Proxy', 101 | 307: 'Temporary Redirect', 102 | 308: 'Permanent Redirect', 103 | 400: 'Bad Request', 104 | 401: 'Unauthorized', 105 | 402: 'Payment Required', 106 | 403: 'Forbidden', 107 | 404: 'Not Found', 108 | 405: 'Method Not Allowed', 109 | 406: 'Not Acceptable', 110 | 407: 'Proxy Authentication Required', 111 | 408: 'Request Timeout', 112 | 409: 'Conflict', 113 | 410: 'Gone', 114 | 411: 'Length Required', 115 | 412: 'Precondition Failed', 116 | 413: 'Payload Too Large', 117 | 414: 'URI Too Long', 118 | 415: 'Unsupported Media Type', 119 | 416: 'Range Not Satisfiable', 120 | 417: 'Expectation Failed', 121 | 418: "I'm a Teapot", 122 | 421: 'Misdirected Request', 123 | 422: 'Unprocessable Entity', 124 | 423: 'Locked', 125 | 424: 'Failed Dependency', 126 | 425: 'Too Early', 127 | 426: 'Upgrade Required', 128 | 428: 'Precondition Required', 129 | 429: 'Too Many Requests', 130 | 431: 'Request Header Fields Too Large', 131 | 451: 'Unavailable For Legal Reasons', 132 | 500: 'Internal Server Error', 133 | 501: 'Not Implemented', 134 | 502: 'Bad Gateway', 135 | 503: 'Service Unavailable', 136 | 504: 'Gateway Timeout', 137 | 505: 'HTTP Version Not Supported', 138 | 506: 'Variant Also Negotiates', 139 | 507: 'Insufficient Storage', 140 | 508: 'Loop Detected', 141 | 509: 'Bandwidth Limit Exceeded', 142 | 510: 'Not Extended', 143 | 511: 'Network Authentication Required' 144 | }; 145 | -------------------------------------------------------------------------------- /src/api.ts: -------------------------------------------------------------------------------- 1 | import { applyMagic } from "js-magic"; 2 | import type { Constructor } from "@ayonli/jsext"; 3 | import ApiController from "./ApiController"; 4 | 5 | const api = >(target: T, ..._: any[]) => { 6 | // @ts-ignore 7 | target["__invoke"] ||= ApiController.__invoke; 8 | return applyMagic(target); 9 | }; 10 | 11 | export default api; 12 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import api from "./api"; 2 | import ApiController from "./ApiController"; 3 | import type { Request, Response } from "./ApiController"; // required for Bun with Mocha 4 | import HttpException from "./HttpException"; 5 | import useApi, { callApi } from "./useApi"; 6 | import use from "./use"; 7 | 8 | export { 9 | api, 10 | ApiController, 11 | HttpException, 12 | use, 13 | useApi, 14 | callApi 15 | }; 16 | 17 | export type { Request, Response }; // required for Bun with Mocha 18 | -------------------------------------------------------------------------------- /src/use.ts: -------------------------------------------------------------------------------- 1 | import { Middleware, _middleware } from "./ApiController"; 2 | 3 | export type FunctionDecorator = { 4 | (target: any, prop: string, desc: TypedPropertyDescriptor): void | TypedPropertyDescriptor; 5 | any>(target: F): void | F; 6 | any>(target: F, context: any): void | F; 7 | }; 8 | 9 | export default function use( 10 | middleware: Middleware 11 | ) { 12 | return ((proto: any, prop: any, desc: TypedPropertyDescriptor | undefined = undefined) => { 13 | let method: Function | undefined; 14 | 15 | if (typeof prop === "object" && prop) { // ES decorator 16 | const ctx = prop as { 17 | kind?: string; 18 | name?: string; 19 | }; 20 | 21 | if (ctx.kind !== "method") { 22 | throw new TypeError("@use can only be used on a method"); 23 | } else if (typeof ctx.name !== "string") { 24 | throw new TypeError("@use can only be used on a string method name"); 25 | } else { 26 | method = proto; 27 | } 28 | } else if (desc) { // TS experimental decorator 29 | if (typeof desc.value !== "function") { 30 | throw new TypeError("@use can only be used on a method"); 31 | } 32 | 33 | if (typeof prop !== "string") { 34 | throw new TypeError("@use can only be used on a string method name"); 35 | } else { 36 | method = proto[prop]; 37 | } 38 | } 39 | 40 | if (!method) { 41 | throw new TypeError("@use can only be used on a method"); 42 | } 43 | 44 | type Container = Middleware[]; 45 | const container: Container = ((method as any)[_middleware] ||= []); 46 | 47 | container.push(middleware); 48 | }) as FunctionDecorator; 49 | } 50 | -------------------------------------------------------------------------------- /src/useApi.ts: -------------------------------------------------------------------------------- 1 | import * as qs from "qs"; 2 | import { saveFile } from "@ayonli/jsext/dialog"; 3 | import HttpException from "./HttpException"; 4 | 5 | // polyfill 6 | Error.captureStackTrace ??= require("capture-stack-trace"); 7 | 8 | export default function useApi( 9 | path: string, 10 | base = "", 11 | options: Omit = {} 12 | ): T { 13 | const url = (base || "") + "/api/" + path; 14 | 15 | return { 16 | delete: callApi.bind(void 0, url, { ...options, method: "DELETE" }), 17 | get: callApi.bind(void 0, url, { ...options, method: "GET" }), 18 | head: callApi.bind(void 0, url, { ...options, method: "HEAD" }), 19 | options: callApi.bind(void 0, url, { ...options, method: "OPTIONS" }), 20 | patch: callApi.bind(void 0, url, { ...options, method: "PATCH" }), 21 | post: callApi.bind(void 0, url, { ...options, method: "POST" }, {}), 22 | put: callApi.bind(void 0, url, { ...options, method: "PUT" }) 23 | } as any; 24 | } 25 | 26 | export async function callApi( 27 | url: string, 28 | options: Omit = {}, 29 | query: object, 30 | body: any = void 0, 31 | extraHeaders: HeadersInit = {} 32 | ) { 33 | const { method } = options; 34 | const headers = { ...(options.headers ?? {}) } as { [x: string]: any; }; 35 | 36 | url += qs.stringify(query, { 37 | allowDots: true, 38 | encodeValuesOnly: true, 39 | addQueryPrefix: true, 40 | strictNullHandling: true, 41 | }); 42 | 43 | if (method && ["GET", "HEAD", "OPTIONS"].includes(method) && body) { 44 | extraHeaders = body; 45 | body = void 0; 46 | } 47 | 48 | if (typeof body === "object") { 49 | if ((typeof FormData !== "function" || !(body instanceof FormData)) && 50 | (typeof Blob !== "function" || !(body instanceof Blob)) && 51 | (typeof ArrayBuffer !== "function" || !(body instanceof ArrayBuffer)) && 52 | (typeof Uint8Array !== "function" || !(body instanceof Uint8Array)) 53 | ) { 54 | headers["Content-Type"] ||= "application/json; charset=utf-8"; 55 | body = JSON.stringify(body); 56 | } 57 | } else if (body !== void 0) { 58 | headers["Content-Type"] ||= "text/plain; charset=utf-8"; 59 | body = String(body); 60 | } 61 | 62 | const trace: { stack?: string; } = {}; 63 | Error.captureStackTrace(trace); 64 | 65 | const res = await fetch(url, { 66 | ...options, 67 | method, 68 | headers: { ...headers, ...extraHeaders }, 69 | body 70 | }); 71 | let err: Error; 72 | 73 | if (res.status < 400) { 74 | const type = res.headers.get("Content-Type") ?? ""; 75 | let returns: any; 76 | 77 | if (type.includes("/json")) { 78 | returns = await res.json(); 79 | } else if (type.startsWith("text/")) { 80 | returns = await res.text(); 81 | } else { 82 | const disposition = res.headers.get("Content-Disposition") ?? ""; 83 | 84 | if (disposition.startsWith("attachment")) { 85 | returns = await res.blob(); 86 | const filename = disposition.match(/filename\*=UTF-?8''(.+)/i)?.[1] 87 | ?? disposition.match(/filename="(.+)"/)?.[1]; 88 | 89 | saveFile(returns as Blob, { 90 | name: filename ? decodeURIComponent(filename) : void 0, 91 | }); 92 | returns = void 0; 93 | } else { 94 | returns = await res.arrayBuffer(); 95 | } 96 | } 97 | 98 | return returns; 99 | } else if (res.status === 405) { 100 | err = new ReferenceError( 101 | `ApiController.${String(method).toLowerCase()} is not implemented`); 102 | } else { 103 | err = new HttpException( 104 | (await res.text()) || res.statusText || "Unknown", 105 | res.status); 106 | } 107 | 108 | // Append stack trace 109 | err.stack = err.stack + "\n" + trace.stack?.split("\n").slice(5).join("\n"); 110 | 111 | throw err; 112 | } 113 | -------------------------------------------------------------------------------- /test/ApiController.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it } from "mocha"; 2 | import * as assert from "assert"; 3 | import axios from "axios"; 4 | 5 | describe("ApiController", () => { 6 | it("should trigger get method with query", async () => { 7 | const { data } = await axios.get("/api/example?foo=World"); 8 | assert.deepStrictEqual(data, { bar: "Hello, World" }); 9 | }); 10 | 11 | it("should trigger post method with body along with middleware", async () => { 12 | const { data } = await axios.post("/api/example", { foo: "World" }); 13 | assert.deepStrictEqual(data, { bar: "Hello, World" }); 14 | }); 15 | 16 | it("should trigger delete method with query and body", async () => { 17 | const { data } = await axios.delete("/api/example?foo=Hello", { 18 | data: { bar: "World" } 19 | }); 20 | 21 | assert.deepStrictEqual(data, { foo: "Hello", bar: "World" }); 22 | }); 23 | 24 | it("should trigger head method with query", async () => { 25 | const { headers } = await axios.head("/api/example?foo=Hello"); 26 | assert.strictEqual(headers["query-foo"], "Hello"); 27 | }); 28 | 29 | it("should trigger options method with query and respond with body", async () => { 30 | const { data, headers } = await axios.options("/api/example?foo=World"); 31 | assert.ok(["", null].includes(data)); // In Bun, axios returns "" instead of null 32 | assert.strictEqual(headers["allow"], 33 | "DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT"); 34 | }); 35 | 36 | it("should trigger patch method with query and body", async () => { 37 | const { data } = await axios.patch("/api/example?foo=Hello", { 38 | bar: "World" 39 | }); 40 | 41 | assert.deepStrictEqual(data, { foo: "Hello", bar: "World" }); 42 | }); 43 | 44 | it("should trigger put method with query and body", async () => { 45 | const { data } = await axios.put("/api/example?foo=Hello", { 46 | bar: "World" 47 | }); 48 | 49 | assert.deepStrictEqual(data, { foo: "Hello", bar: "World" }); 50 | }); 51 | }); 52 | -------------------------------------------------------------------------------- /test/HttpException.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it } from "mocha"; 2 | import * as assert from "assert"; 3 | import _try from "@ayonli/jsext/try"; 4 | import axios from "axios"; 5 | import { useApi, HttpException } from "../src"; 6 | import type Example2Controller from "./pages/api/example2"; 7 | 8 | describe("HttpException", () => { 9 | it("should report http error via HttpException", async () => { 10 | let [err, res] = await _try(axios.delete("/api/example2?foo=Hello")); 11 | 12 | if (err) { 13 | // @ts-ignore 14 | res = err["response"]; 15 | } 16 | 17 | assert.strictEqual(res.status, 400); 18 | assert.strictEqual(res.data, "Something went wrong"); 19 | }); 20 | 21 | it("should regenerate HttpException instance when using useApi()", async () => { 22 | const api = useApi("example2", "http://localhost:3000"); 23 | const [err] = await _try(api.delete({ foo: "Hello" })); 24 | 25 | assert.ok(err instanceof HttpException); 26 | assert.strictEqual(err.code, 400); 27 | assert.strictEqual(err.message, "Something went wrong"); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /test/api.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it } from "mocha"; 2 | import * as assert from "assert"; 3 | import axios from "axios"; 4 | 5 | describe("@api", () => { 6 | it("should use an ordinary class as controller", async () => { 7 | const { data } = await axios.get("/api/example2?foo=World"); 8 | assert.deepStrictEqual(data, { bar: "Hello, World" }); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /test/index.test.ts: -------------------------------------------------------------------------------- 1 | import { before, after } from "mocha"; 2 | import * as http from "http"; 3 | import axios from "axios"; 4 | import * as fetch from "node-fetch"; 5 | 6 | global.fetch ??= fetch; 7 | axios.defaults.baseURL = "http://localhost:3000"; 8 | 9 | let server: http.Server; 10 | 11 | before(async () => { 12 | server = http.createServer(async (req, res) => { 13 | const { pathname } = new URL(req.url as string, "http://localhost:3000"); 14 | 15 | if (pathname.startsWith("/api/")) { 16 | const { default: Controller } = await import("./pages" + pathname); 17 | 18 | // Call the class as a function. 19 | Controller.call(void 0, req, res); 20 | } 21 | }); 22 | 23 | await new Promise(resolve => server.listen(3000, () => resolve(void 0))); 24 | }); 25 | 26 | after(async () => { 27 | await new Promise(resolve => { 28 | server.closeAllConnections?.(); 29 | server.close(() => resolve(void 0)); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /test/pages/api/example.ts: -------------------------------------------------------------------------------- 1 | import { api, ApiController } from "../../../src"; 2 | import * as bodyParser from "body-parser"; 3 | 4 | const jsonParser = bodyParser.json(); 5 | const urlencodedParser = bodyParser.urlencoded({ extended: true }); 6 | 7 | @api 8 | export default class Example2Controller extends ApiController { 9 | constructor(req: any, res: any) { 10 | super(req, res); 11 | 12 | this.use(jsonParser) 13 | .use(urlencodedParser); 14 | } 15 | 16 | override async get(query: { foo: string; }) { 17 | return { 18 | bar: "Hello, " + query.foo 19 | }; 20 | } 21 | 22 | override async post(body: { foo: string; }) { 23 | return { 24 | bar: "Hello, " + body.foo 25 | }; 26 | } 27 | 28 | override async delete(query: { foo: string; }, body: { bar?: string; } = {}) { 29 | return { ...query, ...body }; 30 | } 31 | 32 | override async head(query: { foo: string; }) { 33 | this.res.setHeader("query-foo", query.foo); 34 | } 35 | 36 | override async options(_: { foo: string; }) { 37 | this.res.setHeader("Allow", 38 | "DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT"); 39 | return null; 40 | } 41 | 42 | override async patch(query: { foo: string; }, body: { bar: string; }) { 43 | return { ...query, ...body }; 44 | } 45 | 46 | override async put(query: { foo: string; }, body: { bar: string; }) { 47 | return { ...query, ...body }; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /test/pages/api/example2.ts: -------------------------------------------------------------------------------- 1 | import { api, use, HttpException } from "../../../src"; 2 | import * as bodyParser from "body-parser"; 3 | 4 | const jsonParser = bodyParser.json(); 5 | const urlencodedParser = bodyParser.urlencoded({ extended: true }); 6 | 7 | @api 8 | export default class ExampleController { 9 | async get(query: { foo: string; }) { 10 | return { 11 | bar: "Hello, " + query.foo 12 | }; 13 | } 14 | 15 | @use(jsonParser) 16 | @use(urlencodedParser) 17 | async post(body: { foo: string; }) { 18 | return { 19 | bar: "Hello, " + body.foo 20 | }; 21 | } 22 | 23 | async delete(_: { foo: string; }) { 24 | throw new HttpException("Something went wrong", 400); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /test/use.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it } from "mocha"; 2 | import _try from "@ayonli/jsext/try"; 3 | import * as assert from "assert"; 4 | import axios from "axios"; 5 | 6 | describe("@use", () => { 7 | it("should trigger the middleware bound by @use", async () => { 8 | let [err, res] = await _try(axios.post("/api/example2", { foo: "World" })); 9 | 10 | if (err) { 11 | // @ts-ignore 12 | res = err["response"]; 13 | } 14 | 15 | const { data } = res; 16 | assert.deepStrictEqual(data, { bar: "Hello, World" }); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /test/useApi.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from "assert"; 2 | import { describe, it } from "mocha"; 3 | import { useApi } from "../src"; 4 | import type ExampleController from "./pages/api/example"; 5 | import type Example2Controller from "./pages/api/example2"; 6 | import _try from "@ayonli/jsext/try"; 7 | 8 | const controller = useApi("example", "http://localhost:3000"); 9 | 10 | describe("useApi", () => { 11 | it("should invoke get method", async () => { 12 | const data = await controller.get({ foo: "World" }); 13 | assert.deepStrictEqual(data, { bar: "Hello, World" }); 14 | }); 15 | 16 | it("should invoke post method", async () => { 17 | const data = await controller.post({ foo: "World" }); 18 | assert.deepStrictEqual(data, { bar: "Hello, World" }); 19 | }); 20 | 21 | it("should invoke delete method", async () => { 22 | const data = await controller.delete({ foo: "Hello" }, { bar: "World" }); 23 | assert.deepStrictEqual(data, { foo: "Hello", bar: "World" }); 24 | }); 25 | 26 | it("should invoke options method", async () => { 27 | const data = await controller.options({ foo: "World" }); 28 | assert.strictEqual(data, null); 29 | }); 30 | 31 | it("should invoke patch method with query and body", async () => { 32 | const data = await controller.patch({ foo: "Hello" }, { bar: "World" }); 33 | assert.deepStrictEqual(data, { foo: "Hello", bar: "World" }); 34 | }); 35 | 36 | it("should invoke put method with query and body", async () => { 37 | const data = await controller.put({ foo: "Hello" }, { bar: "World" }); 38 | assert.deepStrictEqual(data, { foo: "Hello", bar: "World" }); 39 | }); 40 | 41 | it("should throw error if method is not implemented", async () => { 42 | const api = useApi("example2", "http://localhost:3000"); 43 | // @ts-ignore 44 | const [err] = await _try(async () => api["put"]({}, {})); 45 | 46 | assert.strictEqual(err?.name, "ReferenceError"); 47 | assert.strictEqual(err?.message, "ApiController.put is not implemented"); 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "NodeNext", 4 | "target": "ES2018", 5 | "rootDir": "src/", 6 | "outDir": "dist/", 7 | "newLine": "LF", 8 | "declaration": true, 9 | "importHelpers": true, 10 | "sourceMap": true, 11 | "strict": true, 12 | "noUnusedParameters": true, 13 | "noUnusedLocals": true, 14 | "noImplicitAny": true, 15 | "noImplicitThis": true, 16 | "noImplicitOverride": true, 17 | "noImplicitReturns": true, 18 | "noFallthroughCasesInSwitch": true, 19 | "noPropertyAccessFromIndexSignature": true, 20 | "noUncheckedIndexedAccess": true, 21 | "experimentalDecorators": true 22 | }, 23 | "files": [ 24 | "./src/index.ts" 25 | ], 26 | "exclude": [ 27 | "./node_modules/*" 28 | ], 29 | "ts-node": { 30 | "compilerOptions": { 31 | "module": "CommonJS" 32 | } 33 | } 34 | } 35 | --------------------------------------------------------------------------------