From 20c2b75b01de22c811270a361526c065705ab0d4 Mon Sep 17 00:00:00 2001 From: Rajarshee Chatterjee Date: Mon, 20 Oct 2025 22:54:08 +0530 Subject: [PATCH] refactor: Overhaul Plugin Architecture & Playground UI (#1846) * refactor: Move Plugins Out and Consolidate with Multisrc * feat: Overhaul Playground UI * feat: Add Filters to New UI * feat: Persist Selected Plugin * feat: Add Direct Parse Novel/Chapter Options and Feedback Toasts [skip ci] * feat: UX Improvements * chore: Update Plugin Path in Publish Workflow * fix: Add Backward Compatibility * chore: Update Plugin Publishing Script --- .gitignore | 2 +- components.json | 22 + docs/docs.md | 49 +- docs/plugin-template.ts | 6 +- eslint.config.js | 11 +- index.html | 3 +- package-lock.json | 2708 +++++++++++++++-- package.json | 23 +- {src/plugins => plugins}/arabic/.gitkeep | 0 {src/plugins => plugins}/arabic/dilartube.ts | 30 +- .../plugins => plugins}/arabic/rewayatclub.ts | 20 +- {src/plugins => plugins}/arabic/sunovels.ts | 10 +- {src/plugins => plugins}/chinese/69shu.ts | 4 +- {src/plugins => plugins}/chinese/69xinshu.ts | 4 +- {src/plugins => plugins}/chinese/Quanben.ts | 8 +- {src/plugins => plugins}/chinese/ixdzs8.ts | 8 +- {src/plugins => plugins}/chinese/linovel.ts | 4 +- {src/plugins => plugins}/chinese/linovelib.ts | 4 +- .../chinese/linovelib_tw.ts | 4 +- {src/plugins => plugins}/chinese/novel543.ts | 4 +- .../english/NovelOnline.ts | 2 +- .../english/StorySeedling.ts | 2 +- {src/plugins => plugins}/english/ao3.ts | 4 +- .../english/bestlightnovel.ts | 2 +- .../english/chrysanthemumgarden.ts | 12 +- .../english/divinedaolibrary.ts | 2 +- .../plugins => plugins}/english/dreambigtl.ts | 2 +- .../plugins => plugins}/english/earlynovel.ts | 2 +- {src/plugins => plugins}/english/faqwikius.ts | 2 +- .../english/fenrirrealm.ts | 4 +- .../english/fictionzone.ts | 10 +- {src/plugins => plugins}/english/foxteller.ts | 2 +- {src/plugins => plugins}/english/genesis.ts | 2 +- {src/plugins => plugins}/english/inkitt.ts | 8 +- {src/plugins => plugins}/english/kdtnovels.ts | 2 +- .../english/lightnovelpub.ts | 2 +- .../english/lightnoveltranslation.ts | 22 +- {src/plugins => plugins}/english/lnmtl.ts | 2 +- {src/plugins => plugins}/english/mtlreader.ts | 2 +- {src/plugins => plugins}/english/mvlempyr.ts | 4 +- .../plugins => plugins}/english/novelbuddy.ts | 2 +- {src/plugins => plugins}/english/novelfire.ts | 2 +- {src/plugins => plugins}/english/novelhall.ts | 2 +- {src/plugins => plugins}/english/novelight.ts | 4 +- .../english/novelupdates.ts | 4 +- {src/plugins => plugins}/english/pawread.ts | 2 +- .../plugins => plugins}/english/rainofsnow.ts | 2 +- {src/plugins => plugins}/english/readfrom.ts | 26 +- .../english/readlitenovel.ts | 2 +- .../english/reaperscans.ts | 10 +- {src/plugins => plugins}/english/relibrary.ts | 4 +- {src/plugins => plugins}/english/royalroad.ts | 2 +- .../english/scribblehub.ts | 2 +- {src/plugins => plugins}/english/vynovel.ts | 2 +- {src/plugins => plugins}/english/webnovel.ts | 10 +- {src/plugins => plugins}/english/wtrlab.ts | 2 +- .../plugins => plugins}/english/wuxiaworld.ts | 4 +- {src/plugins => plugins}/french/chireads.ts | 2 +- .../french/harkeneliwood.ts | 2 +- {src/plugins => plugins}/french/kisswood.ts | 2 +- .../french/noveldeglace.ts | 2 +- {src/plugins => plugins}/french/novhell.ts | 2 +- .../plugins => plugins}/french/phenixscans.ts | 2 +- .../french/warriorlegendtrad.ts | 2 +- .../french/wuxialnscantrad.ts | 2 +- {src/plugins => plugins}/french/xiaowaz.ts | 2 +- plugins/index.ts | 497 +++ .../indonesian/indowebnovel.ts | 2 +- .../indonesian/novelringan.ts | 2 +- .../indonesian/sakuranovel.ts | 2 +- {src/plugins => plugins}/japanese/Syosetu.ts | 6 +- {src/plugins => plugins}/japanese/kakuyomu.ts | 4 +- {src/plugins => plugins}/korean/Agitoon.ts | 2 +- {src/plugins => plugins}/multi/komga.ts | 18 +- .../multisrc/fictioneer/generator.js | 0 .../multisrc/fictioneer/sources.json | 0 .../multisrc/fictioneer/template.ts | 4 +- .../multisrc/generate-multisrc-plugins.js | 4 +- .../multisrc/hotnovelpub/filter_refresh.ts | 0 .../multisrc/hotnovelpub/generator.js | 0 .../multisrc/hotnovelpub/sources.json | 0 .../multisrc/hotnovelpub/template.ts | 2 +- .../multisrc/ifreedom/generator.js | 0 .../multisrc/ifreedom/settings.json | 0 .../multisrc/ifreedom/sources.json | 0 .../multisrc/ifreedom/template.ts | 2 +- .../multisrc/lightnovelworld/generator.js | 0 .../multisrc/lightnovelworld/sources.json | 0 .../multisrc/lightnovelworld/template.ts | 2 +- .../multisrc/lightnovelwp/README.md | 2 +- .../multisrc/lightnovelwp/filters/TCSega.json | 0 .../lightnovelwp/filters/allnovelread.json | 0 .../multisrc/lightnovelwp/filters/arcane.json | 0 .../lightnovelwp/filters/bacalightnovel.json | 0 .../lightnovelwp/filters/centralnovel.json | 0 .../lightnovelwp/filters/cpunovel.json | 0 .../lightnovelwp/filters/daotranslate.json | 0 .../multisrc/lightnovelwp/filters/ellotl.json | 0 .../filters/ippotranslations.json | 0 .../multisrc/lightnovelwp/filters/keopi.json | 0 .../filters/keopitranslations.json | 0 .../multisrc/lightnovelwp/filters/knoxt.json | 0 .../lightnovelwp/filters/kodekslibrary.json | 0 .../lightnovelwp/filters/kolnovel.json | 0 .../filters/lazygirltranslations.json | 0 .../filters/lightnovelbrasil.json | 0 .../lightnovelwp/filters/lightnovelfr.json | 0 .../lightnovelwp/filters/moonlightnovel.json | 0 .../multisrc/lightnovelwp/filters/namevt.json | 0 .../lightnovelwp/filters/noblemtl.json | 0 .../lightnovelwp/filters/novelsknight.json | 0 .../lightnovelwp/filters/novelsparadise.json | 0 .../lightnovelwp/filters/noveltr.json | 0 .../lightnovelwp/filters/pandamtl.json | 0 .../lightnovelwp/filters/requiemtls.json | 0 .../lightnovelwp/filters/sektenovel.json | 0 .../filters/systemtranslation.json | 0 .../lightnovelwp/filters/transweaver.json | 0 .../lightnovelwp/filters/universalnovel.json | 0 .../lightnovelwp/filters/vandytranslate.json | 0 .../filters/whitemoonlightnovels.json | 0 .../multisrc/lightnovelwp/generator.js | 0 .../multisrc/lightnovelwp/get_filters.js | 0 .../multisrc/lightnovelwp/sources.json | 0 .../multisrc/lightnovelwp/template.ts | 6 +- .../multisrc/madara/README.md | 2 +- .../multisrc/madara/filters/1stkissnovel.json | 0 .../multisrc/madara/filters/Kakikata.json | 0 .../madara/filters/LightNovelUpdates.json | 0 .../madara/filters/WebNovelTraslation.json | 0 .../multisrc/madara/filters/ar-mtl.json | 0 .../multisrc/madara/filters/arnovel.json | 0 .../madara/filters/asuralightnovel.json | 0 .../multisrc/madara/filters/azora.json | 0 .../multisrc/madara/filters/azraznovel.json | 0 .../madara/filters/bellereservoir.json | 0 .../multisrc/madara/filters/citrusaurora.json | 0 .../madara/filters/coralboutique.json | 0 .../multisrc/madara/filters/daonovel.json | 0 .../multisrc/madara/filters/dragonholic.json | 0 .../multisrc/madara/filters/dragontea.json | 0 .../multisrc/madara/filters/duskblossoms.json | 0 .../multisrc/madara/filters/e-novel.json | 0 .../multisrc/madara/filters/ekitaplar.json | 0 .../multisrc/madara/filters/eternalune.json | 0 .../madara/filters/etudetranslations.json | 0 .../multisrc/madara/filters/fanTLS.json | 0 .../madara/filters/fanstranslations.json | 0 .../madara/filters/fortuneeternal.json | 0 .../multisrc/madara/filters/foxaholic.json | 0 .../madara/filters/galaxytranslations.json | 0 .../multisrc/madara/filters/guavaread.json | 0 .../madara/filters/hiraethtranslation.json | 0 .../multisrc/madara/filters/hizomanga.json | 0 .../multisrc/madara/filters/kiniga.json | 0 .../multisrc/madara/filters/lnheaven.json | 0 .../multisrc/madara/filters/lunarletters.json | 0 .../multisrc/madara/filters/massnovel.json | 0 .../multisrc/madara/filters/meionovel.json | 0 .../multisrc/madara/filters/meownovel.json | 0 .../multisrc/madara/filters/morenovel.json | 0 .../multisrc/madara/filters/mostnovel.json | 0 .../multisrc/madara/filters/mtl-novel.json | 0 .../madara/filters/mtlnovel.club.json | 0 .../madara/filters/mysticalmerries.json | 0 .../multisrc/madara/filters/nabiscans.json | 0 .../multisrc/madara/filters/neosekaiTLS.json | 0 .../multisrc/madara/filters/nitromanga.json | 0 .../multisrc/madara/filters/novel-lucky.json | 0 .../multisrc/madara/filters/novel4up.json | 0 .../multisrc/madara/filters/novelTL.json | 0 .../multisrc/madara/filters/novelbookid.json | 0 .../multisrc/madara/filters/novelci.json | 0 .../madara/filters/novelmultiverse.json | 0 .../multisrc/madara/filters/noveloku.json | 0 .../multisrc/madara/filters/novelokutr.json | 0 .../multisrc/madara/filters/novelpdf.json | 0 .../multisrc/madara/filters/olaoe.json | 0 .../madara/filters/panchotranslations.json | 0 .../multisrc/madara/filters/pasteltales.json | 0 .../multisrc/madara/filters/ragnarscans.json | 0 .../multisrc/madara/filters/ranovel.json | 0 .../multisrc/madara/filters/readfanfic.json | 0 .../multisrc/madara/filters/riwyat.json | 0 .../multisrc/madara/filters/salmonlatte.json | 0 .../multisrc/madara/filters/sleeptTLS.json | 0 .../multisrc/madara/filters/sonicmtl.json | 0 .../madara/filters/sweetEscapeTL.json | 0 .../multisrc/madara/filters/sweetescape.json | 0 .../madara/filters/translatinotaku.json | 0 .../madara/filters/turkcelightnovels.json | 0 .../multisrc/madara/filters/violetlily.json | 0 .../multisrc/madara/filters/wbnovel.json | 0 .../multisrc/madara/filters/webnoveloku.json | 0 .../multisrc/madara/filters/webnovelover.json | 0 .../madara/filters/wooksteahouse.json | 0 .../multisrc/madara/filters/wordexcerpt.json | 0 .../multisrc/madara/filters/worldnovel.json | 0 .../madara/filters/wuxiaworld.site.json | 0 .../multisrc/madara/filters/zetroTL.json | 0 .../multisrc/madara/generator.js | 0 .../multisrc/madara/get_filters.js | 0 .../multisrc/madara/sources.json | 0 .../multisrc/madara/template.ts | 4 +- .../multisrc/mtlnovel/filters/mtlnovel.json | 0 .../multisrc/mtlnovel/generator.js | 0 .../multisrc/mtlnovel/sources.json | 0 .../multisrc/mtlnovel/template.ts | 2 +- .../multisrc/novelcool/generator.js | 0 .../multisrc/novelcool/sources.json | 0 .../multisrc/novelcool/template.ts | 2 +- .../multisrc/ranobes/generator.js | 0 .../multisrc/ranobes/sources.json | 0 .../multisrc/ranobes/template.ts | 2 +- .../multisrc/readnovelfull/README.md | 9 +- .../readnovelfull/filters/FWN.com.json | 0 .../readnovelfull/filters/allnovel.json | 0 .../readnovelfull/filters/anf.net.json | 0 .../readnovelfull/filters/boxnovel.json | 0 .../readnovelfull/filters/libread.json | 0 .../readnovelfull/filters/lightnovelplus.json | 0 .../readnovelfull/filters/novelbin.json | 0 .../readnovelfull/filters/novelfull.json | 0 .../readnovelfull/filters/readnovelfull.json | 0 .../multisrc/readnovelfull/generator.js | 0 .../multisrc/readnovelfull/get_filters.js | 0 .../multisrc/readnovelfull/sources.json | 0 .../multisrc/readnovelfull/template.ts | 2 +- .../multisrc/readwn/filters/fannovel.json | 0 .../multisrc/readwn/filters/ltnovel.json | 0 .../multisrc/readwn/filters/wuxiacity.json | 0 .../multisrc/readwn/filters/wuxiamtl.json | 0 .../multisrc/readwn/filters/wuxiap.json | 0 .../multisrc/readwn/generator.js | 0 .../multisrc/readwn/get_filters.ts | 0 .../multisrc/readwn/settings.json | 0 .../multisrc/readwn/sources.json | 0 .../multisrc/readwn/template.ts | 2 +- .../multisrc/rulate/generator.js | 0 .../multisrc/rulate/settings.json | 0 .../multisrc/rulate/sources.json | 0 .../multisrc/rulate/template.ts | 2 +- {src/plugins => plugins}/polish/novelki.ts | 2 +- {src/plugins => plugins}/portuguese/.gitkeep | 0 .../portuguese/blogdoamonnovels.ts | 2 +- .../portuguese/novelmania.ts | 2 +- .../portuguese/tsundoku.ts | 2 +- {src/plugins => plugins}/russian/LitSpace.ts | 34 +- .../russian/authortoday.ts | 2 +- {src/plugins => plugins}/russian/bookriver.ts | 2 +- {src/plugins => plugins}/russian/ficbook.ts | 2 +- {src/plugins => plugins}/russian/jaomix.ts | 2 +- {src/plugins => plugins}/russian/neobook.ts | 2 +- {src/plugins => plugins}/russian/novelOvh.ts | 2 +- {src/plugins => plugins}/russian/novelTL.ts | 2 +- {src/plugins => plugins}/russian/ranobehub.ts | 2 +- {src/plugins => plugins}/russian/ranobelib.ts | 4 +- {src/plugins => plugins}/russian/ranoberf.ts | 2 +- {src/plugins => plugins}/russian/renovels.ts | 2 +- {src/plugins => plugins}/russian/ruvers.ts | 2 +- {src/plugins => plugins}/russian/topliba.ts | 2 +- {src/plugins => plugins}/russian/zelluloza.ts | 2 +- {src/plugins => plugins}/spanish/hasutl.ts | 2 +- .../spanish/novelasligera.ts | 2 +- .../spanish/novelawuxia.ts | 2 +- .../spanish/oasistranslations.ts | 2 +- {src/plugins => plugins}/spanish/skynovels.ts | 2 +- .../spanish/tunovelaligera.ts | 2 +- {src/plugins => plugins}/spanish/yukitls.ts | 2 +- {src/plugins => plugins}/thai/.gitkeep | 0 {src/plugins => plugins}/turkish/MangaTR.ts | 2 +- {src/plugins => plugins}/turkish/epiknovel.ts | 2 +- .../plugins => plugins}/ukrainian/bakainua.ts | 8 +- .../ukrainian/smakolykytl.ts | 2 +- .../ukrainian/uaranobeclub.ts | 2 +- {src/plugins => plugins}/vietnamese/LNHako.ts | 2 +- .../vietnamese/Truyenconect.ts | 2 +- .../vietnamese/lightnovelvn.ts | 2 +- .../vietnamese/nettruyen.ts | 2 +- .../vietnamese/truyenchu.ts | 2 +- .../vietnamese/truyenfull.ts | 2 +- proxy.ts | 2 +- public/ico.png | Bin 15308 -> 0 bytes public/icon.svg | 15 + scripts/build-plugin-manifest.js | 6 +- scripts/generate-plugin-index.js | 10 +- scripts/publish-plugins.ps1 | 2 +- scripts/publish-plugins.sh | 40 +- src/App.css | 46 - src/App.tsx | 55 +- src/components/Appbar/index.tsx | 161 - src/components/CopiableItem.tsx | 42 - src/components/PathItem.tsx | 83 - src/components/StyledSwitch.tsx | 14 - src/components/Textarea.tsx | 56 - src/components/accordions/Headers/index.tsx | 122 - .../accordions/ParseChapter/index.tsx | 50 - .../accordions/ParseNovel/ChaptertList.tsx | 74 - .../accordions/ParseNovel/SourceNovelCard.tsx | 117 - .../accordions/ParseNovel/index.tsx | 70 - .../accordions/PopularNovels/index.css | 11 - .../accordions/PopularNovels/index.tsx | 158 - .../accordions/SearchNovels/index.tsx | 77 - .../components/AccordionContainer.tsx | 36 - .../accordions/components/NovelItemCard.tsx | 55 - .../components/filters/CheckboxFilter.tsx | 64 - .../components/filters/PickerFilter.tsx | 61 - .../components/filters/SwitchFilter.tsx | 33 - .../components/filters/TextFilter.tsx | 38 - .../components/filters/TriStateCheckbox.tsx | 140 - .../components/filters/TriStateSwitch.tsx | 191 -- .../components/filters/XCheckboxFilter.tsx | 88 - src/components/filters/checkbox-filter.tsx | 47 + .../filters/excludable-checkbox-filter.tsx | 89 + .../filters-sheet.tsx} | 161 +- src/components/filters/picker-filter.tsx | 55 + src/components/filters/switch-filter.tsx | 28 + src/components/filters/text-filter.tsx | 30 + src/components/novel-card.tsx | 71 + src/components/parse-chapter.tsx | 247 ++ src/components/parse-novel.tsx | 499 +++ src/components/plugin-header.tsx | 29 + src/components/popular-novels.tsx | 219 ++ src/components/search-novels.tsx | 162 + src/components/settings.tsx | 199 ++ src/components/ui/badge.tsx | 46 + src/components/ui/button.tsx | 60 + src/components/ui/card.tsx | 92 + src/components/ui/checkbox.tsx | 32 + src/components/ui/input.tsx | 21 + src/components/ui/label.tsx | 22 + src/components/ui/select.tsx | 185 ++ src/components/ui/sheet.tsx | 131 + src/components/ui/skeleton.tsx | 16 + src/components/ui/sonner.tsx | 36 + src/components/ui/switch.tsx | 27 + src/components/ui/tabs.tsx | 64 + src/components/ui/tooltip.tsx | 39 + src/hooks/useQueryParams.ts | 36 + src/index.css | 186 +- src/lib/fetch.ts | 156 + src/{libs => lib}/storage.ts | 0 src/lib/utils.ts | 36 + src/libs/defaultCover.ts | 7 +- src/libs/fetch.ts | 157 +- src/libs/filterInputs.ts | 132 +- src/libs/isAbsoluteUrl.ts | 28 +- src/libs/novelStatus.ts | 14 +- src/main.tsx | 15 +- src/pages/home.tsx | 160 + src/plugins/index.d.ts | 4 - src/provider/DialogProvider/index.tsx | 8 - src/provider/index.tsx | 21 - src/provider/plugins.ts | 2 +- src/store/index.ts | 8 +- src/store/navigationStore.ts | 55 + src/store/pluginStore.ts | 34 +- src/types/constants.ts | 12 + src/types/filters.ts | 130 + src/types/types.ts | 6 +- tsconfig.json | 17 +- tsconfig.production.json | 284 +- vite.config.ts | 13 +- 363 files changed, 6848 insertions(+), 3007 deletions(-) create mode 100644 components.json rename {src/plugins => plugins}/arabic/.gitkeep (100%) rename {src/plugins => plugins}/arabic/dilartube.ts (97%) rename {src/plugins => plugins}/arabic/rewayatclub.ts (97%) rename {src/plugins => plugins}/arabic/sunovels.ts (99%) rename {src/plugins => plugins}/chinese/69shu.ts (99%) rename {src/plugins => plugins}/chinese/69xinshu.ts (98%) rename {src/plugins => plugins}/chinese/Quanben.ts (98%) rename {src/plugins => plugins}/chinese/ixdzs8.ts (97%) rename {src/plugins => plugins}/chinese/linovel.ts (98%) rename {src/plugins => plugins}/chinese/linovelib.ts (99%) rename {src/plugins => plugins}/chinese/linovelib_tw.ts (99%) rename {src/plugins => plugins}/chinese/novel543.ts (99%) rename {src/plugins => plugins}/english/NovelOnline.ts (99%) rename {src/plugins => plugins}/english/StorySeedling.ts (99%) rename {src/plugins => plugins}/english/ao3.ts (99%) rename {src/plugins => plugins}/english/bestlightnovel.ts (99%) rename {src/plugins => plugins}/english/chrysanthemumgarden.ts (96%) rename {src/plugins => plugins}/english/divinedaolibrary.ts (99%) rename {src/plugins => plugins}/english/dreambigtl.ts (99%) rename {src/plugins => plugins}/english/earlynovel.ts (99%) rename {src/plugins => plugins}/english/faqwikius.ts (99%) rename {src/plugins => plugins}/english/fenrirrealm.ts (98%) rename {src/plugins => plugins}/english/fictionzone.ts (96%) rename {src/plugins => plugins}/english/foxteller.ts (99%) rename {src/plugins => plugins}/english/genesis.ts (99%) rename {src/plugins => plugins}/english/inkitt.ts (96%) rename {src/plugins => plugins}/english/kdtnovels.ts (99%) rename {src/plugins => plugins}/english/lightnovelpub.ts (99%) rename {src/plugins => plugins}/english/lightnoveltranslation.ts (92%) rename {src/plugins => plugins}/english/lnmtl.ts (99%) rename {src/plugins => plugins}/english/mtlreader.ts (98%) rename {src/plugins => plugins}/english/mvlempyr.ts (99%) rename {src/plugins => plugins}/english/novelbuddy.ts (99%) rename {src/plugins => plugins}/english/novelfire.ts (99%) rename {src/plugins => plugins}/english/novelhall.ts (98%) rename {src/plugins => plugins}/english/novelight.ts (98%) rename {src/plugins => plugins}/english/novelupdates.ts (99%) rename {src/plugins => plugins}/english/pawread.ts (99%) rename {src/plugins => plugins}/english/rainofsnow.ts (99%) rename {src/plugins => plugins}/english/readfrom.ts (90%) rename {src/plugins => plugins}/english/readlitenovel.ts (99%) rename {src/plugins => plugins}/english/reaperscans.ts (97%) rename {src/plugins => plugins}/english/relibrary.ts (99%) rename {src/plugins => plugins}/english/royalroad.ts (99%) rename {src/plugins => plugins}/english/scribblehub.ts (99%) rename {src/plugins => plugins}/english/vynovel.ts (99%) rename {src/plugins => plugins}/english/webnovel.ts (97%) rename {src/plugins => plugins}/english/wtrlab.ts (99%) rename {src/plugins => plugins}/english/wuxiaworld.ts (99%) rename {src/plugins => plugins}/french/chireads.ts (99%) rename {src/plugins => plugins}/french/harkeneliwood.ts (99%) rename {src/plugins => plugins}/french/kisswood.ts (99%) rename {src/plugins => plugins}/french/noveldeglace.ts (99%) rename {src/plugins => plugins}/french/novhell.ts (99%) rename {src/plugins => plugins}/french/phenixscans.ts (99%) rename {src/plugins => plugins}/french/warriorlegendtrad.ts (99%) rename {src/plugins => plugins}/french/wuxialnscantrad.ts (99%) rename {src/plugins => plugins}/french/xiaowaz.ts (99%) create mode 100644 plugins/index.ts rename {src/plugins => plugins}/indonesian/indowebnovel.ts (99%) rename {src/plugins => plugins}/indonesian/novelringan.ts (99%) rename {src/plugins => plugins}/indonesian/sakuranovel.ts (99%) rename {src/plugins => plugins}/japanese/Syosetu.ts (98%) rename {src/plugins => plugins}/japanese/kakuyomu.ts (98%) rename {src/plugins => plugins}/korean/Agitoon.ts (99%) rename {src/plugins => plugins}/multi/komga.ts (95%) rename {scripts => plugins}/multisrc/fictioneer/generator.js (100%) rename {scripts => plugins}/multisrc/fictioneer/sources.json (100%) rename {scripts => plugins}/multisrc/fictioneer/template.ts (98%) rename {scripts => plugins}/multisrc/generate-multisrc-plugins.js (94%) rename {scripts => plugins}/multisrc/hotnovelpub/filter_refresh.ts (100%) rename {scripts => plugins}/multisrc/hotnovelpub/generator.js (100%) rename {scripts => plugins}/multisrc/hotnovelpub/sources.json (100%) rename {scripts => plugins}/multisrc/hotnovelpub/template.ts (99%) rename {scripts => plugins}/multisrc/ifreedom/generator.js (100%) rename {scripts => plugins}/multisrc/ifreedom/settings.json (100%) rename {scripts => plugins}/multisrc/ifreedom/sources.json (100%) rename {scripts => plugins}/multisrc/ifreedom/template.ts (99%) rename {scripts => plugins}/multisrc/lightnovelworld/generator.js (100%) rename {scripts => plugins}/multisrc/lightnovelworld/sources.json (100%) rename {scripts => plugins}/multisrc/lightnovelworld/template.ts (99%) rename {scripts => plugins}/multisrc/lightnovelwp/README.md (97%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/TCSega.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/allnovelread.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/arcane.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/bacalightnovel.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/centralnovel.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/cpunovel.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/daotranslate.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/ellotl.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/ippotranslations.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/keopi.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/keopitranslations.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/knoxt.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/kodekslibrary.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/kolnovel.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/lazygirltranslations.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/lightnovelbrasil.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/lightnovelfr.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/moonlightnovel.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/namevt.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/noblemtl.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/novelsknight.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/novelsparadise.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/noveltr.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/pandamtl.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/requiemtls.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/sektenovel.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/systemtranslation.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/transweaver.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/universalnovel.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/vandytranslate.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/filters/whitemoonlightnovels.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/generator.js (100%) rename {scripts => plugins}/multisrc/lightnovelwp/get_filters.js (100%) rename {scripts => plugins}/multisrc/lightnovelwp/sources.json (100%) rename {scripts => plugins}/multisrc/lightnovelwp/template.ts (99%) rename {scripts => plugins}/multisrc/madara/README.md (97%) rename {scripts => plugins}/multisrc/madara/filters/1stkissnovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/Kakikata.json (100%) rename {scripts => plugins}/multisrc/madara/filters/LightNovelUpdates.json (100%) rename {scripts => plugins}/multisrc/madara/filters/WebNovelTraslation.json (100%) rename {scripts => plugins}/multisrc/madara/filters/ar-mtl.json (100%) rename {scripts => plugins}/multisrc/madara/filters/arnovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/asuralightnovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/azora.json (100%) rename {scripts => plugins}/multisrc/madara/filters/azraznovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/bellereservoir.json (100%) rename {scripts => plugins}/multisrc/madara/filters/citrusaurora.json (100%) rename {scripts => plugins}/multisrc/madara/filters/coralboutique.json (100%) rename {scripts => plugins}/multisrc/madara/filters/daonovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/dragonholic.json (100%) rename {scripts => plugins}/multisrc/madara/filters/dragontea.json (100%) rename {scripts => plugins}/multisrc/madara/filters/duskblossoms.json (100%) rename {scripts => plugins}/multisrc/madara/filters/e-novel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/ekitaplar.json (100%) rename {scripts => plugins}/multisrc/madara/filters/eternalune.json (100%) rename {scripts => plugins}/multisrc/madara/filters/etudetranslations.json (100%) rename {scripts => plugins}/multisrc/madara/filters/fanTLS.json (100%) rename {scripts => plugins}/multisrc/madara/filters/fanstranslations.json (100%) rename {scripts => plugins}/multisrc/madara/filters/fortuneeternal.json (100%) rename {scripts => plugins}/multisrc/madara/filters/foxaholic.json (100%) rename {scripts => plugins}/multisrc/madara/filters/galaxytranslations.json (100%) rename {scripts => plugins}/multisrc/madara/filters/guavaread.json (100%) rename {scripts => plugins}/multisrc/madara/filters/hiraethtranslation.json (100%) rename {scripts => plugins}/multisrc/madara/filters/hizomanga.json (100%) rename {scripts => plugins}/multisrc/madara/filters/kiniga.json (100%) rename {scripts => plugins}/multisrc/madara/filters/lnheaven.json (100%) rename {scripts => plugins}/multisrc/madara/filters/lunarletters.json (100%) rename {scripts => plugins}/multisrc/madara/filters/massnovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/meionovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/meownovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/morenovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/mostnovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/mtl-novel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/mtlnovel.club.json (100%) rename {scripts => plugins}/multisrc/madara/filters/mysticalmerries.json (100%) rename {scripts => plugins}/multisrc/madara/filters/nabiscans.json (100%) rename {scripts => plugins}/multisrc/madara/filters/neosekaiTLS.json (100%) rename {scripts => plugins}/multisrc/madara/filters/nitromanga.json (100%) rename {scripts => plugins}/multisrc/madara/filters/novel-lucky.json (100%) rename {scripts => plugins}/multisrc/madara/filters/novel4up.json (100%) rename {scripts => plugins}/multisrc/madara/filters/novelTL.json (100%) rename {scripts => plugins}/multisrc/madara/filters/novelbookid.json (100%) rename {scripts => plugins}/multisrc/madara/filters/novelci.json (100%) rename {scripts => plugins}/multisrc/madara/filters/novelmultiverse.json (100%) rename {scripts => plugins}/multisrc/madara/filters/noveloku.json (100%) rename {scripts => plugins}/multisrc/madara/filters/novelokutr.json (100%) rename {scripts => plugins}/multisrc/madara/filters/novelpdf.json (100%) rename {scripts => plugins}/multisrc/madara/filters/olaoe.json (100%) rename {scripts => plugins}/multisrc/madara/filters/panchotranslations.json (100%) rename {scripts => plugins}/multisrc/madara/filters/pasteltales.json (100%) rename {scripts => plugins}/multisrc/madara/filters/ragnarscans.json (100%) rename {scripts => plugins}/multisrc/madara/filters/ranovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/readfanfic.json (100%) rename {scripts => plugins}/multisrc/madara/filters/riwyat.json (100%) rename {scripts => plugins}/multisrc/madara/filters/salmonlatte.json (100%) rename {scripts => plugins}/multisrc/madara/filters/sleeptTLS.json (100%) rename {scripts => plugins}/multisrc/madara/filters/sonicmtl.json (100%) rename {scripts => plugins}/multisrc/madara/filters/sweetEscapeTL.json (100%) rename {scripts => plugins}/multisrc/madara/filters/sweetescape.json (100%) rename {scripts => plugins}/multisrc/madara/filters/translatinotaku.json (100%) rename {scripts => plugins}/multisrc/madara/filters/turkcelightnovels.json (100%) rename {scripts => plugins}/multisrc/madara/filters/violetlily.json (100%) rename {scripts => plugins}/multisrc/madara/filters/wbnovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/webnoveloku.json (100%) rename {scripts => plugins}/multisrc/madara/filters/webnovelover.json (100%) rename {scripts => plugins}/multisrc/madara/filters/wooksteahouse.json (100%) rename {scripts => plugins}/multisrc/madara/filters/wordexcerpt.json (100%) rename {scripts => plugins}/multisrc/madara/filters/worldnovel.json (100%) rename {scripts => plugins}/multisrc/madara/filters/wuxiaworld.site.json (100%) rename {scripts => plugins}/multisrc/madara/filters/zetroTL.json (100%) rename {scripts => plugins}/multisrc/madara/generator.js (100%) rename {scripts => plugins}/multisrc/madara/get_filters.js (100%) rename {scripts => plugins}/multisrc/madara/sources.json (100%) rename {scripts => plugins}/multisrc/madara/template.ts (99%) rename {scripts => plugins}/multisrc/mtlnovel/filters/mtlnovel.json (100%) rename {scripts => plugins}/multisrc/mtlnovel/generator.js (100%) rename {scripts => plugins}/multisrc/mtlnovel/sources.json (100%) rename {scripts => plugins}/multisrc/mtlnovel/template.ts (99%) rename {scripts => plugins}/multisrc/novelcool/generator.js (100%) rename {scripts => plugins}/multisrc/novelcool/sources.json (100%) rename {scripts => plugins}/multisrc/novelcool/template.ts (99%) rename {scripts => plugins}/multisrc/ranobes/generator.js (100%) rename {scripts => plugins}/multisrc/ranobes/sources.json (100%) rename {scripts => plugins}/multisrc/ranobes/template.ts (99%) rename {scripts => plugins}/multisrc/readnovelfull/README.md (94%) rename {scripts => plugins}/multisrc/readnovelfull/filters/FWN.com.json (100%) rename {scripts => plugins}/multisrc/readnovelfull/filters/allnovel.json (100%) rename {scripts => plugins}/multisrc/readnovelfull/filters/anf.net.json (100%) rename {scripts => plugins}/multisrc/readnovelfull/filters/boxnovel.json (100%) rename {scripts => plugins}/multisrc/readnovelfull/filters/libread.json (100%) rename {scripts => plugins}/multisrc/readnovelfull/filters/lightnovelplus.json (100%) rename {scripts => plugins}/multisrc/readnovelfull/filters/novelbin.json (100%) rename {scripts => plugins}/multisrc/readnovelfull/filters/novelfull.json (100%) rename {scripts => plugins}/multisrc/readnovelfull/filters/readnovelfull.json (100%) rename {scripts => plugins}/multisrc/readnovelfull/generator.js (100%) rename {scripts => plugins}/multisrc/readnovelfull/get_filters.js (100%) rename {scripts => plugins}/multisrc/readnovelfull/sources.json (100%) rename {scripts => plugins}/multisrc/readnovelfull/template.ts (99%) rename {scripts => plugins}/multisrc/readwn/filters/fannovel.json (100%) rename {scripts => plugins}/multisrc/readwn/filters/ltnovel.json (100%) rename {scripts => plugins}/multisrc/readwn/filters/wuxiacity.json (100%) rename {scripts => plugins}/multisrc/readwn/filters/wuxiamtl.json (100%) rename {scripts => plugins}/multisrc/readwn/filters/wuxiap.json (100%) rename {scripts => plugins}/multisrc/readwn/generator.js (100%) rename {scripts => plugins}/multisrc/readwn/get_filters.ts (100%) rename {scripts => plugins}/multisrc/readwn/settings.json (100%) rename {scripts => plugins}/multisrc/readwn/sources.json (100%) rename {scripts => plugins}/multisrc/readwn/template.ts (99%) rename {scripts => plugins}/multisrc/rulate/generator.js (100%) rename {scripts => plugins}/multisrc/rulate/settings.json (100%) rename {scripts => plugins}/multisrc/rulate/sources.json (100%) rename {scripts => plugins}/multisrc/rulate/template.ts (99%) rename {src/plugins => plugins}/polish/novelki.ts (99%) rename {src/plugins => plugins}/portuguese/.gitkeep (100%) rename {src/plugins => plugins}/portuguese/blogdoamonnovels.ts (99%) rename {src/plugins => plugins}/portuguese/novelmania.ts (99%) rename {src/plugins => plugins}/portuguese/tsundoku.ts (99%) rename {src/plugins => plugins}/russian/LitSpace.ts (96%) rename {src/plugins => plugins}/russian/authortoday.ts (99%) rename {src/plugins => plugins}/russian/bookriver.ts (99%) rename {src/plugins => plugins}/russian/ficbook.ts (99%) rename {src/plugins => plugins}/russian/jaomix.ts (99%) rename {src/plugins => plugins}/russian/neobook.ts (99%) rename {src/plugins => plugins}/russian/novelOvh.ts (99%) rename {src/plugins => plugins}/russian/novelTL.ts (99%) rename {src/plugins => plugins}/russian/ranobehub.ts (99%) rename {src/plugins => plugins}/russian/ranobelib.ts (99%) rename {src/plugins => plugins}/russian/ranoberf.ts (99%) rename {src/plugins => plugins}/russian/renovels.ts (99%) rename {src/plugins => plugins}/russian/ruvers.ts (99%) rename {src/plugins => plugins}/russian/topliba.ts (99%) rename {src/plugins => plugins}/russian/zelluloza.ts (99%) rename {src/plugins => plugins}/spanish/hasutl.ts (98%) rename {src/plugins => plugins}/spanish/novelasligera.ts (99%) rename {src/plugins => plugins}/spanish/novelawuxia.ts (99%) rename {src/plugins => plugins}/spanish/oasistranslations.ts (99%) rename {src/plugins => plugins}/spanish/skynovels.ts (99%) rename {src/plugins => plugins}/spanish/tunovelaligera.ts (99%) rename {src/plugins => plugins}/spanish/yukitls.ts (99%) rename {src/plugins => plugins}/thai/.gitkeep (100%) rename {src/plugins => plugins}/turkish/MangaTR.ts (99%) rename {src/plugins => plugins}/turkish/epiknovel.ts (99%) rename {src/plugins => plugins}/ukrainian/bakainua.ts (96%) rename {src/plugins => plugins}/ukrainian/smakolykytl.ts (99%) rename {src/plugins => plugins}/ukrainian/uaranobeclub.ts (99%) rename {src/plugins => plugins}/vietnamese/LNHako.ts (99%) rename {src/plugins => plugins}/vietnamese/Truyenconect.ts (99%) rename {src/plugins => plugins}/vietnamese/lightnovelvn.ts (99%) rename {src/plugins => plugins}/vietnamese/nettruyen.ts (98%) rename {src/plugins => plugins}/vietnamese/truyenchu.ts (99%) rename {src/plugins => plugins}/vietnamese/truyenfull.ts (99%) delete mode 100644 public/ico.png create mode 100644 public/icon.svg delete mode 100644 src/App.css delete mode 100644 src/components/Appbar/index.tsx delete mode 100644 src/components/CopiableItem.tsx delete mode 100644 src/components/PathItem.tsx delete mode 100644 src/components/StyledSwitch.tsx delete mode 100644 src/components/Textarea.tsx delete mode 100644 src/components/accordions/Headers/index.tsx delete mode 100644 src/components/accordions/ParseChapter/index.tsx delete mode 100644 src/components/accordions/ParseNovel/ChaptertList.tsx delete mode 100644 src/components/accordions/ParseNovel/SourceNovelCard.tsx delete mode 100644 src/components/accordions/ParseNovel/index.tsx delete mode 100644 src/components/accordions/PopularNovels/index.css delete mode 100644 src/components/accordions/PopularNovels/index.tsx delete mode 100644 src/components/accordions/SearchNovels/index.tsx delete mode 100644 src/components/accordions/components/AccordionContainer.tsx delete mode 100644 src/components/accordions/components/NovelItemCard.tsx delete mode 100644 src/components/accordions/components/filters/CheckboxFilter.tsx delete mode 100644 src/components/accordions/components/filters/PickerFilter.tsx delete mode 100644 src/components/accordions/components/filters/SwitchFilter.tsx delete mode 100644 src/components/accordions/components/filters/TextFilter.tsx delete mode 100644 src/components/accordions/components/filters/TriStateCheckbox.tsx delete mode 100644 src/components/accordions/components/filters/TriStateSwitch.tsx delete mode 100644 src/components/accordions/components/filters/XCheckboxFilter.tsx create mode 100644 src/components/filters/checkbox-filter.tsx create mode 100644 src/components/filters/excludable-checkbox-filter.tsx rename src/components/{accordions/components/filters/FiltersDialog.tsx => filters/filters-sheet.tsx} (61%) create mode 100644 src/components/filters/picker-filter.tsx create mode 100644 src/components/filters/switch-filter.tsx create mode 100644 src/components/filters/text-filter.tsx create mode 100644 src/components/novel-card.tsx create mode 100644 src/components/parse-chapter.tsx create mode 100644 src/components/parse-novel.tsx create mode 100644 src/components/plugin-header.tsx create mode 100644 src/components/popular-novels.tsx create mode 100644 src/components/search-novels.tsx create mode 100644 src/components/settings.tsx create mode 100644 src/components/ui/badge.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/card.tsx create mode 100644 src/components/ui/checkbox.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/select.tsx create mode 100644 src/components/ui/sheet.tsx create mode 100644 src/components/ui/skeleton.tsx create mode 100644 src/components/ui/sonner.tsx create mode 100644 src/components/ui/switch.tsx create mode 100644 src/components/ui/tabs.tsx create mode 100644 src/components/ui/tooltip.tsx create mode 100644 src/hooks/useQueryParams.ts create mode 100644 src/lib/fetch.ts rename src/{libs => lib}/storage.ts (100%) create mode 100644 src/lib/utils.ts create mode 100644 src/pages/home.tsx delete mode 100644 src/plugins/index.d.ts delete mode 100644 src/provider/DialogProvider/index.tsx delete mode 100644 src/provider/index.tsx create mode 100644 src/store/navigationStore.ts create mode 100644 src/types/constants.ts create mode 100644 src/types/filters.ts diff --git a/.gitignore b/.gitignore index 16330c8..ca63257 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ node_modules config.json # generated multisrc .ts files -src/plugins/*/*\[*\]*.ts +plugins/*/*\[*\]*.ts # ignore dist stuffs .js diff --git a/components.json b/components.json new file mode 100644 index 0000000..2b0833f --- /dev/null +++ b/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/docs/docs.md b/docs/docs.md index f74699f..e9469a0 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -11,7 +11,7 @@ Most of the Plugin/Novel type definitions accessed using the `Plugin` namespace imported via ```ts -import { Plugin } from "@typings/plugin"; +import { Plugin } from '@/types/plugin'; ``` ### PluginBase @@ -349,23 +349,24 @@ It is an object representing information how to store/access the novel You can use the default `Cover not available` cover by importing ```ts -import { defaultCover } from "@libs/defaultCover"; +import { defaultCover } from '@libs/defaultCover'; ``` --- ### SourceNovel -| Field | Type | Required | Desciption | -| ----- | ------ | -------- | ---------- | -| url | string | yes | | -| name | string | no | string | -|cover|`string`|no|| -|genres|`string`|no|| -|summary|`string`|no|| -|author|`string`|no|| -|artist|`string`|no|| -|status|[NovelStatus] or `string`|no|| +| Field | Type | Required | Desciption | +| ------- | ------------------------- | -------- | ---------- | +| url | string | yes | | +| name | string | no | string | +| cover | `string` | no | | +| genres | `string` | no | | +| summary | `string` | no | | +| author | `string` | no | | +| artist | `string` | no | | +| status | [NovelStatus] or `string` | no | | + chapters?: ChapterItem[]; --- @@ -379,7 +380,7 @@ import { defaultCover } from "@libs/defaultCover"; `Filters` and `FilterTypes` are not in the `Plugin` namespace and are from `@libs/filterInputs` file: ```ts -import { FilterTypes, Filters } from "@libs/filterInputs"; +import { FilterTypes, Filters } from '@libs/filterInputs'; ``` There are 2 main objects when using filters: @@ -418,11 +419,11 @@ options.filters.order filters = { genre: { type: FilterTypes.CheckboxGroup, - label: "Genres", + label: 'Genres', value: [], options: [ - { label: "Isekai", value: "isekai" }, - { label: "Romance", value: "romans" }, + { label: 'Isekai', value: 'isekai' }, + { label: 'Romance', value: 'romans' }, ], }, } satisfies Filters; @@ -445,12 +446,12 @@ Types of filters supported ```ts options: [ { - label: "default", // in-app label - value: "", // in-code value + label: 'default', // in-app label + value: '', // in-code value }, { - label: "Value ABC", - value: "abc", + label: 'Value ABC', + value: 'abc', }, ]; ``` @@ -460,12 +461,12 @@ options: [ ```ts options: [ { - label: "Value ABC", // in-app label - value: "abc", // in-code value + label: 'Value ABC', // in-app label + value: 'abc', // in-code value }, { - label: "Value DEF", - value: "def", + label: 'Value DEF', + value: 'def', }, ]; ``` diff --git a/docs/plugin-template.ts b/docs/plugin-template.ts index 81ee904..1d762d8 100644 --- a/docs/plugin-template.ts +++ b/docs/plugin-template.ts @@ -1,11 +1,11 @@ -import { fetchApi, fetchProto, fetchText } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { fetchApi, fetchProto, fetchText } from '@/lib/fetch'; +import { Plugin } from '@/types/plugin'; import { Filters } from '@libs/filterInputs'; import { load as loadCheerio } from 'cheerio'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; // import { isUrlAbsolute } from '@libs/isAbsoluteUrl'; -// import { storage, localStorage, sessionStorage } from '@libs/storage'; +// import { storage, localStorage, sessionStorage } from '@/lib/storage'; // import { encode, decode } from 'urlencode'; // import dayjs from 'dayjs'; // import { Parser } from 'htmlparser2'; diff --git a/eslint.config.js b/eslint.config.js index 1393852..0ecca52 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -129,10 +129,15 @@ export default tseslint.config( ...tseslint.configs.stylistic, prettierConfig, { - ignores: ['.js', 'docs', 'proxy_server.js'], + ignores: [ + '.js', + 'docs', + 'proxy_server.js', + 'plugins/*/*\\[*\\]*.ts', // Files with square brackets in their names + ], }, { - files: ['./src/plugins/*/*.ts', './scripts/multisrc/*/template.ts'], + files: ['./plugins/*/*.ts', './plugins/multisrc/*/template.ts'], rules: { 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': 'warn', @@ -150,7 +155,7 @@ export default tseslint.config( }, { files: ['**/*.{ts,tsx,mts,cts,js}'], - ignores: ['./src/plugins/*/*.ts', './scripts/multisrc/*/template.ts'], + ignores: ['./plugins/*/*.ts', './plugins/multisrc/*/template.ts'], rules: { 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': 'warn', diff --git a/index.html b/index.html index 52f3fcc..dc76d98 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,10 @@ - + Plugin testing +
diff --git a/package-lock.json b/package-lock.json index 7a55d44..f4479c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,23 @@ "version": "3.0.0", "license": "MIT", "dependencies": { + "@fontsource/geist-mono": "^5.2.7", + "@fontsource/geist-sans": "^5.2.5", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-dialog": "^1.1.5", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-switch": "^1.1.4", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-tooltip": "^1.2.8", + "@tailwindcss/vite": "^4.1.14", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.546.0", + "sonner": "^2.0.7", + "tailwind-merge": "^3.3.1", + "tailwindcss": "^4.1.14", "terser": "^5.36.0", "typescript": "^5.7.2" }, @@ -23,6 +40,7 @@ "@types/eslint__js": "^8.42.3", "@types/eslint-config-prettier": "^6.11.3", "@types/http-proxy": "^1.17.16", + "@types/node": "^24.8.1", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@types/react-window": "^1.8.8", @@ -46,6 +64,7 @@ "react-window": "^1.8.10", "sanitize-html": "^2.13.1", "serve": "^14.2.4", + "tw-animate-css": "^1.4.0", "typescript-eslint": "^7.14.1", "urlencode": "^2.0.0", "vite": "^6.3.2", @@ -196,6 +215,16 @@ "node": ">=6.9.0" } }, + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -254,6 +283,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", "dev": true, + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -297,6 +327,7 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", "dev": true, + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -349,7 +380,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -366,7 +396,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -383,7 +412,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -400,7 +428,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -417,7 +444,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -434,7 +460,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -451,7 +476,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -468,7 +492,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -485,7 +508,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -502,7 +524,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -519,7 +540,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -536,7 +556,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -553,7 +572,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -570,7 +588,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -587,7 +604,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -604,7 +620,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -621,7 +636,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -638,7 +652,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -655,7 +668,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -672,7 +684,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -689,7 +700,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -706,7 +716,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -723,7 +732,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -740,7 +748,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -757,7 +764,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -850,6 +856,62 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@fontsource/geist-mono": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/geist-mono/-/geist-mono-5.2.7.tgz", + "integrity": "sha512-xVPVFISJg/K0VVd+aQN0Y7X/sw9hUcJPyDWFJ5GpyU3bHELhoRsJkPSRSHXW32mOi0xZCUQDOaPj1sqIFJ1FGg==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/geist-sans": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/geist-sans/-/geist-sans-5.2.5.tgz", + "integrity": "sha512-anllOHyJbElRs9fV15TeDRqAeb1IKm4bSknPl6ZMoyPTx1BBy7logudcUwpNjmQLkzn4Q0JGQLRCUKJYoyST6A==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@fontsource/roboto": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.1.0.tgz", @@ -891,6 +953,18 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -904,6 +978,16 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -930,9 +1014,9 @@ } }, "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==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -985,6 +1069,7 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.9.tgz", "integrity": "sha512-NwqIN0bdsgzSbZd5JFcC+2ez0XW/XNs8uiV2PDHrqQ4qf/FEasFJG1z6g8JbCN0YlTrHZekVb17X0Fv0qcYJfQ==", "dev": true, + "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.1.9", @@ -1283,6 +1368,739 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "dev": true }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, "node_modules/@reduxjs/toolkit": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.4.0.tgz", @@ -1373,7 +2191,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1387,7 +2204,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1401,7 +2217,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1415,7 +2230,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1429,7 +2243,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1443,7 +2256,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1457,7 +2269,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1471,7 +2282,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1485,7 +2295,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1499,7 +2308,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1513,7 +2321,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1527,7 +2334,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1541,7 +2347,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1555,7 +2360,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1569,7 +2373,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1583,7 +2386,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1597,7 +2399,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1611,7 +2412,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1625,7 +2425,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1639,7 +2438,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1872,6 +2670,268 @@ "@swc/counter": "^0.1.3" } }, + "node_modules/@tailwindcss/node": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", + "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", + "lightningcss": "1.30.1", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.14" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", + "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.5.1" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-x64": "4.1.14", + "@tailwindcss/oxide-freebsd-x64": "4.1.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-x64-musl": "4.1.14", + "@tailwindcss/oxide-wasm32-wasi": "4.1.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.14" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", + "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", + "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", + "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", + "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", + "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", + "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", + "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", + "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", + "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", + "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.5", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", + "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", + "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.14.tgz", + "integrity": "sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.14", + "@tailwindcss/oxide": "4.1.14", + "tailwindcss": "4.1.14" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, "node_modules/@types/eslint": { "version": "8.56.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", @@ -1901,7 +2961,6 @@ "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/http-proxy": { @@ -1920,12 +2979,13 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", - "dev": true, + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz", + "integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==", + "devOptional": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~7.14.0" } }, "node_modules/@types/parse-json": { @@ -1938,13 +2998,14 @@ "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "dev": true + "devOptional": true }, "node_modules/@types/react": { "version": "18.2.66", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.66.tgz", "integrity": "sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==", - "dev": true, + "devOptional": true, + "peer": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -1955,7 +3016,8 @@ "version": "18.2.22", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", - "dev": true, + "devOptional": true, + "peer": true, "dependencies": { "@types/react": "*" } @@ -1982,7 +3044,7 @@ "version": "0.23.0", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.23.0.tgz", "integrity": "sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==", - "dev": true + "devOptional": true }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", @@ -2028,6 +3090,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.14.1", "@typescript-eslint/types": "7.14.1", @@ -2243,6 +3306,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2414,6 +3478,18 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2973,6 +4049,15 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -2984,6 +4069,18 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, "node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", @@ -3168,7 +4265,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3458,7 +4555,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "devOptional": true }, "node_modules/dayjs": { "version": "1.11.13", @@ -3556,6 +4653,21 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -3727,6 +4839,19 @@ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -3788,7 +4913,6 @@ "version": "0.25.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", - "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -3842,6 +4966,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -4299,7 +5424,6 @@ "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, "optional": true, "os": [ @@ -4351,6 +5475,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -4441,6 +5574,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -4998,11 +6137,19 @@ "node": ">=10" } }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "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==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -5074,6 +6221,234 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -5223,7 +6598,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -5231,14 +6605,22 @@ "loose-envify": "cli.js" } }, + "node_modules/lucide-react": { + "version": "0.546.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.546.0.tgz", + "integrity": "sha512-Z94u6fKT43lKeYHiVyvyR8fT7pwCzDu7RyMPpTvh054+xahSgj4HFQ+NmflvzdXsoAjYGdCguGaFKYuvq0ThCQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/md5.js": { @@ -5403,6 +6785,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5414,7 +6817,6 @@ "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", @@ -5868,7 +7270,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -5922,7 +7323,6 @@ "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", @@ -6175,7 +7575,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dev": true, + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -6187,7 +7587,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -6207,6 +7607,7 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "dev": true, + "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -6225,6 +7626,75 @@ } } }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -6290,7 +7760,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -6460,7 +7931,6 @@ "version": "4.40.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.7" @@ -6583,16 +8053,16 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6819,6 +8289,16 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/sonner": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -6832,7 +8312,6 @@ "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" @@ -6986,6 +8465,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwind-merge": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", + "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/terser": { "version": "5.36.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", @@ -7031,7 +8555,6 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.4.4", @@ -7048,7 +8571,6 @@ "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -7063,8 +8585,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7097,6 +8619,12 @@ "typescript": ">=4.2.0" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", @@ -7104,6 +8632,16 @@ "dev": true, "license": "MIT" }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7120,6 +8658,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7165,10 +8704,11 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "devOptional": true, + "license": "MIT" }, "node_modules/update-check": { "version": "1.5.4", @@ -7220,6 +8760,49 @@ "iconv-lite": "~0.6.3" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sync-external-store": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", @@ -7264,8 +8847,8 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -7356,7 +8939,6 @@ "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -7371,8 +8953,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7527,11 +9109,20 @@ "node": ">=0.4" } }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "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, + "devOptional": true, "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -7691,6 +9282,15 @@ "@babel/helper-validator-identifier": "^7.25.9" } }, + "@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "optional": true, + "requires": { + "tslib": "^2.4.0" + } + }, "@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -7749,6 +9349,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -7784,6 +9385,7 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -7822,175 +9424,150 @@ "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", - "dev": true, "optional": true }, "@esbuild/android-arm": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", - "dev": true, "optional": true }, "@esbuild/android-arm64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", - "dev": true, "optional": true }, "@esbuild/android-x64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", - "dev": true, "optional": true }, "@esbuild/darwin-arm64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", - "dev": true, "optional": true }, "@esbuild/darwin-x64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", - "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", - "dev": true, "optional": true }, "@esbuild/freebsd-x64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", - "dev": true, "optional": true }, "@esbuild/linux-arm": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", - "dev": true, "optional": true }, "@esbuild/linux-arm64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", - "dev": true, "optional": true }, "@esbuild/linux-ia32": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", - "dev": true, "optional": true }, "@esbuild/linux-loong64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", - "dev": true, "optional": true }, "@esbuild/linux-mips64el": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", - "dev": true, "optional": true }, "@esbuild/linux-ppc64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", - "dev": true, "optional": true }, "@esbuild/linux-riscv64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", - "dev": true, "optional": true }, "@esbuild/linux-s390x": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", - "dev": true, "optional": true }, "@esbuild/linux-x64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", - "dev": true, "optional": true }, "@esbuild/netbsd-arm64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", - "dev": true, "optional": true }, "@esbuild/netbsd-x64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", - "dev": true, "optional": true }, "@esbuild/openbsd-arm64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", - "dev": true, "optional": true }, "@esbuild/openbsd-x64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", - "dev": true, "optional": true }, "@esbuild/sunos-x64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", - "dev": true, "optional": true }, "@esbuild/win32-arm64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", - "dev": true, "optional": true }, "@esbuild/win32-ia32": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", - "dev": true, "optional": true }, "@esbuild/win32-x64": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", - "dev": true, "optional": true }, "@eslint-community/eslint-utils": { @@ -8048,6 +9625,46 @@ "integrity": "sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==", "dev": true }, + "@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "requires": { + "@floating-ui/utils": "^0.2.10" + } + }, + "@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "requires": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "requires": { + "@floating-ui/dom": "^1.7.4" + } + }, + "@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" + }, + "@fontsource/geist-mono": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/geist-mono/-/geist-mono-5.2.7.tgz", + "integrity": "sha512-xVPVFISJg/K0VVd+aQN0Y7X/sw9hUcJPyDWFJ5GpyU3bHELhoRsJkPSRSHXW32mOi0xZCUQDOaPj1sqIFJ1FGg==" + }, + "@fontsource/geist-sans": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/geist-sans/-/geist-sans-5.2.5.tgz", + "integrity": "sha512-anllOHyJbElRs9fV15TeDRqAeb1IKm4bSknPl6ZMoyPTx1BBy7logudcUwpNjmQLkzn4Q0JGQLRCUKJYoyST6A==" + }, "@fontsource/roboto": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.1.0.tgz", @@ -8077,6 +9694,14 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, + "@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "requires": { + "minipass": "^7.0.4" + } + }, "@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -8087,6 +9712,15 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -8107,9 +9741,9 @@ } }, "@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==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "@jridgewell/trace-mapping": { "version": "0.3.25", @@ -8140,6 +9774,7 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.9.tgz", "integrity": "sha512-NwqIN0bdsgzSbZd5JFcC+2ez0XW/XNs8uiV2PDHrqQ4qf/FEasFJG1z6g8JbCN0YlTrHZekVb17X0Fv0qcYJfQ==", "dev": true, + "peer": true, "requires": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.1.9", @@ -8313,6 +9948,348 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "dev": true }, + "@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==" + }, + "@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==" + }, + "@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "requires": { + "@radix-ui/react-primitive": "2.1.3" + } + }, + "@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "requires": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + } + }, + "@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "requires": {} + }, + "@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "requires": {} + }, + "@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "requires": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + } + }, + "@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "requires": {} + }, + "@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "requires": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + } + }, + "@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "requires": {} + }, + "@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + } + }, + "@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "requires": { + "@radix-ui/react-use-layout-effect": "1.1.1" + } + }, + "@radix-ui/react-label": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "requires": { + "@radix-ui/react-primitive": "2.1.3" + } + }, + "@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "requires": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + } + }, + "@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "requires": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + } + }, + "@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + } + }, + "@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "requires": { + "@radix-ui/react-slot": "1.2.3" + } + }, + "@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "requires": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + } + }, + "@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "requires": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + } + }, + "@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "requires": { + "@radix-ui/react-compose-refs": "1.1.2" + } + }, + "@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "requires": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + } + }, + "@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "requires": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + } + }, + "@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "requires": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "requires": {} + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "requires": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + } + }, + "@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "requires": { + "@radix-ui/react-use-layout-effect": "1.1.1" + } + }, + "@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "requires": { + "@radix-ui/react-use-callback-ref": "1.1.1" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "requires": {} + }, + "@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "requires": {} + }, + "@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "requires": { + "@radix-ui/rect": "1.1.1" + } + }, + "@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "requires": { + "@radix-ui/react-use-layout-effect": "1.1.1" + } + }, + "@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "requires": { + "@radix-ui/react-primitive": "2.1.3" + } + }, + "@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" + }, "@reduxjs/toolkit": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.4.0.tgz", @@ -8359,140 +10336,120 @@ "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", - "dev": true, "optional": true }, "@rollup/rollup-android-arm64": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", - "dev": true, "optional": true }, "@rollup/rollup-darwin-arm64": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", - "dev": true, "optional": true }, "@rollup/rollup-darwin-x64": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", - "dev": true, "optional": true }, "@rollup/rollup-freebsd-arm64": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", - "dev": true, "optional": true }, "@rollup/rollup-freebsd-x64": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", - "dev": true, "optional": true }, "@rollup/rollup-linux-arm-gnueabihf": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", - "dev": true, "optional": true }, "@rollup/rollup-linux-arm-musleabihf": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", - "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-gnu": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", - "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-musl": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", - "dev": true, "optional": true }, "@rollup/rollup-linux-loongarch64-gnu": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", - "dev": true, "optional": true }, "@rollup/rollup-linux-powerpc64le-gnu": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", - "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-gnu": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", - "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-musl": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", - "dev": true, "optional": true }, "@rollup/rollup-linux-s390x-gnu": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", - "dev": true, "optional": true }, "@rollup/rollup-linux-x64-gnu": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", - "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", - "dev": true, "optional": true }, "@rollup/rollup-win32-arm64-msvc": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", - "dev": true, "optional": true }, "@rollup/rollup-win32-ia32-msvc": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", - "dev": true, "optional": true }, "@rollup/rollup-win32-x64-msvc": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", - "dev": true, "optional": true }, "@swc/core": { @@ -8600,6 +10557,131 @@ "@swc/counter": "^0.1.3" } }, + "@tailwindcss/node": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", + "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", + "requires": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", + "lightningcss": "1.30.1", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.14" + } + }, + "@tailwindcss/oxide": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", + "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", + "requires": { + "@tailwindcss/oxide-android-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-x64": "4.1.14", + "@tailwindcss/oxide-freebsd-x64": "4.1.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-x64-musl": "4.1.14", + "@tailwindcss/oxide-wasm32-wasi": "4.1.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.14", + "detect-libc": "^2.0.4", + "tar": "^7.5.1" + } + }, + "@tailwindcss/oxide-android-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", + "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", + "optional": true + }, + "@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", + "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", + "optional": true + }, + "@tailwindcss/oxide-darwin-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", + "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", + "optional": true + }, + "@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", + "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", + "optional": true + }, + "@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", + "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", + "optional": true + }, + "@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", + "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", + "optional": true + }, + "@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", + "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", + "optional": true + }, + "@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", + "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", + "optional": true + }, + "@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", + "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", + "optional": true + }, + "@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", + "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", + "optional": true, + "requires": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.5", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + } + }, + "@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", + "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", + "optional": true + }, + "@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", + "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", + "optional": true + }, + "@tailwindcss/vite": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.14.tgz", + "integrity": "sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==", + "requires": { + "@tailwindcss/node": "4.1.14", + "@tailwindcss/oxide": "4.1.14", + "tailwindcss": "4.1.14" + } + }, "@types/eslint": { "version": "8.56.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", @@ -8628,8 +10710,7 @@ "@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 + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" }, "@types/http-proxy": { "version": "1.17.16", @@ -8647,12 +10728,12 @@ "dev": true }, "@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", - "dev": true, + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz", + "integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==", + "devOptional": true, "requires": { - "undici-types": "~5.26.4" + "undici-types": "~7.14.0" } }, "@types/parse-json": { @@ -8665,13 +10746,14 @@ "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "dev": true + "devOptional": true }, "@types/react": { "version": "18.2.66", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.66.tgz", "integrity": "sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==", - "dev": true, + "devOptional": true, + "peer": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -8682,7 +10764,8 @@ "version": "18.2.22", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", - "dev": true, + "devOptional": true, + "peer": true, "requires": { "@types/react": "*" } @@ -8709,7 +10792,7 @@ "version": "0.23.0", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.23.0.tgz", "integrity": "sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==", - "dev": true + "devOptional": true }, "@types/use-sync-external-store": { "version": "0.0.3", @@ -8739,6 +10822,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", "dev": true, + "peer": true, "requires": { "@typescript-eslint/scope-manager": "7.14.1", "@typescript-eslint/types": "7.14.1", @@ -8867,7 +10951,8 @@ "acorn": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==" + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "peer": true }, "acorn-jsx": { "version": "5.3.2", @@ -8976,6 +11061,14 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "requires": { + "tslib": "^2.0.0" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -9388,6 +11481,11 @@ "domutils": "^3.0.1" } }, + "chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -9398,6 +11496,14 @@ "safe-buffer": "^5.0.1" } }, + "class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "requires": { + "clsx": "^2.1.1" + } + }, "cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", @@ -9510,8 +11616,7 @@ "clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" }, "color-convert": { "version": "2.0.1", @@ -9749,7 +11854,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "devOptional": true }, "dayjs": { "version": "1.11.13", @@ -9816,6 +11921,16 @@ "minimalistic-assert": "^1.0.0" } }, + "detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" + }, + "detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -9951,6 +12066,15 @@ "whatwg-encoding": "^3.1.1" } }, + "enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, "entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -9991,7 +12115,6 @@ "version": "0.25.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", - "dev": true, "requires": { "@esbuild/aix-ppc64": "0.25.3", "@esbuild/android-arm": "0.25.3", @@ -10031,6 +12154,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -10365,7 +12489,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "optional": true }, "function-bind": { @@ -10393,6 +12516,11 @@ "hasown": "^2.0.0" } }, + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, "get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -10451,6 +12579,11 @@ "get-intrinsic": "^1.1.3" } }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -10816,11 +12949,15 @@ "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==", "dev": true }, + "jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "4.1.0", @@ -10880,6 +13017,84 @@ "type-check": "~0.4.0" } }, + "lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "requires": { + "detect-libc": "^2.0.3", + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "optional": true + }, + "lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "optional": true + }, + "lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "optional": true + }, + "lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "optional": true + }, + "lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "optional": true + }, + "lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "optional": true + }, + "lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "optional": true + }, + "lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "optional": true + }, + "lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "optional": true + }, + "lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "optional": true + }, "lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -10983,18 +13198,22 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lucide-react": { + "version": "0.546.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.546.0.tgz", + "integrity": "sha512-Z94u6fKT43lKeYHiVyvyR8fT7pwCzDu7RyMPpTvh054+xahSgj4HFQ+NmflvzdXsoAjYGdCguGaFKYuvq0ThCQ==", + "requires": {} + }, "magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "requires": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "md5.js": { @@ -11116,6 +13335,19 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, + "minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "requires": { + "minipass": "^7.1.2" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -11125,8 +13357,7 @@ "nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" }, "natural-compare": { "version": "1.4.0", @@ -11450,8 +13681,7 @@ "picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { "version": "2.3.1", @@ -11484,7 +13714,6 @@ "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, "requires": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -11661,7 +13890,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dev": true, + "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -11670,7 +13899,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, + "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -11687,11 +13916,42 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "dev": true, + "peer": true, "requires": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" } }, + "react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "requires": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + } + }, + "react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "requires": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + } + }, + "react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "requires": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + } + }, "react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -11736,7 +13996,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "dev": true + "dev": true, + "peer": true }, "redux-thunk": { "version": "3.1.0", @@ -11861,7 +14122,6 @@ "version": "4.40.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", - "dev": true, "requires": { "@rollup/rollup-android-arm-eabi": "4.40.0", "@rollup/rollup-android-arm64": "4.40.0", @@ -11940,15 +14200,14 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, "requires": { "loose-envify": "^1.1.0" } }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true }, "serve": { @@ -12107,6 +14366,12 @@ "is-fullwidth-code-point": "^4.0.0" } }, + "sonner": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "requires": {} + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -12116,8 +14381,7 @@ "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 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" }, "source-map-support": { "version": "0.5.21", @@ -12225,6 +14489,33 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "tailwind-merge": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==" + }, + "tailwindcss": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", + "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==" + }, + "tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==" + }, + "tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "requires": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + } + }, "terser": { "version": "5.36.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", @@ -12262,7 +14553,6 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "dev": true, "requires": { "fdir": "^6.4.4", "picomatch": "^4.0.2" @@ -12272,14 +14562,13 @@ "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, "requires": {} }, "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true + "peer": true } } }, @@ -12299,12 +14588,23 @@ "dev": true, "requires": {} }, + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, + "tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "dev": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12317,7 +14617,8 @@ "typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "peer": true }, "typescript-eslint": { "version": "7.14.1", @@ -12337,10 +14638,10 @@ "dev": true }, "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "devOptional": true }, "update-check": { "version": "1.5.4", @@ -12388,6 +14689,23 @@ "iconv-lite": "~0.6.3" } }, + "use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "requires": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + } + }, "use-sync-external-store": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", @@ -12424,7 +14742,7 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "dev": true, + "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -12439,14 +14757,13 @@ "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, "requires": {} }, "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true + "peer": true } } }, @@ -12560,11 +14877,16 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, + "yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" + }, "yaml": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", - "dev": true + "devOptional": true }, "yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index b10bdcb..aa63d14 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "clean:multisrc": "find . -type f -wholename \"*plugins*\\[*\\]*.[t,j]s\" -delete", "clean:multisrc:windows": "powershell -Command \"Get-ChildItem -Recurse -Include \\\"*].ts\\\",\\\"*].js\\\" | Where-Object { $_.FullName -like \\\"*plugins*\\\" } | Remove-Item\"", "dev": "vite", - "dev:start": "node scripts/generate-plugin-index.js && vite", - "build:multisrc": "node ./scripts/multisrc/generate-multisrc-plugins.js", + "dev:start": "node ./plugins/multisrc/generate-multisrc-plugins.js && node scripts/generate-plugin-index.js && vite", + "build:multisrc": "node ./plugins/multisrc/generate-multisrc-plugins.js", "build:compile": "npx tsc --project tsconfig.production.json", "build:manifest": "node ./scripts/build-plugin-manifest.js", "build:manifest:dev": "node --env-file=.env ./scripts/build-plugin-manifest.js", @@ -27,6 +27,23 @@ "author": "LNReader", "license": "MIT", "dependencies": { + "@fontsource/geist-mono": "^5.2.7", + "@fontsource/geist-sans": "^5.2.5", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-dialog": "^1.1.5", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-switch": "^1.1.4", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-tooltip": "^1.2.8", + "@tailwindcss/vite": "^4.1.14", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.546.0", + "sonner": "^2.0.7", + "tailwind-merge": "^3.3.1", + "tailwindcss": "^4.1.14", "terser": "^5.36.0", "typescript": "^5.7.2" }, @@ -41,6 +58,7 @@ "@types/eslint__js": "^8.42.3", "@types/eslint-config-prettier": "^6.11.3", "@types/http-proxy": "^1.17.16", + "@types/node": "^24.8.1", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@types/react-window": "^1.8.8", @@ -64,6 +82,7 @@ "react-window": "^1.8.10", "sanitize-html": "^2.13.1", "serve": "^14.2.4", + "tw-animate-css": "^1.4.0", "typescript-eslint": "^7.14.1", "urlencode": "^2.0.0", "vite": "^6.3.2", diff --git a/src/plugins/arabic/.gitkeep b/plugins/arabic/.gitkeep similarity index 100% rename from src/plugins/arabic/.gitkeep rename to plugins/arabic/.gitkeep diff --git a/src/plugins/arabic/dilartube.ts b/plugins/arabic/dilartube.ts similarity index 97% rename from src/plugins/arabic/dilartube.ts rename to plugins/arabic/dilartube.ts index 4f230ca..b190fba 100644 --- a/src/plugins/arabic/dilartube.ts +++ b/plugins/arabic/dilartube.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; @@ -80,8 +80,8 @@ class dilartube implements Plugin.PluginBase { async parseNovel(novelUrl: string): Promise { const chapterItems: Plugin.ChapterItem[] = []; - let fullUrl = this.site + 'api/' + novelUrl; - let chapterUrl = this.site + 'api/' + novelUrl + '/releases'; + const fullUrl = this.site + 'api/' + novelUrl; + const chapterUrl = this.site + 'api/' + novelUrl + '/releases'; const manga = await fetchApi(fullUrl).then(r => r.json()); const chapters = await fetchApi(chapterUrl).then(r => r.json()); const mangaData = manga.mangaData; @@ -199,21 +199,21 @@ class dilartube implements Plugin.PluginBase { export default new dilartube(); -interface Category { +type Category = { id: number; name: string; icon: string | null; manga_id: number; -} +}; -interface Type { +type Type = { id: number; name: string; reading_direction: string; title: string; -} +}; -interface Manga { +type Manga = { id: number; title: string; summary: string; @@ -249,8 +249,8 @@ interface Manga { artists: any[]; categories: Category[]; type: Type; -} -interface Release { +}; +type Release = { id: number; manga_id: number; created_at: string; @@ -272,11 +272,11 @@ interface Release { team_paypal: string | null; has_rev_link: boolean; manga: Manga; -} -interface ApiResponse { +}; +type ApiResponse = { releases: Release[]; data: searchManga[]; -} +}; type MangaCategory = { id: number; name: string; @@ -384,7 +384,7 @@ type ChapterRelease = { team_name: string; has_rev_link: boolean; }; -interface searchManga { +type searchManga = { filter: any; id: number; title: string; @@ -421,4 +421,4 @@ interface searchManga { artists: any[]; categories: Category[]; type: Type; -} +}; diff --git a/src/plugins/arabic/rewayatclub.ts b/plugins/arabic/rewayatclub.ts similarity index 97% rename from src/plugins/arabic/rewayatclub.ts rename to plugins/arabic/rewayatclub.ts index cfe68d1..3f4983b 100644 --- a/src/plugins/arabic/rewayatclub.ts +++ b/plugins/arabic/rewayatclub.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; @@ -141,7 +141,7 @@ class RewayatClub implements Plugin.PagePlugin { }; } async parseChapter(chapterUrl: string): Promise { - let link = this.site + 'api/chapters/' + chapterUrl.slice(6); + const link = this.site + 'api/chapters/' + chapterUrl.slice(6); const result = await fetchApi(link).then(r => r.json()); let chapterText = result.content .flat() @@ -211,7 +211,7 @@ class RewayatClub implements Plugin.PagePlugin { export default new RewayatClub(); -interface NovelEntry { +type NovelEntry = { arabic: string; english: string; about: string; @@ -234,14 +234,14 @@ interface NovelEntry { poster_url: string; original: boolean; }; -} -interface NovelData { +}; +type NovelData = { count?: number; next?: string; previous?: string; results: NovelEntry[]; -} -interface ChapterEntry { +}; +type ChapterEntry = { number: number; title: string; date: string; @@ -254,11 +254,11 @@ interface ChapterEntry { id: number; }; read: any[]; -} +}; -interface ChapterData { +type ChapterData = { count: number; next: string; previous: string; results: ChapterEntry[]; -} +}; diff --git a/src/plugins/arabic/sunovels.ts b/plugins/arabic/sunovels.ts similarity index 99% rename from src/plugins/arabic/sunovels.ts rename to plugins/arabic/sunovels.ts index 89f7682..abdbc3e 100644 --- a/src/plugins/arabic/sunovels.ts +++ b/plugins/arabic/sunovels.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; @@ -22,7 +22,7 @@ class Sunovels implements Plugin.PagePlugin { imageUrlList.push(...imageUrlMatched); } }); - let counter: number = 0; + let counter = 0; loadedCheerio('.list-item').each((idx, ele) => { loadedCheerio(ele) .find('a') @@ -150,7 +150,7 @@ class Sunovels implements Plugin.PagePlugin { const pageUrl = firstUrl + '?activeTab=chapters&page=' + pageCorrected; const body = await fetchApi(pageUrl).then(r => r.text()); const loadedCheerio = parseHTML(body); - let dataJson: { + const dataJson: { pages_count: string; chapters: ChapterEntry[]; } = { pages_count: '', chapters: [] }; @@ -298,9 +298,9 @@ class Sunovels implements Plugin.PagePlugin { export default new Sunovels(); -interface ChapterEntry { +type ChapterEntry = { chapterName: string; chapterUrl: string; releaseTime: string; chapterNumber: string | number; -} +}; diff --git a/src/plugins/chinese/69shu.ts b/plugins/chinese/69shu.ts similarity index 99% rename from src/plugins/chinese/69shu.ts rename to plugins/chinese/69shu.ts index bfe073c..f708c6d 100644 --- a/src/plugins/chinese/69shu.ts +++ b/plugins/chinese/69shu.ts @@ -1,7 +1,7 @@ import { load as parseHTML } from 'cheerio'; -import { fetchText } from '@libs/fetch'; +import { fetchText } from '@/lib/fetch'; import { FilterTypes, Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; class Shu69 implements Plugin.PluginBase { diff --git a/src/plugins/chinese/69xinshu.ts b/plugins/chinese/69xinshu.ts similarity index 98% rename from src/plugins/chinese/69xinshu.ts rename to plugins/chinese/69xinshu.ts index 5f8c800..a730c86 100644 --- a/src/plugins/chinese/69xinshu.ts +++ b/plugins/chinese/69xinshu.ts @@ -1,7 +1,7 @@ import { load as parseHTML } from 'cheerio'; -import { fetchText } from '@libs/fetch'; +import { fetchText } from '@/lib/fetch'; import { FilterTypes, Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { encode } from 'urlencode'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/chinese/Quanben.ts b/plugins/chinese/Quanben.ts similarity index 98% rename from src/plugins/chinese/Quanben.ts rename to plugins/chinese/Quanben.ts index 062cccc..fced16d 100644 --- a/src/plugins/chinese/Quanben.ts +++ b/plugins/chinese/Quanben.ts @@ -1,6 +1,6 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; -import { fetchApi, fetchFile } from '@libs/fetch'; +import { fetchApi, fetchFile } from '@/lib/fetch'; import { NovelStatus } from '@libs/novelStatus'; import { load as parseHTML } from 'cheerio'; import { defaultCover } from '@libs/defaultCover'; @@ -207,7 +207,7 @@ class QuanbenPlugin implements Plugin.PluginBase { const chapterListHtml = await chapterListResult.text(); const $ = parseHTML(chapterListHtml); - let chapters: Plugin.ChapterItem[] = []; + const chapters: Plugin.ChapterItem[] = []; // Extract standard novel name from AMP path for chapter path storage const standardNovelPathMatch = novelPath.match(/(\/n\/[^\/]+\/)/); if (!standardNovelPathMatch || !standardNovelPathMatch[1]) { @@ -385,7 +385,7 @@ class QuanbenPlugin implements Plugin.PluginBase { const novelName = nameLink.text().trim(); const novelHref = nameLink.attr('href'); - let novelCover = img.attr('src') || img.attr('data-src'); + const novelCover = img.attr('src') || img.attr('data-src'); if (novelHref && novelName) { const absoluteUrl = makeAbsolute(novelHref, this.site); diff --git a/src/plugins/chinese/ixdzs8.ts b/plugins/chinese/ixdzs8.ts similarity index 97% rename from src/plugins/chinese/ixdzs8.ts rename to plugins/chinese/ixdzs8.ts index 672a2f3..c2fa13f 100644 --- a/src/plugins/chinese/ixdzs8.ts +++ b/plugins/chinese/ixdzs8.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; -import { fetchApi, fetchFile } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { fetchApi, fetchFile } from '@/lib/fetch'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; @@ -39,7 +39,7 @@ class ixdzs8Plugin implements Plugin.PluginBase { }; async popularNovels(pageNo: number): Promise { - let url = `${this.site}hot/?page=${pageNo}`; + const url = `${this.site}hot/?page=${pageNo}`; const result = await fetchApi(url); if (!result.ok) return []; @@ -146,7 +146,7 @@ class ixdzs8Plugin implements Plugin.PluginBase { const bookId = String(bid); // POST request to fetch chapter list JSON - let url = `${this.site}novel/clist/`; + const url = `${this.site}novel/clist/`; const res = await fetch(url, { method: 'POST', headers: { diff --git a/src/plugins/chinese/linovel.ts b/plugins/chinese/linovel.ts similarity index 98% rename from src/plugins/chinese/linovel.ts rename to plugins/chinese/linovel.ts index d95bfa9..6ec96d7 100644 --- a/src/plugins/chinese/linovel.ts +++ b/plugins/chinese/linovel.ts @@ -1,5 +1,5 @@ -import { fetchText } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { fetchText } from '@/lib/fetch'; +import { Plugin } from '@/types/plugin'; import { Filters } from '@libs/filterInputs'; import { load as parseHTML } from 'cheerio'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/chinese/linovelib.ts b/plugins/chinese/linovelib.ts similarity index 99% rename from src/plugins/chinese/linovelib.ts rename to plugins/chinese/linovelib.ts index cc40a72..0f26aa9 100644 --- a/src/plugins/chinese/linovelib.ts +++ b/plugins/chinese/linovelib.ts @@ -1,7 +1,7 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; -import { fetchText } from '@libs/fetch'; +import { fetchText } from '@/lib/fetch'; import { FilterTypes, Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; class Linovelib implements Plugin.PluginBase { diff --git a/src/plugins/chinese/linovelib_tw.ts b/plugins/chinese/linovelib_tw.ts similarity index 99% rename from src/plugins/chinese/linovelib_tw.ts rename to plugins/chinese/linovelib_tw.ts index b40f2b7..5f8d0b0 100644 --- a/src/plugins/chinese/linovelib_tw.ts +++ b/plugins/chinese/linovelib_tw.ts @@ -1,7 +1,7 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; -import { fetchText } from '@libs/fetch'; +import { fetchText } from '@/lib/fetch'; import { FilterTypes, Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; class Linovelib_tw implements Plugin.PluginBase { diff --git a/src/plugins/chinese/novel543.ts b/plugins/chinese/novel543.ts similarity index 99% rename from src/plugins/chinese/novel543.ts rename to plugins/chinese/novel543.ts index 8bd5c86..cd4733a 100644 --- a/src/plugins/chinese/novel543.ts +++ b/plugins/chinese/novel543.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; -import { fetchApi, fetchFile } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { fetchApi, fetchFile } from '@/lib/fetch'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/english/NovelOnline.ts b/plugins/english/NovelOnline.ts similarity index 99% rename from src/plugins/english/NovelOnline.ts rename to plugins/english/NovelOnline.ts index e557a39..e038fec 100644 --- a/src/plugins/english/NovelOnline.ts +++ b/plugins/english/NovelOnline.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; class NovelsOnline implements Plugin.PluginBase { diff --git a/src/plugins/english/StorySeedling.ts b/plugins/english/StorySeedling.ts similarity index 99% rename from src/plugins/english/StorySeedling.ts rename to plugins/english/StorySeedling.ts index 94f9b7d..b1a904b 100644 --- a/src/plugins/english/StorySeedling.ts +++ b/plugins/english/StorySeedling.ts @@ -1,5 +1,5 @@ import { CheerioAPI, load } from 'cheerio'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; import { defaultCover } from '@libs/defaultCover'; diff --git a/src/plugins/english/ao3.ts b/plugins/english/ao3.ts similarity index 99% rename from src/plugins/english/ao3.ts rename to plugins/english/ao3.ts index 8069d16..63266d0 100644 --- a/src/plugins/english/ao3.ts +++ b/plugins/english/ao3.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; @@ -172,7 +172,7 @@ class ArchiveOfOurOwn implements Plugin.PluginBase { const releaseTime = releaseTimeText ? new Date(releaseTimeText).toISOString() : ''; - let dateCounter: number = 0; + let dateCounter = 0; if (loadedCheerio('#chapter_index select').length > 0) { loadedCheerio('#chapter_index select').each((i, selectEl) => { loadedCheerio(selectEl) diff --git a/src/plugins/english/bestlightnovel.ts b/plugins/english/bestlightnovel.ts similarity index 99% rename from src/plugins/english/bestlightnovel.ts rename to plugins/english/bestlightnovel.ts index 952303a..2eda9b9 100644 --- a/src/plugins/english/bestlightnovel.ts +++ b/plugins/english/bestlightnovel.ts @@ -1,5 +1,5 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/english/chrysanthemumgarden.ts b/plugins/english/chrysanthemumgarden.ts similarity index 96% rename from src/plugins/english/chrysanthemumgarden.ts rename to plugins/english/chrysanthemumgarden.ts index 75c017c..587c56f 100644 --- a/src/plugins/english/chrysanthemumgarden.ts +++ b/plugins/english/chrysanthemumgarden.ts @@ -1,5 +1,5 @@ -import { fetchApi, fetchProto, fetchText } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { fetchApi, fetchProto, fetchText } from '@/lib/fetch'; +import { Plugin } from '@/types/plugin'; import { Filters } from '@libs/filterInputs'; import { load as loadCheerio } from 'cheerio'; import { defaultCover } from '@libs/defaultCover'; @@ -144,13 +144,13 @@ class Chrysanthemumgarden implements Plugin.PluginBase { export default new Chrysanthemumgarden(); -interface ChrysanthemumGardenNovel { +type ChrysanthemumGardenNovel = { name: string; link: string; -} +}; -interface ChrysanthemumGardenNovelItem { +type ChrysanthemumGardenNovelItem = { name: string; path: string; cover: string; -} +}; diff --git a/src/plugins/english/divinedaolibrary.ts b/plugins/english/divinedaolibrary.ts similarity index 99% rename from src/plugins/english/divinedaolibrary.ts rename to plugins/english/divinedaolibrary.ts index d7867ef..1c6b251 100644 --- a/src/plugins/english/divinedaolibrary.ts +++ b/plugins/english/divinedaolibrary.ts @@ -1,7 +1,7 @@ import { defaultCover } from '@libs/defaultCover'; import { fetchApi } from '@libs/fetch'; import { Filters, FilterTypes, FilterValueWithType } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { load as parseHTML } from 'cheerio'; //TODO: this looks similar to fictioneer source? maybe use multisrc someday diff --git a/src/plugins/english/dreambigtl.ts b/plugins/english/dreambigtl.ts similarity index 99% rename from src/plugins/english/dreambigtl.ts rename to plugins/english/dreambigtl.ts index dd86fae..3f0661e 100644 --- a/src/plugins/english/dreambigtl.ts +++ b/plugins/english/dreambigtl.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; class DreamBigTL implements Plugin.PluginBase { id = 'dreambigtl'; diff --git a/src/plugins/english/earlynovel.ts b/plugins/english/earlynovel.ts similarity index 99% rename from src/plugins/english/earlynovel.ts rename to plugins/english/earlynovel.ts index c3be3e0..4600067 100644 --- a/src/plugins/english/earlynovel.ts +++ b/plugins/english/earlynovel.ts @@ -1,7 +1,7 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; import { FilterTypes, Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; class EarlyNovelPlugin implements Plugin.PagePlugin { id = 'earlynovel'; diff --git a/src/plugins/english/faqwikius.ts b/plugins/english/faqwikius.ts similarity index 99% rename from src/plugins/english/faqwikius.ts rename to plugins/english/faqwikius.ts index 0764dd3..da88315 100644 --- a/src/plugins/english/faqwikius.ts +++ b/plugins/english/faqwikius.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { fetchApi } from '@libs/fetch'; import { CheerioAPI, load as parseHTML } from 'cheerio'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/english/fenrirrealm.ts b/plugins/english/fenrirrealm.ts similarity index 98% rename from src/plugins/english/fenrirrealm.ts rename to plugins/english/fenrirrealm.ts index df68fe5..674fcdf 100644 --- a/src/plugins/english/fenrirrealm.ts +++ b/plugins/english/fenrirrealm.ts @@ -1,8 +1,8 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { load as loadCheerio } from 'cheerio'; import { Filters, FilterTypes } from '@libs/filterInputs'; -import { storage } from '@libs/storage'; +import { storage } from '@/lib/storage'; import { defaultCover } from '@libs/defaultCover'; class FenrirRealmPlugin implements Plugin.PluginBase { diff --git a/src/plugins/english/fictionzone.ts b/plugins/english/fictionzone.ts similarity index 96% rename from src/plugins/english/fictionzone.ts rename to plugins/english/fictionzone.ts index 572df30..30290df 100644 --- a/src/plugins/english/fictionzone.ts +++ b/plugins/english/fictionzone.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters } from '@libs/filterInputs'; import { load as loadCheerio } from 'cheerio'; import { NovelStatus } from '@libs/novelStatus'; @@ -17,7 +17,7 @@ class FictionZonePlugin implements Plugin.PagePlugin { //flag indicates whether access to LocalStorage, SesesionStorage is required. webStorageUtilized?: boolean; - cachedNovelIds: Map = new Map(); + cachedNovelIds = new Map(); async popularNovels( pageNo: number, @@ -79,10 +79,10 @@ class FictionZonePlugin implements Plugin.PagePlugin { if (status === 'Ongoing') novel.status = NovelStatus.Ongoing; novel.summary = loadedCheerio('#synopsis > div.content').text(); - let nuxtData = loadedCheerio('script#__NUXT_DATA__').html(); - let parsed = JSON.parse(nuxtData!); + const nuxtData = loadedCheerio('script#__NUXT_DATA__').html(); + const parsed = JSON.parse(nuxtData!); let last = null; - for (let a of parsed) { + for (const a of parsed) { if (typeof a === 'string' && a.startsWith('novel_covers/')) break; last = a; } diff --git a/src/plugins/english/foxteller.ts b/plugins/english/foxteller.ts similarity index 99% rename from src/plugins/english/foxteller.ts rename to plugins/english/foxteller.ts index 907d5a7..81fa120 100644 --- a/src/plugins/english/foxteller.ts +++ b/plugins/english/foxteller.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Parser } from 'htmlparser2'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; diff --git a/src/plugins/english/genesis.ts b/plugins/english/genesis.ts similarity index 99% rename from src/plugins/english/genesis.ts rename to plugins/english/genesis.ts index 0c7ae98..28dfc60 100644 --- a/src/plugins/english/genesis.ts +++ b/plugins/english/genesis.ts @@ -1,6 +1,6 @@ import { fetchApi } from '@libs/fetch'; import { Filters, FilterTypes } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; /** * Example for novel API: diff --git a/src/plugins/english/inkitt.ts b/plugins/english/inkitt.ts similarity index 96% rename from src/plugins/english/inkitt.ts rename to plugins/english/inkitt.ts index 10d0265..e3019d5 100644 --- a/src/plugins/english/inkitt.ts +++ b/plugins/english/inkitt.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { load as loadCheerio } from 'cheerio'; import { NovelStatus } from '@libs/novelStatus'; @@ -57,9 +57,9 @@ class InkittPlugin implements Plugin.PluginBase { } async parseNovel(novelPath: string): Promise { - let req = await fetchApi(this.site + `/stories/${novelPath}`); - let text = await req.text(); - let loadedCheerio = loadCheerio(text); + const req = await fetchApi(this.site + `/stories/${novelPath}`); + const text = await req.text(); + const loadedCheerio = loadCheerio(text); const novel: Plugin.SourceNovel = { path: novelPath, diff --git a/src/plugins/english/kdtnovels.ts b/plugins/english/kdtnovels.ts similarity index 99% rename from src/plugins/english/kdtnovels.ts rename to plugins/english/kdtnovels.ts index d4b328e..cbd340f 100644 --- a/src/plugins/english/kdtnovels.ts +++ b/plugins/english/kdtnovels.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/english/lightnovelpub.ts b/plugins/english/lightnovelpub.ts similarity index 99% rename from src/plugins/english/lightnovelpub.ts rename to plugins/english/lightnovelpub.ts index e77fd3c..e2eacc9 100644 --- a/src/plugins/english/lightnovelpub.ts +++ b/plugins/english/lightnovelpub.ts @@ -1,6 +1,6 @@ import { Parser } from 'htmlparser2'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import dayjs from 'dayjs'; diff --git a/src/plugins/english/lightnoveltranslation.ts b/plugins/english/lightnoveltranslation.ts similarity index 92% rename from src/plugins/english/lightnoveltranslation.ts rename to plugins/english/lightnoveltranslation.ts index d9db992..b9debfa 100644 --- a/src/plugins/english/lightnoveltranslation.ts +++ b/plugins/english/lightnoveltranslation.ts @@ -1,11 +1,11 @@ -import { fetchApi, fetchProto, fetchText } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { fetchApi, fetchProto, fetchText } from '@/lib/fetch'; +import { Plugin } from '@/types/plugin'; import { Filters } from '@libs/filterInputs'; import { load as loadCheerio } from 'cheerio'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; // import { isUrlAbsolute } from '@libs/isAbsoluteUrl'; -// import { storage, localStorage, sessionStorage } from '@libs/storage'; +// import { storage, localStorage, sessionStorage } from '@/lib/storage'; // import { encode, decode } from 'urlencode'; // import dayjs from 'dayjs'; import { Parser } from 'htmlparser2'; @@ -41,8 +41,8 @@ class LNTPlugin implements Plugin.PluginBase { const baseUrl = this.site; const novels: Plugin.NovelItem[] = []; loadedCheerio('div.read_list-story-item').each((i, el) => { - let tempNovel = {} as Plugin.NovelItem; - let img = loadedCheerio(el) + const tempNovel = {} as Plugin.NovelItem; + const img = loadedCheerio(el) .find('.item_thumb') .find('img') .first() @@ -53,7 +53,7 @@ class LNTPlugin implements Plugin.PluginBase { .first() .attr('href'); path = path ? path.slice(baseUrl.length) : ''; - let title = loadedCheerio(el) + const title = loadedCheerio(el) .find('.item_thumb') .find('a') .first() @@ -67,7 +67,7 @@ class LNTPlugin implements Plugin.PluginBase { return novels; } async parseNovel(novelPath: string): Promise { - let url = this.site + novelPath; + const url = this.site + novelPath; const body = await fetchApi(url); const html = await body.text().then(r => r.replace(/>\s+<')); @@ -161,7 +161,7 @@ class LNTPlugin implements Plugin.PluginBase { const formData = new FormData(); formData.append('field-search', searchTerm); - let results = await fetchApi(searchUrl, { + const results = await fetchApi(searchUrl, { method: 'POST', body: formData, }); @@ -170,8 +170,8 @@ class LNTPlugin implements Plugin.PluginBase { const loadedCheerio = loadCheerio(body); const novels: Plugin.NovelItem[] = []; loadedCheerio('div.read_list-story-item').each((i, el) => { - let tempNovel = {} as Plugin.NovelItem; - let img = loadedCheerio(el) + const tempNovel = {} as Plugin.NovelItem; + const img = loadedCheerio(el) .find('.item_thumb') .find('img') .first() @@ -182,7 +182,7 @@ class LNTPlugin implements Plugin.PluginBase { .first() .attr('href'); path = path ? path.slice(this.site.length) : ''; - let title = loadedCheerio(el) + const title = loadedCheerio(el) .find('.item_thumb') .find('a') .first() diff --git a/src/plugins/english/lnmtl.ts b/plugins/english/lnmtl.ts similarity index 99% rename from src/plugins/english/lnmtl.ts rename to plugins/english/lnmtl.ts index 752d7b3..7798947 100644 --- a/src/plugins/english/lnmtl.ts +++ b/plugins/english/lnmtl.ts @@ -1,7 +1,7 @@ import { Parser } from 'htmlparser2'; import { fetchApi } from '@libs/fetch'; import { FilterTypes, Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; class LnMTLPlugin implements Plugin.PagePlugin { id = 'lnmtl'; diff --git a/src/plugins/english/mtlreader.ts b/plugins/english/mtlreader.ts similarity index 98% rename from src/plugins/english/mtlreader.ts rename to plugins/english/mtlreader.ts index 3b96939..e24a045 100644 --- a/src/plugins/english/mtlreader.ts +++ b/plugins/english/mtlreader.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; class MTLReader implements Plugin.PluginBase { id = 'mtlreader'; diff --git a/src/plugins/english/mvlempyr.ts b/plugins/english/mvlempyr.ts similarity index 99% rename from src/plugins/english/mvlempyr.ts rename to plugins/english/mvlempyr.ts index 2d07ac2..eb8fe8b 100644 --- a/src/plugins/english/mvlempyr.ts +++ b/plugins/english/mvlempyr.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { Parser } from 'htmlparser2'; @@ -87,7 +87,7 @@ class MVLEMPYRPlugin implements Plugin.PluginBase { } convertNovelId(e: bigint) { - let t = 1999999997n; + const t = 1999999997n; let u = 1n, c = 7n % t, d = e; diff --git a/src/plugins/english/novelbuddy.ts b/plugins/english/novelbuddy.ts similarity index 99% rename from src/plugins/english/novelbuddy.ts rename to plugins/english/novelbuddy.ts index 4e3374a..9796714 100644 --- a/src/plugins/english/novelbuddy.ts +++ b/plugins/english/novelbuddy.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; class NovelBuddy implements Plugin.PluginBase { diff --git a/src/plugins/english/novelfire.ts b/plugins/english/novelfire.ts similarity index 99% rename from src/plugins/english/novelfire.ts rename to plugins/english/novelfire.ts index 45c93ac..b297ff8 100644 --- a/src/plugins/english/novelfire.ts +++ b/plugins/english/novelfire.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { Filters, FilterTypes } from '@libs/filterInputs'; diff --git a/src/plugins/english/novelhall.ts b/plugins/english/novelhall.ts similarity index 98% rename from src/plugins/english/novelhall.ts rename to plugins/english/novelhall.ts index be286a3..155d767 100644 --- a/src/plugins/english/novelhall.ts +++ b/plugins/english/novelhall.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; class NovelHall implements Plugin.PluginBase { diff --git a/src/plugins/english/novelight.ts b/plugins/english/novelight.ts similarity index 98% rename from src/plugins/english/novelight.ts rename to plugins/english/novelight.ts index 3095ac9..707656b 100644 --- a/src/plugins/english/novelight.ts +++ b/plugins/english/novelight.ts @@ -1,9 +1,9 @@ import { load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import dayjs from 'dayjs'; -import { storage } from '@libs/storage'; +import { storage } from '@/lib/storage'; import { NovelStatus } from '@libs/novelStatus'; class Novelight implements Plugin.PagePlugin { diff --git a/src/plugins/english/novelupdates.ts b/plugins/english/novelupdates.ts similarity index 99% rename from src/plugins/english/novelupdates.ts rename to plugins/english/novelupdates.ts index e59d803..60ba55a 100644 --- a/src/plugins/english/novelupdates.ts +++ b/plugins/english/novelupdates.ts @@ -1,7 +1,7 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; import { Filters, FilterTypes } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; class NovelUpdates implements Plugin.PluginBase { id = 'novelupdates'; @@ -273,7 +273,7 @@ class NovelUpdates implements Plugin.PluginBase { ); } - let chapterTitle = pageData.props.chapter.title; + const chapterTitle = pageData.props.chapter.title; let chapterContent = pageData.props.chapter.content; // Clean up content (remove inline styles/scripts if needed) diff --git a/src/plugins/english/pawread.ts b/plugins/english/pawread.ts similarity index 99% rename from src/plugins/english/pawread.ts rename to plugins/english/pawread.ts index 18d9bdd..cde78be 100644 --- a/src/plugins/english/pawread.ts +++ b/plugins/english/pawread.ts @@ -1,6 +1,6 @@ import { Parser } from 'htmlparser2'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; class PawRead implements Plugin.PluginBase { diff --git a/src/plugins/english/rainofsnow.ts b/plugins/english/rainofsnow.ts similarity index 99% rename from src/plugins/english/rainofsnow.ts rename to plugins/english/rainofsnow.ts index 67bcff7..255c7a7 100644 --- a/src/plugins/english/rainofsnow.ts +++ b/plugins/english/rainofsnow.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { CheerioAPI, load as parseHTML } from 'cheerio'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/english/readfrom.ts b/plugins/english/readfrom.ts similarity index 90% rename from src/plugins/english/readfrom.ts rename to plugins/english/readfrom.ts index 8a1ee99..e20d367 100644 --- a/src/plugins/english/readfrom.ts +++ b/plugins/english/readfrom.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters } from '@libs/filterInputs'; import { CheerioAPI, load as loadCheerio } from 'cheerio'; import { defaultCover } from '@libs/defaultCover'; @@ -30,11 +30,11 @@ class ReadFromPlugin implements Plugin.PluginBase { genres: string; author: string; })[] { - let ret = loadedCheerio( + const ret = loadedCheerio( (isSearch ? 'div.text' : '#dle-content') + ' > article.box', ) .map((i, el) => { - let summary = loadedCheerio(el).find( + const summary = loadedCheerio(el).find( isSearch ? 'div.text5' : 'div.text3', )[0]; loadedCheerio(summary).find('.coll-ellipsis').remove(); @@ -83,18 +83,18 @@ class ReadFromPlugin implements Plugin.PluginBase { filters, }: Plugin.PopularNovelsOptions, ) { - let type = showLatestNovels ? 'last_added_books' : 'allbooks'; - let res = await fetchApi( + const type = showLatestNovels ? 'last_added_books' : 'allbooks'; + const res = await fetchApi( 'https://readfrom.net/' + type + '/page/' + pageNo + '/', ); - let text = await res.text(); + const text = await res.text(); return this.parseNovels(loadCheerio(text)); } async parseNovel(novelPath: string): Promise { - let data = await fetchApi('https://readfrom.net/' + novelPath); - let text = await data.text(); - let loadedCheerio = loadCheerio(text); + const data = await fetchApi('https://readfrom.net/' + novelPath); + const text = await data.text(); + const loadedCheerio = loadCheerio(text); const novel: Plugin.SourceNovel = { path: novelPath, @@ -142,12 +142,12 @@ class ReadFromPlugin implements Plugin.PluginBase { novel.author = moreNovelInfo.author; } - let seriesElm = loadedCheerio('center > b:has(a)').filter((i, el) => + const seriesElm = loadedCheerio('center > b:has(a)').filter((i, el) => loadedCheerio(el).find('a').attr('href')!.startsWith('/series.html'), )[0]; if (seriesElm) { - let seriesText = loadedCheerio(seriesElm).text().trim(); + const seriesText = loadedCheerio(seriesElm).text().trim(); novel.summary = seriesText + '\n\n' + novel.summary; } @@ -198,11 +198,11 @@ class ReadFromPlugin implements Plugin.PluginBase { async searchNovels(searchTerm: string, pageNo: number) { if (pageNo !== 1) return []; - let res = await fetchApi( + const res = await fetchApi( 'https://readfrom.net/build_in_search/?q=' + encodeURIComponent(searchTerm), ); - let text = await res.text(); + const text = await res.text(); return this.parseNovels(loadCheerio(text), true); } diff --git a/src/plugins/english/readlitenovel.ts b/plugins/english/readlitenovel.ts similarity index 99% rename from src/plugins/english/readlitenovel.ts rename to plugins/english/readlitenovel.ts index ec3a2dc..546d03d 100644 --- a/src/plugins/english/readlitenovel.ts +++ b/plugins/english/readlitenovel.ts @@ -1,7 +1,7 @@ import { load as parseHTML } from 'cheerio'; import { isUrlAbsolute } from '@libs/isAbsoluteUrl'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import dayjs from 'dayjs'; diff --git a/src/plugins/english/reaperscans.ts b/plugins/english/reaperscans.ts similarity index 97% rename from src/plugins/english/reaperscans.ts rename to plugins/english/reaperscans.ts index 158f3b4..c7a6ae2 100644 --- a/src/plugins/english/reaperscans.ts +++ b/plugins/english/reaperscans.ts @@ -1,10 +1,10 @@ import { fetchApi } from '@libs/fetch'; -import type { Plugin } from '@typings/plugin'; +import type { Plugin } from '@/types/plugin'; const API_BASE = 'https://api.reaperscans.com'; const MEDIA_BASE = 'https://media.reaperscans.com/file/4SRBHm/'; -interface ApiResponse { +type ApiResponse = { data: T; meta: { total: number; @@ -12,13 +12,13 @@ interface ApiResponse { current_page: number; last_page: number; }; -} +}; -interface ReaperNovel { +type ReaperNovel = { title: string; thumbnail: string; series_slug: string; -} +}; class ReaperScans implements Plugin.PluginBase { id = 'reaperscans.com'; diff --git a/src/plugins/english/relibrary.ts b/plugins/english/relibrary.ts similarity index 99% rename from src/plugins/english/relibrary.ts rename to plugins/english/relibrary.ts index 0f67558..0f0685c 100644 --- a/src/plugins/english/relibrary.ts +++ b/plugins/english/relibrary.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters } from '@libs/filterInputs'; import { load as loadCheerio } from 'cheerio'; import { defaultCover } from '@libs/defaultCover'; @@ -290,7 +290,7 @@ class ReLibraryPlugin implements Plugin.PluginBase { .startsWith('status') ) { loadedCheerio(el).find('strong').remove(); - let status = loadedCheerio(el).text().toLowerCase().trim(); + const status = loadedCheerio(el).text().toLowerCase().trim(); if (status.includes('on-going')) { novel.status = NovelStatus.Ongoing; } else if (status.includes('completed')) { diff --git a/src/plugins/english/royalroad.ts b/plugins/english/royalroad.ts similarity index 99% rename from src/plugins/english/royalroad.ts rename to plugins/english/royalroad.ts index a2fff0f..caeb806 100644 --- a/src/plugins/english/royalroad.ts +++ b/plugins/english/royalroad.ts @@ -1,6 +1,6 @@ import { Parser } from 'htmlparser2'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { NovelStatus } from '@libs/novelStatus'; import { isUrlAbsolute } from '@libs/isAbsoluteUrl'; diff --git a/src/plugins/english/scribblehub.ts b/plugins/english/scribblehub.ts similarity index 99% rename from src/plugins/english/scribblehub.ts rename to plugins/english/scribblehub.ts index d62e3c7..6f9d6b5 100644 --- a/src/plugins/english/scribblehub.ts +++ b/plugins/english/scribblehub.ts @@ -1,7 +1,7 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; import { FilterTypes, Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import dayjs from 'dayjs'; class ScribbleHubPlugin implements Plugin.PluginBase { diff --git a/src/plugins/english/vynovel.ts b/plugins/english/vynovel.ts similarity index 99% rename from src/plugins/english/vynovel.ts rename to plugins/english/vynovel.ts index 7ff8726..be88ca4 100644 --- a/src/plugins/english/vynovel.ts +++ b/plugins/english/vynovel.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; import { fetchApi } from '@libs/fetch'; diff --git a/src/plugins/english/webnovel.ts b/plugins/english/webnovel.ts similarity index 97% rename from src/plugins/english/webnovel.ts rename to plugins/english/webnovel.ts index aac4257..40efc78 100644 --- a/src/plugins/english/webnovel.ts +++ b/plugins/english/webnovel.ts @@ -1,8 +1,8 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; import { Filters, FilterTypes } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; -import { storage } from '@libs/storage'; +import { Plugin } from '@/types/plugin'; +import { storage } from '@/lib/storage'; class Webnovel implements Plugin.PluginBase { id = 'webnovel'; @@ -138,9 +138,9 @@ class Webnovel implements Plugin.PluginBase { const chapters: Plugin.ChapterItem[] = []; loadedCheerio('.volume-item').each((i_v_, ele_v) => { - let originalVolumeName = loadedCheerio(ele_v).first().text().trim(); - let volumeNameMatch = originalVolumeName.match(/Volume\s(\d+)/); - let volumeName = volumeNameMatch + const originalVolumeName = loadedCheerio(ele_v).first().text().trim(); + const volumeNameMatch = originalVolumeName.match(/Volume\s(\d+)/); + const volumeName = volumeNameMatch ? `Volume ${volumeNameMatch[1]}` : 'Unknown Volume'; diff --git a/src/plugins/english/wtrlab.ts b/plugins/english/wtrlab.ts similarity index 99% rename from src/plugins/english/wtrlab.ts rename to plugins/english/wtrlab.ts index eb6801a..84f4ce9 100644 --- a/src/plugins/english/wtrlab.ts +++ b/plugins/english/wtrlab.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { fetchApi } from '@libs/fetch'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { load as parseHTML } from 'cheerio'; diff --git a/src/plugins/english/wuxiaworld.ts b/plugins/english/wuxiaworld.ts similarity index 99% rename from src/plugins/english/wuxiaworld.ts rename to plugins/english/wuxiaworld.ts index 8d9af80..88840f6 100644 --- a/src/plugins/english/wuxiaworld.ts +++ b/plugins/english/wuxiaworld.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; -import { fetchApi, fetchProto } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { fetchApi, fetchProto } from '@/lib/fetch'; +import { Plugin } from '@/types/plugin'; import { Filters } from '@libs/filterInputs'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/french/chireads.ts b/plugins/french/chireads.ts similarity index 99% rename from src/plugins/french/chireads.ts rename to plugins/french/chireads.ts index 57c3e65..1d08fea 100644 --- a/src/plugins/french/chireads.ts +++ b/plugins/french/chireads.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import dayjs from 'dayjs'; import { defaultCover } from '@libs/defaultCover'; diff --git a/src/plugins/french/harkeneliwood.ts b/plugins/french/harkeneliwood.ts similarity index 99% rename from src/plugins/french/harkeneliwood.ts rename to plugins/french/harkeneliwood.ts index 280178b..6631e3a 100644 --- a/src/plugins/french/harkeneliwood.ts +++ b/plugins/french/harkeneliwood.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; import dayjs from 'dayjs'; diff --git a/src/plugins/french/kisswood.ts b/plugins/french/kisswood.ts similarity index 99% rename from src/plugins/french/kisswood.ts rename to plugins/french/kisswood.ts index 27f6837..7d18c2a 100644 --- a/src/plugins/french/kisswood.ts +++ b/plugins/french/kisswood.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/french/noveldeglace.ts b/plugins/french/noveldeglace.ts similarity index 99% rename from src/plugins/french/noveldeglace.ts rename to plugins/french/noveldeglace.ts index 7d5ead6..05806e9 100644 --- a/src/plugins/french/noveldeglace.ts +++ b/plugins/french/noveldeglace.ts @@ -1,6 +1,6 @@ import { load, CheerioAPI } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; diff --git a/src/plugins/french/novhell.ts b/plugins/french/novhell.ts similarity index 99% rename from src/plugins/french/novhell.ts rename to plugins/french/novhell.ts index 3f77eaf..2253c74 100644 --- a/src/plugins/french/novhell.ts +++ b/plugins/french/novhell.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/french/phenixscans.ts b/plugins/french/phenixscans.ts similarity index 99% rename from src/plugins/french/phenixscans.ts rename to plugins/french/phenixscans.ts index 75a1a75..ebb7421 100644 --- a/src/plugins/french/phenixscans.ts +++ b/plugins/french/phenixscans.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/french/warriorlegendtrad.ts b/plugins/french/warriorlegendtrad.ts similarity index 99% rename from src/plugins/french/warriorlegendtrad.ts rename to plugins/french/warriorlegendtrad.ts index eaa4dd1..b411b42 100644 --- a/src/plugins/french/warriorlegendtrad.ts +++ b/plugins/french/warriorlegendtrad.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; import dayjs from 'dayjs'; diff --git a/src/plugins/french/wuxialnscantrad.ts b/plugins/french/wuxialnscantrad.ts similarity index 99% rename from src/plugins/french/wuxialnscantrad.ts rename to plugins/french/wuxialnscantrad.ts index 8a4fe6b..5789ec2 100644 --- a/src/plugins/french/wuxialnscantrad.ts +++ b/plugins/french/wuxialnscantrad.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; import dayjs from 'dayjs'; diff --git a/src/plugins/french/xiaowaz.ts b/plugins/french/xiaowaz.ts similarity index 99% rename from src/plugins/french/xiaowaz.ts rename to plugins/french/xiaowaz.ts index 56a7b80..9c3a0fb 100644 --- a/src/plugins/french/xiaowaz.ts +++ b/plugins/french/xiaowaz.ts @@ -1,6 +1,6 @@ import { Cheerio, CheerioAPI, load, Element } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/plugins/index.ts b/plugins/index.ts new file mode 100644 index 0000000..46d924e --- /dev/null +++ b/plugins/index.ts @@ -0,0 +1,497 @@ +import { Plugin } from '@/types/plugin'; +import p_0 from '@plugins/arabic/ArNovel[madara]'; +import p_1 from '@plugins/arabic/Azora[madara]'; +import p_2 from '@plugins/arabic/HizoManga[madara]'; +import p_3 from '@plugins/arabic/KolNovel[lightnovelwp]'; +import p_4 from '@plugins/arabic/Novel4Up[madara]'; +import p_5 from '@plugins/arabic/NovelsParadise[lightnovelwp]'; +import p_6 from '@plugins/arabic/Olaoecyou[madara]'; +import p_7 from '@plugins/arabic/Riwyat[madara]'; +import p_8 from '@plugins/arabic/dilartube'; +import p_9 from '@plugins/arabic/rewayatclub'; +import p_10 from '@plugins/arabic/sunovels'; +import p_11 from '@plugins/chinese/69shu'; +import p_12 from '@plugins/chinese/69xinshu'; +import p_13 from '@plugins/chinese/Quanben'; +import p_14 from '@plugins/chinese/ixdzs8'; +import p_15 from '@plugins/chinese/linovel'; +import p_16 from '@plugins/chinese/linovelib'; +import p_17 from '@plugins/chinese/linovelib_tw'; +import p_18 from '@plugins/chinese/novel543'; +import p_19 from '@plugins/english/AllNovelFull[readnovelfull]'; +import p_20 from '@plugins/english/AllNovel[readnovelfull]'; +import p_21 from '@plugins/english/ArcaneTranslations[lightnovelwp]'; +import p_22 from '@plugins/english/BelleReservoir[madara]'; +import p_23 from '@plugins/english/BoxNovel[readnovelfull]'; +import p_24 from '@plugins/english/CPUnovel[lightnovelwp]'; +import p_25 from '@plugins/english/CitrusAurora[madara]'; +import p_26 from '@plugins/english/CoralBoutique[madara]'; +import p_27 from '@plugins/english/DaoNovel[madara]'; +import p_28 from '@plugins/english/DaoTranslate[lightnovelwp]'; +import p_29 from '@plugins/english/DaoistQuest[fictioneer]'; +import p_30 from '@plugins/english/DearestRosalie[fictioneer]'; +import p_31 from '@plugins/english/DragonTea[madara]'; +import p_32 from '@plugins/english/Dragonholic[madara]'; +import p_33 from '@plugins/english/DuskBlossoms[madara]'; +import p_34 from '@plugins/english/ElloTL[lightnovelwp]'; +import p_35 from '@plugins/english/Eternalune[madara]'; +import p_36 from '@plugins/english/EtudeTranslations[madara]'; +import p_37 from '@plugins/english/FanNovel[readwn]'; +import p_38 from '@plugins/english/FansMTL[readwn]'; +import p_39 from '@plugins/english/FansTranslations[madara]'; +import p_40 from '@plugins/english/FirstKissNovel[madara]'; +import p_41 from '@plugins/english/Foxaholic[madara]'; +import p_42 from '@plugins/english/FreeWebNovel[readnovelfull]'; +import p_43 from '@plugins/english/GalaxyTranslations[madara]'; +import p_44 from '@plugins/english/Guavaread[madara]'; +import p_45 from '@plugins/english/HiraethTranslation[madara]'; +import p_46 from '@plugins/english/HotNovelPub[hotnovelpub]'; +import p_47 from '@plugins/english/Ippotranslations[lightnovelwp]'; +import p_48 from '@plugins/english/KeopiTranslations[lightnovelwp]'; +import p_49 from '@plugins/english/KnoxT[lightnovelwp]'; +import p_50 from '@plugins/english/LazyGirlTranslations[lightnovelwp]'; +import p_51 from '@plugins/english/LibRead[readnovelfull]'; +import p_52 from '@plugins/english/LightNovelCave[lightnovelworld]'; +import p_53 from '@plugins/english/LightNovelHeaven[madara]'; +import p_54 from '@plugins/english/LightNovelPlus[readnovelfull]'; +import p_55 from '@plugins/english/LightNovelPubVip[lightnovelworld]'; +import p_56 from '@plugins/english/LightNovelUpdates[madara]'; +import p_57 from '@plugins/english/LightNovelWord[lightnovelworld]'; +import p_58 from '@plugins/english/LilyontheValley[fictioneer]'; +import p_59 from '@plugins/english/Ltnovel[readwn]'; +import p_60 from '@plugins/english/LunarLetters[madara]'; +import p_61 from '@plugins/english/MTLNovel[madara]'; +import p_62 from '@plugins/english/MTLNovel[mtlnovel]'; +import p_63 from '@plugins/english/Meownovel[madara]'; +import p_64 from '@plugins/english/MoonlightNovels[lightnovelwp]'; +import p_65 from '@plugins/english/MostNovel[madara]'; +import p_66 from '@plugins/english/MysticalSeries[madara]'; +import p_67 from '@plugins/english/NeoSekaiTranslations[madara]'; +import p_68 from '@plugins/english/NitroManga[madara]'; +import p_69 from '@plugins/english/NobleMTL[lightnovelwp]'; +import p_70 from '@plugins/english/NovelBin[readnovelfull]'; +import p_71 from '@plugins/english/NovelCool[novelcool]'; +import p_72 from '@plugins/english/NovelFull[readnovelfull]'; +import p_73 from '@plugins/english/NovelLib[fictioneer]'; +import p_74 from '@plugins/english/NovelMultiverse[madara]'; +import p_75 from '@plugins/english/NovelOnline'; +import p_76 from '@plugins/english/NovelTranslate[madara]'; +import p_77 from '@plugins/english/NovelsKnight[lightnovelwp]'; +import p_78 from '@plugins/english/PandaMachineTranslations[lightnovelwp]'; +import p_79 from '@plugins/english/PastelTales[madara]'; +import p_80 from '@plugins/english/PenguinSquad[fictioneer]'; +import p_81 from '@plugins/english/Prizma[fictioneer]'; +import p_82 from '@plugins/english/Ranobes[ranobes]'; +import p_83 from '@plugins/english/Ranovel[madara]'; +import p_84 from '@plugins/english/ReadFanfic[madara]'; +import p_85 from '@plugins/english/ReadNovelFull[readnovelfull]'; +import p_86 from '@plugins/english/RequiemTranslations[lightnovelwp]'; +import p_87 from '@plugins/english/SalmonLatte[madara]'; +import p_88 from '@plugins/english/SleepyTranslations[madara]'; +import p_89 from '@plugins/english/SonicMTL[madara]'; +import p_90 from '@plugins/english/SrankManga[madara]'; +import p_91 from '@plugins/english/StorySeedling'; +import p_92 from '@plugins/english/SweetEscape[madara]'; +import p_93 from '@plugins/english/SystemTranslation[lightnovelwp]'; +import p_94 from '@plugins/english/TranslatinOtaku[madara]'; +import p_95 from '@plugins/english/TranslationWeaver[lightnovelwp]'; +import p_96 from '@plugins/english/UniversalNovel[lightnovelwp]'; +import p_97 from '@plugins/english/VandyTranslate[lightnovelwp]'; +import p_98 from '@plugins/english/VioletLily[madara]'; +import p_99 from '@plugins/english/WebNovelLover[madara]'; +import p_100 from '@plugins/english/WebNovelPub[lightnovelworld]'; +import p_101 from '@plugins/english/WebNovelTranslation[madara]'; +import p_102 from '@plugins/english/WhiteMoonlightNovels[lightnovelwp]'; +import p_103 from '@plugins/english/WooksTeahouse[madara]'; +import p_104 from '@plugins/english/WordExcerpt[madara]'; +import p_105 from '@plugins/english/WuxiaSpace[readwn]'; +import p_106 from '@plugins/english/WuxiaV[readwn]'; +import p_107 from '@plugins/english/WuxiaWorldSite[madara]'; +import p_108 from '@plugins/english/Wuxiabox[readwn]'; +import p_109 from '@plugins/english/Wuxiafox[readwn]'; +import p_110 from '@plugins/english/ZetroTranslation[madara]'; +import p_111 from '@plugins/english/ao3'; +import p_112 from '@plugins/english/bestlightnovel'; +import p_113 from '@plugins/english/chrysanthemumgarden'; +import p_114 from '@plugins/english/divinedaolibrary'; +import p_115 from '@plugins/english/dreambigtl'; +import p_116 from '@plugins/english/earlynovel'; +import p_117 from '@plugins/english/faqwikius'; +import p_118 from '@plugins/english/fenrirrealm'; +import p_119 from '@plugins/english/fictionzone'; +import p_120 from '@plugins/english/foxteller'; +import p_121 from '@plugins/english/genesis'; +import p_122 from '@plugins/english/inkitt'; +import p_123 from '@plugins/english/kdtnovels'; +import p_124 from '@plugins/english/lightnovelpub'; +import p_125 from '@plugins/english/lightnoveltranslation'; +import p_126 from '@plugins/english/lnmtl'; +import p_127 from '@plugins/english/mtlreader'; +import p_128 from '@plugins/english/mvlempyr'; +import p_129 from '@plugins/english/novelbuddy'; +import p_130 from '@plugins/english/novelfire'; +import p_131 from '@plugins/english/novelhall'; +import p_132 from '@plugins/english/novelight'; +import p_133 from '@plugins/english/novelupdates'; +import p_134 from '@plugins/english/pawread'; +import p_135 from '@plugins/english/rainofsnow'; +import p_136 from '@plugins/english/readfrom'; +import p_137 from '@plugins/english/readlitenovel'; +import p_138 from '@plugins/english/reaperscans'; +import p_139 from '@plugins/english/relibrary'; +import p_140 from '@plugins/english/royalroad'; +import p_141 from '@plugins/english/scribblehub'; +import p_142 from '@plugins/english/vynovel'; +import p_143 from '@plugins/english/webnovel'; +import p_144 from '@plugins/english/wtrlab'; +import p_145 from '@plugins/english/wuxiaworld'; +import p_146 from '@plugins/french/LighNovelFR[lightnovelwp]'; +import p_147 from '@plugins/french/MTLNovel(FR)[mtlnovel]'; +import p_148 from '@plugins/french/MassNovel[madara]'; +import p_149 from '@plugins/french/WorldNovel[madara]'; +import p_150 from '@plugins/french/chireads'; +import p_151 from '@plugins/french/harkeneliwood'; +import p_152 from '@plugins/french/kisswood'; +import p_153 from '@plugins/french/noveldeglace'; +import p_154 from '@plugins/french/novhell'; +import p_155 from '@plugins/french/phenixscans'; +import p_156 from '@plugins/french/warriorlegendtrad'; +import p_157 from '@plugins/french/wuxialnscantrad'; +import p_158 from '@plugins/french/xiaowaz'; +import p_159 from '@plugins/indonesian/BacaLightNovel[lightnovelwp]'; +import p_160 from '@plugins/indonesian/MTLNovel(ID)[mtlnovel]'; +import p_161 from '@plugins/indonesian/MeioNovel[madara]'; +import p_162 from '@plugins/indonesian/NovelBookID[madara]'; +import p_163 from '@plugins/indonesian/Risenovel[madara]'; +import p_164 from '@plugins/indonesian/SekteNovel[lightnovelwp]'; +import p_165 from '@plugins/indonesian/WBNovel[madara]'; +import p_166 from '@plugins/indonesian/indowebnovel'; +import p_167 from '@plugins/indonesian/novelringan'; +import p_168 from '@plugins/indonesian/sakuranovel'; +import p_169 from '@plugins/japanese/Syosetu'; +import p_170 from '@plugins/japanese/kakuyomu'; +import p_171 from '@plugins/korean/Agitoon'; +import p_172 from '@plugins/korean/FortuneEternal[madara]'; +import p_173 from '@plugins/multi/komga'; +import p_174 from '@plugins/polish/novelki'; +import p_175 from '@plugins/portuguese/BetterNovels[lightnovelwp]'; +import p_176 from '@plugins/portuguese/CentralNovel[lightnovelwp]'; +import p_177 from '@plugins/portuguese/Kiniga[madara]'; +import p_178 from '@plugins/portuguese/LaNovels[hotnovelpub]'; +import p_179 from '@plugins/portuguese/LightNovelBrasil[lightnovelwp]'; +import p_180 from '@plugins/portuguese/MTLNovel(PT)[mtlnovel]'; +import p_181 from '@plugins/portuguese/blogdoamonnovels'; +import p_182 from '@plugins/portuguese/novelmania'; +import p_183 from '@plugins/portuguese/tsundoku'; +import p_184 from '@plugins/russian/Bookhamster[ifreedom]'; +import p_185 from '@plugins/russian/Erolate[rulate]'; +import p_186 from '@plugins/russian/EzNovels[hotnovelpub]'; +import p_187 from '@plugins/russian/LitSpace'; +import p_188 from '@plugins/russian/MTLNovel(RU)[mtlnovel]'; +import p_189 from '@plugins/russian/NovelCool(RU)[novelcool]'; +import p_190 from '@plugins/russian/Ranobes(RU)[ranobes]'; +import p_191 from '@plugins/russian/Rulate[rulate]'; +import p_192 from '@plugins/russian/authortoday'; +import p_193 from '@plugins/russian/bookriver'; +import p_194 from '@plugins/russian/ficbook'; +import p_195 from '@plugins/russian/jaomix'; +import p_196 from '@plugins/russian/neobook'; +import p_197 from '@plugins/russian/novelOvh'; +import p_198 from '@plugins/russian/novelTL'; +import p_199 from '@plugins/russian/ranobehub'; +import p_200 from '@plugins/russian/ranobelib'; +import p_201 from '@plugins/russian/ranoberf'; +import p_202 from '@plugins/russian/renovels'; +import p_203 from '@plugins/russian/ruvers'; +import p_204 from '@plugins/russian/topliba'; +import p_205 from '@plugins/russian/zelluloza'; +import p_206 from '@plugins/russian/СвободныйМирРанобэ[ifreedom]'; +import p_207 from '@plugins/spanish/AllNovelRead[lightnovelwp]'; +import p_208 from '@plugins/spanish/AnimesHoy12[madara]'; +import p_209 from '@plugins/spanish/LightNovelDaily[hotnovelpub]'; +import p_210 from '@plugins/spanish/MTLNovel(ES)[mtlnovel]'; +import p_211 from '@plugins/spanish/PanchoTranslations[madara]'; +import p_212 from '@plugins/spanish/TC&Sega[lightnovelwp]'; +import p_213 from '@plugins/spanish/TraduccionesAmistosas[madara]'; +import p_214 from '@plugins/spanish/hasutl'; +import p_215 from '@plugins/spanish/novelasligera'; +import p_216 from '@plugins/spanish/novelawuxia'; +import p_217 from '@plugins/spanish/oasistranslations'; +import p_218 from '@plugins/spanish/skynovels'; +import p_219 from '@plugins/spanish/tunovelaligera'; +import p_220 from '@plugins/spanish/yukitls'; +import p_221 from '@plugins/thai/NovelLucky[madara]'; +import p_222 from '@plugins/thai/NovelPDF[madara]'; +import p_223 from '@plugins/turkish/ArazNovel[madara]'; +import p_224 from '@plugins/turkish/EKTAPLAR[madara]'; +import p_225 from '@plugins/turkish/KodeksLibrary[lightnovelwp]'; +import p_226 from '@plugins/turkish/MangaTR'; +import p_227 from '@plugins/turkish/NABSCANS[madara]'; +import p_228 from '@plugins/turkish/Namevt[lightnovelwp]'; +import p_229 from '@plugins/turkish/NovelTR[lightnovelwp]'; +import p_230 from '@plugins/turkish/Noveloku[madara]'; +import p_231 from '@plugins/turkish/RagnarScans[madara]'; +import p_232 from '@plugins/turkish/ThNovels[hotnovelpub]'; +import p_233 from '@plugins/turkish/TurkceLightNovels[madara]'; +import p_234 from '@plugins/turkish/WebNovelOku[madara]'; +import p_235 from '@plugins/turkish/epiknovel'; +import p_236 from '@plugins/turkish/kakikata[madara]'; +import p_237 from '@plugins/ukrainian/bakainua'; +import p_238 from '@plugins/ukrainian/smakolykytl'; +import p_239 from '@plugins/ukrainian/uaranobeclub'; +import p_240 from '@plugins/vietnamese/LNHako'; +import p_241 from '@plugins/vietnamese/Truyenconect'; +import p_242 from '@plugins/vietnamese/lightnovelvn'; +import p_243 from '@plugins/vietnamese/nettruyen'; +import p_244 from '@plugins/vietnamese/truyenchu'; +import p_245 from '@plugins/vietnamese/truyenfull'; + +const PLUGINS: Plugin.PluginBase[] = [ + p_0, + p_1, + p_2, + p_3, + p_4, + p_5, + p_6, + p_7, + p_8, + p_9, + p_10, + p_11, + p_12, + p_13, + p_14, + p_15, + p_16, + p_17, + p_18, + p_19, + p_20, + p_21, + p_22, + p_23, + p_24, + p_25, + p_26, + p_27, + p_28, + p_29, + p_30, + p_31, + p_32, + p_33, + p_34, + p_35, + p_36, + p_37, + p_38, + p_39, + p_40, + p_41, + p_42, + p_43, + p_44, + p_45, + p_46, + p_47, + p_48, + p_49, + p_50, + p_51, + p_52, + p_53, + p_54, + p_55, + p_56, + p_57, + p_58, + p_59, + p_60, + p_61, + p_62, + p_63, + p_64, + p_65, + p_66, + p_67, + p_68, + p_69, + p_70, + p_71, + p_72, + p_73, + p_74, + p_75, + p_76, + p_77, + p_78, + p_79, + p_80, + p_81, + p_82, + p_83, + p_84, + p_85, + p_86, + p_87, + p_88, + p_89, + p_90, + p_91, + p_92, + p_93, + p_94, + p_95, + p_96, + p_97, + p_98, + p_99, + p_100, + p_101, + p_102, + p_103, + p_104, + p_105, + p_106, + p_107, + p_108, + p_109, + p_110, + p_111, + p_112, + p_113, + p_114, + p_115, + p_116, + p_117, + p_118, + p_119, + p_120, + p_121, + p_122, + p_123, + p_124, + p_125, + p_126, + p_127, + p_128, + p_129, + p_130, + p_131, + p_132, + p_133, + p_134, + p_135, + p_136, + p_137, + p_138, + p_139, + p_140, + p_141, + p_142, + p_143, + p_144, + p_145, + p_146, + p_147, + p_148, + p_149, + p_150, + p_151, + p_152, + p_153, + p_154, + p_155, + p_156, + p_157, + p_158, + p_159, + p_160, + p_161, + p_162, + p_163, + p_164, + p_165, + p_166, + p_167, + p_168, + p_169, + p_170, + p_171, + p_172, + p_173, + p_174, + p_175, + p_176, + p_177, + p_178, + p_179, + p_180, + p_181, + p_182, + p_183, + p_184, + p_185, + p_186, + p_187, + p_188, + p_189, + p_190, + p_191, + p_192, + p_193, + p_194, + p_195, + p_196, + p_197, + p_198, + p_199, + p_200, + p_201, + p_202, + p_203, + p_204, + p_205, + p_206, + p_207, + p_208, + p_209, + p_210, + p_211, + p_212, + p_213, + p_214, + p_215, + p_216, + p_217, + p_218, + p_219, + p_220, + p_221, + p_222, + p_223, + p_224, + p_225, + p_226, + p_227, + p_228, + p_229, + p_230, + p_231, + p_232, + p_233, + p_234, + p_235, + p_236, + p_237, + p_238, + p_239, + p_240, + p_241, + p_242, + p_243, + p_244, + p_245, +]; +export default PLUGINS; diff --git a/src/plugins/indonesian/indowebnovel.ts b/plugins/indonesian/indowebnovel.ts similarity index 99% rename from src/plugins/indonesian/indowebnovel.ts rename to plugins/indonesian/indowebnovel.ts index 9027cca..a524c6b 100644 --- a/src/plugins/indonesian/indowebnovel.ts +++ b/plugins/indonesian/indowebnovel.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { Filters, FilterTypes } from '@libs/filterInputs'; diff --git a/src/plugins/indonesian/novelringan.ts b/plugins/indonesian/novelringan.ts similarity index 99% rename from src/plugins/indonesian/novelringan.ts rename to plugins/indonesian/novelringan.ts index 326f0f1..5963cae 100644 --- a/src/plugins/indonesian/novelringan.ts +++ b/plugins/indonesian/novelringan.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; class NovelRingan implements Plugin.PluginBase { diff --git a/src/plugins/indonesian/sakuranovel.ts b/plugins/indonesian/sakuranovel.ts similarity index 99% rename from src/plugins/indonesian/sakuranovel.ts rename to plugins/indonesian/sakuranovel.ts index 685b756..6200861 100644 --- a/src/plugins/indonesian/sakuranovel.ts +++ b/plugins/indonesian/sakuranovel.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; class SakuraNovel implements Plugin.PluginBase { diff --git a/src/plugins/japanese/Syosetu.ts b/plugins/japanese/Syosetu.ts similarity index 98% rename from src/plugins/japanese/Syosetu.ts rename to plugins/japanese/Syosetu.ts index 3423377..d45d93d 100644 --- a/src/plugins/japanese/Syosetu.ts +++ b/plugins/japanese/Syosetu.ts @@ -1,11 +1,11 @@ import { load as loadCheerio } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { NovelStatus } from '@libs/novelStatus'; -// const novelStatus = require('@libs/novelStatus'); -// const isUrlAbsolute = require('@libs/isAbsoluteUrl'); +// const novelStatus = require('@/types/constants'); +// const isUrlAbsolute = require('@/lib/utils'); // const parseDate = require('@libs/parseDate'); class Syosetu implements Plugin.PluginBase { diff --git a/src/plugins/japanese/kakuyomu.ts b/plugins/japanese/kakuyomu.ts similarity index 98% rename from src/plugins/japanese/kakuyomu.ts rename to plugins/japanese/kakuyomu.ts index 71359dd..fee85e4 100644 --- a/src/plugins/japanese/kakuyomu.ts +++ b/plugins/japanese/kakuyomu.ts @@ -1,5 +1,5 @@ -import { fetchText } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { fetchText } from '@/lib/fetch'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { load as loadCheerio } from 'cheerio'; import { defaultCover } from '@libs/defaultCover'; diff --git a/src/plugins/korean/Agitoon.ts b/plugins/korean/Agitoon.ts similarity index 99% rename from src/plugins/korean/Agitoon.ts rename to plugins/korean/Agitoon.ts index f34bd02..df3befe 100644 --- a/src/plugins/korean/Agitoon.ts +++ b/plugins/korean/Agitoon.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { load as parseHTML } from 'cheerio'; class Agitoon implements Plugin.PluginBase { diff --git a/src/plugins/multi/komga.ts b/plugins/multi/komga.ts similarity index 95% rename from src/plugins/multi/komga.ts rename to plugins/multi/komga.ts index 943368e..c383779 100644 --- a/src/plugins/multi/komga.ts +++ b/plugins/multi/komga.ts @@ -1,9 +1,9 @@ import { fetchApi } from '@libs/fetch'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { NovelStatus } from '@libs/novelStatus'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { load as parseHTML } from 'cheerio'; -import { storage } from '@libs/storage'; +import { storage } from '@/lib/storage'; class KomgaPlugin implements Plugin.PluginBase { id = 'komga'; @@ -26,10 +26,10 @@ class KomgaPlugin implements Plugin.PluginBase { }).then(res => res.text()); } - btoa(input: string = '') { + btoa(input = '') { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - let str = input; + const str = input; let output = ''; for ( @@ -67,11 +67,11 @@ class KomgaPlugin implements Plugin.PluginBase { async getSeries(url: string): Promise { const novels: Plugin.NovelItem[] = []; - var response = await this.makeRequest(url); + const response = await this.makeRequest(url); const series = JSON.parse(response).content; - for (let s of series) { + for (const s of series) { novels.push({ name: s.name, path: 'api/v1/series/' + s.id, @@ -110,7 +110,7 @@ class KomgaPlugin implements Plugin.PluginBase { const url = this.site + novelPath; - var response = await this.makeRequest(url); + const response = await this.makeRequest(url); const series = JSON.parse(response); @@ -152,7 +152,7 @@ class KomgaPlugin implements Plugin.PluginBase { const booksData = JSON.parse(booksResponse).content; - for (let book of booksData) { + for (const book of booksData) { const bookManifestResponse = await this.makeRequest( this.site + `opds/v2/books/${book.id}/manifest`, ); @@ -162,7 +162,7 @@ class KomgaPlugin implements Plugin.PluginBase { const toc = this.flattenArray(bookManifest.toc); let i = 1; - for (let page of bookManifest.readingOrder) { + for (const page of bookManifest.readingOrder) { const tocItem = toc.find( (v: any) => v.href?.split('#')[0] === page.href, ); diff --git a/scripts/multisrc/fictioneer/generator.js b/plugins/multisrc/fictioneer/generator.js similarity index 100% rename from scripts/multisrc/fictioneer/generator.js rename to plugins/multisrc/fictioneer/generator.js diff --git a/scripts/multisrc/fictioneer/sources.json b/plugins/multisrc/fictioneer/sources.json similarity index 100% rename from scripts/multisrc/fictioneer/sources.json rename to plugins/multisrc/fictioneer/sources.json diff --git a/scripts/multisrc/fictioneer/template.ts b/plugins/multisrc/fictioneer/template.ts similarity index 98% rename from scripts/multisrc/fictioneer/template.ts rename to plugins/multisrc/fictioneer/template.ts index cdb9a0b..8ca8084 100644 --- a/scripts/multisrc/fictioneer/template.ts +++ b/plugins/multisrc/fictioneer/template.ts @@ -1,8 +1,8 @@ import { CheerioAPI, load as loadCheerio, load } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; -import { Filters } from '../../../src/libs/filterInputs'; +import { Filters } from '@libs/filterInputs'; type FictioneerOptions = { browsePage: string; diff --git a/scripts/multisrc/generate-multisrc-plugins.js b/plugins/multisrc/generate-multisrc-plugins.js similarity index 94% rename from scripts/multisrc/generate-multisrc-plugins.js rename to plugins/multisrc/generate-multisrc-plugins.js index 6d7c5c8..17cd119 100644 --- a/scripts/multisrc/generate-multisrc-plugins.js +++ b/plugins/multisrc/generate-multisrc-plugins.js @@ -24,7 +24,7 @@ const generate = async name => { console.warn(name, ': lang, filename, pluginScript are required!'); continue; } - const pluginsDir = './src/plugins'; + const pluginsDir = './plugins'; const filePath = path.join( pluginsDir, lang.toLowerCase(), @@ -39,7 +39,7 @@ const generate = async name => { } }; -const MULTISRC_DIR = './scripts/multisrc'; +const MULTISRC_DIR = './plugins/multisrc'; const run = async () => { const sources = fs diff --git a/scripts/multisrc/hotnovelpub/filter_refresh.ts b/plugins/multisrc/hotnovelpub/filter_refresh.ts similarity index 100% rename from scripts/multisrc/hotnovelpub/filter_refresh.ts rename to plugins/multisrc/hotnovelpub/filter_refresh.ts diff --git a/scripts/multisrc/hotnovelpub/generator.js b/plugins/multisrc/hotnovelpub/generator.js similarity index 100% rename from scripts/multisrc/hotnovelpub/generator.js rename to plugins/multisrc/hotnovelpub/generator.js diff --git a/scripts/multisrc/hotnovelpub/sources.json b/plugins/multisrc/hotnovelpub/sources.json similarity index 100% rename from scripts/multisrc/hotnovelpub/sources.json rename to plugins/multisrc/hotnovelpub/sources.json diff --git a/scripts/multisrc/hotnovelpub/template.ts b/plugins/multisrc/hotnovelpub/template.ts similarity index 99% rename from scripts/multisrc/hotnovelpub/template.ts rename to plugins/multisrc/hotnovelpub/template.ts index 8eee869..5fa1246 100644 --- a/scripts/multisrc/hotnovelpub/template.ts +++ b/plugins/multisrc/hotnovelpub/template.ts @@ -1,6 +1,6 @@ import { fetchApi } from '@libs/fetch'; import { Filters, FilterTypes } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; export type HotNovelPubMetadata = { diff --git a/scripts/multisrc/ifreedom/generator.js b/plugins/multisrc/ifreedom/generator.js similarity index 100% rename from scripts/multisrc/ifreedom/generator.js rename to plugins/multisrc/ifreedom/generator.js diff --git a/scripts/multisrc/ifreedom/settings.json b/plugins/multisrc/ifreedom/settings.json similarity index 100% rename from scripts/multisrc/ifreedom/settings.json rename to plugins/multisrc/ifreedom/settings.json diff --git a/scripts/multisrc/ifreedom/sources.json b/plugins/multisrc/ifreedom/sources.json similarity index 100% rename from scripts/multisrc/ifreedom/sources.json rename to plugins/multisrc/ifreedom/sources.json diff --git a/scripts/multisrc/ifreedom/template.ts b/plugins/multisrc/ifreedom/template.ts similarity index 99% rename from scripts/multisrc/ifreedom/template.ts rename to plugins/multisrc/ifreedom/template.ts index bf14015..27f7054 100644 --- a/scripts/multisrc/ifreedom/template.ts +++ b/plugins/multisrc/ifreedom/template.ts @@ -1,6 +1,6 @@ import { fetchApi } from '@libs/fetch'; import { Filters, FilterTypes } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { load as parseHTML } from 'cheerio'; import dayjs from 'dayjs'; diff --git a/scripts/multisrc/lightnovelworld/generator.js b/plugins/multisrc/lightnovelworld/generator.js similarity index 100% rename from scripts/multisrc/lightnovelworld/generator.js rename to plugins/multisrc/lightnovelworld/generator.js diff --git a/scripts/multisrc/lightnovelworld/sources.json b/plugins/multisrc/lightnovelworld/sources.json similarity index 100% rename from scripts/multisrc/lightnovelworld/sources.json rename to plugins/multisrc/lightnovelworld/sources.json diff --git a/scripts/multisrc/lightnovelworld/template.ts b/plugins/multisrc/lightnovelworld/template.ts similarity index 99% rename from scripts/multisrc/lightnovelworld/template.ts rename to plugins/multisrc/lightnovelworld/template.ts index df857d5..45c7432 100644 --- a/scripts/multisrc/lightnovelworld/template.ts +++ b/plugins/multisrc/lightnovelworld/template.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import dayjs from 'dayjs'; diff --git a/scripts/multisrc/lightnovelwp/README.md b/plugins/multisrc/lightnovelwp/README.md similarity index 97% rename from scripts/multisrc/lightnovelwp/README.md rename to plugins/multisrc/lightnovelwp/README.md index efd0ce4..f665fc4 100644 --- a/scripts/multisrc/lightnovelwp/README.md +++ b/plugins/multisrc/lightnovelwp/README.md @@ -44,6 +44,6 @@ and add it to the folder "public/static/multisrc/lightnovelwp/{sourceID}/icon.pn ### filters To add filters to a source you need to run the script "get_filters.js" \ -(`npx node scripts/multisrc/lightnovelwp/get_filters.js` +(`npx node plugins/multisrc/lightnovelwp/get_filters.js` (if you are at the root of the project) (and you have ran "npm install" before)) and follow the instructions (url is easier and faster but sometimes it doesn't work) diff --git a/scripts/multisrc/lightnovelwp/filters/TCSega.json b/plugins/multisrc/lightnovelwp/filters/TCSega.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/TCSega.json rename to plugins/multisrc/lightnovelwp/filters/TCSega.json diff --git a/scripts/multisrc/lightnovelwp/filters/allnovelread.json b/plugins/multisrc/lightnovelwp/filters/allnovelread.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/allnovelread.json rename to plugins/multisrc/lightnovelwp/filters/allnovelread.json diff --git a/scripts/multisrc/lightnovelwp/filters/arcane.json b/plugins/multisrc/lightnovelwp/filters/arcane.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/arcane.json rename to plugins/multisrc/lightnovelwp/filters/arcane.json diff --git a/scripts/multisrc/lightnovelwp/filters/bacalightnovel.json b/plugins/multisrc/lightnovelwp/filters/bacalightnovel.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/bacalightnovel.json rename to plugins/multisrc/lightnovelwp/filters/bacalightnovel.json diff --git a/scripts/multisrc/lightnovelwp/filters/centralnovel.json b/plugins/multisrc/lightnovelwp/filters/centralnovel.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/centralnovel.json rename to plugins/multisrc/lightnovelwp/filters/centralnovel.json diff --git a/scripts/multisrc/lightnovelwp/filters/cpunovel.json b/plugins/multisrc/lightnovelwp/filters/cpunovel.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/cpunovel.json rename to plugins/multisrc/lightnovelwp/filters/cpunovel.json diff --git a/scripts/multisrc/lightnovelwp/filters/daotranslate.json b/plugins/multisrc/lightnovelwp/filters/daotranslate.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/daotranslate.json rename to plugins/multisrc/lightnovelwp/filters/daotranslate.json diff --git a/scripts/multisrc/lightnovelwp/filters/ellotl.json b/plugins/multisrc/lightnovelwp/filters/ellotl.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/ellotl.json rename to plugins/multisrc/lightnovelwp/filters/ellotl.json diff --git a/scripts/multisrc/lightnovelwp/filters/ippotranslations.json b/plugins/multisrc/lightnovelwp/filters/ippotranslations.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/ippotranslations.json rename to plugins/multisrc/lightnovelwp/filters/ippotranslations.json diff --git a/scripts/multisrc/lightnovelwp/filters/keopi.json b/plugins/multisrc/lightnovelwp/filters/keopi.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/keopi.json rename to plugins/multisrc/lightnovelwp/filters/keopi.json diff --git a/scripts/multisrc/lightnovelwp/filters/keopitranslations.json b/plugins/multisrc/lightnovelwp/filters/keopitranslations.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/keopitranslations.json rename to plugins/multisrc/lightnovelwp/filters/keopitranslations.json diff --git a/scripts/multisrc/lightnovelwp/filters/knoxt.json b/plugins/multisrc/lightnovelwp/filters/knoxt.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/knoxt.json rename to plugins/multisrc/lightnovelwp/filters/knoxt.json diff --git a/scripts/multisrc/lightnovelwp/filters/kodekslibrary.json b/plugins/multisrc/lightnovelwp/filters/kodekslibrary.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/kodekslibrary.json rename to plugins/multisrc/lightnovelwp/filters/kodekslibrary.json diff --git a/scripts/multisrc/lightnovelwp/filters/kolnovel.json b/plugins/multisrc/lightnovelwp/filters/kolnovel.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/kolnovel.json rename to plugins/multisrc/lightnovelwp/filters/kolnovel.json diff --git a/scripts/multisrc/lightnovelwp/filters/lazygirltranslations.json b/plugins/multisrc/lightnovelwp/filters/lazygirltranslations.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/lazygirltranslations.json rename to plugins/multisrc/lightnovelwp/filters/lazygirltranslations.json diff --git a/scripts/multisrc/lightnovelwp/filters/lightnovelbrasil.json b/plugins/multisrc/lightnovelwp/filters/lightnovelbrasil.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/lightnovelbrasil.json rename to plugins/multisrc/lightnovelwp/filters/lightnovelbrasil.json diff --git a/scripts/multisrc/lightnovelwp/filters/lightnovelfr.json b/plugins/multisrc/lightnovelwp/filters/lightnovelfr.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/lightnovelfr.json rename to plugins/multisrc/lightnovelwp/filters/lightnovelfr.json diff --git a/scripts/multisrc/lightnovelwp/filters/moonlightnovel.json b/plugins/multisrc/lightnovelwp/filters/moonlightnovel.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/moonlightnovel.json rename to plugins/multisrc/lightnovelwp/filters/moonlightnovel.json diff --git a/scripts/multisrc/lightnovelwp/filters/namevt.json b/plugins/multisrc/lightnovelwp/filters/namevt.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/namevt.json rename to plugins/multisrc/lightnovelwp/filters/namevt.json diff --git a/scripts/multisrc/lightnovelwp/filters/noblemtl.json b/plugins/multisrc/lightnovelwp/filters/noblemtl.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/noblemtl.json rename to plugins/multisrc/lightnovelwp/filters/noblemtl.json diff --git a/scripts/multisrc/lightnovelwp/filters/novelsknight.json b/plugins/multisrc/lightnovelwp/filters/novelsknight.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/novelsknight.json rename to plugins/multisrc/lightnovelwp/filters/novelsknight.json diff --git a/scripts/multisrc/lightnovelwp/filters/novelsparadise.json b/plugins/multisrc/lightnovelwp/filters/novelsparadise.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/novelsparadise.json rename to plugins/multisrc/lightnovelwp/filters/novelsparadise.json diff --git a/scripts/multisrc/lightnovelwp/filters/noveltr.json b/plugins/multisrc/lightnovelwp/filters/noveltr.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/noveltr.json rename to plugins/multisrc/lightnovelwp/filters/noveltr.json diff --git a/scripts/multisrc/lightnovelwp/filters/pandamtl.json b/plugins/multisrc/lightnovelwp/filters/pandamtl.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/pandamtl.json rename to plugins/multisrc/lightnovelwp/filters/pandamtl.json diff --git a/scripts/multisrc/lightnovelwp/filters/requiemtls.json b/plugins/multisrc/lightnovelwp/filters/requiemtls.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/requiemtls.json rename to plugins/multisrc/lightnovelwp/filters/requiemtls.json diff --git a/scripts/multisrc/lightnovelwp/filters/sektenovel.json b/plugins/multisrc/lightnovelwp/filters/sektenovel.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/sektenovel.json rename to plugins/multisrc/lightnovelwp/filters/sektenovel.json diff --git a/scripts/multisrc/lightnovelwp/filters/systemtranslation.json b/plugins/multisrc/lightnovelwp/filters/systemtranslation.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/systemtranslation.json rename to plugins/multisrc/lightnovelwp/filters/systemtranslation.json diff --git a/scripts/multisrc/lightnovelwp/filters/transweaver.json b/plugins/multisrc/lightnovelwp/filters/transweaver.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/transweaver.json rename to plugins/multisrc/lightnovelwp/filters/transweaver.json diff --git a/scripts/multisrc/lightnovelwp/filters/universalnovel.json b/plugins/multisrc/lightnovelwp/filters/universalnovel.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/universalnovel.json rename to plugins/multisrc/lightnovelwp/filters/universalnovel.json diff --git a/scripts/multisrc/lightnovelwp/filters/vandytranslate.json b/plugins/multisrc/lightnovelwp/filters/vandytranslate.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/vandytranslate.json rename to plugins/multisrc/lightnovelwp/filters/vandytranslate.json diff --git a/scripts/multisrc/lightnovelwp/filters/whitemoonlightnovels.json b/plugins/multisrc/lightnovelwp/filters/whitemoonlightnovels.json similarity index 100% rename from scripts/multisrc/lightnovelwp/filters/whitemoonlightnovels.json rename to plugins/multisrc/lightnovelwp/filters/whitemoonlightnovels.json diff --git a/scripts/multisrc/lightnovelwp/generator.js b/plugins/multisrc/lightnovelwp/generator.js similarity index 100% rename from scripts/multisrc/lightnovelwp/generator.js rename to plugins/multisrc/lightnovelwp/generator.js diff --git a/scripts/multisrc/lightnovelwp/get_filters.js b/plugins/multisrc/lightnovelwp/get_filters.js similarity index 100% rename from scripts/multisrc/lightnovelwp/get_filters.js rename to plugins/multisrc/lightnovelwp/get_filters.js diff --git a/scripts/multisrc/lightnovelwp/sources.json b/plugins/multisrc/lightnovelwp/sources.json similarity index 100% rename from scripts/multisrc/lightnovelwp/sources.json rename to plugins/multisrc/lightnovelwp/sources.json diff --git a/scripts/multisrc/lightnovelwp/template.ts b/plugins/multisrc/lightnovelwp/template.ts similarity index 99% rename from scripts/multisrc/lightnovelwp/template.ts rename to plugins/multisrc/lightnovelwp/template.ts index 302ac84..d4b31a3 100644 --- a/scripts/multisrc/lightnovelwp/template.ts +++ b/plugins/multisrc/lightnovelwp/template.ts @@ -1,11 +1,11 @@ import { load } from 'cheerio'; import { Parser } from 'htmlparser2'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { defaultCover } from '@libs/defaultCover'; import { Filters } from '@libs/filterInputs'; -import { storage } from '@libs/storage'; +import { storage } from '@/lib/storage'; type LightNovelWPOptions = { reverseChapters?: boolean; @@ -112,7 +112,7 @@ class LightNovelWPPlugin implements Plugin.PluginBase { novelPath = novelUrl.replace(this.site, ''); } else { // TODO: report website new url to server - let novelParts = novelUrl.split('/'); + const novelParts = novelUrl.split('/'); novelParts.shift(); novelParts.shift(); novelParts.shift(); diff --git a/scripts/multisrc/madara/README.md b/plugins/multisrc/madara/README.md similarity index 97% rename from scripts/multisrc/madara/README.md rename to plugins/multisrc/madara/README.md index 809b182..ed6b230 100644 --- a/scripts/multisrc/madara/README.md +++ b/plugins/multisrc/madara/README.md @@ -39,6 +39,6 @@ and add it to the folder "public/static/multisrc/madara/{sourceID}/icon.png" ### filters To add filters to a source you need to run the script "get_filters.js" \ -(`npx node scripts/multisrc/madara/get_filters.js` +(`npx node plugins/multisrc/madara/get_filters.js` (if you are at the root of the project) (and you have ran "npm install" before)) and follow the instructions (url is easier and faster but sometimes it doesn't work) diff --git a/scripts/multisrc/madara/filters/1stkissnovel.json b/plugins/multisrc/madara/filters/1stkissnovel.json similarity index 100% rename from scripts/multisrc/madara/filters/1stkissnovel.json rename to plugins/multisrc/madara/filters/1stkissnovel.json diff --git a/scripts/multisrc/madara/filters/Kakikata.json b/plugins/multisrc/madara/filters/Kakikata.json similarity index 100% rename from scripts/multisrc/madara/filters/Kakikata.json rename to plugins/multisrc/madara/filters/Kakikata.json diff --git a/scripts/multisrc/madara/filters/LightNovelUpdates.json b/plugins/multisrc/madara/filters/LightNovelUpdates.json similarity index 100% rename from scripts/multisrc/madara/filters/LightNovelUpdates.json rename to plugins/multisrc/madara/filters/LightNovelUpdates.json diff --git a/scripts/multisrc/madara/filters/WebNovelTraslation.json b/plugins/multisrc/madara/filters/WebNovelTraslation.json similarity index 100% rename from scripts/multisrc/madara/filters/WebNovelTraslation.json rename to plugins/multisrc/madara/filters/WebNovelTraslation.json diff --git a/scripts/multisrc/madara/filters/ar-mtl.json b/plugins/multisrc/madara/filters/ar-mtl.json similarity index 100% rename from scripts/multisrc/madara/filters/ar-mtl.json rename to plugins/multisrc/madara/filters/ar-mtl.json diff --git a/scripts/multisrc/madara/filters/arnovel.json b/plugins/multisrc/madara/filters/arnovel.json similarity index 100% rename from scripts/multisrc/madara/filters/arnovel.json rename to plugins/multisrc/madara/filters/arnovel.json diff --git a/scripts/multisrc/madara/filters/asuralightnovel.json b/plugins/multisrc/madara/filters/asuralightnovel.json similarity index 100% rename from scripts/multisrc/madara/filters/asuralightnovel.json rename to plugins/multisrc/madara/filters/asuralightnovel.json diff --git a/scripts/multisrc/madara/filters/azora.json b/plugins/multisrc/madara/filters/azora.json similarity index 100% rename from scripts/multisrc/madara/filters/azora.json rename to plugins/multisrc/madara/filters/azora.json diff --git a/scripts/multisrc/madara/filters/azraznovel.json b/plugins/multisrc/madara/filters/azraznovel.json similarity index 100% rename from scripts/multisrc/madara/filters/azraznovel.json rename to plugins/multisrc/madara/filters/azraznovel.json diff --git a/scripts/multisrc/madara/filters/bellereservoir.json b/plugins/multisrc/madara/filters/bellereservoir.json similarity index 100% rename from scripts/multisrc/madara/filters/bellereservoir.json rename to plugins/multisrc/madara/filters/bellereservoir.json diff --git a/scripts/multisrc/madara/filters/citrusaurora.json b/plugins/multisrc/madara/filters/citrusaurora.json similarity index 100% rename from scripts/multisrc/madara/filters/citrusaurora.json rename to plugins/multisrc/madara/filters/citrusaurora.json diff --git a/scripts/multisrc/madara/filters/coralboutique.json b/plugins/multisrc/madara/filters/coralboutique.json similarity index 100% rename from scripts/multisrc/madara/filters/coralboutique.json rename to plugins/multisrc/madara/filters/coralboutique.json diff --git a/scripts/multisrc/madara/filters/daonovel.json b/plugins/multisrc/madara/filters/daonovel.json similarity index 100% rename from scripts/multisrc/madara/filters/daonovel.json rename to plugins/multisrc/madara/filters/daonovel.json diff --git a/scripts/multisrc/madara/filters/dragonholic.json b/plugins/multisrc/madara/filters/dragonholic.json similarity index 100% rename from scripts/multisrc/madara/filters/dragonholic.json rename to plugins/multisrc/madara/filters/dragonholic.json diff --git a/scripts/multisrc/madara/filters/dragontea.json b/plugins/multisrc/madara/filters/dragontea.json similarity index 100% rename from scripts/multisrc/madara/filters/dragontea.json rename to plugins/multisrc/madara/filters/dragontea.json diff --git a/scripts/multisrc/madara/filters/duskblossoms.json b/plugins/multisrc/madara/filters/duskblossoms.json similarity index 100% rename from scripts/multisrc/madara/filters/duskblossoms.json rename to plugins/multisrc/madara/filters/duskblossoms.json diff --git a/scripts/multisrc/madara/filters/e-novel.json b/plugins/multisrc/madara/filters/e-novel.json similarity index 100% rename from scripts/multisrc/madara/filters/e-novel.json rename to plugins/multisrc/madara/filters/e-novel.json diff --git a/scripts/multisrc/madara/filters/ekitaplar.json b/plugins/multisrc/madara/filters/ekitaplar.json similarity index 100% rename from scripts/multisrc/madara/filters/ekitaplar.json rename to plugins/multisrc/madara/filters/ekitaplar.json diff --git a/scripts/multisrc/madara/filters/eternalune.json b/plugins/multisrc/madara/filters/eternalune.json similarity index 100% rename from scripts/multisrc/madara/filters/eternalune.json rename to plugins/multisrc/madara/filters/eternalune.json diff --git a/scripts/multisrc/madara/filters/etudetranslations.json b/plugins/multisrc/madara/filters/etudetranslations.json similarity index 100% rename from scripts/multisrc/madara/filters/etudetranslations.json rename to plugins/multisrc/madara/filters/etudetranslations.json diff --git a/scripts/multisrc/madara/filters/fanTLS.json b/plugins/multisrc/madara/filters/fanTLS.json similarity index 100% rename from scripts/multisrc/madara/filters/fanTLS.json rename to plugins/multisrc/madara/filters/fanTLS.json diff --git a/scripts/multisrc/madara/filters/fanstranslations.json b/plugins/multisrc/madara/filters/fanstranslations.json similarity index 100% rename from scripts/multisrc/madara/filters/fanstranslations.json rename to plugins/multisrc/madara/filters/fanstranslations.json diff --git a/scripts/multisrc/madara/filters/fortuneeternal.json b/plugins/multisrc/madara/filters/fortuneeternal.json similarity index 100% rename from scripts/multisrc/madara/filters/fortuneeternal.json rename to plugins/multisrc/madara/filters/fortuneeternal.json diff --git a/scripts/multisrc/madara/filters/foxaholic.json b/plugins/multisrc/madara/filters/foxaholic.json similarity index 100% rename from scripts/multisrc/madara/filters/foxaholic.json rename to plugins/multisrc/madara/filters/foxaholic.json diff --git a/scripts/multisrc/madara/filters/galaxytranslations.json b/plugins/multisrc/madara/filters/galaxytranslations.json similarity index 100% rename from scripts/multisrc/madara/filters/galaxytranslations.json rename to plugins/multisrc/madara/filters/galaxytranslations.json diff --git a/scripts/multisrc/madara/filters/guavaread.json b/plugins/multisrc/madara/filters/guavaread.json similarity index 100% rename from scripts/multisrc/madara/filters/guavaread.json rename to plugins/multisrc/madara/filters/guavaread.json diff --git a/scripts/multisrc/madara/filters/hiraethtranslation.json b/plugins/multisrc/madara/filters/hiraethtranslation.json similarity index 100% rename from scripts/multisrc/madara/filters/hiraethtranslation.json rename to plugins/multisrc/madara/filters/hiraethtranslation.json diff --git a/scripts/multisrc/madara/filters/hizomanga.json b/plugins/multisrc/madara/filters/hizomanga.json similarity index 100% rename from scripts/multisrc/madara/filters/hizomanga.json rename to plugins/multisrc/madara/filters/hizomanga.json diff --git a/scripts/multisrc/madara/filters/kiniga.json b/plugins/multisrc/madara/filters/kiniga.json similarity index 100% rename from scripts/multisrc/madara/filters/kiniga.json rename to plugins/multisrc/madara/filters/kiniga.json diff --git a/scripts/multisrc/madara/filters/lnheaven.json b/plugins/multisrc/madara/filters/lnheaven.json similarity index 100% rename from scripts/multisrc/madara/filters/lnheaven.json rename to plugins/multisrc/madara/filters/lnheaven.json diff --git a/scripts/multisrc/madara/filters/lunarletters.json b/plugins/multisrc/madara/filters/lunarletters.json similarity index 100% rename from scripts/multisrc/madara/filters/lunarletters.json rename to plugins/multisrc/madara/filters/lunarletters.json diff --git a/scripts/multisrc/madara/filters/massnovel.json b/plugins/multisrc/madara/filters/massnovel.json similarity index 100% rename from scripts/multisrc/madara/filters/massnovel.json rename to plugins/multisrc/madara/filters/massnovel.json diff --git a/scripts/multisrc/madara/filters/meionovel.json b/plugins/multisrc/madara/filters/meionovel.json similarity index 100% rename from scripts/multisrc/madara/filters/meionovel.json rename to plugins/multisrc/madara/filters/meionovel.json diff --git a/scripts/multisrc/madara/filters/meownovel.json b/plugins/multisrc/madara/filters/meownovel.json similarity index 100% rename from scripts/multisrc/madara/filters/meownovel.json rename to plugins/multisrc/madara/filters/meownovel.json diff --git a/scripts/multisrc/madara/filters/morenovel.json b/plugins/multisrc/madara/filters/morenovel.json similarity index 100% rename from scripts/multisrc/madara/filters/morenovel.json rename to plugins/multisrc/madara/filters/morenovel.json diff --git a/scripts/multisrc/madara/filters/mostnovel.json b/plugins/multisrc/madara/filters/mostnovel.json similarity index 100% rename from scripts/multisrc/madara/filters/mostnovel.json rename to plugins/multisrc/madara/filters/mostnovel.json diff --git a/scripts/multisrc/madara/filters/mtl-novel.json b/plugins/multisrc/madara/filters/mtl-novel.json similarity index 100% rename from scripts/multisrc/madara/filters/mtl-novel.json rename to plugins/multisrc/madara/filters/mtl-novel.json diff --git a/scripts/multisrc/madara/filters/mtlnovel.club.json b/plugins/multisrc/madara/filters/mtlnovel.club.json similarity index 100% rename from scripts/multisrc/madara/filters/mtlnovel.club.json rename to plugins/multisrc/madara/filters/mtlnovel.club.json diff --git a/scripts/multisrc/madara/filters/mysticalmerries.json b/plugins/multisrc/madara/filters/mysticalmerries.json similarity index 100% rename from scripts/multisrc/madara/filters/mysticalmerries.json rename to plugins/multisrc/madara/filters/mysticalmerries.json diff --git a/scripts/multisrc/madara/filters/nabiscans.json b/plugins/multisrc/madara/filters/nabiscans.json similarity index 100% rename from scripts/multisrc/madara/filters/nabiscans.json rename to plugins/multisrc/madara/filters/nabiscans.json diff --git a/scripts/multisrc/madara/filters/neosekaiTLS.json b/plugins/multisrc/madara/filters/neosekaiTLS.json similarity index 100% rename from scripts/multisrc/madara/filters/neosekaiTLS.json rename to plugins/multisrc/madara/filters/neosekaiTLS.json diff --git a/scripts/multisrc/madara/filters/nitromanga.json b/plugins/multisrc/madara/filters/nitromanga.json similarity index 100% rename from scripts/multisrc/madara/filters/nitromanga.json rename to plugins/multisrc/madara/filters/nitromanga.json diff --git a/scripts/multisrc/madara/filters/novel-lucky.json b/plugins/multisrc/madara/filters/novel-lucky.json similarity index 100% rename from scripts/multisrc/madara/filters/novel-lucky.json rename to plugins/multisrc/madara/filters/novel-lucky.json diff --git a/scripts/multisrc/madara/filters/novel4up.json b/plugins/multisrc/madara/filters/novel4up.json similarity index 100% rename from scripts/multisrc/madara/filters/novel4up.json rename to plugins/multisrc/madara/filters/novel4up.json diff --git a/scripts/multisrc/madara/filters/novelTL.json b/plugins/multisrc/madara/filters/novelTL.json similarity index 100% rename from scripts/multisrc/madara/filters/novelTL.json rename to plugins/multisrc/madara/filters/novelTL.json diff --git a/scripts/multisrc/madara/filters/novelbookid.json b/plugins/multisrc/madara/filters/novelbookid.json similarity index 100% rename from scripts/multisrc/madara/filters/novelbookid.json rename to plugins/multisrc/madara/filters/novelbookid.json diff --git a/scripts/multisrc/madara/filters/novelci.json b/plugins/multisrc/madara/filters/novelci.json similarity index 100% rename from scripts/multisrc/madara/filters/novelci.json rename to plugins/multisrc/madara/filters/novelci.json diff --git a/scripts/multisrc/madara/filters/novelmultiverse.json b/plugins/multisrc/madara/filters/novelmultiverse.json similarity index 100% rename from scripts/multisrc/madara/filters/novelmultiverse.json rename to plugins/multisrc/madara/filters/novelmultiverse.json diff --git a/scripts/multisrc/madara/filters/noveloku.json b/plugins/multisrc/madara/filters/noveloku.json similarity index 100% rename from scripts/multisrc/madara/filters/noveloku.json rename to plugins/multisrc/madara/filters/noveloku.json diff --git a/scripts/multisrc/madara/filters/novelokutr.json b/plugins/multisrc/madara/filters/novelokutr.json similarity index 100% rename from scripts/multisrc/madara/filters/novelokutr.json rename to plugins/multisrc/madara/filters/novelokutr.json diff --git a/scripts/multisrc/madara/filters/novelpdf.json b/plugins/multisrc/madara/filters/novelpdf.json similarity index 100% rename from scripts/multisrc/madara/filters/novelpdf.json rename to plugins/multisrc/madara/filters/novelpdf.json diff --git a/scripts/multisrc/madara/filters/olaoe.json b/plugins/multisrc/madara/filters/olaoe.json similarity index 100% rename from scripts/multisrc/madara/filters/olaoe.json rename to plugins/multisrc/madara/filters/olaoe.json diff --git a/scripts/multisrc/madara/filters/panchotranslations.json b/plugins/multisrc/madara/filters/panchotranslations.json similarity index 100% rename from scripts/multisrc/madara/filters/panchotranslations.json rename to plugins/multisrc/madara/filters/panchotranslations.json diff --git a/scripts/multisrc/madara/filters/pasteltales.json b/plugins/multisrc/madara/filters/pasteltales.json similarity index 100% rename from scripts/multisrc/madara/filters/pasteltales.json rename to plugins/multisrc/madara/filters/pasteltales.json diff --git a/scripts/multisrc/madara/filters/ragnarscans.json b/plugins/multisrc/madara/filters/ragnarscans.json similarity index 100% rename from scripts/multisrc/madara/filters/ragnarscans.json rename to plugins/multisrc/madara/filters/ragnarscans.json diff --git a/scripts/multisrc/madara/filters/ranovel.json b/plugins/multisrc/madara/filters/ranovel.json similarity index 100% rename from scripts/multisrc/madara/filters/ranovel.json rename to plugins/multisrc/madara/filters/ranovel.json diff --git a/scripts/multisrc/madara/filters/readfanfic.json b/plugins/multisrc/madara/filters/readfanfic.json similarity index 100% rename from scripts/multisrc/madara/filters/readfanfic.json rename to plugins/multisrc/madara/filters/readfanfic.json diff --git a/scripts/multisrc/madara/filters/riwyat.json b/plugins/multisrc/madara/filters/riwyat.json similarity index 100% rename from scripts/multisrc/madara/filters/riwyat.json rename to plugins/multisrc/madara/filters/riwyat.json diff --git a/scripts/multisrc/madara/filters/salmonlatte.json b/plugins/multisrc/madara/filters/salmonlatte.json similarity index 100% rename from scripts/multisrc/madara/filters/salmonlatte.json rename to plugins/multisrc/madara/filters/salmonlatte.json diff --git a/scripts/multisrc/madara/filters/sleeptTLS.json b/plugins/multisrc/madara/filters/sleeptTLS.json similarity index 100% rename from scripts/multisrc/madara/filters/sleeptTLS.json rename to plugins/multisrc/madara/filters/sleeptTLS.json diff --git a/scripts/multisrc/madara/filters/sonicmtl.json b/plugins/multisrc/madara/filters/sonicmtl.json similarity index 100% rename from scripts/multisrc/madara/filters/sonicmtl.json rename to plugins/multisrc/madara/filters/sonicmtl.json diff --git a/scripts/multisrc/madara/filters/sweetEscapeTL.json b/plugins/multisrc/madara/filters/sweetEscapeTL.json similarity index 100% rename from scripts/multisrc/madara/filters/sweetEscapeTL.json rename to plugins/multisrc/madara/filters/sweetEscapeTL.json diff --git a/scripts/multisrc/madara/filters/sweetescape.json b/plugins/multisrc/madara/filters/sweetescape.json similarity index 100% rename from scripts/multisrc/madara/filters/sweetescape.json rename to plugins/multisrc/madara/filters/sweetescape.json diff --git a/scripts/multisrc/madara/filters/translatinotaku.json b/plugins/multisrc/madara/filters/translatinotaku.json similarity index 100% rename from scripts/multisrc/madara/filters/translatinotaku.json rename to plugins/multisrc/madara/filters/translatinotaku.json diff --git a/scripts/multisrc/madara/filters/turkcelightnovels.json b/plugins/multisrc/madara/filters/turkcelightnovels.json similarity index 100% rename from scripts/multisrc/madara/filters/turkcelightnovels.json rename to plugins/multisrc/madara/filters/turkcelightnovels.json diff --git a/scripts/multisrc/madara/filters/violetlily.json b/plugins/multisrc/madara/filters/violetlily.json similarity index 100% rename from scripts/multisrc/madara/filters/violetlily.json rename to plugins/multisrc/madara/filters/violetlily.json diff --git a/scripts/multisrc/madara/filters/wbnovel.json b/plugins/multisrc/madara/filters/wbnovel.json similarity index 100% rename from scripts/multisrc/madara/filters/wbnovel.json rename to plugins/multisrc/madara/filters/wbnovel.json diff --git a/scripts/multisrc/madara/filters/webnoveloku.json b/plugins/multisrc/madara/filters/webnoveloku.json similarity index 100% rename from scripts/multisrc/madara/filters/webnoveloku.json rename to plugins/multisrc/madara/filters/webnoveloku.json diff --git a/scripts/multisrc/madara/filters/webnovelover.json b/plugins/multisrc/madara/filters/webnovelover.json similarity index 100% rename from scripts/multisrc/madara/filters/webnovelover.json rename to plugins/multisrc/madara/filters/webnovelover.json diff --git a/scripts/multisrc/madara/filters/wooksteahouse.json b/plugins/multisrc/madara/filters/wooksteahouse.json similarity index 100% rename from scripts/multisrc/madara/filters/wooksteahouse.json rename to plugins/multisrc/madara/filters/wooksteahouse.json diff --git a/scripts/multisrc/madara/filters/wordexcerpt.json b/plugins/multisrc/madara/filters/wordexcerpt.json similarity index 100% rename from scripts/multisrc/madara/filters/wordexcerpt.json rename to plugins/multisrc/madara/filters/wordexcerpt.json diff --git a/scripts/multisrc/madara/filters/worldnovel.json b/plugins/multisrc/madara/filters/worldnovel.json similarity index 100% rename from scripts/multisrc/madara/filters/worldnovel.json rename to plugins/multisrc/madara/filters/worldnovel.json diff --git a/scripts/multisrc/madara/filters/wuxiaworld.site.json b/plugins/multisrc/madara/filters/wuxiaworld.site.json similarity index 100% rename from scripts/multisrc/madara/filters/wuxiaworld.site.json rename to plugins/multisrc/madara/filters/wuxiaworld.site.json diff --git a/scripts/multisrc/madara/filters/zetroTL.json b/plugins/multisrc/madara/filters/zetroTL.json similarity index 100% rename from scripts/multisrc/madara/filters/zetroTL.json rename to plugins/multisrc/madara/filters/zetroTL.json diff --git a/scripts/multisrc/madara/generator.js b/plugins/multisrc/madara/generator.js similarity index 100% rename from scripts/multisrc/madara/generator.js rename to plugins/multisrc/madara/generator.js diff --git a/scripts/multisrc/madara/get_filters.js b/plugins/multisrc/madara/get_filters.js similarity index 100% rename from scripts/multisrc/madara/get_filters.js rename to plugins/multisrc/madara/get_filters.js diff --git a/scripts/multisrc/madara/sources.json b/plugins/multisrc/madara/sources.json similarity index 100% rename from scripts/multisrc/madara/sources.json rename to plugins/multisrc/madara/sources.json diff --git a/scripts/multisrc/madara/template.ts b/plugins/multisrc/madara/template.ts similarity index 99% rename from scripts/multisrc/madara/template.ts rename to plugins/multisrc/madara/template.ts index 4c8752d..bb825da 100644 --- a/scripts/multisrc/madara/template.ts +++ b/plugins/multisrc/madara/template.ts @@ -1,11 +1,11 @@ import { fetchApi } from '@libs/fetch'; import { Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Cheerio, AnyNode, CheerioAPI, load as parseHTML } from 'cheerio'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; import dayjs from 'dayjs'; -import { storage } from '@libs/storage'; +import { storage } from '@/lib/storage'; const includesAny = (str: string, keywords: string[]) => new RegExp(keywords.join('|')).test(str); diff --git a/scripts/multisrc/mtlnovel/filters/mtlnovel.json b/plugins/multisrc/mtlnovel/filters/mtlnovel.json similarity index 100% rename from scripts/multisrc/mtlnovel/filters/mtlnovel.json rename to plugins/multisrc/mtlnovel/filters/mtlnovel.json diff --git a/scripts/multisrc/mtlnovel/generator.js b/plugins/multisrc/mtlnovel/generator.js similarity index 100% rename from scripts/multisrc/mtlnovel/generator.js rename to plugins/multisrc/mtlnovel/generator.js diff --git a/scripts/multisrc/mtlnovel/sources.json b/plugins/multisrc/mtlnovel/sources.json similarity index 100% rename from scripts/multisrc/mtlnovel/sources.json rename to plugins/multisrc/mtlnovel/sources.json diff --git a/scripts/multisrc/mtlnovel/template.ts b/plugins/multisrc/mtlnovel/template.ts similarity index 99% rename from scripts/multisrc/mtlnovel/template.ts rename to plugins/multisrc/mtlnovel/template.ts index 261edd0..e0a4437 100644 --- a/scripts/multisrc/mtlnovel/template.ts +++ b/plugins/multisrc/mtlnovel/template.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { defaultCover } from '@libs/defaultCover'; import { Filters } from '@libs/filterInputs'; diff --git a/scripts/multisrc/novelcool/generator.js b/plugins/multisrc/novelcool/generator.js similarity index 100% rename from scripts/multisrc/novelcool/generator.js rename to plugins/multisrc/novelcool/generator.js diff --git a/scripts/multisrc/novelcool/sources.json b/plugins/multisrc/novelcool/sources.json similarity index 100% rename from scripts/multisrc/novelcool/sources.json rename to plugins/multisrc/novelcool/sources.json diff --git a/scripts/multisrc/novelcool/template.ts b/plugins/multisrc/novelcool/template.ts similarity index 99% rename from scripts/multisrc/novelcool/template.ts rename to plugins/multisrc/novelcool/template.ts index ace9141..80df521 100644 --- a/scripts/multisrc/novelcool/template.ts +++ b/plugins/multisrc/novelcool/template.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { Filters, FilterTypes } from '@libs/filterInputs'; import dayjs from 'dayjs'; diff --git a/scripts/multisrc/ranobes/generator.js b/plugins/multisrc/ranobes/generator.js similarity index 100% rename from scripts/multisrc/ranobes/generator.js rename to plugins/multisrc/ranobes/generator.js diff --git a/scripts/multisrc/ranobes/sources.json b/plugins/multisrc/ranobes/sources.json similarity index 100% rename from scripts/multisrc/ranobes/sources.json rename to plugins/multisrc/ranobes/sources.json diff --git a/scripts/multisrc/ranobes/template.ts b/plugins/multisrc/ranobes/template.ts similarity index 99% rename from scripts/multisrc/ranobes/template.ts rename to plugins/multisrc/ranobes/template.ts index aeb8b75..788ee49 100644 --- a/scripts/multisrc/ranobes/template.ts +++ b/plugins/multisrc/ranobes/template.ts @@ -1,6 +1,6 @@ import { Parser } from 'htmlparser2'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; type RanobesOptions = { diff --git a/scripts/multisrc/readnovelfull/README.md b/plugins/multisrc/readnovelfull/README.md similarity index 94% rename from scripts/multisrc/readnovelfull/README.md rename to plugins/multisrc/readnovelfull/README.md index ab799a9..7e0e7d6 100644 --- a/scripts/multisrc/readnovelfull/README.md +++ b/plugins/multisrc/readnovelfull/README.md @@ -16,8 +16,9 @@ To add a new source you need to add it to sources.json: - sourceName: the name of the source (you can use the value of "name" in "https://site.com/wp-json/" if it exists) - sourceSite: the site url - options: the options of the source + - lang?: the language of the source (default: "English") (check that the language - exists in the languages (check folder names in "plugins/")) + exists in the languages (check folder names in "plugins/")) - versionIncrements?: needs to be updated everytime the site url is updated - latestPage: the href value using this CSS selector `a[title="Latest Release"]` - searchPage: path for search @@ -26,17 +27,17 @@ To add a new source you need to add it to sources.json: - pageParam?: if a site uses something other than "page" for accessing pages // All the following is for when if a page uses a main path for querying novels and just adds params to it to get different outputs (see urls in lightnovelplus) + - novelListing?: Main path for browsing novels - typeParam?: Field for entering the type of novelListing (eg: latest, hot, completed, etc), default: type - genreParam?: Field for entering type of novelListing dedicated for genres (since param websites dont use the path change), default: category_novel - genreKey?: Field for entering key representing the genre within the genreParam, default: id (eg: ?type=category_novel&id={value}) - langParam?: Field for entering the key representing language(?), do not understand reason for this param honestly, but recreate normal website behaviour as much as possible, default: none. - - urlLangCode?: the value for langParam, default: none. eg: 'en' - + - urlLangCode?: the value for langParam, default: none. eg: 'en' ### filters To add filters to a source you need to run the script "get_filters.js" \ -(`npx node scripts/multisrc/readnovelfull/get_filters.js` +(`npx node plugins/multisrc/readnovelfull/get_filters.js` (if you are at the root of the project) (and you have ran "npm install" before)) and follow the instructions (url is easier and faster but sometimes it doesn't work) diff --git a/scripts/multisrc/readnovelfull/filters/FWN.com.json b/plugins/multisrc/readnovelfull/filters/FWN.com.json similarity index 100% rename from scripts/multisrc/readnovelfull/filters/FWN.com.json rename to plugins/multisrc/readnovelfull/filters/FWN.com.json diff --git a/scripts/multisrc/readnovelfull/filters/allnovel.json b/plugins/multisrc/readnovelfull/filters/allnovel.json similarity index 100% rename from scripts/multisrc/readnovelfull/filters/allnovel.json rename to plugins/multisrc/readnovelfull/filters/allnovel.json diff --git a/scripts/multisrc/readnovelfull/filters/anf.net.json b/plugins/multisrc/readnovelfull/filters/anf.net.json similarity index 100% rename from scripts/multisrc/readnovelfull/filters/anf.net.json rename to plugins/multisrc/readnovelfull/filters/anf.net.json diff --git a/scripts/multisrc/readnovelfull/filters/boxnovel.json b/plugins/multisrc/readnovelfull/filters/boxnovel.json similarity index 100% rename from scripts/multisrc/readnovelfull/filters/boxnovel.json rename to plugins/multisrc/readnovelfull/filters/boxnovel.json diff --git a/scripts/multisrc/readnovelfull/filters/libread.json b/plugins/multisrc/readnovelfull/filters/libread.json similarity index 100% rename from scripts/multisrc/readnovelfull/filters/libread.json rename to plugins/multisrc/readnovelfull/filters/libread.json diff --git a/scripts/multisrc/readnovelfull/filters/lightnovelplus.json b/plugins/multisrc/readnovelfull/filters/lightnovelplus.json similarity index 100% rename from scripts/multisrc/readnovelfull/filters/lightnovelplus.json rename to plugins/multisrc/readnovelfull/filters/lightnovelplus.json diff --git a/scripts/multisrc/readnovelfull/filters/novelbin.json b/plugins/multisrc/readnovelfull/filters/novelbin.json similarity index 100% rename from scripts/multisrc/readnovelfull/filters/novelbin.json rename to plugins/multisrc/readnovelfull/filters/novelbin.json diff --git a/scripts/multisrc/readnovelfull/filters/novelfull.json b/plugins/multisrc/readnovelfull/filters/novelfull.json similarity index 100% rename from scripts/multisrc/readnovelfull/filters/novelfull.json rename to plugins/multisrc/readnovelfull/filters/novelfull.json diff --git a/scripts/multisrc/readnovelfull/filters/readnovelfull.json b/plugins/multisrc/readnovelfull/filters/readnovelfull.json similarity index 100% rename from scripts/multisrc/readnovelfull/filters/readnovelfull.json rename to plugins/multisrc/readnovelfull/filters/readnovelfull.json diff --git a/scripts/multisrc/readnovelfull/generator.js b/plugins/multisrc/readnovelfull/generator.js similarity index 100% rename from scripts/multisrc/readnovelfull/generator.js rename to plugins/multisrc/readnovelfull/generator.js diff --git a/scripts/multisrc/readnovelfull/get_filters.js b/plugins/multisrc/readnovelfull/get_filters.js similarity index 100% rename from scripts/multisrc/readnovelfull/get_filters.js rename to plugins/multisrc/readnovelfull/get_filters.js diff --git a/scripts/multisrc/readnovelfull/sources.json b/plugins/multisrc/readnovelfull/sources.json similarity index 100% rename from scripts/multisrc/readnovelfull/sources.json rename to plugins/multisrc/readnovelfull/sources.json diff --git a/scripts/multisrc/readnovelfull/template.ts b/plugins/multisrc/readnovelfull/template.ts similarity index 99% rename from scripts/multisrc/readnovelfull/template.ts rename to plugins/multisrc/readnovelfull/template.ts index 97aa249..f883ad5 100644 --- a/scripts/multisrc/readnovelfull/template.ts +++ b/plugins/multisrc/readnovelfull/template.ts @@ -1,6 +1,6 @@ import { Parser } from 'htmlparser2'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { Filters } from '@libs/filterInputs'; diff --git a/scripts/multisrc/readwn/filters/fannovel.json b/plugins/multisrc/readwn/filters/fannovel.json similarity index 100% rename from scripts/multisrc/readwn/filters/fannovel.json rename to plugins/multisrc/readwn/filters/fannovel.json diff --git a/scripts/multisrc/readwn/filters/ltnovel.json b/plugins/multisrc/readwn/filters/ltnovel.json similarity index 100% rename from scripts/multisrc/readwn/filters/ltnovel.json rename to plugins/multisrc/readwn/filters/ltnovel.json diff --git a/scripts/multisrc/readwn/filters/wuxiacity.json b/plugins/multisrc/readwn/filters/wuxiacity.json similarity index 100% rename from scripts/multisrc/readwn/filters/wuxiacity.json rename to plugins/multisrc/readwn/filters/wuxiacity.json diff --git a/scripts/multisrc/readwn/filters/wuxiamtl.json b/plugins/multisrc/readwn/filters/wuxiamtl.json similarity index 100% rename from scripts/multisrc/readwn/filters/wuxiamtl.json rename to plugins/multisrc/readwn/filters/wuxiamtl.json diff --git a/scripts/multisrc/readwn/filters/wuxiap.json b/plugins/multisrc/readwn/filters/wuxiap.json similarity index 100% rename from scripts/multisrc/readwn/filters/wuxiap.json rename to plugins/multisrc/readwn/filters/wuxiap.json diff --git a/scripts/multisrc/readwn/generator.js b/plugins/multisrc/readwn/generator.js similarity index 100% rename from scripts/multisrc/readwn/generator.js rename to plugins/multisrc/readwn/generator.js diff --git a/scripts/multisrc/readwn/get_filters.ts b/plugins/multisrc/readwn/get_filters.ts similarity index 100% rename from scripts/multisrc/readwn/get_filters.ts rename to plugins/multisrc/readwn/get_filters.ts diff --git a/scripts/multisrc/readwn/settings.json b/plugins/multisrc/readwn/settings.json similarity index 100% rename from scripts/multisrc/readwn/settings.json rename to plugins/multisrc/readwn/settings.json diff --git a/scripts/multisrc/readwn/sources.json b/plugins/multisrc/readwn/sources.json similarity index 100% rename from scripts/multisrc/readwn/sources.json rename to plugins/multisrc/readwn/sources.json diff --git a/scripts/multisrc/readwn/template.ts b/plugins/multisrc/readwn/template.ts similarity index 99% rename from scripts/multisrc/readwn/template.ts rename to plugins/multisrc/readwn/template.ts index 5a03a46..4b73f4d 100644 --- a/scripts/multisrc/readwn/template.ts +++ b/plugins/multisrc/readwn/template.ts @@ -1,6 +1,6 @@ import { fetchApi } from '@libs/fetch'; import { Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { load as parseHTML } from 'cheerio'; import dayjs from 'dayjs'; diff --git a/scripts/multisrc/rulate/generator.js b/plugins/multisrc/rulate/generator.js similarity index 100% rename from scripts/multisrc/rulate/generator.js rename to plugins/multisrc/rulate/generator.js diff --git a/scripts/multisrc/rulate/settings.json b/plugins/multisrc/rulate/settings.json similarity index 100% rename from scripts/multisrc/rulate/settings.json rename to plugins/multisrc/rulate/settings.json diff --git a/scripts/multisrc/rulate/sources.json b/plugins/multisrc/rulate/sources.json similarity index 100% rename from scripts/multisrc/rulate/sources.json rename to plugins/multisrc/rulate/sources.json diff --git a/scripts/multisrc/rulate/template.ts b/plugins/multisrc/rulate/template.ts similarity index 99% rename from scripts/multisrc/rulate/template.ts rename to plugins/multisrc/rulate/template.ts index e5487d0..a5bee83 100644 --- a/scripts/multisrc/rulate/template.ts +++ b/plugins/multisrc/rulate/template.ts @@ -1,6 +1,6 @@ import { fetchApi } from '@libs/fetch'; import { Filters, FilterTypes } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { load as parseHTML } from 'cheerio'; import dayjs from 'dayjs'; diff --git a/src/plugins/polish/novelki.ts b/plugins/polish/novelki.ts similarity index 99% rename from src/plugins/polish/novelki.ts rename to plugins/polish/novelki.ts index 0ba7780..be3e1af 100644 --- a/src/plugins/polish/novelki.ts +++ b/plugins/polish/novelki.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { load as parseHTML } from 'cheerio'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/portuguese/.gitkeep b/plugins/portuguese/.gitkeep similarity index 100% rename from src/plugins/portuguese/.gitkeep rename to plugins/portuguese/.gitkeep diff --git a/src/plugins/portuguese/blogdoamonnovels.ts b/plugins/portuguese/blogdoamonnovels.ts similarity index 99% rename from src/plugins/portuguese/blogdoamonnovels.ts rename to plugins/portuguese/blogdoamonnovels.ts index 82123d5..83328cb 100644 --- a/src/plugins/portuguese/blogdoamonnovels.ts +++ b/plugins/portuguese/blogdoamonnovels.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { Filters } from '@libs/filterInputs'; diff --git a/src/plugins/portuguese/novelmania.ts b/plugins/portuguese/novelmania.ts similarity index 99% rename from src/plugins/portuguese/novelmania.ts rename to plugins/portuguese/novelmania.ts index 5709802..d3cda71 100644 --- a/src/plugins/portuguese/novelmania.ts +++ b/plugins/portuguese/novelmania.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; import { load as parseHTML } from 'cheerio'; import { defaultCover } from '@libs/defaultCover'; diff --git a/src/plugins/portuguese/tsundoku.ts b/plugins/portuguese/tsundoku.ts similarity index 99% rename from src/plugins/portuguese/tsundoku.ts rename to plugins/portuguese/tsundoku.ts index 3710591..5dd4204 100644 --- a/src/plugins/portuguese/tsundoku.ts +++ b/plugins/portuguese/tsundoku.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import dayjs from 'dayjs'; import { Filters, FilterTypes } from '@libs/filterInputs'; diff --git a/src/plugins/russian/LitSpace.ts b/plugins/russian/LitSpace.ts similarity index 96% rename from src/plugins/russian/LitSpace.ts rename to plugins/russian/LitSpace.ts index 49e53ec..3a2d867 100644 --- a/src/plugins/russian/LitSpace.ts +++ b/plugins/russian/LitSpace.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; import { fetchApi } from '@libs/fetch'; @@ -197,7 +197,7 @@ class freedlit implements Plugin.PluginBase { export default new freedlit(); -interface Books { +type Books = { current_page: number; data: DataEntity[]; first_page_url: string; @@ -210,8 +210,8 @@ interface Books { prev_page_url?: null; to: number; total: number; -} -interface DataEntity { +}; +type DataEntity = { id: number; item_id: number; type: string; @@ -252,29 +252,29 @@ interface DataEntity { annotation: string; total_comments: number; total_libraries: number; -} -interface AuthorsNamesEntity { +}; +type AuthorsNamesEntity = { id: number; url: string; name: string; type: string; -} -interface GenresEntity { +}; +type GenresEntity = { id: number; -} -interface TagsEntity { +}; +type TagsEntity = { id: number; name: string; -} +}; -interface chaptersData { +type chaptersData = { id: number; header: string; first_published_formated: string; intro_snippet_end: number; -} +}; -interface chapterContent { +type chapterContent = { id: number; book_id: number; header: string; @@ -289,9 +289,9 @@ interface chapterContent { is_chapter_avalaible: boolean; total_characters: number; total_characters_clear: string; -} +}; -export interface book { +export type book = { id: number; cover?: string | null; title?: string | null; @@ -307,4 +307,4 @@ export interface book { author_name?: string | null; user_link?: string | null; img?: string | null; -} +}; diff --git a/src/plugins/russian/authortoday.ts b/plugins/russian/authortoday.ts similarity index 99% rename from src/plugins/russian/authortoday.ts rename to plugins/russian/authortoday.ts index 8a86834..23d2a61 100644 --- a/src/plugins/russian/authortoday.ts +++ b/plugins/russian/authortoday.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; import { fetchApi } from '@libs/fetch'; diff --git a/src/plugins/russian/bookriver.ts b/plugins/russian/bookriver.ts similarity index 99% rename from src/plugins/russian/bookriver.ts rename to plugins/russian/bookriver.ts index 9f53c31..0a51a1e 100644 --- a/src/plugins/russian/bookriver.ts +++ b/plugins/russian/bookriver.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/russian/ficbook.ts b/plugins/russian/ficbook.ts similarity index 99% rename from src/plugins/russian/ficbook.ts rename to plugins/russian/ficbook.ts index d04bdf9..e343072 100644 --- a/src/plugins/russian/ficbook.ts +++ b/plugins/russian/ficbook.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/russian/jaomix.ts b/plugins/russian/jaomix.ts similarity index 99% rename from src/plugins/russian/jaomix.ts rename to plugins/russian/jaomix.ts index 33cc846..a60bb16 100644 --- a/src/plugins/russian/jaomix.ts +++ b/plugins/russian/jaomix.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/russian/neobook.ts b/plugins/russian/neobook.ts similarity index 99% rename from src/plugins/russian/neobook.ts rename to plugins/russian/neobook.ts index 1aef565..3b989c1 100644 --- a/src/plugins/russian/neobook.ts +++ b/plugins/russian/neobook.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; import { fetchApi } from '@libs/fetch'; diff --git a/src/plugins/russian/novelOvh.ts b/plugins/russian/novelOvh.ts similarity index 99% rename from src/plugins/russian/novelOvh.ts rename to plugins/russian/novelOvh.ts index 0024f34..f50da09 100644 --- a/src/plugins/russian/novelOvh.ts +++ b/plugins/russian/novelOvh.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/russian/novelTL.ts b/plugins/russian/novelTL.ts similarity index 99% rename from src/plugins/russian/novelTL.ts rename to plugins/russian/novelTL.ts index 0371ad3..79d237b 100644 --- a/src/plugins/russian/novelTL.ts +++ b/plugins/russian/novelTL.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; import { fetchApi } from '@libs/fetch'; diff --git a/src/plugins/russian/ranobehub.ts b/plugins/russian/ranobehub.ts similarity index 99% rename from src/plugins/russian/ranobehub.ts rename to plugins/russian/ranobehub.ts index caa81c4..0459db0 100644 --- a/src/plugins/russian/ranobehub.ts +++ b/plugins/russian/ranobehub.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/russian/ranobelib.ts b/plugins/russian/ranobelib.ts similarity index 99% rename from src/plugins/russian/ranobelib.ts rename to plugins/russian/ranobelib.ts index ba899cf..b59c067 100644 --- a/src/plugins/russian/ranobelib.ts +++ b/plugins/russian/ranobelib.ts @@ -1,9 +1,9 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; -import { storage, localStorage } from '@libs/storage'; +import { storage, localStorage } from '@/lib/storage'; import dayjs from 'dayjs'; const statusKey: Record = { diff --git a/src/plugins/russian/ranoberf.ts b/plugins/russian/ranoberf.ts similarity index 99% rename from src/plugins/russian/ranoberf.ts rename to plugins/russian/ranoberf.ts index bbac441..e5d557f 100644 --- a/src/plugins/russian/ranoberf.ts +++ b/plugins/russian/ranoberf.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; import { fetchApi } from '@libs/fetch'; diff --git a/src/plugins/russian/renovels.ts b/plugins/russian/renovels.ts similarity index 99% rename from src/plugins/russian/renovels.ts rename to plugins/russian/renovels.ts index aab6f67..3aeec10 100644 --- a/src/plugins/russian/renovels.ts +++ b/plugins/russian/renovels.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/russian/ruvers.ts b/plugins/russian/ruvers.ts similarity index 99% rename from src/plugins/russian/ruvers.ts rename to plugins/russian/ruvers.ts index 68e584c..86d2f7d 100644 --- a/src/plugins/russian/ruvers.ts +++ b/plugins/russian/ruvers.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { defaultCover } from '@libs/defaultCover'; import { fetchApi } from '@libs/fetch'; diff --git a/src/plugins/russian/topliba.ts b/plugins/russian/topliba.ts similarity index 99% rename from src/plugins/russian/topliba.ts rename to plugins/russian/topliba.ts index 95ce46b..51b60e2 100644 --- a/src/plugins/russian/topliba.ts +++ b/plugins/russian/topliba.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { fetchApi } from '@libs/fetch'; import { load as parseHTML } from 'cheerio'; diff --git a/src/plugins/russian/zelluloza.ts b/plugins/russian/zelluloza.ts similarity index 99% rename from src/plugins/russian/zelluloza.ts rename to plugins/russian/zelluloza.ts index d42e9a0..ac74d05 100644 --- a/src/plugins/russian/zelluloza.ts +++ b/plugins/russian/zelluloza.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/spanish/hasutl.ts b/plugins/spanish/hasutl.ts similarity index 98% rename from src/plugins/spanish/hasutl.ts rename to plugins/spanish/hasutl.ts index d766502..8f6875d 100644 --- a/src/plugins/spanish/hasutl.ts +++ b/plugins/spanish/hasutl.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; class HasulTL implements Plugin.PluginBase { id = 'HasuTL'; diff --git a/src/plugins/spanish/novelasligera.ts b/plugins/spanish/novelasligera.ts similarity index 99% rename from src/plugins/spanish/novelasligera.ts rename to plugins/spanish/novelasligera.ts index ee24a39..0292e86 100644 --- a/src/plugins/spanish/novelasligera.ts +++ b/plugins/spanish/novelasligera.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters } from '@libs/filterInputs'; class Ligera implements Plugin.PluginBase { diff --git a/src/plugins/spanish/novelawuxia.ts b/plugins/spanish/novelawuxia.ts similarity index 99% rename from src/plugins/spanish/novelawuxia.ts rename to plugins/spanish/novelawuxia.ts index b021477..c4150f9 100644 --- a/src/plugins/spanish/novelawuxia.ts +++ b/plugins/spanish/novelawuxia.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { load as parseHTML } from 'cheerio'; import { defaultCover } from '@libs/defaultCover'; import { Filters } from '@libs/filterInputs'; diff --git a/src/plugins/spanish/oasistranslations.ts b/plugins/spanish/oasistranslations.ts similarity index 99% rename from src/plugins/spanish/oasistranslations.ts rename to plugins/spanish/oasistranslations.ts index 9e804a8..9b677c0 100644 --- a/src/plugins/spanish/oasistranslations.ts +++ b/plugins/spanish/oasistranslations.ts @@ -1,6 +1,6 @@ import { fetchApi } from '@libs/fetch'; import { Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { load as parseHTML } from 'cheerio'; class Oasis implements Plugin.PluginBase { id = 'oasistranslations'; diff --git a/src/plugins/spanish/skynovels.ts b/plugins/spanish/skynovels.ts similarity index 99% rename from src/plugins/spanish/skynovels.ts rename to plugins/spanish/skynovels.ts index 48a92bf..ca1dfaa 100644 --- a/src/plugins/spanish/skynovels.ts +++ b/plugins/spanish/skynovels.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; class SkyNovels implements Plugin.PluginBase { id = 'skynovels'; diff --git a/src/plugins/spanish/tunovelaligera.ts b/plugins/spanish/tunovelaligera.ts similarity index 99% rename from src/plugins/spanish/tunovelaligera.ts rename to plugins/spanish/tunovelaligera.ts index a4d668f..9f8c8e1 100644 --- a/src/plugins/spanish/tunovelaligera.ts +++ b/plugins/spanish/tunovelaligera.ts @@ -1,7 +1,7 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; import { FilterTypes, Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { defaultCover } from '@libs/defaultCover'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/spanish/yukitls.ts b/plugins/spanish/yukitls.ts similarity index 99% rename from src/plugins/spanish/yukitls.ts rename to plugins/spanish/yukitls.ts index 8b57877..63ab695 100644 --- a/src/plugins/spanish/yukitls.ts +++ b/plugins/spanish/yukitls.ts @@ -1,6 +1,6 @@ import { fetchApi } from '@libs/fetch'; import { Filters } from '@libs/filterInputs'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { load as parseHTML } from 'cheerio'; class Yuuki implements Plugin.PluginBase { diff --git a/src/plugins/thai/.gitkeep b/plugins/thai/.gitkeep similarity index 100% rename from src/plugins/thai/.gitkeep rename to plugins/thai/.gitkeep diff --git a/src/plugins/turkish/MangaTR.ts b/plugins/turkish/MangaTR.ts similarity index 99% rename from src/plugins/turkish/MangaTR.ts rename to plugins/turkish/MangaTR.ts index bd98723..1af193c 100644 --- a/src/plugins/turkish/MangaTR.ts +++ b/plugins/turkish/MangaTR.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters, FilterTypes } from '@libs/filterInputs'; class MangaTR implements Plugin.PluginBase { diff --git a/src/plugins/turkish/epiknovel.ts b/plugins/turkish/epiknovel.ts similarity index 99% rename from src/plugins/turkish/epiknovel.ts rename to plugins/turkish/epiknovel.ts index ba3c430..d230e4d 100644 --- a/src/plugins/turkish/epiknovel.ts +++ b/plugins/turkish/epiknovel.ts @@ -1,6 +1,6 @@ import { load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; class EpikNovel implements Plugin.PluginBase { id = 'epiknovel'; diff --git a/src/plugins/ukrainian/bakainua.ts b/plugins/ukrainian/bakainua.ts similarity index 96% rename from src/plugins/ukrainian/bakainua.ts rename to plugins/ukrainian/bakainua.ts index b2f2bed..c6833ae 100644 --- a/src/plugins/ukrainian/bakainua.ts +++ b/plugins/ukrainian/bakainua.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { Filters, FilterTypes } from '@libs/filterInputs'; @@ -20,7 +20,7 @@ class BakaInUa implements Plugin.PluginBase { ): Promise { const fictionIds: string[] = []; - let url: URL = new URL(this.site + '/fictions/alphabetical'); + const url: URL = new URL(this.site + '/fictions/alphabetical'); if (pageNo > 1) url.searchParams.append('page', pageNo.toString()); if (showLatestNovels || (filters && filters.only_new.value)) @@ -100,7 +100,7 @@ class BakaInUa implements Plugin.PluginBase { break; } - let chapters: Plugin.ChapterItem[] = []; + const chapters: Plugin.ChapterItem[] = []; $('li.group a').each((index, elem) => { const chapter: Plugin.ChapterItem = { name: $(elem).find('span').eq(1).text().trim(), @@ -123,7 +123,7 @@ class BakaInUa implements Plugin.PluginBase { } async searchNovels(searchTerm: string): Promise { - let novels: Plugin.NovelItem[] = []; + const novels: Plugin.NovelItem[] = []; const result = await fetchApi( this.site + '/search?search%5B%5D=' + searchTerm + '&only_fictions=true', diff --git a/src/plugins/ukrainian/smakolykytl.ts b/plugins/ukrainian/smakolykytl.ts similarity index 99% rename from src/plugins/ukrainian/smakolykytl.ts rename to plugins/ukrainian/smakolykytl.ts index b8b5696..7f153cb 100644 --- a/src/plugins/ukrainian/smakolykytl.ts +++ b/plugins/ukrainian/smakolykytl.ts @@ -1,4 +1,4 @@ -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; import dayjs from 'dayjs'; diff --git a/src/plugins/ukrainian/uaranobeclub.ts b/plugins/ukrainian/uaranobeclub.ts similarity index 99% rename from src/plugins/ukrainian/uaranobeclub.ts rename to plugins/ukrainian/uaranobeclub.ts index 0a34af9..df226f9 100644 --- a/src/plugins/ukrainian/uaranobeclub.ts +++ b/plugins/ukrainian/uaranobeclub.ts @@ -1,5 +1,5 @@ import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; const UA_RANOBE_ID = 'uaranobeclub' as const; const UA_RANOBE_URL = 'https://uaranobe.club/' as const; diff --git a/src/plugins/vietnamese/LNHako.ts b/plugins/vietnamese/LNHako.ts similarity index 99% rename from src/plugins/vietnamese/LNHako.ts rename to plugins/vietnamese/LNHako.ts index 5aeabbd..042bdcf 100644 --- a/src/plugins/vietnamese/LNHako.ts +++ b/plugins/vietnamese/LNHako.ts @@ -1,6 +1,6 @@ import { fetchApi } from '@libs/fetch'; import { Parser } from 'htmlparser2'; -import { HTMLParser2Util, Plugin } from '@typings/plugin'; +import { HTMLParser2Util, Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { FilterTypes, Filters } from '@libs/filterInputs'; diff --git a/src/plugins/vietnamese/Truyenconect.ts b/plugins/vietnamese/Truyenconect.ts similarity index 99% rename from src/plugins/vietnamese/Truyenconect.ts rename to plugins/vietnamese/Truyenconect.ts index 540a901..815ad2a 100644 --- a/src/plugins/vietnamese/Truyenconect.ts +++ b/plugins/vietnamese/Truyenconect.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { FilterTypes, Filters } from '@libs/filterInputs'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/vietnamese/lightnovelvn.ts b/plugins/vietnamese/lightnovelvn.ts similarity index 99% rename from src/plugins/vietnamese/lightnovelvn.ts rename to plugins/vietnamese/lightnovelvn.ts index 3326dff..37a4d07 100644 --- a/src/plugins/vietnamese/lightnovelvn.ts +++ b/plugins/vietnamese/lightnovelvn.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { Filters } from '@libs/filterInputs'; import { NovelStatus } from '@libs/novelStatus'; diff --git a/src/plugins/vietnamese/nettruyen.ts b/plugins/vietnamese/nettruyen.ts similarity index 98% rename from src/plugins/vietnamese/nettruyen.ts rename to plugins/vietnamese/nettruyen.ts index 401fe19..004309a 100644 --- a/src/plugins/vietnamese/nettruyen.ts +++ b/plugins/vietnamese/nettruyen.ts @@ -1,6 +1,6 @@ import { fetchApi } from '@libs/fetch'; import { NovelStatus } from '@libs/novelStatus'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { CheerioAPI, load as parseHTML } from 'cheerio'; class Nettruyen implements Plugin.PagePlugin { diff --git a/src/plugins/vietnamese/truyenchu.ts b/plugins/vietnamese/truyenchu.ts similarity index 99% rename from src/plugins/vietnamese/truyenchu.ts rename to plugins/vietnamese/truyenchu.ts index 4f75ea9..65851de 100644 --- a/src/plugins/vietnamese/truyenchu.ts +++ b/plugins/vietnamese/truyenchu.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; class TruyenFull implements Plugin.PagePlugin { diff --git a/src/plugins/vietnamese/truyenfull.ts b/plugins/vietnamese/truyenfull.ts similarity index 99% rename from src/plugins/vietnamese/truyenfull.ts rename to plugins/vietnamese/truyenfull.ts index dba9a6a..0c88c5a 100644 --- a/src/plugins/vietnamese/truyenfull.ts +++ b/plugins/vietnamese/truyenfull.ts @@ -1,6 +1,6 @@ import { CheerioAPI, load as parseHTML } from 'cheerio'; import { fetchApi } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; +import { Plugin } from '@/types/plugin'; import { NovelStatus } from '@libs/novelStatus'; import { FilterTypes, Filters } from '@libs/filterInputs'; diff --git a/proxy.ts b/proxy.ts index eea5e97..db93a11 100644 --- a/proxy.ts +++ b/proxy.ts @@ -193,7 +193,7 @@ const proxyRequest: Connect.SimpleHandleFunction = (req, res) => { }; proxy.on('proxyRes', function (proxyRes, req, res) { - var statusCode = proxyRes.statusCode; + const statusCode = proxyRes.statusCode; // Redirect if ( statusCode === 301 || diff --git a/public/ico.png b/public/ico.png deleted file mode 100644 index d2f483cd8e42052d043e07f8c3cc54b319577735..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15308 zcmV;-J2S+IP)PyA07*naRCr$PeFu~r$9d*g-7}j57LmvR0fGRDKoB560$>2aoU>#FOR^pnEL(Rc z%XhZk*_Q2le!h2lk}X-HMO&go$&|#LDF!hI07M`W7hw?z5WpgA4l~nT_x`G`p6Z@X z6BdB<(0t3q&UC1*`s({*{l#$RIMV}V^Z+a4+B27)=>ePp&>0Yv)dOb$R95$$x%do# z&S0Rd9ykM_vbyig#ec{EI^Eul{~^NdbnE0|`Z%ubVc*AHS49hvc=?Wl!yVT$MZ~wpPZ?L%707!RT{N;egG+Y{p=LGmCz6&TS4p2!;~?I>1>6zz-XYb=eG^EXO;!$&Y4o{6IF7+5h(M zp8FU8fkOYGXXu~{0-%0QB|u-1dz?-H@-s#tKnNr&R@^wQx~cX&1Lh2Xox?a5+uR<< zImXzw4a>G+TNZ52L4R}3#gENx&~Vdl%d!EUpWNITKlM@mw>*dWd&;>~e9RaOgMJM9 zL;Rc3XUw2K#pee7oibq>27Py!F&wnPRsq;y+xGVUfq|{>zWTy}0B{8XOAY=hXQxvQ zpfF|;Yy!Yoe(kmAHq2yi}$~03jCAczR#(D!-3)}v% zZ?J#W+poR2jhY$(tW(NNrwTwp>>{S`qD6}uMvtF*9Rs@#3|Hl{)>+wX7P*{-TrMZT zLgVJLiUXP;Ft~%My=5Q}JcI7-lBn~8I?sQ;`**;}1SDcF0-5{)Ow&Xvl|nj|Mmn9Q ze;;B7UV+75+<*Mw3$3eH_c&nkgX)w3>0|@Q4;%uG___JEyYGT&-f3I>*1=2$*-RFh z3^9x4f<=KQ9t2+TuEdj06@#_`z8FFyIG!%PGu9ZV+`NGA(GLBKJWFTZwL!?2bwg0au^4-AaTWHJ~W9E44J z3NeerG*N>?gG;kF6jTA?E9m_EeSF{xLX^W;Nf}5yuZVU?=`9b%PV{fmrE03HQB_@q zx|*7H80?q*{T)Af=e5_`97X@618JxM6bPKFuD@kgeQm>k&se!X?(gr%z`&rxG^EEk z%utLj;?p}kfb$KU`Ys4?Ay^3oXAlD=1#+qFAP^C#QYjNPH8m1YRjCJido%y?-kUFM zJ=s7SN&u;QOVb1}7c97R`1r}=|0bKWzS`HCpkiuepFEqRT4nD$Re?oy85QOmQ<%w|K8KvJDpgEEUGBkFTRU#jTH@|ldS(p z7At&#q!w7wEEw`UVx#)HIy5yk?6h*ZFTeTf3-1BQX=1HnAgVNglv$p>{`xyt@DzKx zyQc?aT`A=_4g@Dl_bCK&aXME~I?xdLp#r7917HGCbyXD_8XJ%{*e!3o`oix3WGfA# zN&$%OL*Sv~#G&NfhE!#Xd#P{5XZ#H?rmWp+cE0rX6G)kYlo? zWf;<_)R*3P<=Ovom`I7VvYDt70P=w6+8b`a%m!ZQ>h2MqV|}Ja`(G-k`;=kz#EDp` zqZOg#7UBPq{o}oN9AgLRkp9U^9_{9)Mx@O2^>4ra{F^=|Dl48=E`XH6Ow5yBapN6J zQp|YyL`R25--#QPDBUO23tS=JPtoiXazQ2hKVfYt21H@!nx=u_!&^v9T>bXzFTU%5 zh?q!a1q4aN*w4xVkZx_I=gpfpeB7iNZyfLFnC54mFj=h_sZv&#%Ww&Gjv)U}++Y=@ z`wRgS#ZaR1@zdiSop(|w zB92x)-{GR5$>npa z8=Bwk>h5+Q7{wgS>&K4)un=>-Noen#OWMKm1noT zMfiVC1p^U)$h03ba@0d_zV`gr01RkO#>C2WF#uBRBdo3q7cV=vsi|cRg(?!Uj--jm zqZGa8bY!1m+f*zQ7RNx*)@M^=BeH#63pZ|DN4eLeP?PsJF$)z7AeVivz5b4WJl1*Q z&-{wBpK+w;Hdxn)(|O{)4^SP#GZQ_Ti~05>VYs3^&xD2qx{sIfyzL2^Wl`2w*!e=U z3bjh*7o<>+89Dsl-g^DTzbS==R7;{^t#AYC5`R|~KOH`RT4)!VQA z+Ho$b)Q{NdpA$oA5ePSOguN(^IiMnr;TdES4SEbk|`W*uD zjY3~6x%YkK$l=egeDmecI%14;A+_2gQph9$kVknQJ9g}dX)`a_)7#fq;P(mAb%L0w z7#SaUebF9Xb(eU*kLP&-4UH8cMR>yH?JMj5(HShr|Kn#M^*(iVb=ZHfZA!<-A0I15 znNA8IPAfz*N>o7ap7(Cdh?M2^KI0Mf-*?G3lyz2nf~_LeZ~DoB?p#zP%8 z%(vK=4PVK9eXNP+dQ6{MZw3z4F{Snlc?L#^M0v5nll6F1hTQje~=k(UF4D_hk}4 zQKEAy%s%1IlnWcJTWqs*h}1|K1z`eVP~xSvnIWfD7M=0Hmz18X>+ex$;18QG)0dqGdBvNz9X6 z$Ix{jvb?BMtP)%7=i?!<|{?BByHUr^gej%fPE%C}zonPZKS z9;C7s0~;L&AeAUj=6mh(Yi@q4v$K0UEpezehek(t{{tF)}t52O!t`44`50va9xF zGFfjA#vrF8W(u)pXl4nqvhX6+%q0f?Sw z2^E<@%Wk<9sIM1q?6C^T%zx`Gm@mF4tbU<+`DozO>ORSJ!E`#EZQZbHvS!XldZm*9 zNa#NVpamB%-yc@UDUN{>11V15;T*YP&9MLMYXJFa)ImO)jhkS+_!1c9C;9Y|XuZcv z3$m>a6Ol5_E!cDC0=M1@G&H!6bZsvJ@|yRNdh#hS!CHj?QWp&^`$*;tI+8w@f~z|= zubBvd3R#gN9qA8B0w58-0MIyp(dB!S0L9JVi>TX^?@-Npi)ankbQ4kK@|IhG1q&#g z>@ouRW!T1zFkXKhteqUHc{YeLkNuCObETh)NRD(O8D}0EH^jaR4FE|>@0atnA}UExJX+JPV652L#ajF|yB$m&Ttn8KN)Smtp^ z&vRKhI@j2<#^m04{kP*ZhoZg|+Vh++0O=MOF;M;DWmmnN$z;h(S#TuPZwkN^m!jy2 z*!!#_DuY*72m7A8!DdjkU*D@_Ghk0V1>=Jc1Wf!&twU>JgqW}Rsu<{!i-GH|r-fC8 zW5a&9#t|}^o+nrT_?<=ofj(v2vPr;s+(On5A3dcD8bjk zgmZl^2lnENFy4L#j8R!QIcSOj<8qwUdkPUon&gTrU|eyf^gn5bIB(Nt;Y?)p4Z!G8 z(#3H8c|dJl-dgJ)5bg$J?K-fwHn0p?$d%KH;xZ3)W{)F*bUM|(ZR7j%e1X-#G}kx) zxfa-ki?1lz0&^RmfN|nxhhh#C=GE{V|XxqRbz5S0{{L{R+nJeWDDUqb zoFx_oAQc0vUAS<`r8$;*G6{h6bK)$k@IefF62+(TgUqW^uy4H$eD^N!&6@x-1y0)x zWOFcj`#_sskeROrN&Jq;U2>U6R{VzD)Cha>B=9-2VNX39tcD!&g-57$74{kj55oNZ z4;-CIaiRm?B10PG`hEQDqyDa`F>l-Q!J4-nMLIMl76%}b3w0MSx%BRVEc;P#=jC-4 zf$$>4R1z!BAKP+u6JnpbTJRCW!S?MJz`?NL;Ac;krhQcvjQ#t89c^Ge-6APWl1Bi8 zIEpW?O2eK!8TPE1;M2|qnwr5=sn9&1u(kE#bD^Vg8LK;X97w0Y34q6sgT3`Oj13!M z7*d~#&u0n(tqRrLhV?5S@mXR8(=QA_9ut1ak}JN{m$m;-I4=~D zlBnGzsY0HglzH(YoP9(n^|ip*vEXy(g3p`@)RUR*ycS*9egwvIzlE`5hnTDdA%=7c z_Q+ANXU%{;XAUr8q)&$lf42g%ux#+`0MOG1e&Pf;rFm@K4D3GuW>S5XG?2-_u({ZL zg_L^*Ai=Arh<$>d-Befmzdu;_?)`D5d=P+?2~X2Q1W^|+UGdF+TU^RQJpaFST+jxH?R*4i(23<>)?PqDy_= z&`|ULHmrH?J6cdRuozVofW#6W@&PTo;+k)F_x67|jDeDVo|JLq{q&RwO|h-5hBbQ* z_}n?bS!2K{#UjXu?=(tG>i6D*`OLF09Pyia{1K<`})Y5i$6;BRQq)u`6LZECWAeFI;`baf{hyoP9h=TD7eo+AMntx zklL}!WdhpIE59hfv9u`eHEo)(=rCatkP0x@gYs%NM<;Bf;lg06uS?&~XBpfpnt54A5}`=;;-4EFns^?|`{&I}A&j^M%wc zXR_Rk&W3Fmut$#uA2UWah&1nWXTX>}SFn>`P2p`jfq(z8WH*%o;QE`0Z6wpU7ix;U zz*VGG8207RvJbV`VC%jNzgVEI`S-{mjoEVtEozy*) zLsCu#w-s*CR6NIVR7x-bHnrmu_W%)mxMHlSDCUvhY2t)L$lTem zmn;Q_HA_)prd-Ad2$_TL{|Nl;w}EZjV9-(NQUN2X17H8T z6u(cBajdFJ9cBHTbk?U=-If z7`TvXatV!C8A`Q?_U;8=w-#vI1%o`!u2^yg!l!>o=FwD;0*lQF(yEd;5<4PjYBvu9 zzib&eC9audlolR=+DKOyjDPzfjE+vPg{VZZVS>}YNmM(&AW%_u`XSvdNKT7K554ZA z-Y{jF$F^@?Gv5Ia+KdWEcDU0>D7zG0r>!khCakGb z0CETpZvm=mfc{>fy&Zhtez5)fz&ko&3J_=}vI7#;$Be+I7K-|m)_l^vHW7{BTPqAof}^}{hcOkygj-$SfNUYdc}Fd&VZ#h|qHW7MipUcKl?9;23og2B zgUxMkPsY$uly%{ICGRQ-0uq_o)zxwZM1MapNZYdK#Zw-rd8L|B9IUwse0U33eIq!x zfQ~M(W5>Yg9sxPha!xBCX`7Yhpu4zkz=27rzZv8)FNJ^~IO2J7nw zqb;pQjshD!5`6dwpk)})*bLs#0A54vs`lXX2qS=2xl&5*dn-lwLtkZ5Ec-+OB?*X3 z!|2?xW$j!oGqGp}QmL#B^A=sUncKF=CXe>>By>-E?vr1Kr7N#Ofpz*)8gDgk=82GTaUC0rB)@p2RjL+PDF>;Ns%nUvql5crvuZ^ z0qW|&JC1{YbP)LXpv(ZEIGbsLjT!?sWio8C*oF-g=Th>S2wz0)>FNhIIU+y&5atUn zfc20I#=BTiK`u)7iIWsbR1w2qJv+CoJ3lTrI!c7O0J`9!%eLCwF3=#8vrKrC^SL(; zABgdD6cL}ycj=twCbfLjC|H+W3Xp$DTd(EO6lj3ncmw83uQ;KM$d&9)F0^LK6ObsS zL%l2oNl8H`QAEI+HxKOWv-8V+BE8}XV}{h`x88#B?DK+!l(*X7i^b+xD*{LYAZ8eS zZCloo<*kdbg5>%{0GhXO**2Stl^I1J$vo3u9fWX01E#DNdZ=h9<@(f91b!s!d2@l; zvqi3s^6!Yo`38{ZEEuo6B3Eh%UyysZ0^LUUe7pJAPTmnG%doKtm^1CyB6@F?FBtzV2j8LH2@Zq6LfH?WE?!O=Ao;{wF+@Z3%`~zz+V_@gjwda-! zAU79?R%6V&XxVn#7OOMLI-+H-*W`6&z9Uk2V*~8-&VzlkV&n3mIJ0IC*6sH zoKHOk^YCF;_66ogi?#51hETJcH`EKi6s31?VjK~zFAQ_ISCYj@AQ1|67tqxWba#Vy zbU1%^$wdD-bHJ`zk+;HvdiLi(he_$Ofy;z~hoW5FN8QyhjLgn0YiIa$pu`O10nprq z%i1^>^`T>rWQ-Gb8znjlvUWi0v2rA?NU^P=kb=IR%;!s?fm^o@pmd6(?J(Pqx#CNa z6er)%=+PqVVf6RG*7i1|b3_*6?DJutHxn2;9%yWE*P!XG7kNLl!3q0k{j*{cCT0y?jVYbU2p-gd^yn6Bz-CBpn)XO@R4*d zl1a=&5}7pl-PID#`8-_(>nrzyS5<>;ZH4*9n}DMb6U$kbUJ6Vc2c)XJ&k+dV;ADaA z+Y7#F6Zo!O(hHr*=qeg*$>Qi8oXz^$GVQ<+2^Jfn@=^**Mp;BUJ zC5{E()w*6^9~PLE7^VYx7>EEQCw#Q~J(iv#thiwNP4g5xv)8h6uxo0>EXMe8Qe2!k z4o+Er?d?Kz2qRgn#Gs#mlnN&OPS)Lbfm6W*db#b}U_SadEDE9Ad52Tp&N17_wLqDL zv~lo92f$jlg15HH;!>hx;K2h$SoB_{K$NeGzu^}{fa z9Tg(Z>nttCb6wVWRTMyN0CPoHiHHsp+A+AxuLqOLwOndUZO|<^36y-y%h65?@^9qB zp zUAV|`U=a4!E#Pa`h_z!TDgR7v(Frb2{#M4y%;DI7DNiiuH?1r^FD%?g{dV96HF zSz#zT)-xSNx?awVj^X$eY83@frD0DT558;}__^l-zEz{HZn0+{%>VpP8FQj*o10*L z>0V&O2(L9q0Qk{;F!$|~Kv_g}h;9Yz>;T?+M}lNv06d+BO__^VTp|5Hq=&uw3d}d( z5jjXM1DPr0=FSm7gFWywVfvHj z*}nH)@JUV*nR-`R&-K`&0=&58R&ZA#=D-_oA@%YrU|G_Mq{tE325y3y_{7s^qW4_o zUl{@Fl)|DA(M%n^WIMs!bx&bnoo%fm8eg^uYnZ!W*#|b~E#-ox*jc2XFO=zY3c0IR zfG=GJge29w*JQJ>_v{8XZ2{Z14JPRy&PosK?5V(KKMmA3)69dAd^e9h4x_ur)vY8z^(;q!FXZ!1q`D)4C-Hjn ztS*16oOF&0N)2U@E5!|_&be^uI?j1f31x9JC2lr&ug@oaS+wN%vSnao66;HFlplrk zm_2)7KleP?p^sr?Es+_h7V(L|C`IeP@)ckLX!o|J5k#*w@z{MAfl^E>!3Gk<$ghAC_Da1huV0YgGPKyow!P#xw zfJYtyyZv?dWWO%32PX90r)!2bO(l!&8&m_7~mU3W>7TR(bwU{fKfOa}b(p9j;+>ya<$ z>8HU~zYkM}=v`6dvYb$Vyt^pp#g$sYTHNHTBxv*}8-}rU=a#kCm6K5B0%+dCr4L&c z7t4C$j!L{xVX~KI#yd&x;yG%4ycR_lI?0qNVkri5A;bT~=#4w%Rq zaA>f|07hx5>Nt87c;sQ2yY{%=ZwU^+ z9uv+IaRf5drn^42skE_b`^L5RR02Q^^A|7sNoLTZl4oTfp^O#dnkMsCT7mlN36*E= z6j~THQpUEZ&;sqUlS<`jo%}Pj^oN{wyLXE~tEw@izZ7q2f&E9H1g26PQDa1^0P?Gc zz-a9|nf7d%9j-=&aJjq@pisa~u{AoUHnDon#PDJ4a?eNccu>|?i$AG-b})1 z{p57ed-Q&*N~h4e@qO}P=;eNkTAAuDESxoG!QUEY)xD+QCy;TH2Eqb!r)4WBL|~5^ z13rHqIHhcWe5Vtj_u$NKO*!b zP6_dU{$~I!epKxn%z!`h6wH;Y^D!)E4VvTs4DC88mV%ilieW0DDnyMZv#tMV+rHr+ z%2^jiE>=;Ye%}0xzmenY8>Ilq9f*)MO`-RsJ~gDr))tPr{J|*~deKFqm?c_Tyop}q z?WJ5DS|KrNr113=9R2+;9(Vw357kX~29LteRD1f%_lhusOD=S;#~u?~DTp(xYhZut zufQ4_^S7luq6dBklkR7zGQY|R`1{2?>ZPjE_-^aQ_1`ULX|n=Q{oD&KzBkA5?I2Hd z=uAk+GQm0#hfR6UWM}rXj{%#vfbZNXHicui z-3CT^L%x`u_~5a}ky^Fd(N(C3f&uH3pOm@QI#_q?0Q=d`#oBjLwk;~U@IU^WEZ?gb zuKftukM0u=L{iCB{tm^m{D-%{;=V7${!lZIdSXo#`}UR%>;9wE;tKR;E`VmwTXYv^ z=J%r*D7h{Z&tqak74ih%c_%or2#FC|?fLo}FxIYtP0qv{t_K!e2$*T0uMhU?uLJAW zf>91K=_yqy;EVTyQE>(x5E4ybzy1x3b?e-e346jg*nj#}x7w@nAoHL8492ESE?8_@ z0YYLY9$pV=f4twwS?XL{1MBX)Q|avm9()kS?!B;R@gae$t`3Zny~xj_VoGFn z*VPK9;KQ`MW5pPBpZo5EdH9G7Z=_7*Zn_z4$;DnlODQ1#`mZp^4d5Ks%{PHvafKI@ zYu3Vi=pisw^N@T}ZW@NSBg)ZvhSKWt50{b4+`V(>W-79&HsKB2_9-l-l|FY%+>IMI zdHS%?W8Wzc)4^B!DOvqZ%X%!D?RVbc4JWKx1@rMI@}*du+o~5))|owFJn*%z1@1J+ z+uC6K{6QGBVwJ!~Z1;(KK)RKCkhh!STJNnCB1xP_O7>U3D%XMO$MY}1_}%Xu1zOIs zV%KuznJLOoR5?#`+*l5D9bS6y;6W<$tM8wxT zACz|(inIq}p+ET|n5fI+9K0L@*rnil zo$@0F_To!02n0dquiD$<%H=X&$9M4lKHxWxz$CqfSY`Y;*i`#xY(CT{mgzk4gxHpV z0(M?8WLlVyaWZ+my**)K=Pd{A3;6KDuk$hl?~X zG(9|U3-B;->i|;muxBmHK0io@DV=c&hS#mvLyP=~No-n)`WJrz=w|c&{V;#{BN^Lr z){eXFqAd_e)O`MPfG5}~pT+m@1Ag-`jDsHwPqlT~WdK#7S7lZxWI^R)o_rc6rLk&F zv?opg|N7Ux3mOR-@4N$(;$ZGNcYpEBV$w3CIby9?0X}vN?6KoSts!&gPNywH&qtjHlV2N%gv%aAo7KI`1xWkj~Auc6wP~!TNPl|{+&2alqyg^an0(kN%n6#qRlS;}( zr854FZxrr@L1OipXJKyKC@OQPBQB>$09vCa^>2|!{gp3)kDnmF-?ba&Q%?!d3-J)- zAgv%faofu6-o8Pt$cWr@E($=T2f5y808O*zE#6#eJL9b{*%XgoN2GvSu)hB1z{H99 zitaQ>q<2vIDCs3sOK9vk*ki_k(}F$9BGf$7uJofihEG2YW7YfeUbGuCWhSbaR(m__ zhaQ5tZ@*Yl<<_#ObXwx|=EKVytoP;p{sop-66EN@2 zvSFPy7WNlDCvvvMLCc6XZh%R9)Kh~05QAt}>w2onLHbYZwwG}LQnjMVolA;zYpDPV zx-M8RaP%N2>P`y)?azElEXH$>Tn_xvM`ihwndgE}nk-jh5NHZXG7ro>yTKp)CCtuF zSrUd4>(wT@P5c zX^=unpk7GT*6QnEEm;DaR>o=xb7E=qrcE%PdRqFrh7d%%TGy-97qaY?%wcJ+YK%8Z^~S@enys`}B;2;S5PP%)~eMp-;PXd+NsH*P}e;YYwoKMV0S z#f?$i_q$rx(|RyvfvK&(i`sCGo>6GZ&t23C#){nbJFdBf-@Ceiv-(sx4KKf3tcmyJ z;6&V7q0jh2y zw?GMO{DvFAsL+FNkFq4%V4Ou7dyl?;7*uU!?YbdiA)ejU`hj8~& zV#AZYU_0Aj^!5l(u{~}q_-(fWlc#{~+Xw#IYcRI9!XU=bz$2|YXMZu;%hJgv6gkyY z7wFn+fcY2Z1Fs>9Z7g7PIi5s0CQ$3ad?9CQ-KGqKm+0Q0*fQP6Y@)J`9_p@5hcx z@zB#FmmE_hoho#Yh@+lvZi0Q&&A_?mh^iV?xr`k;BB)mBJgTZ|Ub-tz@D?Dq8kar-Of=H;) zEwSk{&iibtrtzOjY@4_&UPqF5_gG`9N|>`Sk8}jPxlx+41eC$7*q2LKD-QJ40zFk+ zQ@95xQ}LpUfR*owHRz0%B`Z_it*)U~aO88B-3g-HdQ98-er7$QH(ox9$ z?-|u!;ysfvkGcsd2iNS`}r(bh`%A>w9a z7>Lv&JrZl4Lj_#j4}IGr&_GcV8rATj4S6--ILrB5pAsXH<*Se&L6o-;$xALk>C{l9 zy*1dyi-9?F!J3=pDiLSZX(WJ(oQ<@tgYY@6B86YtI+YS*P6&e*Pmlr~Yk?&JP=O^j zbN0e_V3=;yF)5=I*-!531zC2^yD%?$8z!eRy_ng4q7BGDcF&Uo;UA3r`)Nyy$iL%O zw3k2%7* z1^>heC&*hl05S0Pw$=}p23TMPLDVE7jLs>r#HP=@U|p)JI<{tX5{5|zD!q20Rx3yn zf;>EeSpGr(m*OGdDW2={as0TMEWP9!6FH*Qk-3tQgm`nnM4+KHW>g-prdEo$`g&P( zytY;rA+MS~`dVjmK5DMRcs&7>MHSy#9p5X_)z`uYxCh;jf?S8rbG662pwhr3c(E7@E~1;QZ1$DCZJWO8_2alxiPfzlWikS-8skAq7 zXM6>LqwZO)|4%xT>h8B-L{yi^S7Yl5>h`;7K^y$__law{7cRIqajB z@FWsnNf}6;r(0uUC&Mx0rp#?@9{yw$3q|QjrSy;geqkH21&P)qej;^UQfB#m1dVz} zis$urow)7r;r$zY>=U>KENHxvGLQn15@Rk4O__H7-&WPs{!!9^VC6bIo)HQ`R2*cJ zwl(Q_#XWtf&*sQx27a}FS1T1zP`XcK{&OV&zkH;>dx$H}&^-Q>H$NuE+(1VSQ5!1JON{Pl%Lh#X=2J z&Yt-xv%2XH!`#Wa3`r2Zhi(!nDgl*J77W$py=S5N-r&yinQ~;uwXVQCHxy+0E+O~XC0}sW$ z$nr|8`>1Ee_jF`#p*792#ljT(#mBq(A)K;!yoT^R|5}O zT}pHXuKS7`h*B6x*M(HdD=F0E8zOO5KVj0@x2J3B|32kg_7c|^{rg}hNZ#CHnWWhB zi+Pt*eQqw7MK06xcL(?FdBU-_hq5FH^MGjFxT%*`H#Gdf z)JwsY(37PyO|fjFE6XJ`^R&D~D$H4A`g{KT(80ZLI^ZFlN15#UKBy&$h;jg=m`M4C zlxeS+sBX-J$qQ?18vo8rrzR>BKbcOFyji6(N2%AHmPiR`lqeHuW%m#Ccl~|)!H?Ex z;8Dz@z*CawQjbhNQsF(P^da3#O&}6Ls;Q|Ne%8e4-!cs2YLj*m4A7j*VHv;JD|UeY zkn|j-Yg$x0z_wmKa&Y%Q4Gat%cfdoy2?9@93TmYQM2+w>5h>OLBJq3Tq#1V@RaIX# zO>>w*Kq~P_#$e$$|HA`J{$0gR)K;#;&Sma9uy5z%07ywzz@dLDok#cglq9+;$w0bN zt?NW&osnMT0;#5^e#Gdp6TZY!Rd<`FiE=#Gr2?VU>q^A?Nx4kaP@;v7cJ7h(k3YJ9 zV4#=k|0(b&;E=VYi>QILa zO}PwpQbxQ2525!IiyEmQgq?k^yQA~JPMkQr!(kZ$jRFp_4grT)M=z347V``RfE0+7 zIMYQMv60S51gNU!;ln324I6!j!OZKKX|~WBcAb?f!4{RcM+L^aVz&?r7zN|lCpfoW z=ub>&*IkzynrQ1n^)tO--DPN!?G zWQKXU*eFhH7N@G7M(Z?{%)zc?M^xfof@x^2m|z>)f7N~?n;m%d&_{b-c9@0Og@B^~ zq(I|m9R-?-foG@yq_dk!hgEE(14)61ehUy$b^Mx|nucK`M=z_cuDuw{Tm%>+2p|GX zqJXz|E68%Kuu2SaCGR1@;($h&r}i<#|H_V|N8TP77@)LM5=R6O`XRumAN83o zu9SnYqQDs{5$5kpW#uV0(t)JFM87>Ca<*BZ&&`&WkyGlLnrAa3HN!BBSscc>08c4) z5~ZM=3T4G+0#tI~i@BE)tHdg5&oY^W&uB6HHg4Nnxs~0~*WI=8#EGMO9NmRLp?(xl z^xx_`rRV7Wogo3wP&1I;r;3UEj6}X80*d}4m`Dealh9A+ihQKT#$luD8XBjj(p8h0 zVUm;be9kcnj15;?XbUj86+0Xp`xfPi4sabA#dF*$zmWsi2T-? zN>C$k=syZT{?FCl>N>?}is2Z6tGc0nbSjk^Z6ZAkCTn2KsArtlGiD684c5pw{qRN( zRs|+@TQz9E9;!0Mz=iT<+qS_RdC57q4a1=F9AZ~iQbec}HQ7Pn%x2&j&R92RyxXvO zH|O?o4%WwE_rT&k7P1|=T&{hvr}wY}5;e$*C3M!%fujS6{;h*WeWw8D7ga+Jo|DNy zVL(!CARy>Uw*rP@9UV9>6FH#M!KB~E&wA=_9mJLB16?`Q1CsiHs(&lMs6p3%D-h|w zb&&W$raDKn5PqNp{p~W5BksaLSdro)QS4@*5)S3q>dJ4koZ0j2}S|9KpEf}UAy`~9Y|A2@VB#X5c# z@`FM@&wq^{q^g~#1T;b7q}Yxd%Jco&tRGN8BB&T~rQfgIiR4kCeTr+4P7=gSbXnNB z>N~x^PdR8#cK}6+x}X8~10wG4IM5_9$HE5D&qz7|g4oK>BtiE*tpJl`aE6jyDs}Iu zK@MZElQD6U03Zqwr!`oD1~18MtJI*Mtoxkq@AP{IlBj_@-8=haf$q$6O6-9%04lNL e&RiyY;Qs@6Qw_W+ro*HF0000?v diff --git a/public/icon.svg b/public/icon.svg new file mode 100644 index 0000000..c9614f9 --- /dev/null +++ b/public/icon.svg @@ -0,0 +1,15 @@ + + + + 読 + + diff --git a/scripts/build-plugin-manifest.js b/scripts/build-plugin-manifest.js index a19ecbb..35d2dd2 100644 --- a/scripts/build-plugin-manifest.js +++ b/scripts/build-plugin-manifest.js @@ -19,7 +19,7 @@ const USER_CONTENT_LINK = process.env.USER_CONTENT_BASE : `https://raw.githubusercontent.com/${USERNAME}/${REPO}/${CURRENT_BRANCH}`; const STATIC_LINK = `${USER_CONTENT_LINK}/public/static`; -const PLUGIN_LINK = `${USER_CONTENT_LINK}/.js/src/plugins`; +const PLUGIN_LINK = `${USER_CONTENT_LINK}/.js/plugins`; const DIST_DIR = '.dist'; @@ -83,7 +83,7 @@ const proxy = createRecursiveProxy(); const _require = () => proxy; -const COMPILED_PLUGIN_DIR = './.js/src/plugins'; +const COMPILED_PLUGIN_DIR = './.js/plugins'; for (let language in languages) { console.log( @@ -204,7 +204,7 @@ if (!ONLY_NEW) // check for broken plugins for (let language in languages) { const tsFiles = fs.readdirSync( - path.join('./src/plugins', language.toLocaleLowerCase()), + path.join('./plugins', language.toLocaleLowerCase()), ); tsFiles .filter(f => f.endsWith('.broken.ts')) diff --git a/scripts/generate-plugin-index.js b/scripts/generate-plugin-index.js index 4e2a5ae..7f19c22 100644 --- a/scripts/generate-plugin-index.js +++ b/scripts/generate-plugin-index.js @@ -1,18 +1,18 @@ import fs from 'fs'; import { execSync } from 'child_process'; -let content = `import { Plugin } from '@typings/plugin';\n`; +let content = `import { Plugin } from '@/types/plugin';\n`; let pluginCounter = 0; -const PLUGIN_DIR = 'src/plugins'; +const PLUGIN_DIR = 'plugins'; fs.readdirSync(PLUGIN_DIR) - .filter(f => !f.includes('index')) + .filter(f => !f.includes('index') && f !== 'multisrc') .forEach(langName => { const LANG_DIR = PLUGIN_DIR + '/' + langName; fs.readdirSync(LANG_DIR) .filter(f => !f.includes('broken') && !f.startsWith('.')) .forEach(pluginName => { - content += `import p_${pluginCounter} from './${langName}/${pluginName.replace(/\.ts$/, '')}';\n`; + content += `import p_${pluginCounter} from '@plugins/${langName}/${pluginName.replace(/\.ts$/, '')}';\n`; pluginCounter += 1; }); }); @@ -22,7 +22,7 @@ content += `\nconst PLUGINS: Plugin.PluginBase[] = [${Array(pluginCounter) .map((v, index) => 'p_' + index.toString()) .join(', ')}];\nexport default PLUGINS`; -const outputPath = './src/plugins/index.ts'; +const outputPath = './plugins/index.ts'; fs.writeFileSync(outputPath, content, { encoding: 'utf-8' }); execSync(`npx prettier --write ${outputPath}`, { stdio: 'inherit' }); diff --git a/scripts/publish-plugins.ps1 b/scripts/publish-plugins.ps1 index 846dc49..18a80fd 100644 --- a/scripts/publish-plugins.ps1 +++ b/scripts/publish-plugins.ps1 @@ -29,7 +29,7 @@ if (-not (Test-Path .dist) -or -not (Get-ChildItem -Path .dist -Force)) { exit 1 } -git add -f public/static .dist .js/src/plugins total.svg +git add -f public/static .dist .js/plugins total.svg git commit -m "chore: Publish Plugins" git push -f origin $dist diff --git a/scripts/publish-plugins.sh b/scripts/publish-plugins.sh index de555ef..e5721a1 100755 --- a/scripts/publish-plugins.sh +++ b/scripts/publish-plugins.sh @@ -8,17 +8,20 @@ current=`git rev-parse --abbrev-ref HEAD` version=`node -e "console.log(require('./package.json').version);"` dist="plugins/v$version" +echo "Publishing plugins: $current -> $dist (v$version)" + if [[ "$1" == "--all-branches" ]]; then rm -rf .dist .js git fetch --all branches=$(git branch -r | grep -v '\->') for branch in $branches; do - # Check if the branch has the same version of publish-plugins.sh as the current branch + # Skip branches with different publish-plugins.sh version if ! diff scripts/publish-plugins.sh <(git show "$branch:scripts/publish-plugins.sh") >/dev/null; then - echo "Branch $branch does not have the current version of publish-plugins.sh. Skipping." + echo "⚠️ Skipping $branch (script version mismatch)" continue fi echo "::group::Branch $branch" + echo "Processing: $branch" git stash push -a -- .dist .js git checkout -f $branch exists=`git show-ref refs/heads/$dist` @@ -28,30 +31,36 @@ if [[ "$1" == "--all-branches" ]]; then git stash pop npm run clean:multisrc npm run build:multisrc + echo "Compiling TypeScript..." npx tsc --project tsconfig.production.json echo "# $branch" >> $GITHUB_STEP_SUMMARY npm run build:manifest -- --only-new 2>> $GITHUB_STEP_SUMMARY if [ ! -d ".dist" ] || [ -z "$(ls -A .dist)" ]; then - echo "==========" - echo "JSON files were not generated! See the error above and fix it!" + echo "❌ ERROR: Manifest generation failed - .dist is missing or empty" + exit 1 fi + echo "✅ Done: $branch" echo "::endgroup::" done echo echo "::group::Publish All Branches" + echo "Publishing combined plugins..." git checkout --orphan $dist if [ $? -eq 1 ]; then - # If checkout failed - echo "==========" - echo "Could not checkout branch dist! See the error above and fix it!" + echo "❌ ERROR: Failed to create branch $dist" echo "::endgroup::" exit 1 fi git reset - git add -f public/static .dist .js/src/plugins total.svg + # Copy plugins to legacy path (.js/src/plugins) for backward compatibility + echo "Copying .js/plugins -> .js/src/plugins (backward compatibility)" + mkdir -p .js/src + cp -r .js/plugins .js/src/plugins + git add -f public/static .dist .js/plugins .js/src/plugins total.svg git commit -m "chore: Publish Plugins From All Branches" git push -f origin $dist git checkout -f $branch + echo "✅ Published all branches to $dist" echo "::endgroup::" exit 0 fi @@ -65,9 +74,7 @@ fi git checkout --orphan $dist 2>&1 if [ $? -eq 1 ]; then - # If checkout failed - echo "==========" - echo "Could not checkout branch dist! See the error above and fix it!" + echo "❌ ERROR: Failed to create branch $dist" exit 1 fi @@ -75,17 +82,22 @@ git reset rm -rf .js npm run clean:multisrc npm run build:multisrc +echo "Compiling TypeScript..." npx tsc --project tsconfig.production.json npm run build:manifest if [ ! -d ".dist" ] || [ -z "$(ls -A .dist)" ]; then - echo "==========" - echo "JSON files were not generated! See the error above and fix it!" + echo "❌ ERROR: Manifest generation failed - .dist is missing or empty" exit 1 fi -git add -f public/static .dist .js/src/plugins total.svg +# Copy plugins to legacy path (.js/src/plugins) for backward compatibility +echo "Copying .js/plugins -> .js/src/plugins (backward compatibility)" +mkdir -p .js/src +cp -r .js/plugins .js/src/plugins +git add -f public/static .dist .js/plugins .js/src/plugins total.svg git commit -m "chore: Publish Plugins" git push -f origin $dist 2>&1 git checkout -f $current 2>&1 +echo "✅ Published to $dist" diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 503364d..0000000 --- a/src/App.css +++ /dev/null @@ -1,46 +0,0 @@ -#root { - margin: 0 auto; - text-align: center; - width: 100vw; - padding-bottom: 40px; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} - -button:focus { - outline: none !important; -} diff --git a/src/App.tsx b/src/App.tsx index 08d05f4..68a0634 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,53 +1,16 @@ import React from 'react'; -import './App.css'; -import { - Container, - createTheme, - CssBaseline, - StyledEngineProvider, - ThemeProvider, -} from '@mui/material'; -import Appbar from '@components/Appbar'; -import AppProvider from './provider'; -import PopularNovels from '@components/accordions/PopularNovels'; -import SearchNovels from '@components/accordions/SearchNovels'; -import ParseNovel from '@components/accordions/ParseNovel'; -import ParseChapter from '@components/accordions/ParseChapter'; -import HeadersSection from '@components/accordions/Headers'; +import { Toaster } from '@/components/ui/sonner'; +import Home from './pages/home'; +import { TooltipProvider } from './components/ui/tooltip'; function App() { - const theme = createTheme({ - components: { - // Name of the component - MuiButtonBase: { - defaultProps: { - // The props to change the default for. - disableRipple: true, // No more ripple, on the whole application 💣! - }, - }, - }, - }); return ( - - - - - - - - - - - - - - - +
+ + + + +
); } diff --git a/src/components/Appbar/index.tsx b/src/components/Appbar/index.tsx deleted file mode 100644 index 1b9bea2..0000000 --- a/src/components/Appbar/index.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import AppBar from '@mui/material/AppBar'; -import Box from '@mui/material/Box'; -import Toolbar from '@mui/material/Toolbar'; -import { - Avatar, - Backdrop, - FormControl, - InputAdornment, - Link, - ListItem, - ListItemAvatar, - ListItemButton, - ListItemText, - TextField, - Typography, -} from '@mui/material'; -import { Search } from '@mui/icons-material'; -import { searchPlugins } from '@provider/plugins'; -import { Plugin } from '@typings/plugin'; -import { FixedSizeList, ListChildComponentProps } from 'react-window'; -import { useAppStore } from '@store'; - -const resovleIcon = (iconPath: string) => { - return '/static/' + iconPath; -}; - -function renderPlugin(setListVisible: (v: boolean) => void) { - return function (props: ListChildComponentProps) { - const { index, style, data } = props; - const plugin = data[index]; - const { selectPlugin, pluginItem } = useAppStore(state => state); - - return ( - - { - selectPlugin({ - id: plugin.id, - name: plugin.name, - version: plugin.version, - icon: plugin.icon, - site: plugin.site, - }); - setListVisible(false); - }} - > - - - - - - - ); - }; -} - -export default function Appbar() { - const [searchedPlugins, setSearchPlugins] = useState([]); - const [keyword, setKeyword] = useState(''); - const [listVisible, setListVisible] = useState(false); - - const plugin = useAppStore(state => state.plugin); - - useEffect(() => { - const plugins = searchPlugins(keyword); - setSearchPlugins(plugins); - }, [keyword]); - - return ( - - - - setKeyword(e.target.value)} - InputProps={{ - startAdornment: ( - - - - ), - }} - fullWidth - autoComplete="off" - onFocus={() => { - setListVisible(true); - if (searchedPlugins.length === 0) - setSearchPlugins(searchPlugins(keyword)); - }} - /> - {listVisible ? ( - - {renderPlugin(setListVisible)} - - ) : null} - - setListVisible(false)} - sx={{ zIndex: 9 }} - invisible={true} - /> - {plugin ? ( - - - - {plugin.name} - v{plugin.version} - - - ) : null} - - - ); -} diff --git a/src/components/CopiableItem.tsx b/src/components/CopiableItem.tsx deleted file mode 100644 index 2bd45c9..0000000 --- a/src/components/CopiableItem.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React, { ReactNode, useEffect, useState } from 'react'; -import Alert from '@mui/material/Alert'; - -export default function CopiableItem({ - content, - children, -}: { - content?: string; - children: ReactNode; -}) { - const [alertVisible, setAlertVisble] = useState(false); - useEffect(() => { - if (alertVisible) { - setTimeout(() => setAlertVisble(false), 1000); - } - }, [alertVisible]); - return ( -
{ - if (content) { - navigator.clipboard.writeText(content).then(() => { - setAlertVisble(true); - }); - } - }} - > - {alertVisible ? ( - theme.zIndex.tooltip + 1, - }} - severity="success" - > - Copied - - ) : null} - {children} -
- ); -} diff --git a/src/components/PathItem.tsx b/src/components/PathItem.tsx deleted file mode 100644 index da5aa88..0000000 --- a/src/components/PathItem.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { Box, Button, Tooltip } from '@mui/material'; -import { createTheme, ThemeProvider } from '@mui/material/styles'; -import React from 'react'; -import CopiableItem from './CopiableItem'; - -type Validation = { - type?: 'error' | 'warning'; - message?: string; -}; - -const validatePath = (path: string): Validation => { - if (path.includes('http')) - return { - type: 'error', - message: 'Path must be relative, please remove the domain', - }; - if (/^\/|\/$/.test(path)) { - return { - type: 'warning', - message: 'your path should not contain leading or trailing "/"', - }; - } - return {}; -}; - -export default function PathItem({ path }: { path: string }) { - const validation = validatePath(path); - const errorTheme = createTheme({ - components: { - MuiTooltip: { - styleOverrides: { - tooltip: { - color: '#FFF', - backgroundColor: '#BA000D', - }, - }, - }, - }, - }); - const warningTheme = createTheme({ - components: { - MuiTooltip: { - styleOverrides: { - tooltip: { - color: '#FFF', - backgroundColor: 'orange', - }, - }, - }, - }, - }); - const ValidateWrapper = validation.type ? Tooltip : Box; - return ( - - - - - - - - - - - - - - ); -} diff --git a/src/components/StyledSwitch.tsx b/src/components/StyledSwitch.tsx deleted file mode 100644 index 2611e0f..0000000 --- a/src/components/StyledSwitch.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { styled, Switch } from '@mui/material'; - -export const StyledSwitch = styled(Switch)(() => ({ - padding: 8, - '& .MuiSwitch-track': { - borderRadius: 22 / 2, - }, - '& .MuiSwitch-thumb': { - boxShadow: 'none', - width: 16, - height: 16, - margin: 2, - }, -})); diff --git a/src/components/Textarea.tsx b/src/components/Textarea.tsx deleted file mode 100644 index f42dee5..0000000 --- a/src/components/Textarea.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { styled, TextareaAutosize } from '@mui/material'; - -const blue = { - 100: '#DAECFF', - 200: '#b6daff', - 400: '#3399FF', - 500: '#007FFF', - 600: '#0072E5', - 900: '#003A75', -}; - -const grey = { - 50: '#F3F6F9', - 100: '#E5EAF2', - 200: '#DAE2ED', - 300: '#C7D0DD', - 400: '#B0B8C4', - 500: '#9DA8B7', - 600: '#6B7A90', - 700: '#434D5B', - 800: '#303740', - 900: '#1C2025', -}; - -const Textarea = styled(TextareaAutosize)( - ({ theme }) => ` - box-sizing: border-box; - width: 320px; - font-family: 'IBM Plex Sans', sans-serif; - font-size: 0.875rem; - font-weight: 400; - line-height: 1.5; - padding: 8px 12px; - border-radius: 8px; - color: ${theme.palette.mode === 'dark' ? grey[300] : grey[900]}; - background: ${theme.palette.mode === 'dark' ? grey[900] : '#fff'}; - border: 1px solid ${theme.palette.mode === 'dark' ? grey[700] : grey[200]}; - box-shadow: 0px 2px 2px ${theme.palette.mode === 'dark' ? grey[900] : grey[50]}; - - &:hover { - border-color: ${blue[400]}; - } - - &:focus { - border-color: ${blue[400]}; - box-shadow: 0 0 0 3px ${theme.palette.mode === 'dark' ? blue[600] : blue[200]}; - } - - // firefox - &:focus-visible { - outline: 0; - } - `, -); - -export default Textarea; diff --git a/src/components/accordions/Headers/index.tsx b/src/components/accordions/Headers/index.tsx deleted file mode 100644 index eecb149..0000000 --- a/src/components/accordions/Headers/index.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import AccordionContainer from '../components/AccordionContainer'; -import { - Alert, - Box, - InputAdornment, - MenuItem, - Select, - TextField, - Tooltip, -} from '@mui/material'; -import Checkbox from '@mui/material/Checkbox'; -import useDebounce from '@hooks/useDebounce'; -import { FetchMode } from '@typings/types'; - -export default function HeadersSection() { - const [loading, setLoading] = useState(false); - const [cookies, setCookies] = useState(''); - const debounceCookies = useDebounce(cookies, 500); - const [fetchMode, setFetchMode] = useState(FetchMode.PROXY); - const [alertVisible, setAlertVisble] = useState(false); - const [useUserAgent, setUseUserAgent] = useState(true); - useEffect(() => { - if (alertVisible) { - const id = setTimeout(() => setAlertVisble(false), 1000); - return () => clearTimeout(id); - } - }, [alertVisible]); - - useEffect(() => { - setLoading(true); - fetch('settings', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - cookies: debounceCookies, - fetchMode: fetchMode, - useUserAgent, - }), - }) - .then(() => setAlertVisble(true)) - .finally(() => setLoading(false)); - }, [debounceCookies, fetchMode, useUserAgent]); - - return ( - - {alertVisible ? ( - - Settings updated - - ) : null} - - - User Agent - ), - }, - }} - disabled - value={navigator.userAgent} - sx={{ width: '100%' }} - /> - - setUseUserAgent(e.target.checked)} - /> - - - Cookies - ), - }, - }} - value={cookies} - onChange={e => { - setCookies(e.target.value.trim()); - }} - sx={{ width: '100%' }} - /> - -
- Fetch Mode: - -
-
- ); -} diff --git a/src/components/accordions/ParseChapter/index.tsx b/src/components/accordions/ParseChapter/index.tsx deleted file mode 100644 index 7ce0bc9..0000000 --- a/src/components/accordions/ParseChapter/index.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { Box, Button, Stack, TextField } from '@mui/material'; -import React, { useState } from 'react'; -import AccordionContainer from '../components/AccordionContainer'; -import Textarea from '@components/Textarea'; -import { useAppStore } from '@store'; -export default function ParseChapter() { - const plugin = useAppStore(state => state.plugin); - const [loading, setLoading] = useState(false); - const [chapterPath, setchapterPath] = useState(''); - const [chapterText, setChapterText] = useState(''); - const fetchChapter = () => { - if (plugin) { - setLoading(true); - plugin - .parseChapter(chapterPath) - .then(res => setChapterText(res)) - .finally(() => setLoading(false)); - } - }; - return ( - - - setchapterPath(e.target.value)} - size="small" - label="Chapter path" - /> - - - - {chapterText ? ( -