diff --git a/apps/docs/get-started/local.mdx b/apps/docs/get-started/local.mdx index 523569c..18487eb 100644 --- a/apps/docs/get-started/local.mdx +++ b/apps/docs/get-started/local.mdx @@ -125,12 +125,6 @@ pnpm install AWS_SECRET_KEY= ``` - - To enable Prisma Optimize and get insights on queires you can add this in you .env - ```bash - ENABLE_PRISMA_CLIENT=true - ``` - ## Running Unsend locally diff --git a/apps/web/package.json b/apps/web/package.json index 8632d90..09accae 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -26,7 +26,7 @@ "@hono/zod-openapi": "^0.10.0", "@hookform/resolvers": "^3.3.4", "@isaacs/ttlcache": "^1.4.1", - "@prisma/client": "^5.11.0", + "@prisma/client": "^6.3.1", "@t3-oss/env-nextjs": "^0.9.2", "@tanstack/react-query": "^5.25.0", "@trpc/client": "next", @@ -51,7 +51,7 @@ "next-auth": "^4.24.6", "pg-boss": "^9.0.3", "pnpm": "^8.15.5", - "prisma": "^5.11.0", + "prisma": "^6.3.1", "query-string": "^9.0.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -67,7 +67,6 @@ }, "devDependencies": { "@next/eslint-plugin-next": "^14.2.2", - "@prisma/extension-optimize": "^0.10.0", "@types/eslint": "^8.56.2", "@types/html-to-text": "^9.0.4", "@types/mime-types": "^2.1.4", diff --git a/apps/web/prisma/schema.prisma b/apps/web/prisma/schema.prisma index d301219..b25f9f7 100644 --- a/apps/web/prisma/schema.prisma +++ b/apps/web/prisma/schema.prisma @@ -3,7 +3,7 @@ generator client { provider = "prisma-client-js" - previewFeatures = ["tracing"] + previewFeatures = [] } datasource db { diff --git a/apps/web/src/env.js b/apps/web/src/env.js index 5633bd6..4d0abda 100644 --- a/apps/web/src/env.js +++ b/apps/web/src/env.js @@ -46,10 +46,6 @@ export const env = createEnv({ ADMIN_EMAIL: z.string().optional(), DISCORD_WEBHOOK_URL: z.string().optional(), REDIS_URL: z.string(), - ENABLE_PRISMA_CLIENT: z - .string() - .default("false") - .transform((str) => str === "true"), // Converts string "true" to boolean true S3_COMPATIBLE_ACCESS_KEY: z.string().optional(), S3_COMPATIBLE_SECRET_KEY: z.string().optional(), S3_COMPATIBLE_API_URL: z.string().optional(), @@ -93,7 +89,6 @@ export const env = createEnv({ DISCORD_WEBHOOK_URL: process.env.DISCORD_WEBHOOK_URL, REDIS_URL: process.env.REDIS_URL, FROM_EMAIL: process.env.FROM_EMAIL, - ENABLE_PRISMA_CLIENT: process.env.ENABLE_PRISMA_CLIENT, // Add this line S3_COMPATIBLE_ACCESS_KEY: process.env.S3_COMPATIBLE_ACCESS_KEY, S3_COMPATIBLE_SECRET_KEY: process.env.S3_COMPATIBLE_SECRET_KEY, S3_COMPATIBLE_API_URL: process.env.S3_COMPATIBLE_API_URL, diff --git a/apps/web/src/server/aws/sns.ts b/apps/web/src/server/aws/sns.ts index 851a3b5..b02fd49 100644 --- a/apps/web/src/server/aws/sns.ts +++ b/apps/web/src/server/aws/sns.ts @@ -2,6 +2,7 @@ import { SNSClient, CreateTopicCommand, SubscribeCommand, + DeleteTopicCommand, } from "@aws-sdk/client-sns"; import { env } from "~/env"; @@ -25,6 +26,11 @@ export async function createTopic(topic: string, region: string) { return data.TopicArn; } +export async function deleteTopic(topicArn: string, region: string) { + const client = getSnsClient(region); + await client.send(new DeleteTopicCommand({ TopicArn: topicArn })); +} + export async function subscribeEndpoint( topicArn: string, endpointUrl: string, diff --git a/apps/web/src/server/db.ts b/apps/web/src/server/db.ts index c542b8a..7904339 100644 --- a/apps/web/src/server/db.ts +++ b/apps/web/src/server/db.ts @@ -1,5 +1,4 @@ import { PrismaClient } from "@prisma/client"; -import { withOptimize } from "@prisma/extension-optimize"; import { env } from "~/env"; const createPrismaClient = () => { @@ -7,9 +6,6 @@ const createPrismaClient = () => { log: env.NODE_ENV === "development" ? ["query", "error", "warn"] : ["error"], }); - if (env.ENABLE_PRISMA_CLIENT) { - return client.$extends(withOptimize()); - } return client; }; diff --git a/apps/web/src/server/service/ses-settings-service.ts b/apps/web/src/server/service/ses-settings-service.ts index 4dcbee5..8a75a68 100644 --- a/apps/web/src/server/service/ses-settings-service.ts +++ b/apps/web/src/server/service/ses-settings-service.ts @@ -78,31 +78,64 @@ export class SesSettingsService { } const idPrefix = smallNanoid(10); + let topicArn: string | undefined; - const setting = await db.sesSetting.create({ - data: { + try { + const topicName = `${idPrefix}-${region}-unsend`; + topicArn = await sns.createTopic(topicName, region); + if (!topicArn) { + throw new Error("Failed to create SNS topic"); + } + + const setting = await db.$transaction(async (tx) => { + const setting = await tx.sesSetting.create({ + data: { + region, + callbackUrl: `${parsedUrl}/api/ses_callback`, + topic: topicName, + topicArn, + sesEmailRateLimit: sendingRateLimit, + transactionalQuota, + idPrefix, + }, + }); + + await sns.subscribeEndpoint( + topicArn!, + `${setting.callbackUrl}`, + setting.region + ); + + return setting; + }); + + if (!setting) { + throw new Error("Failed to create setting"); + } + + await registerConfigurationSet(setting); + + EmailQueueService.initializeQueue( region, - callbackUrl: `${parsedUrl}/api/ses_callback`, - topic: `${idPrefix}-${region}-unsend`, - sesEmailRateLimit: sendingRateLimit, - transactionalQuota, - idPrefix, - }, - }); + setting.sesEmailRateLimit, + setting.transactionalQuota + ); + console.log( + EmailQueueService.transactionalQueue, + EmailQueueService.marketingQueue + ); - await createSettingInAws(setting); - - EmailQueueService.initializeQueue( - region, - setting.sesEmailRateLimit, - setting.transactionalQuota - ); - console.log( - EmailQueueService.transactionalQueue, - EmailQueueService.marketingQueue - ); - - await this.invalidateCache(); + await this.invalidateCache(); + } catch (error) { + if (topicArn) { + try { + await sns.deleteTopic(topicArn, region); + } catch (deleteError) { + console.error('Failed to delete SNS topic after error:', deleteError); + } + } + throw error; + } } public static async updateSesSetting({ @@ -163,41 +196,6 @@ export class SesSettingsService { } } -async function createSettingInAws(setting: SesSetting) { - await registerTopicInAws(setting).then(registerConfigurationSet); -} - -/** - * Creates a new topic in AWS and subscribes the callback URL to it - */ -async function registerTopicInAws(setting: SesSetting) { - const topicArn = await sns.createTopic(setting.topic, setting.region); - - if (!topicArn) { - throw new Error("Failed to create SNS topic"); - } - - const _setting = await db.sesSetting.update({ - where: { - id: setting.id, - }, - data: { - topicArn, - }, - }); - - // Invalidate the cache to update the topicArn list - SesSettingsService.invalidateCache(); - - await sns.subscribeEndpoint( - topicArn, - `${setting.callbackUrl}`, - setting.region - ); - - return _setting; -} - /** * Creates a new configuration set in AWS for given region * Totally consist of 4 configs. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a94aff0..356c21a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -133,7 +133,7 @@ importers: dependencies: '@auth/prisma-adapter': specifier: ^1.4.0 - version: 1.5.0(@prisma/client@5.11.0) + version: 1.5.0(@prisma/client@6.3.1) '@aws-sdk/client-s3': specifier: ^3.637.0 version: 3.637.0 @@ -159,8 +159,8 @@ importers: specifier: ^1.4.1 version: 1.4.1 '@prisma/client': - specifier: ^5.11.0 - version: 5.11.0(prisma@5.11.0) + specifier: ^6.3.1 + version: 6.3.1(prisma@6.3.1)(typescript@5.4.2) '@t3-oss/env-nextjs': specifier: ^0.9.2 version: 0.9.2(typescript@5.4.2)(zod@3.22.4) @@ -223,7 +223,7 @@ importers: version: 5.0.7 next: specifier: ^14.2.1 - version: 14.2.1(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) + version: 14.2.1(react-dom@18.2.0)(react@18.2.0) next-auth: specifier: ^4.24.6 version: 4.24.7(next@14.2.1)(react-dom@18.2.0)(react@18.2.0) @@ -234,8 +234,8 @@ importers: specifier: ^8.15.5 version: 8.15.5 prisma: - specifier: ^5.11.0 - version: 5.11.0 + specifier: ^6.3.1 + version: 6.3.1(typescript@5.4.2) query-string: specifier: ^9.0.0 version: 9.0.0 @@ -276,9 +276,6 @@ importers: '@next/eslint-plugin-next': specifier: ^14.2.2 version: 14.2.2 - '@prisma/extension-optimize': - specifier: ^0.10.0 - version: 0.10.0(@prisma/client@5.11.0) '@types/eslint': specifier: ^8.56.2 version: 8.56.5 @@ -739,13 +736,13 @@ packages: preact-render-to-string: 5.2.3(preact@10.11.3) dev: false - /@auth/prisma-adapter@1.5.0(@prisma/client@5.11.0): + /@auth/prisma-adapter@1.5.0(@prisma/client@6.3.1): resolution: {integrity: sha512-TNDY7z5VhC3E5xetb4qhTmSmjvyEurafaTM6dlYlhTGj+7K3xTki7fJ0oJwgkFsQ2fT1weJJJSBmjtH8Nqsnuw==} peerDependencies: '@prisma/client': '>=2.26.0 || >=3 || >=4 || >=5' dependencies: '@auth/core': 0.28.0 - '@prisma/client': 5.11.0(prisma@5.11.0) + '@prisma/client': 6.3.1(prisma@6.3.1)(typescript@5.4.2) transitivePeerDependencies: - '@simplewebauthn/browser' - '@simplewebauthn/server' @@ -4160,145 +4157,6 @@ packages: resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} dev: false - /@opentelemetry/api-logs@0.49.1: - resolution: {integrity: sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==} - engines: {node: '>=14'} - dependencies: - '@opentelemetry/api': 1.8.0 - dev: true - - /@opentelemetry/api@1.8.0: - resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} - engines: {node: '>=8.0.0'} - - /@opentelemetry/context-async-hooks@1.22.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - dependencies: - '@opentelemetry/api': 1.8.0 - dev: true - - /@opentelemetry/core@1.22.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/semantic-conventions': 1.22.0 - dev: true - - /@opentelemetry/exporter-trace-otlp-http@0.49.1(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) - dev: true - - /@opentelemetry/instrumentation@0.49.1(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/api-logs': 0.49.1 - '@types/shimmer': 1.2.0 - import-in-the-middle: 1.7.1 - require-in-the-middle: 7.4.0 - semver: 7.6.0 - shimmer: 1.2.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@opentelemetry/otlp-exporter-base@0.49.1(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - dev: true - - /@opentelemetry/otlp-transformer@0.49.1(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/api-logs': 0.49.1 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-metrics': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) - dev: true - - /@opentelemetry/resources@1.22.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.22.0 - dev: true - - /@opentelemetry/sdk-logs@0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.9.0' - '@opentelemetry/api-logs': '>=0.39.1' - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/api-logs': 0.49.1 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - dev: true - - /@opentelemetry/sdk-metrics@1.22.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - lodash.merge: 4.6.2 - dev: true - - /@opentelemetry/sdk-trace-base@1.22.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.22.0 - dev: true - - /@opentelemetry/semantic-conventions@1.22.0: - resolution: {integrity: sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==} - engines: {node: '>=14'} - dev: true - /@panva/hkdf@1.1.1: resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} dev: false @@ -4318,81 +4176,54 @@ packages: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@prisma/client@5.11.0(prisma@5.11.0): - resolution: {integrity: sha512-SWshvS5FDXvgJKM/a0y9nDC1rqd7KG0Q6ZVzd+U7ZXK5soe73DJxJJgbNBt2GNXOa+ysWB4suTpdK5zfFPhwiw==} - engines: {node: '>=16.13'} + /@prisma/client@6.3.1(prisma@6.3.1)(typescript@5.4.2): + resolution: {integrity: sha512-ARAJaPs+eBkemdky/XU3cvGRl+mIPHCN2lCXsl5Vlb0E2gV+R6IN7aCI8CisRGszEZondwIsW9Iz8EJkTdykyA==} + engines: {node: '>=18.18'} requiresBuild: true peerDependencies: prisma: '*' + typescript: '>=5.1.0' peerDependenciesMeta: prisma: optional: true + typescript: + optional: true dependencies: - prisma: 5.11.0 + prisma: 6.3.1(typescript@5.4.2) + typescript: 5.4.2 + dev: false - /@prisma/debug@5.11.0: - resolution: {integrity: sha512-N6yYr3AbQqaiUg+OgjkdPp3KPW1vMTAgtKX6+BiB/qB2i1TjLYCrweKcUjzOoRM5BriA4idrkTej9A9QqTfl3A==} + /@prisma/debug@6.3.1: + resolution: {integrity: sha512-RrEBkd+HLZx+ydfmYT0jUj7wjLiS95wfTOSQ+8FQbvb6vHh5AeKfEPt/XUQ5+Buljj8hltEfOslEW57/wQIVeA==} + dev: false - /@prisma/debug@5.12.1: - resolution: {integrity: sha512-kd/wNsR0klrv79o1ITsbWxYyh4QWuBidvxsXSParPsYSu0ircUmNk3q4ojsgNc3/81b0ozg76iastOG43tbf8A==} - dev: true + /@prisma/engines-version@6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0: + resolution: {integrity: sha512-R/ZcMuaWZT2UBmgX3Ko6PAV3f8//ZzsjRIG1eKqp3f2rqEqVtCv+mtzuH2rBPUC9ujJ5kCb9wwpxeyCkLcHVyA==} + dev: false - /@prisma/engines-version@5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102: - resolution: {integrity: sha512-WXCuyoymvrS4zLz4wQagSsc3/nE6CHy8znyiMv8RKazKymOMd5o9FP5RGwGHAtgoxd+aB/BWqxuP/Ckfu7/3MA==} - - /@prisma/engines@5.11.0: - resolution: {integrity: sha512-gbrpQoBTYWXDRqD+iTYMirDlF9MMlQdxskQXbhARhG6A/uFQjB7DZMYocMQLoiZXO/IskfDOZpPoZE8TBQKtEw==} + /@prisma/engines@6.3.1: + resolution: {integrity: sha512-sXdqEVLyGAJ5/iUoG/Ea5AdHMN71m6PzMBWRQnLmhhOejzqAaEr8rUd623ql6OJpED4s/U4vIn4dg1qkF7vGag==} requiresBuild: true dependencies: - '@prisma/debug': 5.11.0 - '@prisma/engines-version': 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102 - '@prisma/fetch-engine': 5.11.0 - '@prisma/get-platform': 5.11.0 + '@prisma/debug': 6.3.1 + '@prisma/engines-version': 6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0 + '@prisma/fetch-engine': 6.3.1 + '@prisma/get-platform': 6.3.1 + dev: false - /@prisma/extension-optimize@0.10.0(@prisma/client@5.11.0): - resolution: {integrity: sha512-1xid5tnxSlZkwJVTCQFYd/MtmblFr3fkAmaSBU0boqWchTjVKYOso5MiyoO7HSIbCxNe5q9cS85fU04yivMkJg==} - peerDependencies: - '@prisma/client': 5.x + /@prisma/fetch-engine@6.3.1: + resolution: {integrity: sha512-HOf/0umOgt+/S2xtZze+FHKoxpVg4YpVxROr6g2YG09VsI3Ipyb+rGvD6QGbCqkq5NTWAAZoOGNL+oy7t+IhaQ==} dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/context-async-hooks': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/exporter-trace-otlp-http': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/instrumentation': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.22.0 - '@prisma/client': 5.11.0(prisma@5.11.0) - '@prisma/debug': 5.12.1 - '@prisma/instrumentation': 5.14.0-dev.65 - kleur: 4.1.5 - node-notifier: 10.0.1 - readline-sync: 1.4.10 - xdg-app-paths: 8.3.0 - transitivePeerDependencies: - - supports-color - dev: true + '@prisma/debug': 6.3.1 + '@prisma/engines-version': 6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0 + '@prisma/get-platform': 6.3.1 + dev: false - /@prisma/fetch-engine@5.11.0: - resolution: {integrity: sha512-994viazmHTJ1ymzvWugXod7dZ42T2ROeFuH6zHPcUfp/69+6cl5r9u3NFb6bW8lLdNjwLYEVPeu3hWzxpZeC0w==} + /@prisma/get-platform@6.3.1: + resolution: {integrity: sha512-AYLq6Hk9xG73JdLWJ3Ip9Wg/vlP7xPvftGBalsPzKDOHr/ImhwJ09eS8xC2vNT12DlzGxhfk8BkL0ve2OriNhQ==} dependencies: - '@prisma/debug': 5.11.0 - '@prisma/engines-version': 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102 - '@prisma/get-platform': 5.11.0 - - /@prisma/get-platform@5.11.0: - resolution: {integrity: sha512-rxtHpMLxNTHxqWuGOLzR2QOyQi79rK1u1XYAVLZxDGTLz/A+uoDnjz9veBFlicrpWjwuieM4N6jcnjj/DDoidw==} - dependencies: - '@prisma/debug': 5.11.0 - - /@prisma/instrumentation@5.14.0-dev.65: - resolution: {integrity: sha512-UPWFu0N0w54BEVBvORUgiTLS55E7iYnz+rH2ODD7etjFYwmAlddDl19o8askqLe0CyMT+1RfOcmyAOhF7OYkDw==} - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/instrumentation': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) - transitivePeerDependencies: - - supports-color - dev: true + '@prisma/debug': 6.3.1 + dev: false /@radix-ui/colors@3.0.0: resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} @@ -7614,7 +7445,7 @@ packages: '@trpc/client': 11.0.0-next-beta.318(@trpc/server@11.0.0-next-beta.318) '@trpc/react-query': 11.0.0-next-beta.318(@tanstack/react-query@5.28.4)(@trpc/client@11.0.0-next-beta.318)(@trpc/server@11.0.0-next-beta.318)(react-dom@18.2.0)(react@18.2.0) '@trpc/server': 11.0.0-next-beta.318 - next: 14.2.1(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -7915,10 +7746,6 @@ packages: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true - /@types/shimmer@1.2.0: - resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} - dev: true - /@types/smtp-server@3.5.10: resolution: {integrity: sha512-i3Jx7sJ2qF52vjaOf3HguulXlWRFf6BSfsRLsIdmytDyVGv7KkhSs+gR9BXJnJWg1Ljkh/56Fh1Xqwa6u6X7zw==} dependencies: @@ -8414,14 +8241,6 @@ packages: negotiator: 0.6.3 dev: true - /acorn-import-assertions@1.9.0(acorn@8.11.3): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.11.3 - dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -9176,10 +8995,6 @@ packages: safe-buffer: 5.2.1 dev: false - /cjs-module-lexer@1.3.1: - resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} - dev: true - /class-variance-authority@0.7.0: resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} dependencies: @@ -9757,6 +9572,7 @@ packages: /detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + requiresBuild: true /detect-newline@4.0.1: resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} @@ -10256,7 +10072,7 @@ packages: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -10314,7 +10130,7 @@ packages: enhanced-resolve: 5.16.0 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -10448,41 +10264,6 @@ packages: ignore: 5.3.1 dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.2) - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.13.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} @@ -10518,6 +10299,40 @@ packages: - supports-color dev: true + /eslint-plugin-import@2.29.1(eslint@8.57.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.4 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.2 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11492,10 +11307,6 @@ packages: strip-bom-string: 1.0.0 dev: true - /growly@1.3.0: - resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} - dev: true - /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true @@ -12044,15 +11855,6 @@ packages: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-in-the-middle@1.7.1: - resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} - dependencies: - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - cjs-module-lexer: 1.3.1 - module-details-from-path: 1.0.3 - dev: true - /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} @@ -13762,10 +13564,6 @@ packages: hasBin: true dev: true - /module-details-from-path@1.0.3: - resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} - dev: true - /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -13850,7 +13648,7 @@ packages: '@panva/hkdf': 1.1.1 cookie: 0.5.0 jose: 4.15.5 - next: 14.2.1(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.1(react-dom@18.2.0)(react@18.2.0) oauth: 0.9.15 openid-client: 5.6.5 preact: 10.19.6 @@ -13926,7 +13724,7 @@ packages: - babel-plugin-macros dev: false - /next@14.2.1(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0): + /next@14.2.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-SF3TJnKdH43PMkCcErLPv+x/DY1YCklslk3ZmwaVoyUfDgHKexuKlf9sEfBQ69w+ue8jQ3msLb+hSj1T19hGag==} engines: {node: '>=18.17.0'} hasBin: true @@ -13945,7 +13743,6 @@ packages: optional: true dependencies: '@next/env': 14.2.1 - '@opentelemetry/api': 1.8.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001597 @@ -14000,17 +13797,6 @@ packages: dev: false optional: true - /node-notifier@10.0.1: - resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==} - dependencies: - growly: 1.3.0 - is-wsl: 2.2.0 - semver: 7.6.0 - shellwords: 0.1.1 - uuid: 8.3.2 - which: 2.0.2 - dev: true - /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} @@ -14292,13 +14078,6 @@ packages: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} dev: false - /os-paths@7.4.0: - resolution: {integrity: sha512-Ux1J4NUqC6tZayBqLN1kUlDAEvLiQlli/53sSddU4IN+h+3xxnv2HmRSMpVSvr1hvJzotfMs3ERvETGK+f4OwA==} - engines: {node: '>= 4.0'} - optionalDependencies: - fsevents: 2.3.3 - dev: true - /p-any@4.0.0: resolution: {integrity: sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw==} engines: {node: '>=12.20'} @@ -14964,13 +14743,22 @@ packages: js-beautify: 1.15.1 dev: false - /prisma@5.11.0: - resolution: {integrity: sha512-KCLiug2cs0Je7kGkQBN9jDWoZ90ogE/kvZTUTgz2h94FEo8pczCkPH7fPNXkD1sGU7Yh65risGGD1HQ5DF3r3g==} - engines: {node: '>=16.13'} + /prisma@6.3.1(typescript@5.4.2): + resolution: {integrity: sha512-JKCZWvBC3enxk51tY4TWzS4b5iRt4sSU1uHn2I183giZTvonXaQonzVtjLzpOHE7qu9MxY510kAtFGJwryKe3Q==} + engines: {node: '>=18.18'} hasBin: true requiresBuild: true + peerDependencies: + typescript: '>=5.1.0' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@prisma/engines': 5.11.0 + '@prisma/engines': 6.3.1 + typescript: 5.4.2 + optionalDependencies: + fsevents: 2.3.3 + dev: false /prismjs@1.27.0: resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} @@ -15562,11 +15350,6 @@ packages: dependencies: picomatch: 2.3.1 - /readline-sync@1.4.10: - resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==} - engines: {node: '>= 0.8.0'} - dev: true - /recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} dependencies: @@ -15937,17 +15720,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /require-in-the-middle@7.4.0: - resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==} - engines: {node: '>=8.6.0'} - dependencies: - debug: 4.3.6 - module-details-from-path: 1.0.3 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} dev: true @@ -16307,17 +16079,13 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shellwords@0.1.1: - resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} - dev: true - /shikiji-core@0.9.19: resolution: {integrity: sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw==} dev: false /shikiji@0.8.7: resolution: {integrity: sha512-j5usxwI0yHkDTHOuhuSJl9+wT5CNYeYO82dJMSJBlJ/NYT5SIebGcPoL6y9QOyH15wGrJC4LOP2nz5k8mUDGRQ==} - deprecated: Shikiji is merged back to Shiki v1.0, please migrate over to get the latest updates + deprecated: Deprecated, use shiki instead dependencies: hast-util-to-html: 9.0.1 dev: false @@ -16328,10 +16096,6 @@ packages: shikiji-core: 0.9.19 dev: false - /shimmer@1.2.1: - resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - dev: true - /side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -17613,6 +17377,7 @@ packages: /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true + dev: false /uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} @@ -17888,24 +17653,6 @@ packages: optional: true dev: true - /xdg-app-paths@8.3.0: - resolution: {integrity: sha512-mgxlWVZw0TNWHoGmXq+NC3uhCIc55dDpAlDkMQUaIAcQzysb0kxctwv//fvuW61/nAAeUBJMQ8mnZjMmuYwOcQ==} - engines: {node: '>= 4.0'} - dependencies: - xdg-portable: 10.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /xdg-portable@10.6.0: - resolution: {integrity: sha512-xrcqhWDvtZ7WLmt8G4f3hHy37iK7D2idtosRgkeiSPZEPmBShp0VfmRBLWAPC6zLF48APJ21yfea+RfQMF4/Aw==} - engines: {node: '>= 4.0'} - dependencies: - os-paths: 7.4.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /xml2js@0.6.2: resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} engines: {node: '>=4.0.0'} diff --git a/turbo.json b/turbo.json index 0b9bccf..6cdea22 100644 --- a/turbo.json +++ b/turbo.json @@ -37,8 +37,7 @@ "S3_COMPATIBLE_ACCESS_KEY", "S3_COMPATIBLE_SECRET_KEY", "S3_COMPATIBLE_API_URL", - "S3_COMPATIBLE_PUBLIC_URL", - "ENABLE_PRISMA_CLIENT" + "S3_COMPATIBLE_PUBLIC_URL" ] }, "lint": {