test setup lackin
This commit is contained in:
@@ -3,7 +3,7 @@ import type { Config } from "drizzle-kit";
|
|||||||
import { env } from "~/env";
|
import { env } from "~/env";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
schema: "./src/server/db/schema.ts",
|
schema: "./src/server/dbschema/schema.ts",
|
||||||
dialect: "postgresql",
|
dialect: "postgresql",
|
||||||
dbCredentials: {
|
dbCredentials: {
|
||||||
url: env.DATABASE_URL,
|
url: env.DATABASE_URL,
|
||||||
|
|||||||
89
package.json
89
package.json
@@ -16,50 +16,51 @@
|
|||||||
"preview": "next build && next start",
|
"preview": "next build && next start",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"typecheck": "tsc --noEmit",
|
"typecheck": "tsc --noEmit",
|
||||||
"test": "vitest --coverage --typecheck"
|
"test": "vitest --typecheck"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@clerk/nextjs": "^6.27.1",
|
"@clerk/nextjs": "^6.31.6",
|
||||||
"@electric-sql/pglite": "^0.3.7",
|
"@electric-sql/pglite": "^0.3.7",
|
||||||
"@fortawesome/fontawesome-svg-core": "^6.7.2",
|
"@fortawesome/fontawesome-svg-core": "^6.7.2",
|
||||||
"@fortawesome/free-solid-svg-icons": "^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",
|
"@gsap/react": "^2.1.2",
|
||||||
"@hookform/resolvers": "^5.2.0",
|
"@hookform/resolvers": "^5.2.1",
|
||||||
"@neondatabase/serverless": "^1.0.1",
|
"@neondatabase/serverless": "^1.0.1",
|
||||||
"@radix-ui/react-accordion": "^1.2.11",
|
"@radix-ui/react-accordion": "^1.2.12",
|
||||||
"@radix-ui/react-alert-dialog": "^1.1.14",
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
||||||
"@radix-ui/react-aspect-ratio": "^1.1.7",
|
"@radix-ui/react-aspect-ratio": "^1.1.7",
|
||||||
"@radix-ui/react-avatar": "^1.1.10",
|
"@radix-ui/react-avatar": "^1.1.10",
|
||||||
"@radix-ui/react-checkbox": "^1.3.2",
|
"@radix-ui/react-checkbox": "^1.3.3",
|
||||||
"@radix-ui/react-collapsible": "^1.1.11",
|
"@radix-ui/react-collapsible": "^1.1.12",
|
||||||
"@radix-ui/react-context-menu": "^2.2.15",
|
"@radix-ui/react-context-menu": "^2.2.16",
|
||||||
"@radix-ui/react-dialog": "^1.1.14",
|
"@radix-ui/react-dialog": "^1.1.15",
|
||||||
"@radix-ui/react-dropdown-menu": "^2.1.15",
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
||||||
"@radix-ui/react-hover-card": "^1.1.14",
|
"@radix-ui/react-hover-card": "^1.1.15",
|
||||||
"@radix-ui/react-label": "^2.1.7",
|
"@radix-ui/react-label": "^2.1.7",
|
||||||
"@radix-ui/react-menubar": "^1.1.15",
|
"@radix-ui/react-menubar": "^1.1.16",
|
||||||
"@radix-ui/react-navigation-menu": "^1.2.13",
|
"@radix-ui/react-navigation-menu": "^1.2.14",
|
||||||
"@radix-ui/react-popover": "^1.1.14",
|
"@radix-ui/react-popover": "^1.1.15",
|
||||||
"@radix-ui/react-progress": "^1.1.7",
|
"@radix-ui/react-progress": "^1.1.7",
|
||||||
"@radix-ui/react-radio-group": "^1.3.7",
|
"@radix-ui/react-radio-group": "^1.3.8",
|
||||||
"@radix-ui/react-scroll-area": "^1.2.9",
|
"@radix-ui/react-scroll-area": "^1.2.10",
|
||||||
"@radix-ui/react-select": "^2.2.5",
|
"@radix-ui/react-select": "^2.2.6",
|
||||||
"@radix-ui/react-separator": "^1.1.7",
|
"@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-slot": "^1.2.3",
|
||||||
"@radix-ui/react-switch": "^1.2.5",
|
"@radix-ui/react-switch": "^1.2.6",
|
||||||
"@radix-ui/react-tabs": "^1.1.12",
|
"@radix-ui/react-tabs": "^1.1.13",
|
||||||
"@radix-ui/react-toggle": "^1.1.9",
|
"@radix-ui/react-toggle": "^1.1.10",
|
||||||
"@radix-ui/react-toggle-group": "^1.1.10",
|
"@radix-ui/react-toggle-group": "^1.1.11",
|
||||||
"@radix-ui/react-tooltip": "^1.2.7",
|
"@radix-ui/react-tooltip": "^1.2.8",
|
||||||
"@t3-oss/env-nextjs": "^0.12.0",
|
"@t3-oss/env-nextjs": "^0.12.0",
|
||||||
"@tanstack/react-query": "^5.83.0",
|
"@tanstack/react-query": "^5.85.5",
|
||||||
"@tanstack/react-query-next-experimental": "^5.83.0",
|
"@tanstack/react-query-next-experimental": "^5.85.5",
|
||||||
"@trpc/client": "^11.4.3",
|
"@testing-library/user-event": "^14.6.1",
|
||||||
"@trpc/next": "^11.4.3",
|
"@trpc/client": "^11.5.0",
|
||||||
"@trpc/react-query": "^11.4.3",
|
"@trpc/next": "^11.5.0",
|
||||||
"@trpc/server": "^11.4.3",
|
"@trpc/react-query": "^11.5.0",
|
||||||
|
"@trpc/server": "^11.5.0",
|
||||||
"@uiw/react-md-editor": "^4.0.8",
|
"@uiw/react-md-editor": "^4.0.8",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
@@ -79,14 +80,14 @@
|
|||||||
"react": "^19.1.1",
|
"react": "^19.1.1",
|
||||||
"react-day-picker": "9.8.1",
|
"react-day-picker": "9.8.1",
|
||||||
"react-dom": "^19.1.1",
|
"react-dom": "^19.1.1",
|
||||||
"react-hook-form": "^7.61.1",
|
"react-hook-form": "^7.62.0",
|
||||||
"react-markdown": "^10.1.0",
|
"react-markdown": "^10.1.0",
|
||||||
"react-resizable-panels": "^3.0.3",
|
"react-resizable-panels": "^3.0.5",
|
||||||
"recharts": "^2.15.4",
|
"recharts": "^2.15.4",
|
||||||
"rehype-highlight": "^7.0.2",
|
"rehype-highlight": "^7.0.2",
|
||||||
"rehype-raw": "^7.0.0",
|
"rehype-raw": "^7.0.0",
|
||||||
"server-only": "^0.0.1",
|
"server-only": "^0.0.1",
|
||||||
"sonner": "^2.0.6",
|
"sonner": "^2.0.7",
|
||||||
"tailwind-merge": "^3.3.1",
|
"tailwind-merge": "^3.3.1",
|
||||||
"tailwindcss-motion": "^1.1.1",
|
"tailwindcss-motion": "^1.1.1",
|
||||||
"type-fest": "^4.41.0",
|
"type-fest": "^4.41.0",
|
||||||
@@ -96,28 +97,28 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@biomejs/biome": "1.9.4",
|
"@biomejs/biome": "1.9.4",
|
||||||
"@swc/jest": "^0.2.39",
|
"@swc/jest": "^0.2.39",
|
||||||
"@tailwindcss/postcss": "^4.1.11",
|
"@tailwindcss/postcss": "^4.1.12",
|
||||||
"@testing-library/dom": "^10.4.1",
|
"@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",
|
"@testing-library/react": "^16.3.0",
|
||||||
"@types/jest": "^30.0.0",
|
"@types/jest": "^30.0.0",
|
||||||
"@types/node": "^20.19.9",
|
"@types/node": "^20.19.11",
|
||||||
"@types/react": "^19.1.8",
|
"@types/react": "^19.1.12",
|
||||||
"@types/react-dom": "^19.1.6",
|
"@types/react-dom": "^19.1.9",
|
||||||
"@vitejs/plugin-react": "^5.0.0",
|
"@vitejs/plugin-react": "^5.0.2",
|
||||||
"@vitest/coverage-v8": "^3.2.4",
|
"@vitest/coverage-v8": "^3.2.4",
|
||||||
"dotenv": "^17.2.1",
|
"dotenv": "^17.2.1",
|
||||||
"drizzle-kit": "^0.30.6",
|
"drizzle-kit": "^0.30.6",
|
||||||
"jest": "^30.0.5",
|
"jest": "^30.1.1",
|
||||||
"jest-environment-jsdom": "^30.0.5",
|
"jest-environment-jsdom": "^30.1.1",
|
||||||
"jsdom": "^26.1.0",
|
"jsdom": "^26.1.0",
|
||||||
"next-router-mock": "^1.0.2",
|
"next-router-mock": "^1.0.2",
|
||||||
"pg-mem": "^3.0.5",
|
"pg-mem": "^3.0.5",
|
||||||
"postcss": "^8.5.6",
|
"postcss": "^8.5.6",
|
||||||
"tailwindcss": "^4.1.11",
|
"tailwindcss": "^4.1.12",
|
||||||
"ts-node": "^10.9.2",
|
"ts-node": "^10.9.2",
|
||||||
"tw-animate-css": "^1.3.6",
|
"tw-animate-css": "^1.3.7",
|
||||||
"typescript": "^5.8.3",
|
"typescript": "^5.9.2",
|
||||||
"vite-tsconfig-paths": "^5.1.4",
|
"vite-tsconfig-paths": "^5.1.4",
|
||||||
"vitest": "^3.2.4"
|
"vitest": "^3.2.4"
|
||||||
},
|
},
|
||||||
|
|||||||
99
pnpm-lock.yaml
generated
99
pnpm-lock.yaml
generated
@@ -9,7 +9,7 @@ importers:
|
|||||||
.:
|
.:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@clerk/nextjs':
|
'@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)
|
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':
|
'@electric-sql/pglite':
|
||||||
specifier: ^0.3.7
|
specifier: ^0.3.7
|
||||||
@@ -21,22 +21,22 @@ importers:
|
|||||||
specifier: ^6.7.2
|
specifier: ^6.7.2
|
||||||
version: 6.7.2
|
version: 6.7.2
|
||||||
'@fortawesome/react-fontawesome':
|
'@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)
|
version: 0.2.6(@fortawesome/fontawesome-svg-core@6.7.2)(react@19.1.1)
|
||||||
'@gsap/react':
|
'@gsap/react':
|
||||||
specifier: ^2.1.2
|
specifier: ^2.1.2
|
||||||
version: 2.1.2(gsap@3.13.0)(react@19.1.1)
|
version: 2.1.2(gsap@3.13.0)(react@19.1.1)
|
||||||
'@hookform/resolvers':
|
'@hookform/resolvers':
|
||||||
specifier: ^5.2.0
|
specifier: ^5.2.1
|
||||||
version: 5.2.1(react-hook-form@7.62.0(react@19.1.1))
|
version: 5.2.1(react-hook-form@7.62.0(react@19.1.1))
|
||||||
'@neondatabase/serverless':
|
'@neondatabase/serverless':
|
||||||
specifier: ^1.0.1
|
specifier: ^1.0.1
|
||||||
version: 1.0.1
|
version: 1.0.1
|
||||||
'@radix-ui/react-accordion':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@radix-ui/react-aspect-ratio':
|
||||||
specifier: ^1.1.7
|
specifier: ^1.1.7
|
||||||
@@ -45,91 +45,94 @@ importers:
|
|||||||
specifier: ^1.1.10
|
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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@radix-ui/react-label':
|
||||||
specifier: ^2.1.7
|
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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@radix-ui/react-progress':
|
||||||
specifier: ^1.1.7
|
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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@radix-ui/react-separator':
|
||||||
specifier: ^1.1.7
|
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)
|
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':
|
'@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)
|
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':
|
'@radix-ui/react-slot':
|
||||||
specifier: ^1.2.3
|
specifier: ^1.2.3
|
||||||
version: 1.2.3(@types/react@19.1.12)(react@19.1.1)
|
version: 1.2.3(@types/react@19.1.12)(react@19.1.1)
|
||||||
'@radix-ui/react-switch':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@t3-oss/env-nextjs':
|
||||||
specifier: ^0.12.0
|
specifier: ^0.12.0
|
||||||
version: 0.12.0(typescript@5.9.2)(zod@3.25.76)
|
version: 0.12.0(typescript@5.9.2)(zod@3.25.76)
|
||||||
'@tanstack/react-query':
|
'@tanstack/react-query':
|
||||||
specifier: ^5.83.0
|
specifier: ^5.85.5
|
||||||
version: 5.85.5(react@19.1.1)
|
version: 5.85.5(react@19.1.1)
|
||||||
'@tanstack/react-query-next-experimental':
|
'@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)
|
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':
|
'@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)
|
version: 11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2)
|
||||||
'@trpc/next':
|
'@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)
|
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':
|
'@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)
|
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':
|
'@trpc/server':
|
||||||
specifier: ^11.4.3
|
specifier: ^11.5.0
|
||||||
version: 11.5.0(typescript@5.9.2)
|
version: 11.5.0(typescript@5.9.2)
|
||||||
'@uiw/react-md-editor':
|
'@uiw/react-md-editor':
|
||||||
specifier: ^4.0.8
|
specifier: ^4.0.8
|
||||||
@@ -189,13 +192,13 @@ importers:
|
|||||||
specifier: ^19.1.1
|
specifier: ^19.1.1
|
||||||
version: 19.1.1(react@19.1.1)
|
version: 19.1.1(react@19.1.1)
|
||||||
react-hook-form:
|
react-hook-form:
|
||||||
specifier: ^7.61.1
|
specifier: ^7.62.0
|
||||||
version: 7.62.0(react@19.1.1)
|
version: 7.62.0(react@19.1.1)
|
||||||
react-markdown:
|
react-markdown:
|
||||||
specifier: ^10.1.0
|
specifier: ^10.1.0
|
||||||
version: 10.1.0(@types/react@19.1.12)(react@19.1.1)
|
version: 10.1.0(@types/react@19.1.12)(react@19.1.1)
|
||||||
react-resizable-panels:
|
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)
|
version: 3.0.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||||
recharts:
|
recharts:
|
||||||
specifier: ^2.15.4
|
specifier: ^2.15.4
|
||||||
@@ -210,7 +213,7 @@ importers:
|
|||||||
specifier: ^0.0.1
|
specifier: ^0.0.1
|
||||||
version: 0.0.1
|
version: 0.0.1
|
||||||
sonner:
|
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)
|
version: 2.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||||
tailwind-merge:
|
tailwind-merge:
|
||||||
specifier: ^3.3.1
|
specifier: ^3.3.1
|
||||||
@@ -235,13 +238,13 @@ importers:
|
|||||||
specifier: ^0.2.39
|
specifier: ^0.2.39
|
||||||
version: 0.2.39(@swc/core@1.13.5)
|
version: 0.2.39(@swc/core@1.13.5)
|
||||||
'@tailwindcss/postcss':
|
'@tailwindcss/postcss':
|
||||||
specifier: ^4.1.11
|
specifier: ^4.1.12
|
||||||
version: 4.1.12
|
version: 4.1.12
|
||||||
'@testing-library/dom':
|
'@testing-library/dom':
|
||||||
specifier: ^10.4.1
|
specifier: ^10.4.1
|
||||||
version: 10.4.1
|
version: 10.4.1
|
||||||
'@testing-library/jest-dom':
|
'@testing-library/jest-dom':
|
||||||
specifier: ^6.6.4
|
specifier: ^6.8.0
|
||||||
version: 6.8.0
|
version: 6.8.0
|
||||||
'@testing-library/react':
|
'@testing-library/react':
|
||||||
specifier: ^16.3.0
|
specifier: ^16.3.0
|
||||||
@@ -250,16 +253,16 @@ importers:
|
|||||||
specifier: ^30.0.0
|
specifier: ^30.0.0
|
||||||
version: 30.0.0
|
version: 30.0.0
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: ^20.19.9
|
specifier: ^20.19.11
|
||||||
version: 20.19.11
|
version: 20.19.11
|
||||||
'@types/react':
|
'@types/react':
|
||||||
specifier: ^19.1.8
|
specifier: ^19.1.12
|
||||||
version: 19.1.12
|
version: 19.1.12
|
||||||
'@types/react-dom':
|
'@types/react-dom':
|
||||||
specifier: ^19.1.6
|
specifier: ^19.1.9
|
||||||
version: 19.1.9(@types/react@19.1.12)
|
version: 19.1.9(@types/react@19.1.12)
|
||||||
'@vitejs/plugin-react':
|
'@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))
|
version: 5.0.2(vite@7.1.3(@types/node@20.19.11)(jiti@2.5.1)(lightningcss@1.30.1))
|
||||||
'@vitest/coverage-v8':
|
'@vitest/coverage-v8':
|
||||||
specifier: ^3.2.4
|
specifier: ^3.2.4
|
||||||
@@ -271,10 +274,10 @@ importers:
|
|||||||
specifier: ^0.30.6
|
specifier: ^0.30.6
|
||||||
version: 0.30.6
|
version: 0.30.6
|
||||||
jest:
|
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))
|
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:
|
jest-environment-jsdom:
|
||||||
specifier: ^30.0.5
|
specifier: ^30.1.1
|
||||||
version: 30.1.1
|
version: 30.1.1
|
||||||
jsdom:
|
jsdom:
|
||||||
specifier: ^26.1.0
|
specifier: ^26.1.0
|
||||||
@@ -289,16 +292,16 @@ importers:
|
|||||||
specifier: ^8.5.6
|
specifier: ^8.5.6
|
||||||
version: 8.5.6
|
version: 8.5.6
|
||||||
tailwindcss:
|
tailwindcss:
|
||||||
specifier: ^4.1.11
|
specifier: ^4.1.12
|
||||||
version: 4.1.12
|
version: 4.1.12
|
||||||
ts-node:
|
ts-node:
|
||||||
specifier: ^10.9.2
|
specifier: ^10.9.2
|
||||||
version: 10.9.2(@swc/core@1.13.5)(@types/node@20.19.11)(typescript@5.9.2)
|
version: 10.9.2(@swc/core@1.13.5)(@types/node@20.19.11)(typescript@5.9.2)
|
||||||
tw-animate-css:
|
tw-animate-css:
|
||||||
specifier: ^1.3.6
|
specifier: ^1.3.7
|
||||||
version: 1.3.7
|
version: 1.3.7
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^5.8.3
|
specifier: ^5.9.2
|
||||||
version: 5.9.2
|
version: 5.9.2
|
||||||
vite-tsconfig-paths:
|
vite-tsconfig-paths:
|
||||||
specifier: ^5.1.4
|
specifier: ^5.1.4
|
||||||
@@ -2414,6 +2417,12 @@ packages:
|
|||||||
'@types/react-dom':
|
'@types/react-dom':
|
||||||
optional: true
|
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':
|
'@trpc/client@11.5.0':
|
||||||
resolution: {integrity: sha512-32oH+KOAdo73jJKjU9tyG+vCjID6A28NgXwUNr691O5HjpF5yyTX51Zzyee8YtGzU89Nw/drCHdfA4gD7BN2eg==}
|
resolution: {integrity: sha512-32oH+KOAdo73jJKjU9tyG+vCjID6A28NgXwUNr691O5HjpF5yyTX51Zzyee8YtGzU89Nw/drCHdfA4gD7BN2eg==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -7163,6 +7172,10 @@ snapshots:
|
|||||||
'@types/react': 19.1.12
|
'@types/react': 19.1.12
|
||||||
'@types/react-dom': 19.1.9(@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)':
|
'@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@trpc/server': 11.5.0(typescript@5.9.2)
|
'@trpc/server': 11.5.0(typescript@5.9.2)
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
import { DeleteIcon } from "lucide-react";
|
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 { 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) {
|
if (params.id) {
|
||||||
return (
|
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 />
|
<DeleteIcon />
|
||||||
</Button>
|
</Button>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,22 +4,16 @@ import { DependentFormMessaage, SubmitButton, DeleteButton } from '~/app/_compon
|
|||||||
import type { FieldValues, SubmitHandler, UseFormReturn } from 'react-hook-form';
|
import type { FieldValues, SubmitHandler, UseFormReturn } from 'react-hook-form';
|
||||||
import type { ReactNode } from 'react';
|
import type { ReactNode } from 'react';
|
||||||
import DependentText from '../../DependentText';
|
import DependentText from '../../DependentText';
|
||||||
import type { UseTRPCMutationResult } from 'node_modules/@trpc/react-query/dist/getQueryKey.d-CruH3ncI.mjs';
|
|
||||||
interface Error {
|
export default function FormScaffold<T extends FieldValues,>(params: {
|
||||||
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: {
|
|
||||||
form: UseFormReturn<T>,
|
form: UseFormReturn<T>,
|
||||||
onSubmit: SubmitHandler<T>,
|
onSubmit: SubmitHandler<T>,
|
||||||
createMutation: UseTRPCMutationResult<TD, TE, TV, TC>,
|
|
||||||
updateMutation: UseTRPCMutationResult<TTD, TTE, TTV, TTC>,
|
|
||||||
deleteMutation: UseTRPCMutationResult<TTTD, TTTE, TTTV, TTTC>,
|
|
||||||
title: string,
|
title: string,
|
||||||
children: ReactNode,
|
children?: ReactNode,
|
||||||
id?: string,
|
id?: string,
|
||||||
className?: string
|
className?: string
|
||||||
}) {
|
}) {
|
||||||
const { form, onSubmit, createMutation, deleteMutation, updateMutation, title, id, className, children } = params
|
const { form, onSubmit, title, id, className, children } = params
|
||||||
return (
|
return (
|
||||||
<Card.Card className={className ? className : "w-5/6 lg:w-1/2"}>
|
<Card.Card className={className ? className : "w-5/6 lg:w-1/2"}>
|
||||||
<Card.CardHeader>
|
<Card.CardHeader>
|
||||||
@@ -32,12 +26,13 @@ export default function FormScaffold<T extends FieldValues, TD, TE extends Error
|
|||||||
<form
|
<form
|
||||||
onSubmit={form.handleSubmit(onSubmit)}
|
onSubmit={form.handleSubmit(onSubmit)}
|
||||||
className="space-y-8"
|
className="space-y-8"
|
||||||
|
data-testid="form"
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
<SubmitButton id={id} />
|
<SubmitButton id={id} />
|
||||||
<div className='flex flex-row justify-between'>
|
<div className='flex flex-row justify-between'>
|
||||||
<DependentFormMessaage falseStatus={createMutation.status} trueStatus={updateMutation.status} falseError={createMutation.error} trueError={updateMutation.error} bool={id ? true : false} />
|
<DependentFormMessaage bool={id ? true : false} />
|
||||||
<DeleteButton mutation={deleteMutation} id={id} />
|
<DeleteButton id={id} />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</Form>
|
</Form>
|
||||||
|
|||||||
@@ -1,19 +1,20 @@
|
|||||||
import { FormMessage } from "~/components/ui/form";
|
import { FormMessage } from "~/components/ui/form";
|
||||||
|
import { useFormMutationContext } from "./MutationProvider";
|
||||||
|
|
||||||
interface Error {
|
export default function DependentFormMessaage( params: {bool: boolean} ) {
|
||||||
message: string
|
const ctx = useFormMutationContext()
|
||||||
}
|
if (ctx == undefined) {
|
||||||
|
throw new Error('Dependent form message needs populates form mutations context')
|
||||||
export default function DependentFormMessaage( params: {trueStatus: string, falseStatus: string, falseError?: Error|null, trueError?:Error|null, bool: boolean} ) {
|
}
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{
|
{
|
||||||
params.bool ?
|
params.bool ?
|
||||||
<FormMessage className={params.trueStatus == "success" ? "text-green-500" : "text-red-500"}>
|
<FormMessage className={ctx.updateMutation.status == "success" ? "text-green-500" : "text-red-500"}>
|
||||||
{params.trueError ? params.trueError.message : params.trueStatus}
|
{ctx.updateMutation.error ? ctx.updateMutation.error.message : ctx.updateMutation.status}
|
||||||
</FormMessage> :
|
</FormMessage> :
|
||||||
<FormMessage className={params.falseStatus == "success" ? "text-green-500" : "text-red-500"}>
|
<FormMessage className={ctx.createMutation.status == "success" ? "text-green-500" : "text-red-500"}>
|
||||||
{params.falseError ? params.falseError.message : params.falseStatus}
|
{ctx.createMutation.error ? ctx.createMutation.error.message : ctx.createMutation.status}
|
||||||
</FormMessage>
|
</FormMessage>
|
||||||
}
|
}
|
||||||
</>
|
</>
|
||||||
|
|||||||
33
src/app/_components/Form/Components/MutationProvider.tsx
Normal file
33
src/app/_components/Form/Components/MutationProvider.tsx
Normal 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>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@ import DependentText from "../../DependentText";
|
|||||||
|
|
||||||
export default function SubmitButton(params: {id?:string}) {
|
export default function SubmitButton(params: {id?:string}) {
|
||||||
return (
|
return (
|
||||||
<Button type="submit">
|
<Button submit={true}>
|
||||||
<DependentText bool={params.id?true:false} true='Update' false='Create' />
|
<DependentText bool={params.id?true:false} true='Update' false='Create' />
|
||||||
</Button>
|
</Button>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -21,10 +21,8 @@ function InnerMultiBooleanFormField(params: { options: string[], onChange: (arg0
|
|||||||
}
|
}
|
||||||
const onCheckedItemChange = (key: string) => {
|
const onCheckedItemChange = (key: string) => {
|
||||||
return function onCheckedChange(checked: CheckedState) {
|
return function onCheckedChange(checked: CheckedState) {
|
||||||
console.log(key,checked)
|
|
||||||
let state = context.checkedValues;
|
let state = context.checkedValues;
|
||||||
if (checked === "indeterminate") {
|
if (checked === "indeterminate") {
|
||||||
console.log('checked was intermediate')
|
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
state[key] = checked
|
state[key] = checked
|
||||||
@@ -36,7 +34,6 @@ function InnerMultiBooleanFormField(params: { options: string[], onChange: (arg0
|
|||||||
stateArr.push(key)
|
stateArr.push(key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log('calling field on change with:', stateArr)
|
|
||||||
params.onChange(stateArr)
|
params.onChange(stateArr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,7 +50,7 @@ function InnerMultiBooleanFormField(params: { options: string[], onChange: (arg0
|
|||||||
<FormItem key={opt}>
|
<FormItem key={opt}>
|
||||||
<div className="flex flex-row justify-between py-2 border-b-1">
|
<div className="flex flex-row justify-between py-2 border-b-1">
|
||||||
<FormLabel>{opt}</FormLabel>
|
<FormLabel>{opt}</FormLabel>
|
||||||
<Checkbox checked={checked(opt)} onCheckedChange={onCheckedItemChange(opt)} />
|
<Checkbox data-testid="multiboolean-checkbox" checked={checked(opt)} onCheckedChange={onCheckedItemChange(opt)} />
|
||||||
</div>
|
</div>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
))
|
))
|
||||||
@@ -71,14 +68,14 @@ export default function MultiBooleanFormField<T extends FieldValues>(params: { c
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<Popover open={open} onOpenChange={setOpen}>
|
<Popover open={open} onOpenChange={setOpen}>
|
||||||
<PopoverTrigger asChild>
|
<PopoverTrigger data-testid="multiboolean-popover-trigger" asChild>
|
||||||
<Button variant={'ghost'}>
|
<Button variant={'ghost'}>
|
||||||
<FormLabel>{params.label}</FormLabel>
|
<FormLabel>{params.label}</FormLabel>
|
||||||
<ChevronDownIcon/>
|
<ChevronDownIcon/>
|
||||||
</Button>
|
</Button>
|
||||||
</PopoverTrigger>
|
</PopoverTrigger>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<PopoverContent>
|
<PopoverContent data-testid="multiboolean-content">
|
||||||
<MultiBooleanFieldContext.Provider value={{checkedValues: checkedValues, setCheckedValue: setCheckedValues}}>
|
<MultiBooleanFieldContext.Provider value={{checkedValues: checkedValues, setCheckedValue: setCheckedValues}}>
|
||||||
<InnerMultiBooleanFormField onChange={field.onChange} options={params.options} />
|
<InnerMultiBooleanFormField onChange={field.onChange} options={params.options} />
|
||||||
</MultiBooleanFieldContext.Provider>
|
</MultiBooleanFieldContext.Provider>
|
||||||
|
|||||||
19
src/app/_components/Test/TestingTest.client.test.tsx
Normal file
19
src/app/_components/Test/TestingTest.client.test.tsx
Normal 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()
|
||||||
|
})
|
||||||
33
src/app/_components/Test/TestingTest.tsx
Normal file
33
src/app/_components/Test/TestingTest.tsx
Normal 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>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
13
src/app/_trpc/GetBaseUrl.ts
Normal file
13
src/app/_trpc/GetBaseUrl.ts
Normal 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}`;
|
||||||
|
}
|
||||||
@@ -4,21 +4,7 @@ import { ReactQueryStreamedHydration } from '@tanstack/react-query-next-experime
|
|||||||
import { httpBatchLink } from "@trpc/client";
|
import { httpBatchLink } from "@trpc/client";
|
||||||
import React, { useState } from "react"
|
import React, { useState } from "react"
|
||||||
import { trpc } from "./Client";
|
import { trpc } from "./Client";
|
||||||
|
import getBaseUrl from "~/app/_trpc/GetBaseUrl";
|
||||||
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}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
let clientQueryClient: QueryClient | undefined = undefined;
|
let clientQueryClient: QueryClient | undefined = undefined;
|
||||||
const makeQueryClient = () => new QueryClient({
|
const makeQueryClient = () => new QueryClient({
|
||||||
defaultOptions: {
|
defaultOptions: {
|
||||||
@@ -38,12 +24,15 @@ function getQueryClient() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
export default function TrpcProvider({ children }: { children: React.ReactNode }) {
|
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 queryClient = getQueryClient();
|
||||||
const [trpcClient] = useState(() => {
|
const [trpcClient] = useState(() => {
|
||||||
return trpc.createClient({
|
return trpc.createClient({
|
||||||
links: [
|
links: [
|
||||||
httpBatchLink({
|
httpBatchLink({
|
||||||
url: `${getBaseUrl()}/api/trpc`,
|
url: `${baseUrl}/api/trpc`,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import { useState } from 'react';
|
|||||||
import { SelectFormField, TextInputFormField } from '~/app/_components/Form/Fields';
|
import { SelectFormField, TextInputFormField } from '~/app/_components/Form/Fields';
|
||||||
import { usePathname, useRouter } from 'next/navigation';
|
import { usePathname, useRouter } from 'next/navigation';
|
||||||
import { SelectItem } from '~/components/ui/select';
|
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']> }) {
|
export default function CreateUpdateCvCategoryForm(params: { className?: string, entity?: IterableElement<RouterOutputs['category']['select']> }) {
|
||||||
const schemas = entitySchemas('cvCategory')
|
const schemas = entitySchemas('cvCategory')
|
||||||
const [id, setId] = useState<string | undefined>(params.entity ? params.entity.id : undefined)
|
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)
|
createMutation.mutate(values)
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<FormScaffold
|
<FormMutationContextProvider value={{
|
||||||
form={form}
|
createMutation:createMutation,
|
||||||
createMutation={createMutation}
|
updateMutation:updateMutation,
|
||||||
updateMutation={updateMutation}
|
deleteMutation:deleteMutation
|
||||||
deleteMutation={deleteMutation}
|
}}>
|
||||||
onSubmit={onSubmit}
|
<FormScaffold
|
||||||
title='Category'
|
form={form}
|
||||||
id={id}
|
onSubmit={onSubmit}
|
||||||
className={params.className}
|
title='Category'
|
||||||
>
|
id={id}
|
||||||
<TextInputFormField control={form.control} name='name' label='Name' />
|
className={params.className}
|
||||||
<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) => (
|
<TextInputFormField control={form.control} name='name' label='Name' />
|
||||||
<SelectItem key={o} value={o}> {o} </SelectItem>
|
<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) => (
|
||||||
</SelectFormField>
|
<SelectItem key={o} value={o}> {o} </SelectItem>
|
||||||
</FormScaffold>
|
))}
|
||||||
|
</SelectFormField>
|
||||||
|
</FormScaffold>
|
||||||
|
</FormMutationContextProvider>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import { FormScaffold } from '~/app/_components/Form/Components';
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { SelectFormField, TextInputFormField, MdeFormField, CalenderFormField, BooleanFormField } from '~/app/_components/Form/Fields'
|
import { SelectFormField, TextInputFormField, MdeFormField, CalenderFormField, BooleanFormField } from '~/app/_components/Form/Fields'
|
||||||
import { usePathname, useRouter } from 'next/navigation';
|
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 }) {
|
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 [id, setId] = useState<string | undefined>(params.entity ? params.entity.id : undefined)
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
@@ -42,11 +43,16 @@ export default function CreateUpdateCvEntryForm(params: { className?: string, en
|
|||||||
createMutation.mutate(values)
|
createMutation.mutate(values)
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
|
//todo
|
||||||
|
// solved by: strictFunctionTypes: false
|
||||||
|
// sadge
|
||||||
|
<FormMutationContextProvider value={{
|
||||||
|
createMutation:createMutation,
|
||||||
|
updateMutation:updateMutation,
|
||||||
|
deleteMutation:deleteMutation
|
||||||
|
}}>
|
||||||
<FormScaffold
|
<FormScaffold
|
||||||
form={form}
|
form={form}
|
||||||
createMutation={createMutation}
|
|
||||||
updateMutation={updateMutation}
|
|
||||||
deleteMutation={deleteMutation}
|
|
||||||
onSubmit={onSubmit}
|
onSubmit={onSubmit}
|
||||||
title='Entry'
|
title='Entry'
|
||||||
id={id}
|
id={id}
|
||||||
@@ -56,7 +62,7 @@ export default function CreateUpdateCvEntryForm(params: { className?: string, en
|
|||||||
{
|
{
|
||||||
categoriesSuccess ?
|
categoriesSuccess ?
|
||||||
<>
|
<>
|
||||||
{categories.map((c) => {
|
{categories?.map((c) => {
|
||||||
return (<SelectItem key={c.id} value={c.id}> {c.name} </SelectItem>)
|
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' />
|
<CalenderFormField control={form.control} name='toTime' label='To Date' />
|
||||||
<BooleanFormField control={form.control} name='hideDates' label='Hide Dates' />
|
<BooleanFormField control={form.control} name='hideDates' label='Hide Dates' />
|
||||||
</FormScaffold>
|
</FormScaffold>
|
||||||
|
</FormMutationContextProvider>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
'use server'
|
|
||||||
import { expect, test } from 'vitest'
|
import { expect, test } from 'vitest'
|
||||||
import { render, screen } from '@testing-library/react'
|
import { render, screen } from '@testing-library/react'
|
||||||
import CreateUpdateProjectForm from './CreateUpdateProjectForm'
|
import CreateUpdateProjectForm from './CreateUpdateProjectForm'
|
||||||
import TrpcProvider from '~/../test/trpc/vitest.trpcProvider.mock'
|
import TrpcProvider from '~/app/_trpc/TrpcProvider'
|
||||||
|
|
||||||
test('CreateUpdateProjectForm', () => {
|
test('CreateUpdateProjectForm', () => {
|
||||||
render(
|
render(
|
||||||
@@ -10,6 +9,4 @@ test('CreateUpdateProjectForm', () => {
|
|||||||
<CreateUpdateProjectForm/>
|
<CreateUpdateProjectForm/>
|
||||||
</TrpcProvider>
|
</TrpcProvider>
|
||||||
)
|
)
|
||||||
let options = screen.getAllByRole('combobox')
|
|
||||||
console.log(options)
|
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -12,12 +12,11 @@ import { SelectFormField, TextInputFormField } from '~/app/_components/Form/Fiel
|
|||||||
import { FormScaffold } from '~/app/_components/Form/Components';
|
import { FormScaffold } from '~/app/_components/Form/Components';
|
||||||
import { usePathname, useRouter } from 'next/navigation';
|
import { usePathname, useRouter } from 'next/navigation';
|
||||||
import { makeUseRelationShipWithNameIndex } from '~/lib/hooks';
|
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']> }) {
|
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')
|
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('-') : "" })
|
||||||
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 form = useForm<z.infer<typeof schemas.insert>>({
|
const form = useForm<z.infer<typeof schemas.insert>>({
|
||||||
resolver: zodResolver(schemas.insert),
|
resolver: zodResolver(schemas.insert),
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
@@ -40,38 +39,42 @@ export default function CreateUpdateProjectForm(params: { className?: string, en
|
|||||||
createMutation.mutate(values)
|
createMutation.mutate(values)
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<FormScaffold
|
<FormMutationContextProvider value={
|
||||||
form={form}
|
{
|
||||||
createMutation={createMutation}
|
createMutation: createMutation,
|
||||||
updateMutation={updateMutation}
|
updateMutation: updateMutation,
|
||||||
deleteMutation={deleteMutation}
|
deleteMutation: deleteMutation
|
||||||
onSubmit={onSubmit}
|
}}>
|
||||||
title='Project'
|
<FormScaffold
|
||||||
id={id}
|
form={form}
|
||||||
className={params.className}
|
onSubmit={onSubmit}
|
||||||
>
|
title='Project'
|
||||||
<SelectFormField control={form.control} name='stackId' label='Stack' defaultValue={stackId} placeholder={stackName} >
|
id={id}
|
||||||
{
|
className={params.className}
|
||||||
stacksSuccess ?
|
>
|
||||||
<>
|
<SelectFormField control={form.control} name='stackId' label='Stack' defaultValue={stackId} placeholder={stackName} >
|
||||||
{stacks?.map((stack) => {
|
{
|
||||||
return (<SelectItem key={stack.id} value={stack.id}> {stack.stackItems ? stack.stackItems.join("-") : "Empty Stack"} </SelectItem>)
|
stacksSuccess ?
|
||||||
})}
|
<>
|
||||||
</> :
|
{stacks?.map((stack) => {
|
||||||
<SelectItem key='placeholder' value="placeholder" />
|
return (<SelectItem key={stack.id} value={stack.id}> {stack.stackItems ? stack.stackItems.join("-") : "Empty Stack"} </SelectItem>)
|
||||||
}
|
})}
|
||||||
</SelectFormField>
|
</> :
|
||||||
<TextInputFormField control={form.control} name='title' label='Title' />
|
<SelectItem key='placeholder' value="placeholder" />
|
||||||
<SelectFormField control={form.control} name='sourceType' label='Source Type' defaultValue={'open'} placeholder='open' >
|
}
|
||||||
<SelectItem value="open"> open </SelectItem>
|
</SelectFormField>
|
||||||
<SelectItem value="closed"> closed </SelectItem>
|
<TextInputFormField control={form.control} name='title' label='Title' />
|
||||||
</SelectFormField>
|
<SelectFormField control={form.control} name='sourceType' label='Source Type' defaultValue={'open'} placeholder='open' >
|
||||||
<TextInputFormField control={form.control} label='Source Link' name='sourceLink' />
|
<SelectItem value="open"> open </SelectItem>
|
||||||
<SelectFormField control={form.control} name='releaseStatus' label='Release Status' defaultValue={'unreleased'} placeholder='unreleased' >
|
<SelectItem value="closed"> closed </SelectItem>
|
||||||
<SelectItem value="released"> released </SelectItem>
|
</SelectFormField>
|
||||||
<SelectItem value="unreleased"> unreleased </SelectItem>
|
<TextInputFormField control={form.control} label='Source Link' name='sourceLink' />
|
||||||
</SelectFormField>
|
<SelectFormField control={form.control} name='releaseStatus' label='Release Status' defaultValue={'unreleased'} placeholder='unreleased' >
|
||||||
<TextInputFormField control={form.control} label='Release Link' name='releaseLink' />
|
<SelectItem value="released"> released </SelectItem>
|
||||||
</FormScaffold>
|
<SelectItem value="unreleased"> unreleased </SelectItem>
|
||||||
|
</SelectFormField>
|
||||||
|
<TextInputFormField control={form.control} label='Release Link' name='releaseLink' />
|
||||||
|
</FormScaffold>
|
||||||
|
</FormMutationContextProvider>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
})
|
||||||
@@ -2,19 +2,16 @@
|
|||||||
import { zodResolver } from '@hookform/resolvers/zod'
|
import { zodResolver } from '@hookform/resolvers/zod'
|
||||||
import { useForm } from 'react-hook-form'
|
import { useForm } from 'react-hook-form'
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { Form } from "~/components/ui/form";
|
|
||||||
import { trpc } from "~/app/_trpc/Client";
|
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 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 type { RouterOutputs } from '~/server/routers/_app';
|
||||||
import { entitySchemas, makeOnSuccess } from '~/lib/utils';
|
import { entitySchemas, makeOnSuccess } from '~/lib/utils';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { MultiBooleanFormField } from "~/app/_components/Form/Fields"
|
import { MultiBooleanFormField } from "~/app/_components/Form/Fields"
|
||||||
import { DependentFormMessaage, FormScaffold } from '~/app/_components/Form/Components';
|
import { FormScaffold } from '~/app/_components/Form/Components';
|
||||||
import DependentText from '~/app/_components/DependentText';
|
|
||||||
import { usePathname, useRouter } from 'next/navigation';
|
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']> }) {
|
export default function CreateUpdateStackForm(params: { className?: string, entity?: IterableElement<RouterOutputs['techStack']['select']> }) {
|
||||||
const schemas = entitySchemas('techStack')
|
const schemas = entitySchemas('techStack')
|
||||||
@@ -25,6 +22,7 @@ export default function CreateUpdateStackForm(params: { className?: string, enti
|
|||||||
stackItems: params.entity ? params.entity.stackItems : [],
|
stackItems: params.entity ? params.entity.stackItems : [],
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
const [submitted, setSubmitted] = useState(false)
|
||||||
const [id, setId] = useState<string | undefined>(params.entity ? params.entity.id : undefined)
|
const [id, setId] = useState<string | undefined>(params.entity ? params.entity.id : undefined)
|
||||||
let path = usePathname()
|
let path = usePathname()
|
||||||
let router = useRouter()
|
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 updateMutation = trpc.techStack.update.useMutation({ onSuccess: makeOnSuccess('update', form) })
|
||||||
const deleteMutation = trpc.techStack.delete.useMutation({ onSuccess: makeOnSuccess('delete', form, undefined, path, router) })
|
const deleteMutation = trpc.techStack.delete.useMutation({ onSuccess: makeOnSuccess('delete', form, undefined, path, router) })
|
||||||
function onSubmit(values: z.infer<typeof schemas.insert>) {
|
function onSubmit(values: z.infer<typeof schemas.insert>) {
|
||||||
|
setSubmitted(true)
|
||||||
params.entity ?
|
params.entity ?
|
||||||
updateMutation.mutate(values) :
|
updateMutation.mutate(values) :
|
||||||
createMutation.mutate(values)
|
createMutation.mutate(values);
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<FormScaffold
|
<>
|
||||||
form={form}
|
<div data-testid={submitted ? "submitted" : ""}/>
|
||||||
createMutation={createMutation}
|
<FormMutationContextProvider value={{ createMutation: createMutation, updateMutation: updateMutation, deleteMutation: deleteMutation }}>
|
||||||
updateMutation={updateMutation}
|
<FormScaffold
|
||||||
deleteMutation={deleteMutation}
|
form={form}
|
||||||
onSubmit={onSubmit}
|
onSubmit={onSubmit}
|
||||||
title='Entry'
|
title='Entry'
|
||||||
id={id}
|
id={id}
|
||||||
className={params.className}
|
className={params.className}
|
||||||
>
|
>
|
||||||
<MultiBooleanFormField control={form.control} name='stackItems' label='Stack Items' options={stackItemEnum.enumValues} defaultValues={params.entity?.stackItems} />
|
<MultiBooleanFormField control={form.control} name='stackItems' label='Stack Items' options={stackItemEnum.enumValues} defaultValues={params.entity?.stackItems ?? [""]} />
|
||||||
</FormScaffold>
|
</FormScaffold>
|
||||||
|
</FormMutationContextProvider>
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,16 +40,20 @@ function Button({
|
|||||||
variant,
|
variant,
|
||||||
size,
|
size,
|
||||||
asChild = false,
|
asChild = false,
|
||||||
|
submit = false,
|
||||||
...props
|
...props
|
||||||
}: React.ComponentProps<"button"> &
|
}: React.ComponentProps<"button"> &
|
||||||
VariantProps<typeof buttonVariants> & {
|
VariantProps<typeof buttonVariants> & {
|
||||||
asChild?: boolean
|
asChild?: boolean
|
||||||
|
submit?: boolean
|
||||||
}) {
|
}) {
|
||||||
const Comp = asChild ? Slot : "button"
|
const Comp = asChild ? Slot : "button"
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Comp
|
<Comp
|
||||||
data-slot="button"
|
data-slot="button"
|
||||||
|
type={submit ? "submit" : props.type}
|
||||||
|
data-testid={submit ? "form-submit" : undefined}
|
||||||
className={cn(buttonVariants({ variant, size, className }))}
|
className={cn(buttonVariants({ variant, size, className }))}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { clsx, type ClassValue } from "clsx"
|
import { clsx, type ClassValue } from "clsx"
|
||||||
import { twMerge } from "tailwind-merge"
|
import { twMerge } from "tailwind-merge"
|
||||||
import { createSchemaFactory, createSelectSchema, type BuildSchema } from 'drizzle-zod'
|
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 { PgTable } from "drizzle-orm/pg-core";
|
||||||
import type { FieldValues, Path, UseFormReturn } from "react-hook-form";
|
import type { FieldValues, Path, UseFormReturn } from "react-hook-form";
|
||||||
import type { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
|
import type { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
// import postgres from "postgres";
|
// import postgres from "postgres";
|
||||||
|
|
||||||
import { env } from "~/env";
|
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
|
// * Cache the database connection in development. This avoids creating a new connection on every HMR
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import type { Entries } from "type-fest";
|
import type { Entries } from "type-fest";
|
||||||
import { publicProcedure, router } from "~/server/trpc";
|
import { publicProcedure, router } from "~/server/trpc";
|
||||||
import { db } from "~/server/db";
|
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 { isAdmin } from "~/app/actions";
|
||||||
import { TRPCError } from "@trpc/server";
|
import { TRPCError } from "@trpc/server";
|
||||||
import { entitySchemas, type Schema, type SchemaKeys } from "~/lib/utils";
|
import { entitySchemas, type Schema, type SchemaKeys } from "~/lib/utils";
|
||||||
@@ -20,6 +20,7 @@ export function trpcCrudRouterFromDrizzleEntity<T extends SchemaKeys<Schema>>(ta
|
|||||||
}
|
}
|
||||||
let r = router({
|
let r = router({
|
||||||
select: publicProcedure.input(schemas.update).query(async (opts) => {
|
select: publicProcedure.input(schemas.update).query(async (opts) => {
|
||||||
|
console.log("select with:", opts.input)
|
||||||
const { input } = opts;
|
const { input } = opts;
|
||||||
if (input === undefined) {
|
if (input === undefined) {
|
||||||
return await db.select().from(schema[table]).execute();
|
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();
|
return await db.select().from(schema[table]).execute();
|
||||||
}),
|
}),
|
||||||
update: publicProcedure.input(schemas.update).mutation(async (opts) => {
|
update: publicProcedure.input(schemas.update).mutation(async (opts) => {
|
||||||
|
console.log("update with:",opts.input)
|
||||||
let admin = await isAdmin();
|
let admin = await isAdmin();
|
||||||
if (!admin) {
|
if (!admin) {
|
||||||
throw new TRPCError(
|
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();
|
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) => {
|
insert: publicProcedure.input(schemas.insert).mutation(async (opts) => {
|
||||||
|
console.log("insert with:",opts.input)
|
||||||
let admin = await isAdmin();
|
let admin = await isAdmin();
|
||||||
if (!admin) {
|
if (!admin) {
|
||||||
throw new TRPCError(
|
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();
|
return await db.insert(schema[table]).values(input).returning().execute();
|
||||||
}),
|
}),
|
||||||
delete: publicProcedure.input(schemas.update).mutation(async (opts) => {
|
delete: publicProcedure.input(schemas.update).mutation(async (opts) => {
|
||||||
|
console.log("delete with:",opts.input)
|
||||||
let admin = await isAdmin();
|
let admin = await isAdmin();
|
||||||
if (!admin) {
|
if (!admin) {
|
||||||
throw new TRPCError(
|
throw new TRPCError(
|
||||||
|
|||||||
2
test/aliases/db.ts
Normal file
2
test/aliases/db.ts
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
import { db } from "test/db/setup";
|
||||||
|
export { db };
|
||||||
33
test/db/setup.ts
Normal file
33
test/db/setup.ts
Normal 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()
|
||||||
|
// })
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
})
|
|
||||||
9
test/trpc/GetBaseUrl.mock.ts
Normal file
9
test/trpc/GetBaseUrl.mock.ts
Normal 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}`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
0
test/trpc/portincrement.ts
Normal file
0
test/trpc/portincrement.ts
Normal file
27
test/trpc/server.ts
Normal file
27
test/trpc/server.ts
Normal 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();
|
||||||
|
// });
|
||||||
@@ -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>
|
|
||||||
)}
|
|
||||||
@@ -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
150
tscerrors.txt
Normal 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<...>...'.
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
"moduleDetection": "force",
|
"moduleDetection": "force",
|
||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"verbatimModuleSyntax": true,
|
"verbatimModuleSyntax": true,
|
||||||
|
"strictFunctionTypes": false,
|
||||||
/* Strictness */
|
/* Strictness */
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"noUncheckedIndexedAccess": true,
|
"noUncheckedIndexedAccess": true,
|
||||||
|
|||||||
@@ -3,17 +3,10 @@ import react from '@vitejs/plugin-react'
|
|||||||
import tsconfigPaths from 'vite-tsconfig-paths'
|
import tsconfigPaths from 'vite-tsconfig-paths'
|
||||||
import dotenv from 'dotenv'
|
import dotenv from 'dotenv'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
import { resolve } from 'node:path'
|
||||||
const env = dotenv.config({path: './.env'})
|
const env = dotenv.config({path: './.env'})
|
||||||
console.log('dname', __dirname)
|
|
||||||
console.log(env.error)
|
|
||||||
// console.log(env.parsed)
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [tsconfigPaths(), react()],
|
plugins: [tsconfigPaths(), react()],
|
||||||
resolve: {
|
|
||||||
alias: {
|
|
||||||
'~/app/_trpc/TrpcProvicer': path.resolve(__dirname,'./vitest.trpcProvider.mock')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
optimizeDeps: {
|
optimizeDeps: {
|
||||||
include: [
|
include: [
|
||||||
'@tanstack/react-query-next-experimental',
|
'@tanstack/react-query-next-experimental',
|
||||||
@@ -24,18 +17,25 @@ export default defineConfig({
|
|||||||
'@tanstack/react-query-next-experimental',
|
'@tanstack/react-query-next-experimental',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
'~/server/db': resolve('./test/aliases/db.ts')
|
||||||
|
}
|
||||||
|
},
|
||||||
test: {
|
test: {
|
||||||
|
// fileParallelism: false,
|
||||||
reporters: ['verbose'],
|
reporters: ['verbose'],
|
||||||
coverage: { provider: 'v8'},
|
coverage: { provider: 'v8', reporter: ['html-spa']},
|
||||||
projects: [
|
projects: [
|
||||||
{
|
{
|
||||||
extends: true,
|
extends: true,
|
||||||
test: {
|
test: {
|
||||||
|
mockReset: true,
|
||||||
name: "server",
|
name: "server",
|
||||||
setupFiles: [
|
setupFiles: [
|
||||||
|
'./test/db/setup.ts',
|
||||||
'./test/mocks/vitest.isAdmin.mock.ts',
|
'./test/mocks/vitest.isAdmin.mock.ts',
|
||||||
'./test/mocks/vitest.nextnavigation.mock.ts',
|
'./test/mocks/vitest.nextnavigation.mock.ts',
|
||||||
'./test/mocks/vitest.drizzle.mock.ts'
|
|
||||||
],
|
],
|
||||||
include: ['./src/**/*.server.test.ts'],
|
include: ['./src/**/*.server.test.ts'],
|
||||||
env: env.parsed
|
env: env.parsed
|
||||||
@@ -44,11 +44,14 @@ export default defineConfig({
|
|||||||
{
|
{
|
||||||
extends: true,
|
extends: true,
|
||||||
test: {
|
test: {
|
||||||
|
mockReset: true,
|
||||||
name: "client",
|
name: "client",
|
||||||
setupFiles: [
|
setupFiles: [
|
||||||
|
'./test/trpc/server.ts',
|
||||||
|
'./test/db/setup.ts',
|
||||||
|
'./test/trpc/GetBaseUrl.mock.ts',
|
||||||
'./test/mocks/vitest.isAdmin.mock.ts',
|
'./test/mocks/vitest.isAdmin.mock.ts',
|
||||||
'./test/mocks/vitest.nextnavigation.mock.ts',
|
'./test/mocks/vitest.nextnavigation.mock.ts',
|
||||||
'./test/mocks/vitest.drizzle.mock.ts'
|
|
||||||
],
|
],
|
||||||
include: ['./src/**/*.client.test.ts','./src/**/*.client.test.tsx'],
|
include: ['./src/**/*.client.test.ts','./src/**/*.client.test.tsx'],
|
||||||
environment: 'jsdom',
|
environment: 'jsdom',
|
||||||
|
|||||||
Reference in New Issue
Block a user