From 7d8e8fc4c103be4bd01061be8259e1c63205d6d8 Mon Sep 17 00:00:00 2001 From: Vegard Hovland Date: Wed, 26 Aug 2026 18:31:42 +0200 Subject: [PATCH 1/4] Update Zod to 4.0 This needed several changes - pipe made int transform with parseWithSchema function - string().date() made into iso.date() as with time and datetime - other smaller changes --- db/config/parameters.ts | 78 ++++++------ db/errors/postgres-error-constants-parsers.ts | 2 +- db/errors/postgres-error.ts | 22 ++-- lib/finance-parsers.ts | 3 +- lib/json-schema.ts | 2 - lib/lib.ts | 13 -- lib/network-parsers.ts | 19 ++- lib/time-parsers.ts | 12 +- lib/zod.ts | 26 ++++ openapi/config.ts | 9 +- package.json | 12 +- pnpm-lock.yaml | 115 +++++++++--------- src/db-access/applications.ts | 5 +- src/request-handling/applications.ts | 61 +++++++--- src/request-handling/common.ts | 23 ++-- src/request-handling/expenses.ts | 17 ++- src/request-handling/interviews.ts | 9 +- src/request-handling/schools.ts | 6 +- src/request-handling/semesters.ts | 29 +++-- src/request-handling/sponsors.ts | 13 +- src/request-handling/teams.ts | 7 +- src/request-handling/users.ts | 18 ++- 22 files changed, 284 insertions(+), 217 deletions(-) delete mode 100644 lib/lib.ts create mode 100644 lib/zod.ts diff --git a/db/config/parameters.ts b/db/config/parameters.ts index 27726e1..d92e706 100644 --- a/db/config/parameters.ts +++ b/db/config/parameters.ts @@ -16,51 +16,55 @@ const parametersResult = z DATABASE_PASSWORD: z.string().nonempty(), DATABASE_PORT: toPortParser, DATABASE_SSL_OPTION: z - .union([ - z.literal("prod").transform(() => { - return { - requestCert: true, - rejectUnauthorized: true, - } as ConnectionOptions; - }), - z.literal("prod-provide_ca_cert").transform((_, ctx) => { - const caCert = getCaCert(); - if (caCert === undefined) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Could not find ca certificate", - }); - return z.NEVER; - } - return { - requestCert: true, - rejectUnauthorized: true, - ca: caCert, - } as ConnectionOptions; - }), - z.literal("dev").transform(() => { - return { - requestCert: true, - rejectUnauthorized: false, - } as ConnectionOptions; - }), - z.literal("true").transform(() => { - return true; - }), - z.literal("false").transform(() => { - return false; - }), - ]) + .enum(["prod", "prod-provide_ca_cert", "dev", "true", "false"]) .default("prod"), }) - .transform((schema) => { + .transform((schema, ctx) => { + let ssl: boolean | ConnectionOptions; + switch (schema.DATABASE_SSL_OPTION) { + case "prod": + ssl = { + requestCert: true, + rejectUnauthorized: true, + }; + break; + case "prod-provide_ca_cert": { + const caCert = getCaCert(); + if (caCert === undefined) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Could not find ca certificate", + path: ["DATABASE_SSL_OPTION"], + }); + return z.NEVER; + } + ssl = { + requestCert: true, + rejectUnauthorized: true, + ca: caCert, + }; + break; + } + case "dev": + ssl = { + requestCert: true, + rejectUnauthorized: false, + }; + break; + case "true": + ssl = true; + break; + case "false": + ssl = false; + break; + } return { host: schema.DATABASE_HOST.trim(), database: schema.DATABASE_NAME.trim(), user: schema.DATABASE_USER.trim(), password: schema.DATABASE_PASSWORD.trim(), port: schema.DATABASE_PORT, - ssl: schema.DATABASE_SSL_OPTION, + ssl, }; }) .safeParse(env); diff --git a/db/errors/postgres-error-constants-parsers.ts b/db/errors/postgres-error-constants-parsers.ts index cd23aae..346d207 100644 --- a/db/errors/postgres-error-constants-parsers.ts +++ b/db/errors/postgres-error-constants-parsers.ts @@ -6,7 +6,7 @@ import { POSTGRES_NOTICE_SEVERITIES, PUBLIC_POSTGRES_ERROR_CLASSES, } from "@/db/errors/postgres-error-constants"; -import { zodEnumFromObjKeys } from "@/lib/lib"; +import { zodEnumFromObjKeys } from "@/lib/zod"; import { z } from "zod"; export const postgresErrorCodeParser = zodEnumFromObjKeys( diff --git a/db/errors/postgres-error.ts b/db/errors/postgres-error.ts index 242821e..83f8efa 100644 --- a/db/errors/postgres-error.ts +++ b/db/errors/postgres-error.ts @@ -5,12 +5,19 @@ import { postgresSeverityParser, publicPostgresErrorClassParser, } from "@/db/errors/postgres-error-constants-parsers"; +import { parseWithSchema } from "@/lib/zod"; import { z } from "zod"; // Inspiration from // https://www.postgresql.org/docs/9.3/protocol-error-fields.html and // https://github.com/brianc/node-postgres/blob/master/packages/pg-protocol/src/messages.ts +const nonnegativeIntFromStringParser = z + .string() + .transform( + parseWithSchema(z.coerce.number().finite().safe().int().nonnegative()), + ); + export const postgresErrorParser = z .object({ length: z.number().finite().safe().int().nonnegative(), @@ -19,14 +26,8 @@ export const postgresErrorParser = z severity: postgresSeverityParser, detail: z.string().optional(), hint: z.string().optional(), - position: z - .string() - .pipe(z.coerce.number().finite().safe().int().nonnegative()) - .optional(), - internalPosition: z - .string() - .pipe(z.coerce.number().finite().safe().int().nonnegative()) - .optional(), + position: nonnegativeIntFromStringParser.optional(), + internalPosition: nonnegativeIntFromStringParser.optional(), internalQuery: z.string().optional(), where: z.string().optional(), schema: z.string().optional(), @@ -35,10 +36,7 @@ export const postgresErrorParser = z dataType: z.string().optional(), constaint: z.string().optional(), file: z.string().optional(), - line: z - .string() - .pipe(z.coerce.number().finite().safe().int().nonnegative()) - .optional(), + line: nonnegativeIntFromStringParser.optional(), routine: z.string().optional(), }) .readonly() diff --git a/lib/finance-parsers.ts b/lib/finance-parsers.ts index 86b4dc2..8757834 100644 --- a/lib/finance-parsers.ts +++ b/lib/finance-parsers.ts @@ -1,3 +1,4 @@ +import { parseWithSchema } from "@/lib/zod"; import validator from "validator"; import { z } from "zod"; @@ -27,4 +28,4 @@ export const norwegianBankAccountNumberParser = z .string() .length(11) .transform((string) => `NO93${string}`) - .pipe(norwegianIbanParser); + .transform(parseWithSchema(norwegianIbanParser)); diff --git a/lib/json-schema.ts b/lib/json-schema.ts index 253a616..d19b6a4 100644 --- a/lib/json-schema.ts +++ b/lib/json-schema.ts @@ -43,8 +43,6 @@ export function turnJsonIntoZodSchema(schema: AnySchema) { params: validationResult.error, }); } - - return validationResult.success; }); } diff --git a/lib/lib.ts b/lib/lib.ts deleted file mode 100644 index 1c91475..0000000 --- a/lib/lib.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { z } from "zod"; - -// modified from https://github.com/colinhacks/zod/discussions/839#discussioncomment-4335236 -export function zodEnumFromObjKeys( - obj: Record, -): z.ZodEnum<[K, ...K[]]> { - const [firstKey, ...otherKeys] = Object.keys(obj) as K[]; - return z.enum([firstKey, ...otherKeys]); -} -const phoneNumberRegex = /^\d{8}$/; -export const phoneNumberParser = z - .string() - .regex(phoneNumberRegex, "Phone number must be 8 digits"); diff --git a/lib/network-parsers.ts b/lib/network-parsers.ts index b72256d..d264c7a 100644 --- a/lib/network-parsers.ts +++ b/lib/network-parsers.ts @@ -1,24 +1,23 @@ +import { isIP } from "node:net"; import { z } from "zod"; export const portParser = z - .number({ - invalid_type_error: "not a valid port. must be a number", - }) + .number({ error: "not a valid port. must be a number" }) .nonnegative("ports cannot be negative numbers") .max(65535, "ports cannot be higher than 65535(2^16 - 1)") .finite() .safe() .int("ports must have integer values"); -export const toPortParser = z - .union([z.number(), z.string()]) - .pipe(z.coerce.number()) - .pipe(portParser); +export const toPortParser = z.coerce.number().pipe(portParser); export const hostingStringParser = z.union( - [z.literal("localhost"), z.string().url(), z.string().ip()], + [ + z.literal("localhost"), + z.string().url(), + z.string().refine((value) => isIP(value) !== 0, "not a valid IP address"), + ], { - invalid_type_error: - "not a valid host string, must be localhost, a url or an IP-adress", + error: "not a valid host string, must be localhost, a url or an IP-adress", }, ); diff --git a/lib/time-parsers.ts b/lib/time-parsers.ts index 6f9751b..fbe976e 100644 --- a/lib/time-parsers.ts +++ b/lib/time-parsers.ts @@ -1,17 +1,17 @@ +import { parseWithSchema } from "@/lib/zod"; import { z } from "zod"; export const timeStringParser = z.union([ - z.string().date(), - z.string().time(), - z.string().datetime(), + z.iso.date(), + z.iso.time(), + z.iso.datetime(), ]); // Date here refers to the JS object date, so it allows more specific times than dates export const dateParser = z.date(); export const toDateParser = z .union([timeStringParser, z.date()]) - .pipe(z.coerce.date()) - .pipe(dateParser); + .transform(parseWithSchema(z.coerce.date())); export const datePeriodParser = z .object({ @@ -27,7 +27,7 @@ export const toDatePeriodParser = z startDate: toDateParser, endDate: toDateParser, }) - .pipe(datePeriodParser); + .transform(parseWithSchema(datePeriodParser)); export const pastDateParser = dateParser.max(new Date()); export const futureDateParser = dateParser.min(new Date()); diff --git a/lib/zod.ts b/lib/zod.ts new file mode 100644 index 0000000..5e8a504 --- /dev/null +++ b/lib/zod.ts @@ -0,0 +1,26 @@ +import { z } from "zod"; + +export function parseWithSchema(schema: T) { + return (value: unknown, ctx: z.RefinementCtx): z.output => { + const result = schema.safeParse(value); + if (!result.success) { + for (const issue of result.error.issues) { + ctx.addIssue({ ...issue }); + } + return z.NEVER; + } + return result.data; + }; +} + +// modified from https://github.com/colinhacks/zod/discussions/839#discussioncomment-4335236 +export function zodEnumFromObjKeys( + obj: Record, +): z.ZodEnum> { + const keys = Object.keys(obj) as K[]; + return z.enum(keys); +} +const phoneNumberRegex = /^\d{8}$/; +export const phoneNumberParser = z + .string() + .regex(phoneNumberRegex, "Phone number must be 8 digits"); diff --git a/openapi/config.ts b/openapi/config.ts index e78bdea..857c386 100644 --- a/openapi/config.ts +++ b/openapi/config.ts @@ -1,4 +1,3 @@ -import "zod-openapi/extend"; import { datePeriodParser } from "@/lib/time-parsers"; import { hostOptions } from "@/src/enviroment"; import { teamApplicationParser } from "@/src/request-handling/applications"; @@ -88,10 +87,10 @@ const openapiDocument = createDocument({ teams: teamsRequestParser, }, parameters: { - id: serialIdParser.openapi({ param: { in: "path", name: "id" } }), - limit: limitParser.openapi({ param: { in: "query", name: "limit" } }), - sort: sortParser.openapi({ param: { in: "query", name: "sort" } }), - offset: offsetParser.openapi({ + id: serialIdParser.meta({ param: { in: "path", name: "id" } }), + limit: limitParser.meta({ param: { in: "query", name: "limit" } }), + sort: sortParser.meta({ param: { in: "query", name: "sort" } }), + offset: offsetParser.meta({ param: { in: "query", name: "offset" }, }), }, diff --git a/package.json b/package.json index efd64d6..71453f6 100644 --- a/package.json +++ b/package.json @@ -25,17 +25,17 @@ "ajv": "^8.17.1", "cors": "^2.8.5", "dotenv": "^16.4.7", - "drizzle-orm": "^0.33.0", + "drizzle-orm": "^0.45.2", "drizzle-seed": "^0.3.1", - "drizzle-zod": "^0.5.1", + "drizzle-zod": "^0.8.3", "express": "^5.1.0", - "express-zod-safe": "^1.3.3", + "express-zod-safe": "^3.2.1", "pg": "^8.14.1", "swagger-jsdoc": "^6.2.8", "validator": "^13.15.0", - "zod": "^3.24.2", - "zod-openapi": "^3.3.0", - "zod-validation-error": "^3.4.0" + "zod": "^4.4.3", + "zod-openapi": "^6.0.1", + "zod-validation-error": "^5.0.0" }, "devDependencies": { "@biomejs/biome": "1.9.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f26c070..41c154d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,20 +18,20 @@ importers: specifier: ^16.4.7 version: 16.4.7 drizzle-orm: - specifier: ^0.33.0 - version: 0.33.0(@types/pg@8.11.11)(pg@8.14.1) + specifier: ^0.45.2 + version: 0.45.2(@types/pg@8.11.11)(pg@8.14.1) drizzle-seed: specifier: ^0.3.1 - version: 0.3.1(drizzle-orm@0.33.0(@types/pg@8.11.11)(pg@8.14.1)) + version: 0.3.1(drizzle-orm@0.45.2(@types/pg@8.11.11)(pg@8.14.1)) drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.33.0(@types/pg@8.11.11)(pg@8.14.1))(zod@3.24.2) + specifier: ^0.8.3 + version: 0.8.3(drizzle-orm@0.45.2(@types/pg@8.11.11)(pg@8.14.1))(zod@4.4.3) express: specifier: ^5.1.0 version: 5.1.0 express-zod-safe: - specifier: ^1.3.3 - version: 1.3.3(@types/express@4.17.21)(express@5.1.0)(zod@3.24.2) + specifier: ^3.2.1 + version: 3.2.1(@types/express@4.17.21)(express@5.1.0)(zod@4.4.3) pg: specifier: ^8.14.1 version: 8.14.1 @@ -42,14 +42,14 @@ importers: specifier: ^13.15.0 version: 13.15.0 zod: - specifier: ^3.24.2 - version: 3.24.2 + specifier: ^4.4.3 + version: 4.4.3 zod-openapi: - specifier: ^3.3.0 - version: 3.3.0(zod@3.24.2) + specifier: ^6.0.1 + version: 6.0.1(zod@4.4.3) zod-validation-error: - specifier: ^3.4.0 - version: 3.4.0(zod@3.24.2) + specifier: ^5.0.0 + version: 5.0.0(zod@4.4.3) devDependencies: '@biomejs/biome': specifier: 1.9.3 @@ -811,35 +811,36 @@ packages: resolution: {integrity: sha512-nXOaTSFiuIaTMhS8WJC2d4EBeIcN9OSt2A2cyFbQYBAZbi7lRsVGJNqDpEwPqYfJz38yxbY/UtbvBBahBfnExQ==} hasBin: true - drizzle-orm@0.33.0: - resolution: {integrity: sha512-SHy72R2Rdkz0LEq0PSG/IdvnT3nGiWuRk+2tXZQ90GVq/XQhpCzu/EFT3V2rox+w8MlkBQxifF8pCStNYnERfA==} + drizzle-orm@0.45.2: + resolution: {integrity: sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=3' - '@electric-sql/pglite': '>=0.1.1' - '@libsql/client': '*' - '@neondatabase/serverless': '>=0.1' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' '@op-engineering/op-sqlite': '>=2' '@opentelemetry/api': ^1.4.1 - '@planetscale/database': '>=1' + '@planetscale/database': '>=1.13' '@prisma/client': '*' '@tidbcloud/serverless': '*' '@types/better-sqlite3': '*' '@types/pg': '*' - '@types/react': '>=18' '@types/sql.js': '*' + '@upstash/redis': '>=1.34.7' '@vercel/postgres': '>=0.8.0' '@xata.io/client': '*' better-sqlite3: '>=7' bun-types: '*' - expo-sqlite: '>=13.2.0' + expo-sqlite: '>=14.0.0' + gel: '>=2' knex: '*' kysely: '*' mysql2: '>=2' pg: '>=8' postgres: '>=3' prisma: '*' - react: '>=18' sql.js: '>=1' sqlite3: '>=5' peerDependenciesMeta: @@ -851,6 +852,8 @@ packages: optional: true '@libsql/client': optional: true + '@libsql/client-wasm': + optional: true '@neondatabase/serverless': optional: true '@op-engineering/op-sqlite': @@ -867,10 +870,10 @@ packages: optional: true '@types/pg': optional: true - '@types/react': - optional: true '@types/sql.js': optional: true + '@upstash/redis': + optional: true '@vercel/postgres': optional: true '@xata.io/client': @@ -881,6 +884,8 @@ packages: optional: true expo-sqlite: optional: true + gel: + optional: true knex: optional: true kysely: @@ -893,8 +898,6 @@ packages: optional: true prisma: optional: true - react: - optional: true sql.js: optional: true sqlite3: @@ -908,11 +911,11 @@ packages: drizzle-orm: optional: true - drizzle-zod@0.5.1: - resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} + drizzle-zod@0.8.3: + resolution: {integrity: sha512-66yVOuvGhKJnTdiqj1/Xaaz9/qzOdRJADpDa68enqS6g3t0kpNkwNYjUuaeXgZfO/UWuIM9HIhSlJ6C5ZraMww==} peerDependencies: - drizzle-orm: '>=0.23.13' - zod: '*' + drizzle-orm: '>=0.36.0' + zod: ^3.25.0 || ^4.0.0 dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} @@ -972,12 +975,12 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - express-zod-safe@1.3.3: - resolution: {integrity: sha512-DDYamsIyHpQJOoYOS395+zsAdFIuuqteDcVKUEBGU4Pi5vFf6mwLReSiReT0aNW1kpnXKbktgKzw5wUP7SmPgA==} + express-zod-safe@3.2.1: + resolution: {integrity: sha512-fPq5dU7JbkEYrPRWF3/uG9MozrczOZJtXcaKAwzn/lIFkfsm7jc4HtVj+43j2+qaNdYXwVpbr2c3mJyjQInTYQ==} peerDependencies: '@types/express': ^4.0.0 || ^5.0.0 express: ^4.0.0 || ^5.0.0 - zod: ^3.0.0 + zod: ^4.0.0 express@5.1.0: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} @@ -1501,20 +1504,20 @@ packages: engines: {node: '>=8.0.0'} hasBin: true - zod-openapi@3.3.0: - resolution: {integrity: sha512-9CouRzPrmKU4Rggb8dPgVrNq6SZTUjdMO+6TvpE2ylkDYlap/Agjce2LZwG4ZwEVEVyZ1s5KnkiL4hn//G3gIA==} - engines: {node: '>=18'} + zod-openapi@6.0.1: + resolution: {integrity: sha512-ITUfaevP/JcrsOavyVHFQHz788F7YcmN8wFYRZk20UM16BUafdUzxq8ZM4ahyTv3c6ESvY9ywA+MwLXzIvVVAw==} + engines: {node: '>=22.14.0'} peerDependencies: - zod: ^3.21.4 + zod: ^4.0.0 - zod-validation-error@3.4.0: - resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} + zod-validation-error@5.0.0: + resolution: {integrity: sha512-hmk+pkyKq7Q71PiWVSDUc3VfpzpvcRHZ3QPw9yEMVvmtCekaMeOHnbr3WbxfrgEnQTv6haGP4cmv0Ojmihzsxw==} engines: {node: '>=18.0.0'} peerDependencies: - zod: ^3.18.0 + zod: ^3.25.0 || ^4.0.0 - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} snapshots: @@ -2029,21 +2032,21 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.33.0(@types/pg@8.11.11)(pg@8.14.1): + drizzle-orm@0.45.2(@types/pg@8.11.11)(pg@8.14.1): optionalDependencies: '@types/pg': 8.11.11 pg: 8.14.1 - drizzle-seed@0.3.1(drizzle-orm@0.33.0(@types/pg@8.11.11)(pg@8.14.1)): + drizzle-seed@0.3.1(drizzle-orm@0.45.2(@types/pg@8.11.11)(pg@8.14.1)): dependencies: pure-rand: 6.1.0 optionalDependencies: - drizzle-orm: 0.33.0(@types/pg@8.11.11)(pg@8.14.1) + drizzle-orm: 0.45.2(@types/pg@8.11.11)(pg@8.14.1) - drizzle-zod@0.5.1(drizzle-orm@0.33.0(@types/pg@8.11.11)(pg@8.14.1))(zod@3.24.2): + drizzle-zod@0.8.3(drizzle-orm@0.45.2(@types/pg@8.11.11)(pg@8.14.1))(zod@4.4.3): dependencies: - drizzle-orm: 0.33.0(@types/pg@8.11.11)(pg@8.14.1) - zod: 3.24.2 + drizzle-orm: 0.45.2(@types/pg@8.11.11)(pg@8.14.1) + zod: 4.4.3 dunder-proto@1.0.1: dependencies: @@ -2162,11 +2165,11 @@ snapshots: etag@1.8.1: {} - express-zod-safe@1.3.3(@types/express@4.17.21)(express@5.1.0)(zod@3.24.2): + express-zod-safe@3.2.1(@types/express@4.17.21)(express@5.1.0)(zod@4.4.3): dependencies: '@types/express': 4.17.21 express: 5.1.0 - zod: 3.24.2 + zod: 4.4.3 express@5.1.0: dependencies: @@ -2716,12 +2719,12 @@ snapshots: optionalDependencies: commander: 9.5.0 - zod-openapi@3.3.0(zod@3.24.2): + zod-openapi@6.0.1(zod@4.4.3): dependencies: - zod: 3.24.2 + zod: 4.4.3 - zod-validation-error@3.4.0(zod@3.24.2): + zod-validation-error@5.0.0(zod@4.4.3): dependencies: - zod: 3.24.2 + zod: 4.4.3 - zod@3.24.2: {} + zod@4.4.3: {} diff --git a/src/db-access/applications.ts b/src/db-access/applications.ts index 9d834c7..60c1092 100644 --- a/src/db-access/applications.ts +++ b/src/db-access/applications.ts @@ -214,7 +214,10 @@ export async function insertTeamApplication( semester: teamApplication.semester, }) .returning(); - const newApplicationId = newApplication[0].id; + const newApplicationId = newApplication[0]?.id; + if (newApplicationId === undefined) { + throw ormError("Failed to insert all entries"); + } const newTeamApplicationResult = await tx .insert(teamApplicationsTable) diff --git a/src/request-handling/applications.ts b/src/request-handling/applications.ts index a3df681..be8f084 100644 --- a/src/request-handling/applications.ts +++ b/src/request-handling/applications.ts @@ -4,10 +4,21 @@ import { teamApplicationsTable, } from "@/db/tables/applications"; import { MAX_TEXT_LENGTH } from "@/lib/global-variables"; +import { parseWithSchema } from "@/lib/zod"; import { serialIdParser } from "@/src/request-handling/common"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; +const applicationInsertSchema = createInsertSchema(applicationsTable).strict(); +const teamApplicationInsertSchema = createInsertSchema(teamApplicationsTable) + .merge(applicationInsertSchema) + .strict(); +const assistantApplicationInsertSchema = createInsertSchema( + assistantApplicationsTable, +) + .merge(applicationInsertSchema) + .strict(); + export const applicationParser = z .object({ firstName: z @@ -62,30 +73,40 @@ export const assistantApplicationParser = z .strict(); export const applicationToInsertParser = applicationParser - .extend({}) - .pipe(createInsertSchema(applicationsTable).strict().readonly()); + .transform((application) => ({ + ...application, + firstName: application.firstName.trim(), + lastName: application.lastName.trim(), + email: application.email.trim().toLowerCase(), + gender: application.gender.toLowerCase() as "female" | "male" | "other", + phonenumber: application.phonenumber.trim(), + })) + .transform(parseWithSchema(applicationInsertSchema)); export const teamApplicationToInsertParser = teamApplicationParser - .extend({ - email: teamApplicationParser.shape.email.trim().toLowerCase(), - motivationText: teamApplicationParser.shape.motivationText.trim(), - biography: teamApplicationParser.shape.biography.trim(), - }) - .pipe( - createInsertSchema(teamApplicationsTable) - .merge(createInsertSchema(applicationsTable)) - .strict() - .readonly(), - ); + .transform((application) => ({ + ...application, + firstName: application.firstName.trim(), + lastName: application.lastName.trim(), + email: application.email.trim().toLowerCase(), + gender: application.gender.toLowerCase() as "female" | "male" | "other", + phonenumber: application.phonenumber.trim(), + motivationText: application.motivationText.trim(), + biography: application.biography.trim(), + teamInterest: false, + })) + .transform(parseWithSchema(teamApplicationInsertSchema)); export const assistantApplicationToInsertParser = assistantApplicationParser - .extend({}) - .pipe( - createInsertSchema(assistantApplicationsTable) - .merge(createInsertSchema(applicationsTable)) - .strict() - .readonly(), - ); + .transform((application) => ({ + ...application, + firstName: application.firstName.trim(), + lastName: application.lastName.trim(), + email: application.email.trim().toLowerCase(), + gender: application.gender.toLowerCase() as "female" | "male" | "other", + phonenumber: application.phonenumber.trim(), + })) + .transform(parseWithSchema(assistantApplicationInsertSchema)); export const teamInterestParser = z.object({ applicationParentId: serialIdParser, diff --git a/src/request-handling/common.ts b/src/request-handling/common.ts index 32435cd..158fa19 100644 --- a/src/request-handling/common.ts +++ b/src/request-handling/common.ts @@ -1,9 +1,9 @@ import { DEFAULT_QUERY_LIMIT } from "@/lib/global-variables"; +import { parseWithSchema } from "@/lib/zod"; import { z } from "zod"; export const sortParser = z .enum(["desc", "asc"]) - .optional() .default("desc") .describe("Sort descending or acending"); export const limitParser = z @@ -16,8 +16,7 @@ export const limitParser = z .describe("Amount of items requested"); export const toLimitParser = z .union([z.number(), z.string()]) - .pipe(z.coerce.number()) - .pipe(limitParser) + .transform(parseWithSchema(limitParser)) .default(DEFAULT_QUERY_LIMIT); export const offsetParser = z .number() @@ -29,26 +28,22 @@ export const offsetParser = z .describe("Offset for pagination"); export const toOffsetParser = z .union([z.number(), z.string()]) - .pipe(z.coerce.number()) - .pipe(offsetParser) + .transform(parseWithSchema(offsetParser)) .default(0); export const listQueryParser = z.object({ sort: sortParser, limit: limitParser, offset: offsetParser, }); -export const toListQueryParser = z - .object({ - sort: sortParser, - limit: toLimitParser, - offset: toOffsetParser, - }) - .pipe(listQueryParser); +export const toListQueryParser = z.object({ + sort: sortParser, + limit: toLimitParser, + offset: toOffsetParser, +}); export type QueryParameters = z.infer; export const serialIdParser = z.number().finite().safe().positive().int(); export const toSerialIdParser = z .union([z.number(), z.string()]) - .pipe(z.coerce.number()) - .pipe(serialIdParser); + .transform(parseWithSchema(serialIdParser)); diff --git a/src/request-handling/expenses.ts b/src/request-handling/expenses.ts index 21d7d21..c2f079a 100644 --- a/src/request-handling/expenses.ts +++ b/src/request-handling/expenses.ts @@ -4,10 +4,13 @@ import { norwegianBankAccountNumberParser, } from "@/lib/finance-parsers"; import { timeStringParser } from "@/lib/time-parsers"; +import { parseWithSchema } from "@/lib/zod"; import { serialIdParser } from "@/src/request-handling/common"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; +const expenseInsertSchema = createInsertSchema(expensesTable).strict().readonly(); + export const expenseRequestParser = z .object({ userId: serialIdParser.describe("Id of user requesting expense"), @@ -25,13 +28,17 @@ export const expenseRequestToInsertParser = expenseRequestParser .extend({ title: expenseRequestParser.shape.title.trim(), description: expenseRequestParser.shape.description.trim(), - bankAccountNumber: expenseRequestParser.shape.bankAccountNumber.pipe( - norwegianBankAccountNumberParser, + bankAccountNumber: expenseRequestParser.shape.bankAccountNumber.transform( + parseWithSchema(norwegianBankAccountNumberParser), ), - purchaseTime: expenseRequestParser.shape.purchaseTime.pipe( - z.coerce.date().max(new Date()), + purchaseTime: expenseRequestParser.shape.purchaseTime.transform( + parseWithSchema(z.coerce.date().max(new Date())), ), }) - .pipe(createInsertSchema(expensesTable).strict().readonly()); + .transform(({ bankAccountNumber, ...expense }) => ({ + ...expense, + accountNumber: bankAccountNumber, + })) + .transform(parseWithSchema(expenseInsertSchema)); export type NewExpense = z.infer; diff --git a/src/request-handling/interviews.ts b/src/request-handling/interviews.ts index 55cff8d..a69d65b 100644 --- a/src/request-handling/interviews.ts +++ b/src/request-handling/interviews.ts @@ -5,12 +5,15 @@ import { timeStringParser, toDateParser, } from "@/lib/time-parsers"; +import { parseWithSchema } from "@/lib/zod"; import { serialIdParser } from "@/src/request-handling/common"; import type { AnySchema } from "ajv"; import metaSchema from "ajv/dist/refs/json-schema-draft-07.json"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; +const interviewInsertSchema = createInsertSchema(interviewsTable); + export const newInterviewSchemaSchema = z.object({ jsonSchema: turnJsonIntoZodSchema(metaSchema).transform((v) => v), // If the object passed this json parser we know it is a validJsonSchema }); @@ -26,10 +29,10 @@ export const newInterviewSchema = z.object({ export const newInterviewToInsertSchema = newInterviewSchema .extend({ plannedTime: newInterviewSchema.shape.plannedTime - .pipe(toDateParser) - .pipe(futureDateParser), + .transform(parseWithSchema(toDateParser)) + .transform(parseWithSchema(futureDateParser)), }) - .pipe(createInsertSchema(interviewsTable)); + .transform(parseWithSchema(interviewInsertSchema)); export const newInterviewSchemaToInsertSchema = newInterviewSchemaSchema.extend( {}, diff --git a/src/request-handling/schools.ts b/src/request-handling/schools.ts index d766b99..cd2eed7 100644 --- a/src/request-handling/schools.ts +++ b/src/request-handling/schools.ts @@ -1,9 +1,11 @@ import { schoolsTable } from "@/db/tables/schools"; -import { phoneNumberParser } from "@/lib/lib"; +import { parseWithSchema, phoneNumberParser } from "@/lib/zod"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; import { serialIdParser } from "./common"; +const schoolInsertSchema = createInsertSchema(schoolsTable).strict().readonly(); + export const schoolRequestParser = z .object({ id: serialIdParser.describe("Id of school"), @@ -26,6 +28,6 @@ export const schoolRequestToInsertParser = schoolRequestParser contactPersonName: schoolRequestParser.shape.contactPersonName.trim(), contactPersonEmail: schoolRequestParser.shape.contactPersonEmail.trim(), }) - .pipe(createInsertSchema(schoolsTable).strict().readonly()); + .transform(parseWithSchema(schoolInsertSchema)); export type NewSchool = z.infer; diff --git a/src/request-handling/semesters.ts b/src/request-handling/semesters.ts index 9fda4d3..39d66ba 100644 --- a/src/request-handling/semesters.ts +++ b/src/request-handling/semesters.ts @@ -1,9 +1,14 @@ import { semestersTable } from "@/db/tables/semesters"; import { timeStringParser } from "@/lib/time-parsers"; +import { parseWithSchema } from "@/lib/zod"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; import { serialIdParser } from "./common"; +const semesterInsertSchema = createInsertSchema(semestersTable) + .strict() + .readonly(); + export const semesterRequestParser = z .object({ id: serialIdParser.describe("Id of semester"), @@ -24,19 +29,21 @@ export const semesterRequestParser = z export const semesterRequestToInsertParser = semesterRequestParser .extend({ name: semesterRequestParser.shape.name.trim(), - semesterStartDate: semesterRequestParser.shape.semesterStartDate.pipe( - z.coerce.date(), - ), - semesterEndDate: semesterRequestParser.shape.semesterEndDate.pipe( - z.coerce.date(), - ), - recruitmentStartDate: semesterRequestParser.shape.recruitmentStartDate.pipe( - z.coerce.date(), + semesterStartDate: semesterRequestParser.shape.semesterStartDate.transform( + parseWithSchema(z.coerce.date()), ), - recruitmentEndDate: semesterRequestParser.shape.recruitmentEndDate.pipe( - z.coerce.date(), + semesterEndDate: semesterRequestParser.shape.semesterEndDate.transform( + parseWithSchema(z.coerce.date()), ), + recruitmentStartDate: + semesterRequestParser.shape.recruitmentStartDate.transform( + parseWithSchema(z.coerce.date()), + ), + recruitmentEndDate: + semesterRequestParser.shape.recruitmentEndDate.transform( + parseWithSchema(z.coerce.date()), + ), }) - .pipe(createInsertSchema(semestersTable).strict().readonly()); + .transform(parseWithSchema(semesterInsertSchema)); export type NewSemester = z.infer; diff --git a/src/request-handling/sponsors.ts b/src/request-handling/sponsors.ts index 5eab9cf..aed55cc 100644 --- a/src/request-handling/sponsors.ts +++ b/src/request-handling/sponsors.ts @@ -1,9 +1,12 @@ import { sponsorsTable } from "@/db/tables/sponsors"; import { timeStringParser } from "@/lib/time-parsers"; +import { parseWithSchema } from "@/lib/zod"; import { serialIdParser } from "@/src/request-handling/common"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; +const sponsorInsertSchema = createInsertSchema(sponsorsTable).strict().readonly(); + export const sponsorRequestParser = z .object({ id: serialIdParser.describe("Id of sponsor"), @@ -25,11 +28,13 @@ export const sponsorRequestParser = z export const sponsorRequestToInsertParser = sponsorRequestParser .extend({ name: sponsorRequestParser.shape.name.trim(), - startTime: sponsorRequestParser.shape.startTime.pipe( - z.coerce.date().max(new Date()), + startTime: sponsorRequestParser.shape.startTime.transform( + parseWithSchema(z.coerce.date().max(new Date())), + ), + endTime: sponsorRequestParser.shape.endTime.transform( + parseWithSchema(z.coerce.date()), ), - endTime: sponsorRequestParser.shape.endTime.pipe(z.coerce.date()), }) - .pipe(createInsertSchema(sponsorsTable).strict().readonly()); + .transform(parseWithSchema(sponsorInsertSchema)); export type NewSponsor = z.infer; diff --git a/src/request-handling/teams.ts b/src/request-handling/teams.ts index 2406a94..a722f11 100644 --- a/src/request-handling/teams.ts +++ b/src/request-handling/teams.ts @@ -1,9 +1,12 @@ -import { expensesTable } from "@/db/tables/expenses"; +import { teamsTable } from "@/db/tables/teams"; import { timeStringParser } from "@/lib/time-parsers"; +import { parseWithSchema } from "@/lib/zod"; import { serialIdParser } from "@/src/request-handling/common"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; +const teamInsertSchema = createInsertSchema(teamsTable).strict().readonly(); + export const teamsRequestParser = z .object({ departmentId: serialIdParser.describe("Id of corresponding department"), @@ -26,6 +29,6 @@ export const teamsRequestToInsertParser = teamsRequestParser description: teamsRequestParser.shape.description.trim(), shortDescription: teamsRequestParser.shape.shortDescription.trim(), }) - .pipe(createInsertSchema(expensesTable).strict().readonly()); + .transform(parseWithSchema(teamInsertSchema)); export type NewTeam = z.infer; diff --git a/src/request-handling/users.ts b/src/request-handling/users.ts index 055def6..ff7a3de 100644 --- a/src/request-handling/users.ts +++ b/src/request-handling/users.ts @@ -4,10 +4,17 @@ import { usersTable, } from "@/db/tables/users"; import { norwegianBankAccountNumberParser } from "@/lib/finance-parsers"; +import { parseWithSchema } from "@/lib/zod"; import { serialIdParser } from "@/src/request-handling/common"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; +const userInsertSchema = createInsertSchema(usersTable).strict().readonly(); +const teamUserInsertSchema = createInsertSchema(teamUsersTable).strict().readonly(); +const assistantUserInsertSchema = createInsertSchema(assistantUsersTable) + .strict() + .readonly(); + export const userRequestParser = z .object({ firstName: z.string().nonempty(), @@ -37,21 +44,20 @@ export const userRequestToInsertParser = userRequestParser .extend({ firstName: userRequestParser.shape.firstName.trim(), lastName: userRequestParser.shape.lastName.trim(), - bankAccountNumber: userRequestParser.shape.bankAccountNumber.pipe( - norwegianBankAccountNumberParser, + bankAccountNumber: userRequestParser.shape.bankAccountNumber.transform( + parseWithSchema(norwegianBankAccountNumberParser), ), }) - .pipe(createInsertSchema(usersTable).strict().readonly()); + .transform(parseWithSchema(userInsertSchema)); export const teamUserRequestToInsertParser = teamUserRequestParser .extend({ username: teamUserRequestParser.shape.username.trim(), }) - .pipe(createInsertSchema(teamUsersTable).strict().readonly()); + .transform(parseWithSchema(teamUserInsertSchema)); export const assistantUserRequestToInsertParser = assistantUserRequestParser - .extend({}) - .pipe(createInsertSchema(assistantUsersTable).strict().readonly()); + .transform(parseWithSchema(assistantUserInsertSchema)); export type NewUser = z.infer; export type NewTeamUser = z.infer; From 12a600c4a4bdc4e2a14023aad1ce973e88df2623 Mon Sep 17 00:00:00 2001 From: Vegard Hovland Date: Wed, 26 Aug 2026 18:40:13 +0200 Subject: [PATCH 2/4] Remove redundant dateParser variable --- lib/time-parsers.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/time-parsers.ts b/lib/time-parsers.ts index fbe976e..662ba22 100644 --- a/lib/time-parsers.ts +++ b/lib/time-parsers.ts @@ -8,15 +8,14 @@ export const timeStringParser = z.union([ ]); // Date here refers to the JS object date, so it allows more specific times than dates -export const dateParser = z.date(); export const toDateParser = z .union([timeStringParser, z.date()]) .transform(parseWithSchema(z.coerce.date())); export const datePeriodParser = z .object({ - startDate: dateParser, - endDate: dateParser, + startDate: z.date(), + endDate: z.date(), }) .refine((datePeriod) => { return datePeriod.startDate.getTime() <= datePeriod.endDate.getTime(); @@ -29,7 +28,7 @@ export const toDatePeriodParser = z }) .transform(parseWithSchema(datePeriodParser)); -export const pastDateParser = dateParser.max(new Date()); -export const futureDateParser = dateParser.min(new Date()); +export const pastDateParser = z.date().max(new Date()); +export const futureDateParser = z.date().min(new Date()); export type DatePeriod = z.infer; From b58c345ed5b5c6cecab26e99810773bdd1c52a30 Mon Sep 17 00:00:00 2001 From: Vegard Hovland Date: Wed, 26 Aug 2026 18:54:51 +0200 Subject: [PATCH 3/4] Biome check and depreciation fixes --- db/config/parameters.ts | 8 ++++++++ lib/json-schema.ts | 23 ++++++++++------------- src/request-handling/expenses.ts | 4 +++- src/request-handling/sponsors.ts | 4 +++- src/request-handling/users.ts | 10 +++++++--- 5 files changed, 31 insertions(+), 18 deletions(-) diff --git a/db/config/parameters.ts b/db/config/parameters.ts index d92e706..87ce498 100644 --- a/db/config/parameters.ts +++ b/db/config/parameters.ts @@ -57,6 +57,14 @@ const parametersResult = z case "false": ssl = false; break; + default: { + ctx.addIssue({ + code: "custom", + message: "No valid ssl option", + path: ["DATABASE_SSL_OPTION"], + }); + return z.NEVER; + } } return { host: schema.DATABASE_HOST.trim(), diff --git a/lib/json-schema.ts b/lib/json-schema.ts index d19b6a4..b5b7656 100644 --- a/lib/json-schema.ts +++ b/lib/json-schema.ts @@ -31,19 +31,16 @@ export function validateJsonSchema( } export function turnJsonIntoZodSchema(schema: AnySchema) { - return z - .object({}) - .passthrough() - .superRefine((data, ctx) => { - const validationResult = validateJsonSchema(schema, data); - if (!validationResult.success) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "The interview schema is not valid", - params: validationResult.error, - }); - } - }); + return z.looseObject({}).superRefine((data, ctx) => { + const validationResult = validateJsonSchema(schema, data); + if (!validationResult.success) { + ctx.addIssue({ + code: "custom", + message: "The interview schema is not valid", + params: validationResult.error, + }); + } + }); } // from: https://www.reddit.com/r/typescript/comments/13mssvc/types_for_json_and_writing_json diff --git a/src/request-handling/expenses.ts b/src/request-handling/expenses.ts index c2f079a..77e6cad 100644 --- a/src/request-handling/expenses.ts +++ b/src/request-handling/expenses.ts @@ -9,7 +9,9 @@ import { serialIdParser } from "@/src/request-handling/common"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; -const expenseInsertSchema = createInsertSchema(expensesTable).strict().readonly(); +const expenseInsertSchema = createInsertSchema(expensesTable) + .strict() + .readonly(); export const expenseRequestParser = z .object({ diff --git a/src/request-handling/sponsors.ts b/src/request-handling/sponsors.ts index aed55cc..3363c9f 100644 --- a/src/request-handling/sponsors.ts +++ b/src/request-handling/sponsors.ts @@ -5,7 +5,9 @@ import { serialIdParser } from "@/src/request-handling/common"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; -const sponsorInsertSchema = createInsertSchema(sponsorsTable).strict().readonly(); +const sponsorInsertSchema = createInsertSchema(sponsorsTable) + .strict() + .readonly(); export const sponsorRequestParser = z .object({ diff --git a/src/request-handling/users.ts b/src/request-handling/users.ts index ff7a3de..4151149 100644 --- a/src/request-handling/users.ts +++ b/src/request-handling/users.ts @@ -10,7 +10,9 @@ import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; const userInsertSchema = createInsertSchema(usersTable).strict().readonly(); -const teamUserInsertSchema = createInsertSchema(teamUsersTable).strict().readonly(); +const teamUserInsertSchema = createInsertSchema(teamUsersTable) + .strict() + .readonly(); const assistantUserInsertSchema = createInsertSchema(assistantUsersTable) .strict() .readonly(); @@ -56,8 +58,10 @@ export const teamUserRequestToInsertParser = teamUserRequestParser }) .transform(parseWithSchema(teamUserInsertSchema)); -export const assistantUserRequestToInsertParser = assistantUserRequestParser - .transform(parseWithSchema(assistantUserInsertSchema)); +export const assistantUserRequestToInsertParser = + assistantUserRequestParser.transform( + parseWithSchema(assistantUserInsertSchema), + ); export type NewUser = z.infer; export type NewTeamUser = z.infer; From da00de3fdc37ddae6a9551cf210fc1676c69a0cf Mon Sep 17 00:00:00 2001 From: Vegard Hovland Date: Wed, 2 Sep 2026 18:05:37 +0200 Subject: [PATCH 4/4] Update drizzle-kit --- package.json | 2 +- pnpm-lock.yaml | 579 +++++++++++++++++++++++++++++++++++++------------ 2 files changed, 438 insertions(+), 143 deletions(-) diff --git a/package.json b/package.json index 71453f6..fff5143 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@types/supertest": "^6.0.3", "@types/swagger-jsdoc": "^6.0.4", "@types/validator": "^13.12.3", - "drizzle-kit": "^0.24.2", + "drizzle-kit": "^0.31.10", "supertest": "^7.1.0", "tsc-alias": "^1.8.13", "tsx": "^4.19.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41c154d..f007e5b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -76,8 +76,8 @@ importers: specifier: ^13.12.3 version: 13.12.3 drizzle-kit: - specifier: ^0.24.2 - version: 0.24.2 + specifier: ^0.31.10 + version: 0.31.10 supertest: specifier: ^7.1.0 version: 7.1.0 @@ -169,15 +169,15 @@ packages: '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - deprecated: 'Merged into tsx: https://tsx.is' + deprecated: 'Merged into tsx: https://tsx.hirok.io' '@esbuild-kit/esm-loader@2.6.5': resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} - deprecated: 'Merged into tsx: https://tsx.is' + deprecated: 'Merged into tsx: https://tsx.hirok.io' - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -187,15 +187,21 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -205,15 +211,21 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} cpu: [arm] os: [android] @@ -223,15 +235,21 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} cpu: [x64] os: [android] @@ -241,15 +259,21 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -259,15 +283,21 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -277,15 +307,21 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -295,15 +331,21 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -313,15 +355,21 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -331,15 +379,21 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -349,15 +403,21 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -367,15 +427,21 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -385,15 +451,21 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -403,15 +475,21 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -421,15 +499,21 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -439,15 +523,21 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -457,15 +547,21 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -475,21 +571,39 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.25.2': resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -499,21 +613,39 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.25.2': resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -523,15 +655,33 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -541,15 +691,21 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -559,15 +715,21 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -577,15 +739,21 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -595,6 +763,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} @@ -807,8 +981,8 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - drizzle-kit@0.24.2: - resolution: {integrity: sha512-nXOaTSFiuIaTMhS8WJC2d4EBeIcN9OSt2A2cyFbQYBAZbi7lRsVGJNqDpEwPqYfJz38yxbY/UtbvBBahBfnExQ==} + drizzle-kit@0.31.10: + resolution: {integrity: sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==} hasBin: true drizzle-orm@0.45.2: @@ -944,19 +1118,14 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} - peerDependencies: - esbuild: '>=0.12 <1' - esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} hasBin: true - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} hasBin: true esbuild@0.25.2: @@ -964,6 +1133,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1459,6 +1633,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsx@4.23.13: + resolution: {integrity: sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==} + engines: {node: '>=18.0.0'} + hasBin: true + type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -1589,216 +1768,303 @@ snapshots: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.10.0 - '@esbuild/aix-ppc64@0.19.12': + '@esbuild/aix-ppc64@0.25.12': optional: true '@esbuild/aix-ppc64@0.25.2': optional: true + '@esbuild/aix-ppc64@0.28.2': + optional: true + '@esbuild/android-arm64@0.18.20': optional: true - '@esbuild/android-arm64@0.19.12': + '@esbuild/android-arm64@0.25.12': optional: true '@esbuild/android-arm64@0.25.2': optional: true + '@esbuild/android-arm64@0.28.2': + optional: true + '@esbuild/android-arm@0.18.20': optional: true - '@esbuild/android-arm@0.19.12': + '@esbuild/android-arm@0.25.12': optional: true '@esbuild/android-arm@0.25.2': optional: true + '@esbuild/android-arm@0.28.2': + optional: true + '@esbuild/android-x64@0.18.20': optional: true - '@esbuild/android-x64@0.19.12': + '@esbuild/android-x64@0.25.12': optional: true '@esbuild/android-x64@0.25.2': optional: true + '@esbuild/android-x64@0.28.2': + optional: true + '@esbuild/darwin-arm64@0.18.20': optional: true - '@esbuild/darwin-arm64@0.19.12': + '@esbuild/darwin-arm64@0.25.12': optional: true '@esbuild/darwin-arm64@0.25.2': optional: true + '@esbuild/darwin-arm64@0.28.2': + optional: true + '@esbuild/darwin-x64@0.18.20': optional: true - '@esbuild/darwin-x64@0.19.12': + '@esbuild/darwin-x64@0.25.12': optional: true '@esbuild/darwin-x64@0.25.2': optional: true + '@esbuild/darwin-x64@0.28.2': + optional: true + '@esbuild/freebsd-arm64@0.18.20': optional: true - '@esbuild/freebsd-arm64@0.19.12': + '@esbuild/freebsd-arm64@0.25.12': optional: true '@esbuild/freebsd-arm64@0.25.2': optional: true + '@esbuild/freebsd-arm64@0.28.2': + optional: true + '@esbuild/freebsd-x64@0.18.20': optional: true - '@esbuild/freebsd-x64@0.19.12': + '@esbuild/freebsd-x64@0.25.12': optional: true '@esbuild/freebsd-x64@0.25.2': optional: true + '@esbuild/freebsd-x64@0.28.2': + optional: true + '@esbuild/linux-arm64@0.18.20': optional: true - '@esbuild/linux-arm64@0.19.12': + '@esbuild/linux-arm64@0.25.12': optional: true '@esbuild/linux-arm64@0.25.2': optional: true + '@esbuild/linux-arm64@0.28.2': + optional: true + '@esbuild/linux-arm@0.18.20': optional: true - '@esbuild/linux-arm@0.19.12': + '@esbuild/linux-arm@0.25.12': optional: true '@esbuild/linux-arm@0.25.2': optional: true + '@esbuild/linux-arm@0.28.2': + optional: true + '@esbuild/linux-ia32@0.18.20': optional: true - '@esbuild/linux-ia32@0.19.12': + '@esbuild/linux-ia32@0.25.12': optional: true '@esbuild/linux-ia32@0.25.2': optional: true + '@esbuild/linux-ia32@0.28.2': + optional: true + '@esbuild/linux-loong64@0.18.20': optional: true - '@esbuild/linux-loong64@0.19.12': + '@esbuild/linux-loong64@0.25.12': optional: true '@esbuild/linux-loong64@0.25.2': optional: true + '@esbuild/linux-loong64@0.28.2': + optional: true + '@esbuild/linux-mips64el@0.18.20': optional: true - '@esbuild/linux-mips64el@0.19.12': + '@esbuild/linux-mips64el@0.25.12': optional: true '@esbuild/linux-mips64el@0.25.2': optional: true + '@esbuild/linux-mips64el@0.28.2': + optional: true + '@esbuild/linux-ppc64@0.18.20': optional: true - '@esbuild/linux-ppc64@0.19.12': + '@esbuild/linux-ppc64@0.25.12': optional: true '@esbuild/linux-ppc64@0.25.2': optional: true + '@esbuild/linux-ppc64@0.28.2': + optional: true + '@esbuild/linux-riscv64@0.18.20': optional: true - '@esbuild/linux-riscv64@0.19.12': + '@esbuild/linux-riscv64@0.25.12': optional: true '@esbuild/linux-riscv64@0.25.2': optional: true + '@esbuild/linux-riscv64@0.28.2': + optional: true + '@esbuild/linux-s390x@0.18.20': optional: true - '@esbuild/linux-s390x@0.19.12': + '@esbuild/linux-s390x@0.25.12': optional: true '@esbuild/linux-s390x@0.25.2': optional: true + '@esbuild/linux-s390x@0.28.2': + optional: true + '@esbuild/linux-x64@0.18.20': optional: true - '@esbuild/linux-x64@0.19.12': + '@esbuild/linux-x64@0.25.12': optional: true '@esbuild/linux-x64@0.25.2': optional: true + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + '@esbuild/netbsd-arm64@0.25.2': optional: true + '@esbuild/netbsd-arm64@0.28.2': + optional: true + '@esbuild/netbsd-x64@0.18.20': optional: true - '@esbuild/netbsd-x64@0.19.12': + '@esbuild/netbsd-x64@0.25.12': optional: true '@esbuild/netbsd-x64@0.25.2': optional: true + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + '@esbuild/openbsd-arm64@0.25.2': optional: true + '@esbuild/openbsd-arm64@0.28.2': + optional: true + '@esbuild/openbsd-x64@0.18.20': optional: true - '@esbuild/openbsd-x64@0.19.12': + '@esbuild/openbsd-x64@0.25.12': optional: true '@esbuild/openbsd-x64@0.25.2': optional: true + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + '@esbuild/sunos-x64@0.18.20': optional: true - '@esbuild/sunos-x64@0.19.12': + '@esbuild/sunos-x64@0.25.12': optional: true '@esbuild/sunos-x64@0.25.2': optional: true + '@esbuild/sunos-x64@0.28.2': + optional: true + '@esbuild/win32-arm64@0.18.20': optional: true - '@esbuild/win32-arm64@0.19.12': + '@esbuild/win32-arm64@0.25.12': optional: true '@esbuild/win32-arm64@0.25.2': optional: true + '@esbuild/win32-arm64@0.28.2': + optional: true + '@esbuild/win32-ia32@0.18.20': optional: true - '@esbuild/win32-ia32@0.19.12': + '@esbuild/win32-ia32@0.25.12': optional: true '@esbuild/win32-ia32@0.25.2': optional: true + '@esbuild/win32-ia32@0.28.2': + optional: true + '@esbuild/win32-x64@0.18.20': optional: true - '@esbuild/win32-x64@0.19.12': + '@esbuild/win32-x64@0.25.12': optional: true '@esbuild/win32-x64@0.25.2': optional: true + '@esbuild/win32-x64@0.28.2': + optional: true + '@jsdevtools/ono@7.1.3': {} '@nodelib/fs.scandir@2.1.5': @@ -2023,14 +2289,12 @@ snapshots: dotenv@16.4.7: {} - drizzle-kit@0.24.2: + drizzle-kit@0.31.10: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 - esbuild: 0.19.12 - esbuild-register: 3.6.0(esbuild@0.19.12) - transitivePeerDependencies: - - supports-color + esbuild: 0.25.12 + tsx: 4.23.13 drizzle-orm@0.45.2(@types/pg@8.11.11)(pg@8.14.1): optionalDependencies: @@ -2073,13 +2337,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild-register@3.6.0(esbuild@0.19.12): - dependencies: - debug: 4.4.0 - esbuild: 0.19.12 - transitivePeerDependencies: - - supports-color - esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 @@ -2105,31 +2362,34 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - esbuild@0.19.12: + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 esbuild@0.25.2: optionalDependencies: @@ -2159,6 +2419,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.2 '@esbuild/win32-x64': 0.25.2 + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + escape-html@1.0.3: {} esutils@2.0.3: {} @@ -2687,6 +2976,12 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tsx@4.23.13: + dependencies: + esbuild: 0.28.2 + optionalDependencies: + fsevents: 2.3.3 + type-is@2.0.1: dependencies: content-type: 1.0.5