From 276c3dd75f5f0715575204ca3f85a32408cecad5 Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Wed, 3 Sep 2025 22:04:56 +0200 Subject: [PATCH] test setup lackin --- drizzle.config.ts | 2 +- package.json | 89 ++++++----- pnpm-lock.yaml | 99 +++++++----- .../Form/Components/DeleteButton.tsx | 10 +- .../Form/Components/FormScaffold.tsx | 21 +-- .../Form/Components/MutationFormMessage.tsx | 19 +-- .../Form/Components/MutationProvider.tsx | 33 ++++ .../Form/Components/SubmitButton.tsx | 2 +- .../Form/Fields/MultiBooleanFormField.tsx | 9 +- .../Test/TestingTest.client.test.tsx | 19 +++ src/app/_components/Test/TestingTest.tsx | 33 ++++ src/app/_trpc/GetBaseUrl.ts | 13 ++ src/app/_trpc/TrpcProvider.tsx | 21 +-- .../category/_components/CreateUpdateForm.tsx | 38 +++-- .../cv/entry/_components/CreateUpdateForm.tsx | 15 +- .../CreateUpdateProjectForm.client.test.tsx | 5 +- .../_components/CreateUpdateProjectForm.tsx | 77 ++++----- .../CreateUpdateForm.client.test.tsx | 55 +++++++ .../_components/CreateUpdateForm.tsx | 39 ++--- src/components/ui/button.tsx | 4 + src/lib/utils.ts | 2 +- src/server/db/index.ts | 2 +- src/server/{db => dbschema}/schema.ts | 0 src/server/lib.ts | 6 +- test/aliases/db.ts | 2 + test/db/setup.ts | 33 ++++ test/mocks/vitest.drizzle.mock.ts | 11 -- test/trpc/GetBaseUrl.mock.ts | 9 ++ test/trpc/portincrement.ts | 0 test/trpc/server.ts | 27 ++++ test/trpc/vitest.trpcProvider.mock.tsx | 16 -- test/trpc/vitest.trpcProxyClient.ts | 26 --- tscerrors.txt | 150 ++++++++++++++++++ tsconfig.json | 2 +- vitest.config.mts | 25 +-- 35 files changed, 629 insertions(+), 285 deletions(-) create mode 100644 src/app/_components/Form/Components/MutationProvider.tsx create mode 100644 src/app/_components/Test/TestingTest.client.test.tsx create mode 100644 src/app/_components/Test/TestingTest.tsx create mode 100644 src/app/_trpc/GetBaseUrl.ts create mode 100644 src/app/admin/project/techStack/_components/CreateUpdateForm.client.test.tsx rename src/server/{db => dbschema}/schema.ts (100%) create mode 100644 test/aliases/db.ts create mode 100644 test/db/setup.ts delete mode 100644 test/mocks/vitest.drizzle.mock.ts create mode 100644 test/trpc/GetBaseUrl.mock.ts create mode 100644 test/trpc/portincrement.ts create mode 100644 test/trpc/server.ts delete mode 100644 test/trpc/vitest.trpcProvider.mock.tsx delete mode 100644 test/trpc/vitest.trpcProxyClient.ts create mode 100644 tscerrors.txt diff --git a/drizzle.config.ts b/drizzle.config.ts index 2d05ffb..012da63 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -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, diff --git a/package.json b/package.json index b40f665..2ea825b 100644 --- a/package.json +++ b/package.json @@ -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" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6744b9a..a4c048c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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) diff --git a/src/app/_components/Form/Components/DeleteButton.tsx b/src/app/_components/Form/Components/DeleteButton.tsx index aedd8a5..a3beb67 100644 --- a/src/app/_components/Form/Components/DeleteButton.tsx +++ b/src/app/_components/Form/Components/DeleteButton.tsx @@ -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(params: { mutation: UseTRPCMutationResult, 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 ( - ) diff --git a/src/app/_components/Form/Components/FormScaffold.tsx b/src/app/_components/Form/Components/FormScaffold.tsx index af24c5b..4a3fdd2 100644 --- a/src/app/_components/Form/Components/FormScaffold.tsx +++ b/src/app/_components/Form/Components/FormScaffold.tsx @@ -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(params: { + +export default function FormScaffold(params: { form: UseFormReturn, onSubmit: SubmitHandler, - createMutation: UseTRPCMutationResult, - updateMutation: UseTRPCMutationResult, - deleteMutation: UseTRPCMutationResult, 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 ( @@ -32,12 +26,13 @@ export default function FormScaffold {children} - +
- - + +
diff --git a/src/app/_components/Form/Components/MutationFormMessage.tsx b/src/app/_components/Form/Components/MutationFormMessage.tsx index bb2d7b6..36d9348 100644 --- a/src/app/_components/Form/Components/MutationFormMessage.tsx +++ b/src/app/_components/Form/Components/MutationFormMessage.tsx @@ -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 ? - - {params.trueError ? params.trueError.message : params.trueStatus} + + {ctx.updateMutation.error ? ctx.updateMutation.error.message : ctx.updateMutation.status} : - - {params.falseError ? params.falseError.message : params.falseStatus} + + {ctx.createMutation.error ? ctx.createMutation.error.message : ctx.createMutation.status} } diff --git a/src/app/_components/Form/Components/MutationProvider.tsx b/src/app/_components/Form/Components/MutationProvider.tsx new file mode 100644 index 0000000..425655b --- /dev/null +++ b/src/app/_components/Form/Components/MutationProvider.tsx @@ -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(undefined) +export function useFormMutationContext() { + return useContext(FormMutationContext) +} + +export function FormMutationContextProvider(params: {children: ReactNode, value: FormMutationContext}) { + return ( + + {params.children} + + ) +} diff --git a/src/app/_components/Form/Components/SubmitButton.tsx b/src/app/_components/Form/Components/SubmitButton.tsx index b53e843..d48bf5c 100644 --- a/src/app/_components/Form/Components/SubmitButton.tsx +++ b/src/app/_components/Form/Components/SubmitButton.tsx @@ -3,7 +3,7 @@ import DependentText from "../../DependentText"; export default function SubmitButton(params: {id?:string}) { return ( - ) diff --git a/src/app/_components/Form/Fields/MultiBooleanFormField.tsx b/src/app/_components/Form/Fields/MultiBooleanFormField.tsx index 0a094a5..96840b8 100644 --- a/src/app/_components/Form/Fields/MultiBooleanFormField.tsx +++ b/src/app/_components/Form/Fields/MultiBooleanFormField.tsx @@ -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
{opt} - +
)) @@ -71,14 +68,14 @@ export default function MultiBooleanFormField(params: { c render={({ field }) => ( - + - + diff --git a/src/app/_components/Test/TestingTest.client.test.tsx b/src/app/_components/Test/TestingTest.client.test.tsx new file mode 100644 index 0000000..f637a36 --- /dev/null +++ b/src/app/_components/Test/TestingTest.client.test.tsx @@ -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( + + ) + const submitButton = screen.getByTestId('form-submit') + screen.debug() + user.click(submitButton) + await waitFor(() => { + screen.getByTestId('submitted') + }) + screen.debug() +}) diff --git a/src/app/_components/Test/TestingTest.tsx b/src/app/_components/Test/TestingTest.tsx new file mode 100644 index 0000000..6fbb0a4 --- /dev/null +++ b/src/app/_components/Test/TestingTest.tsx @@ -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>({ + resolver: zodResolver(schema), + defaultValues: { + text: "" + } + }) + const onSubmit = (_: z.infer) => { + setSubmitted(true) + } + return ( + <> +
+ + + + + ) +} diff --git a/src/app/_trpc/GetBaseUrl.ts b/src/app/_trpc/GetBaseUrl.ts new file mode 100644 index 0000000..c93b5a0 --- /dev/null +++ b/src/app/_trpc/GetBaseUrl.ts @@ -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}`; +} diff --git a/src/app/_trpc/TrpcProvider.tsx b/src/app/_trpc/TrpcProvider.tsx index 9b6d620..98b35b6 100644 --- a/src/app/_trpc/TrpcProvider.tsx +++ b/src/app/_trpc/TrpcProvider.tsx @@ -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`, }), ], }) diff --git a/src/app/admin/cv/category/_components/CreateUpdateForm.tsx b/src/app/admin/cv/category/_components/CreateUpdateForm.tsx index 0c983e0..fce0a04 100644 --- a/src/app/admin/cv/category/_components/CreateUpdateForm.tsx +++ b/src/app/admin/cv/category/_components/CreateUpdateForm.tsx @@ -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 }) { const schemas = entitySchemas('cvCategory') const [id, setId] = useState(params.entity ? params.entity.id : undefined) @@ -33,22 +34,25 @@ export default function CreateUpdateCvCategoryForm(params: { className?: string, createMutation.mutate(values) } return ( - - - - {schemas.insert.shape.layoutPosition.unwrap().unwrap().options.map((o) => ( - {o} - ))} - - + + + + + {schemas.insert.shape.layoutPosition.unwrap().unwrap().options.map((o) => ( + {o} + ))} + + + ) } diff --git a/src/app/admin/cv/entry/_components/CreateUpdateForm.tsx b/src/app/admin/cv/entry/_components/CreateUpdateForm.tsx index 9da1539..a83caa7 100644 --- a/src/app/admin/cv/entry/_components/CreateUpdateForm.tsx +++ b/src/app/admin/cv/entry/_components/CreateUpdateForm.tsx @@ -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, isUpdate?: boolean }) { const [id, setId] = useState(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 + - {categories.map((c) => { + {categories?.map((c) => { return ( {c.name} ) })} : @@ -69,5 +75,6 @@ export default function CreateUpdateCvEntryForm(params: { className?: string, en + ) } diff --git a/src/app/admin/project/_components/CreateUpdateProjectForm.client.test.tsx b/src/app/admin/project/_components/CreateUpdateProjectForm.client.test.tsx index 103d1e1..a57e2c5 100644 --- a/src/app/admin/project/_components/CreateUpdateProjectForm.client.test.tsx +++ b/src/app/admin/project/_components/CreateUpdateProjectForm.client.test.tsx @@ -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', () => { ) - let options = screen.getAllByRole('combobox') - console.log(options) }) diff --git a/src/app/admin/project/_components/CreateUpdateProjectForm.tsx b/src/app/admin/project/_components/CreateUpdateProjectForm.tsx index 0ba329a..d5aa2d7 100644 --- a/src/app/admin/project/_components/CreateUpdateProjectForm.tsx +++ b/src/app/admin/project/_components/CreateUpdateProjectForm.tsx @@ -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 }) { - const [id, setId] = useState(params.entity ? params.entity.id : undefined) + const [id, setId] = useState(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>({ resolver: zodResolver(schemas.insert), defaultValues: { @@ -40,38 +39,42 @@ export default function CreateUpdateProjectForm(params: { className?: string, en createMutation.mutate(values) } return ( - - - { - stacksSuccess ? - <> - {stacks?.map((stack) => { - return ( {stack.stackItems ? stack.stackItems.join("-") : "Empty Stack"} ) - })} - : - - } - - - - open - closed - - - - released - unreleased - - - + + + + { + stacksSuccess ? + <> + {stacks?.map((stack) => { + return ( {stack.stackItems ? stack.stackItems.join("-") : "Empty Stack"} ) + })} + : + + } + + + + open + closed + + + + released + unreleased + + + + ) } diff --git a/src/app/admin/project/techStack/_components/CreateUpdateForm.client.test.tsx b/src/app/admin/project/techStack/_components/CreateUpdateForm.client.test.tsx new file mode 100644 index 0000000..d3f52e0 --- /dev/null +++ b/src/app/admin/project/techStack/_components/CreateUpdateForm.client.test.tsx @@ -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( + + + + ) + 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) +}) diff --git a/src/app/admin/project/techStack/_components/CreateUpdateForm.tsx b/src/app/admin/project/techStack/_components/CreateUpdateForm.tsx index 760e44d..779e86b 100644 --- a/src/app/admin/project/techStack/_components/CreateUpdateForm.tsx +++ b/src/app/admin/project/techStack/_components/CreateUpdateForm.tsx @@ -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 }) { 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(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) { + setSubmitted(true) params.entity ? updateMutation.mutate(values) : - createMutation.mutate(values) + createMutation.mutate(values); } return ( - - - + <> +
+ + + + + + ) } diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index 1cab9b9..0ba2d23 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -40,16 +40,20 @@ function Button({ variant, size, asChild = false, + submit = false, ...props }: React.ComponentProps<"button"> & VariantProps & { asChild?: boolean + submit?: boolean }) { const Comp = asChild ? Slot : "button" return ( diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 23fc5dc..8048c7f 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -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"; diff --git a/src/server/db/index.ts b/src/server/db/index.ts index c6552ee..63e6815 100644 --- a/src/server/db/index.ts +++ b/src/server/db/index.ts @@ -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 diff --git a/src/server/db/schema.ts b/src/server/dbschema/schema.ts similarity index 100% rename from src/server/db/schema.ts rename to src/server/dbschema/schema.ts diff --git a/src/server/lib.ts b/src/server/lib.ts index 952e830..f5de037 100644 --- a/src/server/lib.ts +++ b/src/server/lib.ts @@ -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>(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>(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>(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>(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( diff --git a/test/aliases/db.ts b/test/aliases/db.ts new file mode 100644 index 0000000..3c74df0 --- /dev/null +++ b/test/aliases/db.ts @@ -0,0 +1,2 @@ +import { db } from "test/db/setup"; +export { db }; diff --git a/test/db/setup.ts b/test/db/setup.ts new file mode 100644 index 0000000..4fa5bd6 --- /dev/null +++ b/test/db/setup.ts @@ -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 = {}; +export let db: PgliteDatabase +// 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) { + 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() +// }) diff --git a/test/mocks/vitest.drizzle.mock.ts b/test/mocks/vitest.drizzle.mock.ts deleted file mode 100644 index ae2a589..0000000 --- a/test/mocks/vitest.drizzle.mock.ts +++ /dev/null @@ -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 - } -}) diff --git a/test/trpc/GetBaseUrl.mock.ts b/test/trpc/GetBaseUrl.mock.ts new file mode 100644 index 0000000..abb2961 --- /dev/null +++ b/test/trpc/GetBaseUrl.mock.ts @@ -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}` + }) + } +}) diff --git a/test/trpc/portincrement.ts b/test/trpc/portincrement.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/trpc/server.ts b/test/trpc/server.ts new file mode 100644 index 0000000..462e9d8 --- /dev/null +++ b/test/trpc/server.ts @@ -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(); +// }); diff --git a/test/trpc/vitest.trpcProvider.mock.tsx b/test/trpc/vitest.trpcProvider.mock.tsx deleted file mode 100644 index 129a540..0000000 --- a/test/trpc/vitest.trpcProvider.mock.tsx +++ /dev/null @@ -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 ( - - - {children} - - - )} diff --git a/test/trpc/vitest.trpcProxyClient.ts b/test/trpc/vitest.trpcProxyClient.ts deleted file mode 100644 index 7c9ef52..0000000 --- a/test/trpc/vitest.trpcProxyClient.ts +++ /dev/null @@ -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({ - links: [ - httpBatchLink({ - url: 'http://localhost/api/trpc', - fetch: (input, init) => { - return serverHandler(input as string, new Request(input as string, init)) - }, - }), - ], - }) -} diff --git a/tscerrors.txt b/tscerrors.txt new file mode 100644 index 0000000..8509c8e --- /dev/null +++ b/tscerrors.txt @@ -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, { ...; }, 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, { ...; }, 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, { ...; }, 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>; 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>; 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 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 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 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, object, object>, right: unknown): SQL', 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, 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, object, object>'. + Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string]' is not assignable to type 'Column, object, object>'. + Overload 2 of 3, '(left: Aliased, right: unknown): SQL', 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'. + 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'. + Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string]' is not assignable to type 'Aliased'. + Overload 3 of 3, '(left: SQLWrapper, right: unknown): SQL', 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 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 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 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 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 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 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]: 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]: typeof import("/home/anon/Dev/gregorloh...'. + Type '{ [k in keyof addQuestionMarks]: 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]: 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]: 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]: 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]: 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): [string, unknown][]', gave the following error. + Argument of type '{ [k in keyof addQuestionMarks'. + Type 'undefined' is not assignable to type '{ [s: string]: unknown; } | ArrayLike'. + Overload 2 of 2, '(o: {}): [string, any][]', gave the following error. + Argument of type '{ [k in keyof addQuestionMarks): [string, unknown][]', gave the following error. + Argument of type '{ [k in keyof addQuestionMarks'. + Type 'undefined' is not assignable to type '{ [s: string]: unknown; } | ArrayLike'. + Overload 2 of 2, '(o: {}): [string, any][]', gave the following error. + Argument of type '{ [k in keyof addQuestionMarks, object, object>, right: unknown): SQL', 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, 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, object, object>'. + Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string]' is not assignable to type 'Column, object, object>'. + Overload 2 of 3, '(left: Aliased, right: unknown): SQL', 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'. + 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'. + Type 'typeof import("/home/anon/Dev/gregorlohaus.com/src/server/dbschema/schema")[T][string]' is not assignable to type 'Aliased'. + Overload 3 of 3, '(left: SQLWrapper, right: unknown): SQL', 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<...>...'. diff --git a/tsconfig.json b/tsconfig.json index be7a024..5f47be4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "moduleDetection": "force", "isolatedModules": true, "verbatimModuleSyntax": true, - + "strictFunctionTypes": false, /* Strictness */ "strict": true, "noUncheckedIndexedAccess": true, diff --git a/vitest.config.mts b/vitest.config.mts index 30aefc4..8d84ae5 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -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',