├── .gitattributes ├── .github └── workflows │ └── DeployToCloudflare.yml ├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── src ├── anilist.js ├── errorHandler.js ├── gogo.js ├── gogo_extractor.js ├── index.js └── statsHandler.js └── wrangler.toml /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/DeployToCloudflare.yml: -------------------------------------------------------------------------------- 1 | name: Deploy To Cloudflare 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | repository_dispatch: 8 | workflow_dispatch: 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: Navigate to repo 16 | run: cd $GITHUB_WORKSPACE 17 | - name: Install Dependencies 18 | run: npm install 19 | - name: Install cheerio 20 | run: npm install --save npm install cheerio 21 | - name: Install crypto-js 22 | run: npm install --save npm install crypto-js 23 | - name: Build & Deploy Worker 24 | uses: cloudflare/wrangler-action@v3 25 | with: 26 | apiToken: ${{ secrets.CF_API_TOKEN }} 27 | accountId: ${{ secrets.CF_ACCOUNT_ID }} 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /.wrangler 3 | /node_modules 4 | *.py 5 | wrangler_save.txt 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## ⚠️ **Note: This Project Is Stopped** 2 | 3 | The **AnimeDexLite Project** has been discontinued. I have made this decision to avoid potential copyright claims in the future. As a result, all public domains and APIs hosted by me are now inactive. 4 | 5 | The code for the website and API will remain accessible for anyone who wishes to experiment with it or make modifications. However, please be aware that there will be no further updates or releases from my side. 6 | 7 | Thank you for your understanding and support during the project's active phase! 🙌🌟 8 | 9 | ### Project Links : 10 | 11 |
Telegram Support Group : @TechZBots_Support 12 |
AnimeDexLite Repository : TechShreyash/AnimeDexLite 13 |
AnimeDex Api Repository : TechShreyash/AnimeDexApi 14 |
AnimeDex Proxy Repository : TechShreyash/animedexproxy 15 |
ThumbGen Api Repository : TechShreyash/ThumbApi 16 |
Stats Api Repository : TechShreyash/StatsApi 17 | 18 | ## AnimeDexApi 19 | 20 | - Anime api for some of my projects 21 | - Gogoanime scrapper 22 | - Anilist scrapper 23 | 24 | Documentation : https://api.anime-dex.workers.dev 25 | 26 | ## Deploy To Cloudflare (Easy Way) 27 | 28 | [](https://deploy.workers.cloudflare.com/?url=https://github.com/TechShreyash/AnimeDexApi) 29 | 30 | ### Deploy Tutorial 31 | 32 | https://github.com/TechShreyash/AnimeDexApi/assets/82265247/da97a941-4f46-42ec-beaf-3c7e1f31f0aa 33 | 34 | ## Deploy To Cloudflare (Hard Way) 35 | 36 | - Install Wrangler CLI : https://developers.cloudflare.com/workers/wrangler/install-and-update/ 37 | 38 | - Install Nodejs And Npm 39 | 40 | - Run Below Commands 41 | 42 | ```bash 43 | npm install --save npm install cheerio 44 | npm install --save npm install crypto-js 45 | ``` 46 | 47 | - Login To Your Account 48 | 49 | ```bash 50 | wrangler login 51 | ``` 52 | 53 | - Deploy To Workers 54 | 55 | ```bash 56 | wrangler deploy 57 | ``` 58 | 59 | ## Updating Api 60 | 61 | - Api will get updated automatically on every commit 62 | - To use latest version of animedexapi, create a fork and update it after it has been updated on main repo 63 | 64 | > How To Sync A Fork : https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork 65 | 66 | - Updates about api will be realeased at our [Telegram Channel](https://telegram.me/TechZBots) 67 | 68 | ## 🔔 Join For Latest Updates 69 | 70 | Stay informed about the latest updates by joining our channels / groups : 71 | 72 | [](https://telegram.me/TechZBots) [](https://telegram.me/TechZBots_Support) 73 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "anime-dex-api", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "anime-dex-api", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "cheerio": "^1.0.0-rc.12", 12 | "crypto-js": "^4.2.0" 13 | }, 14 | "devDependencies": { 15 | "wrangler": "^3.30.1" 16 | } 17 | }, 18 | "node_modules/@cloudflare/kv-asset-handler": { 19 | "version": "0.3.1", 20 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.1.tgz", 21 | "integrity": "sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==", 22 | "dev": true, 23 | "dependencies": { 24 | "mime": "^3.0.0" 25 | } 26 | }, 27 | "node_modules/@cloudflare/workerd-darwin-64": { 28 | "version": "1.20240304.0", 29 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240304.0.tgz", 30 | "integrity": "sha512-rfHlvsWzkqEEQNvm14AOE/BYHYzB9wxQHCaZZEgwOuTl5KpDcs9La0N0LaDTR78ESumIWOcifVmko2VTrZb7TQ==", 31 | "cpu": [ 32 | "x64" 33 | ], 34 | "dev": true, 35 | "optional": true, 36 | "os": [ 37 | "darwin" 38 | ], 39 | "engines": { 40 | "node": ">=16" 41 | } 42 | }, 43 | "node_modules/@cloudflare/workerd-darwin-arm64": { 44 | "version": "1.20240304.0", 45 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240304.0.tgz", 46 | "integrity": "sha512-IXGOxHsPdRYfAzcY6IroI1PDvx3hhXf18qFCloHp8Iw5bzLgq/PTjcp10Z/2xedZ2hVlfpHy1eEptsTmi9YeNw==", 47 | "cpu": [ 48 | "arm64" 49 | ], 50 | "dev": true, 51 | "optional": true, 52 | "os": [ 53 | "darwin" 54 | ], 55 | "engines": { 56 | "node": ">=16" 57 | } 58 | }, 59 | "node_modules/@cloudflare/workerd-linux-64": { 60 | "version": "1.20240304.0", 61 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240304.0.tgz", 62 | "integrity": "sha512-G1BEzbw9TFIeMvc425F145IetC7fuH4KOkGhseLq9y/mt5PfDWkghwmXSK+q0BiMwm0XAobtzVlHcEr2u4WlRQ==", 63 | "cpu": [ 64 | "x64" 65 | ], 66 | "dev": true, 67 | "optional": true, 68 | "os": [ 69 | "linux" 70 | ], 71 | "engines": { 72 | "node": ">=16" 73 | } 74 | }, 75 | "node_modules/@cloudflare/workerd-linux-arm64": { 76 | "version": "1.20240304.0", 77 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240304.0.tgz", 78 | "integrity": "sha512-LLk/d/y77TRu6QOG3CJUI2cD3Ff2lSg0ts6G83bsm9ZK+WKObWFFSPBy9l81m3EnlKFh7RZCzxN4J10kuDaO8w==", 79 | "cpu": [ 80 | "arm64" 81 | ], 82 | "dev": true, 83 | "optional": true, 84 | "os": [ 85 | "linux" 86 | ], 87 | "engines": { 88 | "node": ">=16" 89 | } 90 | }, 91 | "node_modules/@cloudflare/workerd-windows-64": { 92 | "version": "1.20240304.0", 93 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240304.0.tgz", 94 | "integrity": "sha512-I/j6nVpM+WDPg+bYUAiKLkwQsjrXFjpOGHvwYmcM44hnDjgODzk7AbVssEIXnhEO3oupBeuKvffr0lvX0Ngmpw==", 95 | "cpu": [ 96 | "x64" 97 | ], 98 | "dev": true, 99 | "optional": true, 100 | "os": [ 101 | "win32" 102 | ], 103 | "engines": { 104 | "node": ">=16" 105 | } 106 | }, 107 | "node_modules/@cspotcode/source-map-support": { 108 | "version": "0.8.1", 109 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 110 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 111 | "dev": true, 112 | "dependencies": { 113 | "@jridgewell/trace-mapping": "0.3.9" 114 | }, 115 | "engines": { 116 | "node": ">=12" 117 | } 118 | }, 119 | "node_modules/@esbuild-plugins/node-globals-polyfill": { 120 | "version": "0.2.3", 121 | "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", 122 | "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", 123 | "dev": true, 124 | "peerDependencies": { 125 | "esbuild": "*" 126 | } 127 | }, 128 | "node_modules/@esbuild-plugins/node-modules-polyfill": { 129 | "version": "0.2.2", 130 | "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", 131 | "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", 132 | "dev": true, 133 | "dependencies": { 134 | "escape-string-regexp": "^4.0.0", 135 | "rollup-plugin-node-polyfills": "^0.2.1" 136 | }, 137 | "peerDependencies": { 138 | "esbuild": "*" 139 | } 140 | }, 141 | "node_modules/@esbuild/android-arm": { 142 | "version": "0.17.19", 143 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", 144 | "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", 145 | "cpu": [ 146 | "arm" 147 | ], 148 | "dev": true, 149 | "optional": true, 150 | "os": [ 151 | "android" 152 | ], 153 | "engines": { 154 | "node": ">=12" 155 | } 156 | }, 157 | "node_modules/@esbuild/android-arm64": { 158 | "version": "0.17.19", 159 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", 160 | "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", 161 | "cpu": [ 162 | "arm64" 163 | ], 164 | "dev": true, 165 | "optional": true, 166 | "os": [ 167 | "android" 168 | ], 169 | "engines": { 170 | "node": ">=12" 171 | } 172 | }, 173 | "node_modules/@esbuild/android-x64": { 174 | "version": "0.17.19", 175 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", 176 | "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", 177 | "cpu": [ 178 | "x64" 179 | ], 180 | "dev": true, 181 | "optional": true, 182 | "os": [ 183 | "android" 184 | ], 185 | "engines": { 186 | "node": ">=12" 187 | } 188 | }, 189 | "node_modules/@esbuild/darwin-arm64": { 190 | "version": "0.17.19", 191 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", 192 | "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", 193 | "cpu": [ 194 | "arm64" 195 | ], 196 | "dev": true, 197 | "optional": true, 198 | "os": [ 199 | "darwin" 200 | ], 201 | "engines": { 202 | "node": ">=12" 203 | } 204 | }, 205 | "node_modules/@esbuild/darwin-x64": { 206 | "version": "0.17.19", 207 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", 208 | "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", 209 | "cpu": [ 210 | "x64" 211 | ], 212 | "dev": true, 213 | "optional": true, 214 | "os": [ 215 | "darwin" 216 | ], 217 | "engines": { 218 | "node": ">=12" 219 | } 220 | }, 221 | "node_modules/@esbuild/freebsd-arm64": { 222 | "version": "0.17.19", 223 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", 224 | "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", 225 | "cpu": [ 226 | "arm64" 227 | ], 228 | "dev": true, 229 | "optional": true, 230 | "os": [ 231 | "freebsd" 232 | ], 233 | "engines": { 234 | "node": ">=12" 235 | } 236 | }, 237 | "node_modules/@esbuild/freebsd-x64": { 238 | "version": "0.17.19", 239 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", 240 | "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", 241 | "cpu": [ 242 | "x64" 243 | ], 244 | "dev": true, 245 | "optional": true, 246 | "os": [ 247 | "freebsd" 248 | ], 249 | "engines": { 250 | "node": ">=12" 251 | } 252 | }, 253 | "node_modules/@esbuild/linux-arm": { 254 | "version": "0.17.19", 255 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", 256 | "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", 257 | "cpu": [ 258 | "arm" 259 | ], 260 | "dev": true, 261 | "optional": true, 262 | "os": [ 263 | "linux" 264 | ], 265 | "engines": { 266 | "node": ">=12" 267 | } 268 | }, 269 | "node_modules/@esbuild/linux-arm64": { 270 | "version": "0.17.19", 271 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", 272 | "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", 273 | "cpu": [ 274 | "arm64" 275 | ], 276 | "dev": true, 277 | "optional": true, 278 | "os": [ 279 | "linux" 280 | ], 281 | "engines": { 282 | "node": ">=12" 283 | } 284 | }, 285 | "node_modules/@esbuild/linux-ia32": { 286 | "version": "0.17.19", 287 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", 288 | "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", 289 | "cpu": [ 290 | "ia32" 291 | ], 292 | "dev": true, 293 | "optional": true, 294 | "os": [ 295 | "linux" 296 | ], 297 | "engines": { 298 | "node": ">=12" 299 | } 300 | }, 301 | "node_modules/@esbuild/linux-loong64": { 302 | "version": "0.17.19", 303 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", 304 | "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", 305 | "cpu": [ 306 | "loong64" 307 | ], 308 | "dev": true, 309 | "optional": true, 310 | "os": [ 311 | "linux" 312 | ], 313 | "engines": { 314 | "node": ">=12" 315 | } 316 | }, 317 | "node_modules/@esbuild/linux-mips64el": { 318 | "version": "0.17.19", 319 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", 320 | "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", 321 | "cpu": [ 322 | "mips64el" 323 | ], 324 | "dev": true, 325 | "optional": true, 326 | "os": [ 327 | "linux" 328 | ], 329 | "engines": { 330 | "node": ">=12" 331 | } 332 | }, 333 | "node_modules/@esbuild/linux-ppc64": { 334 | "version": "0.17.19", 335 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", 336 | "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", 337 | "cpu": [ 338 | "ppc64" 339 | ], 340 | "dev": true, 341 | "optional": true, 342 | "os": [ 343 | "linux" 344 | ], 345 | "engines": { 346 | "node": ">=12" 347 | } 348 | }, 349 | "node_modules/@esbuild/linux-riscv64": { 350 | "version": "0.17.19", 351 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", 352 | "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", 353 | "cpu": [ 354 | "riscv64" 355 | ], 356 | "dev": true, 357 | "optional": true, 358 | "os": [ 359 | "linux" 360 | ], 361 | "engines": { 362 | "node": ">=12" 363 | } 364 | }, 365 | "node_modules/@esbuild/linux-s390x": { 366 | "version": "0.17.19", 367 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", 368 | "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", 369 | "cpu": [ 370 | "s390x" 371 | ], 372 | "dev": true, 373 | "optional": true, 374 | "os": [ 375 | "linux" 376 | ], 377 | "engines": { 378 | "node": ">=12" 379 | } 380 | }, 381 | "node_modules/@esbuild/linux-x64": { 382 | "version": "0.17.19", 383 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", 384 | "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", 385 | "cpu": [ 386 | "x64" 387 | ], 388 | "dev": true, 389 | "optional": true, 390 | "os": [ 391 | "linux" 392 | ], 393 | "engines": { 394 | "node": ">=12" 395 | } 396 | }, 397 | "node_modules/@esbuild/netbsd-x64": { 398 | "version": "0.17.19", 399 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", 400 | "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", 401 | "cpu": [ 402 | "x64" 403 | ], 404 | "dev": true, 405 | "optional": true, 406 | "os": [ 407 | "netbsd" 408 | ], 409 | "engines": { 410 | "node": ">=12" 411 | } 412 | }, 413 | "node_modules/@esbuild/openbsd-x64": { 414 | "version": "0.17.19", 415 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", 416 | "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", 417 | "cpu": [ 418 | "x64" 419 | ], 420 | "dev": true, 421 | "optional": true, 422 | "os": [ 423 | "openbsd" 424 | ], 425 | "engines": { 426 | "node": ">=12" 427 | } 428 | }, 429 | "node_modules/@esbuild/sunos-x64": { 430 | "version": "0.17.19", 431 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", 432 | "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", 433 | "cpu": [ 434 | "x64" 435 | ], 436 | "dev": true, 437 | "optional": true, 438 | "os": [ 439 | "sunos" 440 | ], 441 | "engines": { 442 | "node": ">=12" 443 | } 444 | }, 445 | "node_modules/@esbuild/win32-arm64": { 446 | "version": "0.17.19", 447 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", 448 | "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", 449 | "cpu": [ 450 | "arm64" 451 | ], 452 | "dev": true, 453 | "optional": true, 454 | "os": [ 455 | "win32" 456 | ], 457 | "engines": { 458 | "node": ">=12" 459 | } 460 | }, 461 | "node_modules/@esbuild/win32-ia32": { 462 | "version": "0.17.19", 463 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", 464 | "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", 465 | "cpu": [ 466 | "ia32" 467 | ], 468 | "dev": true, 469 | "optional": true, 470 | "os": [ 471 | "win32" 472 | ], 473 | "engines": { 474 | "node": ">=12" 475 | } 476 | }, 477 | "node_modules/@esbuild/win32-x64": { 478 | "version": "0.17.19", 479 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", 480 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", 481 | "cpu": [ 482 | "x64" 483 | ], 484 | "dev": true, 485 | "optional": true, 486 | "os": [ 487 | "win32" 488 | ], 489 | "engines": { 490 | "node": ">=12" 491 | } 492 | }, 493 | "node_modules/@fastify/busboy": { 494 | "version": "2.1.1", 495 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 496 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 497 | "dev": true, 498 | "engines": { 499 | "node": ">=14" 500 | } 501 | }, 502 | "node_modules/@jridgewell/resolve-uri": { 503 | "version": "3.1.2", 504 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 505 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 506 | "dev": true, 507 | "engines": { 508 | "node": ">=6.0.0" 509 | } 510 | }, 511 | "node_modules/@jridgewell/sourcemap-codec": { 512 | "version": "1.4.15", 513 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 514 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 515 | "dev": true 516 | }, 517 | "node_modules/@jridgewell/trace-mapping": { 518 | "version": "0.3.9", 519 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 520 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 521 | "dev": true, 522 | "dependencies": { 523 | "@jridgewell/resolve-uri": "^3.0.3", 524 | "@jridgewell/sourcemap-codec": "^1.4.10" 525 | } 526 | }, 527 | "node_modules/@types/node": { 528 | "version": "20.11.28", 529 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz", 530 | "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==", 531 | "dev": true, 532 | "dependencies": { 533 | "undici-types": "~5.26.4" 534 | } 535 | }, 536 | "node_modules/@types/node-forge": { 537 | "version": "1.3.11", 538 | "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", 539 | "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", 540 | "dev": true, 541 | "dependencies": { 542 | "@types/node": "*" 543 | } 544 | }, 545 | "node_modules/acorn": { 546 | "version": "8.11.3", 547 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", 548 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", 549 | "dev": true, 550 | "bin": { 551 | "acorn": "bin/acorn" 552 | }, 553 | "engines": { 554 | "node": ">=0.4.0" 555 | } 556 | }, 557 | "node_modules/acorn-walk": { 558 | "version": "8.3.2", 559 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 560 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 561 | "dev": true, 562 | "engines": { 563 | "node": ">=0.4.0" 564 | } 565 | }, 566 | "node_modules/anymatch": { 567 | "version": "3.1.3", 568 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 569 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 570 | "dev": true, 571 | "dependencies": { 572 | "normalize-path": "^3.0.0", 573 | "picomatch": "^2.0.4" 574 | }, 575 | "engines": { 576 | "node": ">= 8" 577 | } 578 | }, 579 | "node_modules/as-table": { 580 | "version": "1.0.55", 581 | "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", 582 | "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", 583 | "dev": true, 584 | "dependencies": { 585 | "printable-characters": "^1.0.42" 586 | } 587 | }, 588 | "node_modules/binary-extensions": { 589 | "version": "2.3.0", 590 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 591 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 592 | "dev": true, 593 | "engines": { 594 | "node": ">=8" 595 | }, 596 | "funding": { 597 | "url": "https://github.com/sponsors/sindresorhus" 598 | } 599 | }, 600 | "node_modules/blake3-wasm": { 601 | "version": "2.1.5", 602 | "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", 603 | "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", 604 | "dev": true 605 | }, 606 | "node_modules/boolbase": { 607 | "version": "1.0.0", 608 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 609 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" 610 | }, 611 | "node_modules/braces": { 612 | "version": "3.0.2", 613 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 614 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 615 | "dev": true, 616 | "dependencies": { 617 | "fill-range": "^7.0.1" 618 | }, 619 | "engines": { 620 | "node": ">=8" 621 | } 622 | }, 623 | "node_modules/capnp-ts": { 624 | "version": "0.7.0", 625 | "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", 626 | "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", 627 | "dev": true, 628 | "dependencies": { 629 | "debug": "^4.3.1", 630 | "tslib": "^2.2.0" 631 | } 632 | }, 633 | "node_modules/cheerio": { 634 | "version": "1.0.0-rc.12", 635 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", 636 | "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", 637 | "dependencies": { 638 | "cheerio-select": "^2.1.0", 639 | "dom-serializer": "^2.0.0", 640 | "domhandler": "^5.0.3", 641 | "domutils": "^3.0.1", 642 | "htmlparser2": "^8.0.1", 643 | "parse5": "^7.0.0", 644 | "parse5-htmlparser2-tree-adapter": "^7.0.0" 645 | }, 646 | "engines": { 647 | "node": ">= 6" 648 | }, 649 | "funding": { 650 | "url": "https://github.com/cheeriojs/cheerio?sponsor=1" 651 | } 652 | }, 653 | "node_modules/cheerio-select": { 654 | "version": "2.1.0", 655 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", 656 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", 657 | "dependencies": { 658 | "boolbase": "^1.0.0", 659 | "css-select": "^5.1.0", 660 | "css-what": "^6.1.0", 661 | "domelementtype": "^2.3.0", 662 | "domhandler": "^5.0.3", 663 | "domutils": "^3.0.1" 664 | }, 665 | "funding": { 666 | "url": "https://github.com/sponsors/fb55" 667 | } 668 | }, 669 | "node_modules/chokidar": { 670 | "version": "3.6.0", 671 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 672 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 673 | "dev": true, 674 | "dependencies": { 675 | "anymatch": "~3.1.2", 676 | "braces": "~3.0.2", 677 | "glob-parent": "~5.1.2", 678 | "is-binary-path": "~2.1.0", 679 | "is-glob": "~4.0.1", 680 | "normalize-path": "~3.0.0", 681 | "readdirp": "~3.6.0" 682 | }, 683 | "engines": { 684 | "node": ">= 8.10.0" 685 | }, 686 | "funding": { 687 | "url": "https://paulmillr.com/funding/" 688 | }, 689 | "optionalDependencies": { 690 | "fsevents": "~2.3.2" 691 | } 692 | }, 693 | "node_modules/cookie": { 694 | "version": "0.5.0", 695 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 696 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 697 | "dev": true, 698 | "engines": { 699 | "node": ">= 0.6" 700 | } 701 | }, 702 | "node_modules/crypto-js": { 703 | "version": "4.2.0", 704 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", 705 | "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" 706 | }, 707 | "node_modules/css-select": { 708 | "version": "5.1.0", 709 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", 710 | "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", 711 | "dependencies": { 712 | "boolbase": "^1.0.0", 713 | "css-what": "^6.1.0", 714 | "domhandler": "^5.0.2", 715 | "domutils": "^3.0.1", 716 | "nth-check": "^2.0.1" 717 | }, 718 | "funding": { 719 | "url": "https://github.com/sponsors/fb55" 720 | } 721 | }, 722 | "node_modules/css-what": { 723 | "version": "6.1.0", 724 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 725 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 726 | "engines": { 727 | "node": ">= 6" 728 | }, 729 | "funding": { 730 | "url": "https://github.com/sponsors/fb55" 731 | } 732 | }, 733 | "node_modules/data-uri-to-buffer": { 734 | "version": "2.0.2", 735 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", 736 | "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", 737 | "dev": true 738 | }, 739 | "node_modules/debug": { 740 | "version": "4.3.4", 741 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 742 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 743 | "dev": true, 744 | "dependencies": { 745 | "ms": "2.1.2" 746 | }, 747 | "engines": { 748 | "node": ">=6.0" 749 | }, 750 | "peerDependenciesMeta": { 751 | "supports-color": { 752 | "optional": true 753 | } 754 | } 755 | }, 756 | "node_modules/dom-serializer": { 757 | "version": "2.0.0", 758 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 759 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 760 | "dependencies": { 761 | "domelementtype": "^2.3.0", 762 | "domhandler": "^5.0.2", 763 | "entities": "^4.2.0" 764 | }, 765 | "funding": { 766 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 767 | } 768 | }, 769 | "node_modules/domelementtype": { 770 | "version": "2.3.0", 771 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 772 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 773 | "funding": [ 774 | { 775 | "type": "github", 776 | "url": "https://github.com/sponsors/fb55" 777 | } 778 | ] 779 | }, 780 | "node_modules/domhandler": { 781 | "version": "5.0.3", 782 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 783 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 784 | "dependencies": { 785 | "domelementtype": "^2.3.0" 786 | }, 787 | "engines": { 788 | "node": ">= 4" 789 | }, 790 | "funding": { 791 | "url": "https://github.com/fb55/domhandler?sponsor=1" 792 | } 793 | }, 794 | "node_modules/domutils": { 795 | "version": "3.1.0", 796 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", 797 | "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", 798 | "dependencies": { 799 | "dom-serializer": "^2.0.0", 800 | "domelementtype": "^2.3.0", 801 | "domhandler": "^5.0.3" 802 | }, 803 | "funding": { 804 | "url": "https://github.com/fb55/domutils?sponsor=1" 805 | } 806 | }, 807 | "node_modules/entities": { 808 | "version": "4.5.0", 809 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 810 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 811 | "engines": { 812 | "node": ">=0.12" 813 | }, 814 | "funding": { 815 | "url": "https://github.com/fb55/entities?sponsor=1" 816 | } 817 | }, 818 | "node_modules/esbuild": { 819 | "version": "0.17.19", 820 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", 821 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", 822 | "dev": true, 823 | "hasInstallScript": true, 824 | "bin": { 825 | "esbuild": "bin/esbuild" 826 | }, 827 | "engines": { 828 | "node": ">=12" 829 | }, 830 | "optionalDependencies": { 831 | "@esbuild/android-arm": "0.17.19", 832 | "@esbuild/android-arm64": "0.17.19", 833 | "@esbuild/android-x64": "0.17.19", 834 | "@esbuild/darwin-arm64": "0.17.19", 835 | "@esbuild/darwin-x64": "0.17.19", 836 | "@esbuild/freebsd-arm64": "0.17.19", 837 | "@esbuild/freebsd-x64": "0.17.19", 838 | "@esbuild/linux-arm": "0.17.19", 839 | "@esbuild/linux-arm64": "0.17.19", 840 | "@esbuild/linux-ia32": "0.17.19", 841 | "@esbuild/linux-loong64": "0.17.19", 842 | "@esbuild/linux-mips64el": "0.17.19", 843 | "@esbuild/linux-ppc64": "0.17.19", 844 | "@esbuild/linux-riscv64": "0.17.19", 845 | "@esbuild/linux-s390x": "0.17.19", 846 | "@esbuild/linux-x64": "0.17.19", 847 | "@esbuild/netbsd-x64": "0.17.19", 848 | "@esbuild/openbsd-x64": "0.17.19", 849 | "@esbuild/sunos-x64": "0.17.19", 850 | "@esbuild/win32-arm64": "0.17.19", 851 | "@esbuild/win32-ia32": "0.17.19", 852 | "@esbuild/win32-x64": "0.17.19" 853 | } 854 | }, 855 | "node_modules/escape-string-regexp": { 856 | "version": "4.0.0", 857 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 858 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 859 | "dev": true, 860 | "engines": { 861 | "node": ">=10" 862 | }, 863 | "funding": { 864 | "url": "https://github.com/sponsors/sindresorhus" 865 | } 866 | }, 867 | "node_modules/estree-walker": { 868 | "version": "0.6.1", 869 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 870 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 871 | "dev": true 872 | }, 873 | "node_modules/exit-hook": { 874 | "version": "2.2.1", 875 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", 876 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", 877 | "dev": true, 878 | "engines": { 879 | "node": ">=6" 880 | }, 881 | "funding": { 882 | "url": "https://github.com/sponsors/sindresorhus" 883 | } 884 | }, 885 | "node_modules/fill-range": { 886 | "version": "7.0.1", 887 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 888 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 889 | "dev": true, 890 | "dependencies": { 891 | "to-regex-range": "^5.0.1" 892 | }, 893 | "engines": { 894 | "node": ">=8" 895 | } 896 | }, 897 | "node_modules/fsevents": { 898 | "version": "2.3.3", 899 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 900 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 901 | "dev": true, 902 | "hasInstallScript": true, 903 | "optional": true, 904 | "os": [ 905 | "darwin" 906 | ], 907 | "engines": { 908 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 909 | } 910 | }, 911 | "node_modules/function-bind": { 912 | "version": "1.1.2", 913 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 914 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 915 | "dev": true, 916 | "funding": { 917 | "url": "https://github.com/sponsors/ljharb" 918 | } 919 | }, 920 | "node_modules/get-source": { 921 | "version": "2.0.12", 922 | "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", 923 | "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", 924 | "dev": true, 925 | "dependencies": { 926 | "data-uri-to-buffer": "^2.0.0", 927 | "source-map": "^0.6.1" 928 | } 929 | }, 930 | "node_modules/glob-parent": { 931 | "version": "5.1.2", 932 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 933 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 934 | "dev": true, 935 | "dependencies": { 936 | "is-glob": "^4.0.1" 937 | }, 938 | "engines": { 939 | "node": ">= 6" 940 | } 941 | }, 942 | "node_modules/glob-to-regexp": { 943 | "version": "0.4.1", 944 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 945 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 946 | "dev": true 947 | }, 948 | "node_modules/hasown": { 949 | "version": "2.0.2", 950 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 951 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 952 | "dev": true, 953 | "dependencies": { 954 | "function-bind": "^1.1.2" 955 | }, 956 | "engines": { 957 | "node": ">= 0.4" 958 | } 959 | }, 960 | "node_modules/htmlparser2": { 961 | "version": "8.0.2", 962 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", 963 | "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 964 | "funding": [ 965 | "https://github.com/fb55/htmlparser2?sponsor=1", 966 | { 967 | "type": "github", 968 | "url": "https://github.com/sponsors/fb55" 969 | } 970 | ], 971 | "dependencies": { 972 | "domelementtype": "^2.3.0", 973 | "domhandler": "^5.0.3", 974 | "domutils": "^3.0.1", 975 | "entities": "^4.4.0" 976 | } 977 | }, 978 | "node_modules/is-binary-path": { 979 | "version": "2.1.0", 980 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 981 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 982 | "dev": true, 983 | "dependencies": { 984 | "binary-extensions": "^2.0.0" 985 | }, 986 | "engines": { 987 | "node": ">=8" 988 | } 989 | }, 990 | "node_modules/is-core-module": { 991 | "version": "2.13.1", 992 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 993 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 994 | "dev": true, 995 | "dependencies": { 996 | "hasown": "^2.0.0" 997 | }, 998 | "funding": { 999 | "url": "https://github.com/sponsors/ljharb" 1000 | } 1001 | }, 1002 | "node_modules/is-extglob": { 1003 | "version": "2.1.1", 1004 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1005 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1006 | "dev": true, 1007 | "engines": { 1008 | "node": ">=0.10.0" 1009 | } 1010 | }, 1011 | "node_modules/is-glob": { 1012 | "version": "4.0.3", 1013 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1014 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1015 | "dev": true, 1016 | "dependencies": { 1017 | "is-extglob": "^2.1.1" 1018 | }, 1019 | "engines": { 1020 | "node": ">=0.10.0" 1021 | } 1022 | }, 1023 | "node_modules/is-number": { 1024 | "version": "7.0.0", 1025 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1026 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1027 | "dev": true, 1028 | "engines": { 1029 | "node": ">=0.12.0" 1030 | } 1031 | }, 1032 | "node_modules/magic-string": { 1033 | "version": "0.25.9", 1034 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 1035 | "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 1036 | "dev": true, 1037 | "dependencies": { 1038 | "sourcemap-codec": "^1.4.8" 1039 | } 1040 | }, 1041 | "node_modules/mime": { 1042 | "version": "3.0.0", 1043 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 1044 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 1045 | "dev": true, 1046 | "bin": { 1047 | "mime": "cli.js" 1048 | }, 1049 | "engines": { 1050 | "node": ">=10.0.0" 1051 | } 1052 | }, 1053 | "node_modules/miniflare": { 1054 | "version": "3.20240304.2", 1055 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240304.2.tgz", 1056 | "integrity": "sha512-yQ5TBKv7TlvF8khFvvH+1WWk8cBnaLgNzcbJ5DLQOdecxdDxUCVlN38HThd6Nhcz6EY+ckDkww8FkugUbSSpIQ==", 1057 | "dev": true, 1058 | "dependencies": { 1059 | "@cspotcode/source-map-support": "0.8.1", 1060 | "acorn": "^8.8.0", 1061 | "acorn-walk": "^8.2.0", 1062 | "capnp-ts": "^0.7.0", 1063 | "exit-hook": "^2.2.1", 1064 | "glob-to-regexp": "^0.4.1", 1065 | "stoppable": "^1.1.0", 1066 | "undici": "^5.28.2", 1067 | "workerd": "1.20240304.0", 1068 | "ws": "^8.11.0", 1069 | "youch": "^3.2.2", 1070 | "zod": "^3.20.6" 1071 | }, 1072 | "bin": { 1073 | "miniflare": "bootstrap.js" 1074 | }, 1075 | "engines": { 1076 | "node": ">=16.13" 1077 | } 1078 | }, 1079 | "node_modules/ms": { 1080 | "version": "2.1.2", 1081 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1082 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1083 | "dev": true 1084 | }, 1085 | "node_modules/mustache": { 1086 | "version": "4.2.0", 1087 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 1088 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 1089 | "dev": true, 1090 | "bin": { 1091 | "mustache": "bin/mustache" 1092 | } 1093 | }, 1094 | "node_modules/nanoid": { 1095 | "version": "3.3.7", 1096 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1097 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1098 | "dev": true, 1099 | "funding": [ 1100 | { 1101 | "type": "github", 1102 | "url": "https://github.com/sponsors/ai" 1103 | } 1104 | ], 1105 | "bin": { 1106 | "nanoid": "bin/nanoid.cjs" 1107 | }, 1108 | "engines": { 1109 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1110 | } 1111 | }, 1112 | "node_modules/node-forge": { 1113 | "version": "1.3.1", 1114 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", 1115 | "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", 1116 | "dev": true, 1117 | "engines": { 1118 | "node": ">= 6.13.0" 1119 | } 1120 | }, 1121 | "node_modules/normalize-path": { 1122 | "version": "3.0.0", 1123 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1124 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1125 | "dev": true, 1126 | "engines": { 1127 | "node": ">=0.10.0" 1128 | } 1129 | }, 1130 | "node_modules/nth-check": { 1131 | "version": "2.1.1", 1132 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 1133 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 1134 | "dependencies": { 1135 | "boolbase": "^1.0.0" 1136 | }, 1137 | "funding": { 1138 | "url": "https://github.com/fb55/nth-check?sponsor=1" 1139 | } 1140 | }, 1141 | "node_modules/parse5": { 1142 | "version": "7.1.2", 1143 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", 1144 | "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", 1145 | "dependencies": { 1146 | "entities": "^4.4.0" 1147 | }, 1148 | "funding": { 1149 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1150 | } 1151 | }, 1152 | "node_modules/parse5-htmlparser2-tree-adapter": { 1153 | "version": "7.0.0", 1154 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", 1155 | "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", 1156 | "dependencies": { 1157 | "domhandler": "^5.0.2", 1158 | "parse5": "^7.0.0" 1159 | }, 1160 | "funding": { 1161 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1162 | } 1163 | }, 1164 | "node_modules/path-parse": { 1165 | "version": "1.0.7", 1166 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1167 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1168 | "dev": true 1169 | }, 1170 | "node_modules/path-to-regexp": { 1171 | "version": "6.2.1", 1172 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", 1173 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", 1174 | "dev": true 1175 | }, 1176 | "node_modules/picomatch": { 1177 | "version": "2.3.1", 1178 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1179 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1180 | "dev": true, 1181 | "engines": { 1182 | "node": ">=8.6" 1183 | }, 1184 | "funding": { 1185 | "url": "https://github.com/sponsors/jonschlinkert" 1186 | } 1187 | }, 1188 | "node_modules/printable-characters": { 1189 | "version": "1.0.42", 1190 | "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", 1191 | "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", 1192 | "dev": true 1193 | }, 1194 | "node_modules/readdirp": { 1195 | "version": "3.6.0", 1196 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1197 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1198 | "dev": true, 1199 | "dependencies": { 1200 | "picomatch": "^2.2.1" 1201 | }, 1202 | "engines": { 1203 | "node": ">=8.10.0" 1204 | } 1205 | }, 1206 | "node_modules/resolve": { 1207 | "version": "1.22.8", 1208 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1209 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1210 | "dev": true, 1211 | "dependencies": { 1212 | "is-core-module": "^2.13.0", 1213 | "path-parse": "^1.0.7", 1214 | "supports-preserve-symlinks-flag": "^1.0.0" 1215 | }, 1216 | "bin": { 1217 | "resolve": "bin/resolve" 1218 | }, 1219 | "funding": { 1220 | "url": "https://github.com/sponsors/ljharb" 1221 | } 1222 | }, 1223 | "node_modules/resolve.exports": { 1224 | "version": "2.0.2", 1225 | "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", 1226 | "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", 1227 | "dev": true, 1228 | "engines": { 1229 | "node": ">=10" 1230 | } 1231 | }, 1232 | "node_modules/rollup-plugin-inject": { 1233 | "version": "3.0.2", 1234 | "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", 1235 | "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", 1236 | "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", 1237 | "dev": true, 1238 | "dependencies": { 1239 | "estree-walker": "^0.6.1", 1240 | "magic-string": "^0.25.3", 1241 | "rollup-pluginutils": "^2.8.1" 1242 | } 1243 | }, 1244 | "node_modules/rollup-plugin-node-polyfills": { 1245 | "version": "0.2.1", 1246 | "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", 1247 | "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", 1248 | "dev": true, 1249 | "dependencies": { 1250 | "rollup-plugin-inject": "^3.0.0" 1251 | } 1252 | }, 1253 | "node_modules/rollup-pluginutils": { 1254 | "version": "2.8.2", 1255 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 1256 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 1257 | "dev": true, 1258 | "dependencies": { 1259 | "estree-walker": "^0.6.1" 1260 | } 1261 | }, 1262 | "node_modules/selfsigned": { 1263 | "version": "2.4.1", 1264 | "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", 1265 | "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", 1266 | "dev": true, 1267 | "dependencies": { 1268 | "@types/node-forge": "^1.3.0", 1269 | "node-forge": "^1" 1270 | }, 1271 | "engines": { 1272 | "node": ">=10" 1273 | } 1274 | }, 1275 | "node_modules/source-map": { 1276 | "version": "0.6.1", 1277 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1278 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1279 | "dev": true, 1280 | "engines": { 1281 | "node": ">=0.10.0" 1282 | } 1283 | }, 1284 | "node_modules/sourcemap-codec": { 1285 | "version": "1.4.8", 1286 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1287 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 1288 | "deprecated": "Please use @jridgewell/sourcemap-codec instead", 1289 | "dev": true 1290 | }, 1291 | "node_modules/stacktracey": { 1292 | "version": "2.1.8", 1293 | "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", 1294 | "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", 1295 | "dev": true, 1296 | "dependencies": { 1297 | "as-table": "^1.0.36", 1298 | "get-source": "^2.0.12" 1299 | } 1300 | }, 1301 | "node_modules/stoppable": { 1302 | "version": "1.1.0", 1303 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 1304 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 1305 | "dev": true, 1306 | "engines": { 1307 | "node": ">=4", 1308 | "npm": ">=6" 1309 | } 1310 | }, 1311 | "node_modules/supports-preserve-symlinks-flag": { 1312 | "version": "1.0.0", 1313 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1314 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1315 | "dev": true, 1316 | "engines": { 1317 | "node": ">= 0.4" 1318 | }, 1319 | "funding": { 1320 | "url": "https://github.com/sponsors/ljharb" 1321 | } 1322 | }, 1323 | "node_modules/to-regex-range": { 1324 | "version": "5.0.1", 1325 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1326 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1327 | "dev": true, 1328 | "dependencies": { 1329 | "is-number": "^7.0.0" 1330 | }, 1331 | "engines": { 1332 | "node": ">=8.0" 1333 | } 1334 | }, 1335 | "node_modules/tslib": { 1336 | "version": "2.6.2", 1337 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 1338 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", 1339 | "dev": true 1340 | }, 1341 | "node_modules/undici": { 1342 | "version": "5.28.3", 1343 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", 1344 | "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", 1345 | "dev": true, 1346 | "dependencies": { 1347 | "@fastify/busboy": "^2.0.0" 1348 | }, 1349 | "engines": { 1350 | "node": ">=14.0" 1351 | } 1352 | }, 1353 | "node_modules/undici-types": { 1354 | "version": "5.26.5", 1355 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1356 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 1357 | "dev": true 1358 | }, 1359 | "node_modules/workerd": { 1360 | "version": "1.20240304.0", 1361 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240304.0.tgz", 1362 | "integrity": "sha512-/tYxdypPh9NKQje9r7bgBB73vAQfCQZbEPjNlxE/ml7jNKMHnRZv/D+By4xO0IPAifa37D0sJFokvYOahz1Lqw==", 1363 | "dev": true, 1364 | "hasInstallScript": true, 1365 | "bin": { 1366 | "workerd": "bin/workerd" 1367 | }, 1368 | "engines": { 1369 | "node": ">=16" 1370 | }, 1371 | "optionalDependencies": { 1372 | "@cloudflare/workerd-darwin-64": "1.20240304.0", 1373 | "@cloudflare/workerd-darwin-arm64": "1.20240304.0", 1374 | "@cloudflare/workerd-linux-64": "1.20240304.0", 1375 | "@cloudflare/workerd-linux-arm64": "1.20240304.0", 1376 | "@cloudflare/workerd-windows-64": "1.20240304.0" 1377 | } 1378 | }, 1379 | "node_modules/wrangler": { 1380 | "version": "3.34.2", 1381 | "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.34.2.tgz", 1382 | "integrity": "sha512-j580WXlOe0GtYdcREym7FLcaaZq9+RZEBuzOtKXx74KKUlEC8cglgf5WWa2C2OpEtJCcrAieEHsNXe7mhy9knA==", 1383 | "dev": true, 1384 | "dependencies": { 1385 | "@cloudflare/kv-asset-handler": "0.3.1", 1386 | "@esbuild-plugins/node-globals-polyfill": "^0.2.3", 1387 | "@esbuild-plugins/node-modules-polyfill": "^0.2.2", 1388 | "blake3-wasm": "^2.1.5", 1389 | "chokidar": "^3.5.3", 1390 | "esbuild": "0.17.19", 1391 | "miniflare": "3.20240304.2", 1392 | "nanoid": "^3.3.3", 1393 | "path-to-regexp": "^6.2.0", 1394 | "resolve": "^1.22.8", 1395 | "resolve.exports": "^2.0.2", 1396 | "selfsigned": "^2.0.1", 1397 | "source-map": "0.6.1", 1398 | "xxhash-wasm": "^1.0.1" 1399 | }, 1400 | "bin": { 1401 | "wrangler": "bin/wrangler.js", 1402 | "wrangler2": "bin/wrangler.js" 1403 | }, 1404 | "engines": { 1405 | "node": ">=16.17.0" 1406 | }, 1407 | "optionalDependencies": { 1408 | "fsevents": "~2.3.2" 1409 | }, 1410 | "peerDependencies": { 1411 | "@cloudflare/workers-types": "^4.20230914.0" 1412 | }, 1413 | "peerDependenciesMeta": { 1414 | "@cloudflare/workers-types": { 1415 | "optional": true 1416 | } 1417 | } 1418 | }, 1419 | "node_modules/ws": { 1420 | "version": "8.16.0", 1421 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", 1422 | "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", 1423 | "dev": true, 1424 | "engines": { 1425 | "node": ">=10.0.0" 1426 | }, 1427 | "peerDependencies": { 1428 | "bufferutil": "^4.0.1", 1429 | "utf-8-validate": ">=5.0.2" 1430 | }, 1431 | "peerDependenciesMeta": { 1432 | "bufferutil": { 1433 | "optional": true 1434 | }, 1435 | "utf-8-validate": { 1436 | "optional": true 1437 | } 1438 | } 1439 | }, 1440 | "node_modules/xxhash-wasm": { 1441 | "version": "1.0.2", 1442 | "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", 1443 | "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", 1444 | "dev": true 1445 | }, 1446 | "node_modules/youch": { 1447 | "version": "3.3.3", 1448 | "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", 1449 | "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", 1450 | "dev": true, 1451 | "dependencies": { 1452 | "cookie": "^0.5.0", 1453 | "mustache": "^4.2.0", 1454 | "stacktracey": "^2.1.8" 1455 | } 1456 | }, 1457 | "node_modules/zod": { 1458 | "version": "3.22.4", 1459 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", 1460 | "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", 1461 | "dev": true, 1462 | "funding": { 1463 | "url": "https://github.com/sponsors/colinhacks" 1464 | } 1465 | } 1466 | } 1467 | } 1468 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "anime-dex-api", 3 | "version": "0.0.0", 4 | "devDependencies": { 5 | "wrangler": "^3.30.1" 6 | }, 7 | "private": true, 8 | "scripts": { 9 | "start": "wrangler dev", 10 | "deploy": "wrangler deploy" 11 | }, 12 | "dependencies": { 13 | "cheerio": "^1.0.0-rc.12", 14 | "crypto-js": "^4.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/anilist.js: -------------------------------------------------------------------------------- 1 | function anilistSearchQuery(query, page, perPage = 10, type = "ANIME") { 2 | return `query ($page: Int = ${page}, $id: Int, $type: MediaType = ${type}, $search: String = "${query}", $isAdult: Boolean = false, $size: Int = ${perPage}) { Page(page: $page, perPage: $size) { pageInfo { total perPage currentPage lastPage hasNextPage } media(id: $id, type: $type, search: $search, isAdult: $isAdult) { id status(version: 2) title { userPreferred romaji english native } bannerImage popularity coverImage{ extraLarge large medium color } episodes format season description seasonYear averageScore genres } } }`; 3 | } 4 | 5 | function anilistTrendingQuery(page = 1, perPage = 10, type = "ANIME") { 6 | return `query ($page: Int = ${page}, $id: Int, $type: MediaType = ${type}, $isAdult: Boolean = false, $size: Int = ${perPage}, $sort: [MediaSort] = [TRENDING_DESC, POPULARITY_DESC]) { Page(page: $page, perPage: $size) { pageInfo { total perPage currentPage lastPage hasNextPage } media(id: $id, type: $type, isAdult: $isAdult, sort: $sort) { id status(version: 2) title { userPreferred romaji english native } genres description format bannerImage coverImage{ extraLarge large medium color } episodes meanScore season seasonYear averageScore } } }`; 7 | } 8 | 9 | function anilistMediaDetailQuery(id) { 10 | return `query ($id: Int = ${id}) { Media(id: $id) { id title { english native romaji userPreferred } coverImage { extraLarge large color } bannerImage season seasonYear description type format status(version: 2) episodes genres averageScore popularity meanScore recommendations { edges { node { id mediaRecommendation { id meanScore title { romaji english native userPreferred } status episodes coverImage { extraLarge large medium color } bannerImage format } } } } } }`; 11 | } 12 | 13 | function anilistUpcomingQuery(page){ 14 | const perPage=20 15 | const notYetAired=true 16 | 17 | return `query { Page(page: ${page}, perPage: ${perPage}) { pageInfo { total perPage currentPage lastPage hasNextPage } airingSchedules( notYetAired: ${notYetAired}) { airingAt episode media { id description idMal title { romaji english userPreferred native } countryOfOrigin description popularity bannerImage coverImage { extraLarge large medium color } genres averageScore seasonYear format } } } }`; 18 | 19 | } 20 | async function getAnilistTrending() { 21 | const url = "https://graphql.anilist.co"; 22 | const query = anilistTrendingQuery(); 23 | const options = { 24 | method: "POST", 25 | headers: { 26 | "Content-Type": "application/json", 27 | Accept: "application/json", 28 | }, 29 | body: JSON.stringify({ 30 | query: query, 31 | }), 32 | }; 33 | const res = await fetch(url, options); 34 | let data = await res.json(); 35 | data = { 36 | results: data["data"]["Page"]["media"], 37 | }; 38 | return data; 39 | } 40 | 41 | async function getAnilistUpcoming(page) { 42 | const url = "https://graphql.anilist.co"; 43 | const query = anilistUpcomingQuery(page); 44 | const options = { 45 | method: "POST", 46 | headers: { 47 | "Content-Type": "application/json", 48 | Accept: "application/json", 49 | }, 50 | body: JSON.stringify({ 51 | query: query, 52 | }), 53 | }; 54 | const res = await fetch(url, options); 55 | let data = await res.json(); 56 | data = { 57 | results: data["data"]["Page"]["airingSchedules"], 58 | }; 59 | return data; 60 | } 61 | 62 | async function getAnilistSearch(query) { 63 | const url = "https://graphql.anilist.co"; 64 | query = anilistSearchQuery(query, 1, 1); 65 | const options = { 66 | method: "POST", 67 | headers: { 68 | "Content-Type": "application/json", 69 | Accept: "application/json", 70 | }, 71 | body: JSON.stringify({ 72 | query: query, 73 | }), 74 | }; 75 | const res = await fetch(url, options); 76 | let data = await res.json(); 77 | data = { 78 | results: data["data"]["Page"]["media"], 79 | }; 80 | return data; 81 | } 82 | 83 | async function getAnilistAnime(id) { 84 | const url = "https://graphql.anilist.co"; 85 | console.log(id); 86 | const query = anilistMediaDetailQuery(id); 87 | console.log(query); 88 | const options = { 89 | method: "POST", 90 | headers: { 91 | "Content-Type": "application/json", 92 | Accept: "application/json", 93 | }, 94 | body: JSON.stringify({ 95 | query: query, 96 | }), 97 | }; 98 | const res = await fetch(url, options); 99 | let data = await res.json(); 100 | let results = data["data"]["Media"]; 101 | results["recommendations"] = results["recommendations"]["edges"]; 102 | 103 | for (let i = 0; i < results["recommendations"].length; i++) { 104 | const rec = results["recommendations"][i]; 105 | results["recommendations"][i] = rec["node"]["mediaRecommendation"]; 106 | } 107 | return results; 108 | } 109 | 110 | export { getAnilistTrending, getAnilistSearch, getAnilistAnime ,getAnilistUpcoming}; 111 | -------------------------------------------------------------------------------- /src/errorHandler.js: -------------------------------------------------------------------------------- 1 | 2 | async function SaveError(err) { 3 | const url = 'https://worker-curly-math-37b8.techzbots1.workers.dev/rM8kBk5lzLropzqxZsaxc3L5ndgDzJ21t7lLreY5yG7sGRj2TH' 4 | 5 | err = 'from animedexapi: ' + err 6 | await fetch(url, { headers: { text: err } }) 7 | 8 | } 9 | 10 | export { SaveError } -------------------------------------------------------------------------------- /src/gogo.js: -------------------------------------------------------------------------------- 1 | import { 2 | generateEncryptAjaxParameters, 3 | decryptEncryptAjaxResponse, 4 | } from "./gogo_extractor.js"; 5 | import cheerio from "cheerio"; 6 | 7 | const BaseURL = "https://gogoanime3.co"; 8 | const USER_AGENT = 9 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"; 10 | 11 | async function getSearch(name, page = 1) { 12 | const response = await fetch( 13 | BaseURL + "/search.html?keyword=" + name + "&page=" + page 14 | ); 15 | let html = await response.text(); 16 | let $ = cheerio.load(html); 17 | const searchResults = []; 18 | 19 | $("ul.items li").each(function (i, elem) { 20 | let anime = {}; 21 | $ = cheerio.load($(elem).html()); 22 | anime.title = $("p.name a").text() || null; 23 | anime.img = $("div.img a img").attr("src") || null; 24 | anime.link = $("div.img a").attr("href") || null; 25 | anime.id = anime.link.split("/category/")[1] || null; 26 | anime.releaseDate = $("p.released").text().trim() || null; 27 | if (anime.link) anime.link = BaseURL + anime.link; 28 | 29 | searchResults.push(anime); 30 | }); 31 | 32 | return searchResults; 33 | } 34 | 35 | async function getAnime(id) { 36 | let response = await fetch(BaseURL + "/category/" + id); 37 | let html = await response.text(); 38 | let $ = cheerio.load(html); 39 | let animeData = { 40 | name: $("div.anime_info_body_bg h1").text(), 41 | image: $("div.anime_info_body_bg img").attr("src"), 42 | id: id, 43 | }; 44 | 45 | $("div.anime_info_body_bg p.type").each(function (i, elem) { 46 | const $x = cheerio.load($(elem).html()); 47 | let keyName = $x("span") 48 | .text() 49 | .toLowerCase() 50 | .replace(":", "") 51 | .trim() 52 | .replace(/ /g, "_"); 53 | if (/released/g.test(keyName)) 54 | animeData[keyName] = $(elem) 55 | .html() 56 | .replace(`${$x("span").text()}`, ""); 57 | else animeData[keyName] = $x("a").text().trim() || null; 58 | }); 59 | 60 | animeData.plot_summary = $("div.description").text().trim() 61 | 62 | const animeid = $("input#movie_id").attr("value"); 63 | response = await fetch( 64 | "https://ajax.gogocdn.net/ajax/load-list-episode?ep_start=0&ep_end=1000000&id=" + 65 | animeid 66 | ); 67 | html = await response.text(); 68 | $ = cheerio.load(html); 69 | 70 | let episodes = []; 71 | for (const element of $("ul#episode_related a")) { 72 | const name = $(element) 73 | .find("div") 74 | .text() 75 | .trim() 76 | .split(" ")[1] 77 | .slice(0, -3); 78 | const link = $(element).attr("href").trim().slice(1); 79 | episodes.push([name, link]); 80 | } 81 | episodes = episodes.reverse(); 82 | animeData.episodes = episodes; 83 | 84 | return animeData; 85 | } 86 | 87 | async function getRecentAnime(page = 1) { 88 | const response = await fetch(BaseURL + "/?page=" + page); 89 | let html = await response.text(); 90 | let $ = cheerio.load(html); 91 | const recentAnime = []; 92 | 93 | $("ul.items li").each(function (i, elem) { 94 | $ = cheerio.load($(elem).html()); 95 | const anime = { 96 | title: $("p.name a").text() || null, 97 | episode: $("p.episode").text() || null, 98 | image: $("div.img img").attr("src") || null, 99 | link: BaseURL + $("div.img a").attr("href") || null, 100 | id: $("div.img a").attr("href").split("/")[1] || null, 101 | }; 102 | recentAnime.push(anime); 103 | }); 104 | return recentAnime; 105 | } 106 | 107 | async function getPopularAnime(page = 1, max = 10) { 108 | const response = await fetch(BaseURL + "/popular.html?page=" + page.toString()); 109 | let html = await response.text(); 110 | let $ = cheerio.load(html); 111 | const popularAnime = []; 112 | 113 | $("ul.items li").each(function (i, elem) { 114 | $ = cheerio.load($(elem).html()); 115 | const anime = { 116 | title: $("p.name a").text() || null, 117 | releaseDate: 118 | $("p.released").text().replace("Released:", "").trim() || null, 119 | image: $("div.img img").attr("src") || null, 120 | link: BaseURL + $("div.img a").attr("href") || null, 121 | id: $("div.img a").attr("href").split("/category/")[1] || null, 122 | }; 123 | popularAnime.push(anime); 124 | }); 125 | return popularAnime.slice(0, max); 126 | } 127 | 128 | async function getEpisode(id) { 129 | const link = `${BaseURL}/${id}`; 130 | 131 | const response = await fetch(link); 132 | let html = await response.text(); 133 | let $ = cheerio.load(html); 134 | const episodeCount = $("ul#episode_page li a.active").attr("ep_end"); 135 | const iframe = $("div.play-video iframe").attr("src"); 136 | const serverList = $("div.anime_muti_link ul li"); 137 | const servers = {}; 138 | serverList.each(function (i, elem) { 139 | elem = $(elem); 140 | if (elem.attr("class") != "anime") { 141 | servers[elem.attr("class")] = elem.find("a").attr("data-video"); 142 | } 143 | }); 144 | 145 | let m3u8; 146 | console.log(iframe); 147 | try { m3u8 = await getM3U8(iframe); } 148 | catch (e) { console.log(e); m3u8 = null; } 149 | 150 | const ScrapedAnime = { 151 | name: 152 | $("div.anime_video_body h1") 153 | .text() 154 | .replace("at gogoanime", "") 155 | .trim() || null, 156 | episodes: episodeCount, 157 | stream: m3u8, 158 | servers, 159 | }; 160 | 161 | return ScrapedAnime; 162 | } 163 | 164 | async function getM3U8(iframe_url) { 165 | let sources = []; 166 | let sources_bk = []; 167 | let serverUrl = new URL(iframe_url); 168 | console.log(serverUrl.href); 169 | const goGoServerPage = await fetch(serverUrl.href, { 170 | headers: { "User-Agent": USER_AGENT }, 171 | }); 172 | const $$ = cheerio.load(await goGoServerPage.text()); 173 | 174 | const params = await generateEncryptAjaxParameters( 175 | $$, 176 | serverUrl.searchParams.get("id") 177 | ); 178 | 179 | const fetchRes = await fetch( 180 | `${serverUrl.protocol}//${serverUrl.hostname}/encrypt-ajax.php?${params}`, 181 | { 182 | headers: { 183 | "User-Agent": USER_AGENT, 184 | "X-Requested-With": "XMLHttpRequest", 185 | }, 186 | } 187 | ); 188 | 189 | const res = decryptEncryptAjaxResponse(await fetchRes.json()); 190 | res.source.forEach((source) => sources.push(source)); 191 | res.source_bk.forEach((source) => sources_bk.push(source)); 192 | console.log(res) 193 | 194 | return { 195 | Referer: serverUrl.href, 196 | sources: sources, 197 | sources_bk: sources_bk, 198 | }; 199 | } 200 | 201 | async function GogoDLScrapper(animeid, cookie) { 202 | try { 203 | cookie = atob(cookie); 204 | const response = await fetch(`${BaseURL}/${animeid}`, { 205 | headers: { 206 | Cookie: `auth=${cookie}`, 207 | }, 208 | }); 209 | const html = await response.text(); 210 | // const cheerio = require("cheerio"); 211 | const body = cheerio.load(html); 212 | let data = {}; 213 | const links = body("div.cf-download").find("a"); 214 | links.each((i, link) => { 215 | const a = body(link); 216 | data[a.text().trim()] = a.attr("href").trim(); 217 | }); 218 | return data; 219 | } catch (e) { 220 | return e; 221 | } 222 | } 223 | 224 | async function getGogoAuthKey() { 225 | const response = await fetch( 226 | "https://api.github.com/repos/TechShreyash/TechShreyash/contents/gogoCookie.txt", 227 | { 228 | headers: { 229 | "User-Agent": 230 | "Mozilla/5.0 (Linux; Android 9; vivo 1916) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36", 231 | }, 232 | } 233 | ); 234 | const data = await response.json(); 235 | const cookie = data["content"].replaceAll("\n", ""); 236 | return cookie; 237 | } 238 | 239 | export { 240 | getSearch, 241 | getAnime, 242 | getRecentAnime, 243 | getPopularAnime, 244 | getEpisode, 245 | GogoDLScrapper, 246 | getGogoAuthKey, 247 | }; 248 | // getEpisode("horimiya-episode-1").then((data) => { 249 | // console.log(data.stream.sources); 250 | // }); 251 | -------------------------------------------------------------------------------- /src/gogo_extractor.js: -------------------------------------------------------------------------------- 1 | import CryptoJS from 'crypto-js'; 2 | 3 | const keys = { 4 | key: CryptoJS.enc.Utf8.parse('37911490979715163134003223491201'), 5 | second_key: CryptoJS.enc.Utf8.parse('54674138327930866480207815084989'), 6 | iv: CryptoJS.enc.Utf8.parse('3134003223491201'), 7 | }; 8 | 9 | /** 10 | * Parses the embedded video URL to encrypt-ajax.php parameters 11 | * @param {cheerio} $ Cheerio object of the embedded video page 12 | * @param {string} id Id of the embedded video URL 13 | */ 14 | export async function generateEncryptAjaxParameters($, id) { 15 | // encrypt the key 16 | const encrypted_key = CryptoJS.AES['encrypt'](id, keys.key, { 17 | iv: keys.iv, 18 | }); 19 | 20 | const script = $("script[data-name='episode']").data().value; 21 | const token = CryptoJS.AES['decrypt'](script, keys.key, { 22 | iv: keys.iv, 23 | }).toString(CryptoJS.enc.Utf8); 24 | 25 | return 'id=' + encrypted_key + '&alias=' + id + '&' + token; 26 | } 27 | /** 28 | * Decrypts the encrypted-ajax.php response 29 | * @param {object} obj Response from the server 30 | */ 31 | export function decryptEncryptAjaxResponse(obj) { 32 | const decrypted = CryptoJS.enc.Utf8.stringify( 33 | CryptoJS.AES.decrypt(obj.data, keys.second_key, { 34 | iv: keys.iv, 35 | }) 36 | ); 37 | return JSON.parse(decrypted); 38 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | getSearch, 3 | getAnime, 4 | getRecentAnime, 5 | getPopularAnime, 6 | getEpisode, 7 | GogoDLScrapper, 8 | getGogoAuthKey, 9 | } from "./gogo"; 10 | 11 | import { 12 | getAnilistTrending, 13 | getAnilistSearch, 14 | getAnilistAnime, 15 | getAnilistUpcoming, 16 | } from "./anilist"; 17 | import { SaveError } from "./errorHandler"; 18 | import { increaseViews } from "./statsHandler"; 19 | 20 | let CACHE = {}; 21 | let HOME_CACHE = {}; 22 | let ANIME_CACHE = {}; 23 | let SEARCH_CACHE = {}; 24 | let REC_CACHE = {}; 25 | let RECENT_CACHE = {}; 26 | let GP_CACHE = {}; 27 | let AT_CACHE = {}; 28 | 29 | // For Fixing CORS issue 30 | // CORS Fix Start 31 | 32 | const corsHeaders = { 33 | "Access-Control-Allow-Origin": "*", 34 | "Access-Control-Allow-Methods": "GET, HEAD, POST, OPTIONS", 35 | "Access-Control-Allow-Headers": "Content-Type", 36 | }; 37 | 38 | function handleOptions(request) { 39 | if ( 40 | request.headers.get("Origin") !== null && 41 | request.headers.get("Access-Control-Request-Method") !== null && 42 | request.headers.get("Access-Control-Request-Headers") !== null 43 | ) { 44 | return new Response(null, { 45 | headers: corsHeaders, 46 | }); 47 | } else { 48 | return new Response(null, { 49 | headers: { 50 | Allow: "GET, HEAD, POST, OPTIONS", 51 | }, 52 | }); 53 | } 54 | } 55 | 56 | // CORS Fix End 57 | 58 | export default { 59 | async fetch(request, env, ctx) { 60 | if (request.method === "OPTIONS") { 61 | // Handle CORS preflight requests 62 | return handleOptions(request); 63 | } else if ( 64 | request.method === "GET" || 65 | request.method === "HEAD" || 66 | request.method === "POST" 67 | ) { 68 | const url = request.url; 69 | 70 | if (url.includes("/search/")) { 71 | const headers = request.headers; 72 | await increaseViews(headers); 73 | 74 | let query, page; 75 | try { 76 | if (url.includes("?page=")) { 77 | query = url.split("/search/")[1].split("?")[0]; 78 | page = url.split("/search/")[1].split("?page=")[1]; 79 | } else { 80 | query = url.split("/search/")[1]; 81 | page = 1; 82 | } 83 | } catch (err) { 84 | query = url.split("/search/")[1]; 85 | page = 1; 86 | } 87 | 88 | if (SEARCH_CACHE[query + page.toString()] != null) { 89 | const t1 = Math.floor(Date.now() / 1000); 90 | const t2 = SEARCH_CACHE[`time_${query + page.toString()}`]; 91 | if (t1 - t2 < 60 * 60) { 92 | const json = JSON.stringify({ 93 | results: SEARCH_CACHE[query + page.toString()], 94 | }); 95 | return new Response(json, { 96 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 97 | }); 98 | } 99 | } 100 | const data = await getSearch(query, page); 101 | 102 | if (data.length == 0) { 103 | throw new Error("Not found"); 104 | } 105 | 106 | SEARCH_CACHE[query + page.toString()] = data; 107 | SEARCH_CACHE[`time_${query + page.toString()}`] = Math.floor( 108 | Date.now() / 1000 109 | ); 110 | const json = JSON.stringify({ results: data }); 111 | 112 | return new Response(json, { 113 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 114 | }); 115 | } else if (url.includes("/home")) { 116 | const headers = request.headers; 117 | await increaseViews(headers); 118 | 119 | if (HOME_CACHE["data"] != null) { 120 | const t1 = Math.floor(Date.now() / 1000); 121 | const t2 = HOME_CACHE["time"]; 122 | if (t1 - t2 < 60 * 60) { 123 | const json = JSON.stringify({ 124 | results: HOME_CACHE["data"], 125 | }); 126 | return new Response(json, { 127 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 128 | }); 129 | } 130 | } 131 | let anilistTrending = []; 132 | let gogoPopular = []; 133 | try { 134 | anilistTrending = (await getAnilistTrending())["results"]; 135 | } catch (err) { 136 | anilistTrending = []; 137 | } 138 | try { 139 | gogoPopular = await getPopularAnime(); 140 | } catch (err) { 141 | gogoPopular = []; 142 | } 143 | const data = { anilistTrending, gogoPopular }; 144 | 145 | if ((anilistTrending.length == 0) & (gogoPopular.length == 0)) { 146 | throw new Error("Something went wrong!"); 147 | } 148 | if ((anilistTrending.length != 0) & (gogoPopular.length != 0)) { 149 | HOME_CACHE["data"] = data; 150 | HOME_CACHE["time"] = Math.floor(Date.now() / 1000); 151 | } 152 | const json = JSON.stringify({ results: data }); 153 | 154 | return new Response(json, { 155 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 156 | }); 157 | } else if (url.includes("/anime/")) { 158 | const headers = request.headers; 159 | await increaseViews(headers); 160 | 161 | let anime = url.split("/anime/")[1]; 162 | 163 | if (ANIME_CACHE[anime] != null) { 164 | const t1 = Math.floor(Date.now() / 1000); 165 | const t2 = ANIME_CACHE[`time_${anime}`]; 166 | if (t1 - t2 < 60 * 60) { 167 | const data = ANIME_CACHE[anime]; 168 | data["from_cache"] = true; 169 | const json = JSON.stringify({ 170 | results: data, 171 | }); 172 | return new Response(json, { 173 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 174 | }); 175 | } 176 | } 177 | let data; 178 | try { 179 | data = await getAnime(anime); 180 | if (data.name == "") { 181 | throw new Error("Not found"); 182 | } 183 | data.source = "gogoanime"; 184 | } catch (err) { 185 | try { 186 | // try to get by search on gogo 187 | const search = await getSearch(anime); 188 | anime = search[0].id; 189 | data = await getAnime(anime); 190 | data.source = "gogoanime"; 191 | } catch (err) { 192 | // try to get by search on anilist 193 | const search = await getAnilistSearch(anime); 194 | anime = search["results"][0].id; 195 | data = await getAnilistAnime(anime); 196 | data.source = "anilist"; 197 | } 198 | } 199 | 200 | if (data == {}) { 201 | throw new Error("Not found"); 202 | } 203 | if (data.episodes.length != 0) { 204 | ANIME_CACHE[anime] = data; 205 | ANIME_CACHE[`time_${anime}`] = Math.floor(Date.now() / 1000); 206 | } 207 | const json = JSON.stringify({ results: data }); 208 | 209 | return new Response(json, { 210 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 211 | }); 212 | } else if (url.includes("/episode/")) { 213 | const headers = request.headers; 214 | await increaseViews(headers); 215 | 216 | const id = url.split("/episode/")[1]; 217 | const data = await getEpisode(id); 218 | const json = JSON.stringify({ results: data }); 219 | 220 | return new Response(json, { 221 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 222 | }); 223 | } else if (url.includes("/download/")) { 224 | const headers = request.headers; 225 | await increaseViews(headers); 226 | 227 | const query = url.split("/download/")[1]; 228 | const timeValue = CACHE["timeValue"]; 229 | const cookieValue = CACHE["cookieValue"]; 230 | 231 | let cookie = ""; 232 | 233 | if (timeValue != null && cookieValue != null) { 234 | const currentTimeInSeconds = Math.floor(Date.now() / 1000); 235 | const timeDiff = currentTimeInSeconds - timeValue; 236 | 237 | if (timeDiff > 10 * 60) { 238 | cookie = await getGogoAuthKey(); 239 | CACHE.cookieValue = cookie; 240 | } else { 241 | cookie = cookieValue; 242 | } 243 | } else { 244 | const currentTimeInSeconds = Math.floor(Date.now() / 1000); 245 | CACHE.timeValue = currentTimeInSeconds; 246 | cookie = await getGogoAuthKey(); 247 | CACHE.cookieValue = cookie; 248 | } 249 | 250 | const data = await GogoDLScrapper(query, cookie); 251 | 252 | const json = JSON.stringify({ results: data }); 253 | return new Response(json, { 254 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 255 | }); 256 | } else if (url.includes("/recent/")) { 257 | const headers = request.headers; 258 | await increaseViews(headers); 259 | 260 | const page = url.split("/recent/")[1]; 261 | 262 | if (RECENT_CACHE[page] != null) { 263 | const t1 = Math.floor(Date.now() / 1000); 264 | const t2 = RECENT_CACHE[`time_${page}`]; 265 | if (t1 - t2 < 5 * 60) { 266 | const json = JSON.stringify({ 267 | results: RECENT_CACHE[page], 268 | }); 269 | return new Response(json, { 270 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 271 | }); 272 | } 273 | } 274 | 275 | const data = await getRecentAnime(page); 276 | 277 | if (data.length == 0) { 278 | throw new Error("Not found"); 279 | } 280 | 281 | const json = JSON.stringify({ results: data }); 282 | RECENT_CACHE[page] = data; 283 | RECENT_CACHE[`time_${page}`] = Math.floor(Date.now() / 1000); 284 | 285 | return new Response(json, { 286 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 287 | }); 288 | } else if (url.includes("/recommendations/")) { 289 | const headers = request.headers; 290 | await increaseViews(headers); 291 | 292 | let query = url.split("/recommendations/")[1]; 293 | 294 | if (REC_CACHE[query]) { 295 | const json = JSON.stringify({ 296 | results: REC_CACHE[query], 297 | }); 298 | return new Response(json, { 299 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 300 | }); 301 | } 302 | 303 | const search = await getAnilistSearch(query); 304 | const anime = search["results"][0].id; 305 | let data = await getAnilistAnime(anime); 306 | data = data["recommendations"]; 307 | 308 | if (data.length == 0) { 309 | throw new Error("Not found"); 310 | } 311 | 312 | REC_CACHE[query] = data; 313 | const json = JSON.stringify({ results: data }); 314 | 315 | return new Response(json, { 316 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 317 | }); 318 | } else if (url.includes("/gogoPopular/")) { 319 | const headers = request.headers; 320 | await increaseViews(headers); 321 | 322 | let page = url.split("/gogoPopular/")[1]; 323 | 324 | if (GP_CACHE[page] != null) { 325 | const t1 = Math.floor(Date.now() / 1000); 326 | const t2 = GP_CACHE[`time_${page}`]; 327 | if (t1 - t2 < 10 * 60) { 328 | const json = JSON.stringify({ 329 | results: GP_CACHE[page], 330 | }); 331 | return new Response(json, { 332 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 333 | }); 334 | } 335 | } 336 | 337 | let data = await getPopularAnime(page, 20); 338 | GP_CACHE[page] = data; 339 | 340 | const json = JSON.stringify({ results: data }); 341 | 342 | return new Response(json, { 343 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 344 | }); 345 | } else if (url.includes("/upcoming/")) { 346 | const headers = request.headers; 347 | await increaseViews(headers); 348 | 349 | let page = url.split("/upcoming/")[1]; 350 | 351 | if (AT_CACHE[page] != null) { 352 | const t1 = Math.floor(Date.now() / 1000); 353 | const t2 = AT_CACHE[`time_${page}`]; 354 | if (t1 - t2 < 60 * 60) { 355 | const json = JSON.stringify({ 356 | results: AT_CACHE[page], 357 | }); 358 | return new Response(json, { 359 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 360 | }); 361 | } 362 | } 363 | 364 | let data = await getAnilistUpcoming(page); 365 | data = data["results"]; 366 | AT_CACHE[page] = data; 367 | 368 | const json = JSON.stringify({ results: data }); 369 | 370 | return new Response(json, { 371 | headers: { "Access-Control-Allow-Origin": "*", Vary: "Origin" }, 372 | }); 373 | } 374 | 375 | const text = 376 | '
The AnimeDex API provides access to a wide range of anime-related data.
For support, visit our Telegram Support Channel.
The AnimeDex API allows you to access various anime-related data, including search, anime details, episodes, downloads, recent releases, recommendations, popular anime, and upcoming releases. Data is scraped from gogoanime and anilist.
/home
- Get trending anime from Anilist and popular anime from GogoAnime/search/{query}
- Search for anime by name (query = anime name)/anime/{id}
- Get details of a specific anime (id = gogoanime anime id)/episode/{id}
- Get episode stream urls (id = gogoanime episode id)/download/{id}
- Get episode download urls (id = gogoanime episode id)/recent/{page}
- Get recent animes from gogoanime (page = 1,2,3...)/recommendations/{query}
- Get recommendations of anime from anilist (id = anime name)/gogoPopular/{page}
- Get popular animes from gogoanime (page = 1,2,3...)/upcoming/{page}
- Get upcoming animes from anilist (page = 1,2,3...)For support and questions, visit our Telegram Support Channel .