diff --git a/.gitignore b/.gitignore index e95f42a..ae4cf7b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # generated types -source/.astro -source/node_modules +web/.astro +web/node_modules .minpluto/generated # dependencies @@ -13,16 +13,16 @@ yarn-error.log* pnpm-debug.log* # environment variables -source/.env -source/.env.production +web/.env +web/.env.production # macOS-specific files .DS_Store # i18n -/source/src/pages/en/ -/source/src/pages/jp/ -/source/src/pages/ru/ +/web/src/pages/en/ +/web/src/pages/jp/ +/web/src/pages/ru/ # other .minpluto/docker/supabase/.env diff --git a/.minpluto/docker/supabase/.env b/.minpluto/docker/supabase/.env deleted file mode 100755 index b675925..0000000 --- a/.minpluto/docker/supabase/.env +++ /dev/null @@ -1,107 +0,0 @@ -########### -# Docker Volumes -# All folders provided in `./supabase-volume/` must be included -########### -SUPABASE_ENTIRE_VOLUME="./supabase-volume/" - -############ -# Secrets -# YOU MUST CHANGE THESE BEFORE GOING INTO PRODUCTION -############ - -POSTGRES_PASSWORD=5lgHamV44d8D1GN9LRS6b44VxREi4692 -JWT_SECRET=paxDX2xE00qFa4I1r6PKe15nIkB089I4 -ANON_KEY=9X43H6LKq3115zmZhZj95f2IJ104a603 -SERVICE_ROLE_KEY=K2G792rYBZR0kZvw9Zp6182zAwzxsdas -DASHBOARD_USERNAME=mp_admin -DASHBOARD_PASSWORD=ez116oqVWd4wHZUQNbgW3fA0m958FN09 - -############ -# Database - You can change these to any PostgreSQL database that has logical replication enabled. -############ - -# default user is postgres -POSTGRES_HOST=db -POSTGRES_DB=postgres -POSTGRES_PORT=1945 - -############ -# API Proxy - Configuration for the Kong Reverse proxy. -############ - -KONG_HTTP_PORT=1942 -KONG_HTTPS_PORT=1943 - -############ -# API - Configuration for PostgREST. -############ - -PGRST_DB_SCHEMAS=public,storage,graphql_public - -############ -# Auth - Configuration for the GoTrue authentication server. -############ - -## General -SITE_URL=http://localhost:1930 -ADDITIONAL_REDIRECT_URLS= -JWT_EXPIRY=3600 -DISABLE_SIGNUP=false -API_EXTERNAL_URL=https://db.minpluto.org - -## Mailer Config -MAILER_URLPATHS_CONFIRMATION="/auth/v1/verify" -MAILER_URLPATHS_INVITE="/auth/v1/verify" -MAILER_URLPATHS_RECOVERY="/auth/v1/verify" -MAILER_URLPATHS_EMAIL_CHANGE="/auth/v1/verify" - -## Email auth -ENABLE_EMAIL_SIGNUP=true -ENABLE_EMAIL_AUTOCONFIRM=false -SMTP_ADMIN_EMAIL=no-reply@sudovanilla.org -SMTP_HOST=smtp.resend.com -SMTP_PORT=587 -SMTP_USER=resend -SMTP_PASS=re_XLbiDxHd_9Yucx4y9EwiacKgHrRowfJVU -SMTP_SENDER_NAME=MinPluto -ENABLE_ANONYMOUS_USERS=true - -## Phone auth -ENABLE_PHONE_SIGNUP=false -ENABLE_PHONE_AUTOCONFIRM=false - -############ -# Studio - Configuration for the Dashboard -############ - -STUDIO_DEFAULT_ORGANIZATION=Default Organization -STUDIO_DEFAULT_PROJECT=Default Project - -STUDIO_PORT=1944 -SUPABASE_PUBLIC_URL=http://localhost:8000 - -# Enable webp support -IMGPROXY_ENABLE_WEBP_DETECTION=true - -############ -# Functions - Configuration for Functions -############ -# NOTE: VERIFY_JWT applies to all functions. Per-function VERIFY_JWT is not supported yet. -FUNCTIONS_VERIFY_JWT=false - -############ -# Logs - Configuration for Logflare -# Please refer to https://supabase.com/docs/reference/self-hosting-analytics/introduction -############ - -LOGFLARE_LOGGER_BACKEND_API_KEY=your-super-secret-and-long-logflare-key - -# Change vector.toml sinks to reflect this change -LOGFLARE_API_KEY=your-super-secret-and-long-logflare-key - -# Docker socket location - this value will differ depending on your OS -DOCKER_SOCKET_LOCATION=/var/run/docker.sock - -# Google Cloud Project details -GOOGLE_PROJECT_ID=GOOGLE_PROJECT_ID -GOOGLE_PROJECT_NUMBER=GOOGLE_PROJECT_NUMBER \ No newline at end of file diff --git a/.minpluto/docs/Compatibility.md b/.minpluto/docs/Compatibility.md index daeb7e1..34217a4 100644 --- a/.minpluto/docs/Compatibility.md +++ b/.minpluto/docs/Compatibility.md @@ -50,6 +50,7 @@ Cloudflare Pages | 🔘 | 🔘 | | Mullvad | ✅ | ❌ | ✅ | ✅ | 🔘 | 🔘 | | Tor | 🔘 | 🔘 | 🔘 | 🔘 | 🔘 | 🔘 | | Waterfox | ✅ | ✅ | ✅ | ✅ | 🔘 | 🔘 | +| Zen | ✅ | ✅ | ✅ | ✅ | 🔘 | 🔘 | | **Outdated Browsers**| | Internet Explorer | ❌ | ✅ | ❌ | ✅ | 🔘 | 🔘 | diff --git a/.minpluto/docs/TODO.md b/.minpluto/docs/TODO.md index e6d01b9..cbc2a24 100644 --- a/.minpluto/docs/TODO.md +++ b/.minpluto/docs/TODO.md @@ -1,41 +1,35 @@ ## To Do - [ ] i18n - - [x] API + - [ ] API - [ ] Languages - - [x] English + - [ ] English - [ ] Japanese - [ ] French - [ ] Spanish - [ ] Russian - - [x] Data - - [x] Track Events (Users should be opted-out by default, OpenPanel will be used) - - [x] Make privacy policy adaptive - - [x] Mobile Support - - [ ] Server Configuration (.env) - - [ ] Quality - - [ ] Allow 1080p - - [ ] Allow 4K - - [ ] Allow 8K - - [ ] Account System (Based on [Account System Demo](https://ark.sudovanilla.org/MinPluto/Account-System-Demo)) - - [x] Use Supabase Library + - [ ] Data + - [ ] Track Events + - [ ] Make privacy policy adaptive + - [ ] Account System + - [ ] Use Supabase Library - [ ] Create Pages: - [ ] Subscription Feed - - [ ] History (Maybe, maybe not) - - [x] Login - - [x] Register - - [x] Account + - [ ] History + - [ ] Login + - [ ] Register + - [ ] Account - [ ] Preferences - [ ] Delete - [ ] Anomymous Account Creation - - [x] Email Confirmation Code + - [ ] Email Confirmation Code - [ ] Ability to: - [ ] Update Data - - [x] Username + - [ ] Username - [ ] Email - [ ] Pasword - [ ] Delete Account - [ ] API - - [x] `/api/update/name` + - [ ] `/api/update/name` - [ ] `/api/update/email` - [ ] `/api/update/password` - [ ] `/api/update/preference/ui/theme` @@ -48,17 +42,17 @@ - [ ] `/api/update/preference/instance/invidious/data` - [ ] `/api/update/preference/instance/safetwitch/media` - [ ] `/api/update/preference/instance/safetwitch/data` - - [x] `/api/auth/login` - - [x] `/api/auth/register` + - [ ] `/api/auth/login` + - [ ] `/api/auth/register` - [ ] `/api/auth/delete` - - [x] `/api/auth/confirm` - - [x] `/api/auth/logout` + - [ ] `/api/auth/confirm` + - [ ] `/api/auth/logout` - [ ] `/api/anon/create` - [ ] `/api/anon/delete` - [ ] `/api/anon/signout` - [ ] `/api/subscription/add` - [ ] `/api/subscription/remove` - - [ ] Revamp Design and Layout ([UI Library Repo](https://ark.sudovanilla.org/MinPluto/UI-Library/)) + - [ ] Revamp Design and Layout - [ ] Use Header over Sidebar - [ ] Generic - [ ] Dropdown @@ -68,7 +62,7 @@ - [ ] Radio Buttons - [ ] Toast - [ ] Tooltip - - [ ] Hovercard (For Creators) [Example](https://www.radix-vue.com/components/hover-card) + - [ ] Hovercard (For Creators) - [ ] Scrollable Areas - [ ] KBD - [ ] Empty State @@ -91,24 +85,24 @@ - [ ] Discovery Pages - [ ] Animation - [ ] Automotive - - [x] Comedy + - [ ] Comedy - [ ] Courses - [ ] Educational - [ ] Family Friendly - [ ] Fashion - [ ] Fitness - [ ] Food - - [x] Games + - [ ] Games - [ ] Music - [ ] News - [ ] Podcasts - [ ] Science - [ ] Sports - - [x] Tech + - [ ] Tech - [ ] Web Series - [ ] Twitch Support - - [x] API - - [x] Video Player HLS Support (Required to play streams) + - [ ] API + - [ ] Video Player HLS Support - [ ] Polycentric Chat - [ ] Categories - [ ] Games @@ -128,12 +122,12 @@ - [ ] Search - [ ] Revamp Experience - [ ] Filters - - [x] Auto Complete + - [ ] Auto Complete - [ ] Video Player - - [x] Dash Format (1080p/4K/8K) + - [ ] Dash Format - [ ] 360° Support - [ ] Mobile Gestures - - [x] Embed Page + - [ ] Embed Page - [ ] Download - [ ] Share - [ ] Report @@ -146,8 +140,6 @@ - [ ] Theater Mode - [ ] Cast - [ ] Video Page - - [ ] ~~Important Infomation Card ([Example](https://img.sudovanilla.org/pXqzT10.png))~~ Controversial, do not proceed - - [ ] Viewers Note (Like Community Notes, in [experimental phase at YouTube](https://blog.youtube/news-and-events/new-ways-to-offer-viewers-more-context/)) - [ ] Toggle: - [ ] Audio Only - [ ] Autoplay @@ -168,4 +160,14 @@ - [ ] Import/Export MinPluto User Settings - [ ] Feed Page - [ ] Universal Feed (YouTube and Twitch) - - [ ] Subscription Management \ No newline at end of file + - [ ] Subscription Management + - [ ] Frontend Support (Replace official links to frontend alternatives) + - [ ] YouTube (Just use current instance) + - [ ] Twitch (Just use current instance) + - [ ] X + - [ ] Reddit + - [ ] Medium + - [ ] Quora + - [ ] StackOverflow + - [ ] Wikipedia + - [ ] Imgur \ No newline at end of file diff --git a/README.md b/README.md index 4e54851..2d6c255 100755 --- a/README.md +++ b/README.md @@ -6,14 +6,14 @@ MinPluto is a modern privacy frontend for YouTube and Twitch giving your persona ___ ## Docs - - [FAQ](/.minpluto/docs/FAQ.md) - - [API](/.minpluto/docs/API.md) - - [Requirements](/.minpluto/docs/Requirements.md) - - [Compatibility](/.minpluto/docs/Compatibility.md) + - [FAQ](./.minpluto/docs/FAQ.md) + - [API](./.minpluto/docs/API.md) + - [Requirements](./.minpluto/docs/Requirements.md) + - [Compatibility](./.minpluto/docs/Compatibility.md) - Develop, Build, Run - Selfhosting - Player ___ -MinPluto is inspired by [Poke](https://poketube.fun/), Poke is a project by [Ashley](https://codeberg.org/ashley). \ No newline at end of file +MinPluto is inspired by [Poke](https://poketube.fun/), a project by [Ashley](https://codeberg.org/ashley). \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 5f642a1..ccfba6c 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/bunfig.toml b/bunfig.toml new file mode 100644 index 0000000..66ec787 --- /dev/null +++ b/bunfig.toml @@ -0,0 +1,3 @@ +# Flurry and Zorn are on SudoVanilla Packages +[install] +registry = "https://npm.sudovanilla.org" \ No newline at end of file diff --git a/package.json b/package.json index 4f02cfc..9ef9a23 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "minpluto", - "version": "24.10.30", + "version": "24.09.07", "description": "An open source frontend alternative to YouTube and Twitch.", "repository": "https://ark.sudovanilla.org/MinPluto/MinPluto", "author": "Korbs ", @@ -18,38 +18,32 @@ "keywords": [ "privacy", "frontend", - "proxy", + "downloader", "ytdl", "invidious", "safetwitch", + "youtube", "twitch", - "live", - "stream" + "astro", + "proxy", + "anonymous" ], "scripts": { - "start": "astro dev --config ./source/astro.mjs --host", - "translate": "astro-i18next --config ./source/astro-i18next.config.mjs generate", - "build": "astro build --config ./source/astro.js" + "start": "astro dev --config ./web/astro.mjs --host", + "translate": "astro-i18next --config ./web/astro-i18next.config.mjs generate", + "build": "astro build --config ./web/astro.mjs" }, "dependencies": { - "@astrojs/mdx": "^3.1.8", - "@astrojs/node": "^8.3.4", - "@astrojs/vue": "^4.5.2", - "@iconoir/vue": "^7.9.0", + "@astrojs/mdx": "^3.1.5", + "@astrojs/node": "^8.3.3", + "@astrojs/vue": "^4.5.0", + "@iconoir/vue": "^7.8.0", + "@minpluto/polestar": "^0.0.54-1", "@minpluto/zorn": "^0.4.51", "@nurodev/astro-bun": "^1.1.5", - "@openpanel/sdk": "^1.0.0", - "@supabase/supabase-js": "^2.45.6", - "@xexiu/astro-modal": "^0.5.9", - "astro": "^4.16.7", - "astro-analytics": "^2.7.0", - "astro-i18next": "^1.0.0-beta.21", + "@supabase/supabase-js": "^2.45.3", + "astro": "^4.15.4", "astro-tooltips": "^0.6.2", - "astro-useragent": "^4.0.2", - "rss-to-json": "^2.1.1", - "undici": "^6.20.1" - }, - "devDependencies": { - "sass": "^1.80.4" + "sass": "^1.78.0" } -} \ No newline at end of file +} diff --git a/source/astro-i18next.config.mjs b/source/astro-i18next.config.mjs deleted file mode 100755 index 90f4155..0000000 --- a/source/astro-i18next.config.mjs +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import('astro-i18next').AstroI18nextConfig} */ -export default { - locales: ["en"] -} \ No newline at end of file diff --git a/source/astro.mjs b/source/astro.mjs deleted file mode 100755 index 27cc78c..0000000 --- a/source/astro.mjs +++ /dev/null @@ -1,49 +0,0 @@ -import { defineConfig } from 'astro/config' -import vue from '@astrojs/vue' -import astroI18next from "astro-i18next" -import mdx from '@astrojs/mdx' -import bun from "@nurodev/astro-bun"; - -// https://astro.build/config -export default defineConfig({ - // Project Structure - cacheDir: './.minpluto/generated/astro/cache/', - outDir: './.minpluto/generated/astro/dist/', - publicDir: './source/src/public', - root: './source', - srcDir: './source/src', - // Integrations and Plugins - integrations: [mdx(), vue(), astroI18next()], - // Security - security: { - checkOrigin: true - }, - // Server Options - server: { - port: 1930, - host: true - }, - // Use Server-Side Rendering - output: 'server', - adapter: bun(), - // Vite - vite: { - server: { - hmr: true // Auto Reload - } - }, - // Experimental - experimental: { - directRenderScript: true, - clientPrerender: true, - serverIslands: true - }, - prefetch: { - prefetchAll: true, - defaultStrategy: "viewport" - }, - // Others - devToolbar: { - enabled: false - } -}) \ No newline at end of file diff --git a/source/env.d.ts b/source/env.d.ts deleted file mode 100755 index 8187490..0000000 --- a/source/env.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/// -declare namespace App { - interface Locals { - email: string - } -} \ No newline at end of file diff --git a/source/src/components/Chip.astro b/source/src/components/Chip.astro deleted file mode 100755 index 004f040..0000000 --- a/source/src/components/Chip.astro +++ /dev/null @@ -1,17 +0,0 @@ ---- -const { - Text, - Color -} = Astro.props ---- - -

{Text}

- - \ No newline at end of file diff --git a/source/src/components/CreatorInSidebar.astro b/source/src/components/CreatorInSidebar.astro deleted file mode 100755 index d30b535..0000000 --- a/source/src/components/CreatorInSidebar.astro +++ /dev/null @@ -1,44 +0,0 @@ ---- -// Properties -const { - ChannelId -} = Astro.props - -// Configuration -import { DEFAULT_MEDIA_DATA_PROXY, DEFAULT_IMAGE_PROXY} from '@utils/GetConfig' - -// Fetch -const channel = await fetch(DEFAULT_MEDIA_DATA_PROXY + "/api/v1/channels/" + ChannelId).then((response) => response.json()); ---- - - - -

{channel.author}

-
- - \ No newline at end of file diff --git a/source/src/components/Dialog.astro b/source/src/components/Dialog.astro deleted file mode 100755 index f0e7e55..0000000 --- a/source/src/components/Dialog.astro +++ /dev/null @@ -1,83 +0,0 @@ ---- -import { Xmark } from "@iconoir/vue" - -const { - Title, - Description, - Closable, - CloseOnclick -} = Astro.props ---- - -
-
-
-
-

{Title}

-

{Description}

-
-
- {Closable ? : null} -
-
-
- -
-
- - \ No newline at end of file diff --git a/source/src/components/DiscoverChannel.astro b/source/src/components/DiscoverChannel.astro deleted file mode 100755 index 882e795..0000000 --- a/source/src/components/DiscoverChannel.astro +++ /dev/null @@ -1,50 +0,0 @@ ---- -// Properties -const { - ChannelId -} = Astro.props - -// Configuration -import { DEFAULT_MEDIA_DATA_PROXY, DEFAULT_IMAGE_PROXY} from '@utils/GetConfig' - -// Fetch -const channel = await fetch(DEFAULT_MEDIA_DATA_PROXY + "/api/v1/channels/" + ChannelId).then((response) => response.json()); ---- - - -
- -

{channel.author}

-
-
- \ No newline at end of file diff --git a/source/src/components/Dropdown.astro b/source/src/components/Dropdown.astro deleted file mode 100755 index e9052af..0000000 --- a/source/src/components/Dropdown.astro +++ /dev/null @@ -1,23 +0,0 @@ ---- -const { Name, OnClick } = Astro.props ---- - -
- {Name} - -
- - \ No newline at end of file diff --git a/source/src/components/MusicItem.astro b/source/src/components/MusicItem.astro deleted file mode 100755 index 8694052..0000000 --- a/source/src/components/MusicItem.astro +++ /dev/null @@ -1,67 +0,0 @@ ---- -// Properties -const { - ID, - Title, - Creator, - Views, - UploadDate, - Length -} = Astro.props - -// Configuration -import { - DEFAULT_MEDIA_DATA_PROXY, - DEFAULT_IMAGE_PROXY -} from '@utils/GetConfig' - -// i18n -import i18next, { t } from "i18next"; - -// Format Published Date -const DateFormat = new Date(UploadDate * 1000).toLocaleDateString() - -// Format Video Length -// Thanks to "mingjunlu" for helping out with the time format -const LengthFormat = new Date(Length * 1000).toISOString().slice(14, 19).split(':').map(Number).join(':') - -// Format Views -const ViewsConversion = Intl.NumberFormat('en', { notation: 'compact'}) -const ViewsFormat = ViewsConversion.format(Views) ---- - - - - -

