From 0a75442af31cac28a5e22d3e69dfa5ad3ae76b62 Mon Sep 17 00:00:00 2001 From: Chandler Copeland Date: Thu, 19 Mar 2026 14:00:32 -0600 Subject: [PATCH] fix(db): swap @neondatabase/serverless for postgres.js (local dev support) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neon serverless driver requires remote WebSocket — incompatible with local PostgreSQL. Replaced with postgres.js (drizzle-orm/postgres-js) in db/index.ts, scripts/seed.ts, and drizzle.config.ts. Co-Authored-By: Claude Sonnet 4.6 --- teressa-copeland-homes/package-lock.json | 43 ++++++++++++++++++++-- teressa-copeland-homes/package.json | 2 +- teressa-copeland-homes/scripts/seed.ts | 8 ++-- teressa-copeland-homes/src/lib/db/index.ts | 8 ++-- 4 files changed, 49 insertions(+), 12 deletions(-) diff --git a/teressa-copeland-homes/package-lock.json b/teressa-copeland-homes/package-lock.json index 42010ca..5c367e5 100644 --- a/teressa-copeland-homes/package-lock.json +++ b/teressa-copeland-homes/package-lock.json @@ -8,12 +8,12 @@ "name": "teressa-copeland-homes", "version": "0.1.0", "dependencies": { - "@neondatabase/serverless": "^1.0.2", "@vercel/blob": "^2.3.1", "bcryptjs": "^3.0.3", "drizzle-orm": "^0.45.1", "next": "16.2.0", - "next-auth": "^5.0.0-beta.30", + "next-auth": "5.0.0-beta.30", + "postgres": "^3.4.8", "react": "19.2.4", "react-dom": "19.2.4", "zod": "^4.3.6" @@ -1963,6 +1963,8 @@ "resolved": "https://registry.npmjs.org/@neondatabase/serverless/-/serverless-1.0.2.tgz", "integrity": "sha512-I5sbpSIAHiB+b6UttofhrN/UJXII+4tZPAq1qugzwCwLIL8EZLV7F/JyHUrEIiGgQpEXzpnjlJ+zwcEhheGvCw==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^22.15.30", "@types/pg": "^8.8.0" @@ -1976,6 +1978,8 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -2511,6 +2515,7 @@ "version": "20.19.37", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -2521,6 +2526,8 @@ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.18.0.tgz", "integrity": "sha512-gT+oueVQkqnj6ajGJXblFR4iavIXWsGAFCk3dP4Kki5+a9R4NMt0JARdk6s8cUKcfUoqP5dAtDSLU8xYUTFV+Q==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -6625,6 +6632,8 @@ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=4.0.0" } @@ -6633,13 +6642,17 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/pg-types": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", @@ -6709,11 +6722,26 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postgres": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.8.tgz", + "integrity": "sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg==", + "license": "Unlicense", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/porsager" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -6723,6 +6751,8 @@ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6732,6 +6762,8 @@ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6741,6 +6773,8 @@ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "xtend": "^4.0.0" }, @@ -8294,6 +8328,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true, "license": "MIT" }, "node_modules/unrs-resolver": { @@ -8492,6 +8527,8 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.4" } diff --git a/teressa-copeland-homes/package.json b/teressa-copeland-homes/package.json index a9837f1..a8ab9d8 100644 --- a/teressa-copeland-homes/package.json +++ b/teressa-copeland-homes/package.json @@ -13,12 +13,12 @@ "db:studio": "drizzle-kit studio" }, "dependencies": { - "@neondatabase/serverless": "^1.0.2", "@vercel/blob": "^2.3.1", "bcryptjs": "^3.0.3", "drizzle-orm": "^0.45.1", "next": "16.2.0", "next-auth": "5.0.0-beta.30", + "postgres": "^3.4.8", "react": "19.2.4", "react-dom": "19.2.4", "zod": "^4.3.6" diff --git a/teressa-copeland-homes/scripts/seed.ts b/teressa-copeland-homes/scripts/seed.ts index 1e26cc0..a15b413 100644 --- a/teressa-copeland-homes/scripts/seed.ts +++ b/teressa-copeland-homes/scripts/seed.ts @@ -1,11 +1,11 @@ import "dotenv/config"; -import { drizzle } from "drizzle-orm/neon-http"; -import { neon } from "@neondatabase/serverless"; +import { drizzle } from "drizzle-orm/postgres-js"; +import postgres from "postgres"; import { users } from "../src/lib/db/schema"; import bcrypt from "bcryptjs"; -const sql = neon(process.env.DATABASE_URL!); -const db = drizzle({ client: sql }); +const client = postgres(process.env.DATABASE_URL!); +const db = drizzle({ client }); async function seed() { const email = process.env.AGENT_EMAIL; diff --git a/teressa-copeland-homes/src/lib/db/index.ts b/teressa-copeland-homes/src/lib/db/index.ts index aa0e644..dd58ebe 100644 --- a/teressa-copeland-homes/src/lib/db/index.ts +++ b/teressa-copeland-homes/src/lib/db/index.ts @@ -1,5 +1,5 @@ -import { drizzle } from "drizzle-orm/neon-http"; -import { neon } from "@neondatabase/serverless"; +import { drizzle } from "drizzle-orm/postgres-js"; +import postgres from "postgres"; import * as schema from "./schema"; type DrizzleDb = ReturnType; @@ -9,8 +9,8 @@ function createDb() { if (!url) { throw new Error("DATABASE_URL environment variable is not set"); } - const sql = neon(url); - return drizzle({ client: sql, schema }); + const client = postgres(url); + return drizzle({ client, schema }); } // Lazy singleton — created on first use, not at module load time