diff --git a/apps/remix/server/trpc/hono-trpc-open-api.ts b/apps/remix/server/trpc/hono-trpc-open-api.ts index 2a89d6379..ec0362910 100644 --- a/apps/remix/server/trpc/hono-trpc-open-api.ts +++ b/apps/remix/server/trpc/hono-trpc-open-api.ts @@ -1,10 +1,10 @@ import type { Context } from 'hono'; -import { createOpenApiFetchHandler } from 'trpc-to-openapi'; import { API_V2_BETA_URL } from '@documenso/lib/constants/app'; import { AppError, genericErrorCodeToTrpcErrorCodeMap } from '@documenso/lib/errors/app-error'; import { createTrpcContext } from '@documenso/trpc/server/context'; import { appRouter } from '@documenso/trpc/server/router'; +import { createOpenApiFetchHandler } from '@documenso/trpc/utils/openapi-fetch-handler'; import { handleTrpcRouterError } from '@documenso/trpc/utils/trpc-error-handler'; export const openApiTrpcServerHandler = async (c: Context) => { diff --git a/package-lock.json b/package-lock.json index ab1b56a2b..861e5038b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,13 +21,19 @@ "mupdf": "^1.0.0", "react": "^18", "typescript": "5.6.2", - "zod": "3.24.1" + "zod": "^3.25.76" }, "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", "@lingui/cli": "^5.2.0", - "@prisma/client": "^6.8.2", + "@prisma/client": "^6.18.0", + "@trpc/client": "11.7.0", + "@trpc/react-query": "11.7.0", + "@trpc/server": "11.7.0", + "@ts-rest/core": "^3.52.1", + "@ts-rest/open-api": "^3.52.1", + "@ts-rest/serverless": "^3.52.1", "dotenv": "^16.5.0", "dotenv-cli": "^8.0.0", "eslint": "^8.40.0", @@ -37,12 +43,16 @@ "nodemailer": "^6.10.1", "playwright": "1.52.0", "prettier": "^3.3.3", - "prisma": "^6.8.2", + "prisma": "^6.18.0", "prisma-extension-kysely": "^3.0.0", "prisma-kysely": "^1.8.0", "rimraf": "^5.0.1", + "superjson": "^2.2.5", + "trpc-to-openapi": "2.4.0", "turbo": "^1.9.3", - "vite": "^6.3.5" + "vite": "^6.3.5", + "zod-openapi": "^4.2.4", + "zod-prisma-types": "3.3.5" }, "engines": { "node": ">=22.0.0", @@ -7427,6 +7437,15 @@ "integrity": "sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==", "license": "MIT" }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, "node_modules/@pdf-lib/fontkit": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@pdf-lib/fontkit/-/fontkit-1.1.1.tgz", @@ -7547,9 +7566,9 @@ } }, "node_modules/@prisma/client": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.8.2.tgz", - "integrity": "sha512-5II+vbyzv4si6Yunwgkj0qT/iY0zyspttoDrL3R4BYgLdp42/d2C8xdi9vqkrYtKt9H32oFIukvyw3Koz5JoDg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.18.0.tgz", + "integrity": "sha512-jnL2I9gDnPnw4A+4h5SuNn8Gc+1mL1Z79U/3I9eE2gbxJG1oSA+62ByPW4xkeDgwE0fqMzzpAZ7IHxYnLZ4iQA==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -7569,69 +7588,57 @@ } }, "node_modules/@prisma/config": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.8.2.tgz", - "integrity": "sha512-ZJY1fF4qRBPdLQ/60wxNtX+eu89c3AkYEcP7L3jkp0IPXCNphCYxikTg55kPJLDOG6P0X+QG5tCv6CmsBRZWFQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.18.0.tgz", + "integrity": "sha512-rgFzspCpwsE+q3OF/xkp0fI2SJ3PfNe9LLMmuSVbAZ4nN66WfBiKqJKo/hLz3ysxiPQZf8h1SMf2ilqPMeWATQ==", "license": "Apache-2.0", "dependencies": { - "jiti": "2.4.2" + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.18.4", + "empathic": "2.0.0" } }, - "node_modules/@prisma/config/node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/@prisma/debug": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.8.2.tgz", - "integrity": "sha512-4muBSSUwJJ9BYth5N8tqts8JtiLT8QI/RSAzEogwEfpbYGFo9mYsInsVo8dqXdPO2+Rm5OG5q0qWDDE3nyUbVg==", - "license": "Apache-2.0" - }, - "node_modules/@prisma/dmmf": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/dmmf/-/dmmf-6.8.2.tgz", - "integrity": "sha512-okGJF/7hQZam/2wt+Y0hPyNxyY5S+L0FzAgtL932Q3YxUWHusRllrN39bCV45oF3QWY992g7rTWYdL2Rynt1qg==", - "license": "Apache-2.0" - }, "node_modules/@prisma/engines": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.8.2.tgz", - "integrity": "sha512-XqAJ//LXjqYRQ1RRabs79KOY4+v6gZOGzbcwDQl0D6n9WBKjV7qdrbd042CwSK0v0lM9MSHsbcFnU2Yn7z8Zlw==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.18.0.tgz", + "integrity": "sha512-i5RzjGF/ex6AFgqEe2o1IW8iIxJGYVQJVRau13kHPYEL1Ck8Zvwuzamqed/1iIljs5C7L+Opiz5TzSsUebkriA==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.8.2", - "@prisma/engines-version": "6.8.0-43.2060c79ba17c6bb9f5823312b6f6b7f4a845738e", - "@prisma/fetch-engine": "6.8.2", - "@prisma/get-platform": "6.8.2" + "@prisma/debug": "6.18.0", + "@prisma/engines-version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", + "@prisma/fetch-engine": "6.18.0", + "@prisma/get-platform": "6.18.0" } }, "node_modules/@prisma/engines-version": { - "version": "6.8.0-43.2060c79ba17c6bb9f5823312b6f6b7f4a845738e", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.8.0-43.2060c79ba17c6bb9f5823312b6f6b7f4a845738e.tgz", - "integrity": "sha512-Rkik9lMyHpFNGaLpPF3H5q5TQTkm/aE7DsGM5m92FZTvWQsvmi6Va8On3pWvqLHOt5aPUvFb/FeZTmphI4CPiQ==", + "version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f.tgz", + "integrity": "sha512-T7Af4QsJQnSgWN1zBbX+Cha5t4qjHRxoeoWpK4JugJzG/ipmmDMY5S+O0N1ET6sCBNVkf6lz+Y+ZNO9+wFU8pQ==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines/node_modules/@prisma/debug": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.18.0.tgz", + "integrity": "sha512-PMVPMmxPj0ps1VY75DIrT430MoOyQx9hmm174k6cmLZpcI95rAPXOQ+pp8ANQkJtNyLVDxnxVJ0QLbrm/ViBcg==", "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.8.2.tgz", - "integrity": "sha512-lCvikWOgaLOfqXGacEKSNeenvj0n3qR5QvZUOmPE2e1Eh8cMYSobxonCg9rqM6FSdTfbpqp9xwhSAOYfNqSW0g==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.18.0.tgz", + "integrity": "sha512-TdaBvTtBwP3IoqVYoGIYpD4mWlk0pJpjTJjir/xLeNWlwog7Sl3bD2J0jJ8+5+q/6RBg+acb9drsv5W6lqae7A==", "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.8.2", - "@prisma/engines-version": "6.8.0-43.2060c79ba17c6bb9f5823312b6f6b7f4a845738e", - "@prisma/get-platform": "6.8.2" + "@prisma/debug": "6.18.0", + "@prisma/engines-version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", + "@prisma/get-platform": "6.18.0" } }, - "node_modules/@prisma/generator": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/generator/-/generator-6.8.2.tgz", - "integrity": "sha512-yExkvgqiKg1WHzjYttz40g5DsOtud8RhapM0Mum6pw+wrDoQyhSAxs5NHyFCV+9VPvRd2v+jAP2CTT07bsibjw==", + "node_modules/@prisma/fetch-engine/node_modules/@prisma/debug": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.18.0.tgz", + "integrity": "sha512-PMVPMmxPj0ps1VY75DIrT430MoOyQx9hmm174k6cmLZpcI95rAPXOQ+pp8ANQkJtNyLVDxnxVJ0QLbrm/ViBcg==", "license": "Apache-2.0" }, "node_modules/@prisma/generator-helper": { @@ -7704,14 +7711,20 @@ "license": "MIT" }, "node_modules/@prisma/get-platform": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.8.2.tgz", - "integrity": "sha512-vXSxyUgX3vm1Q70QwzwkjeYfRryIvKno1SXbIqwSptKwqKzskINnDUcx85oX+ys6ooN2ATGSD0xN2UTfg6Zcow==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.18.0.tgz", + "integrity": "sha512-uXNJCJGhxTCXo2B25Ta91Rk1/Nmlqg9p7G9GKh8TPhxvAyXCvMNQoogj4JLEUy+3ku8g59cpyQIKFhqY2xO2bg==", "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.8.2" + "@prisma/debug": "6.18.0" } }, + "node_modules/@prisma/get-platform/node_modules/@prisma/debug": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.18.0.tgz", + "integrity": "sha512-PMVPMmxPj0ps1VY75DIrT430MoOyQx9hmm174k6cmLZpcI95rAPXOQ+pp8ANQkJtNyLVDxnxVJ0QLbrm/ViBcg==", + "license": "Apache-2.0" + }, "node_modules/@prisma/internals": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-5.3.1.tgz", @@ -10312,6 +10325,12 @@ "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", "license": "MIT" }, + "node_modules/@rvf/set-get": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@rvf/set-get/-/set-get-7.0.1.tgz", + "integrity": "sha512-GkTSn9K1GrTYoTUqlUs36k6nJnzjQaFBTTEIqUYmzBcsGsoJM8xG7EAx2WLHWAA4QzFjcwWUSHQ3vM3Fbw50Tg==", + "license": "MIT" + }, "node_modules/@scarf/scarf": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", @@ -11178,6 +11197,12 @@ "node": ">=18.0.0" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, "node_modules/@swagger-api/apidom-ast": { "version": "1.0.0-beta.39", "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.39.tgz", @@ -11767,9 +11792,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.59.13", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.13.tgz", - "integrity": "sha512-Oou0bBu/P8+oYjXsJQ11j+gcpLAMpqW42UlokQYEz4dE7+hOtVO9rVuolJKgEccqzvyFzqX4/zZWY+R/v1wVsQ==", + "version": "5.90.5", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.5.tgz", + "integrity": "sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==", "license": "MIT", "funding": { "type": "github", @@ -11777,12 +11802,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.59.15", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.15.tgz", - "integrity": "sha512-QbVlAkTI78wB4Mqgf2RDmgC0AOiJqer2c5k9STOOSXGv1S6ZkY37r/6UpE8DbQ2Du0ohsdoXgFNEyv+4eDoPEw==", + "version": "5.90.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.5.tgz", + "integrity": "sha512-pN+8UWpxZkEJ/Rnnj2v2Sxpx1WFlaa9L6a4UO89p6tTQbeo+m0MS8oYDjbggrR8QcTyjKoYWKS3xJQGr3ExT8Q==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.59.13" + "@tanstack/query-core": "5.90.5" }, "funding": { "type": "github", @@ -12053,45 +12078,45 @@ } }, "node_modules/@trpc/client": { - "version": "11.0.0-rc.648", - "resolved": "https://registry.npmjs.org/@trpc/client/-/client-11.0.0-rc.648.tgz", - "integrity": "sha512-k4FfLKvJwbosUH8KYyZkC50RJHYtIyJECi5WhRXsvaf9a6lgrTlcA+osq815zYcAHo7wEgR9E9UdSTrpLdAQFQ==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/@trpc/client/-/client-11.7.0.tgz", + "integrity": "sha512-VLMoA9KUIItrD/tXKLw2Hvu71V7cRMBNQhXbmm5weSkFVWdAGwLXzV5f85QPdOM8669dD+a1QbGJCK0LNBPbgQ==", "funding": [ "https://trpc.io/sponsor" ], "license": "MIT", "peerDependencies": { - "@trpc/server": "11.0.0-rc.648+77b4d8920", - "typescript": ">=5.6.2" + "@trpc/server": "11.7.0", + "typescript": ">=5.7.2" } }, "node_modules/@trpc/react-query": { - "version": "11.0.0-rc.648", - "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-11.0.0-rc.648.tgz", - "integrity": "sha512-U3H6o/aN3umEA2QNDGRsaJb6M7zrffor2NQl2UaHOiLBHuXZ3ISI2fJXay7e32s1l6z5F5PGMGwTQtUedzWI2w==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-11.7.0.tgz", + "integrity": "sha512-JxMCm1CduoCZj+0xbUXy1MihBAHxnlXQActNSJ14OT4weJa23Qj35u34gYMnIF+fs9w4r70gyqPcV/67D3Nk8Q==", "funding": [ "https://trpc.io/sponsor" ], "license": "MIT", "peerDependencies": { - "@tanstack/react-query": "^5.59.15", - "@trpc/client": "11.0.0-rc.648+77b4d8920", - "@trpc/server": "11.0.0-rc.648+77b4d8920", + "@tanstack/react-query": "^5.80.3", + "@trpc/client": "11.7.0", + "@trpc/server": "11.7.0", "react": ">=18.2.0", "react-dom": ">=18.2.0", - "typescript": ">=5.6.2" + "typescript": ">=5.7.2" } }, "node_modules/@trpc/server": { - "version": "11.0.0-rc.648", - "resolved": "https://registry.npmjs.org/@trpc/server/-/server-11.0.0-rc.648.tgz", - "integrity": "sha512-nKW7FNM+QZrY/CVGlX3hFNIdUvbw6pwSJ+HzEF8GIeSJDKLHK7Ke1QJGI2mRW6oF9dCKMBXfuLaYY2dXfjfn7Q==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/@trpc/server/-/server-11.7.0.tgz", + "integrity": "sha512-BPpr3roKWpZnS92fWCg29e6hEwn1kzH8m65yXRkJfFqemgwckiyJ15NgR8zTe7RcMAeBEPpvqyAfL71rwaSJJw==", "funding": [ "https://trpc.io/sponsor" ], "license": "MIT", "peerDependencies": { - "typescript": ">=5.6.2" + "typescript": ">=5.7.2" } }, "node_modules/@ts-rest/core": { @@ -13729,6 +13754,12 @@ "node": ">=0.10.0" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, "node_modules/asn1js": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.6.tgz", @@ -14387,6 +14418,77 @@ "node": ">= 0.8" } }, + "node_modules/c12": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", + "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/c12/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/c12/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -14741,6 +14843,15 @@ "node": ">=8" } }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, "node_modules/cjs-module-lexer": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", @@ -15356,9 +15467,9 @@ } }, "node_modules/code-block-writer": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", - "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", "license": "MIT" }, "node_modules/color": { @@ -15620,6 +15731,12 @@ "node": ">=0.10.0" } }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "license": "MIT" + }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -15636,6 +15753,15 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -15738,15 +15864,15 @@ "license": "MIT" }, "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", "license": "MIT", "dependencies": { - "is-what": "^4.1.8" + "is-what": "^5.2.0" }, "engines": { - "node": ">=12.13" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/mesqueeb" @@ -16753,6 +16879,15 @@ "node": ">=0.10.0" } }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -17013,6 +17148,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -17147,10 +17292,9 @@ } }, "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", - "dev": true, + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -17346,6 +17490,16 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/effect": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", + "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.155", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", @@ -17364,6 +17518,15 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -18701,6 +18864,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "license": "MIT" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -18734,6 +18903,28 @@ "node": ">=4" } }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/fast-copy": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", @@ -19210,6 +19401,23 @@ "node": ">=0.4.x" } }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -19680,6 +19888,29 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/giget/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, "node_modules/git-hooks-list": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.1.1.tgz", @@ -19949,19 +20180,19 @@ } }, "node_modules/h3": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.3.tgz", - "integrity": "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz", + "integrity": "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==", "license": "MIT", "dependencies": { "cookie-es": "^1.2.2", - "crossws": "^0.3.4", + "crossws": "^0.3.3", "defu": "^6.1.4", - "destr": "^2.0.5", + "destr": "^2.0.3", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", - "ufo": "^1.6.1", + "ufo": "^1.5.4", "uncrypto": "^0.1.3" } }, @@ -22021,12 +22252,12 @@ } }, "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", "license": "MIT", "engines": { - "node": ">=12.13" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/mesqueeb" @@ -23109,12 +23340,6 @@ "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", "license": "MIT" }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -26181,6 +26406,12 @@ "url": "https://opencollective.com/node-fetch" } }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", @@ -26203,9 +26434,9 @@ } }, "node_modules/node-mock-http": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.0.tgz", - "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.3.tgz", + "integrity": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==", "license": "MIT" }, "node_modules/node-releases": { @@ -26495,6 +26726,31 @@ "js-sdsl": "4.3.0" } }, + "node_modules/nypm": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", + "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.2", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/nypm/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -26643,6 +26899,12 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT" }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, "node_modules/on-exit-leak-free": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", @@ -27220,6 +27482,12 @@ "url": "https://ko-fi.com/killymxi" } }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, "node_modules/perfect-freehand": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.2.tgz", @@ -27608,6 +27876,23 @@ "node": ">=8" } }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, "node_modules/pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", @@ -28295,14 +28580,14 @@ } }, "node_modules/prisma": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.8.2.tgz", - "integrity": "sha512-JNricTXQxzDtRS7lCGGOB4g5DJ91eg3nozdubXze3LpcMl1oWwcFddrj++Up3jnRE6X/3gB/xz3V+ecBk/eEGA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.18.0.tgz", + "integrity": "sha512-bXWy3vTk8mnRmT+SLyZBQoC2vtV9Z8u7OHvEu+aULYxwiop/CPiFZ+F56KsNRNf35jw+8wcu8pmLsjxpBxAO9g==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "6.8.2", - "@prisma/engines": "6.8.2" + "@prisma/config": "6.18.0", + "@prisma/engines": "6.18.0" }, "bin": { "prisma": "build/index.js" @@ -28328,40 +28613,6 @@ "@prisma/client": "latest" } }, - "node_modules/prisma-json-types-generator": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/prisma-json-types-generator/-/prisma-json-types-generator-3.4.1.tgz", - "integrity": "sha512-VWsuvCyHyOHoyyuishw9hPjoDYx9+sa+v0E0ggHheYkQ5N9tt6EXd9AYaR181WWMG+K+1Ua2tW0yEsl52pe9ew==", - "license": "MIT", - "dependencies": { - "@prisma/generator-helper": "^6.7.0", - "tslib": "^2.8.1" - }, - "bin": { - "prisma-json-types-generator": "index.js" - }, - "engines": { - "node": ">=14.0" - }, - "funding": { - "url": "https://github.com/arthurfiorette/prisma-json-types-generator?sponsor=1" - }, - "peerDependencies": { - "prisma": "^6.7", - "typescript": "^5.8" - } - }, - "node_modules/prisma-json-types-generator/node_modules/@prisma/generator-helper": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-6.8.2.tgz", - "integrity": "sha512-KBLW47sbwFBKKYMiICIAEWsG6TdpPapPT7e7hpmpF3xMgYAm6YIXu4JGwfQVDY9Vbcb+0vPdPdSEQtInYOOe5g==", - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.8.2", - "@prisma/dmmf": "6.8.2", - "@prisma/generator": "6.8.2" - } - }, "node_modules/prisma-kysely": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/prisma-kysely/-/prisma-kysely-1.8.0.tgz", @@ -28606,6 +28857,22 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/pvtsutils": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", @@ -28795,6 +29062,16 @@ "node": ">=0.10.0" } }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, "node_modules/re-resizable": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.11.2.tgz", @@ -32568,15 +32845,15 @@ } }, "node_modules/superjson": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.3.tgz", - "integrity": "sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.5.tgz", + "integrity": "sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==", "license": "MIT", "dependencies": { - "copy-anything": "^3.0.2" + "copy-anything": "^4" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/supports-color": { @@ -33087,6 +33364,12 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", @@ -33397,9 +33680,9 @@ } }, "node_modules/trpc-to-openapi": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/trpc-to-openapi/-/trpc-to-openapi-2.0.4.tgz", - "integrity": "sha512-jhsTv2oOuZwyKXCSGTXPXRNE6ArT/ArdWTHgxROZRVyikUm/ImLszFzh4jV19J7OVu/6qRfmIihwE3ZY/ZdeVg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/trpc-to-openapi/-/trpc-to-openapi-2.4.0.tgz", + "integrity": "sha512-B6xrwOC3Ab0q1BWD/QbJzK4OUpCLoT02hAzshSUXEuIZGcJZkMG/OJ4/3gd20dyr8aI+CrFirpWKRIo7JmHbMQ==", "license": "MIT", "workspaces": [ ".", @@ -33412,18 +33695,17 @@ "examples/with-nuxtjs" ], "dependencies": { - "co-body": "^6.1.0", - "h3": "^1.6.4", - "lodash.clonedeep": "^4.5.0", - "openapi3-ts": "4.3.3", - "zod-openapi": "^2.19.0" + "co-body": "6.2.0", + "h3": "1.15.1", + "openapi3-ts": "4.4.0" }, "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "4.6.1" }, "peerDependencies": { - "@trpc/server": "^11.0.0-rc.648", - "zod": "^3.23.8" + "@trpc/server": "^11.1.0", + "zod": "^3.23.8", + "zod-openapi": "4.2.4" } }, "node_modules/trpc-to-openapi/node_modules/@rollup/rollup-linux-x64-gnu": { @@ -33440,12 +33722,12 @@ ] }, "node_modules/trpc-to-openapi/node_modules/openapi3-ts": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.3.3.tgz", - "integrity": "sha512-LKkzBGJcZ6wdvkKGMoSvpK+0cbN5Xc3XuYkJskO+vjEQWJgs1kgtyUk0pjf8KwPuysv323Er62F5P17XQl96Qg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.4.0.tgz", + "integrity": "sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==", "license": "MIT", "dependencies": { - "yaml": "^2.4.5" + "yaml": "^2.5.0" } }, "node_modules/ts-api-utils": { @@ -36088,54 +36370,86 @@ } }, "node_modules/zod": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/zod-form-data": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/zod-form-data/-/zod-form-data-2.0.8.tgz", + "integrity": "sha512-X31GkEc8uk5/L387L4TVI1z7obBbN/0MRHBHfHW3uMOWkVJeSsa+grvkTvY9qyFbNshKEnqK+jLJNlY+d7jpLw==", + "license": "MIT", + "dependencies": { + "@rvf/set-get": "^7.0.0" + }, + "peerDependencies": { + "zod": ">= 3.11.0" + } + }, "node_modules/zod-openapi": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/zod-openapi/-/zod-openapi-2.19.0.tgz", - "integrity": "sha512-OUAAyBDPPwZ9u61i4k/LieXUzP2re8kFjqdNh2AvHjsyi/aRNz9leDAtMGcSoSzUT5xUeQoACJufBI6FzzZyxA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/zod-openapi/-/zod-openapi-4.2.4.tgz", + "integrity": "sha512-tsrQpbpqFCXqVXUzi3TPwFhuMtLN3oNZobOtYnK6/5VkXsNdnIgyNr4r8no4wmYluaxzN3F7iS+8xCW8BmMQ8g==", "license": "MIT", "engines": { - "node": ">=16.11" + "node": ">=18" }, "peerDependencies": { "zod": "^3.21.4" } }, "node_modules/zod-prisma-types": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/zod-prisma-types/-/zod-prisma-types-3.2.4.tgz", - "integrity": "sha512-S4spVBMJAmecLv+aLyRhXK26qW9nWwcsOf1H1fRcEmiI8DPbftZ99u0fhqHlymuTpmMcUpuKxcNNOIqNY0ScSQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/zod-prisma-types/-/zod-prisma-types-3.3.5.tgz", + "integrity": "sha512-PDuRRCdX1d6ch6UclNvrqM1SLb2qvuaQPvZT/OHRrcxOQqQUnCz009aBc1uxuwMho1+d42TTDCQr+HPXhTSJtQ==", "license": "MIT", "dependencies": { - "@prisma/generator-helper": "^6.3.0", - "code-block-writer": "^12.0.0", + "@prisma/dmmf": "^6.16.3", + "@prisma/generator-helper": "^6.16.3", + "code-block-writer": "^13.0.3", "lodash": "^4.17.21", - "zod": "^3.24.1" + "zod": "^4.1.11" }, "bin": { "zod-prisma-types": "dist/bin.js" }, "peerDependencies": { "@prisma/client": "^4.x.x || ^5.x.x || ^6.x.x", - "prisma": "^4.x.x || ^5.x.x || ^6.x.x" + "prisma": "^4.x.x || ^5.x.x || ^6.x.x", + "zod": "^3.25.0 || ^4.0.0" } }, + "node_modules/zod-prisma-types/node_modules/@prisma/debug": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.18.0.tgz", + "integrity": "sha512-PMVPMmxPj0ps1VY75DIrT430MoOyQx9hmm174k6cmLZpcI95rAPXOQ+pp8ANQkJtNyLVDxnxVJ0QLbrm/ViBcg==", + "license": "Apache-2.0" + }, + "node_modules/zod-prisma-types/node_modules/@prisma/dmmf": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/dmmf/-/dmmf-6.18.0.tgz", + "integrity": "sha512-x0ItbLDxAnciEMFnGUm90Bkpzx2ja5Lp8Lz+9UkepIClZOMC4WvtMUHaMMfCFqfoBb+KUbxa/xV+FJ6EAaw4wQ==", + "license": "Apache-2.0" + }, + "node_modules/zod-prisma-types/node_modules/@prisma/generator": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/generator/-/generator-6.18.0.tgz", + "integrity": "sha512-8Sz9z8d/X/42uL07qYF4no2hnSSMPk8g6+w0zpINCN7lvnILby5b56xA0uPKRFfR3Wfn3NtFLnyEpMQE9fXeeg==", + "license": "Apache-2.0" + }, "node_modules/zod-prisma-types/node_modules/@prisma/generator-helper": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-6.8.2.tgz", - "integrity": "sha512-KBLW47sbwFBKKYMiICIAEWsG6TdpPapPT7e7hpmpF3xMgYAm6YIXu4JGwfQVDY9Vbcb+0vPdPdSEQtInYOOe5g==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-6.18.0.tgz", + "integrity": "sha512-kmlCDRRewLwBkHpkAjzyuNHD5ISlDLzUTcTsZbwmjDilQVt/S72xvvCAa+hxY16APTkqbtDYn3p7zL/XFO+C0A==", "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.8.2", - "@prisma/dmmf": "6.8.2", - "@prisma/generator": "6.8.2" + "@prisma/debug": "6.18.0", + "@prisma/dmmf": "6.18.0", + "@prisma/generator": "6.18.0" } }, "node_modules/zwitch": { @@ -36155,15 +36469,15 @@ "dependencies": { "@documenso/lib": "*", "@documenso/prisma": "*", - "@ts-rest/core": "^3.30.5", - "@ts-rest/open-api": "^3.33.0", - "@ts-rest/serverless": "^3.30.5", + "@ts-rest/core": "^3.52.0", + "@ts-rest/open-api": "^3.52.0", + "@ts-rest/serverless": "^3.52.0", "@types/swagger-ui-react": "^5.18.0", "luxon": "^3.4.0", - "superjson": "^1.13.1", + "superjson": "^2.2.5", "swagger-ui-react": "^5.21.0", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76" } }, "packages/api/node_modules/ts-pattern": { @@ -36384,7 +36698,7 @@ "luxon": "^3.5.0", "nanoid": "^5.1.5", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76" } }, "packages/auth/node_modules/ts-pattern": { @@ -36404,7 +36718,7 @@ "micro": "^10.0.1", "react": "^18", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76" } }, "packages/ee/node_modules/ts-pattern": { @@ -36734,7 +37048,7 @@ "skia-canvas": "^3.0.8", "stripe": "^12.7.0", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76" }, "devDependencies": { "@playwright/browser-chromium": "1.52.0", @@ -36764,14 +37078,14 @@ "version": "0.0.0", "license": "MIT", "dependencies": { - "@prisma/client": "^6.8.2", + "@prisma/client": "^6.18.0", "kysely": "0.26.3", - "prisma": "^6.8.2", + "prisma": "^6.18.0", "prisma-extension-kysely": "^3.0.0", - "prisma-json-types-generator": "^3.2.2", + "prisma-json-types-generator": "^3.6.2", "prisma-kysely": "^1.8.0", "ts-pattern": "^5.0.6", - "zod-prisma-types": "3.2.4" + "zod-prisma-types": "3.3.5" }, "devDependencies": { "dotenv": "^16.5.0", @@ -36780,6 +37094,72 @@ "typescript": "5.6.2" } }, + "packages/prisma/node_modules/@prisma/debug": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.18.0.tgz", + "integrity": "sha512-PMVPMmxPj0ps1VY75DIrT430MoOyQx9hmm174k6cmLZpcI95rAPXOQ+pp8ANQkJtNyLVDxnxVJ0QLbrm/ViBcg==", + "license": "Apache-2.0" + }, + "packages/prisma/node_modules/@prisma/dmmf": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/dmmf/-/dmmf-6.18.0.tgz", + "integrity": "sha512-x0ItbLDxAnciEMFnGUm90Bkpzx2ja5Lp8Lz+9UkepIClZOMC4WvtMUHaMMfCFqfoBb+KUbxa/xV+FJ6EAaw4wQ==", + "license": "Apache-2.0" + }, + "packages/prisma/node_modules/@prisma/generator": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/generator/-/generator-6.18.0.tgz", + "integrity": "sha512-8Sz9z8d/X/42uL07qYF4no2hnSSMPk8g6+w0zpINCN7lvnILby5b56xA0uPKRFfR3Wfn3NtFLnyEpMQE9fXeeg==", + "license": "Apache-2.0" + }, + "packages/prisma/node_modules/@prisma/generator-helper": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-6.18.0.tgz", + "integrity": "sha512-kmlCDRRewLwBkHpkAjzyuNHD5ISlDLzUTcTsZbwmjDilQVt/S72xvvCAa+hxY16APTkqbtDYn3p7zL/XFO+C0A==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.18.0", + "@prisma/dmmf": "6.18.0", + "@prisma/generator": "6.18.0" + } + }, + "packages/prisma/node_modules/prisma-json-types-generator": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prisma-json-types-generator/-/prisma-json-types-generator-3.6.2.tgz", + "integrity": "sha512-WX/oENQ0S74r/Wgd2uuHT5i3KbnwLFCP2Fq5ISzrXkus/htOC4uCaQPYuGP2m/wSeKZZCw1RxptTlD+ib7Ht/A==", + "license": "MIT", + "dependencies": { + "@prisma/generator-helper": "^6.16.1", + "semver": "^7.7.2", + "tslib": "^2.8.1" + }, + "bin": { + "prisma-json-types-generator": "index.js" + }, + "engines": { + "node": ">=14.0" + }, + "funding": { + "url": "https://github.com/arthurfiorette/prisma-json-types-generator?sponsor=1" + }, + "peerDependencies": { + "@prisma/client": "^6.14", + "prisma": "^6.14", + "typescript": "^5.9.2" + } + }, + "packages/prisma/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "packages/prisma/node_modules/ts-pattern": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.7.1.tgz", @@ -37155,22 +37535,38 @@ "dependencies": { "@documenso/lib": "*", "@documenso/prisma": "*", - "@tanstack/react-query": "5.59.15", - "@trpc/client": "11.0.0-rc.648", - "@trpc/react-query": "11.0.0-rc.648", - "@trpc/server": "11.0.0-rc.648", - "@ts-rest/core": "^3.30.5", + "@tanstack/react-query": "5.90.5", + "@trpc/client": "11.7.0", + "@trpc/react-query": "11.7.0", + "@trpc/server": "11.7.0", + "@ts-rest/core": "^3.52.0", + "formidable": "^3.5.4", "luxon": "^3.4.0", - "superjson": "^1.13.1", - "trpc-to-openapi": "2.0.4", + "superjson": "^2.2.5", + "trpc-to-openapi": "2.4.0", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76", + "zod-form-data": "^2.0.8", + "zod-openapi": "^4.2.4" + }, + "devDependencies": { + "@types/formidable": "^3.4.6" + } + }, + "packages/trpc/node_modules/@types/formidable": { + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-3.4.6.tgz", + "integrity": "sha512-LI4Hk+KNsM5q7br4oMVoaWeb+gUqJpz1N8+Y2Q6Cz9cVH33ybahRKUWaRmMboVlkwSbOUGgwc/pEkS7yMSzoWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, "packages/trpc/node_modules/ts-pattern": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.7.1.tgz", - "integrity": "sha512-EGs8PguQqAAUIcQfK4E9xdXxB6s2GK4sJfT/vcc9V1ELIvC4LH/zXu2t/5fajtv6oiRCxdv7BgtVK3vWgROxag==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz", + "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==", "license": "MIT" }, "packages/tsconfig": { @@ -37235,7 +37631,7 @@ "tailwind-merge": "^1.12.0", "tailwindcss-animate": "^1.0.5", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76" }, "devDependencies": { "@documenso/tailwind-config": "*", diff --git a/package.json b/package.json index 1d75e7239..149ec72fe 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", "@lingui/cli": "^5.2.0", - "@prisma/client": "^6.8.2", + "@prisma/client": "^6.18.0", "dotenv": "^16.5.0", "dotenv-cli": "^8.0.0", "eslint": "^8.40.0", @@ -54,11 +54,21 @@ "nodemailer": "^6.10.1", "playwright": "1.52.0", "prettier": "^3.3.3", - "prisma": "^6.8.2", + "prisma": "^6.18.0", "prisma-extension-kysely": "^3.0.0", "prisma-kysely": "^1.8.0", "rimraf": "^5.0.1", "turbo": "^1.9.3", + "@trpc/client": "11.7.0", + "@trpc/react-query": "11.7.0", + "@trpc/server": "11.7.0", + "superjson": "^2.2.5", + "trpc-to-openapi": "2.4.0", + "zod-openapi": "^4.2.4", + "@ts-rest/core": "^3.52.1", + "@ts-rest/open-api": "^3.52.1", + "@ts-rest/serverless": "^3.52.1", + "zod-prisma-types": "3.3.5", "vite": "^6.3.5" }, "name": "@documenso/root", @@ -76,12 +86,12 @@ "mupdf": "^1.0.0", "react": "^18", "typescript": "5.6.2", - "zod": "3.24.1" + "zod": "^3.25.76" }, "overrides": { - "zod": "3.24.1" + "zod": "^3.25.76" }, "trigger.dev": { "endpointId": "documenso-app" } -} +} \ No newline at end of file diff --git a/packages/api/package.json b/packages/api/package.json index 437198247..e68af4616 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -17,14 +17,14 @@ "dependencies": { "@documenso/lib": "*", "@documenso/prisma": "*", - "@ts-rest/core": "^3.30.5", - "@ts-rest/open-api": "^3.33.0", - "@ts-rest/serverless": "^3.30.5", + "@ts-rest/core": "^3.52.0", + "@ts-rest/open-api": "^3.52.0", + "@ts-rest/serverless": "^3.52.0", "@types/swagger-ui-react": "^5.18.0", "luxon": "^3.4.0", - "superjson": "^1.13.1", + "superjson": "^2.2.5", "swagger-ui-react": "^5.21.0", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76" } } \ No newline at end of file diff --git a/packages/auth/package.json b/packages/auth/package.json index 41090db70..7f612e06b 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -20,6 +20,6 @@ "luxon": "^3.5.0", "nanoid": "^5.1.5", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76" } } \ No newline at end of file diff --git a/packages/ee/package.json b/packages/ee/package.json index 4dc669053..4578bc5e9 100644 --- a/packages/ee/package.json +++ b/packages/ee/package.json @@ -19,6 +19,6 @@ "micro": "^10.0.1", "react": "^18", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76" } } \ No newline at end of file diff --git a/packages/lib/package.json b/packages/lib/package.json index eaab3057b..dfef560cc 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -55,11 +55,11 @@ "skia-canvas": "^3.0.8", "stripe": "^12.7.0", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76" }, "devDependencies": { "@playwright/browser-chromium": "1.52.0", "@types/luxon": "^3.3.1", "@types/pg": "^8.11.4" } -} +} \ No newline at end of file diff --git a/packages/prisma/package.json b/packages/prisma/package.json index 4f37e020b..166b70f81 100644 --- a/packages/prisma/package.json +++ b/packages/prisma/package.json @@ -21,14 +21,14 @@ "seed": "tsx ./seed-database.ts" }, "dependencies": { - "@prisma/client": "^6.8.2", + "@prisma/client": "^6.18.0", "kysely": "0.26.3", - "prisma": "^6.8.2", + "prisma": "^6.18.0", "prisma-extension-kysely": "^3.0.0", "prisma-kysely": "^1.8.0", - "prisma-json-types-generator": "^3.2.2", + "prisma-json-types-generator": "^3.6.2", "ts-pattern": "^5.0.6", - "zod-prisma-types": "3.2.4" + "zod-prisma-types": "3.3.5" }, "devDependencies": { "dotenv": "^16.5.0", diff --git a/packages/trpc/client/index.ts b/packages/trpc/client/index.ts index 5f0e37ab6..ac8e62fef 100644 --- a/packages/trpc/client/index.ts +++ b/packages/trpc/client/index.ts @@ -1,17 +1,23 @@ -import { createTRPCClient, httpBatchLink, httpLink, splitLink } from '@trpc/client'; -import SuperJSON from 'superjson'; +import { + createTRPCClient, + httpBatchLink, + httpLink, + isNonJsonSerializable, + splitLink, +} from '@trpc/client'; import { getBaseUrl } from '@documenso/lib/universal/get-base-url'; import type { AppRouter } from '../server/router'; +import { dataTransformer } from '../utils/data-transformer'; export const trpc = createTRPCClient({ links: [ splitLink({ - condition: (op) => op.context.skipBatch === true, + condition: (op) => op.context.skipBatch === true || isNonJsonSerializable(op.input), true: httpLink({ url: `${getBaseUrl()}/api/trpc`, - transformer: SuperJSON, + transformer: dataTransformer, headers: (opts) => { if (typeof opts.op.context.teamId === 'string') { return { @@ -24,7 +30,7 @@ export const trpc = createTRPCClient({ }), false: httpBatchLink({ url: `${getBaseUrl()}/api/trpc`, - transformer: SuperJSON, + transformer: dataTransformer, headers: (opts) => { const operationWithTeamId = opts.opList.find( (op) => op.context.teamId && typeof op.context.teamId === 'string', diff --git a/packages/trpc/package.json b/packages/trpc/package.json index 891c0ab00..34945fae4 100644 --- a/packages/trpc/package.json +++ b/packages/trpc/package.json @@ -12,15 +12,21 @@ "dependencies": { "@documenso/lib": "*", "@documenso/prisma": "*", - "@tanstack/react-query": "5.59.15", - "@trpc/client": "11.0.0-rc.648", - "@trpc/react-query": "11.0.0-rc.648", - "@trpc/server": "11.0.0-rc.648", - "@ts-rest/core": "^3.30.5", + "@tanstack/react-query": "5.90.5", + "@trpc/client": "11.7.0", + "@trpc/react-query": "11.7.0", + "@trpc/server": "11.7.0", + "@ts-rest/core": "^3.52.0", + "formidable": "^3.5.4", "luxon": "^3.4.0", - "superjson": "^1.13.1", - "trpc-to-openapi": "2.0.4", + "superjson": "^2.2.5", + "trpc-to-openapi": "2.4.0", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76", + "zod-form-data": "^2.0.8", + "zod-openapi": "^4.2.4" + }, + "devDependencies": { + "@types/formidable": "^3.4.6" } } diff --git a/packages/trpc/react/index.tsx b/packages/trpc/react/index.tsx index 69c485e2c..087fc5626 100644 --- a/packages/trpc/react/index.tsx +++ b/packages/trpc/react/index.tsx @@ -1,13 +1,13 @@ import { useMemo, useState } from 'react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { httpBatchLink, httpLink, splitLink } from '@trpc/client'; +import { httpBatchLink, httpLink, isNonJsonSerializable, splitLink } from '@trpc/client'; import { createTRPCReact } from '@trpc/react-query'; -import SuperJSON from 'superjson'; import { getBaseUrl } from '@documenso/lib/universal/get-base-url'; import type { AppRouter } from '../server/router'; +import { dataTransformer } from '../utils/data-transformer'; export { getQueryKey } from '@trpc/react-query'; @@ -44,16 +44,16 @@ export function TrpcProvider({ children, headers }: TrpcProviderProps) { trpc.createClient({ links: [ splitLink({ - condition: (op) => op.context.skipBatch === true, + condition: (op) => op.context.skipBatch === true || isNonJsonSerializable(op.input), true: httpLink({ url: `${getBaseUrl()}/api/trpc`, headers, - transformer: SuperJSON, + transformer: dataTransformer, }), false: httpBatchLink({ url: `${getBaseUrl()}/api/trpc`, headers, - transformer: SuperJSON, + transformer: dataTransformer, }), }), ], diff --git a/packages/trpc/server/document-router/create-document-formdata.ts b/packages/trpc/server/document-router/create-document-formdata.ts new file mode 100644 index 000000000..8a3baa8ed --- /dev/null +++ b/packages/trpc/server/document-router/create-document-formdata.ts @@ -0,0 +1,136 @@ +import { EnvelopeType } from '@prisma/client'; + +import { getServerLimits } from '@documenso/ee/server-only/limits/server'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { createEnvelope } from '@documenso/lib/server-only/envelope/create-envelope'; +import { putPdfFileServerSide } from '@documenso/lib/universal/upload/put-file.server'; +import { mapSecondaryIdToDocumentId } from '@documenso/lib/utils/envelope'; +import { prisma } from '@documenso/prisma'; + +import { authenticatedProcedure } from '../trpc'; +import { + ZCreateDocumentFormDataRequestSchema, + ZCreateDocumentFormDataResponseSchema, + createDocumentFormDataMeta, +} from './create-document-formdata.types'; + +/** + * Temporary endpoint for V2 Beta until we allow passthrough documents on create. + * + * @public + */ +export const createDocumentFormDataRoute = authenticatedProcedure + .meta(createDocumentFormDataMeta) + .input(ZCreateDocumentFormDataRequestSchema) + .output(ZCreateDocumentFormDataResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId, user } = ctx; + + const { payload, file } = input; + + const { + title, + externalId, + visibility, + globalAccessAuth, + globalActionAuth, + recipients, + meta, + folderId, + attachments, + } = payload; + + const { remaining } = await getServerLimits({ userId: user.id, teamId }); + + if (remaining.documents <= 0) { + throw new AppError(AppErrorCode.LIMIT_EXCEEDED, { + message: 'You have reached your document limit for this month. Please upgrade your plan.', + statusCode: 400, + }); + } + + const documentData = await putPdfFileServerSide(file); + + const createdEnvelope = await createEnvelope({ + userId: ctx.user.id, + teamId, + normalizePdf: false, // Not normalizing because of presigned URL. + internalVersion: 1, + data: { + type: EnvelopeType.DOCUMENT, + title, + externalId, + visibility, + globalAccessAuth, + globalActionAuth, + recipients: (recipients || []).map((recipient) => ({ + ...recipient, + fields: (recipient.fields || []).map((field) => ({ + ...field, + page: field.pageNumber, + positionX: field.pageX, + positionY: field.pageY, + documentDataId: documentData.id, + })), + })), + folderId, + envelopeItems: [ + { + // If you ever allow more than 1 in this endpoint, make sure to use `maximumEnvelopeItemCount` to limit it. + documentDataId: documentData.id, + }, + ], + }, + attachments, + meta: { + ...meta, + emailSettings: meta?.emailSettings ?? undefined, + }, + requestMetadata: ctx.metadata, + }); + + const envelopeItems = await prisma.envelopeItem.findMany({ + where: { + envelopeId: createdEnvelope.id, + }, + include: { + documentData: true, + }, + }); + + const legacyDocumentId = mapSecondaryIdToDocumentId(createdEnvelope.secondaryId); + + const firstDocumentData = envelopeItems[0].documentData; + + if (!firstDocumentData) { + throw new Error('Document data not found'); + } + + return { + document: { + ...createdEnvelope, + envelopeId: createdEnvelope.id, + documentDataId: firstDocumentData.id, + documentData: { + ...firstDocumentData, + envelopeItemId: envelopeItems[0].id, + }, + documentMeta: { + ...createdEnvelope.documentMeta, + documentId: legacyDocumentId, + }, + id: legacyDocumentId, + fields: createdEnvelope.fields.map((field) => ({ + ...field, + documentId: legacyDocumentId, + templateId: null, + })), + recipients: createdEnvelope.recipients.map((recipient) => ({ + ...recipient, + documentId: legacyDocumentId, + templateId: null, + })), + }, + folder: createdEnvelope.folder, // Todo: Remove this prior to api-v2 release. + }; + }); diff --git a/packages/trpc/server/document-router/create-document-formdata.types.ts b/packages/trpc/server/document-router/create-document-formdata.types.ts new file mode 100644 index 000000000..6c308795f --- /dev/null +++ b/packages/trpc/server/document-router/create-document-formdata.types.ts @@ -0,0 +1,97 @@ +import { z } from 'zod'; +import { zfd } from 'zod-form-data'; + +import { ZDocumentSchema } from '@documenso/lib/types/document'; +import { + ZDocumentAccessAuthTypesSchema, + ZDocumentActionAuthTypesSchema, +} from '@documenso/lib/types/document-auth'; +import { ZDocumentFormValuesSchema } from '@documenso/lib/types/document-form-values'; +import { ZDocumentMetaCreateSchema } from '@documenso/lib/types/document-meta'; +import { ZEnvelopeAttachmentTypeSchema } from '@documenso/lib/types/envelope-attachment'; +import { + ZFieldHeightSchema, + ZFieldPageNumberSchema, + ZFieldPageXSchema, + ZFieldPageYSchema, + ZFieldWidthSchema, +} from '@documenso/lib/types/field'; +import { ZFieldAndMetaSchema } from '@documenso/lib/types/field-meta'; + +import { zodFormData } from '../../utils/zod-form-data'; +import { ZCreateRecipientSchema } from '../recipient-router/schema'; +import type { TrpcRouteMeta } from '../trpc'; +import { + ZDocumentExternalIdSchema, + ZDocumentTitleSchema, + ZDocumentVisibilitySchema, +} from './schema'; + +export const createDocumentFormDataMeta: TrpcRouteMeta = { + openapi: { + method: 'POST', + path: '/document/create/formdata', + contentTypes: ['multipart/form-data'], + summary: 'Create document', + description: 'Create a document using form data.', + tags: ['Document'], + }, +}; + +const ZCreateDocumentFormDataPayloadRequestSchema = z.object({ + title: ZDocumentTitleSchema, + externalId: ZDocumentExternalIdSchema.optional(), + visibility: ZDocumentVisibilitySchema.optional(), + globalAccessAuth: z.array(ZDocumentAccessAuthTypesSchema).optional(), + globalActionAuth: z.array(ZDocumentActionAuthTypesSchema).optional(), + formValues: ZDocumentFormValuesSchema.optional(), + folderId: z + .string() + .describe( + 'The ID of the folder to create the document in. If not provided, the document will be created in the root folder.', + ) + .optional(), + recipients: z + .array( + ZCreateRecipientSchema.extend({ + fields: ZFieldAndMetaSchema.and( + z.object({ + pageNumber: ZFieldPageNumberSchema, + pageX: ZFieldPageXSchema, + pageY: ZFieldPageYSchema, + width: ZFieldWidthSchema, + height: ZFieldHeightSchema, + }), + ) + .array() + .optional(), + }), + ) + + .optional(), + attachments: z + .array( + z.object({ + label: z.string().min(1, 'Label is required'), + data: z.string().url('Must be a valid URL'), + type: ZEnvelopeAttachmentTypeSchema.optional().default('link'), + }), + ) + .optional(), + meta: ZDocumentMetaCreateSchema.optional(), +}); + +// !: Can't use zfd.formData() here because it receives `undefined` +// !: somewhere in the pipeline of our openapi schema generation and throws +// !: an error. +export const ZCreateDocumentFormDataRequestSchema = zodFormData({ + payload: zfd.json(ZCreateDocumentFormDataPayloadRequestSchema), + file: zfd.file(), +}); + +export const ZCreateDocumentFormDataResponseSchema = z.object({ + document: ZDocumentSchema, +}); + +export type TCreateDocumentFormDataRequest = z.infer; +export type TCreateDocumentFormDataResponse = z.infer; diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index f5d34a141..6b67eba63 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -5,6 +5,7 @@ import { deleteAttachmentRoute } from './attachment/delete-attachment'; import { findAttachmentsRoute } from './attachment/find-attachments'; import { updateAttachmentRoute } from './attachment/update-attachment'; import { createDocumentRoute } from './create-document'; +import { createDocumentFormDataRoute } from './create-document-formdata'; import { createDocumentTemporaryRoute } from './create-document-temporary'; import { deleteDocumentRoute } from './delete-document'; import { distributeDocumentRoute } from './distribute-document'; @@ -40,6 +41,7 @@ export const documentRouter = router({ // Temporary v2 beta routes to be removed once V2 is fully released. download: downloadDocumentRoute, createDocumentTemporary: createDocumentTemporaryRoute, + createDocumentFormData: createDocumentFormDataRoute, // Internal document routes for custom frontend requests. getDocumentByToken: getDocumentByTokenRoute, diff --git a/packages/trpc/server/trpc.ts b/packages/trpc/server/trpc.ts index 96870c246..cedfa3949 100644 --- a/packages/trpc/server/trpc.ts +++ b/packages/trpc/server/trpc.ts @@ -1,5 +1,4 @@ import { TRPCError, initTRPC } from '@trpc/server'; -import SuperJSON from 'superjson'; import type { AnyZodObject } from 'zod'; import { AppError, genericErrorCodeToTrpcErrorCodeMap } from '@documenso/lib/errors/app-error'; @@ -9,6 +8,7 @@ import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-reques import { alphaid } from '@documenso/lib/universal/id'; import { isAdmin } from '@documenso/lib/utils/is-admin'; +import { dataTransformer } from '../utils/data-transformer'; import type { TrpcContext } from './context'; // Can't import type from trpc-to-openapi because it breaks build, not sure why. @@ -35,7 +35,7 @@ const t = initTRPC .meta() .context() .create({ - transformer: SuperJSON, + transformer: dataTransformer, errorFormatter(opts) { const { shape, error } = opts; diff --git a/packages/trpc/utils/data-transformer.ts b/packages/trpc/utils/data-transformer.ts new file mode 100644 index 000000000..e163003c9 --- /dev/null +++ b/packages/trpc/utils/data-transformer.ts @@ -0,0 +1,15 @@ +import type { DataTransformer } from '@trpc/server'; +import SuperJSON from 'superjson'; + +export const dataTransformer: DataTransformer = { + serialize: (data: unknown) => { + if (data instanceof FormData) { + return data; + } + + return SuperJSON.serialize(data); + }, + deserialize: (data: unknown) => { + return SuperJSON.deserialize(data); + }, +}; diff --git a/packages/trpc/utils/openapi-fetch-handler.ts b/packages/trpc/utils/openapi-fetch-handler.ts new file mode 100644 index 000000000..c597a45cd --- /dev/null +++ b/packages/trpc/utils/openapi-fetch-handler.ts @@ -0,0 +1,202 @@ +import { TRPCError } from '@trpc/server'; +import type { FetchHandlerOptions } from '@trpc/server/adapters/fetch'; +import type { ServerResponse } from 'node:http'; +import { type OpenApiRouter, createOpenApiNodeHttpHandler } from 'trpc-to-openapi'; + +const CONTENT_TYPE_JSON = 'application/json'; +const CONTENT_TYPE_URLENCODED = 'application/x-www-form-urlencoded'; +const CONTENT_TYPE_MULTIPART = 'multipart/form-data'; + +const getUrlEncodedBody = async (req: Request) => { + const params = new URLSearchParams(await req.text()); + + const data: Record = {}; + + for (const key of params.keys()) { + data[key] = params.getAll(key); + } + + return data; +}; + +const getMultipartBody = async (req: Request) => { + const formData = await req.formData(); + + const data: Record = {}; + + for (const key of formData.keys()) { + const values = formData.getAll(key); + + // Return array for multiple values, single value otherwise (matches URL-encoded behavior) + data[key] = values.length > 1 ? values : values[0]; + } + + return data; +}; +/** + * Parses the request body based on its content type. + * + * Handles JSON, URL-encoded, and multipart/form-data requests. + * For multipart requests, converts FormData to a plain object (similar to URL-encoded) + * so it can be validated by tRPC schemas. The content-type header is rewritten + * later to prevent downstream parsing issues. + */ +const getRequestBody = async (req: Request) => { + try { + const contentType = req.headers.get('content-type') || ''; + + if (contentType.includes(CONTENT_TYPE_JSON)) { + return { + isValid: true, + // Use JSON.parse instead of req.json() because req.json() does not throw on invalid JSON + data: JSON.parse(await req.text()), + }; + } + + if (contentType.includes(CONTENT_TYPE_URLENCODED)) { + return { + isValid: true, + data: await getUrlEncodedBody(req), + }; + } + + // Handle multipart/form-data by parsing as FormData and converting to a plain object. + // This mirrors how URL-encoded data is structured, allowing tRPC to validate it normally. + // The content-type header is rewritten to application/json later via the request proxy + // because createOpenApiNodeHttpHandler aborts on any bodied request that isn't application/json. + if (contentType.includes(CONTENT_TYPE_MULTIPART)) { + return { + isValid: true, + data: await getMultipartBody(req), + }; + } + + return { + isValid: true, + data: req.body, + }; + } catch (err) { + return { + isValid: false, + cause: err, + }; + } +}; + +/** + * Creates a proxy around the original Request that intercepts property access + * to transform the request for compatibility with the Node HTTP handler. + * + * Key transformations: + * - Parses and provides the body as a plain object (handles multipart/form-data conversion) + * - Rewrites content-type header for multipart requests to application/json + * (required because createOpenApiNodeHttpHandler aborts on non-JSON bodied requests) + */ +const createRequestProxy = async (req: Request, url?: string) => { + const body = await getRequestBody(req); + + const originalContentType = req.headers.get('content-type') || ''; + + const isMultipart = originalContentType.includes(CONTENT_TYPE_MULTIPART); + + return new Proxy(req, { + get: (target, prop) => { + switch (prop) { + case 'url': + return url ?? target.url; + + case 'body': { + if (!body.isValid) { + throw new TRPCError({ + code: 'PARSE_ERROR', + message: 'Failed to parse request body', + cause: body.cause, + }); + } + + return body.data; + } + + case 'headers': { + const headers = new Headers(target.headers); + + // Rewrite content-type header for multipart requests to application/json. + // This is necessary because `createOpenApiNodeHttpHandler` aborts on any bodied + // request that isn't application/json. Since we've already parsed the multipart + // data into a plain object above, this is safe to do. + if (isMultipart) { + headers.set('content-type', CONTENT_TYPE_JSON); + } + + return headers; + } + + default: + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any + return (target as unknown as Record)[prop]; + } + }, + }); +}; + +export type CreateOpenApiFetchHandlerOptions = Omit< + FetchHandlerOptions, + 'batching' +> & { + req: Request; + endpoint: `/${string}`; +}; + +export const createOpenApiFetchHandler = async ( + opts: CreateOpenApiFetchHandlerOptions, +): Promise => { + const resHeaders = new Headers(); + const url = new URL(opts.req.url.replace(opts.endpoint, '')); + const req: Request = await createRequestProxy(opts.req, url.toString()); + + // @ts-expect-error Inherited from original fetch handler in `trpc-to-openapi` + const openApiHttpHandler = createOpenApiNodeHttpHandler(opts); + + return new Promise((resolve) => { + let statusCode: number; + + // Create a mock ServerResponse object that bridges Node HTTP APIs with Fetch API Response. + // This allows the Node HTTP handler to work with Fetch API Request objects. + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const res = { + setHeader: (key: string, value: string | readonly string[]) => { + if (typeof value === 'string') { + resHeaders.set(key, value); + } else { + for (const v of value) { + resHeaders.append(key, v); + } + } + }, + get statusCode() { + return statusCode; + }, + set statusCode(code: number) { + statusCode = code; + }, + end: (body: string) => { + resolve( + new Response(body, { + headers: resHeaders, + status: statusCode, + }), + ); + }, + } as ServerResponse; + + // Type assertions are necessary here for interop between Fetch API Request/Response + // and Node HTTP IncomingMessage/ServerResponse types. + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const nodeReq = req as unknown as Parameters[0]; + + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const nodeRes = res as unknown as Parameters[1]; + + void openApiHttpHandler(nodeReq, nodeRes); + }); +}; diff --git a/packages/trpc/utils/zod-form-data.ts b/packages/trpc/utils/zod-form-data.ts new file mode 100644 index 000000000..0b78bdb82 --- /dev/null +++ b/packages/trpc/utils/zod-form-data.ts @@ -0,0 +1,32 @@ +import type { ZodRawShape } from 'zod'; +import z from 'zod'; + +/** + * This helper takes the place of the `z.object` at the root of your schema. + * It wraps your schema in a `z.preprocess` that extracts all the data out of a `FormData` + * and transforms it into a regular object. + * If the `FormData` contains multiple entries with the same field name, + * it will automatically turn that field into an array. + * + * This is used instead of `zfd.formData()` because it receives `undefined` + * somewhere in the pipeline of our openapi schema generation and throws + * an error. This provides the same functionality as `zfd.formData()` but + * can be considered somewhat safer. + */ +export const zodFormData = (schema: T) => { + return z.preprocess((data) => { + if (data instanceof FormData) { + const formData: Record = {}; + + for (const key of data.keys()) { + const values = data.getAll(key); + + formData[key] = values.length > 1 ? values : values[0]; + } + + return formData; + } + + return data; + }, z.object(schema)); +}; diff --git a/packages/ui/package.json b/packages/ui/package.json index 880308853..a79f845e5 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -78,6 +78,6 @@ "tailwind-merge": "^1.12.0", "tailwindcss-animate": "^1.0.5", "ts-pattern": "^5.0.5", - "zod": "3.24.1" + "zod": "^3.25.76" } } \ No newline at end of file