1
mirror of https://github.com/jakejarvis/domainstack.io.git synced 2025-12-02 19:33:48 -05:00

chore: migrate from neon postgres to planetscale postgres

This commit is contained in:
2025-11-15 09:24:20 -05:00
parent debd3b2280
commit 1ce18217f9
32 changed files with 345 additions and 13976 deletions

View File

@@ -4,7 +4,7 @@ NEXT_PUBLIC_POSTHOG_KEY=
POSTHOG_API_KEY=
POSTHOG_ENV_ID=
# Postgres credentials (set by Neon integration)
# Postgres credentials (set by PlanetScale integration)
DATABASE_URL=
# Redis credentials (set by Upstash integration)

View File

@@ -17,7 +17,7 @@
- **Next.js 16** (App Router) + **React 19** + **TypeScript**
- **Tailwind CSS v4**
- **tRPC** API
- **Postgres** + **Drizzle ORM**
- **PlanetScale Postgres** + **Drizzle ORM**
- **Inngest** for background jobs and scheduled revalidation
- **Upstash Redis** for caching and locks
- **Vercel Edge Config** for dynamic configuration (domain suggestions, rate limits)
@@ -64,7 +64,6 @@ pnpm dev
This single command boots:
- **Postgres** on `localhost:5432`
- **Neon wsproxy** on `localhost:5433` (WebSocket proxy used by the Neon serverless driver)
- **Redis** on `localhost:6379`
- **Serverless Redis HTTP (SRH)** on `http://localhost:8079` (Upstash-compatible REST proxy)
- **Inngest dev server** on `http://localhost:8288`

View File

@@ -16,22 +16,6 @@ services:
timeout: 5s
retries: 5
# Neon WebSocket proxy -> Postgres (WS on 5433)
# This mirrors the Neon Drizzle guide's example: proxy listens on :80 in-container,
# we publish it on localhost:5433, and point it at our local Postgres at postgres:5432
# See https://neon.com/guides/drizzle-local-vercel
pg_proxy:
image: ghcr.io/neondatabase/wsproxy:latest
environment:
APPEND_PORT: "postgres:5432"
ALLOW_ADDR_REGEX: ".*"
LOG_TRAFFIC: "false"
LOG_CONN_INFO: "true"
ports:
- "5433:80"
depends_on:
- postgres
# Local Redis (binary protocol on 6379)
redis:
image: redis:7-alpine

View File

