From 6b10aa8926851139e67c0c5090805cad5e221b6e Mon Sep 17 00:00:00 2001 From: glax <johanna@bernloehr.eu> Date: Tue, 1 Apr 2025 04:13:50 +0200 Subject: [PATCH] @mui/joy --- README.md | 2 +- Website/App.tsx | 3 +- .../IAuthor.tsx => Elements/Author.tsx} | 10 +- .../IChapter.tsx => Elements/Chapter.tsx} | 32 +- .../IGotifyRecord.tsx => Elements/Gotify.tsx} | 36 +- .../ILink.tsx => Elements/Link.tsx} | 9 +- .../LocalLibrary.tsx} | 17 +- .../Lunasea.tsx} | 22 +- .../IManga.tsx => Elements/Manga.tsx} | 53 +- .../MangaAltTitle.tsx} | 10 +- .../NotificationConnector.tsx} | 23 +- .../INtfyRecord.tsx => Elements/Ntfy.tsx} | 62 +- .../Pushover.tsx} | 30 +- Website/modules/Footer.tsx | 12 +- Website/modules/Header.tsx | 2 +- Website/modules/MonitorJobsList.tsx | 14 +- Website/modules/QueuePopUp.tsx | 12 +- Website/modules/Search.tsx | 21 +- Website/modules/Settings.tsx | 44 +- .../BackendSettings.tsx} | 11 +- .../{ChapterFunctions.tsx => api/Chapter.tsx} | 8 +- .../FrontendSettings.tsx} | 6 +- .../modules/{JobFunctions.tsx => api/Job.tsx} | 28 +- .../LocalLibrary.tsx} | 8 +- .../{MangaFunctions.tsx => api/Manga.tsx} | 30 +- .../MangaConnector.tsx} | 6 +- .../NotificationConnector.tsx} | 14 +- .../{SearchFunctions.tsx => api/Search.tsx} | 4 +- Website/modules/interfaces/IRequestLimits.ts | 17 - Website/modules/types/EnumLibraryType.ts | 4 + .../modules/types/EnumMangaReleaseStatus.ts | 7 + Website/modules/types/EnumRequestLimitType.ts | 8 + Website/modules/types/IAuthor.ts | 4 + .../IBackendSettings.ts} | 0 Website/modules/types/IChapter.ts | 10 + Website/modules/types/IFrontendSettings.ts | 4 + .../ILibraryConnector.ts | 7 +- Website/modules/types/ILink.ts | 5 + Website/modules/types/ILocalLibrary.ts | 5 + Website/modules/types/IManga.ts | 19 + Website/modules/types/IMangaAltTitle.ts | 5 + .../{interfaces => types}/IMangaConnector.ts | 0 .../modules/types/INotificationConnector.ts | 7 + Website/modules/types/IRequestLimits.ts | 8 + .../Jobs/IDownloadAvailableChaptersJob.ts | 0 .../Jobs/IDownloadMangaCoverJob.ts | 0 .../Jobs/IDownloadSingleChapterJob.ts | 0 .../{interfaces => types}/Jobs/IJob.ts | 0 .../Jobs/IMoveFileOrFolderJob.ts | 0 .../Jobs/IMoveMangaLibraryJob.ts | 0 .../Jobs/IRetrieveChaptersJob.ts | 0 .../Jobs/IUpdateFilesDownloadedJob.ts | 0 .../Jobs/IUpdateMetadataJob.ts | 0 .../records/IDownloadAvailableJobsRecord.ts | 0 .../modules/types/records/IGotifyRecord.ts | 8 + .../modules/types/records/ILunaseaRecord.ts | 8 + .../records/IModifyJobRecord.ts | 0 .../records/INewLibraryRecord.ts | 0 Website/modules/types/records/INtfyRecord.ts | 9 + .../modules/types/records/IPushoverRecord.tsx | 6 + tranga-website/.gitignore | 24 + tranga-website/README.md | 54 + tranga-website/eslint.config.js | 28 + tranga-website/index.html | 13 + tranga-website/package-lock.json | 4225 +++++++++++++++++ tranga-website/package.json | 34 + tranga-website/public/blahaj.png | Bin 0 -> 126603 bytes tranga-website/src/App.css | 15 + tranga-website/src/App.tsx | 31 + tranga-website/src/Components/AuthorTag.tsx | 23 + tranga-website/src/Components/LinkTag.tsx | 25 + tranga-website/src/Components/Manga.tsx | 132 + tranga-website/src/Components/Search.tsx | 142 + tranga-website/src/Header.css | 10 + tranga-website/src/Header.tsx | 20 + .../src/Settings.css | 0 tranga-website/src/Settings.tsx | 93 + tranga-website/src/api/BackendSettings.tsx | 80 + tranga-website/src/api/Chapter.tsx | 8 + tranga-website/src/api/Job.tsx | 97 + tranga-website/src/api/LocalLibrary.tsx | 31 + tranga-website/src/api/Manga.tsx | 77 + tranga-website/src/api/MangaConnector.tsx | 22 + .../src/api/NotificationConnector.tsx | 52 + tranga-website/src/api/Query.tsx | 15 + tranga-website/src/api/Search.tsx | 22 + tranga-website/src/api/fetchApi.tsx | 80 + .../src/api/types/EnumLibraryType.ts | 4 + .../src/api/types/EnumMangaReleaseStatus.ts | 24 + .../src/api/types/EnumRequestLimitType.ts | 8 + tranga-website/src/api/types/IAuthor.ts | 4 + .../src/api/types/IBackendSettings.ts | 18 + tranga-website/src/api/types/IChapter.ts | 10 + .../src/api/types/IFrontendSettings.ts | 4 + .../src/api/types/ILibraryConnector.ts | 8 + tranga-website/src/api/types/ILink.ts | 5 + tranga-website/src/api/types/ILocalLibrary.ts | 5 + tranga-website/src/api/types/IManga.ts | 37 + .../src/api/types/IMangaAltTitle.ts | 5 + .../src/api/types/IMangaConnector.ts | 7 + .../src/api/types/INotificationConnector.ts | 7 + .../src/api/types/IRequestLimits.ts | 8 + .../Jobs/IDownloadAvailableChaptersJob.ts | 5 + .../api/types/Jobs/IDownloadMangaCoverJob.ts | 5 + .../types/Jobs/IDownloadSingleChapterJob.ts | 5 + tranga-website/src/api/types/Jobs/IJob.ts | 29 + .../api/types/Jobs/IMoveFileOrFolderJob.ts | 6 + .../api/types/Jobs/IMoveMangaLibraryJob.ts | 6 + .../api/types/Jobs/IRetrieveChaptersJob.ts | 5 + .../types/Jobs/IUpdateFilesDownloadedJob.ts | 5 + .../src/api/types/Jobs/IUpdateMetadataJob.ts | 5 + .../records/IDownloadAvailableJobsRecord.ts | 4 + .../src/api/types/records/IGotifyRecord.ts | 7 + .../src/api/types/records/ILunaseaRecord.ts | 5 + .../src/api/types/records/IModifyJobRecord.ts | 4 + .../api/types/records/INewLibraryRecord.ts | 12 + .../src/api/types/records/INtfyRecord.ts | 9 + .../src/api/types/records/IPushoverRecord.ts | 6 + tranga-website/src/index.css | 0 tranga-website/src/main.tsx | 28 + tranga-website/src/vite-env.d.ts | 1 + tranga-website/tsconfig.app.json | 26 + tranga-website/tsconfig.json | 7 + tranga-website/tsconfig.node.json | 24 + tranga-website/vite.config.ts | 7 + 125 files changed, 6059 insertions(+), 329 deletions(-) rename Website/modules/{interfaces/IAuthor.tsx => Elements/Author.tsx} (64%) rename Website/modules/{interfaces/IChapter.tsx => Elements/Chapter.tsx} (64%) rename Website/modules/{interfaces/records/IGotifyRecord.tsx => Elements/Gotify.tsx} (83%) rename Website/modules/{interfaces/ILink.tsx => Elements/Link.tsx} (71%) rename Website/modules/{interfaces/ILocalLibrary.tsx => Elements/LocalLibrary.tsx} (76%) rename Website/modules/{interfaces/records/ILunaseaRecord.tsx => Elements/Lunasea.tsx} (80%) rename Website/modules/{interfaces/IManga.tsx => Elements/Manga.tsx} (75%) rename Website/modules/{interfaces/IMangaAltTitle.tsx => Elements/MangaAltTitle.tsx} (67%) rename Website/modules/{interfaces/INotificationConnector.tsx => Elements/NotificationConnector.tsx} (88%) rename Website/modules/{interfaces/records/INtfyRecord.tsx => Elements/Ntfy.tsx} (71%) rename Website/modules/{interfaces/records/IPushoverRecord.tsx => Elements/Pushover.tsx} (79%) rename Website/modules/{BackendSettingsFunctions.tsx => api/BackendSettings.tsx} (90%) rename Website/modules/{ChapterFunctions.tsx => api/Chapter.tsx} (73%) rename Website/modules/{interfaces/IFrontendSettings.tsx => api/FrontendSettings.tsx} (84%) rename Website/modules/{JobFunctions.tsx => api/Job.tsx} (89%) rename Website/modules/{LocalLibraryFunctions.tsx => api/LocalLibrary.tsx} (89%) rename Website/modules/{MangaFunctions.tsx => api/Manga.tsx} (86%) rename Website/modules/{MangaConnectorFunctions.tsx => api/MangaConnector.tsx} (92%) rename Website/modules/{NotificationConnectorFunctions.tsx => api/NotificationConnector.tsx} (91%) rename Website/modules/{SearchFunctions.tsx => api/Search.tsx} (95%) delete mode 100644 Website/modules/interfaces/IRequestLimits.ts create mode 100644 Website/modules/types/EnumLibraryType.ts create mode 100644 Website/modules/types/EnumMangaReleaseStatus.ts create mode 100644 Website/modules/types/EnumRequestLimitType.ts create mode 100644 Website/modules/types/IAuthor.ts rename Website/modules/{interfaces/IBackendSettings.tsx => types/IBackendSettings.ts} (100%) create mode 100644 Website/modules/types/IChapter.ts create mode 100644 Website/modules/types/IFrontendSettings.ts rename Website/modules/{interfaces => types}/ILibraryConnector.ts (67%) create mode 100644 Website/modules/types/ILink.ts create mode 100644 Website/modules/types/ILocalLibrary.ts create mode 100644 Website/modules/types/IManga.ts create mode 100644 Website/modules/types/IMangaAltTitle.ts rename Website/modules/{interfaces => types}/IMangaConnector.ts (100%) create mode 100644 Website/modules/types/INotificationConnector.ts create mode 100644 Website/modules/types/IRequestLimits.ts rename Website/modules/{interfaces => types}/Jobs/IDownloadAvailableChaptersJob.ts (100%) rename Website/modules/{interfaces => types}/Jobs/IDownloadMangaCoverJob.ts (100%) rename Website/modules/{interfaces => types}/Jobs/IDownloadSingleChapterJob.ts (100%) rename Website/modules/{interfaces => types}/Jobs/IJob.ts (100%) rename Website/modules/{interfaces => types}/Jobs/IMoveFileOrFolderJob.ts (100%) rename Website/modules/{interfaces => types}/Jobs/IMoveMangaLibraryJob.ts (100%) rename Website/modules/{interfaces => types}/Jobs/IRetrieveChaptersJob.ts (100%) rename Website/modules/{interfaces => types}/Jobs/IUpdateFilesDownloadedJob.ts (100%) rename Website/modules/{interfaces => types}/Jobs/IUpdateMetadataJob.ts (100%) rename Website/modules/{interfaces => types}/records/IDownloadAvailableJobsRecord.ts (100%) create mode 100644 Website/modules/types/records/IGotifyRecord.ts create mode 100644 Website/modules/types/records/ILunaseaRecord.ts rename Website/modules/{interfaces => types}/records/IModifyJobRecord.ts (100%) rename Website/modules/{interfaces => types}/records/INewLibraryRecord.ts (100%) create mode 100644 Website/modules/types/records/INtfyRecord.ts create mode 100644 Website/modules/types/records/IPushoverRecord.tsx create mode 100644 tranga-website/.gitignore create mode 100644 tranga-website/README.md create mode 100644 tranga-website/eslint.config.js create mode 100644 tranga-website/index.html create mode 100644 tranga-website/package-lock.json create mode 100644 tranga-website/package.json create mode 100644 tranga-website/public/blahaj.png create mode 100644 tranga-website/src/App.css create mode 100644 tranga-website/src/App.tsx create mode 100644 tranga-website/src/Components/AuthorTag.tsx create mode 100644 tranga-website/src/Components/LinkTag.tsx create mode 100644 tranga-website/src/Components/Manga.tsx create mode 100644 tranga-website/src/Components/Search.tsx create mode 100644 tranga-website/src/Header.css create mode 100644 tranga-website/src/Header.tsx rename Website/modules/LibraryConnector.tsx => tranga-website/src/Settings.css (100%) create mode 100644 tranga-website/src/Settings.tsx create mode 100644 tranga-website/src/api/BackendSettings.tsx create mode 100644 tranga-website/src/api/Chapter.tsx create mode 100644 tranga-website/src/api/Job.tsx create mode 100644 tranga-website/src/api/LocalLibrary.tsx create mode 100644 tranga-website/src/api/Manga.tsx create mode 100644 tranga-website/src/api/MangaConnector.tsx create mode 100644 tranga-website/src/api/NotificationConnector.tsx create mode 100644 tranga-website/src/api/Query.tsx create mode 100644 tranga-website/src/api/Search.tsx create mode 100644 tranga-website/src/api/fetchApi.tsx create mode 100644 tranga-website/src/api/types/EnumLibraryType.ts create mode 100644 tranga-website/src/api/types/EnumMangaReleaseStatus.ts create mode 100644 tranga-website/src/api/types/EnumRequestLimitType.ts create mode 100644 tranga-website/src/api/types/IAuthor.ts create mode 100644 tranga-website/src/api/types/IBackendSettings.ts create mode 100644 tranga-website/src/api/types/IChapter.ts create mode 100644 tranga-website/src/api/types/IFrontendSettings.ts create mode 100644 tranga-website/src/api/types/ILibraryConnector.ts create mode 100644 tranga-website/src/api/types/ILink.ts create mode 100644 tranga-website/src/api/types/ILocalLibrary.ts create mode 100644 tranga-website/src/api/types/IManga.ts create mode 100644 tranga-website/src/api/types/IMangaAltTitle.ts create mode 100644 tranga-website/src/api/types/IMangaConnector.ts create mode 100644 tranga-website/src/api/types/INotificationConnector.ts create mode 100644 tranga-website/src/api/types/IRequestLimits.ts create mode 100644 tranga-website/src/api/types/Jobs/IDownloadAvailableChaptersJob.ts create mode 100644 tranga-website/src/api/types/Jobs/IDownloadMangaCoverJob.ts create mode 100644 tranga-website/src/api/types/Jobs/IDownloadSingleChapterJob.ts create mode 100644 tranga-website/src/api/types/Jobs/IJob.ts create mode 100644 tranga-website/src/api/types/Jobs/IMoveFileOrFolderJob.ts create mode 100644 tranga-website/src/api/types/Jobs/IMoveMangaLibraryJob.ts create mode 100644 tranga-website/src/api/types/Jobs/IRetrieveChaptersJob.ts create mode 100644 tranga-website/src/api/types/Jobs/IUpdateFilesDownloadedJob.ts create mode 100644 tranga-website/src/api/types/Jobs/IUpdateMetadataJob.ts create mode 100644 tranga-website/src/api/types/records/IDownloadAvailableJobsRecord.ts create mode 100644 tranga-website/src/api/types/records/IGotifyRecord.ts create mode 100644 tranga-website/src/api/types/records/ILunaseaRecord.ts create mode 100644 tranga-website/src/api/types/records/IModifyJobRecord.ts create mode 100644 tranga-website/src/api/types/records/INewLibraryRecord.ts create mode 100644 tranga-website/src/api/types/records/INtfyRecord.ts create mode 100644 tranga-website/src/api/types/records/IPushoverRecord.ts create mode 100644 tranga-website/src/index.css create mode 100644 tranga-website/src/main.tsx create mode 100644 tranga-website/src/vite-env.d.ts create mode 100644 tranga-website/tsconfig.app.json create mode 100644 tranga-website/tsconfig.json create mode 100644 tranga-website/tsconfig.node.json create mode 100644 tranga-website/vite.config.ts diff --git a/README.md b/README.md index 7c2f06f..c4537f6 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ <h3 align="center">Tranga-Website</h3> <p align="center"> - Automatic MangaFunctions and Metadata downloader + Automatic Manga and Metadata downloader </p> <p align="center"> This is the Website for <a href="https://github.com/C9Glax/tranga">Tranga</a> (API) diff --git a/Website/App.tsx b/Website/App.tsx index a0ecb8e..608aa83 100644 --- a/Website/App.tsx +++ b/Website/App.tsx @@ -4,9 +4,10 @@ import Search from "./modules/Search"; import Header from "./modules/Header"; import MonitorJobsList from "./modules/MonitorJobsList"; import './styles/index.css' -import IFrontendSettings, {LoadFrontendSettings} from "./modules/interfaces/IFrontendSettings"; import {useCookies} from "react-cookie"; import Loader from "./modules/Loader"; +import IFrontendSettings from "./modules/types/IFrontendSettings"; +import {LoadFrontendSettings} from "./modules/api/FrontendSettings"; export default function App(){ const [, setCookie] = useCookies(['apiUri', 'jobInterval']); diff --git a/Website/modules/interfaces/IAuthor.tsx b/Website/modules/Elements/Author.tsx similarity index 64% rename from Website/modules/interfaces/IAuthor.tsx rename to Website/modules/Elements/Author.tsx index 67c2c6d..3f96e44 100644 --- a/Website/modules/interfaces/IAuthor.tsx +++ b/Website/modules/Elements/Author.tsx @@ -1,18 +1,14 @@ import React, {ReactElement, useEffect} from "react"; import {getData} from "../../App"; +import IAuthor from "../types/IAuthor"; -export default interface IAuthor { - authorId: string; - authorName: string; -} - -export function AuthorElement({apiUri, authorId} : {apiUri: string, authorId: string | null}) : ReactElement{ +export default function AuthorElement({apiUri, authorId} : {apiUri: string, authorId: string | null}) : ReactElement{ let [author, setAuthor] = React.useState<IAuthor | null>(null); useEffect(()=> { if(authorId === null) return; - getData(`${apiUri}/v2/Query/Author/${authorId}`) + getData(`${apiUri}/v2/Query/AuthorTag/${authorId}`) .then((json) => { let ret = json as IAuthor; setAuthor(ret); diff --git a/Website/modules/interfaces/IChapter.tsx b/Website/modules/Elements/Chapter.tsx similarity index 64% rename from Website/modules/interfaces/IChapter.tsx rename to Website/modules/Elements/Chapter.tsx index ad0a23b..72b13a6 100644 --- a/Website/modules/interfaces/IChapter.tsx +++ b/Website/modules/Elements/Chapter.tsx @@ -1,20 +1,10 @@ import React, {ReactElement, ReactEventHandler, useEffect, useState} from "react"; -import MangaFunctions from "../MangaFunctions"; -import IManga from "./IManga"; -import ChapterFunctions from "../ChapterFunctions"; +import Manga from "../api/Manga"; +import Chapter from "../api/Chapter"; +import IChapter from "../types/IChapter"; +import IManga from "../types/IManga"; -export default interface IChapter{ - chapterId: string; - volumeNumber: number; - chapterNumber: string; - url: string; - title: string | undefined; - archiveFileName: string; - downloaded: boolean; - parentMangaId: string; -} - -export function ChapterItem({apiUri, chapterId} : {apiUri: string, chapterId: string}) : ReactElement { +export default function ChapterItem({apiUri, chapterId} : {apiUri: string, chapterId: string}) : ReactElement { const setCoverItem : ReactEventHandler<HTMLImageElement> = (e) => { setMangaCoverHtmlImageItem(e.currentTarget); } @@ -24,25 +14,25 @@ export function ChapterItem({apiUri, chapterId} : {apiUri: string, chapterId: st let [mangaCoverUrl, setMangaCoverUrl] = useState<string>("../../media/blahaj.png"); let [mangaCoverHtmlImageItem, setMangaCoverHtmlImageItem] = useState<HTMLImageElement | null>(null); useEffect(() => { - ChapterFunctions.GetChapterFromId(apiUri, chapterId).then(setChapter); + Chapter.GetChapterFromId(apiUri, chapterId).then(setChapter); }, []); useEffect(() => { if(chapter === null) manga = null; else - MangaFunctions.GetMangaById(apiUri, chapter.parentMangaId).then(setManga); + Manga.GetMangaById(apiUri, chapter.parentMangaId).then(setManga); }, [chapter]); useEffect(() => { if(chapter != null && mangaCoverHtmlImageItem != null) - setMangaCoverUrl(MangaFunctions.GetMangaCoverImageUrl(apiUri, chapter.parentMangaId, mangaCoverHtmlImageItem)); + setMangaCoverUrl(Manga.GetMangaCoverImageUrl(apiUri, chapter.parentMangaId, mangaCoverHtmlImageItem)); }, [chapter, mangaCoverHtmlImageItem]); let [clicked, setClicked] = useState<boolean>(false); return (<div className="ChapterItem" key={chapterId} is-clicked={clicked ? "clicked" : "not-clicked"} onClick={() => setClicked(!clicked)}> - <img className="ChapterItem-Cover" src={mangaCoverUrl} alt="MangaFunctions Cover" onLoad={setCoverItem} onResize={setCoverItem}></img> - <p className="ChapterItem-MangaName">{manga ? manga.name : "MangaFunctions-Name"}</p> - <p className="ChapterItem-ChapterName">{chapter ? chapter.title : "ChapterFunctions-Title"}</p> + <img className="ChapterItem-Cover" src={mangaCoverUrl} alt="Manga Cover" onLoad={setCoverItem} onResize={setCoverItem}></img> + <p className="ChapterItem-MangaName">{manga ? manga.name : "Manga-Name"}</p> + <p className="ChapterItem-ChapterName">{chapter ? chapter.title : "Chapter-Title"}</p> <p className="ChapterItem-Volume">Vol.{chapter ? chapter.volumeNumber : "VolNum"}</p> <p className="ChapterItem-Chapter">Ch.{chapter ? chapter.chapterNumber : "ChNum"}</p> <p className="ChapterItem-VolumeChapter">Vol.{chapter ? chapter.volumeNumber : "VolNum"} Ch.{chapter ? chapter.chapterNumber : "ChNum"}</p> diff --git a/Website/modules/interfaces/records/IGotifyRecord.tsx b/Website/modules/Elements/Gotify.tsx similarity index 83% rename from Website/modules/interfaces/records/IGotifyRecord.tsx rename to Website/modules/Elements/Gotify.tsx index 9f5f86b..b2ec89e 100644 --- a/Website/modules/interfaces/records/IGotifyRecord.tsx +++ b/Website/modules/Elements/Gotify.tsx @@ -1,24 +1,8 @@ import {ReactElement, useState} from "react"; -import NotificationConnectorFunctions from "../../NotificationConnectorFunctions"; -import Loader from "../../Loader"; -import "../../../styles/notificationConnector.css"; -import {isValidUri} from "../../../App"; - -export default interface IGotifyRecord { - endpoint: string; - appToken: string; - priority: number; -} - -function Validate(record: IGotifyRecord) : boolean { - if(!isValidUri(record.endpoint)) - return false; - if(record.appToken.length < 1) - return false; - if(record.priority < 1 || record.priority > 5) - return false; - return true; -} +import NotificationConnector from "../api/NotificationConnector"; +import Loader from "../Loader"; +import IGotifyRecord from "../types/records/IGotifyRecord"; +import {isValidUri} from "../../App"; export function GotifyItem ({apiUri} : {apiUri: string}) : ReactElement{ const [record, setRecord] = useState<IGotifyRecord>({ @@ -42,10 +26,20 @@ export function GotifyItem ({apiUri} : {apiUri: string}) : ReactElement{ if(record === null || Validate(record) === false) return; setLoading(true); - NotificationConnectorFunctions.CreateGotify(apiUri, record) + NotificationConnector.CreateGotify(apiUri, record) .finally(() => setLoading(false)); }}>Add</button> <Loader loading={loading} style={{width:"40px",height:"40px"}}/> </> </div>; +} + +function Validate(record: IGotifyRecord) : boolean { + if(!isValidUri(record.endpoint)) + return false; + if(record.appToken.length < 1) + return false; + if(record.priority < 1 || record.priority > 5) + return false; + return true; } \ No newline at end of file diff --git a/Website/modules/interfaces/ILink.tsx b/Website/modules/Elements/Link.tsx similarity index 71% rename from Website/modules/interfaces/ILink.tsx rename to Website/modules/Elements/Link.tsx index 605fe39..2c2fce6 100644 --- a/Website/modules/interfaces/ILink.tsx +++ b/Website/modules/Elements/Link.tsx @@ -1,13 +1,8 @@ import React, {ReactElement, useEffect} from "react"; import {getData} from "../../App"; +import ILink from "../types/ILink"; -export default interface ILink { - linkId: string; - linkProvider: string; - linkUrl: string; -} - -export function LinkElement({apiUri, linkId} : {apiUri: string, linkId: string | null}) : ReactElement{ +export default function LinkElement({apiUri, linkId} : {apiUri: string, linkId: string | null}) : ReactElement{ let [link, setLink] = React.useState<ILink | null>(null); useEffect(()=> { diff --git a/Website/modules/interfaces/ILocalLibrary.tsx b/Website/modules/Elements/LocalLibrary.tsx similarity index 76% rename from Website/modules/interfaces/ILocalLibrary.tsx rename to Website/modules/Elements/LocalLibrary.tsx index 8381be7..3940652 100644 --- a/Website/modules/interfaces/ILocalLibrary.tsx +++ b/Website/modules/Elements/LocalLibrary.tsx @@ -1,16 +1,11 @@ import {ReactElement, useState} from "react"; -import INewLibraryRecord, {Validate} from "./records/INewLibraryRecord"; +import INewLibraryRecord, {Validate} from "../types/records/INewLibraryRecord"; import Loader from "../Loader"; -import LocalLibraryFunctions from "../LocalLibraryFunctions"; +import LocalLibrary from "../api/LocalLibrary"; import "../../styles/localLibrary.css"; +import ILocalLibrary from "../types/ILocalLibrary"; -export default interface ILocalLibrary { - localLibraryId: string; - basePath: string; - libraryName: string; -} - -export function LocalLibraryItem({apiUri, library} : {apiUri: string, library: ILocalLibrary | null}) : ReactElement { +export default function LocalLibraryItem({apiUri, library} : {apiUri: string, library: ILocalLibrary | null}) : ReactElement { const [loading, setLoading] = useState<boolean>(false); const [record, setRecord] = useState<INewLibraryRecord>({ path: library?.basePath ?? "", @@ -29,14 +24,14 @@ export function LocalLibraryItem({apiUri, library} : {apiUri: string, library: I if(record === null || Validate(record) === false) return; setLoading(true); - LocalLibraryFunctions.UpdateLibrary(apiUri, library.localLibraryId, record) + LocalLibrary.UpdateLibrary(apiUri, library.localLibraryId, record) .finally(() => setLoading(false)); }}>Edit</button> : <button className="LocalLibraryFunctions-Action" onClick={() => { if(record === null || Validate(record) === false) return; setLoading(true); - LocalLibraryFunctions.CreateLibrary(apiUri, record) + LocalLibrary.CreateLibrary(apiUri, record) .finally(() => setLoading(false)); }}>Add</button> } diff --git a/Website/modules/interfaces/records/ILunaseaRecord.tsx b/Website/modules/Elements/Lunasea.tsx similarity index 80% rename from Website/modules/interfaces/records/ILunaseaRecord.tsx rename to Website/modules/Elements/Lunasea.tsx index 8bc2272..b6b6b65 100644 --- a/Website/modules/interfaces/records/ILunaseaRecord.tsx +++ b/Website/modules/Elements/Lunasea.tsx @@ -1,16 +1,7 @@ import {ReactElement, useState} from "react"; -import NotificationConnectorFunctions from "../../NotificationConnectorFunctions"; -import Loader from "../../Loader"; -import "../../../styles/notificationConnector.css"; - -export default interface ILunaseaRecord { - id: string; -} - -const regex = new RegExp("(?:device|user)\/[0-9a-zA-Z\-]+"); -function Validate(record: ILunaseaRecord) : boolean { - return regex.test(record.id); -} +import NotificationConnector from "../api/NotificationConnector"; +import Loader from "../Loader"; +import ILunaseaRecord from "../types/records/ILunaseaRecord"; export function LunaseaItem ({apiUri} : {apiUri: string}) : ReactElement{ const [record, setRecord] = useState<ILunaseaRecord>({ @@ -27,10 +18,15 @@ export function LunaseaItem ({apiUri} : {apiUri: string}) : ReactElement{ if(record === null || Validate(record) === false) return; setLoading(true); - NotificationConnectorFunctions.CreateLunasea(apiUri, record) + NotificationConnector.CreateLunasea(apiUri, record) .finally(() => setLoading(false)); }}>Add</button> <Loader loading={loading} style={{width:"40px",height:"40px",margin:"25vh calc(sin(70)*(50% - 40px))"}}/> </> </div>; +} + +const regex = new RegExp("(?:device|user)\/[0-9a-zA-Z\-]+"); +function Validate(record: ILunaseaRecord) : boolean { + return regex.test(record.id); } \ No newline at end of file diff --git a/Website/modules/interfaces/IManga.tsx b/Website/modules/Elements/Manga.tsx similarity index 75% rename from Website/modules/interfaces/IManga.tsx rename to Website/modules/Elements/Manga.tsx index a69ad78..19e9a74 100644 --- a/Website/modules/interfaces/IManga.tsx +++ b/Website/modules/Elements/Manga.tsx @@ -1,43 +1,18 @@ -import MangaFunctions from "../MangaFunctions"; +import Manga from "../api/Manga"; import React, {Children, ReactElement, ReactEventHandler, useEffect, useState} from "react"; import Icon from '@mdi/react'; import { mdiTagTextOutline, mdiAccountEdit, mdiLinkVariant } from '@mdi/js'; import MarkdownPreview from '@uiw/react-markdown-preview'; -import {AuthorElement} from "./IAuthor"; -import {LinkElement} from "./ILink"; -import IChapter from "./IChapter"; import Loader from "../Loader"; +import IManga from "../types/IManga"; +import IChapter from "../types/IChapter"; +import AuthorElement from "./Author"; +import LinkElement from "./Link"; -export default interface IManga{ - mangaId: string; - idOnConnectorSite: string; - name: string; - description: string; - websiteUrl: string; - year: number; - originalLanguage: string; - releaseStatus: MangaReleaseStatus; - folderName: string; - ignoreChapterBefore: number; - mangaConnectorId: string; - authorIds: string[]; - tags: string[]; - linkIds: string[]; - altTitleIds: string[]; -} - -export enum MangaReleaseStatus { - Continuing = "Continuing", - Completed = "Completed", - OnHiatus = "OnHiatus", - Cancelled = "Cancelled", - Unreleased = "Unreleased", -} - -export function MangaItem({apiUri, mangaId, children} : {apiUri: string, mangaId: string, children?: (string | ReactElement)[]}) : ReactElement { +export default function MangaItem({apiUri, mangaId, children} : {apiUri: string, mangaId: string, children?: (string | ReactElement)[]}) : ReactElement { const LoadMangaCover : ReactEventHandler<HTMLImageElement> = (e) => { - if(e.currentTarget.src != MangaFunctions.GetMangaCoverImageUrl(apiUri, mangaId, e.currentTarget)) - e.currentTarget.src = MangaFunctions.GetMangaCoverImageUrl(apiUri, mangaId, e.currentTarget); + if(e.currentTarget.src != Manga.GetMangaCoverImageUrl(apiUri, mangaId, e.currentTarget)) + e.currentTarget.src = Manga.GetMangaCoverImageUrl(apiUri, mangaId, e.currentTarget); } let [manga, setManga] = useState<IManga | null>(null); @@ -48,14 +23,14 @@ export function MangaItem({apiUri, mangaId, children} : {apiUri: string, mangaId let [settingThreshold, setSettingThreshold] = useState<boolean>(false); const invalidTargets = ["input", "textarea", "button", "select", "a"]; useEffect(() => { - MangaFunctions.GetMangaById(apiUri, mangaId).then(setManga); - MangaFunctions.GetLatestChapterDownloaded(apiUri, mangaId) + Manga.GetMangaById(apiUri, mangaId).then(setManga); + Manga.GetLatestChapterDownloaded(apiUri, mangaId) .then(setLatestChapterDownloaded) .finally(() => { if(latestChapterDownloaded && latestChapterAvailable) setLoadingChapterStats(false); }); - MangaFunctions.GetLatestChapterAvailable(apiUri, mangaId) + Manga.GetLatestChapterAvailable(apiUri, mangaId) .then(setLatestChapterAvailable) .finally(() => { if(latestChapterDownloaded && latestChapterAvailable) @@ -69,7 +44,7 @@ export function MangaItem({apiUri, mangaId, children} : {apiUri: string, mangaId if(invalidTargets.find(x => x == target.localName) === undefined ) setClicked(!clicked) }}> - <img className="MangaItem-Cover" src="../../media/blahaj.png" alt="MangaFunctions Cover" onLoad={LoadMangaCover} onResize={LoadMangaCover}></img> + <img className="MangaItem-Cover" src="../../media/blahaj.png" alt="Manga Cover" onLoad={LoadMangaCover} onResize={LoadMangaCover}></img> <div className="MangaItem-Connector">{manga ? manga.mangaConnectorId : "Connector"}</div> <div className="MangaItem-Status" release-status={manga?.releaseStatus}></div> <div className="MangaItem-Name">{manga ? manga.name : "Name"}</div> @@ -81,7 +56,7 @@ export function MangaItem({apiUri, mangaId, children} : {apiUri: string, mangaId <AuthorElement apiUri={apiUri} authorId={authorId}></AuthorElement> </div>) : - <div className="MangaItem-Author" key="null-Author"> + <div className="MangaItem-Author" key="null-AuthorTag"> <Icon path={mdiAccountEdit} size={0.5} /> <AuthorElement apiUri={apiUri} authorId={null}></AuthorElement> </div>} @@ -113,7 +88,7 @@ export function MangaItem({apiUri, mangaId, children} : {apiUri: string, mangaId Start at Chapter <input type="text" defaultValue={latestChapterDownloaded ? latestChapterDownloaded.chapterNumber : ""} disabled={settingThreshold} onChange={(e) => { setSettingThreshold(true); - MangaFunctions.SetIgnoreThreshold(apiUri, mangaId, e.currentTarget.valueAsNumber).finally(()=>setSettingThreshold(false)); + Manga.SetIgnoreThreshold(apiUri, mangaId, e.currentTarget.valueAsNumber).finally(()=>setSettingThreshold(false)); }} /> <Loader loading={settingThreshold} style={{margin: "-10px -45px"}}/> out of <span className="MangaItem-Props-Threshold-Available">{latestChapterAvailable ? latestChapterAvailable.chapterNumber : <Loader loading={loadingChapterStats} style={{margin: "-10px -35px"}} />}</span> diff --git a/Website/modules/interfaces/IMangaAltTitle.tsx b/Website/modules/Elements/MangaAltTitle.tsx similarity index 67% rename from Website/modules/interfaces/IMangaAltTitle.tsx rename to Website/modules/Elements/MangaAltTitle.tsx index 776456c..bc3a74f 100644 --- a/Website/modules/interfaces/IMangaAltTitle.tsx +++ b/Website/modules/Elements/MangaAltTitle.tsx @@ -1,14 +1,8 @@ import React, {ReactElement, useEffect} from "react"; import {getData} from "../../App"; -import IAuthor from "./IAuthor"; +import IMangaAltTitle from "../types/IMangaAltTitle"; -export default interface IMangaAltTitle { - altTitleId: string; - language: string; - title: string; -} - -export function AltTitleElement({apiUri, altTitleId} : {apiUri: string, altTitleId: string | null}) : ReactElement{ +export default function AltTitleElement({apiUri, altTitleId} : {apiUri: string, altTitleId: string | null}) : ReactElement{ let [altTitle, setAltTitle] = React.useState<IMangaAltTitle | null>(null); useEffect(()=> { diff --git a/Website/modules/interfaces/INotificationConnector.tsx b/Website/modules/Elements/NotificationConnector.tsx similarity index 88% rename from Website/modules/interfaces/INotificationConnector.tsx rename to Website/modules/Elements/NotificationConnector.tsx index bad1794..1bb53ce 100644 --- a/Website/modules/interfaces/INotificationConnector.tsx +++ b/Website/modules/Elements/NotificationConnector.tsx @@ -1,21 +1,14 @@ import {ReactElement, ReactEventHandler, useState} from "react"; import "../../styles/notificationConnector.css"; import Loader from "../Loader"; -import NotificationConnectorFunctions from "../NotificationConnectorFunctions"; -import {LunaseaItem} from "./records/ILunaseaRecord"; -import {GotifyItem} from "./records/IGotifyRecord"; -import {NtfyItem} from "./records/INtfyRecord"; -import {PushoverItem} from "./records/IPushoverRecord"; +import NotificationConnector from "../api/NotificationConnector"; +import INotificationConnector from "../types/INotificationConnector"; +import {GotifyItem} from "./Gotify"; +import {NtfyItem} from "./Ntfy"; +import {LunaseaItem} from "./Lunasea"; +import {PushoverItem} from "./Pushover"; -export default interface INotificationConnector { - name: string; - url: string; - headers: Record<string, string>[]; - httpMethod: string; - body: string; -} - -export function NotificationConnectorItem({apiUri, notificationConnector} : {apiUri: string, notificationConnector: INotificationConnector | null}) : ReactElement { +export default function NotificationConnectorItem({apiUri, notificationConnector} : {apiUri: string, notificationConnector: INotificationConnector | null}) : ReactElement { if(notificationConnector != null) return <DefaultItem apiUri={apiUri} notificationConnector={notificationConnector} /> @@ -93,7 +86,7 @@ function DefaultItem({apiUri, notificationConnector}:{apiUri: string, notificati <> <button className="NotificationConnectorItem-Save" onClick={(e) => { setLoading(true); - NotificationConnectorFunctions.CreateNotificationConnector(apiUri, info) + NotificationConnector.CreateNotificationConnector(apiUri, info) .finally(() => setLoading(false)); }}>Add</button> <Loader loading={loading} style={{width:"40px",height:"40px",margin:"25vh calc(sin(70)*(50% - 40px))"}}/> diff --git a/Website/modules/interfaces/records/INtfyRecord.tsx b/Website/modules/Elements/Ntfy.tsx similarity index 71% rename from Website/modules/interfaces/records/INtfyRecord.tsx rename to Website/modules/Elements/Ntfy.tsx index bbf68c3..b669db9 100644 --- a/Website/modules/interfaces/records/INtfyRecord.tsx +++ b/Website/modules/Elements/Ntfy.tsx @@ -1,30 +1,8 @@ +import {isValidUri} from "../../App"; import {ReactElement, useState} from "react"; -import NotificationConnectorFunctions from "../../NotificationConnectorFunctions"; -import Loader from "../../Loader"; -import "../../../styles/notificationConnector.css"; -import {isValidUri} from "../../../App"; - -export default interface INtfyRecord { - endpoint: string; - username: string; - password: string; - topic: string; - priority: number; -} - -function Validate(record: INtfyRecord) : boolean { - if(!isValidUri(record.endpoint)) - return false; - if(record.username.length < 1) - return false; - if(record.password.length < 1) - return false; - if(record.topic.length < 1) - return false; - if(record.priority < 1 || record.priority > 5) - return false; - return true; -} +import NotificationConnector from "../api/NotificationConnector"; +import Loader from "../Loader"; +import INtfyRecord from "../types/records/INtfyRecord"; export function NtfyItem ({apiUri} : {apiUri: string}) : ReactElement{ const [info, setInfo] = useState<INtfyRecord>({ @@ -49,14 +27,28 @@ export function NtfyItem ({apiUri} : {apiUri: string}) : ReactElement{ <label htmlFor="NotificationConnectorItem-Priority">Priority</label> <input id="NotificationConnectorItem-Priority-Value" type="number" className="NotificationConnectorItem-Priority-Value" min={1} max={5} defaultValue={3} onChange={(e) => setInfo({...info, priority: e.currentTarget.valueAsNumber})} /> </div><> - <button className="NotificationConnectorItem-Save" onClick={(e) => { - if(info === null || Validate(info) === false) - return; - setLoading(true); - NotificationConnectorFunctions.CreateNtfy(apiUri, info) - .finally(() => setLoading(false)); - }}>Add</button> - <Loader loading={loading} style={{width:"40px",height:"40px",margin:"25vh calc(sin(70)*(50% - 40px))"}}/> - </> + <button className="NotificationConnectorItem-Save" onClick={(e) => { + if(info === null || Validate(info) === false) + return; + setLoading(true); + NotificationConnector.CreateNtfy(apiUri, info) + .finally(() => setLoading(false)); + }}>Add</button> + <Loader loading={loading} style={{width:"40px",height:"40px",margin:"25vh calc(sin(70)*(50% - 40px))"}}/> + </> </div>; +} + +function Validate(record: INtfyRecord) : boolean { + if(!isValidUri(record.endpoint)) + return false; + if(record.username.length < 1) + return false; + if(record.password.length < 1) + return false; + if(record.topic.length < 1) + return false; + if(record.priority < 1 || record.priority > 5) + return false; + return true; } \ No newline at end of file diff --git a/Website/modules/interfaces/records/IPushoverRecord.tsx b/Website/modules/Elements/Pushover.tsx similarity index 79% rename from Website/modules/interfaces/records/IPushoverRecord.tsx rename to Website/modules/Elements/Pushover.tsx index 32816b9..90e3186 100644 --- a/Website/modules/interfaces/records/IPushoverRecord.tsx +++ b/Website/modules/Elements/Pushover.tsx @@ -1,21 +1,7 @@ import {ReactElement, useState} from "react"; -import NotificationConnectorFunctions from "../../NotificationConnectorFunctions"; -import Loader from "../../Loader"; -import "../../../styles/notificationConnector.css"; -import {isValidUri} from "../../../App"; - -export default interface IPushoverRecord { - apptoken: string; - user: string; -} - -function Validate(record: IPushoverRecord) : boolean { - if(record.apptoken.length < 1) - return false; - if(record.user.length < 1) - return false; - return true; -} +import NotificationConnector from "../api/NotificationConnector"; +import Loader from "../Loader"; +import IPushoverRecord from "../types/records/IPushoverRecord"; export function PushoverItem ({apiUri} : {apiUri: string}) : ReactElement{ const [info, setInfo] = useState<IPushoverRecord>({ @@ -34,10 +20,18 @@ export function PushoverItem ({apiUri} : {apiUri: string}) : ReactElement{ if(info === null || Validate(info) === false) return; setLoading(true); - NotificationConnectorFunctions.CreatePushover(apiUri, info) + NotificationConnector.CreatePushover(apiUri, info) .finally(() => setLoading(false)); }}>Add</button> <Loader loading={loading} style={{width:"40px",height:"40px",margin:"25vh calc(sin(70)*(50% - 40px))"}}/> </> </div>; +} + +function Validate(record: IPushoverRecord) : boolean { + if(record.apptoken.length < 1) + return false; + if(record.user.length < 1) + return false; + return true; } \ No newline at end of file diff --git a/Website/modules/Footer.tsx b/Website/modules/Footer.tsx index 594e8ec..0482e91 100644 --- a/Website/modules/Footer.tsx +++ b/Website/modules/Footer.tsx @@ -1,10 +1,10 @@ import React, {useEffect} from 'react'; import '../styles/footer.css'; -import JobFunctions from './JobFunctions'; +import Job from './api/Job'; import Icon from '@mdi/react'; import {mdiCounter, mdiEyeCheck, mdiRun, mdiTrayFull} from '@mdi/js'; import QueuePopUp from "./QueuePopUp"; -import {JobState, JobType} from "./interfaces/Jobs/IJob"; +import {JobState, JobType} from "./types/Jobs/IJob"; export default function Footer({connectedToBackend, apiUri, checkConnectedInterval} : {connectedToBackend: boolean, apiUri: string, checkConnectedInterval: number}) { const [MonitoringJobsCount, setMonitoringJobsCount] = React.useState(0); @@ -14,10 +14,10 @@ export default function Footer({connectedToBackend, apiUri, checkConnectedInterv const [countUpdateInterval, setCountUpdateInterval] = React.useState<number | undefined>(undefined); function UpdateBackendState(){ - JobFunctions.GetJobsWithType(apiUri, JobType.DownloadAvailableChaptersJob).then((jobs) => setMonitoringJobsCount(jobs.length)); - JobFunctions.GetAllJobs(apiUri).then((jobs) => setAllJobsCount(jobs.length)); - JobFunctions.GetJobsInState(apiUri, JobState.Running).then((jobs) => setRunningJobsCount(jobs.length)); - JobFunctions.GetJobsInState(apiUri, JobState.Waiting).then((jobs) => setWaitingJobs(jobs.length)); + Job.GetJobsWithType(apiUri, JobType.DownloadAvailableChaptersJob).then((jobs) => setMonitoringJobsCount(jobs.length)); + Job.GetAllJobs(apiUri).then((jobs) => setAllJobsCount(jobs.length)); + Job.GetJobsInState(apiUri, JobState.Running).then((jobs) => setRunningJobsCount(jobs.length)); + Job.GetJobsInState(apiUri, JobState.Waiting).then((jobs) => setWaitingJobs(jobs.length)); } useEffect(() => { diff --git a/Website/modules/Header.tsx b/Website/modules/Header.tsx index a35c047..cf38964 100644 --- a/Website/modules/Header.tsx +++ b/Website/modules/Header.tsx @@ -1,7 +1,7 @@ import React from 'react'; import '../styles/header.css' -import IFrontendSettings from "./interfaces/IFrontendSettings"; import Settings from "./Settings"; +import IFrontendSettings from "./types/IFrontendSettings"; export default function Header({backendConnected, apiUri, settings, setFrontendSettings} : {backendConnected: boolean, apiUri: string, settings: IFrontendSettings, setFrontendSettings: (settings: IFrontendSettings) => void}){ return ( diff --git a/Website/modules/MonitorJobsList.tsx b/Website/modules/MonitorJobsList.tsx index 18310d3..cb4a89a 100644 --- a/Website/modules/MonitorJobsList.tsx +++ b/Website/modules/MonitorJobsList.tsx @@ -1,11 +1,11 @@ import React, {ReactElement, useEffect, useState} from 'react'; -import JobFunctions from './JobFunctions'; +import Job from './api/Job'; import '../styles/monitorMangaList.css'; -import {JobType} from "./interfaces/Jobs/IJob"; +import {JobType} from "./types/Jobs/IJob"; import '../styles/mangaCover.css' -import IDownloadAvailableChaptersJob from "./interfaces/Jobs/IDownloadAvailableChaptersJob"; -import {MangaItem} from "./interfaces/IManga"; -import MangaFunctions from "./MangaFunctions"; +import IDownloadAvailableChaptersJob from "./types/Jobs/IDownloadAvailableChaptersJob"; +import Manga from "./api/Manga"; +import MangaItem from "./Elements/Manga"; export default function MonitorJobsList({onStartSearch, connectedToBackend, apiUri, checkConnectedInterval} : {onStartSearch() : void, connectedToBackend: boolean, apiUri: string, checkConnectedInterval: number}) { const [MonitoringJobs, setMonitoringJobs] = useState<IDownloadAvailableChaptersJob[]>([]); @@ -29,7 +29,7 @@ export default function MonitorJobsList({onStartSearch, connectedToBackend, apiU if(!connectedToBackend) return; //console.debug("Updating MonitoringJobsList"); - JobFunctions.GetJobsWithType(apiUri, JobType.DownloadAvailableChaptersJob) + Job.GetJobsWithType(apiUri, JobType.DownloadAvailableChaptersJob) .then((jobs) => jobs as IDownloadAvailableChaptersJob[]) .then((jobs) => { if(jobs.length != MonitoringJobs.length || @@ -57,7 +57,7 @@ export default function MonitorJobsList({onStartSearch, connectedToBackend, apiU <MangaItem apiUri={apiUri} mangaId={MonitoringJob.mangaId} key={MonitoringJob.mangaId}> <></> <button className="Manga-DeleteButton" onClick={() => { - MangaFunctions.DeleteManga(apiUri, MonitoringJob.mangaId); + Manga.DeleteManga(apiUri, MonitoringJob.mangaId); }}>Delete</button> </MangaItem> )} diff --git a/Website/modules/QueuePopUp.tsx b/Website/modules/QueuePopUp.tsx index ba0063c..8d2b327 100644 --- a/Website/modules/QueuePopUp.tsx +++ b/Website/modules/QueuePopUp.tsx @@ -1,10 +1,10 @@ import React, {ReactElement, useEffect, useState} from 'react'; -import IJob, {JobState, JobType} from "./interfaces/Jobs/IJob"; +import IJob, {JobState, JobType} from "./types/Jobs/IJob"; import '../styles/queuePopUp.css'; import '../styles/popup.css'; -import JobFunctions from "./JobFunctions"; -import IDownloadSingleChapterJob from "./interfaces/Jobs/IDownloadSingleChapterJob"; -import {ChapterItem} from "./interfaces/IChapter"; +import Job from "./api/Job"; +import IDownloadSingleChapterJob from "./types/Jobs/IDownloadSingleChapterJob"; +import ChapterItem from "./Elements/Chapter"; export default function QueuePopUp({connectedToBackend, children, apiUri, checkConnectedInterval} : {connectedToBackend: boolean, children: ReactElement[], apiUri: string, checkConnectedInterval: number}) { @@ -28,13 +28,13 @@ export default function QueuePopUp({connectedToBackend, children, apiUri, checkC }, [connectedToBackend, showQueuePopup]); function UpdateMonitoringJobsList(){ - JobFunctions.GetJobsInState(apiUri, JobState.Waiting) + Job.GetJobsInState(apiUri, JobState.Waiting) .then((jobs: IJob[]) => { //console.log(jobs); return jobs; }) .then(setWaitingJobs); - JobFunctions.GetJobsInState(apiUri, JobState.Running) + Job.GetJobsInState(apiUri, JobState.Running) .then((jobs: IJob[]) => { //console.log(jobs); return jobs; diff --git a/Website/modules/Search.tsx b/Website/modules/Search.tsx index 6b461be..32b0a13 100644 --- a/Website/modules/Search.tsx +++ b/Website/modules/Search.tsx @@ -1,14 +1,15 @@ import React, {ChangeEventHandler, EventHandler, useEffect, useState} from 'react'; -import {MangaConnectorFunctions} from "./MangaConnectorFunctions"; -import IMangaConnector from "./interfaces/IMangaConnector"; +import {MangaConnector} from "./api/MangaConnector"; +import IMangaConnector from "./types/IMangaConnector"; import {isValidUri} from "../App"; -import IManga, {MangaItem} from "./interfaces/IManga"; import '../styles/search.css'; -import SearchFunctions from "./SearchFunctions"; -import JobFunctions from "./JobFunctions"; -import ILocalLibrary from "./interfaces/ILocalLibrary"; -import LocalLibraryFunctions from "./LocalLibraryFunctions"; +import Job from "./api/Job"; +import LocalLibrary from "./api/LocalLibrary"; import Loader from "./Loader"; +import IManga from "./types/IManga"; +import SearchFunctions from "./api/Search"; +import ILocalLibrary from "./types/ILocalLibrary"; +import MangaItem from "./Elements/Manga"; export default function Search({apiUri, jobInterval, closeSearch} : {apiUri: string, jobInterval: Date, closeSearch(): void}) { let [loading, setLoading] = useState<boolean>(true); @@ -21,7 +22,7 @@ export default function Search({apiUri, jobInterval, closeSearch} : {apiUri: str const pattern = /https:\/\/([a-z0-9.]+\.[a-z0-9]{2,})(?:\/.*)?/i useEffect(() => { - MangaConnectorFunctions.GetAllConnectors(apiUri).then((connectors)=> { + MangaConnector.GetAllConnectors(apiUri).then((connectors)=> { return connectors.filter(c => c.enabled); }).then(setConnectors).then(() => setLoading(false)); }, []); @@ -99,7 +100,7 @@ export default function Search({apiUri, jobInterval, closeSearch} : {apiUri: str let [selectedLibrary, setSelectedLibrary] = useState<ILocalLibrary | null>(null); let [libraries, setLibraries] = useState<ILocalLibrary[] | null>(null); useEffect(() => { - LocalLibraryFunctions.GetLibraries(apiUri).then(setLibraries); + LocalLibrary.GetLibraries(apiUri).then(setLibraries); }, []); useEffect(() => { if(libraries === null || libraries.length < 1) @@ -147,7 +148,7 @@ export default function Search({apiUri, jobInterval, closeSearch} : {apiUri: str : libraries.map(library => <option key={library.localLibraryId} value={library.localLibraryId}>{library.libraryName} ({library.basePath})</option>)} </select> <button className="Manga-AddButton" onClick={() => { - JobFunctions.CreateDownloadAvailableChaptersJob(apiUri, result.mangaId, {recurrenceTimeMs: new Date(jobInterval).getTime(), localLibraryId: selectedLibrary!.localLibraryId}); + Job.CreateDownloadAvailableChaptersJob(apiUri, result.mangaId, {recurrenceTimeMs: new Date(jobInterval).getTime(), localLibraryId: selectedLibrary!.localLibraryId}); }}>Monitor</button> </MangaItem> }) diff --git a/Website/modules/Settings.tsx b/Website/modules/Settings.tsx index e10df8a..f67bc4f 100644 --- a/Website/modules/Settings.tsx +++ b/Website/modules/Settings.tsx @@ -1,18 +1,20 @@ -import IFrontendSettings from "./interfaces/IFrontendSettings"; import '../styles/settings.css'; import '../styles/react-toggle.css'; import React, {useEffect, useRef, useState} from "react"; -import INotificationConnector, {NotificationConnectorItem} from "./interfaces/INotificationConnector"; -import NotificationConnectorFunctions from "./NotificationConnectorFunctions"; -import ILocalLibrary, {LocalLibraryItem} from "./interfaces/ILocalLibrary"; -import LocalLibraryFunctions from "./LocalLibraryFunctions"; -import IBackendSettings from "./interfaces/IBackendSettings"; -import BackendSettings from "./BackendSettingsFunctions"; +import NotificationConnector from "./api/NotificationConnector"; +import IBackendSettings from "./types/IBackendSettings"; +import BackendSettings from "./api/BackendSettings"; import Toggle from "react-toggle"; import Loader from "./Loader"; -import {RequestType} from "./interfaces/IRequestLimits"; -import IMangaConnector from "./interfaces/IMangaConnector"; -import {MangaConnectorFunctions} from "./MangaConnectorFunctions"; +import IMangaConnector from "./types/IMangaConnector"; +import {MangaConnector} from "./api/MangaConnector"; +import IFrontendSettings from "./types/IFrontendSettings"; +import INotificationConnector from "./types/INotificationConnector"; +import ILocalLibrary from "./types/ILocalLibrary"; +import LocalLibrary from "./api/LocalLibrary"; +import {RequestLimitType} from "./types/EnumRequestLimitType"; +import NotificationConnectorItem from "./Elements/NotificationConnector"; +import LocalLibraryItem from "./Elements/LocalLibrary"; export default function Settings({ backendConnected, apiUri, frontendSettings, setFrontendSettings } : { backendConnected: boolean, @@ -31,10 +33,10 @@ export default function Settings({ backendConnected, apiUri, frontendSettings, s useEffect(() => { if(!backendConnected) return; - NotificationConnectorFunctions.GetNotificationConnectors(apiUri).then(setNotificationConnectors); - LocalLibraryFunctions.GetLibraries(apiUri).then(setLocalLibraries); + NotificationConnector.GetNotificationConnectors(apiUri).then(setNotificationConnectors); + LocalLibrary.GetLibraries(apiUri).then(setLocalLibraries); BackendSettings.GetSettings(apiUri).then(setBackendSettings); - MangaConnectorFunctions.GetAllConnectors(apiUri).then(setMangaConnectors); + MangaConnector.GetAllConnectors(apiUri).then(setMangaConnectors); }, [backendConnected, showSettings]); const dateToStr = (x: Date) => { @@ -44,7 +46,7 @@ export default function Settings({ backendConnected, apiUri, frontendSettings, s return ret; } - const ChangeRequestLimit = (requestType: RequestType, limit: number) => { + const ChangeRequestLimit = (requestType: RequestLimitType, limit: number) => { if(backendSettings === null) return; setLoadingBackend(true); @@ -150,22 +152,22 @@ export default function Settings({ backendConnected, apiUri, frontendSettings, s <h3>Request Limits:</h3> <label htmlFor="Default">Default</label> <input id="Default" type="number" defaultValue={backendSettings ? backendSettings.requestLimits.Default : 0} disabled={backendSettings ? false : !loadingBackend} - onChange={(e) => ChangeRequestLimit(RequestType.Default, e.currentTarget.valueAsNumber)} /> + onChange={(e) => ChangeRequestLimit(RequestLimitType.Default, e.currentTarget.valueAsNumber)} /> <label htmlFor="MangaInfo">MangaInfo</label> <input id="MangaInfo" type="number" defaultValue={backendSettings ? backendSettings.requestLimits.MangaInfo : 0} disabled={backendSettings ? false : !loadingBackend} - onChange={(e) => ChangeRequestLimit(RequestType.MangaInfo, e.currentTarget.valueAsNumber)} /> + onChange={(e) => ChangeRequestLimit(RequestLimitType.MangaInfo, e.currentTarget.valueAsNumber)} /> <label htmlFor="MangaDexFeed">MangaDexFeed</label> <input id="MangaDexFeed" type="number" defaultValue={backendSettings ? backendSettings.requestLimits.MangaDexFeed : 0} disabled={backendSettings ? false : !loadingBackend} - onChange={(e) => ChangeRequestLimit(RequestType.MangaDexFeed, e.currentTarget.valueAsNumber)} /> + onChange={(e) => ChangeRequestLimit(RequestLimitType.MangaDexFeed, e.currentTarget.valueAsNumber)} /> <label htmlFor="MangaDexImage">MangaDexImage</label> <input id="MangaDexImage" type="number" defaultValue={backendSettings ? backendSettings.requestLimits.MangaDexImage : 0} disabled={backendSettings ? false : !loadingBackend} - onChange={(e) => ChangeRequestLimit(RequestType.MangaDexImage, e.currentTarget.valueAsNumber)} /> + onChange={(e) => ChangeRequestLimit(RequestLimitType.MangaDexImage, e.currentTarget.valueAsNumber)} /> <label htmlFor="MangaImage">MangaImage</label> <input id="MangaImage" type="number" defaultValue={backendSettings ? backendSettings.requestLimits.MangaImage : 0} disabled={backendSettings ? false : !loadingBackend} - onChange={(e) => ChangeRequestLimit(RequestType.MangaImage, e.currentTarget.valueAsNumber)} /> + onChange={(e) => ChangeRequestLimit(RequestLimitType.MangaImage, e.currentTarget.valueAsNumber)} /> <label htmlFor="MangaCover">MangaCover</label> <input id="MangaCover" type="number" defaultValue={backendSettings ? backendSettings.requestLimits.MangaCover : 0} disabled={backendSettings ? false : !loadingBackend} - onChange={(e) => ChangeRequestLimit(RequestType.MangaCover, e.currentTarget.valueAsNumber)} /> + onChange={(e) => ChangeRequestLimit(RequestLimitType.MangaCover, e.currentTarget.valueAsNumber)} /> </div> <div className={"settings-mangaConnectors"}> {mangaConnectors.map(mc => { @@ -173,7 +175,7 @@ export default function Settings({ backendConnected, apiUri, frontendSettings, s <div key={mc.name}> <span>{mc.name}</span> <Toggle defaultChecked={mc.enabled} onChange={(e) => { - MangaConnectorFunctions.SetConnectorEnabled(apiUri, mc.name, e.currentTarget.checked); + MangaConnector.SetConnectorEnabled(apiUri, mc.name, e.currentTarget.checked); }} /> </div>); })} diff --git a/Website/modules/BackendSettingsFunctions.tsx b/Website/modules/api/BackendSettings.tsx similarity index 90% rename from Website/modules/BackendSettingsFunctions.tsx rename to Website/modules/api/BackendSettings.tsx index 26a860b..46d1fdf 100644 --- a/Website/modules/BackendSettingsFunctions.tsx +++ b/Website/modules/api/BackendSettings.tsx @@ -1,6 +1,7 @@ -import {deleteData, getData, patchData} from "../App"; -import IRequestLimits, {RequestType} from "./interfaces/IRequestLimits"; -import IBackendSettings from "./interfaces/IBackendSettings"; +import {deleteData, getData, patchData} from "../../App"; +import IRequestLimits from "../types/IRequestLimits"; +import IBackendSettings from "../types/IBackendSettings"; +import {RequestLimitType} from "../types/EnumRequestLimitType"; export default class BackendSettings { static async GetSettings(apiUri: string) : Promise<IBackendSettings> { @@ -27,11 +28,11 @@ export default class BackendSettings { return deleteData(`${apiUri}/v2/Settings/RequestLimits`); } - static async UpdateRequestLimit(apiUri: string, requestType: RequestType, value: number) { + static async UpdateRequestLimit(apiUri: string, requestType: RequestLimitType, value: number) { return patchData(`${apiUri}/v2/Settings/RequestLimits/${requestType}`, value); } - static async ResetRequestLimit(apiUri: string, requestType: RequestType) { + static async ResetRequestLimit(apiUri: string, requestType: RequestLimitType) { return deleteData(`${apiUri}/v2/Settings/RequestLimits/${requestType}`); } diff --git a/Website/modules/ChapterFunctions.tsx b/Website/modules/api/Chapter.tsx similarity index 73% rename from Website/modules/ChapterFunctions.tsx rename to Website/modules/api/Chapter.tsx index 9329497..d631c8d 100644 --- a/Website/modules/ChapterFunctions.tsx +++ b/Website/modules/api/Chapter.tsx @@ -1,7 +1,7 @@ -import {getData} from "../App"; -import IChapter from "./interfaces/IChapter"; +import {getData} from "../../App"; +import IChapter from "../types/IChapter"; -export default class ChapterFunctions { +export default class Chapter { static async GetChapterFromId(apiUri: string, chapterId: string): Promise<IChapter> { if(chapterId === undefined || chapterId === null) { @@ -10,7 +10,7 @@ export default class ChapterFunctions { } return getData(`${apiUri}/v2/Query/Chapter/${chapterId}`) .then((json) => { - //console.info("Got all MangaFunctions"); + //console.info("Got all Manga"); const ret = json as IChapter; //console.debug(ret); return (ret); diff --git a/Website/modules/interfaces/IFrontendSettings.tsx b/Website/modules/api/FrontendSettings.tsx similarity index 84% rename from Website/modules/interfaces/IFrontendSettings.tsx rename to Website/modules/api/FrontendSettings.tsx index f0c67d1..4d9079a 100644 --- a/Website/modules/interfaces/IFrontendSettings.tsx +++ b/Website/modules/api/FrontendSettings.tsx @@ -1,9 +1,5 @@ import {Cookies} from "react-cookie"; - -export default interface IFrontendSettings { - jobInterval: Date; - apiUri: string; -} +import IFrontendSettings from "../types/IFrontendSettings"; export function LoadFrontendSettings(): IFrontendSettings { const cookies = new Cookies(); diff --git a/Website/modules/JobFunctions.tsx b/Website/modules/api/Job.tsx similarity index 89% rename from Website/modules/JobFunctions.tsx rename to Website/modules/api/Job.tsx index 7f1aecc..deadc64 100644 --- a/Website/modules/JobFunctions.tsx +++ b/Website/modules/api/Job.tsx @@ -1,9 +1,9 @@ -import {deleteData, getData, patchData, postData, putData} from '../App'; -import IJob, {JobState, JobType} from "./interfaces/Jobs/IJob"; -import IModifyJobRecord from "./interfaces/records/IModifyJobRecord"; -import IDownloadAvailableJobsRecord from "./interfaces/records/IDownloadAvailableJobsRecord"; +import {deleteData, getData, patchData, postData, putData} from '../../App'; +import IJob, {JobState, JobType} from "../types/Jobs/IJob"; +import IModifyJobRecord from "../types/records/IModifyJobRecord"; +import IDownloadAvailableJobsRecord from "../types/records/IDownloadAvailableJobsRecord"; -export default class JobFunctions +export default class Job { static IntervalStringFromDate(date: Date) : string { let x = new Date(date); @@ -82,10 +82,10 @@ export default class JobFunctions console.error(`JobId was not provided`); return Promise.reject(); } - //console.info(`Getting JobFunctions ${jobId}`); + //console.info(`Getting Job ${jobId}`); return getData(`${apiUri}/v2/Job/${jobId}`) .then((json) => { - //console.info(`Got JobFunctions ${jobId}`); + //console.info(`Got Job ${jobId}`); const ret = json as IJob; //console.debug(ret); return (ret); @@ -111,7 +111,7 @@ export default class JobFunctions } return patchData(`${apiUri}/v2/Job/${jobId}`, modifyData) .then((json) => { - //console.info(`Got JobFunctions ${jobId}`); + //console.info(`Got Job ${jobId}`); const ret = json as IJob; //console.debug(ret); return (ret); @@ -129,7 +129,7 @@ export default class JobFunctions } return putData(`${apiUri}/v2/Job/DownloadAvailableChaptersJob/${mangaId}`, data) .then((json) => { - //console.info(`Got JobFunctions ${jobId}`); + //console.info(`Got Job ${jobId}`); const ret = json as string[]; //console.debug(ret); return (ret); @@ -143,7 +143,7 @@ export default class JobFunctions } return putData(`${apiUri}/v2/Job/DownloadSingleChapterJob/${chapterId}`, {}) .then((json) => { - //console.info(`Got JobFunctions ${jobId}`); + //console.info(`Got Job ${jobId}`); const ret = json as string[]; //console.debug(ret); return (ret); @@ -157,7 +157,7 @@ export default class JobFunctions } return putData(`${apiUri}/v2/Job/UpdateFilesJob/${mangaId}`, {}) .then((json) => { - //console.info(`Got JobFunctions ${jobId}`); + //console.info(`Got Job ${jobId}`); const ret = json as string[]; //console.debug(ret); return (ret); @@ -167,7 +167,7 @@ export default class JobFunctions static async CreateUpdateAllFilesJob(apiUri: string): Promise<string[]> { return putData(`${apiUri}/v2/Job/UpdateAllFilesJob`, {}) .then((json) => { - //console.info(`Got JobFunctions ${jobId}`); + //console.info(`Got Job ${jobId}`); const ret = json as string[]; //console.debug(ret); return (ret); @@ -181,7 +181,7 @@ export default class JobFunctions } return putData(`${apiUri}/v2/Job/UpdateMetadataJob/${mangaId}`, {}) .then((json) => { - //console.info(`Got JobFunctions ${jobId}`); + //console.info(`Got Job ${jobId}`); const ret = json as string[]; //console.debug(ret); return (ret); @@ -191,7 +191,7 @@ export default class JobFunctions static async CreateUpdateAllMetadataJob(apiUri: string): Promise<string[]> { return putData(`${apiUri}/v2/Job/UpdateAllMetadataJob`, {}) .then((json) => { - //console.info(`Got JobFunctions ${jobId}`); + //console.info(`Got Job ${jobId}`); const ret = json as string[]; //console.debug(ret); return (ret); diff --git a/Website/modules/LocalLibraryFunctions.tsx b/Website/modules/api/LocalLibrary.tsx similarity index 89% rename from Website/modules/LocalLibraryFunctions.tsx rename to Website/modules/api/LocalLibrary.tsx index 7fc3669..d96b83b 100644 --- a/Website/modules/LocalLibraryFunctions.tsx +++ b/Website/modules/api/LocalLibrary.tsx @@ -1,8 +1,8 @@ -import ILocalLibrary from "./interfaces/ILocalLibrary"; -import {deleteData, getData, patchData, putData} from "../App"; -import INewLibraryRecord from "./interfaces/records/INewLibraryRecord"; +import {deleteData, getData, patchData, putData} from "../../App"; +import INewLibraryRecord from "../types/records/INewLibraryRecord"; +import ILocalLibrary from "../types/ILocalLibrary"; -export default class LocalLibraryFunctions +export default class LocalLibrary { static async GetLibraries(apiUri: string): Promise<ILocalLibrary[]> { return getData(`${apiUri}/v2/LocalLibraries`) diff --git a/Website/modules/MangaFunctions.tsx b/Website/modules/api/Manga.tsx similarity index 86% rename from Website/modules/MangaFunctions.tsx rename to Website/modules/api/Manga.tsx index 55231c3..5110e7b 100644 --- a/Website/modules/MangaFunctions.tsx +++ b/Website/modules/api/Manga.tsx @@ -1,14 +1,14 @@ -import IManga from './interfaces/IManga'; -import {deleteData, getData, patchData, postData} from '../App'; -import IChapter from "./interfaces/IChapter"; +import {deleteData, getData, patchData, postData} from '../../App'; +import IManga from "../types/IManga"; +import IChapter from "../types/IChapter"; -export default class MangaFunctions +export default class Manga { static async GetAllManga(apiUri: string): Promise<IManga[]> { - //console.info("Getting all MangaFunctions"); + //console.info("Getting all Manga"); return getData(`${apiUri}/v2/Manga`) .then((json) => { - //console.info("Got all MangaFunctions"); + //console.info("Got all Manga"); const ret = json as IManga[]; //console.debug(ret); return (ret); @@ -23,7 +23,7 @@ export default class MangaFunctions //console.debug(`Getting Mangas ${internalIds.join(",")}`); return await postData(`${apiUri}/v2/Manga/WithIds`, mangaIds) .then((json) => { - //console.debug(`Got MangaFunctions ${internalIds.join(",")}`); + //console.debug(`Got Manga ${internalIds.join(",")}`); const ret = json as IManga[]; //console.debug(ret); return (ret); @@ -35,10 +35,10 @@ export default class MangaFunctions console.error(`mangaId was not provided`); return Promise.reject(); } - //console.info(`Getting MangaFunctions ${internalId}`); + //console.info(`Getting Manga ${internalId}`); return await getData(`${apiUri}/v2/Manga/${mangaId}`) .then((json) => { - //console.info(`Got MangaFunctions ${internalId}`); + //console.info(`Got Manga ${internalId}`); const ret = json as IManga; //console.debug(ret); return (ret); @@ -54,7 +54,7 @@ export default class MangaFunctions } static GetMangaCoverImageUrl(apiUri: string, mangaId: string, ref: HTMLImageElement | undefined): string { - //console.debug(`Getting MangaFunctions Cover-Url ${internalId}`); + //console.debug(`Getting Manga Cover-Url ${internalId}`); if(ref == null || ref == undefined) return `${apiUri}/v2/Manga/${mangaId}/Cover?width=64&height=64`; return `${apiUri}/v2/Manga/${mangaId}/Cover?width=${ref.clientWidth}&height=${ref.clientHeight}`; @@ -67,7 +67,7 @@ export default class MangaFunctions } return getData(`${apiUri}/v2/Manga/${mangaId}/Chapters`) .then((json) => { - //console.info(`Got MangaFunctions ${internalId}`); + //console.info(`Got Manga ${internalId}`); const ret = json as IChapter[]; //console.debug(ret); return (ret); @@ -81,7 +81,7 @@ export default class MangaFunctions } return getData(`${apiUri}/v2/Manga/${mangaId}/Chapters/Downloaded`) .then((json) => { - //console.info(`Got MangaFunctions ${internalId}`); + //console.info(`Got Manga ${internalId}`); const ret = json as IChapter[]; //console.debug(ret); return (ret); @@ -95,7 +95,7 @@ export default class MangaFunctions } return getData(`${apiUri}/v2/Manga/${mangaId}/Chapters/NotDownloaded`) .then((json) => { - //console.info(`Got MangaFunctions ${internalId}`); + //console.info(`Got Manga ${internalId}`); const ret = json as IChapter[]; //console.debug(ret); return (ret); @@ -109,7 +109,7 @@ export default class MangaFunctions } return getData(`${apiUri}/v2/Manga/${mangaId}/Chapter/LatestAvailable`) .then((json) => { - //console.info(`Got MangaFunctions ${internalId}`); + //console.info(`Got Manga ${internalId}`); const ret = json as IChapter; //console.debug(ret); return (ret); @@ -123,7 +123,7 @@ export default class MangaFunctions } return getData(`${apiUri}/v2/Manga/${mangaId}/Chapter/LatestDownloaded`) .then((json) => { - //console.info(`Got MangaFunctions ${internalId}`); + //console.info(`Got Manga ${internalId}`); const ret = json as IChapter; //console.debug(ret); return (ret); diff --git a/Website/modules/MangaConnectorFunctions.tsx b/Website/modules/api/MangaConnector.tsx similarity index 92% rename from Website/modules/MangaConnectorFunctions.tsx rename to Website/modules/api/MangaConnector.tsx index 566a091..b58c825 100644 --- a/Website/modules/MangaConnectorFunctions.tsx +++ b/Website/modules/api/MangaConnector.tsx @@ -1,7 +1,7 @@ -import IMangaConnector from './interfaces/IMangaConnector'; -import {getData, patchData} from '../App'; +import IMangaConnector from '../types/IMangaConnector'; +import {getData, patchData} from '../../App'; -export class MangaConnectorFunctions +export class MangaConnector { static async GetAllConnectors(apiUri: string): Promise<IMangaConnector[]> { //console.info("Getting all MangaConnectors"); diff --git a/Website/modules/NotificationConnectorFunctions.tsx b/Website/modules/api/NotificationConnector.tsx similarity index 91% rename from Website/modules/NotificationConnectorFunctions.tsx rename to Website/modules/api/NotificationConnector.tsx index 9d0a49b..d303845 100644 --- a/Website/modules/NotificationConnectorFunctions.tsx +++ b/Website/modules/api/NotificationConnector.tsx @@ -1,11 +1,11 @@ -import INotificationConnector from "./interfaces/INotificationConnector"; -import {deleteData, getData, putData} from "../App"; -import IGotifyRecord from "./interfaces/records/IGotifyRecord"; -import INtfyRecord from "./interfaces/records/INtfyRecord"; -import ILunaseaRecord from "./interfaces/records/ILunaseaRecord"; -import IPushoverRecord from "./interfaces/records/IPushoverRecord"; +import {deleteData, getData, putData} from "../../App"; +import IGotifyRecord from "../types/records/IGotifyRecord"; +import INtfyRecord from "../types/records/INtfyRecord"; +import ILunaseaRecord from "../types/records/ILunaseaRecord"; +import IPushoverRecord from "../types/records/IPushoverRecord"; +import INotificationConnector from "../types/INotificationConnector"; -export default class NotificationConnectorFunctions { +export default class NotificationConnector { static async GetNotificationConnectors(apiUri: string) : Promise<INotificationConnector[]> { //console.info("Getting Notification Connectors"); diff --git a/Website/modules/SearchFunctions.tsx b/Website/modules/api/Search.tsx similarity index 95% rename from Website/modules/SearchFunctions.tsx rename to Website/modules/api/Search.tsx index 2ef8589..1a5979b 100644 --- a/Website/modules/SearchFunctions.tsx +++ b/Website/modules/api/Search.tsx @@ -1,5 +1,5 @@ -import IManga from "./interfaces/IManga"; -import {postData} from "../App"; +import {postData} from "../../App"; +import IManga from "../types/IManga"; export default class SearchFunctions { diff --git a/Website/modules/interfaces/IRequestLimits.ts b/Website/modules/interfaces/IRequestLimits.ts deleted file mode 100644 index 30d0d41..0000000 --- a/Website/modules/interfaces/IRequestLimits.ts +++ /dev/null @@ -1,17 +0,0 @@ -export default interface IRequestLimits { - Default: number; - MangaDexFeed: number; - MangaImage: number; - MangaCover: number; - MangaDexImage: number; - MangaInfo: number; -} - -export enum RequestType { - Default = "Default", - MangaDexFeed = "MangaDexFeed", - MangaImage = "MangaImage", - MangaCover = "MangaCover", - MangaDexImage = "MangaDexImage", - MangaInfo = "MangaInfo" -} \ No newline at end of file diff --git a/Website/modules/types/EnumLibraryType.ts b/Website/modules/types/EnumLibraryType.ts new file mode 100644 index 0000000..5665b04 --- /dev/null +++ b/Website/modules/types/EnumLibraryType.ts @@ -0,0 +1,4 @@ +export enum LibraryType { + Komga = "Komga", + Kavita = "Kavita" +} \ No newline at end of file diff --git a/Website/modules/types/EnumMangaReleaseStatus.ts b/Website/modules/types/EnumMangaReleaseStatus.ts new file mode 100644 index 0000000..aa3c310 --- /dev/null +++ b/Website/modules/types/EnumMangaReleaseStatus.ts @@ -0,0 +1,7 @@ +export enum MangaReleaseStatus { + Continuing = "Continuing", + Completed = "Completed", + OnHiatus = "OnHiatus", + Cancelled = "Cancelled", + Unreleased = "Unreleased", +} \ No newline at end of file diff --git a/Website/modules/types/EnumRequestLimitType.ts b/Website/modules/types/EnumRequestLimitType.ts new file mode 100644 index 0000000..c742b5f --- /dev/null +++ b/Website/modules/types/EnumRequestLimitType.ts @@ -0,0 +1,8 @@ +export enum RequestLimitType { + Default = "Default", + MangaDexFeed = "MangaDexFeed", + MangaImage = "MangaImage", + MangaCover = "MangaCover", + MangaDexImage = "MangaDexImage", + MangaInfo = "MangaInfo" +} \ No newline at end of file diff --git a/Website/modules/types/IAuthor.ts b/Website/modules/types/IAuthor.ts new file mode 100644 index 0000000..2b54e17 --- /dev/null +++ b/Website/modules/types/IAuthor.ts @@ -0,0 +1,4 @@ +export default interface IAuthor { + authorId: string; + authorName: string; +} \ No newline at end of file diff --git a/Website/modules/interfaces/IBackendSettings.tsx b/Website/modules/types/IBackendSettings.ts similarity index 100% rename from Website/modules/interfaces/IBackendSettings.tsx rename to Website/modules/types/IBackendSettings.ts diff --git a/Website/modules/types/IChapter.ts b/Website/modules/types/IChapter.ts new file mode 100644 index 0000000..e255ff6 --- /dev/null +++ b/Website/modules/types/IChapter.ts @@ -0,0 +1,10 @@ +export default interface IChapter{ + chapterId: string; + volumeNumber: number; + chapterNumber: string; + url: string; + title: string | undefined; + archiveFileName: string; + downloaded: boolean; + parentMangaId: string; +} \ No newline at end of file diff --git a/Website/modules/types/IFrontendSettings.ts b/Website/modules/types/IFrontendSettings.ts new file mode 100644 index 0000000..2c1c7c5 --- /dev/null +++ b/Website/modules/types/IFrontendSettings.ts @@ -0,0 +1,4 @@ +export default interface IFrontendSettings { + jobInterval: Date; + apiUri: string; +} \ No newline at end of file diff --git a/Website/modules/interfaces/ILibraryConnector.ts b/Website/modules/types/ILibraryConnector.ts similarity index 67% rename from Website/modules/interfaces/ILibraryConnector.ts rename to Website/modules/types/ILibraryConnector.ts index a477475..7e2322e 100644 --- a/Website/modules/interfaces/ILibraryConnector.ts +++ b/Website/modules/types/ILibraryConnector.ts @@ -1,11 +1,8 @@ +import {LibraryType} from "./EnumLibraryType"; + export default interface ILibraryConnector { libraryConnectorId: string; libraryType: LibraryType; baseUrl: string; auth: string; -} - -export enum LibraryType { - Komga = "Komga", - Kavita = "Kavita" } \ No newline at end of file diff --git a/Website/modules/types/ILink.ts b/Website/modules/types/ILink.ts new file mode 100644 index 0000000..9a26546 --- /dev/null +++ b/Website/modules/types/ILink.ts @@ -0,0 +1,5 @@ +export default interface ILink { + linkId: string; + linkProvider: string; + linkUrl: string; +} \ No newline at end of file diff --git a/Website/modules/types/ILocalLibrary.ts b/Website/modules/types/ILocalLibrary.ts new file mode 100644 index 0000000..11f2bbc --- /dev/null +++ b/Website/modules/types/ILocalLibrary.ts @@ -0,0 +1,5 @@ +export default interface ILocalLibrary { + localLibraryId: string; + basePath: string; + libraryName: string; +} \ No newline at end of file diff --git a/Website/modules/types/IManga.ts b/Website/modules/types/IManga.ts new file mode 100644 index 0000000..9640408 --- /dev/null +++ b/Website/modules/types/IManga.ts @@ -0,0 +1,19 @@ +import {MangaReleaseStatus} from "./EnumMangaReleaseStatus"; + +export default interface IManga{ + mangaId: string; + idOnConnectorSite: string; + name: string; + description: string; + websiteUrl: string; + year: number; + originalLanguage: string; + releaseStatus: MangaReleaseStatus; + folderName: string; + ignoreChapterBefore: number; + mangaConnectorId: string; + authorIds: string[]; + tags: string[]; + linkIds: string[]; + altTitleIds: string[]; +} \ No newline at end of file diff --git a/Website/modules/types/IMangaAltTitle.ts b/Website/modules/types/IMangaAltTitle.ts new file mode 100644 index 0000000..2526df4 --- /dev/null +++ b/Website/modules/types/IMangaAltTitle.ts @@ -0,0 +1,5 @@ +export default interface IMangaAltTitle { + altTitleId: string; + language: string; + title: string; +} \ No newline at end of file diff --git a/Website/modules/interfaces/IMangaConnector.ts b/Website/modules/types/IMangaConnector.ts similarity index 100% rename from Website/modules/interfaces/IMangaConnector.ts rename to Website/modules/types/IMangaConnector.ts diff --git a/Website/modules/types/INotificationConnector.ts b/Website/modules/types/INotificationConnector.ts new file mode 100644 index 0000000..8d2b765 --- /dev/null +++ b/Website/modules/types/INotificationConnector.ts @@ -0,0 +1,7 @@ +export default interface INotificationConnector { + name: string; + url: string; + headers: Record<string, string>[]; + httpMethod: string; + body: string; +} \ No newline at end of file diff --git a/Website/modules/types/IRequestLimits.ts b/Website/modules/types/IRequestLimits.ts new file mode 100644 index 0000000..54a00ec --- /dev/null +++ b/Website/modules/types/IRequestLimits.ts @@ -0,0 +1,8 @@ +export default interface IRequestLimits { + Default: number; + MangaDexFeed: number; + MangaImage: number; + MangaCover: number; + MangaDexImage: number; + MangaInfo: number; +} \ No newline at end of file diff --git a/Website/modules/interfaces/Jobs/IDownloadAvailableChaptersJob.ts b/Website/modules/types/Jobs/IDownloadAvailableChaptersJob.ts similarity index 100% rename from Website/modules/interfaces/Jobs/IDownloadAvailableChaptersJob.ts rename to Website/modules/types/Jobs/IDownloadAvailableChaptersJob.ts diff --git a/Website/modules/interfaces/Jobs/IDownloadMangaCoverJob.ts b/Website/modules/types/Jobs/IDownloadMangaCoverJob.ts similarity index 100% rename from Website/modules/interfaces/Jobs/IDownloadMangaCoverJob.ts rename to Website/modules/types/Jobs/IDownloadMangaCoverJob.ts diff --git a/Website/modules/interfaces/Jobs/IDownloadSingleChapterJob.ts b/Website/modules/types/Jobs/IDownloadSingleChapterJob.ts similarity index 100% rename from Website/modules/interfaces/Jobs/IDownloadSingleChapterJob.ts rename to Website/modules/types/Jobs/IDownloadSingleChapterJob.ts diff --git a/Website/modules/interfaces/Jobs/IJob.ts b/Website/modules/types/Jobs/IJob.ts similarity index 100% rename from Website/modules/interfaces/Jobs/IJob.ts rename to Website/modules/types/Jobs/IJob.ts diff --git a/Website/modules/interfaces/Jobs/IMoveFileOrFolderJob.ts b/Website/modules/types/Jobs/IMoveFileOrFolderJob.ts similarity index 100% rename from Website/modules/interfaces/Jobs/IMoveFileOrFolderJob.ts rename to Website/modules/types/Jobs/IMoveFileOrFolderJob.ts diff --git a/Website/modules/interfaces/Jobs/IMoveMangaLibraryJob.ts b/Website/modules/types/Jobs/IMoveMangaLibraryJob.ts similarity index 100% rename from Website/modules/interfaces/Jobs/IMoveMangaLibraryJob.ts rename to Website/modules/types/Jobs/IMoveMangaLibraryJob.ts diff --git a/Website/modules/interfaces/Jobs/IRetrieveChaptersJob.ts b/Website/modules/types/Jobs/IRetrieveChaptersJob.ts similarity index 100% rename from Website/modules/interfaces/Jobs/IRetrieveChaptersJob.ts rename to Website/modules/types/Jobs/IRetrieveChaptersJob.ts diff --git a/Website/modules/interfaces/Jobs/IUpdateFilesDownloadedJob.ts b/Website/modules/types/Jobs/IUpdateFilesDownloadedJob.ts similarity index 100% rename from Website/modules/interfaces/Jobs/IUpdateFilesDownloadedJob.ts rename to Website/modules/types/Jobs/IUpdateFilesDownloadedJob.ts diff --git a/Website/modules/interfaces/Jobs/IUpdateMetadataJob.ts b/Website/modules/types/Jobs/IUpdateMetadataJob.ts similarity index 100% rename from Website/modules/interfaces/Jobs/IUpdateMetadataJob.ts rename to Website/modules/types/Jobs/IUpdateMetadataJob.ts diff --git a/Website/modules/interfaces/records/IDownloadAvailableJobsRecord.ts b/Website/modules/types/records/IDownloadAvailableJobsRecord.ts similarity index 100% rename from Website/modules/interfaces/records/IDownloadAvailableJobsRecord.ts rename to Website/modules/types/records/IDownloadAvailableJobsRecord.ts diff --git a/Website/modules/types/records/IGotifyRecord.ts b/Website/modules/types/records/IGotifyRecord.ts new file mode 100644 index 0000000..ab8b256 --- /dev/null +++ b/Website/modules/types/records/IGotifyRecord.ts @@ -0,0 +1,8 @@ +import "../../../styles/notificationConnector.css"; +import {isValidUri} from "../../../App"; + +export default interface IGotifyRecord { + endpoint: string; + appToken: string; + priority: number; +} \ No newline at end of file diff --git a/Website/modules/types/records/ILunaseaRecord.ts b/Website/modules/types/records/ILunaseaRecord.ts new file mode 100644 index 0000000..6a441f4 --- /dev/null +++ b/Website/modules/types/records/ILunaseaRecord.ts @@ -0,0 +1,8 @@ +import {ReactElement, useState} from "react"; +import NotificationConnector from "../../api/NotificationConnector"; +import Loader from "../../Loader"; +import "../../../styles/notificationConnector.css"; + +export default interface ILunaseaRecord { + id: string; +} \ No newline at end of file diff --git a/Website/modules/interfaces/records/IModifyJobRecord.ts b/Website/modules/types/records/IModifyJobRecord.ts similarity index 100% rename from Website/modules/interfaces/records/IModifyJobRecord.ts rename to Website/modules/types/records/IModifyJobRecord.ts diff --git a/Website/modules/interfaces/records/INewLibraryRecord.ts b/Website/modules/types/records/INewLibraryRecord.ts similarity index 100% rename from Website/modules/interfaces/records/INewLibraryRecord.ts rename to Website/modules/types/records/INewLibraryRecord.ts diff --git a/Website/modules/types/records/INtfyRecord.ts b/Website/modules/types/records/INtfyRecord.ts new file mode 100644 index 0000000..6470347 --- /dev/null +++ b/Website/modules/types/records/INtfyRecord.ts @@ -0,0 +1,9 @@ +import "../../../styles/notificationConnector.css"; + +export default interface INtfyRecord { + endpoint: string; + username: string; + password: string; + topic: string; + priority: number; +} \ No newline at end of file diff --git a/Website/modules/types/records/IPushoverRecord.tsx b/Website/modules/types/records/IPushoverRecord.tsx new file mode 100644 index 0000000..bdca0b7 --- /dev/null +++ b/Website/modules/types/records/IPushoverRecord.tsx @@ -0,0 +1,6 @@ +import "../../../styles/notificationConnector.css"; + +export default interface IPushoverRecord { + apptoken: string; + user: string; +} \ No newline at end of file diff --git a/tranga-website/.gitignore b/tranga-website/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/tranga-website/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/tranga-website/README.md b/tranga-website/README.md new file mode 100644 index 0000000..40ede56 --- /dev/null +++ b/tranga-website/README.md @@ -0,0 +1,54 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config({ + extends: [ + // Remove ...tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default tseslint.config({ + plugins: { + // Add the react-x and react-dom plugins + 'react-x': reactX, + 'react-dom': reactDom, + }, + rules: { + // other rules... + // Enable its recommended typescript rules + ...reactX.configs['recommended-typescript'].rules, + ...reactDom.configs.recommended.rules, + }, +}) +``` diff --git a/tranga-website/eslint.config.js b/tranga-website/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/tranga-website/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/tranga-website/index.html b/tranga-website/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/tranga-website/index.html @@ -0,0 +1,13 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <link rel="icon" type="image/svg+xml" href="/vite.svg" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>Vite + React + TS</title> + </head> + <body> + <div id="root"></div> + <script type="module" src="/src/main.tsx"></script> + </body> +</html> diff --git a/tranga-website/package-lock.json b/tranga-website/package-lock.json new file mode 100644 index 0000000..47c817d --- /dev/null +++ b/tranga-website/package-lock.json @@ -0,0 +1,4225 @@ +{ + "name": "tranga-website", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tranga-website", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@fontsource/inter": "^5.2.5", + "@mui/icons-material": "^7.0.1", + "@mui/joy": "^5.0.0-beta.52", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", + "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", + "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.12.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@fontsource/inter": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.5.tgz", + "integrity": "sha512-kbsPKj0S4p44JdYRFiW78Td8Ge2sBVxi/PIBwmih+RpSXUdvS9nbs1HIiuUSPtRMi14CqLEZ/fbk7dj7vni1Sg==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.40-1", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40-1.tgz", + "integrity": "sha512-agKXuNNy0bHUmeU7pNmoZwNFr7Hiyhojkb9+2PVyDG5+6RafYuyMgbrav8CndsB7KUc/U51JAw9vKNDLYBzaUA==", + "deprecated": "This package has been replaced by @base-ui-components/react", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.17.1.tgz", + "integrity": "sha512-OcZj+cs6EfUD39IoPBOgN61zf1XFVY+imsGoBDwXeSq2UHJZE3N59zzBOVjclck91Ne3e9gudONOeILvHCIhUA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.0.1.tgz", + "integrity": "sha512-x8Em7LISFQ6s/KeZj6ZKwJHq2WttRNe9KJLWFa72eQx7B53s/TzMKOEjGKB/YyhOx+bqqSv1pMvK373M4Xf07A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^7.0.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/joy": { + "version": "5.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@mui/joy/-/joy-5.0.0-beta.52.tgz", + "integrity": "sha512-e8jQanA5M1f/X52mJrw0UIW8Er7EAHuLuigmGFw7yIsAgIluhIP4rZ7JcbVrUi6z5Gk0weC9QWUUtjLejAbO8g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40-1", + "@mui/core-downloads-tracker": "^5.17.1", + "@mui/system": "^5.17.1", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.0.1.tgz", + "integrity": "sha512-tQwjIIsn/UUSCHoCIQVkANuLua67h7Ro9M9gIHoGWaFbJFuF6cSO4Oda2olDVqIs4SWG+PaDChuu6SngxsaoyQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/core-downloads-tracker": "^7.0.1", + "@mui/system": "^7.0.1", + "@mui/types": "^7.4.0", + "@mui/utils": "^7.0.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^7.0.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@mui/core-downloads-tracker": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.0.1.tgz", + "integrity": "sha512-T5DNVnSD9pMbj4Jk/Uphz+yvj9dfpl2+EqsOuJtG12HxEihNG5pd3qzX5yM1Id4dDwKRvM3dPVcxyzavTFhJeA==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material/node_modules/@mui/private-theming": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.0.1.tgz", + "integrity": "sha512-1kQ7REYjjzDukuMfTbAjm3pLEhD7gUMC2bWhg9VD6f6sHzyokKzX0XHzlr3IdzNWBjPytGkzHpPIRQrUOoPLCQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/utils": "^7.0.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@mui/styled-engine": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.0.1.tgz", + "integrity": "sha512-BeGe4xZmF7tESKhmctYrL54Kl25kGHPKVdZYM5qj5Xz76WM/poY+d8EmAqUesT6k2rbJWPp2gtOAXXinNCGunQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@mui/system": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.0.1.tgz", + "integrity": "sha512-pK+puz0hRPHEKGlcPd80mKYD3jpyi0uVIwWffox1WZgPTQMw2dCKLcD+9ndMDJADnrKzmKlpoH756PPFh2UvWA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/private-theming": "^7.0.1", + "@mui/styled-engine": "^7.0.1", + "@mui/types": "^7.4.0", + "@mui/utils": "^7.0.1", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@mui/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.0.tgz", + "integrity": "sha512-TxJ4ezEeedWHBjOmLtxI203a9DII9l4k83RXmz1PYSAmnyEcK2PglTNmJGxswC/wM5cdl9ap2h8lnXvt2swAGQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@mui/utils": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.0.1.tgz", + "integrity": "sha512-SJKrrebNpmK9rJCnVL29nGPhPXQYtBZmb7Dsp0f58uIUhQfAKcBXHE4Kjs06SX4CwqeCuwEVgcHY+MgAO6XQ/g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/types": "^7.4.0", + "@types/prop-types": "^15.7.14", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", + "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.17.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.16.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.14.tgz", + "integrity": "sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.13.5", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.17.1.tgz", + "integrity": "sha512-aJrmGfQpyF0U4D4xYwA6ueVtQcEMebET43CUmKMP7e7iFh3sMIF3sBR0l8Urb4pqx1CBjHAaWgB0ojpND4Q3Jg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.16.14", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", + "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "~7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", + "integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz", + "integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz", + "integrity": "sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz", + "integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz", + "integrity": "sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz", + "integrity": "sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz", + "integrity": "sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz", + "integrity": "sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz", + "integrity": "sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz", + "integrity": "sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz", + "integrity": "sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz", + "integrity": "sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz", + "integrity": "sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz", + "integrity": "sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz", + "integrity": "sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz", + "integrity": "sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz", + "integrity": "sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz", + "integrity": "sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz", + "integrity": "sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz", + "integrity": "sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.0.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz", + "integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", + "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.28.0.tgz", + "integrity": "sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.28.0", + "@typescript-eslint/type-utils": "8.28.0", + "@typescript-eslint/utils": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.28.0.tgz", + "integrity": "sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.28.0", + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/typescript-estree": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.28.0.tgz", + "integrity": "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.28.0.tgz", + "integrity": "sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.28.0", + "@typescript-eslint/utils": "8.28.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.28.0.tgz", + "integrity": "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.28.0.tgz", + "integrity": "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.28.0.tgz", + "integrity": "sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.28.0", + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/typescript-estree": "8.28.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.28.0.tgz", + "integrity": "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.28.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001707", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", + "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.128", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz", + "integrity": "sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", + "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.2", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.23.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", + "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-is": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", + "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.38.0.tgz", + "integrity": "sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.38.0", + "@rollup/rollup-android-arm64": "4.38.0", + "@rollup/rollup-darwin-arm64": "4.38.0", + "@rollup/rollup-darwin-x64": "4.38.0", + "@rollup/rollup-freebsd-arm64": "4.38.0", + "@rollup/rollup-freebsd-x64": "4.38.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.38.0", + "@rollup/rollup-linux-arm-musleabihf": "4.38.0", + "@rollup/rollup-linux-arm64-gnu": "4.38.0", + "@rollup/rollup-linux-arm64-musl": "4.38.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.38.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.38.0", + "@rollup/rollup-linux-riscv64-gnu": "4.38.0", + "@rollup/rollup-linux-riscv64-musl": "4.38.0", + "@rollup/rollup-linux-s390x-gnu": "4.38.0", + "@rollup/rollup-linux-x64-gnu": "4.38.0", + "@rollup/rollup-linux-x64-musl": "4.38.0", + "@rollup/rollup-win32-arm64-msvc": "4.38.0", + "@rollup/rollup-win32-ia32-msvc": "4.38.0", + "@rollup/rollup-win32-x64-msvc": "4.38.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.28.0.tgz", + "integrity": "sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.28.0", + "@typescript-eslint/parser": "8.28.0", + "@typescript-eslint/utils": "8.28.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", + "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/tranga-website/package.json b/tranga-website/package.json new file mode 100644 index 0000000..a0ef580 --- /dev/null +++ b/tranga-website/package.json @@ -0,0 +1,34 @@ +{ + "name": "tranga-website", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@fontsource/inter": "^5.2.5", + "@mui/icons-material": "^7.0.1", + "@mui/joy": "^5.0.0-beta.52", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0" + } +} diff --git a/tranga-website/public/blahaj.png b/tranga-website/public/blahaj.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbff934c85bbc6a8d317c975cf70d2229615a36 GIT binary patch literal 126603 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/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�RAc%B+o4bw_dCz|{s>*OaZYa0T<S#1#%L9Xc<F zi;_4m38ka;&=Bc}h8KboG+4M(jH6IN`<zqM?XM;R8f-CzlmefzJ|^YS=!t(%+{poy z3305KMnFU8;Z$wkL^K9MXbGW1W9S2XvRlBpB!Tt`PR3WA_};OkI?md>+smLf4;<UQ zPAXY89LpulcA45Z$%p>0WT`BjJ=tQr93vmz3F~`Js;5n{+Kn-qc9$b3+P0={wnT|Y z0Y&NX#V{x0l6L3DbCwoyHg6_kJplcg33H(FCZJi!ZRjCddn};*PcZ>QT#xhPg3_+n zXxAnLP^BmY1Mle&iCkSh=i=gwciwsQ`{x(c2T^l&bM}42yy*VQ#`~|&B!ZblvemV$ z3LZYZ_s#qF&-l@ge!}HtO;J=dU4uAJDW!$_A%rdvyGXSv**2js(%XfIcOK6a52KeX zNj7Yalfu5OWTd>L@T=gWQmDP=3a)91>zZ)2LAP66gi?gUIaC962*g>5J6^%EB36~b zrn(gK;y}DldUy^$q$jC^nZS;_1Wc3dv_WG}a58gAMh%mtlir`!CfOuHl0YPLBJ394 zn>|WWQj_VjBpYv%G6X~-Aw(;Qq)OqTEIqTT$eb<t00d$Rtz?Mtev#yHYdBys(@37j zG(0)0)s7{ZLr1cfjQ3E^u<aEtvacXV2K87LJNF;Q`A(PsuL*Z<g84EGQ>R13(=>3s z-Lh>rs8~>J7aKYZPB`=lf2KWqjVUrK#XCvLMoh$6RdHD*O`k0XBdw5R;xpRmhRGKo zIiz!86dx6-Th`kvwpUkZ)1*8IM_D*D2E2o^@T|AWd+)u)+i$=5FP#&X%fd8GiHKys z(V$EIRkXiWlZXg?omc0ClVktUTW>x3&JX_MU;dqsKmNo(@zo&?b4COuhK^>trQL3s zpDZcGq82(#Dl@!kQpI%J%rU()TmVc8O~`s+gsBq}TAn%MT!12~MS^rz<4v{=zU?ft zQVaz@29QE1s~LVdC(KJi=?Ttka537Vb4eXD!kMbUYl4i;#3m61#iWgF5q3Ha(9hb# zDEJ1F=0K)B=~xbh9~h-c%iakgXzGLF#R^PV>VHIILl?FbR21HuQz=@J2`9F=ivr5R zB$+PQhRRGPxA8Kb8cXs)?HSkPSpWNBtxSJ2CaNhUY;wvW(?yO68Tu&59%0^fj82@5 zyM1}xEX>x~%2ZXh+nTniQ968~c%L$7B_&)5M5m~?SM=JOK03*!$($KY|JNncoO7=K zoFOViHHDi-gJ+f@|5-#SBFx3$E`kOwub$yT3))#Co-Yy}Tcm5Zv`xc1Z@<CUzWUZb zeemG?{SechA>h)p42GOvdI|dm{qn#$rrH`Qs!DkB#=}3jcklG?{NVdPplvti@QNK# z3Zj}6%@*o)#e6%*JM%;<5f?h6y2*~&JLAad?50XP1s5Vdq=0@mNNzDLI*C^5-nWtZ za*b|kq;4tNV9pOBAqFC9W$&wkSPDv@3)$Rb_w^1WSn`n7l+zKxHe%kJWU^#DXzo3c zkkNN)Vz?2U?1;-wMj%noMEuj3WWmFbB9YJy1U^qm01aET+oGYSi!IKTl-{ASBeXST zSrWCO>$V70Z>}&YKgZ(^mmG+(-eGBsiDM?LGWlz~XuL_{Fm8G7W#^~)j|^7MyKJ*b zb(6dP=nK|*k|hSKdUbutwqDb9HC<O*n4T+8XDQ!^pq+=d10R64hpcdEvAdCFI>-Jy zamkD_5Nz)R@9j)8``P(kOxhMn!GOtZs3FpA)@+`Cj5aN<4d%P?o~|<+Ul(e;SHAky zcX|5s{vWPZ)m47Z@!u>6{#CZmfnZN1tlQ5Vg`=6JfQOGRzWMe$PyVkTeDIUwdTT?X z>QM@Co>~KLRx&%PIGTBi`OHiYnDe6xsmxH4Fja>dab|W^e3G1fFwWdL3%LuDVzi?o z(d^f*iLAG42#%ttsDRQHCOs304*a5`JYJ&n8IAWef=T>X2-7$QESunp6w#6kFStxb zdV)+cjaUl4g(@b3ELlZQM7&?9t~VQyj`iVgDfG!cSSTNw%~HvEnd(sbdJY#ybc;DO zkwQGBb2yEJu4KL_SguOCuth0NVjpqHz1f!$#e4z58#_?b5Ts+tj3I+Y(XS(=k0>&2 zW_-OYCFiS6CFaAQ^S!6%zm}{Ix9mg7PW`s6nav8$&W<Rn3ZlnV6*x~2p#y?<Xj!21 z5-m$wakOH^JU}S2bljWqBoSY;efzY|3-43L?XZsqe+5ST)0%LhMOtVpA+Ac?%u}e? z3xUv?&0OZJj_3UP*T3>lFD_2L?fmeJnQ=f!VW;|{CH+d9yn3XuyAW)Pi;N*!>?JPQ zoE@n0)1Q6vD?j<kr~eChL<$4*$5U1no35c1MGJ>iCDm#{8v~shPz&OFsVYlSISo8J z3tUi&Xi*=65$jGMI!i(UiwtqWh`Vniu8T+)EFuIf;J*;?DOAZ@NM9#nMRk*yC%p!s zy^Xmi*gBXwdO1!Q($0G#uR8=c6OnA479f(r^(EiCC+PV%HufUf1e3zmqM8#jL@HMh z>W2DyOQD{UA~`uDg(%J`K^vAwCGUOt4e;4tFi5rIxawUZcjIy!OZq#jDPKp%2gcVM z5n~t#_U^rJBDgo5H@5B^I%oVWUrb_drVf!D*<p!aS62-`{_%&b*A2dy(Ked0kgZ@x zOSBNzRDCIy1uf7y6PP3sY?sDAYpQmKB#7uJV^*`-aio~aG*(*_3TH$))D5BTh;_@d zoKbmCXj&vj#3`x)=k)*l<*z>Z$FoJ%=XsRH2)Bsr9~&q0eE#kK4@WoLr|Fo~6aWAK M07*qoM6N<$f<B1CzyJUM literal 0 HcmV?d00001 diff --git a/tranga-website/src/App.css b/tranga-website/src/App.css new file mode 100644 index 0000000..f4189d1 --- /dev/null +++ b/tranga-website/src/App.css @@ -0,0 +1,15 @@ +.app { + position: absolute; + height: 100%; + top: 0; + width: 100%; + left: 0; +} + +.app-content { + position: absolute; + height: calc(100% - 60px); + top: 60px; + width: 100%; + left: 0; +} \ No newline at end of file diff --git a/tranga-website/src/App.tsx b/tranga-website/src/App.tsx new file mode 100644 index 0000000..7f2327b --- /dev/null +++ b/tranga-website/src/App.tsx @@ -0,0 +1,31 @@ +import Sheet from '@mui/joy/Sheet'; +import './App.css' +import Settings from "./Settings.tsx"; +import Header from "./Header.tsx"; +import {Button} from "@mui/joy"; +import {useState} from "react"; +import {ApiUriContext} from "./api/fetchApi.tsx"; +import Search from './Components/Search.tsx'; + +export default function App () { + + const [showSettings, setShowSettings] = useState<boolean>(false); + const [showSearch, setShowSearch] = useState<boolean>(false); + + const [apiUri, setApiUri] = useState<string>(window.location.href.substring(0, window.location.href.lastIndexOf("/"))); + + return ( + <ApiUriContext.Provider value={apiUri}> + <Sheet className={"app"}> + <Header> + <Button onClick={() => setShowSettings(true)}>Settings</Button> + <Button onClick={() => setShowSearch(true)}>Search</Button> + </Header> + <Settings open={showSettings} setOpen={setShowSettings} setApiUri={setApiUri}/> + <Sheet className={"app-content"}> + <Search open={showSearch} setOpen={setShowSearch} /> + </Sheet> + </Sheet> + </ApiUriContext.Provider> + ); +} diff --git a/tranga-website/src/Components/AuthorTag.tsx b/tranga-website/src/Components/AuthorTag.tsx new file mode 100644 index 0000000..b5a678c --- /dev/null +++ b/tranga-website/src/Components/AuthorTag.tsx @@ -0,0 +1,23 @@ +import {Chip, ColorPaletteProp, Skeleton} from "@mui/joy"; +import {useContext, useEffect, useState} from "react"; +import {ApiUriContext} from "../api/fetchApi.tsx"; +import IAuthor from "../api/types/IAuthor.ts"; +import {GetAuthor} from "../api/Query.tsx"; + +export default function AuthorTag({authorId, color} : { authorId: string | undefined, color?: ColorPaletteProp }) { + const useAuthor = authorId ?? "AuthorId"; + const apiUri = useContext(ApiUriContext); + + const [author, setAuthor] = useState<IAuthor>(); + const [loading, setLoading] = useState<boolean>(true); + + useEffect(() => { + GetAuthor(apiUri, useAuthor).then(setAuthor).finally(() => setLoading(false)); + }, [authorId]); + + return ( + <Chip variant={"outlined"} size={"md"} color={color??"primary"}> + <Skeleton variant={"text"} loading={loading}>{author?.authorName ?? "Load Failed"}</Skeleton> + </Chip> + ); +} \ No newline at end of file diff --git a/tranga-website/src/Components/LinkTag.tsx b/tranga-website/src/Components/LinkTag.tsx new file mode 100644 index 0000000..28d6329 --- /dev/null +++ b/tranga-website/src/Components/LinkTag.tsx @@ -0,0 +1,25 @@ +import {Chip, Skeleton, Link, ColorPaletteProp} from "@mui/joy"; +import {useContext, useEffect, useState} from "react"; +import {ApiUriContext} from "../api/fetchApi.tsx"; +import {GetLink} from "../api/Query.tsx"; +import ILink from "../api/types/ILink.ts"; + +export default function LinkTag({linkId, color} : { linkId: string | undefined, color?: ColorPaletteProp }) { + const useLink = linkId ?? "LinkId"; + const apiUri = useContext(ApiUriContext); + + const [link, setLink] = useState<ILink>(); + const [loading, setLoading] = useState<boolean>(true); + + useEffect(() => { + GetLink(apiUri, useLink).then(setLink).finally(() => setLoading(false)); + }, [linkId]); + + return ( + <Chip variant={"outlined"} size={"md"} color={color??"primary"}> + <Skeleton variant={"text"} loading={loading}> + <Link href={link?.linkUrl}>{link?.linkProvider??"Load Failed"}</Link> + </Skeleton> + </Chip> + ); +} \ No newline at end of file diff --git a/tranga-website/src/Components/Manga.tsx b/tranga-website/src/Components/Manga.tsx new file mode 100644 index 0000000..cc53b0e --- /dev/null +++ b/tranga-website/src/Components/Manga.tsx @@ -0,0 +1,132 @@ +import { + Badge, + Box, + Card, + CardActions, + CardContent, CardCover, + Chip, CircularProgress, + Input, + Link, + Skeleton, + Stack, + Typography +} from "@mui/joy"; +import IManga, {DefaultManga} from "../api/types/IManga.ts"; +import {ReactElement, useCallback, useContext, useEffect, useState} from "react"; +import {GetLatestChapterAvailable, GetMangaCoverImageUrl, SetIgnoreThreshold} from "../api/Manga.tsx"; +import {ApiUriContext} from "../api/fetchApi.tsx"; +import AuthorTag from "./AuthorTag.tsx"; +import LinkTag from "./LinkTag.tsx"; +import {ReleaseStatusToPalette} from "../api/types/EnumMangaReleaseStatus.ts"; +import IChapter from "../api/types/IChapter.ts"; +import MarkdownPreview from "@uiw/react-markdown-preview"; +import {SxProps} from "@mui/joy/styles/types"; + +export function Manga({manga, children} : { manga: IManga | undefined, children?: ReactElement<any, any> | ReactElement<any, any>[] | undefined }) { + const useManga = manga ?? DefaultManga; + + const apiUri = useContext(ApiUriContext); + + const [expanded, setExpanded] = useState(false); + + const [mangaMaxChapter, setMangaMaxChapter] = useState<IChapter>(); + const [maxChapterLoading, setMaxChapterLoading] = useState<boolean>(true); + const loadMaxChapter = useCallback(() => { + setMaxChapterLoading(true); + GetLatestChapterAvailable(apiUri, useManga.mangaId) + .then(setMangaMaxChapter) + .finally(() => setMaxChapterLoading(false)); + }, [useManga, apiUri]); + + const [updatingThreshold, setUpdatingThreshold] = useState<boolean>(false); + const updateIgnoreThreshhold = useCallback((value: number) => { + setUpdatingThreshold(true); + SetIgnoreThreshold(apiUri, useManga.mangaId, value).finally(() => setUpdatingThreshold(false)); + },[useManga, apiUri]) + + useEffect(() => { + loadMaxChapter(); + }, []); + + const LoadMangaCover = useCallback((e : EventTarget & HTMLImageElement) => { + if(e.src != GetMangaCoverImageUrl(apiUri, useManga.mangaId, e)) + e.src = GetMangaCoverImageUrl(apiUri, useManga.mangaId, e); + }, [useManga, apiUri]) + + const sideSx : SxProps = { + height: "400px", + width: "300px", + position: "relative", + } + + const interactiveElements = ["button", "input", "textarea", "a"]; + + return ( + <Badge badgeContent={useManga.mangaConnectorId} color={ReleaseStatusToPalette(useManga.releaseStatus)} size={"lg"}> + <Card sx={{height:"fit-content",width:"fit-content"}} onClick={(e) => { + const target = e.target as HTMLElement; + if(interactiveElements.find(x => x == target.localName) == undefined) + setExpanded(!expanded)} + }> + <CardCover sx={{margin: "var(--Card-padding)"}}> + <img style={{maxHeight:"100%",height:"400px",width:"300px"}} src="/blahaj.png" alt="Manga Cover" + onLoad={(e) => LoadMangaCover(e.currentTarget)} + onResize={(e) => LoadMangaCover(e.currentTarget)}/> + </CardCover> + <CardCover sx={{ + background: + 'linear-gradient(to bottom, rgba(0,0,0,0.4), rgba(0,0,0,0) 200px), linear-gradient(to bottom, rgba(0,0,0,0.8), rgba(0,0,0,0) 300px)', + }}/> + <CardContent sx={{display: "flex", alignItems: "center", flexFlow: "row nowrap"}}> + <Box sx={sideSx}> + <Link href={useManga.websiteUrl} level={"h1"} sx={{height:"min-content",width:"fit-content",color:"white",margin:"0 0 0 10px"}}> + {useManga.name} + </Link> + </Box> + { + expanded ? + <Box sx={sideSx}> + <Stack direction={"row"} flexWrap={"wrap"} spacing={0.5}> + {useManga.authorIds.map(authorId => <AuthorTag key={authorId} authorId={authorId} color={"success"} />)} + {useManga.tags.map(tag => <Chip key={tag} variant={"outlined"} size={"md"} color={"primary"}>{tag}</Chip>)} + {useManga.linkIds.map(linkId => <LinkTag key={linkId} linkId={linkId} color={"danger"} />)} + </Stack> + <MarkdownPreview source={useManga.description} style={{backgroundColor: "transparent", color: "black"}} /> + </Box> + : null + } + </CardContent> + { + expanded ? + <CardActions sx={{justifyContent:"space-between"}}> + <Input + type={"number"} + placeholder={"0.0"} + startDecorator={ + <> + { + updatingThreshold ? + <CircularProgress color={"primary"} size={"sm"} /> + : <Typography>Ch.</Typography> + } + </> + } + endDecorator={ + <Typography> + <Skeleton loading={maxChapterLoading}> + /{mangaMaxChapter?.chapterNumber??"Load Failed"} + </Skeleton> + </Typography> + } + sx={{width:"min-content"}} + size={"md"} + onChange={(e) => updateIgnoreThreshhold(e.currentTarget.valueAsNumber)} + /> + {children} + </CardActions> + : null + } + </Card> + </Badge> + ); +} \ No newline at end of file diff --git a/tranga-website/src/Components/Search.tsx b/tranga-website/src/Components/Search.tsx new file mode 100644 index 0000000..ab34ef1 --- /dev/null +++ b/tranga-website/src/Components/Search.tsx @@ -0,0 +1,142 @@ +import { + Avatar, Button, Chip, + Drawer, + Input, + ListItemDecorator, + Option, + Select, + SelectOption, + Skeleton, Stack, + Step, + StepIndicator, + Stepper, Typography +} from "@mui/joy"; +import ModalClose from "@mui/joy/ModalClose"; +import IMangaConnector from "../api/types/IMangaConnector"; +import {useCallback, useContext, useEffect, useState} from "react"; +import {ApiUriContext} from "../api/fetchApi.tsx"; +import {GetAllConnectors} from "../api/MangaConnector.tsx"; +import IManga from "../api/types/IManga.ts"; +import {SearchNameOnConnector} from "../api/Search.tsx"; +import {Manga} from "./Manga.tsx"; +import Add from "@mui/icons-material/Add"; +import React from "react"; +import {CreateDownloadAvailableChaptersJob} from "../api/Job.tsx"; + +export default function Search({open, setOpen}:{open:boolean, setOpen:React.Dispatch<React.SetStateAction<boolean>>}){ + + const [step, setStep] = useState<number>(1); + + const apiUri = useContext(ApiUriContext); + const [mangaConnectors, setMangaConnectors] = useState<IMangaConnector[]>([]); + const [mangaConnectorsLoading, setMangaConnectorsLoading] = useState<boolean>(true); + const [selectedMangaConnector, setSelectedMangaConnector] = useState<IMangaConnector>(); + + useEffect(() => { + setMangaConnectorsLoading(true); + GetAllConnectors(apiUri).then(setMangaConnectors).finally(() => setMangaConnectorsLoading(false)); + },[apiUri]) + + const [results, setResults] = useState<IManga[]>([]); + const [resultsLoading, setResultsLoading] = useState<boolean>(false); + + const StartSearch = useCallback((mangaConnector : IMangaConnector | undefined, value: string)=>{ + if(mangaConnector === undefined) + return; + setResults([]); + setResultsLoading(true); + SearchNameOnConnector(apiUri, mangaConnector.name, value).then(setResults).finally(() => setResultsLoading(false)); + },[apiUri]) + + function renderValue(option: SelectOption<string> | null) { + if (!option) { + return null; + } + + return ( + <React.Fragment> + <ListItemDecorator> + <Avatar size="sm" src={mangaConnectors.find((o) => o.name === option.value)?.iconUrl} /> + </ListItemDecorator> + {option.label} + </React.Fragment> + ); + } + + return ( + <Drawer size={"lg"} anchor={"right"} open={open} onClose={() => { + setStep(2); + setResults([]); + setOpen(false); + }}> + <ModalClose /> + <Stepper orientation={"vertical"} sx={{ height: '100%', width: "calc(100% - 80px)", margin:"40px"}}> + <Step indicator={ + <StepIndicator variant="solid" color="primary"> + 1 + </StepIndicator>}> + <Skeleton loading={mangaConnectorsLoading}> + <Select + disabled={mangaConnectorsLoading || resultsLoading} + placeholder={"Select Connector"} + slotProps={{ + listbox: { + sx: { + '--ListItemDecorator-size': '44px', + }, + }, + }} + sx={{ '--ListItemDecorator-size': '44px', minWidth: 240 }} + renderValue={renderValue} + onChange={(_e, newValue) => { + setStep(2); + setSelectedMangaConnector(mangaConnectors.find((o) => o.name === newValue)); + }} + endDecorator={<Chip size={"sm"} color={"primary"}>{mangaConnectors.length}</Chip>}> + {mangaConnectors?.map((connector: IMangaConnector) => ConnectorOption(connector))} + </Select> + </Skeleton> + </Step> + <Step indicator={ + <StepIndicator variant="solid" color="primary"> + 2 + </StepIndicator>}> + <Input disabled={step < 2 || resultsLoading} placeholder={"Name or Url " + (selectedMangaConnector ? selectedMangaConnector.baseUris[0] : "")} onKeyDown={(e) => { + setStep(2); + setResults([]); + if(e.key === "Enter") { + StartSearch(selectedMangaConnector, e.currentTarget.value); + } + }}/> + </Step> + <Step indicator={ + <StepIndicator variant="solid" color="primary"> + 3 + </StepIndicator>}> + <Typography>Results</Typography> + <Skeleton loading={resultsLoading}> + <Stack direction={"row"} spacing={1}> + {results.map((result) => + <Manga key={result.mangaId} manga={result}> + <Button onClick={() => { + CreateDownloadAvailableChaptersJob(apiUri, result.mangaId, {localLibraryId: "",recurrenceTimeMs: 1000 * 60 * 60 * 3}) + }} endDecorator={<Add />}>Watch</Button> + </Manga>)} + </Stack> + </Skeleton> + </Step> + </Stepper> + </Drawer> + ); +} + +function ConnectorOption(connector: IMangaConnector){ + return ( + <Option key={connector.name} value={connector.name} sx={{position: "relative"}}> + <ListItemDecorator> + <Avatar size="sm" src={connector.iconUrl} /> + </ListItemDecorator> + {connector.name} + </Option> + ); +} \ No newline at end of file diff --git a/tranga-website/src/Header.css b/tranga-website/src/Header.css new file mode 100644 index 0000000..f03d6b0 --- /dev/null +++ b/tranga-website/src/Header.css @@ -0,0 +1,10 @@ +.header { + position: static !important; + top: 0; + left: 0; + width: 100%; + height: 60px; + padding: 10px; + display: flex; + flex-flow: row nowrap; +} \ No newline at end of file diff --git a/tranga-website/src/Header.tsx b/tranga-website/src/Header.tsx new file mode 100644 index 0000000..0ccd651 --- /dev/null +++ b/tranga-website/src/Header.tsx @@ -0,0 +1,20 @@ +import Sheet from "@mui/joy/Sheet"; +import {Stack, Typography} from "@mui/joy"; +import {ReactElement} from "react"; +import './Header.css'; + +export default function Header({children} : {children? : ReactElement<any, any> | ReactElement<any,any>[] | undefined}) : ReactElement { + return ( + <Sheet className={"header"}> + <Stack direction={"row"} + spacing={4} + sx={{ + justifyContent: "flex-start", + alignItems: "center", + }}> + <Typography level={"h2"}>Tranga</Typography> + {children} + </Stack> + </Sheet> + ); +} \ No newline at end of file diff --git a/Website/modules/LibraryConnector.tsx b/tranga-website/src/Settings.css similarity index 100% rename from Website/modules/LibraryConnector.tsx rename to tranga-website/src/Settings.css diff --git a/tranga-website/src/Settings.tsx b/tranga-website/src/Settings.tsx new file mode 100644 index 0000000..852537f --- /dev/null +++ b/tranga-website/src/Settings.tsx @@ -0,0 +1,93 @@ +import Drawer from '@mui/joy/Drawer'; +import ModalClose from '@mui/joy/ModalClose'; +import { + Accordion, + AccordionDetails, + AccordionGroup, + AccordionSummary, CircularProgress, ColorPaletteProp, + DialogContent, + DialogTitle, Input +} from "@mui/joy"; +import './Settings.css'; +import * as React from "react"; +import {useContext, useEffect, useState} from "react"; +import {ApiUriContext} from "./api/fetchApi.tsx"; + +const checkConnection = async (apiUri: string): Promise<boolean> =>{ + return fetch(`${apiUri}/swagger/v2/swagger.json`, + { + method: 'GET', + }) + .then((response) => { + if(!(response.ok && response.status == 200)) + return false; + return response.json().then((json) => (json as {openapi:string}).openapi.match("[0-9]+(?:\.[0-9]+)+")?true:false).catch(() => false); + }) + .catch(() => { + return false; + }); +} + +export default function Settings({open, setOpen, setApiUri}:{open:boolean, setOpen:React.Dispatch<React.SetStateAction<boolean>>, setApiUri:React.Dispatch<React.SetStateAction<string>>}) { + + const apiUri = useContext(ApiUriContext); + + const [apiUriColor, setApiUriColor] = useState<ColorPaletteProp>("neutral"); + const timerRef = React.useRef<ReturnType<typeof setTimeout>>(undefined); + + const [apiUriAccordionOpen, setApiUriAccordionOpen] = React.useState(true); + const [checking, setChecking] = useState(false); + useEffect(() => { + OnCheckConnection(apiUri); + }, []); + + const apiUriChanged = (e : React.ChangeEvent<HTMLInputElement>) => { + clearTimeout(timerRef.current); + setApiUriColor("warning"); + timerRef.current = setTimeout(() => { + OnCheckConnection(e.target.value); + }, 1000); + } + + const OnCheckConnection = (uri: string) => { + setChecking(true); + checkConnection(uri) + .then((result) => { + setApiUriAccordionOpen(!result); + setApiUriColor(result ? "success" : "danger"); + if(result) + setApiUri(uri); + }) + .finally(() => setChecking(false)); + } + + return ( + <Drawer size={"md"} open={open} onClose={() => setOpen(false)}> + <ModalClose /> + <DialogTitle>Settings</DialogTitle> + <DialogContent> + <AccordionGroup> + <Accordion expanded={apiUriAccordionOpen} onChange={(_e, expanded) => setApiUriAccordionOpen(expanded)}> + <AccordionSummary>ApiUri</AccordionSummary> + <AccordionDetails> + <Input + disabled={checking} + color={apiUriColor} + placeholder={"http(s)://"} + type={"url"} + defaultValue={apiUri} + onChange={apiUriChanged} + onKeyDown={(e) => { + if(e.key === "Enter") { + clearTimeout(timerRef.current); + OnCheckConnection(e.currentTarget.value); + } + }} + endDecorator={(checking ? <CircularProgress color={apiUriColor} size={"sm"} /> : null)} /> + </AccordionDetails> + </Accordion> + </AccordionGroup> + </DialogContent> + </Drawer> + ); +} \ No newline at end of file diff --git a/tranga-website/src/api/BackendSettings.tsx b/tranga-website/src/api/BackendSettings.tsx new file mode 100644 index 0000000..6a9cc34 --- /dev/null +++ b/tranga-website/src/api/BackendSettings.tsx @@ -0,0 +1,80 @@ +import {deleteData, getData, patchData} from './fetchApi.tsx'; +import IBackendSettings from "./types/IBackendSettings.ts"; +import IRequestLimits from "./types/IRequestLimits.ts"; +import {RequestLimitType} from "./types/EnumRequestLimitType.ts"; + +export const GetSettings = async (apiUri: string) : Promise<IBackendSettings> => { + return await getData(`${apiUri}/v2/Settings`) as Promise<IBackendSettings>; +} + +export const GetUserAgent = async (apiUri: string) : Promise<string> => { + return await getData(`${apiUri}/v2/Settings/UserAgent`) as Promise<string>; +} + +export const UpdateUserAgent = async (apiUri: string, userAgent: string)=> { + if(userAgent === undefined || userAgent === null) + return Promise.reject(`userAgent was not provided`); + return patchData(`${apiUri}/v2/Settings/UserAgent`, userAgent); +} + +export const ResetUserAgent = async (apiUri: string) => { + return deleteData(`${apiUri}/v2/Settings/UserAgent`); +} + +export const GetRequestLimits = async(apiUri: string) : Promise<IRequestLimits> => { + return await getData(`${apiUri}/v2/Settings/RequestLimits`) as Promise<IRequestLimits>; +} + +export const ResetRequestLimits = async (apiUri: string) => { + return deleteData(`${apiUri}/v2/Settings/RequestLimits`); +} + +export const UpdateRequestLimit = async (apiUri: string, requestType: RequestLimitType, value: number) => { + if(requestType === undefined || requestType === null || value === undefined || value === null) + return Promise.reject(); + return patchData(`${apiUri}/v2/Settings/RequestLimits/${requestType}`, value); +} + +export const ResetRequestLimit = async (apiUri: string, requestType: RequestLimitType) => { + if(requestType === undefined || requestType === null) + return Promise.reject("requestType was not provided"); + return deleteData(`${apiUri}/v2/Settings/RequestLimits/${requestType}`); +} + +export const GetImageCompressionValue = async (apiUri: string) : Promise<number> => { + return await getData(`${apiUri}/v2/Settings/ImageCompression`) as Promise<number>; +} + +export const UpdateImageCompressionValue = async (apiUri: string, value: number) => { + if(value === undefined || value === null) + return Promise.reject("value was not provided"); + return patchData(`${apiUri}/v2/Settings/ImageCompression`, value); +} + +export const GetBWImageToggle = async (apiUri: string) : Promise<boolean> => { + return await getData(`${apiUri}/v2/Settings/BWImages`) as Promise<boolean>; +} + +export const UpdateBWImageToggle = async (apiUri: string, value: boolean) => { + if(value === undefined || value === null) + return Promise.reject("value was not provided"); + return patchData(`${apiUri}/v2/Settings/BWImages`, value); +} + +export const GetAprilFoolsToggle = async (apiUri: string) : Promise<boolean> => { + return await getData(`${apiUri}/v2/Settings/AprilFoolsMode`) as Promise<boolean>; +} + +export const UpdateAprilFoolsToggle = async (apiUri: string, value: boolean) => { + if(value === undefined || value === null) + return Promise.reject("value was not provided"); + return patchData(`${apiUri}/v2/Settings/AprilFoolsMode`, value); +} + +export const GetChapterNamingScheme = async (apiUri: string) : Promise<string> => { + return await getData(`${apiUri}/v2/Settings/ChapterNamingScheme`) as Promise<string>; +} + +export const UpdateChapterNamingScheme = async (apiUri: string, value: string) => { + return patchData(`${apiUri}/v2/Settings/ChapterNamingScheme`, value); +} \ No newline at end of file diff --git a/tranga-website/src/api/Chapter.tsx b/tranga-website/src/api/Chapter.tsx new file mode 100644 index 0000000..73792eb --- /dev/null +++ b/tranga-website/src/api/Chapter.tsx @@ -0,0 +1,8 @@ +import {getData} from "./fetchApi.tsx"; +import IChapter from "./types/IChapter.ts"; + +export const GetChapterFromId = async (apiUri: string, chapterId: string): Promise<IChapter> => { + if(chapterId === undefined || chapterId === null) + return Promise.reject(`chapterId was not provided`); + return await getData(`${apiUri}/v2/Query/Chapter/${chapterId}`) as Promise<IChapter>; +} \ No newline at end of file diff --git a/tranga-website/src/api/Job.tsx b/tranga-website/src/api/Job.tsx new file mode 100644 index 0000000..07a6a76 --- /dev/null +++ b/tranga-website/src/api/Job.tsx @@ -0,0 +1,97 @@ +import {deleteData, getData, patchData, postData, putData} from "./fetchApi"; +import IJob, {JobState, JobType} from "./types/Jobs/IJob"; +import IModifyJobRecord from "./types/records/IModifyJobRecord"; +import IDownloadAvailableJobsRecord from "./types/records/IDownloadAvailableJobsRecord.ts"; + +export const GetAllJobs = async (apiUri: string) : Promise<IJob[]> => { + return await getData(`${apiUri}/v2/Job`) as Promise<IJob[]>; +} + +export const GetJobsWithIds = async (apiUri: string, jobIds: string[]) : Promise<IJob[]> => { + if(jobIds === null || jobIds === undefined || jobIds.length === 0) + return Promise.reject("jobIds was not provided"); + return await postData(`${apiUri}/v2/Job/WithIDs`, jobIds) as Promise<IJob[]>; +} + +export const GetJobsInState = async (apiUri: string, state: JobState) : Promise<IJob[]> => { + if(state == null || state == undefined) + return Promise.reject("state was not provided"); + return await getData(`${apiUri}/v2/Job/State/${state}`) as Promise<IJob[]>; +} + +export const GetJobsWithType = async (apiUri: string, jobType: JobType) : Promise<IJob[]> => { + if(jobType == null || jobType == undefined) { + return Promise.reject("jobType was not provided"); + } + return await getData(`${apiUri}/v2/Job/Type/${jobType}`) as Promise<IJob[]>; +} + +export const GetJobsOfTypeAndWithState = async (apiUri: string, jobType: JobType, state: JobState) : Promise<IJob[]> => { + if(jobType == null || jobType == undefined) + return Promise.reject("jobType was not provided"); + if(state == null || state == undefined) + return Promise.reject("state was not provided"); + return await getData(`${apiUri}/v2/Job/TypeAndState/${jobType}/${state}`) as Promise<IJob[]>; +} + +export const GetJob = async (apiUri: string, jobId: string) : Promise<IJob> => { + if(jobId === undefined || jobId === null || jobId.length < 1) + return Promise.reject("jobId was not provided"); + return await getData(`${apiUri}/v2/Job/${jobId}`) as Promise<IJob>; +} + +export const DeleteJob = async (apiUri: string, jobId: string) : Promise<void> => { + if(jobId === undefined || jobId === null || jobId.length < 1) + return Promise.reject("jobId was not provided"); + return await deleteData(`${apiUri}/v2/Job/${jobId}`); +} + +export const ModifyJob = async (apiUri: string, jobId: string, modifyData: IModifyJobRecord) : Promise<IJob> => { + if(jobId === undefined || jobId === null || jobId.length < 1) + return Promise.reject("jobId was not provided"); + if(modifyData === undefined || modifyData === null) + return Promise.reject("modifyData was not provided"); + return await patchData(`${apiUri}/v2/Job/${jobId}`, modifyData) as Promise<IJob>; +} + +export const CreateDownloadAvailableChaptersJob = async (apiUri: string, mangaId: string, data: IDownloadAvailableJobsRecord) : Promise<string[]> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + if(data === undefined || data === null) + return Promise.reject("data was not provided"); + return await putData(`${apiUri}/v2/Job/DownloadAvailableChaptersJob/${mangaId}`, data) as Promise<string[]>; +} + +export const CreateDownloadSingleChapterJob = async (apiUri: string, chapterId: string) : Promise<string[]> => { + if(chapterId === undefined || chapterId === null || chapterId.length < 1) + return Promise.reject("chapterId was not provided"); + return await putData(`${apiUri}/v2/Job/DownloadSingleChapterJob/${chapterId}`, {}) as Promise<string[]>; +} + +export const CreateUpdateFilesJob = async (apiUri: string, mangaId: string) : Promise<string[]> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + return await putData(`${apiUri}/v2/Job/UpdateFilesJob/${mangaId}`, {}) as Promise<string[]>; +} + +export const CreateUpdateAllFilesJob = async (apiUri: string) : Promise<string[]> => { + return await putData(`${apiUri}/v2/Job/UpdateAllFilesJob`, {}) as Promise<string[]>; +} + +export const CreateUpdateMetadataJob = async (apiUri: string, mangaId: string) : Promise<string[]> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + return await putData(`${apiUri}/v2/Job/UpdateMetadataJob/${mangaId}`, {}) as Promise<string[]>; +} + +export const CreateUpdateAllMetadataJob = async (apiUri: string) : Promise<string[]> => { + return await putData(`${apiUri}/v2/Job/UpdateAllMetadataJob`, {}) as Promise<string[]>; +} + +export const StartJob = async (apiUri: string, jobId: string) : Promise<object> => { + return await postData(`${apiUri}/v2/Job/${jobId}/Start`, {}); +} + +export const StopJob = async (apiUri: string, jobId: string) : Promise<object> => { + return await postData(`${apiUri}/v2/Job/${jobId}/Stop`, {}); +} \ No newline at end of file diff --git a/tranga-website/src/api/LocalLibrary.tsx b/tranga-website/src/api/LocalLibrary.tsx new file mode 100644 index 0000000..95b659d --- /dev/null +++ b/tranga-website/src/api/LocalLibrary.tsx @@ -0,0 +1,31 @@ +import ILocalLibrary from "./types/ILocalLibrary.ts"; +import {deleteData, getData, patchData, putData} from "./fetchApi.tsx"; +import INewLibraryRecord from "./types/records/INewLibraryRecord.ts"; + +export const GetLibraries = async (apiUri: string) : Promise<ILocalLibrary[]> => { + return await getData(`${apiUri}/v2/LocalLibraries`) as Promise<ILocalLibrary[]>; +} + +export const GetLibrary = async (apiUri: string, libraryId: string) : Promise<ILocalLibrary> => { + return await getData(`${apiUri}/v2/LocalLibraries/${libraryId}`) as Promise<ILocalLibrary>; +} + +export const CreateLibrary = async (apiUri: string, data: INewLibraryRecord) : Promise<ILocalLibrary> => { + return await putData(`${apiUri}/v2/LocalLibraries`, data) as Promise<ILocalLibrary> +} + +export const DeleteLibrary = async (apiUri: string, libraryId: string) : Promise<void> => { + return await deleteData(`${apiUri}/v2/LocalLibraries/${libraryId}`); +} + +export const ChangeLibraryPath = async (apiUri: string, libraryId: string, newPath: string) : Promise<object> => { + return await patchData(`${apiUri}/v2/LocalLibraries/${libraryId}/ChangeBasePath`, newPath); +} + +export const ChangeLibraryName = async (apiUri: string, libraryId: string, newName: string) : Promise<object> => { + return await patchData(`${apiUri}/v2/LocalLibraries/${libraryId}/ChangeName`, newName); +} + +export const UpdateLibrary = async (apiUri: string, libraryId: string, record: INewLibraryRecord) : Promise<object> => { + return await patchData(`${apiUri}/v2/LocalLibraries/${libraryId}`, record); +} \ No newline at end of file diff --git a/tranga-website/src/api/Manga.tsx b/tranga-website/src/api/Manga.tsx new file mode 100644 index 0000000..2a6d7bf --- /dev/null +++ b/tranga-website/src/api/Manga.tsx @@ -0,0 +1,77 @@ +import {deleteData, getData, patchData, postData} from './fetchApi.tsx'; +import IManga from "./types/IManga.ts"; +import IChapter from "./types/IChapter.ts"; + +export const GetAllManga = async (apiUri: string) : Promise<IManga[]> => { + return await getData(`${apiUri}/v2/Manga`) as Promise<IManga[]>; +} + +export const GetMangaWithIds = async (apiUri: string, mangaIds: string[]) : Promise<IManga[]> => { + if(mangaIds === undefined || mangaIds === null || mangaIds.length < 1) + return Promise.reject("mangaIds was not provided"); + return await postData(`${apiUri}/v2/Manga/WithIds`, mangaIds) as Promise<IManga[]>; +} + +export const GetMangaById = async (apiUri: string, mangaId: string) : Promise<IManga> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + return await getData(`${apiUri}/v2/Manga/${mangaId}`) as Promise<IManga>; +} + +export const DeleteManga = async (apiUri: string, mangaId: string) : Promise<void> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + return await deleteData(`${apiUri}/v2/Manga/${mangaId}`); +} + +export const GetMangaCoverImageUrl = (apiUri: string, mangaId: string, ref: HTMLImageElement | undefined) : string => { + if(ref == null || ref == undefined) + return `${apiUri}/v2/Manga/${mangaId}/Cover?width=64&height=64`; + return `${apiUri}/v2/Manga/${mangaId}/Cover?width=${ref.clientWidth}&height=${ref.clientHeight}`; +} + +export const GetChapters = async (apiUri: string, mangaId: string) : Promise<IChapter[]> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + return await getData(`${apiUri}/v2/Manga/${mangaId}/Chapters`) as Promise<IChapter[]>; +} + +export const GetDownloadedChapters = async (apiUri: string, mangaId: string) : Promise<IChapter[]> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + return await getData(`${apiUri}/v2/Manga/${mangaId}/Chapters/Downloaded`) as Promise<IChapter[]>; +} + +export const GetNotDownloadedChapters = async (apiUri: string, mangaId: string) : Promise<IChapter[]> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + return await getData(`${apiUri}/v2/Manga/${mangaId}/Chapters/NotDownloaded`) as Promise<IChapter[]>; +} + +export const GetLatestChapterAvailable = async (apiUri: string, mangaId: string) : Promise<IChapter> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + return await getData(`${apiUri}/v2/Manga/${mangaId}/Chapter/LatestAvailable`) as Promise<IChapter>; +} + +export const GetLatestChapterDownloaded = async (apiUri: string, mangaId: string) : Promise<IChapter> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + return await getData(`${apiUri}/v2/Manga/${mangaId}/Chapter/LatestDownloaded`) as Promise<IChapter>; +} + +export const SetIgnoreThreshold = async (apiUri: string, mangaId: string, chapterThreshold: number) : Promise<object> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + if(chapterThreshold === undefined || chapterThreshold === null) + return Promise.reject("chapterThreshold was not provided"); + return await patchData(`${apiUri}/v2/Manga/${mangaId}/IgnoreChaptersBefore`, chapterThreshold); +} + +export const MoveFolder = async (apiUri: string, mangaId: string, newPath: string) : Promise<object> => { + if(mangaId === undefined || mangaId === null || mangaId.length < 1) + return Promise.reject("mangaId was not provided"); + if(newPath === undefined || newPath === null || newPath.length < 1) + return Promise.reject("newPath was not provided"); + return await postData(`${apiUri}/v2/Manga/{MangaId}/MoveFolder`, {newPath}); +} \ No newline at end of file diff --git a/tranga-website/src/api/MangaConnector.tsx b/tranga-website/src/api/MangaConnector.tsx new file mode 100644 index 0000000..00c9522 --- /dev/null +++ b/tranga-website/src/api/MangaConnector.tsx @@ -0,0 +1,22 @@ +import {getData, patchData} from './fetchApi.tsx'; +import IMangaConnector from "./types/IMangaConnector.ts"; + +export const GetAllConnectors = async (apiUri: string) : Promise<IMangaConnector[]> => { + return await getData(`${apiUri}/v2/MangaConnector`) as Promise<IMangaConnector[]> +} + +export const GetEnabledConnectors = async (apiUri: string) : Promise<IMangaConnector[]> => { + return await getData(`${apiUri}/v2/MangaConnector/enabled`) as Promise<IMangaConnector[]> +} + +export const GetDisabledConnectors = async (apiUri: string) : Promise<IMangaConnector[]> => { + return await getData(`${apiUri}/v2/MangaConnector/disabled`) as Promise<IMangaConnector[]> +} + +export const SetConnectorEnabled = async (apiUri: string, connectorName: string, enabled: boolean) : Promise<object> => { + if(connectorName === undefined || connectorName === null || connectorName.length < 1) + return Promise.reject("connectorName was not provided"); + if(enabled === undefined || enabled === null) + return Promise.reject("enabled was not provided"); + return await patchData(`${apiUri}/v2/MangaConnector/${connectorName}/SetEnabled/${enabled}`, {}); +} \ No newline at end of file diff --git a/tranga-website/src/api/NotificationConnector.tsx b/tranga-website/src/api/NotificationConnector.tsx new file mode 100644 index 0000000..c789ac1 --- /dev/null +++ b/tranga-website/src/api/NotificationConnector.tsx @@ -0,0 +1,52 @@ +import {deleteData, getData, putData} from "./fetchApi.tsx"; +import INotificationConnector from "./types/INotificationConnector.ts"; +import IGotifyRecord from "./types/records/IGotifyRecord.ts"; +import INtfyRecord from "./types/records/INtfyRecord.ts"; +import ILunaseaRecord from "./types/records/ILunaseaRecord.ts"; +import IPushoverRecord from "./types/records/IPushoverRecord.ts"; + +export const GetNotificationConnectors = async (apiUri: string) : Promise<INotificationConnector[]> => { + return await getData(`${apiUri}/v2/NotificationConnector`) as Promise<INotificationConnector[]> +} + +export const CreateNotificationConnector = async (apiUri: string, newConnector: INotificationConnector) : Promise<string> => { + if(newConnector === undefined || newConnector === null) + return Promise.reject("newConnector was not provided"); + return await putData(`${apiUri}/v2/NotificationConnector`, newConnector) as Promise<string>; +} + +export const GetNotificationConnectorWithId = async (apiUri: string, notificationConnectorId: string) : Promise<INotificationConnector> => { + if(notificationConnectorId === undefined || notificationConnectorId === null || notificationConnectorId.length < 1) + return Promise.reject("notificationConnectorId was not provided"); + return await getData(`${apiUri}/v2/NotificationConnector/${notificationConnectorId}`) as Promise<INotificationConnector>; +} + +export const DeleteNotificationConnectorWithId = async (apiUri: string, notificationConnectorId: string) : Promise<void> => { + if(notificationConnectorId === undefined || notificationConnectorId === null || notificationConnectorId.length < 1) + return Promise.reject("notificationConnectorId was not provided"); + return await deleteData(`${apiUri}/v2/NotificationConnector/${notificationConnectorId}`); +} + +export const CreateGotify = async (apiUri: string, gotify: IGotifyRecord) : Promise<string> => { + if(gotify === undefined || gotify === null) + return Promise.reject("gotify was not provided"); + return await putData(`${apiUri}/v2/NotificationConnector/Gotify`, gotify) as Promise<string>; +} + +export const CreateNtfy = async (apiUri: string, ntfy: INtfyRecord) : Promise<string> => { + if(ntfy === undefined || ntfy === null) + return Promise.reject("gotify was not provided"); + return await putData(`${apiUri}/v2/NotificationConnector/Ntfy`, ntfy) as Promise<string>; +} + +export const CreateLunasea = async (apiUri: string, lunasea: ILunaseaRecord) : Promise<string> => { + if(lunasea === undefined || lunasea === null) + return Promise.reject("lunasea was not provided"); + return await putData(`${apiUri}/v2/NotificationConnector/Lunasea`, lunasea) as Promise<string>; +} + +export const CreatePushover = async (apiUri: string, pushover: IPushoverRecord) : Promise<string> => { + if(pushover === undefined || pushover === null) + return Promise.reject("pushover was not provided"); + return await putData(`${apiUri}/v2/NotificationConnector/Pushover`, pushover) as Promise<string>; +} \ No newline at end of file diff --git a/tranga-website/src/api/Query.tsx b/tranga-website/src/api/Query.tsx new file mode 100644 index 0000000..d262ac5 --- /dev/null +++ b/tranga-website/src/api/Query.tsx @@ -0,0 +1,15 @@ +import IAuthor from "./types/IAuthor.ts"; +import {getData} from "./fetchApi.tsx"; +import ILink from "./types/ILink.ts"; + +export const GetAuthor = async (apiUri: string, authorId: string) : Promise<IAuthor> => { + if(authorId === undefined || authorId === null || authorId.length < 1) + return Promise.reject("authorId was not provided"); + return await getData(`${apiUri}/v2/Query/Author/${authorId}`) as Promise<IAuthor>; +} + +export const GetLink = async (apiUri: string, linkId: string) : Promise<ILink> => { + if(linkId === undefined || linkId === null || linkId.length < 1) + return Promise.reject("linkId was not provided"); + return await getData(`${apiUri}/v2/Query/Link/${linkId}`) as Promise<ILink>; +} \ No newline at end of file diff --git a/tranga-website/src/api/Search.tsx b/tranga-website/src/api/Search.tsx new file mode 100644 index 0000000..1ca2372 --- /dev/null +++ b/tranga-website/src/api/Search.tsx @@ -0,0 +1,22 @@ +import {postData} from "./fetchApi.tsx"; +import IManga from "./types/IManga.ts"; + +export const SearchName = async (apiUri: string, name: string) : Promise<IManga[]> => { + if(name === undefined || name === null || name.length < 1) + return Promise.reject("name was not provided"); + return await postData(`${apiUri}/v2/Search/Name`, name) as Promise<IManga[]>; +} + +export const SearchNameOnConnector = async (apiUri: string, connectorName: string, name: string) : Promise<IManga[]> => { + if(connectorName === undefined || connectorName === null || connectorName.length < 1) + return Promise.reject("connectorName was not provided"); + if(name === undefined || name === null || name.length < 1) + return Promise.reject("name was not provided"); + return await postData(`${apiUri}/v2/Search/${connectorName}`, name) as Promise<IManga[]>; +} + +export const SearchUrl = async (apiUri: string, url: string) : Promise<IManga> => { + if(url === undefined || url === null || url.length < 1) + return Promise.reject("name was not provided"); + return await postData(`${apiUri}/v2/Search/Url`, url) as Promise<IManga>; +} \ No newline at end of file diff --git a/tranga-website/src/api/fetchApi.tsx b/tranga-website/src/api/fetchApi.tsx new file mode 100644 index 0000000..96c2a45 --- /dev/null +++ b/tranga-website/src/api/fetchApi.tsx @@ -0,0 +1,80 @@ +import {createContext} from "react"; + +export const ApiUriContext = createContext<string>(""); + +export function getData(uri: string) : Promise<object> { + return makeRequest("GET", uri, null) as Promise<object>; +} + +export function postData(uri: string, content: object | string | number | boolean) : Promise<object> { + return makeRequest("POST", uri, content) as Promise<object>; +} + +export function deleteData(uri: string) : Promise<void> { + return makeRequest("DELETE", uri, null) as Promise<void>; +} + +export function patchData(uri: string, content: object | string | number | boolean) : Promise<object> { + return makeRequest("patch", uri, content) as Promise<object>; +} + +export function putData(uri: string, content: object | string | number | boolean) : Promise<object> { + return makeRequest("PUT", uri, content) as Promise<object>; +} + +let currentlyRequestedEndpoints: string[] = []; +function makeRequest(method: string, uri: string, content: object | string | number | null | boolean) : Promise<object | void> { + const id = method + uri; + if(currentlyRequestedEndpoints.find(x => x == id) != undefined) + return Promise.reject(`Already requested: ${method} ${uri}`); + currentlyRequestedEndpoints.push(id); + return fetch(uri, + { + method: method, + headers : { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + body: content ? JSON.stringify(content) : null + }) + .then(function(response){ + if(!response.ok){ + if(response.status === 503){ + currentlyRequestedEndpoints.splice(currentlyRequestedEndpoints.indexOf(id), 1) + let retryHeaderVal = response.headers.get("Retry-After"); + let seconds = 10; + if(retryHeaderVal === null){ + return response.text().then(text => { + seconds = parseInt(text); + return new Promise(resolve => setTimeout(resolve, seconds * 1000)) + .then(() => { + return makeRequest(method, uri, content); + }); + }); + }else { + seconds = parseInt(retryHeaderVal); + return new Promise(resolve => setTimeout(resolve, seconds * 1000)) + .then(() => { + return makeRequest(method, uri, content); + }); + } + }else + throw new Error(response.statusText); + } + let json = response.json(); + return json.then((json) => json).catch(() => null); + }) + .catch(function(err : Error){ + console.error(`Error ${method}ing Data ${uri}\n${err}`); + return Promise.reject(); + }).finally(() => currentlyRequestedEndpoints.splice(currentlyRequestedEndpoints.indexOf(id), 1)); +} + +export function isValidUri(uri: string) : boolean{ + try { + new URL(uri); + return true; + } catch (err) { + return false; + } +} \ No newline at end of file diff --git a/tranga-website/src/api/types/EnumLibraryType.ts b/tranga-website/src/api/types/EnumLibraryType.ts new file mode 100644 index 0000000..5665b04 --- /dev/null +++ b/tranga-website/src/api/types/EnumLibraryType.ts @@ -0,0 +1,4 @@ +export enum LibraryType { + Komga = "Komga", + Kavita = "Kavita" +} \ No newline at end of file diff --git a/tranga-website/src/api/types/EnumMangaReleaseStatus.ts b/tranga-website/src/api/types/EnumMangaReleaseStatus.ts new file mode 100644 index 0000000..586062b --- /dev/null +++ b/tranga-website/src/api/types/EnumMangaReleaseStatus.ts @@ -0,0 +1,24 @@ +import {ColorPaletteProp} from "@mui/joy"; + +export enum MangaReleaseStatus { + Continuing = "Continuing", + Completed = "Completed", + OnHiatus = "OnHiatus", + Cancelled = "Cancelled", + Unreleased = "Unreleased", +} + +export function ReleaseStatusToPalette(status: MangaReleaseStatus): ColorPaletteProp { + switch (status) { + case MangaReleaseStatus.Continuing: + return "success"; + case MangaReleaseStatus.Completed: + return "primary"; + case MangaReleaseStatus.Cancelled: + return "danger"; + case MangaReleaseStatus.Unreleased: + return "neutral"; + case MangaReleaseStatus.OnHiatus: + return "warning"; + } +} \ No newline at end of file diff --git a/tranga-website/src/api/types/EnumRequestLimitType.ts b/tranga-website/src/api/types/EnumRequestLimitType.ts new file mode 100644 index 0000000..c742b5f --- /dev/null +++ b/tranga-website/src/api/types/EnumRequestLimitType.ts @@ -0,0 +1,8 @@ +export enum RequestLimitType { + Default = "Default", + MangaDexFeed = "MangaDexFeed", + MangaImage = "MangaImage", + MangaCover = "MangaCover", + MangaDexImage = "MangaDexImage", + MangaInfo = "MangaInfo" +} \ No newline at end of file diff --git a/tranga-website/src/api/types/IAuthor.ts b/tranga-website/src/api/types/IAuthor.ts new file mode 100644 index 0000000..2b54e17 --- /dev/null +++ b/tranga-website/src/api/types/IAuthor.ts @@ -0,0 +1,4 @@ +export default interface IAuthor { + authorId: string; + authorName: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/IBackendSettings.ts b/tranga-website/src/api/types/IBackendSettings.ts new file mode 100644 index 0000000..ffbdaca --- /dev/null +++ b/tranga-website/src/api/types/IBackendSettings.ts @@ -0,0 +1,18 @@ +export default interface IBackendSettings { + downloadLocation: string; + workingDirectory: string; + userAgent: string; + aprilFoolsMode: boolean; + requestLimits: { + Default: number, + MangaInfo: number, + MangaDexFeed: number, + MangaDexImage: number, + MangaImage: number, + MangaCover: number, + }; + compression: number; + bwImages: boolean; + startNewJobTimeoutMs: number; + chapterNamingScheme: string; +} diff --git a/tranga-website/src/api/types/IChapter.ts b/tranga-website/src/api/types/IChapter.ts new file mode 100644 index 0000000..e255ff6 --- /dev/null +++ b/tranga-website/src/api/types/IChapter.ts @@ -0,0 +1,10 @@ +export default interface IChapter{ + chapterId: string; + volumeNumber: number; + chapterNumber: string; + url: string; + title: string | undefined; + archiveFileName: string; + downloaded: boolean; + parentMangaId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/IFrontendSettings.ts b/tranga-website/src/api/types/IFrontendSettings.ts new file mode 100644 index 0000000..2c1c7c5 --- /dev/null +++ b/tranga-website/src/api/types/IFrontendSettings.ts @@ -0,0 +1,4 @@ +export default interface IFrontendSettings { + jobInterval: Date; + apiUri: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/ILibraryConnector.ts b/tranga-website/src/api/types/ILibraryConnector.ts new file mode 100644 index 0000000..7e2322e --- /dev/null +++ b/tranga-website/src/api/types/ILibraryConnector.ts @@ -0,0 +1,8 @@ +import {LibraryType} from "./EnumLibraryType"; + +export default interface ILibraryConnector { + libraryConnectorId: string; + libraryType: LibraryType; + baseUrl: string; + auth: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/ILink.ts b/tranga-website/src/api/types/ILink.ts new file mode 100644 index 0000000..9a26546 --- /dev/null +++ b/tranga-website/src/api/types/ILink.ts @@ -0,0 +1,5 @@ +export default interface ILink { + linkId: string; + linkProvider: string; + linkUrl: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/ILocalLibrary.ts b/tranga-website/src/api/types/ILocalLibrary.ts new file mode 100644 index 0000000..11f2bbc --- /dev/null +++ b/tranga-website/src/api/types/ILocalLibrary.ts @@ -0,0 +1,5 @@ +export default interface ILocalLibrary { + localLibraryId: string; + basePath: string; + libraryName: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/IManga.ts b/tranga-website/src/api/types/IManga.ts new file mode 100644 index 0000000..68daa53 --- /dev/null +++ b/tranga-website/src/api/types/IManga.ts @@ -0,0 +1,37 @@ +import {MangaReleaseStatus} from "./EnumMangaReleaseStatus"; + +export default interface IManga{ + mangaId: string; + idOnConnectorSite: string; + name: string; + description: string; + websiteUrl: string; + year: number; + originalLanguage: string; + releaseStatus: MangaReleaseStatus; + folderName: string; + ignoreChapterBefore: number; + mangaConnectorId: string; + authorIds: string[]; + tags: string[]; + linkIds: string[]; + altTitleIds: string[]; +} + +export const DefaultManga : IManga = { + mangaId: "MangaId", + idOnConnectorSite: "ID", + name: "TestManga", + description: "Wow so much text, very cool", + websiteUrl: "https://realsite.realdomain", + year: 1999, + originalLanguage: "lindtChoccy", + releaseStatus: MangaReleaseStatus.Continuing, + folderName: "uhhh", + ignoreChapterBefore: 0, + mangaConnectorId: "MangaDex", + authorIds: ["We got", "Authors"], + tags: ["And we", "got Tags"], + linkIds: ["And most", "definitely", "links"], + altTitleIds: ["But not alt-titles."], +} \ No newline at end of file diff --git a/tranga-website/src/api/types/IMangaAltTitle.ts b/tranga-website/src/api/types/IMangaAltTitle.ts new file mode 100644 index 0000000..2526df4 --- /dev/null +++ b/tranga-website/src/api/types/IMangaAltTitle.ts @@ -0,0 +1,5 @@ +export default interface IMangaAltTitle { + altTitleId: string; + language: string; + title: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/IMangaConnector.ts b/tranga-website/src/api/types/IMangaConnector.ts new file mode 100644 index 0000000..61fb457 --- /dev/null +++ b/tranga-website/src/api/types/IMangaConnector.ts @@ -0,0 +1,7 @@ +export default interface IMangaConnector { + name: string; + supportedLanguages: string[]; + iconUrl: string; + baseUris: string[]; + enabled: boolean; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/INotificationConnector.ts b/tranga-website/src/api/types/INotificationConnector.ts new file mode 100644 index 0000000..8d2b765 --- /dev/null +++ b/tranga-website/src/api/types/INotificationConnector.ts @@ -0,0 +1,7 @@ +export default interface INotificationConnector { + name: string; + url: string; + headers: Record<string, string>[]; + httpMethod: string; + body: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/IRequestLimits.ts b/tranga-website/src/api/types/IRequestLimits.ts new file mode 100644 index 0000000..54a00ec --- /dev/null +++ b/tranga-website/src/api/types/IRequestLimits.ts @@ -0,0 +1,8 @@ +export default interface IRequestLimits { + Default: number; + MangaDexFeed: number; + MangaImage: number; + MangaCover: number; + MangaDexImage: number; + MangaInfo: number; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IDownloadAvailableChaptersJob.ts b/tranga-website/src/api/types/Jobs/IDownloadAvailableChaptersJob.ts new file mode 100644 index 0000000..66c5104 --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IDownloadAvailableChaptersJob.ts @@ -0,0 +1,5 @@ +import IJob from "./IJob"; + +export default interface IDownloadAvailableChaptersJob extends IJob { + mangaId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IDownloadMangaCoverJob.ts b/tranga-website/src/api/types/Jobs/IDownloadMangaCoverJob.ts new file mode 100644 index 0000000..42d4350 --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IDownloadMangaCoverJob.ts @@ -0,0 +1,5 @@ +import IJob from "./IJob"; + +export default interface IDownloadMangaCoverJob extends IJob { + mangaId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IDownloadSingleChapterJob.ts b/tranga-website/src/api/types/Jobs/IDownloadSingleChapterJob.ts new file mode 100644 index 0000000..c4b3b8b --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IDownloadSingleChapterJob.ts @@ -0,0 +1,5 @@ +import IJob from "./IJob"; + +export default interface IDownloadSingleChapterJob extends IJob { + chapterId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IJob.ts b/tranga-website/src/api/types/Jobs/IJob.ts new file mode 100644 index 0000000..a23e08d --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IJob.ts @@ -0,0 +1,29 @@ +export default interface IJob{ + jobId: string; + parentJobId: string; + dependsOnJobIds: string[]; + jobType: JobType; + recurrenceMs: number; + lastExecution: Date; + nextExecution: Date; + state: JobState; + enabled: boolean; +} + +export enum JobType { + DownloadSingleChapterJob = "DownloadSingleChapterJob", + DownloadAvailableChaptersJob = "DownloadAvailableChaptersJob", + UpdateMetaDataJob = "UpdateMetaDataJob", + MoveFileOrFolderJob = "MoveFileOrFolderJob", + DownloadMangaCoverJob = "DownloadMangaCoverJob", + RetrieveChaptersJob = "RetrieveChaptersJob", + UpdateFilesDownloadedJob = "UpdateFilesDownloadedJob", + MoveMangaLibraryJob = "MoveMangaLibraryJob" +} + +export enum JobState { + Waiting = "Waiting", + Running = "Running", + Completed = "Completed", + Failed = "Failed" +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IMoveFileOrFolderJob.ts b/tranga-website/src/api/types/Jobs/IMoveFileOrFolderJob.ts new file mode 100644 index 0000000..9daa55c --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IMoveFileOrFolderJob.ts @@ -0,0 +1,6 @@ +import IJob from "./IJob"; + +export default interface IMoveFileOrFolderJob extends IJob { + fromLocation: string; + toLocation: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IMoveMangaLibraryJob.ts b/tranga-website/src/api/types/Jobs/IMoveMangaLibraryJob.ts new file mode 100644 index 0000000..102646b --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IMoveMangaLibraryJob.ts @@ -0,0 +1,6 @@ +import IJob from "./IJob"; + +export default interface IMoveMangaLibraryJob extends IJob { + MangaId: string; + ToLibraryId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IRetrieveChaptersJob.ts b/tranga-website/src/api/types/Jobs/IRetrieveChaptersJob.ts new file mode 100644 index 0000000..2cadeb3 --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IRetrieveChaptersJob.ts @@ -0,0 +1,5 @@ +import IJob from "./IJob"; + +export default interface IRetrieveChaptersJob extends IJob { + mangaId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IUpdateFilesDownloadedJob.ts b/tranga-website/src/api/types/Jobs/IUpdateFilesDownloadedJob.ts new file mode 100644 index 0000000..8fc2516 --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IUpdateFilesDownloadedJob.ts @@ -0,0 +1,5 @@ +import IJob from "./IJob"; + +export default interface IUpdateFilesDownloadedJob extends IJob { + mangaId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IUpdateMetadataJob.ts b/tranga-website/src/api/types/Jobs/IUpdateMetadataJob.ts new file mode 100644 index 0000000..9464666 --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IUpdateMetadataJob.ts @@ -0,0 +1,5 @@ +import IJob from "./IJob"; + +export default interface IUpdateMetadataJob extends IJob { + mangaId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/records/IDownloadAvailableJobsRecord.ts b/tranga-website/src/api/types/records/IDownloadAvailableJobsRecord.ts new file mode 100644 index 0000000..f8f3402 --- /dev/null +++ b/tranga-website/src/api/types/records/IDownloadAvailableJobsRecord.ts @@ -0,0 +1,4 @@ +export default interface IDownloadAvailableJobsRecord { + recurrenceTimeMs: number; + localLibraryId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/records/IGotifyRecord.ts b/tranga-website/src/api/types/records/IGotifyRecord.ts new file mode 100644 index 0000000..9ff6869 --- /dev/null +++ b/tranga-website/src/api/types/records/IGotifyRecord.ts @@ -0,0 +1,7 @@ +import "../../../styles/notificationConnector.css"; + +export default interface IGotifyRecord { + endpoint: string; + appToken: string; + priority: number; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/records/ILunaseaRecord.ts b/tranga-website/src/api/types/records/ILunaseaRecord.ts new file mode 100644 index 0000000..481abc8 --- /dev/null +++ b/tranga-website/src/api/types/records/ILunaseaRecord.ts @@ -0,0 +1,5 @@ +import "../../../styles/notificationConnector.css"; + +export default interface ILunaseaRecord { + id: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/records/IModifyJobRecord.ts b/tranga-website/src/api/types/records/IModifyJobRecord.ts new file mode 100644 index 0000000..3241c9a --- /dev/null +++ b/tranga-website/src/api/types/records/IModifyJobRecord.ts @@ -0,0 +1,4 @@ +export default interface IModifyJobRecord { + recurrenceMs: number; + enabled: boolean; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/records/INewLibraryRecord.ts b/tranga-website/src/api/types/records/INewLibraryRecord.ts new file mode 100644 index 0000000..59a764b --- /dev/null +++ b/tranga-website/src/api/types/records/INewLibraryRecord.ts @@ -0,0 +1,12 @@ +export default interface INewLibraryRecord { + path: string; + name: string; +} + +export function Validate(record: INewLibraryRecord) : boolean { + if(record.path.length < 1) + return false; + if(record.name.length < 1) + return false; + return true; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/records/INtfyRecord.ts b/tranga-website/src/api/types/records/INtfyRecord.ts new file mode 100644 index 0000000..6470347 --- /dev/null +++ b/tranga-website/src/api/types/records/INtfyRecord.ts @@ -0,0 +1,9 @@ +import "../../../styles/notificationConnector.css"; + +export default interface INtfyRecord { + endpoint: string; + username: string; + password: string; + topic: string; + priority: number; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/records/IPushoverRecord.ts b/tranga-website/src/api/types/records/IPushoverRecord.ts new file mode 100644 index 0000000..bdca0b7 --- /dev/null +++ b/tranga-website/src/api/types/records/IPushoverRecord.ts @@ -0,0 +1,6 @@ +import "../../../styles/notificationConnector.css"; + +export default interface IPushoverRecord { + apptoken: string; + user: string; +} \ No newline at end of file diff --git a/tranga-website/src/index.css b/tranga-website/src/index.css new file mode 100644 index 0000000..e69de29 diff --git a/tranga-website/src/main.tsx b/tranga-website/src/main.tsx new file mode 100644 index 0000000..f585b6c --- /dev/null +++ b/tranga-website/src/main.tsx @@ -0,0 +1,28 @@ +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' +// @ts-ignore +import '@fontsource/inter'; +import { CssVarsProvider } from '@mui/joy/styles'; +import CssBaseline from '@mui/joy/CssBaseline'; +import {StrictMode} from "react"; + +export default function MyApp() { + return ( + <StrictMode> + <CssVarsProvider> + {/* must be used under CssVarsProvider */} + <CssBaseline /> + + {/* The rest of your application */} + <App /> + </CssVarsProvider> + </StrictMode> + ); +} + + + +createRoot(document.getElementById('root')!).render( + <MyApp /> +); diff --git a/tranga-website/src/vite-env.d.ts b/tranga-website/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/tranga-website/src/vite-env.d.ts @@ -0,0 +1 @@ +/// <reference types="vite/client" /> diff --git a/tranga-website/tsconfig.app.json b/tranga-website/tsconfig.app.json new file mode 100644 index 0000000..358ca9b --- /dev/null +++ b/tranga-website/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/tranga-website/tsconfig.json b/tranga-website/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tranga-website/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tranga-website/tsconfig.node.json b/tranga-website/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/tranga-website/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/tranga-website/vite.config.ts b/tranga-website/vite.config.ts new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/tranga-website/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +})