From b91c8822ac5a87859f1ab54793ab550fc63e1b7a Mon Sep 17 00:00:00 2001 From: Owen Qwen Date: Tue, 14 Apr 2026 14:39:13 -0500 Subject: [PATCH] Inital commit --- .dockerignore | 11 + .gitignore | 8 + Dockerfile | 20 + README.md | 37 +- docker-compose.yml | 39 + next.config.ts | 4 +- package-lock.json | 1403 +++++++++++++- package.json | 15 +- prisma.config.ts | 14 + prisma/migrations/0001_init/migration.sql | 52 + .../0002_channel_age_gate/migration.sql | 3 + prisma/migrations/migration_lock.toml | 1 + prisma/schema.prisma | 49 + public/file.svg | 1 - public/globe.svg | 1 - public/metube.png | Bin 0 -> 176465 bytes public/next.svg | 1 - public/vercel.svg | 1 - public/window.svg | 1 - src/app/api/auth/login/route.ts | 67 + src/app/api/auth/logout/route.ts | 18 + src/app/api/channel/age-gate/route.ts | 48 + src/app/api/channel/route.ts | 70 + .../api/media/thumbnails/[videoId]/route.ts | 43 + src/app/api/media/videos/[videoId]/route.ts | 138 ++ src/app/api/setup/route.ts | 89 + src/app/api/videos/[videoId]/route.ts | 227 +++ src/app/api/videos/route.ts | 159 ++ src/app/dashboard/layout.tsx | 48 + src/app/dashboard/page.tsx | 122 ++ src/app/dashboard/settings/page.tsx | 122 ++ src/app/favicon.ico | Bin 25931 -> 0 bytes src/app/globals.css | 1688 ++++++++++++++++- src/app/layout.tsx | 26 +- src/app/login/page.tsx | 80 + src/app/not-found.tsx | 18 + src/app/page.tsx | 228 ++- src/app/rss/route.ts | 86 + src/app/setup/page.tsx | 103 + src/app/watch/[videoId]/page.tsx | 118 ++ src/components/AboutChannelModal.tsx | 26 + src/components/AccountMenuModal.tsx | 51 + src/components/DashboardTabs.tsx | 40 + src/components/Modal.tsx | 97 + src/components/VideoDetailsModal.tsx | 67 + src/components/VideoEditorModal.tsx | 213 +++ src/components/VideoFormPreview.tsx | 50 + src/lib/auth.ts | 126 ++ src/lib/channel.ts | 13 + src/lib/db.ts | 24 + src/lib/format.ts | 22 + src/lib/query.ts | 7 + src/lib/setup.ts | 31 + src/lib/storage.ts | 52 + thumbnails/.gitkeep | 0 videos/.gitkeep | 0 56 files changed, 5837 insertions(+), 141 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 prisma.config.ts create mode 100644 prisma/migrations/0001_init/migration.sql create mode 100644 prisma/migrations/0002_channel_age_gate/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma delete mode 100644 public/file.svg delete mode 100644 public/globe.svg create mode 100644 public/metube.png delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg delete mode 100644 public/window.svg create mode 100644 src/app/api/auth/login/route.ts create mode 100644 src/app/api/auth/logout/route.ts create mode 100644 src/app/api/channel/age-gate/route.ts create mode 100644 src/app/api/channel/route.ts create mode 100644 src/app/api/media/thumbnails/[videoId]/route.ts create mode 100644 src/app/api/media/videos/[videoId]/route.ts create mode 100644 src/app/api/setup/route.ts create mode 100644 src/app/api/videos/[videoId]/route.ts create mode 100644 src/app/api/videos/route.ts create mode 100644 src/app/dashboard/layout.tsx create mode 100644 src/app/dashboard/page.tsx create mode 100644 src/app/dashboard/settings/page.tsx delete mode 100644 src/app/favicon.ico create mode 100644 src/app/login/page.tsx create mode 100644 src/app/not-found.tsx create mode 100644 src/app/rss/route.ts create mode 100644 src/app/setup/page.tsx create mode 100644 src/app/watch/[videoId]/page.tsx create mode 100644 src/components/AboutChannelModal.tsx create mode 100644 src/components/AccountMenuModal.tsx create mode 100644 src/components/DashboardTabs.tsx create mode 100644 src/components/Modal.tsx create mode 100644 src/components/VideoDetailsModal.tsx create mode 100644 src/components/VideoEditorModal.tsx create mode 100644 src/components/VideoFormPreview.tsx create mode 100644 src/lib/auth.ts create mode 100644 src/lib/channel.ts create mode 100644 src/lib/db.ts create mode 100644 src/lib/format.ts create mode 100644 src/lib/query.ts create mode 100644 src/lib/setup.ts create mode 100644 src/lib/storage.ts create mode 100644 thumbnails/.gitkeep create mode 100644 videos/.gitkeep diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..68dff75 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,11 @@ +.git +.gitignore +node_modules +.next +npm-debug.log* + +.env +.env.* + +videos +thumbnails diff --git a/.gitignore b/.gitignore index 5ef6a52..e953f42 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,11 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +/src/generated/prisma + +# local media uploads +/videos/* +!/videos/.gitkeep +/thumbnails/* +!/thumbnails/.gitkeep diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1d8580d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +ARG BASE_IMAGE=mirror.gcr.io/library/node:20-alpine +FROM ${BASE_IMAGE} + +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci + +COPY . . + +ARG DATABASE_URL="postgresql://postgres:postgres@localhost:5432/metube?schema=public" +RUN DATABASE_URL="$DATABASE_URL" SESSION_SECRET="metube-build-session-secret-change-me-12345" npm run build + +ENV NODE_ENV=production +ENV PORT=3000 +ENV HOSTNAME=0.0.0.0 + +EXPOSE 3000 + +CMD ["npm", "run", "start"] diff --git a/README.md b/README.md index e215bc4..f7d2ec8 100644 --- a/README.md +++ b/README.md @@ -1,36 +1 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). - -## Getting Started - -First, run the development server: - -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +# MeTube \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0fb73ce --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,39 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile + args: + BASE_IMAGE: ${BASE_IMAGE:-mirror.gcr.io/library/node:20-alpine} + DATABASE_URL: postgresql://postgres:postgres@db:5432/metube?schema=public + depends_on: + db: + condition: service_healthy + environment: + DATABASE_URL: postgresql://postgres:postgres@db:5432/metube?schema=public + env_file: + - .env + ports: + - "3000:3000" + volumes: + - ./videos:/app/videos + - ./thumbnails:/app/thumbnails + + db: + image: ${POSTGRES_IMAGE:-mirror.gcr.io/library/postgres:16-alpine} + environment: + POSTGRES_DB: metube + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres -d metube"] + interval: 5s + timeout: 5s + retries: 5 + volumes: + - postgres_data:/var/lib/postgresql/data + - ./prisma/migrations/0001_init/migration.sql:/docker-entrypoint-initdb.d/001_init.sql:ro + - ./prisma/migrations/0002_channel_age_gate/migration.sql:/docker-entrypoint-initdb.d/002_channel_age_gate.sql:ro + +volumes: + postgres_data: diff --git a/next.config.ts b/next.config.ts index e9ffa30..078e9e1 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,9 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ + turbopack: { + root: process.cwd(), + }, }; export default nextConfig; diff --git a/package-lock.json b/package-lock.json index 71f84f0..67d0c92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,16 @@ "name": "metube", "version": "0.1.0", "dependencies": { + "@prisma/adapter-pg": "^7.7.0", + "@prisma/client": "^7.7.0", + "argon2": "^0.44.0", + "dotenv": "^17.4.2", + "jose": "^6.2.2", "next": "16.2.3", + "pg": "^8.20.0", "react": "19.2.4", - "react-dom": "19.2.4" + "react-dom": "19.2.4", + "zod": "^4.3.6" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -19,6 +26,7 @@ "@types/react-dom": "^19", "eslint": "^9", "eslint-config-next": "16.2.3", + "prisma": "^7.7.0", "tailwindcss": "^4", "typescript": "^5" } @@ -276,6 +284,36 @@ "node": ">=6.9.0" } }, + "node_modules/@electric-sql/pglite": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.4.1.tgz", + "integrity": "sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@electric-sql/pglite-socket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-socket/-/pglite-socket-0.1.1.tgz", + "integrity": "sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "pglite-server": "dist/scripts/server.js" + }, + "peerDependencies": { + "@electric-sql/pglite": "0.4.1" + } + }, + "node_modules/@electric-sql/pglite-tools": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.3.1.tgz", + "integrity": "sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA==", + "devOptional": true, + "license": "Apache-2.0", + "peerDependencies": { + "@electric-sql/pglite": "0.4.1" + } + }, "node_modules/@emnapi/core": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", @@ -309,6 +347,12 @@ "tslib": "^2.4.0" } }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -453,6 +497,19 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@hono/node-server": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz", + "integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1069,6 +1126,13 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "devOptional": true, + "license": "MIT" + }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -1286,6 +1350,396 @@ "node": ">=12.4.0" } }, + "node_modules/@phc/format": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", + "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@prisma/adapter-pg": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-7.7.0.tgz", + "integrity": "sha512-q33Ta8sKbgzEpAy0lx45tAq//yMv0qcb+8nj+TCA3P4wiAY+OBFEFk/NDkZncAfHaNJeGo5WJpJdpbL+ijYx8g==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/driver-adapter-utils": "7.7.0", + "@types/pg": "^8.16.0", + "pg": "^8.16.3", + "postgres-array": "3.0.4" + } + }, + "node_modules/@prisma/client": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.7.0.tgz", + "integrity": "sha512-5Ar4OsZpJ54s21sy5oDNNW9gQtd4NuxCaiM7+JDTOU07D6VvlpLjYzAVCMB1+JzokN+08dAVomlx+b7bhJd3ww==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/client-runtime-utils": "7.7.0" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24.0" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/client-runtime-utils": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.7.0.tgz", + "integrity": "sha512-BLyd0UpFYOtyJFTHm7jS9vesHW7P83abibodQMiIofqjBKzDHQ1VAsQkdfvXyYDkPlONPfOTz7/rv3x/+CQqvQ==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/config": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-7.7.0.tgz", + "integrity": "sha512-hmPI3tKLO2aP0Y5vugbjcnA9qqlfJndiT6ds4tw28U5hNHLWg+mHJEWAhjsSPgxjtmxhJ/EDIeIlyh+3Us0OPg==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.20.0", + "empathic": "2.0.0" + } + }, + "node_modules/@prisma/debug": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.7.0.tgz", + "integrity": "sha512-12J62XdqCmpiwJHhHdQxZeY3ckVCWIFmcJP8hg5dPTceeiQ0wiojXGFYTluKqFQfu46fRLgb/rLALZMAx3+dTA==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/dev": { + "version": "0.24.3", + "resolved": "https://registry.npmjs.org/@prisma/dev/-/dev-0.24.3.tgz", + "integrity": "sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "@electric-sql/pglite": "0.4.1", + "@electric-sql/pglite-socket": "0.1.1", + "@electric-sql/pglite-tools": "0.3.1", + "@hono/node-server": "1.19.11", + "@prisma/get-platform": "7.2.0", + "@prisma/query-plan-executor": "7.2.0", + "@prisma/streams-local": "0.1.2", + "foreground-child": "3.3.1", + "get-port-please": "3.2.0", + "hono": "^4.12.8", + "http-status-codes": "2.3.0", + "pathe": "2.0.3", + "proper-lockfile": "4.1.2", + "remeda": "2.33.4", + "std-env": "3.10.0", + "valibot": "1.2.0", + "zeptomatch": "2.1.0" + } + }, + "node_modules/@prisma/driver-adapter-utils": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.7.0.tgz", + "integrity": "sha512-gZXREeu6mOk7zXfGFJgh86p7Vhj0sXNKp+4Cg1tWYo7V2dfncP2qxS2BiTmbIIha8xPqItkl0WSw38RuSq1HoQ==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.7.0" + } + }, + "node_modules/@prisma/engines": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.7.0.tgz", + "integrity": "sha512-7fmcbT7HHXBq/b+3h/dO1JI3fd8l8q7erf7xP7pRprh58hmSSnG8mg9K3yjW3h9WaHWUwngVFpSxxxivaitQ2w==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.7.0", + "@prisma/engines-version": "7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711", + "@prisma/fetch-engine": "7.7.0", + "@prisma/get-platform": "7.7.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711.tgz", + "integrity": "sha512-r51DLcJ8bDRSrBEJF3J4cinoWyGA7rfP2mG6lD90VqIbGNOkbfcLcXalSVjq5Y6brQS3vcjrq4GbyUb1Cb7vkw==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines/node_modules/@prisma/get-platform": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.7.0.tgz", + "integrity": "sha512-MEUNzvKxvYnJ7kgvd6oNRnMmmiGNS9TYLB2weMeIXplnHdL/UWEGnvavYGnN7KLJ2n0iI4dDAyzSkHI3c7AscQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.7.0" + } + }, + "node_modules/@prisma/fetch-engine": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-7.7.0.tgz", + "integrity": "sha512-TfyzveBQoK4xALzsTpVhB/0KG1N8zOK0ap+RnBMkzGUu3f98fnQ4QtXa2wlKPhsO2X8a3N5ugFQgcKNoHGmDfw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.7.0", + "@prisma/engines-version": "7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711", + "@prisma/get-platform": "7.7.0" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/@prisma/get-platform": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.7.0.tgz", + "integrity": "sha512-MEUNzvKxvYnJ7kgvd6oNRnMmmiGNS9TYLB2weMeIXplnHdL/UWEGnvavYGnN7KLJ2n0iI4dDAyzSkHI3c7AscQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.7.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.2.0.tgz", + "integrity": "sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.2.0" + } + }, + "node_modules/@prisma/get-platform/node_modules/@prisma/debug": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.2.0.tgz", + "integrity": "sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/query-plan-executor": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@prisma/query-plan-executor/-/query-plan-executor-7.2.0.tgz", + "integrity": "sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/streams-local": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@prisma/streams-local/-/streams-local-0.1.2.tgz", + "integrity": "sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "better-result": "^2.7.0", + "env-paths": "^3.0.0", + "proper-lockfile": "^4.1.2" + }, + "engines": { + "bun": ">=1.3.6", + "node": ">=22.0.0" + } + }, + "node_modules/@prisma/streams-local/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@prisma/streams-local/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@prisma/studio-core": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@prisma/studio-core/-/studio-core-0.27.3.tgz", + "integrity": "sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@radix-ui/react-toggle": "1.1.10", + "chart.js": "4.5.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24.0", + "pnpm": "8" + }, + "peerDependencies": { + "@types/react": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "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==", + "devOptional": true, + "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-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==", + "devOptional": true, + "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-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==", + "devOptional": true, + "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-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@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-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==", + "devOptional": true, + "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==", + "devOptional": true, + "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-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==", + "devOptional": true, + "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/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1293,6 +1747,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "devOptional": true, + "license": "MIT" + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -1621,17 +2082,27 @@ "version": "20.19.39", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz", "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "node_modules/@types/pg": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.20.0.tgz", + "integrity": "sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, "node_modules/@types/react": { "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -1641,7 +2112,7 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" @@ -2291,6 +2762,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/argon2": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.44.0.tgz", + "integrity": "sha512-zHPGN3S55sihSQo0dBbK0A5qpi2R31z7HZDZnry3ifOyj8bZZnpZND2gpmhnRGO1V/d555RwBqIK5W4Mrmv3ig==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@phc/format": "^1.0.0", + "cross-env": "^10.0.0", + "node-addon-api": "^8.5.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">=16.17.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2501,6 +2988,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/axe-core": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.3.tgz", @@ -2540,6 +3037,13 @@ "node": ">=6.0.0" } }, + "node_modules/better-result": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/better-result/-/better-result-2.8.2.tgz", + "integrity": "sha512-YOf0VSj5nUPI27doTtXF+BBnsiRq3qY7avHqfIWnppxTLGyvkLq1QV2RTxkwoZwJ60ywLfZ0raFF4J/G886i7A==", + "devOptional": true, + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", @@ -2598,6 +3102,48 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/c12": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", + "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/call-bind": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", @@ -2695,6 +3241,45 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -2728,6 +3313,23 @@ "dev": true, "license": "MIT" }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2735,11 +3337,27 @@ "dev": true, "license": "MIT" }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2754,7 +3372,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -2843,6 +3461,16 @@ "dev": true, "license": "MIT" }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -2879,6 +3507,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "devOptional": true, + "license": "MIT" + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -2902,6 +3554,18 @@ "node": ">=0.10.0" } }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2917,6 +3581,17 @@ "node": ">= 0.4" } }, + "node_modules/effect": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.20.0.tgz", + "integrity": "sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.336", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.336.tgz", @@ -2931,6 +3606,16 @@ "dev": true, "license": "MIT" }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/enhanced-resolve": { "version": "5.20.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", @@ -2945,6 +3630,19 @@ "node": ">=10.13.0" } }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", @@ -3551,11 +4249,41 @@ "node": ">=0.10.0" } }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -3602,6 +4330,23 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -3692,6 +4437,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -3733,6 +4495,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -3778,6 +4550,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-port-please": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz", + "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==", + "devOptional": true, + "license": "MIT" + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -3823,6 +4602,24 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3883,9 +4680,23 @@ "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==", - "dev": true, + "devOptional": true, "license": "ISC" }, + "node_modules/grammex": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.12.tgz", + "integrity": "sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/graphmatch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/graphmatch/-/graphmatch-1.1.1.tgz", + "integrity": "sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -3997,6 +4808,40 @@ "hermes-estree": "0.25.1" } }, + "node_modules/hono": { + "version": "4.12.12", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.12.tgz", + "integrity": "sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4319,6 +5164,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "devOptional": true, + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -4475,7 +5327,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/iterator.prototype": { @@ -4500,12 +5351,21 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/jose": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", + "integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4929,6 +5789,13 @@ "dev": true, "license": "MIT" }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "devOptional": true, + "license": "Apache-2.0" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4952,6 +5819,22 @@ "yallist": "^3.0.2" } }, + "node_modules/lru.min": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", + "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", + "devOptional": true, + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -5026,6 +5909,40 @@ "dev": true, "license": "MIT" }, + "node_modules/mysql2": { + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", + "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.0", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "lru.min": "^1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -5148,6 +6065,15 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-addon-api": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz", + "integrity": "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/node-exports-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", @@ -5167,6 +6093,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-releases": { "version": "2.0.37", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", @@ -5174,6 +6118,31 @@ "dev": true, "license": "MIT" }, + "node_modules/nypm": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz", + "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.2.0", + "pathe": "^2.0.3", + "tinyexec": "^1.0.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nypm/node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "devOptional": true, + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5297,6 +6266,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5392,7 +6368,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5405,6 +6380,118 @@ "dev": true, "license": "MIT" }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", + "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.12.0", + "pg-pool": "^3.13.0", + "pg-protocol": "^1.13.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.3.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz", + "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.13.0.tgz", + "integrity": "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", + "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-types/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5424,6 +6511,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -5463,6 +6562,59 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postgres": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz", + "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==", + "devOptional": true, + "license": "Unlicense", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/porsager" + } + }, + "node_modules/postgres-array": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.4.tgz", + "integrity": "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5473,6 +6625,40 @@ "node": ">= 0.8.0" } }, + "node_modules/prisma": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.7.0.tgz", + "integrity": "sha512-HlgwRBt1uEFB9LStHL4HLYDvoi4BNu1rYA0hPG0zCAEyK9SaZBqp7E5Rjpc3Qh8Lex/ye/svoHZ0OWoFNhWxuQ==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/config": "7.7.0", + "@prisma/dev": "0.24.3", + "@prisma/engines": "7.7.0", + "@prisma/studio-core": "0.27.3", + "mysql2": "3.15.3", + "postgres": "3.4.7" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24.0" + }, + "peerDependencies": { + "better-sqlite3": ">=9.0.0", + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "better-sqlite3": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -5485,6 +6671,25 @@ "react-is": "^16.13.1" } }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "devOptional": true, + "license": "ISC" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5495,6 +6700,23 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5516,6 +6738,17 @@ ], "license": "MIT" }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, "node_modules/react": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", @@ -5544,6 +6777,20 @@ "dev": true, "license": "MIT" }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -5588,6 +6835,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/remeda": { + "version": "2.33.4", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.33.4.tgz", + "integrity": "sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==", + "devOptional": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/remeda" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "2.0.0-next.6", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", @@ -5632,6 +6899,16 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -5722,6 +6999,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -5738,6 +7022,12 @@ "semver": "bin/semver.js" } }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==", + "devOptional": true + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -5849,7 +7139,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -5862,7 +7151,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5944,6 +7232,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "devOptional": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5953,6 +7254,25 @@ "node": ">=0.10.0" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -5960,6 +7280,13 @@ "dev": true, "license": "MIT" }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -6180,6 +7507,16 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tinyexec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", + "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/tinyglobby": { "version": "0.2.16", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", @@ -6381,7 +7718,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -6438,7 +7775,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/unrs-resolver": { @@ -6517,11 +7853,25 @@ "punycode": "^2.1.0" } }, + "node_modules/valibot": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.2.0.tgz", + "integrity": "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -6632,6 +7982,15 @@ "node": ">=0.10.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -6652,11 +8011,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zeptomatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/zeptomatch/-/zeptomatch-2.1.0.tgz", + "integrity": "sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "grammex": "^3.1.11", + "graphmatch": "^1.1.0" + } + }, "node_modules/zod": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 8287870..cdebdb2 100644 --- a/package.json +++ b/package.json @@ -6,12 +6,22 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "eslint" + "lint": "eslint", + "prisma:generate": "prisma generate", + "prisma:migrate": "prisma migrate dev", + "prisma:studio": "prisma studio" }, "dependencies": { + "@prisma/adapter-pg": "^7.7.0", + "@prisma/client": "^7.7.0", + "argon2": "^0.44.0", + "dotenv": "^17.4.2", + "jose": "^6.2.2", "next": "16.2.3", + "pg": "^8.20.0", "react": "19.2.4", - "react-dom": "19.2.4" + "react-dom": "19.2.4", + "zod": "^4.3.6" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -20,6 +30,7 @@ "@types/react-dom": "^19", "eslint": "^9", "eslint-config-next": "16.2.3", + "prisma": "^7.7.0", "tailwindcss": "^4", "typescript": "^5" } diff --git a/prisma.config.ts b/prisma.config.ts new file mode 100644 index 0000000..831a20f --- /dev/null +++ b/prisma.config.ts @@ -0,0 +1,14 @@ +// This file was generated by Prisma, and assumes you have installed the following: +// npm install --save-dev prisma dotenv +import "dotenv/config"; +import { defineConfig } from "prisma/config"; + +export default defineConfig({ + schema: "prisma/schema.prisma", + migrations: { + path: "prisma/migrations", + }, + datasource: { + url: process.env["DATABASE_URL"], + }, +}); diff --git a/prisma/migrations/0001_init/migration.sql b/prisma/migrations/0001_init/migration.sql new file mode 100644 index 0000000..c7d4ce3 --- /dev/null +++ b/prisma/migrations/0001_init/migration.sql @@ -0,0 +1,52 @@ +-- CreateSchema +CREATE SCHEMA IF NOT EXISTS "public"; + +-- CreateTable +CREATE TABLE "Channel" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Channel_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "passwordHash" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Video" ( + "id" TEXT NOT NULL, + "channelId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "videoFilename" TEXT NOT NULL, + "videoMimeType" TEXT NOT NULL, + "videoSizeBytes" INTEGER NOT NULL, + "thumbnailFilename" TEXT, + "thumbnailMimeType" TEXT, + "publishedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Video_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); + +-- CreateIndex +CREATE INDEX "Video_publishedAt_idx" ON "Video"("publishedAt" DESC); + +-- AddForeignKey +ALTER TABLE "Video" ADD CONSTRAINT "Video_channelId_fkey" FOREIGN KEY ("channelId") REFERENCES "Channel"("id") ON DELETE CASCADE ON UPDATE CASCADE; + diff --git a/prisma/migrations/0002_channel_age_gate/migration.sql b/prisma/migrations/0002_channel_age_gate/migration.sql new file mode 100644 index 0000000..8be9f8f --- /dev/null +++ b/prisma/migrations/0002_channel_age_gate/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Channel" +ADD COLUMN "isAdult" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..2fe25d8 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1 @@ +provider = "postgresql" diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..7caa5cd --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,49 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Get a free hosted Postgres database in seconds: `npx create-db` + +generator client { + provider = "prisma-client" + output = "../src/generated/prisma" +} + +datasource db { + provider = "postgresql" +} + +model Channel { + id String @id + name String + description String? + isAdult Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + videos Video[] +} + +model User { + id String @id @default(cuid()) + username String @unique + passwordHash String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Video { + id String @id + channelId String + title String + description String? + videoFilename String + videoMimeType String + videoSizeBytes Int + thumbnailFilename String? + thumbnailMimeType String? + publishedAt DateTime @default(now()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + channel Channel @relation(fields: [channelId], references: [id], onDelete: Cascade) + + @@index([publishedAt(sort: Desc)]) +} diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/metube.png b/public/metube.png new file mode 100644 index 0000000000000000000000000000000000000000..436b44c3094b33c5c764072810dacbf55e3264c4 GIT binary patch literal 176465 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

