From 4ca2b623abd49a74403f0789206adc58186fa96e Mon Sep 17 00:00:00 2001 From: Luckyhv Date: Thu, 1 Feb 2024 20:03:24 +0530 Subject: [PATCH] V1.0.14 --- package-lock.json | 270 +++++++++++++++++++ package.json | 3 + src/app/anime/catalog/[[...options]]/page.js | 2 +- src/app/anime/info/[...infoid]/page.js | 2 +- src/app/anime/settings/page.js | 2 +- src/app/anime/watch/[...watchid]/page.js | 2 +- src/app/api/auth/[...nextauth]/route.js | 1 - src/app/api/episode/[...animeid]/route.js | 100 ++++--- src/app/layout.js | 7 +- src/app/page.js | 4 +- src/app/providers.js | 17 +- src/components/CardComponent/ItemContent.js | 1 + src/components/details/AnimeDetailsTop.js | 4 +- src/components/home/Herosection.js | 17 +- src/components/{ => navbar}/Navbar.js | 113 +++++++- src/components/videoplayer/VidstackPlayer.js | 3 +- src/lib/AnilistUser.js | 26 ++ src/lib/Anilistfunctions.js | 7 +- src/lib/SvgIcons.js | 6 + src/lib/anilistqueries.js | 87 ++++++ src/styles/Herosection.module.css | 1 + src/styles/Navbar.module.css | 7 +- yarn.lock | 171 +++++++++++- 23 files changed, 775 insertions(+), 78 deletions(-) rename src/components/{ => navbar}/Navbar.js (51%) create mode 100644 src/lib/AnilistUser.js diff --git a/package-lock.json b/package-lock.json index 99d7bee..dc1678d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "aniplay", "version": "0.1.0", "dependencies": { + "@auth/mongodb-adapter": "^2.2.0", "@ducanh2912/next-pwa": "^10.2.2", "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.1.1", @@ -19,6 +20,8 @@ "ioredis": "^5.3.2", "lodash": "^4.17.21", "media-icons": "^0.10.0", + "mongodb": "^6.3.0", + "mongoose": "^8.1.1", "next": "14.0.4", "next-auth": "^4.24.5", "nextjs-toploader": "^1.6.4", @@ -71,6 +74,75 @@ "node": ">=6.0.0" } }, + "node_modules/@auth/core": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.25.0.tgz", + "integrity": "sha512-UxENsD+WNlY1NOFsr3Ygc7F1Ypbia8VCd9NU8cbAhSJ0Z8dtyZ0xmssRo1G3ZW50QnW0AaAMuYzY5oumnPMQzA==", + "dependencies": { + "@panva/hkdf": "^1.1.1", + "@types/cookie": "0.6.0", + "cookie": "0.6.0", + "jose": "^5.1.3", + "oauth4webapi": "^2.4.0", + "preact": "10.11.3", + "preact-render-to-string": "5.2.3" + }, + "peerDependencies": { + "nodemailer": "^6.8.0" + }, + "peerDependenciesMeta": { + "nodemailer": { + "optional": true + } + } + }, + "node_modules/@auth/core/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@auth/core/node_modules/jose": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.0.tgz", + "integrity": "sha512-oW3PCnvyrcm1HMvGTzqjxxfnEs9EoFOFWi2HsEGhlFVOXxTE3K9GKWVMFoFw06yPUqwpvEWic1BmtUZBI/tIjw==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@auth/core/node_modules/preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/@auth/core/node_modules/preact-render-to-string": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", + "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/@auth/mongodb-adapter": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@auth/mongodb-adapter/-/mongodb-adapter-2.2.0.tgz", + "integrity": "sha512-nEr8EHtHG9iPXRc//zTvP2FycPyW73FQQBPEYXdKpd+jqZZqfDD5rDoj33tV9nlR8bRboaql4IzTz+Wo6JJ94Q==", + "dependencies": { + "@auth/core": "0.25.0" + }, + "peerDependencies": { + "mongodb": "^6" + } + }, "node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", @@ -2121,6 +2193,14 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz", + "integrity": "sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@next/env": { "version": "14.0.4", "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.4.tgz", @@ -4828,6 +4908,11 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" + }, "node_modules/@types/eslint": { "version": "8.56.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", @@ -4926,6 +5011,19 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", + "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, "node_modules/@typescript-eslint/parser": { "version": "6.17.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz", @@ -5738,6 +5836,14 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bson": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", + "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", + "engines": { + "node": ">=16.20.1" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -8236,6 +8342,14 @@ "node": ">=4.0" } }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8447,6 +8561,11 @@ "node": ">=16" } }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -8524,6 +8643,136 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mongodb": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz", + "integrity": "sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^6.2.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", + "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mongoose": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.1.1.tgz", + "integrity": "sha512-DbLb0NsiEXmaqLOpEz+AtAsgwhRw6f25gwa1dF5R7jj6lS1D8X6uTdhBSC8GDVtOwe5Tfw2EL7nTn6hiJT3Bgg==", + "dependencies": { + "bson": "^6.2.0", + "kareem": "2.5.1", + "mongodb": "6.3.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -8732,6 +8981,14 @@ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" }, + "node_modules/oauth4webapi": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.8.1.tgz", + "integrity": "sha512-Jm1Z6eUumtevQWxMllSw+4diHOcFyxuc3KAXoyh4fbpHndbXRbviyrLoCn8htEdHYZM/MIOVbeWjDk86BxVF+A==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -9964,6 +10221,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -10032,6 +10294,14 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, "node_modules/standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", diff --git a/package.json b/package.json index 6a9e9a8..551fb10 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "@auth/mongodb-adapter": "^2.2.0", "@ducanh2912/next-pwa": "^10.2.2", "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.1.1", @@ -20,6 +21,8 @@ "ioredis": "^5.3.2", "lodash": "^4.17.21", "media-icons": "^0.10.0", + "mongodb": "^6.3.0", + "mongoose": "^8.1.1", "next": "14.0.4", "next-auth": "^4.24.5", "nextjs-toploader": "^1.6.4", diff --git a/src/app/anime/catalog/[[...options]]/page.js b/src/app/anime/catalog/[[...options]]/page.js index 6f4e0b5..cdfa80b 100644 --- a/src/app/anime/catalog/[[...options]]/page.js +++ b/src/app/anime/catalog/[[...options]]/page.js @@ -1,6 +1,6 @@ import React from 'react' import Catalog from '@/components/catalogcomponent/Catalog' -import Navbarcomponent from '@/components/Navbar' +import Navbarcomponent from '@/components/navbar/Navbar' export async function generateMetadata({ params }) { return { diff --git a/src/app/anime/info/[...infoid]/page.js b/src/app/anime/info/[...infoid]/page.js index 0f789be..78d7aaf 100644 --- a/src/app/anime/info/[...infoid]/page.js +++ b/src/app/anime/info/[...infoid]/page.js @@ -4,7 +4,7 @@ import React from 'react' import AnimeDetailsTop from '@/components/details/AnimeDetailsTop' import AnimeDetailsBottom from '@/components/details/AnimeDetailsBottom' import { getEpisodes } from '@/lib/getData' -import Navbarcomponent from '@/components/Navbar' +import Navbarcomponent from '@/components/navbar/Navbar' import Animecards from '@/components/CardComponent/Animecards' // async function getData(id,status,refresh=false) { diff --git a/src/app/anime/settings/page.js b/src/app/anime/settings/page.js index 3382257..686f70c 100644 --- a/src/app/anime/settings/page.js +++ b/src/app/anime/settings/page.js @@ -1,4 +1,4 @@ -import Navbarcomponent from '@/components/Navbar' +import Navbarcomponent from '@/components/navbar/Navbar' import SettingsPage from '@/components/settingscomponent/SettingsPage' import React from 'react' diff --git a/src/app/anime/watch/[...watchid]/page.js b/src/app/anime/watch/[...watchid]/page.js index 1711058..2d637ba 100644 --- a/src/app/anime/watch/[...watchid]/page.js +++ b/src/app/anime/watch/[...watchid]/page.js @@ -4,7 +4,7 @@ import { AnimeInfoAnilist } from '@/lib/Anilistfunctions' import NextAiringDate from "@/components/videoplayer/NextAiringDate"; import PlayerAnimeCard from "@/components/videoplayer/PlayerAnimeCard"; import { getEpisodes, getSources } from "@/lib/getData"; -import Navbarcomponent from "@/components/Navbar"; +import Navbarcomponent from "@/components/navbar/Navbar"; import PlayerComponent from "@/components/videoplayer/PlayerComponent"; import Animecards from "@/components/CardComponent/Animecards"; diff --git a/src/app/api/auth/[...nextauth]/route.js b/src/app/api/auth/[...nextauth]/route.js index 241f43a..91868dd 100644 --- a/src/app/api/auth/[...nextauth]/route.js +++ b/src/app/api/auth/[...nextauth]/route.js @@ -101,7 +101,6 @@ export const authOptions = { image: profile.image, createdAt: profile?.createdAt, list: profile?.list, - version: "1.0.1", }; }, }, diff --git a/src/app/api/episode/[...animeid]/route.js b/src/app/api/episode/[...animeid]/route.js index a011e07..7f0cd89 100644 --- a/src/app/api/episode/[...animeid]/route.js +++ b/src/app/api/episode/[...animeid]/route.js @@ -84,6 +84,34 @@ async function fetchEpisodeImages(id, available = false) { } } +const fetchAndCacheData = async (id, meta, redis, cacheTime) => { + const [consumet, anify, cover] = await Promise.all([ + fetchConsumetEpisodes(id), + fetchAnifyEpisodes(id), + fetchEpisodeImages(id, meta) + ]); + + if (consumet.length > 0 || anify.length > 0) { + await redis.setex(`episode:${id}`, cacheTime, JSON.stringify([...consumet, ...anify])); + } + + const combinedData = [...consumet, ...anify]; + let data = combinedData; + + if (meta) { + data = await CombineEpisodeMeta(combinedData, JSON.parse(meta)); + } else if (cover && cover?.length > 0) { + try { + if (redis) await redis.setex(`meta:${id}`, cacheTime, JSON.stringify(cover)); + data = await CombineEpisodeMeta(combinedData, cover); + } catch (error) { + console.error("Error serializing cover:", error.message); + } + } + + return data; +}; + export const GET = async (req, { params }) => { const url = new URL(req.url); const id = params.animeid[0]; @@ -92,56 +120,54 @@ export const GET = async (req, { params }) => { let cacheTime = null; if (releasing === "true") { - cacheTime = 60 * 60 * 2; + cacheTime = 60 * 60 * 3; } else if (releasing === "false") { - cacheTime = 60 * 60 * 24 * 30; + cacheTime = 60 * 60 * 24 * 45; } let meta = null; let cached; - if(redis){ - if (refresh) { - await redis.del(`episode:${id}`); - // await redis.flushall(); - console.log("deleted cache"); - } else { + if (redis) { + try { + meta = await redis.get(`meta:${id}`); + if(JSON.parse(meta)?.length === 0){ + await redis.del(`meta:${id}`); + console.log("deleted meta cache"); + meta = null; + } cached = await redis.get(`episode:${id}`); + if (JSON.parse(cached)?.length === 0) { + await redis.del(`episode:${id}`); + cached = null; + } + let data; + if (refresh) { + data = await fetchAndCacheData(id, meta, redis, cacheTime); + } + if(data?.length > 0){ + console.log("deleted cache"); + return NextResponse.json(data); + } + console.log("using redis"); + } catch (error) { + console.error("Error checking Redis cache:", error.message); } - meta = await redis.get(`meta:${id}`); } if (cached) { - let cachedData = JSON.parse(cached); - if (meta) { - cachedData = await CombineEpisodeMeta(cachedData, JSON.parse(meta)); - } - return NextResponse.json(cachedData); - } else { - - const [consumet, anify, cover] = await Promise.all([ - fetchConsumetEpisodes(id), - fetchAnifyEpisodes(id), - fetchEpisodeImages(id, meta) - ]); - - await redis.setex(`episode:${id}`, cacheTime, JSON.stringify([...consumet, ...anify])); - const combinedData = [...consumet, ...anify]; - let data = combinedData; - + try { + let cachedData = JSON.parse(cached); if (meta) { - data = await CombineEpisodeMeta(combinedData, JSON.parse(meta)); - } else if (cover && cover?.length > 0) { - try { - if (redis) await redis.set(`meta:${id}`, JSON.stringify(cover)); - data = await CombineEpisodeMeta(combinedData, cover); - } catch (error) { - console.error("Error serializing cover:", error.message); - } + cachedData = await CombineEpisodeMeta(cachedData, JSON.parse(meta)); } - - - return NextResponse.json(data); + return NextResponse.json(cachedData); + } catch (error) { + console.error("Error parsing cached data:", error.message); + } + } else { + const fetchdata = await fetchAndCacheData(id, meta, redis, cacheTime); + return NextResponse.json(fetchdata); } }; diff --git a/src/app/layout.js b/src/app/layout.js index 785bb82..ba5665c 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -7,6 +7,7 @@ import GoToTop from '@/components/GoToTop'; import localFont from 'next/font/local'; import Footer from '@/components/Footer'; import Script from "next/script"; +import { getServerSession } from 'next-auth'; const inter = Inter({ subsets: ['latin'] }) const myfont = localFont({ src: "../static-fonts/28 Days Later.ttf" }) @@ -67,7 +68,9 @@ export const metadata = { }; -export default function RootLayout({ children }) { +export default async function RootLayout({ children }) { + const session = await getServerSession(); + return ( - + {children} diff --git a/src/app/page.js b/src/app/page.js index 7690875..0d7a42a 100644 --- a/src/app/page.js +++ b/src/app/page.js @@ -1,6 +1,7 @@ +"use server" import Animecard from '@/components/CardComponent/Animecards' import Herosection from '@/components/home/Herosection' -import Navbarcomponent from '@/components/Navbar' +import Navbarcomponent from '@/components/navbar/Navbar' import { TrendingAnilist, Top100Anilist, SeasonalAnilist } from '@/lib/Anilistfunctions' import React from 'react' import { MotionDiv } from '@/utils/MotionDiv' @@ -9,7 +10,6 @@ import ContinueWatching from '@/components/home/ContinueWatching' import RecentEpisodes from '@/components/home/RecentEpisodes' import FloatingButton from '@/components/FloatingButton' -export const revalidate = 1 async function Home() { const herodata = await TrendingAnilist(); diff --git a/src/app/providers.js b/src/app/providers.js index d8aba97..9bad4c6 100644 --- a/src/app/providers.js +++ b/src/app/providers.js @@ -3,13 +3,24 @@ import { NextUIProvider } from '@nextui-org/react' import { DataProvider } from '@/context/DataContext' import { SessionProvider } from "next-auth/react"; +import { MotionDiv } from '@/utils/MotionDiv'; +import { usePathname } from 'next/navigation' + +export function Providers({ children, session }) { + const pathname = usePathname() -export function Providers({ children }) { return ( - + - {children} + + {children} + diff --git a/src/components/CardComponent/ItemContent.js b/src/components/CardComponent/ItemContent.js index caa4c5d..573c560 100644 --- a/src/components/CardComponent/ItemContent.js +++ b/src/components/CardComponent/ItemContent.js @@ -30,6 +30,7 @@ function ItemContent({ anime, cardid }) { width={155} height={230} placeholder="blur" + loading='eager' blurDataURL={'https://wallpapercave.com/w/wp11913677' || anime.coverImage || anime.image} className={`${styles.cardimage}`} onLoad={() => setImageLoaded(true)} diff --git a/src/components/details/AnimeDetailsTop.js b/src/components/details/AnimeDetailsTop.js index 2540aa2..0332688 100644 --- a/src/components/details/AnimeDetailsTop.js +++ b/src/components/details/AnimeDetailsTop.js @@ -23,7 +23,7 @@ function AnimeDetailsTop({ data }) {
<> @@ -51,7 +51,7 @@ function AnimeDetailsTop({ data }) {
- Image + Image

diff --git a/src/components/home/Herosection.js b/src/components/home/Herosection.js index cd87ca7..080ed1c 100644 --- a/src/components/home/Herosection.js +++ b/src/components/home/Herosection.js @@ -4,6 +4,7 @@ import React, { useEffect, useState } from 'react'; import styles from '../../styles/Herosection.module.css'; import { ContextSearch } from '@/context/DataContext'; import Link from 'next/link' +import Image from 'next/image' function Herosection({ data }) { const [trailer, setTrailer] = useState(null); @@ -12,12 +13,12 @@ function Herosection({ data }) { const [settings, setSettings] = useState({}); const { animetitle } = ContextSearch(); - useEffect(()=>{ + useEffect(() => { const localStorageValue = localStorage.getItem('settings'); - if(localStorageValue){ + if (localStorageValue) { setSettings(JSON.parse(localStorageValue)); } - },[]) + }, []) useEffect(() => { const getPopular = () => { @@ -61,7 +62,7 @@ function Herosection({ data }) { setVideoEnded(true); }; - const Month = ["Jan","Feb","Mar","Apr","May","Jun","July","Aug","Sep","Oct","Nov","Dec"] + const Month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "July", "Aug", "Sep", "Oct", "Nov", "Dec"] return (
@@ -80,7 +81,9 @@ function Herosection({ data }) { ) : ( - {populardata?.title[animetitle]} + {populardata && + {populardata?.title?.[animetitle] + } )}
@@ -90,12 +93,12 @@ function Herosection({ data }) { {populardata?.format} {populardata?.status} {Month[populardata?.startDate?.month]} {populardata?.startDate?.day}, {populardata?.startDate?.year} - {populardata?.nextAiringEpisode?.episode-1 || populardata?.episodes} + {populardata?.nextAiringEpisode?.episode - 1 || populardata?.episodes}

{populardata?.description.replace(/<.*?>/g, '')}

- +
diff --git a/src/components/Navbar.js b/src/components/navbar/Navbar.js similarity index 51% rename from src/components/Navbar.js rename to src/components/navbar/Navbar.js index 5f09ed7..8599a8c 100644 --- a/src/components/Navbar.js +++ b/src/components/navbar/Navbar.js @@ -1,18 +1,20 @@ "use client" import React, { useEffect, useState } from 'react'; -import { DropdownItem, DropdownTrigger, Dropdown, DropdownMenu, Avatar, Switch } from "@nextui-org/react"; +import { DropdownItem, DropdownTrigger, Dropdown, DropdownMenu, DropdownSection, Avatar, Badge } from "@nextui-org/react"; import Link from "next/link" import { ContextSearch } from '@/context/DataContext'; -import styles from '../styles/Navbar.module.css' +import styles from '../../styles/Navbar.module.css' import { useSession, signIn, signOut } from 'next-auth/react'; -import { FeedbackIcon, LoginIcon, LogoutIcon, SettingsIcon, ProfileIcon } from '@/lib/SvgIcons'; +import { FeedbackIcon, LoginIcon, LogoutIcon, SettingsIcon, ProfileIcon, NotificationIcon } from '@/lib/SvgIcons'; +import { Usernotifications } from '@/lib/AnilistUser'; function Navbarcomponent({ home = false }) { const iconClasses = "w-5 h-5 text-xl text-default-500 pointer-events-none flex-shrink-0"; const [isLoggedIn, setIsLoggedIn] = useState(false); const [isScrolled, setIsScrolled] = useState(false); - const { Isopen, setIsopen } = ContextSearch(); + const { Isopen, setIsopen, animetitle } = ContextSearch(); const { data, status } = useSession(); + const [notifications, setNotifications] = useState([]); useEffect(() => { if (status === 'authenticated') { @@ -23,6 +25,48 @@ function Navbarcomponent({ home = false }) { } }, [status]) + console.log(data) + + useEffect(() => { + const fetchNotifications = async () => { + try { + if (status === 'authenticated' && data?.user?.token) { + const response = await Usernotifications(data.user.token); + const currentTimestamp = Math.floor(Date.now() / 1000); + + const filteredNotifications = response.notifications.filter(notification => { + const createdAtTimestamp = notification.createdAt; + const timeDifference = currentTimestamp - createdAtTimestamp; + const oneDayInSeconds = 24 * 60 * 60 * 20; + return timeDifference <= oneDayInSeconds; + }); + setNotifications(filteredNotifications); + } + } catch (error) { + console.error('Error fetching notifications:', error); + } + }; + fetchNotifications(); + }, [status, data]); + + function NotificationTime(createdAt) { + const currentTimestamp = Math.floor(Date.now() / 1000); + const timeDifference = currentTimestamp - createdAt; + let formattedRelativeTime = ''; + + if (timeDifference < 60) { + formattedRelativeTime = `${timeDifference} sec ago`; + } else if (timeDifference < 60 * 60) { + const minutes = Math.floor(timeDifference / 60); + formattedRelativeTime = `${minutes} min${minutes > 1 ? 's' : ''} ago`; + } else if (timeDifference < 24 * 60 * 60) { + const hours = Math.floor(timeDifference / (60 * 60)); + formattedRelativeTime = `${hours} hr${hours > 1 ? 's' : ''} ago`; + } + + return formattedRelativeTime; + } + useEffect(() => { const handleKeyDown = (e) => { if (e.code === 'KeyS' && e.ctrlKey) { @@ -95,13 +139,60 @@ function Navbarcomponent({ home = false }) { > +
+ {isLoggedIn && ( + + +
+ + + +
+
+ + + {notifications?.length > 0 ? notifications?.slice(0, 3).map((item) => { + const { contexts, media, episode, createdAt } = item; + return ( + +
+

+ {((media?.title?.[animetitle] || media?.title?.romaji) || '').slice(0, 24)} + {((media?.title?.[animetitle] || media?.title?.romaji) || '').length > 24 && '...'} +

+ {NotificationTime(createdAt)} +
+
+ ) + }) : ( + + No New Notifications + + )} +
+
+
+ )} +
Signed in as

{data?.user?.name}

- }>Profile - }>Help & Feedback - }> + }>Profile + }>Help & Feedback + }> Settings }> @@ -125,11 +216,11 @@ function Navbarcomponent({ home = false }) { ) : ( - }> + }> - }>Help & Feedback - }> + }>Help & Feedback + }> Settings diff --git a/src/components/videoplayer/VidstackPlayer.js b/src/components/videoplayer/VidstackPlayer.js index b09ded6..75e307b 100644 --- a/src/components/videoplayer/VidstackPlayer.js +++ b/src/components/videoplayer/VidstackPlayer.js @@ -181,7 +181,6 @@ function VidstackPlayer({ data, sources, skiptimes, epid, thumbnails, subtitles, Object.assign(playerRef.current ?? {}, { currentTime: skiptimes[1]?.endTime ?? 0 }); } - console.log(settings.load) return ( {opbutton && } {edbutton && } - + ) } diff --git a/src/lib/AnilistUser.js b/src/lib/AnilistUser.js new file mode 100644 index 0000000..9f75d50 --- /dev/null +++ b/src/lib/AnilistUser.js @@ -0,0 +1,26 @@ +import { notifications } from "./anilistqueries"; + +export const Usernotifications = async (token, currentPage=1) => { + try { + const response = await fetch('https://graphql.anilist.co', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + Authorization: "Bearer " + token, + }, + body: JSON.stringify({ + query: notifications, + variables: { + page: currentPage, + perPage: 15, + }, + }), + }, { next: { revalidate: 0 } }); + + const data = await response.json(); + return data.data.Page; + } catch (error) { + console.error('Error fetching notifications from AniList:', error); + } +} \ No newline at end of file diff --git a/src/lib/Anilistfunctions.js b/src/lib/Anilistfunctions.js index 10cfd9b..9fff9f6 100644 --- a/src/lib/Anilistfunctions.js +++ b/src/lib/Anilistfunctions.js @@ -15,7 +15,8 @@ export const TrendingAnilist = async () => { perPage: 15, }, }), - }, { cache: "no-store" }); + // }, { cache: "no-store" }); + }, { next: { revalidate: 3600 } }); const data = await response.json(); return data.data.Page.media; @@ -39,7 +40,7 @@ export const Top100Anilist = async () => { perPage: 10, }, }), - }, { next: { revalidate: 0 } }); + }, { next: { revalidate: 3600 } }); const data = await response.json(); return data.data.Page.media; @@ -63,7 +64,7 @@ export const SeasonalAnilist = async () => { perPage: 10, }, }), - }, { next: { revalidate: 0 } }); + }, { next: { revalidate: 3600 } }); const data = await response.json(); return data.data.Page.media; diff --git a/src/lib/SvgIcons.js b/src/lib/SvgIcons.js index e82d891..f759153 100644 --- a/src/lib/SvgIcons.js +++ b/src/lib/SvgIcons.js @@ -23,4 +23,10 @@ export const ProfileIcon = (props) => ( +) + +export const NotificationIcon = (props) => ( + + + ) \ No newline at end of file diff --git a/src/lib/anilistqueries.js b/src/lib/anilistqueries.js index 3b5002d..533897b 100644 --- a/src/lib/anilistqueries.js +++ b/src/lib/anilistqueries.js @@ -353,3 +353,90 @@ query ($page: Int = 1, $id: Int, $type: MediaType, $search: String, $format: [Me } } }`; + + +export const notifications = `query ($page: Int) { + Page(page: $page, perPage: 15) { + pageInfo { + total + perPage + currentPage + lastPage + hasNextPage + } + notifications(resetNotificationCount: true) { + ... on AiringNotification { + id + type + animeId + episode + contexts + createdAt + media: media { + id + title { + english + romaji + } + type + coverImage { large, extraLarge } + } + } + ... on RelatedMediaAdditionNotification { + id + type + mediaId + context + createdAt + media: media { + id + title { + english + romaji + } + type + coverImage { large, extraLarge } + } + } + ... on MediaDataChangeNotification { + id + type + mediaId + context + createdAt + media: media { + id + title { + english + romaji + } + type + coverImage { large, extraLarge } + } + } + ... on MediaMergeNotification { + id + type + mediaId + context + createdAt + media: media { + id + title { + english + romaji + } + type + coverImage { large, extraLarge } + } + } + ... on MediaDeletionNotification { + id + type + context + createdAt + deletedMediaTitle + } + } + } +}` diff --git a/src/styles/Herosection.module.css b/src/styles/Herosection.module.css index 4431b3f..f87139a 100644 --- a/src/styles/Herosection.module.css +++ b/src/styles/Herosection.module.css @@ -22,6 +22,7 @@ .heroimg { overflow: hidden; + width: 100%; height: 100%; object-fit: cover; } diff --git a/src/styles/Navbar.module.css b/src/styles/Navbar.module.css index 1dc3a23..2f4b713 100644 --- a/src/styles/Navbar.module.css +++ b/src/styles/Navbar.module.css @@ -80,7 +80,9 @@ .navright { display: flex; - gap: 20px; + gap: 14px; + align-items: center; + /* border: 1px solid white; */ } @media(max-width:1280px){ @@ -93,6 +95,9 @@ .navItemsContainer { display: none; } + .navright{ + gap: 10px; + } } .toggle{ diff --git a/yarn.lock b/yarn.lock index 9daf3ca..4ba9e67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,6 +29,26 @@ jsonpointer "^5.0.0" leven "^3.1.0" +"@auth/core@0.25.0": + version "0.25.0" + resolved "https://registry.npmjs.org/@auth/core/-/core-0.25.0.tgz" + integrity sha512-UxENsD+WNlY1NOFsr3Ygc7F1Ypbia8VCd9NU8cbAhSJ0Z8dtyZ0xmssRo1G3ZW50QnW0AaAMuYzY5oumnPMQzA== + dependencies: + "@panva/hkdf" "^1.1.1" + "@types/cookie" "0.6.0" + cookie "0.6.0" + jose "^5.1.3" + oauth4webapi "^2.4.0" + preact "10.11.3" + preact-render-to-string "5.2.3" + +"@auth/mongodb-adapter@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@auth/mongodb-adapter/-/mongodb-adapter-2.2.0.tgz" + integrity sha512-nEr8EHtHG9iPXRc//zTvP2FycPyW73FQQBPEYXdKpd+jqZZqfDD5rDoj33tV9nlR8bRboaql4IzTz+Wo6JJ94Q== + dependencies: + "@auth/core" "0.25.0" + "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": version "7.23.5" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz" @@ -1186,6 +1206,13 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@mongodb-js/saslprep@^1.1.0": + version "1.1.4" + resolved "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz" + integrity sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw== + dependencies: + sparse-bitfield "^3.0.3" + "@next/env@14.0.4": version "14.0.4" resolved "https://registry.npmjs.org/@next/env/-/env-14.0.4.tgz" @@ -2058,7 +2085,7 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@panva/hkdf@^1.0.2": +"@panva/hkdf@^1.0.2", "@panva/hkdf@^1.1.1": version "1.1.1" resolved "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz" integrity sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA== @@ -2884,6 +2911,11 @@ dependencies: tslib "^2.4.0" +"@types/cookie@0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + "@types/eslint-scope@^3.7.3": version "3.7.7" resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" @@ -2976,6 +3008,18 @@ resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== +"@types/webidl-conversions@*": + version "7.0.3" + resolved "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz" + integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== + +"@types/whatwg-url@^11.0.2": + version "11.0.4" + resolved "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz" + integrity sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw== + dependencies: + "@types/webidl-conversions" "*" + "@typescript-eslint/parser@^5.4.2 || ^6.0.0": version "6.17.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz" @@ -3486,6 +3530,11 @@ browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.22.2, "browserslist node-releases "^2.0.14" update-browserslist-db "^1.0.13" +bson@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz" + integrity sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" @@ -3683,6 +3732,11 @@ cookie@^0.5.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + core-js-compat@^3.31.0, core-js-compat@^3.33.1: version "3.35.1" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz" @@ -3726,7 +3780,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4.x: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4915,6 +4969,11 @@ jose@^4.11.4, jose@^4.15.4: resolved "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz" integrity sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ== +jose@^5.1.3: + version "5.2.0" + resolved "https://registry.npmjs.org/jose/-/jose-5.2.0.tgz" + integrity sha512-oW3PCnvyrcm1HMvGTzqjxxfnEs9EoFOFWi2HsEGhlFVOXxTE3K9GKWVMFoFw06yPUqwpvEWic1BmtUZBI/tIjw== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" @@ -5008,6 +5067,11 @@ jsonpointer@^5.0.0: object.assign "^4.1.4" object.values "^1.1.6" +kareem@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz" + integrity sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA== + keyv@^4.5.3: version "4.5.4" resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" @@ -5172,6 +5236,11 @@ media-icons@^0.10.0: resolved "https://registry.npmjs.org/media-icons/-/media-icons-0.10.0.tgz" integrity sha512-M9loX7KUWsID3T8pRSN6/+MNKPEm9dNteqJk7yfo9ZaAIEYzEd07jWTVRlRmgVMKoAh1kY7funD6Qe1prrTJMQ== +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" @@ -5240,6 +5309,48 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +mongodb-connection-string-url@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz" + integrity sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ== + dependencies: + "@types/whatwg-url" "^11.0.2" + whatwg-url "^13.0.0" + +mongodb@^6, mongodb@^6.3.0, mongodb@6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz" + integrity sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA== + dependencies: + "@mongodb-js/saslprep" "^1.1.0" + bson "^6.2.0" + mongodb-connection-string-url "^3.0.0" + +mongoose@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/mongoose/-/mongoose-8.1.1.tgz" + integrity sha512-DbLb0NsiEXmaqLOpEz+AtAsgwhRw6f25gwa1dF5R7jj6lS1D8X6uTdhBSC8GDVtOwe5Tfw2EL7nTn6hiJT3Bgg== + dependencies: + bson "^6.2.0" + kareem "2.5.1" + mongodb "6.3.0" + mpath "0.9.0" + mquery "5.0.0" + ms "2.1.3" + sift "16.0.1" + +mpath@0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz" + integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== + +mquery@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz" + integrity sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg== + dependencies: + debug "4.x" + ms@^2.1.1: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -5250,6 +5361,11 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mz@^2.7.0: version "2.7.0" resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" @@ -5347,6 +5463,11 @@ oauth@^0.9.15: resolved "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz" integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA== +oauth4webapi@^2.4.0: + version "2.8.1" + resolved "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.8.1.tgz" + integrity sha512-Jm1Z6eUumtevQWxMllSw+4diHOcFyxuc3KAXoyh4fbpHndbXRbviyrLoCn8htEdHYZM/MIOVbeWjDk86BxVF+A== + object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -5636,11 +5757,23 @@ preact-render-to-string@^5.1.19: dependencies: pretty-format "^3.8.0" +preact-render-to-string@5.2.3: + version "5.2.3" + resolved "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz" + integrity sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA== + dependencies: + pretty-format "^3.8.0" + preact@^10.6.3, preact@>=10: version "10.19.3" resolved "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz" integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ== +preact@10.11.3: + version "10.11.3" + resolved "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz" + integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -5670,7 +5803,7 @@ proxy-from-env@^1.1.0: resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.3.0: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -6057,6 +6190,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +sift@16.0.1: + version "16.0.1" + resolved "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz" + integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== + signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" @@ -6109,6 +6247,13 @@ sourcemap-codec@^1.4.8: resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz" + integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== + dependencies: + memory-pager "^1.0.2" + standard-as-callback@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz" @@ -6398,6 +6543,13 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + ts-api-utils@^1.0.1: version "1.0.3" resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz" @@ -6609,6 +6761,11 @@ webidl-conversions@^4.0.2: resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + webpack-sources@^1.4.3: version "1.4.3" resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" @@ -6652,6 +6809,14 @@ webpack-sources@^3.2.3: watchpack "^2.4.0" webpack-sources "^3.2.3" +whatwg-url@^13.0.0: + version "13.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz" + integrity sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz"