├── .eslintrc.yml ├── .github └── workflows │ ├── lint-and-test.yml │ └── npm-publish.yml ├── .gitignore ├── LICENSE ├── examples └── simple-example.js ├── index.js ├── package-lock.json ├── package.json ├── readme.md └── test └── correlator.tests.js /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | --- 2 | extends: "eslint-config-toboid" 3 | -------------------------------------------------------------------------------- /.github/workflows/lint-and-test.yml: -------------------------------------------------------------------------------- 1 | name: 'lint and test' 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - master 8 | pull_request: 9 | 10 | # This allows a subsequently queued workflow run to interrupt previous runs 11 | concurrency: 12 | group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' 13 | cancel-in-progress: true 14 | 15 | jobs: 16 | lint-and-test: 17 | runs-on: ubuntu-latest 18 | 19 | strategy: 20 | matrix: 21 | node: [20, 22] 22 | 23 | steps: 24 | - uses: actions/checkout@v4 25 | - uses: actions/setup-node@v4 26 | with: 27 | node-version: ${{ matrix.node }} 28 | cache: 'npm' 29 | - run: npm ci 30 | - run: npm run ci 31 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | name: publish to npm 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | jobs: 8 | publish-npm: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: actions/setup-node@v4 13 | with: 14 | node-version: 20 15 | registry-url: https://registry.npmjs.org/ 16 | cache: "npm" 17 | - run: npm ci 18 | - run: npm run ci 19 | - run: npm publish 20 | env: 21 | NODE_AUTH_TOKEN: ${{secrets.npm_token}} 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Toby 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /examples/simple-example.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const express = require('express'); 4 | const app = express(); 5 | const correlator = require('../index.js'); 6 | 7 | app.use(correlator()); 8 | 9 | app.get('*', (req, res) => { 10 | console.log(`${req.correlationId()} requested url ${req.url}`); 11 | 12 | res.on('finish', () => { 13 | console.log(`ID within finish is ${req.correlationId()}`); 14 | }); 15 | 16 | getRandomNumber((err, randomNumber) => { 17 | res.send(`Random number: ${randomNumber}`); 18 | }); 19 | }); 20 | 21 | function getRandomNumber (callback) { 22 | setTimeout(() => { 23 | console.log(`${correlator.getId()} getting random number`); 24 | 25 | callback(null, Math.floor(Math.random() * 1000)); 26 | }, 3000); 27 | } 28 | 29 | app.listen(3000, (err) => { 30 | if (err) { 31 | return console.error(err); 32 | } 33 | console.log('Example app listening on port 3000'); 34 | }); 35 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const correlator = require('correlation-id'); 4 | 5 | module.exports = correlationMw; 6 | 7 | function correlationMw (options) { 8 | const headerName = (options && options.header) || 'x-correlation-id'; 9 | 10 | return (req, res, next) => { 11 | req.correlationId = correlator.getId; 12 | req.setCorrelationId = correlator.setId; 13 | const id = req.get(headerName); 14 | if (id) { 15 | correlator.withId(id, next); 16 | } else { 17 | correlator.withId(next); 18 | } 19 | }; 20 | } 21 | 22 | correlationMw.getId = correlator.getId; 23 | correlationMw.setId = correlator.setId; 24 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-correlation-id", 3 | "version": "3.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "express-correlation-id", 9 | "version": "3.0.1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "correlation-id": "^5.2.0" 13 | }, 14 | "devDependencies": { 15 | "eslint": "^7.32.0", 16 | "eslint-config-toboid": "^2.0.0", 17 | "express": "^4.19.2", 18 | "supertest": "^7.0.0" 19 | }, 20 | "engines": { 21 | "node": ">=12.17.0" 22 | } 23 | }, 24 | "node_modules/@babel/helper-validator-identifier": { 25 | "version": "7.14.9", 26 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", 27 | "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", 28 | "dev": true, 29 | "engines": { 30 | "node": ">=6.9.0" 31 | } 32 | }, 33 | "node_modules/@babel/highlight": { 34 | "version": "7.14.5", 35 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 36 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 37 | "dev": true, 38 | "dependencies": { 39 | "@babel/helper-validator-identifier": "^7.14.5", 40 | "chalk": "^2.0.0", 41 | "js-tokens": "^4.0.0" 42 | }, 43 | "engines": { 44 | "node": ">=6.9.0" 45 | } 46 | }, 47 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 48 | "version": "3.2.1", 49 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 50 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 51 | "dev": true, 52 | "dependencies": { 53 | "color-convert": "^1.9.0" 54 | }, 55 | "engines": { 56 | "node": ">=4" 57 | } 58 | }, 59 | "node_modules/@babel/highlight/node_modules/chalk": { 60 | "version": "2.4.2", 61 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 62 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 63 | "dev": true, 64 | "dependencies": { 65 | "ansi-styles": "^3.2.1", 66 | "escape-string-regexp": "^1.0.5", 67 | "supports-color": "^5.3.0" 68 | }, 69 | "engines": { 70 | "node": ">=4" 71 | } 72 | }, 73 | "node_modules/@babel/highlight/node_modules/color-convert": { 74 | "version": "1.9.3", 75 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 76 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 77 | "dev": true, 78 | "dependencies": { 79 | "color-name": "1.1.3" 80 | } 81 | }, 82 | "node_modules/@babel/highlight/node_modules/color-name": { 83 | "version": "1.1.3", 84 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 85 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 86 | "dev": true 87 | }, 88 | "node_modules/@babel/highlight/node_modules/has-flag": { 89 | "version": "3.0.0", 90 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 91 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 92 | "dev": true, 93 | "engines": { 94 | "node": ">=4" 95 | } 96 | }, 97 | "node_modules/@babel/highlight/node_modules/supports-color": { 98 | "version": "5.5.0", 99 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 100 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 101 | "dev": true, 102 | "dependencies": { 103 | "has-flag": "^3.0.0" 104 | }, 105 | "engines": { 106 | "node": ">=4" 107 | } 108 | }, 109 | "node_modules/@eslint/eslintrc": { 110 | "version": "0.4.3", 111 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", 112 | "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", 113 | "dev": true, 114 | "dependencies": { 115 | "ajv": "^6.12.4", 116 | "debug": "^4.1.1", 117 | "espree": "^7.3.0", 118 | "globals": "^13.9.0", 119 | "ignore": "^4.0.6", 120 | "import-fresh": "^3.2.1", 121 | "js-yaml": "^3.13.1", 122 | "minimatch": "^3.0.4", 123 | "strip-json-comments": "^3.1.1" 124 | }, 125 | "engines": { 126 | "node": "^10.12.0 || >=12.0.0" 127 | } 128 | }, 129 | "node_modules/@eslint/eslintrc/node_modules/ignore": { 130 | "version": "4.0.6", 131 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 132 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 133 | "dev": true, 134 | "engines": { 135 | "node": ">= 4" 136 | } 137 | }, 138 | "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { 139 | "version": "3.1.1", 140 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 141 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 142 | "dev": true, 143 | "engines": { 144 | "node": ">=8" 145 | }, 146 | "funding": { 147 | "url": "https://github.com/sponsors/sindresorhus" 148 | } 149 | }, 150 | "node_modules/@humanwhocodes/config-array": { 151 | "version": "0.5.0", 152 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", 153 | "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", 154 | "deprecated": "Use @eslint/config-array instead", 155 | "dev": true, 156 | "dependencies": { 157 | "@humanwhocodes/object-schema": "^1.2.0", 158 | "debug": "^4.1.1", 159 | "minimatch": "^3.0.4" 160 | }, 161 | "engines": { 162 | "node": ">=10.10.0" 163 | } 164 | }, 165 | "node_modules/@humanwhocodes/object-schema": { 166 | "version": "1.2.1", 167 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 168 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 169 | "deprecated": "Use @eslint/object-schema instead", 170 | "dev": true 171 | }, 172 | "node_modules/@noble/hashes": { 173 | "version": "1.8.0", 174 | "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", 175 | "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", 176 | "dev": true, 177 | "license": "MIT", 178 | "engines": { 179 | "node": "^14.21.3 || >=16" 180 | }, 181 | "funding": { 182 | "url": "https://paulmillr.com/funding/" 183 | } 184 | }, 185 | "node_modules/@paralleldrive/cuid2": { 186 | "version": "2.2.2", 187 | "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", 188 | "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", 189 | "dev": true, 190 | "license": "MIT", 191 | "dependencies": { 192 | "@noble/hashes": "^1.1.5" 193 | } 194 | }, 195 | "node_modules/accepts": { 196 | "version": "1.3.8", 197 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 198 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 199 | "dev": true, 200 | "dependencies": { 201 | "mime-types": "~2.1.34", 202 | "negotiator": "0.6.3" 203 | }, 204 | "engines": { 205 | "node": ">= 0.6" 206 | } 207 | }, 208 | "node_modules/accepts/node_modules/mime-db": { 209 | "version": "1.52.0", 210 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 211 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 212 | "dev": true, 213 | "engines": { 214 | "node": ">= 0.6" 215 | } 216 | }, 217 | "node_modules/accepts/node_modules/mime-types": { 218 | "version": "2.1.35", 219 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 220 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 221 | "dev": true, 222 | "dependencies": { 223 | "mime-db": "1.52.0" 224 | }, 225 | "engines": { 226 | "node": ">= 0.6" 227 | } 228 | }, 229 | "node_modules/acorn": { 230 | "version": "8.12.1", 231 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", 232 | "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", 233 | "dev": true, 234 | "peer": true, 235 | "bin": { 236 | "acorn": "bin/acorn" 237 | }, 238 | "engines": { 239 | "node": ">=0.4.0" 240 | } 241 | }, 242 | "node_modules/acorn-jsx": { 243 | "version": "5.3.2", 244 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 245 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 246 | "dev": true, 247 | "peerDependencies": { 248 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 249 | } 250 | }, 251 | "node_modules/ajv": { 252 | "version": "6.12.6", 253 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 254 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 255 | "dev": true, 256 | "dependencies": { 257 | "fast-deep-equal": "^3.1.1", 258 | "fast-json-stable-stringify": "^2.0.0", 259 | "json-schema-traverse": "^0.4.1", 260 | "uri-js": "^4.2.2" 261 | }, 262 | "funding": { 263 | "type": "github", 264 | "url": "https://github.com/sponsors/epoberezkin" 265 | } 266 | }, 267 | "node_modules/ansi-colors": { 268 | "version": "4.1.3", 269 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 270 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 271 | "dev": true, 272 | "engines": { 273 | "node": ">=6" 274 | } 275 | }, 276 | "node_modules/ansi-regex": { 277 | "version": "5.0.1", 278 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 279 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 280 | "dev": true, 281 | "engines": { 282 | "node": ">=8" 283 | } 284 | }, 285 | "node_modules/argparse": { 286 | "version": "1.0.10", 287 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 288 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 289 | "dev": true, 290 | "dependencies": { 291 | "sprintf-js": "~1.0.2" 292 | } 293 | }, 294 | "node_modules/array-flatten": { 295 | "version": "1.1.1", 296 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 297 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", 298 | "dev": true 299 | }, 300 | "node_modules/asap": { 301 | "version": "2.0.6", 302 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 303 | "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", 304 | "dev": true 305 | }, 306 | "node_modules/astral-regex": { 307 | "version": "2.0.0", 308 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 309 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 310 | "dev": true, 311 | "engines": { 312 | "node": ">=8" 313 | } 314 | }, 315 | "node_modules/asynckit": { 316 | "version": "0.4.0", 317 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 318 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 319 | "dev": true 320 | }, 321 | "node_modules/balanced-match": { 322 | "version": "1.0.2", 323 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 324 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 325 | "dev": true 326 | }, 327 | "node_modules/body-parser": { 328 | "version": "1.20.3", 329 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", 330 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 331 | "dev": true, 332 | "dependencies": { 333 | "bytes": "3.1.2", 334 | "content-type": "~1.0.5", 335 | "debug": "2.6.9", 336 | "depd": "2.0.0", 337 | "destroy": "1.2.0", 338 | "http-errors": "2.0.0", 339 | "iconv-lite": "0.4.24", 340 | "on-finished": "2.4.1", 341 | "qs": "6.13.0", 342 | "raw-body": "2.5.2", 343 | "type-is": "~1.6.18", 344 | "unpipe": "1.0.0" 345 | }, 346 | "engines": { 347 | "node": ">= 0.8", 348 | "npm": "1.2.8000 || >= 1.4.16" 349 | } 350 | }, 351 | "node_modules/body-parser/node_modules/debug": { 352 | "version": "2.6.9", 353 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 354 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 355 | "dev": true, 356 | "dependencies": { 357 | "ms": "2.0.0" 358 | } 359 | }, 360 | "node_modules/body-parser/node_modules/ms": { 361 | "version": "2.0.0", 362 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 363 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 364 | "dev": true 365 | }, 366 | "node_modules/brace-expansion": { 367 | "version": "1.1.11", 368 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 369 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 370 | "dev": true, 371 | "dependencies": { 372 | "balanced-match": "^1.0.0", 373 | "concat-map": "0.0.1" 374 | } 375 | }, 376 | "node_modules/bytes": { 377 | "version": "3.1.2", 378 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 379 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 380 | "dev": true, 381 | "engines": { 382 | "node": ">= 0.8" 383 | } 384 | }, 385 | "node_modules/call-bind": { 386 | "version": "1.0.7", 387 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 388 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 389 | "dev": true, 390 | "dependencies": { 391 | "es-define-property": "^1.0.0", 392 | "es-errors": "^1.3.0", 393 | "function-bind": "^1.1.2", 394 | "get-intrinsic": "^1.2.4", 395 | "set-function-length": "^1.2.1" 396 | }, 397 | "engines": { 398 | "node": ">= 0.4" 399 | }, 400 | "funding": { 401 | "url": "https://github.com/sponsors/ljharb" 402 | } 403 | }, 404 | "node_modules/callsites": { 405 | "version": "3.1.0", 406 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 407 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 408 | "dev": true, 409 | "engines": { 410 | "node": ">=6" 411 | } 412 | }, 413 | "node_modules/chalk": { 414 | "version": "4.1.2", 415 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 416 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 417 | "dev": true, 418 | "dependencies": { 419 | "ansi-styles": "^4.1.0", 420 | "supports-color": "^7.1.0" 421 | }, 422 | "engines": { 423 | "node": ">=10" 424 | }, 425 | "funding": { 426 | "url": "https://github.com/chalk/chalk?sponsor=1" 427 | } 428 | }, 429 | "node_modules/chalk/node_modules/ansi-styles": { 430 | "version": "4.3.0", 431 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 432 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 433 | "dev": true, 434 | "dependencies": { 435 | "color-convert": "^2.0.1" 436 | }, 437 | "engines": { 438 | "node": ">=8" 439 | }, 440 | "funding": { 441 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 442 | } 443 | }, 444 | "node_modules/color-convert": { 445 | "version": "2.0.1", 446 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 447 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 448 | "dev": true, 449 | "dependencies": { 450 | "color-name": "~1.1.4" 451 | }, 452 | "engines": { 453 | "node": ">=7.0.0" 454 | } 455 | }, 456 | "node_modules/color-name": { 457 | "version": "1.1.4", 458 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 459 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 460 | "dev": true 461 | }, 462 | "node_modules/combined-stream": { 463 | "version": "1.0.8", 464 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 465 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 466 | "dev": true, 467 | "dependencies": { 468 | "delayed-stream": "~1.0.0" 469 | }, 470 | "engines": { 471 | "node": ">= 0.8" 472 | } 473 | }, 474 | "node_modules/component-emitter": { 475 | "version": "1.3.1", 476 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", 477 | "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", 478 | "dev": true, 479 | "funding": { 480 | "url": "https://github.com/sponsors/sindresorhus" 481 | } 482 | }, 483 | "node_modules/concat-map": { 484 | "version": "0.0.1", 485 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 486 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 487 | "dev": true 488 | }, 489 | "node_modules/content-disposition": { 490 | "version": "0.5.4", 491 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 492 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 493 | "dev": true, 494 | "dependencies": { 495 | "safe-buffer": "5.2.1" 496 | }, 497 | "engines": { 498 | "node": ">= 0.6" 499 | } 500 | }, 501 | "node_modules/content-disposition/node_modules/safe-buffer": { 502 | "version": "5.2.1", 503 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 504 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 505 | "dev": true, 506 | "funding": [ 507 | { 508 | "type": "github", 509 | "url": "https://github.com/sponsors/feross" 510 | }, 511 | { 512 | "type": "patreon", 513 | "url": "https://www.patreon.com/feross" 514 | }, 515 | { 516 | "type": "consulting", 517 | "url": "https://feross.org/support" 518 | } 519 | ] 520 | }, 521 | "node_modules/content-type": { 522 | "version": "1.0.5", 523 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 524 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 525 | "dev": true, 526 | "engines": { 527 | "node": ">= 0.6" 528 | } 529 | }, 530 | "node_modules/cookie": { 531 | "version": "0.7.1", 532 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 533 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 534 | "dev": true, 535 | "engines": { 536 | "node": ">= 0.6" 537 | } 538 | }, 539 | "node_modules/cookie-signature": { 540 | "version": "1.0.6", 541 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 542 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", 543 | "dev": true 544 | }, 545 | "node_modules/cookiejar": { 546 | "version": "2.1.4", 547 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", 548 | "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", 549 | "dev": true 550 | }, 551 | "node_modules/correlation-id": { 552 | "version": "5.2.0", 553 | "resolved": "https://registry.npmjs.org/correlation-id/-/correlation-id-5.2.0.tgz", 554 | "integrity": "sha512-qTsYujgBvWIx05qF9HV4+KoezGTelgqJiFnyEfRsEqjpQUZdWnraOGHD+IMep7lPFg6MiI55fvpC4qruKdY5Dw==", 555 | "engines": { 556 | "node": ">=14.17.0" 557 | } 558 | }, 559 | "node_modules/cross-spawn": { 560 | "version": "7.0.3", 561 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 562 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 563 | "dev": true, 564 | "dependencies": { 565 | "path-key": "^3.1.0", 566 | "shebang-command": "^2.0.0", 567 | "which": "^2.0.1" 568 | }, 569 | "engines": { 570 | "node": ">= 8" 571 | } 572 | }, 573 | "node_modules/debug": { 574 | "version": "4.3.5", 575 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 576 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 577 | "dev": true, 578 | "dependencies": { 579 | "ms": "2.1.2" 580 | }, 581 | "engines": { 582 | "node": ">=6.0" 583 | }, 584 | "peerDependenciesMeta": { 585 | "supports-color": { 586 | "optional": true 587 | } 588 | } 589 | }, 590 | "node_modules/debug/node_modules/ms": { 591 | "version": "2.1.2", 592 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 593 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 594 | "dev": true 595 | }, 596 | "node_modules/deep-is": { 597 | "version": "0.1.4", 598 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 599 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 600 | "dev": true 601 | }, 602 | "node_modules/define-data-property": { 603 | "version": "1.1.4", 604 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 605 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 606 | "dev": true, 607 | "dependencies": { 608 | "es-define-property": "^1.0.0", 609 | "es-errors": "^1.3.0", 610 | "gopd": "^1.0.1" 611 | }, 612 | "engines": { 613 | "node": ">= 0.4" 614 | }, 615 | "funding": { 616 | "url": "https://github.com/sponsors/ljharb" 617 | } 618 | }, 619 | "node_modules/delayed-stream": { 620 | "version": "1.0.0", 621 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 622 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 623 | "dev": true, 624 | "engines": { 625 | "node": ">=0.4.0" 626 | } 627 | }, 628 | "node_modules/depd": { 629 | "version": "2.0.0", 630 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 631 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 632 | "dev": true, 633 | "engines": { 634 | "node": ">= 0.8" 635 | } 636 | }, 637 | "node_modules/destroy": { 638 | "version": "1.2.0", 639 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 640 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 641 | "dev": true, 642 | "engines": { 643 | "node": ">= 0.8", 644 | "npm": "1.2.8000 || >= 1.4.16" 645 | } 646 | }, 647 | "node_modules/dezalgo": { 648 | "version": "1.0.4", 649 | "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", 650 | "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", 651 | "dev": true, 652 | "dependencies": { 653 | "asap": "^2.0.0", 654 | "wrappy": "1" 655 | } 656 | }, 657 | "node_modules/doctrine": { 658 | "version": "3.0.0", 659 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 660 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 661 | "dev": true, 662 | "dependencies": { 663 | "esutils": "^2.0.2" 664 | }, 665 | "engines": { 666 | "node": ">=6.0.0" 667 | } 668 | }, 669 | "node_modules/ee-first": { 670 | "version": "1.1.1", 671 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 672 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 673 | "dev": true 674 | }, 675 | "node_modules/emoji-regex": { 676 | "version": "8.0.0", 677 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 678 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 679 | "dev": true 680 | }, 681 | "node_modules/encodeurl": { 682 | "version": "2.0.0", 683 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 684 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 685 | "dev": true, 686 | "engines": { 687 | "node": ">= 0.8" 688 | } 689 | }, 690 | "node_modules/enquirer": { 691 | "version": "2.4.1", 692 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", 693 | "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", 694 | "dev": true, 695 | "dependencies": { 696 | "ansi-colors": "^4.1.1", 697 | "strip-ansi": "^6.0.1" 698 | }, 699 | "engines": { 700 | "node": ">=8.6" 701 | } 702 | }, 703 | "node_modules/es-define-property": { 704 | "version": "1.0.0", 705 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 706 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 707 | "dev": true, 708 | "dependencies": { 709 | "get-intrinsic": "^1.2.4" 710 | }, 711 | "engines": { 712 | "node": ">= 0.4" 713 | } 714 | }, 715 | "node_modules/es-errors": { 716 | "version": "1.3.0", 717 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 718 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 719 | "dev": true, 720 | "engines": { 721 | "node": ">= 0.4" 722 | } 723 | }, 724 | "node_modules/escape-html": { 725 | "version": "1.0.3", 726 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 727 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 728 | "dev": true 729 | }, 730 | "node_modules/escape-string-regexp": { 731 | "version": "1.0.5", 732 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 733 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 734 | "dev": true, 735 | "engines": { 736 | "node": ">=0.8.0" 737 | } 738 | }, 739 | "node_modules/eslint": { 740 | "version": "7.32.0", 741 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", 742 | "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", 743 | "dev": true, 744 | "dependencies": { 745 | "@babel/code-frame": "7.12.11", 746 | "@eslint/eslintrc": "^0.4.3", 747 | "@humanwhocodes/config-array": "^0.5.0", 748 | "ajv": "^6.10.0", 749 | "chalk": "^4.0.0", 750 | "cross-spawn": "^7.0.2", 751 | "debug": "^4.0.1", 752 | "doctrine": "^3.0.0", 753 | "enquirer": "^2.3.5", 754 | "escape-string-regexp": "^4.0.0", 755 | "eslint-scope": "^5.1.1", 756 | "eslint-utils": "^2.1.0", 757 | "eslint-visitor-keys": "^2.0.0", 758 | "espree": "^7.3.1", 759 | "esquery": "^1.4.0", 760 | "esutils": "^2.0.2", 761 | "fast-deep-equal": "^3.1.3", 762 | "file-entry-cache": "^6.0.1", 763 | "functional-red-black-tree": "^1.0.1", 764 | "glob-parent": "^5.1.2", 765 | "globals": "^13.6.0", 766 | "ignore": "^4.0.6", 767 | "import-fresh": "^3.0.0", 768 | "imurmurhash": "^0.1.4", 769 | "is-glob": "^4.0.0", 770 | "js-yaml": "^3.13.1", 771 | "json-stable-stringify-without-jsonify": "^1.0.1", 772 | "levn": "^0.4.1", 773 | "lodash.merge": "^4.6.2", 774 | "minimatch": "^3.0.4", 775 | "natural-compare": "^1.4.0", 776 | "optionator": "^0.9.1", 777 | "progress": "^2.0.0", 778 | "regexpp": "^3.1.0", 779 | "semver": "^7.2.1", 780 | "strip-ansi": "^6.0.0", 781 | "strip-json-comments": "^3.1.0", 782 | "table": "^6.0.9", 783 | "text-table": "^0.2.0", 784 | "v8-compile-cache": "^2.0.3" 785 | }, 786 | "bin": { 787 | "eslint": "bin/eslint.js" 788 | }, 789 | "engines": { 790 | "node": "^10.12.0 || >=12.0.0" 791 | }, 792 | "funding": { 793 | "url": "https://opencollective.com/eslint" 794 | } 795 | }, 796 | "node_modules/eslint-config-toboid": { 797 | "version": "2.0.0", 798 | "resolved": "https://registry.npmjs.org/eslint-config-toboid/-/eslint-config-toboid-2.0.0.tgz", 799 | "integrity": "sha1-a/Xar+39mlpjSABXfWnsb689lVE=", 800 | "dev": true 801 | }, 802 | "node_modules/eslint-scope": { 803 | "version": "5.1.1", 804 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 805 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 806 | "dev": true, 807 | "dependencies": { 808 | "esrecurse": "^4.3.0", 809 | "estraverse": "^4.1.1" 810 | }, 811 | "engines": { 812 | "node": ">=8.0.0" 813 | } 814 | }, 815 | "node_modules/eslint-scope/node_modules/estraverse": { 816 | "version": "4.3.0", 817 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 818 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 819 | "dev": true, 820 | "engines": { 821 | "node": ">=4.0" 822 | } 823 | }, 824 | "node_modules/eslint-utils": { 825 | "version": "2.1.0", 826 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 827 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 828 | "dev": true, 829 | "dependencies": { 830 | "eslint-visitor-keys": "^1.1.0" 831 | }, 832 | "engines": { 833 | "node": ">=6" 834 | }, 835 | "funding": { 836 | "url": "https://github.com/sponsors/mysticatea" 837 | } 838 | }, 839 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 840 | "version": "1.3.0", 841 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 842 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 843 | "dev": true, 844 | "engines": { 845 | "node": ">=4" 846 | } 847 | }, 848 | "node_modules/eslint-visitor-keys": { 849 | "version": "2.1.0", 850 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 851 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 852 | "dev": true, 853 | "engines": { 854 | "node": ">=10" 855 | } 856 | }, 857 | "node_modules/eslint/node_modules/@babel/code-frame": { 858 | "version": "7.12.11", 859 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 860 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 861 | "dev": true, 862 | "dependencies": { 863 | "@babel/highlight": "^7.10.4" 864 | } 865 | }, 866 | "node_modules/eslint/node_modules/escape-string-regexp": { 867 | "version": "4.0.0", 868 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 869 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 870 | "dev": true, 871 | "engines": { 872 | "node": ">=10" 873 | }, 874 | "funding": { 875 | "url": "https://github.com/sponsors/sindresorhus" 876 | } 877 | }, 878 | "node_modules/eslint/node_modules/ignore": { 879 | "version": "4.0.6", 880 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 881 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 882 | "dev": true, 883 | "engines": { 884 | "node": ">= 4" 885 | } 886 | }, 887 | "node_modules/eslint/node_modules/strip-json-comments": { 888 | "version": "3.1.1", 889 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 890 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 891 | "dev": true, 892 | "engines": { 893 | "node": ">=8" 894 | }, 895 | "funding": { 896 | "url": "https://github.com/sponsors/sindresorhus" 897 | } 898 | }, 899 | "node_modules/espree": { 900 | "version": "7.3.1", 901 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 902 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 903 | "dev": true, 904 | "dependencies": { 905 | "acorn": "^7.4.0", 906 | "acorn-jsx": "^5.3.1", 907 | "eslint-visitor-keys": "^1.3.0" 908 | }, 909 | "engines": { 910 | "node": "^10.12.0 || >=12.0.0" 911 | } 912 | }, 913 | "node_modules/espree/node_modules/acorn": { 914 | "version": "7.4.1", 915 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 916 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 917 | "dev": true, 918 | "bin": { 919 | "acorn": "bin/acorn" 920 | }, 921 | "engines": { 922 | "node": ">=0.4.0" 923 | } 924 | }, 925 | "node_modules/espree/node_modules/eslint-visitor-keys": { 926 | "version": "1.3.0", 927 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 928 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 929 | "dev": true, 930 | "engines": { 931 | "node": ">=4" 932 | } 933 | }, 934 | "node_modules/esprima": { 935 | "version": "4.0.1", 936 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 937 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 938 | "dev": true, 939 | "bin": { 940 | "esparse": "bin/esparse.js", 941 | "esvalidate": "bin/esvalidate.js" 942 | }, 943 | "engines": { 944 | "node": ">=4" 945 | } 946 | }, 947 | "node_modules/esquery": { 948 | "version": "1.6.0", 949 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 950 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 951 | "dev": true, 952 | "dependencies": { 953 | "estraverse": "^5.1.0" 954 | }, 955 | "engines": { 956 | "node": ">=0.10" 957 | } 958 | }, 959 | "node_modules/esrecurse": { 960 | "version": "4.3.0", 961 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 962 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 963 | "dev": true, 964 | "dependencies": { 965 | "estraverse": "^5.2.0" 966 | }, 967 | "engines": { 968 | "node": ">=4.0" 969 | } 970 | }, 971 | "node_modules/estraverse": { 972 | "version": "5.3.0", 973 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 974 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 975 | "dev": true, 976 | "engines": { 977 | "node": ">=4.0" 978 | } 979 | }, 980 | "node_modules/esutils": { 981 | "version": "2.0.3", 982 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 983 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 984 | "dev": true, 985 | "engines": { 986 | "node": ">=0.10.0" 987 | } 988 | }, 989 | "node_modules/etag": { 990 | "version": "1.8.1", 991 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 992 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 993 | "dev": true, 994 | "engines": { 995 | "node": ">= 0.6" 996 | } 997 | }, 998 | "node_modules/express": { 999 | "version": "4.21.1", 1000 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", 1001 | "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", 1002 | "dev": true, 1003 | "dependencies": { 1004 | "accepts": "~1.3.8", 1005 | "array-flatten": "1.1.1", 1006 | "body-parser": "1.20.3", 1007 | "content-disposition": "0.5.4", 1008 | "content-type": "~1.0.4", 1009 | "cookie": "0.7.1", 1010 | "cookie-signature": "1.0.6", 1011 | "debug": "2.6.9", 1012 | "depd": "2.0.0", 1013 | "encodeurl": "~2.0.0", 1014 | "escape-html": "~1.0.3", 1015 | "etag": "~1.8.1", 1016 | "finalhandler": "1.3.1", 1017 | "fresh": "0.5.2", 1018 | "http-errors": "2.0.0", 1019 | "merge-descriptors": "1.0.3", 1020 | "methods": "~1.1.2", 1021 | "on-finished": "2.4.1", 1022 | "parseurl": "~1.3.3", 1023 | "path-to-regexp": "0.1.10", 1024 | "proxy-addr": "~2.0.7", 1025 | "qs": "6.13.0", 1026 | "range-parser": "~1.2.1", 1027 | "safe-buffer": "5.2.1", 1028 | "send": "0.19.0", 1029 | "serve-static": "1.16.2", 1030 | "setprototypeof": "1.2.0", 1031 | "statuses": "2.0.1", 1032 | "type-is": "~1.6.18", 1033 | "utils-merge": "1.0.1", 1034 | "vary": "~1.1.2" 1035 | }, 1036 | "engines": { 1037 | "node": ">= 0.10.0" 1038 | } 1039 | }, 1040 | "node_modules/express/node_modules/debug": { 1041 | "version": "2.6.9", 1042 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1043 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1044 | "dev": true, 1045 | "dependencies": { 1046 | "ms": "2.0.0" 1047 | } 1048 | }, 1049 | "node_modules/express/node_modules/ms": { 1050 | "version": "2.0.0", 1051 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1052 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1053 | "dev": true 1054 | }, 1055 | "node_modules/express/node_modules/safe-buffer": { 1056 | "version": "5.2.1", 1057 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1058 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1059 | "dev": true, 1060 | "funding": [ 1061 | { 1062 | "type": "github", 1063 | "url": "https://github.com/sponsors/feross" 1064 | }, 1065 | { 1066 | "type": "patreon", 1067 | "url": "https://www.patreon.com/feross" 1068 | }, 1069 | { 1070 | "type": "consulting", 1071 | "url": "https://feross.org/support" 1072 | } 1073 | ] 1074 | }, 1075 | "node_modules/fast-deep-equal": { 1076 | "version": "3.1.3", 1077 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1078 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1079 | "dev": true 1080 | }, 1081 | "node_modules/fast-json-stable-stringify": { 1082 | "version": "2.1.0", 1083 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1084 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1085 | "dev": true 1086 | }, 1087 | "node_modules/fast-levenshtein": { 1088 | "version": "2.0.6", 1089 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1090 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1091 | "dev": true 1092 | }, 1093 | "node_modules/fast-safe-stringify": { 1094 | "version": "2.1.1", 1095 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", 1096 | "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", 1097 | "dev": true 1098 | }, 1099 | "node_modules/fast-uri": { 1100 | "version": "3.0.1", 1101 | "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", 1102 | "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", 1103 | "dev": true 1104 | }, 1105 | "node_modules/file-entry-cache": { 1106 | "version": "6.0.1", 1107 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1108 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1109 | "dev": true, 1110 | "dependencies": { 1111 | "flat-cache": "^3.0.4" 1112 | }, 1113 | "engines": { 1114 | "node": "^10.12.0 || >=12.0.0" 1115 | } 1116 | }, 1117 | "node_modules/finalhandler": { 1118 | "version": "1.3.1", 1119 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", 1120 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 1121 | "dev": true, 1122 | "dependencies": { 1123 | "debug": "2.6.9", 1124 | "encodeurl": "~2.0.0", 1125 | "escape-html": "~1.0.3", 1126 | "on-finished": "2.4.1", 1127 | "parseurl": "~1.3.3", 1128 | "statuses": "2.0.1", 1129 | "unpipe": "~1.0.0" 1130 | }, 1131 | "engines": { 1132 | "node": ">= 0.8" 1133 | } 1134 | }, 1135 | "node_modules/finalhandler/node_modules/debug": { 1136 | "version": "2.6.9", 1137 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1138 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1139 | "dev": true, 1140 | "dependencies": { 1141 | "ms": "2.0.0" 1142 | } 1143 | }, 1144 | "node_modules/finalhandler/node_modules/ms": { 1145 | "version": "2.0.0", 1146 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1147 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1148 | "dev": true 1149 | }, 1150 | "node_modules/flat-cache": { 1151 | "version": "3.2.0", 1152 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", 1153 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 1154 | "dev": true, 1155 | "dependencies": { 1156 | "flatted": "^3.2.9", 1157 | "keyv": "^4.5.3", 1158 | "rimraf": "^3.0.2" 1159 | }, 1160 | "engines": { 1161 | "node": "^10.12.0 || >=12.0.0" 1162 | } 1163 | }, 1164 | "node_modules/flat-cache/node_modules/json-buffer": { 1165 | "version": "3.0.1", 1166 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1167 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1168 | "dev": true 1169 | }, 1170 | "node_modules/flat-cache/node_modules/keyv": { 1171 | "version": "4.5.4", 1172 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1173 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1174 | "dev": true, 1175 | "dependencies": { 1176 | "json-buffer": "3.0.1" 1177 | } 1178 | }, 1179 | "node_modules/flatted": { 1180 | "version": "3.3.1", 1181 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 1182 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 1183 | "dev": true 1184 | }, 1185 | "node_modules/form-data": { 1186 | "version": "4.0.0", 1187 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1188 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1189 | "dev": true, 1190 | "dependencies": { 1191 | "asynckit": "^0.4.0", 1192 | "combined-stream": "^1.0.8", 1193 | "mime-types": "^2.1.12" 1194 | }, 1195 | "engines": { 1196 | "node": ">= 6" 1197 | } 1198 | }, 1199 | "node_modules/formidable": { 1200 | "version": "3.5.4", 1201 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", 1202 | "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", 1203 | "dev": true, 1204 | "license": "MIT", 1205 | "dependencies": { 1206 | "@paralleldrive/cuid2": "^2.2.2", 1207 | "dezalgo": "^1.0.4", 1208 | "once": "^1.4.0" 1209 | }, 1210 | "engines": { 1211 | "node": ">=14.0.0" 1212 | }, 1213 | "funding": { 1214 | "url": "https://ko-fi.com/tunnckoCore/commissions" 1215 | } 1216 | }, 1217 | "node_modules/forwarded": { 1218 | "version": "0.2.0", 1219 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1220 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 1221 | "dev": true, 1222 | "engines": { 1223 | "node": ">= 0.6" 1224 | } 1225 | }, 1226 | "node_modules/fresh": { 1227 | "version": "0.5.2", 1228 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1229 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 1230 | "dev": true, 1231 | "engines": { 1232 | "node": ">= 0.6" 1233 | } 1234 | }, 1235 | "node_modules/fs.realpath": { 1236 | "version": "1.0.0", 1237 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1238 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1239 | "dev": true 1240 | }, 1241 | "node_modules/function-bind": { 1242 | "version": "1.1.2", 1243 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1244 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1245 | "dev": true, 1246 | "funding": { 1247 | "url": "https://github.com/sponsors/ljharb" 1248 | } 1249 | }, 1250 | "node_modules/functional-red-black-tree": { 1251 | "version": "1.0.1", 1252 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1253 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", 1254 | "dev": true 1255 | }, 1256 | "node_modules/get-intrinsic": { 1257 | "version": "1.2.4", 1258 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 1259 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 1260 | "dev": true, 1261 | "dependencies": { 1262 | "es-errors": "^1.3.0", 1263 | "function-bind": "^1.1.2", 1264 | "has-proto": "^1.0.1", 1265 | "has-symbols": "^1.0.3", 1266 | "hasown": "^2.0.0" 1267 | }, 1268 | "engines": { 1269 | "node": ">= 0.4" 1270 | }, 1271 | "funding": { 1272 | "url": "https://github.com/sponsors/ljharb" 1273 | } 1274 | }, 1275 | "node_modules/glob": { 1276 | "version": "7.1.7", 1277 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 1278 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 1279 | "deprecated": "Glob versions prior to v9 are no longer supported", 1280 | "dev": true, 1281 | "dependencies": { 1282 | "fs.realpath": "^1.0.0", 1283 | "inflight": "^1.0.4", 1284 | "inherits": "2", 1285 | "minimatch": "^3.0.4", 1286 | "once": "^1.3.0", 1287 | "path-is-absolute": "^1.0.0" 1288 | }, 1289 | "engines": { 1290 | "node": "*" 1291 | }, 1292 | "funding": { 1293 | "url": "https://github.com/sponsors/isaacs" 1294 | } 1295 | }, 1296 | "node_modules/glob-parent": { 1297 | "version": "5.1.2", 1298 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1299 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1300 | "dev": true, 1301 | "dependencies": { 1302 | "is-glob": "^4.0.1" 1303 | }, 1304 | "engines": { 1305 | "node": ">= 6" 1306 | } 1307 | }, 1308 | "node_modules/globals": { 1309 | "version": "13.24.0", 1310 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 1311 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 1312 | "dev": true, 1313 | "dependencies": { 1314 | "type-fest": "^0.20.2" 1315 | }, 1316 | "engines": { 1317 | "node": ">=8" 1318 | }, 1319 | "funding": { 1320 | "url": "https://github.com/sponsors/sindresorhus" 1321 | } 1322 | }, 1323 | "node_modules/globals/node_modules/type-fest": { 1324 | "version": "0.20.2", 1325 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1326 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1327 | "dev": true, 1328 | "engines": { 1329 | "node": ">=10" 1330 | }, 1331 | "funding": { 1332 | "url": "https://github.com/sponsors/sindresorhus" 1333 | } 1334 | }, 1335 | "node_modules/gopd": { 1336 | "version": "1.0.1", 1337 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1338 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1339 | "dev": true, 1340 | "dependencies": { 1341 | "get-intrinsic": "^1.1.3" 1342 | }, 1343 | "funding": { 1344 | "url": "https://github.com/sponsors/ljharb" 1345 | } 1346 | }, 1347 | "node_modules/has-flag": { 1348 | "version": "4.0.0", 1349 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1350 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1351 | "dev": true, 1352 | "engines": { 1353 | "node": ">=8" 1354 | } 1355 | }, 1356 | "node_modules/has-property-descriptors": { 1357 | "version": "1.0.2", 1358 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 1359 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 1360 | "dev": true, 1361 | "dependencies": { 1362 | "es-define-property": "^1.0.0" 1363 | }, 1364 | "funding": { 1365 | "url": "https://github.com/sponsors/ljharb" 1366 | } 1367 | }, 1368 | "node_modules/has-proto": { 1369 | "version": "1.0.3", 1370 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 1371 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 1372 | "dev": true, 1373 | "engines": { 1374 | "node": ">= 0.4" 1375 | }, 1376 | "funding": { 1377 | "url": "https://github.com/sponsors/ljharb" 1378 | } 1379 | }, 1380 | "node_modules/has-symbols": { 1381 | "version": "1.0.3", 1382 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1383 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1384 | "dev": true, 1385 | "engines": { 1386 | "node": ">= 0.4" 1387 | }, 1388 | "funding": { 1389 | "url": "https://github.com/sponsors/ljharb" 1390 | } 1391 | }, 1392 | "node_modules/hasown": { 1393 | "version": "2.0.2", 1394 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1395 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1396 | "dev": true, 1397 | "dependencies": { 1398 | "function-bind": "^1.1.2" 1399 | }, 1400 | "engines": { 1401 | "node": ">= 0.4" 1402 | } 1403 | }, 1404 | "node_modules/http-errors": { 1405 | "version": "2.0.0", 1406 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1407 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1408 | "dev": true, 1409 | "dependencies": { 1410 | "depd": "2.0.0", 1411 | "inherits": "2.0.4", 1412 | "setprototypeof": "1.2.0", 1413 | "statuses": "2.0.1", 1414 | "toidentifier": "1.0.1" 1415 | }, 1416 | "engines": { 1417 | "node": ">= 0.8" 1418 | } 1419 | }, 1420 | "node_modules/iconv-lite": { 1421 | "version": "0.4.24", 1422 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1423 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1424 | "dev": true, 1425 | "dependencies": { 1426 | "safer-buffer": ">= 2.1.2 < 3" 1427 | }, 1428 | "engines": { 1429 | "node": ">=0.10.0" 1430 | } 1431 | }, 1432 | "node_modules/import-fresh": { 1433 | "version": "3.3.0", 1434 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1435 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1436 | "dev": true, 1437 | "dependencies": { 1438 | "parent-module": "^1.0.0", 1439 | "resolve-from": "^4.0.0" 1440 | }, 1441 | "engines": { 1442 | "node": ">=6" 1443 | }, 1444 | "funding": { 1445 | "url": "https://github.com/sponsors/sindresorhus" 1446 | } 1447 | }, 1448 | "node_modules/import-fresh/node_modules/resolve-from": { 1449 | "version": "4.0.0", 1450 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1451 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1452 | "dev": true, 1453 | "engines": { 1454 | "node": ">=4" 1455 | } 1456 | }, 1457 | "node_modules/imurmurhash": { 1458 | "version": "0.1.4", 1459 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1460 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1461 | "dev": true, 1462 | "engines": { 1463 | "node": ">=0.8.19" 1464 | } 1465 | }, 1466 | "node_modules/inflight": { 1467 | "version": "1.0.6", 1468 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1469 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1470 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 1471 | "dev": true, 1472 | "dependencies": { 1473 | "once": "^1.3.0", 1474 | "wrappy": "1" 1475 | } 1476 | }, 1477 | "node_modules/inherits": { 1478 | "version": "2.0.4", 1479 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1480 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1481 | "dev": true 1482 | }, 1483 | "node_modules/ipaddr.js": { 1484 | "version": "1.9.1", 1485 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1486 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1487 | "dev": true, 1488 | "engines": { 1489 | "node": ">= 0.10" 1490 | } 1491 | }, 1492 | "node_modules/is-extglob": { 1493 | "version": "2.1.1", 1494 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1495 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1496 | "dev": true, 1497 | "engines": { 1498 | "node": ">=0.10.0" 1499 | } 1500 | }, 1501 | "node_modules/is-fullwidth-code-point": { 1502 | "version": "3.0.0", 1503 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1504 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1505 | "dev": true, 1506 | "engines": { 1507 | "node": ">=8" 1508 | } 1509 | }, 1510 | "node_modules/is-glob": { 1511 | "version": "4.0.3", 1512 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1513 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1514 | "dev": true, 1515 | "dependencies": { 1516 | "is-extglob": "^2.1.1" 1517 | }, 1518 | "engines": { 1519 | "node": ">=0.10.0" 1520 | } 1521 | }, 1522 | "node_modules/isexe": { 1523 | "version": "2.0.0", 1524 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1525 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1526 | "dev": true 1527 | }, 1528 | "node_modules/js-tokens": { 1529 | "version": "4.0.0", 1530 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1531 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1532 | "dev": true 1533 | }, 1534 | "node_modules/js-yaml": { 1535 | "version": "3.14.1", 1536 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1537 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1538 | "dev": true, 1539 | "dependencies": { 1540 | "argparse": "^1.0.7", 1541 | "esprima": "^4.0.0" 1542 | }, 1543 | "bin": { 1544 | "js-yaml": "bin/js-yaml.js" 1545 | } 1546 | }, 1547 | "node_modules/json-schema-traverse": { 1548 | "version": "0.4.1", 1549 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1550 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1551 | "dev": true 1552 | }, 1553 | "node_modules/json-stable-stringify-without-jsonify": { 1554 | "version": "1.0.1", 1555 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1556 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1557 | "dev": true 1558 | }, 1559 | "node_modules/levn": { 1560 | "version": "0.4.1", 1561 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1562 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1563 | "dev": true, 1564 | "dependencies": { 1565 | "prelude-ls": "^1.2.1", 1566 | "type-check": "~0.4.0" 1567 | }, 1568 | "engines": { 1569 | "node": ">= 0.8.0" 1570 | } 1571 | }, 1572 | "node_modules/lodash.merge": { 1573 | "version": "4.6.2", 1574 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1575 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1576 | "dev": true 1577 | }, 1578 | "node_modules/lodash.truncate": { 1579 | "version": "4.4.2", 1580 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", 1581 | "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", 1582 | "dev": true 1583 | }, 1584 | "node_modules/media-typer": { 1585 | "version": "0.3.0", 1586 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1587 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1588 | "dev": true, 1589 | "engines": { 1590 | "node": ">= 0.6" 1591 | } 1592 | }, 1593 | "node_modules/merge-descriptors": { 1594 | "version": "1.0.3", 1595 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 1596 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", 1597 | "dev": true, 1598 | "funding": { 1599 | "url": "https://github.com/sponsors/sindresorhus" 1600 | } 1601 | }, 1602 | "node_modules/methods": { 1603 | "version": "1.1.2", 1604 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1605 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 1606 | "dev": true, 1607 | "engines": { 1608 | "node": ">= 0.6" 1609 | } 1610 | }, 1611 | "node_modules/mime": { 1612 | "version": "1.6.0", 1613 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1614 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1615 | "dev": true, 1616 | "bin": { 1617 | "mime": "cli.js" 1618 | }, 1619 | "engines": { 1620 | "node": ">=4" 1621 | } 1622 | }, 1623 | "node_modules/mime-db": { 1624 | "version": "1.49.0", 1625 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", 1626 | "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", 1627 | "dev": true, 1628 | "engines": { 1629 | "node": ">= 0.6" 1630 | } 1631 | }, 1632 | "node_modules/mime-types": { 1633 | "version": "2.1.32", 1634 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", 1635 | "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", 1636 | "dev": true, 1637 | "dependencies": { 1638 | "mime-db": "1.49.0" 1639 | }, 1640 | "engines": { 1641 | "node": ">= 0.6" 1642 | } 1643 | }, 1644 | "node_modules/minimatch": { 1645 | "version": "3.1.2", 1646 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1647 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1648 | "dev": true, 1649 | "dependencies": { 1650 | "brace-expansion": "^1.1.7" 1651 | }, 1652 | "engines": { 1653 | "node": "*" 1654 | } 1655 | }, 1656 | "node_modules/ms": { 1657 | "version": "2.1.3", 1658 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1659 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1660 | "dev": true 1661 | }, 1662 | "node_modules/natural-compare": { 1663 | "version": "1.4.0", 1664 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1665 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1666 | "dev": true 1667 | }, 1668 | "node_modules/negotiator": { 1669 | "version": "0.6.3", 1670 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1671 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1672 | "dev": true, 1673 | "engines": { 1674 | "node": ">= 0.6" 1675 | } 1676 | }, 1677 | "node_modules/object-inspect": { 1678 | "version": "1.13.2", 1679 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 1680 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 1681 | "dev": true, 1682 | "engines": { 1683 | "node": ">= 0.4" 1684 | }, 1685 | "funding": { 1686 | "url": "https://github.com/sponsors/ljharb" 1687 | } 1688 | }, 1689 | "node_modules/on-finished": { 1690 | "version": "2.4.1", 1691 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1692 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1693 | "dev": true, 1694 | "dependencies": { 1695 | "ee-first": "1.1.1" 1696 | }, 1697 | "engines": { 1698 | "node": ">= 0.8" 1699 | } 1700 | }, 1701 | "node_modules/once": { 1702 | "version": "1.4.0", 1703 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1704 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1705 | "dev": true, 1706 | "dependencies": { 1707 | "wrappy": "1" 1708 | } 1709 | }, 1710 | "node_modules/optionator": { 1711 | "version": "0.9.4", 1712 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 1713 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1714 | "dev": true, 1715 | "dependencies": { 1716 | "deep-is": "^0.1.3", 1717 | "fast-levenshtein": "^2.0.6", 1718 | "levn": "^0.4.1", 1719 | "prelude-ls": "^1.2.1", 1720 | "type-check": "^0.4.0", 1721 | "word-wrap": "^1.2.5" 1722 | }, 1723 | "engines": { 1724 | "node": ">= 0.8.0" 1725 | } 1726 | }, 1727 | "node_modules/parent-module": { 1728 | "version": "1.0.1", 1729 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1730 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1731 | "dev": true, 1732 | "dependencies": { 1733 | "callsites": "^3.0.0" 1734 | }, 1735 | "engines": { 1736 | "node": ">=6" 1737 | } 1738 | }, 1739 | "node_modules/parseurl": { 1740 | "version": "1.3.3", 1741 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1742 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1743 | "dev": true, 1744 | "engines": { 1745 | "node": ">= 0.8" 1746 | } 1747 | }, 1748 | "node_modules/path-is-absolute": { 1749 | "version": "1.0.1", 1750 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1751 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1752 | "dev": true, 1753 | "engines": { 1754 | "node": ">=0.10.0" 1755 | } 1756 | }, 1757 | "node_modules/path-key": { 1758 | "version": "3.1.1", 1759 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1760 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1761 | "dev": true, 1762 | "engines": { 1763 | "node": ">=8" 1764 | } 1765 | }, 1766 | "node_modules/path-to-regexp": { 1767 | "version": "0.1.10", 1768 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", 1769 | "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", 1770 | "dev": true 1771 | }, 1772 | "node_modules/prelude-ls": { 1773 | "version": "1.2.1", 1774 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1775 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1776 | "dev": true, 1777 | "engines": { 1778 | "node": ">= 0.8.0" 1779 | } 1780 | }, 1781 | "node_modules/progress": { 1782 | "version": "2.0.3", 1783 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1784 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1785 | "dev": true, 1786 | "engines": { 1787 | "node": ">=0.4.0" 1788 | } 1789 | }, 1790 | "node_modules/proxy-addr": { 1791 | "version": "2.0.7", 1792 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1793 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1794 | "dev": true, 1795 | "dependencies": { 1796 | "forwarded": "0.2.0", 1797 | "ipaddr.js": "1.9.1" 1798 | }, 1799 | "engines": { 1800 | "node": ">= 0.10" 1801 | } 1802 | }, 1803 | "node_modules/punycode": { 1804 | "version": "2.3.1", 1805 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1806 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1807 | "dev": true, 1808 | "engines": { 1809 | "node": ">=6" 1810 | } 1811 | }, 1812 | "node_modules/qs": { 1813 | "version": "6.13.0", 1814 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 1815 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 1816 | "dev": true, 1817 | "dependencies": { 1818 | "side-channel": "^1.0.6" 1819 | }, 1820 | "engines": { 1821 | "node": ">=0.6" 1822 | }, 1823 | "funding": { 1824 | "url": "https://github.com/sponsors/ljharb" 1825 | } 1826 | }, 1827 | "node_modules/range-parser": { 1828 | "version": "1.2.1", 1829 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1830 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1831 | "dev": true, 1832 | "engines": { 1833 | "node": ">= 0.6" 1834 | } 1835 | }, 1836 | "node_modules/raw-body": { 1837 | "version": "2.5.2", 1838 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1839 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1840 | "dev": true, 1841 | "dependencies": { 1842 | "bytes": "3.1.2", 1843 | "http-errors": "2.0.0", 1844 | "iconv-lite": "0.4.24", 1845 | "unpipe": "1.0.0" 1846 | }, 1847 | "engines": { 1848 | "node": ">= 0.8" 1849 | } 1850 | }, 1851 | "node_modules/regexpp": { 1852 | "version": "3.2.0", 1853 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1854 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1855 | "dev": true, 1856 | "engines": { 1857 | "node": ">=8" 1858 | }, 1859 | "funding": { 1860 | "url": "https://github.com/sponsors/mysticatea" 1861 | } 1862 | }, 1863 | "node_modules/require-from-string": { 1864 | "version": "2.0.2", 1865 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1866 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1867 | "dev": true, 1868 | "engines": { 1869 | "node": ">=0.10.0" 1870 | } 1871 | }, 1872 | "node_modules/rimraf": { 1873 | "version": "3.0.2", 1874 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1875 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1876 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 1877 | "dev": true, 1878 | "dependencies": { 1879 | "glob": "^7.1.3" 1880 | }, 1881 | "bin": { 1882 | "rimraf": "bin.js" 1883 | }, 1884 | "funding": { 1885 | "url": "https://github.com/sponsors/isaacs" 1886 | } 1887 | }, 1888 | "node_modules/safer-buffer": { 1889 | "version": "2.1.2", 1890 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1891 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1892 | "dev": true 1893 | }, 1894 | "node_modules/semver": { 1895 | "version": "7.6.3", 1896 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1897 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1898 | "dev": true, 1899 | "bin": { 1900 | "semver": "bin/semver.js" 1901 | }, 1902 | "engines": { 1903 | "node": ">=10" 1904 | } 1905 | }, 1906 | "node_modules/send": { 1907 | "version": "0.19.0", 1908 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", 1909 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 1910 | "dev": true, 1911 | "dependencies": { 1912 | "debug": "2.6.9", 1913 | "depd": "2.0.0", 1914 | "destroy": "1.2.0", 1915 | "encodeurl": "~1.0.2", 1916 | "escape-html": "~1.0.3", 1917 | "etag": "~1.8.1", 1918 | "fresh": "0.5.2", 1919 | "http-errors": "2.0.0", 1920 | "mime": "1.6.0", 1921 | "ms": "2.1.3", 1922 | "on-finished": "2.4.1", 1923 | "range-parser": "~1.2.1", 1924 | "statuses": "2.0.1" 1925 | }, 1926 | "engines": { 1927 | "node": ">= 0.8.0" 1928 | } 1929 | }, 1930 | "node_modules/send/node_modules/debug": { 1931 | "version": "2.6.9", 1932 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1933 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1934 | "dev": true, 1935 | "dependencies": { 1936 | "ms": "2.0.0" 1937 | } 1938 | }, 1939 | "node_modules/send/node_modules/debug/node_modules/ms": { 1940 | "version": "2.0.0", 1941 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1942 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1943 | "dev": true 1944 | }, 1945 | "node_modules/send/node_modules/encodeurl": { 1946 | "version": "1.0.2", 1947 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1948 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 1949 | "dev": true, 1950 | "engines": { 1951 | "node": ">= 0.8" 1952 | } 1953 | }, 1954 | "node_modules/serve-static": { 1955 | "version": "1.16.2", 1956 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", 1957 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 1958 | "dev": true, 1959 | "dependencies": { 1960 | "encodeurl": "~2.0.0", 1961 | "escape-html": "~1.0.3", 1962 | "parseurl": "~1.3.3", 1963 | "send": "0.19.0" 1964 | }, 1965 | "engines": { 1966 | "node": ">= 0.8.0" 1967 | } 1968 | }, 1969 | "node_modules/set-function-length": { 1970 | "version": "1.2.2", 1971 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1972 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1973 | "dev": true, 1974 | "dependencies": { 1975 | "define-data-property": "^1.1.4", 1976 | "es-errors": "^1.3.0", 1977 | "function-bind": "^1.1.2", 1978 | "get-intrinsic": "^1.2.4", 1979 | "gopd": "^1.0.1", 1980 | "has-property-descriptors": "^1.0.2" 1981 | }, 1982 | "engines": { 1983 | "node": ">= 0.4" 1984 | } 1985 | }, 1986 | "node_modules/setprototypeof": { 1987 | "version": "1.2.0", 1988 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1989 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1990 | "dev": true 1991 | }, 1992 | "node_modules/shebang-command": { 1993 | "version": "2.0.0", 1994 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1995 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1996 | "dev": true, 1997 | "dependencies": { 1998 | "shebang-regex": "^3.0.0" 1999 | }, 2000 | "engines": { 2001 | "node": ">=8" 2002 | } 2003 | }, 2004 | "node_modules/shebang-regex": { 2005 | "version": "3.0.0", 2006 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2007 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2008 | "dev": true, 2009 | "engines": { 2010 | "node": ">=8" 2011 | } 2012 | }, 2013 | "node_modules/side-channel": { 2014 | "version": "1.0.6", 2015 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 2016 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 2017 | "dev": true, 2018 | "dependencies": { 2019 | "call-bind": "^1.0.7", 2020 | "es-errors": "^1.3.0", 2021 | "get-intrinsic": "^1.2.4", 2022 | "object-inspect": "^1.13.1" 2023 | }, 2024 | "engines": { 2025 | "node": ">= 0.4" 2026 | }, 2027 | "funding": { 2028 | "url": "https://github.com/sponsors/ljharb" 2029 | } 2030 | }, 2031 | "node_modules/sprintf-js": { 2032 | "version": "1.0.3", 2033 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2034 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2035 | "dev": true 2036 | }, 2037 | "node_modules/statuses": { 2038 | "version": "2.0.1", 2039 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2040 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2041 | "dev": true, 2042 | "engines": { 2043 | "node": ">= 0.8" 2044 | } 2045 | }, 2046 | "node_modules/string-width": { 2047 | "version": "4.2.3", 2048 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2049 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2050 | "dev": true, 2051 | "dependencies": { 2052 | "emoji-regex": "^8.0.0", 2053 | "is-fullwidth-code-point": "^3.0.0", 2054 | "strip-ansi": "^6.0.1" 2055 | }, 2056 | "engines": { 2057 | "node": ">=8" 2058 | } 2059 | }, 2060 | "node_modules/strip-ansi": { 2061 | "version": "6.0.1", 2062 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2063 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2064 | "dev": true, 2065 | "dependencies": { 2066 | "ansi-regex": "^5.0.1" 2067 | }, 2068 | "engines": { 2069 | "node": ">=8" 2070 | } 2071 | }, 2072 | "node_modules/superagent": { 2073 | "version": "9.0.2", 2074 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", 2075 | "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", 2076 | "dev": true, 2077 | "dependencies": { 2078 | "component-emitter": "^1.3.0", 2079 | "cookiejar": "^2.1.4", 2080 | "debug": "^4.3.4", 2081 | "fast-safe-stringify": "^2.1.1", 2082 | "form-data": "^4.0.0", 2083 | "formidable": "^3.5.1", 2084 | "methods": "^1.1.2", 2085 | "mime": "2.6.0", 2086 | "qs": "^6.11.0" 2087 | }, 2088 | "engines": { 2089 | "node": ">=14.18.0" 2090 | } 2091 | }, 2092 | "node_modules/superagent/node_modules/mime": { 2093 | "version": "2.6.0", 2094 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", 2095 | "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", 2096 | "dev": true, 2097 | "bin": { 2098 | "mime": "cli.js" 2099 | }, 2100 | "engines": { 2101 | "node": ">=4.0.0" 2102 | } 2103 | }, 2104 | "node_modules/supertest": { 2105 | "version": "7.0.0", 2106 | "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", 2107 | "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", 2108 | "dev": true, 2109 | "dependencies": { 2110 | "methods": "^1.1.2", 2111 | "superagent": "^9.0.1" 2112 | }, 2113 | "engines": { 2114 | "node": ">=14.18.0" 2115 | } 2116 | }, 2117 | "node_modules/supports-color": { 2118 | "version": "7.2.0", 2119 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2120 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2121 | "dev": true, 2122 | "dependencies": { 2123 | "has-flag": "^4.0.0" 2124 | }, 2125 | "engines": { 2126 | "node": ">=8" 2127 | } 2128 | }, 2129 | "node_modules/table": { 2130 | "version": "6.8.2", 2131 | "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", 2132 | "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", 2133 | "dev": true, 2134 | "dependencies": { 2135 | "ajv": "^8.0.1", 2136 | "lodash.truncate": "^4.4.2", 2137 | "slice-ansi": "^4.0.0", 2138 | "string-width": "^4.2.3", 2139 | "strip-ansi": "^6.0.1" 2140 | }, 2141 | "engines": { 2142 | "node": ">=10.0.0" 2143 | } 2144 | }, 2145 | "node_modules/table/node_modules/ajv": { 2146 | "version": "8.17.1", 2147 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", 2148 | "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", 2149 | "dev": true, 2150 | "dependencies": { 2151 | "fast-deep-equal": "^3.1.3", 2152 | "fast-uri": "^3.0.1", 2153 | "json-schema-traverse": "^1.0.0", 2154 | "require-from-string": "^2.0.2" 2155 | }, 2156 | "funding": { 2157 | "type": "github", 2158 | "url": "https://github.com/sponsors/epoberezkin" 2159 | } 2160 | }, 2161 | "node_modules/table/node_modules/ansi-styles": { 2162 | "version": "4.3.0", 2163 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2164 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2165 | "dev": true, 2166 | "dependencies": { 2167 | "color-convert": "^2.0.1" 2168 | }, 2169 | "engines": { 2170 | "node": ">=8" 2171 | }, 2172 | "funding": { 2173 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2174 | } 2175 | }, 2176 | "node_modules/table/node_modules/json-schema-traverse": { 2177 | "version": "1.0.0", 2178 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 2179 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 2180 | "dev": true 2181 | }, 2182 | "node_modules/table/node_modules/slice-ansi": { 2183 | "version": "4.0.0", 2184 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 2185 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 2186 | "dev": true, 2187 | "dependencies": { 2188 | "ansi-styles": "^4.0.0", 2189 | "astral-regex": "^2.0.0", 2190 | "is-fullwidth-code-point": "^3.0.0" 2191 | }, 2192 | "engines": { 2193 | "node": ">=10" 2194 | }, 2195 | "funding": { 2196 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 2197 | } 2198 | }, 2199 | "node_modules/text-table": { 2200 | "version": "0.2.0", 2201 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2202 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2203 | "dev": true 2204 | }, 2205 | "node_modules/toidentifier": { 2206 | "version": "1.0.1", 2207 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2208 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2209 | "dev": true, 2210 | "engines": { 2211 | "node": ">=0.6" 2212 | } 2213 | }, 2214 | "node_modules/type-check": { 2215 | "version": "0.4.0", 2216 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2217 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2218 | "dev": true, 2219 | "dependencies": { 2220 | "prelude-ls": "^1.2.1" 2221 | }, 2222 | "engines": { 2223 | "node": ">= 0.8.0" 2224 | } 2225 | }, 2226 | "node_modules/type-is": { 2227 | "version": "1.6.18", 2228 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2229 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2230 | "dev": true, 2231 | "dependencies": { 2232 | "media-typer": "0.3.0", 2233 | "mime-types": "~2.1.24" 2234 | }, 2235 | "engines": { 2236 | "node": ">= 0.6" 2237 | } 2238 | }, 2239 | "node_modules/unpipe": { 2240 | "version": "1.0.0", 2241 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2242 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 2243 | "dev": true, 2244 | "engines": { 2245 | "node": ">= 0.8" 2246 | } 2247 | }, 2248 | "node_modules/uri-js": { 2249 | "version": "4.4.1", 2250 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2251 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2252 | "dev": true, 2253 | "dependencies": { 2254 | "punycode": "^2.1.0" 2255 | } 2256 | }, 2257 | "node_modules/utils-merge": { 2258 | "version": "1.0.1", 2259 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2260 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 2261 | "dev": true, 2262 | "engines": { 2263 | "node": ">= 0.4.0" 2264 | } 2265 | }, 2266 | "node_modules/v8-compile-cache": { 2267 | "version": "2.4.0", 2268 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", 2269 | "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", 2270 | "dev": true 2271 | }, 2272 | "node_modules/vary": { 2273 | "version": "1.1.2", 2274 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2275 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 2276 | "dev": true, 2277 | "engines": { 2278 | "node": ">= 0.8" 2279 | } 2280 | }, 2281 | "node_modules/which": { 2282 | "version": "2.0.2", 2283 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2284 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2285 | "dev": true, 2286 | "dependencies": { 2287 | "isexe": "^2.0.0" 2288 | }, 2289 | "bin": { 2290 | "node-which": "bin/node-which" 2291 | }, 2292 | "engines": { 2293 | "node": ">= 8" 2294 | } 2295 | }, 2296 | "node_modules/word-wrap": { 2297 | "version": "1.2.5", 2298 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 2299 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 2300 | "dev": true, 2301 | "engines": { 2302 | "node": ">=0.10.0" 2303 | } 2304 | }, 2305 | "node_modules/wrappy": { 2306 | "version": "1.0.2", 2307 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2308 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2309 | "dev": true 2310 | } 2311 | } 2312 | } 2313 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-correlation-id", 3 | "version": "3.0.1", 4 | "description": "Express middleware to correlate requests across http calls", 5 | "main": "index.js", 6 | "files": [ 7 | "index.js", 8 | "test", 9 | "examples" 10 | ], 11 | "engines": { 12 | "node": ">=12.17.0" 13 | }, 14 | "scripts": { 15 | "lint": "eslint index.js test/*.js examples/*.js", 16 | "test": "node --test test/*", 17 | "coverage": "node --test --experimental-test-coverage test/*", 18 | "watch": "node --test --watch .", 19 | "ci": "npm run lint && npm run coverage" 20 | }, 21 | "repository": { 22 | "type": "git", 23 | "url": "git+https://github.com/toboid/express-correlation-id.git" 24 | }, 25 | "keywords": [ 26 | "express", 27 | "logging", 28 | "correlation", 29 | "debug" 30 | ], 31 | "author": "toboid", 32 | "license": "MIT", 33 | "bugs": { 34 | "url": "https://github.com/toboid/express-correlation-id/issues" 35 | }, 36 | "homepage": "https://github.com/toboid/express-correlation-id#readme", 37 | "dependencies": { 38 | "correlation-id": "^5.2.0" 39 | }, 40 | "devDependencies": { 41 | "eslint": "^7.32.0", 42 | "eslint-config-toboid": "^2.0.0", 43 | "express": "^4.19.2", 44 | "supertest": "^7.0.0" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Express correlation id 2 | 3 | Express middleware to set a [correlation id](https://github.com/toboid/correlation-id) per route in express. The correlation id will be consistent across async calls within the handling of a request. 4 | 5 | ## Compatibility 6 | 7 | From v3 onwards this library requires node >=16. For older node versions use v2.x. 8 | 9 | ## Installation 10 | 11 | ```shell 12 | npm i express-correlation-id --save 13 | ``` 14 | 15 | ## Middleware usage example 16 | 17 | All middleware and route handlers following the `correlator()` middleware will be within a single correlation scope. If the incoming request has a header called `x-correlation-id` then it's value will be used as the id for this request, otherwise the id will be a new uuid. 18 | 19 | **Note:** the correlator middleware should be placed after any other middleware. 20 | 21 | ```javascript 22 | const correlator = require('express-correlation-id'); 23 | const express = require('express'); 24 | 25 | const app = express(); 26 | // app.use other middleware here 27 | app.use(correlator()); 28 | 29 | app.get('/', (req, res) => { 30 | console.log('ID for this request is:', req.correlationId()); // id for this request 31 | console.log('ID for this request is:', correlator.getId()); // equal to above, not dependant on the req object 32 | res.end(); 33 | }); 34 | ``` 35 | 36 | ## API 37 | 38 | ### `correlator([options])` 39 | 40 | Returns an express middleware that creates a correlation scope for all following middleware and route handlers. If the incoming request has a header with name `x-correlation-id` then it's value will be used as the id. The header name is configurable, see options below. 41 | To ensure the correlation id is available to other middleware, ensure that it's applied after them. 42 | 43 | ```javascript 44 | const app = express(); 45 | // app.use other middleware here 46 | app.use(correlator()); 47 | ``` 48 | 49 | #### options 50 | 51 | Options to configure the correlator middleware. 52 | 53 | ##### `header` 54 | 55 | Configures the name of the inbound header to check for a correlation id. 56 | 57 | ```javascript 58 | const app = express(); 59 | app.use(correlator({ header: 'x-my-correlation-header-name' })); 60 | ``` 61 | 62 | ### `correlator.getId()` 63 | 64 | Returns the id for the current request. If called outside of a request returns `undefined`. This function is useful if you don't want to pass the `req` object or correlation id from the handler to downstream code. 65 | 66 | ```javascript 67 | correlator.getId(); // Returns the current id or undefined 68 | ``` 69 | 70 | ### `req.correlationId()` 71 | 72 | Returns the id for the current request. This function is added to the incoming `req` by the middleware. 73 | 74 | ```javascript 75 | req.correlationId(); // Returns the current id 76 | ``` 77 | 78 | ### `correlator.setId(id)` 79 | 80 | Sets the id for the current request. If called outside of a request throws and error. Useful if you 81 | need to set the correlatiaon id and don't want to pass `req` object from the haandler to downstreama code. 82 | 83 | ```javascript 84 | correlator.setId('my-new-id'); 85 | ``` 86 | 87 | ### `req.setCorrelationId()` 88 | 89 | Sets the id for the current request. This function is added to the incoming `req` by the middleware. 90 | 91 | ```javascript 92 | req.setCorrelationId('my-new-id'); 93 | ``` 94 | 95 | ## License 96 | 97 | MIT 98 | -------------------------------------------------------------------------------- /test/correlator.tests.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { it } = require('node:test'); 4 | const express = require('express'); 5 | const request = require('supertest'); 6 | const correlator = require('../index'); 7 | 8 | const uuidMatcher = 9 | /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; 10 | 11 | it('sets id from incoming request', async (t) => { 12 | t.plan(1); 13 | 14 | const testId = 'correlator-123'; 15 | 16 | const app = express(); 17 | app.use(correlator()); 18 | app.get('/', (req, res) => { 19 | setTimeout(() => { 20 | const actual = req.correlationId(); 21 | t.assert.strictEqual(actual, testId); 22 | res.end(); 23 | }); 24 | }); 25 | 26 | return request(app).get('/').set('x-correlation-id', testId); 27 | }); 28 | 29 | it('uses configured header name', async (t) => { 30 | t.plan(1); 31 | 32 | const headerName = 'x-foo'; 33 | const testId = 'correlator-123'; 34 | 35 | const app = express(); 36 | app.use(correlator({ header: headerName })); 37 | app.get('/', (req, res) => { 38 | setTimeout(() => { 39 | const actual = req.correlationId(); 40 | t.assert.strictEqual(actual, testId); 41 | res.end(); 42 | }); 43 | }); 44 | 45 | return request(app).get('/').set(headerName, testId); 46 | }); 47 | 48 | it('sets id using req.setCorrelationId(id)', async (t) => { 49 | t.plan(1); 50 | 51 | const testId = 'correlator-123'; 52 | 53 | const app = express(); 54 | app.use(correlator()); 55 | app.use((req, res, next) => { 56 | req.setCorrelationId(testId); 57 | next(); 58 | }); 59 | app.get('/', (req, res) => { 60 | setTimeout(() => { 61 | const actual = req.correlationId(); 62 | t.assert.strictEqual(actual, testId); 63 | res.end(); 64 | }); 65 | }); 66 | 67 | return request(app).get('/'); 68 | }); 69 | 70 | it('sets id using correlator.setId(id)', async (t) => { 71 | t.plan(1); 72 | 73 | const testId = 'correlator-123'; 74 | 75 | const app = express(); 76 | app.use(correlator()); 77 | app.use((req, res, next) => { 78 | correlator.setId(testId); 79 | next(); 80 | }); 81 | app.get('/', (req, res) => { 82 | setTimeout(() => { 83 | const actual = req.correlationId(); 84 | t.assert.strictEqual(actual, testId); 85 | res.end(); 86 | }); 87 | }); 88 | 89 | return request(app).get('/'); 90 | }); 91 | 92 | it('gets the id with correlator.getId() and ', async (t) => { 93 | t.plan(2); 94 | 95 | const app = express(); 96 | app.use(correlator()); 97 | app.get('/', (req, res) => { 98 | setTimeout(() => { 99 | const actualGetId = correlator.getId(); 100 | const actualCorrelationid = req.correlationId(); 101 | t.assert.strictEqual(actualGetId, actualCorrelationid); 102 | t.assert.match(actualGetId, uuidMatcher); 103 | res.end(); 104 | }); 105 | }); 106 | 107 | return request(app).get('/'); 108 | }); 109 | --------------------------------------------------------------------------------