@@ -1,6 +1,6 @@
CREATE TYPE "public"."dns_record_type" AS ENUM('A', 'AAAA', 'MX', 'TXT', 'NS');--> statement-breakpoint
CREATE TYPE "public"."dns_resolver" AS ENUM('cloudflare', 'google');--> statement-breakpoint
CREATE TYPE "public"."provider_category" AS ENUM('hosting', 'email', 'dns', 'ca', 'registrar');--> statement-breakpoint
CREATE TYPE "public"."provider_source" AS ENUM('catalog', 'discovered');--> statement-breakpoint
CREATE TYPE "public"."registration_source" AS ENUM('rdap', 'whois');--> statement-breakpoint
CREATE TABLE "certificates" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
@@ -25,10 +25,10 @@ CREATE TABLE "dns_records" (
"ttl" integer,
"priority" integer,
"is_cloudflare" boolean,
"resolver" "dns_resolver" NOT NULL,
"resolver" text NOT NULL,
"fetched_at" timestamp with time zone NOT NULL,
"expires_at" timestamp with time zone NOT NULL,
CONSTRAINT "u_dns_record" UNIQUE("domain_id","type","name","value")
CONSTRAINT "u_dns_record" UNIQUE("domain_id","type","name","value","priority")
);
--> statement-breakpoint
CREATE TABLE "domains" (
@@ -38,6 +38,7 @@ CREATE TABLE "domains" (
"unicode_name" text NOT NULL,
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
"last_accessed_at" timestamp with time zone,
CONSTRAINT "u_domains_name" UNIQUE("name")
);
--> statement-breakpoint
@@ -57,13 +58,11 @@ CREATE TABLE "hosting" (
);
--> statement-breakpoint
CREATE TABLE "http_headers" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"domain_id" uuid NOT NULL,
"name" text NOT NULL,
"value" text NOT NULL,
"domain_id" uuid PRIMARY KEY NOT NULL,
"headers" jsonb DEFAULT '[]'::jsonb NOT NULL,
"status" integer DEFAULT 200 NOT NULL,
"fetched_at" timestamp with time zone NOT NULL,
"expires_at" timestamp with time zone NOT NULL,
CONSTRAINT "u_http_header" UNIQUE("domain_id","name")
"expires_at" timestamp with time zone NOT NULL
);
--> statement-breakpoint
CREATE TABLE "providers" (
@@ -72,20 +71,12 @@ CREATE TABLE "providers" (
"name" text NOT NULL,
"domain" text,
"slug" text NOT NULL,
"source" "provider_source" DEFAULT 'discovered' NOT NULL,
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
CONSTRAINT "u_providers_category_slug" UNIQUE("category","slug")
);
--> statement-breakpoint
CREATE TABLE "registration_nameservers" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"domain_id" uuid NOT NULL,
"host" text NOT NULL,
"ipv4" jsonb DEFAULT '[]'::jsonb NOT NULL,
"ipv6" jsonb DEFAULT '[]'::jsonb NOT NULL,
CONSTRAINT "u_reg_ns" UNIQUE("domain_id","host")
);
--> statement-breakpoint
CREATE TABLE "registrations" (
"domain_id" uuid PRIMARY KEY NOT NULL,
"is_registered" boolean NOT NULL,
@@ -98,6 +89,7 @@ CREATE TABLE "registrations" (
"transfer_lock" boolean,
"statuses" jsonb DEFAULT '[]'::jsonb NOT NULL,
"contacts" jsonb DEFAULT '[]'::jsonb NOT NULL,
"nameservers" jsonb DEFAULT '[]'::jsonb NOT NULL,
"whois_server" text,
"rdap_servers" jsonb DEFAULT '[]'::jsonb NOT NULL,
"source" "registration_source" NOT NULL,
@@ -134,7 +126,6 @@ ALTER TABLE "hosting" ADD CONSTRAINT "hosting_hosting_provider_id_providers_id_f
ALTER TABLE "hosting" ADD CONSTRAINT "hosting_email_provider_id_providers_id_fk" FOREIGN KEY ("email_provider_id") REFERENCES "public"."providers"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "hosting" ADD CONSTRAINT "hosting_dns_provider_id_providers_id_fk" FOREIGN KEY ("dns_provider_id") REFERENCES "public"."providers"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "http_headers" ADD CONSTRAINT "http_headers_domain_id_domains_id_fk" FOREIGN KEY ("domain_id") REFERENCES "public"."domains"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "registration_nameservers" ADD CONSTRAINT "registration_nameservers_domain_id_domains_id_fk" FOREIGN KEY ("domain_id") REFERENCES "public"."domains"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "registrations" ADD CONSTRAINT "registrations_domain_id_domains_id_fk" FOREIGN KEY ("domain_id") REFERENCES "public"."domains"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "registrations" ADD CONSTRAINT "registrations_registrar_provider_id_providers_id_fk" FOREIGN KEY ("registrar_provider_id") REFERENCES "public"."providers"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "registrations" ADD CONSTRAINT "registrations_reseller_provider_id_providers_id_fk" FOREIGN KEY ("reseller_provider_id") REFERENCES "public"."providers"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
@@ -146,9 +137,9 @@ CREATE INDEX "i_dns_domain_type" ON "dns_records" USING btree ("domain_id","type
CREATE INDEX "i_dns_type_value" ON "dns_records" USING btree ("type","value");--> statement-breakpoint
CREATE INDEX "i_dns_expires" ON "dns_records" USING btree ("expires_at");--> statement-breakpoint
CREATE INDEX "i_domains_tld" ON "domains" USING btree ("tld");--> statement-breakpoint
CREATE INDEX "i_domains_last_accessed" ON "domains" USING btree ("last_accessed_at");--> statement-breakpoint
CREATE INDEX "i_hosting_providers" ON "hosting" USING btree ("hosting_provider_id","email_provider_id","dns_provider_id");--> statement-breakpoint
CREATE INDEX "i_http_name" ON "http_headers" USING btree ("name");--> statement-breakpoint
CREATE INDEX "i_reg_ns_host" ON "registration_nameservers" USING btree ("host");--> statement-breakpoint
CREATE INDEX "i_providers_name_lower" ON "providers" USING btree ("category",lower("name"));--> statement-breakpoint
CREATE INDEX "i_reg_registrar" ON "registrations" USING btree ("registrar_provider_id");--> statement-breakpoint
CREATE INDEX "i_reg_expires" ON "registrations" USING btree ("expires_at");--> statement-breakpoint
CREATE INDEX "i_seo_src_final_url" ON "seo" USING btree ("source_final_url");--> statement-breakpoint

View File

@@ -1,2 +0,0 @@
CREATE TYPE "public"."provider_source" AS ENUM('catalog', 'discovered');--> statement-breakpoint
ALTER TABLE "providers" ADD COLUMN "source" "provider_source" DEFAULT 'discovered' NOT NULL;

View File

@@ -1 +0,0 @@
ALTER TABLE "seo" DROP COLUMN "preview_image_uploaded_url";

View File

@@ -1,2 +0,0 @@
ALTER TABLE "dns_records" ALTER COLUMN "resolver" SET DATA TYPE text;--> statement-breakpoint
DROP TYPE "public"."dns_resolver";

View File

@@ -1 +0,0 @@
CREATE INDEX "i_providers_name_lower" ON "providers" USING btree ("category",lower("name"));

View File

@@ -1,2 +0,0 @@
ALTER TABLE "http_headers" DROP CONSTRAINT "u_http_header";--> statement-breakpoint
CREATE INDEX "i_http_domain" ON "http_headers" USING btree ("domain_id");

View File

@@ -1,2 +0,0 @@
ALTER TABLE "dns_records" DROP CONSTRAINT "u_dns_record";--> statement-breakpoint
ALTER TABLE "dns_records" ADD CONSTRAINT "u_dns_record" UNIQUE("domain_id","type","name","value","priority");

View File

@@ -1,2 +0,0 @@
ALTER TABLE "domains" ADD COLUMN "last_accessed_at" timestamp with time zone;--> statement-breakpoint
CREATE INDEX "i_domains_last_accessed" ON "domains" USING btree ("last_accessed_at");

View File

@@ -1 +0,0 @@
ALTER TABLE "http_headers" ADD COLUMN "status" integer DEFAULT 200 NOT NULL;

View File

@@ -1,7 +0,0 @@
DROP INDEX "i_http_domain";--> statement-breakpoint
DROP INDEX "i_http_name";--> statement-breakpoint
ALTER TABLE "http_headers" ADD PRIMARY KEY ("domain_id");--> statement-breakpoint
ALTER TABLE "http_headers" ADD COLUMN "headers" jsonb DEFAULT '[]'::jsonb NOT NULL;--> statement-breakpoint
ALTER TABLE "http_headers" DROP COLUMN "id";--> statement-breakpoint
ALTER TABLE "http_headers" DROP COLUMN "name";--> statement-breakpoint
ALTER TABLE "http_headers" DROP COLUMN "value";

View File

@@ -1,2 +0,0 @@
DROP TABLE "registration_nameservers" CASCADE;--> statement-breakpoint
ALTER TABLE "registrations" ADD COLUMN "nameservers" jsonb DEFAULT '[]'::jsonb NOT NULL;

View File

@@ -1 +0,0 @@
ALTER TABLE "seo" ADD COLUMN "preview_image_uploaded_url" text;

View File

@@ -1,5 +1,5 @@
{
"id": "06bb0394-eb78-4455-afa5-b591028232f7",
"id": "69e923f5-30d7-4e8c-b018-56b429c7534b",
"prevId": "00000000-0000-0000-0000-000000000000",
"version": "7",
"dialect": "postgresql",
@@ -213,8 +213,7 @@
},
"resolver": {
"name": "resolver",
"type": "dns_resolver",
"typeSchema": "public",
"type": "text",
"primaryKey": false,
"notNull": true
},
@@ -314,7 +313,8 @@
"domain_id",
"type",
"name",
"value"
"value",
"priority"
]
}
},
@@ -364,6 +364,12 @@
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"last_accessed_at": {
"name": "last_accessed_at",
"type": "timestamp with time zone",
"primaryKey": false,
"notNull": false
}
},
"indexes": {
@@ -381,6 +387,21 @@
"concurrently": false,
"method": "btree",
"with": {}
},
"i_domains_last_accessed": {
"name": "i_domains_last_accessed",
"columns": [
{
"expression": "last_accessed_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
@@ -568,30 +589,25 @@
"name": "http_headers",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"domain_id": {
"name": "domain_id",
"type": "uuid",
"primaryKey": false,
"primaryKey": true,
"notNull": true
},
"name": {
"name": "name",
"type": "text",
"headers": {
"name": "headers",
"type": "jsonb",
"primaryKey": false,
"notNull": true
"notNull": true,
"default": "'[]'::jsonb"
},
"value": {
"name": "value",
"type": "text",
"status": {
"name": "status",
"type": "integer",
"primaryKey": false,
"notNull": true
"notNull": true,
"default": 200
},
"fetched_at": {
"name": "fetched_at",
@@ -606,23 +622,7 @@
"notNull": true
}
},
"indexes": {
"i_http_name": {
"name": "i_http_name",
"columns": [
{
"expression": "name",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"indexes": {},
"foreignKeys": {
"http_headers_domain_id_domains_id_fk": {
"name": "http_headers_domain_id_domains_id_fk",
@@ -639,16 +639,7 @@
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {
"u_http_header": {
"name": "u_http_header",
"nullsNotDistinct": false,
"columns": [
"domain_id",
"name"
]
}
},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
@@ -689,6 +680,14 @@
"primaryKey": false,
"notNull": true
},
"source": {
"name": "source",
"type": "provider_source",
"typeSchema": "public",
"primaryKey": false,
"notNull": true,
"default": "'discovered'"
},
"created_at": {
"name": "created_at",
"type": "timestamp with time zone",
@@ -704,70 +703,21 @@
"default": "now()"
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {
"u_providers_category_slug": {
"name": "u_providers_category_slug",
"nullsNotDistinct": false,
"columns": [
"category",
"slug"
]
}
},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.registration_nameservers": {
"name": "registration_nameservers",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "uuid",
"primaryKey": true,
"notNull": true,
"default": "gen_random_uuid()"
},
"domain_id": {
"name": "domain_id",
"type": "uuid",
"primaryKey": false,
"notNull": true
},
"host": {
"name": "host",
"type": "text",
"primaryKey": false,
"notNull": true
},
"ipv4": {
"name": "ipv4",
"type": "jsonb",
"primaryKey": false,
"notNull": true,
"default": "'[]'::jsonb"
},
"ipv6": {
"name": "ipv6",
"type": "jsonb",
"primaryKey": false,
"notNull": true,
"default": "'[]'::jsonb"
}
},
"indexes": {
"i_reg_ns_host": {
"name": "i_reg_ns_host",
"i_providers_name_lower": {
"name": "i_providers_name_lower",
"columns": [
{
"expression": "host",
"expression": "category",
"isExpression": false,
"asc": true,
"nulls": "last"
},
{
"expression": "lower(\"name\")",
"asc": true,
"isExpression": true,
"nulls": "last"
}
],
"isUnique": false,
@@ -776,29 +726,15 @@
"with": {}
}
},
"foreignKeys": {
"registration_nameservers_domain_id_domains_id_fk": {
"name": "registration_nameservers_domain_id_domains_id_fk",
"tableFrom": "registration_nameservers",
"tableTo": "domains",
"columnsFrom": [
"domain_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {
"u_reg_ns": {
"name": "u_reg_ns",
"u_providers_category_slug": {
"name": "u_providers_category_slug",
"nullsNotDistinct": false,
"columns": [
"domain_id",
"host"
"category",
"slug"
]
}
},
@@ -878,6 +814,13 @@
"notNull": true,
"default": "'[]'::jsonb"
},
"nameservers": {
"name": "nameservers",
"type": "jsonb",
"primaryKey": false,
"notNull": true,
"default": "'[]'::jsonb"
},
"whois_server": {
"name": "whois_server",
"type": "text",
@@ -1175,14 +1118,6 @@
"NS"
]
},
"public.dns_resolver": {
"name": "dns_resolver",
"schema": "public",
"values": [
"cloudflare",
"google"
]
},
"public.provider_category": {
"name": "provider_category",
"schema": "public",
@@ -1194,6 +1129,14 @@
"registrar"
]
},
"public.provider_source": {
"name": "provider_source",
"schema": "public",
"values": [
"catalog",
"discovered"
]
},
"public.registration_source": {
"name": "registration_source",
"schema": "public",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -5,85 +5,8 @@
{
"idx": 0,
"version": "7",
"when": 1760902370337,
"tag": "0000_complete_wolfpack",
"breakpoints": true
},
{
"idx": 1,
"version": "7",
"when": 1761315158458,
"tag": "0001_lazy_namor",
"breakpoints": true
},
{
"idx": 2,
"version": "7",
"when": 1761678447420,
"tag": "0002_dapper_tomas",
"breakpoints": true
},
{
"idx": 3,
"version": "7",
"when": 1761683390956,
"tag": "0003_slippery_rocket_racer",
"breakpoints": true
},
{
"idx": 4,
"version": "7",
"when": 1761772897161,
"tag": "0004_tranquil_bruce_banner",
"breakpoints": true
},
{
"idx": 5,
"version": "7",
"when": 1761779161195,
"tag": "0005_wise_steve_rogers",
"breakpoints": true
},
{
"idx": 6,
"version": "7",
"when": 1761858707958,
"tag": "0006_stiff_plazm",
"breakpoints": true
},
{
"idx": 7,
"version": "7",
"when": 1762109168801,
"tag": "0007_flat_veda",
"breakpoints": true
},
{
"idx": 8,
"version": "7",
"when": 1762273848868,
"tag": "0008_slim_ken_ellis",
"breakpoints": true
},
{
"idx": 9,
"version": "7",
"when": 1762287285272,
"tag": "0009_nosy_micromacro",
"breakpoints": true
},
{
"idx": 10,
"version": "7",
"when": 1762287770864,
"tag": "0010_exotic_adam_warlock",
"breakpoints": true
},
{
"idx": 11,
"version": "7",
"when": 1762902695943,
"tag": "0011_yummy_lilandra",
"when": 1763215417831,
"tag": "0000_cute_pandemic",
"breakpoints": true
}
]

View File

@@ -1,5 +1,4 @@
import { neonConfig, Pool } from "@neondatabase/serverless";
import { drizzle } from "drizzle-orm/neon-serverless";
import { drizzle } from "drizzle-orm/node-postgres";
import * as schema from "@/lib/db/schema";
const connectionString = process.env.DATABASE_URL;
@@ -8,17 +7,4 @@ if (!connectionString) {
throw new Error("DATABASE_URL is not set");
}
// Local dev: route WebSockets via the Neon wsproxy on localhost:5433
if (connectionString.includes("localhost")) {
const { WebSocket } = await import("ws");
neonConfig.webSocketConstructor = WebSocket;
// Tell the driver how to build the wsproxy URL from the DB host
// With DATABASE_URL using host=localhost, this becomes "localhost:5433/v1"
neonConfig.wsProxy = (host) => `${host}:5433/v1`;
neonConfig.useSecureWebSocket = false; // ws:// not wss://
neonConfig.pipelineTLS = false;
neonConfig.pipelineConnect = false;
}
const pool = new Pool({ connectionString });
export const db = drizzle(pool, { schema });
export const db = drizzle(connectionString, { schema });

View File

@@ -31,12 +31,11 @@
"dependencies": {
"@bprogress/next": "^3.2.12",
"@date-fns/utc": "^2.1.1",
"@neondatabase/serverless": "^1.0.2",
"@opentelemetry/api": "^1.9.0",
"@posthog/nextjs-config": "^1.4.0",
"@readme/http-status-codes": "^9.0.5",
"@readme/http-status-codes": "^9.0.6",
"@sparticuz/chromium": "141.0.0",
"@tanstack/react-query": "^5.90.7",
"@tanstack/react-query": "^5.90.9",
"@tanstack/react-query-devtools": "^5.90.2",
"@trpc/client": "^11.7.1",
"@trpc/server": "^11.7.1",
@@ -46,7 +45,7 @@
"@vercel/analytics": "^1.5.0",
"@vercel/blob": "^2.0.0",
"@vercel/edge-config": "^1.4.3",
"@vercel/functions": "^3.3.0",
"@vercel/functions": "^3.3.2",
"@vercel/otel": "^2.1.0",
"cheerio": "^1.1.2",
"class-variance-authority": "^0.7.1",
@@ -70,8 +69,9 @@
"ms": "3.0.0-canary.202508261828",
"next": "16.0.1",
"next-themes": "^0.4.6",
"pg": "^8.16.3",
"postgres": "^3.4.7",
"posthog-js": "^1.290.0",
"posthog-js": "^1.293.0",
"posthog-node": "^5.11.2",
"puppeteer-core": "24.26.1",
"radix-ui": "^1.4.3",
@@ -97,25 +97,26 @@
"@testing-library/jest-dom": "6.9.1",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/node": "24.10.0",
"@types/node": "24.10.1",
"@types/pg": "^8.15.6",
"@types/react": "19.2.3",
"@types/react-dom": "19.2.2",
"@types/ws": "^8.18.1",
"@vitejs/plugin-react": "^5.1.0",
"@vitest/coverage-v8": "^4.0.8",
"@vitest/ui": "^4.0.8",
"@vitejs/plugin-react": "^5.1.1",
"@vitest/coverage-v8": "^4.0.9",
"@vitest/ui": "^4.0.9",
"babel-plugin-react-compiler": "19.1.0-rc.3",
"bufferutil": "^4.0.9",
"concurrently": "^9.2.1",
"drizzle-kit": "^0.31.6",
"jsdom": "^27.1.0",
"drizzle-kit": "^0.31.7",
"jsdom": "^27.2.0",
"puppeteer": "24.26.1",
"tailwindcss": "^4.1.17",
"tsx": "^4.20.6",
"tw-animate-css": "^1.4.0",
"typescript": "5.9.3",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^4.0.8"
"vitest": "^4.0.9"
},
"engines": {
"node": ">=22.x"

421
pnpm-lock.yaml generated
View File

@@ -14,9 +14,6 @@ importers:
'@date-fns/utc':
specifier: ^2.1.1
version: 2.1.1
'@neondatabase/serverless':
specifier: ^1.0.2
version: 1.0.2
'@opentelemetry/api':
specifier: ^1.9.0
version: 1.9.0
@@ -24,17 +21,17 @@ importers:
specifier: ^1.4.0
version: 1.4.0(next@16.0.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))
'@readme/http-status-codes':
specifier: ^9.0.5
version: 9.0.5
specifier: ^9.0.6
version: 9.0.6
'@sparticuz/chromium':
specifier: 141.0.0
version: 141.0.0
'@tanstack/react-query':
specifier: ^5.90.7
version: 5.90.7(react@19.2.0)
specifier: ^5.90.9
version: 5.90.9(react@19.2.0)
'@tanstack/react-query-devtools':
specifier: ^5.90.2
version: 5.90.2(@tanstack/react-query@5.90.7(react@19.2.0))(react@19.2.0)
version: 5.90.2(@tanstack/react-query@5.90.9(react@19.2.0))(react@19.2.0)
'@trpc/client':
specifier: ^11.7.1
version: 11.7.1(@trpc/server@11.7.1(typescript@5.9.3))(typescript@5.9.3)
@@ -43,7 +40,7 @@ importers:
version: 11.7.1(typescript@5.9.3)
'@trpc/tanstack-react-query':
specifier: ^11.7.1
version: 11.7.1(@tanstack/react-query@5.90.7(react@19.2.0))(@trpc/client@11.7.1(@trpc/server@11.7.1(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.7.1(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
version: 11.7.1(@tanstack/react-query@5.90.9(react@19.2.0))(@trpc/client@11.7.1(@trpc/server@11.7.1(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.7.1(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
'@upstash/ratelimit':
specifier: ^2.0.7
version: 2.0.7(@upstash/redis@1.35.6)
@@ -60,8 +57,8 @@ importers:
specifier: ^1.4.3
version: 1.4.3(@opentelemetry/api@1.9.0)(next@16.0.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))
'@vercel/functions':
specifier: ^3.3.0
version: 3.3.0
specifier: ^3.3.2
version: 3.3.2
'@vercel/otel':
specifier: ^2.1.0
version: 2.1.0(@opentelemetry/api-logs@0.207.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.207.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.207.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))
@@ -88,10 +85,10 @@ importers:
version: 17.2.3
drizzle-orm:
specifier: ^0.44.7
version: 0.44.7(@electric-sql/pglite@0.3.14)(@neondatabase/serverless@1.0.2)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(@upstash/redis@1.35.6)(postgres@3.4.7)
version: 0.44.7(@electric-sql/pglite@0.3.14)(@neondatabase/serverless@1.0.2)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(@upstash/redis@1.35.6)(pg@8.16.3)(postgres@3.4.7)
drizzle-zod:
specifier: ^0.8.3
version: 0.8.3(drizzle-orm@0.44.7(@electric-sql/pglite@0.3.14)(@neondatabase/serverless@1.0.2)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(@upstash/redis@1.35.6)(postgres@3.4.7))(zod@4.1.12)
version: 0.8.3(drizzle-orm@0.44.7(@electric-sql/pglite@0.3.14)(@neondatabase/serverless@1.0.2)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(@upstash/redis@1.35.6)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.12)
file-type:
specifier: ^21.1.0
version: 21.1.0
@@ -131,12 +128,15 @@ importers:
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
pg:
specifier: ^8.16.3
version: 8.16.3
postgres:
specifier: ^3.4.7
version: 3.4.7
posthog-js:
specifier: ^1.290.0
version: 1.290.0
specifier: ^1.293.0
version: 1.293.0
posthog-node:
specifier: ^5.11.2
version: 5.11.2
@@ -208,8 +208,11 @@ importers:
specifier: 14.6.1
version: 14.6.1(@testing-library/dom@10.4.1)
'@types/node':
specifier: 24.10.0
version: 24.10.0
specifier: 24.10.1
version: 24.10.1
'@types/pg':
specifier: ^8.15.6
version: 8.15.6
'@types/react':
specifier: 19.2.3
version: 19.2.3
@@ -220,14 +223,14 @@ importers:
specifier: ^8.18.1
version: 8.18.1
'@vitejs/plugin-react':
specifier: ^5.1.0
version: 5.1.0(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))
specifier: ^5.1.1
version: 5.1.1(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))
'@vitest/coverage-v8':
specifier: ^4.0.8
version: 4.0.8(vitest@4.0.8)
specifier: ^4.0.9
version: 4.0.9(vitest@4.0.9)
'@vitest/ui':
specifier: ^4.0.8
version: 4.0.8(vitest@4.0.8)
specifier: ^4.0.9
version: 4.0.9(vitest@4.0.9)
babel-plugin-react-compiler:
specifier: 19.1.0-rc.3
version: 19.1.0-rc.3
@@ -238,11 +241,11 @@ importers:
specifier: ^9.2.1
version: 9.2.1
drizzle-kit:
specifier: ^0.31.6
version: 0.31.6
specifier: ^0.31.7
version: 0.31.7
jsdom:
specifier: ^27.1.0
version: 27.1.0(bufferutil@4.0.9)
specifier: ^27.2.0
version: 27.2.0(bufferutil@4.0.9)
puppeteer:
specifier: 24.26.1
version: 24.26.1(bufferutil@4.0.9)(typescript@5.9.3)
@@ -260,10 +263,10 @@ importers:
version: 5.9.3
vite-tsconfig-paths:
specifier: ^5.1.4
version: 5.1.4(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))
version: 5.1.4(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))
vitest:
specifier: ^4.0.8
version: 4.0.8(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/ui@4.0.8)(jiti@2.6.1)(jsdom@27.1.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6)
specifier: ^4.0.9
version: 4.0.9(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/ui@4.0.9)(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6)
packages:
@@ -449,8 +452,8 @@ packages:
react: '>=18.0.0'
react-dom: '>=18.0.0'
'@bufbuild/protobuf@2.10.0':
resolution: {integrity: sha512-fdRs9PSrBF7QUntpZpq6BTw58fhgGJojgg39m9oFOJGZT+nip9b0so5cYY1oWl5pvemDLr0cPPsH46vwThEbpQ==}
'@bufbuild/protobuf@2.10.1':
resolution: {integrity: sha512-ckS3+vyJb5qGpEYv/s1OebUHDi/xSNtfgw1wqKZo7MR9F2z+qXr0q5XagafAG/9O0QPVIUfST0smluYSTpYFkg==}
'@canvas/image-data@1.1.0':
resolution: {integrity: sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==}
@@ -496,8 +499,8 @@ packages:
'@electric-sql/pglite@0.3.14':
resolution: {integrity: sha512-3DB258dhqdsArOI1fIt7cb9RpUOgcDg5hXWVgVHAeqVQ/qxtFy605QKs4gx6mFq3jWsSPqDN8TgSEsqC3OfV9Q==}
'@emnapi/runtime@1.7.0':
resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==}
'@emnapi/runtime@1.7.1':
resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
'@esbuild-kit/core-utils@3.3.2':
resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
@@ -1619,8 +1622,8 @@ packages:
'@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
'@posthog/cli@0.5.10':
resolution: {integrity: sha512-AJlCebe/oerSeAAzxfAu0upbWFgX7SxXBor2nsH9yyf8rai1tl7hzerRcRNHL+Iz+SPndv7Kvg2g0rO8S0a1cw==}
'@posthog/cli@0.5.12':
resolution: {integrity: sha512-woMmA4ChCzpJUa939SKfc11bYDNSkqHvhcvPn+EarV1ivIkmBu9gBOAZW1S/MfH76LCJE7tesuR0EOxo0zYjvw==}
engines: {node: '>=14', npm: '>=6'}
hasBin: true
@@ -2380,12 +2383,12 @@ packages:
'@radix-ui/rect@1.1.1':
resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==}
'@readme/http-status-codes@9.0.5':
resolution: {integrity: sha512-tm8XbKH1gQeOnHH1/K/vnSlmIh1f2dYANkCwcgIdcQGRGiAhMcnxXWRgApSd5sURcRS1jNyB0O4qqLkV8N+MQg==}
'@readme/http-status-codes@9.0.6':
resolution: {integrity: sha512-u0tV0Kz6FE+5jFcxBr/oZfxJX+R+mU2Q/zXOKS4RCuXon2LDGlrrpBih7GQnXURHIsn+MajqVbaIgGv+A6X9IQ==}
engines: {node: '>=20'}
'@rolldown/pluginutils@1.0.0-beta.43':
resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==}
'@rolldown/pluginutils@1.0.0-beta.47':
resolution: {integrity: sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==}
'@rollup/rollup-android-arm-eabi@4.53.2':
resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==}
@@ -2595,8 +2598,8 @@ packages:
'@tailwindcss/postcss@4.1.17':
resolution: {integrity: sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==}
'@tanstack/query-core@5.90.7':
resolution: {integrity: sha512-6PN65csiuTNfBMXqQUxQhCNdtm1rV+9kC9YwWAIKcaxAauq3Wu7p18j3gQY3YIBJU70jT/wzCCZ2uqto/vQgiQ==}
'@tanstack/query-core@5.90.9':
resolution: {integrity: sha512-UFOCQzi6pRGeVTVlPNwNdnAvT35zugcIydqjvFUzG62dvz2iVjElmNp/hJkUoM5eqbUPfSU/GJIr/wbvD8bTUw==}
'@tanstack/query-devtools@5.90.1':
resolution: {integrity: sha512-GtINOPjPUH0OegJExZ70UahT9ykmAhmtNVcmtdnOZbxLwT7R5OmRztR5Ahe3/Cu7LArEmR6/588tAycuaWb1xQ==}
@@ -2607,8 +2610,8 @@ packages:
'@tanstack/react-query': ^5.90.2
react: ^18 || ^19
'@tanstack/react-query@5.90.7':
resolution: {integrity: sha512-wAHc/cgKzW7LZNFloThyHnV/AX9gTg3w5yAv0gvQHPZoCnepwqCMtzbuPbb2UvfvO32XZ46e8bPOYbfZhzVnnQ==}
'@tanstack/react-query@5.90.9':
resolution: {integrity: sha512-Zke2AaXiaSfnG8jqPZR52m8SsclKT2d9//AgE/QIzyNvbpj/Q2ln+FsZjb1j69bJZUouBvX2tg9PHirkTm8arw==}
peerDependencies:
react: ^18 || ^19
@@ -2726,11 +2729,11 @@ packages:
'@types/mysql@2.15.27':
resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==}
'@types/node@22.19.0':
resolution: {integrity: sha512-xpr/lmLPQEj+TUnHmR+Ab91/glhJvsqcjB+yY0Ix9GO70H6Lb4FHH5GeqdOE5btAx7eIMwuHkp4H2MSkLcqWbA==}
'@types/node@22.19.1':
resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==}
'@types/node@24.10.0':
resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==}
'@types/node@24.10.1':
resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==}
'@types/oracledb@6.5.2':
resolution: {integrity: sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==}
@@ -2827,8 +2830,8 @@ packages:
next:
optional: true
'@vercel/functions@3.3.0':
resolution: {integrity: sha512-u5UrM2BX7gdMMXaJph3ZxgjAczv5/3oCG4H37BcnDDiXO7hJnN9C7pNX1v4mSmMLQ22n44C2bqN0d87lxfxYXQ==}
'@vercel/functions@3.3.2':
resolution: {integrity: sha512-9ldHsiw3wztPdOCEik83QC22VW52F2bBfDvKDdcjDKKFeXgHSy2EVezMbljg6GWTBfvfRlsoVNt6BEu9HQ1mKA==}
engines: {node: '>= 20'}
peerDependencies:
'@aws-sdk/credential-provider-web-identity': '*'
@@ -2836,8 +2839,8 @@ packages:
'@aws-sdk/credential-provider-web-identity':
optional: true
'@vercel/oidc@3.0.3':
resolution: {integrity: sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==}
'@vercel/oidc@3.0.4':
resolution: {integrity: sha512-NUna+D5Kk0UMscKnnFVgHhV4SfuoiE9wFpF8E8RvxHYQv9NB2PRIkQp0eTvu2uVzExFB5eH2/lYPpxw/SrICzg==}
engines: {node: '>= 20'}
'@vercel/otel@2.1.0':
@@ -2872,26 +2875,26 @@ packages:
maplibre-gl:
optional: true
'@vitejs/plugin-react@5.1.0':
resolution: {integrity: sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==}
'@vitejs/plugin-react@5.1.1':
resolution: {integrity: sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==}
engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
'@vitest/coverage-v8@4.0.8':
resolution: {integrity: sha512-wQgmtW6FtPNn4lWUXi8ZSYLpOIb92j3QCujxX3sQ81NTfQ/ORnE0HtK7Kqf2+7J9jeveMGyGyc4NWc5qy3rC4A==}
'@vitest/coverage-v8@4.0.9':
resolution: {integrity: sha512-70oyhP+Q0HlWBIeGSP74YBw5KSjYhNgSCQjvmuQFciMqnyF36WL2cIkcT7XD85G4JPmBQitEMUsx+XMFv2AzQA==}
peerDependencies:
'@vitest/browser': 4.0.8
vitest: 4.0.8
'@vitest/browser': 4.0.9
vitest: 4.0.9
peerDependenciesMeta:
'@vitest/browser':
optional: true
'@vitest/expect@4.0.8':
resolution: {integrity: sha512-Rv0eabdP/xjAHQGr8cjBm+NnLHNoL268lMDK85w2aAGLFoVKLd8QGnVon5lLtkXQCoYaNL0wg04EGnyKkkKhPA==}
'@vitest/expect@4.0.9':
resolution: {integrity: sha512-C2vyXf5/Jfj1vl4DQYxjib3jzyuswMi/KHHVN2z+H4v16hdJ7jMZ0OGe3uOVIt6LyJsAofDdaJNIFEpQcrSTFw==}
'@vitest/mocker@4.0.8':
resolution: {integrity: sha512-9FRM3MZCedXH3+pIh+ME5Up2NBBHDq0wqwhOKkN4VnvCiKbVxddqH9mSGPZeawjd12pCOGnl+lo/ZGHt0/dQSg==}
'@vitest/mocker@4.0.9':
resolution: {integrity: sha512-PUyaowQFHW+9FKb4dsvvBM4o025rWMlEDXdWRxIOilGaHREYTi5Q2Rt9VCgXgPy/hHZu1LeuXtrA/GdzOatP2g==}
peerDependencies:
msw: ^2.4.9
vite: ^6.0.0 || ^7.0.0-0
@@ -2901,25 +2904,25 @@ packages:
vite:
optional: true
'@vitest/pretty-format@4.0.8':
resolution: {integrity: sha512-qRrjdRkINi9DaZHAimV+8ia9Gq6LeGz2CgIEmMLz3sBDYV53EsnLZbJMR1q84z1HZCMsf7s0orDgZn7ScXsZKg==}
'@vitest/pretty-format@4.0.9':
resolution: {integrity: sha512-Hor0IBTwEi/uZqB7pvGepyElaM8J75pYjrrqbC8ZYMB9/4n5QA63KC15xhT+sqHpdGWfdnPo96E8lQUxs2YzSQ==}
'@vitest/runner@4.0.8':
resolution: {integrity: sha512-mdY8Sf1gsM8hKJUQfiPT3pn1n8RF4QBcJYFslgWh41JTfrK1cbqY8whpGCFzBl45LN028g0njLCYm0d7XxSaQQ==}
'@vitest/runner@4.0.9':
resolution: {integrity: sha512-aF77tsXdEvIJRkj9uJZnHtovsVIx22Ambft9HudC+XuG/on1NY/bf5dlDti1N35eJT+QZLb4RF/5dTIG18s98w==}
'@vitest/snapshot@4.0.8':
resolution: {integrity: sha512-Nar9OTU03KGiubrIOFhcfHg8FYaRaNT+bh5VUlNz8stFhCZPNrJvmZkhsr1jtaYvuefYFwK2Hwrq026u4uPWCw==}
'@vitest/snapshot@4.0.9':
resolution: {integrity: sha512-r1qR4oYstPbnOjg0Vgd3E8ADJbi4ditCzqr+Z9foUrRhIy778BleNyZMeAJ2EjV+r4ASAaDsdciC9ryMy8xMMg==}
'@vitest/spy@4.0.8':
resolution: {integrity: sha512-nvGVqUunyCgZH7kmo+Ord4WgZ7lN0sOULYXUOYuHr55dvg9YvMz3izfB189Pgp28w0vWFbEEfNc/c3VTrqrXeA==}
'@vitest/spy@4.0.9':
resolution: {integrity: sha512-J9Ttsq0hDXmxmT8CUOWUr1cqqAj2FJRGTdyEjSR+NjoOGKEqkEWj+09yC0HhI8t1W6t4Ctqawl1onHgipJve1A==}
'@vitest/ui@4.0.8':
resolution: {integrity: sha512-F9jI5rSstNknPlTlPN2gcc4gpbaagowuRzw/OJzl368dvPun668Q182S8Q8P9PITgGCl5LAKXpzuue106eM4wA==}
'@vitest/ui@4.0.9':
resolution: {integrity: sha512-6HV2HHl9aRJ09TlYj/WAQxaa797Ezb5u0LpgabthlASAUAWKgw/W1DSPX7t848mMZmIUvzZgnUHGIylAoYHP0w==}
peerDependencies:
vitest: 4.0.8
vitest: 4.0.9
'@vitest/utils@4.0.8':
resolution: {integrity: sha512-pdk2phO5NDvEFfUTxcTP8RFYjVj/kfLSPIN5ebP2Mu9kcIMeAQTbknqcFEyBcC4z2pJlJI9aS5UQjcYfhmKAow==}
'@vitest/utils@4.0.9':
resolution: {integrity: sha512-cEol6ygTzY4rUPvNZM19sDf7zGa35IYTm9wfzkHoT/f5jX10IOY7QleWSOh5T0e3I3WVozwK5Asom79qW8DiuQ==}
abort-controller@3.0.0:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
@@ -3063,8 +3066,8 @@ packages:
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
baseline-browser-mapping@2.8.26:
resolution: {integrity: sha512-73lC1ugzwoaWCLJ1LvOgrR5xsMLTqSKIEoMHVtL9E/HNk0PXtTM76ZIm84856/SF7Nv8mPZxKoBsgpm0tR1u1Q==}
baseline-browser-mapping@2.8.28:
resolution: {integrity: sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==}
hasBin: true
basic-ftp@5.0.5:
@@ -3249,8 +3252,8 @@ packages:
resolution: {integrity: sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==}
engines: {node: '>=20'}
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
csstype@3.2.1:
resolution: {integrity: sha512-98XGutrXoh75MlgLihlNxAGbUuFQc7l1cqcnEZlLNKc0UrVdPndgmaDmYTDDh929VS/eqTZV0rozmhu2qqT1/g==}
data-uri-to-buffer@6.0.2:
resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==}
@@ -3331,8 +3334,8 @@ packages:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
drizzle-kit@0.31.6:
resolution: {integrity: sha512-/B4e/4pwnx25QwD5xXgdpo1S+077a2VZdosXbItE/oNmUgQwZydGDz9qJYmnQl/b+5IX0rLfwRhrPnroGtrg8Q==}
drizzle-kit@0.31.7:
resolution: {integrity: sha512-hOzRGSdyKIU4FcTSFYGKdXEjFsncVwHZ43gY3WU5Bz9j5Iadp6Rh6hxLSQ1IWXpKLBKt/d5y1cpSPcV+FcoQ1A==}
hasBin: true
drizzle-orm@0.44.7:
@@ -3446,8 +3449,8 @@ packages:
easy-table@1.1.0:
resolution: {integrity: sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==}
electron-to-chromium@1.5.250:
resolution: {integrity: sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==}
electron-to-chromium@1.5.253:
resolution: {integrity: sha512-O0tpQ/35rrgdiGQ0/OFWhy1itmd9A6TY9uQzlqj3hKSu/aYpe7UIn5d7CU2N9myH6biZiWF3VMZVuup8pw5U9w==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -3922,12 +3925,12 @@ packages:
js-tokens@9.0.1:
resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
js-yaml@4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
js-yaml@4.1.1:
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true
jsdom@27.1.0:
resolution: {integrity: sha512-Pcfm3eZ+eO4JdZCXthW9tCDT3nF4K+9dmeZ+5X39n+Kqz0DDIABRP5CAEOHRFZk8RGuC2efksTJxrjp8EXCunQ==}
jsdom@27.2.0:
resolution: {integrity: sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==}
engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
peerDependencies:
canvas: ^3.0.0
@@ -4265,10 +4268,21 @@ packages:
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
pg-cloudflare@1.2.7:
resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==}
pg-connection-string@2.9.1:
resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==}
pg-int8@1.0.1:
resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
engines: {node: '>=4.0.0'}
pg-pool@3.10.1:
resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==}
peerDependencies:
pg: '>=8.0'
pg-protocol@1.10.3:
resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==}
@@ -4276,6 +4290,18 @@ packages:
resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
engines: {node: '>=4'}
pg@8.16.3:
resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==}
engines: {node: '>= 16.0.0'}
peerDependencies:
pg-native: '>=3.0.1'
peerDependenciesMeta:
pg-native:
optional: true
pgpass@1.0.5:
resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -4323,8 +4349,8 @@ packages:
resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==}
engines: {node: '>=12'}
posthog-js@1.290.0:
resolution: {integrity: sha512-zavBwZkf+3JeiSDVE7ZDXBfzva/iOljicdhdJH+cZoqp0LsxjKxjnNhGOd3KpAhw0wqdwjhd7Lp1aJuI7DXyaw==}
posthog-js@1.293.0:
resolution: {integrity: sha512-0KN3gVNbZPwEEWe5w6VH5Ql/+y113mwsl5TTEpOlAtN1ae6Ok18mQ6cS2K0X56GpF/dtdSoXQtnex6ZqUcdAcA==}
posthog-node@5.11.2:
resolution: {integrity: sha512-z+XekcBUmGePMsjPlGaEF2bJFiDHKHYPQjS4OEw4YPDQz8s7Owuim/L7xNX+6UJkyIRniBza9iC7bW8yrGTv1g==}
@@ -4642,6 +4668,10 @@ packages:
resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
engines: {node: '>=0.10.0'}
split2@4.2.0:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
engines: {node: '>= 10.x'}
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
@@ -4975,18 +5005,18 @@ packages:
yaml:
optional: true
vitest@4.0.8:
resolution: {integrity: sha512-urzu3NCEV0Qa0Y2PwvBtRgmNtxhj5t5ULw7cuKhIHh3OrkKTLlut0lnBOv9qe5OvbkMH2g38G7KPDCTpIytBVg==}
vitest@4.0.9:
resolution: {integrity: sha512-E0Ja2AX4th+CG33yAFRC+d1wFx2pzU5r6HtG6LiPSE04flaE0qB6YyjSw9ZcpJAtVPfsvZGtJlKWZpuW7EHRxg==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@types/debug': ^4.1.12
'@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
'@vitest/browser-playwright': 4.0.8
'@vitest/browser-preview': 4.0.8
'@vitest/browser-webdriverio': 4.0.8
'@vitest/ui': 4.0.8
'@vitest/browser-playwright': 4.0.9
'@vitest/browser-preview': 4.0.9
'@vitest/browser-webdriverio': 4.0.9
'@vitest/ui': 4.0.9
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
@@ -5310,7 +5340,7 @@ snapshots:
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
'@bufbuild/protobuf@2.10.0': {}
'@bufbuild/protobuf@2.10.1': {}
'@canvas/image-data@1.1.0': {}
@@ -5342,7 +5372,7 @@ snapshots:
'@electric-sql/pglite@0.3.14': {}
'@emnapi/runtime@1.7.0':
'@emnapi/runtime@1.7.1':
dependencies:
tslib: 2.8.1
optional: true
@@ -5616,7 +5646,7 @@ snapshots:
'@img/sharp-wasm32@0.34.5':
dependencies:
'@emnapi/runtime': 1.7.0
'@emnapi/runtime': 1.7.1
optional: true
'@img/sharp-win32-arm64@0.34.5':
@@ -5630,7 +5660,7 @@ snapshots:
'@inngest/ai@0.1.7':
dependencies:
'@types/node': 22.19.0
'@types/node': 22.19.1
typescript: 5.9.3
'@isaacs/balanced-match@4.0.1': {}
@@ -5729,8 +5759,9 @@ snapshots:
'@neondatabase/serverless@1.0.2':
dependencies:
'@types/node': 22.19.0
'@types/node': 22.19.1
'@types/pg': 8.15.6
optional: true
'@next/env@16.0.1': {}
@@ -6506,7 +6537,7 @@ snapshots:
'@polka/url@1.0.0-next.29': {}
'@posthog/cli@0.5.10':
'@posthog/cli@0.5.12':
dependencies:
axios: 1.13.2
axios-proxy-builder: 0.1.2
@@ -6522,7 +6553,7 @@ snapshots:
'@posthog/nextjs-config@1.4.0(next@16.0.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))':
dependencies:
'@posthog/cli': 0.5.10
'@posthog/cli': 0.5.12
'@posthog/core': 1.5.2
next: 16.0.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
semver: 7.7.3
@@ -7330,9 +7361,9 @@ snapshots:
'@radix-ui/rect@1.1.1': {}
'@readme/http-status-codes@9.0.5': {}
'@readme/http-status-codes@9.0.6': {}
'@rolldown/pluginutils@1.0.0-beta.43': {}
'@rolldown/pluginutils@1.0.0-beta.47': {}
'@rollup/rollup-android-arm-eabi@4.53.2':
optional: true
@@ -7485,19 +7516,19 @@ snapshots:
postcss: 8.5.6
tailwindcss: 4.1.17
'@tanstack/query-core@5.90.7': {}
'@tanstack/query-core@5.90.9': {}
'@tanstack/query-devtools@5.90.1': {}
'@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.90.7(react@19.2.0))(react@19.2.0)':
'@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.90.9(react@19.2.0))(react@19.2.0)':
dependencies:
'@tanstack/query-devtools': 5.90.1
'@tanstack/react-query': 5.90.7(react@19.2.0)
'@tanstack/react-query': 5.90.9(react@19.2.0)
react: 19.2.0
'@tanstack/react-query@5.90.7(react@19.2.0)':
'@tanstack/react-query@5.90.9(react@19.2.0)':
dependencies:
'@tanstack/query-core': 5.90.7
'@tanstack/query-core': 5.90.9
react: 19.2.0
'@testing-library/dom@10.4.1':
@@ -7555,9 +7586,9 @@ snapshots:
dependencies:
typescript: 5.9.3
'@trpc/tanstack-react-query@11.7.1(@tanstack/react-query@5.90.7(react@19.2.0))(@trpc/client@11.7.1(@trpc/server@11.7.1(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.7.1(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
'@trpc/tanstack-react-query@11.7.1(@tanstack/react-query@5.90.9(react@19.2.0))(@trpc/client@11.7.1(@trpc/server@11.7.1(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.7.1(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
'@tanstack/react-query': 5.90.7(react@19.2.0)
'@tanstack/react-query': 5.90.9(react@19.2.0)
'@trpc/client': 11.7.1(@trpc/server@11.7.1(typescript@5.9.3))(typescript@5.9.3)
'@trpc/server': 11.7.1(typescript@5.9.3)
react: 19.2.0
@@ -7591,7 +7622,7 @@ snapshots:
'@types/bunyan@1.8.11':
dependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
'@types/chai@5.2.3':
dependencies:
@@ -7600,7 +7631,7 @@ snapshots:
'@types/connect@3.4.38':
dependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
'@types/debug@4.1.12':
dependencies:
@@ -7620,41 +7651,41 @@ snapshots:
'@types/memcached@2.2.10':
dependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
'@types/ms@2.1.0': {}
'@types/mysql@2.15.27':
dependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
'@types/node@22.19.0':
'@types/node@22.19.1':
dependencies:
undici-types: 6.21.0
'@types/node@24.10.0':
'@types/node@24.10.1':
dependencies:
undici-types: 7.16.0
'@types/oracledb@6.5.2':
dependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
'@types/pbf@3.0.5': {}
'@types/pg-pool@2.0.6':
dependencies:
'@types/pg': 8.15.5
'@types/pg': 8.15.6
'@types/pg@8.15.5':
dependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
pg-protocol: 1.10.3
pg-types: 2.2.0
'@types/pg@8.15.6':
dependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
pg-protocol: 1.10.3
pg-types: 2.2.0
@@ -7664,7 +7695,7 @@ snapshots:
'@types/react@19.2.3':
dependencies:
csstype: 3.1.3
csstype: 3.2.1
'@types/shimmer@1.2.0': {}
@@ -7674,15 +7705,15 @@ snapshots:
'@types/tedious@4.0.14':
dependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
'@types/ws@8.18.1':
dependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
'@types/yauzl@2.10.3':
dependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
optional: true
'@upstash/core-analytics@0.0.10':
@@ -7720,11 +7751,11 @@ snapshots:
'@opentelemetry/api': 1.9.0
next: 16.0.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@vercel/functions@3.3.0':
'@vercel/functions@3.3.2':
dependencies:
'@vercel/oidc': 3.0.3
'@vercel/oidc': 3.0.4
'@vercel/oidc@3.0.3': {}
'@vercel/oidc@3.0.4': {}
'@vercel/otel@2.1.0(@opentelemetry/api-logs@0.207.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.207.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.207.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))':
dependencies:
@@ -7749,22 +7780,22 @@ snapshots:
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
'@vitejs/plugin-react@5.1.0(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))':
'@vitejs/plugin-react@5.1.1(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))':
dependencies:
'@babel/core': 7.28.5
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5)
'@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5)
'@rolldown/pluginutils': 1.0.0-beta.43
'@rolldown/pluginutils': 1.0.0-beta.47
'@types/babel__core': 7.20.5
react-refresh: 0.18.0
vite: 7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)
vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)
transitivePeerDependencies:
- supports-color
'@vitest/coverage-v8@4.0.8(vitest@4.0.8)':
'@vitest/coverage-v8@4.0.9(vitest@4.0.9)':
dependencies:
'@bcoe/v8-coverage': 1.0.2
'@vitest/utils': 4.0.8
'@vitest/utils': 4.0.9
ast-v8-to-istanbul: 0.3.8
debug: 4.4.3
istanbul-lib-coverage: 3.2.2
@@ -7774,58 +7805,58 @@ snapshots:
magicast: 0.5.1
std-env: 3.10.0
tinyrainbow: 3.0.3
vitest: 4.0.8(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/ui@4.0.8)(jiti@2.6.1)(jsdom@27.1.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6)
vitest: 4.0.9(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/ui@4.0.9)(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6)
transitivePeerDependencies:
- supports-color
'@vitest/expect@4.0.8':
'@vitest/expect@4.0.9':
dependencies:
'@standard-schema/spec': 1.0.0
'@types/chai': 5.2.3
'@vitest/spy': 4.0.8
'@vitest/utils': 4.0.8
'@vitest/spy': 4.0.9
'@vitest/utils': 4.0.9
chai: 6.2.1
tinyrainbow: 3.0.3
'@vitest/mocker@4.0.8(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))':
'@vitest/mocker@4.0.9(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))':
dependencies:
'@vitest/spy': 4.0.8
'@vitest/spy': 4.0.9
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
vite: 7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)
vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)
'@vitest/pretty-format@4.0.8':
'@vitest/pretty-format@4.0.9':
dependencies:
tinyrainbow: 3.0.3
'@vitest/runner@4.0.8':
'@vitest/runner@4.0.9':
dependencies:
'@vitest/utils': 4.0.8
'@vitest/utils': 4.0.9
pathe: 2.0.3
'@vitest/snapshot@4.0.8':
'@vitest/snapshot@4.0.9':
dependencies:
'@vitest/pretty-format': 4.0.8
'@vitest/pretty-format': 4.0.9
magic-string: 0.30.21
pathe: 2.0.3
'@vitest/spy@4.0.8': {}
'@vitest/spy@4.0.9': {}
'@vitest/ui@4.0.8(vitest@4.0.8)':
'@vitest/ui@4.0.9(vitest@4.0.9)':
dependencies:
'@vitest/utils': 4.0.8
'@vitest/utils': 4.0.9
fflate: 0.8.2
flatted: 3.3.3
pathe: 2.0.3
sirv: 3.0.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
vitest: 4.0.8(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/ui@4.0.8)(jiti@2.6.1)(jsdom@27.1.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6)
vitest: 4.0.9(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/ui@4.0.9)(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6)
'@vitest/utils@4.0.8':
'@vitest/utils@4.0.9':
dependencies:
'@vitest/pretty-format': 4.0.8
'@vitest/pretty-format': 4.0.9
tinyrainbow: 3.0.3
abort-controller@3.0.0:
@@ -7947,7 +7978,7 @@ snapshots:
base64-js@1.5.1: {}
baseline-browser-mapping@2.8.26: {}
baseline-browser-mapping@2.8.28: {}
basic-ftp@5.0.5: {}
@@ -7963,9 +7994,9 @@ snapshots:
browserslist@4.28.0:
dependencies:
baseline-browser-mapping: 2.8.26
baseline-browser-mapping: 2.8.28
caniuse-lite: 1.0.30001754
electron-to-chromium: 1.5.250
electron-to-chromium: 1.5.253
node-releases: 2.0.27
update-browserslist-db: 1.1.4(browserslist@4.28.0)
@@ -8115,7 +8146,7 @@ snapshots:
dependencies:
env-paths: 2.2.1
import-fresh: 3.3.1
js-yaml: 4.1.0
js-yaml: 4.1.1
parse-json: 5.2.0
optionalDependencies:
typescript: 5.9.3
@@ -8159,7 +8190,7 @@ snapshots:
'@csstools/css-syntax-patches-for-csstree': 1.0.16
css-tree: 3.1.0
csstype@3.1.3: {}
csstype@3.2.1: {}
data-uri-to-buffer@6.0.2: {}
@@ -8232,7 +8263,7 @@ snapshots:
dotenv@17.2.3: {}
drizzle-kit@0.31.6:
drizzle-kit@0.31.7:
dependencies:
'@drizzle-team/brocli': 0.10.2
'@esbuild-kit/esm-loader': 2.6.5
@@ -8241,18 +8272,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
drizzle-orm@0.44.7(@electric-sql/pglite@0.3.14)(@neondatabase/serverless@1.0.2)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(@upstash/redis@1.35.6)(postgres@3.4.7):
drizzle-orm@0.44.7(@electric-sql/pglite@0.3.14)(@neondatabase/serverless@1.0.2)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(@upstash/redis@1.35.6)(pg@8.16.3)(postgres@3.4.7):
optionalDependencies:
'@electric-sql/pglite': 0.3.14
'@neondatabase/serverless': 1.0.2
'@opentelemetry/api': 1.9.0
'@types/pg': 8.15.6
'@upstash/redis': 1.35.6
pg: 8.16.3
postgres: 3.4.7
drizzle-zod@0.8.3(drizzle-orm@0.44.7(@electric-sql/pglite@0.3.14)(@neondatabase/serverless@1.0.2)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(@upstash/redis@1.35.6)(postgres@3.4.7))(zod@4.1.12):
drizzle-zod@0.8.3(drizzle-orm@0.44.7(@electric-sql/pglite@0.3.14)(@neondatabase/serverless@1.0.2)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(@upstash/redis@1.35.6)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.12):
dependencies:
drizzle-orm: 0.44.7(@electric-sql/pglite@0.3.14)(@neondatabase/serverless@1.0.2)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(@upstash/redis@1.35.6)(postgres@3.4.7)
drizzle-orm: 0.44.7(@electric-sql/pglite@0.3.14)(@neondatabase/serverless@1.0.2)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(@upstash/redis@1.35.6)(pg@8.16.3)(postgres@3.4.7)
zod: 4.1.12
dunder-proto@1.0.1:
@@ -8269,7 +8301,7 @@ snapshots:
optionalDependencies:
wcwidth: 1.0.1
electron-to-chromium@1.5.250: {}
electron-to-chromium@1.5.253: {}
emoji-regex@8.0.0: {}
@@ -8672,7 +8704,7 @@ snapshots:
inngest@3.45.1(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.1(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)(zod@4.1.12):
dependencies:
'@bufbuild/protobuf': 2.10.0
'@bufbuild/protobuf': 2.10.1
'@inngest/ai': 0.1.7
'@jpwilliams/waitgroup': 2.1.1
'@opentelemetry/api': 1.9.0
@@ -8780,11 +8812,11 @@ snapshots:
js-tokens@9.0.1: {}
js-yaml@4.1.0:
js-yaml@4.1.1:
dependencies:
argparse: 2.0.1
jsdom@27.1.0(bufferutil@4.0.9):
jsdom@27.2.0(bufferutil@4.0.9):
dependencies:
'@acemir/cssom': 0.9.23
'@asamuzakjp/dom-selector': 6.7.4
@@ -9117,8 +9149,17 @@ snapshots:
pend@1.2.0: {}
pg-cloudflare@1.2.7:
optional: true
pg-connection-string@2.9.1: {}
pg-int8@1.0.1: {}
pg-pool@3.10.1(pg@8.16.3):
dependencies:
pg: 8.16.3
pg-protocol@1.10.3: {}
pg-types@2.2.0:
@@ -9129,6 +9170,20 @@ snapshots:
postgres-date: 1.0.7
postgres-interval: 1.2.0
pg@8.16.3:
dependencies:
pg-connection-string: 2.9.1
pg-pool: 3.10.1(pg@8.16.3)
pg-protocol: 1.10.3
pg-types: 2.2.0
pgpass: 1.0.5
optionalDependencies:
pg-cloudflare: 1.2.7
pgpass@1.0.5:
dependencies:
split2: 4.2.0
picocolors@1.1.1: {}
picomatch@4.0.3: {}
@@ -9165,7 +9220,7 @@ snapshots:
postgres@3.4.7: {}
posthog-js@1.290.0:
posthog-js@1.293.0:
dependencies:
'@posthog/core': 1.5.2
core-js: 3.46.0
@@ -9203,7 +9258,7 @@ snapshots:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/node': 24.10.0
'@types/node': 24.10.1
long: 5.3.2
protocol-buffers-schema@3.6.0: {}
@@ -9601,6 +9656,8 @@ snapshots:
dependencies:
extend-shallow: 3.0.2
split2@4.2.0: {}
stackback@0.0.2: {}
std-env@3.10.0: {}
@@ -9863,18 +9920,18 @@ snapshots:
- '@types/react'
- '@types/react-dom'
vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)):
vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)):
dependencies:
debug: 4.4.3
globrex: 0.1.2
tsconfck: 3.1.6(typescript@5.9.3)
optionalDependencies:
vite: 7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)
vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)
transitivePeerDependencies:
- supports-color
- typescript
vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6):
vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6):
dependencies:
esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3)
@@ -9883,21 +9940,21 @@ snapshots:
rollup: 4.53.2
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 24.10.0
'@types/node': 24.10.1
fsevents: 2.3.3
jiti: 2.6.1
lightningcss: 1.30.2
tsx: 4.20.6
vitest@4.0.8(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/ui@4.0.8)(jiti@2.6.1)(jsdom@27.1.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6):
vitest@4.0.9(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/ui@4.0.9)(jiti@2.6.1)(jsdom@27.2.0(bufferutil@4.0.9))(lightningcss@1.30.2)(tsx@4.20.6):
dependencies:
'@vitest/expect': 4.0.8
'@vitest/mocker': 4.0.8(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))
'@vitest/pretty-format': 4.0.8
'@vitest/runner': 4.0.8
'@vitest/snapshot': 4.0.8
'@vitest/spy': 4.0.8
'@vitest/utils': 4.0.8
'@vitest/expect': 4.0.9
'@vitest/mocker': 4.0.9(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))
'@vitest/pretty-format': 4.0.9
'@vitest/runner': 4.0.9
'@vitest/snapshot': 4.0.9
'@vitest/spy': 4.0.9
'@vitest/utils': 4.0.9
debug: 4.4.3
es-module-lexer: 1.7.0
expect-type: 1.2.2
@@ -9909,13 +9966,13 @@ snapshots:
tinyexec: 0.3.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
vite: 7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)
vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/debug': 4.1.12
'@types/node': 24.10.0
'@vitest/ui': 4.0.8(vitest@4.0.8)
jsdom: 27.1.0(bufferutil@4.0.9)
'@types/node': 24.10.1
'@vitest/ui': 4.0.9(vitest@4.0.9)
jsdom: 27.2.0(bufferutil@4.0.9)
transitivePeerDependencies:
- jiti
- less

View File

@@ -61,8 +61,6 @@ wait_for_port() {
# --- Wait for exposed services ----------------------------------------------
# Postgres TCP
wait_for_port "127.0.0.1" 5432 "Postgres"
# Neon wsproxy (WebSocket over HTTP)
wait_for_port "127.0.0.1" 5433 "Neon wsproxy"
# Redis TCP
wait_for_port "127.0.0.1" 6379 "Redis"
# Serverless Redis HTTP (SRH)
@@ -74,7 +72,6 @@ wait_for_port "127.0.0.1" 8288 "Inngest Dev Server"
echo
echo "🎉 Local infra is ready!"
echo " * Postgres: postgres://postgres:postgres@localhost:5432/main"
echo " * wsproxy: ws://localhost:5433/v1 (driver uses this automatically)"
echo " * Redis: redis://localhost:6379"
echo " * SRH: http://localhost:8079"
echo " * Inngest: http://localhost:8288"