{Title}

-

{Creator}

-

{DateFormat}

-

{LengthFormat}

-
- - \ No newline at end of file diff --git a/source/src/components/Search.astro b/source/src/components/Search.astro deleted file mode 100755 index 2178c60..0000000 --- a/source/src/components/Search.astro +++ /dev/null @@ -1,94 +0,0 @@ ---- -import { Search } from "@iconoir/vue"; -import { t } from "i18next"; ---- - - - - - \ No newline at end of file diff --git a/source/src/components/VideoItem.astro b/source/src/components/VideoItem.astro deleted file mode 100755 index 67d1f6e..0000000 --- a/source/src/components/VideoItem.astro +++ /dev/null @@ -1,84 +0,0 @@ ---- -// Properties -const { - ID, - Title, - Creator, - Views, - UploadDate, - Length -} = Astro.props - -// Configuration -import { - DEFAULT_MEDIA_DATA_PROXY, - DEFAULT_IMAGE_PROXY -} from '@utils/GetConfig' - -// i18n -import i18next, { t } from "i18next"; - -// Format Published Date -const DateFormat = new Date(UploadDate * 1000).toLocaleDateString() - -// Format Video Length -// Thanks to "mingjunlu" for helping out with the time format -const LengthFormat = null - -// Format Views -const ViewsConversion = Intl.NumberFormat('en', { notation: 'compact'}) -const ViewsFormat = ViewsConversion.format(Views) ---- - - -
- -

