├── .DS_Store ├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── package.json ├── pnpm-lock.yaml ├── readme.md ├── src ├── Defaults │ └── index.ts ├── Error │ └── index.ts ├── Messaging │ └── index.ts ├── Profile │ └── index.ts ├── Socket │ └── index.ts ├── Types │ ├── index.ts │ └── profile.ts ├── Utils │ ├── create-delay.ts │ ├── error.ts │ ├── index.ts │ ├── is-exist.ts │ ├── message-status.ts │ ├── phone-to-jid.ts │ ├── save-media.ts │ └── set-credentials-dir.ts └── index.ts └── tsconfig.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mimamch/wa-multi-session/fc0ad4e3f61b39928b6420ae18e6d66a040614fc/.DS_Store -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: mimamch # Replace with a single Buy Me a Coffee username 14 | thanks_dev: # Replace with a single thanks.dev username 15 | custom: ['https://trakteer.id/mimamch/tip'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .npmrc 3 | dist/ 4 | wa_credentials/ 5 | test/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Muhammad Imam Choirudin 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 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wa-multi-session", 3 | "version": "3.8.0", 4 | "description": "Multi Session Whatsapp Library", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "files": [ 8 | "dist/**/*" 9 | ], 10 | "scripts": { 11 | "build": "tsc", 12 | "start": "tsc && node ./dist/index.js", 13 | "test": "echo \"Error: no test specified\" && exit 1" 14 | }, 15 | "author": "mimamch", 16 | "license": "ISC", 17 | "dependencies": { 18 | "@adiwajshing/keyed-db": "^0.2.4", 19 | "@hapi/boom": "^10.0.1", 20 | "@whiskeysockets/baileys": "^6.7.9", 21 | "link-preview-js": "^3.0.14", 22 | "mime": "^3.0.0", 23 | "pino": "^9.5.0", 24 | "qrcode-terminal": "^0.12.0" 25 | }, 26 | "repository": { 27 | "type": "git", 28 | "url": "git@github.com:mimamch/wa-multi-session.git" 29 | }, 30 | "devDependencies": { 31 | "@types/mime": "^3.0.1", 32 | "typescript": "^5.7.2" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@adiwajshing/keyed-db': 12 | specifier: ^0.2.4 13 | version: 0.2.4 14 | '@hapi/boom': 15 | specifier: ^10.0.1 16 | version: 10.0.1 17 | '@whiskeysockets/baileys': 18 | specifier: ^6.7.9 19 | version: 6.7.9(eslint@8.57.1)(link-preview-js@3.0.14)(qrcode-terminal@0.12.0)(typescript@5.7.2) 20 | link-preview-js: 21 | specifier: ^3.0.14 22 | version: 3.0.14 23 | mime: 24 | specifier: ^3.0.0 25 | version: 3.0.0 26 | pino: 27 | specifier: ^9.5.0 28 | version: 9.5.0 29 | qrcode-terminal: 30 | specifier: ^0.12.0 31 | version: 0.12.0 32 | devDependencies: 33 | '@types/mime': 34 | specifier: ^3.0.1 35 | version: 3.0.1 36 | typescript: 37 | specifier: ^5.7.2 38 | version: 5.7.2 39 | 40 | packages: 41 | 42 | '@adiwajshing/keyed-db@0.2.4': 43 | resolution: {integrity: sha512-yprSnAtj80/VKuDqRcFFLDYltoNV8tChNwFfIgcf6PGD4sjzWIBgs08pRuTqGH5mk5wgL6PBRSsMCZqtZwzFEw==} 44 | 45 | '@eshaz/web-worker@1.2.1': 46 | resolution: {integrity: sha512-v5AKAVtM0toVD2rDCGjzhySWlXG/sG5HVialdzrxFKTAnFZNCjQelX0n2tPK0tE86jf4s3hpWlpRtOh8OObktg==} 47 | 48 | '@eslint-community/eslint-utils@4.4.0': 49 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 50 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 51 | peerDependencies: 52 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 53 | 54 | '@eslint-community/regexpp@4.11.1': 55 | resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} 56 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 57 | 58 | '@eslint/eslintrc@2.1.4': 59 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 60 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 61 | 62 | '@eslint/js@8.57.1': 63 | resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} 64 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 65 | 66 | '@hapi/boom@10.0.1': 67 | resolution: {integrity: sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==} 68 | 69 | '@hapi/boom@9.1.4': 70 | resolution: {integrity: sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==} 71 | 72 | '@hapi/hoek@11.0.2': 73 | resolution: {integrity: sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==} 74 | 75 | '@hapi/hoek@9.3.0': 76 | resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} 77 | 78 | '@humanwhocodes/config-array@0.13.0': 79 | resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} 80 | engines: {node: '>=10.10.0'} 81 | deprecated: Use @eslint/config-array instead 82 | 83 | '@humanwhocodes/module-importer@1.0.1': 84 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 85 | engines: {node: '>=12.22'} 86 | 87 | '@humanwhocodes/object-schema@2.0.3': 88 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 89 | deprecated: Use @eslint/object-schema instead 90 | 91 | '@nodelib/fs.scandir@2.1.5': 92 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 93 | engines: {node: '>= 8'} 94 | 95 | '@nodelib/fs.stat@2.0.5': 96 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 97 | engines: {node: '>= 8'} 98 | 99 | '@nodelib/fs.walk@1.2.8': 100 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 101 | engines: {node: '>= 8'} 102 | 103 | '@protobufjs/aspromise@1.1.2': 104 | resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} 105 | 106 | '@protobufjs/base64@1.1.2': 107 | resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} 108 | 109 | '@protobufjs/codegen@2.0.4': 110 | resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} 111 | 112 | '@protobufjs/eventemitter@1.1.0': 113 | resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} 114 | 115 | '@protobufjs/fetch@1.1.0': 116 | resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} 117 | 118 | '@protobufjs/float@1.0.2': 119 | resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} 120 | 121 | '@protobufjs/inquire@1.1.0': 122 | resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} 123 | 124 | '@protobufjs/path@1.1.2': 125 | resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} 126 | 127 | '@protobufjs/pool@1.1.0': 128 | resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} 129 | 130 | '@protobufjs/utf8@1.1.0': 131 | resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} 132 | 133 | '@thi.ng/bitstream@2.2.28': 134 | resolution: {integrity: sha512-aW7cSEaf680nfCIW42C/Hur12Toy8ST3XLRM8OxHXHZySq9cPrJ5stm+uilHlp+L00yBvgAoKk6ZWkDQ8mtYbA==} 135 | engines: {node: '>=12.7'} 136 | 137 | '@thi.ng/errors@2.3.5': 138 | resolution: {integrity: sha512-WH2p02goxTCF11p8H/4VIl8RmPZ7rJ00ogFOrQX7mO3zxi1/vTqygR7sVuJszlx5a5eOrMglNivyqNZwr912cg==} 139 | engines: {node: '>=12.7'} 140 | 141 | '@tokenizer/token@0.3.0': 142 | resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} 143 | 144 | '@types/long@4.0.2': 145 | resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} 146 | 147 | '@types/mime@3.0.1': 148 | resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} 149 | 150 | '@types/node@10.17.60': 151 | resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} 152 | 153 | '@types/node@20.4.1': 154 | resolution: {integrity: sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==} 155 | 156 | '@typescript-eslint/eslint-plugin@7.18.0': 157 | resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} 158 | engines: {node: ^18.18.0 || >=20.0.0} 159 | peerDependencies: 160 | '@typescript-eslint/parser': ^7.0.0 161 | eslint: ^8.56.0 162 | typescript: '*' 163 | peerDependenciesMeta: 164 | typescript: 165 | optional: true 166 | 167 | '@typescript-eslint/parser@7.18.0': 168 | resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} 169 | engines: {node: ^18.18.0 || >=20.0.0} 170 | peerDependencies: 171 | eslint: ^8.56.0 172 | typescript: '*' 173 | peerDependenciesMeta: 174 | typescript: 175 | optional: true 176 | 177 | '@typescript-eslint/scope-manager@7.18.0': 178 | resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} 179 | engines: {node: ^18.18.0 || >=20.0.0} 180 | 181 | '@typescript-eslint/type-utils@7.18.0': 182 | resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} 183 | engines: {node: ^18.18.0 || >=20.0.0} 184 | peerDependencies: 185 | eslint: ^8.56.0 186 | typescript: '*' 187 | peerDependenciesMeta: 188 | typescript: 189 | optional: true 190 | 191 | '@typescript-eslint/types@7.18.0': 192 | resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} 193 | engines: {node: ^18.18.0 || >=20.0.0} 194 | 195 | '@typescript-eslint/typescript-estree@7.18.0': 196 | resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} 197 | engines: {node: ^18.18.0 || >=20.0.0} 198 | peerDependencies: 199 | typescript: '*' 200 | peerDependenciesMeta: 201 | typescript: 202 | optional: true 203 | 204 | '@typescript-eslint/utils@7.18.0': 205 | resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} 206 | engines: {node: ^18.18.0 || >=20.0.0} 207 | peerDependencies: 208 | eslint: ^8.56.0 209 | 210 | '@typescript-eslint/visitor-keys@7.18.0': 211 | resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} 212 | engines: {node: ^18.18.0 || >=20.0.0} 213 | 214 | '@ungap/structured-clone@1.2.0': 215 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 216 | 217 | '@wasm-audio-decoders/common@9.0.1': 218 | resolution: {integrity: sha512-s4KxPsxhD6e+EtjmHPzTmKJSJTEXHGYlBzUGGLN/plV01x3RecybW73nIMtdLLXL8k/zQ8HYFcA6d9lqCJcDjQ==} 219 | 220 | '@wasm-audio-decoders/flac@0.1.13': 221 | resolution: {integrity: sha512-Ah0hurb+qO3kBjuBrmOSIDqe8DWkd/g5feoyd8jjoM46l//OmVrsG9lW0rnDJAKMhyMeRuWwCy/kv/SswzrW8Q==} 222 | 223 | '@wasm-audio-decoders/ogg-vorbis@0.1.8': 224 | resolution: {integrity: sha512-YwPSxN1xqGrVpON0OvUHwBnboKMA0P7n08j2K2SgZr5MI6ODWp2viW66XLL+gpNZBqRJhw+RdnyTUkZiZ70JOA==} 225 | 226 | '@whiskeysockets/baileys@6.7.9': 227 | resolution: {integrity: sha512-+23DOlzgRYvDYPq5qTDRCho6EqyRMaSWL2OadvhY+nE4Ew8HCNTwpDASIaGoFPqGyQgzAJUNgwOFvBsdJlORpA==} 228 | peerDependencies: 229 | jimp: ^0.16.1 230 | link-preview-js: ^3.0.0 231 | qrcode-terminal: ^0.12.0 232 | sharp: ^0.32.6 233 | peerDependenciesMeta: 234 | jimp: 235 | optional: true 236 | link-preview-js: 237 | optional: true 238 | qrcode-terminal: 239 | optional: true 240 | sharp: 241 | optional: true 242 | 243 | '@whiskeysockets/eslint-config@https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/326b55f2842668f4e11f471451c4e39819a0e1bf': 244 | resolution: {tarball: https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/326b55f2842668f4e11f471451c4e39819a0e1bf} 245 | version: 1.0.0 246 | peerDependencies: 247 | eslint: '*' 248 | typescript: '>=4' 249 | 250 | '@whiskeysockets/libsignal-node@https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/d13b6622a208d3037a98b6f447bbde70261c39a9': 251 | resolution: {tarball: https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/d13b6622a208d3037a98b6f447bbde70261c39a9} 252 | version: 2.0.1 253 | 254 | acorn-jsx@5.3.2: 255 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 256 | peerDependencies: 257 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 258 | 259 | acorn@8.13.0: 260 | resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==} 261 | engines: {node: '>=0.4.0'} 262 | hasBin: true 263 | 264 | ajv@6.12.6: 265 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 266 | 267 | ansi-regex@5.0.1: 268 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 269 | engines: {node: '>=8'} 270 | 271 | ansi-styles@4.3.0: 272 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 273 | engines: {node: '>=8'} 274 | 275 | argparse@2.0.1: 276 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 277 | 278 | array-union@2.1.0: 279 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 280 | engines: {node: '>=8'} 281 | 282 | async-lock@1.4.1: 283 | resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} 284 | 285 | asynckit@0.4.0: 286 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 287 | 288 | atomic-sleep@1.0.0: 289 | resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} 290 | engines: {node: '>=8.0.0'} 291 | 292 | audio-buffer@5.0.0: 293 | resolution: {integrity: sha512-gsDyj1wwUp8u7NBB+eW6yhLb9ICf+0eBmDX8NGaAS00w8/fLqFdxUlL5Ge/U8kB64DlQhdonxYC59dXy1J7H/w==} 294 | 295 | audio-decode@2.1.5: 296 | resolution: {integrity: sha512-+dnOsHalaEwYRDOyr+A89cp9Ms7WBaFaPcFuLI1/CJO7lVPUJQyTJWEnZktfh9Aw6zCbdD48jHMg8m33pIt3NQ==} 297 | 298 | audio-type@2.2.1: 299 | resolution: {integrity: sha512-En9AY6EG1qYqEy5L/quryzbA4akBpJrnBZNxeKTqGHC2xT9Qc4aZ8b7CcbOMFTTc/MGdoNyp+SN4zInZNKxMYA==} 300 | engines: {node: '>=14'} 301 | 302 | axios@1.7.7: 303 | resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} 304 | 305 | balanced-match@1.0.2: 306 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 307 | 308 | boolbase@1.0.0: 309 | resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 310 | 311 | brace-expansion@1.1.11: 312 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 313 | 314 | brace-expansion@2.0.1: 315 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 316 | 317 | braces@3.0.3: 318 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 319 | engines: {node: '>=8'} 320 | 321 | cache-manager@5.7.6: 322 | resolution: {integrity: sha512-wBxnBHjDxF1RXpHCBD6HGvKER003Ts7IIm0CHpggliHzN1RZditb7rXoduE1rplc2DEFYKxhLKgFuchXMJje9w==} 323 | engines: {node: '>= 18'} 324 | 325 | callsites@3.1.0: 326 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 327 | engines: {node: '>=6'} 328 | 329 | chalk@4.1.2: 330 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 331 | engines: {node: '>=10'} 332 | 333 | cheerio-select@2.1.0: 334 | resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} 335 | 336 | cheerio@1.0.0-rc.11: 337 | resolution: {integrity: sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==} 338 | engines: {node: '>= 6'} 339 | 340 | clone@2.1.2: 341 | resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} 342 | engines: {node: '>=0.8'} 343 | 344 | codec-parser@2.4.3: 345 | resolution: {integrity: sha512-3dAvFtdpxn4YLstqsB2ZiJXXNg7n1j7R5ONeDuk+2kBkb39PwrCRytOFHlSWA8q5jCjW3PumeMv9q37bFHsijg==} 346 | 347 | color-convert@2.0.1: 348 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 349 | engines: {node: '>=7.0.0'} 350 | 351 | color-name@1.1.4: 352 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 353 | 354 | combined-stream@1.0.8: 355 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 356 | engines: {node: '>= 0.8'} 357 | 358 | concat-map@0.0.1: 359 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 360 | 361 | content-type@1.0.5: 362 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 363 | engines: {node: '>= 0.6'} 364 | 365 | cross-spawn@7.0.3: 366 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 367 | engines: {node: '>= 8'} 368 | 369 | css-select@5.1.0: 370 | resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} 371 | 372 | css-what@6.1.0: 373 | resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} 374 | engines: {node: '>= 6'} 375 | 376 | curve25519-js@0.0.4: 377 | resolution: {integrity: sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w==} 378 | 379 | debug@4.3.4: 380 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 381 | engines: {node: '>=6.0'} 382 | peerDependencies: 383 | supports-color: '*' 384 | peerDependenciesMeta: 385 | supports-color: 386 | optional: true 387 | 388 | deep-is@0.1.4: 389 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 390 | 391 | delayed-stream@1.0.0: 392 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 393 | engines: {node: '>=0.4.0'} 394 | 395 | dir-glob@3.0.1: 396 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 397 | engines: {node: '>=8'} 398 | 399 | doctrine@3.0.0: 400 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 401 | engines: {node: '>=6.0.0'} 402 | 403 | dom-serializer@2.0.0: 404 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 405 | 406 | domelementtype@2.3.0: 407 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 408 | 409 | domhandler@5.0.3: 410 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 411 | engines: {node: '>= 4'} 412 | 413 | domutils@3.2.2: 414 | resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} 415 | 416 | duplexify@4.1.2: 417 | resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} 418 | 419 | end-of-stream@1.4.4: 420 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 421 | 422 | entities@4.5.0: 423 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 424 | engines: {node: '>=0.12'} 425 | 426 | escape-string-regexp@4.0.0: 427 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 428 | engines: {node: '>=10'} 429 | 430 | eslint-plugin-simple-import-sort@12.1.1: 431 | resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} 432 | peerDependencies: 433 | eslint: '>=5.0.0' 434 | 435 | eslint-scope@7.2.2: 436 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 437 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 438 | 439 | eslint-visitor-keys@3.4.3: 440 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 441 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 442 | 443 | eslint@8.57.1: 444 | resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} 445 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 446 | deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. 447 | hasBin: true 448 | 449 | espree@9.6.1: 450 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 451 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 452 | 453 | esquery@1.6.0: 454 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 455 | engines: {node: '>=0.10'} 456 | 457 | esrecurse@4.3.0: 458 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 459 | engines: {node: '>=4.0'} 460 | 461 | estraverse@5.3.0: 462 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 463 | engines: {node: '>=4.0'} 464 | 465 | esutils@2.0.3: 466 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 467 | engines: {node: '>=0.10.0'} 468 | 469 | eventemitter3@5.0.1: 470 | resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 471 | 472 | fast-deep-equal@3.1.3: 473 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 474 | 475 | fast-glob@3.3.2: 476 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 477 | engines: {node: '>=8.6.0'} 478 | 479 | fast-json-stable-stringify@2.1.0: 480 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 481 | 482 | fast-levenshtein@2.0.6: 483 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 484 | 485 | fast-redact@3.2.0: 486 | resolution: {integrity: sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==} 487 | engines: {node: '>=6'} 488 | 489 | fastq@1.17.1: 490 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 491 | 492 | file-entry-cache@6.0.1: 493 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 494 | engines: {node: ^10.12.0 || >=12.0.0} 495 | 496 | file-type@16.5.4: 497 | resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} 498 | engines: {node: '>=10'} 499 | 500 | fill-range@7.1.1: 501 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 502 | engines: {node: '>=8'} 503 | 504 | find-up@5.0.0: 505 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 506 | engines: {node: '>=10'} 507 | 508 | flat-cache@3.2.0: 509 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 510 | engines: {node: ^10.12.0 || >=12.0.0} 511 | 512 | flatted@3.3.1: 513 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 514 | 515 | follow-redirects@1.15.9: 516 | resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} 517 | engines: {node: '>=4.0'} 518 | peerDependencies: 519 | debug: '*' 520 | peerDependenciesMeta: 521 | debug: 522 | optional: true 523 | 524 | form-data@4.0.0: 525 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 526 | engines: {node: '>= 6'} 527 | 528 | fs.realpath@1.0.0: 529 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 530 | 531 | futoin-hkdf@1.5.2: 532 | resolution: {integrity: sha512-Bnytx8kQJQoEAPGgTZw3kVPy8e/n9CDftPzc0okgaujmbdF1x7w8wg+u2xS0CML233HgruNk6VQW28CzuUFMKw==} 533 | engines: {node: '>=8'} 534 | 535 | glob-parent@5.1.2: 536 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 537 | engines: {node: '>= 6'} 538 | 539 | glob-parent@6.0.2: 540 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 541 | engines: {node: '>=10.13.0'} 542 | 543 | glob@7.2.3: 544 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 545 | deprecated: Glob versions prior to v9 are no longer supported 546 | 547 | globals@13.24.0: 548 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 549 | engines: {node: '>=8'} 550 | 551 | globby@11.1.0: 552 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 553 | engines: {node: '>=10'} 554 | 555 | graphemer@1.4.0: 556 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 557 | 558 | has-flag@4.0.0: 559 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 560 | engines: {node: '>=8'} 561 | 562 | htmlparser2@8.0.2: 563 | resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} 564 | 565 | ieee754@1.2.1: 566 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 567 | 568 | ignore@5.3.2: 569 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 570 | engines: {node: '>= 4'} 571 | 572 | import-fresh@3.3.0: 573 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 574 | engines: {node: '>=6'} 575 | 576 | imurmurhash@0.1.4: 577 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 578 | engines: {node: '>=0.8.19'} 579 | 580 | inflight@1.0.6: 581 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 582 | 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. 583 | 584 | inherits@2.0.4: 585 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 586 | 587 | is-extglob@2.1.1: 588 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 589 | engines: {node: '>=0.10.0'} 590 | 591 | is-glob@4.0.3: 592 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 593 | engines: {node: '>=0.10.0'} 594 | 595 | is-number@7.0.0: 596 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 597 | engines: {node: '>=0.12.0'} 598 | 599 | is-path-inside@3.0.3: 600 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 601 | engines: {node: '>=8'} 602 | 603 | isexe@2.0.0: 604 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 605 | 606 | js-yaml@4.1.0: 607 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 608 | hasBin: true 609 | 610 | json-buffer@3.0.1: 611 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 612 | 613 | json-schema-traverse@0.4.1: 614 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 615 | 616 | json-stable-stringify-without-jsonify@1.0.1: 617 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 618 | 619 | keyv@4.5.4: 620 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 621 | 622 | levn@0.4.1: 623 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 624 | engines: {node: '>= 0.8.0'} 625 | 626 | libphonenumber-js@1.10.37: 627 | resolution: {integrity: sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw==} 628 | 629 | link-preview-js@3.0.14: 630 | resolution: {integrity: sha512-BAGZGCogqsWfF3msPt0c6DXr4+4zv7fregAxPioFYZJKoQEbKhJOhmu7VQjZmtKd1VRQ6CbL80Ok2KhpIuWJnQ==} 631 | engines: {node: '>=18'} 632 | 633 | locate-path@6.0.0: 634 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 635 | engines: {node: '>=10'} 636 | 637 | lodash.clonedeep@4.5.0: 638 | resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} 639 | 640 | lodash.merge@4.6.2: 641 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 642 | 643 | lodash@4.17.21: 644 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 645 | 646 | long@4.0.0: 647 | resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} 648 | 649 | long@5.2.3: 650 | resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} 651 | 652 | lru-cache@10.4.3: 653 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 654 | 655 | media-typer@1.1.0: 656 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 657 | engines: {node: '>= 0.8'} 658 | 659 | merge2@1.4.1: 660 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 661 | engines: {node: '>= 8'} 662 | 663 | micromatch@4.0.8: 664 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 665 | engines: {node: '>=8.6'} 666 | 667 | mime-db@1.52.0: 668 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 669 | engines: {node: '>= 0.6'} 670 | 671 | mime-types@2.1.35: 672 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 673 | engines: {node: '>= 0.6'} 674 | 675 | mime@3.0.0: 676 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 677 | engines: {node: '>=10.0.0'} 678 | hasBin: true 679 | 680 | minimatch@3.1.2: 681 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 682 | 683 | minimatch@9.0.5: 684 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 685 | engines: {node: '>=16 || 14 >=14.17'} 686 | 687 | mpg123-decoder@0.4.8: 688 | resolution: {integrity: sha512-HXs8vbPjiFM0NOZ45T3C5i7mpYGEYhjH37SnFA907lOb9c93DQL40cDjerxj65IMwAYyPFq1aUjtDOjyR7O0gQ==} 689 | 690 | ms@2.1.2: 691 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 692 | 693 | music-metadata@7.13.4: 694 | resolution: {integrity: sha512-eRRoEMhhYdth2Ws24FmkvIqrtkIBE9sqjHbrRNpkg2Iux3zc37PQKRv2/r/mTtELb7XlB1uWC2UcKKX7BzNMGA==} 695 | engines: {node: '>=10'} 696 | 697 | natural-compare@1.4.0: 698 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 699 | 700 | node-cache@5.1.2: 701 | resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} 702 | engines: {node: '>= 8.0.0'} 703 | 704 | node-wav@0.0.2: 705 | resolution: {integrity: sha512-M6Rm/bbG6De/gKGxOpeOobx/dnGuP0dz40adqx38boqHhlWssBJZgLCPBNtb9NkrmnKYiV04xELq+R6PFOnoLA==} 706 | engines: {node: '>=4.4.0'} 707 | 708 | nth-check@2.1.1: 709 | resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 710 | 711 | ogg-opus-decoder@1.6.5: 712 | resolution: {integrity: sha512-7NjCePv+XAcfsPdVhVjrKdrKc2BUAxhzkSY9ySOv3FSgqymu1J90J7vQRtSd2DoStFASznmJr5LB9j/EXrJZfQ==} 713 | 714 | on-exit-leak-free@0.2.0: 715 | resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} 716 | 717 | on-exit-leak-free@2.1.0: 718 | resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} 719 | 720 | once@1.4.0: 721 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 722 | 723 | optionator@0.9.4: 724 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 725 | engines: {node: '>= 0.8.0'} 726 | 727 | opus-decoder@0.7.1: 728 | resolution: {integrity: sha512-AOFCMKLn7LJm8pOkksY5TsW/6+XmNyh1OQS9gxmdOGHLNYoOBrjSfc0nPNcmUMGEzOrTqZtPi8VJ/ABs2Hndvg==} 729 | 730 | p-limit@3.1.0: 731 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 732 | engines: {node: '>=10'} 733 | 734 | p-locate@5.0.0: 735 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 736 | engines: {node: '>=10'} 737 | 738 | parent-module@1.0.1: 739 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 740 | engines: {node: '>=6'} 741 | 742 | parse5-htmlparser2-tree-adapter@7.1.0: 743 | resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} 744 | 745 | parse5@7.2.1: 746 | resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} 747 | 748 | path-exists@4.0.0: 749 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 750 | engines: {node: '>=8'} 751 | 752 | path-is-absolute@1.0.1: 753 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 754 | engines: {node: '>=0.10.0'} 755 | 756 | path-key@3.1.1: 757 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 758 | engines: {node: '>=8'} 759 | 760 | path-type@4.0.0: 761 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 762 | engines: {node: '>=8'} 763 | 764 | peek-readable@4.1.0: 765 | resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} 766 | engines: {node: '>=8'} 767 | 768 | picomatch@2.3.1: 769 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 770 | engines: {node: '>=8.6'} 771 | 772 | pino-abstract-transport@0.5.0: 773 | resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} 774 | 775 | pino-abstract-transport@2.0.0: 776 | resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} 777 | 778 | pino-std-serializers@4.0.0: 779 | resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} 780 | 781 | pino-std-serializers@7.0.0: 782 | resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} 783 | 784 | pino@7.11.0: 785 | resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} 786 | hasBin: true 787 | 788 | pino@9.5.0: 789 | resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} 790 | hasBin: true 791 | 792 | prelude-ls@1.2.1: 793 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 794 | engines: {node: '>= 0.8.0'} 795 | 796 | process-warning@1.0.0: 797 | resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} 798 | 799 | process-warning@4.0.0: 800 | resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} 801 | 802 | promise-coalesce@1.1.2: 803 | resolution: {integrity: sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==} 804 | engines: {node: '>=16'} 805 | 806 | protobufjs@6.8.8: 807 | resolution: {integrity: sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==} 808 | hasBin: true 809 | 810 | protobufjs@7.3.2: 811 | resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} 812 | engines: {node: '>=12.0.0'} 813 | 814 | proxy-from-env@1.1.0: 815 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} 816 | 817 | punycode@1.3.2: 818 | resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} 819 | 820 | punycode@2.3.1: 821 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 822 | engines: {node: '>=6'} 823 | 824 | qoa-format@1.0.0: 825 | resolution: {integrity: sha512-Vjp2aV2x06tHbZesCi2UtISaFdlLzy47Vbt0rNwwdihKFvGtUeFfytdnA8XZYADqWtRbK19+XXeRkv1Stg4qSQ==} 826 | 827 | qrcode-terminal@0.12.0: 828 | resolution: {integrity: sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==} 829 | hasBin: true 830 | 831 | querystring@0.2.0: 832 | resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} 833 | engines: {node: '>=0.4.x'} 834 | deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. 835 | 836 | queue-microtask@1.2.3: 837 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 838 | 839 | quick-format-unescaped@4.0.4: 840 | resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} 841 | 842 | readable-stream@3.6.2: 843 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 844 | engines: {node: '>= 6'} 845 | 846 | readable-web-to-node-stream@3.0.2: 847 | resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} 848 | engines: {node: '>=8'} 849 | 850 | real-require@0.1.0: 851 | resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} 852 | engines: {node: '>= 12.13.0'} 853 | 854 | real-require@0.2.0: 855 | resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} 856 | engines: {node: '>= 12.13.0'} 857 | 858 | resolve-from@4.0.0: 859 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 860 | engines: {node: '>=4'} 861 | 862 | reusify@1.0.4: 863 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 864 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 865 | 866 | rimraf@3.0.2: 867 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 868 | deprecated: Rimraf versions prior to v4 are no longer supported 869 | hasBin: true 870 | 871 | run-parallel@1.2.0: 872 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 873 | 874 | safe-buffer@5.2.1: 875 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 876 | 877 | safe-stable-stringify@2.4.3: 878 | resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} 879 | engines: {node: '>=10'} 880 | 881 | semver@7.6.3: 882 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 883 | engines: {node: '>=10'} 884 | hasBin: true 885 | 886 | shebang-command@2.0.0: 887 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 888 | engines: {node: '>=8'} 889 | 890 | shebang-regex@3.0.0: 891 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 892 | engines: {node: '>=8'} 893 | 894 | slash@3.0.0: 895 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 896 | engines: {node: '>=8'} 897 | 898 | sonic-boom@2.8.0: 899 | resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} 900 | 901 | sonic-boom@4.2.0: 902 | resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} 903 | 904 | split2@4.2.0: 905 | resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 906 | engines: {node: '>= 10.x'} 907 | 908 | stream-shift@1.0.1: 909 | resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} 910 | 911 | string_decoder@1.3.0: 912 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 913 | 914 | strip-ansi@6.0.1: 915 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 916 | engines: {node: '>=8'} 917 | 918 | strip-json-comments@3.1.1: 919 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 920 | engines: {node: '>=8'} 921 | 922 | strtok3@6.3.0: 923 | resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} 924 | engines: {node: '>=10'} 925 | 926 | supports-color@7.2.0: 927 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 928 | engines: {node: '>=8'} 929 | 930 | text-table@0.2.0: 931 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 932 | 933 | thread-stream@0.15.2: 934 | resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} 935 | 936 | thread-stream@3.1.0: 937 | resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} 938 | 939 | to-regex-range@5.0.1: 940 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 941 | engines: {node: '>=8.0'} 942 | 943 | token-types@4.2.1: 944 | resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} 945 | engines: {node: '>=10'} 946 | 947 | ts-api-utils@1.3.0: 948 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 949 | engines: {node: '>=16'} 950 | peerDependencies: 951 | typescript: '>=4.2.0' 952 | 953 | tslib@2.8.1: 954 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 955 | 956 | type-check@0.4.0: 957 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 958 | engines: {node: '>= 0.8.0'} 959 | 960 | type-fest@0.20.2: 961 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 962 | engines: {node: '>=10'} 963 | 964 | typescript@5.7.2: 965 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 966 | engines: {node: '>=14.17'} 967 | hasBin: true 968 | 969 | uri-js@4.4.1: 970 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 971 | 972 | url@0.11.0: 973 | resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} 974 | 975 | util-deprecate@1.0.2: 976 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 977 | 978 | uuid@10.0.0: 979 | resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} 980 | hasBin: true 981 | 982 | which@2.0.2: 983 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 984 | engines: {node: '>= 8'} 985 | hasBin: true 986 | 987 | word-wrap@1.2.5: 988 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 989 | engines: {node: '>=0.10.0'} 990 | 991 | wrappy@1.0.2: 992 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 993 | 994 | ws@8.13.0: 995 | resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} 996 | engines: {node: '>=10.0.0'} 997 | peerDependencies: 998 | bufferutil: ^4.0.1 999 | utf-8-validate: '>=5.0.2' 1000 | peerDependenciesMeta: 1001 | bufferutil: 1002 | optional: true 1003 | utf-8-validate: 1004 | optional: true 1005 | 1006 | yocto-queue@0.1.0: 1007 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1008 | engines: {node: '>=10'} 1009 | 1010 | snapshots: 1011 | 1012 | '@adiwajshing/keyed-db@0.2.4': {} 1013 | 1014 | '@eshaz/web-worker@1.2.1': {} 1015 | 1016 | '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': 1017 | dependencies: 1018 | eslint: 8.57.1 1019 | eslint-visitor-keys: 3.4.3 1020 | 1021 | '@eslint-community/regexpp@4.11.1': {} 1022 | 1023 | '@eslint/eslintrc@2.1.4': 1024 | dependencies: 1025 | ajv: 6.12.6 1026 | debug: 4.3.4 1027 | espree: 9.6.1 1028 | globals: 13.24.0 1029 | ignore: 5.3.2 1030 | import-fresh: 3.3.0 1031 | js-yaml: 4.1.0 1032 | minimatch: 3.1.2 1033 | strip-json-comments: 3.1.1 1034 | transitivePeerDependencies: 1035 | - supports-color 1036 | 1037 | '@eslint/js@8.57.1': {} 1038 | 1039 | '@hapi/boom@10.0.1': 1040 | dependencies: 1041 | '@hapi/hoek': 11.0.2 1042 | 1043 | '@hapi/boom@9.1.4': 1044 | dependencies: 1045 | '@hapi/hoek': 9.3.0 1046 | 1047 | '@hapi/hoek@11.0.2': {} 1048 | 1049 | '@hapi/hoek@9.3.0': {} 1050 | 1051 | '@humanwhocodes/config-array@0.13.0': 1052 | dependencies: 1053 | '@humanwhocodes/object-schema': 2.0.3 1054 | debug: 4.3.4 1055 | minimatch: 3.1.2 1056 | transitivePeerDependencies: 1057 | - supports-color 1058 | 1059 | '@humanwhocodes/module-importer@1.0.1': {} 1060 | 1061 | '@humanwhocodes/object-schema@2.0.3': {} 1062 | 1063 | '@nodelib/fs.scandir@2.1.5': 1064 | dependencies: 1065 | '@nodelib/fs.stat': 2.0.5 1066 | run-parallel: 1.2.0 1067 | 1068 | '@nodelib/fs.stat@2.0.5': {} 1069 | 1070 | '@nodelib/fs.walk@1.2.8': 1071 | dependencies: 1072 | '@nodelib/fs.scandir': 2.1.5 1073 | fastq: 1.17.1 1074 | 1075 | '@protobufjs/aspromise@1.1.2': {} 1076 | 1077 | '@protobufjs/base64@1.1.2': {} 1078 | 1079 | '@protobufjs/codegen@2.0.4': {} 1080 | 1081 | '@protobufjs/eventemitter@1.1.0': {} 1082 | 1083 | '@protobufjs/fetch@1.1.0': 1084 | dependencies: 1085 | '@protobufjs/aspromise': 1.1.2 1086 | '@protobufjs/inquire': 1.1.0 1087 | 1088 | '@protobufjs/float@1.0.2': {} 1089 | 1090 | '@protobufjs/inquire@1.1.0': {} 1091 | 1092 | '@protobufjs/path@1.1.2': {} 1093 | 1094 | '@protobufjs/pool@1.1.0': {} 1095 | 1096 | '@protobufjs/utf8@1.1.0': {} 1097 | 1098 | '@thi.ng/bitstream@2.2.28': 1099 | dependencies: 1100 | '@thi.ng/errors': 2.3.5 1101 | 1102 | '@thi.ng/errors@2.3.5': {} 1103 | 1104 | '@tokenizer/token@0.3.0': {} 1105 | 1106 | '@types/long@4.0.2': {} 1107 | 1108 | '@types/mime@3.0.1': {} 1109 | 1110 | '@types/node@10.17.60': {} 1111 | 1112 | '@types/node@20.4.1': {} 1113 | 1114 | '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': 1115 | dependencies: 1116 | '@eslint-community/regexpp': 4.11.1 1117 | '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) 1118 | '@typescript-eslint/scope-manager': 7.18.0 1119 | '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) 1120 | '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) 1121 | '@typescript-eslint/visitor-keys': 7.18.0 1122 | eslint: 8.57.1 1123 | graphemer: 1.4.0 1124 | ignore: 5.3.2 1125 | natural-compare: 1.4.0 1126 | ts-api-utils: 1.3.0(typescript@5.7.2) 1127 | optionalDependencies: 1128 | typescript: 5.7.2 1129 | transitivePeerDependencies: 1130 | - supports-color 1131 | 1132 | '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2)': 1133 | dependencies: 1134 | '@typescript-eslint/scope-manager': 7.18.0 1135 | '@typescript-eslint/types': 7.18.0 1136 | '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) 1137 | '@typescript-eslint/visitor-keys': 7.18.0 1138 | debug: 4.3.4 1139 | eslint: 8.57.1 1140 | optionalDependencies: 1141 | typescript: 5.7.2 1142 | transitivePeerDependencies: 1143 | - supports-color 1144 | 1145 | '@typescript-eslint/scope-manager@7.18.0': 1146 | dependencies: 1147 | '@typescript-eslint/types': 7.18.0 1148 | '@typescript-eslint/visitor-keys': 7.18.0 1149 | 1150 | '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': 1151 | dependencies: 1152 | '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) 1153 | '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) 1154 | debug: 4.3.4 1155 | eslint: 8.57.1 1156 | ts-api-utils: 1.3.0(typescript@5.7.2) 1157 | optionalDependencies: 1158 | typescript: 5.7.2 1159 | transitivePeerDependencies: 1160 | - supports-color 1161 | 1162 | '@typescript-eslint/types@7.18.0': {} 1163 | 1164 | '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.2)': 1165 | dependencies: 1166 | '@typescript-eslint/types': 7.18.0 1167 | '@typescript-eslint/visitor-keys': 7.18.0 1168 | debug: 4.3.4 1169 | globby: 11.1.0 1170 | is-glob: 4.0.3 1171 | minimatch: 9.0.5 1172 | semver: 7.6.3 1173 | ts-api-utils: 1.3.0(typescript@5.7.2) 1174 | optionalDependencies: 1175 | typescript: 5.7.2 1176 | transitivePeerDependencies: 1177 | - supports-color 1178 | 1179 | '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': 1180 | dependencies: 1181 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) 1182 | '@typescript-eslint/scope-manager': 7.18.0 1183 | '@typescript-eslint/types': 7.18.0 1184 | '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) 1185 | eslint: 8.57.1 1186 | transitivePeerDependencies: 1187 | - supports-color 1188 | - typescript 1189 | 1190 | '@typescript-eslint/visitor-keys@7.18.0': 1191 | dependencies: 1192 | '@typescript-eslint/types': 7.18.0 1193 | eslint-visitor-keys: 3.4.3 1194 | 1195 | '@ungap/structured-clone@1.2.0': {} 1196 | 1197 | '@wasm-audio-decoders/common@9.0.1': 1198 | dependencies: 1199 | '@eshaz/web-worker': 1.2.1 1200 | 1201 | '@wasm-audio-decoders/flac@0.1.13': 1202 | dependencies: 1203 | '@wasm-audio-decoders/common': 9.0.1 1204 | codec-parser: 2.4.3 1205 | 1206 | '@wasm-audio-decoders/ogg-vorbis@0.1.8': 1207 | dependencies: 1208 | '@wasm-audio-decoders/common': 9.0.1 1209 | codec-parser: 2.4.3 1210 | 1211 | '@whiskeysockets/baileys@6.7.9(eslint@8.57.1)(link-preview-js@3.0.14)(qrcode-terminal@0.12.0)(typescript@5.7.2)': 1212 | dependencies: 1213 | '@adiwajshing/keyed-db': 0.2.4 1214 | '@hapi/boom': 9.1.4 1215 | '@whiskeysockets/eslint-config': https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/326b55f2842668f4e11f471451c4e39819a0e1bf(eslint@8.57.1)(typescript@5.7.2) 1216 | async-lock: 1.4.1 1217 | audio-decode: 2.1.5 1218 | axios: 1.7.7 1219 | cache-manager: 5.7.6 1220 | futoin-hkdf: 1.5.2 1221 | libphonenumber-js: 1.10.37 1222 | libsignal: '@whiskeysockets/libsignal-node@https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/d13b6622a208d3037a98b6f447bbde70261c39a9' 1223 | lodash: 4.17.21 1224 | music-metadata: 7.13.4 1225 | node-cache: 5.1.2 1226 | pino: 7.11.0 1227 | protobufjs: 7.3.2 1228 | uuid: 10.0.0 1229 | ws: 8.13.0 1230 | optionalDependencies: 1231 | link-preview-js: 3.0.14 1232 | qrcode-terminal: 0.12.0 1233 | transitivePeerDependencies: 1234 | - bufferutil 1235 | - debug 1236 | - eslint 1237 | - supports-color 1238 | - typescript 1239 | - utf-8-validate 1240 | 1241 | '@whiskeysockets/eslint-config@https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/326b55f2842668f4e11f471451c4e39819a0e1bf(eslint@8.57.1)(typescript@5.7.2)': 1242 | dependencies: 1243 | '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) 1244 | '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) 1245 | eslint: 8.57.1 1246 | eslint-plugin-simple-import-sort: 12.1.1(eslint@8.57.1) 1247 | typescript: 5.7.2 1248 | transitivePeerDependencies: 1249 | - supports-color 1250 | 1251 | '@whiskeysockets/libsignal-node@https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/d13b6622a208d3037a98b6f447bbde70261c39a9': 1252 | dependencies: 1253 | curve25519-js: 0.0.4 1254 | protobufjs: 6.8.8 1255 | 1256 | acorn-jsx@5.3.2(acorn@8.13.0): 1257 | dependencies: 1258 | acorn: 8.13.0 1259 | 1260 | acorn@8.13.0: {} 1261 | 1262 | ajv@6.12.6: 1263 | dependencies: 1264 | fast-deep-equal: 3.1.3 1265 | fast-json-stable-stringify: 2.1.0 1266 | json-schema-traverse: 0.4.1 1267 | uri-js: 4.4.1 1268 | 1269 | ansi-regex@5.0.1: {} 1270 | 1271 | ansi-styles@4.3.0: 1272 | dependencies: 1273 | color-convert: 2.0.1 1274 | 1275 | argparse@2.0.1: {} 1276 | 1277 | array-union@2.1.0: {} 1278 | 1279 | async-lock@1.4.1: {} 1280 | 1281 | asynckit@0.4.0: {} 1282 | 1283 | atomic-sleep@1.0.0: {} 1284 | 1285 | audio-buffer@5.0.0: {} 1286 | 1287 | audio-decode@2.1.5: 1288 | dependencies: 1289 | '@wasm-audio-decoders/flac': 0.1.13 1290 | '@wasm-audio-decoders/ogg-vorbis': 0.1.8 1291 | audio-buffer: 5.0.0 1292 | audio-type: 2.2.1 1293 | mpg123-decoder: 0.4.8 1294 | node-wav: 0.0.2 1295 | ogg-opus-decoder: 1.6.5 1296 | qoa-format: 1.0.0 1297 | 1298 | audio-type@2.2.1: {} 1299 | 1300 | axios@1.7.7: 1301 | dependencies: 1302 | follow-redirects: 1.15.9 1303 | form-data: 4.0.0 1304 | proxy-from-env: 1.1.0 1305 | transitivePeerDependencies: 1306 | - debug 1307 | 1308 | balanced-match@1.0.2: {} 1309 | 1310 | boolbase@1.0.0: {} 1311 | 1312 | brace-expansion@1.1.11: 1313 | dependencies: 1314 | balanced-match: 1.0.2 1315 | concat-map: 0.0.1 1316 | 1317 | brace-expansion@2.0.1: 1318 | dependencies: 1319 | balanced-match: 1.0.2 1320 | 1321 | braces@3.0.3: 1322 | dependencies: 1323 | fill-range: 7.1.1 1324 | 1325 | cache-manager@5.7.6: 1326 | dependencies: 1327 | eventemitter3: 5.0.1 1328 | lodash.clonedeep: 4.5.0 1329 | lru-cache: 10.4.3 1330 | promise-coalesce: 1.1.2 1331 | 1332 | callsites@3.1.0: {} 1333 | 1334 | chalk@4.1.2: 1335 | dependencies: 1336 | ansi-styles: 4.3.0 1337 | supports-color: 7.2.0 1338 | 1339 | cheerio-select@2.1.0: 1340 | dependencies: 1341 | boolbase: 1.0.0 1342 | css-select: 5.1.0 1343 | css-what: 6.1.0 1344 | domelementtype: 2.3.0 1345 | domhandler: 5.0.3 1346 | domutils: 3.2.2 1347 | 1348 | cheerio@1.0.0-rc.11: 1349 | dependencies: 1350 | cheerio-select: 2.1.0 1351 | dom-serializer: 2.0.0 1352 | domhandler: 5.0.3 1353 | domutils: 3.2.2 1354 | htmlparser2: 8.0.2 1355 | parse5: 7.2.1 1356 | parse5-htmlparser2-tree-adapter: 7.1.0 1357 | tslib: 2.8.1 1358 | 1359 | clone@2.1.2: {} 1360 | 1361 | codec-parser@2.4.3: {} 1362 | 1363 | color-convert@2.0.1: 1364 | dependencies: 1365 | color-name: 1.1.4 1366 | 1367 | color-name@1.1.4: {} 1368 | 1369 | combined-stream@1.0.8: 1370 | dependencies: 1371 | delayed-stream: 1.0.0 1372 | 1373 | concat-map@0.0.1: {} 1374 | 1375 | content-type@1.0.5: {} 1376 | 1377 | cross-spawn@7.0.3: 1378 | dependencies: 1379 | path-key: 3.1.1 1380 | shebang-command: 2.0.0 1381 | which: 2.0.2 1382 | 1383 | css-select@5.1.0: 1384 | dependencies: 1385 | boolbase: 1.0.0 1386 | css-what: 6.1.0 1387 | domhandler: 5.0.3 1388 | domutils: 3.2.2 1389 | nth-check: 2.1.1 1390 | 1391 | css-what@6.1.0: {} 1392 | 1393 | curve25519-js@0.0.4: {} 1394 | 1395 | debug@4.3.4: 1396 | dependencies: 1397 | ms: 2.1.2 1398 | 1399 | deep-is@0.1.4: {} 1400 | 1401 | delayed-stream@1.0.0: {} 1402 | 1403 | dir-glob@3.0.1: 1404 | dependencies: 1405 | path-type: 4.0.0 1406 | 1407 | doctrine@3.0.0: 1408 | dependencies: 1409 | esutils: 2.0.3 1410 | 1411 | dom-serializer@2.0.0: 1412 | dependencies: 1413 | domelementtype: 2.3.0 1414 | domhandler: 5.0.3 1415 | entities: 4.5.0 1416 | 1417 | domelementtype@2.3.0: {} 1418 | 1419 | domhandler@5.0.3: 1420 | dependencies: 1421 | domelementtype: 2.3.0 1422 | 1423 | domutils@3.2.2: 1424 | dependencies: 1425 | dom-serializer: 2.0.0 1426 | domelementtype: 2.3.0 1427 | domhandler: 5.0.3 1428 | 1429 | duplexify@4.1.2: 1430 | dependencies: 1431 | end-of-stream: 1.4.4 1432 | inherits: 2.0.4 1433 | readable-stream: 3.6.2 1434 | stream-shift: 1.0.1 1435 | 1436 | end-of-stream@1.4.4: 1437 | dependencies: 1438 | once: 1.4.0 1439 | 1440 | entities@4.5.0: {} 1441 | 1442 | escape-string-regexp@4.0.0: {} 1443 | 1444 | eslint-plugin-simple-import-sort@12.1.1(eslint@8.57.1): 1445 | dependencies: 1446 | eslint: 8.57.1 1447 | 1448 | eslint-scope@7.2.2: 1449 | dependencies: 1450 | esrecurse: 4.3.0 1451 | estraverse: 5.3.0 1452 | 1453 | eslint-visitor-keys@3.4.3: {} 1454 | 1455 | eslint@8.57.1: 1456 | dependencies: 1457 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) 1458 | '@eslint-community/regexpp': 4.11.1 1459 | '@eslint/eslintrc': 2.1.4 1460 | '@eslint/js': 8.57.1 1461 | '@humanwhocodes/config-array': 0.13.0 1462 | '@humanwhocodes/module-importer': 1.0.1 1463 | '@nodelib/fs.walk': 1.2.8 1464 | '@ungap/structured-clone': 1.2.0 1465 | ajv: 6.12.6 1466 | chalk: 4.1.2 1467 | cross-spawn: 7.0.3 1468 | debug: 4.3.4 1469 | doctrine: 3.0.0 1470 | escape-string-regexp: 4.0.0 1471 | eslint-scope: 7.2.2 1472 | eslint-visitor-keys: 3.4.3 1473 | espree: 9.6.1 1474 | esquery: 1.6.0 1475 | esutils: 2.0.3 1476 | fast-deep-equal: 3.1.3 1477 | file-entry-cache: 6.0.1 1478 | find-up: 5.0.0 1479 | glob-parent: 6.0.2 1480 | globals: 13.24.0 1481 | graphemer: 1.4.0 1482 | ignore: 5.3.2 1483 | imurmurhash: 0.1.4 1484 | is-glob: 4.0.3 1485 | is-path-inside: 3.0.3 1486 | js-yaml: 4.1.0 1487 | json-stable-stringify-without-jsonify: 1.0.1 1488 | levn: 0.4.1 1489 | lodash.merge: 4.6.2 1490 | minimatch: 3.1.2 1491 | natural-compare: 1.4.0 1492 | optionator: 0.9.4 1493 | strip-ansi: 6.0.1 1494 | text-table: 0.2.0 1495 | transitivePeerDependencies: 1496 | - supports-color 1497 | 1498 | espree@9.6.1: 1499 | dependencies: 1500 | acorn: 8.13.0 1501 | acorn-jsx: 5.3.2(acorn@8.13.0) 1502 | eslint-visitor-keys: 3.4.3 1503 | 1504 | esquery@1.6.0: 1505 | dependencies: 1506 | estraverse: 5.3.0 1507 | 1508 | esrecurse@4.3.0: 1509 | dependencies: 1510 | estraverse: 5.3.0 1511 | 1512 | estraverse@5.3.0: {} 1513 | 1514 | esutils@2.0.3: {} 1515 | 1516 | eventemitter3@5.0.1: {} 1517 | 1518 | fast-deep-equal@3.1.3: {} 1519 | 1520 | fast-glob@3.3.2: 1521 | dependencies: 1522 | '@nodelib/fs.stat': 2.0.5 1523 | '@nodelib/fs.walk': 1.2.8 1524 | glob-parent: 5.1.2 1525 | merge2: 1.4.1 1526 | micromatch: 4.0.8 1527 | 1528 | fast-json-stable-stringify@2.1.0: {} 1529 | 1530 | fast-levenshtein@2.0.6: {} 1531 | 1532 | fast-redact@3.2.0: {} 1533 | 1534 | fastq@1.17.1: 1535 | dependencies: 1536 | reusify: 1.0.4 1537 | 1538 | file-entry-cache@6.0.1: 1539 | dependencies: 1540 | flat-cache: 3.2.0 1541 | 1542 | file-type@16.5.4: 1543 | dependencies: 1544 | readable-web-to-node-stream: 3.0.2 1545 | strtok3: 6.3.0 1546 | token-types: 4.2.1 1547 | 1548 | fill-range@7.1.1: 1549 | dependencies: 1550 | to-regex-range: 5.0.1 1551 | 1552 | find-up@5.0.0: 1553 | dependencies: 1554 | locate-path: 6.0.0 1555 | path-exists: 4.0.0 1556 | 1557 | flat-cache@3.2.0: 1558 | dependencies: 1559 | flatted: 3.3.1 1560 | keyv: 4.5.4 1561 | rimraf: 3.0.2 1562 | 1563 | flatted@3.3.1: {} 1564 | 1565 | follow-redirects@1.15.9: {} 1566 | 1567 | form-data@4.0.0: 1568 | dependencies: 1569 | asynckit: 0.4.0 1570 | combined-stream: 1.0.8 1571 | mime-types: 2.1.35 1572 | 1573 | fs.realpath@1.0.0: {} 1574 | 1575 | futoin-hkdf@1.5.2: {} 1576 | 1577 | glob-parent@5.1.2: 1578 | dependencies: 1579 | is-glob: 4.0.3 1580 | 1581 | glob-parent@6.0.2: 1582 | dependencies: 1583 | is-glob: 4.0.3 1584 | 1585 | glob@7.2.3: 1586 | dependencies: 1587 | fs.realpath: 1.0.0 1588 | inflight: 1.0.6 1589 | inherits: 2.0.4 1590 | minimatch: 3.1.2 1591 | once: 1.4.0 1592 | path-is-absolute: 1.0.1 1593 | 1594 | globals@13.24.0: 1595 | dependencies: 1596 | type-fest: 0.20.2 1597 | 1598 | globby@11.1.0: 1599 | dependencies: 1600 | array-union: 2.1.0 1601 | dir-glob: 3.0.1 1602 | fast-glob: 3.3.2 1603 | ignore: 5.3.2 1604 | merge2: 1.4.1 1605 | slash: 3.0.0 1606 | 1607 | graphemer@1.4.0: {} 1608 | 1609 | has-flag@4.0.0: {} 1610 | 1611 | htmlparser2@8.0.2: 1612 | dependencies: 1613 | domelementtype: 2.3.0 1614 | domhandler: 5.0.3 1615 | domutils: 3.2.2 1616 | entities: 4.5.0 1617 | 1618 | ieee754@1.2.1: {} 1619 | 1620 | ignore@5.3.2: {} 1621 | 1622 | import-fresh@3.3.0: 1623 | dependencies: 1624 | parent-module: 1.0.1 1625 | resolve-from: 4.0.0 1626 | 1627 | imurmurhash@0.1.4: {} 1628 | 1629 | inflight@1.0.6: 1630 | dependencies: 1631 | once: 1.4.0 1632 | wrappy: 1.0.2 1633 | 1634 | inherits@2.0.4: {} 1635 | 1636 | is-extglob@2.1.1: {} 1637 | 1638 | is-glob@4.0.3: 1639 | dependencies: 1640 | is-extglob: 2.1.1 1641 | 1642 | is-number@7.0.0: {} 1643 | 1644 | is-path-inside@3.0.3: {} 1645 | 1646 | isexe@2.0.0: {} 1647 | 1648 | js-yaml@4.1.0: 1649 | dependencies: 1650 | argparse: 2.0.1 1651 | 1652 | json-buffer@3.0.1: {} 1653 | 1654 | json-schema-traverse@0.4.1: {} 1655 | 1656 | json-stable-stringify-without-jsonify@1.0.1: {} 1657 | 1658 | keyv@4.5.4: 1659 | dependencies: 1660 | json-buffer: 3.0.1 1661 | 1662 | levn@0.4.1: 1663 | dependencies: 1664 | prelude-ls: 1.2.1 1665 | type-check: 0.4.0 1666 | 1667 | libphonenumber-js@1.10.37: {} 1668 | 1669 | link-preview-js@3.0.14: 1670 | dependencies: 1671 | cheerio: 1.0.0-rc.11 1672 | url: 0.11.0 1673 | 1674 | locate-path@6.0.0: 1675 | dependencies: 1676 | p-locate: 5.0.0 1677 | 1678 | lodash.clonedeep@4.5.0: {} 1679 | 1680 | lodash.merge@4.6.2: {} 1681 | 1682 | lodash@4.17.21: {} 1683 | 1684 | long@4.0.0: {} 1685 | 1686 | long@5.2.3: {} 1687 | 1688 | lru-cache@10.4.3: {} 1689 | 1690 | media-typer@1.1.0: {} 1691 | 1692 | merge2@1.4.1: {} 1693 | 1694 | micromatch@4.0.8: 1695 | dependencies: 1696 | braces: 3.0.3 1697 | picomatch: 2.3.1 1698 | 1699 | mime-db@1.52.0: {} 1700 | 1701 | mime-types@2.1.35: 1702 | dependencies: 1703 | mime-db: 1.52.0 1704 | 1705 | mime@3.0.0: {} 1706 | 1707 | minimatch@3.1.2: 1708 | dependencies: 1709 | brace-expansion: 1.1.11 1710 | 1711 | minimatch@9.0.5: 1712 | dependencies: 1713 | brace-expansion: 2.0.1 1714 | 1715 | mpg123-decoder@0.4.8: 1716 | dependencies: 1717 | '@wasm-audio-decoders/common': 9.0.1 1718 | 1719 | ms@2.1.2: {} 1720 | 1721 | music-metadata@7.13.4: 1722 | dependencies: 1723 | '@tokenizer/token': 0.3.0 1724 | content-type: 1.0.5 1725 | debug: 4.3.4 1726 | file-type: 16.5.4 1727 | media-typer: 1.1.0 1728 | strtok3: 6.3.0 1729 | token-types: 4.2.1 1730 | transitivePeerDependencies: 1731 | - supports-color 1732 | 1733 | natural-compare@1.4.0: {} 1734 | 1735 | node-cache@5.1.2: 1736 | dependencies: 1737 | clone: 2.1.2 1738 | 1739 | node-wav@0.0.2: {} 1740 | 1741 | nth-check@2.1.1: 1742 | dependencies: 1743 | boolbase: 1.0.0 1744 | 1745 | ogg-opus-decoder@1.6.5: 1746 | dependencies: 1747 | '@wasm-audio-decoders/common': 9.0.1 1748 | codec-parser: 2.4.3 1749 | opus-decoder: 0.7.1 1750 | 1751 | on-exit-leak-free@0.2.0: {} 1752 | 1753 | on-exit-leak-free@2.1.0: {} 1754 | 1755 | once@1.4.0: 1756 | dependencies: 1757 | wrappy: 1.0.2 1758 | 1759 | optionator@0.9.4: 1760 | dependencies: 1761 | deep-is: 0.1.4 1762 | fast-levenshtein: 2.0.6 1763 | levn: 0.4.1 1764 | prelude-ls: 1.2.1 1765 | type-check: 0.4.0 1766 | word-wrap: 1.2.5 1767 | 1768 | opus-decoder@0.7.1: 1769 | dependencies: 1770 | '@wasm-audio-decoders/common': 9.0.1 1771 | 1772 | p-limit@3.1.0: 1773 | dependencies: 1774 | yocto-queue: 0.1.0 1775 | 1776 | p-locate@5.0.0: 1777 | dependencies: 1778 | p-limit: 3.1.0 1779 | 1780 | parent-module@1.0.1: 1781 | dependencies: 1782 | callsites: 3.1.0 1783 | 1784 | parse5-htmlparser2-tree-adapter@7.1.0: 1785 | dependencies: 1786 | domhandler: 5.0.3 1787 | parse5: 7.2.1 1788 | 1789 | parse5@7.2.1: 1790 | dependencies: 1791 | entities: 4.5.0 1792 | 1793 | path-exists@4.0.0: {} 1794 | 1795 | path-is-absolute@1.0.1: {} 1796 | 1797 | path-key@3.1.1: {} 1798 | 1799 | path-type@4.0.0: {} 1800 | 1801 | peek-readable@4.1.0: {} 1802 | 1803 | picomatch@2.3.1: {} 1804 | 1805 | pino-abstract-transport@0.5.0: 1806 | dependencies: 1807 | duplexify: 4.1.2 1808 | split2: 4.2.0 1809 | 1810 | pino-abstract-transport@2.0.0: 1811 | dependencies: 1812 | split2: 4.2.0 1813 | 1814 | pino-std-serializers@4.0.0: {} 1815 | 1816 | pino-std-serializers@7.0.0: {} 1817 | 1818 | pino@7.11.0: 1819 | dependencies: 1820 | atomic-sleep: 1.0.0 1821 | fast-redact: 3.2.0 1822 | on-exit-leak-free: 0.2.0 1823 | pino-abstract-transport: 0.5.0 1824 | pino-std-serializers: 4.0.0 1825 | process-warning: 1.0.0 1826 | quick-format-unescaped: 4.0.4 1827 | real-require: 0.1.0 1828 | safe-stable-stringify: 2.4.3 1829 | sonic-boom: 2.8.0 1830 | thread-stream: 0.15.2 1831 | 1832 | pino@9.5.0: 1833 | dependencies: 1834 | atomic-sleep: 1.0.0 1835 | fast-redact: 3.2.0 1836 | on-exit-leak-free: 2.1.0 1837 | pino-abstract-transport: 2.0.0 1838 | pino-std-serializers: 7.0.0 1839 | process-warning: 4.0.0 1840 | quick-format-unescaped: 4.0.4 1841 | real-require: 0.2.0 1842 | safe-stable-stringify: 2.4.3 1843 | sonic-boom: 4.2.0 1844 | thread-stream: 3.1.0 1845 | 1846 | prelude-ls@1.2.1: {} 1847 | 1848 | process-warning@1.0.0: {} 1849 | 1850 | process-warning@4.0.0: {} 1851 | 1852 | promise-coalesce@1.1.2: {} 1853 | 1854 | protobufjs@6.8.8: 1855 | dependencies: 1856 | '@protobufjs/aspromise': 1.1.2 1857 | '@protobufjs/base64': 1.1.2 1858 | '@protobufjs/codegen': 2.0.4 1859 | '@protobufjs/eventemitter': 1.1.0 1860 | '@protobufjs/fetch': 1.1.0 1861 | '@protobufjs/float': 1.0.2 1862 | '@protobufjs/inquire': 1.1.0 1863 | '@protobufjs/path': 1.1.2 1864 | '@protobufjs/pool': 1.1.0 1865 | '@protobufjs/utf8': 1.1.0 1866 | '@types/long': 4.0.2 1867 | '@types/node': 10.17.60 1868 | long: 4.0.0 1869 | 1870 | protobufjs@7.3.2: 1871 | dependencies: 1872 | '@protobufjs/aspromise': 1.1.2 1873 | '@protobufjs/base64': 1.1.2 1874 | '@protobufjs/codegen': 2.0.4 1875 | '@protobufjs/eventemitter': 1.1.0 1876 | '@protobufjs/fetch': 1.1.0 1877 | '@protobufjs/float': 1.0.2 1878 | '@protobufjs/inquire': 1.1.0 1879 | '@protobufjs/path': 1.1.2 1880 | '@protobufjs/pool': 1.1.0 1881 | '@protobufjs/utf8': 1.1.0 1882 | '@types/node': 20.4.1 1883 | long: 5.2.3 1884 | 1885 | proxy-from-env@1.1.0: {} 1886 | 1887 | punycode@1.3.2: {} 1888 | 1889 | punycode@2.3.1: {} 1890 | 1891 | qoa-format@1.0.0: 1892 | dependencies: 1893 | '@thi.ng/bitstream': 2.2.28 1894 | 1895 | qrcode-terminal@0.12.0: {} 1896 | 1897 | querystring@0.2.0: {} 1898 | 1899 | queue-microtask@1.2.3: {} 1900 | 1901 | quick-format-unescaped@4.0.4: {} 1902 | 1903 | readable-stream@3.6.2: 1904 | dependencies: 1905 | inherits: 2.0.4 1906 | string_decoder: 1.3.0 1907 | util-deprecate: 1.0.2 1908 | 1909 | readable-web-to-node-stream@3.0.2: 1910 | dependencies: 1911 | readable-stream: 3.6.2 1912 | 1913 | real-require@0.1.0: {} 1914 | 1915 | real-require@0.2.0: {} 1916 | 1917 | resolve-from@4.0.0: {} 1918 | 1919 | reusify@1.0.4: {} 1920 | 1921 | rimraf@3.0.2: 1922 | dependencies: 1923 | glob: 7.2.3 1924 | 1925 | run-parallel@1.2.0: 1926 | dependencies: 1927 | queue-microtask: 1.2.3 1928 | 1929 | safe-buffer@5.2.1: {} 1930 | 1931 | safe-stable-stringify@2.4.3: {} 1932 | 1933 | semver@7.6.3: {} 1934 | 1935 | shebang-command@2.0.0: 1936 | dependencies: 1937 | shebang-regex: 3.0.0 1938 | 1939 | shebang-regex@3.0.0: {} 1940 | 1941 | slash@3.0.0: {} 1942 | 1943 | sonic-boom@2.8.0: 1944 | dependencies: 1945 | atomic-sleep: 1.0.0 1946 | 1947 | sonic-boom@4.2.0: 1948 | dependencies: 1949 | atomic-sleep: 1.0.0 1950 | 1951 | split2@4.2.0: {} 1952 | 1953 | stream-shift@1.0.1: {} 1954 | 1955 | string_decoder@1.3.0: 1956 | dependencies: 1957 | safe-buffer: 5.2.1 1958 | 1959 | strip-ansi@6.0.1: 1960 | dependencies: 1961 | ansi-regex: 5.0.1 1962 | 1963 | strip-json-comments@3.1.1: {} 1964 | 1965 | strtok3@6.3.0: 1966 | dependencies: 1967 | '@tokenizer/token': 0.3.0 1968 | peek-readable: 4.1.0 1969 | 1970 | supports-color@7.2.0: 1971 | dependencies: 1972 | has-flag: 4.0.0 1973 | 1974 | text-table@0.2.0: {} 1975 | 1976 | thread-stream@0.15.2: 1977 | dependencies: 1978 | real-require: 0.1.0 1979 | 1980 | thread-stream@3.1.0: 1981 | dependencies: 1982 | real-require: 0.2.0 1983 | 1984 | to-regex-range@5.0.1: 1985 | dependencies: 1986 | is-number: 7.0.0 1987 | 1988 | token-types@4.2.1: 1989 | dependencies: 1990 | '@tokenizer/token': 0.3.0 1991 | ieee754: 1.2.1 1992 | 1993 | ts-api-utils@1.3.0(typescript@5.7.2): 1994 | dependencies: 1995 | typescript: 5.7.2 1996 | 1997 | tslib@2.8.1: {} 1998 | 1999 | type-check@0.4.0: 2000 | dependencies: 2001 | prelude-ls: 1.2.1 2002 | 2003 | type-fest@0.20.2: {} 2004 | 2005 | typescript@5.7.2: {} 2006 | 2007 | uri-js@4.4.1: 2008 | dependencies: 2009 | punycode: 2.3.1 2010 | 2011 | url@0.11.0: 2012 | dependencies: 2013 | punycode: 1.3.2 2014 | querystring: 0.2.0 2015 | 2016 | util-deprecate@1.0.2: {} 2017 | 2018 | uuid@10.0.0: {} 2019 | 2020 | which@2.0.2: 2021 | dependencies: 2022 | isexe: 2.0.0 2023 | 2024 | word-wrap@1.2.5: {} 2025 | 2026 | wrappy@1.0.2: {} 2027 | 2028 | ws@8.13.0: {} 2029 | 2030 | yocto-queue@0.1.0: {} 2031 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Whatsapp Multi Session - Connecting More Whatsapp Session in 1 App 2 | 3 | Connecting Your app with Whatsapp Messaging 4 | 5 | Lightweight library for whatsapp. Not require Selenium or any other browser. 6 | 7 | Stand above [Baileys](https://github.com/WhiskeySockets/Baileys) Library. 8 | 9 | ## Installation 10 | 11 | Install package using npm 12 | 13 | ``` 14 | npm install wa-multi-session@latest 15 | ``` 16 | 17 | Then import your code 18 | 19 | Using JS Module 20 | 21 | ```ts 22 | import * as whatsapp from "wa-multi-session"; 23 | ``` 24 | 25 | or using CommonJS 26 | 27 | ```ts 28 | const whatsapp = require("wa-multi-session"); 29 | ``` 30 | 31 | ## Session Usage/Examples 32 | 33 | Start New Session 34 | 35 | ```ts 36 | // create session with ID : mysessionid 37 | 38 | const session = await whatsapp.startSession("mysessionid"); 39 | // Then, scan QR on terminal 40 | ``` 41 | 42 | Get All Session ID 43 | 44 | ```ts 45 | const sessions = whatsapp.getAllSession(); 46 | // returning all session ID that has been created 47 | ``` 48 | 49 | Get Session Data By ID 50 | 51 | ```ts 52 | const session = whatsapp.getSession("mysessionid"); 53 | // returning session data 54 | ``` 55 | 56 | Load Session From Storage / Load Saved Session 57 | 58 | ```ts 59 | whatsapp.loadSessionsFromStorage(); 60 | // Start saved session without scan again 61 | ``` 62 | 63 | ## Messaging Usage/Examples 64 | 65 | Send Text Message 66 | 67 | ```ts 68 | await whatsapp.sendTextMessage({ 69 | sessionId: "mysessionid", // session ID 70 | to: "6281234567890", // always add country code (ex: 62) 71 | text: "Hi There, This is Message from Server!", // message you want to send 72 | }); 73 | ``` 74 | 75 | Send Image 76 | 77 | ```ts 78 | const image = fs.readFileSync("./myimage.png"); // return Buffer 79 | const send = await whatsapp.sendImage({ 80 | sessionId: "session1", 81 | to: "6281234567890", 82 | text: "My Image Caption", 83 | media: image, // can from URL too 84 | }); 85 | ``` 86 | 87 | Send Video 88 | 89 | ```ts 90 | const video = fs.readFileSync("./myvideo.mp4"); // return Buffer 91 | const send = await whatsapp.sendVideo({ 92 | sessionId: "session1", 93 | to: "6281234567890", 94 | text: "My Video Caption", 95 | media: video, // can from URL too 96 | }); 97 | ``` 98 | 99 | Send Document File 100 | 101 | ```ts 102 | const filename = "mydocument.docx"; 103 | const document = fs.readFileSync(filename); // return Buffer 104 | const send = await whatsapp.sendDocument({ 105 | sessionId: "session1", 106 | to: "6281234567890", 107 | filename: filename, 108 | media: document, 109 | text: "Hei, Check this Document", 110 | }); 111 | ``` 112 | 113 | Send Voice Note 114 | 115 | ```ts 116 | const filename = "myaudio.mp3"; 117 | const audio = fs.readFileSync(filename); // return Buffer 118 | const send = await whatsapp.sendVoiceNote({ 119 | sessionId: "session1", 120 | to: "6281234567890", 121 | media: audio, 122 | }); 123 | ``` 124 | 125 | Read a Message 126 | 127 | ```ts 128 | await whatsapp.readMessage({ 129 | sessionId: "session1", 130 | key: msg.key, 131 | }); 132 | ``` 133 | 134 | Send Typing Effect 135 | 136 | ```ts 137 | await whatsapp.sendTyping({ 138 | sessionId: "session1", 139 | to: "6281234567890", 140 | duration: 3000, 141 | }); 142 | ``` 143 | 144 | ## Listener Usage/Examples 145 | 146 | Add Listener/Callback When Receive a Message 147 | 148 | ```ts 149 | whatsapp.onMessageReceived((msg) => { 150 | console.log(`New Message Received On Session: ${msg.sessionId} >>>`, msg); 151 | }); 152 | ``` 153 | 154 | Add Listener/Callback When QR Printed 155 | 156 | ```ts 157 | whatsapp.onQRUpdated(({ sessionId, qr }) => { 158 | console.log(qr); 159 | }); 160 | ``` 161 | 162 | Add Listener/Callback When Session Connected 163 | 164 | ```ts 165 | whatsapp.onConnected((sessionId) => { 166 | console.log("session connected :" + sessionId); 167 | }); 168 | ``` 169 | 170 | ## Handling Incoming Message Examples 171 | 172 | ```ts 173 | whatsapp.onMessageReceived(async (msg) => { 174 | if (msg.key.fromMe || msg.key.remoteJid.includes("status")) return; 175 | await whatsapp.readMessage({ 176 | sessionId: msg.sessionId, 177 | key: msg.key, 178 | }); 179 | await whatsapp.sendTyping({ 180 | sessionId: msg.sessionId, 181 | to: msg.key.remoteJid, 182 | duration: 3000, 183 | }); 184 | await whatsapp.sendTextMessage({ 185 | sessionId: msg.sessionId, 186 | to: msg.key.remoteJid, 187 | text: "Hello!", 188 | answering: msg, // for quoting message 189 | }); 190 | }); 191 | ``` 192 | 193 | ## Save Media Message (Image, Video, Document) 194 | 195 | ```ts 196 | wa.onMessageReceived(async (msg) => { 197 | if (msg.message?.imageMessage) { 198 | // save image 199 | msg.saveImage("./myimage.jpg"); 200 | } 201 | 202 | if (msg.message?.videoMessage) { 203 | // save video 204 | msg.saveVideo("./myvideo.mp4"); 205 | } 206 | 207 | if (msg.message?.documentMessage) { 208 | // save document 209 | msg.saveDocument("./mydocument"); // without extension 210 | } 211 | }); 212 | ``` 213 | 214 | ## Optional Configuration Usage/Examples 215 | 216 | Set custom credentials directory 217 | 218 | ```ts 219 | // default dir is "wa_credentials" 220 | whatsapp.setCredentialsDir("my_custom_dir"); 221 | // or : credentials/mycreds 222 | ``` 223 | 224 | ## Changelog 225 | 226 | ### v3.7.0 December 2024 (LATEST) 227 | 228 | - Upgrading @whiskeysockets/baileys to ^6.7.9 229 | - Fix invalid phone number 230 | - Remove validation is registered phone number 231 | 232 | ## Also Visit Headless Whatsapp Gateway API 233 | 234 | - [wa-gateway](https://www.github.com/mimamch/wa-gateway) 235 | 236 | ## Authors 237 | 238 | - [@mimamch](https://www.github.com/mimamch) 239 | 240 | ## Feedback or Support 241 | 242 | If you have any feedback or support, please reach out to me at mimamch28@gmail.com 243 | -------------------------------------------------------------------------------- /src/Defaults/index.ts: -------------------------------------------------------------------------------- 1 | export abstract class CREDENTIALS { 2 | static DIR_NAME: string = "wa_credentials"; 3 | static PREFIX: string = "_credentials"; 4 | } 5 | 6 | export enum CALLBACK_KEY { 7 | ON_MESSAGE_RECEIVED = "on-message-received", 8 | ON_QR = "on-qr", 9 | ON_CONNECTED = "on-connected", 10 | ON_DISCONNECTED = "on-disconnected", 11 | ON_CONNECTING = "on-connecting", 12 | ON_MESSAGE_UPDATED = "on-message-updated", 13 | ON_PAIRING_CODE = "on-pairing-code", 14 | } 15 | 16 | export abstract class Messages { 17 | static sessionAlreadyExist = (sessionId: string): string => 18 | `Session ID :${sessionId} is already exist, Try another Session ID.`; 19 | 20 | static sessionNotFound = (sessionId: string): string => 21 | `Session with ID: ${sessionId} Not Exist!`; 22 | 23 | static paremetersRequired = (props: string[] | string) => 24 | `Parameter ${ 25 | typeof props == "string" 26 | ? props 27 | : props instanceof Array 28 | ? props.join(", ") 29 | : "" 30 | } is required`; 31 | } 32 | -------------------------------------------------------------------------------- /src/Error/index.ts: -------------------------------------------------------------------------------- 1 | export class WhatsappError extends Error { 2 | constructor(message: string) { 3 | super(message); 4 | this.name = "WhatsappError"; 5 | Object.setPrototypeOf(this, WhatsappError.prototype); 6 | } 7 | 8 | static isWhatsappError(error: any): error is WhatsappError { 9 | return error instanceof WhatsappError || error instanceof Error; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Messaging/index.ts: -------------------------------------------------------------------------------- 1 | import { proto } from "@whiskeysockets/baileys"; 2 | import { Messages } from "../Defaults"; 3 | import { getSession } from "../Socket"; 4 | import { 5 | SendMediaTypes, 6 | SendMessageTypes, 7 | SendReadTypes, 8 | SendTypingTypes, 9 | } from "../Types"; 10 | import { phoneToJid } from "../Utils"; 11 | import { createDelay } from "../Utils/create-delay"; 12 | import { isExist } from "../Utils/is-exist"; 13 | import mime from "mime"; 14 | import { WhatsappError } from "../Error"; 15 | 16 | export const sendTextMessage = async ({ 17 | sessionId, 18 | to, 19 | text = "", 20 | isGroup = false, 21 | ...props 22 | }: SendMessageTypes): Promise => { 23 | const session = getSession(sessionId); 24 | if (!session) throw new WhatsappError(Messages.sessionNotFound(sessionId)); 25 | to = phoneToJid({ to, isGroup }); 26 | 27 | return await session.sendMessage( 28 | to, 29 | { 30 | text: text, 31 | }, 32 | { 33 | quoted: props.answering, 34 | } 35 | ); 36 | }; 37 | export const sendImage = async ({ 38 | sessionId, 39 | to, 40 | text = "", 41 | isGroup = false, 42 | media, 43 | ...props 44 | }: SendMediaTypes): Promise => { 45 | const session = getSession(sessionId); 46 | if (!session) throw new WhatsappError(Messages.sessionNotFound(sessionId)); 47 | to = phoneToJid({ to, isGroup }); 48 | 49 | if (!media) 50 | throw new WhatsappError("parameter media must be Buffer or String URL"); 51 | return await session.sendMessage( 52 | to, 53 | { 54 | image: 55 | typeof media == "string" 56 | ? { 57 | url: media, 58 | } 59 | : media, 60 | caption: text, 61 | }, 62 | { 63 | quoted: props.answering, 64 | } 65 | ); 66 | }; 67 | export const sendVideo = async ({ 68 | sessionId, 69 | to, 70 | text = "", 71 | isGroup = false, 72 | media, 73 | ...props 74 | }: SendMediaTypes): Promise => { 75 | const session = getSession(sessionId); 76 | if (!session) throw new WhatsappError(Messages.sessionNotFound(sessionId)); 77 | to = phoneToJid({ to, isGroup }); 78 | 79 | if (!media) 80 | throw new WhatsappError("parameter media must be Buffer or String URL"); 81 | return await session.sendMessage( 82 | to, 83 | { 84 | video: 85 | typeof media == "string" 86 | ? { 87 | url: media, 88 | } 89 | : media, 90 | caption: text, 91 | }, 92 | { 93 | quoted: props.answering, 94 | } 95 | ); 96 | }; 97 | export const sendDocument = async ({ 98 | sessionId, 99 | to, 100 | text = "", 101 | isGroup = false, 102 | media, 103 | filename, 104 | ...props 105 | }: SendMediaTypes & { 106 | filename: string; 107 | }): Promise => { 108 | const session = getSession(sessionId); 109 | if (!session) throw new WhatsappError(Messages.sessionNotFound(sessionId)); 110 | to = phoneToJid({ to, isGroup }); 111 | 112 | if (!media) { 113 | throw new WhatsappError(`Invalid Media`); 114 | } 115 | 116 | const mimetype = mime.getType(filename); 117 | if (!mimetype) { 118 | throw new WhatsappError(`Filename must include valid extension`); 119 | } 120 | 121 | return await session.sendMessage( 122 | to, 123 | { 124 | fileName: filename, 125 | document: 126 | typeof media == "string" 127 | ? { 128 | url: media, 129 | } 130 | : media, 131 | mimetype: mimetype, 132 | caption: text, 133 | }, 134 | { 135 | quoted: props.answering, 136 | } 137 | ); 138 | }; 139 | 140 | export const sendVoiceNote = async ({ 141 | sessionId, 142 | to, 143 | isGroup = false, 144 | media, 145 | ...props 146 | }: Omit): Promise => { 147 | const session = getSession(sessionId); 148 | if (!session) throw new WhatsappError(Messages.sessionNotFound(sessionId)); 149 | to = phoneToJid({ to, isGroup }); 150 | 151 | if (!media) { 152 | throw new WhatsappError(`Invalid Media`); 153 | } 154 | 155 | return await session.sendMessage( 156 | to, 157 | { 158 | audio: 159 | typeof media == "string" 160 | ? { 161 | url: media, 162 | } 163 | : media, 164 | ptt: true, 165 | }, 166 | { 167 | quoted: props.answering, 168 | } 169 | ); 170 | }; 171 | 172 | export const sendSticker = async ({ 173 | sessionId, 174 | to, 175 | isGroup, 176 | media, 177 | ...props 178 | }: SendMediaTypes): Promise => { 179 | const session = getSession(sessionId); 180 | if (!session) throw new WhatsappError(Messages.sessionNotFound(sessionId)); 181 | to = phoneToJid({ to, isGroup }); 182 | 183 | if (!media) { 184 | throw new WhatsappError(`Invalid Media`); 185 | } 186 | 187 | return await session.sendMessage( 188 | to, 189 | { 190 | sticker: 191 | typeof media == "string" 192 | ? { 193 | url: media, 194 | } 195 | : media, 196 | }, 197 | { 198 | quoted: props.answering, 199 | } 200 | ); 201 | }; 202 | 203 | /** 204 | * Give typing effect to target 205 | * 206 | * Looks like human typing 207 | * 208 | * 209 | * @param sessionId - Session ID 210 | * @param to - Target 211 | * @param duration - Duration in miliseconds typing effect will appear 212 | */ 213 | export const sendTyping = async ({ 214 | sessionId, 215 | to, 216 | duration = 1000, 217 | isGroup = false, 218 | }: SendTypingTypes) => { 219 | const oldPhone = to; 220 | to = phoneToJid({ to, isGroup }); 221 | const session = getSession(sessionId); 222 | if (!session) throw new WhatsappError(Messages.sessionNotFound(sessionId)); 223 | 224 | await session.sendPresenceUpdate("composing", to); 225 | await createDelay(duration); 226 | await session.sendPresenceUpdate("available", to); 227 | }; 228 | 229 | /** 230 | * Give typing effect to target 231 | * 232 | * Looks like human typing 233 | * 234 | * 235 | * @param sessionId - Session ID 236 | * @param to - Target 237 | * @param duration - Duration in miliseconds typing effect will appear 238 | */ 239 | export const readMessage = async ({ sessionId, key }: SendReadTypes) => { 240 | const session = getSession(sessionId); 241 | if (!session) throw new WhatsappError(Messages.sessionNotFound(sessionId)); 242 | 243 | await session.readMessages([key]); 244 | }; 245 | -------------------------------------------------------------------------------- /src/Profile/index.ts: -------------------------------------------------------------------------------- 1 | import { Messages } from "../Defaults"; 2 | import { WhatsappError } from "../Error"; 3 | import { getSession } from "../Socket"; 4 | import { GetProfileInfoProps } from "../Types/profile"; 5 | 6 | /** 7 | * Get profile information of a target (people or group) 8 | */ 9 | export const getProfileInfo = async (props: GetProfileInfoProps) => { 10 | const session = getSession(props.sessionId); 11 | if (!session) 12 | throw new WhatsappError(Messages.sessionNotFound(props.sessionId)); 13 | 14 | const [profilePictureUrl, status] = await Promise.allSettled([ 15 | session.profilePictureUrl(props.target, "image", 5000), 16 | session.fetchStatus(props.target), 17 | ]); 18 | return { 19 | profilePictureUrl: 20 | profilePictureUrl.status === "fulfilled" 21 | ? profilePictureUrl.value || null 22 | : null, 23 | status: status.status === "fulfilled" ? status.value || null : null, 24 | }; 25 | }; 26 | -------------------------------------------------------------------------------- /src/Socket/index.ts: -------------------------------------------------------------------------------- 1 | import makeWASocket, { 2 | Browsers, 3 | DisconnectReason, 4 | fetchLatestBaileysVersion, 5 | useMultiFileAuthState, 6 | WASocket, 7 | } from "@whiskeysockets/baileys"; 8 | import path from "path"; 9 | import { Boom } from "@hapi/boom"; 10 | import fs from "fs"; 11 | import type { 12 | MessageReceived, 13 | MessageUpdated, 14 | StartSessionParams, 15 | StartSessionWithPairingCodeParams, 16 | } from "../Types"; 17 | import { CALLBACK_KEY, CREDENTIALS, Messages } from "../Defaults"; 18 | import { 19 | saveAudioHandler, 20 | saveDocumentHandler, 21 | saveImageHandler, 22 | saveVideoHandler, 23 | } from "../Utils/save-media"; 24 | import { WhatsappError } from "../Error"; 25 | import { parseMessageStatusCodeToReadable } from "../Utils/message-status"; 26 | 27 | const sessions: Map = new Map(); 28 | 29 | const callback: Map = new Map(); 30 | 31 | const retryCount: Map = new Map(); 32 | 33 | const P = require("pino")({ 34 | level: "silent", 35 | }); 36 | 37 | export const startSession = async ( 38 | sessionId = "mysession", 39 | options: StartSessionParams = { printQR: true } 40 | ): Promise => { 41 | if (isSessionExistAndRunning(sessionId)) 42 | throw new WhatsappError(Messages.sessionAlreadyExist(sessionId)); 43 | 44 | const { version } = await fetchLatestBaileysVersion(); 45 | const startSocket = async () => { 46 | const { state, saveCreds } = await useMultiFileAuthState( 47 | path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX) 48 | ); 49 | const sock: WASocket = makeWASocket({ 50 | version, 51 | printQRInTerminal: options.printQR, 52 | auth: state, 53 | logger: P, 54 | markOnlineOnConnect: false, 55 | browser: Browsers.ubuntu("Chrome"), 56 | }); 57 | sessions.set(sessionId, { ...sock }); 58 | try { 59 | sock.ev.process(async (events) => { 60 | if (events["connection.update"]) { 61 | const update = events["connection.update"]; 62 | const { connection, lastDisconnect } = update; 63 | if (update.qr) { 64 | callback.get(CALLBACK_KEY.ON_QR)?.({ 65 | sessionId, 66 | qr: update.qr, 67 | }); 68 | options.onQRUpdated?.(update.qr); 69 | } 70 | if (connection == "connecting") { 71 | callback.get(CALLBACK_KEY.ON_CONNECTING)?.(sessionId); 72 | options.onConnecting?.(); 73 | } 74 | if (connection === "close") { 75 | const code = (lastDisconnect?.error as Boom)?.output?.statusCode; 76 | let retryAttempt = retryCount.get(sessionId) ?? 0; 77 | let shouldRetry; 78 | if (code != DisconnectReason.loggedOut && retryAttempt < 10) { 79 | shouldRetry = true; 80 | } 81 | if (shouldRetry) { 82 | retryAttempt++; 83 | retryCount.set(sessionId, retryAttempt); 84 | startSocket(); 85 | } else { 86 | retryCount.delete(sessionId); 87 | deleteSession(sessionId); 88 | callback.get(CALLBACK_KEY.ON_DISCONNECTED)?.(sessionId); 89 | options.onDisconnected?.(); 90 | } 91 | } 92 | if (connection == "open") { 93 | retryCount.delete(sessionId); 94 | callback.get(CALLBACK_KEY.ON_CONNECTED)?.(sessionId); 95 | options.onConnected?.(); 96 | } 97 | } 98 | if (events["creds.update"]) { 99 | await saveCreds(); 100 | } 101 | if (events["messages.update"]) { 102 | const msg = events["messages.update"][0]; 103 | const data: MessageUpdated = { 104 | sessionId: sessionId, 105 | messageStatus: parseMessageStatusCodeToReadable(msg.update.status!), 106 | ...msg, 107 | }; 108 | callback.get(CALLBACK_KEY.ON_MESSAGE_UPDATED)?.(sessionId, data); 109 | options.onMessageUpdated?.(data); 110 | } 111 | if (events["messages.upsert"]) { 112 | const msg = events["messages.upsert"] 113 | .messages?.[0] as unknown as MessageReceived; 114 | msg.sessionId = sessionId; 115 | msg.saveImage = (path) => saveImageHandler(msg, path); 116 | msg.saveVideo = (path) => saveVideoHandler(msg, path); 117 | msg.saveDocument = (path) => saveDocumentHandler(msg, path); 118 | msg.saveAudio = (path) => saveAudioHandler(msg, path); 119 | callback.get(CALLBACK_KEY.ON_MESSAGE_RECEIVED)?.({ 120 | ...msg, 121 | }); 122 | options.onMessageReceived?.(msg); 123 | } 124 | }); 125 | return sock; 126 | } catch (error) { 127 | // console.log("SOCKET ERROR", error); 128 | return sock; 129 | } 130 | }; 131 | return startSocket(); 132 | }; 133 | 134 | /** 135 | * 136 | * @deprecated Use startSession method instead 137 | */ 138 | export const startSessionWithPairingCode = async ( 139 | sessionId: string, 140 | options: StartSessionWithPairingCodeParams 141 | ): Promise => { 142 | if (isSessionExistAndRunning(sessionId)) 143 | throw new WhatsappError(Messages.sessionAlreadyExist(sessionId)); 144 | 145 | const { version } = await fetchLatestBaileysVersion(); 146 | const startSocket = async () => { 147 | const { state, saveCreds } = await useMultiFileAuthState( 148 | path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX) 149 | ); 150 | const sock: WASocket = makeWASocket({ 151 | version, 152 | printQRInTerminal: false, 153 | auth: state, 154 | logger: P, 155 | markOnlineOnConnect: false, 156 | browser: Browsers.ubuntu("Chrome"), 157 | }); 158 | sessions.set(sessionId, { ...sock }); 159 | try { 160 | if (!sock.authState.creds.registered) { 161 | console.log("first time pairing"); 162 | const code = await sock.requestPairingCode(options.phoneNumber); 163 | console.log(code); 164 | callback.get(CALLBACK_KEY.ON_PAIRING_CODE)?.(sessionId, code); 165 | } 166 | 167 | sock.ev.process(async (events) => { 168 | if (events["connection.update"]) { 169 | const update = events["connection.update"]; 170 | const { connection, lastDisconnect } = update; 171 | if (update.qr) { 172 | callback.get(CALLBACK_KEY.ON_QR)?.({ 173 | sessionId, 174 | qr: update.qr, 175 | }); 176 | } 177 | if (connection == "connecting") { 178 | callback.get(CALLBACK_KEY.ON_CONNECTING)?.(sessionId); 179 | } 180 | if (connection === "close") { 181 | const code = (lastDisconnect?.error as Boom)?.output?.statusCode; 182 | let retryAttempt = retryCount.get(sessionId) ?? 0; 183 | let shouldRetry; 184 | if (code != DisconnectReason.loggedOut && retryAttempt < 10) { 185 | shouldRetry = true; 186 | } 187 | if (shouldRetry) { 188 | retryAttempt++; 189 | } 190 | if (shouldRetry) { 191 | retryCount.set(sessionId, retryAttempt); 192 | startSocket(); 193 | } else { 194 | retryCount.delete(sessionId); 195 | deleteSession(sessionId); 196 | callback.get(CALLBACK_KEY.ON_DISCONNECTED)?.(sessionId); 197 | } 198 | } 199 | if (connection == "open") { 200 | retryCount.delete(sessionId); 201 | callback.get(CALLBACK_KEY.ON_CONNECTED)?.(sessionId); 202 | } 203 | } 204 | if (events["creds.update"]) { 205 | await saveCreds(); 206 | } 207 | if (events["messages.update"]) { 208 | const msg = events["messages.update"][0]; 209 | const data: MessageUpdated = { 210 | sessionId: sessionId, 211 | messageStatus: parseMessageStatusCodeToReadable(msg.update.status!), 212 | ...msg, 213 | }; 214 | callback.get(CALLBACK_KEY.ON_MESSAGE_UPDATED)?.(sessionId, data); 215 | } 216 | if (events["messages.upsert"]) { 217 | const msg = events["messages.upsert"] 218 | .messages?.[0] as unknown as MessageReceived; 219 | msg.sessionId = sessionId; 220 | msg.saveImage = (path) => saveImageHandler(msg, path); 221 | msg.saveVideo = (path) => saveVideoHandler(msg, path); 222 | msg.saveDocument = (path) => saveDocumentHandler(msg, path); 223 | msg.saveAudio = (path) => saveAudioHandler(msg, path); 224 | callback.get(CALLBACK_KEY.ON_MESSAGE_RECEIVED)?.({ 225 | ...msg, 226 | }); 227 | } 228 | }); 229 | return sock; 230 | } catch (error) { 231 | // console.log("SOCKET ERROR", error); 232 | return sock; 233 | } 234 | }; 235 | return startSocket(); 236 | }; 237 | 238 | /** 239 | * @deprecated Use startSession method instead 240 | */ 241 | export const startWhatsapp = startSession; 242 | 243 | export const deleteSession = async (sessionId: string) => { 244 | const session = getSession(sessionId); 245 | try { 246 | await session?.logout(); 247 | } catch (error) {} 248 | session?.end(undefined); 249 | sessions.delete(sessionId); 250 | const dir = path.resolve( 251 | CREDENTIALS.DIR_NAME, 252 | sessionId + CREDENTIALS.PREFIX 253 | ); 254 | if (fs.existsSync(dir)) { 255 | fs.rmSync(dir, { force: true, recursive: true }); 256 | } 257 | }; 258 | export const getAllSession = (): string[] => Array.from(sessions.keys()); 259 | 260 | export const getSession = (key: string): WASocket | undefined => 261 | sessions.get(key) as WASocket; 262 | 263 | const isSessionExistAndRunning = (sessionId: string): boolean => { 264 | if ( 265 | fs.existsSync(path.resolve(CREDENTIALS.DIR_NAME)) && 266 | fs.existsSync( 267 | path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX) 268 | ) && 269 | fs.readdirSync( 270 | path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX) 271 | ).length && 272 | getSession(sessionId) 273 | ) { 274 | return true; 275 | } 276 | return false; 277 | }; 278 | const shouldLoadSession = (sessionId: string): boolean => { 279 | if ( 280 | fs.existsSync(path.resolve(CREDENTIALS.DIR_NAME)) && 281 | fs.existsSync( 282 | path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX) 283 | ) && 284 | fs.readdirSync( 285 | path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX) 286 | ).length && 287 | !getSession(sessionId) 288 | ) { 289 | return true; 290 | } 291 | return false; 292 | }; 293 | 294 | export const loadSessionsFromStorage = () => { 295 | if (!fs.existsSync(path.resolve(CREDENTIALS.DIR_NAME))) { 296 | fs.mkdirSync(path.resolve(CREDENTIALS.DIR_NAME)); 297 | } 298 | fs.readdir(path.resolve(CREDENTIALS.DIR_NAME), async (err, dirs) => { 299 | if (err) { 300 | throw err; 301 | } 302 | for (const dir of dirs) { 303 | const sessionId = dir.split("_")[0]; 304 | if (!shouldLoadSession(sessionId)) continue; 305 | startSession(sessionId); 306 | } 307 | }); 308 | }; 309 | 310 | export const onMessageReceived = (listener: (msg: MessageReceived) => any) => { 311 | callback.set(CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener); 312 | }; 313 | export const onQRUpdated = ( 314 | listener: ({ sessionId, qr }: { sessionId: string; qr: string }) => any 315 | ) => { 316 | callback.set(CALLBACK_KEY.ON_QR, listener); 317 | }; 318 | export const onConnected = (listener: (sessionId: string) => any) => { 319 | callback.set(CALLBACK_KEY.ON_CONNECTED, listener); 320 | }; 321 | export const onDisconnected = (listener: (sessionId: string) => any) => { 322 | callback.set(CALLBACK_KEY.ON_DISCONNECTED, listener); 323 | }; 324 | export const onConnecting = (listener: (sessionId: string) => any) => { 325 | callback.set(CALLBACK_KEY.ON_CONNECTING, listener); 326 | }; 327 | 328 | export const onMessageUpdate = (listener: (data: MessageUpdated) => any) => { 329 | callback.set(CALLBACK_KEY.ON_MESSAGE_UPDATED, listener); 330 | }; 331 | 332 | export const onPairingCode = ( 333 | listener: (sessionId: string, code: string) => any 334 | ) => { 335 | callback.set(CALLBACK_KEY.ON_MESSAGE_UPDATED, listener); 336 | }; 337 | -------------------------------------------------------------------------------- /src/Types/index.ts: -------------------------------------------------------------------------------- 1 | import { WAMessageUpdate, proto } from "@whiskeysockets/baileys"; 2 | 3 | export interface SendMessageTypes { 4 | to: string | number; 5 | text?: string; 6 | sessionId: string; 7 | isGroup?: boolean; 8 | answering?: proto.IWebMessageInfo; 9 | } 10 | 11 | export interface SendMediaTypes extends SendMessageTypes { 12 | media?: string | Buffer; 13 | } 14 | export interface SendTypingTypes extends SendMessageTypes { 15 | duration: number; 16 | } 17 | export interface SendReadTypes { 18 | sessionId: string; 19 | key: proto.IMessageKey; 20 | } 21 | 22 | export interface MessageReceived extends proto.IWebMessageInfo { 23 | /** 24 | * Your Session ID 25 | */ 26 | sessionId: string; 27 | 28 | /** 29 | * @param path save image location path with extension 30 | * @example "./myimage.jpg" 31 | */ 32 | saveImage: (path: string) => Promise; 33 | /** 34 | * @param path save video location path with extension 35 | * @example "./myvideo.mp4" 36 | */ 37 | saveVideo: (path: string) => Promise; 38 | /** 39 | * @param path save audio location path with extension 40 | * @example "./myaudio.mp3" 41 | */ 42 | saveAudio: (path: string) => Promise; 43 | /** 44 | * @param path save image location path without extension 45 | * @example "./mydocument" 46 | */ 47 | saveDocument: (path: string) => Promise; 48 | } 49 | 50 | export interface StartSessionParams { 51 | /** 52 | * Print QR Code into Terminal 53 | */ 54 | printQR?: boolean; 55 | 56 | // session events 57 | onQRUpdated?: (qr: string) => void; 58 | onConnected?: () => void; 59 | onConnecting?: () => void; 60 | onDisconnected?: () => void; 61 | 62 | // message events 63 | onMessageReceived?: (message: MessageReceived) => void; 64 | onMessageUpdated?: (message: MessageUpdated) => void; 65 | } 66 | 67 | export interface StartSessionWithPairingCodeParams { 68 | /** 69 | * Phone Number with Country Code 70 | */ 71 | phoneNumber: string; 72 | } 73 | 74 | export type MessageUpdated = WAMessageUpdate & { 75 | sessionId: string; 76 | messageStatus: 77 | | "error" 78 | | "pending" 79 | | "server" 80 | | "delivered" 81 | | "read" 82 | | "played"; 83 | }; 84 | -------------------------------------------------------------------------------- /src/Types/profile.ts: -------------------------------------------------------------------------------- 1 | export type GetProfileInfoProps = { 2 | sessionId: string; 3 | target: string; 4 | }; 5 | -------------------------------------------------------------------------------- /src/Utils/create-delay.ts: -------------------------------------------------------------------------------- 1 | export const createDelay = async (duration: number = 1000) => { 2 | return await new Promise((resolve) => 3 | setTimeout(() => { 4 | resolve(true); 5 | }, duration) 6 | ); 7 | }; 8 | -------------------------------------------------------------------------------- /src/Utils/error.ts: -------------------------------------------------------------------------------- 1 | export default class ValidationError extends Error { 2 | constructor(message: string) { 3 | super(message); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/Utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./phone-to-jid"; 2 | export * from "./is-exist"; 3 | export * from "./create-delay"; 4 | export * from "./set-credentials-dir"; 5 | -------------------------------------------------------------------------------- /src/Utils/is-exist.ts: -------------------------------------------------------------------------------- 1 | import { WhatsappError } from "../Error"; 2 | import { getSession } from "../Socket"; 3 | import { SendMessageTypes } from "../Types"; 4 | import { phoneToJid } from "./phone-to-jid"; 5 | 6 | export const isExist = async ({ 7 | sessionId, 8 | to, 9 | isGroup = false, 10 | }: SendMessageTypes): Promise => { 11 | try { 12 | const session = getSession(sessionId); 13 | if (!session) throw new WhatsappError("Session ID Not Found!"); 14 | const receiver = phoneToJid({ 15 | to: to, 16 | isGroup: isGroup, 17 | }); 18 | if (!isGroup) { 19 | const one = Boolean((await session?.onWhatsApp(receiver))?.[0]?.exists); 20 | return one; 21 | } else { 22 | return Boolean((await session.groupMetadata(receiver)).id); 23 | } 24 | } catch (error) { 25 | throw error; 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /src/Utils/message-status.ts: -------------------------------------------------------------------------------- 1 | import { proto } from "@whiskeysockets/baileys"; 2 | import { MessageUpdated } from "../Types"; 3 | 4 | export const parseMessageStatusCodeToReadable = ( 5 | code: proto.WebMessageInfo.Status 6 | ): MessageUpdated["messageStatus"] => { 7 | if (code == proto.WebMessageInfo.Status.PENDING) return "pending"; 8 | if (code == proto.WebMessageInfo.Status.SERVER_ACK) return "server"; 9 | if (code == proto.WebMessageInfo.Status.DELIVERY_ACK) return "delivered"; 10 | if (code == proto.WebMessageInfo.Status.READ) return "read"; 11 | if (code == proto.WebMessageInfo.Status.PLAYED) return "played"; 12 | 13 | return "error"; 14 | }; 15 | -------------------------------------------------------------------------------- /src/Utils/phone-to-jid.ts: -------------------------------------------------------------------------------- 1 | import { WhatsappError } from "../Error"; 2 | import PHONENUMBER_MCC from "@whiskeysockets/baileys"; 3 | 4 | const isPhoneNumberValidCountry = (phone: string) => { 5 | return Object.keys(PHONENUMBER_MCC).some((key) => { 6 | return phone.startsWith(key); 7 | }); 8 | }; 9 | 10 | export const phoneToJid = ({ 11 | to, 12 | isGroup = false, 13 | }: { 14 | to: string | number; 15 | isGroup?: boolean; 16 | }): string => { 17 | if (!to) throw new WhatsappError('parameter "to" is required'); 18 | let number = to.toString(); 19 | if (isGroup) { 20 | number = number.replace(/\s|[+]|[-]/gim, ""); 21 | if (!number.includes("@g.us")) number = number + "@g.us"; 22 | } else { 23 | number = number.replace(/\s|[+]|[-]/gim, ""); 24 | if (!number.includes("@s.whatsapp.net")) 25 | number = number + "@s.whatsapp.net"; 26 | } 27 | 28 | return number; 29 | }; 30 | -------------------------------------------------------------------------------- /src/Utils/save-media.ts: -------------------------------------------------------------------------------- 1 | import { downloadMediaMessage } from "@whiskeysockets/baileys"; 2 | import { MessageReceived } from "../Types"; 3 | import ValidationError from "./error"; 4 | import fs from "fs/promises"; 5 | 6 | const saveMedia = async (path: string, data: Buffer) => { 7 | await fs.writeFile(path, data.toString("base64"), "base64"); 8 | }; 9 | 10 | export const saveImageHandler = async (msg: MessageReceived, path: string) => { 11 | if (!msg.message?.imageMessage) 12 | throw new ValidationError("Message is not contain Image"); 13 | 14 | const buf = await downloadMediaMessage(msg, "buffer", {}); 15 | 16 | return saveMedia(path, buf as Buffer); 17 | }; 18 | export const saveVideoHandler = async (msg: MessageReceived, path: string) => { 19 | if (!msg.message?.videoMessage) 20 | throw new ValidationError("Message is not contain Video"); 21 | 22 | const buf = await downloadMediaMessage(msg, "buffer", {}); 23 | 24 | return saveMedia(path, buf as Buffer); 25 | }; 26 | 27 | export const saveDocumentHandler = async ( 28 | msg: MessageReceived, 29 | path: string 30 | ) => { 31 | if (!msg.message?.documentMessage) 32 | throw new ValidationError("Message is not contain Document"); 33 | 34 | const buf = await downloadMediaMessage(msg, "buffer", {}); 35 | 36 | const ext = msg.message.documentMessage.fileName?.split(".").pop(); 37 | path += "." + ext; 38 | return saveMedia(path, buf as Buffer); 39 | }; 40 | 41 | export const saveAudioHandler = async (msg: MessageReceived, path: string) => { 42 | if (!msg.message?.audioMessage) 43 | throw new ValidationError("Message is not contain Audio"); 44 | 45 | const buf = await downloadMediaMessage(msg, "buffer", {}); 46 | 47 | return saveMedia(path, buf as Buffer); 48 | }; 49 | -------------------------------------------------------------------------------- /src/Utils/set-credentials-dir.ts: -------------------------------------------------------------------------------- 1 | import { CREDENTIALS } from "../Defaults"; 2 | 3 | export const setCredentialsDir = (dirname: string = "wa_credentials") => { 4 | CREDENTIALS.DIR_NAME = dirname; 5 | }; 6 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./Socket"; 2 | export * from "./Messaging"; 3 | export * from "./Utils"; 4 | export * from "./Types"; 5 | export * from "./Profile"; 6 | export * from "./Error"; 7 | 8 | export * as baileys from "@whiskeysockets/baileys"; 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "exclude": ["./test/*", "dist/*"], 3 | "compilerOptions": { 4 | /* Visit https://aka.ms/tsconfig to read more about this file */ 5 | 6 | /* Projects */ 7 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 8 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 9 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 10 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 11 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 12 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 13 | 14 | /* Language and Environment */ 15 | "target": "ES6" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, 16 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 17 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 18 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 19 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 20 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 21 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 22 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 23 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 24 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 25 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 26 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 27 | 28 | /* Modules */ 29 | "module": "CommonJS" /* Specify what module code is generated. */, 30 | "rootDir": "./src" /* Specify the root folder within your source files. */, 31 | // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ 32 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 33 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 34 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 35 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 36 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 37 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 38 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 39 | // "resolveJsonModule": true, /* Enable importing .json files. */ 40 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 41 | 42 | /* JavaScript Support */ 43 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 44 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 45 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 46 | 47 | /* Emit */ 48 | "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, 49 | "declarationMap": true /* Create sourcemaps for d.ts files. */, 50 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 51 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 52 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 53 | "outDir": "./dist" /* Specify an output folder for all emitted files. */, 54 | // "removeComments": true, /* Disable emitting comments. */ 55 | // "noEmit": true, /* Disable emitting files from a compilation. */ 56 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 57 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 58 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 59 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 60 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 61 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 62 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 63 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 64 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 65 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 66 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 67 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 68 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 69 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 70 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 71 | 72 | /* Interop Constraints */ 73 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 74 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 75 | "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, 76 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 77 | "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, 78 | 79 | /* Type Checking */ 80 | "strict": true /* Enable all strict type-checking options. */, 81 | "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */, 82 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 83 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 84 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 85 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 86 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 87 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 88 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 89 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 90 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 91 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 92 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 93 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 94 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 95 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 96 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 97 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 98 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 99 | 100 | /* Completeness */ 101 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 102 | "skipLibCheck": true, /* Skip type checking all .d.ts files. */ 103 | "strictNullChecks": false 104 | } 105 | } 106 | --------------------------------------------------------------------------------