├── .gitignore ├── README.md ├── docker-compose.yml ├── package-lock.json ├── package.json ├── script.txt └── src ├── background-task.js ├── cluster.js ├── db.js ├── index.js └── seed.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Parallelizing Node.js operations with child process 2 | 3 | Example of [how to Migrate 1M items from MongoDB to Postgres in just a few minutes](https://youtu.be/EnK8-x8L9TY) using Node.js child process 4 | 5 | **First leave your star in the repo 🌟** 6 | ![Aumentando em 999x a velocidade de processamento de dados com Node](https://github.com/ErickWendel/parallelizing-nodejs-ops/assets/8060102/6974de93-7848-477a-9198-9d99dedc18f3) 7 | 8 | 9 | ## Running 10 | 11 | You'll need to install Docker and Docker compose to be able to spin up the DBs instances, after that run: 12 | - docker-compose up -d 13 | - npm ci 14 | - npm run seed 15 | - npm start 16 | 17 | ## Errors? 18 | 19 | In case you got an error of too many processes open, try decreasing the const [CLUSTER_SIZE](https://github.com/ErickWendel/parallelizing-nodejs-ops/blob/main/src/index.js#L8C1-L8C24) variable 20 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | 3 | services: 4 | mongodb: 5 | image: mongo 6 | ports: 7 | - 27017:27017 8 | environment: 9 | MONGO_INITDB_ROOT_USERNAME: root 10 | MONGO_INITDB_ROOT_PASSWORD: example 11 | 12 | postgres: 13 | image: postgres:latest 14 | container_name: my_postgres_db 15 | ports: 16 | - "5432:5432" 17 | environment: 18 | POSTGRES_DB: school 19 | POSTGRES_USER: erickwendel 20 | POSTGRES_PASSWORD: mypassword -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "parallelizing-nodejs-ops", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "parallelizing-nodejs-ops", 9 | "version": "0.0.1", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cli-progress": "^3.12.0", 13 | "draftlog": "^1.0.13", 14 | "mongodb": "^6.5.0", 15 | "pg": "^8.11.5", 16 | "sqlite3": "^5.1.7" 17 | }, 18 | "devDependencies": { 19 | "@faker-js/faker": "^8.4.1" 20 | }, 21 | "engines": { 22 | "node": "v20.12.1" 23 | } 24 | }, 25 | "node_modules/@faker-js/faker": { 26 | "version": "8.4.1", 27 | "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", 28 | "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", 29 | "dev": true, 30 | "funding": [ 31 | { 32 | "type": "opencollective", 33 | "url": "https://opencollective.com/fakerjs" 34 | } 35 | ], 36 | "engines": { 37 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0", 38 | "npm": ">=6.14.13" 39 | } 40 | }, 41 | "node_modules/@gar/promisify": { 42 | "version": "1.1.3", 43 | "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", 44 | "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", 45 | "optional": true 46 | }, 47 | "node_modules/@mongodb-js/saslprep": { 48 | "version": "1.1.5", 49 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", 50 | "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", 51 | "dependencies": { 52 | "sparse-bitfield": "^3.0.3" 53 | } 54 | }, 55 | "node_modules/@npmcli/fs": { 56 | "version": "1.1.1", 57 | "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", 58 | "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", 59 | "optional": true, 60 | "dependencies": { 61 | "@gar/promisify": "^1.0.1", 62 | "semver": "^7.3.5" 63 | } 64 | }, 65 | "node_modules/@npmcli/move-file": { 66 | "version": "1.1.2", 67 | "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", 68 | "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", 69 | "deprecated": "This functionality has been moved to @npmcli/fs", 70 | "optional": true, 71 | "dependencies": { 72 | "mkdirp": "^1.0.4", 73 | "rimraf": "^3.0.2" 74 | }, 75 | "engines": { 76 | "node": ">=10" 77 | } 78 | }, 79 | "node_modules/@tootallnate/once": { 80 | "version": "1.1.2", 81 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 82 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 83 | "optional": true, 84 | "engines": { 85 | "node": ">= 6" 86 | } 87 | }, 88 | "node_modules/@types/webidl-conversions": { 89 | "version": "7.0.3", 90 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", 91 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" 92 | }, 93 | "node_modules/@types/whatwg-url": { 94 | "version": "11.0.4", 95 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", 96 | "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", 97 | "dependencies": { 98 | "@types/webidl-conversions": "*" 99 | } 100 | }, 101 | "node_modules/abbrev": { 102 | "version": "1.1.1", 103 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 104 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 105 | "optional": true 106 | }, 107 | "node_modules/agent-base": { 108 | "version": "6.0.2", 109 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 110 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 111 | "optional": true, 112 | "dependencies": { 113 | "debug": "4" 114 | }, 115 | "engines": { 116 | "node": ">= 6.0.0" 117 | } 118 | }, 119 | "node_modules/agentkeepalive": { 120 | "version": "4.5.0", 121 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", 122 | "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", 123 | "optional": true, 124 | "dependencies": { 125 | "humanize-ms": "^1.2.1" 126 | }, 127 | "engines": { 128 | "node": ">= 8.0.0" 129 | } 130 | }, 131 | "node_modules/aggregate-error": { 132 | "version": "3.1.0", 133 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 134 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 135 | "optional": true, 136 | "dependencies": { 137 | "clean-stack": "^2.0.0", 138 | "indent-string": "^4.0.0" 139 | }, 140 | "engines": { 141 | "node": ">=8" 142 | } 143 | }, 144 | "node_modules/ansi-regex": { 145 | "version": "5.0.1", 146 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 147 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 148 | "engines": { 149 | "node": ">=8" 150 | } 151 | }, 152 | "node_modules/aproba": { 153 | "version": "2.0.0", 154 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 155 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", 156 | "optional": true 157 | }, 158 | "node_modules/are-we-there-yet": { 159 | "version": "3.0.1", 160 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", 161 | "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", 162 | "optional": true, 163 | "dependencies": { 164 | "delegates": "^1.0.0", 165 | "readable-stream": "^3.6.0" 166 | }, 167 | "engines": { 168 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 169 | } 170 | }, 171 | "node_modules/balanced-match": { 172 | "version": "1.0.2", 173 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 174 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 175 | "optional": true 176 | }, 177 | "node_modules/base64-js": { 178 | "version": "1.5.1", 179 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 180 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 181 | "funding": [ 182 | { 183 | "type": "github", 184 | "url": "https://github.com/sponsors/feross" 185 | }, 186 | { 187 | "type": "patreon", 188 | "url": "https://www.patreon.com/feross" 189 | }, 190 | { 191 | "type": "consulting", 192 | "url": "https://feross.org/support" 193 | } 194 | ] 195 | }, 196 | "node_modules/bindings": { 197 | "version": "1.5.0", 198 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 199 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 200 | "dependencies": { 201 | "file-uri-to-path": "1.0.0" 202 | } 203 | }, 204 | "node_modules/bl": { 205 | "version": "4.1.0", 206 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 207 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 208 | "dependencies": { 209 | "buffer": "^5.5.0", 210 | "inherits": "^2.0.4", 211 | "readable-stream": "^3.4.0" 212 | } 213 | }, 214 | "node_modules/brace-expansion": { 215 | "version": "1.1.11", 216 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 217 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 218 | "optional": true, 219 | "dependencies": { 220 | "balanced-match": "^1.0.0", 221 | "concat-map": "0.0.1" 222 | } 223 | }, 224 | "node_modules/bson": { 225 | "version": "6.6.0", 226 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.6.0.tgz", 227 | "integrity": "sha512-BVINv2SgcMjL4oYbBuCQTpE3/VKOSxrOA8Cj/wQP7izSzlBGVomdm+TcUd0Pzy0ytLSSDweCKQ6X3f5veM5LQA==", 228 | "engines": { 229 | "node": ">=16.20.1" 230 | } 231 | }, 232 | "node_modules/buffer": { 233 | "version": "5.7.1", 234 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 235 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 236 | "funding": [ 237 | { 238 | "type": "github", 239 | "url": "https://github.com/sponsors/feross" 240 | }, 241 | { 242 | "type": "patreon", 243 | "url": "https://www.patreon.com/feross" 244 | }, 245 | { 246 | "type": "consulting", 247 | "url": "https://feross.org/support" 248 | } 249 | ], 250 | "dependencies": { 251 | "base64-js": "^1.3.1", 252 | "ieee754": "^1.1.13" 253 | } 254 | }, 255 | "node_modules/cacache": { 256 | "version": "15.3.0", 257 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", 258 | "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", 259 | "optional": true, 260 | "dependencies": { 261 | "@npmcli/fs": "^1.0.0", 262 | "@npmcli/move-file": "^1.0.1", 263 | "chownr": "^2.0.0", 264 | "fs-minipass": "^2.0.0", 265 | "glob": "^7.1.4", 266 | "infer-owner": "^1.0.4", 267 | "lru-cache": "^6.0.0", 268 | "minipass": "^3.1.1", 269 | "minipass-collect": "^1.0.2", 270 | "minipass-flush": "^1.0.5", 271 | "minipass-pipeline": "^1.2.2", 272 | "mkdirp": "^1.0.3", 273 | "p-map": "^4.0.0", 274 | "promise-inflight": "^1.0.1", 275 | "rimraf": "^3.0.2", 276 | "ssri": "^8.0.1", 277 | "tar": "^6.0.2", 278 | "unique-filename": "^1.1.1" 279 | }, 280 | "engines": { 281 | "node": ">= 10" 282 | } 283 | }, 284 | "node_modules/chownr": { 285 | "version": "2.0.0", 286 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 287 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 288 | "engines": { 289 | "node": ">=10" 290 | } 291 | }, 292 | "node_modules/clean-stack": { 293 | "version": "2.2.0", 294 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 295 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 296 | "optional": true, 297 | "engines": { 298 | "node": ">=6" 299 | } 300 | }, 301 | "node_modules/cli-progress": { 302 | "version": "3.12.0", 303 | "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", 304 | "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", 305 | "dependencies": { 306 | "string-width": "^4.2.3" 307 | }, 308 | "engines": { 309 | "node": ">=4" 310 | } 311 | }, 312 | "node_modules/color-support": { 313 | "version": "1.1.3", 314 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 315 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 316 | "optional": true, 317 | "bin": { 318 | "color-support": "bin.js" 319 | } 320 | }, 321 | "node_modules/concat-map": { 322 | "version": "0.0.1", 323 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 324 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 325 | "optional": true 326 | }, 327 | "node_modules/console-control-strings": { 328 | "version": "1.1.0", 329 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 330 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", 331 | "optional": true 332 | }, 333 | "node_modules/debug": { 334 | "version": "4.3.4", 335 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 336 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 337 | "optional": true, 338 | "dependencies": { 339 | "ms": "2.1.2" 340 | }, 341 | "engines": { 342 | "node": ">=6.0" 343 | }, 344 | "peerDependenciesMeta": { 345 | "supports-color": { 346 | "optional": true 347 | } 348 | } 349 | }, 350 | "node_modules/decompress-response": { 351 | "version": "6.0.0", 352 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 353 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 354 | "dependencies": { 355 | "mimic-response": "^3.1.0" 356 | }, 357 | "engines": { 358 | "node": ">=10" 359 | }, 360 | "funding": { 361 | "url": "https://github.com/sponsors/sindresorhus" 362 | } 363 | }, 364 | "node_modules/deep-extend": { 365 | "version": "0.6.0", 366 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 367 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 368 | "engines": { 369 | "node": ">=4.0.0" 370 | } 371 | }, 372 | "node_modules/delegates": { 373 | "version": "1.0.0", 374 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 375 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", 376 | "optional": true 377 | }, 378 | "node_modules/detect-libc": { 379 | "version": "2.0.3", 380 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 381 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 382 | "engines": { 383 | "node": ">=8" 384 | } 385 | }, 386 | "node_modules/draftlog": { 387 | "version": "1.0.13", 388 | "resolved": "https://registry.npmjs.org/draftlog/-/draftlog-1.0.13.tgz", 389 | "integrity": "sha512-GeMWOpXERBpfVDK6v7m0x1hPg8+g8ZsZWqJl2T17wHqrm4h8fnjiZmXcnCrmwogAc6R3YTxFXax15wezfuyCUw==" 390 | }, 391 | "node_modules/emoji-regex": { 392 | "version": "8.0.0", 393 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 394 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 395 | }, 396 | "node_modules/encoding": { 397 | "version": "0.1.13", 398 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 399 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 400 | "optional": true, 401 | "dependencies": { 402 | "iconv-lite": "^0.6.2" 403 | } 404 | }, 405 | "node_modules/end-of-stream": { 406 | "version": "1.4.4", 407 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 408 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 409 | "dependencies": { 410 | "once": "^1.4.0" 411 | } 412 | }, 413 | "node_modules/env-paths": { 414 | "version": "2.2.1", 415 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 416 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 417 | "optional": true, 418 | "engines": { 419 | "node": ">=6" 420 | } 421 | }, 422 | "node_modules/err-code": { 423 | "version": "2.0.3", 424 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 425 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", 426 | "optional": true 427 | }, 428 | "node_modules/expand-template": { 429 | "version": "2.0.3", 430 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 431 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 432 | "engines": { 433 | "node": ">=6" 434 | } 435 | }, 436 | "node_modules/file-uri-to-path": { 437 | "version": "1.0.0", 438 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 439 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 440 | }, 441 | "node_modules/fs-constants": { 442 | "version": "1.0.0", 443 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 444 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 445 | }, 446 | "node_modules/fs-minipass": { 447 | "version": "2.1.0", 448 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 449 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 450 | "dependencies": { 451 | "minipass": "^3.0.0" 452 | }, 453 | "engines": { 454 | "node": ">= 8" 455 | } 456 | }, 457 | "node_modules/fs.realpath": { 458 | "version": "1.0.0", 459 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 460 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 461 | "optional": true 462 | }, 463 | "node_modules/gauge": { 464 | "version": "4.0.4", 465 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", 466 | "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", 467 | "optional": true, 468 | "dependencies": { 469 | "aproba": "^1.0.3 || ^2.0.0", 470 | "color-support": "^1.1.3", 471 | "console-control-strings": "^1.1.0", 472 | "has-unicode": "^2.0.1", 473 | "signal-exit": "^3.0.7", 474 | "string-width": "^4.2.3", 475 | "strip-ansi": "^6.0.1", 476 | "wide-align": "^1.1.5" 477 | }, 478 | "engines": { 479 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 480 | } 481 | }, 482 | "node_modules/github-from-package": { 483 | "version": "0.0.0", 484 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 485 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" 486 | }, 487 | "node_modules/glob": { 488 | "version": "7.2.3", 489 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 490 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 491 | "optional": true, 492 | "dependencies": { 493 | "fs.realpath": "^1.0.0", 494 | "inflight": "^1.0.4", 495 | "inherits": "2", 496 | "minimatch": "^3.1.1", 497 | "once": "^1.3.0", 498 | "path-is-absolute": "^1.0.0" 499 | }, 500 | "engines": { 501 | "node": "*" 502 | }, 503 | "funding": { 504 | "url": "https://github.com/sponsors/isaacs" 505 | } 506 | }, 507 | "node_modules/graceful-fs": { 508 | "version": "4.2.11", 509 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 510 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 511 | "optional": true 512 | }, 513 | "node_modules/has-unicode": { 514 | "version": "2.0.1", 515 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 516 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", 517 | "optional": true 518 | }, 519 | "node_modules/http-cache-semantics": { 520 | "version": "4.1.1", 521 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 522 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 523 | "optional": true 524 | }, 525 | "node_modules/http-proxy-agent": { 526 | "version": "4.0.1", 527 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 528 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 529 | "optional": true, 530 | "dependencies": { 531 | "@tootallnate/once": "1", 532 | "agent-base": "6", 533 | "debug": "4" 534 | }, 535 | "engines": { 536 | "node": ">= 6" 537 | } 538 | }, 539 | "node_modules/https-proxy-agent": { 540 | "version": "5.0.1", 541 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 542 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 543 | "optional": true, 544 | "dependencies": { 545 | "agent-base": "6", 546 | "debug": "4" 547 | }, 548 | "engines": { 549 | "node": ">= 6" 550 | } 551 | }, 552 | "node_modules/humanize-ms": { 553 | "version": "1.2.1", 554 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 555 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 556 | "optional": true, 557 | "dependencies": { 558 | "ms": "^2.0.0" 559 | } 560 | }, 561 | "node_modules/iconv-lite": { 562 | "version": "0.6.3", 563 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 564 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 565 | "optional": true, 566 | "dependencies": { 567 | "safer-buffer": ">= 2.1.2 < 3.0.0" 568 | }, 569 | "engines": { 570 | "node": ">=0.10.0" 571 | } 572 | }, 573 | "node_modules/ieee754": { 574 | "version": "1.2.1", 575 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 576 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 577 | "funding": [ 578 | { 579 | "type": "github", 580 | "url": "https://github.com/sponsors/feross" 581 | }, 582 | { 583 | "type": "patreon", 584 | "url": "https://www.patreon.com/feross" 585 | }, 586 | { 587 | "type": "consulting", 588 | "url": "https://feross.org/support" 589 | } 590 | ] 591 | }, 592 | "node_modules/imurmurhash": { 593 | "version": "0.1.4", 594 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 595 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 596 | "optional": true, 597 | "engines": { 598 | "node": ">=0.8.19" 599 | } 600 | }, 601 | "node_modules/indent-string": { 602 | "version": "4.0.0", 603 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 604 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 605 | "optional": true, 606 | "engines": { 607 | "node": ">=8" 608 | } 609 | }, 610 | "node_modules/infer-owner": { 611 | "version": "1.0.4", 612 | "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 613 | "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 614 | "optional": true 615 | }, 616 | "node_modules/inflight": { 617 | "version": "1.0.6", 618 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 619 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 620 | "optional": true, 621 | "dependencies": { 622 | "once": "^1.3.0", 623 | "wrappy": "1" 624 | } 625 | }, 626 | "node_modules/inherits": { 627 | "version": "2.0.4", 628 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 629 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 630 | }, 631 | "node_modules/ini": { 632 | "version": "1.3.8", 633 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 634 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 635 | }, 636 | "node_modules/ip-address": { 637 | "version": "9.0.5", 638 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 639 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 640 | "optional": true, 641 | "dependencies": { 642 | "jsbn": "1.1.0", 643 | "sprintf-js": "^1.1.3" 644 | }, 645 | "engines": { 646 | "node": ">= 12" 647 | } 648 | }, 649 | "node_modules/is-fullwidth-code-point": { 650 | "version": "3.0.0", 651 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 652 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 653 | "engines": { 654 | "node": ">=8" 655 | } 656 | }, 657 | "node_modules/is-lambda": { 658 | "version": "1.0.1", 659 | "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 660 | "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", 661 | "optional": true 662 | }, 663 | "node_modules/isexe": { 664 | "version": "2.0.0", 665 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 666 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 667 | "optional": true 668 | }, 669 | "node_modules/jsbn": { 670 | "version": "1.1.0", 671 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 672 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", 673 | "optional": true 674 | }, 675 | "node_modules/lru-cache": { 676 | "version": "6.0.0", 677 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 678 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 679 | "dependencies": { 680 | "yallist": "^4.0.0" 681 | }, 682 | "engines": { 683 | "node": ">=10" 684 | } 685 | }, 686 | "node_modules/make-fetch-happen": { 687 | "version": "9.1.0", 688 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", 689 | "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", 690 | "optional": true, 691 | "dependencies": { 692 | "agentkeepalive": "^4.1.3", 693 | "cacache": "^15.2.0", 694 | "http-cache-semantics": "^4.1.0", 695 | "http-proxy-agent": "^4.0.1", 696 | "https-proxy-agent": "^5.0.0", 697 | "is-lambda": "^1.0.1", 698 | "lru-cache": "^6.0.0", 699 | "minipass": "^3.1.3", 700 | "minipass-collect": "^1.0.2", 701 | "minipass-fetch": "^1.3.2", 702 | "minipass-flush": "^1.0.5", 703 | "minipass-pipeline": "^1.2.4", 704 | "negotiator": "^0.6.2", 705 | "promise-retry": "^2.0.1", 706 | "socks-proxy-agent": "^6.0.0", 707 | "ssri": "^8.0.0" 708 | }, 709 | "engines": { 710 | "node": ">= 10" 711 | } 712 | }, 713 | "node_modules/memory-pager": { 714 | "version": "1.5.0", 715 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 716 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 717 | }, 718 | "node_modules/mimic-response": { 719 | "version": "3.1.0", 720 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 721 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 722 | "engines": { 723 | "node": ">=10" 724 | }, 725 | "funding": { 726 | "url": "https://github.com/sponsors/sindresorhus" 727 | } 728 | }, 729 | "node_modules/minimatch": { 730 | "version": "3.1.2", 731 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 732 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 733 | "optional": true, 734 | "dependencies": { 735 | "brace-expansion": "^1.1.7" 736 | }, 737 | "engines": { 738 | "node": "*" 739 | } 740 | }, 741 | "node_modules/minimist": { 742 | "version": "1.2.8", 743 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 744 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 745 | "funding": { 746 | "url": "https://github.com/sponsors/ljharb" 747 | } 748 | }, 749 | "node_modules/minipass": { 750 | "version": "3.3.6", 751 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 752 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 753 | "dependencies": { 754 | "yallist": "^4.0.0" 755 | }, 756 | "engines": { 757 | "node": ">=8" 758 | } 759 | }, 760 | "node_modules/minipass-collect": { 761 | "version": "1.0.2", 762 | "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", 763 | "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", 764 | "optional": true, 765 | "dependencies": { 766 | "minipass": "^3.0.0" 767 | }, 768 | "engines": { 769 | "node": ">= 8" 770 | } 771 | }, 772 | "node_modules/minipass-fetch": { 773 | "version": "1.4.1", 774 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", 775 | "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", 776 | "optional": true, 777 | "dependencies": { 778 | "minipass": "^3.1.0", 779 | "minipass-sized": "^1.0.3", 780 | "minizlib": "^2.0.0" 781 | }, 782 | "engines": { 783 | "node": ">=8" 784 | }, 785 | "optionalDependencies": { 786 | "encoding": "^0.1.12" 787 | } 788 | }, 789 | "node_modules/minipass-flush": { 790 | "version": "1.0.5", 791 | "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 792 | "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 793 | "optional": true, 794 | "dependencies": { 795 | "minipass": "^3.0.0" 796 | }, 797 | "engines": { 798 | "node": ">= 8" 799 | } 800 | }, 801 | "node_modules/minipass-pipeline": { 802 | "version": "1.2.4", 803 | "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", 804 | "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", 805 | "optional": true, 806 | "dependencies": { 807 | "minipass": "^3.0.0" 808 | }, 809 | "engines": { 810 | "node": ">=8" 811 | } 812 | }, 813 | "node_modules/minipass-sized": { 814 | "version": "1.0.3", 815 | "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 816 | "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 817 | "optional": true, 818 | "dependencies": { 819 | "minipass": "^3.0.0" 820 | }, 821 | "engines": { 822 | "node": ">=8" 823 | } 824 | }, 825 | "node_modules/minizlib": { 826 | "version": "2.1.2", 827 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 828 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 829 | "dependencies": { 830 | "minipass": "^3.0.0", 831 | "yallist": "^4.0.0" 832 | }, 833 | "engines": { 834 | "node": ">= 8" 835 | } 836 | }, 837 | "node_modules/mkdirp": { 838 | "version": "1.0.4", 839 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 840 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 841 | "bin": { 842 | "mkdirp": "bin/cmd.js" 843 | }, 844 | "engines": { 845 | "node": ">=10" 846 | } 847 | }, 848 | "node_modules/mkdirp-classic": { 849 | "version": "0.5.3", 850 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 851 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 852 | }, 853 | "node_modules/mongodb": { 854 | "version": "6.5.0", 855 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.5.0.tgz", 856 | "integrity": "sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==", 857 | "dependencies": { 858 | "@mongodb-js/saslprep": "^1.1.5", 859 | "bson": "^6.4.0", 860 | "mongodb-connection-string-url": "^3.0.0" 861 | }, 862 | "engines": { 863 | "node": ">=16.20.1" 864 | }, 865 | "peerDependencies": { 866 | "@aws-sdk/credential-providers": "^3.188.0", 867 | "@mongodb-js/zstd": "^1.1.0", 868 | "gcp-metadata": "^5.2.0", 869 | "kerberos": "^2.0.1", 870 | "mongodb-client-encryption": ">=6.0.0 <7", 871 | "snappy": "^7.2.2", 872 | "socks": "^2.7.1" 873 | }, 874 | "peerDependenciesMeta": { 875 | "@aws-sdk/credential-providers": { 876 | "optional": true 877 | }, 878 | "@mongodb-js/zstd": { 879 | "optional": true 880 | }, 881 | "gcp-metadata": { 882 | "optional": true 883 | }, 884 | "kerberos": { 885 | "optional": true 886 | }, 887 | "mongodb-client-encryption": { 888 | "optional": true 889 | }, 890 | "snappy": { 891 | "optional": true 892 | }, 893 | "socks": { 894 | "optional": true 895 | } 896 | } 897 | }, 898 | "node_modules/mongodb-connection-string-url": { 899 | "version": "3.0.0", 900 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", 901 | "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", 902 | "dependencies": { 903 | "@types/whatwg-url": "^11.0.2", 904 | "whatwg-url": "^13.0.0" 905 | } 906 | }, 907 | "node_modules/ms": { 908 | "version": "2.1.2", 909 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 910 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 911 | "optional": true 912 | }, 913 | "node_modules/napi-build-utils": { 914 | "version": "1.0.2", 915 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 916 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" 917 | }, 918 | "node_modules/negotiator": { 919 | "version": "0.6.3", 920 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 921 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 922 | "optional": true, 923 | "engines": { 924 | "node": ">= 0.6" 925 | } 926 | }, 927 | "node_modules/node-abi": { 928 | "version": "3.58.0", 929 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.58.0.tgz", 930 | "integrity": "sha512-pXY1jnGf5T7b8UNzWzIqf0EkX4bx/w8N2AvwlGnk2SYYA/kzDVPaH0Dh0UG4EwxBB5eKOIZKPr8VAHSHL1DPGg==", 931 | "dependencies": { 932 | "semver": "^7.3.5" 933 | }, 934 | "engines": { 935 | "node": ">=10" 936 | } 937 | }, 938 | "node_modules/node-addon-api": { 939 | "version": "7.1.0", 940 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", 941 | "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", 942 | "engines": { 943 | "node": "^16 || ^18 || >= 20" 944 | } 945 | }, 946 | "node_modules/node-gyp": { 947 | "version": "8.4.1", 948 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", 949 | "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", 950 | "optional": true, 951 | "dependencies": { 952 | "env-paths": "^2.2.0", 953 | "glob": "^7.1.4", 954 | "graceful-fs": "^4.2.6", 955 | "make-fetch-happen": "^9.1.0", 956 | "nopt": "^5.0.0", 957 | "npmlog": "^6.0.0", 958 | "rimraf": "^3.0.2", 959 | "semver": "^7.3.5", 960 | "tar": "^6.1.2", 961 | "which": "^2.0.2" 962 | }, 963 | "bin": { 964 | "node-gyp": "bin/node-gyp.js" 965 | }, 966 | "engines": { 967 | "node": ">= 10.12.0" 968 | } 969 | }, 970 | "node_modules/nopt": { 971 | "version": "5.0.0", 972 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 973 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 974 | "optional": true, 975 | "dependencies": { 976 | "abbrev": "1" 977 | }, 978 | "bin": { 979 | "nopt": "bin/nopt.js" 980 | }, 981 | "engines": { 982 | "node": ">=6" 983 | } 984 | }, 985 | "node_modules/npmlog": { 986 | "version": "6.0.2", 987 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", 988 | "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", 989 | "optional": true, 990 | "dependencies": { 991 | "are-we-there-yet": "^3.0.0", 992 | "console-control-strings": "^1.1.0", 993 | "gauge": "^4.0.3", 994 | "set-blocking": "^2.0.0" 995 | }, 996 | "engines": { 997 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 998 | } 999 | }, 1000 | "node_modules/once": { 1001 | "version": "1.4.0", 1002 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1003 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1004 | "dependencies": { 1005 | "wrappy": "1" 1006 | } 1007 | }, 1008 | "node_modules/p-map": { 1009 | "version": "4.0.0", 1010 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 1011 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 1012 | "optional": true, 1013 | "dependencies": { 1014 | "aggregate-error": "^3.0.0" 1015 | }, 1016 | "engines": { 1017 | "node": ">=10" 1018 | }, 1019 | "funding": { 1020 | "url": "https://github.com/sponsors/sindresorhus" 1021 | } 1022 | }, 1023 | "node_modules/path-is-absolute": { 1024 | "version": "1.0.1", 1025 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1026 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1027 | "optional": true, 1028 | "engines": { 1029 | "node": ">=0.10.0" 1030 | } 1031 | }, 1032 | "node_modules/pg": { 1033 | "version": "8.11.5", 1034 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.5.tgz", 1035 | "integrity": "sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==", 1036 | "dependencies": { 1037 | "pg-connection-string": "^2.6.4", 1038 | "pg-pool": "^3.6.2", 1039 | "pg-protocol": "^1.6.1", 1040 | "pg-types": "^2.1.0", 1041 | "pgpass": "1.x" 1042 | }, 1043 | "engines": { 1044 | "node": ">= 8.0.0" 1045 | }, 1046 | "optionalDependencies": { 1047 | "pg-cloudflare": "^1.1.1" 1048 | }, 1049 | "peerDependencies": { 1050 | "pg-native": ">=3.0.1" 1051 | }, 1052 | "peerDependenciesMeta": { 1053 | "pg-native": { 1054 | "optional": true 1055 | } 1056 | } 1057 | }, 1058 | "node_modules/pg-cloudflare": { 1059 | "version": "1.1.1", 1060 | "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", 1061 | "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", 1062 | "optional": true 1063 | }, 1064 | "node_modules/pg-connection-string": { 1065 | "version": "2.6.4", 1066 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", 1067 | "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" 1068 | }, 1069 | "node_modules/pg-int8": { 1070 | "version": "1.0.1", 1071 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 1072 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", 1073 | "engines": { 1074 | "node": ">=4.0.0" 1075 | } 1076 | }, 1077 | "node_modules/pg-pool": { 1078 | "version": "3.6.2", 1079 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", 1080 | "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", 1081 | "peerDependencies": { 1082 | "pg": ">=8.0" 1083 | } 1084 | }, 1085 | "node_modules/pg-protocol": { 1086 | "version": "1.6.1", 1087 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", 1088 | "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" 1089 | }, 1090 | "node_modules/pg-types": { 1091 | "version": "2.2.0", 1092 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 1093 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 1094 | "dependencies": { 1095 | "pg-int8": "1.0.1", 1096 | "postgres-array": "~2.0.0", 1097 | "postgres-bytea": "~1.0.0", 1098 | "postgres-date": "~1.0.4", 1099 | "postgres-interval": "^1.1.0" 1100 | }, 1101 | "engines": { 1102 | "node": ">=4" 1103 | } 1104 | }, 1105 | "node_modules/pgpass": { 1106 | "version": "1.0.5", 1107 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 1108 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 1109 | "dependencies": { 1110 | "split2": "^4.1.0" 1111 | } 1112 | }, 1113 | "node_modules/postgres-array": { 1114 | "version": "2.0.0", 1115 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 1116 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", 1117 | "engines": { 1118 | "node": ">=4" 1119 | } 1120 | }, 1121 | "node_modules/postgres-bytea": { 1122 | "version": "1.0.0", 1123 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 1124 | "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", 1125 | "engines": { 1126 | "node": ">=0.10.0" 1127 | } 1128 | }, 1129 | "node_modules/postgres-date": { 1130 | "version": "1.0.7", 1131 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 1132 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", 1133 | "engines": { 1134 | "node": ">=0.10.0" 1135 | } 1136 | }, 1137 | "node_modules/postgres-interval": { 1138 | "version": "1.2.0", 1139 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 1140 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 1141 | "dependencies": { 1142 | "xtend": "^4.0.0" 1143 | }, 1144 | "engines": { 1145 | "node": ">=0.10.0" 1146 | } 1147 | }, 1148 | "node_modules/prebuild-install": { 1149 | "version": "7.1.2", 1150 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", 1151 | "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", 1152 | "dependencies": { 1153 | "detect-libc": "^2.0.0", 1154 | "expand-template": "^2.0.3", 1155 | "github-from-package": "0.0.0", 1156 | "minimist": "^1.2.3", 1157 | "mkdirp-classic": "^0.5.3", 1158 | "napi-build-utils": "^1.0.1", 1159 | "node-abi": "^3.3.0", 1160 | "pump": "^3.0.0", 1161 | "rc": "^1.2.7", 1162 | "simple-get": "^4.0.0", 1163 | "tar-fs": "^2.0.0", 1164 | "tunnel-agent": "^0.6.0" 1165 | }, 1166 | "bin": { 1167 | "prebuild-install": "bin.js" 1168 | }, 1169 | "engines": { 1170 | "node": ">=10" 1171 | } 1172 | }, 1173 | "node_modules/promise-inflight": { 1174 | "version": "1.0.1", 1175 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 1176 | "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", 1177 | "optional": true 1178 | }, 1179 | "node_modules/promise-retry": { 1180 | "version": "2.0.1", 1181 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 1182 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 1183 | "optional": true, 1184 | "dependencies": { 1185 | "err-code": "^2.0.2", 1186 | "retry": "^0.12.0" 1187 | }, 1188 | "engines": { 1189 | "node": ">=10" 1190 | } 1191 | }, 1192 | "node_modules/pump": { 1193 | "version": "3.0.0", 1194 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1195 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1196 | "dependencies": { 1197 | "end-of-stream": "^1.1.0", 1198 | "once": "^1.3.1" 1199 | } 1200 | }, 1201 | "node_modules/punycode": { 1202 | "version": "2.3.1", 1203 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1204 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1205 | "engines": { 1206 | "node": ">=6" 1207 | } 1208 | }, 1209 | "node_modules/rc": { 1210 | "version": "1.2.8", 1211 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1212 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1213 | "dependencies": { 1214 | "deep-extend": "^0.6.0", 1215 | "ini": "~1.3.0", 1216 | "minimist": "^1.2.0", 1217 | "strip-json-comments": "~2.0.1" 1218 | }, 1219 | "bin": { 1220 | "rc": "cli.js" 1221 | } 1222 | }, 1223 | "node_modules/readable-stream": { 1224 | "version": "3.6.2", 1225 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1226 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1227 | "dependencies": { 1228 | "inherits": "^2.0.3", 1229 | "string_decoder": "^1.1.1", 1230 | "util-deprecate": "^1.0.1" 1231 | }, 1232 | "engines": { 1233 | "node": ">= 6" 1234 | } 1235 | }, 1236 | "node_modules/retry": { 1237 | "version": "0.12.0", 1238 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1239 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 1240 | "optional": true, 1241 | "engines": { 1242 | "node": ">= 4" 1243 | } 1244 | }, 1245 | "node_modules/rimraf": { 1246 | "version": "3.0.2", 1247 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1248 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1249 | "optional": true, 1250 | "dependencies": { 1251 | "glob": "^7.1.3" 1252 | }, 1253 | "bin": { 1254 | "rimraf": "bin.js" 1255 | }, 1256 | "funding": { 1257 | "url": "https://github.com/sponsors/isaacs" 1258 | } 1259 | }, 1260 | "node_modules/safe-buffer": { 1261 | "version": "5.2.1", 1262 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1263 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1264 | "funding": [ 1265 | { 1266 | "type": "github", 1267 | "url": "https://github.com/sponsors/feross" 1268 | }, 1269 | { 1270 | "type": "patreon", 1271 | "url": "https://www.patreon.com/feross" 1272 | }, 1273 | { 1274 | "type": "consulting", 1275 | "url": "https://feross.org/support" 1276 | } 1277 | ] 1278 | }, 1279 | "node_modules/safer-buffer": { 1280 | "version": "2.1.2", 1281 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1282 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1283 | "optional": true 1284 | }, 1285 | "node_modules/semver": { 1286 | "version": "7.6.0", 1287 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", 1288 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", 1289 | "dependencies": { 1290 | "lru-cache": "^6.0.0" 1291 | }, 1292 | "bin": { 1293 | "semver": "bin/semver.js" 1294 | }, 1295 | "engines": { 1296 | "node": ">=10" 1297 | } 1298 | }, 1299 | "node_modules/set-blocking": { 1300 | "version": "2.0.0", 1301 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1302 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", 1303 | "optional": true 1304 | }, 1305 | "node_modules/signal-exit": { 1306 | "version": "3.0.7", 1307 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1308 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1309 | "optional": true 1310 | }, 1311 | "node_modules/simple-concat": { 1312 | "version": "1.0.1", 1313 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1314 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 1315 | "funding": [ 1316 | { 1317 | "type": "github", 1318 | "url": "https://github.com/sponsors/feross" 1319 | }, 1320 | { 1321 | "type": "patreon", 1322 | "url": "https://www.patreon.com/feross" 1323 | }, 1324 | { 1325 | "type": "consulting", 1326 | "url": "https://feross.org/support" 1327 | } 1328 | ] 1329 | }, 1330 | "node_modules/simple-get": { 1331 | "version": "4.0.1", 1332 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 1333 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 1334 | "funding": [ 1335 | { 1336 | "type": "github", 1337 | "url": "https://github.com/sponsors/feross" 1338 | }, 1339 | { 1340 | "type": "patreon", 1341 | "url": "https://www.patreon.com/feross" 1342 | }, 1343 | { 1344 | "type": "consulting", 1345 | "url": "https://feross.org/support" 1346 | } 1347 | ], 1348 | "dependencies": { 1349 | "decompress-response": "^6.0.0", 1350 | "once": "^1.3.1", 1351 | "simple-concat": "^1.0.0" 1352 | } 1353 | }, 1354 | "node_modules/smart-buffer": { 1355 | "version": "4.2.0", 1356 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1357 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1358 | "optional": true, 1359 | "engines": { 1360 | "node": ">= 6.0.0", 1361 | "npm": ">= 3.0.0" 1362 | } 1363 | }, 1364 | "node_modules/socks": { 1365 | "version": "2.8.3", 1366 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 1367 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 1368 | "optional": true, 1369 | "dependencies": { 1370 | "ip-address": "^9.0.5", 1371 | "smart-buffer": "^4.2.0" 1372 | }, 1373 | "engines": { 1374 | "node": ">= 10.0.0", 1375 | "npm": ">= 3.0.0" 1376 | } 1377 | }, 1378 | "node_modules/socks-proxy-agent": { 1379 | "version": "6.2.1", 1380 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", 1381 | "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", 1382 | "optional": true, 1383 | "dependencies": { 1384 | "agent-base": "^6.0.2", 1385 | "debug": "^4.3.3", 1386 | "socks": "^2.6.2" 1387 | }, 1388 | "engines": { 1389 | "node": ">= 10" 1390 | } 1391 | }, 1392 | "node_modules/sparse-bitfield": { 1393 | "version": "3.0.3", 1394 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1395 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", 1396 | "dependencies": { 1397 | "memory-pager": "^1.0.2" 1398 | } 1399 | }, 1400 | "node_modules/split2": { 1401 | "version": "4.2.0", 1402 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 1403 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 1404 | "engines": { 1405 | "node": ">= 10.x" 1406 | } 1407 | }, 1408 | "node_modules/sprintf-js": { 1409 | "version": "1.1.3", 1410 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 1411 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", 1412 | "optional": true 1413 | }, 1414 | "node_modules/sqlite3": { 1415 | "version": "5.1.7", 1416 | "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", 1417 | "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", 1418 | "hasInstallScript": true, 1419 | "dependencies": { 1420 | "bindings": "^1.5.0", 1421 | "node-addon-api": "^7.0.0", 1422 | "prebuild-install": "^7.1.1", 1423 | "tar": "^6.1.11" 1424 | }, 1425 | "optionalDependencies": { 1426 | "node-gyp": "8.x" 1427 | }, 1428 | "peerDependencies": { 1429 | "node-gyp": "8.x" 1430 | }, 1431 | "peerDependenciesMeta": { 1432 | "node-gyp": { 1433 | "optional": true 1434 | } 1435 | } 1436 | }, 1437 | "node_modules/ssri": { 1438 | "version": "8.0.1", 1439 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", 1440 | "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", 1441 | "optional": true, 1442 | "dependencies": { 1443 | "minipass": "^3.1.1" 1444 | }, 1445 | "engines": { 1446 | "node": ">= 8" 1447 | } 1448 | }, 1449 | "node_modules/string_decoder": { 1450 | "version": "1.3.0", 1451 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1452 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1453 | "dependencies": { 1454 | "safe-buffer": "~5.2.0" 1455 | } 1456 | }, 1457 | "node_modules/string-width": { 1458 | "version": "4.2.3", 1459 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1460 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1461 | "dependencies": { 1462 | "emoji-regex": "^8.0.0", 1463 | "is-fullwidth-code-point": "^3.0.0", 1464 | "strip-ansi": "^6.0.1" 1465 | }, 1466 | "engines": { 1467 | "node": ">=8" 1468 | } 1469 | }, 1470 | "node_modules/strip-ansi": { 1471 | "version": "6.0.1", 1472 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1473 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1474 | "dependencies": { 1475 | "ansi-regex": "^5.0.1" 1476 | }, 1477 | "engines": { 1478 | "node": ">=8" 1479 | } 1480 | }, 1481 | "node_modules/strip-json-comments": { 1482 | "version": "2.0.1", 1483 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1484 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 1485 | "engines": { 1486 | "node": ">=0.10.0" 1487 | } 1488 | }, 1489 | "node_modules/tar": { 1490 | "version": "6.2.1", 1491 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 1492 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 1493 | "dependencies": { 1494 | "chownr": "^2.0.0", 1495 | "fs-minipass": "^2.0.0", 1496 | "minipass": "^5.0.0", 1497 | "minizlib": "^2.1.1", 1498 | "mkdirp": "^1.0.3", 1499 | "yallist": "^4.0.0" 1500 | }, 1501 | "engines": { 1502 | "node": ">=10" 1503 | } 1504 | }, 1505 | "node_modules/tar-fs": { 1506 | "version": "2.1.1", 1507 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 1508 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 1509 | "dependencies": { 1510 | "chownr": "^1.1.1", 1511 | "mkdirp-classic": "^0.5.2", 1512 | "pump": "^3.0.0", 1513 | "tar-stream": "^2.1.4" 1514 | } 1515 | }, 1516 | "node_modules/tar-fs/node_modules/chownr": { 1517 | "version": "1.1.4", 1518 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 1519 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 1520 | }, 1521 | "node_modules/tar-stream": { 1522 | "version": "2.2.0", 1523 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 1524 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 1525 | "dependencies": { 1526 | "bl": "^4.0.3", 1527 | "end-of-stream": "^1.4.1", 1528 | "fs-constants": "^1.0.0", 1529 | "inherits": "^2.0.3", 1530 | "readable-stream": "^3.1.1" 1531 | }, 1532 | "engines": { 1533 | "node": ">=6" 1534 | } 1535 | }, 1536 | "node_modules/tar/node_modules/minipass": { 1537 | "version": "5.0.0", 1538 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 1539 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 1540 | "engines": { 1541 | "node": ">=8" 1542 | } 1543 | }, 1544 | "node_modules/tr46": { 1545 | "version": "4.1.1", 1546 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", 1547 | "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", 1548 | "dependencies": { 1549 | "punycode": "^2.3.0" 1550 | }, 1551 | "engines": { 1552 | "node": ">=14" 1553 | } 1554 | }, 1555 | "node_modules/tunnel-agent": { 1556 | "version": "0.6.0", 1557 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1558 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 1559 | "dependencies": { 1560 | "safe-buffer": "^5.0.1" 1561 | }, 1562 | "engines": { 1563 | "node": "*" 1564 | } 1565 | }, 1566 | "node_modules/unique-filename": { 1567 | "version": "1.1.1", 1568 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 1569 | "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 1570 | "optional": true, 1571 | "dependencies": { 1572 | "unique-slug": "^2.0.0" 1573 | } 1574 | }, 1575 | "node_modules/unique-slug": { 1576 | "version": "2.0.2", 1577 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", 1578 | "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", 1579 | "optional": true, 1580 | "dependencies": { 1581 | "imurmurhash": "^0.1.4" 1582 | } 1583 | }, 1584 | "node_modules/util-deprecate": { 1585 | "version": "1.0.2", 1586 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1587 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1588 | }, 1589 | "node_modules/webidl-conversions": { 1590 | "version": "7.0.0", 1591 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 1592 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 1593 | "engines": { 1594 | "node": ">=12" 1595 | } 1596 | }, 1597 | "node_modules/whatwg-url": { 1598 | "version": "13.0.0", 1599 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", 1600 | "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", 1601 | "dependencies": { 1602 | "tr46": "^4.1.1", 1603 | "webidl-conversions": "^7.0.0" 1604 | }, 1605 | "engines": { 1606 | "node": ">=16" 1607 | } 1608 | }, 1609 | "node_modules/which": { 1610 | "version": "2.0.2", 1611 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1612 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1613 | "optional": true, 1614 | "dependencies": { 1615 | "isexe": "^2.0.0" 1616 | }, 1617 | "bin": { 1618 | "node-which": "bin/node-which" 1619 | }, 1620 | "engines": { 1621 | "node": ">= 8" 1622 | } 1623 | }, 1624 | "node_modules/wide-align": { 1625 | "version": "1.1.5", 1626 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 1627 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 1628 | "optional": true, 1629 | "dependencies": { 1630 | "string-width": "^1.0.2 || 2 || 3 || 4" 1631 | } 1632 | }, 1633 | "node_modules/wrappy": { 1634 | "version": "1.0.2", 1635 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1636 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1637 | }, 1638 | "node_modules/xtend": { 1639 | "version": "4.0.2", 1640 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1641 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1642 | "engines": { 1643 | "node": ">=0.4" 1644 | } 1645 | }, 1646 | "node_modules/yallist": { 1647 | "version": "4.0.0", 1648 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1649 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1650 | } 1651 | } 1652 | } 1653 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "parallelizing-nodejs-ops", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node src/index.js", 8 | "dev": "node --watch --no-warnings src/index.js", 9 | "seed": "node src/seed.js", 10 | "test": "echo \"Error: no test specified\" && exit 1" 11 | }, 12 | "keywords": [], 13 | "author": "erickwendel", 14 | "license": "ISC", 15 | "type": "module", 16 | "engines": { 17 | "node": "v20.12.1" 18 | }, 19 | "devDependencies": { 20 | "@faker-js/faker": "^8.4.1" 21 | }, 22 | "dependencies": { 23 | "cli-progress": "^3.12.0", 24 | "draftlog": "^1.0.13", 25 | "mongodb": "^6.5.0", 26 | "pg": "^8.11.5", 27 | "sqlite3": "^5.1.7" 28 | } 29 | } -------------------------------------------------------------------------------- /script.txt: -------------------------------------------------------------------------------- 1 | Cluster Child Process 2 | 3 | Main Process 4 | - Read paged data from MongoDB 5 | - Send it to Child Process Cluster 6 | - Save in the SQLite 7 | -------------------------------------------------------------------------------- /src/background-task.js: -------------------------------------------------------------------------------- 1 | import { getPostgresConnection } from './db.js' 2 | const db = await getPostgresConnection() 3 | 4 | // console.log(`process ${process.pid} started.`); 5 | 6 | process.on('message', (items) => { 7 | // console.log(` ${process.pid} received ${items.length} items`,); 8 | for (const item of items) { 9 | db.students.insert(item) 10 | .then(() => { 11 | process.send('item-done'); 12 | }) 13 | .catch((error) => { 14 | console.error(error); 15 | }); 16 | } 17 | }); 18 | -------------------------------------------------------------------------------- /src/cluster.js: -------------------------------------------------------------------------------- 1 | import { fork } from 'child_process' 2 | 3 | 4 | function roundRoubin(array, index = 0) { 5 | return function () { 6 | if (index >= array.length) index = 0 7 | 8 | return array[index++] 9 | } 10 | } 11 | 12 | // Function to start child processes 13 | function initializeCluster({ backgroundTaskFile, clusterSize, onMessage }) { 14 | const processes = new Map() 15 | for (let index = 0; index < clusterSize; index++) { 16 | 17 | const child = fork(backgroundTaskFile) 18 | child.on('exit', () => { 19 | // console.log(`process ${child.pid} exited`) 20 | processes.delete(child.pid) 21 | }) 22 | 23 | child.on('error', error => { 24 | // console.log(`process ${child.pid} has an error`, error) 25 | process.exit(1) 26 | }) 27 | 28 | child.on('message', (message) => { 29 | if (message !== 'item-done') return 30 | onMessage(message) 31 | }) 32 | 33 | processes.set(child.pid, child) 34 | } 35 | 36 | return { 37 | getProcess: roundRoubin([...processes.values()]), 38 | killAll: () => { 39 | processes.forEach((child) => child.kill()) 40 | } 41 | } 42 | 43 | } 44 | 45 | export function initialize({ backgroundTaskFile, clusterSize, onMessage }) { 46 | 47 | const { getProcess, killAll } = initializeCluster({ backgroundTaskFile, clusterSize, onMessage }) 48 | // console.log(`starting with ${clusterSize} processes`) 49 | 50 | function sendToChild(message) { 51 | const child = getProcess() 52 | // send only if channel is open 53 | // if (child.killed) return; 54 | child.send(message) 55 | } 56 | 57 | 58 | return { 59 | sendToChild: sendToChild.bind(this), 60 | killAll: killAll.bind(this) 61 | } 62 | } 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/db.js: -------------------------------------------------------------------------------- 1 | import { MongoClient } from 'mongodb'; 2 | import pg from 'pg'; 3 | const { Client } = pg; 4 | // Connection URL for MongoDB 5 | 6 | // Connection pool for PostgreSQL 7 | 8 | async function getMongoConnection() { 9 | const mongoUrl = 'mongodb://root:example@localhost:27017'; 10 | const client = new MongoClient(mongoUrl); 11 | 12 | try { 13 | await client.connect(); 14 | 15 | const dbName = 'school'; 16 | const db = client.db(dbName); 17 | const collection = db.collection('students'); 18 | 19 | return { 20 | students: collection, 21 | client, 22 | }; 23 | } catch (error) { 24 | console.error('Error connecting to MongoDB:', error); 25 | throw error; 26 | } 27 | } 28 | 29 | async function getPostgresConnection() { 30 | 31 | const client = new Client({ 32 | user: 'erickwendel', 33 | host: 'localhost', 34 | database: 'school', 35 | password: 'mypassword', 36 | port: 5432, 37 | }); 38 | 39 | await client.connect(); 40 | return { 41 | client, 42 | students: { 43 | async insert(person) { 44 | const { name, email, age, registeredAt } = person; 45 | const query = 'INSERT INTO students (name, email, age, registered_at) VALUES ($1, $2, $3, $4)'; 46 | const values = [name, email, age, registeredAt]; 47 | 48 | await client.query(query, values); 49 | 50 | }, 51 | async list(limit = 100) { 52 | const query = 'SELECT * FROM students LIMIT $1'; 53 | const values = [limit]; 54 | 55 | const result = await client.query(query, values); 56 | return result.rows; 57 | 58 | }, 59 | async count() { 60 | const query = 'SELECT COUNT(*) as total FROM students'; 61 | 62 | const result = await client.query(query); 63 | return Number(result.rows[0].total); 64 | 65 | }, 66 | async deleteAll() { 67 | const query = 'DELETE FROM students'; 68 | 69 | await client.query(query); 70 | }, 71 | async createTable() { 72 | const createStudentsTableQuery = ` 73 | CREATE TABLE IF NOT EXISTS students ( 74 | id SERIAL PRIMARY KEY, 75 | name VARCHAR(255) NOT NULL, 76 | email VARCHAR(255) NOT NULL, 77 | age INT NOT NULL, 78 | registered_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 79 | )`; 80 | await client.query(createStudentsTableQuery); 81 | 82 | } 83 | } 84 | }; 85 | } 86 | 87 | export { getMongoConnection, getPostgresConnection }; 88 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { initialize } from "./cluster.js" 2 | import { getMongoConnection, getPostgresConnection } from './db.js' 3 | import cliProgress from 'cli-progress' 4 | import { setTimeout } from 'node:timers/promises' 5 | const mongoDB = await getMongoConnection() 6 | const postgresDB = await getPostgresConnection() 7 | const ITEMS_PER_PAGE = 4000 8 | const CLUSTER_SIZE = 99 9 | const TASK_FILE = new URL('./background-task.js', import.meta.url).pathname 10 | 11 | // console.log(`there was ${await postgresDB.students.count()} items on Postgres, deleting all...`) 12 | await postgresDB.students.deleteAll() 13 | 14 | async function* getAllPagedData(itemsPerPage, page = 0) { 15 | 16 | const data = mongoDB.students.find().skip(page).limit(itemsPerPage) 17 | const items = await data.toArray() 18 | if (!items.length) return 19 | 20 | yield items 21 | 22 | yield* getAllPagedData(itemsPerPage, page += itemsPerPage) 23 | } 24 | 25 | const total = await mongoDB.students.countDocuments() 26 | // console.log(`total items on DB: ${total}`) 27 | 28 | const progress = new cliProgress.SingleBar({ 29 | format: 'progress [{bar}] {percentage}% | {value}/{total} | {duration}s', 30 | clearOnComplete: false, 31 | }, cliProgress.Presets.shades_classic); 32 | 33 | progress.start(total, 0); 34 | let totalProcessed = 0 35 | const cp = initialize( 36 | { 37 | backgroundTaskFile: TASK_FILE, 38 | clusterSize: CLUSTER_SIZE, 39 | amountToBeProcessed: total, 40 | async onMessage(message) { 41 | progress.increment() 42 | 43 | if (++totalProcessed !== total) return 44 | // console.log(`all ${amountToBeProcessed} processed! Exiting...`) 45 | progress.stop() 46 | cp.killAll() 47 | 48 | const insertedOnSQLite = await postgresDB.students.count() 49 | console.log(`total on MongoDB ${total} and total on PostGres ${insertedOnSQLite}`) 50 | console.log(`are the same? ${total === insertedOnSQLite ? 'yes' : 'no'}`) 51 | process.exit() 52 | 53 | } 54 | } 55 | ) 56 | await setTimeout(1000) 57 | 58 | for await (const data of getAllPagedData(ITEMS_PER_PAGE)) { 59 | cp.sendToChild(data) 60 | } 61 | 62 | -------------------------------------------------------------------------------- /src/seed.js: -------------------------------------------------------------------------------- 1 | import { faker } from '@faker-js/faker'; 2 | import { getMongoConnection, getPostgresConnection } from './db.js' 3 | 4 | async function seedMongoDB(amount) { 5 | const { students, client } = await getMongoConnection() 6 | console.log('deleting all students') 7 | await students.deleteMany({}) 8 | let person = [] 9 | console.log(`inserting ${amount} students`) 10 | 11 | for (let i = 0; i < amount; i++) { 12 | 13 | person.push({ 14 | name: faker.person.fullName(), 15 | email: faker.internet.email(), 16 | age: faker.number.int(18, 60), 17 | registeredAt: faker.date.past(), 18 | }) 19 | } 20 | 21 | await students.insertMany(person) 22 | 23 | console.log('done inserting!') 24 | await client.close() 25 | } 26 | 27 | async function seedPostegres() { 28 | const db = await getPostgresConnection() 29 | console.log('creating table students') 30 | await db.students.createTable() 31 | console.log('table students created with success') 32 | await db.client.end() 33 | } 34 | await seedMongoDB(1_000_000) 35 | await seedPostegres() 36 | --------------------------------------------------------------------------------