{LengthFormat}

-
-
-

{Title}

-

{t("WATCH.BY")} {Creator}

-

{ViewsFormat} {t("WATCH.VIEWS")} - {DateFormat}

-
-
- - \ No newline at end of file diff --git a/source/src/components/buttons/Telemtry.astro b/source/src/components/buttons/Telemtry.astro deleted file mode 100755 index 4bbc220..0000000 --- a/source/src/components/buttons/Telemtry.astro +++ /dev/null @@ -1,17 +0,0 @@ ---- -import i18next,{ t, changeLanguage } from "i18next"; -import Base from "@layouts/Default.astro"; - -if (Astro.cookies.get("Telemtry").value === "Enabled") { - var UserIsOptedIn = true -} -else if (Astro.cookies.get("Telemtry").value === "Disabled") { - var UserIsOptedIn = false -} ---- - -{UserIsOptedIn ? - {t("TELEMTRY.OPTOUT")} - : - {t("TELEMTRY.OPTIN")} -} diff --git a/source/src/components/category/CategoryCard.astro b/source/src/components/category/CategoryCard.astro deleted file mode 100644 index 71578c8..0000000 --- a/source/src/components/category/CategoryCard.astro +++ /dev/null @@ -1,80 +0,0 @@ ---- -const { - Link, - Name, - Platform, - Thumbnail, - Ratio = "16:9" // "16:9" or "9:16" -} = Astro.props ---- - - - - { - ()=> { - if (Platform === "YouTube") { - return - } else if (Platform === "Twitch") { - return - } - } - } -
-

{Name}

-
-
- - - -{ - ()=> { - if (Ratio === "16:9") { - return - } else if (Ratio === "9:16") { - return - } - } -} \ No newline at end of file diff --git a/source/src/components/category/trending.astro b/source/src/components/category/trending.astro deleted file mode 100755 index 9f80a50..0000000 --- a/source/src/components/category/trending.astro +++ /dev/null @@ -1,28 +0,0 @@ ---- -// Properties -const { - FetchData, - CategoryName, - CategoryDescription, - GradientHero -} = Astro.props - -// Configuration -import { - DEFAULT_MEDIA_DATA_PROXY, - DEFAULT_IMAGE_PROXY -} from '@utils/GetConfig' - - -// Fetch -const fetchFrom = DEFAULT_MEDIA_DATA_PROXY + '/api/v1/trending' + FetchData -const response = await fetch(fetchFrom) -const data = await response.json() ---- - - -
- {data.map((data) => - - )} -
\ No newline at end of file diff --git a/source/src/components/global/Analytics.astro b/source/src/components/global/Analytics.astro deleted file mode 100755 index 20b96a0..0000000 --- a/source/src/components/global/Analytics.astro +++ /dev/null @@ -1,66 +0,0 @@ ---- -// Environment Variables -import { - ANALYTICS, - MATOMO_ID, - MATOMO_SRC, - PLAUSIBLE_DOMAIN, - PLAUSIBLE_SRC, - UMAMI_SRC, - AMPLITUDE_APIKEY, - METRICAL_APP, - FATHOM_SITE, - FATHOM_SRC, - MINIAML_ID, - SWETRIX_SRC, - SWETRIX_API, - SWETRIX_PROJECT_ID, - SIMPLEANALYTICS_DOMAIN -} from '@utils/GetConfig' - -// Get Astro Analytics -import { - Fathom, - Metrical, - Plausible, - Umami, - Amplitude, - Matomo, - MinimalAnalytics -} from 'astro-analytics' ---- - - -{ - ()=> { - if (ANALYTICS === "None") { - return null - } else if (ANALYTICS === "Plausible") { - - } else if (ANALYTICS === "Umami") { - - } else if (ANALYTICS === "Amplitude") { - - } else if (ANALYTICS === "Matomo") { - - } else if (ANALYTICS === "Metrical") { - - } else if (ANALYTICS === "Fathom") { - - } else if (ANALYTICS === "MinimalAnalytics") { - - } else if (ANALYTICS === "Swetrix") { - - -