From 2073248576085d198dfbe49668e17805e1726885 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Tue, 7 Jul 2026 13:39:11 -0500 Subject: [PATCH] fix: Superforms SSR import from /server path and Prisma client version mismatch - Import superValidate from sveltekit-superforms/server instead of default path to avoid pulling SuperDebug.svelte into SSR - Upgrade @prisma/client to match prisma CLI version (7.2.0 -> 7.8.0) so generated client's query_compiler_fast_bg files exist at runtime - Add regression test verifying superValidate works in server context - Add regression test verifying generated Prisma client compiler imports reference real files --- package-lock.json | 45 ++++++++++--------- package.json | 4 +- src/lib/svelte-admin/crud.spec.ts | 45 +++++++++++++++++++ src/lib/svelte-admin/crud.ts | 2 +- .../admin/profiles/+page.server.ts | 2 +- 5 files changed, 74 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 336539e..1f4c4b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,8 @@ "name": "portal.Rhemawavetech.com", "version": "0.0.1", "dependencies": { - "@prisma/adapter-pg": "^7.2.0", - "@prisma/client": "^7.2.0", + "@prisma/adapter-pg": "^7.8.0", + "@prisma/client": "^7.8.0", "@tiptap/core": "^3.15.3", "@tiptap/extension-color": "^3.27.3", "@tiptap/extension-highlight": "^3.27.3", @@ -1027,12 +1027,13 @@ "optional": true }, "node_modules/@prisma/adapter-pg": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-7.2.0.tgz", - "integrity": "sha512-euIdQ13cRB2wZ3jPsnDnFhINquo1PYFPCg6yVL8b2rp3EdinQHsX9EDdCtRr489D5uhphcRk463OdQAFlsCr0w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-7.8.0.tgz", + "integrity": "sha512-ygb3UkerK3v8MDpXVgCISdRNDozpxh6+JVJgiIGbSr5KBgz10LLf5ejUskPGoXlsIjxsOu6nuy1JVQr2EKGSlg==", "license": "Apache-2.0", "dependencies": { - "@prisma/driver-adapter-utils": "7.2.0", + "@prisma/driver-adapter-utils": "7.8.0", + "@types/pg": "^8.16.0", "pg": "^8.16.3", "postgres-array": "3.0.4" } @@ -1047,12 +1048,12 @@ } }, "node_modules/@prisma/client": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.2.0.tgz", - "integrity": "sha512-JdLF8lWZ+LjKGKpBqyAlenxd/kXjd1Abf/xK+6vUA7R7L2Suo6AFTHFRpPSdAKCan9wzdFApsUpSa/F6+t1AtA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.8.0.tgz", + "integrity": "sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw==", "license": "Apache-2.0", "dependencies": { - "@prisma/client-runtime-utils": "7.2.0" + "@prisma/client-runtime-utils": "7.8.0" }, "engines": { "node": "^20.19 || ^22.12 || >=24.0" @@ -1071,9 +1072,9 @@ } }, "node_modules/@prisma/client-runtime-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.2.0.tgz", - "integrity": "sha512-dn7oB53v0tqkB0wBdMuTNFNPdEbfICEUe82Tn9FoKAhJCUkDH+fmyEp0ClciGh+9Hp2Tuu2K52kth2MTLstvmA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.8.0.tgz", + "integrity": "sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw==", "license": "Apache-2.0" }, "node_modules/@prisma/config": { @@ -1093,6 +1094,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.2.0.tgz", "integrity": "sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==", + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/dev": { @@ -1122,14 +1124,20 @@ } }, "node_modules/@prisma/driver-adapter-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.2.0.tgz", - "integrity": "sha512-gzrUcbI9VmHS24Uf+0+7DNzdIw7keglJsD5m/MHxQOU68OhGVzlphQRobLiDMn8CHNA2XN8uugwKjudVtnfMVQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.8.0.tgz", + "integrity": "sha512-/Q13o0ZT0rjc1Xk0Q9KhZYwuq2EW/vSbWUBKfgEKkaCuB/Sg6bqnjmTZqC5cD4d6y1vfFAEwBRzfzoSMIVJ55A==", "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.2.0" + "@prisma/debug": "7.8.0" } }, + "node_modules/@prisma/driver-adapter-utils/node_modules/@prisma/debug": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.8.0.tgz", + "integrity": "sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA==", + "license": "Apache-2.0" + }, "node_modules/@prisma/engines": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.8.0.tgz", @@ -2801,7 +2809,6 @@ "version": "22.19.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.5.tgz", "integrity": "sha512-HfF8+mYcHPcPypui3w3mvzuIErlNOh2OAG+BCeBZCEwyiD5ls2SiCwEyT47OELtf7M3nHxBdu0FsmzdKxkN52Q==", - "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -2811,7 +2818,6 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz", "integrity": "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -7034,7 +7040,6 @@ "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/uri-js": { diff --git a/package.json b/package.json index b0c5cb7..061834f 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,8 @@ "vitest-browser-svelte": "^2.0.1" }, "dependencies": { - "@prisma/adapter-pg": "^7.2.0", - "@prisma/client": "^7.2.0", + "@prisma/adapter-pg": "^7.8.0", + "@prisma/client": "^7.8.0", "@tiptap/core": "^3.15.3", "@tiptap/extension-color": "^3.27.3", "@tiptap/extension-highlight": "^3.27.3", diff --git a/src/lib/svelte-admin/crud.spec.ts b/src/lib/svelte-admin/crud.spec.ts index ac41251..791d87d 100644 --- a/src/lib/svelte-admin/crud.spec.ts +++ b/src/lib/svelte-admin/crud.spec.ts @@ -2,6 +2,10 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { createLocals, mockUser } from '$lib/test-utils'; import { getModelConfig } from './registry'; +// Ensure superValidate can be imported from server path in Node.js/SSR context +import { superValidate } from 'sveltekit-superforms/server'; +import { zod4 } from 'sveltekit-superforms/adapters'; + vi.mock('$lib/db', () => ({ prisma: { userRole: { @@ -122,3 +126,44 @@ describe('crud deleteRecord', () => { expect(result).toEqual({ success: false, error: 'Missing id' }); }); }); + +describe('sveltekit-superforms import compatibility', () => { + it('imports superValidate from server path without pulling in SuperDebug.svelte', async () => { + expect(superValidate).toBeDefined(); + }); + + it('calls superValidate with a Request and validates against a Zod schema', async () => { + const { z } = await import('zod'); + const schema = z.object({ name: z.string().min(1) }); + const body = new URLSearchParams({ name: 'test' }); + const request = new Request('http://localhost', { + method: 'POST', + body, + headers: { 'content-type': 'application/x-www-form-urlencoded' } + }); + const form = await superValidate(request, zod4(schema)); + expect(form.valid).toBe(true); + expect(form.data).toEqual({ name: 'test' }); + }); +}); + +describe('prisma client version consistency', () => { + it('generated client references existing query compiler files', async () => { + const fs = await import('fs'); + const path = await import('path'); + const runtimeDir = path.resolve( + 'node_modules/@prisma/client/runtime' + ); + + const generatedFile = path.resolve( + 'src/lib/generated/prisma/internal/class.ts' + ); + const content = fs.readFileSync(generatedFile, 'utf-8'); + const compilerMatch = content.match( + /import\(["']@prisma\/client\/runtime\/([^"']+)["']\)/ + ); + expect(compilerMatch).not.toBeNull(); + const compilerPath = path.join(runtimeDir, compilerMatch![1]); + expect(fs.existsSync(compilerPath)).toBe(true); + }); +}); diff --git a/src/lib/svelte-admin/crud.ts b/src/lib/svelte-admin/crud.ts index b57a08c..948aaa2 100644 --- a/src/lib/svelte-admin/crud.ts +++ b/src/lib/svelte-admin/crud.ts @@ -1,7 +1,7 @@ import { getDelegate, parseId } from './prisma-delegate'; import { extractFormData } from './form-data'; import type { AdminModelConfig } from './types'; -import { superValidate } from 'sveltekit-superforms'; +import { superValidate } from 'sveltekit-superforms/server'; import { zod4 } from 'sveltekit-superforms/adapters'; import * as Schemas from './schemas'; import type { z } from 'zod'; diff --git a/src/routes/(protected)/admin/profiles/+page.server.ts b/src/routes/(protected)/admin/profiles/+page.server.ts index c824c2c..619fd8c 100644 --- a/src/routes/(protected)/admin/profiles/+page.server.ts +++ b/src/routes/(protected)/admin/profiles/+page.server.ts @@ -8,7 +8,7 @@ import { } from '$lib/svelte-admin/crud'; import { prisma } from '$lib/db'; import { error } from '@sveltejs/kit'; -import { superValidate } from 'sveltekit-superforms'; +import { superValidate } from 'sveltekit-superforms/server'; import { zod4 } from 'sveltekit-superforms/adapters'; import * as Schemas from '$lib/svelte-admin/schemas';