From 38aa9ae169d5f14fb434cec2a7aacbaf90b1c9dd Mon Sep 17 00:00:00 2001 From: Luke Hagar Date: Mon, 20 Oct 2025 23:45:50 -0500 Subject: [PATCH] Add bun.lockb file and update docker-compose.yml to remove sensitive environment variables. Refactor package.json to reorganize dependencies and add Bun types. Modify tsconfig.json to include Bun types. Update Redis client implementation in redis.ts for improved error handling and connection management. --- bun.lockb | Bin 0 -> 119264 bytes docker-compose.yml | 2 -- package.json | 7 +++---- src/lib/prisma.ts | 7 +------ src/lib/redis.ts | 14 ++++---------- tsconfig.json | 3 ++- 6 files changed, 10 insertions(+), 23 deletions(-) create mode 100755 bun.lockb diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..8e7c6a5cd1d54832c89179aeddd9f8a4dcc2f2e8 GIT binary patch literal 119264 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 literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml index 63e5941..99deb02 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,8 +40,6 @@ services: condition: service_healthy environment: NODE_ENV: production - SERVICE_PASSWORD_POSTGRES: ${POSTGRES_PASSWORD} - SERVICE_PASSWORD_REDIS: ${REDIS_PASSWORD} DATABASE_URL: postgresql://pypistats:${POSTGRES_PASSWORD}@db:5432/pypistats?schema=public REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379 GOOGLE_APPLICATION_CREDENTIALS_BASE64: ${GOOGLE_APPLICATION_CREDENTIALS_BASE64} diff --git a/package.json b/package.json index fc05d0e..9a5f66e 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "db:migrate": "prisma migrate dev", "db:deploy": "prisma migrate deploy" }, - "dependencies": { + "devDependencies": { "@google-cloud/bigquery": "^8.1.1", "@prisma/client": "^6.15.0", "@sveltejs/adapter-node": "^5.3.1", @@ -26,9 +26,7 @@ "chart.js": "^4.5.0", "chartjs-node-canvas": "^5.0.0", "node-cron": "^4.2.1", - "redis": "^5.8.2" - }, - "devDependencies": { + "redis": "^5.8.2", "@plausible-analytics/tracker": "^0.4.0", "@sveltejs/adapter-auto": "^6.1.0", "@sveltejs/kit": "^2.37.0", @@ -36,6 +34,7 @@ "@tailwindcss/forms": "^0.5.10", "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.1.12", + "@types/bun": "^1.3.0", "mdsvex": "^0.12.6", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index 133a388..ea9fed5 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -1,9 +1,4 @@ import { PrismaClient } from '@prisma/client'; -const globalForPrisma = globalThis as unknown as { - prisma: PrismaClient | undefined; -}; +export const prisma = new PrismaClient(); -export const prisma = globalForPrisma.prisma ?? new PrismaClient(); - -if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma; \ No newline at end of file diff --git a/src/lib/redis.ts b/src/lib/redis.ts index f9a78cc..e93975d 100644 --- a/src/lib/redis.ts +++ b/src/lib/redis.ts @@ -1,3 +1,4 @@ +import { env } from '$env/dynamic/private'; import { createClient } from 'redis'; // Redis client instance @@ -6,14 +7,7 @@ let isConnecting = false; let isDisconnecting = false; export function getRedisClient() { - const redisUrl = process.env.REDIS_URL; - // Skip connecting if no REDIS_URL is provided (e.g., during build) - if (!redisUrl) { - if (typeof process !== 'undefined') { - console.warn('Redis disabled: REDIS_URL not set'); - } - return null; - } + const redisUrl = env.REDIS_URL; if (!redisClient && !isConnecting) { isConnecting = true; @@ -21,7 +15,7 @@ export function getRedisClient() { url: redisUrl, }); - redisClient.on('error', (err) => { + redisClient.on('error', (err: any) => { console.error('Redis Client Error:', err); }); @@ -76,7 +70,7 @@ export async function forceDisconnectRedis(): Promise { isDisconnecting = true; try { console.log('Force disconnecting Redis client...'); - await redisClient.disconnect(); + await redisClient.destroy(); console.log('Redis client force disconnected'); } catch (error) { console.error('Error force disconnecting Redis client:', error); diff --git a/tsconfig.json b/tsconfig.json index 0b2d886..589b247 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,8 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "moduleResolution": "bundler" + "moduleResolution": "bundler", + "types": ["bun"] } // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files