diff --git a/.cspell.json b/.cspell.json index 710cc642..536746de 100644 --- a/.cspell.json +++ b/.cspell.json @@ -30,7 +30,12 @@ "**/.*.{js,cjs,mjs,jsx,ts,cts,mts,tsx,md,mdx,json,yml,yaml,svg,webmanifest}", ".*/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx,md,mdx,json,yml,yaml,svg,webmanifest}" ], - "ignorePaths": ["pnpm-lock.yaml", "CHANGELOG.md", ".pnpm-store/"], + "ignorePaths": [ + "pnpm-lock.yaml", + "CHANGELOG.md", + ".pnpm-store/", + "packages/db/src/migrations/**" + ], "import": [ "@cspell/dict-software-terms", "@cspell/dict-npm", diff --git a/.cspell/libraries.txt b/.cspell/libraries.txt index f5d4276a..5a1c3778 100644 --- a/.cspell/libraries.txt +++ b/.cspell/libraries.txt @@ -15,7 +15,6 @@ fumadocs hiett jiti knip -libsql lightningcss mdast nanostores @@ -36,8 +35,6 @@ sonner sqld tinycolor2 tsup -turso -tursodatabase unifiedjs usehooks vfile diff --git a/.env.example b/.env.example index 0ad7f6a2..8e5f5559 100644 --- a/.env.example +++ b/.env.example @@ -42,8 +42,7 @@ GITHUB_CLIENT_SECRET= # Database URL # For views, likes, guestbook, comments, authentication. # --------------------------------------------------------------------------------------------------------- -DATABASE_URL="http://127.0.0.1:8080" -DATABASE_AUTH_TOKEN="no-need-for-local-development" +DATABASE_URL="postgres://postgres:postgres@localhost:5432/honghongme" # --------------------------------------------------------------------------------------------------------- # Redis diff --git a/.github/actions/check-setup/action.yml b/.github/actions/check-setup/action.yml index e4804063..61ad8a64 100644 --- a/.github/actions/check-setup/action.yml +++ b/.github/actions/check-setup/action.yml @@ -36,8 +36,7 @@ runs: - name: Create environment variables file shell: bash run: | - echo "DATABASE_URL=http://127.0.0.1:8080" >> .env.local - echo "DATABASE_AUTH_TOKEN=no-need-for-local-development" >> .env.local + echo "DATABASE_URL=postgres://postgres:postgres@localhost:5432/honghongme" >> .env.local echo "RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" >> .env.local echo "UPSTASH_REDIS_REST_URL=http://127.0.0.1:8079" >> .env.local echo "UPSTASH_REDIS_REST_TOKEN=honghongme" >> .env.local diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 83f5837a..7d17f8b4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -55,7 +55,7 @@ cp .env.example .env.local pnpm install ``` -5. Run libSQL using Docker (or your preferred method): +5. Run PostgreSQL using Docker (or your preferred method): ```bash docker compose up diff --git a/apps/web/src/app/api/auth/[...nextauth]/route.ts b/apps/web/src/app/api/auth/[...nextauth]/route.ts index 0836445d..8b440635 100644 --- a/apps/web/src/app/api/auth/[...nextauth]/route.ts +++ b/apps/web/src/app/api/auth/[...nextauth]/route.ts @@ -1,3 +1 @@ export { GET, POST } from '@/lib/auth' - -export const runtime = 'edge' diff --git a/apps/web/src/app/api/trpc/[trpc]/route.ts b/apps/web/src/app/api/trpc/[trpc]/route.ts index d3ef8742..af538858 100644 --- a/apps/web/src/app/api/trpc/[trpc]/route.ts +++ b/apps/web/src/app/api/trpc/[trpc]/route.ts @@ -4,13 +4,6 @@ import type { NextRequest } from 'next/server' import { appRouter } from '@/trpc/root' import { createTRPCContext } from '@/trpc/trpc' -/* - * React email renderer does not work with React 19 + Next.js 15 - * Use Node.js runtime temporarily - * @see https://github.com/resend/react-email/issues/1630 - */ -// export const runtime = 'edge' - const createContext = async (req: NextRequest) => { return createTRPCContext({ headers: req.headers diff --git a/apps/web/src/app/og/[id]/route.tsx b/apps/web/src/app/og/[id]/route.tsx index a92f2436..17793ab8 100644 --- a/apps/web/src/app/og/[id]/route.tsx +++ b/apps/web/src/app/og/[id]/route.tsx @@ -12,8 +12,6 @@ type OGRouteProps = { } } -export const runtime = 'edge' - export const GET = async (_: Request, props: OGRouteProps) => { try { const { diff --git a/apps/web/src/content/pages/about.mdx b/apps/web/src/content/pages/about.mdx index ab7d74ca..714b1e4d 100644 --- a/apps/web/src/content/pages/about.mdx +++ b/apps/web/src/content/pages/about.mdx @@ -9,7 +9,7 @@ I love using [Next.js](https://nextjs.org/) to create a website. Then use [GitHu ## About this site - Framework: [Next.js](https://nextjs.org/) -- Database: [Turso](https://turso.tech/) +- Database: [PostgreSQL](https://www.postgresql.org/) - ORM: [Drizzle](https://orm.drizzle.team/) - Authentication: [NextAuth.js](https://next-auth.js.org/) - Deployment: [Vercel](https://vercel.com) diff --git a/apps/web/src/content/projects/blog.mdx b/apps/web/src/content/projects/blog.mdx index 9f757013..0145b5e6 100644 --- a/apps/web/src/content/projects/blog.mdx +++ b/apps/web/src/content/projects/blog.mdx @@ -5,7 +5,7 @@ homepage: https://honghong.me github: https://github.com/tszhong0411/honghong.me techstack: - label: Typescript - - label: Turso + - label: PostgreSQL - label: Next.js - label: Drizzle - label: MDX diff --git a/docker-compose.yml b/docker-compose.yml index 820bb805..d2530785 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,14 +2,16 @@ version: '3' services: db: - image: ghcr.io/tursodatabase/libsql-server:latest - container_name: honghongme-db - platform: linux/amd64 + image: postgres:16-alpine + container_name: honghongme-postgres ports: - - '8080:8080' + - 5432:5432 volumes: - - ./volumes/libsql:/var/lib/sqld - + - ./volumes/postgresql:/var/lib/postgresql/data + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=honghongme redis: image: redis container_name: honghongme-redis diff --git a/packages/db/drizzle.config.ts b/packages/db/drizzle.config.ts index 03e8f65c..a4253359 100644 --- a/packages/db/drizzle.config.ts +++ b/packages/db/drizzle.config.ts @@ -2,12 +2,10 @@ import { env } from '@tszhong0411/env' import { type Config } from 'drizzle-kit' export default { - dialect: 'sqlite', - driver: 'turso', + dialect: 'postgresql', schema: './src/schema/index.ts', dbCredentials: { - url: env.DATABASE_URL, - authToken: env.DATABASE_AUTH_TOKEN + url: env.DATABASE_URL }, out: './src/migrations', strict: true, diff --git a/packages/db/package.json b/packages/db/package.json index bd53a0c1..358225a5 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -19,15 +19,16 @@ "type-check": "tsc --noEmit" }, "dependencies": { - "@libsql/client": "^0.9.0", "@paralleldrive/cuid2": "^2.2.2", "@tszhong0411/env": "workspace:*", - "drizzle-orm": "^0.33.0" + "drizzle-orm": "^0.33.0", + "pg": "^8.12.0" }, "devDependencies": { "@tszhong0411/eslint-config": "workspace:*", "@tszhong0411/tsconfig": "workspace:*", "@types/node": "^22.5.0", + "@types/pg": "^8.11.10", "drizzle-kit": "^0.24.1" }, "lint-staged": { diff --git a/packages/db/src/db.ts b/packages/db/src/db.ts index 135f6837..1cdd002d 100644 --- a/packages/db/src/db.ts +++ b/packages/db/src/db.ts @@ -1,12 +1,13 @@ -import { createClient } from '@libsql/client/web' import { env } from '@tszhong0411/env' -import { drizzle } from 'drizzle-orm/libsql' +import { drizzle } from 'drizzle-orm/node-postgres' +import pg from 'pg' import * as schema from './schema' -const client = createClient({ - url: env.DATABASE_URL, - authToken: env.DATABASE_AUTH_TOKEN +const client = new pg.Client({ + connectionString: env.DATABASE_URL }) +client.connect() + export const db = drizzle(client, { schema }) diff --git a/packages/db/src/migrate.ts b/packages/db/src/migrate.ts index c9b9b25c..57625e86 100644 --- a/packages/db/src/migrate.ts +++ b/packages/db/src/migrate.ts @@ -1,17 +1,22 @@ -import { createClient } from '@libsql/client/web' import { env } from '@tszhong0411/env' -import { drizzle } from 'drizzle-orm/libsql' -import { migrate } from 'drizzle-orm/libsql/migrator' +import { drizzle } from 'drizzle-orm/node-postgres' +import { migrate } from 'drizzle-orm/node-postgres/migrator' import path from 'node:path' +import pg from 'pg' + +import * as schema from './schema' + +const client = new pg.Client({ + connectionString: env.DATABASE_URL +}) + +client.connect() const main = async () => { try { - const db = drizzle( - createClient({ - url: env.DATABASE_URL, - authToken: env.DATABASE_AUTH_TOKEN - }) - ) + const db = drizzle(client, { + schema + }) await migrate(db, { migrationsFolder: path.join(process.cwd(), 'src/migrations') @@ -19,6 +24,8 @@ const main = async () => { console.log('🎉 Database migration successfully!') } catch (error) { console.error('❌ Database migration failed:\n', error) + } finally { + client.end() } } diff --git a/packages/db/src/migrations/0000_goofy_kree.sql b/packages/db/src/migrations/0000_goofy_kree.sql new file mode 100644 index 00000000..dbbaea35 --- /dev/null +++ b/packages/db/src/migrations/0000_goofy_kree.sql @@ -0,0 +1,126 @@ +DO $$ BEGIN + CREATE TYPE "public"."role" AS ENUM('user', 'admin'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "account" ( + "user_id" text NOT NULL, + "type" text NOT NULL, + "provider" text NOT NULL, + "provider_account_id" text NOT NULL, + "refresh_token" text, + "access_token" text, + "expires_at" integer, + "token_type" text, + "scope" text, + "id_token" text, + "session_state" text, + CONSTRAINT "account_provider_provider_account_id_pk" PRIMARY KEY("provider","provider_account_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "session" ( + "session_token" text PRIMARY KEY NOT NULL, + "user_id" text NOT NULL, + "expires" timestamp NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "user" ( + "id" text PRIMARY KEY NOT NULL, + "name" text, + "email" text NOT NULL, + "email_verified" timestamp, + "image" text, + "role" "role" DEFAULT 'user' NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "user_email_unique" UNIQUE("email") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "verification_token" ( + "identifier" text NOT NULL, + "token" text NOT NULL, + "expires" timestamp NOT NULL, + CONSTRAINT "verification_token_identifier_token_pk" PRIMARY KEY("identifier","token") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "comment" ( + "id" text PRIMARY KEY NOT NULL, + "body" text NOT NULL, + "user_id" text NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + "post_id" text NOT NULL, + "parent_id" text, + "is_deleted" boolean DEFAULT false NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "rate" ( + "user_id" text NOT NULL, + "comment_id" text NOT NULL, + "like" boolean NOT NULL, + CONSTRAINT "rate_user_id_comment_id_pk" PRIMARY KEY("user_id","comment_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "guestbook" ( + "id" text PRIMARY KEY NOT NULL, + "body" text NOT NULL, + "user_id" text NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "likes_session" ( + "id" text PRIMARY KEY NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "likes" integer DEFAULT 0 NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "post" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "slug" text PRIMARY KEY NOT NULL, + "likes" integer DEFAULT 0 NOT NULL, + "views" integer DEFAULT 0 NOT NULL +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "account" ADD CONSTRAINT "account_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "session" ADD CONSTRAINT "session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comment" ADD CONSTRAINT "comment_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comment" ADD CONSTRAINT "comment_post_id_post_slug_fk" FOREIGN KEY ("post_id") REFERENCES "public"."post"("slug") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "rate" ADD CONSTRAINT "rate_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "rate" ADD CONSTRAINT "rate_comment_id_comment_id_fk" FOREIGN KEY ("comment_id") REFERENCES "public"."comment"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "guestbook" ADD CONSTRAINT "guestbook_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/packages/db/src/migrations/0000_perpetual_fantastic_four.sql b/packages/db/src/migrations/0000_perpetual_fantastic_four.sql deleted file mode 100644 index 0e2868db..00000000 --- a/packages/db/src/migrations/0000_perpetual_fantastic_four.sql +++ /dev/null @@ -1,85 +0,0 @@ -CREATE TABLE `account` ( - `user_id` text NOT NULL, - `type` text NOT NULL, - `provider` text NOT NULL, - `provider_account_id` text NOT NULL, - `refresh_token` text, - `access_token` text, - `expires_at` integer, - `token_type` text, - `scope` text, - `id_token` text, - `session_state` text, - PRIMARY KEY(`provider`, `provider_account_id`), - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `session` ( - `session_token` text PRIMARY KEY NOT NULL, - `user_id` text NOT NULL, - `expires` integer NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `user` ( - `id` text PRIMARY KEY NOT NULL, - `name` text, - `email` text NOT NULL, - `email_verified` integer, - `image` text, - `role` text DEFAULT 'user' NOT NULL, - `created_at` integer DEFAULT (strftime('%s', 'now')) NOT NULL, - `updated_at` integer DEFAULT (strftime('%s', 'now')) NOT NULL, - CONSTRAINT "user_email_unique" UNIQUE("email") -); ---> statement-breakpoint -CREATE TABLE `verification_token` ( - `identifier` text NOT NULL, - `token` text NOT NULL, - `expires` integer NOT NULL, - PRIMARY KEY(`identifier`, `token`) -); ---> statement-breakpoint -CREATE TABLE `comment` ( - `id` text PRIMARY KEY NOT NULL, - `body` text, - `user_id` text NOT NULL, - `created_at` integer DEFAULT (strftime('%s', 'now')) NOT NULL, - `updated_at` integer DEFAULT (strftime('%s', 'now')) NOT NULL, - `post_id` text NOT NULL, - `parent_id` text, - `is_deleted` integer DEFAULT false NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`post_id`) REFERENCES `post`(`slug`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `rate` ( - `user_id` text NOT NULL, - `comment_id` text NOT NULL, - `like` integer NOT NULL, - PRIMARY KEY(`comment_id`, `user_id`), - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`comment_id`) REFERENCES `comment`(`id`) ON UPDATE no action ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `guestbook` ( - `id` text PRIMARY KEY NOT NULL, - `body` text NOT NULL, - `user_id` text NOT NULL, - `created_at` integer DEFAULT (strftime('%s', 'now')) NOT NULL, - `updated_at` integer DEFAULT (strftime('%s', 'now')) NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `likes_session` ( - `id` text PRIMARY KEY NOT NULL, - `created_at` integer DEFAULT (strftime('%s', 'now')) NOT NULL, - `likes` integer DEFAULT 0 NOT NULL -); ---> statement-breakpoint -CREATE TABLE `post` ( - `created_at` integer DEFAULT (strftime('%s', 'now')) NOT NULL, - `slug` text PRIMARY KEY NOT NULL, - `likes` integer DEFAULT 0 NOT NULL, - `views` integer DEFAULT 0 NOT NULL -); diff --git a/packages/db/src/migrations/meta/0000_snapshot.json b/packages/db/src/migrations/meta/0000_snapshot.json index 0707f277..4db38f68 100644 --- a/packages/db/src/migrations/meta/0000_snapshot.json +++ b/packages/db/src/migrations/meta/0000_snapshot.json @@ -1,105 +1,89 @@ { "_meta": { + "columns": {}, "schemas": {}, - "tables": {}, - "columns": {} + "tables": {} }, - "dialect": "sqlite", - "enums": {}, - "id": "a07e2a0e-4721-4097-9f5a-a4986cb64b88", + "dialect": "postgresql", + "enums": { + "public.role": { + "name": "role", + "schema": "public", + "values": ["user", "admin"] + } + }, + "id": "13864ac5-e3f2-4132-b612-8a864ba40220", "prevId": "00000000-0000-0000-0000-000000000000", + "schemas": {}, + "sequences": {}, "tables": { - "account": { - "name": "account", + "public.account": { "columns": { - "user_id": { - "name": "user_id", - "type": "text", + "access_token": { + "name": "access_token", + "notNull": false, "primaryKey": false, - "notNull": true, - "autoincrement": false + "type": "text" }, - "type": { - "name": "type", - "type": "text", + "expires_at": { + "name": "expires_at", + "notNull": false, "primaryKey": false, - "notNull": true, - "autoincrement": false + "type": "integer" + }, + "id_token": { + "name": "id_token", + "notNull": false, + "primaryKey": false, + "type": "text" }, "provider": { "name": "provider", - "type": "text", - "primaryKey": false, "notNull": true, - "autoincrement": false + "primaryKey": false, + "type": "text" }, "provider_account_id": { "name": "provider_account_id", - "type": "text", - "primaryKey": false, "notNull": true, - "autoincrement": false + "primaryKey": false, + "type": "text" }, "refresh_token": { "name": "refresh_token", - "type": "text", - "primaryKey": false, "notNull": false, - "autoincrement": false - }, - "access_token": { - "name": "access_token", - "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "type": "text" }, - "expires_at": { - "name": "expires_at", - "type": "integer", + "scope": { + "name": "scope", + "notNull": false, "primaryKey": false, + "type": "text" + }, + "session_state": { + "name": "session_state", "notNull": false, - "autoincrement": false + "primaryKey": false, + "type": "text" }, "token_type": { "name": "token_type", - "type": "text", - "primaryKey": false, "notNull": false, - "autoincrement": false - }, - "scope": { - "name": "scope", - "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "type": "text" }, - "id_token": { - "name": "id_token", - "type": "text", + "type": { + "name": "type", + "notNull": true, "primaryKey": false, - "notNull": false, - "autoincrement": false + "type": "text" }, - "session_state": { - "name": "session_state", - "type": "text", + "user_id": { + "name": "user_id", + "notNull": true, "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "account_user_id_user_id_fk": { - "name": "account_user_id_user_id_fk", - "tableFrom": "account", - "tableTo": "user", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" + "type": "text" } }, "compositePrimaryKeys": { @@ -108,420 +92,412 @@ "name": "account_provider_provider_account_id_pk" } }, - "uniqueConstraints": {} - }, - "session": { - "name": "session", - "columns": { - "session_token": { - "name": "session_token", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires": { - "name": "expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, "foreignKeys": { - "session_user_id_user_id_fk": { - "name": "session_user_id_user_id_fk", - "tableFrom": "session", - "tableTo": "user", + "account_user_id_user_id_fk": { "columnsFrom": ["user_id"], "columnsTo": ["id"], + "name": "account_user_id_user_id_fk", "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "tableFrom": "account", + "tableTo": "user" } }, - "compositePrimaryKeys": {}, + "indexes": {}, + "name": "account", + "schema": "", "uniqueConstraints": {} }, - "user": { - "name": "user", + "public.comment": { "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, + "body": { + "name": "body", "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "type": "text" }, - "email": { - "name": "email", - "type": "text", + "created_at": { + "default": "now()", + "name": "created_at", + "notNull": true, "primaryKey": false, + "type": "timestamp" + }, + "id": { + "name": "id", "notNull": true, - "autoincrement": false + "primaryKey": true, + "type": "text" }, - "email_verified": { - "name": "email_verified", - "type": "integer", + "is_deleted": { + "default": false, + "name": "is_deleted", + "notNull": true, "primaryKey": false, - "notNull": false, - "autoincrement": false + "type": "boolean" }, - "image": { - "name": "image", - "type": "text", - "primaryKey": false, + "parent_id": { + "name": "parent_id", "notNull": false, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'user'" + "type": "text" }, - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, + "post_id": { + "name": "post_id", "notNull": true, - "autoincrement": false, - "default": "(strftime('%s', 'now'))" + "primaryKey": false, + "type": "text" }, "updated_at": { + "default": "now()", "name": "updated_at", - "type": "integer", - "primaryKey": false, "notNull": true, - "autoincrement": false, - "default": "(strftime('%s', 'now'))" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "verification_token": { - "name": "verification_token", - "columns": { - "identifier": { - "name": "identifier", - "type": "text", "primaryKey": false, - "notNull": true, - "autoincrement": false + "type": "timestamp" }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, + "user_id": { + "name": "user_id", "notNull": true, - "autoincrement": false - }, - "expires": { - "name": "expires", - "type": "integer", "primaryKey": false, - "notNull": true, - "autoincrement": false + "type": "text" } }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "verification_token_identifier_token_pk": { - "columns": ["identifier", "token"], - "name": "verification_token_identifier_token_pk" + "compositePrimaryKeys": {}, + "foreignKeys": { + "comment_post_id_post_slug_fk": { + "columnsFrom": ["post_id"], + "columnsTo": ["slug"], + "name": "comment_post_id_post_slug_fk", + "onDelete": "no action", + "onUpdate": "no action", + "tableFrom": "comment", + "tableTo": "post" + }, + "comment_user_id_user_id_fk": { + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "name": "comment_user_id_user_id_fk", + "onDelete": "no action", + "onUpdate": "no action", + "tableFrom": "comment", + "tableTo": "user" } }, + "indexes": {}, + "name": "comment", + "schema": "", "uniqueConstraints": {} }, - "comment": { - "name": "comment", + "public.guestbook": { "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, "body": { "name": "body", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, "notNull": true, - "autoincrement": false + "primaryKey": false, + "type": "text" }, "created_at": { + "default": "now()", "name": "created_at", - "type": "integer", + "notNull": true, "primaryKey": false, + "type": "timestamp" + }, + "id": { + "name": "id", "notNull": true, - "autoincrement": false, - "default": "(strftime('%s', 'now'))" + "primaryKey": true, + "type": "text" }, "updated_at": { + "default": "now()", "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(strftime('%s', 'now'))" - }, - "post_id": { - "name": "post_id", - "type": "text", - "primaryKey": false, "notNull": true, - "autoincrement": false - }, - "parent_id": { - "name": "parent_id", - "type": "text", "primaryKey": false, - "notNull": false, - "autoincrement": false + "type": "timestamp" }, - "is_deleted": { - "name": "is_deleted", - "type": "integer", - "primaryKey": false, + "user_id": { + "name": "user_id", "notNull": true, - "autoincrement": false, - "default": false + "primaryKey": false, + "type": "text" } }, - "indexes": {}, + "compositePrimaryKeys": {}, "foreignKeys": { - "comment_user_id_user_id_fk": { - "name": "comment_user_id_user_id_fk", - "tableFrom": "comment", - "tableTo": "user", + "guestbook_user_id_user_id_fk": { "columnsFrom": ["user_id"], "columnsTo": ["id"], + "name": "guestbook_user_id_user_id_fk", "onDelete": "no action", - "onUpdate": "no action" + "onUpdate": "no action", + "tableFrom": "guestbook", + "tableTo": "user" + } + }, + "indexes": {}, + "name": "guestbook", + "schema": "", + "uniqueConstraints": {} + }, + "public.likes_session": { + "columns": { + "created_at": { + "default": "now()", + "name": "created_at", + "notNull": true, + "primaryKey": false, + "type": "timestamp" }, - "comment_post_id_post_slug_fk": { - "name": "comment_post_id_post_slug_fk", - "tableFrom": "comment", - "tableTo": "post", - "columnsFrom": ["post_id"], - "columnsTo": ["slug"], - "onDelete": "no action", - "onUpdate": "no action" + "id": { + "name": "id", + "notNull": true, + "primaryKey": true, + "type": "text" + }, + "likes": { + "default": 0, + "name": "likes", + "notNull": true, + "primaryKey": false, + "type": "integer" } }, "compositePrimaryKeys": {}, + "foreignKeys": {}, + "indexes": {}, + "name": "likes_session", + "schema": "", "uniqueConstraints": {} }, - "rate": { - "name": "rate", + "public.post": { "columns": { - "user_id": { - "name": "user_id", - "type": "text", + "created_at": { + "default": "now()", + "name": "created_at", + "notNull": true, "primaryKey": false, + "type": "timestamp" + }, + "likes": { + "default": 0, + "name": "likes", "notNull": true, - "autoincrement": false + "primaryKey": false, + "type": "integer" }, + "slug": { + "name": "slug", + "notNull": true, + "primaryKey": true, + "type": "text" + }, + "views": { + "default": 0, + "name": "views", + "notNull": true, + "primaryKey": false, + "type": "integer" + } + }, + "compositePrimaryKeys": {}, + "foreignKeys": {}, + "indexes": {}, + "name": "post", + "schema": "", + "uniqueConstraints": {} + }, + "public.rate": { + "columns": { "comment_id": { "name": "comment_id", - "type": "text", - "primaryKey": false, "notNull": true, - "autoincrement": false + "primaryKey": false, + "type": "text" }, "like": { "name": "like", - "type": "integer", + "notNull": true, "primaryKey": false, + "type": "boolean" + }, + "user_id": { + "name": "user_id", "notNull": true, - "autoincrement": false + "primaryKey": false, + "type": "text" + } + }, + "compositePrimaryKeys": { + "rate_user_id_comment_id_pk": { + "columns": ["user_id", "comment_id"], + "name": "rate_user_id_comment_id_pk" } }, - "indexes": {}, "foreignKeys": { - "rate_user_id_user_id_fk": { - "name": "rate_user_id_user_id_fk", + "rate_comment_id_comment_id_fk": { + "columnsFrom": ["comment_id"], + "columnsTo": ["id"], + "name": "rate_comment_id_comment_id_fk", + "onDelete": "cascade", + "onUpdate": "no action", "tableFrom": "rate", - "tableTo": "user", + "tableTo": "comment" + }, + "rate_user_id_user_id_fk": { "columnsFrom": ["user_id"], "columnsTo": ["id"], + "name": "rate_user_id_user_id_fk", "onDelete": "no action", - "onUpdate": "no action" - }, - "rate_comment_id_comment_id_fk": { - "name": "rate_comment_id_comment_id_fk", + "onUpdate": "no action", "tableFrom": "rate", - "tableTo": "comment", - "columnsFrom": ["comment_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "rate_user_id_comment_id_pk": { - "columns": ["comment_id", "user_id"], - "name": "rate_user_id_comment_id_pk" + "tableTo": "user" } }, + "indexes": {}, + "name": "rate", + "schema": "", "uniqueConstraints": {} }, - "guestbook": { - "name": "guestbook", + "public.session": { "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, + "expires": { + "name": "expires", "notNull": true, - "autoincrement": false - }, - "body": { - "name": "body", - "type": "text", "primaryKey": false, + "type": "timestamp" + }, + "session_token": { + "name": "session_token", "notNull": true, - "autoincrement": false + "primaryKey": true, + "type": "text" }, "user_id": { "name": "user_id", - "type": "text", - "primaryKey": false, "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "integer", "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(strftime('%s', 'now'))" - }, - "updated_at": { - "name": "updated_at", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(strftime('%s', 'now'))" + "type": "text" } }, - "indexes": {}, + "compositePrimaryKeys": {}, "foreignKeys": { - "guestbook_user_id_user_id_fk": { - "name": "guestbook_user_id_user_id_fk", - "tableFrom": "guestbook", - "tableTo": "user", + "session_user_id_user_id_fk": { "columnsFrom": ["user_id"], "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" + "name": "session_user_id_user_id_fk", + "onDelete": "cascade", + "onUpdate": "no action", + "tableFrom": "session", + "tableTo": "user" } }, - "compositePrimaryKeys": {}, + "indexes": {}, + "name": "session", + "schema": "", "uniqueConstraints": {} }, - "likes_session": { - "name": "likes_session", + "public.user": { "columns": { + "created_at": { + "default": "now()", + "name": "created_at", + "notNull": true, + "primaryKey": false, + "type": "timestamp" + }, + "email": { + "name": "email", + "notNull": true, + "primaryKey": false, + "type": "text" + }, + "email_verified": { + "name": "email_verified", + "notNull": false, + "primaryKey": false, + "type": "timestamp" + }, "id": { "name": "id", - "type": "text", - "primaryKey": true, "notNull": true, - "autoincrement": false + "primaryKey": true, + "type": "text" }, - "created_at": { - "name": "created_at", - "type": "integer", + "image": { + "name": "image", + "notNull": false, "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(strftime('%s', 'now'))" + "type": "text" }, - "likes": { - "name": "likes", - "type": "integer", + "name": { + "name": "name", + "notNull": false, + "primaryKey": false, + "type": "text" + }, + "role": { + "default": "'user'", + "name": "role", + "notNull": true, "primaryKey": false, + "type": "role", + "typeSchema": "public" + }, + "updated_at": { + "default": "now()", + "name": "updated_at", "notNull": true, - "autoincrement": false, - "default": 0 + "primaryKey": false, + "type": "timestamp" } }, - "indexes": {}, - "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "foreignKeys": {}, + "indexes": {}, + "name": "user", + "schema": "", + "uniqueConstraints": { + "user_email_unique": { + "columns": ["email"], + "name": "user_email_unique", + "nullsNotDistinct": false + } + } }, - "post": { - "name": "post", + "public.verification_token": { "columns": { - "created_at": { - "name": "created_at", - "type": "integer", - "primaryKey": false, + "expires": { + "name": "expires", "notNull": true, - "autoincrement": false, - "default": "(strftime('%s', 'now'))" + "primaryKey": false, + "type": "timestamp" }, - "slug": { - "name": "slug", - "type": "text", - "primaryKey": true, + "identifier": { + "name": "identifier", "notNull": true, - "autoincrement": false - }, - "likes": { - "name": "likes", - "type": "integer", "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 + "type": "text" }, - "views": { - "name": "views", - "type": "integer", - "primaryKey": false, + "token": { + "name": "token", "notNull": true, - "autoincrement": false, - "default": 0 + "primaryKey": false, + "type": "text" + } + }, + "compositePrimaryKeys": { + "verification_token_identifier_token_pk": { + "columns": ["identifier", "token"], + "name": "verification_token_identifier_token_pk" } }, - "indexes": {}, "foreignKeys": {}, - "compositePrimaryKeys": {}, + "indexes": {}, + "name": "verification_token", + "schema": "", "uniqueConstraints": {} } }, - "version": "6" + "version": "7" } diff --git a/packages/db/src/migrations/meta/_journal.json b/packages/db/src/migrations/meta/_journal.json index 676c3273..4dcac898 100644 --- a/packages/db/src/migrations/meta/_journal.json +++ b/packages/db/src/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "dialect": "sqlite", + "dialect": "postgresql", "entries": [ { + "breakpoints": true, "idx": 0, - "version": "6", - "when": 1716887398148, - "tag": "0000_perpetual_fantastic_four", - "breakpoints": true + "tag": "0000_goofy_kree", + "version": "7", + "when": 1726414488093 } ], - "version": "6" + "version": "7" } diff --git a/packages/db/src/schema/auth.ts b/packages/db/src/schema/auth.ts index bfa00ff7..7c83cd3d 100644 --- a/packages/db/src/schema/auth.ts +++ b/packages/db/src/schema/auth.ts @@ -1,35 +1,27 @@ import { createId } from '@paralleldrive/cuid2' -import { relations, sql } from 'drizzle-orm' -import { integer, primaryKey, sqliteTable, text } from 'drizzle-orm/sqlite-core' +import { relations } from 'drizzle-orm' +import { integer, pgEnum, pgTable, primaryKey, text, timestamp } from 'drizzle-orm/pg-core' import { comments } from './comments' import { guestbook } from './guestbook' -export const users = sqliteTable('user', { +export const roleEnum = pgEnum('role', ['user', 'admin']) + +export const users = pgTable('user', { id: text('id') .notNull() .primaryKey() .$defaultFn(() => createId()), name: text('name'), email: text('email').notNull().unique(), - emailVerified: integer('email_verified', { mode: 'timestamp_ms' }), + emailVerified: timestamp('email_verified'), image: text('image'), - role: text('role', { enum: ['user', 'admin'] }) - .default('user') - .notNull(), - createdAt: integer('created_at', { - mode: 'timestamp' - }) - .notNull() - .default(sql`(strftime('%s', 'now'))`), - updatedAt: integer('updated_at', { - mode: 'timestamp' - }) - .notNull() - .default(sql`(strftime('%s', 'now'))`) + role: roleEnum('role').default('user').notNull(), + createdAt: timestamp('created_at').notNull().defaultNow(), + updatedAt: timestamp('updated_at').notNull().defaultNow() }) -export const accounts = sqliteTable( +export const accounts = pgTable( 'account', { userId: text('user_id') @@ -53,20 +45,20 @@ export const accounts = sqliteTable( }) ) -export const sessions = sqliteTable('session', { +export const sessions = pgTable('session', { sessionToken: text('session_token').notNull().primaryKey(), userId: text('user_id') .notNull() .references(() => users.id, { onDelete: 'cascade' }), - expires: integer('expires', { mode: 'timestamp_ms' }).notNull() + expires: timestamp('expires').notNull() }) -export const verificationTokens = sqliteTable( +export const verificationTokens = pgTable( 'verification_token', { identifier: text('identifier').notNull(), token: text('token').notNull(), - expires: integer('expires', { mode: 'timestamp_ms' }).notNull() + expires: timestamp('expires').notNull() }, (verificationToken) => ({ compoundKey: primaryKey({ diff --git a/packages/db/src/schema/comments.ts b/packages/db/src/schema/comments.ts index e6d7a191..5cc6b43d 100644 --- a/packages/db/src/schema/comments.ts +++ b/packages/db/src/schema/comments.ts @@ -1,33 +1,25 @@ -import { relations, sql } from 'drizzle-orm' -import { integer, primaryKey, sqliteTable, text } from 'drizzle-orm/sqlite-core' +import { relations } from 'drizzle-orm' +import { boolean, pgTable, primaryKey, text, timestamp } from 'drizzle-orm/pg-core' import { users } from './auth' import { posts } from './posts' -export const comments = sqliteTable('comment', { +export const comments = pgTable('comment', { id: text('id').notNull().primaryKey(), body: text('body').notNull(), userId: text('user_id') .notNull() .references(() => users.id), - createdAt: integer('created_at', { - mode: 'timestamp' - }) - .notNull() - .default(sql`(strftime('%s', 'now'))`), - updatedAt: integer('updated_at', { - mode: 'timestamp' - }) - .notNull() - .default(sql`(strftime('%s', 'now'))`), + createdAt: timestamp('created_at').notNull().defaultNow(), + updatedAt: timestamp('updated_at').notNull().defaultNow(), postId: text('post_id') .notNull() .references(() => posts.slug), parentId: text('parent_id'), - isDeleted: integer('is_deleted', { mode: 'boolean' }).notNull().default(false) + isDeleted: boolean('is_deleted').notNull().default(false) }) -export const rates = sqliteTable( +export const rates = pgTable( 'rate', { userId: text('user_id') @@ -36,7 +28,7 @@ export const rates = sqliteTable( commentId: text('comment_id') .notNull() .references(() => comments.id, { onDelete: 'cascade' }), - like: integer('like', { mode: 'boolean' }).notNull() + like: boolean('like').notNull() }, (rate) => ({ compoundKey: primaryKey({ diff --git a/packages/db/src/schema/guestbook.ts b/packages/db/src/schema/guestbook.ts index b7cefc5b..f0a2bbeb 100644 --- a/packages/db/src/schema/guestbook.ts +++ b/packages/db/src/schema/guestbook.ts @@ -1,24 +1,16 @@ -import { relations, sql } from 'drizzle-orm' -import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core' +import { relations } from 'drizzle-orm' +import { pgTable, text, timestamp } from 'drizzle-orm/pg-core' import { users } from './auth' -export const guestbook = sqliteTable('guestbook', { +export const guestbook = pgTable('guestbook', { id: text('id').notNull().primaryKey(), body: text('body').notNull(), userId: text('user_id') .notNull() .references(() => users.id), - createdAt: integer('created_at', { - mode: 'timestamp' - }) - .notNull() - .default(sql`(strftime('%s', 'now'))`), - updatedAt: integer('updated_at', { - mode: 'timestamp' - }) - .notNull() - .default(sql`(strftime('%s', 'now'))`) + createdAt: timestamp('created_at').notNull().defaultNow(), + updatedAt: timestamp('updated_at').notNull().defaultNow() }) export const guestbookRelations = relations(guestbook, ({ one }) => ({ diff --git a/packages/db/src/schema/likes-sessions.ts b/packages/db/src/schema/likes-sessions.ts index 1d9d6159..32658267 100644 --- a/packages/db/src/schema/likes-sessions.ts +++ b/packages/db/src/schema/likes-sessions.ts @@ -1,12 +1,7 @@ -import { sql } from 'drizzle-orm' -import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core' +import { integer, pgTable, text, timestamp } from 'drizzle-orm/pg-core' -export const likesSessions = sqliteTable('likes_session', { +export const likesSessions = pgTable('likes_session', { id: text('id').notNull().primaryKey(), - createdAt: integer('created_at', { - mode: 'timestamp' - }) - .notNull() - .default(sql`(strftime('%s', 'now'))`), + createdAt: timestamp('created_at').notNull().defaultNow(), likes: integer('likes').notNull().default(0) }) diff --git a/packages/db/src/schema/posts.ts b/packages/db/src/schema/posts.ts index 6355d027..02321ddd 100644 --- a/packages/db/src/schema/posts.ts +++ b/packages/db/src/schema/posts.ts @@ -1,14 +1,10 @@ -import { relations, sql } from 'drizzle-orm' -import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core' +import { relations } from 'drizzle-orm' +import { integer, pgTable, text, timestamp } from 'drizzle-orm/pg-core' import { comments } from './comments' -export const posts = sqliteTable('post', { - createdAt: integer('created_at', { - mode: 'timestamp' - }) - .notNull() - .default(sql`(strftime('%s', 'now'))`), +export const posts = pgTable('post', { + createdAt: timestamp('created_at').notNull().defaultNow(), slug: text('slug').notNull().primaryKey(), likes: integer('likes').notNull().default(0), views: integer('views').notNull().default(0) diff --git a/packages/db/src/seed.ts b/packages/db/src/seed.ts index f4a5de93..e34edf37 100644 --- a/packages/db/src/seed.ts +++ b/packages/db/src/seed.ts @@ -1,20 +1,27 @@ -// import { createClient } from '@libsql/client/web' -// import { env } from '@tszhong0411/env' -// import { drizzle } from 'drizzle-orm/libsql' +import { env } from '@tszhong0411/env' +// import { drizzle } from 'drizzle-orm/node-postgres' +import pg from 'pg' + +// import * as schema from './schema' + +const client = new pg.Client({ + connectionString: env.DATABASE_URL +}) + +client.connect() + +// const db = drizzle(client, { +// schema +// }) const main = () => { try { - // const db = drizzle( - // createClient({ - // url: env.DATABASE_URL, - // authToken: env.DATABASE_AUTH_TOKEN - // }) - // ) - // console.log('🎉 Data inserted successfully!') console.log('Nothing to do') } catch (error) { console.error('❌ Error inserting data:\n', error) + } finally { + client.end() } } diff --git a/packages/env/src/index.ts b/packages/env/src/index.ts index ae1e2123..075c4be3 100644 --- a/packages/env/src/index.ts +++ b/packages/env/src/index.ts @@ -64,7 +64,6 @@ export const env = createEnv({ : {}), DATABASE_URL: z.string().url(), - DATABASE_AUTH_TOKEN: z.string().min(1), SENTRY_AUTH_TOKEN: z.string().optional(), UPSTASH_REDIS_REST_URL: z.string().url(), UPSTASH_REDIS_REST_TOKEN: z.string().min(1) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a2d42071..97b24e58 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -207,7 +207,7 @@ importers: version: 6.0.1(jiti@1.21.6)(postcss@8.4.41)(tsx@4.18.0)(yaml@2.5.0) tailwindcss: specifier: ^3.4.4 - version: 3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc)) + version: 3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) apps/web: dependencies: @@ -437,9 +437,6 @@ importers: packages/db: dependencies: - '@libsql/client': - specifier: ^0.9.0 - version: 0.9.0 '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 @@ -448,7 +445,10 @@ importers: version: link:../env drizzle-orm: specifier: ^0.33.0 - version: 0.33.0(@libsql/client@0.9.0)(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(react@18.3.1) + version: 0.33.0(@libsql/client@0.9.0)(@opentelemetry/api@1.9.0)(@types/pg@8.11.10)(pg@8.12.0)(react@18.3.1) + pg: + specifier: ^8.12.0 + version: 8.12.0 devDependencies: '@tszhong0411/eslint-config': specifier: workspace:* @@ -459,6 +459,9 @@ importers: '@types/node': specifier: ^22.5.0 version: 22.5.0 + '@types/pg': + specifier: ^8.11.10 + version: 8.11.10 drizzle-kit: specifier: ^0.24.1 version: 0.24.1 @@ -559,7 +562,7 @@ importers: version: 1.0.4(eslint@8.57.0) eslint-plugin-tailwindcss: specifier: ^3.17.3 - version: 3.17.4(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4))) + version: 3.17.4(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))) eslint-plugin-testing-library: specifier: ^6.2.2 version: 6.3.0(eslint@8.57.0)(typescript@5.5.4) @@ -740,10 +743,10 @@ importers: dependencies: '@tailwindcss/typography': specifier: ^0.5.13 - version: 0.5.14(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc))) + version: 0.5.14(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc))) + version: 1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))) devDependencies: '@tszhong0411/eslint-config': specifier: workspace:* @@ -753,7 +756,7 @@ importers: version: link:../tsconfig tailwindcss: specifier: ^3.4.4 - version: 3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc)) + version: 3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) packages/tsconfig: dependencies: @@ -868,7 +871,7 @@ importers: version: 19.0.0-rc-b57d2823-20240822(react@19.0.0-rc-b57d2823-20240822) tailwindcss: specifier: ^3.4.10 - version: 3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc)) + version: 3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) packages/utils: dependencies: @@ -4871,6 +4874,9 @@ packages: '@types/pg-pool@2.0.4': resolution: {integrity: sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==} + '@types/pg@8.11.10': + resolution: {integrity: sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==} + '@types/pg@8.6.1': resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} @@ -8749,6 +8755,9 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + ohash@1.1.3: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} @@ -8987,10 +8996,25 @@ packages: periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} + pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + + pg-pool@3.6.2: + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + peerDependencies: + pg: '>=8.0' + pg-protocol@1.6.1: resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} @@ -8998,6 +9022,22 @@ packages: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} + pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + + pg@8.12.0: + resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + phenomenon@1.6.0: resolution: {integrity: sha512-7h9/fjPD3qNlgggzm88cY58l9sudZ6Ey+UmZsizfhtawO6E3srZQXywaNm2lBwT72TbpHYRPy7ytIHeBUD/G0A==} @@ -9135,18 +9175,37 @@ packages: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} + postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + postgres-bytea@1.0.0: resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} engines: {node: '>=0.10.0'} + postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} + postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} + postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + preact-render-to-string@5.2.3: resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} peerDependencies: @@ -13234,10 +13293,12 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + optional: true '@libsql/core@0.9.0': dependencies: js-base64: 3.7.7 + optional: true '@libsql/darwin-arm64@0.3.19': optional: true @@ -13260,8 +13321,10 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + optional: true - '@libsql/isomorphic-fetch@0.2.5': {} + '@libsql/isomorphic-fetch@0.2.5': + optional: true '@libsql/isomorphic-ws@0.1.5': dependencies: @@ -13270,6 +13333,7 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + optional: true '@libsql/linux-arm64-gnu@0.3.19': optional: true @@ -13356,7 +13420,8 @@ snapshots: nanostores: 0.11.2 react: 19.0.0-rc-b57d2823-20240822 - '@neon-rs/load@0.0.4': {} + '@neon-rs/load@0.0.4': + optional: true '@next/bundle-analyzer@15.0.0-canary.129': dependencies: @@ -15224,13 +15289,13 @@ snapshots: optionalDependencies: typescript: 5.5.4 - '@tailwindcss/typography@0.5.14(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc)))': + '@tailwindcss/typography@0.5.14(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc)) + tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) '@tanstack/query-core@5.52.0': {} @@ -15381,7 +15446,7 @@ snapshots: '@types/connect@3.4.36': dependencies: - '@types/node': 20.16.1 + '@types/node': 22.5.0 '@types/conventional-commits-parser@5.0.0': dependencies: @@ -15415,7 +15480,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.16.1 + '@types/node': 22.5.0 '@types/hast@3.0.4': dependencies: @@ -15452,7 +15517,7 @@ snapshots: '@types/mysql@2.15.22': dependencies: - '@types/node': 20.16.1 + '@types/node': 22.5.0 '@types/node-forge@1.3.11': dependencies: @@ -15476,9 +15541,15 @@ snapshots: dependencies: '@types/pg': 8.6.1 + '@types/pg@8.11.10': + dependencies: + '@types/node': 22.5.0 + pg-protocol: 1.6.1 + pg-types: 4.0.2 + '@types/pg@8.6.1': dependencies: - '@types/node': 20.16.1 + '@types/node': 22.5.0 pg-protocol: 1.6.1 pg-types: 2.2.0 @@ -15502,7 +15573,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 20.16.1 + '@types/node': 22.5.0 '@types/tinycolor2@1.4.6': {} @@ -15515,6 +15586,7 @@ snapshots: '@types/ws@8.5.12': dependencies: '@types/node': 22.5.0 + optional: true '@types/yargs-parser@21.0.3': {} @@ -16798,7 +16870,8 @@ snapshots: dargs@8.1.0: {} - data-uri-to-buffer@4.0.1: {} + data-uri-to-buffer@4.0.1: + optional: true data-uri-to-buffer@6.0.2: {} @@ -16954,7 +17027,8 @@ snapshots: detect-libc@1.0.3: {} - detect-libc@2.0.2: {} + detect-libc@2.0.2: + optional: true detect-libc@2.0.3: {} @@ -17038,11 +17112,12 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.33.0(@libsql/client@0.9.0)(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(react@18.3.1): + drizzle-orm@0.33.0(@libsql/client@0.9.0)(@opentelemetry/api@1.9.0)(@types/pg@8.11.10)(pg@8.12.0)(react@18.3.1): optionalDependencies: '@libsql/client': 0.9.0 '@opentelemetry/api': 1.9.0 - '@types/pg': 8.6.1 + '@types/pg': 8.11.10 + pg: 8.12.0 react: 18.3.1 duplexer@0.1.2: {} @@ -17616,11 +17691,11 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-tailwindcss@3.17.4(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4))): + eslint-plugin-tailwindcss@3.17.4(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))): dependencies: fast-glob: 3.3.2 postcss: 8.4.41 - tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) eslint-plugin-testing-library@6.3.0(eslint@8.57.0)(typescript@5.5.4): dependencies: @@ -17868,6 +17943,7 @@ snapshots: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + optional: true fflate@0.8.2: {} @@ -17981,6 +18057,7 @@ snapshots: formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 + optional: true framer-motion@12.0.0-alpha.0(react-dom@19.0.0-rc-b57d2823-20240822(react@19.0.0-rc-b57d2823-20240822))(react@19.0.0-rc-b57d2823-20240822): dependencies: @@ -18887,7 +18964,8 @@ snapshots: joycon@3.1.1: {} - js-base64@3.7.7: {} + js-base64@3.7.7: + optional: true js-beautify@1.15.1: dependencies: @@ -19074,6 +19152,7 @@ snapshots: '@libsql/linux-x64-gnu': 0.3.19 '@libsql/linux-x64-musl': 0.3.19 '@libsql/win32-x64-msvc': 0.3.19 + optional: true libsql@0.4.1: dependencies: @@ -19088,6 +19167,7 @@ snapshots: '@libsql/linux-x64-gnu': 0.4.1 '@libsql/linux-x64-musl': 0.4.1 '@libsql/win32-x64-msvc': 0.4.1 + optional: true lighthouse-logger@1.4.2: dependencies: @@ -20158,7 +20238,8 @@ snapshots: dependencies: minimatch: 3.1.2 - node-domexception@1.0.0: {} + node-domexception@1.0.0: + optional: true node-fetch-native@1.6.4: {} @@ -20171,6 +20252,7 @@ snapshots: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + optional: true node-forge@1.3.1: {} @@ -20269,6 +20351,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + obuf@1.1.2: {} + ohash@1.1.3: {} on-finished@2.3.0: @@ -20528,8 +20612,19 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 + pg-cloudflare@1.1.1: + optional: true + + pg-connection-string@2.6.4: {} + pg-int8@1.0.1: {} + pg-numeric@1.0.2: {} + + pg-pool@3.6.2(pg@8.12.0): + dependencies: + pg: 8.12.0 + pg-protocol@1.6.1: {} pg-types@2.2.0: @@ -20540,6 +20635,30 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 + pg-types@4.0.2: + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + + pg@8.12.0: + dependencies: + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.12.0) + pg-protocol: 1.6.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + phenomenon@1.6.0: {} picocolors@1.0.1: {} @@ -20600,21 +20719,21 @@ snapshots: lightningcss: 1.26.0 postcss: 8.4.41 - postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc)): + postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 yaml: 2.5.0 optionalDependencies: postcss: 8.4.41 - ts-node: 10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc) + ts-node: 10.9.2(@types/node@20.16.1)(typescript@5.5.4) - postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 yaml: 2.5.0 optionalDependencies: postcss: 8.4.41 - ts-node: 10.9.2(@types/node@20.16.1)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@22.5.0)(typescript@5.5.4) postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.4.41)(tsx@4.18.0)(yaml@2.5.0): dependencies: @@ -20656,14 +20775,26 @@ snapshots: postgres-array@2.0.0: {} + postgres-array@3.0.2: {} + postgres-bytea@1.0.0: {} + postgres-bytea@3.0.0: + dependencies: + obuf: 1.1.2 + postgres-date@1.0.7: {} + postgres-date@2.1.0: {} + postgres-interval@1.2.0: dependencies: xtend: 4.0.2 + postgres-interval@3.0.0: {} + + postgres-range@1.1.4: {} + preact-render-to-string@5.2.3(preact@10.11.3): dependencies: preact: 10.11.3 @@ -20751,7 +20882,8 @@ snapshots: progress@2.0.3: {} - promise-limit@2.7.0: {} + promise-limit@2.7.0: + optional: true promise@8.3.0: dependencies: @@ -21844,11 +21976,11 @@ snapshots: tailwind-merge@2.5.2: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))): dependencies: - tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc)) + tailwindcss: 3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) - tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc)): + tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -21867,7 +21999,7 @@ snapshots: postcss: 8.4.41 postcss-import: 15.1.0(postcss@8.4.41) postcss-js: 4.0.1(postcss@8.4.41) - postcss-load-config: 4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.1-rc)) + postcss-load-config: 4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) postcss-nested: 6.2.0(postcss@8.4.41) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -21875,7 +22007,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.10(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): + tailwindcss@3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -21894,7 +22026,7 @@ snapshots: postcss: 8.4.41 postcss-import: 15.1.0(postcss@8.4.41) postcss-js: 4.0.1(postcss@8.4.41) - postcss-load-config: 4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + postcss-load-config: 4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)) postcss-nested: 6.2.0(postcss@8.4.41) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -22067,6 +22199,25 @@ snapshots: yn: 3.1.1 optional: true + ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.5.0 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + ts-pattern@5.3.1: {} tsconfig-paths@3.15.0: @@ -22492,7 +22643,8 @@ snapshots: dependencies: defaults: 1.0.4 - web-streams-polyfill@3.3.3: {} + web-streams-polyfill@3.3.3: + optional: true webidl-conversions@3.0.1: {} diff --git a/turbo.json b/turbo.json index bd012263..a313f470 100644 --- a/turbo.json +++ b/turbo.json @@ -19,7 +19,6 @@ "GITHUB_CLIENT_ID", "GITHUB_CLIENT_SECRET", "DATABASE_URL", - "DATABASE_AUTH_TOKEN", "UPSTASH_REDIS_REST_URL", "UPSTASH_REDIS_REST_TOKEN", "IP_ADDRESS_SALT",