From 06b87fdcd039ca56e2b30ee032cfcaff267e88b0 Mon Sep 17 00:00:00 2001 From: Usman Ghani Date: Sat, 11 Jul 2026 10:23:42 +0500 Subject: [PATCH 1/5] feat/refractor(auth-svc/drizzle): refractor authsvc database ORM from prisma to drizzle-orm, app.mjs refractor, users-db.mjs refractor, docker compose files updated - In production database apply drizzle migration manually as bun run drizzlekit-prod pull -init --- auth-svc/.env.production | 10 +- auth-svc/bun.lock | 269 +++++++---------- auth-svc/compose.test.yaml | 2 +- auth-svc/dockerfile | 2 +- auth-svc/drizzle.config.ts | 11 + .../migration.sql | 26 ++ .../snapshot.json | 285 ++++++++++++++++++ .../migration.sql | 1 + .../snapshot.json | 285 ++++++++++++++++++ .../migration.sql | 1 + .../snapshot.json | 285 ++++++++++++++++++ auth-svc/package.json | 18 +- auth-svc/src/app.mjs | 88 ++---- auth-svc/src/db/drizzle.ts | 6 + auth-svc/src/db/relations.ts | 5 + auth-svc/src/db/schema.ts | 24 ++ auth-svc/src/lib/prisma.ts | 8 - auth-svc/src/prisma.config.ts | 14 - .../migration.sql | 50 --- .../20251129111337_users_update/migration.sql | 20 -- .../20251203082632_only_users/migration.sql | 12 - .../20251222045341_photo_type/migration.sql | 2 - .../src/prisma/migrations/migration_lock.toml | 3 - auth-svc/src/prisma/schema.prisma | 26 -- auth-svc/src/users-db.mjs | 106 +++++++ auth-svc/src/users-prisma.mjs | 81 ----- auth-svc/tests/api.test.mjs | 171 ++++++----- auth-svc/tsconfig.json | 5 +- compose.dev.yaml | 2 +- compose.prod.yaml | 2 +- 30 files changed, 1274 insertions(+), 546 deletions(-) create mode 100644 auth-svc/drizzle.config.ts create mode 100644 auth-svc/drizzle/20260711043012_harsh_quicksilver/migration.sql create mode 100644 auth-svc/drizzle/20260711043012_harsh_quicksilver/snapshot.json create mode 100644 auth-svc/drizzle/20260711044055_omniscient_wind_dancer/migration.sql create mode 100644 auth-svc/drizzle/20260711044055_omniscient_wind_dancer/snapshot.json create mode 100644 auth-svc/drizzle/20260711050108_slippery_triathlon/migration.sql create mode 100644 auth-svc/drizzle/20260711050108_slippery_triathlon/snapshot.json create mode 100644 auth-svc/src/db/drizzle.ts create mode 100644 auth-svc/src/db/relations.ts create mode 100644 auth-svc/src/db/schema.ts delete mode 100644 auth-svc/src/lib/prisma.ts delete mode 100644 auth-svc/src/prisma.config.ts delete mode 100644 auth-svc/src/prisma/migrations/20251129015514_user_table_created/migration.sql delete mode 100644 auth-svc/src/prisma/migrations/20251129111337_users_update/migration.sql delete mode 100644 auth-svc/src/prisma/migrations/20251203082632_only_users/migration.sql delete mode 100644 auth-svc/src/prisma/migrations/20251222045341_photo_type/migration.sql delete mode 100644 auth-svc/src/prisma/migrations/migration_lock.toml delete mode 100644 auth-svc/src/prisma/schema.prisma create mode 100644 auth-svc/src/users-db.mjs delete mode 100644 auth-svc/src/users-prisma.mjs diff --git a/auth-svc/.env.production b/auth-svc/.env.production index e151793..c039b82 100644 --- a/auth-svc/.env.production +++ b/auth-svc/.env.production @@ -1,8 +1,8 @@ DOTENV_PUBLIC_KEY_PRODUCTION="03a00202ae7b3ad87b4f856c7281db20733d192d5e426a619225782b49b7aeb34c" -BEARER_TOKEN_PRIVATEKEY=encrypted:BDubX/DKx0CBKuHa0LCvClaLM2bzk5MOU4TB49rkS9WBdMWUXPcNwC6G9mTkf2J9Vv+ALXF6O8gOOPWzktagCyAS8e1Bf2bnl0d5ChggG+Tn6IKo3wFYvpIgWlyJYTSgWznujxqMVb9pYazjQLkEgJSyYb/TtHX+Vl6pFLitwNd34wS5uA== -PORT=encrypted:BN2Tywizb9JVjOPO7dDlWPYoPaDDu5MUuijV1VcGkt89h9zZtb8R0pjsvyXUE7AwtMr5RpGqGyN6DLayKsLW3/w9YUyLRLsql0dLPXvlDb64hL0wTXhQFoEebXaUoQ4BPwHe2S8= -APIKEY_USER=encrypted:BBPh/BO/FrhLCzGdnlLXUVioaXfmj26jy2El7w9rwr+nhqbWMkViPwAm1PWgjvH4rCMiuXlOSGQJxCe3qWOQ9q5hAEC7j+eOYd9gR9o0sUpmtnXFIZDGZivQ2LTfiTclCERrLho1UkU4J8B6PRIjomkq2uBQUvITeb3FQk1ExlwY5pBbeg== -APIKEY_PASSWORD=encrypted:BMTHTMZX87T8KcHLbC82fcLzCvsKNmWbR35yZyZasR/QkqPEzo0dCsmEjLkjSs4HhSAG4Xp6PH2fvf6GSek/8u76FhhvHb2DfUhHy/W+XJuBzQuES++FX/Fp5j4ZktlmSU/HYDtBOqBjvW4XpNWNw43h6EEHpiYilzfFg3hn373Lv7RLLA== +BEARER_TOKEN_PRIVATEKEY=encrypted:BCWHnICt8EM4LLh3vxXcqGkKuV1FfvE51q8/rWT4VNoDIocwvXPd6mdCbCpMp5c81pA24BJS1TuA9NGX9EXYqU46IAECWPYIN5AoBasyEj7ADbxrk9wkdwq8CGqgcu/Mvj60DQjKhBIG+Or6ib9LpzRrvuubY/E5fDTRnXg9ItODG73kng== +PORT=encrypted:BLxtSQX0jE+Khe07nuMbTeBxBWyFkyZgSYIfjcwHzd5rBvuKoovvSSLmz5ss7c0Fzk/N+KQAFJQAIR2FVCmq2uoWvdf5jDzbxDudXHuBkDhfhwrBMEiFib8cSLNLUUIX2flVrfA= +APIKEY_USER=encrypted:BP7eTN4EmmvxiKsc9HDLqPo1ANTegZTJmCLMuOfoGRpdf8baQEAd0MMs3T5YTeHwAnp/lbXhxurs7QCoqMqIlGSnYGcKOS78lCW+C4m0uRsdsK0/rI3fc5HzQHI/t0z3wdMj6/uGcJHjGSMCSecjfN5H72uJbfgX2HZh9KvdV0dN3+n6wQ== +APIKEY_PASSWORD=encrypted:BFXF3VvlP+PLuPLUTQi2myN6jkkFeuwydhiloxyFxnAZm3iyuA3JjKX/6L+LBsAtQq5s/8mYs39y+hPEVZHpatQpYq25VSXpkvXFbKHbasry7i+TzScV02ijrRtCZmxXRVN4vXAD2MhTSblmKuyWLJZmyd1e3xZ0Jw/vm62eYsVJGA1kkA== -DATABASE_URL="encrypted:BJxyvcdrdaJM6Cz1L0a/eUArmSsuTeyWEbsfYPpvLSsasgajPKEDfunXO/Mbi4HReVo7ndS6d6xmjdUwAw6nBZ8bkoqgWv9kIS71LpKYpcOVSebiyGGOPLJOyXs2gG/h9HtOasGItB2IjnAUyDw32TlIgK4SNCNKi3nNNTdIcwIVOhVJgPtg2bdqp7YMfxS8/OxBjMI3poM8+/VBIGn03t113tE3JZgDnDKnspjlsamFgXQ7et1jAFY4YaSJmupyKPZqyn7VqVkpOjm2ibgz9SYuVenVojJ+RpI0ggMGfkZzCibtNd9Th6tObK/+AYShWVqonpaR3pWJ" \ No newline at end of file +DATABASE_URL="encrypted:BEOzuuJS67PKMSqlS8vZkbclGkT8TdMVHuoN5yAQQtI8NStsGnvAIqAlq9/ws6F84FAYwdaSxhRPkb5vVyKndpKFfZWuk8IIONMf1FFiaDqlHX5bIfW1cup4Oa39FA8FG78CHYs8NcPOjpSVTz1McO3iZkaulH9fAMRozrhctEmLPhFyBMnEsJ52pt/8ukvvQ5wUjylwVJOrYgGNALiumTQ5+/M1ufa64/SPaVFCf++xcThqoWYoYkZyG9r4nBzlWCDHuRIEjSX6ObyZHzMLhR8T78zIqhZk6shze5hDEl/+9Gr2NkTrd+eIEozvD0E6Cz5BFZs1VJ0R" \ No newline at end of file diff --git a/auth-svc/bun.lock b/auth-svc/bun.lock index c7a0702..fa776ed 100644 --- a/auth-svc/bun.lock +++ b/auth-svc/bun.lock @@ -6,93 +6,90 @@ "name": "postbase-users-api", "dependencies": { "@dotenvx/dotenvx": "^1.75.1", - "@prisma/adapter-pg": "^7.8.0", - "@prisma/client": "^7.8.0", "bcryptjs": "^3.0.3", + "drizzle-orm": "^1.0.0-rc.4", "hono": "^4.12.28", "jsonwebtoken": "^9.0.3", + "pg": "^8.22.0", }, "devDependencies": { "@types/bun": "^1.3.14", - "prisma": "^7.8.0", + "@types/node": "^26.1.1", + "@types/pg": "^8.20.0", + "drizzle-kit": "^1.0.0-rc.4", + "tsx": "^4.23.0", "typescript": "^5.9.3", }, }, }, "packages": { - "@clack/core": ["@clack/core@0.5.0", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow=="], - - "@clack/prompts": ["@clack/prompts@0.11.0", "", { "dependencies": { "@clack/core": "0.5.0", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw=="], - "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.75.1", "", { "dependencies": { "@dotenvx/primitives": "^0.8.0", "commander": "^11.1.0", "conf": "^10.2.0", "dotenv": "^17.2.1", "enquirer": "^2.4.1", "env-paths": "^2.2.1", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "open": "^8.4.2", "picomatch": "^4.0.4", "systeminformation": "^5.22.11", "undici": "^7.11.0", "which": "^4.0.0", "yocto-spinner": "^1.1.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js" } }, "sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ=="], "@dotenvx/primitives": ["@dotenvx/primitives@0.8.0", "", {}, "sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg=="], - "@electric-sql/pglite": ["@electric-sql/pglite@0.4.1", "", {}, "sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q=="], + "@drizzle-team/brocli": ["@drizzle-team/brocli@0.11.0", "", {}, "sha512-hD3pekGiPg0WPCCGAZmusBBJsDqGUR66Y452YgQsZOnkdQ7ViEPKuyP4huUGEZQefp8g34RRodXYmJ2TbCH+tg=="], - "@electric-sql/pglite-socket": ["@electric-sql/pglite-socket@0.1.1", "", { "peerDependencies": { "@electric-sql/pglite": "0.4.1" }, "bin": { "pglite-server": "dist/scripts/server.js" } }, "sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], - "@electric-sql/pglite-tools": ["@electric-sql/pglite-tools@0.3.1", "", { "peerDependencies": { "@electric-sql/pglite": "0.4.1" } }, "sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], - "@hono/node-server": ["@hono/node-server@1.19.11", "", { "peerDependencies": { "hono": "^4" } }, "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], - "@kurkle/color": ["@kurkle/color@0.3.4", "", {}, "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], - "@prisma/adapter-pg": ["@prisma/adapter-pg@7.8.0", "", { "dependencies": { "@prisma/driver-adapter-utils": "7.8.0", "@types/pg": "^8.16.0", "pg": "^8.16.3", "postgres-array": "3.0.4" } }, "sha512-ygb3UkerK3v8MDpXVgCISdRNDozpxh6+JVJgiIGbSr5KBgz10LLf5ejUskPGoXlsIjxsOu6nuy1JVQr2EKGSlg=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], - "@prisma/client": ["@prisma/client@7.8.0", "", { "dependencies": { "@prisma/client-runtime-utils": "7.8.0" }, "peerDependencies": { "prisma": "*", "typescript": ">=5.4.0" }, "optionalPeers": ["prisma", "typescript"] }, "sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], - "@prisma/client-runtime-utils": ["@prisma/client-runtime-utils@7.8.0", "", {}, "sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], - "@prisma/config": ["@prisma/config@7.8.0", "", { "dependencies": { "c12": "3.3.4", "deepmerge-ts": "7.1.5", "effect": "3.20.0", "empathic": "2.0.0" } }, "sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], - "@prisma/debug": ["@prisma/debug@7.8.0", "", {}, "sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], - "@prisma/dev": ["@prisma/dev@0.24.3", "", { "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" } }, "sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], - "@prisma/driver-adapter-utils": ["@prisma/driver-adapter-utils@7.8.0", "", { "dependencies": { "@prisma/debug": "7.8.0" } }, "sha512-/Q13o0ZT0rjc1Xk0Q9KhZYwuq2EW/vSbWUBKfgEKkaCuB/Sg6bqnjmTZqC5cD4d6y1vfFAEwBRzfzoSMIVJ55A=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], - "@prisma/engines": ["@prisma/engines@7.8.0", "", { "dependencies": { "@prisma/debug": "7.8.0", "@prisma/engines-version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", "@prisma/fetch-engine": "7.8.0", "@prisma/get-platform": "7.8.0" } }, "sha512-jx3rCnNNrt5uzbkKlegtQ2GZHxSlihMCzutgT/BP6UIDF1r9tDI39hV/0T/cHZgzJ3ELbuQPXlVZy+Y1n0pcgw=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], - "@prisma/engines-version": ["@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", "", {}, "sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], - "@prisma/fetch-engine": ["@prisma/fetch-engine@7.8.0", "", { "dependencies": { "@prisma/debug": "7.8.0", "@prisma/engines-version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", "@prisma/get-platform": "7.8.0" } }, "sha512-gwB0Euiz/DDRyxFRpLXYlK3RfaZUj1c5dAYMuhZYfApg7arknJlcb9bIsOHDppJmbqYaVA+yBIiFMDBfprsNPQ=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], - "@prisma/get-platform": ["@prisma/get-platform@7.2.0", "", { "dependencies": { "@prisma/debug": "7.2.0" } }, "sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], - "@prisma/query-plan-executor": ["@prisma/query-plan-executor@7.2.0", "", {}, "sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], - "@prisma/streams-local": ["@prisma/streams-local@0.1.2", "", { "dependencies": { "ajv": "^8.12.0", "better-result": "^2.7.0", "env-paths": "^3.0.0", "proper-lockfile": "^4.1.2" } }, "sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], - "@prisma/studio-core": ["@prisma/studio-core@0.27.3", "", { "dependencies": { "@radix-ui/react-toggle": "1.1.10", "chart.js": "4.5.1" }, "peerDependencies": { "@types/react": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], - "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], - "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], - "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], - "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.10", "", { "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], - "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "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" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], - "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "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" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], - "@radix-ui/react-use-layout-effect": ["@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" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], - "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + "@js-temporal/polyfill": ["@js-temporal/polyfill@0.5.1", "", { "dependencies": { "jsbi": "^4.3.0" } }, "sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ=="], "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], - "@types/node": ["@types/node@24.13.2", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA=="], + "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], "@types/pg": ["@types/pg@8.20.0", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow=="], - "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], - - "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], @@ -102,111 +99,73 @@ "atomically": ["atomically@1.7.0", "", {}, "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w=="], - "aws-ssl-profiles": ["aws-ssl-profiles@1.1.2", "", {}, "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="], - "bcryptjs": ["bcryptjs@3.0.3", "", { "bin": { "bcrypt": "bin/bcrypt" } }, "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g=="], - "better-result": ["better-result@2.7.0", "", { "dependencies": { "@clack/prompts": "^0.11.0" }, "bin": { "better-result": "bin/cli.mjs" } }, "sha512-7zrmXjAK8u8Z6SOe4R65XObOR5X+Y2I/VVku3t5cPOGQ8/WsBcfFmfnIPiEl5EBMDOzPHRwbiPbMtQBKYdw7RA=="], - "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], - "c12": ["c12@3.3.4", "", { "dependencies": { "chokidar": "^5.0.0", "confbox": "^0.2.4", "defu": "^6.1.6", "dotenv": "^17.3.1", "exsolve": "^1.0.8", "giget": "^3.2.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "pkg-types": "^2.3.0", "rc9": "^3.0.1" }, "peerDependencies": { "magicast": "*" }, "optionalPeers": ["magicast"] }, "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA=="], - - "chart.js": ["chart.js@4.5.1", "", { "dependencies": { "@kurkle/color": "^0.3.0" } }, "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw=="], - - "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], - "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], "conf": ["conf@10.2.0", "", { "dependencies": { "ajv": "^8.6.3", "ajv-formats": "^2.1.1", "atomically": "^1.7.0", "debounce-fn": "^4.0.0", "dot-prop": "^6.0.1", "env-paths": "^2.2.1", "json-schema-typed": "^7.0.3", "onetime": "^5.1.2", "pkg-up": "^3.1.0", "semver": "^7.3.5" } }, "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg=="], - "confbox": ["confbox@0.2.4", "", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="], - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - "debounce-fn": ["debounce-fn@4.0.0", "", { "dependencies": { "mimic-fn": "^3.0.0" } }, "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ=="], - "deepmerge-ts": ["deepmerge-ts@7.1.5", "", {}, "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw=="], - "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], - "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], - - "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], - - "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], - "dot-prop": ["dot-prop@6.0.1", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA=="], - "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], + "dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="], - "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + "drizzle-kit": ["drizzle-kit@1.0.0-rc.4-ca0f029", "", { "dependencies": { "@drizzle-team/brocli": "^0.11.0", "@js-temporal/polyfill": "^0.5.1", "esbuild": "^0.25.10", "get-tsconfig": "^4.13.6", "jiti": "^2.6.1" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-hM1K72ptIPOpJDScHo7cAF+K8A8Tr3q2yHvBJvOZWvLn2lN+G4RDUvG3rT3ohlSE2O3BN/s7g3e3JiQLStt8iQ=="], - "effect": ["effect@3.20.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw=="], + "drizzle-orm": ["drizzle-orm@1.0.0-rc.4-5d5b77c", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@effect/sql-pg": ">=4.0.0-beta.58 || >=4.0.0", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@sinclair/typebox": ">=0.34.8", "@sqlitecloud/drivers": ">=1.0.653", "@tidbcloud/serverless": "*", "@tursodatabase/database": ">=0.2.1", "@tursodatabase/database-common": ">=0.2.1", "@tursodatabase/database-wasm": ">=0.2.1", "@types/better-sqlite3": "*", "@types/mssql": "^9.1.4", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "arktype": ">=2.0.0", "better-sqlite3": ">=9.3.0", "bun-types": "*", "effect": ">=4.0.0-beta.58 || >=4.0.0", "expo-sqlite": ">=14.0.0", "mssql": "^11.0.1", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5", "typebox": ">=1.0.0", "valibot": ">=1.0.0-beta.7", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@effect/sql-pg", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@sinclair/typebox", "@sqlitecloud/drivers", "@tidbcloud/serverless", "@tursodatabase/database", "@tursodatabase/database-common", "@tursodatabase/database-wasm", "@types/better-sqlite3", "@types/mssql", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "arktype", "better-sqlite3", "bun-types", "effect", "expo-sqlite", "mssql", "mysql2", "pg", "postgres", "sql.js", "sqlite3", "typebox", "valibot", "zod"] }, "sha512-Oq9W4B11PracWY9cuCLTFT+JA5kXqR6rBmWcM8oh0xwLgCviVl9wh6ZuWX7Zpv1Jir/8W+M37syvjSYtj1f5iA=="], - "empathic": ["empathic@2.0.0", "", {}, "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA=="], + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], - "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], - - "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], - "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], + "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], + "fast-uri": ["fast-uri@3.1.3", "", {}, "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], - "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], - - "generate-function": ["generate-function@2.3.1", "", { "dependencies": { "is-property": "^1.0.2" } }, "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ=="], - - "get-port-please": ["get-port-please@3.2.0", "", {}, "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - "giget": ["giget@3.2.0", "", { "bin": { "giget": "dist/cli.mjs" } }, "sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A=="], - - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - - "grammex": ["grammex@3.1.12", "", {}, "sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ=="], - - "graphmatch": ["graphmatch@1.1.1", "", {}, "sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg=="], + "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], "hono": ["hono@4.12.28", "", {}, "sha512-YwUvVpSF7m1yOblFPrU3Hbo8XhPheBoiyfGuII6z19LnOr6JpDnyyp7LFNrfV56wS8tpvtBFGRISHN02pDdLOA=="], - "http-status-codes": ["http-status-codes@2.3.0", "", {}, "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA=="], - "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], - "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], - "is-property": ["is-property@1.0.2", "", {}, "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="], - "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], - "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + + "jsbi": ["jsbi@4.3.2", "", {}, "sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew=="], "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], @@ -234,26 +193,16 @@ "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], - "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], - - "lru.min": ["lru.min@1.1.4", "", {}, "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA=="], - "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], "mimic-fn": ["mimic-fn@3.1.0", "", {}, "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "mysql2": ["mysql2@3.15.3", "", { "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" } }, "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg=="], - - "named-placeholders": ["named-placeholders@1.1.6", "", { "dependencies": { "lru.min": "^1.1.0" } }, "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w=="], - "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="], - "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], "open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], @@ -268,37 +217,27 @@ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "pg": ["pg@8.22.0", "", { "dependencies": { "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", "pg-protocol": "^1.15.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.4.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA=="], - "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="], + "pg-cloudflare": ["pg-cloudflare@1.4.0", "", {}, "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A=="], - "pg": ["pg@8.20.0", "", { "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" }, "optionalDependencies": { "pg-cloudflare": "^1.3.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA=="], - - "pg-cloudflare": ["pg-cloudflare@1.3.0", "", {}, "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ=="], - - "pg-connection-string": ["pg-connection-string@2.12.0", "", {}, "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ=="], + "pg-connection-string": ["pg-connection-string@2.14.0", "", {}, "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg=="], "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], - "pg-pool": ["pg-pool@3.13.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA=="], + "pg-pool": ["pg-pool@3.14.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw=="], - "pg-protocol": ["pg-protocol@1.13.0", "", {}, "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w=="], + "pg-protocol": ["pg-protocol@1.15.0", "", {}, "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ=="], "pg-types": ["pg-types@2.2.0", "", { "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" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - - "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - - "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], "pkg-up": ["pkg-up@3.1.0", "", { "dependencies": { "find-up": "^3.0.0" } }, "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA=="], - "postgres": ["postgres@3.4.7", "", {}, "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw=="], - - "postgres-array": ["postgres-array@3.0.4", "", {}, "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ=="], + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], @@ -306,96 +245,102 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "prisma": ["prisma@7.8.0", "", { "dependencies": { "@prisma/config": "7.8.0", "@prisma/dev": "0.24.3", "@prisma/engines": "7.8.0", "@prisma/studio-core": "0.27.3", "mysql2": "3.15.3", "postgres": "3.4.7" }, "peerDependencies": { "better-sqlite3": ">=9.0.0", "typescript": ">=5.4.0" }, "optionalPeers": ["better-sqlite3", "typescript"], "bin": { "prisma": "build/index.js" } }, "sha512-yfN4yrw7HV9kEJhoy1+jgah0jafEIQsf7uWouSsM8MvJtlubsk+kM7AIBWZ8+GJl74Yj3c+nbYqBkMOxtsZ3Lw=="], + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], - "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "rc9": ["rc9@3.0.1", "", { "dependencies": { "defu": "^6.1.6", "destr": "^2.0.5" } }, "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ=="], + "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], - "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], - "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "remeda": ["remeda@2.33.4", "", {}, "sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ=="], + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], - "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "systeminformation": ["systeminformation@5.31.15", "", { "os": "!aix", "bin": { "systeminformation": "lib/cli.js" } }, "sha512-7mqCtD28TK5dVdLAQONVa/Do/NBgMH2dxqf49nh6DIKoEWuDg6tkgGBP+dN22VEJVPZa/QqiHomhWNRn4WUNTQ=="], - "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "tsx": ["tsx@4.23.0", "", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w=="], - "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + "undici": ["undici@7.28.0", "", {}, "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA=="], - "seq-queue": ["seq-queue@0.0.5", "", {}, "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="], + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], - "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "yocto-spinner": ["yocto-spinner@1.2.1", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-9cbFWLhbiZp+820O4pkHGNncI7+MrUGzBOjw8NMG+ewsY+aG0DdEXnr19Smxao32YOjLZRMdn1UtaxcrXOYOIg=="], - "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], - "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "sqlstring": ["sqlstring@2.3.3", "", {}, "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="], + "onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], + "tsx/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], - "systeminformation": ["systeminformation@5.31.13", "", { "os": "!aix", "bin": { "systeminformation": "lib/cli.js" } }, "sha512-iUJXJoKzm4vtLSeT3nwe2s9QjoJAxHg7wYJ0KaQ54Xy2u9jsTq0ULWQQ0+T72FXjX2XnGqubazNx9lUfng7ELw=="], + "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], - "undici": ["undici@7.28.0", "", {}, "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA=="], + "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], - "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], - "valibot": ["valibot@1.2.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg=="], + "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], - "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], - "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], - "yocto-spinner": ["yocto-spinner@1.1.0", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-/BY0AUXnS7IKO354uLLA2eRcWiqDifEbd6unXCsOxkFDAkhgUL3PH9X2bFoaU0YchnDXsF+iKleeTLJGckbXfA=="], + "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], - "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], + "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], - "zeptomatch": ["zeptomatch@2.1.0", "", { "dependencies": { "grammex": "^3.1.11", "graphmatch": "^1.1.0" } }, "sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA=="], + "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], - "@prisma/dev/hono": ["hono@4.12.10", "", {}, "sha512-mx/p18PLy5og9ufies2GOSUqep98Td9q4i/EF6X7yJgAiIopxqdfIO3jbqsi3jRgTgw88jMDEzVKi+V2EF+27w=="], + "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], - "@prisma/engines/@prisma/get-platform": ["@prisma/get-platform@7.8.0", "", { "dependencies": { "@prisma/debug": "7.8.0" } }, "sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw=="], + "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], - "@prisma/fetch-engine/@prisma/get-platform": ["@prisma/get-platform@7.8.0", "", { "dependencies": { "@prisma/debug": "7.8.0" } }, "sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw=="], + "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], - "@prisma/get-platform/@prisma/debug": ["@prisma/debug@7.2.0", "", {}, "sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw=="], + "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], - "@prisma/streams-local/env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], + "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], - "@types/pg/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], - "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], - "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], - "onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], - "pg-types/postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], - "@types/pg/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "tsx/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], - "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + + "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + + "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + + "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], } } diff --git a/auth-svc/compose.test.yaml b/auth-svc/compose.test.yaml index eaea89c..865c876 100644 --- a/auth-svc/compose.test.yaml +++ b/auth-svc/compose.test.yaml @@ -3,7 +3,7 @@ services: build: context: . target: prerelease - command: ["bun", "run", "prisma-dev", "migrate", "dev"] + command: ["bun", "run", "drizzlekit-dev", "migrate"] environment: - DOTENV_PRIVATE_KEY_DEVELOPMENT networks: diff --git a/auth-svc/dockerfile b/auth-svc/dockerfile index 397c7f1..1615be7 100644 --- a/auth-svc/dockerfile +++ b/auth-svc/dockerfile @@ -18,7 +18,7 @@ RUN mkdir /auth-svc WORKDIR /auth-svc COPY --from=install /temp/dev/node_modules node_modules COPY . . -RUN bunx --bun prisma --config=./src/prisma.config.ts generate +RUN bun run drizzlekit-dev generate EXPOSE 5859 CMD [ "bun", "run", "dev" ] diff --git a/auth-svc/drizzle.config.ts b/auth-svc/drizzle.config.ts new file mode 100644 index 0000000..437b1d3 --- /dev/null +++ b/auth-svc/drizzle.config.ts @@ -0,0 +1,11 @@ +import '@dotenvx/dotenvx/config'; +import { defineConfig } from 'drizzle-kit'; + +export default defineConfig({ + schema: './src/db/schema.ts', + out: "./drizzle", + dialect: "postgresql", + dbCredentials: { + url: process.env.DATABASE_URL!, + } +}) \ No newline at end of file diff --git a/auth-svc/drizzle/20260711043012_harsh_quicksilver/migration.sql b/auth-svc/drizzle/20260711043012_harsh_quicksilver/migration.sql new file mode 100644 index 0000000..b0157b4 --- /dev/null +++ b/auth-svc/drizzle/20260711043012_harsh_quicksilver/migration.sql @@ -0,0 +1,26 @@ +-- Current sql file was generated after introspecting the database +-- If you want to run this migration if will destroy all data! please uncomment this code before executing migrations +-- These Migration was automaticlly applied durring drizzle-kit pull --init +-- The best way to apply this it to run drizzle-kit pull --init +/* +CREATE TABLE "Users" ( + "id" uuid PRIMARY KEY, + "username" varchar(255) NOT NULL, + "password_hash" varchar(2040) NOT NULL, + "provider" varchar(255) DEFAULT 'Local' NOT NULL, + "pid" text, + "displayName" varchar(255), + "fullName" varchar(255) NOT NULL, + "firstName" varchar(255) NOT NULL, + "lastName" varchar(255), + "email" varchar(255) NOT NULL, + "photoURL" varchar(2024), + "photo" bytea, + "photoType" varchar(255), + "created_at" timestamp(6) with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, + "updated_at" timestamp(6) with time zone NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX "Users_email_key" ON "Users" ("email");--> statement-breakpoint +CREATE UNIQUE INDEX "Users_pid_key" ON "Users" ("pid");--> statement-breakpoint +CREATE UNIQUE INDEX "Users_username_key" ON "Users" ("username"); \ No newline at end of file diff --git a/auth-svc/drizzle/20260711043012_harsh_quicksilver/snapshot.json b/auth-svc/drizzle/20260711043012_harsh_quicksilver/snapshot.json new file mode 100644 index 0000000..731e425 --- /dev/null +++ b/auth-svc/drizzle/20260711043012_harsh_quicksilver/snapshot.json @@ -0,0 +1,285 @@ +{ + "dialect": "postgres", + "id": "b0e2ad12-cfef-423c-b8eb-cd988038e56d", + "prevIds": [ + "00000000-0000-0000-0000-000000000000" + ], + "version": "8", + "ddl": [ + { + "isRlsEnabled": false, + "name": "Users", + "entityType": "tables", + "schema": "public" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "username", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(2040)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "password_hash", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'Local'", + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pid", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "displayName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fullName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "firstName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lastName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "email", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(2024)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photoURL", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "bytea", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photoType", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "timestamp(6) with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "CURRENT_TIMESTAMP", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "timestamp(6) with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "nameExplicit": true, + "columns": [ + { + "asc": true, + "nullsFirst": false, + "opclass": null, + "isExpression": false, + "value": "email" + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "Users_email_key", + "entityType": "indexes", + "schema": "public", + "table": "Users" + }, + { + "nameExplicit": true, + "columns": [ + { + "asc": true, + "nullsFirst": false, + "opclass": null, + "isExpression": false, + "value": "pid" + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "Users_pid_key", + "entityType": "indexes", + "schema": "public", + "table": "Users" + }, + { + "nameExplicit": true, + "columns": [ + { + "asc": true, + "nullsFirst": false, + "opclass": null, + "isExpression": false, + "value": "username" + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "Users_username_key", + "entityType": "indexes", + "schema": "public", + "table": "Users" + }, + { + "columns": [ + "id" + ], + "nameExplicit": true, + "name": "Users_pkey", + "entityType": "pks", + "schema": "public", + "table": "Users" + } + ], + "renames": [] +} \ No newline at end of file diff --git a/auth-svc/drizzle/20260711044055_omniscient_wind_dancer/migration.sql b/auth-svc/drizzle/20260711044055_omniscient_wind_dancer/migration.sql new file mode 100644 index 0000000..97f7d7c --- /dev/null +++ b/auth-svc/drizzle/20260711044055_omniscient_wind_dancer/migration.sql @@ -0,0 +1 @@ +ALTER TABLE "Users" ALTER COLUMN "updated_at" SET DEFAULT now(); \ No newline at end of file diff --git a/auth-svc/drizzle/20260711044055_omniscient_wind_dancer/snapshot.json b/auth-svc/drizzle/20260711044055_omniscient_wind_dancer/snapshot.json new file mode 100644 index 0000000..424aaa6 --- /dev/null +++ b/auth-svc/drizzle/20260711044055_omniscient_wind_dancer/snapshot.json @@ -0,0 +1,285 @@ +{ + "version": "8", + "dialect": "postgres", + "id": "366dc56c-1f3f-4c2a-a449-9664f44353df", + "prevIds": [ + "2c0a0da3-479a-4692-94d1-1f9ed5a78f4b" + ], + "ddl": [ + { + "isRlsEnabled": false, + "name": "Users", + "entityType": "tables", + "schema": "public" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "username", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(2040)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "password_hash", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'Local'", + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pid", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "displayName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fullName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "firstName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lastName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "email", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(2024)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photoURL", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "bytea", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photoType", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "timestamp(6) with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "CURRENT_TIMESTAMP", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "timestamp(6) with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "email", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "Users_email_key", + "entityType": "indexes", + "schema": "public", + "table": "Users" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "pid", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "Users_pid_key", + "entityType": "indexes", + "schema": "public", + "table": "Users" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "username", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "Users_username_key", + "entityType": "indexes", + "schema": "public", + "table": "Users" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "Users_pkey", + "schema": "public", + "table": "Users", + "entityType": "pks" + } + ], + "renames": [] +} \ No newline at end of file diff --git a/auth-svc/drizzle/20260711050108_slippery_triathlon/migration.sql b/auth-svc/drizzle/20260711050108_slippery_triathlon/migration.sql new file mode 100644 index 0000000..4b2a54d --- /dev/null +++ b/auth-svc/drizzle/20260711050108_slippery_triathlon/migration.sql @@ -0,0 +1 @@ +ALTER TABLE "Users" ALTER COLUMN "id" SET DEFAULT gen_random_uuid(); \ No newline at end of file diff --git a/auth-svc/drizzle/20260711050108_slippery_triathlon/snapshot.json b/auth-svc/drizzle/20260711050108_slippery_triathlon/snapshot.json new file mode 100644 index 0000000..7fa5614 --- /dev/null +++ b/auth-svc/drizzle/20260711050108_slippery_triathlon/snapshot.json @@ -0,0 +1,285 @@ +{ + "version": "8", + "dialect": "postgres", + "id": "c295118c-8fb9-438a-8c10-a21767ef2fd6", + "prevIds": [ + "366dc56c-1f3f-4c2a-a449-9664f44353df" + ], + "ddl": [ + { + "isRlsEnabled": false, + "name": "Users", + "entityType": "tables", + "schema": "public" + }, + { + "type": "uuid", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "gen_random_uuid()", + "generated": null, + "identity": null, + "name": "id", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "username", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(2040)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "password_hash", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "'Local'", + "generated": null, + "identity": null, + "name": "provider", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "text", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "pid", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "displayName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "fullName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "firstName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "lastName", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "email", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(2024)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photoURL", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "bytea", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photo", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "varchar(255)", + "typeSchema": null, + "notNull": false, + "dimensions": 0, + "default": null, + "generated": null, + "identity": null, + "name": "photoType", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "timestamp(6) with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "CURRENT_TIMESTAMP", + "generated": null, + "identity": null, + "name": "created_at", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "type": "timestamp(6) with time zone", + "typeSchema": null, + "notNull": true, + "dimensions": 0, + "default": "now()", + "generated": null, + "identity": null, + "name": "updated_at", + "entityType": "columns", + "schema": "public", + "table": "Users" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "email", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "Users_email_key", + "entityType": "indexes", + "schema": "public", + "table": "Users" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "pid", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "Users_pid_key", + "entityType": "indexes", + "schema": "public", + "table": "Users" + }, + { + "nameExplicit": true, + "columns": [ + { + "value": "username", + "isExpression": false, + "asc": true, + "nullsFirst": false, + "opclass": null + } + ], + "isUnique": true, + "where": null, + "with": "", + "method": "btree", + "concurrently": false, + "name": "Users_username_key", + "entityType": "indexes", + "schema": "public", + "table": "Users" + }, + { + "columns": [ + "id" + ], + "nameExplicit": false, + "name": "Users_pkey", + "schema": "public", + "table": "Users", + "entityType": "pks" + } + ], + "renames": [] +} \ No newline at end of file diff --git a/auth-svc/package.json b/auth-svc/package.json index fdae634..c95e4a6 100644 --- a/auth-svc/package.json +++ b/auth-svc/package.json @@ -6,28 +6,30 @@ "description": "", "main": "user-server.mjs", "scripts": { - "start": "NODE_ENV=production dotenvx run -f .env.production -- bun ./dist/app.mjs", "dev": "NODE_ENV=development dotenvx run -f .env.development -- bun ./src/app.mjs", - "prisma-pro": "NODE_ENV=production dotenvx run -f .env.production -- bunx --bun prisma --config=./src/prisma.config.ts", - "prisma-dev": "dotenvx run -f .env.development -- bunx --bun prisma --config=./src/prisma.config.ts", + "drizzlekit-prod": "NODE_ENV=production dotenvx run -f .env.production -- bun drizzle-kit", + "drizzlekit-dev": "dotenvx run -f .env.development -- bun drizzle-kit", "app": "dotenvx run -f .env.development -- bun ./src/app.mjs", - "build": "bunx --bun prisma --config=./src/prisma.config.ts generate && tsc", + "build": "bun run drizzlekit-prod generate && tsc", "test": "dotenvx run -f .env.development -- bun test --watch" }, "author": "Usman Ghani", "license": "", "dependencies": { "@dotenvx/dotenvx": "^1.75.1", - "@prisma/adapter-pg": "^7.8.0", - "@prisma/client": "^7.8.0", "bcryptjs": "^3.0.3", + "drizzle-orm": "^1.0.0-rc.4", "hono": "^4.12.28", - "jsonwebtoken": "^9.0.3" + "jsonwebtoken": "^9.0.3", + "pg": "^8.22.0" }, "devDependencies": { "@types/bun": "^1.3.14", - "prisma": "^7.8.0", + "@types/node": "^26.1.1", + "@types/pg": "^8.20.0", + "drizzle-kit": "^1.0.0-rc.4", + "tsx": "^4.23.0", "typescript": "^5.9.3" } } diff --git a/auth-svc/src/app.mjs b/auth-svc/src/app.mjs index 031a7cc..3f889aa 100644 --- a/auth-svc/src/app.mjs +++ b/auth-svc/src/app.mjs @@ -1,18 +1,11 @@ import { Hono } from "hono"; import { logger } from "hono/logger"; -import { - DBUsers, - connectDB, - findOneUser, - createUser, - sanitizedUser, - userParams, -} from "./users-prisma.mjs"; +import { UsersDataBase, sanitizedUser } from "./users-db.mjs"; import bcrypt from "bcryptjs"; import { jwt } from "hono/jwt"; export const app = new Hono(); - +const usersDb = new UsersDataBase() app.use(logger()) app.use( @@ -40,39 +33,30 @@ app.use(async (c, next) => { }); app.get("/list", async (c) => { - let users = await DBUsers.findMany(); + let users = await usersDb.findMany(); users = users.map((user) => sanitizedUser(user)); return c.json(users); }); app.post("/create-user", async (c) => { - let isAlreadyUser = await DBUsers.findUnique({ - where: { username: c.req.body.username }, - }); + let isAlreadyUser = await usersDb.findUserName(c.req.body.username); if (isAlreadyUser) { return c.text("Already a User has username: " + c.req.body.username, 500); } - let result = await createUser(c.req.body); - return c.json(result); + const user = await usersDb.createUser(c.req.body); + return c.json(user); }); app.post('/find-or-create', async (c) => { - let user = await DBUsers.findUnique({ - where: { email: c.req.body.email } - }); - if (!user) { - user = await createUser(c.req.body); - if (!user) { - console.error("Error Creating User") - return c.text("Error creating User", 500) - } - return c.json(user) - } - return c.json(user) + const user = await usersDb.findEmail(c.req.body.email) + if (user) return c.json(user); + + const newUser = await usersDb.createUser(c.req.body); + return c.json(newUser); }); app.get('/find/:userId', async (c) => { - let user = await findOneUser(c.req.param().userId) + let user = await usersDb.find(c.req.param().userId) if (user) { return c.json(user) } else { @@ -82,13 +66,7 @@ app.get('/find/:userId', async (c) => { }) app.get('/find/email/:email', async (c) => { - let user = await DBUsers.findUnique({ - where: { - email: c.req.param().email - }, - omit: { password_hash: true } - }) - + const user = await usersDb.findEmail(c.req.param().email) if (user) { return c.json(user) } else { @@ -97,11 +75,7 @@ app.get('/find/email/:email', async (c) => { }) app.get('/find/username/:username', async (c) => { - const user = await DBUsers.findUnique({ - where: { username: c.req.param().username }, - omit: { password_hash: true } - }) - + const user = await usersDb.findUserName(c.req.param().username) if (user) { return c.json(user) } else { @@ -110,47 +84,36 @@ app.get('/find/username/:username', async (c) => { }) app.post('/update-user/photo/:id', async (c) => { - const user = await DBUsers.findUnique({ where: { id: c.req.param().id }}) + const user = await usersDb.find(c.req.param().id) if (user) { - const newUser = await DBUsers.update({ - where: { id: user.id }, - data: { photoURL: c.req.body.photoURL, photoType: c.req.body.photoType }, - }) - return c.json(user) + const updated = await usersDb.updatePhoto(c.req.param().id, c.req.body.photoURL, c.req.body.photoType) + return c.json(updated) } return c.text("No such user", 404) }) app.post('/update-user/:username', async (c) => { - let isUser = await findOneUser(c.req.param().username) - if (!isUser) { + const user = await usersDb.findUserName(c.req.param().username) + if (!user) { return c.text("No Such User: " + c.req.param().username) } - let update = c.req.body - await DBUsers.update({ - data: update, where: { - username: c.req.param().username - } - }) - const updated = await findOneUser(c.req.param().username); - return c.json(updated) + const updated = await usersDb.update(c.req.param().username, c.req.body) + return c.json(updated) }) app.delete("/destroy/:username", async (c) => { - let user = await DBUsers.findUnique({ where: { username: c.req.param().username } }) + const user = await usersDb.findUserName(c.req.param().username) if (!user) { return c.text("No Such User: " + c.req.param().username, 404) } - await DBUsers.delete({ where: { id: user.id } }); + const deletedId = await usersDb.destroy(user.id); return c.json({success: true}) }) app.post('/password-check', async (c) => { - const user = await DBUsers.findUnique({ - where: { username: c.req.body.username } - }); + const user = await usersDb.getFull(c.req.body.username ); let checked; if (!user) { checked = { @@ -162,8 +125,7 @@ app.post('/password-check', async (c) => { check: false, username: c.req.body.username, message: "Could not find user" }; - } else if (user.username === c.req.body.username - && await bcrypt.compare(c.req.body.password, user.password_hash)) { + } else if (bcrypt.compareSync(c.req.body.password, user.password_hash)) { checked = { check: true, username: user.username, id: user.id }; } else { checked = { diff --git a/auth-svc/src/db/drizzle.ts b/auth-svc/src/db/drizzle.ts new file mode 100644 index 0000000..132ca94 --- /dev/null +++ b/auth-svc/src/db/drizzle.ts @@ -0,0 +1,6 @@ +import { drizzle } from "drizzle-orm/node-postgres"; +import { relations } from "./relations"; + +export const db = drizzle(process.env.DATABASE_URL!, { logger: false, relations}); + + diff --git a/auth-svc/src/db/relations.ts b/auth-svc/src/db/relations.ts new file mode 100644 index 0000000..226f39e --- /dev/null +++ b/auth-svc/src/db/relations.ts @@ -0,0 +1,5 @@ +import { defineRelations } from "drizzle-orm"; +import * as schema from "./schema"; + +export const relations = defineRelations(schema, (r) => ({ +})) \ No newline at end of file diff --git a/auth-svc/src/db/schema.ts b/auth-svc/src/db/schema.ts new file mode 100644 index 0000000..195be98 --- /dev/null +++ b/auth-svc/src/db/schema.ts @@ -0,0 +1,24 @@ +import { pgTable, uuid, varchar, text, customType, timestamp, uniqueIndex, primaryKey } from "drizzle-orm/pg-core" +import { sql } from "drizzle-orm" + +export const usersTable = pgTable("Users", { + id: uuid().primaryKey().defaultRandom(), + username: varchar({ length: 255 }).notNull(), + password_hash: varchar("password_hash", { length: 2040 }).notNull(), + provider: varchar({ length: 255 }).default("Local").notNull(), + pid: text(), + displayName: varchar({ length: 255 }), + fullName: varchar({ length: 255 }).notNull(), + firstName: varchar({ length: 255 }).notNull(), + lastName: varchar({ length: 255 }), + email: varchar({ length: 255 }).notNull(), + photoURL: varchar({ length: 2024 }), + photo: customType({ dataType: () => 'bytea' })(), + photoType: varchar({ length: 255 }), + createdAt: timestamp("created_at", { precision: 6, withTimezone: true }).default(sql`CURRENT_TIMESTAMP`).notNull(), + updatedAt: timestamp("updated_at", { precision: 6, withTimezone: true }).defaultNow().notNull().$onUpdate(() => new Date()), +}, (table) => [ + uniqueIndex("Users_email_key").using("btree", table.email.asc().nullsLast()), + uniqueIndex("Users_pid_key").using("btree", table.pid.asc().nullsLast()), + uniqueIndex("Users_username_key").using("btree", table.username.asc().nullsLast()), +]); diff --git a/auth-svc/src/lib/prisma.ts b/auth-svc/src/lib/prisma.ts deleted file mode 100644 index 468c5e2..0000000 --- a/auth-svc/src/lib/prisma.ts +++ /dev/null @@ -1,8 +0,0 @@ - -import { PrismaPg } from "@prisma/adapter-pg"; -import { PrismaClient } from "../generated/prisma/client.js"; - - -const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL}) -const prisma = new PrismaClient({ adapter, log: ['info', 'warn', 'error'], }) -export { prisma } \ No newline at end of file diff --git a/auth-svc/src/prisma.config.ts b/auth-svc/src/prisma.config.ts deleted file mode 100644 index 3548329..0000000 --- a/auth-svc/src/prisma.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This file was generated by Prisma and assumes you have installed the following: -// npm install --save-dev prisma dotenv -import "@dotenvx/dotenvx/config" -import { defineConfig, env } from "prisma/config"; - -export default defineConfig({ - schema: "prisma/schema.prisma", - migrations: { - path: "prisma/migrations", - }, - datasource: { - url: env("DATABASE_URL"), - }, -}); diff --git a/auth-svc/src/prisma/migrations/20251129015514_user_table_created/migration.sql b/auth-svc/src/prisma/migrations/20251129015514_user_table_created/migration.sql deleted file mode 100644 index b63fab9..0000000 --- a/auth-svc/src/prisma/migrations/20251129015514_user_table_created/migration.sql +++ /dev/null @@ -1,50 +0,0 @@ --- CreateTable -CREATE TABLE "Users" ( - "uuid" UUID NOT NULL, - "username" VARCHAR(255) NOT NULL, - "pasword_hash" VARCHAR(2040) NOT NULL, - "provider" VARCHAR(255) NOT NULL DEFAULT 'Local', - "pid" TEXT, - "displayName" VARCHAR(255) NOT NULL, - "firstName" VARCHAR(255) NOT NULL, - "lastName" VARCHAR(255), - "email" VARCHAR(255) NOT NULL, - "photoURL" VARCHAR(2024), - "photo" BYTEA, - "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMPTZ(6) NOT NULL, - - CONSTRAINT "Users_pkey" PRIMARY KEY ("uuid") -); - --- CreateTable -CREATE TABLE "SQNotes" ( - "notekey" VARCHAR(255) NOT NULL, - "title" VARCHAR(255), - "body" TEXT, - "createdAt" TIMESTAMPTZ(6) NOT NULL, - "updatedAt" TIMESTAMPTZ(6) NOT NULL, - - CONSTRAINT "SQNotes_pkey" PRIMARY KEY ("notekey") -); - --- CreateTable -CREATE TABLE "session" ( - "sid" VARCHAR NOT NULL, - "sess" JSON NOT NULL, - "expire" TIMESTAMP(6) NOT NULL, - - CONSTRAINT "session_pkey" PRIMARY KEY ("sid") -); - --- CreateIndex -CREATE UNIQUE INDEX "Users_username_key" ON "Users"("username"); - --- CreateIndex -CREATE UNIQUE INDEX "Users_pid_key" ON "Users"("pid"); - --- CreateIndex -CREATE UNIQUE INDEX "Users_email_key" ON "Users"("email"); - --- CreateIndex -CREATE INDEX "IDX_session_expire" ON "session"("expire"); diff --git a/auth-svc/src/prisma/migrations/20251129111337_users_update/migration.sql b/auth-svc/src/prisma/migrations/20251129111337_users_update/migration.sql deleted file mode 100644 index 7a5f92c..0000000 --- a/auth-svc/src/prisma/migrations/20251129111337_users_update/migration.sql +++ /dev/null @@ -1,20 +0,0 @@ -/* - Warnings: - - - The primary key for the `Users` table will be changed. If it partially fails, the table could be left without primary key constraint. - - You are about to drop the column `pasword_hash` on the `Users` table. All the data in the column will be lost. - - You are about to drop the column `uuid` on the `Users` table. All the data in the column will be lost. - - Added the required column `fullName` to the `Users` table without a default value. This is not possible if the table is not empty. - - The required column `id` was added to the `Users` table with a prisma-level default value. This is not possible if the table is not empty. Please add this column as optional, then populate it before making it required. - - Added the required column `password_hash` to the `Users` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "Users" DROP CONSTRAINT "Users_pkey", -DROP COLUMN "pasword_hash", -DROP COLUMN "uuid", -ADD COLUMN "fullName" VARCHAR(255) NOT NULL, -ADD COLUMN "id" UUID NOT NULL, -ADD COLUMN "password_hash" VARCHAR(2040) NOT NULL, -ALTER COLUMN "displayName" DROP NOT NULL, -ADD CONSTRAINT "Users_pkey" PRIMARY KEY ("id"); diff --git a/auth-svc/src/prisma/migrations/20251203082632_only_users/migration.sql b/auth-svc/src/prisma/migrations/20251203082632_only_users/migration.sql deleted file mode 100644 index 66ad778..0000000 --- a/auth-svc/src/prisma/migrations/20251203082632_only_users/migration.sql +++ /dev/null @@ -1,12 +0,0 @@ -/* - Warnings: - - - You are about to drop the `SQNotes` table. If the table is not empty, all the data it contains will be lost. - - You are about to drop the `session` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropTable -DROP TABLE "SQNotes"; - --- DropTable -DROP TABLE "session"; diff --git a/auth-svc/src/prisma/migrations/20251222045341_photo_type/migration.sql b/auth-svc/src/prisma/migrations/20251222045341_photo_type/migration.sql deleted file mode 100644 index 8302fc1..0000000 --- a/auth-svc/src/prisma/migrations/20251222045341_photo_type/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "Users" ADD COLUMN "photoType" VARCHAR(255); diff --git a/auth-svc/src/prisma/migrations/migration_lock.toml b/auth-svc/src/prisma/migrations/migration_lock.toml deleted file mode 100644 index 044d57c..0000000 --- a/auth-svc/src/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (e.g., Git) -provider = "postgresql" diff --git a/auth-svc/src/prisma/schema.prisma b/auth-svc/src/prisma/schema.prisma deleted file mode 100644 index d2d86df..0000000 --- a/auth-svc/src/prisma/schema.prisma +++ /dev/null @@ -1,26 +0,0 @@ -generator client { - provider = "prisma-client" - output = "../generated/prisma" -} - -datasource db { - provider = "postgresql" -} - -model Users { - id String @id @default(uuid()) @db.Uuid() - username String @unique @db.VarChar(255) - password_hash String @db.VarChar(2040) - provider String @default("Local") @db.VarChar(255) - pid String? @unique - displayName String? @db.VarChar(255) - fullName String @db.VarChar(255) - firstName String @db.VarChar(255) - lastName String? @db.VarChar(255) - email String @unique @db.VarChar(255) - photoURL String? @db.VarChar(2024) - photo Bytes? @db.ByteA - photoType String? @db.VarChar(255) - created_at DateTime @default(now()) @db.Timestamptz(6) - updated_at DateTime @updatedAt() @db.Timestamptz(6) -} diff --git a/auth-svc/src/users-db.mjs b/auth-svc/src/users-db.mjs new file mode 100644 index 0000000..d2b83ae --- /dev/null +++ b/auth-svc/src/users-db.mjs @@ -0,0 +1,106 @@ +import { db } from "./db/drizzle"; +import { usersTable } from "./db/schema"; +import { eq, getColumns } from "drizzle-orm"; + +const { password_hash, photo, ...publicColumns } = getColumns(usersTable); + +export class UsersDataBase { + async findMany() { + return db.query.usersTable.findMany(); + } + + async createUser(reqBody) { + const user = await db + .insert(usersTable) + .values({ ...reqBody }) + .returning(); + return sanitizedUser(user[0]); + } + + async findUserName(username) { + const user = await db + .select(publicColumns) + .from(usersTable) + .where(eq(usersTable.username, username)) + .limit(1); + return user[0]; + } + async getFull(username) { + const user = await db + .select() + .from(usersTable) + .where(eq(usersTable.username, username)) + .limit(1); + return user[0]; + } + async findEmail(email) { + const user = await db + .select(publicColumns) + .from(usersTable) + .where(eq(usersTable.email, email)) + .limit(1); + return user[0]; + } + async find(id) { + const user = await db + .select(publicColumns) + .from(usersTable) + .where(eq(usersTable.id, id)) + .limit(1); + return user[0]; + } + + async updatePhoto(id, photoURL, photoType) { + const user = await db + .update(usersTable) + .set({ photoURL, photoType }) + .where(eq(usersTable.id, id)) + .returning(); + return sanitizedUser(user[0]); + } + async update(username, data) { + const user = await db + .update(usersTable) + .set(data) + .where(eq(usersTable.username, username)) + .returning(); + return sanitizedUser(user[0]); + } + + async destroy(id) { + const deletedId = await db.delete(usersTable).where(eq(usersTable.id, id)).returning({deletedId: usersTable.id}); + return deletedId[0] + } +} +export function sanitizedUser(user) { + const sanitized = { + id: user.id, + username: user.username, + provider: user.provider, + pid: user.pid, + fullName: user.fullName, + displayName: user.displayName, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + photoURL: user.photoURL, + photoType: user.photoType, + }; + return sanitized; +} +export function userParams(reqBody) { + const params = { + username: reqBody.username, + password_hash: reqBody.password_hash, + provider: reqBody.provider, + pid: reqBody.pid, + displayName: reqBody.displayName, + fullName: reqBody.fullName, + firstName: reqBody.firstName, + lastName: reqBody.lastName, + email: reqBody.email, + photoURL: reqBody.photoURL, + photoType: reqBody.photoType, + }; + return params; +} diff --git a/auth-svc/src/users-prisma.mjs b/auth-svc/src/users-prisma.mjs deleted file mode 100644 index 95ef928..0000000 --- a/auth-svc/src/users-prisma.mjs +++ /dev/null @@ -1,81 +0,0 @@ -import { prisma } from './lib/prisma.js'; - -export async function connectDB() { - try { - await prisma.$connect() - } catch (error) { - console.error(error) - } -} -export async function disconnetDB() { - try { - await prisma.$disconnect() - } catch (error) { - console.error(error) - } -} -export function userParams(reqBody) { - const params = { - username: reqBody.username, - password_hash: reqBody.password_hash, - provider: reqBody.provider, - pid: reqBody.pid, - displayName: reqBody.displayName, - fullName: reqBody.fullName, - firstName: reqBody.firstName, - lastName: reqBody.lastName, - email: reqBody.email, - photoURL: reqBody.photoURL, - photoType: reqBody.photoType - } - return params; -} - -export function sanitizedUser(user) { - const sanitized = { - id: user.id, - username: user.username, - provider: user.provider, - pid: user.pid, - fullName: user.fullName, - displayName: user.displayName, - firstName: user.firstName, - lastName: user.lastName, - email: user.email, - photoURL: user.photoURL, - photoType: user.photoType - } - return sanitized; -} -export const DBUsers = prisma.users; - -export async function findOneUser(userId) { - try { - const user = await DBUsers.findUnique({ - where: { - id: userId - } - }); - if (user) { - const sanitized = sanitizedUser(user); - return sanitized; - } - return user; - - } catch (error) { - console.error(error) - } -} - -export async function createUser(body) { - try { - const user = await DBUsers.create({ - data: userParams(body) - }) - const sanitized = sanitizedUser(user); - return sanitized; - } catch (error) { - console.error(error) - } -} - diff --git a/auth-svc/tests/api.test.mjs b/auth-svc/tests/api.test.mjs index 1682541..72a097f 100644 --- a/auth-svc/tests/api.test.mjs +++ b/auth-svc/tests/api.test.mjs @@ -9,99 +9,98 @@ const token = await sign( "HS256", ); -test("should pass to /list", async () => { - const res = await app.request("/list", { - method: "GET", - headers: { - Authorization: `Bearer ${token}`, - }, +for (let loop = 0; loop < 1; loop++) { + test("should pass to /list", async () => { + const res = await app.request("/list", { + method: "GET", + headers: { + Authorization: `Bearer ${token}`, + }, + }); + expect(res.status).toBe(200); }); - ; - expect(res.status).toBe(200); -}); -test("should pass to /create-user", async () => { - const passhash = await await bcrypt.hash("test", 10) - const res = await app.request("/create-user", { - method: "POST", - headers: { - Authorization: `Bearer ${token}`, - "Content-Type": "application/json", - }, - - body: JSON.stringify({ - username: "testUser", - password_hash: passhash, - fullName: "Test User", - firstName: "Test", - lastName: "User", - email: "test@test.com", - }), + test("should pass to /create-user", async () => { + const passhash = await await bcrypt.hash("test", 10); + const res = await app.request("/create-user", { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + + body: JSON.stringify({ + username: "testUser", + password_hash: passhash, + fullName: "Test User", + firstName: "Test", + lastName: "User", + email: "test@test.com", + }), + }); + + expect(res.status).toBe(200); }); - - expect(res.status).toBe(200); -}); -test("should pass to /find-or-create find first user", async () => { - const passhash = await await bcrypt.hash("test", 10) - const res = await app.request("/find-or-create", { - method: "POST", - headers: { - Authorization: `Bearer ${token}`, - "Content-Type": "application/json", - }, - - body: JSON.stringify({ - username: "testUser", - password_hash: passhash, - fullName: "Test User", - firstName: "Test", - lastName: "User", - email: "test@test.com", - }), + test("should pass to /find-or-create find first user", async () => { + const passhash = await await bcrypt.hash("test", 10); + const res = await app.request("/find-or-create", { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + + body: JSON.stringify({ + username: "testUser", + password_hash: passhash, + fullName: "Test User", + firstName: "Test", + lastName: "User", + email: "test@test.com", + }), + }); + + expect(res.status).toBe(200); }); - - expect(res.status).toBe(200); -}); -test("should pass to /create-user 2nd user", async () => { - const passhash = await await bcrypt.hash("test", 10) - const res = await app.request("/create-user", { - method: "POST", - headers: { - Authorization: `Bearer ${token}`, - "Content-Type": "application/json", - }, - - body: JSON.stringify({ - username: "testuser2", - password_hash: passhash, - fullName: "Test User 2", - firstName: "Test2", - lastName: "User2", - email: "test2@test.com", - }), + test("should pass to /create-user 2nd user", async () => { + const passhash = await await bcrypt.hash("test", 10); + const res = await app.request("/create-user", { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + + body: JSON.stringify({ + username: "testuser2", + password_hash: passhash, + fullName: "Test User 2", + firstName: "Test2", + lastName: "User2", + email: "test2@test.com", + }), + }); + expect(res.status).toBe(200); }); - expect(res.status).toBe(200); -}); -test("should pass to /destroy", async () => { - const res = await app.request("/destroy/testUser", { - method: "DELETE", - headers: { - Authorization: `Bearer ${token}`, - }, + test("should pass to /destroy", async () => { + const res = await app.request("/destroy/testUser", { + method: "DELETE", + headers: { + Authorization: `Bearer ${token}`, + }, + }); + expect(res.status).toBe(200); }); - ; - expect(res.status).toBe(200); -}); -test("should pass to /destroy 2nd user", async () => { - const res = await app.request("/destroy/testuser2", { - method: "DELETE", - headers: { - Authorization: `Bearer ${token}`, - }, + test("should pass to /destroy 2nd user", async () => { + const res = await app.request("/destroy/testuser2", { + method: "DELETE", + headers: { + Authorization: `Bearer ${token}`, + }, + }); + expect(res.status).toBe(200); }); - ; - expect(res.status).toBe(200); -}); +} diff --git a/auth-svc/tsconfig.json b/auth-svc/tsconfig.json index 9c89988..2e5038d 100644 --- a/auth-svc/tsconfig.json +++ b/auth-svc/tsconfig.json @@ -1,8 +1,9 @@ { "compilerOptions": { "target": "ES2022", - "module": "NodeNext", - "moduleResolution": "NodeNext", + "module": "esnext", + "moduleResolution": "bundler", + "types": ["node", "bun"], "rootDir": "src", "outDir": "dist", diff --git a/compose.dev.yaml b/compose.dev.yaml index 16ecce3..1a63bc1 100644 --- a/compose.dev.yaml +++ b/compose.dev.yaml @@ -4,7 +4,7 @@ services: context: ./auth-svc target: prerelease image: authsvc-dev:latest - command : ["bun", "run", "prisma-dev", "migrate", "dev"] + command : ["bun", "run", "drizzlekit-dev", "migrate"] environment: - DOTENV_PRIVATE_KEY_DEVELOPMENT networks: diff --git a/compose.prod.yaml b/compose.prod.yaml index c1972fa..a2506d0 100644 --- a/compose.prod.yaml +++ b/compose.prod.yaml @@ -3,7 +3,7 @@ services: build: context: ./auth-svc image: authsvc-prod:latest - command : ["bun", "run", "prisma-pro", "migrate", "deploy"] + command : ["bun", "run", "drizzlekit-prod", "migrate"] environment: - DOTENV_PRIVATE_KEY_PRODUCTION networks: From f638ed0707f8aea977baf57d25b4c243222acdc8 Mon Sep 17 00:00:00 2001 From: Usman Ghani Date: Sat, 11 Jul 2026 12:07:44 +0500 Subject: [PATCH 2/5] fix/chore(auth-svc/dockerfile): fixed docker file release section issues --- auth-svc/dockerfile | 10 +++++----- auth-svc/package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/auth-svc/dockerfile b/auth-svc/dockerfile index 1615be7..0f37260 100644 --- a/auth-svc/dockerfile +++ b/auth-svc/dockerfile @@ -18,16 +18,16 @@ RUN mkdir /auth-svc WORKDIR /auth-svc COPY --from=install /temp/dev/node_modules node_modules COPY . . -RUN bun run drizzlekit-dev generate +RUN bun run build EXPOSE 5859 CMD [ "bun", "run", "dev" ] FROM base AS release RUN apk update && apk add curl && curl -sfS https://dotenvx.sh | sh WORKDIR /usr/auth-svc -COPY --from=install /temp/prod/node_modules /usr/auth-svc/node_modules -COPY . . -RUN bun run build - +COPY ./package.json . +COPY ./.env.production . +COPY --from=install /temp/prod/node_modules ./node_modules +COPY --from=prerelease /auth-svc/dist ./dist EXPOSE 5858 CMD [ "dotenvx", "run" , "-f", ".env.production", "--", "bun", "./dist/app.mjs" ] diff --git a/auth-svc/package.json b/auth-svc/package.json index c95e4a6..316fe4d 100644 --- a/auth-svc/package.json +++ b/auth-svc/package.json @@ -11,7 +11,7 @@ "drizzlekit-prod": "NODE_ENV=production dotenvx run -f .env.production -- bun drizzle-kit", "drizzlekit-dev": "dotenvx run -f .env.development -- bun drizzle-kit", "app": "dotenvx run -f .env.development -- bun ./src/app.mjs", - "build": "bun run drizzlekit-prod generate && tsc", + "build": "tsc", "test": "dotenvx run -f .env.development -- bun test --watch" }, "author": "Usman Ghani", @@ -28,8 +28,8 @@ "@types/bun": "^1.3.14", "@types/node": "^26.1.1", "@types/pg": "^8.20.0", - "drizzle-kit": "^1.0.0-rc.4", "tsx": "^4.23.0", + "drizzle-kit": "^1.0.0-rc.4", "typescript": "^5.9.3" } } From 08b72c7bc850bf8bab0d0c5099fc06281fcbf3e1 Mon Sep 17 00:00:00 2001 From: Usman Ghani Date: Sat, 11 Jul 2026 12:09:35 +0500 Subject: [PATCH 3/5] fix/docker(post-svc): After adding tests and seprating app.mjs and server.mjs, dockerfile CMD updated - I forgot to do this because on railway still old dockerfile is running. --- post-svc/dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/post-svc/dockerfile b/post-svc/dockerfile index 34bb1c9..8f6a39d 100644 --- a/post-svc/dockerfile +++ b/post-svc/dockerfile @@ -31,5 +31,5 @@ COPY . . RUN bun run build EXPOSE 3000 -CMD [ "dotenvx", "run" , "-f", ".env.production", "--", "bun", "./dist/app.mjs" ] +CMD [ "dotenvx", "run" , "-f", ".env.production", "--", "bun", "./dist/server.mjs" ] From a62c283713a97760bbd51d8f38fa54eb72702536 Mon Sep 17 00:00:00 2001 From: Usman Ghani Date: Sat, 11 Jul 2026 18:07:28 +0500 Subject: [PATCH 4/5] chore(docker): dockerfile update, update compose.prod.yaml to match the dockerfiles --- auth-svc/.dockerignore | 3 ++- compose.prod.yaml | 3 ++- post-svc/dockerfile | 9 +++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/auth-svc/.dockerignore b/auth-svc/.dockerignore index f8187e2..cf75b92 100644 --- a/auth-svc/.dockerignore +++ b/auth-svc/.dockerignore @@ -1,4 +1,5 @@ node_modules .env.keys dist -.git \ No newline at end of file +.git +.github \ No newline at end of file diff --git a/compose.prod.yaml b/compose.prod.yaml index a2506d0..67846f9 100644 --- a/compose.prod.yaml +++ b/compose.prod.yaml @@ -2,6 +2,7 @@ services: authsvc-build: build: context: ./auth-svc + target: prerelease image: authsvc-prod:latest command : ["bun", "run", "drizzlekit-prod", "migrate"] environment: @@ -42,7 +43,7 @@ services: userpost-build: build: context: ./post-svc - + target: prerelease image: userpost-prod:latest command : ["bun", "run", "postbuild-pro"] environment: diff --git a/post-svc/dockerfile b/post-svc/dockerfile index 8f6a39d..5d1e973 100644 --- a/post-svc/dockerfile +++ b/post-svc/dockerfile @@ -19,16 +19,17 @@ RUN mkdir /post-svc WORKDIR /post-svc COPY --from=install /temp/dev/node_modules node_modules COPY . . -RUN bunx --bun prisma --config=./src/prisma.config.ts generate +RUN bun run build EXPOSE 3000 CMD [ "bun", "run", "dev" ] FROM base AS release RUN apk update && apk add curl && curl -sfS https://dotenvx.sh | sh WORKDIR /usr/post-svc -COPY --from=install /temp/prod/node_modules /usr/post-svc/node_modules -COPY . . -RUN bun run build +COPY ./package.json . +COPY ./.env.production . +COPY --from=install /temp/prod/node_modules ./node_modules +COPY --from=prerelease /post-svc/dist ./dist EXPOSE 3000 CMD [ "dotenvx", "run" , "-f", ".env.production", "--", "bun", "./dist/server.mjs" ] From ec109b4108060b255ff561e8c61184d07b57673b Mon Sep 17 00:00:00 2001 From: Usman Ghani Date: Sat, 11 Jul 2026 18:18:23 +0500 Subject: [PATCH 5/5] chore(auth-svc): add warning durring migrating to drizzle --- .../migration.sql | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/auth-svc/drizzle/20260711043012_harsh_quicksilver/migration.sql b/auth-svc/drizzle/20260711043012_harsh_quicksilver/migration.sql index b0157b4..f4f142b 100644 --- a/auth-svc/drizzle/20260711043012_harsh_quicksilver/migration.sql +++ b/auth-svc/drizzle/20260711043012_harsh_quicksilver/migration.sql @@ -1,7 +1,17 @@ --- Current sql file was generated after introspecting the database --- If you want to run this migration if will destroy all data! please uncomment this code before executing migrations --- These Migration was automaticlly applied durring drizzle-kit pull --init --- The best way to apply this it to run drizzle-kit pull --init +-- ========================================================================= +-- PRISMA TO DRIZZLE MIGRATION +-- ========================================================================= +-- This file was auto-generated by introspecting the existing Prisma database. +-- +-- ⚠️ IMPORTANT RUNTIME WARNING: +-- • DO NOT force execution of this raw SQL file on an existing, populated database. +-- Doing so will trigger "Table already exists" errors and risks breaking your schema. +-- • If you must execute this raw SQL file, it should ONLY be run on a completely empty database. +-- +-- 🛡️ THE SAFE APPROACH (NO DATA LOSS): +-- • To safely sync the Drizzle schema with your existing Prisma database in development +-- or production without losing data, "do NOT run this SQL file manually". +-- • ✔ Instead, simply run: npx drizzle-kit pull --init /* CREATE TABLE "Users" ( "id" uuid PRIMARY KEY,