test setup lackin

This commit is contained in:
2025-09-03 22:04:56 +02:00
parent 869cc07fdd
commit 276c3dd75f
35 changed files with 629 additions and 285 deletions

View File

@@ -3,7 +3,7 @@ import type { Config } from "drizzle-kit";
import { env } from "~/env";
export default {
schema: "./src/server/db/schema.ts",
schema: "./src/server/dbschema/schema.ts",
dialect: "postgresql",
dbCredentials: {
url: env.DATABASE_URL,

View File

@@ -16,50 +16,51 @@
"preview": "next build && next start",
"start": "next start",
"typecheck": "tsc --noEmit",
"test": "vitest --coverage --typecheck"
"test": "vitest --typecheck"
},
"dependencies": {
"@clerk/nextjs": "^6.27.1",
"@clerk/nextjs": "^6.31.6",
"@electric-sql/pglite": "^0.3.7",
"@fortawesome/fontawesome-svg-core": "^6.7.2",
"@fortawesome/free-solid-svg-icons": "^6.7.2",
"@fortawesome/react-fontawesome": "^0.2.3",
"@fortawesome/react-fontawesome": "^0.2.6",
"@gsap/react": "^2.1.2",
"@hookform/resolvers": "^5.2.0",
"@hookform/resolvers": "^5.2.1",
"@neondatabase/serverless": "^1.0.1",
"@radix-ui/react-accordion": "^1.2.11",
"@radix-ui/react-alert-dialog": "^1.1.14",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.7",
"@radix-ui/react-avatar": "^1.1.10",
"@radix-ui/react-checkbox": "^1.3.2",
"@radix-ui/react-collapsible": "^1.1.11",
"@radix-ui/react-context-menu": "^2.2.15",
"@radix-ui/react-dialog": "^1.1.14",
"@radix-ui/react-dropdown-menu": "^2.1.15",
"@radix-ui/react-hover-card": "^1.1.14",
"@radix-ui/react-checkbox": "^1.3.3",
"@radix-ui/react-collapsible": "^1.1.12",
"@radix-ui/react-context-menu": "^2.2.16",
"@radix-ui/react-dialog": "^1.1.15",
"@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-hover-card": "^1.1.15",
"@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-menubar": "^1.1.15",
"@radix-ui/react-navigation-menu": "^1.2.13",
"@radix-ui/react-popover": "^1.1.14",
"@radix-ui/react-menubar": "^1.1.16",
"@radix-ui/react-navigation-menu": "^1.2.14",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-radio-group": "^1.3.7",
"@radix-ui/react-scroll-area": "^1.2.9",
"@radix-ui/react-select": "^2.2.5",
"@radix-ui/react-radio-group": "^1.3.8",
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-separator": "^1.1.7",
"@radix-ui/react-slider": "^1.3.5",
"@radix-ui/react-slider": "^1.3.6",
"@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-switch": "^1.2.5",
"@radix-ui/react-tabs": "^1.1.12",
"@radix-ui/react-toggle": "^1.1.9",
"@radix-ui/react-toggle-group": "^1.1.10",
"@radix-ui/react-tooltip": "^1.2.7",
"@radix-ui/react-switch": "^1.2.6",
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-toggle": "^1.1.10",
"@radix-ui/react-toggle-group": "^1.1.11",
"@radix-ui/react-tooltip": "^1.2.8",
"@t3-oss/env-nextjs": "^0.12.0",
"@tanstack/react-query": "^5.83.0",
"@tanstack/react-query-next-experimental": "^5.83.0",
"@trpc/client": "^11.4.3",
"@trpc/next": "^11.4.3",
"@trpc/react-query": "^11.4.3",
"@trpc/server": "^11.4.3",
"@tanstack/react-query": "^5.85.5",
"@tanstack/react-query-next-experimental": "^5.85.5",
"@testing-library/user-event": "^14.6.1",
"@trpc/client": "^11.5.0",
"@trpc/next": "^11.5.0",
"@trpc/react-query": "^11.5.0",
"@trpc/server": "^11.5.0",
"@uiw/react-md-editor": "^4.0.8",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
@@ -79,14 +80,14 @@
"react": "^19.1.1",
"react-day-picker": "9.8.1",
"react-dom": "^19.1.1",
"react-hook-form": "^7.61.1",
"react-hook-form": "^7.62.0",
"react-markdown": "^10.1.0",
"react-resizable-panels": "^3.0.3",
"react-resizable-panels": "^3.0.5",
"recharts": "^2.15.4",
"rehype-highlight": "^7.0.2",
"rehype-raw": "^7.0.0",
"server-only": "^0.0.1",
"sonner": "^2.0.6",
"sonner": "^2.0.7",
"tailwind-merge": "^3.3.1",
"tailwindcss-motion": "^1.1.1",
"type-fest": "^4.41.0",
@@ -96,28 +97,28 @@
"devDependencies": {
"@biomejs/biome": "1.9.4",
"@swc/jest": "^0.2.39",
"@tailwindcss/postcss": "^4.1.11",
"@tailwindcss/postcss": "^4.1.12",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.6.4",
"@testing-library/jest-dom": "^6.8.0",
"@testing-library/react": "^16.3.0",
"@types/jest": "^30.0.0",
"@types/node": "^20.19.9",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@vitejs/plugin-react": "^5.0.0",
"@types/node": "^20.19.11",
"@types/react": "^19.1.12",
"@types/react-dom": "^19.1.9",
"@vitejs/plugin-react": "^5.0.2",
"@vitest/coverage-v8": "^3.2.4",
"dotenv": "^17.2.1",
"drizzle-kit": "^0.30.6",
"jest": "^30.0.5",
"jest-environment-jsdom": "^30.0.5",
"jest": "^30.1.1",
"jest-environment-jsdom": "^30.1.1",
"jsdom": "^26.1.0",
"next-router-mock": "^1.0.2",
"pg-mem": "^3.0.5",
"postcss": "^8.5.6",
"tailwindcss": "^4.1.11",
"tailwindcss": "^4.1.12",
"ts-node": "^10.9.2",
"tw-animate-css": "^1.3.6",
"typescript": "^5.8.3",
"tw-animate-css": "^1.3.7",
"typescript": "^5.9.2",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.4"
},

99
pnpm-lock.yaml generated
View File

@@ -9,7 +9,7 @@ importers:
.:
dependencies:
'@clerk/nextjs':
specifier: ^6.27.1
specifier: ^6.31.6
version: 6.31.6(next@15.4.0-canary.17(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@electric-sql/pglite':
specifier: ^0.3.7
@@ -21,22 +21,22 @@ importers:
specifier: ^6.7.2
version: 6.7.2
'@fortawesome/react-fontawesome':
specifier: ^0.2.3
specifier: ^0.2.6
version: 0.2.6(@fortawesome/fontawesome-svg-core@6.7.2)(react@19.1.1)
'@gsap/react':
specifier: ^2.1.2
version: 2.1.2(gsap@3.13.0)(react@19.1.1)
'@hookform/resolvers':
specifier: ^5.2.0
specifier: ^5.2.1
version: 5.2.1(react-hook-form@7.62.0(react@19.1.1))
'@neondatabase/serverless':
specifier: ^1.0.1
version: 1.0.1
'@radix-ui/react-accordion':
specifier: ^1.2.11
specifier: ^1.2.12
version: 1.2.12(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-alert-dialog':
specifier: ^1.1.14
specifier: ^1.1.15
version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-aspect-ratio':
specifier: ^1.1.7
@@ -45,91 +45,94 @@ importers:
specifier: ^1.1.10
version: 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-checkbox':
specifier: ^1.3.2
specifier: ^1.3.3
version: 1.3.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-collapsible':
specifier: ^1.1.11
specifier: ^1.1.12
version: 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-context-menu':
specifier: ^2.2.15
specifier: ^2.2.16
version: 2.2.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-dialog':
specifier: ^1.1.14
specifier: ^1.1.15
version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-dropdown-menu':
specifier: ^2.1.15
specifier: ^2.1.16
version: 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-hover-card':
specifier: ^1.1.14
specifier: ^1.1.15
version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-label':
specifier: ^2.1.7
version: 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-menubar':
specifier: ^1.1.15
specifier: ^1.1.16
version: 1.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-navigation-menu':
specifier: ^1.2.13
specifier: ^1.2.14
version: 1.2.14(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-popover':
specifier: ^1.1.14
specifier: ^1.1.15
version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-progress':
specifier: ^1.1.7
version: 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-radio-group':
specifier: ^1.3.7
specifier: ^1.3.8
version: 1.3.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-scroll-area':
specifier: ^1.2.9
specifier: ^1.2.10
version: 1.2.10(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-select':
specifier: ^2.2.5
specifier: ^2.2.6
version: 2.2.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-separator':
specifier: ^1.1.7
version: 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-slider':
specifier: ^1.3.5
specifier: ^1.3.6
version: 1.3.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-slot':
specifier: ^1.2.3
version: 1.2.3(@types/react@19.1.12)(react@19.1.1)
'@radix-ui/react-switch':
specifier: ^1.2.5
specifier: ^1.2.6
version: 1.2.6(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-tabs':
specifier: ^1.1.12
specifier: ^1.1.13
version: 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-toggle':
specifier: ^1.1.9
specifier: ^1.1.10
version: 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-toggle-group':
specifier: ^1.1.10
specifier: ^1.1.11
version: 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@radix-ui/react-tooltip':
specifier: ^1.2.7
specifier: ^1.2.8
version: 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@t3-oss/env-nextjs':
specifier: ^0.12.0
version: 0.12.0(typescript@5.9.2)(zod@3.25.76)
'@tanstack/react-query':
specifier: ^5.83.0
specifier: ^5.85.5
version: 5.85.5(react@19.1.1)
'@tanstack/react-query-next-experimental':
specifier: ^5.83.0
specifier: ^5.85.5
version: 5.85.5(@tanstack/react-query@5.85.5(react@19.1.1))(next@15.4.0-canary.17(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)
'@testing-library/user-event':
specifier: ^14.6.1
version: 14.6.1(@testing-library/dom@10.4.1)
'@trpc/client':
specifier: ^11.4.3
specifier: ^11.5.0
version: 11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2)
'@trpc/next':
specifier: ^11.4.3
specifier: ^11.5.0
version: 11.5.0(@tanstack/react-query@5.85.5(react@19.1.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.5.0(@tanstack/react-query@5.85.5(react@19.1.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(next@15.4.0-canary.17(@babel/core@7.28.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)
'@trpc/react-query':
specifier: ^11.4.3
specifier: ^11.5.0
version: 11.5.0(@tanstack/react-query@5.85.5(react@19.1.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)
'@trpc/server':
specifier: ^11.4.3
specifier: ^11.5.0
version: 11.5.0(typescript@5.9.2)
'@uiw/react-md-editor':
specifier: ^4.0.8
@@ -189,13 +192,13 @@ importers:
specifier: ^19.1.1
version: 19.1.1(react@19.1.1)
react-hook-form:
specifier: ^7.61.1
specifier: ^7.62.0
version: 7.62.0(react@19.1.1)
react-markdown:
specifier: ^10.1.0
version: 10.1.0(@types/react@19.1.12)(react@19.1.1)
react-resizable-panels:
specifier: ^3.0.3
specifier: ^3.0.5
version: 3.0.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
recharts:
specifier: ^2.15.4
@@ -210,7 +213,7 @@ importers:
specifier: ^0.0.1
version: 0.0.1
sonner:
specifier: ^2.0.6
specifier: ^2.0.7
version: 2.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
tailwind-merge:
specifier: ^3.3.1
@@ -235,13 +238,13 @@ importers:
specifier: ^0.2.39
version: 0.2.39(@swc/core@1.13.5)
'@tailwindcss/postcss':
specifier: ^4.1.11
specifier: ^4.1.12
version: 4.1.12
'@testing-library/dom':
specifier: ^10.4.1
version: 10.4.1
'@testing-library/jest-dom':
specifier: ^6.6.4
specifier: ^6.8.0
version: 6.8.0
'@testing-library/react':
specifier: ^16.3.0
@@ -250,16 +253,16 @@ importers:
specifier: ^30.0.0
version: 30.0.0
'@types/node':
specifier: ^20.19.9
specifier: ^20.19.11
version: 20.19.11
'@types/react':
specifier: ^19.1.8
specifier: ^19.1.12
version: 19.1.12
'@types/react-dom':
specifier: ^19.1.6
specifier: ^19.1.9
version: 19.1.9(@types/react@19.1.12)
'@vitejs/plugin-react':
specifier: ^5.0.0
specifier: ^5.0.2
version: 5.0.2(vite@7.1.3(@types/node@20.19.11)(jiti@2.5.1)(lightningcss@1.30.1))
'@vitest/coverage-v8':
specifier: ^3.2.4
@@ -271,10 +274,10 @@ importers:
specifier: ^0.30.6
version: 0.30.6
jest:
specifier: ^30.0.5
specifier: ^30.1.1
version: 30.1.1(@types/node@20.19.11)(esbuild-register@3.6.0(esbuild@0.19.12))(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.19.11)(typescript@5.9.2))
jest-environment-jsdom:
specifier: ^30.0.5
specifier: ^30.1.1
version: 30.1.1
jsdom:
specifier: ^26.1.0
@@ -289,16 +292,16 @@ importers:
specifier: ^8.5.6
version: 8.5.6
tailwindcss:
specifier: ^4.1.11
specifier: ^4.1.12
version: 4.1.12
ts-node:
specifier: ^10.9.2
version: 10.9.2(@swc/core@1.13.5)(@types/node@20.19.11)(typescript@5.9.2)
tw-animate-css:
specifier: ^1.3.6
specifier: ^1.3.7
version: 1.3.7
typescript:
specifier: ^5.8.3
specifier: ^5.9.2
version: 5.9.2
vite-tsconfig-paths:
specifier: ^5.1.4
@@ -2414,6 +2417,12 @@ packages:
'@types/react-dom':
optional: true
'@testing-library/user-event@14.6.1':
resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==}
engines: {node: '>=12', npm: '>=6'}
peerDependencies:
'@testing-library/dom': '>=7.21.4'
'@trpc/client@11.5.0':
resolution: {integrity: sha512-32oH+KOAdo73jJKjU9tyG+vCjID6A28NgXwUNr691O5HjpF5yyTX51Zzyee8YtGzU89Nw/drCHdfA4gD7BN2eg==}
peerDependencies:
@@ -7163,6 +7172,10 @@ snapshots:
'@types/react': 19.1.12
'@types/react-dom': 19.1.9(@types/react@19.1.12)
'@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)':
dependencies:
'@testing-library/dom': 10.4.1
'@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2)':
dependencies:
'@trpc/server': 11.5.0(typescript@5.9.2)

View File

@@ -1,11 +1,15 @@
import { DeleteIcon } from "lucide-react";
import type { UseTRPCMutationOptions, UseTRPCMutationResult } from "node_modules/@trpc/react-query/dist/getQueryKey.d-CruH3ncI.mjs";
import { Button } from "~/components/ui/button";
import { useFormMutationContext } from "./MutationProvider";
export default function DeleteButton<TD, TE, TV, TC>(params: { mutation: UseTRPCMutationResult<TD, TE, TV, TC>, id?: string }) {
export default function DeleteButton(params: { id?: string }) {
const ctx = useFormMutationContext()
if (ctx == undefined) {
throw new Error('Dependent form message needs populates form mutations context')
}
if (params.id) {
return (
<Button variant='destructive' onClick={() => params.mutation.mutate(({ id: params.id } as TV))}>
<Button variant='destructive' onClick={() => ctx.deleteMutation.mutate(({ id: params.id ? params.id : "" }))}>
<DeleteIcon />
</Button>
)

View File

@@ -4,22 +4,16 @@ import { DependentFormMessaage, SubmitButton, DeleteButton } from '~/app/_compon
import type { FieldValues, SubmitHandler, UseFormReturn } from 'react-hook-form';
import type { ReactNode } from 'react';
import DependentText from '../../DependentText';
import type { UseTRPCMutationResult } from 'node_modules/@trpc/react-query/dist/getQueryKey.d-CruH3ncI.mjs';
interface Error {
message: string
}
export default function FormScaffold<T extends FieldValues, TD, TE extends Error, TV, TC, TTD, TTE extends Error, TTV, TTC, TTTD, TTTE extends Error, TTTV, TTTC>(params: {
export default function FormScaffold<T extends FieldValues,>(params: {
form: UseFormReturn<T>,
onSubmit: SubmitHandler<T>,
createMutation: UseTRPCMutationResult<TD, TE, TV, TC>,
updateMutation: UseTRPCMutationResult<TTD, TTE, TTV, TTC>,
deleteMutation: UseTRPCMutationResult<TTTD, TTTE, TTTV, TTTC>,
title: string,
children: ReactNode,
children?: ReactNode,
id?: string,
className?: string
}) {
const { form, onSubmit, createMutation, deleteMutation, updateMutation, title, id, className, children } = params
const { form, onSubmit, title, id, className, children } = params
return (
<Card.Card className={className ? className : "w-5/6 lg:w-1/2"}>
<Card.CardHeader>
@@ -32,12 +26,13 @@ export default function FormScaffold<T extends FieldValues, TD, TE extends Error
<form
onSubmit={form.handleSubmit(onSubmit)}
className="space-y-8"
data-testid="form"
>
{children}
<SubmitButton id={id} />
<SubmitButton id={id} />
<div className='flex flex-row justify-between'>
<DependentFormMessaage falseStatus={createMutation.status} trueStatus={updateMutation.status} falseError={createMutation.error} trueError={updateMutation.error} bool={id ? true : false} />
<DeleteButton mutation={deleteMutation} id={id} />
<DependentFormMessaage bool={id ? true : false} />
<DeleteButton id={id} />
</div>
</form>
</Form>

View File

@@ -1,19 +1,20 @@
import { FormMessage } from "~/components/ui/form";
import { useFormMutationContext } from "./MutationProvider";
interface Error {
message: string
}
export default function DependentFormMessaage( params: {trueStatus: string, falseStatus: string, falseError?: Error|null, trueError?:Error|null, bool: boolean} ) {
export default function DependentFormMessaage( params: {bool: boolean} ) {
const ctx = useFormMutationContext()
if (ctx == undefined) {
throw new Error('Dependent form message needs populates form mutations context')
}
return (
<>
{
params.bool ?
<FormMessage className={params.trueStatus == "success" ? "text-green-500" : "text-red-500"}>
{params.trueError ? params.trueError.message : params.trueStatus}
<FormMessage className={ctx.updateMutation.status == "success" ? "text-green-500" : "text-red-500"}>
{ctx.updateMutation.error ? ctx.updateMutation.error.message : ctx.updateMutation.status}
</FormMessage> :
<FormMessage className={params.falseStatus == "success" ? "text-green-500" : "text-red-500"}>
{params.falseError ? params.falseError.message : params.falseStatus}
<FormMessage className={ctx.createMutation.status == "success" ? "text-green-500" : "text-red-500"}>
{ctx.createMutation.error ? ctx.createMutation.error.message : ctx.createMutation.status}
</FormMessage>
}
</>

View File

@@ -0,0 +1,33 @@
import type { UseTRPCMutationResult } from "node_modules/@trpc/react-query/dist/getQueryKey.d-CruH3ncI.mjs";
import { createContext, useContext, type ReactNode } from "react";
interface ToString {
toString: () => string
message: string
}
export interface MutationInterface {
mutate: (params:{id:string}) => void
error: ToString | null
status: "error" | "idle" | "pending" | "success"
}
type FormMutationContext = {
createMutation: MutationInterface,
updateMutation: MutationInterface,
deleteMutation: MutationInterface
}
const FormMutationContext = createContext<FormMutationContext|undefined>(undefined)
export function useFormMutationContext() {
return useContext(FormMutationContext)
}
export function FormMutationContextProvider(params: {children: ReactNode, value: FormMutationContext}) {
return (
<FormMutationContext.Provider value={params.value}>
{params.children}
</FormMutationContext.Provider>
)
}

View File

@@ -3,7 +3,7 @@ import DependentText from "../../DependentText";
export default function SubmitButton(params: {id?:string}) {
return (
<Button type="submit">
<Button submit={true}>
<DependentText bool={params.id?true:false} true='Update' false='Create' />
</Button>
)

View File

@@ -21,10 +21,8 @@ function InnerMultiBooleanFormField(params: { options: string[], onChange: (arg0
}
const onCheckedItemChange = (key: string) => {
return function onCheckedChange(checked: CheckedState) {
console.log(key,checked)
let state = context.checkedValues;
if (checked === "indeterminate") {
console.log('checked was intermediate')
return
} else {
state[key] = checked
@@ -36,7 +34,6 @@ function InnerMultiBooleanFormField(params: { options: string[], onChange: (arg0
stateArr.push(key)
}
}
console.log('calling field on change with:', stateArr)
params.onChange(stateArr)
}
}
@@ -53,7 +50,7 @@ function InnerMultiBooleanFormField(params: { options: string[], onChange: (arg0
<FormItem key={opt}>
<div className="flex flex-row justify-between py-2 border-b-1">
<FormLabel>{opt}</FormLabel>
<Checkbox checked={checked(opt)} onCheckedChange={onCheckedItemChange(opt)} />
<Checkbox data-testid="multiboolean-checkbox" checked={checked(opt)} onCheckedChange={onCheckedItemChange(opt)} />
</div>
</FormItem>
))
@@ -71,14 +68,14 @@ export default function MultiBooleanFormField<T extends FieldValues>(params: { c
render={({ field }) => (
<FormItem>
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<PopoverTrigger data-testid="multiboolean-popover-trigger" asChild>
<Button variant={'ghost'}>
<FormLabel>{params.label}</FormLabel>
<ChevronDownIcon/>
</Button>
</PopoverTrigger>
<FormControl>
<PopoverContent>
<PopoverContent data-testid="multiboolean-content">
<MultiBooleanFieldContext.Provider value={{checkedValues: checkedValues, setCheckedValue: setCheckedValues}}>
<InnerMultiBooleanFormField onChange={field.onChange} options={params.options} />
</MultiBooleanFieldContext.Provider>

View File

@@ -0,0 +1,19 @@
import TestingTest from "./TestingTest";
import { test } from 'vitest'
import { render, screen, waitFor } from '@testing-library/react'
import { userEvent } from '@testing-library/user-event'
import { FormMutationContextProvider } from "../Form/Components/MutationProvider";
test('TestingTest', async () => {
const user = userEvent.setup()
render(
<TestingTest/>
)
const submitButton = screen.getByTestId('form-submit')
screen.debug()
user.click(submitButton)
await waitFor(() => {
screen.getByTestId('submitted')
})
screen.debug()
})

View File

@@ -0,0 +1,33 @@
import { useForm } from "react-hook-form";
import { FormScaffold } from "../Form/Components";
import z from "zod";
import { zodResolver } from "@hookform/resolvers/zod";
import { useState } from "react";
import { FormMutationContextProvider } from "../Form/Components/MutationProvider";
export default function TestingTest() {
const schema = z.object({ text: z.string() })
const [submitted, setSubmitted] = useState(false)
const fakeMutation = {
error: {message: "test"},
status: "idle" as const,
mutate: (_:{id:string}) => {}
}
const form = useForm<z.infer<typeof schema>>({
resolver: zodResolver(schema),
defaultValues: {
text: ""
}
})
const onSubmit = (_: z.infer<typeof schema>) => {
setSubmitted(true)
}
return (
<>
<div data-testid={submitted ? "submitted" : "unsubmitted"} />
<FormMutationContextProvider value={{ createMutation: fakeMutation, updateMutation: fakeMutation, deleteMutation: fakeMutation }}>
<FormScaffold form={form} onSubmit={onSubmit} title="Testing Test" />
</FormMutationContextProvider>
</>
)
}

View File

@@ -0,0 +1,13 @@
export default function getBaseUrl() {
if (typeof window !== 'undefined')
// browser should use relative path
return '';
if (process.env.VERCEL_URL)
// reference for vercel.com
return `https://${process.env.VERCEL_URL}`;
if (process.env.RENDER_INTERNAL_HOSTNAME)
// reference for render.com
return `http://${process.env.RENDER_INTERNAL_HOSTNAME}:${process.env.PORT}`;
// assume localhost
return `http://localhost:${process.env.PORT ?? 3000}`;
}

View File

@@ -4,21 +4,7 @@ import { ReactQueryStreamedHydration } from '@tanstack/react-query-next-experime
import { httpBatchLink } from "@trpc/client";
import React, { useState } from "react"
import { trpc } from "./Client";
function getBaseUrl() {
if (typeof window !== 'undefined')
// browser should use relative path
return '';
if (process.env.VERCEL_URL)
// reference for vercel.com
return `https://${process.env.VERCEL_URL}`;
if (process.env.RENDER_INTERNAL_HOSTNAME)
// reference for render.com
return `http://${process.env.RENDER_INTERNAL_HOSTNAME}:${process.env.PORT}`;
// assume localhost
return `http://localhost:${process.env.PORT ?? 3000}`;
}
import getBaseUrl from "~/app/_trpc/GetBaseUrl";
let clientQueryClient: QueryClient | undefined = undefined;
const makeQueryClient = () => new QueryClient({
defaultOptions: {
@@ -38,12 +24,15 @@ function getQueryClient() {
}
}
export default function TrpcProvider({ children }: { children: React.ReactNode }) {
console.log("provider calls get base url")
const baseUrl = getBaseUrl()
console.log("provider got baseurl:", baseUrl)
const queryClient = getQueryClient();
const [trpcClient] = useState(() => {
return trpc.createClient({
links: [
httpBatchLink({
url: `${getBaseUrl()}/api/trpc`,
url: `${baseUrl}/api/trpc`,
}),
],
})

View File

@@ -11,6 +11,7 @@ import { useState } from 'react';
import { SelectFormField, TextInputFormField } from '~/app/_components/Form/Fields';
import { usePathname, useRouter } from 'next/navigation';
import { SelectItem } from '~/components/ui/select';
import FormMutationContextProvider from '~/app/_components/Form/Components/MutationProvider';
export default function CreateUpdateCvCategoryForm(params: { className?: string, entity?: IterableElement<RouterOutputs['category']['select']> }) {
const schemas = entitySchemas('cvCategory')
const [id, setId] = useState<string | undefined>(params.entity ? params.entity.id : undefined)
@@ -33,22 +34,25 @@ export default function CreateUpdateCvCategoryForm(params: { className?: string,
createMutation.mutate(values)
}
return (
<FormScaffold
form={form}
createMutation={createMutation}
updateMutation={updateMutation}
deleteMutation={deleteMutation}
onSubmit={onSubmit}
title='Category'
id={id}
className={params.className}
>
<TextInputFormField control={form.control} name='name' label='Name' />
<SelectFormField control={form.control} name='layoutPosition' label='Layout Position' placeholder={form.getValues().layoutPosition == null ? undefined : form.getValues().layoutPosition}>
{schemas.insert.shape.layoutPosition.unwrap().unwrap().options.map((o) => (
<SelectItem key={o} value={o}> {o} </SelectItem>
))}
</SelectFormField>
</FormScaffold>
<FormMutationContextProvider value={{
createMutation:createMutation,
updateMutation:updateMutation,
deleteMutation:deleteMutation
}}>
<FormScaffold
form={form}
onSubmit={onSubmit}
title='Category'
id={id}
className={params.className}
>
<TextInputFormField control={form.control} name='name' label='Name' />
<SelectFormField control={form.control} name='layoutPosition' label='Layout Position' placeholder={form.getValues().layoutPosition == null ? undefined : form.getValues().layoutPosition}>
{schemas.insert.shape.layoutPosition.unwrap().unwrap().options.map((o) => (
<SelectItem key={o} value={o}> {o} </SelectItem>
))}
</SelectFormField>
</FormScaffold>
</FormMutationContextProvider>
)
}

View File

@@ -13,6 +13,7 @@ import { FormScaffold } from '~/app/_components/Form/Components';
import { useState } from 'react';
import { SelectFormField, TextInputFormField, MdeFormField, CalenderFormField, BooleanFormField } from '~/app/_components/Form/Fields'
import { usePathname, useRouter } from 'next/navigation';
import {FormMutationContextProvider, type FormCreateMutationInterface} from '~/app/_components/Form/Components/MutationProvider';
export default function CreateUpdateCvEntryForm(params: { className?: string, entity?: IterableElement<RouterOutputs['entry']['select']>, isUpdate?: boolean }) {
const [id, setId] = useState<string | undefined>(params.entity ? params.entity.id : undefined)
const { theme } = useTheme()
@@ -42,11 +43,16 @@ export default function CreateUpdateCvEntryForm(params: { className?: string, en
createMutation.mutate(values)
}
return (
//todo
// solved by: strictFunctionTypes: false
// sadge
<FormMutationContextProvider value={{
createMutation:createMutation,
updateMutation:updateMutation,
deleteMutation:deleteMutation
}}>
<FormScaffold
form={form}
createMutation={createMutation}
updateMutation={updateMutation}
deleteMutation={deleteMutation}
onSubmit={onSubmit}
title='Entry'
id={id}
@@ -56,7 +62,7 @@ export default function CreateUpdateCvEntryForm(params: { className?: string, en
{
categoriesSuccess ?
<>
{categories.map((c) => {
{categories?.map((c) => {
return (<SelectItem key={c.id} value={c.id}> {c.name} </SelectItem>)
})}
</> :
@@ -69,5 +75,6 @@ export default function CreateUpdateCvEntryForm(params: { className?: string, en
<CalenderFormField control={form.control} name='toTime' label='To Date' />
<BooleanFormField control={form.control} name='hideDates' label='Hide Dates' />
</FormScaffold>
</FormMutationContextProvider>
)
}

View File

@@ -1,8 +1,7 @@
'use server'
import { expect, test } from 'vitest'
import { render, screen } from '@testing-library/react'
import CreateUpdateProjectForm from './CreateUpdateProjectForm'
import TrpcProvider from '~/../test/trpc/vitest.trpcProvider.mock'
import TrpcProvider from '~/app/_trpc/TrpcProvider'
test('CreateUpdateProjectForm', () => {
render(
@@ -10,6 +9,4 @@ test('CreateUpdateProjectForm', () => {
<CreateUpdateProjectForm/>
</TrpcProvider>
)
let options = screen.getAllByRole('combobox')
console.log(options)
})

View File

@@ -12,12 +12,11 @@ import { SelectFormField, TextInputFormField } from '~/app/_components/Form/Fiel
import { FormScaffold } from '~/app/_components/Form/Components';
import { usePathname, useRouter } from 'next/navigation';
import { makeUseRelationShipWithNameIndex } from '~/lib/hooks';
import { FormMutationContextProvider } from '~/app/_components/Form/Components/MutationProvider';
export default function CreateUpdateProjectForm(params: { className?: string, entity?: IterableElement<RouterOutputs['project']['select']> }) {
const [id, setId] = useState<string|undefined>(params.entity ? params.entity.id : undefined)
const [id, setId] = useState<string | undefined>(params.entity ? params.entity.id : undefined)
const schemas = entitySchemas('project')
console.log('using trpc')
const { data:stacks,id:stackId, name:stackName,success:stacksSuccess, error:stackError } = makeUseRelationShipWithNameIndex('stackItems')(trpc.techStack.select.useQuery({}),id,(items) => {return items ? items.join('-') : ""})
console.log(stackError)
const { data: stacks, id: stackId, name: stackName, success: stacksSuccess, error: stackError } = makeUseRelationShipWithNameIndex('stackItems')(trpc.techStack.select.useQuery({}), id, (items) => { return items ? items.join('-') : "" })
const form = useForm<z.infer<typeof schemas.insert>>({
resolver: zodResolver(schemas.insert),
defaultValues: {
@@ -40,38 +39,42 @@ export default function CreateUpdateProjectForm(params: { className?: string, en
createMutation.mutate(values)
}
return (
<FormScaffold
form={form}
createMutation={createMutation}
updateMutation={updateMutation}
deleteMutation={deleteMutation}
onSubmit={onSubmit}
title='Project'
id={id}
className={params.className}
>
<SelectFormField control={form.control} name='stackId' label='Stack' defaultValue={stackId} placeholder={stackName} >
{
stacksSuccess ?
<>
{stacks?.map((stack) => {
return (<SelectItem key={stack.id} value={stack.id}> {stack.stackItems ? stack.stackItems.join("-") : "Empty Stack"} </SelectItem>)
})}
</> :
<SelectItem key='placeholder' value="placeholder" />
}
</SelectFormField>
<TextInputFormField control={form.control} name='title' label='Title' />
<SelectFormField control={form.control} name='sourceType' label='Source Type' defaultValue={'open'} placeholder='open' >
<SelectItem value="open"> open </SelectItem>
<SelectItem value="closed"> closed </SelectItem>
</SelectFormField>
<TextInputFormField control={form.control} label='Source Link' name='sourceLink' />
<SelectFormField control={form.control} name='releaseStatus' label='Release Status' defaultValue={'unreleased'} placeholder='unreleased' >
<SelectItem value="released"> released </SelectItem>
<SelectItem value="unreleased"> unreleased </SelectItem>
</SelectFormField>
<TextInputFormField control={form.control} label='Release Link' name='releaseLink' />
</FormScaffold>
<FormMutationContextProvider value={
{
createMutation: createMutation,
updateMutation: updateMutation,
deleteMutation: deleteMutation
}}>
<FormScaffold
form={form}
onSubmit={onSubmit}
title='Project'
id={id}
className={params.className}
>
<SelectFormField control={form.control} name='stackId' label='Stack' defaultValue={stackId} placeholder={stackName} >
{
stacksSuccess ?
<>
{stacks?.map((stack) => {
return (<SelectItem key={stack.id} value={stack.id}> {stack.stackItems ? stack.stackItems.join("-") : "Empty Stack"} </SelectItem>)
})}
</> :
<SelectItem key='placeholder' value="placeholder" />
}
</SelectFormField>
<TextInputFormField control={form.control} name='title' label='Title' />
<SelectFormField control={form.control} name='sourceType' label='Source Type' defaultValue={'open'} placeholder='open' >
<SelectItem value="open"> open </SelectItem>
<SelectItem value="closed"> closed </SelectItem>
</SelectFormField>
<TextInputFormField control={form.control} label='Source Link' name='sourceLink' />
<SelectFormField control={form.control} name='releaseStatus' label='Release Status' defaultValue={'unreleased'} placeholder='unreleased' >
<SelectItem value="released"> released </SelectItem>
<SelectItem value="unreleased"> unreleased </SelectItem>
</SelectFormField>
<TextInputFormField control={form.control} label='Release Link' name='releaseLink' />
</FormScaffold>
</FormMutationContextProvider>
)
}

View File

@@ -0,0 +1,55 @@
import { test, assert, expect } from 'vitest'
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
import { userEvent } from '@testing-library/user-event'
import CreateUpdateStackForm from './CreateUpdateForm'
import TrpcProvider from '~/app/_trpc/TrpcProvider'
import { servTrpc } from '~/app/_trpc/ServerClient'
import { db } from '~/server/db'
import { sql } from 'drizzle-orm'
test('CreateUpdateProjectForm',async () => {
const user = userEvent.setup()
// console.log("db direct:" ,db.query.techStack.findMany());
render(
<TrpcProvider>
<CreateUpdateStackForm/>
</TrpcProvider>
)
const trigger = screen.getByTestId("multiboolean-popover-trigger")
fireEvent.click(trigger)
const content = screen.getAllByTestId("multiboolean-checkbox")
const checkfirst = content.at(0)
const checkSecond = content.at(1)
assert.notEqual(checkfirst,undefined)
assert.notEqual(checkSecond,undefined)
await user.click(checkfirst as HTMLElement)
await user.click(checkSecond as HTMLElement)
// TODO use findby: https://testing-library.com/docs/dom-testing-library/api-async because component has async effects and conditional rendering
// this shit just doesnt work
// https://github.com/jsdom/jsdom/issues/1937 why ? who knows
const submitButton = screen.getByTestId('form-submit')
screen.debug(submitButton)
// waitFor(() => {
// if ((submitButton as HTMLButtonElement).type != 'submit') {
// console.log("button isn submit")
// throw new Error('submit button props pending');
// }
// })
await user.click(submitButton)
screen.debug()
//TODO find out why the fuck this is timing out
await waitFor(() => {
screen.getByTestId('submitted')
},{timeout:3000})
let res
await waitFor(async () => {
return new Promise(async (resolve,reject) => {
res = await db.execute(sql`SELECT * from "gregorlohaus.com_tech_stack";`)
if (res.rows.length < 1) {
reject(false)
} else {
resolve(true)
}
})
},{timeout:3000})
console.log(res)
})

View File

@@ -2,19 +2,16 @@
import { zodResolver } from '@hookform/resolvers/zod'
import { useForm } from 'react-hook-form'
import { z } from "zod";
import { Form } from "~/components/ui/form";
import { trpc } from "~/app/_trpc/Client";
import { Button } from "~/components/ui/button";
import * as Card from '~/components/ui/card'
import type { IterableElement } from 'type-fest'
import { stackItemEnum } from "~/server/db/schema";
import { stackItemEnum } from "~/server/dbschema/schema";
import type { RouterOutputs } from '~/server/routers/_app';
import { entitySchemas, makeOnSuccess } from '~/lib/utils';
import { useState } from 'react';
import { MultiBooleanFormField } from "~/app/_components/Form/Fields"
import { DependentFormMessaage, FormScaffold } from '~/app/_components/Form/Components';
import DependentText from '~/app/_components/DependentText';
import { FormScaffold } from '~/app/_components/Form/Components';
import { usePathname, useRouter } from 'next/navigation';
import { FormMutationContextProvider } from '~/app/_components/Form/Components/MutationProvider';
export default function CreateUpdateStackForm(params: { className?: string, entity?: IterableElement<RouterOutputs['techStack']['select']> }) {
const schemas = entitySchemas('techStack')
@@ -25,6 +22,7 @@ export default function CreateUpdateStackForm(params: { className?: string, enti
stackItems: params.entity ? params.entity.stackItems : [],
}
})
const [submitted, setSubmitted] = useState(false)
const [id, setId] = useState<string | undefined>(params.entity ? params.entity.id : undefined)
let path = usePathname()
let router = useRouter()
@@ -32,22 +30,25 @@ export default function CreateUpdateStackForm(params: { className?: string, enti
const updateMutation = trpc.techStack.update.useMutation({ onSuccess: makeOnSuccess('update', form) })
const deleteMutation = trpc.techStack.delete.useMutation({ onSuccess: makeOnSuccess('delete', form, undefined, path, router) })
function onSubmit(values: z.infer<typeof schemas.insert>) {
setSubmitted(true)
params.entity ?
updateMutation.mutate(values) :
createMutation.mutate(values)
createMutation.mutate(values);
}
return (
<FormScaffold
form={form}
createMutation={createMutation}
updateMutation={updateMutation}
deleteMutation={deleteMutation}
onSubmit={onSubmit}
title='Entry'
id={id}
className={params.className}
>
<MultiBooleanFormField control={form.control} name='stackItems' label='Stack Items' options={stackItemEnum.enumValues} defaultValues={params.entity?.stackItems} />
</FormScaffold>
<>
<div data-testid={submitted ? "submitted" : ""}/>
<FormMutationContextProvider value={{ createMutation: createMutation, updateMutation: updateMutation, deleteMutation: deleteMutation }}>
<FormScaffold
form={form}
onSubmit={onSubmit}
title='Entry'
id={id}
className={params.className}
>
<MultiBooleanFormField control={form.control} name='stackItems' label='Stack Items' options={stackItemEnum.enumValues} defaultValues={params.entity?.stackItems ?? [""]} />
</FormScaffold>
</FormMutationContextProvider>
</>
)
}

View File

@@ -40,16 +40,20 @@ function Button({
variant,
size,
asChild = false,
submit = false,
...props
}: React.ComponentProps<"button"> &
VariantProps<typeof buttonVariants> & {
asChild?: boolean
submit?: boolean
}) {
const Comp = asChild ? Slot : "button"
return (
<Comp
data-slot="button"
type={submit ? "submit" : props.type}
data-testid={submit ? "form-submit" : undefined}
className={cn(buttonVariants({ variant, size, className }))}
{...props}
/>

View File

@@ -1,7 +1,7 @@
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
import { createSchemaFactory, createSelectSchema, type BuildSchema } from 'drizzle-zod'
import * as schema from "~/server/db/schema";
import * as schema from '~/server/dbschema/schema'
import { PgTable } from "drizzle-orm/pg-core";
import type { FieldValues, Path, UseFormReturn } from "react-hook-form";
import type { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";

View File

@@ -2,7 +2,7 @@
// import postgres from "postgres";
import { env } from "~/env";
import * as schema from "./schema";
import * as schema from "~/server/dbschema/schema";
// /**
// * Cache the database connection in development. This avoids creating a new connection on every HMR

View File

@@ -1,7 +1,7 @@
import type { Entries } from "type-fest";
import { publicProcedure, router } from "~/server/trpc";
import { db } from "~/server/db";
import * as schema from "~/server/db/schema";
import * as schema from '~/server/dbschema/schema';
import { isAdmin } from "~/app/actions";
import { TRPCError } from "@trpc/server";
import { entitySchemas, type Schema, type SchemaKeys } from "~/lib/utils";
@@ -20,6 +20,7 @@ export function trpcCrudRouterFromDrizzleEntity<T extends SchemaKeys<Schema>>(ta
}
let r = router({
select: publicProcedure.input(schemas.update).query(async (opts) => {
console.log("select with:", opts.input)
const { input } = opts;
if (input === undefined) {
return await db.select().from(schema[table]).execute();
@@ -36,6 +37,7 @@ export function trpcCrudRouterFromDrizzleEntity<T extends SchemaKeys<Schema>>(ta
return await db.select().from(schema[table]).execute();
}),
update: publicProcedure.input(schemas.update).mutation(async (opts) => {
console.log("update with:",opts.input)
let admin = await isAdmin();
if (!admin) {
throw new TRPCError(
@@ -52,6 +54,7 @@ export function trpcCrudRouterFromDrizzleEntity<T extends SchemaKeys<Schema>>(ta
return await db.update(schema[table]).set(input).where(eq(schema[table]['id'], input['id'])).returning().execute();
}),
insert: publicProcedure.input(schemas.insert).mutation(async (opts) => {
console.log("insert with:",opts.input)
let admin = await isAdmin();
if (!admin) {
throw new TRPCError(
@@ -62,6 +65,7 @@ export function trpcCrudRouterFromDrizzleEntity<T extends SchemaKeys<Schema>>(ta
return await db.insert(schema[table]).values(input).returning().execute();
}),
delete: publicProcedure.input(schemas.update).mutation(async (opts) => {
console.log("delete with:",opts.input)
let admin = await isAdmin();
if (!admin) {
throw new TRPCError(

2
test/aliases/db.ts Normal file
View File

@@ -0,0 +1,2 @@
import { db } from "test/db/setup";
export { db };

33
test/db/setup.ts Normal file
View File

@@ -0,0 +1,33 @@
import { vi, beforeAll , afterAll, beforeEach, afterEach } from "vitest";
import { drizzle, type PgliteDatabase } from 'drizzle-orm/pglite';
import * as schema from "~/server/dbschema/schema"
import type * as DrizzleKit from 'drizzle-kit/api';
import { createRequire } from 'node:module';
import { PGlite } from "@electric-sql/pglite"
let clients: Record<string,PGlite> = {};
export let db: PgliteDatabase<typeof schema>
// beforeEach(async (test) => {
const client = new PGlite()
// workaround for https://github.com/drizzle-team/drizzle-orm/issues/2853
const require = createRequire(import.meta.url);
const { generateDrizzleJson, generateMigration } = require('drizzle-kit/api') as typeof DrizzleKit;
// end of workaround
// workaround for https://github.com/drizzle-team/drizzle-orm/issues/3913
async function pushSchema(db: PgliteDatabase<typeof schema>) {
const prevJson = generateDrizzleJson({});
const curJson = generateDrizzleJson(schema, prevJson.id, undefined, 'snake_case');
const statements = await generateMigration(prevJson, curJson);
for (const statement of statements) {
let res = await db.execute(statement);
}
}
db = drizzle({client:client,schema:schema,casing:'snake_case'});
await pushSchema(db);
// })
// afterEach(async (test) => {
// const client = clients[test.task.id]
// await client!.close()
// })

View File

@@ -1,11 +0,0 @@
import { vi } from "vitest";
import { drizzle } from 'drizzle-orm/pglite';
import { PGlite } from "@electric-sql/pglite";
import * as schema from "~/server/db/schema"
const client = new PGlite()
const db = drizzle({client:client,schema:schema})
vi.mock("~/server/db", () => {
return {
db: db
}
})

View File

@@ -0,0 +1,9 @@
import { vi } from "vitest";
import { port } from "test/trpc/server"
vi.mock("~/app/_trpc/GetBaseUrl", () => {
return {
default: vi.fn(() => {
return `http://localhost:${port}`
})
}
})

View File

27
test/trpc/server.ts Normal file
View File

@@ -0,0 +1,27 @@
import { createHTTPHandler } from "@trpc/server/adapters/standalone";
import { createServer } from "http";
import { trpcRouter } from "~/server/routers/_app";
const handler = createHTTPHandler({
router: trpcRouter,
createContext: () => ({}),
});
export const port = Math.floor(Math.random() * 999 + 9000);
const server = createServer((req, res) => {
if (req.url?.startsWith("/api/trpc")) {
console.log('trpc call')
// strip prefix so handler works the same way Next.js does
req.url = req.url.replace(/^\/api\/trpc/, "");
return handler(req, res);
}
res.statusCode = 404;
res.end("Not Found");
});
console.log("server listening on port:",port)
server.listen(port);
// afterEach(() => {
// server.close();
// });

View File

@@ -1,16 +0,0 @@
import React from 'react'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { trpc } from '~/app/_trpc/Client'
import { createTestTrpcClient } from './vitest.trpcProxyClient'
export default function TrpcProvider({ children }:{children: React.ReactNode}) {
const queryClient = new QueryClient()
const trpcClient = createTestTrpcClient()
console.log("using test provider")
return (
<trpc.Provider client={trpcClient} queryClient={queryClient}>
<QueryClientProvider client={queryClient}>
{children}
</QueryClientProvider>
</trpc.Provider>
)}

View File

@@ -1,26 +0,0 @@
import { createTRPCProxyClient, httpBatchLink } from '@trpc/client'
import { fetchRequestHandler } from '@trpc/server/adapters/fetch'
import { trpcRouter, type TrpcRouter } from '~/server/routers/_app'
// This simulates the server without HTTP
function serverHandler(path: string, req: Request) {
return fetchRequestHandler({
endpoint: '/api/trpc',
router: trpcRouter,
req,
createContext: () => ({}),
})
}
export function createTestTrpcClient() {
return createTRPCProxyClient<TrpcRouter>({
links: [
httpBatchLink({
url: 'http://localhost/api/trpc',
fetch: (input, init) => {
return serverHandler(input as string, new Request(input as string, init))
},
}),
],
})
}

150
tscerrors.txt Normal file
View File

@@ -0,0 +1,150 @@
src/app/_components/Form/Components/DeleteButton.tsx(12,79): error TS2345: Argument of type '{ id: string; }' is not assignable to parameter of type '{ id: string; createdAt: string; toTime: string | Date | undefined; title: string; fromTime: string | Date | undefined; }'.
Type '{ id: string; }' is missing the following properties from type '{ id: string; createdAt: string; toTime: string | Date | undefined; title: string; fromTime: string | Date | undefined; }': createdAt, toTime, title, fromTime
src/app/_components/Form/Fields/MultiBooleanFormField.tsx(63,174): error TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'.
No index signature with a parameter of type 'string' was found on type '{}'.
src/app/admin/cv/category/_components/CreateUpdateForm.tsx(14,8): error TS2613: Module '"/home/anon/Dev/gregorlohaus.com/src/app/_components/Form/Components/MutationProvider"' has no default export. Did you mean to use 'import { FormMutationContextProvider } from "/home/anon/Dev/gregorlohaus.com/src/app/_components/Form/Components/MutationProvider"' instead?
src/app/admin/cv/entry/_components/CreateUpdateForm.tsx(16,43): error TS2305: Module '"~/app/_components/Form/Components/MutationProvider"' has no exported member 'FormCreateMutationInterface'.
src/app/admin/cv/entry/_components/CreateUpdateForm.tsx(37,58): error TS2322: Type '((data: { title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }[]) => void) | undefined' is not assignable to type '((data: { title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], variables: { ...; }, context: unknown) => unknown) | undefined'.
Type '(data: { title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }[]) => void' is not assignable to type '(data: { title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], variables: { ...; }, context: unknown) => unknown'.
Types of parameters 'data' and 'data' are incompatible.
Type '{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[]' is not assignable to type '{ title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }[]'.
Type '{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }' is not assignable to type '{ title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }'.
Types of property 'fromTime' are incompatible.
Type 'string' is not assignable to type 'Date'.
src/app/admin/cv/entry/_components/CreateUpdateForm.tsx(38,58): error TS2322: Type '((data: { title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }[]) => void) | undefined' is not assignable to type '((data: { title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], variables: { ...; }, context: unknown) => unknown) | undefined'.
Type '(data: { title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }[]) => void' is not assignable to type '(data: { title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], variables: { ...; }, context: unknown) => unknown'.
Types of parameters 'data' and 'data' are incompatible.
Type '{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[]' is not assignable to type '{ title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }[]'.
Type '{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }' is not assignable to type '{ title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }'.
Types of property 'fromTime' are incompatible.
Type 'string' is not assignable to type 'Date'.
src/app/admin/cv/entry/_components/CreateUpdateForm.tsx(39,58): error TS2322: Type '((data: { title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }[]) => void) | undefined' is not assignable to type '((data: { title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], variables: { ...; }, context: unknown) => unknown) | undefined'.
Type '(data: { title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }[]) => void' is not assignable to type '(data: { title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], variables: { ...; }, context: unknown) => unknown'.
Types of parameters 'data' and 'data' are incompatible.
Type '{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[]' is not assignable to type '{ title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }[]'.
Type '{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }' is not assignable to type '{ title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }'.
Types of property 'fromTime' are incompatible.
Type 'string' is not assignable to type 'Date'.
src/app/admin/cv/entry/_components/CreateUpdateForm.tsx(48,7): error TS2322: Type 'UseTRPCMutationResult<{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], TRPCClientErrorLike<...>, { ...; }, unknown>' is not assignable to type 'MutationInterface'.
Type 'TRPCHookResult & Override<MutationObserverIdleResult<{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], TRPCClientErrorLike<...>, { ...; }, unknown>, { ...; }> & { ...; }' is not assignable to type 'MutationInterface'.
Types of property 'mutate' are incompatible.
Type 'UseMutateFunction<{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], TRPCClientErrorLike<...>, { ...; }, unknown>' is not assignable to type '(params: { id: string; createdAt: string; toTime: string | Date | undefined; title: string; fromTime: string | Date | undefined; }) => void'.
Types of parameters 'variables' and 'params' are incompatible.
Type '{ id: string; createdAt: string; toTime: string | Date | undefined; title: string; fromTime: string | Date | undefined; }' is not assignable to type '{ title: string; id: string; fromTime: Date; toTime: Date; description?: string | null | undefined; categoryId?: string | null | undefined; hideDates?: boolean | null | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined; }'.
Types of property 'fromTime' are incompatible.
Type 'string | Date | undefined' is not assignable to type 'Date'.
Type 'undefined' is not assignable to type 'Date'.
src/app/admin/cv/entry/_components/CreateUpdateForm.tsx(49,7): error TS2322: Type 'UseTRPCMutationResult<{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], TRPCClientErrorLike<...>, { ...; }, unknown>' is not assignable to type 'MutationInterface'.
Type 'TRPCHookResult & Override<MutationObserverIdleResult<{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], TRPCClientErrorLike<...>, { ...; }, unknown>, { ...; }> & { ...; }' is not assignable to type 'MutationInterface'.
Types of property 'mutate' are incompatible.
Type 'UseMutateFunction<{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], TRPCClientErrorLike<...>, { ...; }, unknown>' is not assignable to type '(params: { id: string; createdAt: string; toTime: string | Date | undefined; title: string; fromTime: string | Date | undefined; }) => void'.
Types of parameters 'variables' and 'params' are incompatible.
Type '{ id: string; createdAt: string; toTime: string | Date | undefined; title: string; fromTime: string | Date | undefined; }' is not assignable to type '{ title?: string | undefined; id?: string | undefined; description?: string | null | undefined; categoryId?: string | null | undefined; fromTime?: Date | undefined; toTime?: Date | undefined; hideDates?: boolean | ... 1 more ... | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined...'.
Types of property 'fromTime' are incompatible.
Type 'string | Date | undefined' is not assignable to type 'Date | undefined'.
Type 'string' is not assignable to type 'Date'.
src/app/admin/cv/entry/_components/CreateUpdateForm.tsx(50,7): error TS2322: Type 'UseTRPCMutationResult<{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], TRPCClientErrorLike<...>, { ...; }, unknown>' is not assignable to type 'MutationInterface'.
Type 'TRPCHookResult & Override<MutationObserverIdleResult<{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], TRPCClientErrorLike<...>, { ...; }, unknown>, { ...; }> & { ...; }' is not assignable to type 'MutationInterface'.
Types of property 'mutate' are incompatible.
Type 'UseMutateFunction<{ title: string; id: string; description: string | null; categoryId: string | null; fromTime: string; toTime: string; hideDates: boolean | null; createdAt: string; updatedAt: string | null; }[], TRPCClientErrorLike<...>, { ...; }, unknown>' is not assignable to type '(params: { id: string; createdAt: string; toTime: string | Date | undefined; title: string; fromTime: string | Date | undefined; }) => void'.
Types of parameters 'variables' and 'params' are incompatible.
Type '{ id: string; createdAt: string; toTime: string | Date | undefined; title: string; fromTime: string | Date | undefined; }' is not assignable to type '{ title?: string | undefined; id?: string | undefined; description?: string | null | undefined; categoryId?: string | null | undefined; fromTime?: Date | undefined; toTime?: Date | undefined; hideDates?: boolean | ... 1 more ... | undefined; createdAt?: Date | undefined; updatedAt?: Date | ... 1 more ... | undefined...'.
Types of property 'fromTime' are incompatible.
Type 'string | Date | undefined' is not assignable to type 'Date | undefined'.
Type 'string' is not assignable to type 'Date'.
src/app/admin/cv/entry/_components/CreateUpdateForm.tsx(63,16): error TS18048: 'categories' is possibly 'undefined'.
src/app/admin/project/_components/CreateUpdateProjectForm.tsx(43,7): error TS2322: Type '{ children: Element[]; form: UseFormReturn<{ title: string; id: string; releaseStatus?: "released" | "unreleased" | null | undefined; sourceType?: "open" | "closed" | null | undefined; sourceLink?: string | ... 1 more ... | undefined; releaseLink?: string | ... 1 more ... | undefined; stackId?: string | ... 1 more ....' is not assignable to type 'IntrinsicAttributes & { form: UseFormReturn<{ title: string; id: string; releaseStatus?: "released" | "unreleased" | null | undefined; sourceType?: "open" | "closed" | null | undefined; sourceLink?: string | ... 1 more ... | undefined; releaseLink?: string | ... 1 more ... | undefined; stackId?: string | ... 1 more ...'.
Property 'createMutation' does not exist on type 'IntrinsicAttributes & { form: UseFormReturn<{ title: string; id: string; releaseStatus?: "released" | "unreleased" | null | undefined; sourceType?: "open" | "closed" | null | undefined; sourceLink?: string | ... 1 more ... | undefined; releaseLink?: string | ... 1 more ... | undefined; stackId?: string | ... 1 more ...'.
src/app/admin/project/techStack/_components/CreateUpdateForm.tsx(18,8): error TS2613: Module '"/home/anon/Dev/gregorlohaus.com/src/app/_components/Form/Components/MutationProvider"' has no default export. Did you mean to use 'import { FormMutationContextProvider } from "/home/anon/Dev/gregorlohaus.com/src/app/_components/Form/Components/MutationProvider"' instead?
src/app/cv/_components/CvCategory.tsx(10,30): error TS2339: Property 'cv' does not exist on type 'GetInferenceHelpers<"output", { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<{ project: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<...>>; techStack: BuiltRouter<...>; catego...'.
src/app/cv/_components/CvCategory.tsx(21,8): error TS2532: Object is possibly 'undefined'.
src/app/cv/_components/CvCategory.tsx(24,26): error TS2339: Property 'cvEntry' does not exist on type '{ id: string; name: string | null; layoutPosition: "sidebar" | "header" | "col1" | "col2" | null; }'.
src/app/cv/_components/CvCategory.tsx(24,55): error TS2339: Property 'cvEntry' does not exist on type '{ id: string; name: string | null; layoutPosition: "sidebar" | "header" | "col1" | "col2" | null; }[]'.
src/app/cv/_components/CvCategory.tsx(26,20): error TS2339: Property 'cvEntry' does not exist on type '{ id: string; name: string | null; layoutPosition: "sidebar" | "header" | "col1" | "col2" | null; }[]'.
src/app/cv/_components/CvCategory.tsx(26,33): error TS7006: Parameter 'entry' implicitly has an 'any' type.
src/app/cv/_components/CvEntry.tsx(4,19): error TS2305: Module '"~/lib/utils"' has no exported member 'Element'.
src/app/cv/_components/CvEntry.tsx(5,44): error TS2307: Cannot find module '~/server/routers/cv/category' or its corresponding type declarations.
src/app/cv/_components/CvEntry.tsx(6,41): error TS2307: Cannot find module '~/server/routers/cv/entry' or its corresponding type declarations.
src/app/cv/_components/CvEntry.tsx(15,21): error TS2339: Property 'cv' does not exist on type 'CreateTRPCReactBase<BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<{ project: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<...>>; techStack: BuiltRouter<...>; cate...'.
src/app/cv/page.tsx(9,44): error TS2307: Cannot find module '~/server/routers/cv/category' or its corresponding type declarations.
src/app/cv/page.tsx(15,27): error TS2339: Property 'cv' does not exist on type 'CreateTRPCReactBase<BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<{ project: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<...>>; techStack: BuiltRouter<...>; cate...'.
src/app/cv/page.tsx(18,52): error TS7006: Parameter 'cat' implicitly has an 'any' type.
src/app/cv/page.tsx(19,51): error TS7006: Parameter 'cat' implicitly has an 'any' type.
src/app/cv/page.tsx(20,49): error TS7006: Parameter 'cat' implicitly has an 'any' type.
src/app/cv/page.tsx(21,49): error TS7006: Parameter 'cat' implicitly has an 'any' type.
src/app/cv/page.tsx(61,36): error TS7006: Parameter 'cat' implicitly has an 'any' type.
src/app/cv/page.tsx(66,43): error TS7006: Parameter 'cat' implicitly has an 'any' type.
src/app/cv/page.tsx(79,40): error TS7006: Parameter 'cat' implicitly has an 'any' type.
src/app/cv/page.tsx(88,42): error TS7006: Parameter 'cat' implicitly has an 'any' type.
src/app/cv/page.tsx(98,42): error TS7006: Parameter 'cat' implicitly has an 'any' type.
src/components/ui/sidebar.tsx(5,15): error TS1484: 'VariantProps' is a type and must be imported using a type-only import when 'verbatimModuleSyntax' is enabled.
src/components/ui/sonner.tsx(4,29): error TS1484: 'ToasterProps' is a type and must be imported using a type-only import when 'verbatimModuleSyntax' is enabled.
src/hooks/useGlaze.ts(6,9): error TS2488: Type 'boolean' must have a '[Symbol.iterator]()' method that returns an iterator.
src/hooks/useGlaze.ts(18,7): error TS2552: Cannot find name 'setGlazeInit'. Did you mean 'glazeInit'?
src/server/lib.ts(26,39): error TS2345: Argument of type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]' is not assignable to parameter of type 'TableLikeHasEmptySelection<typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]> extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]'.
Type 'PgTableWithColumns<{ name: "cv_category"; schema: undefined; columns: { id: PgColumn<{ name: "id"; tableName: "cv_category"; dataType: "string"; columnType: "PgUUID"; data: string; driverParam: string; notNull: true; hasDefault: false; ... 6 more ...; generated: undefined; }, {}, {}>; name: PgColumn<...>; layoutPosi...' is not assignable to type 'TableLikeHasEmptySelection<typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]> extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]'.
Type 'PgTableWithColumns<{ name: "cv_category"; schema: undefined; columns: { id: PgColumn<{ name: "id"; tableName: "cv_category"; dataType: "string"; columnType: "PgUUID"; data: string; driverParam: string; notNull: true; hasDefault: false; ... 6 more ...; generated: undefined; }, {}, {}>; name: PgColumn<...>; layoutPosi...' is not assignable to type 'TableLikeHasEmptySelection<typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]> extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]'.
src/server/lib.ts(32,19): error TS2769: No overload matches this call.
Overload 1 of 3, '(left: Column<ColumnBaseConfig<ColumnDataType, string>, object, object>, right: unknown): SQL<unknown>', gave the following error.
Argument of type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]]' is not assignable to parameter of type 'Column<ColumnBaseConfig<ColumnDataType, string>, object, object>'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][number] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][symbol]' is not assignable to type 'Column<ColumnBaseConfig<ColumnDataType, string>, object, object>'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string]' is not assignable to type 'Column<ColumnBaseConfig<ColumnDataType, string>, object, object>'.
Overload 2 of 3, '(left: Aliased<unknown>, right: unknown): SQL<unknown>', gave the following error.
Argument of type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]]' is not assignable to parameter of type 'Aliased<unknown>'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][number] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][symbol]' is not assignable to type 'Aliased<unknown>'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string]' is not assignable to type 'Aliased<unknown>'.
Overload 3 of 3, '(left: SQLWrapper, right: unknown): SQL<unknown>', gave the following error.
Argument of type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]]' is not assignable to parameter of type 'SQLWrapper'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][number] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][symbol]' is not assignable to type 'SQLWrapper'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string]' is not assignable to type 'SQLWrapper'.
src/server/lib.ts(35,39): error TS2345: Argument of type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]' is not assignable to parameter of type 'TableLikeHasEmptySelection<typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]> extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]'.
Type 'PgTableWithColumns<{ name: "cv_category"; schema: undefined; columns: { id: PgColumn<{ name: "id"; tableName: "cv_category"; dataType: "string"; columnType: "PgUUID"; data: string; driverParam: string; notNull: true; hasDefault: false; ... 6 more ...; generated: undefined; }, {}, {}>; name: PgColumn<...>; layoutPosi...' is not assignable to type 'TableLikeHasEmptySelection<typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]> extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]'.
Type 'PgTableWithColumns<{ name: "cv_category"; schema: undefined; columns: { id: PgColumn<{ name: "id"; tableName: "cv_category"; dataType: "string"; columnType: "PgUUID"; data: string; driverParam: string; notNull: true; hasDefault: false; ... 6 more ...; generated: undefined; }, {}, {}>; name: PgColumn<...>; layoutPosi...' is not assignable to type 'TableLikeHasEmptySelection<typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]> extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]'.
src/server/lib.ts(37,37): error TS2345: Argument of type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]' is not assignable to parameter of type 'TableLikeHasEmptySelection<typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]> extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]'.
Type 'PgTableWithColumns<{ name: "cv_category"; schema: undefined; columns: { id: PgColumn<{ name: "id"; tableName: "cv_category"; dataType: "string"; columnType: "PgUUID"; data: string; driverParam: string; notNull: true; hasDefault: false; ... 6 more ...; generated: undefined; }, {}, {}>; name: PgColumn<...>; layoutPosi...' is not assignable to type 'TableLikeHasEmptySelection<typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]> extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]'.
Type 'PgTableWithColumns<{ name: "cv_category"; schema: undefined; columns: { id: PgColumn<{ name: "id"; tableName: "cv_category"; dataType: "string"; columnType: "PgUUID"; data: string; driverParam: string; notNull: true; hasDefault: false; ... 6 more ...; generated: undefined; }, {}, {}>; name: PgColumn<...>; layoutPosi...' is not assignable to type 'TableLikeHasEmptySelection<typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]> extends true ? DrizzleTypeError<"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause"> : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]'.
src/server/lib.ts(54,86): error TS7053: Element implicitly has an 'any' type because expression of type '"id"' can't be used to index type '{ [k in keyof addQuestionMarks<baseObjectOutputType<{ [K in keyof RemoveNever<{ [K in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"]]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][K] extends infer TColumn extends ...'.
Property 'id' does not exist on type '{ [k in keyof addQuestionMarks<baseObjectOutputType<{ [K in keyof RemoveNever<{ [K in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"]]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][K] extends infer TColumn extends ...'.
src/server/lib.ts(65,52): error TS2769: No overload matches this call.
Overload 1 of 2, '(value: { [Key in keyof { [K in keyof ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<Key, typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]>]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null; } & { [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as OptionalKeyOnly<...>]?: (typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null) | undefined; })]: ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<...>]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null; } & { [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as OptionalKeyOnly<...>]?: (typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null) | undefined; })[K]; }]: SQL<...> | ... 1 more ... | { [K in keyof ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<...>]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null; } & { [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as OptionalKeyOnly<...>]?: (typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null) | undefined; })]: ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<...>]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null; } & { [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as OptionalKeyOnly<...>]?: (typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null) | undefined; })[K]; }[Key]; }): PgInsertBase<...>', gave the following error.
Argument of type '{ [k in keyof addQuestionMarks<baseObjectOutputType<{ [K in keyof RemoveNever<{ [K in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"]]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][K] extends infer TColumn extends ...' is not assignable to parameter of type '{ [Key in keyof { [K in keyof ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<Key, typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]>]: typeof import("/home/anon/Dev/gregorloh...'.
Type '{ [k in keyof addQuestionMarks<baseObjectOutputType<{ [K in keyof RemoveNever<{ [K in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"]]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][K] extends infer TColumn extends ...' is not assignable to type '{ [Key in keyof { [K in keyof ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<Key, typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]>]: typeof import("/home/anon/Dev/gregorloh...'.
Type 'undefined' is not assignable to type '{ [Key in keyof { [K in keyof ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<Key, typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]>]: typeof import("/home/anon/Dev/gregorloh...'.
Overload 2 of 2, '(values: { [Key in keyof { [K in keyof ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<Key, typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]>]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null; } & { [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as OptionalKeyOnly<...>]?: (typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null) | undefined; })]: ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<...>]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null; } & { [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as OptionalKeyOnly<...>]?: (typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null) | undefined; })[K]; }]: SQL<...> | ... 1 more ... | { [K in keyof ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<...>]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null; } & { [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as OptionalKeyOnly<...>]?: (typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null) | undefined; })]: ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<...>]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null; } & { [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as OptionalKeyOnly<...>]?: (typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["notNull"] extends true ? typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] : typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]["_"]["data"] | null) | undefined; })[K]; }[Key]; }[]): PgInsertBase<...>', gave the following error.
Argument of type '{ [k in keyof addQuestionMarks<baseObjectOutputType<{ [K in keyof RemoveNever<{ [K in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"]]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][K] extends infer TColumn extends ...' is not assignable to parameter of type '{ [Key in keyof { [K in keyof ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<Key, typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]>]: typeof import("/home/anon/Dev/gregorloh...'.
Type 'undefined' is not assignable to type '{ [Key in keyof { [K in keyof ({ [Key in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"] & string as RequiredKeyOnly<Key, typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][Key]>]: typeof import("/home/anon/Dev/gregorloh...'.
src/server/lib.ts(76,42): error TS2769: No overload matches this call.
Overload 1 of 2, '(o: { [s: string]: unknown; } | ArrayLike<unknown>): [string, unknown][]', gave the following error.
Argument of type '{ [k in keyof addQuestionMarks<baseObjectOutputType<{ [K in keyof RemoveNever<{ [K in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"]]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][K] extends infer TColumn extends ...' is not assignable to parameter of type '{ [s: string]: unknown; } | ArrayLike<unknown>'.
Type 'undefined' is not assignable to type '{ [s: string]: unknown; } | ArrayLike<unknown>'.
Overload 2 of 2, '(o: {}): [string, any][]', gave the following error.
Argument of type '{ [k in keyof addQuestionMarks<baseObjectOutputType<{ [K in keyof RemoveNever<{ [K in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"]]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][K] extends infer TColumn extends ...' is not assignable to parameter of type '{}'.
Type 'undefined' is not assignable to type '{}'.
src/server/lib.ts(77,37): error TS2769: No overload matches this call.
Overload 1 of 2, '(o: { [s: string]: unknown; } | ArrayLike<unknown>): [string, unknown][]', gave the following error.
Argument of type '{ [k in keyof addQuestionMarks<baseObjectOutputType<{ [K in keyof RemoveNever<{ [K in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"]]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][K] extends infer TColumn extends ...' is not assignable to parameter of type '{ [s: string]: unknown; } | ArrayLike<unknown>'.
Type 'undefined' is not assignable to type '{ [s: string]: unknown; } | ArrayLike<unknown>'.
Overload 2 of 2, '(o: {}): [string, any][]', gave the following error.
Argument of type '{ [k in keyof addQuestionMarks<baseObjectOutputType<{ [K in keyof RemoveNever<{ [K in keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"]]: typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]["_"]["columns"][K] extends infer TColumn extends ...' is not assignable to parameter of type '{}'.
Type 'undefined' is not assignable to type '{}'.
src/server/lib.ts(81,19): error TS2769: No overload matches this call.
Overload 1 of 3, '(left: Column<ColumnBaseConfig<ColumnDataType, string>, object, object>, right: unknown): SQL<unknown>', gave the following error.
Argument of type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]]' is not assignable to parameter of type 'Column<ColumnBaseConfig<ColumnDataType, string>, object, object>'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][number] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][symbol]' is not assignable to type 'Column<ColumnBaseConfig<ColumnDataType, string>, object, object>'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string]' is not assignable to type 'Column<ColumnBaseConfig<ColumnDataType, string>, object, object>'.
Overload 2 of 3, '(left: Aliased<unknown>, right: unknown): SQL<unknown>', gave the following error.
Argument of type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]]' is not assignable to parameter of type 'Aliased<unknown>'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][number] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][symbol]' is not assignable to type 'Aliased<unknown>'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string]' is not assignable to type 'Aliased<unknown>'.
Overload 3 of 3, '(left: SQLWrapper, right: unknown): SQL<unknown>', gave the following error.
Argument of type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][keyof typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T]]' is not assignable to parameter of type 'SQLWrapper'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][number] | typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][symbol]' is not assignable to type 'SQLWrapper'.
Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string]' is not assignable to type 'SQLWrapper'.
src/server/routers/_app.server.test.ts(13,22): error TS2339: Property 'select' does not exist on type 'DecorateCreateRouterOptions<{ select: QueryProcedure<{ input: { id?: string | undefined; title?: string | undefined; sourceType?: "open" | "closed" | null | undefined; sourceLink?: string | null | undefined; releaseStatus?: "released" | ... 2 more ... | undefined; releaseLink?: string | ... 1 more ... | undefined; s...'.
Property 'select' does not exist on type 'RouterDef<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<{ project: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<...>>; techStack: BuiltRouter<...>; category: BuiltRouter<...>...'.
src/server/routers/_app.server.test.ts(14,22): error TS2339: Property 'update' does not exist on type 'DecorateCreateRouterOptions<{ select: QueryProcedure<{ input: { id?: string | undefined; title?: string | undefined; sourceType?: "open" | "closed" | null | undefined; sourceLink?: string | null | undefined; releaseStatus?: "released" | ... 2 more ... | undefined; releaseLink?: string | ... 1 more ... | undefined; s...'.
Property 'update' does not exist on type 'RouterDef<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<{ project: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<...>>; techStack: BuiltRouter<...>; category: BuiltRouter<...>...'.
src/server/routers/_app.server.test.ts(15,22): error TS2339: Property 'delete' does not exist on type 'DecorateCreateRouterOptions<{ select: QueryProcedure<{ input: { id?: string | undefined; title?: string | undefined; sourceType?: "open" | "closed" | null | undefined; sourceLink?: string | null | undefined; releaseStatus?: "released" | ... 2 more ... | undefined; releaseLink?: string | ... 1 more ... | undefined; s...'.
Property 'delete' does not exist on type 'RouterDef<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<{ project: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<...>>; techStack: BuiltRouter<...>; category: BuiltRouter<...>...'.
src/server/routers/_app.server.test.ts(16,22): error TS2339: Property 'insert' does not exist on type 'DecorateCreateRouterOptions<{ select: QueryProcedure<{ input: { id?: string | undefined; title?: string | undefined; sourceType?: "open" | "closed" | null | undefined; sourceLink?: string | null | undefined; releaseStatus?: "released" | ... 2 more ... | undefined; releaseLink?: string | ... 1 more ... | undefined; s...'.
Property 'insert' does not exist on type 'RouterDef<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<{ project: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<...>>; techStack: BuiltRouter<...>; category: BuiltRouter<...>...'.

View File

@@ -9,7 +9,7 @@
"moduleDetection": "force",
"isolatedModules": true,
"verbatimModuleSyntax": true,
"strictFunctionTypes": false,
/* Strictness */
"strict": true,
"noUncheckedIndexedAccess": true,

View File

@@ -3,17 +3,10 @@ import react from '@vitejs/plugin-react'
import tsconfigPaths from 'vite-tsconfig-paths'
import dotenv from 'dotenv'
import path from 'path'
import { resolve } from 'node:path'
const env = dotenv.config({path: './.env'})
console.log('dname', __dirname)
console.log(env.error)
// console.log(env.parsed)
export default defineConfig({
plugins: [tsconfigPaths(), react()],
resolve: {
alias: {
'~/app/_trpc/TrpcProvicer': path.resolve(__dirname,'./vitest.trpcProvider.mock')
}
},
optimizeDeps: {
include: [
'@tanstack/react-query-next-experimental',
@@ -24,18 +17,25 @@ export default defineConfig({
'@tanstack/react-query-next-experimental',
],
},
resolve: {
alias: {
'~/server/db': resolve('./test/aliases/db.ts')
}
},
test: {
// fileParallelism: false,
reporters: ['verbose'],
coverage: { provider: 'v8'},
coverage: { provider: 'v8', reporter: ['html-spa']},
projects: [
{
extends: true,
test: {
mockReset: true,
name: "server",
setupFiles: [
'./test/db/setup.ts',
'./test/mocks/vitest.isAdmin.mock.ts',
'./test/mocks/vitest.nextnavigation.mock.ts',
'./test/mocks/vitest.drizzle.mock.ts'
],
include: ['./src/**/*.server.test.ts'],
env: env.parsed
@@ -44,11 +44,14 @@ export default defineConfig({
{
extends: true,
test: {
mockReset: true,
name: "client",
setupFiles: [
'./test/trpc/server.ts',
'./test/db/setup.ts',
'./test/trpc/GetBaseUrl.mock.ts',
'./test/mocks/vitest.isAdmin.mock.ts',
'./test/mocks/vitest.nextnavigation.mock.ts',
'./test/mocks/vitest.drizzle.mock.ts'
],
include: ['./src/**/*.client.test.ts','./src/**/*.client.test.tsx'],
environment: 'jsdom',