diff --git a/.cursor/rules/webapp.mdc b/.cursor/rules/webapp.mdc index 6cda973951..a362f14fe1 100644 --- a/.cursor/rules/webapp.mdc +++ b/.cursor/rules/webapp.mdc @@ -6,7 +6,7 @@ alwaysApply: false The main trigger.dev webapp, which powers it's API and dashboard and makes up the docker image that is produced as an OSS image, is a Remix 2.1.0 app that uses an express server, written in TypeScript. The following subsystems are either included in the webapp or are used by the webapp in another part of the monorepo: -- `@trigger.dev/database` exports a Prisma 5.4.1 client that is used extensively in the webapp to access a PostgreSQL instance. The schema file is [schema.prisma](mdc:internal-packages/database/prisma/schema.prisma) +- `@trigger.dev/database` exports a Prisma 6.14.0 client that is used extensively in the webapp to access a PostgreSQL instance. The schema file is [schema.prisma](mdc:internal-packages/database/prisma/schema.prisma) - `@trigger.dev/core` is a published package and is used to share code between the `@trigger.dev/sdk` and the webapp. It includes functionality but also a load of Zod schemas for data validation. When importing from `@trigger.dev/core` in the webapp, we never import the root `@trigger.dev/core` path, instead we favor one of the subpath exports that you can find in [package.json](mdc:packages/core/package.json) - `@internal/run-engine` has all the code needed to trigger a run and take it through it's lifecycle to completion. - `@trigger.dev/redis-worker` is a custom redis based background job/worker system that's used in the webapp and also used inside the run engine. @@ -31,7 +31,10 @@ We originally the Trigger.dev "Run Engine" not as a single system, but just spre - The batch trigger API endpoint is [api.v1.tasks.batch.ts](mdc:apps/webapp/app/routes/api.v1.tasks.batch.ts) - Setup code for the prisma client is in [db.server.ts](mdc:apps/webapp/app/db.server.ts) - The run engine is configured in [runEngine.server.ts](mdc:apps/webapp/app/v3/runEngine.server.ts) -- All the "services" that are found in app/v3/services/**/*.server.ts +- All the "services" that are found in app/v3/services/\*_/_.server.ts - The code for the TaskEvent data, which is the otel data sent from tasks to our servers, is in both the [eventRepository.server.ts](mdc:apps/webapp/app/v3/eventRepository.server.ts) and also the [otlpExporter.server.ts](mdc:apps/webapp/app/v3/otlpExporter.server.ts). The otel endpoints which are hit from production and development otel exporters is [otel.v1.logs.ts](mdc:apps/webapp/app/routes/otel.v1.logs.ts) and [otel.v1.traces.ts](mdc:apps/webapp/app/routes/otel.v1.traces.ts) -- We use "presenters" to move more complex loader code into a class, and you can find those are app/v3/presenters/**/*.server.ts +- We use "presenters" to move more complex loader code into a class, and you can find those are app/v3/presenters/\*_/_.server.ts +- All the "services" that are found in app/v3/services/\*_/_.server.ts +- The code for the TaskEvent data, which is the otel data sent from tasks to our servers, is in both the [eventRepository.server.ts](mdc:apps/webapp/app/v3/eventRepository.server.ts) and also the [otlpExporter.server.ts](mdc:apps/webapp/app/v3/otlpExporter.server.ts). The otel endpoints which are hit from production and development otel exporters is [otel.v1.logs.ts](mdc:apps/webapp/app/routes/otel.v1.logs.ts) and [otel.v1.traces.ts](mdc:apps/webapp/app/routes/otel.v1.traces.ts) +- We use "presenters" to move more complex loader code into a class, and you can find those are app/v3/presenters/\*_/_.server.ts diff --git a/.dockerignore b/.dockerignore index d3f8720a9e..a3ea4db8ee 100644 --- a/.dockerignore +++ b/.dockerignore @@ -16,6 +16,8 @@ **/dist **/node_modules +**/generated/prisma + apps/webapp/build apps/webapp/public/build diff --git a/apps/webapp/app/db.server.ts b/apps/webapp/app/db.server.ts index 8435182e63..47b67a1a40 100644 --- a/apps/webapp/app/db.server.ts +++ b/apps/webapp/app/db.server.ts @@ -1,10 +1,11 @@ import { Prisma, PrismaClient, - PrismaClientOrTransaction, - PrismaReplicaClient, - PrismaTransactionClient, - PrismaTransactionOptions, + $transaction as transac, + type PrismaClientOrTransaction, + type PrismaReplicaClient, + type PrismaTransactionClient, + type PrismaTransactionOptions, } from "@trigger.dev/database"; import invariant from "tiny-invariant"; import { z } from "zod"; @@ -12,9 +13,9 @@ import { env } from "./env.server"; import { logger } from "./services/logger.server"; import { isValidDatabaseUrl } from "./utils/db"; import { singleton } from "./utils/singleton"; -import { $transaction as transac } from "@trigger.dev/database"; import { startActiveSpan } from "./v3/tracer.server"; import { Span } from "@opentelemetry/api"; +import { queryPerformanceMonitor } from "./utils/queryPerformanceMonitor.server"; export type { PrismaTransactionClient, @@ -153,13 +154,19 @@ function getClient() { }, ] : []) satisfies Prisma.LogDefinition[]), - // verbose - ...((process.env.VERBOSE_PRISMA_LOGS === "1" + // Query performance monitoring + ...((process.env.VERBOSE_PRISMA_LOGS === "1" || + process.env.VERY_SLOW_QUERY_THRESHOLD_MS !== undefined ? [ { emit: "event", level: "query", }, + ] + : []) satisfies Prisma.LogDefinition[]), + // verbose + ...((process.env.VERBOSE_PRISMA_LOGS === "1" + ? [ { emit: "stdout", level: "query", @@ -206,6 +213,11 @@ function getClient() { }); } + // Add query performance monitoring + client.$on("query", (log) => { + queryPerformanceMonitor.onQuery("writer", log); + }); + // connect eagerly client.$connect(); @@ -265,13 +277,19 @@ function getReplicaClient() { }, ] : []) satisfies Prisma.LogDefinition[]), - // verbose - ...((process.env.VERBOSE_PRISMA_LOGS === "1" + // Query performance monitoring + ...((process.env.VERBOSE_PRISMA_LOGS === "1" || + process.env.VERY_SLOW_QUERY_THRESHOLD_MS !== undefined ? [ { emit: "event", level: "query", }, + ] + : []) satisfies Prisma.LogDefinition[]), + // verbose + ...((process.env.VERBOSE_PRISMA_LOGS === "1" + ? [ { emit: "stdout", level: "query", @@ -317,6 +335,11 @@ function getReplicaClient() { }); } + // Add query performance monitoring for replica client + replicaClient.$on("query", (log) => { + queryPerformanceMonitor.onQuery("replica", log); + }); + // connect eagerly replicaClient.$connect(); diff --git a/apps/webapp/app/env.server.ts b/apps/webapp/app/env.server.ts index cf53fb4176..0b488b82eb 100644 --- a/apps/webapp/app/env.server.ts +++ b/apps/webapp/app/env.server.ts @@ -1080,6 +1080,8 @@ const EnvironmentSchema = z.object({ AI_RUN_FILTER_MODEL: z.string().optional(), EVENT_LOOP_MONITOR_THRESHOLD_MS: z.coerce.number().int().default(100), + + VERY_SLOW_QUERY_THRESHOLD_MS: z.coerce.number().int().optional(), }); export type Environment = z.infer; diff --git a/apps/webapp/app/routes/api.v1.projects.$projectRef.background-workers.$envSlug.$version.ts b/apps/webapp/app/routes/api.v1.projects.$projectRef.background-workers.$envSlug.$version.ts index f9411c2d15..90dc7a3661 100644 --- a/apps/webapp/app/routes/api.v1.projects.$projectRef.background-workers.$envSlug.$version.ts +++ b/apps/webapp/app/routes/api.v1.projects.$projectRef.background-workers.$envSlug.$version.ts @@ -82,9 +82,9 @@ export async function loader({ params, request }: LoaderFunctionArgs) { }); } -function decompressContent(compressedBuffer: Buffer): string { - // First, we need to decode the base64 Buffer to get the actual compressed data - const decodedBuffer = Buffer.from(compressedBuffer.toString("utf-8"), "base64"); +function decompressContent(compressedBuffer: Uint8Array): string { + // Convert Uint8Array to Buffer and decode base64 in one step + const decodedBuffer = Buffer.from(Buffer.from(compressedBuffer).toString("utf-8"), "base64"); // Decompress the data const decompressedData = zlib.inflateSync(decodedBuffer); diff --git a/apps/webapp/app/utils/queryPerformanceMonitor.server.ts b/apps/webapp/app/utils/queryPerformanceMonitor.server.ts new file mode 100644 index 0000000000..69a11f22b3 --- /dev/null +++ b/apps/webapp/app/utils/queryPerformanceMonitor.server.ts @@ -0,0 +1,64 @@ +import { env } from "~/env.server"; +import { logger } from "~/services/logger.server"; + +export interface QueryPerformanceConfig { + verySlowQueryThreshold?: number; // ms + maxQueryLogLength: number; +} + +export class QueryPerformanceMonitor { + private config: QueryPerformanceConfig; + + constructor(config: Partial = {}) { + this.config = { + maxQueryLogLength: 1000, + ...config, + }; + } + + onQuery( + clientType: "writer" | "replica", + log: { + duration: number; + query: string; + params: string; + target: string; + timestamp: Date; + } + ) { + if (this.config.verySlowQueryThreshold === undefined) { + return; + } + + const { duration, query, params, target, timestamp } = log; + + // Only log very slow queries as errors + if (duration > this.config.verySlowQueryThreshold) { + // Truncate long queries for readability + const truncatedQuery = + query.length > this.config.maxQueryLogLength + ? query.substring(0, this.config.maxQueryLogLength) + "..." + : query; + + logger.error("Prisma: very slow database query", { + clientType, + durationMs: duration, + query: truncatedQuery, + target, + timestamp, + paramCount: this.countParams(query), + hasParams: params !== "[]" && params !== "", + }); + } + } + + private countParams(query: string): number { + // Count the number of $1, $2, etc. parameters in the query + const paramMatches = query.match(/\$\d+/g); + return paramMatches ? paramMatches.length : 0; + } +} + +export const queryPerformanceMonitor = new QueryPerformanceMonitor({ + verySlowQueryThreshold: env.VERY_SLOW_QUERY_THRESHOLD_MS, +}); diff --git a/apps/webapp/package.json b/apps/webapp/package.json index b6341aca5f..dfc07768e3 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -78,7 +78,7 @@ "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1", "@popperjs/core": "^2.11.8", - "@prisma/instrumentation": "^5.11.0", + "@prisma/instrumentation": "^6.14.0", "@radix-ui/react-accordion": "^1.2.11", "@radix-ui/react-alert-dialog": "^1.0.4", "@radix-ui/react-dialog": "^1.0.3", @@ -137,6 +137,7 @@ "dotenv": "^16.4.5", "effect": "^3.11.7", "emails": "workspace:*", + "eventsource": "^4.0.0", "evt": "^2.4.13", "express": "4.20.0", "framer-motion": "^10.12.11", @@ -214,9 +215,9 @@ "@remix-run/dev": "2.1.0", "@remix-run/eslint-config": "2.1.0", "@remix-run/testing": "^2.1.0", + "@sentry/cli": "2.50.2", "@swc/core": "^1.3.4", "@swc/helpers": "^0.4.11", - "@sentry/cli": "2.50.2", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.9", "@total-typescript/ts-reset": "^0.4.2", diff --git a/docker/Dockerfile b/docker/Dockerfile index 8757fe2aa5..01323432ec 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -36,9 +36,9 @@ RUN corepack enable ENV NODE_ENV production RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store pnpm install --prod --no-frozen-lockfile COPY --from=pruner --chown=node:node /triggerdotdev/internal-packages/database/prisma/schema.prisma /triggerdotdev/internal-packages/database/prisma/schema.prisma -# RUN pnpm add @prisma/client@5.1.1 -w +# RUN pnpm add @prisma/client@6.14.0 -w ENV NPM_CONFIG_IGNORE_WORKSPACE_ROOT_CHECK true -RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store pnpx prisma@5.4.1 generate --schema /triggerdotdev/internal-packages/database/prisma/schema.prisma +RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store pnpx prisma@6.14.0 generate --schema /triggerdotdev/internal-packages/database/prisma/schema.prisma ## Builder (builds the webapp) FROM base AS builder diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 26fbf25230..9a0b97569c 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -77,6 +77,7 @@ services: clickhouse: image: bitnami/clickhouse:latest + restart: always container_name: clickhouse environment: CLICKHOUSE_ADMIN_USER: default diff --git a/internal-packages/database/.gitignore b/internal-packages/database/.gitignore index 586a9f721b..74ffb04b14 100644 --- a/internal-packages/database/.gitignore +++ b/internal-packages/database/.gitignore @@ -1,3 +1,5 @@ node_modules # Ensure the .env symlink is not removed by accident !.env + +generated/prisma \ No newline at end of file diff --git a/internal-packages/database/package.json b/internal-packages/database/package.json index be3a505fdb..cd9b40db95 100644 --- a/internal-packages/database/package.json +++ b/internal-packages/database/package.json @@ -5,10 +5,12 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@prisma/client": "5.4.1" + "@prisma/client": "6.14.0", + "decimal.js": "^10.6.0" }, "devDependencies": { - "prisma": "5.4.1", + "@types/decimal.js": "^7.4.3", + "prisma": "6.14.0", "rimraf": "6.0.1" }, "scripts": { diff --git a/internal-packages/database/prisma/schema.prisma b/internal-packages/database/prisma/schema.prisma index 10df7a0398..ba5a8de266 100644 --- a/internal-packages/database/prisma/schema.prisma +++ b/internal-packages/database/prisma/schema.prisma @@ -6,8 +6,9 @@ datasource db { generator client { provider = "prisma-client-js" + output = "../generated/prisma" binaryTargets = ["native", "debian-openssl-1.1.x"] - previewFeatures = ["tracing", "metrics"] + previewFeatures = ["metrics"] } model User { diff --git a/internal-packages/database/src/index.ts b/internal-packages/database/src/index.ts index cb0f9d4eb9..94e211e91a 100644 --- a/internal-packages/database/src/index.ts +++ b/internal-packages/database/src/index.ts @@ -1,2 +1,2 @@ -export * from "@prisma/client"; +export * from "../generated/prisma"; export * from "./transaction"; diff --git a/internal-packages/database/src/transaction.ts b/internal-packages/database/src/transaction.ts index ac671a6f8e..5d0cdb85f0 100644 --- a/internal-packages/database/src/transaction.ts +++ b/internal-packages/database/src/transaction.ts @@ -1,4 +1,13 @@ -import { Prisma, PrismaClient } from "@prisma/client"; +import { PrismaClient } from "../generated/prisma"; +import { Decimal } from "decimal.js"; +import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library"; + +// Define the isolation levels manually +type TransactionIsolationLevel = + | "ReadUncommitted" + | "ReadCommitted" + | "RepeatableRead" + | "Serializable"; export type PrismaTransactionClient = Omit< PrismaClient, @@ -9,13 +18,13 @@ export type PrismaClientOrTransaction = PrismaClient | PrismaTransactionClient; export type PrismaReplicaClient = Omit; -export const Decimal = Prisma.Decimal; +export { Decimal }; function isTransactionClient(prisma: PrismaClientOrTransaction): prisma is PrismaTransactionClient { return !("$transaction" in prisma); } -export function isPrismaKnownError(error: unknown): error is Prisma.PrismaClientKnownRequestError { +export function isPrismaKnownError(error: unknown): error is PrismaClientKnownRequestError { return ( typeof error === "object" && error !== null && "code" in error && typeof error.code === "string" ); @@ -55,7 +64,7 @@ export type PrismaTransactionOptions = { timeout?: number; /** Sets the transaction isolation level. By default this is set to the value currently configured in your database. */ - isolationLevel?: Prisma.TransactionIsolationLevel; + isolationLevel?: TransactionIsolationLevel; swallowPrismaErrors?: boolean; @@ -70,7 +79,7 @@ export type PrismaTransactionOptions = { export async function $transaction( prisma: PrismaClientOrTransaction, fn: (prisma: PrismaTransactionClient) => Promise, - prismaError: (error: Prisma.PrismaClientKnownRequestError) => void, + prismaError: (error: PrismaClientKnownRequestError) => void, options?: PrismaTransactionOptions, attempt = 0 ): Promise { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 907ab245c5..ea79ed7518 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -342,8 +342,8 @@ importers: specifier: ^2.11.8 version: 2.11.8 '@prisma/instrumentation': - specifier: ^5.11.0 - version: 5.11.0 + specifier: ^6.14.0 + version: 6.14.0(@opentelemetry/api@1.9.0) '@radix-ui/react-accordion': specifier: ^1.2.11 version: 1.2.11(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0) @@ -518,6 +518,9 @@ importers: emails: specifier: workspace:* version: link:../../internal-packages/emails + eventsource: + specifier: ^4.0.0 + version: 4.0.0 evt: specifier: ^2.4.13 version: 2.4.13 @@ -973,12 +976,18 @@ importers: internal-packages/database: dependencies: '@prisma/client': - specifier: 5.4.1 - version: 5.4.1(prisma@5.4.1) + specifier: 6.14.0 + version: 6.14.0(prisma@6.14.0)(typescript@5.5.4) + decimal.js: + specifier: ^10.6.0 + version: 10.6.0 devDependencies: + '@types/decimal.js': + specifier: ^7.4.3 + version: 7.4.3 prisma: - specifier: 5.4.1 - version: 5.4.1 + specifier: 6.14.0 + version: 6.14.0(typescript@5.5.4) rimraf: specifier: 6.0.1 version: 6.0.1 @@ -2463,7 +2472,7 @@ packages: optional: true dependencies: '@ai-sdk/provider': 1.0.0 - eventsource-parser: 3.0.0 + eventsource-parser: 3.0.3 nanoid: 5.1.5 secure-json-parse: 2.7.0 zod: 3.25.76 @@ -8604,16 +8613,6 @@ packages: '@opentelemetry/api': 1.9.0 dev: false - /@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: false - /@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0): resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==} engines: {node: '>=14'} @@ -9182,23 +9181,6 @@ packages: - supports-color dev: false - /@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.0.2 - import-in-the-middle: 1.7.1 - require-in-the-middle: 7.1.1(supports-color@10.0.0) - semver: 7.6.3 - shimmer: 1.2.1 - transitivePeerDependencies: - - supports-color - dev: false - /@opentelemetry/instrumentation@0.49.1(@opentelemetry/api@1.9.0): resolution: {integrity: sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==} engines: {node: '>=14'} @@ -9369,17 +9351,6 @@ packages: engines: {node: '>=14'} dev: false - /@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: false - /@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0): resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==} engines: {node: '>=14'} @@ -9518,18 +9489,6 @@ packages: - supports-color dev: false - /@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: false - /@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0): resolution: {integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==} engines: {node: '>=14'} @@ -9616,11 +9575,6 @@ packages: '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) dev: false - /@opentelemetry/semantic-conventions@1.22.0: - resolution: {integrity: sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==} - engines: {node: '>=14'} - dev: false - /@opentelemetry/semantic-conventions@1.25.1: resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==} engines: {node: '>=14'} @@ -9686,40 +9640,73 @@ packages: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@prisma/client@5.4.1(prisma@5.4.1): - resolution: {integrity: sha512-xyD0DJ3gRNfLbPsC+YfMBBuLJtZKQfy1OD2qU/PZg+HKrr7SO+09174LMeTlWP0YF2wca9LxtVd4HnAiB5ketQ==} - engines: {node: '>=16.13'} + /@prisma/client@6.14.0(prisma@6.14.0)(typescript@5.5.4): + resolution: {integrity: sha512-8E/Nk3eL5g7RQIg/LUj1ICyDmhD053STjxrPxUtCRybs2s/2sOEcx9NpITuAOPn07HEpWBfhAVe1T/HYWXUPOw==} + engines: {node: '>=18.18'} requiresBuild: true peerDependencies: prisma: '*' + typescript: '>=5.1.0' peerDependenciesMeta: prisma: optional: true + typescript: + optional: true dependencies: - '@prisma/engines-version': 5.4.1-1.2f302df92bd8945e20ad4595a73def5b96afa54f - prisma: 5.4.1 + prisma: 6.14.0(typescript@5.5.4) + typescript: 5.5.4 dev: false - /@prisma/engines-version@5.4.1-1.2f302df92bd8945e20ad4595a73def5b96afa54f: - resolution: {integrity: sha512-+nUQM/y8C+1GG5Ioeqcu6itFslCfxvQSAUVSMC9XM2G2Fcq0F4Afnp6m0pXF6X6iUBWen7jZBPmM9Qlq4Nr3/A==} - dev: false + /@prisma/config@6.14.0: + resolution: {integrity: sha512-IwC7o5KNNGhmblLs23swnfBjADkacBb7wvyDXUWLwuvUQciKJZqyecU0jw0d7JRkswrj+XTL8fdr0y2/VerKQQ==} + dependencies: + c12: 3.1.0 + deepmerge-ts: 7.1.5 + effect: 3.16.12 + empathic: 2.0.0 + transitivePeerDependencies: + - magicast + + /@prisma/debug@6.14.0: + resolution: {integrity: sha512-j4Lf+y+5QIJgQD4sJWSbkOD7geKx9CakaLp/TyTy/UDu9Wo0awvWCBH/BAxTHUaCpIl9USA5VS/KJhDqKJSwug==} - /@prisma/engines@5.4.1: - resolution: {integrity: sha512-vJTdY4la/5V3N7SFvWRmSMUh4mIQnyb/MNoDjzVbh9iLmEC+uEykj/1GPviVsorvfz7DbYSQC4RiwmlEpTEvGA==} + /@prisma/engines-version@6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49: + resolution: {integrity: sha512-EgN9ODJpiX45yvwcngoStp3uQPJ3l+AEVoQ6dMMO2QvmwIlnxfApzKmJQExzdo7/hqQANrz5txHJdGYHzOnGHA==} + + /@prisma/engines@6.14.0: + resolution: {integrity: sha512-LhJjqsALFEcoAtF07nSaOkVguaxw/ZsgfROIYZ8bAZDobe7y8Wy+PkYQaPOK1iLSsFgV2MhCO/eNrI1gdSOj6w==} requiresBuild: true + dependencies: + '@prisma/debug': 6.14.0 + '@prisma/engines-version': 6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49 + '@prisma/fetch-engine': 6.14.0 + '@prisma/get-platform': 6.14.0 - /@prisma/instrumentation@5.11.0: - resolution: {integrity: sha512-ou4nvDpNEY6+t3Dn9juOTz6tK33D0Y4XXkEZ2uPd8KH6Mqmc+4LYOOm470DP7noj7dyJjuGiM+wpPk//HKrcDg==} + /@prisma/fetch-engine@6.14.0: + resolution: {integrity: sha512-MPzYPOKMENYOaY3AcAbaKrfvXVlvTc6iHmTXsp9RiwCX+bPyfDMqMFVUSVXPYrXnrvEzhGHfyiFy0PRLHPysNg==} 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) + '@prisma/debug': 6.14.0 + '@prisma/engines-version': 6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49 + '@prisma/get-platform': 6.14.0 + + /@prisma/get-platform@6.14.0: + resolution: {integrity: sha512-7VjuxKNwjnBhKfqPpMeWiHEa2sVjYzmHdl1slW6STuUCe9QnOY0OY1ljGSvz6wpG4U8DfbDqkG1yofd/1GINww==} + dependencies: + '@prisma/debug': 6.14.0 + + /@prisma/instrumentation@6.11.1(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-mrZOev24EDhnefmnZX7WVVT7v+r9LttPRqf54ONvj6re4XMF7wFTpK2tLJi4XHB7fFp/6xhYbgRel8YV7gQiyA==} + peerDependencies: + '@opentelemetry/api': ^1.8 + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color dev: false - /@prisma/instrumentation@6.11.1(@opentelemetry/api@1.9.0): - resolution: {integrity: sha512-mrZOev24EDhnefmnZX7WVVT7v+r9LttPRqf54ONvj6re4XMF7wFTpK2tLJi4XHB7fFp/6xhYbgRel8YV7gQiyA==} + /@prisma/instrumentation@6.14.0(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-Po/Hry5bAeunRDq0yAQueKookW3glpP+qjjvvyOfm6dI2KG5/Y6Bgg3ahyWd7B0u2E+Wf9xRk2rtdda7ySgK1A==} peerDependencies: '@opentelemetry/api': ^1.8 dependencies: @@ -17695,6 +17682,13 @@ packages: '@types/ms': 0.7.31 dev: true + /@types/decimal.js@7.4.3: + resolution: {integrity: sha512-7MpxcJPHqQ637FCZwJLtJMaDZkcD/iyUxj0m8A+m06slFeqRiK9QtgEyuocWNRbEtCrOZOEbZPTSSR88hMZVsg==} + deprecated: This is a stub types definition. decimal.js provides its own type definitions, so you do not need this installed. + dependencies: + decimal.js: 10.6.0 + dev: true + /@types/diff-match-patch@1.0.36: resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} @@ -20183,6 +20177,27 @@ packages: rc9: 2.1.2 dev: false + /c12@3.1.0: + resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + 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.3.0 + rc9: 2.1.2 + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -20406,7 +20421,6 @@ packages: engines: {node: '>= 14.16.0'} dependencies: readdirp: 4.1.2 - dev: true /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -20449,7 +20463,6 @@ packages: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} dependencies: consola: 3.4.2 - dev: false /cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} @@ -20756,7 +20769,6 @@ packages: /confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} - dev: false /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -20765,11 +20777,6 @@ packages: proto-list: 1.2.4 dev: false - /consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} - dev: false - /consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -21342,6 +21349,9 @@ packages: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} dev: false + /decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: @@ -21378,6 +21388,10 @@ packages: resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} dev: true + /deepmerge-ts@7.1.5: + resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} + engines: {node: '>=16.0.0'} + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -21473,7 +21487,6 @@ packages: /destr@2.0.3: resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} - dev: false /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} @@ -21659,6 +21672,10 @@ packages: engines: {node: '>=12'} dev: true + /dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + /dotenv@8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} @@ -21746,6 +21763,12 @@ packages: fast-check: 3.22.0 dev: false + /effect@3.16.12: + resolution: {integrity: sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==} + dependencies: + '@standard-schema/spec': 1.0.0 + fast-check: 3.23.2 + /effect@3.17.1: resolution: {integrity: sha512-t917ks10FGNf7MpwOxHUg6vo42p0XsdMHuBMVpy4NttPu5gIv8/ah5MgbHLVQJ2kmDvZfQUT1/xyCa1IR09u2Q==} dependencies: @@ -21777,6 +21800,10 @@ packages: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} dev: true + /empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -23105,6 +23132,13 @@ packages: eventsource-parser: 3.0.0 dev: false + /eventsource@4.0.0: + resolution: {integrity: sha512-fvIkb9qZzdMxgZrEQDyll+9oJsyaVvY92I2Re+qK0qEJ+w5s0X3dtz+M0VAPOjP1gtU3iqWyjQ0G3nvd5CLZ2g==} + engines: {node: '>=20.0.0'} + dependencies: + eventsource-parser: 3.0.3 + dev: false + /evt@2.4.13: resolution: {integrity: sha512-haTVOsmjzk+28zpzvVwan9Zw2rLQF2izgi7BKjAPRzZAfcv+8scL0TpM8MzvGNKFYHiy+Bq3r6FYIIUPl9kt3A==} dependencies: @@ -23244,6 +23278,9 @@ packages: - supports-color dev: false + /exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -23958,15 +23995,26 @@ packages: hasBin: true dependencies: citty: 0.1.6 - consola: 3.2.3 + consola: 3.4.2 defu: 6.1.4 - node-fetch-native: 1.6.4 + node-fetch-native: 1.6.6 nypm: 0.3.9 ohash: 1.1.3 pathe: 1.1.2 tar: 6.2.1 dev: false + /giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + dependencies: + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.6 + nypm: 0.6.1 + pathe: 2.0.3 + /git-last-commit@1.0.1: resolution: {integrity: sha512-FDSgeMqa7GnJDxt/q0AbrxbfeTyxp4ImxEw1e4nw6NUHA5FMhFUq33dTXI4Xdgcj1VQ1q5QLWF6WxFrJ8KCBOg==} dev: false @@ -25142,7 +25190,6 @@ packages: /jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - dev: true /joi@17.7.0: resolution: {integrity: sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==} @@ -27326,9 +27373,8 @@ packages: skin-tone: 2.0.0 dev: true - /node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} - dev: false + /node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} /node-fetch@2.6.12: resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} @@ -27511,6 +27557,17 @@ packages: ufo: 1.5.4 dev: false + /nypm@0.6.1: + resolution: {integrity: sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.3.0 + tinyexec: 1.0.1 + /oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: false @@ -27628,6 +27685,9 @@ packages: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} dev: false + /ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + /oidc-token-hash@5.0.3: resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} engines: {node: ^10.13.0 || >=12.0.0} @@ -28208,7 +28268,6 @@ packages: /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - dev: false /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -28436,6 +28495,13 @@ packages: pathe: 2.0.3 dev: false + /pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + /platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} dev: false @@ -29012,13 +29078,22 @@ packages: react: 18.2.0 dev: false - /prisma@5.4.1: - resolution: {integrity: sha512-op9PmU8Bcw5dNAas82wBYTG0yHnpq9/O3bhxbDBrNzwZTwBqsVCxxYRLf6wHNh9HVaDGhgjjHlu1+BcW8qdnBg==} - engines: {node: '>=16.13'} + /prisma@6.14.0(typescript@5.5.4): + resolution: {integrity: sha512-QEuCwxu+Uq9BffFw7in8In+WfbSUN0ewnaSUKloLkbJd42w6EyFckux4M0f7VwwHlM3A8ssaz4OyniCXlsn0WA==} + engines: {node: '>=18.18'} hasBin: true requiresBuild: true + peerDependencies: + typescript: '>=5.1.0' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@prisma/engines': 5.4.1 + '@prisma/config': 6.14.0 + '@prisma/engines': 6.14.0 + typescript: 5.5.4 + transitivePeerDependencies: + - magicast /prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} @@ -29318,7 +29393,6 @@ packages: dependencies: defu: 6.1.4 destr: 2.0.3 - dev: false /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} @@ -29977,7 +30051,6 @@ packages: /readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - dev: true /real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} @@ -32260,6 +32333,9 @@ packages: /tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + /tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + /tinyglobby@0.2.10: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} engines: {node: '>=12.0.0'}