2BMLgCATYs6 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Л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 Z9gVy`a>v*@br=Ht$Ve!Dtr0U0{y#U6N|68n literal 0 HcmV?d00001 diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts new file mode 100644 index 0000000..6230614 --- /dev/null +++ b/src/app/api/auth/login/route.ts @@ -0,0 +1,67 @@ +import { NextResponse } from "next/server"; +import { z } from "zod"; + +import { + createSessionToken, + getSessionCookieOptions, + SESSION_COOKIE_NAME, + verifyPassword, +} from "@/lib/auth"; +import { db } from "@/lib/db"; +import { isSetupComplete } from "@/lib/setup"; + +export const runtime = "nodejs"; + +const loginSchema = z.object({ + username: z.string().trim().min(3).max(32), + password: z.string().min(8).max(128), +}); + +function redirectWithError(request: Request, error: string) { + const url = new URL("/login", request.url); + url.searchParams.set("error", error); + return NextResponse.redirect(url, 303); +} + +export async function POST(request: Request) { + if (!(await isSetupComplete())) { + return NextResponse.redirect(new URL("/setup", request.url), 303); + } + + const formData = await request.formData(); + const parsed = loginSchema.safeParse({ + username: formData.get("username"), + password: formData.get("password"), + }); + + if (!parsed.success) { + return redirectWithError(request, "Invalid credentials."); + } + + const user = await db.user.findUnique({ + where: { + username: parsed.data.username, + }, + }); + + if (!user) { + return redirectWithError(request, "Invalid credentials."); + } + + const isValidPassword = await verifyPassword(user.passwordHash, parsed.data.password); + + if (!isValidPassword) { + return redirectWithError(request, "Invalid credentials."); + } + + const sessionToken = await createSessionToken(user.id, user.username); + const response = NextResponse.redirect(new URL("/dashboard", request.url), 303); + + response.cookies.set( + SESSION_COOKIE_NAME, + sessionToken, + getSessionCookieOptions(), + ); + + return response; +} diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts new file mode 100644 index 0000000..96ca365 --- /dev/null +++ b/src/app/api/auth/logout/route.ts @@ -0,0 +1,18 @@ +import { NextResponse } from "next/server"; + +import { SESSION_COOKIE_NAME } from "@/lib/auth"; +import { isSetupComplete } from "@/lib/setup"; + +export const runtime = "nodejs"; + +export async function POST(request: Request) { + const setupComplete = await isSetupComplete(); + const response = NextResponse.redirect( + new URL(setupComplete ? "/login" : "/setup", request.url), + 303, + ); + + response.cookies.delete(SESSION_COOKIE_NAME); + + return response; +} diff --git a/src/app/api/channel/age-gate/route.ts b/src/app/api/channel/age-gate/route.ts new file mode 100644 index 0000000..7832430 --- /dev/null +++ b/src/app/api/channel/age-gate/route.ts @@ -0,0 +1,48 @@ +import { NextResponse } from "next/server"; +import { z } from "zod"; + +import { + ADULT_GATE_COOKIE_NAME, + getAdultGateCookieOptions, +} from "@/lib/channel"; +import { getChannel, isSetupComplete } from "@/lib/setup"; + +export const runtime = "nodejs"; + +const ageGateSchema = z.object({ + decision: z.enum(["yes", "no"]), +}); + +export async function POST(request: Request) { + if (!(await isSetupComplete())) { + return NextResponse.redirect(new URL("/setup", request.url), 303); + } + + const channel = await getChannel(); + if (!channel || !channel.isAdult) { + return NextResponse.redirect(new URL("/", request.url), 303); + } + + const formData = await request.formData(); + const parsed = ageGateSchema.safeParse({ + decision: formData.get("decision"), + }); + + if (!parsed.success) { + return NextResponse.redirect(new URL("/", request.url), 303); + } + + if (parsed.data.decision === "yes") { + const response = NextResponse.redirect(new URL("/", request.url), 303); + + response.cookies.set( + ADULT_GATE_COOKIE_NAME, + channel.id, + getAdultGateCookieOptions(), + ); + + return response; + } + + return NextResponse.redirect(new URL("https://google.com"), 303); +} diff --git a/src/app/api/channel/route.ts b/src/app/api/channel/route.ts new file mode 100644 index 0000000..0c944b2 --- /dev/null +++ b/src/app/api/channel/route.ts @@ -0,0 +1,70 @@ +import { NextResponse } from "next/server"; +import { z } from "zod"; + +import { getAuthenticatedUser } from "@/lib/auth"; +import { db } from "@/lib/db"; +import { getChannel, isSetupComplete } from "@/lib/setup"; + +export const runtime = "nodejs"; + +const channelSettingsSchema = z.object({ + channelName: z.string().trim().min(2).max(80), + channelDescription: z.string().trim().max(500).optional(), + channelIsAdult: z.boolean(), +}); + +function redirectWithError(request: Request, error: string) { + const url = new URL("/dashboard/settings", request.url); + url.searchParams.set("error", error); + return NextResponse.redirect(url, 303); +} + +function redirectWithSuccess(request: Request, success: string) { + const url = new URL("/dashboard/settings", request.url); + url.searchParams.set("success", success); + return NextResponse.redirect(url, 303); +} + +export async function POST(request: Request) { + if (!(await isSetupComplete())) { + return NextResponse.redirect(new URL("/setup", request.url), 303); + } + + const user = await getAuthenticatedUser(); + if (!user) { + return NextResponse.redirect(new URL("/login", request.url), 303); + } + + const channel = await getChannel(); + if (!channel) { + return NextResponse.redirect(new URL("/setup", request.url), 303); + } + + const formData = await request.formData(); + const parsed = channelSettingsSchema.safeParse({ + channelName: formData.get("channelName"), + channelDescription: formData.get("channelDescription") || undefined, + channelIsAdult: formData.get("channelIsAdult") === "on", + }); + + if (!parsed.success) { + return redirectWithError(request, "Please provide a valid channel name."); + } + + try { + await db.channel.update({ + where: { + id: channel.id, + }, + data: { + name: parsed.data.channelName, + description: parsed.data.channelDescription || null, + isAdult: parsed.data.channelIsAdult, + }, + }); + + return redirectWithSuccess(request, "Channel settings saved."); + } catch { + return redirectWithError(request, "Failed to save channel settings."); + } +} diff --git a/src/app/api/media/thumbnails/[videoId]/route.ts b/src/app/api/media/thumbnails/[videoId]/route.ts new file mode 100644 index 0000000..381fd22 --- /dev/null +++ b/src/app/api/media/thumbnails/[videoId]/route.ts @@ -0,0 +1,43 @@ +import { readFile } from "node:fs/promises"; + +import { NextResponse } from "next/server"; + +import { db } from "@/lib/db"; +import { getThumbnailPath } from "@/lib/storage"; + +export const runtime = "nodejs"; +export const dynamic = "force-dynamic"; + +export async function GET( + _request: Request, + context: RouteContext<"/api/media/thumbnails/[videoId]">, +) { + const { videoId } = await context.params; + + const video = await db.video.findUnique({ + where: { + id: videoId, + }, + select: { + thumbnailFilename: true, + thumbnailMimeType: true, + }, + }); + + if (!video?.thumbnailFilename) { + return NextResponse.json({ error: "Not found" }, { status: 404 }); + } + + try { + const fileBuffer = await readFile(getThumbnailPath(video.thumbnailFilename)); + return new NextResponse(fileBuffer, { + status: 200, + headers: { + "Content-Type": video.thumbnailMimeType ?? "image/jpeg", + "Cache-Control": "public, max-age=31536000, immutable", + }, + }); + } catch { + return NextResponse.json({ error: "Not found" }, { status: 404 }); + } +} diff --git a/src/app/api/media/videos/[videoId]/route.ts b/src/app/api/media/videos/[videoId]/route.ts new file mode 100644 index 0000000..7252166 --- /dev/null +++ b/src/app/api/media/videos/[videoId]/route.ts @@ -0,0 +1,138 @@ +import { createReadStream } from "node:fs"; +import { stat } from "node:fs/promises"; +import { Readable } from "node:stream"; + +import { NextResponse } from "next/server"; + +import { db } from "@/lib/db"; +import { getVideoPath } from "@/lib/storage"; + +export const runtime = "nodejs"; +export const dynamic = "force-dynamic"; + +function parseRangeHeader(rangeHeader: string, size: number) { + const match = /^bytes=(\d*)-(\d*)$/.exec(rangeHeader.trim()); + if (!match) { + return null; + } + + const start = match[1] ? Number(match[1]) : 0; + const end = match[2] ? Number(match[2]) : size - 1; + + if (!Number.isInteger(start) || !Number.isInteger(end)) { + return null; + } + + if (start < 0 || end < start || end >= size) { + return null; + } + + return { start, end }; +} + +function baseHeaders(mimeType: string, size: number): HeadersInit { + return { + "Content-Type": mimeType, + "Accept-Ranges": "bytes", + "Content-Length": String(size), + "Cache-Control": "public, max-age=0, must-revalidate", + }; +} + +export async function HEAD( + _request: Request, + context: RouteContext<"/api/media/videos/[videoId]">, +) { + const { videoId } = await context.params; + + const video = await db.video.findUnique({ + where: { + id: videoId, + }, + select: { + videoFilename: true, + videoMimeType: true, + }, + }); + + if (!video) { + return NextResponse.json({ error: "Not found" }, { status: 404 }); + } + + try { + const fileStats = await stat(getVideoPath(video.videoFilename)); + + return new NextResponse(null, { + status: 200, + headers: baseHeaders(video.videoMimeType, fileStats.size), + }); + } catch { + return NextResponse.json({ error: "Not found" }, { status: 404 }); + } +} + +export async function GET( + request: Request, + context: RouteContext<"/api/media/videos/[videoId]">, +) { + const { videoId } = await context.params; + + const video = await db.video.findUnique({ + where: { + id: videoId, + }, + select: { + videoFilename: true, + videoMimeType: true, + }, + }); + + if (!video) { + return NextResponse.json({ error: "Not found" }, { status: 404 }); + } + + const filePath = getVideoPath(video.videoFilename); + + let fileStats; + try { + fileStats = await stat(filePath); + } catch { + return NextResponse.json({ error: "Not found" }, { status: 404 }); + } + + const rangeHeader = request.headers.get("range"); + if (!rangeHeader) { + const stream = createReadStream(filePath); + return new Response(Readable.toWeb(stream) as ReadableStream, { + status: 200, + headers: baseHeaders(video.videoMimeType, fileStats.size), + }); + } + + const range = parseRangeHeader(rangeHeader, fileStats.size); + if (!range) { + return new NextResponse(null, { + status: 416, + headers: { + "Content-Range": `bytes */${fileStats.size}`, + }, + }); + } + + const stream = createReadStream(filePath, { + start: range.start, + end: range.end, + }); + const chunkSize = range.end - range.start + 1; + + return new Response(Readable.toWeb(stream) as ReadableStream, { + status: 206, + headers: { + "Content-Type": video.videoMimeType, + "Accept-Ranges": "bytes", + "Content-Length": String(chunkSize), + "Content-Range": `bytes ${range.start}-${range.end}/${fileStats.size}`, + "Cache-Control": "public, max-age=0, must-revalidate", + }, + }); +} diff --git a/src/app/api/setup/route.ts b/src/app/api/setup/route.ts new file mode 100644 index 0000000..ca7572d --- /dev/null +++ b/src/app/api/setup/route.ts @@ -0,0 +1,89 @@ +import { NextResponse } from "next/server"; +import { z } from "zod"; + +import { + createSessionToken, + getSessionCookieOptions, + SESSION_COOKIE_NAME, + hashPassword, +} from "@/lib/auth"; +import { db } from "@/lib/db"; +import { PRIMARY_CHANNEL_ID, isSetupComplete } from "@/lib/setup"; +import { ensureStorageDirectories } from "@/lib/storage"; + +export const runtime = "nodejs"; + +const setupSchema = z.object({ + channelName: z.string().trim().min(2).max(80), + channelDescription: z.string().trim().max(500).optional(), + username: z + .string() + .trim() + .min(3) + .max(32) + .regex(/^[a-zA-Z0-9_-]+$/), + password: z.string().min(8).max(128), +}); + +function redirectWithError(request: Request, error: string) { + const url = new URL("/setup", request.url); + url.searchParams.set("error", error); + return NextResponse.redirect(url, 303); +} + +export async function POST(request: Request) { + if (await isSetupComplete()) { + return NextResponse.redirect(new URL("/", request.url), 303); + } + + const formData = await request.formData(); + const parsed = setupSchema.safeParse({ + channelName: formData.get("channelName"), + channelDescription: formData.get("channelDescription") || undefined, + username: formData.get("username"), + password: formData.get("password"), + }); + + if (!parsed.success) { + return redirectWithError(request, "Please fill all required fields correctly."); + } + + const passwordHash = await hashPassword(parsed.data.password); + + try { + await ensureStorageDirectories(); + + const user = await db.$transaction(async (tx) => { + await tx.channel.create({ + data: { + id: PRIMARY_CHANNEL_ID, + name: parsed.data.channelName, + description: parsed.data.channelDescription || null, + }, + }); + + return tx.user.create({ + data: { + username: parsed.data.username, + passwordHash, + }, + }); + }); + + const sessionToken = await createSessionToken(user.id, user.username); + const response = NextResponse.redirect(new URL("/dashboard", request.url), 303); + + response.cookies.set( + SESSION_COOKIE_NAME, + sessionToken, + getSessionCookieOptions(), + ); + + return response; + } catch { + return redirectWithError( + request, + "Setup failed. If this instance was already initialized, sign in instead.", + ); + } +} diff --git a/src/app/api/videos/[videoId]/route.ts b/src/app/api/videos/[videoId]/route.ts new file mode 100644 index 0000000..d580896 --- /dev/null +++ b/src/app/api/videos/[videoId]/route.ts @@ -0,0 +1,227 @@ +import { randomUUID } from "node:crypto"; +import { unlink, writeFile } from "node:fs/promises"; + +import { NextResponse } from "next/server"; +import { z } from "zod"; + +import { getAuthenticatedUser } from "@/lib/auth"; +import { db } from "@/lib/db"; +import { getChannel, isSetupComplete } from "@/lib/setup"; +import { + ensureStorageDirectories, + getThumbnailExtension, + getThumbnailPath, + getVideoPath, +} from "@/lib/storage"; + +export const runtime = "nodejs"; + +const videoMetadataSchema = z.object({ + title: z.string().trim().min(1).max(140), + description: z.string().trim().max(5000).optional(), +}); + +const maxVideoBytes = Number(process.env.MAX_VIDEO_UPLOAD_BYTES ?? 1_073_741_824); +const maxThumbnailBytes = Number(process.env.MAX_THUMBNAIL_UPLOAD_BYTES ?? 5_242_880); + +function redirectWithError(request: Request, error: string) { + const url = new URL("/dashboard", request.url); + url.searchParams.set("error", error); + return NextResponse.redirect(url, 303); +} + +function redirectWithSuccess(request: Request, success: string) { + const url = new URL("/dashboard", request.url); + url.searchParams.set("success", success); + return NextResponse.redirect(url, 303); +} + +type VideoRouteContext = { + params: Promise<{ videoId: string }>; +}; + +export async function POST(request: Request, { params }: VideoRouteContext) { + if (!(await isSetupComplete())) { + return NextResponse.redirect(new URL("/setup", request.url), 303); + } + + const user = await getAuthenticatedUser(); + if (!user) { + return NextResponse.redirect(new URL("/login", request.url), 303); + } + + const channel = await getChannel(); + if (!channel) { + return NextResponse.redirect(new URL("/setup", request.url), 303); + } + + const { videoId } = await params; + const formData = await request.formData(); + const shouldDelete = formData.get("intent") === "delete"; + + const existingVideo = await db.video.findUnique({ + where: { + id: videoId, + }, + select: { + id: true, + channelId: true, + videoFilename: true, + videoMimeType: true, + videoSizeBytes: true, + thumbnailFilename: true, + thumbnailMimeType: true, + }, + }); + + if (!existingVideo || existingVideo.channelId !== channel.id) { + return redirectWithError(request, "Video not found."); + } + + if (shouldDelete) { + try { + await db.video.delete({ + where: { + id: videoId, + }, + }); + + await Promise.all([ + unlink(getVideoPath(existingVideo.videoFilename)).catch(() => undefined), + existingVideo.thumbnailFilename + ? unlink(getThumbnailPath(existingVideo.thumbnailFilename)).catch(() => undefined) + : undefined, + ]); + + return redirectWithSuccess(request, "Video deleted."); + } catch { + return redirectWithError(request, "Failed to delete video."); + } + } + + const parsed = videoMetadataSchema.safeParse({ + title: formData.get("title"), + description: formData.get("description") || undefined, + }); + + if (!parsed.success) { + return redirectWithError(request, "Video title is required."); + } + + const videoInput = formData.get("video"); + const replacementVideo = + videoInput instanceof File && videoInput.size > 0 ? videoInput : null; + + if (replacementVideo) { + if (replacementVideo.size > maxVideoBytes) { + return redirectWithError(request, "Video exceeds the configured upload size limit."); + } + + const lowerVideoName = replacementVideo.name.toLowerCase(); + const isMp4 = + replacementVideo.type === "video/mp4" || lowerVideoName.endsWith(".mp4"); + if (!isMp4) { + return redirectWithError(request, "Only MP4 uploads are supported right now."); + } + } + + const thumbnailInput = formData.get("thumbnail"); + const replacementThumbnail = + thumbnailInput instanceof File && thumbnailInput.size > 0 ? thumbnailInput : null; + + let replacementThumbnailExtension: string | null = null; + + if (replacementThumbnail) { + if (replacementThumbnail.size > maxThumbnailBytes) { + return redirectWithError( + request, + "Thumbnail exceeds the configured upload size limit.", + ); + } + + replacementThumbnailExtension = getThumbnailExtension(replacementThumbnail); + if (!replacementThumbnailExtension) { + return redirectWithError(request, "Thumbnail must be JPG, PNG, or WEBP."); + } + } + + let nextVideoFilename = existingVideo.videoFilename; + let nextVideoMimeType = existingVideo.videoMimeType; + let nextVideoSizeBytes = existingVideo.videoSizeBytes; + let nextThumbnailFilename = existingVideo.thumbnailFilename; + let nextThumbnailMimeType = existingVideo.thumbnailMimeType; + + let newVideoPath: string | null = null; + let newThumbnailPath: string | null = null; + + if (replacementVideo) { + const version = randomUUID().replaceAll("-", ""); + nextVideoFilename = `${videoId}-${version}.mp4`; + nextVideoMimeType = replacementVideo.type || "video/mp4"; + nextVideoSizeBytes = replacementVideo.size; + newVideoPath = getVideoPath(nextVideoFilename); + } + + if (replacementThumbnail && replacementThumbnailExtension) { + const version = randomUUID().replaceAll("-", ""); + nextThumbnailFilename = `${videoId}-${version}${replacementThumbnailExtension}`; + nextThumbnailMimeType = + replacementThumbnail.type || + (replacementThumbnailExtension === ".png" + ? "image/png" + : replacementThumbnailExtension === ".webp" + ? "image/webp" + : "image/jpeg"); + newThumbnailPath = getThumbnailPath(nextThumbnailFilename); + } + + try { + if (replacementVideo || replacementThumbnail) { + await ensureStorageDirectories(); + } + + if (replacementVideo && newVideoPath) { + await writeFile(newVideoPath, Buffer.from(await replacementVideo.arrayBuffer())); + } + + if (replacementThumbnail && newThumbnailPath) { + await writeFile( + newThumbnailPath, + Buffer.from(await replacementThumbnail.arrayBuffer()), + ); + } + + await db.video.update({ + where: { + id: videoId, + }, + data: { + title: parsed.data.title, + description: parsed.data.description || null, + videoFilename: nextVideoFilename, + videoMimeType: nextVideoMimeType, + videoSizeBytes: nextVideoSizeBytes, + thumbnailFilename: nextThumbnailFilename, + thumbnailMimeType: nextThumbnailMimeType, + }, + }); + + await Promise.all([ + replacementVideo + ? unlink(getVideoPath(existingVideo.videoFilename)).catch(() => undefined) + : undefined, + replacementThumbnail && existingVideo.thumbnailFilename + ? unlink(getThumbnailPath(existingVideo.thumbnailFilename)).catch(() => undefined) + : undefined, + ]); + + return redirectWithSuccess(request, "Video updated."); + } catch { + await Promise.all([ + newVideoPath ? unlink(newVideoPath).catch(() => undefined) : undefined, + newThumbnailPath ? unlink(newThumbnailPath).catch(() => undefined) : undefined, + ]); + + return redirectWithError(request, "Failed to update video."); + } +} diff --git a/src/app/api/videos/route.ts b/src/app/api/videos/route.ts new file mode 100644 index 0000000..f12338a --- /dev/null +++ b/src/app/api/videos/route.ts @@ -0,0 +1,159 @@ +import { randomUUID } from "node:crypto"; +import { unlink, writeFile } from "node:fs/promises"; + +import { NextResponse } from "next/server"; +import { z } from "zod"; + +import { getAuthenticatedUser } from "@/lib/auth"; +import { db } from "@/lib/db"; +import { getChannel, isSetupComplete } from "@/lib/setup"; +import { + ensureStorageDirectories, + getThumbnailExtension, + getThumbnailPath, + getVideoPath, +} from "@/lib/storage"; + +export const runtime = "nodejs"; + +const metadataSchema = z.object({ + title: z.string().trim().min(1).max(140), + description: z.string().trim().max(5000).optional(), +}); + +const maxVideoBytes = Number(process.env.MAX_VIDEO_UPLOAD_BYTES ?? 1_073_741_824); +const maxThumbnailBytes = Number(process.env.MAX_THUMBNAIL_UPLOAD_BYTES ?? 5_242_880); + +function redirectWithError(request: Request, error: string) { + const url = new URL("/dashboard", request.url); + url.searchParams.set("error", error); + return NextResponse.redirect(url, 303); +} + +function redirectWithSuccess(request: Request, success: string) { + const url = new URL("/dashboard", request.url); + url.searchParams.set("success", success); + return NextResponse.redirect(url, 303); +} + +export async function POST(request: Request) { + if (!(await isSetupComplete())) { + return NextResponse.redirect(new URL("/setup", request.url), 303); + } + + const user = await getAuthenticatedUser(); + if (!user) { + return NextResponse.redirect(new URL("/login", request.url), 303); + } + + const channel = await getChannel(); + if (!channel) { + return NextResponse.redirect(new URL("/setup", request.url), 303); + } + + const formData = await request.formData(); + const metadata = metadataSchema.safeParse({ + title: formData.get("title"), + description: formData.get("description") || undefined, + }); + + if (!metadata.success) { + return redirectWithError(request, "Video title is required."); + } + + const videoInput = formData.get("video"); + if (!(videoInput instanceof File)) { + return redirectWithError(request, "Please select a video file."); + } + + if (videoInput.size <= 0) { + return redirectWithError(request, "Video file cannot be empty."); + } + + if (videoInput.size > maxVideoBytes) { + return redirectWithError(request, "Video exceeds the configured upload size limit."); + } + + const lowerVideoName = videoInput.name.toLowerCase(); + const isMp4 = videoInput.type === "video/mp4" || lowerVideoName.endsWith(".mp4"); + if (!isMp4) { + return redirectWithError(request, "Only MP4 uploads are supported right now."); + } + + const thumbnailInput = formData.get("thumbnail"); + const thumbnailFile = + thumbnailInput instanceof File && thumbnailInput.size > 0 + ? thumbnailInput + : null; + + let thumbnailExtension: string | null = null; + if (thumbnailFile) { + if (thumbnailFile.size > maxThumbnailBytes) { + return redirectWithError( + request, + "Thumbnail exceeds the configured upload size limit.", + ); + } + + thumbnailExtension = getThumbnailExtension(thumbnailFile); + if (!thumbnailExtension) { + return redirectWithError( + request, + "Thumbnail must be JPG, PNG, or WEBP.", + ); + } + } + + const videoId = randomUUID().replaceAll("-", ""); + const videoFilename = `${videoId}.mp4`; + const videoPath = getVideoPath(videoFilename); + + let thumbnailFilename: string | null = null; + let thumbnailMimeType: string | null = null; + let thumbnailPath: string | null = null; + + if (thumbnailFile && thumbnailExtension) { + thumbnailFilename = `${videoId}${thumbnailExtension}`; + thumbnailMimeType = + thumbnailFile.type || + (thumbnailExtension === ".png" + ? "image/png" + : thumbnailExtension === ".webp" + ? "image/webp" + : "image/jpeg"); + thumbnailPath = getThumbnailPath(thumbnailFilename); + } + + try { + await ensureStorageDirectories(); + + await writeFile(videoPath, Buffer.from(await videoInput.arrayBuffer())); + + if (thumbnailFile && thumbnailPath) { + await writeFile(thumbnailPath, Buffer.from(await thumbnailFile.arrayBuffer())); + } + + await db.video.create({ + data: { + id: videoId, + channelId: channel.id, + title: metadata.data.title, + description: metadata.data.description || null, + videoFilename, + videoMimeType: videoInput.type || "video/mp4", + videoSizeBytes: videoInput.size, + thumbnailFilename, + thumbnailMimeType, + }, + }); + + return redirectWithSuccess(request, "Upload complete."); + } catch { + await Promise.all([ + unlink(videoPath).catch(() => undefined), + thumbnailPath ? unlink(thumbnailPath).catch(() => undefined) : undefined, + ]); + + return redirectWithError(request, "Upload failed. Please try again."); + } +} diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx new file mode 100644 index 0000000..cce288d --- /dev/null +++ b/src/app/dashboard/layout.tsx @@ -0,0 +1,48 @@ +import Link from "next/link"; + +import { DashboardTabs } from "@/components/DashboardTabs"; +import { requireAuthenticatedUser } from "@/lib/auth"; +import { getChannel, requireSetup } from "@/lib/setup"; + +type DashboardLayoutProps = { + children: React.ReactNode; +}; + +export default async function DashboardLayout({ children }: DashboardLayoutProps) { + await requireSetup(); + + const [user, channel] = await Promise.all([requireAuthenticatedUser(), getChannel()]); + + return ( +

+
+
+
+

MeTube

+

{channel?.name ?? "Channel"}

+

+ @{user.username} + · + Manage uploads and channel details +

+
+ +
+ + View channel + +
+ +
+
+
+ + +
+ +
{children}
+
+ ); +} diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx new file mode 100644 index 0000000..8fb9b0b --- /dev/null +++ b/src/app/dashboard/page.tsx @@ -0,0 +1,122 @@ +import Image from "next/image"; +import Link from "next/link"; + +import { VideoEditorModal } from "@/components/VideoEditorModal"; +import { db } from "@/lib/db"; +import { formatBytes, formatDate } from "@/lib/format"; +import { singleValue } from "@/lib/query"; + +type DashboardPageProps = { + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; +}; + +export const dynamic = "force-dynamic"; + +export default async function DashboardPage({ searchParams }: DashboardPageProps) { + const query = await searchParams; + const videos = await db.video.findMany({ + orderBy: { + publishedAt: "desc", + }, + }); + + const success = singleValue(query.success); + const error = singleValue(query.error); + + return ( + <> + {(success || error) && ( +
+ {success ?
{success}
: null} + {error ?
{error}
: null} +
+ )} + + {videos.length > 0 ? ( +
+
+

Videos

+

+ MP4 uploads appear here. You can edit metadata, replace video files, update + thumbnails, or delete videos anytime. +

+
+
+ +
+
+ ) : null} + + {videos.length === 0 ? ( +
+

No videos yet

+

+ Publish a video now and see it live on your channel. Make sure to give it a nice + name, thumbnail and description. +

+ +
+ ) : ( +
    + {videos.map((video) => ( +
  • +
    + {video.thumbnailFilename ? ( + + ) : ( +
    + + + +
    + )} +
    + +
    + + {video.title} + + {video.description ? ( +

    {video.description}

    + ) : null} +

    + {formatDate(video.publishedAt)} + + · + + {formatBytes(video.videoSizeBytes)} +

    +
    + +
    + + Open + + +
    +
  • + ))} +
+ )} + + ); +} diff --git a/src/app/dashboard/settings/page.tsx b/src/app/dashboard/settings/page.tsx new file mode 100644 index 0000000..705f393 --- /dev/null +++ b/src/app/dashboard/settings/page.tsx @@ -0,0 +1,122 @@ +import Link from "next/link"; + +import { singleValue } from "@/lib/query"; +import { getChannel } from "@/lib/setup"; + +type DashboardSettingsPageProps = { + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; +}; + +export const dynamic = "force-dynamic"; + +export default async function DashboardSettingsPage({ + searchParams, +}: DashboardSettingsPageProps) { + const [query, channel] = await Promise.all([searchParams, getChannel()]); + const success = singleValue(query.success); + const error = singleValue(query.error); + + return ( + <> + {(success || error) && ( +
+ {success ?
{success}
: null} + {error ?
{error}
: null} +
+ )} + +
+
+

+ Channel profile +

+

+ Edits here update your public channel: the home page header, watch pages, and anywhere the + channel name appears. +

+
+ +
+
+
+
+ + Max 80 +
+ +

+ Shown next to your avatar and in navigation. +

+
+ +
+
+ + Optional · max 500 +
+