diff --git a/apps/backend/package.json b/apps/backend/package.json index 0580e78bb..a1f452bd0 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -13,9 +13,9 @@ "build-self-host-seed-script": "tsup --config prisma/tsup.config.ts", "analyze-bundle": "ANALYZE_BUNDLE=1 pnpm run build", "start": "next start --port 8102", - "codegen-prisma": "pnpm run prisma generate", - "codegen-prisma:watch": "pnpm run prisma generate --watch", - "codegen": "pnpm run with-env bash -c 'if [ \"$STACK_ACCELERATE_ENABLED\" = \"true\" ]; then pnpm run prisma generate --no-engine && pnpm run generate-docs; else pnpm run codegen-prisma && pnpm run generate-docs; fi'", + "codegen-prisma": "concurrently -k -s first \"tsx scripts/mock-postgres.mjs\" \"node -e \\\"setTimeout(() => process.exit(0), 2000)\\\" && cross-env STACK_DATABASE_CONNECTION_STRING=\\\"postgres://postgres@localhost:8118/postgres?pgbouncer=true&connection_limit=1\\\" STACK_DIRECT_DATABASE_CONNECTION_STRING=\\\"postgres://postgres@localhost:8118/postgres?connection_limit=1\\\" STACK_SEED_INTERNAL_PROJECT_PUBLISHABLE_CLIENT_KEY=\\\"test_key\\\" STACK_SEED_INTERNAL_PROJECT_SECRET_SERVER_KEY=\\\"test_secret\\\" STACK_SEED_INTERNAL_PROJECT_SUPER_SECRET_ADMIN_KEY=\\\"test_admin\\\" sh -c \\\"pnpm run prisma migrate reset --force && pnpm run prisma generate --sql\\\"\"", + "codegen-prisma:watch": "pnpm run codegen-prisma && chokidar \"prisma/**/*\" -c \"pnpm run codegen-prisma\"", + "codegen": "pnpm run with-env bash -c 'if [ \"$STACK_ACCELERATE_ENABLED\" = \"true\" ]; then pnpm run prisma generate --sql --no-engine && pnpm run generate-docs; else pnpm run codegen-prisma && pnpm run generate-docs; fi'", "codegen:watch": "concurrently -n \"prisma,docs\" -k \"pnpm run codegen-prisma:watch\" \"pnpm run watch-docs\"", "psql-inner": "psql $STACK_DATABASE_CONNECTION_STRING", "psql": "pnpm run with-env pnpm run psql-inner", @@ -31,6 +31,7 @@ "seed": "pnpm run db-seed-script" }, "dependencies": { + "@electric-sql/pglite": "0.2.7", "@next/bundle-analyzer": "15.0.3", "@node-oauth/oauth2-server": "^5.1.0", "@opentelemetry/api": "^1.9.0", @@ -44,7 +45,7 @@ "@opentelemetry/sdk-trace-base": "^1.26.0", "@opentelemetry/sdk-trace-node": "^1.26.0", "@opentelemetry/semantic-conventions": "^1.27.0", - "@prisma/client": "^6.0.1", + "@prisma/client": "^6.1.0", "@prisma/extension-accelerate": "^1.2.1", "@prisma/instrumentation": "^5.19.1", "@sentry/nextjs": "^8.40.0", @@ -55,6 +56,7 @@ "@vercel/functions": "^1.4.2", "@vercel/otel": "^1.10.0", "bcrypt": "^5.1.1", + "chokidar-cli": "^3.0.0", "dotenv-cli": "^7.3.0", "jose": "^5.2.2", "next": "15.0.3", @@ -63,6 +65,7 @@ "openid-client": "^5.6.4", "oslo": "^1.2.1", "pg": "^8.11.3", + "pg-gateway": "0.3.0-beta.3", "posthog-node": "^4.1.0", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -82,9 +85,10 @@ "@types/react-dom": "^19.0.0", "@types/semver": "^7.5.8", "concurrently": "^8.2.2", + "cross-env": "^7.0.3", "glob": "^10.4.1", "import-in-the-middle": "^1.12.0", - "prisma": "^6.0.1", + "prisma": "^6.1.0", "require-in-the-middle": "^7.4.0", "rimraf": "^5.0.5", "tsup": "^8.3.0", diff --git a/apps/backend/prisma/schema.prisma b/apps/backend/prisma/schema.prisma index c3b25ce63..4b1259173 100644 --- a/apps/backend/prisma/schema.prisma +++ b/apps/backend/prisma/schema.prisma @@ -1,6 +1,6 @@ generator client { provider = "prisma-client-js" - previewFeatures = ["tracing", "relationJoins"] + previewFeatures = ["typedSql", "relationJoins"] } datasource db { diff --git a/apps/backend/prisma/sql/getUsersLastActiveAtMillis.sql b/apps/backend/prisma/sql/getUsersLastActiveAtMillis.sql new file mode 100644 index 000000000..801bba449 --- /dev/null +++ b/apps/backend/prisma/sql/getUsersLastActiveAtMillis.sql @@ -0,0 +1,4 @@ +SELECT data->>'userId' as "userId", MAX("createdAt") as "lastActiveAt" +FROM "Event" +WHERE data->>'userId' = ANY($1) +GROUP BY data->>'userId' \ No newline at end of file diff --git a/apps/backend/scripts/mock-postgres.mjs b/apps/backend/scripts/mock-postgres.mjs new file mode 100644 index 000000000..8fbec72a6 --- /dev/null +++ b/apps/backend/scripts/mock-postgres.mjs @@ -0,0 +1,50 @@ +import { PGlite } from '@electric-sql/pglite'; +import net from 'node:net'; +import { fromNodeSocket } from 'pg-gateway/node'; + +const db = new PGlite(); + +const server = net.createServer(async (socket) => { + let activeDb; + + console.info(`Client connected: ${socket.remoteAddress}:${socket.remotePort}`) + await fromNodeSocket(socket, { + serverVersion: '16.3', + + auth: { + // No password required + method: 'trust', + }, + + async onStartup({ clientParams }) { + console.info(`Connecting client to ${clientParams?.database}`) + // If the DB is the Prisma shadow DB, create a temp in-memory instance + if (clientParams?.database === 'prisma-shadow') { + activeDb = new PGlite() + } else { + activeDb = db + } + + // Wait for PGlite to be ready before further processing + await activeDb.waitReady + }, + + async onMessage(data, { isAuthenticated }) { + if (!isAuthenticated) { + // currently we have no authentication, but let's keep it for the future + return + } + + // Forward raw message to PGlite and send response to client + return await activeDb.execProtocolRaw(data) + }, + }) + + socket.on('end', () => { + console.info('Client disconnected') + }) +}) + +server.listen(8118, () => { + console.info('Postgres server listening on port 8118') +}) diff --git a/apps/backend/sentry.client.config.ts b/apps/backend/sentry.client.config.ts index cb8809cfb..cea55a3f4 100644 --- a/apps/backend/sentry.client.config.ts +++ b/apps/backend/sentry.client.config.ts @@ -14,6 +14,10 @@ Sentry.init({ enabled: process.env.NODE_ENV !== "development" && !process.env.CI, + // Sentry and Prisma are not compatible with the new tracing. https://github.com/prisma/prisma/issues/25885 + // TODO: Remove this once sentry fixes the issue. + tracesSampleRate: 0, + // You can remove this option if you're not planning to use the Sentry Session Replay feature: integrations: [ Sentry.replayIntegration({ diff --git a/apps/backend/src/app/api/v1/users/crud.tsx b/apps/backend/src/app/api/v1/users/crud.tsx index 6cd78fc0d..3cd72da73 100644 --- a/apps/backend/src/app/api/v1/users/crud.tsx +++ b/apps/backend/src/app/api/v1/users/crud.tsx @@ -5,6 +5,7 @@ import { prismaClient, retryTransaction } from "@/prisma-client"; import { createCrudHandlers } from "@/route-handlers/crud-handler"; import { runAsynchronouslyAndWaitUntil } from "@/utils/vercel"; import { BooleanTrue, Prisma } from "@prisma/client"; +import { getUsersLastActiveAtMillis as getUsersLastActiveAtMillisSql } from "@prisma/client/sql"; import { KnownErrors } from "@stackframe/stack-shared"; import { currentUserCrud } from "@stackframe/stack-shared/dist/interface/crud/current-user"; import { UsersCrud, usersCrud } from "@stackframe/stack-shared/dist/interface/crud/users"; @@ -228,16 +229,11 @@ export const getUsersLastActiveAtMillis = async (userIds: string[], fallbackTo: return []; } - const events = await prismaClient.$queryRaw>` - SELECT data->>'userId' as "userId", MAX("createdAt") as "lastActiveAt" - FROM "Event" - WHERE data->>'userId' = ANY(${Prisma.sql`ARRAY[${Prisma.join(userIds)}]`}) - GROUP BY data->>'userId' - `; + const events = await prismaClient.$queryRawTyped(getUsersLastActiveAtMillisSql(userIds)); return userIds.map((userId, index) => { const event = events.find(e => e.userId === userId); - return event ? event.lastActiveAt.getTime() : ( + return event && event.lastActiveAt ? event.lastActiveAt.getTime() : ( typeof fallbackTo[index] === "number" ? (fallbackTo[index] as number) : (fallbackTo[index] as Date).getTime() ); }); diff --git a/apps/backend/src/instrumentation.ts b/apps/backend/src/instrumentation.ts deleted file mode 100644 index e8644c10f..000000000 --- a/apps/backend/src/instrumentation.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { PrismaInstrumentation } from "@prisma/instrumentation"; -import * as Sentry from "@sentry/nextjs"; -import { getEnvVariable, getNextRuntime, getNodeEnvironment } from "@stackframe/stack-shared/dist/utils/env"; -import { sentryBaseConfig } from "@stackframe/stack-shared/dist/utils/sentry"; -import { nicify } from "@stackframe/stack-shared/dist/utils/strings"; -import { registerOTel } from '@vercel/otel'; -import "./polyfills"; - -export function register() { - registerOTel({ - serviceName: 'stack-backend', - instrumentations: [new PrismaInstrumentation()], - }); - - if (getNextRuntime() === "nodejs") { - process.title = "stack-backend (nextjs)"; - } - - if (getNextRuntime() === "nodejs" || getNextRuntime() === "edge") { - Sentry.init({ - ...sentryBaseConfig, - - dsn: getEnvVariable("NEXT_PUBLIC_SENTRY_DSN", ""), - - enabled: getNodeEnvironment() !== "development" && !getEnvVariable("CI", ""), - - // Add exception metadata to the event - beforeSend(event, hint) { - const error = hint.originalException; - let nicified; - try { - nicified = nicify(error, { maxDepth: 8 }); - } catch (e) { - nicified = `Error occurred during nicification: ${e}`; - } - if (error instanceof Error) { - event.extra = { - ...event.extra, - cause: error.cause, - errorProps: { - ...error, - }, - nicifiedError: nicified, - }; - } - return event; - }, - }); - - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2555863c8..d43e4ba8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,6 +87,9 @@ importers: apps/backend: dependencies: + '@electric-sql/pglite': + specifier: 0.2.7 + version: 0.2.7 '@next/bundle-analyzer': specifier: 15.0.3 version: 15.0.3 @@ -127,11 +130,11 @@ importers: specifier: ^1.27.0 version: 1.27.0 '@prisma/client': - specifier: ^6.0.1 - version: 6.0.1(prisma@6.0.1) + specifier: ^6.1.0 + version: 6.1.0(prisma@6.1.0) '@prisma/extension-accelerate': specifier: ^1.2.1 - version: 1.2.1(@prisma/client@6.0.1(prisma@6.0.1)) + version: 1.2.1(@prisma/client@6.1.0(prisma@6.1.0)) '@prisma/instrumentation': specifier: ^5.19.1 version: 5.20.0 @@ -159,6 +162,9 @@ importers: bcrypt: specifier: ^5.1.1 version: 5.1.1 + chokidar-cli: + specifier: ^3.0.0 + version: 3.0.0 dotenv-cli: specifier: ^7.3.0 version: 7.4.1 @@ -183,6 +189,9 @@ importers: pg: specifier: ^8.11.3 version: 8.12.0 + pg-gateway: + specifier: 0.3.0-beta.3 + version: 0.3.0-beta.3 posthog-node: specifier: ^4.1.0 version: 4.1.0 @@ -235,6 +244,9 @@ importers: concurrently: specifier: ^8.2.2 version: 8.2.2 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 glob: specifier: ^10.4.1 version: 10.4.1 @@ -242,8 +254,8 @@ importers: specifier: ^1.12.0 version: 1.12.0 prisma: - specifier: ^6.0.1 - version: 6.0.1 + specifier: ^6.1.0 + version: 6.1.0 require-in-the-middle: specifier: ^7.4.0 version: 7.4.0 @@ -1549,6 +1561,9 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + '@electric-sql/pglite@0.2.7': + resolution: {integrity: sha512-8Il//XHTAtZ8VeQF+6P1UjsIoaAJyO4LwOMoXhSFaHpmkwKs63cUhHHNzLzUmcZvP/ZTmlT3+xTiWfU/EyoxwQ==} + '@emnapi/core@0.45.0': resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} @@ -3609,8 +3624,8 @@ packages: '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} - '@prisma/client@6.0.1': - resolution: {integrity: sha512-60w7kL6bUxz7M6Gs/V+OWMhwy94FshpngVmOY05TmGD0Lhk+Ac0ZgtjlL6Wll9TD4G03t4Sq1wZekNVy+Xdlbg==} + '@prisma/client@6.1.0': + resolution: {integrity: sha512-AbQYc5+EJKm1Ydfq3KxwcGiy7wIbm4/QbjCKWWoNROtvy7d6a3gmAGkKjK0iUCzh+rHV8xDhD5Cge8ke/kiy5Q==} engines: {node: '>=18.18'} peerDependencies: prisma: '*' @@ -3618,14 +3633,14 @@ packages: prisma: optional: true - '@prisma/debug@6.0.1': - resolution: {integrity: sha512-jQylgSOf7ibTVxqBacnAlVGvek6fQxJIYCQOeX2KexsfypNzXjJQSS2o5s+Mjj2Np93iSOQUaw6TvPj8syhG4w==} + '@prisma/debug@6.1.0': + resolution: {integrity: sha512-0himsvcM4DGBTtvXkd2Tggv6sl2JyUYLzEGXXleFY+7Kp6rZeSS3hiTW9mwtUlXrwYbJP6pwlVNB7jYElrjWUg==} - '@prisma/engines-version@5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e': - resolution: {integrity: sha512-JmIds0Q2/vsOmnuTJYxY4LE+sajqjYKhLtdOT6y4imojqv5d/aeVEfbBGC74t8Be1uSp0OP8lxIj2OqoKbLsfQ==} + '@prisma/engines-version@6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959': + resolution: {integrity: sha512-PdJqmYM2Fd8K0weOOtQThWylwjsDlTig+8Pcg47/jszMuLL9iLIaygC3cjWJLda69siRW4STlCTMSgOjZzvKPQ==} - '@prisma/engines@6.0.1': - resolution: {integrity: sha512-4hxzI+YQIR2uuDyVsDooFZGu5AtixbvM2psp+iayDZ4hRrAHo/YwgA17N23UWq7G6gRu18NvuNMb48qjP3DPQw==} + '@prisma/engines@6.1.0': + resolution: {integrity: sha512-GnYJbCiep3Vyr1P/415ReYrgJUjP79fBNc1wCo7NP6Eia0CzL2Ot9vK7Infczv3oK7JLrCcawOSAxFxNFsAERQ==} '@prisma/extension-accelerate@1.2.1': resolution: {integrity: sha512-QicnMeyqL226ilT3vvRsFAqPeIdqHGKR4c25CoK5zZ1tNIv8egfgpD1gCKqOGmfAz0pIKQnMuJU3eNg9KItC7A==} @@ -3633,11 +3648,11 @@ packages: peerDependencies: '@prisma/client': '>=4.16.1' - '@prisma/fetch-engine@6.0.1': - resolution: {integrity: sha512-T36bWFVGeGYYSyYOj9d+O9G3sBC+pAyMC+jc45iSL63/Haq1GrYjQPgPMxrEj9m739taXrupoysRedQ+VyvM/Q==} + '@prisma/fetch-engine@6.1.0': + resolution: {integrity: sha512-asdFi7TvPlEZ8CzSZ/+Du5wZ27q6OJbRSXh+S8ISZguu+S9KtS/gP7NeXceZyb1Jv1SM1S5YfiCv+STDsG6rrg==} - '@prisma/get-platform@6.0.1': - resolution: {integrity: sha512-zspC9vlxAqx4E6epMPMLLBMED2VD8axDe8sPnquZ8GOsn6tiacWK0oxrGK4UAHYzYUVuMVUApJbdXB2dFpLhvg==} + '@prisma/get-platform@6.1.0': + resolution: {integrity: sha512-ia8bNjboBoHkmKGGaWtqtlgQOhCi7+f85aOkPJKgNwWvYrT6l78KgojLekE8zMhVk0R9lWcifV0Pf8l3/15V0Q==} '@prisma/instrumentation@5.19.1': resolution: {integrity: sha512-VLnzMQq7CWroL5AeaW0Py2huiNKeoMfCH3SUxstdzPrlWQi6UQ9UrfcbUkNHlVFqOMacqy8X/8YtE0kuKDpD9w==} @@ -6544,6 +6559,11 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} @@ -9315,6 +9335,9 @@ packages: pg-connection-string@2.6.4: resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + pg-gateway@0.3.0-beta.3: + resolution: {integrity: sha512-tzO/TSlFzgu6AJvn4clzZpDfCDyRjG/GnGYtdi1kgN+h+TmaD/1xDfqqVhcknPDx7qQaViq8JW7aQiazn3QaqQ==} + pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -9521,8 +9544,8 @@ packages: peerDependencies: react: '>=16.0.0' - prisma@6.0.1: - resolution: {integrity: sha512-CaMNFHkf+DDq8zq3X/JJsQ4Koy7dyWwwtOKibkT/Am9j/tDxcfbg7+lB1Dzhx18G/+RQCMgjPYB61bhRqteNBQ==} + prisma@6.1.0: + resolution: {integrity: sha512-aFI3Yi+ApUxkwCJJwyQSwpyzUX7YX3ihzuHNHOyv4GJg3X5tQsmRaJEnZ+ZyfHpMtnyahhmXVfbTZ+lS8ZtfKw==} engines: {node: '>=18.18'} hasBin: true @@ -11915,6 +11938,8 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} + '@electric-sql/pglite@0.2.7': {} + '@emnapi/core@0.45.0': dependencies: tslib: 2.8.1 @@ -13594,34 +13619,34 @@ snapshots: '@polka/url@1.0.0-next.25': {} - '@prisma/client@6.0.1(prisma@6.0.1)': + '@prisma/client@6.1.0(prisma@6.1.0)': optionalDependencies: - prisma: 6.0.1 + prisma: 6.1.0 - '@prisma/debug@6.0.1': {} + '@prisma/debug@6.1.0': {} - '@prisma/engines-version@5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e': {} + '@prisma/engines-version@6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959': {} - '@prisma/engines@6.0.1': + '@prisma/engines@6.1.0': dependencies: - '@prisma/debug': 6.0.1 - '@prisma/engines-version': 5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e - '@prisma/fetch-engine': 6.0.1 - '@prisma/get-platform': 6.0.1 + '@prisma/debug': 6.1.0 + '@prisma/engines-version': 6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959 + '@prisma/fetch-engine': 6.1.0 + '@prisma/get-platform': 6.1.0 - '@prisma/extension-accelerate@1.2.1(@prisma/client@6.0.1(prisma@6.0.1))': + '@prisma/extension-accelerate@1.2.1(@prisma/client@6.1.0(prisma@6.1.0))': dependencies: - '@prisma/client': 6.0.1(prisma@6.0.1) + '@prisma/client': 6.1.0(prisma@6.1.0) - '@prisma/fetch-engine@6.0.1': + '@prisma/fetch-engine@6.1.0': dependencies: - '@prisma/debug': 6.0.1 - '@prisma/engines-version': 5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e - '@prisma/get-platform': 6.0.1 + '@prisma/debug': 6.1.0 + '@prisma/engines-version': 6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959 + '@prisma/get-platform': 6.1.0 - '@prisma/get-platform@6.0.1': + '@prisma/get-platform@6.1.0': dependencies: - '@prisma/debug': 6.0.1 + '@prisma/debug': 6.1.0 '@prisma/instrumentation@5.19.1': dependencies: @@ -16978,6 +17003,10 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.5 + cross-fetch@4.0.0: dependencies: node-fetch: 2.7.0 @@ -18091,7 +18120,7 @@ snapshots: execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.5 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -18205,7 +18234,7 @@ snapshots: foreground-child@3.2.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.5 signal-exit: 4.1.0 foreground-child@3.3.0: @@ -20585,6 +20614,8 @@ snapshots: pg-connection-string@2.6.4: {} + pg-gateway@0.3.0-beta.3: {} + pg-int8@1.0.1: {} pg-pool@3.6.2(pg@8.12.0): @@ -20811,9 +20842,9 @@ snapshots: clsx: 1.2.1 react: 18.3.1 - prisma@6.0.1: + prisma@6.1.0: dependencies: - '@prisma/engines': 6.0.1 + '@prisma/engines': 6.1.0 optionalDependencies: fsevents: 2.3.3