diff --git a/apps/api/.env.example b/apps/api/.env.example new file mode 100644 index 00000000..0c5ff796 --- /dev/null +++ b/apps/api/.env.example @@ -0,0 +1,15 @@ +# ------------------------------------------------------------------------------ +# This is an example .env file. +# +# All of these environment vars must be defined either in your environment or in +# a local .env file in order to run this project. +# ------------------------------------------------------------------------------ + +DATABASE_URL= +JWT_SECRET= + +SENTRY_DSN= + +GCP_PROJECT_ID= +GCP_LOG_NAME='local-dev' +METADATA_SERVER_DETECTION='none' diff --git a/apps/api/drizzle.config.ts b/apps/api/drizzle.config.ts index 6fc3ed40..285ce6f7 100644 --- a/apps/api/drizzle.config.ts +++ b/apps/api/drizzle.config.ts @@ -2,7 +2,7 @@ import 'dotenv/config' import { defineConfig } from 'drizzle-kit' -import { env } from '@/lib/env' +import { env } from './src/lib/env' export default defineConfig({ out: './drizzle', diff --git a/apps/api/package.json b/apps/api/package.json index acf19fb1..59dd69db 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -11,14 +11,16 @@ "directory": "apps/api" }, "type": "module", - "source": "./src/index.ts", - "types": "./dist/index.d.ts", - "sideEffects": false, + "source": "./src/server.ts", + "types": "./dist/server.d.ts", + "bin": { + "agentic-platform-api": "./dist/server.js" + }, "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "default": "./dist/index.js" + "types": "./dist/server.d.ts", + "import": "./dist/server.js", + "default": "./dist/server.js" } }, "files": [ @@ -29,20 +31,27 @@ "dev": "tsup --watch", "clean": "del dist", "test": "run-s test:*", - "test:lint": "eslint .", + "test:lint": "eslint src", "test:typecheck": "tsc --noEmit", "test:unit": "vitest run" }, "dependencies": { + "@agentic/faas-utils": "workspace:*", + "@google-cloud/logging": "^11.2.0", "@hono/node-server": "^1.14.1", + "@hono/sentry": "^1.2.1", "@hono/zod-validator": "^0.4.3", "@paralleldrive/cuid2": "^2.2.2", + "@sentry/node": "^9.14.0", "@workos-inc/node": "^7.47.0", - "drizzle-orm": "^0.42.0", + "drizzle-orm": "^0.43.0", "drizzle-zod": "^0.7.1", + "eventid": "^2.0.1", "exit-hook": "catalog:", "hono": "^4.7.7", "jsonwebtoken": "^9.0.2", + "pino": "^9.6.0", + "pino-abstract-transport": "^2.0.0", "postgres": "^3.4.5", "restore-cursor": "catalog:", "type-fest": "catalog:", diff --git a/apps/api/src/db/schema/deployment.ts b/apps/api/src/db/schema/deployment.ts index 31d0fae3..8f538aa3 100644 --- a/apps/api/src/db/schema/deployment.ts +++ b/apps/api/src/db/schema/deployment.ts @@ -1,3 +1,4 @@ +import { validators } from '@agentic/faas-utils' import { relations } from 'drizzle-orm' import { boolean, index, jsonb, pgTable, text } from 'drizzle-orm/pg-core' @@ -10,6 +11,8 @@ import { createSelectSchema, createUpdateSchema, cuid, + deploymentId, + projectId, timestamps } from './utils' @@ -17,7 +20,7 @@ export const deployments = pgTable( 'deployments', { // namespace/projectName@hash - id: text().primaryKey(), + id: deploymentId().primaryKey(), ...timestamps, hash: text().notNull(), @@ -33,7 +36,7 @@ export const deployments = pgTable( .notNull() .references(() => users.id), teamId: cuid().references(() => teams.id), - projectId: cuid() + projectId: projectId() .notNull() .references(() => projects.id, { onDelete: 'cascade' @@ -92,9 +95,17 @@ export const deploymentsRelations = relations(deployments, ({ one }) => ({ // TODO: narrow export const deploymentInsertSchema = createInsertSchema(deployments, { - // TODO: validate deployment id - // id: (schema) => - // schema.refine((id) => validators.deployment(id), 'Invalid deployment id') + id: (schema) => + schema.refine((id) => validators.project(id), { + message: 'Invalid deployment id' + }), + + hash: (schema) => + schema.refine((hash) => validators.deploymentHash(hash), { + message: 'Invalid deployment hash' + }), + + _url: (schema) => schema.url() }) export const deploymentSelectSchema = createSelectSchema(deployments).omit({ diff --git a/apps/api/src/db/schema/project.ts b/apps/api/src/db/schema/project.ts index fe193e7e..562d6d0d 100644 --- a/apps/api/src/db/schema/project.ts +++ b/apps/api/src/db/schema/project.ts @@ -1,3 +1,4 @@ +import { validators } from '@agentic/faas-utils' import { relations } from 'drizzle-orm' import { boolean, @@ -19,6 +20,8 @@ import { createSelectSchema, createUpdateSchema, cuid, + deploymentId, + projectId, stripeId, timestamps } from './utils' @@ -27,7 +30,7 @@ export const projects = pgTable( 'projects', { // namespace/projectName - id: text().primaryKey(), + id: projectId().primaryKey(), ...timestamps, name: text().notNull(), @@ -39,10 +42,10 @@ export const projects = pgTable( teamId: cuid().notNull(), // Most recently published Deployment if one exists - lastPublishedDeploymentId: cuid(), + lastPublishedDeploymentId: deploymentId(), // Most recent Deployment if one exists - lastDeploymentId: cuid(), + lastDeploymentId: deploymentId(), applicationFeePercent: integer().notNull().default(20), @@ -124,12 +127,15 @@ export const projectsRelations = relations(projects, ({ one, many }) => ({ })) export const projectInsertSchema = createInsertSchema(projects, { - // TODO: validate project id - // id: (schema) => - // schema.refine((id) => validators.project(id), 'Invalid project id') - // TODO: validate project name - // name: (schema) => - // schema.refine((name) => validators.projectName(name), 'Invalid project name') + id: (schema) => + schema.refine((id) => validators.project(id), { + message: 'Invalid project id' + }), + + name: (schema) => + schema.refine((name) => validators.projectName(name), { + message: 'Invalid project name' + }) }) .pick({ id: true, diff --git a/apps/api/src/db/schema/user.ts b/apps/api/src/db/schema/user.ts index 22d09872..6982228b 100644 --- a/apps/api/src/db/schema/user.ts +++ b/apps/api/src/db/schema/user.ts @@ -1,3 +1,4 @@ +import { validators } from '@agentic/faas-utils' import { relations } from 'drizzle-orm' import { boolean, @@ -64,13 +65,27 @@ export const users = pgTable( export const usersRelations = relations(users, ({ many }) => ({ teamsOwned: many(teams) - - // TODO: team memberships })) export const userInsertSchema = createInsertSchema(users, { - // TODO: username validation - // username: (schema) => schema.min(3).max(20) + username: (schema) => + schema.nonempty().refine((username) => validators.username(username), { + message: 'Invalid username' + }), + + email: (schema) => + schema.refine( + (email) => { + if (email) { + return validators.email(email) + } + + return true + }, + { + message: 'Invalid email' + } + ) }).pick({ username: true, email: true, diff --git a/apps/api/src/db/schema/utils.ts b/apps/api/src/db/schema/utils.ts index e8d729f6..6c881706 100644 --- a/apps/api/src/db/schema/utils.ts +++ b/apps/api/src/db/schema/utils.ts @@ -21,6 +21,24 @@ export function stripeId>( return varchar({ length: 255, ...config }) } +/** + * `namespace/projectName` + */ +export function projectId>( + config?: PgVarcharConfig, never> +): PgVarcharBuilderInitial<'', Writable, 130> { + return varchar({ length: 130, ...config }) +} + +/** + * `namespace/projectName@hash` + */ +export function deploymentId>( + config?: PgVarcharConfig, never> +): PgVarcharBuilderInitial<'', Writable, 160> { + return varchar({ length: 160, ...config }) +} + export const id = varchar('id', { length: 24 }) .primaryKey() .$defaultFn(createId) diff --git a/apps/api/src/lib/env.ts b/apps/api/src/lib/env.ts index a877f540..0c544f93 100644 --- a/apps/api/src/lib/env.ts +++ b/apps/api/src/lib/env.ts @@ -10,7 +10,8 @@ export const envSchema = z.object({ .default('development'), DATABASE_URL: z.string().url(), JWT_SECRET: z.string(), - PORT: z.number().default(3000) + PORT: z.number().default(3000), + SENTRY_DSN: z.string().url() }) export type Env = z.infer @@ -19,4 +20,6 @@ export const env = parseZodSchema(envSchema, process.env, { error: 'Invalid environment variables' }) +export const isDev = env.NODE_ENV === 'development' export const isProd = env.NODE_ENV === 'production' +export const isBrowser = (globalThis as any).window !== undefined diff --git a/apps/api/src/lib/exit-hooks.ts b/apps/api/src/lib/exit-hooks.ts index 092646e7..18c99444 100644 --- a/apps/api/src/lib/exit-hooks.ts +++ b/apps/api/src/lib/exit-hooks.ts @@ -1,6 +1,7 @@ import { promisify } from 'node:util' import type { ServerType } from '@hono/node-server' +import * as Sentry from '@sentry/node' import { asyncExitHook } from 'exit-hook' import restoreCursor from 'restore-cursor' @@ -38,5 +39,15 @@ export function initExitHooks({ } ) + // Gracefully flush Sentry events + asyncExitHook( + async function flushSentryExitHook() { + await Sentry.flush(timeoutMs) + }, + { + wait: timeoutMs + } + ) + // TODO: On Node.js, log unhandledRejection, uncaughtException, and warning events } diff --git a/apps/api/src/lib/instrument.ts b/apps/api/src/lib/instrument.ts new file mode 100644 index 00000000..1b0e1523 --- /dev/null +++ b/apps/api/src/lib/instrument.ts @@ -0,0 +1,13 @@ +import 'dotenv/config' + +import * as Sentry from '@sentry/node' + +// This MUST be run before anything else (imported first in the root file). +// No other imports (like env) should be imported in this file. +Sentry.init({ + dsn: process.env.SENTRY_DSN, // eslint-disable-line no-process-env + environment: process.env.NODE_ENV || 'development', // eslint-disable-line no-process-env + release: process.env.COMMIT_SHA, // eslint-disable-line no-process-env + tracesSampleRate: 1.0, + integrations: [Sentry.extraErrorDataIntegration()] +}) diff --git a/apps/api/src/lib/logger/gcp-formatters.ts b/apps/api/src/lib/logger/gcp-formatters.ts new file mode 100644 index 00000000..12ecb161 --- /dev/null +++ b/apps/api/src/lib/logger/gcp-formatters.ts @@ -0,0 +1,125 @@ +import type { pino } from 'pino' +import { EventId } from 'eventid' + +/** ========================================================================== + * GCP logging helpers taken from their official repo. + * @see https://github.com/GoogleCloudPlatform/cloud-solutions/blob/main/projects/pino-logging-gcp-config/src/pino_gcp_config.ts + * ======================================================================== */ + +/** Monotonically increasing ID for insertId. */ +const eventId = new EventId() + +const PINO_TO_GCP_LOG_LEVELS = Object.freeze( + Object.fromEntries([ + ['trace', 'DEBUG'], + ['debug', 'DEBUG'], + ['info', 'INFO'], + ['warn', 'WARNING'], + ['error', 'ERROR'], + ['fatal', 'CRITICAL'] + ]) +) as Record + +/** + * Converts pino log level to Google severity level. + * + * @see pino.LoggerOptions.formatters.level + */ +export function pinoLevelToGcpSeverity( + pinoSeverityLabel: string, + pinoSeverityLevel: number +): Record { + const pinoLevel = pinoSeverityLabel as pino.Level + const severity = PINO_TO_GCP_LOG_LEVELS[pinoLevel] ?? 'INFO' + return { + severity, + level: pinoSeverityLevel + } +} + +/** + * Creates a JSON fragment string containing the timestamp in GCP logging + * format. + * + * @example ', "timestamp": { "seconds": 123456789, "nanos": 123000000 }' + * + * Creating a string with seconds/nanos is ~10x faster than formatting the + * timestamp as an ISO string. + * + * @see https://cloud.google.com/logging/docs/agent/logging/configuration#timestamp-processing + * + * As Javascript Date uses millisecond precision, in + * {@link formatLogObject} the logger adds a monotonically increasing insertId + * into the log object to preserve log order inside GCP logging. + * + * @see https://github.com/googleapis/nodejs-logging/blob/main/src/entry.ts#L189 + */ +export function getGcpLoggingTimestamp() { + const seconds = Date.now() / 1000 + const secondsRounded = Math.floor(seconds) + // The following line is 2x as fast as seconds % 1000 + // Uses Math.round, not Math.floor due to JS floating point... + // eg for a Date.now()=1713024754120 + // (seconds-secondsRounded)*1000 => 119.99988555908203 + const millis = Math.round((seconds - secondsRounded) * 1000) + return `,"timestamp":{"seconds":${secondsRounded},"nanos":${millis}000000}` +} + +/** + * Reformats log entry record for GCP. + * + * * Adds OpenTelemetry properties with correct key. + * * Adds stack_trace if an Error is given in the err property. + * * Adds serviceContext + * * Adds sequential insertId to preserve logging order. + */ +export function formatGcpLogObject( + entry: Record +): Record { + // OpenTelemetry adds properties trace_id, span_id, trace_flags. If these + // are present, not null and not blank, convert them to the property keys + // specified by GCP logging. + // + // @see https://cloud.google.com/logging/docs/structured-logging#special-payload-fields + // @see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#trace-context-fields + if ((entry.trace_id as string | undefined)?.length) { + entry['logging.googleapis.com/trace'] = entry.trace_id + delete entry.trace_id + } + if ((entry.span_id as string | undefined)?.length) { + entry['logging.googleapis.com/spanId'] = entry.span_id + delete entry.span_id + } + // Trace flags is a bit field even though there is one on defined bit, + // so lets convert it to an int and test against a bitmask. + // @see https://www.w3.org/TR/trace-context/#trace-flags + const traceFlagsBits = Number.parseInt(entry.trace_flags as string) + if (!!traceFlagsBits && (traceFlagsBits & 0x1) === 1) { + entry['logging.googleapis.com/trace_sampled'] = true + } + delete entry.trace_flags + + // If there is an Error, add the stack trace for Event Reporting. + if (entry.err instanceof Error && entry.err.stack) { + entry.stack_trace = entry.err.stack + } + + // Add a sequential EventID. + // + // This is required because Javascript Date has a very coarse granularity + // (millisecond), which makes it quite likely that multiple log entries + // would have the same timestamp. + // + // The GCP Logging API doesn't guarantee to preserve insertion order for + // entries with the same timestamp. The service does use `insertId` as a + // secondary ordering for entries with the same timestamp. `insertId` needs + // to be globally unique (within the project) however. + // + // We use a globally unique monotonically increasing EventId as the + // insertId. + // + // @see https://github.com/googleapis/nodejs-logging/blob/main/src/entry.ts#L189 + entry['logging.googleapis.com/insertId'] = eventId.new() + + return entry +} diff --git a/apps/api/src/lib/logger/gcp-transport.ts b/apps/api/src/lib/logger/gcp-transport.ts new file mode 100644 index 00000000..43e8cf2d --- /dev/null +++ b/apps/api/src/lib/logger/gcp-transport.ts @@ -0,0 +1,50 @@ +/* eslint-disable no-process-env */ + +import build from 'pino-abstract-transport' + +/** + * Pino transport that send logs to GCP cloud logging. + * + * Google Cloud setup and auth instructions are in the root readme. + * + * For information about Pino transports: + * @see https://getpino.io/#/docs/transports?id=writing-a-transport + */ +export default async function gcpTransport() { + // Dynamically import @google-cloud/logging only if/when this function is called + // This prevent the GCP bloatware from being loaded in prod, where this is not used. + const { Logging } = await import('@google-cloud/logging') + + const projectId = process.env.GCP_PROJECT_ID || 'agentic-426105' + const logName = process.env.GCP_LOG_NAME || 'local-dev' + + if (!process.env.METADATA_SERVER_DETECTION) { + console.error( + 'Metadata server detection is not set. Set `METADATA_SERVER_DETECTION=none` in the repo root `.env`.' + ) + } + + const logging = new Logging({ projectId }) + const log = logging.log(logName) + + return build(async function (source: AsyncIterable>) { + for await (const obj of source) { + try { + const { severity, ...rest } = obj + const entry = log.entry( + { + severity, + resource: { type: 'global' } + }, + rest + ) + await log.write(entry) + } catch (err) { + console.error( + 'Error sending log to GCP. Consult `readme.md` for setup instructions.', + err + ) + } + } + }) +} diff --git a/apps/api/src/lib/logger/index.ts b/apps/api/src/lib/logger/index.ts new file mode 100644 index 00000000..652c571b --- /dev/null +++ b/apps/api/src/lib/logger/index.ts @@ -0,0 +1,2 @@ +export * from './logger' +export * from './utils' diff --git a/apps/api/src/lib/logger/logger.test.ts b/apps/api/src/lib/logger/logger.test.ts new file mode 100644 index 00000000..604fd460 --- /dev/null +++ b/apps/api/src/lib/logger/logger.test.ts @@ -0,0 +1,36 @@ +/* eslint-disable simple-import-sort/imports */ +/* eslint-disable import/first */ + +import { afterEach, describe, expect, it, vi } from 'vitest' + +import { mockSentryNode } from '../test' + +// Mock Sentry before importing logger +mockSentryNode() + +import * as Sentry from '@sentry/node' +import { logger } from './logger' + +describe('logger', () => { + afterEach(() => { + // We only clear the usage data so it remains a spy. + vi.clearAllMocks() + }) + + it('should call Sentry.captureException when calling logger.error() with an Error', () => { + const error = new Error('test error') + logger.error(error) + expect(Sentry.captureException).toHaveBeenCalledWith(error) + }) + + it('should call Sentry.captureException when calling logger.error() with an {err: Error}', () => { + const error = new Error('test error') + logger.error({ err: error }, 'With some message') + expect(Sentry.captureException).toHaveBeenCalledWith(error) + }) + + it('should not call Sentry.captureException for logger.warn()', () => { + logger.warn('some warning message') + expect(Sentry.captureException).not.toHaveBeenCalled() + }) +}) diff --git a/apps/api/src/lib/logger/logger.ts b/apps/api/src/lib/logger/logger.ts new file mode 100644 index 00000000..f8f27d35 --- /dev/null +++ b/apps/api/src/lib/logger/logger.ts @@ -0,0 +1,116 @@ +import fs from 'node:fs' + +import * as Sentry from '@sentry/node' +import { type Logger, pino } from 'pino' + +import { isBrowser, isDev, isProd } from '@/lib/env' + +import { + formatGcpLogObject, + getGcpLoggingTimestamp, + pinoLevelToGcpSeverity +} from './gcp-formatters' +import { getTraceId } from './utils' + +const gcpTransportPath = `${import.meta.dirname}/gcp-transport.js` + +// TODO: Transport imports are hacky; find a better workaround +const transportExists = fs.existsSync(gcpTransportPath) + +export const logger = pino({ + messageKey: 'message', + level: isProd ? 'info' : 'trace', + timestamp: () => getGcpLoggingTimestamp(), + // Add the Sentry trace ID to the log context + mixin(_obj, _level, mixinLogger) { + try { + // Check if the logger already has a traceId in its bindings + const currentBindings = mixinLogger.bindings() + if ( + currentBindings && + typeof currentBindings === 'object' && + 'traceId' in currentBindings && + currentBindings.traceId + ) { + // If traceId already exists in bindings, use that + const traceId = currentBindings.traceId + return { traceId, meta: { traceId } } + } + + // Otherwise, get the trace ID from Sentry + const traceId = getTraceId() + + // Duplicate in the `meta` field + return traceId ? { traceId, meta: { traceId } } : {} + } catch (err) { + Sentry.captureException(err) + return {} + } + }, + formatters: { + level: pinoLevelToGcpSeverity, + log: (entry: Record) => formatGcpLogObject(entry) + }, + transport: + isDev && !isBrowser && transportExists + ? { target: gcpTransportPath } + : undefined, + hooks: { + logMethod(args, method, level) { + // Only capture errors if the log level is at least 50 (error) + if (level >= 50) { + let foundError: Error | undefined + const arg0 = args[0] as unknown + const arg1 = args[1] as unknown + + for (const arg of [arg0, arg1]) { + if (arg instanceof Error) { + foundError = arg + } else if (arg && typeof arg === 'object') { + if ('err' in arg && arg.err instanceof Error) { + foundError = arg.err + } + + if ('error' in arg && arg.error instanceof Error) { + foundError = arg.error + } + } + + if (foundError) { + break + } + } + + if (foundError) { + Sentry.captureException(foundError) + } + } + + return method.apply(this, args) + } + } +}) + +// TODO: Add more groups +export type LogGroup = 'api' + +/** Standardized way to extend the logger with helpful info */ +export function extendedLogger({ + logger: baseLogger = logger, + ...args +}: { + group: LogGroup + name: string + /** A more specific subtype of the name */ + nameSubtype?: string + /** The eventId to add to the logger */ + eventId?: string + logger?: Logger +}): Logger { + const { group, name, nameSubtype } = args + return baseLogger.child(args, { + msgPrefix: `[${group}:${name}${nameSubtype ? `:${nameSubtype}` : ''}] ` + }) +} + +export type { Logger } from 'pino' diff --git a/apps/api/src/lib/logger/utils.ts b/apps/api/src/lib/logger/utils.ts new file mode 100644 index 00000000..67f7344c --- /dev/null +++ b/apps/api/src/lib/logger/utils.ts @@ -0,0 +1,54 @@ +import * as Sentry from '@sentry/node' + +/** Get the URL for the logs in the GCP console. */ +function getGCPLogsUrl(): string { + const timestamp = new Date().toISOString() + const queryParts = [ + 'resource.type = "cloud_run_revision"', + 'resource.labels.service_name = "agentic"' + ] + const traceId = getTraceId() + + if (traceId) { + queryParts.push(`jsonPayload.meta.traceId = "${traceId}"`) + } + + const query = queryParts.join(' AND ') + const url = `https://console.cloud.google.com/logs/query;query=${encodeURIComponent( + query + )};summaryFields=jsonPayload%252Fmeta%252FtraceId:false:32:beginning;aroundTime=${timestamp};duration=PT1H?project=agentic-internal-tools` + + return url +} + +/** Get the ID of the trace from the root span of the current span. */ +export function getTraceId(): string | undefined { + try { + const activeSpan = Sentry.getActiveSpan() + const rootSpan = activeSpan ? Sentry.getRootSpan(activeSpan) : undefined + if (rootSpan) { + const { traceId } = rootSpan.spanContext() + return traceId + } + return undefined + } catch (err) { + Sentry.captureException(err) + return undefined + } +} + +/** Get the Sentry trace link for the current span. */ +function getSentryTraceURL(): string { + const traceId = getTraceId() + return `https://agentic-platform.sentry.io/performance/trace/${traceId}` +} + +/** + * Get the logs and trace URLs for the current event. + */ +export function getDebugURLs(): { logs: string; trace: string } { + return { + logs: getGCPLogsUrl(), + trace: getSentryTraceURL() + } +} diff --git a/apps/api/src/lib/middleware/error-handler.ts b/apps/api/src/lib/middleware/error-handler.ts index 63c6337d..0ec89e77 100644 --- a/apps/api/src/lib/middleware/error-handler.ts +++ b/apps/api/src/lib/middleware/error-handler.ts @@ -1,4 +1,5 @@ import type { ContentfulStatusCode } from 'hono/utils/http-status' +import * as Sentry from '@sentry/node' import { createMiddleware } from 'hono/factory' import { HTTPException } from 'hono/http-exception' @@ -28,6 +29,7 @@ export const errorHandler = createMiddleware( if (status >= 500) { console.error('http error', status, message) + Sentry.captureException(err) } ctx.json({ error: message }, status) diff --git a/apps/api/src/lib/test/index.ts b/apps/api/src/lib/test/index.ts new file mode 100644 index 00000000..74ec6e0e --- /dev/null +++ b/apps/api/src/lib/test/index.ts @@ -0,0 +1,2 @@ +export * from './mock-sentry-node' +export * from './setup-mock-logger' diff --git a/apps/api/src/lib/test/mock-sentry-node.ts b/apps/api/src/lib/test/mock-sentry-node.ts new file mode 100644 index 00000000..8e4b6904 --- /dev/null +++ b/apps/api/src/lib/test/mock-sentry-node.ts @@ -0,0 +1,25 @@ +import { vi } from 'vitest' + +/** + * Mocks the entire @sentry/node module so that captureException is a spy. + */ +export function mockSentryNode(): void { + vi.mock('@sentry/node', async () => { + const actual = await vi.importActual('@sentry/node') + return { + ...actual, + captureException: vi.fn(), + setTags: vi.fn(), + setTag: vi.fn(), + withIsolationScope: vi.fn((fn) => fn()), + startSpan: vi.fn((_, fn) => { + const fakeSpan = { + setAttributes: vi.fn(), + end: vi.fn() + } + const callbackResult = fn(fakeSpan) + return callbackResult + }) + } + }) +} diff --git a/apps/api/src/lib/test/setup-mock-logger.ts b/apps/api/src/lib/test/setup-mock-logger.ts new file mode 100644 index 00000000..3986c92f --- /dev/null +++ b/apps/api/src/lib/test/setup-mock-logger.ts @@ -0,0 +1,20 @@ +import type { Logger } from 'pino' +import { vi } from 'vitest' + +export function setupMockLogger() { + return { + child: () => + ({ + trace: vi.fn(), + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn() + }) as unknown as Logger, + trace: vi.fn(), + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn() + } as unknown as Logger +} diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts index bb66dd26..2a7af066 100644 --- a/apps/api/src/server.ts +++ b/apps/api/src/server.ts @@ -1,4 +1,7 @@ +import '@/lib/instrument' + import { serve } from '@hono/node-server' +import { sentry } from '@hono/sentry' import { Hono } from 'hono' import { compress } from 'hono/compress' import { cors } from 'hono/cors' @@ -11,6 +14,7 @@ import { initExitHooks } from './lib/exit-hooks' export const app = new Hono() +app.use(sentry()) app.use(compress()) app.use(middleware.responseTime) app.use(middleware.errorHandler) diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index 9d4212bd..25fe1792 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -6,6 +6,6 @@ "@/*": ["src/*"] } }, - "include": ["src", "drizzle.config.ts"], + "include": ["src", "*.config.ts"], "exclude": ["node_modules", "dist"] } diff --git a/apps/api/tsup.config.ts b/apps/api/tsup.config.ts new file mode 100644 index 00000000..d468120a --- /dev/null +++ b/apps/api/tsup.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'tsup' + +export default defineConfig([ + { + entry: ['src/server.ts'], + outDir: 'dist', + target: 'node18', + platform: 'node', + format: ['esm'], + splitting: false, + sourcemap: true, + minify: false, + shims: true, + dts: true + } +]) diff --git a/apps/api/vitest.config.ts b/apps/api/vitest.config.ts new file mode 100644 index 00000000..ed9bf14b --- /dev/null +++ b/apps/api/vitest.config.ts @@ -0,0 +1,12 @@ +import tsconfigPaths from 'vite-tsconfig-paths' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [tsconfigPaths()], + test: { + environment: 'node', + globals: true, + watch: false, + restoreMocks: true + } +}) diff --git a/package.json b/package.json index 72e669fb..20e5053b 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "tsx": "catalog:", "turbo": "catalog:", "typescript": "catalog:", + "vite-tsconfig-paths": "^5.1.4", "vitest": "catalog:", "zod": "catalog:" }, diff --git a/packages/faas-utils/package.json b/packages/faas-utils/package.json new file mode 100644 index 00000000..b5f8d5e2 --- /dev/null +++ b/packages/faas-utils/package.json @@ -0,0 +1,30 @@ +{ + "name": "@agentic/faas-utils", + "private": true, + "version": "0.1.0", + "description": "Agentic platform FaaS utils.", + "author": "Travis Fischer ", + "license": "UNLICENSED", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic-platform.git", + "directory": "packages/faas-utils" + }, + "type": "module", + "source": "./src/index.ts", + "types": "./src/index.ts", + "sideEffects": false, + "exports": { + ".": "./src/index.ts" + }, + "scripts": { + "test": "run-s test:*", + "test:lint": "eslint .", + "test:typecheck": "tsc --noEmit", + "test:unit": "vitest run" + }, + "dependencies": { + "email-validator": "^2.0.4", + "is-relative-url": "^4.0.0" + } +} diff --git a/packages/faas-utils/src/__snapshots__/parse-faas-identifier.test.ts.snap b/packages/faas-utils/src/__snapshots__/parse-faas-identifier.test.ts.snap new file mode 100644 index 00000000..25bd5226 --- /dev/null +++ b/packages/faas-utils/src/__snapshots__/parse-faas-identifier.test.ts.snap @@ -0,0 +1,199 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`URL prefix and suffix success 1`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo", +} +`; + +exports[`URL prefix and suffix success 2`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/123", +} +`; + +exports[`URL prefix success 1`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo", +} +`; + +exports[`URL prefix success 2`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo", +} +`; + +exports[`URL prefix success 3`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/456/123", +} +`; + +exports[`URL prefix success 4`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/456/123", +} +`; + +exports[`URL prefix success 5`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/456/123", +} +`; + +exports[`URL prefix success 6`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/456/123", + "version": "latest", +} +`; + +exports[`URL prefix success 7`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/456/123", + "version": "dev", +} +`; + +exports[`URL prefix success 8`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/456/123", + "version": "2.1.0", +} +`; + +exports[`URL suffix success 1`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo", +} +`; + +exports[`URL suffix success 2`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo", + "version": "latest", +} +`; + +exports[`URL suffix success 3`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo", + "version": "dev", +} +`; + +exports[`URL suffix success 4`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo", + "version": "2.1.0", +} +`; + +exports[`namespace success 1`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo", +} +`; + +exports[`namespace success 2`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo", +} +`; + +exports[`namespace success 3`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo", +} +`; + +exports[`namespace success 4`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo", +} +`; + +exports[`namespace success 5`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/123", +} +`; + +exports[`namespace success 6`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/123", +} +`; + +exports[`namespace success 7`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/123", + "version": "latest", +} +`; + +exports[`namespace success 8`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/123", + "version": "dev", +} +`; + +exports[`namespace success 9`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo/bar/123", + "version": "1.2.3", +} +`; diff --git a/packages/faas-utils/src/__snapshots__/parse-faas-uri.test.ts.snap b/packages/faas-utils/src/__snapshots__/parse-faas-uri.test.ts.snap new file mode 100644 index 00000000..38c23faa --- /dev/null +++ b/packages/faas-utils/src/__snapshots__/parse-faas-uri.test.ts.snap @@ -0,0 +1,240 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`username/projectName success 1`] = ` +{ + "projectId": "abc/hello-world", + "servicePath": "/", + "version": "latest", +} +`; + +exports[`username/projectName success 2`] = ` +{ + "projectId": "a16z/foo-bar", + "servicePath": "/", + "version": "latest", +} +`; + +exports[`username/projectName success 3`] = ` +{ + "projectId": "foodoo/foo-bar", + "servicePath": "/", + "version": "latest", +} +`; + +exports[`username/projectName success 4`] = ` +{ + "projectId": "u/foobar123-yo", + "servicePath": "/", + "version": "latest", +} +`; + +exports[`username/projectName success 5`] = ` +{ + "projectId": "abc/hello-world", + "servicePath": "/", + "version": "latest", +} +`; + +exports[`username/projectName/servicePath success 1`] = ` +{ + "projectId": "u/foo-bar", + "servicePath": "/foo", + "version": "latest", +} +`; + +exports[`username/projectName/servicePath success 2`] = ` +{ + "projectId": "a/foo-bar", + "servicePath": "/foo_123", + "version": "latest", +} +`; + +exports[`username/projectName/servicePath success 3`] = ` +{ + "projectId": "foo/foobar123-yo", + "servicePath": "/foo_bar_BAR_901", + "version": "latest", +} +`; + +exports[`username/projectName/servicePath success 4`] = ` +{ + "projectId": "foo/foobar123-yo", + "servicePath": "/foo/bar/123/456", + "version": "latest", +} +`; + +exports[`username/projectName@deployment success 1`] = ` +{ + "deploymentHash": "3d2e0fd5", + "deploymentId": "abc/hello-world@3d2e0fd5", + "projectId": "abc/hello-world", + "servicePath": "/", +} +`; + +exports[`username/projectName@deployment success 2`] = ` +{ + "projectId": "a16z/foo-bar", + "servicePath": "/", + "version": "f673db32c", +} +`; + +exports[`username/projectName@deployment success 3`] = ` +{ + "projectId": "foodoo/foo-bar", + "servicePath": "/", + "version": "f673db32c", +} +`; + +exports[`username/projectName@deployment success 4`] = ` +{ + "deploymentHash": "673db32c", + "deploymentId": "u/foobar123-yo@673db32c", + "projectId": "u/foobar123-yo", + "servicePath": "/", +} +`; + +exports[`username/projectName@deployment success 5`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/", +} +`; + +exports[`username/projectName@deployment/servicePath success 1`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foo-bar@01234567", + "projectId": "username/foo-bar", + "servicePath": "/foo", +} +`; + +exports[`username/projectName@deployment/servicePath success 2`] = ` +{ + "deploymentHash": "abc123lz", + "deploymentId": "username/foo-bar@abc123lz", + "projectId": "username/foo-bar", + "servicePath": "/foo", +} +`; + +exports[`username/projectName@deployment/servicePath success 3`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foobar123-yo@01234567", + "projectId": "username/foobar123-yo", + "servicePath": "/foo_bar_BAR_901", +} +`; + +exports[`username/projectName@deployment/servicePath success 4`] = ` +{ + "deploymentHash": "01234567", + "deploymentId": "username/foobar@01234567", + "projectId": "username/foobar", + "servicePath": "/foo/bar/123/456", +} +`; + +exports[`username/projectName@version success 1`] = ` +{ + "projectId": "abc/hello-world", + "servicePath": "/", + "version": "1.0.3", +} +`; + +exports[`username/projectName@version success 2`] = ` +{ + "projectId": "a16z/foo-bar", + "servicePath": "/", + "version": "latest", +} +`; + +exports[`username/projectName@version success 3`] = ` +{ + "projectId": "a16z/foo-bar", + "servicePath": "/", + "version": "dev", +} +`; + +exports[`username/projectName@version success 4`] = ` +{ + "projectId": "foodoo/foo-bar", + "servicePath": "/", + "version": "1.0.1", +} +`; + +exports[`username/projectName@version success 5`] = ` +{ + "projectId": "u/foobar123-yo", + "servicePath": "/", + "version": "3.2.2234", +} +`; + +exports[`username/projectName@version success 6`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/", + "version": "1.0.3", +} +`; + +exports[`username/projectName@version/servicePath success 1`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo", + "version": "latest", +} +`; + +exports[`username/projectName@version/servicePath success 2`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo", + "version": "dev", +} +`; + +exports[`username/projectName@version/servicePath success 3`] = ` +{ + "projectId": "username/foo-bar", + "servicePath": "/foo", + "version": "1.0.0", +} +`; + +exports[`username/projectName@version/servicePath success 4`] = ` +{ + "projectId": "username/foobar123-yo", + "servicePath": "/foo_bar_BAR_901", + "version": "0.0.1", +} +`; + +exports[`username/projectName@version/servicePath success 5`] = ` +{ + "projectId": "username/foobar123-yo", + "servicePath": "/foo/bar/123-456", + "version": "0.0.1", +} +`; diff --git a/packages/faas-utils/src/index.ts b/packages/faas-utils/src/index.ts new file mode 100644 index 00000000..84c10dd7 --- /dev/null +++ b/packages/faas-utils/src/index.ts @@ -0,0 +1,4 @@ +export * from './parse-faas-identifier' +export * from './parse-faas-uri' +export type * from './types' +export * as validators from './validators' diff --git a/packages/faas-utils/src/parse-faas-identifier.test.ts b/packages/faas-utils/src/parse-faas-identifier.test.ts new file mode 100644 index 00000000..75286eb1 --- /dev/null +++ b/packages/faas-utils/src/parse-faas-identifier.test.ts @@ -0,0 +1,86 @@ +import { expect, test } from 'vitest' + +import { parseFaasIdentifier } from './parse-faas-identifier' +import * as validators from './validators' + +function success(...args: Parameters) { + const result = parseFaasIdentifier(...args) + expect(result).toBeTruthy() + expect(result!.projectId).toBeTruthy() + expect(result!.version || result!.deploymentHash).toBeTruthy() + expect(validators.project(result!.projectId)).toBe(true) + expect(validators.servicePath(result!.servicePath)).toBe(true) + + if (result!.deploymentHash) { + expect(validators.deploymentHash(result!.deploymentHash)).toBe(true) + expect(validators.deployment(result!.deploymentId!)).toBe(true) + } + + expect(result).toMatchSnapshot() +} + +function error(...args: Parameters) { + const result = parseFaasIdentifier(...args) + expect(result).toBeUndefined() +} + +test('URL prefix success', () => { + success('https://api.saasify.sh/username/foo-bar@01234567/foo') + success('/username/foo-bar@01234567/foo') + success('https://api.saasify.sh/username/foo-bar@01234567/foo/bar/456/123') + success('/username/foo-bar@01234567/foo/bar/456/123') + success('/username/foo-bar@01234567/foo/bar/456/123') + success('/username/foo-bar@latest/foo/bar/456/123') + success('/username/foo-bar@dev/foo/bar/456/123') + success('/username/foo-bar@2.1.0/foo/bar/456/123') +}) + +test('URL prefix error', () => { + error('https://api.saasify.sh/2/proxy/username/foo-bar@01234567/foo') + error('/call/username/foo-bar@01234567/foo') + error('//username/foo-bar@01234567/foo') +}) + +test('URL suffix success', () => { + success('username/foo-bar@01234567/foo/') + success('username/foo-bar@latest/foo/') + success('username/foo-bar@dev/foo/') + success('username/foo-bar@2.1.0/foo/') +}) + +test('URL suffix error', () => { + error('username/foo-bar@01234567/foo😀') + error('username/Foo-Bar@dev/foo/') +}) + +test('URL prefix and suffix success', () => { + success('https://api.saasify.sh/username/foo-bar@01234567/foo/') + success('https://api.saasify.sh/username/foo-bar@01234567/foo/bar/123') +}) + +test('namespace success', () => { + success('https://api.saasify.sh/foo-bar@01234567/foo', { + namespace: 'username' + }) + success('/foo-bar@01234567/foo', { namespace: 'username' }) + success('/foo-bar@01234567/foo', { namespace: 'username' }) + success('/foo-bar@01234567/foo/', { namespace: 'username' }) + success('https://api.saasify.sh/foo-bar@01234567/foo/bar/123', { + namespace: 'username' + }) + success('/foo-bar@01234567/foo/bar/123', { namespace: 'username' }) + success('/foo-bar@latest/foo/bar/123', { namespace: 'username' }) + success('/foo-bar@dev/foo/bar/123', { namespace: 'username' }) + success('/foo-bar@1.2.3/foo/bar/123', { namespace: 'username' }) +}) + +test('namespace error', () => { + error('https://api.saasify.sh/foo-bar@01234567/foo') + error('https://api.saasify.sh/foo-bar@latest/foo') + error('/foo-bar@01234567/foo') + error('/foo-bar@dev/foo') + error('/foo-bar@01234567/foo') + error('/foo-bar@01234567/foo/') + error('/foo-bar@01234567/foo/bar/123') + error('/foo-bar@0latest/foo/bar/123') +}) diff --git a/packages/faas-utils/src/parse-faas-identifier.ts b/packages/faas-utils/src/parse-faas-identifier.ts new file mode 100644 index 00000000..70eec8dc --- /dev/null +++ b/packages/faas-utils/src/parse-faas-identifier.ts @@ -0,0 +1,43 @@ +import type { ParsedFaasIdentifier } from './types' +import { parseFaasUri } from './parse-faas-uri' + +export function parseFaasIdentifier( + identifier: string, + { namespace }: { namespace?: string } = {} +): ParsedFaasIdentifier | undefined { + if (!identifier) { + return + } + + let uri = identifier + try { + const { pathname } = new URL(identifier) + uri = pathname + } catch {} + + if (uri.startsWith('/')) { + uri = uri.slice(1) + } + + if (uri.endsWith('/')) { + uri = uri.slice(0, -1) + } + + if (!uri.length) { + return + } + + const hasNamespacePrefix = /^([a-zA-Z0-9-]{1,64}\/)/.test(uri) + + if (!hasNamespacePrefix) { + if (namespace) { + // add inferred namespace prefix (defaults to authenticated user's username) + uri = `${namespace}/${uri}` + } else { + // throw new Error(`FaaS identifier is missing namespace prefix or you must be authenticated [${uri}]`) + return + } + } + + return parseFaasUri(uri) +} diff --git a/packages/faas-utils/src/parse-faas-uri.test.ts b/packages/faas-utils/src/parse-faas-uri.test.ts new file mode 100644 index 00000000..809c2e6f --- /dev/null +++ b/packages/faas-utils/src/parse-faas-uri.test.ts @@ -0,0 +1,111 @@ +import { expect, test } from 'vitest' + +import { parseFaasUri } from './parse-faas-uri' + +function success(value: string) { + const result = parseFaasUri(value) + expect(result).toBeTruthy() + expect(result?.projectId).toBeTruthy() + expect(result?.version || result?.deploymentHash).toBeTruthy() + expect(result).toMatchSnapshot() +} + +function error(value: string) { + const result = parseFaasUri(value) + expect(result).toBeUndefined() +} + +test('username/projectName@deployment/servicePath success', () => { + success('username/foo-bar@01234567/foo') + success('username/foo-bar@abc123lz/foo') + success('username/foobar123-yo@01234567/foo_bar_BAR_901') + success('username/foobar@01234567/foo/bar/123/456') +}) + +test('username/projectName@deployment/servicePath error', () => { + error('foo-bar@01234567/foo') + error('%/foo-bar@01234567/foo') + error('user/foo^bar@01234567/foo') + error('user@foo^bar@01234567/foo') + error('username/Foo-Bar@01234567/foo') +}) + +test('username/projectName@version/servicePath success', () => { + success('username/foo-bar@latest/foo') + success('username/foo-bar@dev/foo') + success('username/foo-bar@1.0.0/foo') + success('username/foobar123-yo@0.0.1/foo_bar_BAR_901') + success('username/foobar123-yo@0.0.1/foo/bar/123-456') +}) + +test('username/projectName@version/servicePath error', () => { + error('foo_bar@latest/foo') + error('username/foo-bar@1.0.0/foo@') + error('username/foo-bar@/foo') + error('username/foo-bar@/foo/') + error('username/fooBar123-yo@0.0.1/foo/bar/123-456') +}) + +test('username/projectName/servicePath success', () => { + success('u/foo-bar/foo') + success('a/foo-bar/foo_123') + success('foo/foobar123-yo/foo_bar_BAR_901') + success('foo/foobar123-yo/foo/bar/123/456') +}) + +test('username/projectName/servicePath error', () => { + error('@/foo_bar/foo') + error('foo-bar/foo\\/') + error('user/_/foo') + error('user/a 1/foo') + error('u/FOO-bar/foo') +}) + +test('username/projectName@deployment success', () => { + success('abc/hello-world@3d2e0fd5') + success('a16z/foo-bar@f673db32c') + success('foodoo/foo-bar@f673db32c') + success('u/foobar123-yo@673db32c') + success('username/foo-bar@01234567/') +}) + +test('username/projectName@deployment error', () => { + error('/hello-world@3d2e0fd5') + error('foo-bar@f673db32c') + error('foodoo/foo@bar@f673db32c') + error('u/fooBar123-yo@/673db32c') + error('abc/Hello-World@3d2e0fd5') +}) + +test('username/projectName@version success', () => { + success('abc/hello-world@1.0.3') + success('a16z/foo-bar@latest') + success('a16z/foo-bar@dev') + success('foodoo/foo-bar@1.0.1') + success('u/foobar123-yo@3.2.2234') + success('username/foo-bar@1.0.3/') +}) + +test('username/projectName@version error', () => { + error('/hello-world@3d2e0fd5') + error('foo-bar@f673db32c') + error('foodoo/foo@bar@f673db32c@') + error('u/fooBar123-yo@/673db32c/') + error('abc/hello-World@1.0.3') +}) + +test('username/projectName success', () => { + success('abc/hello-world') + success('a16z/foo-bar') + success('foodoo/foo-bar') + success('u/foobar123-yo') + success('abc/hello-world/') +}) + +test('username/projectName error', () => { + error('/hello-world') + error('foo-barc') + error('foodoo/foo@bar@') + error('u/fooBar123-yo@/') + error('abc/HELLO-WORLD') +}) diff --git a/packages/faas-utils/src/parse-faas-uri.ts b/packages/faas-utils/src/parse-faas-uri.ts new file mode 100644 index 00000000..5eaab458 --- /dev/null +++ b/packages/faas-utils/src/parse-faas-uri.ts @@ -0,0 +1,59 @@ +// TODO: investigate this +/* eslint-disable security/detect-unsafe-regex */ + +import type { ParsedFaasIdentifier } from './types' + +// namespace/projectName@deploymentHash/servicePath +// project@deploymentHash/servicePath +const projectDeploymentServiceRe = + /^([a-zA-Z0-9-]{1,64}\/[a-z0-9-]{3,64})@([a-z0-9]{8})(\/[a-zA-Z0-9\-._~%!$&'()*+,;=:/]*)?$/ + +// namespace/projectName@version/servicePath +// project@version/servicePath +const projectVersionServiceRe = + /^([a-zA-Z0-9-]{1,64}\/[a-z0-9-]{3,64})@([^/?@]+)(\/[a-zA-Z0-9\-._~%!$&'()*+,;=:/]*)?$/ + +// namespace/projectName/servicePath +// project/servicePath (latest version) +const projectServiceRe = + /^([a-zA-Z0-9-]{1,64}\/[a-z0-9-]{3,64})(\/[a-zA-Z0-9\-._~%!$&'()*+,;=:/]*)?$/ + +export function parseFaasUri(uri: string): ParsedFaasIdentifier | undefined { + const pdsMatch = uri.match(projectDeploymentServiceRe) + + if (pdsMatch) { + const projectId = pdsMatch[1]! + const deploymentHash = pdsMatch[2]! + const servicePath = pdsMatch[3] || '/' + + return { + projectId, + deploymentHash, + servicePath, + deploymentId: `${projectId}@${deploymentHash}` + } + } + + const pvsMatch = uri.match(projectVersionServiceRe) + + if (pvsMatch) { + return { + projectId: pvsMatch[1]!, + version: pvsMatch[2]!, + servicePath: pvsMatch[3] || '/' + } + } + + const psMatch = uri.match(projectServiceRe) + + if (psMatch) { + return { + projectId: psMatch[1]!, + servicePath: psMatch[2] || '/', + version: 'latest' + } + } + + // Invalid FaaS uri, so return undefined + return +} diff --git a/packages/faas-utils/src/types.ts b/packages/faas-utils/src/types.ts new file mode 100644 index 00000000..2b1e7808 --- /dev/null +++ b/packages/faas-utils/src/types.ts @@ -0,0 +1,15 @@ +export type ParsedFaasIdentifier = { + projectId: string + servicePath: string + deploymentHash?: string + deploymentId?: string + version?: string +} & ( + | { + deploymentHash: string + deploymentId: string + } + | { + version: string + } +) diff --git a/packages/faas-utils/src/validators.test.ts b/packages/faas-utils/src/validators.test.ts new file mode 100644 index 00000000..cad53ef2 --- /dev/null +++ b/packages/faas-utils/src/validators.test.ts @@ -0,0 +1,137 @@ +import { expect, test } from 'vitest' + +import * as validators from './validators' + +test('email success', () => { + expect(validators.email('t@t.com')).toBe(true) + expect(validators.email('abc@gmail.com')).toBe(true) + expect(validators.email('abc@foo.io')).toBe(true) +}) + +test('email failure', () => { + expect(validators.email('t@t')).toBe(false) + expect(validators.email('abc')).toBe(false) + expect(validators.email('@')).toBe(false) +}) + +test('username success', () => { + expect(validators.username('z')).toBe(true) + expect(validators.username('abc')).toBe(true) + expect(validators.username('abc-123')).toBe(true) + expect(validators.username('Foo123')).toBe(true) + expect(validators.username('asldfkjasldkfjlaksdfjlkas')).toBe(true) +}) + +test('username failure (invalid)', () => { + expect(validators.username('ab%')).toBe(false) + expect(validators.username('.')) + expect(validators.username('$')) + expect(validators.username('abc_123')) + expect(validators.username('a'.repeat(65))).toBe(false) +}) + +test('password success', () => { + expect(validators.password('abc')).toBe(true) + expect(validators.password('password')).toBe(true) + expect(validators.password('asldfkjasldkfjlaksdfjlkas')).toBe(true) +}) + +test('password failure', () => { + expect(validators.password('aa')).toBe(false) + expect(validators.password('.')) + expect(validators.password('a'.repeat(1025))).toBe(false) +}) + +test('projectName success', () => { + expect(validators.projectName('aaa')).toBe(true) + expect(validators.projectName('hello-world')).toBe(true) + expect(validators.projectName('123-abc')).toBe(true) +}) + +test('projectName failure', () => { + expect(validators.projectName('aa')).toBe(false) + expect(validators.projectName('hello_world')).toBe(false) + expect(validators.projectName('a_bc')).toBe(false) + expect(validators.projectName('abc.')) + expect(validators.projectName('abc_123')) + expect(validators.projectName('ah^23')) + expect(validators.projectName('Hello-World')).toBe(false) + expect(validators.projectName('f'.repeat(100))).toBe(false) +}) + +test('deploymentHash success', () => { + expect(validators.deploymentHash('abcdefgh')).toBe(true) + expect(validators.deploymentHash('01234567')).toBe(true) + expect(validators.deploymentHash('k2l3n6l2')).toBe(true) +}) + +test('deploymentHash failure', () => { + expect(validators.deploymentHash('aa')).toBe(false) + expect(validators.deploymentHash('')).toBe(false) + expect(validators.deploymentHash('Abcdefgh')).toBe(false) + expect(validators.deploymentHash('012345678')).toBe(false) +}) + +test('project success', () => { + expect(validators.project('username/project-name')).toBe(true) + expect(validators.project('a/123')).toBe(true) +}) + +test('project failure', () => { + expect(validators.project('aaa//0123')).toBe(false) + expect(validators.project('foo@bar')).toBe(false) + expect(validators.project('abc/1.23')).toBe(false) + expect(validators.project('012345678/123@latest')).toBe(false) + expect(validators.project('foo@dev')).toBe(false) + expect(validators.project('username/Project-Name')).toBe(false) + expect(validators.project('_/___')).toBe(false) +}) + +test('deployment success', () => { + expect(validators.deployment('username/project-name@01234567')).toBe(true) + expect(validators.deployment('a/123@01234567')).toBe(true) +}) + +test('deployment failure', () => { + expect(validators.deployment('username/project-name@012345678')).toBe(false) + expect(validators.deployment('username/project-name@latest')).toBe(false) + expect(validators.deployment('username/project-name@dev')).toBe(false) + expect(validators.deployment('username/Project-Name@01234567')).toBe(false) + expect(validators.deployment('a/123@0123A567')).toBe(false) + expect(validators.deployment('_/___@012.4567')).toBe(false) + expect(validators.deployment('_/___@01234567')).toBe(false) + expect(validators.deployment('aaa//0123@01234567')).toBe(false) + expect(validators.deployment('foo@bar@01234567')).toBe(false) + expect(validators.deployment('abc/1.23@01234567')).toBe(false) + expect(validators.deployment('012345678/123@latest')).toBe(false) + expect(validators.deployment('012345678/123@dev')).toBe(false) + expect(validators.deployment('012345678/123@1.0.1')).toBe(false) +}) + +test('serviceName success', () => { + expect(validators.serviceName('serviceName')).toBe(true) + expect(validators.serviceName('_identIFIER0123')).toBe(true) + expect(validators.serviceName('abc_123_foo')).toBe(true) +}) + +test('serviceName failure', () => { + expect(validators.serviceName('ab1.2')).toBe(false) + expect(validators.serviceName('foo-bar')).toBe(false) + expect(validators.serviceName('abc/123')).toBe(false) +}) + +test('servicePath success', () => { + expect(validators.servicePath('/foo')).toBe(true) + expect(validators.servicePath('/')).toBe(true) + expect(validators.servicePath('/foo/bar/123%20-_abc')).toBe(true) + expect(validators.servicePath('/foo/BAR/..')).toBe(true) + expect(validators.servicePath('/api/iconsets/v3/categories')).toBe(true) +}) + +test('servicePath failure', () => { + expect(validators.servicePath('')).toBe(false) + expect(validators.servicePath('foo/bar')).toBe(false) + expect(validators.servicePath('/foo/bar\\')).toBe(false) + expect(validators.servicePath('/foo/bar@')).toBe(false) + expect(validators.servicePath('/foo/bar@abc')).toBe(false) +}) diff --git a/packages/faas-utils/src/validators.ts b/packages/faas-utils/src/validators.ts new file mode 100644 index 00000000..ab8efce5 --- /dev/null +++ b/packages/faas-utils/src/validators.ts @@ -0,0 +1,52 @@ +import emailValidator from 'email-validator' +import isRelativeUrl from 'is-relative-url' + +export const usernameRe = /^[a-zA-Z0-9-]{1,64}$/ +export const passwordRe = /^.{3,1024}$/ + +export const projectNameRe = /^[a-z0-9-]{3,64}$/ +export const deploymentHashRe = /^[a-z0-9]{8}$/ + +export const projectRe = /^[a-zA-Z0-9-]{1,64}\/[a-z0-9-]{3,64}$/ +export const deploymentRe = /^[a-zA-Z0-9-]{1,64}\/[a-z0-9-]{3,64}@[a-z0-9]{8}$/ + +// service names may be any valid JavaScript identifier +// TODO: should service names be any label? +export const serviceNameRe = /^[a-zA-Z_][a-zA-Z0-9_]*$/ +export const servicePathRe = /^\/[a-zA-Z0-9\-._~%!$&'()*+,;=:/]*$/ + +export function email(value: string): boolean { + return emailValidator.validate(value) +} + +export function username(value: string): boolean { + return !!value && usernameRe.test(value) +} + +export function password(value: string): boolean { + return !!value && passwordRe.test(value) +} + +export function projectName(value: string): boolean { + return !!value && projectNameRe.test(value) +} + +export function deploymentHash(value: string): boolean { + return !!value && deploymentHashRe.test(value) +} + +export function project(value: string): boolean { + return !!value && projectRe.test(value) +} + +export function deployment(value: string): boolean { + return !!value && deploymentRe.test(value) +} + +export function serviceName(value: string): boolean { + return !!value && serviceNameRe.test(value) +} + +export function servicePath(value: string): boolean { + return !!value && servicePathRe.test(value) && isRelativeUrl(value) +} diff --git a/packages/faas-utils/tsconfig.json b/packages/faas-utils/tsconfig.json new file mode 100644 index 00000000..ce6d4e23 --- /dev/null +++ b/packages/faas-utils/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "include": ["src", "*.config.ts"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ddfeb78..eae61ddf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,11 +7,11 @@ settings: catalogs: default: '@fisch0920/config': - specifier: ^1.0.4 - version: 1.0.4 + specifier: ^1.1.0 + version: 1.1.0 '@types/node': - specifier: ^22.14.1 - version: 22.14.1 + specifier: ^22.15.0 + version: 22.15.0 del-cli: specifier: ^6.0.0 version: 6.0.0 @@ -40,8 +40,8 @@ catalogs: specifier: ^5.1.0 version: 5.1.0 simple-git-hooks: - specifier: ^2.12.1 - version: 2.12.1 + specifier: ^2.13.0 + version: 2.13.0 tsup: specifier: ^8.4.0 version: 8.4.0 @@ -49,8 +49,8 @@ catalogs: specifier: ^4.19.3 version: 4.19.3 turbo: - specifier: ^2.5.0 - version: 2.5.0 + specifier: ^2.5.1 + version: 2.5.1 type-fest: specifier: ^4.40.0 version: 4.40.0 @@ -70,10 +70,10 @@ importers: devDependencies: '@fisch0920/config': specifier: 'catalog:' - version: 1.0.4(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(prettier@3.5.3)(typescript@5.8.3)(vitest@3.1.2(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1)) + version: 1.1.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(prettier@3.5.3)(typescript@5.8.3)(vitest@3.1.2(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1)) '@types/node': specifier: 'catalog:' - version: 22.14.1 + version: 22.15.0 del-cli: specifier: 'catalog:' version: 6.0.0 @@ -100,7 +100,7 @@ importers: version: 3.5.3 simple-git-hooks: specifier: 'catalog:' - version: 2.12.1 + version: 2.13.0 tsup: specifier: 'catalog:' version: 8.4.0(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.7.1) @@ -109,37 +109,55 @@ importers: version: 4.19.3 turbo: specifier: 'catalog:' - version: 2.5.0 + version: 2.5.1 typescript: specifier: 'catalog:' version: 5.8.3 + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.8.3)(vite@6.2.5(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1)) vitest: specifier: 'catalog:' - version: 3.1.2(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) + version: 3.1.2(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1) zod: specifier: 'catalog:' version: 3.24.3 apps/api: dependencies: + '@agentic/faas-utils': + specifier: workspace:* + version: link:../../packages/faas-utils + '@google-cloud/logging': + specifier: ^11.2.0 + version: 11.2.0 '@hono/node-server': specifier: ^1.14.1 version: 1.14.1(hono@4.7.7) + '@hono/sentry': + specifier: ^1.2.1 + version: 1.2.1(hono@4.7.7) '@hono/zod-validator': specifier: ^0.4.3 version: 0.4.3(hono@4.7.7)(zod@3.24.3) '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 + '@sentry/node': + specifier: ^9.14.0 + version: 9.14.0 '@workos-inc/node': specifier: ^7.47.0 version: 7.47.0 drizzle-orm: - specifier: ^0.42.0 - version: 0.42.0(@types/pg@8.11.13)(pg@8.15.5)(postgres@3.4.5) + specifier: ^0.43.0 + version: 0.43.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.13)(pg@8.15.5)(postgres@3.4.5) drizzle-zod: specifier: ^0.7.1 - version: 0.7.1(drizzle-orm@0.42.0(@types/pg@8.11.13)(pg@8.15.5)(postgres@3.4.5))(zod@3.24.3) + version: 0.7.1(drizzle-orm@0.43.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.13)(pg@8.15.5)(postgres@3.4.5))(zod@3.24.3) + eventid: + specifier: ^2.0.1 + version: 2.0.1 exit-hook: specifier: 'catalog:' version: 4.0.0 @@ -149,6 +167,12 @@ importers: jsonwebtoken: specifier: ^9.0.2 version: 9.0.2 + pino: + specifier: ^9.6.0 + version: 9.6.0 + pino-abstract-transport: + specifier: ^2.0.0 + version: 2.0.0 postgres: specifier: ^3.4.5 version: 3.4.5 @@ -172,6 +196,15 @@ importers: specifier: ^0.31.0 version: 0.31.0 + packages/faas-utils: + dependencies: + email-validator: + specifier: ^2.0.4 + version: 2.0.4 + is-relative-url: + specifier: ^4.0.0 + version: 4.0.0 + packages: '@babel/code-frame@7.26.2': @@ -517,20 +550,54 @@ packages: resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fisch0920/config@1.0.4': - resolution: {integrity: sha512-JJwvWs3O2LCs6+LwZqvpjP1qww+o3s72fWcTwnXwb2WpM5T6YA+Glt48N8tJsFOq9Cby/WVRWOV48lqvHRoSzA==} + '@fisch0920/config@1.1.0': + resolution: {integrity: sha512-46lIcJI2sBSCL5HU2YTdJx5xuVDhIWVca0Utyqx4zEA7xpG+u+jNIi1fIETbRUky2tMfKDJJM74tSQ9jNmZmAQ==} engines: {node: '>=18'} peerDependencies: eslint: '>= 9' prettier: '>= 3' typescript: '>= 5' + '@google-cloud/common@5.0.2': + resolution: {integrity: sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==} + engines: {node: '>=14.0.0'} + + '@google-cloud/logging@11.2.0': + resolution: {integrity: sha512-Ma94jvuoMpbgNniwtelOt8w82hxK62FuOXZonEv0Hyk3B+/YVuLG/SWNyY9yMso/RXnPEc1fP2qo9kDrjf/b2w==} + engines: {node: '>=14.0.0'} + + '@google-cloud/paginator@5.0.2': + resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} + engines: {node: '>=14.0.0'} + + '@google-cloud/projectify@4.0.0': + resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} + engines: {node: '>=14.0.0'} + + '@google-cloud/promisify@4.1.0': + resolution: {integrity: sha512-G/FQx5cE/+DqBbOpA5jKsegGwdPniU6PuIEMt+qxWgFxvxuFOzVmp6zYchtYuwAWV5/8Dgs0yAmjvNZv3uXLQg==} + engines: {node: '>=18'} + + '@grpc/grpc-js@1.13.3': + resolution: {integrity: sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + '@hono/node-server@1.14.1': resolution: {integrity: sha512-vmbuM+HPinjWzPe7FFPWMMQMsbKE9gDPhaH0FFdqbGpkT5lp++tcWDTxwBl5EgS5y6JVgIaCdjeHRfQ4XRBRjQ==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 + '@hono/sentry@1.2.1': + resolution: {integrity: sha512-nH72brmJDSmX9jeNhHAMcdW/QCYKH00G0BMSDKiE2FuGQaR4pONPuzzM24qirjqyHcL8NDdwBJ3irE9/IsDptA==} + peerDependencies: + hono: '>=3.*' + '@hono/zod-validator@0.4.3': resolution: {integrity: sha512-xIgMYXDyJ4Hj6ekm9T9Y27s080Nl9NXHcJkOvkXPhubOLj8hZkOL8pDnnXfvCf5xEE8Q4oMFenQUZZREUY2gqQ==} peerDependencies: @@ -579,6 +646,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@noble/hashes@1.7.2': resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} engines: {node: ^14.21.3 || >=16} @@ -595,6 +665,200 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@opentelemetry/api-logs@0.57.2': + resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} + engines: {node: '>=14'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@1.30.1': + resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.30.1': + resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/instrumentation-amqplib@0.46.1': + resolution: {integrity: sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-connect@0.43.1': + resolution: {integrity: sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-dataloader@0.16.1': + resolution: {integrity: sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.47.1': + resolution: {integrity: sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fastify@0.44.2': + resolution: {integrity: sha512-arSp97Y4D2NWogoXRb8CzFK3W2ooVdvqRRtQDljFt9uC3zI6OuShgey6CVFC0JxT1iGjkAr1r4PDz23mWrFULQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.19.1': + resolution: {integrity: sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-generic-pool@0.43.1': + resolution: {integrity: sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.47.1': + resolution: {integrity: sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.45.2': + resolution: {integrity: sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.57.2': + resolution: {integrity: sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.47.1': + resolution: {integrity: sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.7.1': + resolution: {integrity: sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-knex@0.44.1': + resolution: {integrity: sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.47.1': + resolution: {integrity: sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-lru-memoizer@0.44.1': + resolution: {integrity: sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.52.0': + resolution: {integrity: sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.46.1': + resolution: {integrity: sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.45.2': + resolution: {integrity: sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.45.1': + resolution: {integrity: sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.51.1': + resolution: {integrity: sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis-4@0.46.1': + resolution: {integrity: sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-tedious@0.18.1': + resolution: {integrity: sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-undici@0.10.1': + resolution: {integrity: sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation@0.57.2': + resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/redis-common@0.36.2': + resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} + engines: {node: '>=14'} + + '@opentelemetry/resources@1.30.1': + resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.30.1': + resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.32.0': + resolution: {integrity: sha512-s0OpmpQFSfMrmedAn9Lhg4KWJELHCU6uU9dtIJ28N8UGhf9Y55im5X8fEzwhwDwiSqN+ZPSNrDJF7ivf/AuRPQ==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.40.1': + resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} @@ -613,6 +877,41 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@prisma/instrumentation@6.6.0': + resolution: {integrity: sha512-M/a6njz3hbf2oucwdbjNKrSMLuyMCwgDrmTtkF1pm4Nm7CU45J/Hd6lauF2CDACTUYzu3ymcV7P0ZAhIoj6WRw==} + peerDependencies: + '@opentelemetry/api': ^1.8 + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@rollup/rollup-android-arm-eabi@4.39.0': resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} cpu: [arm] @@ -716,10 +1015,45 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@sentry/core@8.9.2': + resolution: {integrity: sha512-ixm8NISFlPlEo3FjSaqmq4nnd13BRHoafwJ5MG+okCz6BKGZ1SexEggP42/QpGvDprUUHnfncG6WUMgcarr1zA==} + engines: {node: '>=14.18'} + + '@sentry/core@9.14.0': + resolution: {integrity: sha512-OLfucnP3LAL5bxVNWc2RVOHCX7fk9Er5bWPCS+O5cPjqNUUz0HQHhVh2Vhei5C0kYZZM4vy4BQit5T9LrlOaNA==} + engines: {node: '>=18'} + + '@sentry/node@9.14.0': + resolution: {integrity: sha512-AWPc6O+zAdSgnsiKm6Nb1txyiKCOIBriJEONdXFSslgZgkm8EWAYRRHyS2Hkmnz0/5bEQ3jEffIw22qJuaHN+Q==} + engines: {node: '>=18'} + + '@sentry/opentelemetry@9.14.0': + resolution: {integrity: sha512-NnHJjSQGpWaZ6+0QK9Xn1T3CTOM16Ij07VnSiGmVz3/IMsNC1/jndqc8p9BxEI+67XhZjOUUN0Ogpq1XRY7YeA==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/context-async-hooks': ^1.30.1 + '@opentelemetry/core': ^1.30.1 + '@opentelemetry/instrumentation': ^0.57.1 + '@opentelemetry/sdk-trace-base': ^1.30.1 + '@opentelemetry/semantic-conventions': ^1.28.0 + + '@sentry/types@8.9.2': + resolution: {integrity: sha512-+LFOyQGl+zk5SZRGZD2MEURf7i5RHgP/mt3s85Rza+vz8M211WJ0YsjkIGUJFSY842nged5QLx4JysLaBlLymg==} + engines: {node: '>=14.18'} + + '@sentry/utils@8.9.2': + resolution: {integrity: sha512-A4srR9mEBFdVXwSEKjQ94msUbVkMr8JeFiEj9ouOFORw/Y/ux/WV2bWVD/ZI9wq0TcTNK8L1wBgU8UMS5lIq3A==} + engines: {node: '>=14.18'} + '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + '@total-typescript/ts-reset@0.6.1': resolution: {integrity: sha512-cka47fVSo6lfQDIATYqb/vO1nvFfbPw7uWLayIXIhGETj0wcOOlrlkobOMDNQOFr9QOafegUPq13V2+6vtD7yg==} @@ -729,6 +1063,9 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/caseless@0.12.5': + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -774,36 +1111,63 @@ packages: '@types/koa@2.15.0': resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/mysql@2.15.26': + resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} + '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} '@types/node@22.14.1': resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} + '@types/node@22.15.0': + resolution: {integrity: sha512-99S8dWD2DkeE6PBaEDw+In3aar7hdoBvjyJMR6vaKBTzpvR0P00ClzJMOoVrj9D2+Sy/YCwACYHnBTpMhg1UCA==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/pg-pool@2.0.6': + resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + '@types/pg@8.11.13': resolution: {integrity: sha512-6kXByGkvRvwXLuyaWzsebs2du6+XuAB2CuMsuzP7uaihQahshVgSmB22Pmh0vQMkQ1h5+PZU0d+Di1o+WpVWJg==} + '@types/pg@8.6.1': + resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + '@types/qs@6.9.18': resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/request@2.48.12': + resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} + '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} '@types/serve-static@1.15.7': resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/shimmer@1.2.0': + resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@typescript-eslint/eslint-plugin@8.31.0': resolution: {integrity: sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -897,6 +1261,15 @@ packages: resolution: {integrity: sha512-A7K6uIIGmD5qbrLxoXah2BcOzbxyxnrhps+crZ/CFImrkq4CdVAm6BV/wvRaTeAinRF+Ea9cIFFeEAvJ++RaSw==} engines: {node: '>=16'} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -907,6 +1280,14 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -972,6 +1353,10 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + asn1js@3.0.6: resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} engines: {node: '>=12.0.0'} @@ -987,6 +1372,13 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1005,6 +1397,9 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + bignumber.js@9.3.0: + resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1059,8 +1454,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001710: - resolution: {integrity: sha512-B5C0I0UmaGqHgo5FuqJ7hBd4L57A4dDD+Xi+XX1nXOoxGeDdY4Ko38qJYOyqznBVJEqON5p8P1x5zRR3+rsnxA==} + caniuse-lite@1.0.30001715: + resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} @@ -1086,6 +1481,9 @@ packages: resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} engines: {node: '>=8'} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -1098,6 +1496,10 @@ packages: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1108,6 +1510,10 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@13.1.0: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} @@ -1190,10 +1596,18 @@ packages: resolution: {integrity: sha512-R6ep6JJ+eOBZsBr9esiNN1gxFbZE4Q2cULkUSFumGYecAiS6qodDvcPx/sFuWHMNul7DWmrtoEOpYSm7o6tbSA==} engines: {node: '>=18'} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dotenv@16.5.0: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} @@ -1202,8 +1616,8 @@ packages: resolution: {integrity: sha512-pcKVT+GbfPA+bUovPIilgVOoq+onNBo/YQBG86sf3/GFHkN6lRJPm1l7dKN0IMAk57RQoIm4GUllRrasLlcaSg==} hasBin: true - drizzle-orm@0.42.0: - resolution: {integrity: sha512-pS8nNJm2kBNZwrOjTHJfdKkaU+KuUQmV/vk5D57NojDq4FG+0uAYGMulXtYT///HfgsMF0hnFFvu1ezI3OwOkg==} + drizzle-orm@0.43.0: + resolution: {integrity: sha512-OF6ZOtpGJs3CNXHGwKLfP+mYXEzTnXNL/WRXgAGR+SrtPl6quIBbTPEQZNQ6HhVQchMmJeaezBIcpFBpJD3x+g==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=4' @@ -1301,14 +1715,24 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - electron-to-chromium@1.5.132: - resolution: {integrity: sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.142: + resolution: {integrity: sha512-Ah2HgkTu/9RhTDNThBtzu2Wirdy4DC9b0sMT1pUhbkZQ5U/iwmE+PHZX1MpjD5IkJCc2wSghgGG/B04szAx07w==} + + email-validator@2.0.4: + resolution: {integrity: sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==} + engines: {node: '>4.0'} emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -1319,6 +1743,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -1524,9 +1951,17 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + eventid@2.0.1: + resolution: {integrity: sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw==} + engines: {node: '>=10'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -1539,6 +1974,9 @@ packages: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1552,6 +1990,10 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -1594,6 +2036,13 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data@2.5.3: + resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==} + engines: {node: '>= 0.12'} + + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1609,6 +2058,18 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} + + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} + engines: {node: '>=14'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.3.0: resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} engines: {node: '>=18'} @@ -1660,6 +2121,21 @@ packages: resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} engines: {node: '>=18'} + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + google-auth-library@9.15.1: + resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} + engines: {node: '>=14'} + + google-gax@4.6.0: + resolution: {integrity: sha512-zKKLeLfcYBVOzzM48Brtn4EQkKcTli9w6c1ilzFK2NbJvcd4ATD8/XqFExImvE/W5IwMlKKwa5qqVufji3ioNQ==} + engines: {node: '>=14'} + + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1667,6 +2143,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -1702,6 +2182,21 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -1721,6 +2216,9 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-in-the-middle@1.13.1: + resolution: {integrity: sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -1729,10 +2227,13 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - index-to-position@1.0.0: - resolution: {integrity: sha512-sCO7uaLVhRJ25vz1o8s9IFM3nVS4DkuQnyjMwiQPKvQuBYBDmb8H7zx8ki7nVh4HJQOdVWebyvLE0qt+clruxA==} + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} engines: {node: '>=18'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -1755,6 +2256,10 @@ packages: iron-webcrypto@0.2.8: resolution: {integrity: sha512-YPdCvjFMOBjXaYuDj5tiHst5CEk6Xw84Jo8Y2+jzhMceclAnb3+vNPP/CTtb5fO2ZEuXEaO4N+w62Vfko757KA==} + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -1831,6 +2336,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + is-path-cwd@3.0.0: resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1843,6 +2352,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-relative-url@4.0.0: + resolution: {integrity: sha512-PkzoL1qKAYXNFct5IKdKRH/iBQou/oCC85QhXj6WKtUQBliZ4Yfd3Zk27RHu9KQG8r6zgvAA2AQKC9p+rqTszg==} + engines: {node: '>=14.16'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -1851,6 +2364,10 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1920,6 +2437,9 @@ packages: engines: {node: '>=6'} hasBin: true + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -1948,9 +2468,15 @@ packages: jwa@1.4.1: resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1992,6 +2518,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -2023,6 +2552,9 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2059,6 +2591,14 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -2085,6 +2625,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + module-details-from-path@1.0.3: + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2099,6 +2642,15 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -2123,6 +2675,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -2154,6 +2710,17 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -2193,8 +2760,8 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-json@8.2.0: - resolution: {integrity: sha512-eONBZy4hm2AgxjNFd8a4nyDJnzUAH0g34xSQAwWEVGCjdZ4ZL7dKZBfq267GWP/JaS9zW62Xs2FeAdDvpHHJGQ==} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} path-exists@4.0.0: @@ -2285,6 +2852,16 @@ packages: engines: {node: '>=0.10'} hasBin: true + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.6.0: + resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} + hasBin: true + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -2367,9 +2944,26 @@ packages: engines: {node: '>=14'} hasBin: true + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proto3-json-serializer@2.0.2: + resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} + engines: {node: '>=14.0.0'} + + protobufjs@7.5.0: + resolution: {integrity: sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==} + engines: {node: '>=12.0.0'} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + pumpify@2.0.1: + resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2384,6 +2978,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -2399,10 +2996,18 @@ packages: resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} engines: {node: '>=18'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -2422,6 +3027,14 @@ packages: resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} + engines: {node: '>=8.6.0'} + requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} @@ -2450,6 +3063,10 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + retry-request@7.0.2: + resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} + engines: {node: '>=14'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2483,6 +3100,10 @@ packages: safe-regex@2.1.1: resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2516,6 +3137,9 @@ packages: resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} engines: {node: '>= 0.4'} + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -2539,8 +3163,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-git-hooks@2.12.1: - resolution: {integrity: sha512-NB3V4XyCOrWTIhjh85DyEoVlM3adHWwqQXKYHmuegy/108bJPP6YxuPGm4ZKBq1+GVKRbKJuzNY//09cMJYp+A==} + simple-git-hooks@2.13.0: + resolution: {integrity: sha512-N+goiLxlkHJlyaYEglFypzVNMaNplPAk5syu0+OPp/Bk6dwVoXF6FfOw2vO0Dp+JHsBaI+w6cm8TnFl2Hw6tDA==} hasBin: true slash@5.1.0: @@ -2555,6 +3179,9 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2592,6 +3219,12 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stream-events@1.0.5: + resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -2631,6 +3264,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2655,6 +3291,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + stubs@3.0.0: + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -2668,6 +3307,10 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + teeny-request@9.0.0: + resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} + engines: {node: '>=14'} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -2675,6 +3318,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -2701,6 +3347,12 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toucan-js@4.1.1: + resolution: {integrity: sha512-GTPwEaCRN8IbYe5/VeGiwxYvMO0dKaC16fTeLbF+QGswjkLZ9JUqAfDhLMyH2SWukYhmetH+uxWa1Bhluv/evQ==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -2717,6 +3369,16 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tsconfck@3.1.5: + resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -2747,38 +3409,38 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.5.0: - resolution: {integrity: sha512-fP1hhI9zY8hv0idym3hAaXdPi80TLovmGmgZFocVAykFtOxF+GlfIgM/l4iLAV9ObIO4SUXPVWHeBZQQ+Hpjag==} + turbo-darwin-64@2.5.1: + resolution: {integrity: sha512-U9lT1rZ20PQjEYDiNE0aZrU6K+StAE8rood9xn3pV1w+CSby56HkdR2AffzMdFf8iPTeZfcY1qL62rDcCeRPTw==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.0: - resolution: {integrity: sha512-p9sYq7kXH7qeJwIQE86cOWv/xNqvow846l6c/qWc26Ib1ci5W7V0sI5thsrP3eH+VA0d+SHalTKg5SQXgNQBWA==} + turbo-darwin-arm64@2.5.1: + resolution: {integrity: sha512-1Mp0LeP9JENqHnurGNyD557sndPt2BYUbgzUX87tYIdu/26dHyqlobiRzPpEfkOGB/sV4exhJUJGXB1h72szLQ==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.0: - resolution: {integrity: sha512-1iEln2GWiF3iPPPS1HQJT6ZCFXynJPd89gs9SkggH2EJsj3eRUSVMmMC8y6d7bBbhBFsiGGazwFIYrI12zs6uQ==} + turbo-linux-64@2.5.1: + resolution: {integrity: sha512-Cl2yKumJQAlNG5UA7vjCU6SPBLrcKaGhOjTaUjGHeD9WLL8vh4FwOlhOD2wk7zCUlhpJaM73WHY+oOZGMqmzOg==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.0: - resolution: {integrity: sha512-bKBcbvuQHmsX116KcxHJuAcppiiBOfivOObh2O5aXNER6mce7YDDQJy00xQQNp1DhEfcSV2uOsvb3O3nN2cbcA==} + turbo-linux-arm64@2.5.1: + resolution: {integrity: sha512-OFpb/9YZJG8v3nttD4K5dxW3bwsZp++oxAykpYsPhp552EX6r+dJrt2dzX3C0azls2JLf/UzTpA83fRoM8mC4g==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.0: - resolution: {integrity: sha512-9BCo8oQ7BO7J0K913Czbc3tw8QwLqn2nTe4E47k6aVYkM12ASTScweXPTuaPFP5iYXAT6z5Dsniw704Ixa5eGg==} + turbo-windows-64@2.5.1: + resolution: {integrity: sha512-6XnfSxE8xPETVAlAwfMqCuVuZbq9gXTj8H/Eggv/i3Tjoh2l5xMVTOmg3/zV4RlDtTcwhnvXgXx8LEXrSRZmQQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.0: - resolution: {integrity: sha512-OUHCV+ueXa3UzfZ4co/ueIHgeq9B2K48pZwIxKSm5VaLVuv8M13MhM7unukW09g++dpdrrE1w4IOVgxKZ0/exg==} + turbo-windows-arm64@2.5.1: + resolution: {integrity: sha512-Nc9abxTCpRL8ejzzIm5j6jze3jFi23ZtU83Fwz2N9StquYHGEi72isyeCkrhzCiUvZZEPlFyFaXOSShcJUK58Q==} cpu: [arm64] os: [win32] - turbo@2.5.0: - resolution: {integrity: sha512-PvSRruOsitjy6qdqwIIyolv99+fEn57gP6gn4zhsHTEcCYgXPhv6BAxzAjleS8XKpo+Y582vTTA9nuqYDmbRuA==} + turbo@2.5.1: + resolution: {integrity: sha512-LT0wYyT+HY4StvmGMq1k2tHCIwauaWSXwyP+tCUked9vja5xEisW8b8NIJGi9BWH5HYH9Og1DysaQFTf8BiydQ==} hasBin: true type-check@0.4.0: @@ -2841,6 +3503,17 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -2849,6 +3522,14 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true + vite-tsconfig-paths@5.1.4: + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + vite@6.2.5: resolution: {integrity: sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2920,9 +3601,15 @@ packages: webcrypto-core@1.8.1: resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -2977,15 +3664,30 @@ packages: resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yaml@2.7.1: resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} engines: {node: '>= 14'} hasBin: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -3210,11 +3912,11 @@ snapshots: '@eslint/core': 0.13.0 levn: 0.4.1 - '@fisch0920/config@1.0.4(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(prettier@3.5.3)(typescript@5.8.3)(vitest@3.1.2(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1))': + '@fisch0920/config@1.1.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(prettier@3.5.3)(typescript@5.8.3)(vitest@3.1.2(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@eslint/js': 9.25.1 '@total-typescript/ts-reset': 0.6.1 - '@vitest/eslint-plugin': 1.1.43(@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(typescript@5.8.3)(vitest@3.1.2(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1)) + '@vitest/eslint-plugin': 1.1.43(@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(typescript@5.8.3)(vitest@3.1.2(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1)) eslint: 9.25.1 eslint-config-prettier: 10.1.2(eslint@9.25.1) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1) @@ -3239,10 +3941,73 @@ snapshots: - supports-color - vitest + '@google-cloud/common@5.0.2': + dependencies: + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.1.0 + arrify: 2.0.1 + duplexify: 4.1.3 + extend: 3.0.2 + google-auth-library: 9.15.1 + html-entities: 2.6.0 + retry-request: 7.0.2 + teeny-request: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + '@google-cloud/logging@11.2.0': + dependencies: + '@google-cloud/common': 5.0.2 + '@google-cloud/paginator': 5.0.2 + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.1.0 + '@opentelemetry/api': 1.9.0 + arrify: 2.0.1 + dot-prop: 6.0.1 + eventid: 2.0.1 + extend: 3.0.2 + gcp-metadata: 6.1.1 + google-auth-library: 9.15.1 + google-gax: 4.6.0 + on-finished: 2.4.1 + pumpify: 2.0.1 + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@google-cloud/paginator@5.0.2': + dependencies: + arrify: 2.0.1 + extend: 3.0.2 + + '@google-cloud/projectify@4.0.0': {} + + '@google-cloud/promisify@4.1.0': {} + + '@grpc/grpc-js@1.13.3': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.0 + yargs: 17.7.2 + '@hono/node-server@1.14.1(hono@4.7.7)': dependencies: hono: 4.7.7 + '@hono/sentry@1.2.1(hono@4.7.7)': + dependencies: + hono: 4.7.7 + toucan-js: 4.1.1 + '@hono/zod-validator@0.4.3(hono@4.7.7)(zod@3.24.3)': dependencies: hono: 4.7.7 @@ -3287,6 +4052,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@js-sdsl/ordered-map@4.4.2': {} + '@noble/hashes@1.7.2': {} '@nodelib/fs.scandir@2.1.5': @@ -3301,6 +4068,257 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@opentelemetry/api-logs@0.57.2': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/instrumentation-amqplib@0.46.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-connect@0.43.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + '@types/connect': 3.4.38 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dataloader@0.16.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-express@0.47.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fastify@0.44.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fs@0.19.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-generic-pool@0.43.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-graphql@0.47.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-hapi@0.45.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.57.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + forwarded-parse: 2.1.2 + semver: 7.7.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-ioredis@0.47.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-kafkajs@0.7.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-knex@0.44.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-koa@0.47.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-lru-memoizer@0.44.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongodb@0.52.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongoose@0.46.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql2@0.45.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql@0.45.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + '@types/mysql': 2.15.26 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pg@0.51.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + '@types/pg': 8.6.1 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis-4@0.46.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.32.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-tedious@0.18.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-undici@0.10.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.57.2 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.13.1 + require-in-the-middle: 7.5.2 + semver: 7.7.1 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/redis-common@0.36.2': {} + + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/semantic-conventions@1.28.0': {} + + '@opentelemetry/semantic-conventions@1.32.0': {} + + '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@paralleldrive/cuid2@2.2.2': dependencies: '@noble/hashes': 1.7.2 @@ -3326,6 +4344,36 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@prisma/instrumentation@6.6.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@rollup/rollup-android-arm-eabi@4.39.0': optional: true @@ -3388,8 +4436,72 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@sentry/core@8.9.2': + dependencies: + '@sentry/types': 8.9.2 + '@sentry/utils': 8.9.2 + + '@sentry/core@9.14.0': {} + + '@sentry/node@9.14.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.46.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.43.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.16.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.47.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fastify': 0.44.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.19.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.43.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.47.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.45.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.47.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.7.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.44.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.47.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.44.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.46.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.45.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.45.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.51.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis-4': 0.46.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.18.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.10.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + '@prisma/instrumentation': 6.6.0(@opentelemetry/api@1.9.0) + '@sentry/core': 9.14.0 + '@sentry/opentelemetry': 9.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.32.0) + import-in-the-middle: 1.13.1 + transitivePeerDependencies: + - supports-color + + '@sentry/opentelemetry@9.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.32.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.32.0 + '@sentry/core': 9.14.0 + + '@sentry/types@8.9.2': {} + + '@sentry/utils@8.9.2': + dependencies: + '@sentry/types': 8.9.2 + '@sindresorhus/merge-streams@2.3.0': {} + '@tootallnate/once@2.0.0': {} + '@total-typescript/ts-reset@0.6.1': {} '@types/accepts@1.3.7': @@ -3401,6 +4513,8 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 22.14.1 + '@types/caseless@0.12.5': {} + '@types/connect@3.4.38': dependencies: '@types/node': 22.14.1 @@ -3462,29 +4576,55 @@ snapshots: '@types/koa-compose': 3.2.8 '@types/node': 22.14.1 + '@types/long@4.0.2': {} + '@types/mime@1.3.5': {} '@types/ms@2.1.0': {} + '@types/mysql@2.15.26': + dependencies: + '@types/node': 22.14.1 + '@types/node@17.0.45': {} '@types/node@22.14.1': dependencies: undici-types: 6.21.0 + '@types/node@22.15.0': + dependencies: + undici-types: 6.21.0 + '@types/normalize-package-data@2.4.4': {} + '@types/pg-pool@2.0.6': + dependencies: + '@types/pg': 8.11.13 + '@types/pg@8.11.13': dependencies: '@types/node': 22.14.1 pg-protocol: 1.9.5 pg-types: 4.0.2 - optional: true + + '@types/pg@8.6.1': + dependencies: + '@types/node': 22.14.1 + pg-protocol: 1.9.5 + pg-types: 2.2.0 '@types/qs@6.9.18': {} '@types/range-parser@1.2.7': {} + '@types/request@2.48.12': + dependencies: + '@types/caseless': 0.12.5 + '@types/node': 22.14.1 + '@types/tough-cookie': 4.0.5 + form-data: 2.5.3 + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 @@ -3496,6 +4636,14 @@ snapshots: '@types/node': 22.14.1 '@types/send': 0.17.4 + '@types/shimmer@1.2.0': {} + + '@types/tedious@4.0.14': + dependencies: + '@types/node': 22.14.1 + + '@types/tough-cookie@4.0.5': {} + '@typescript-eslint/eslint-plugin@8.31.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -3573,13 +4721,13 @@ snapshots: '@typescript-eslint/types': 8.31.0 eslint-visitor-keys: 4.2.0 - '@vitest/eslint-plugin@1.1.43(@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(typescript@5.8.3)(vitest@3.1.2(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1))': + '@vitest/eslint-plugin@1.1.43(@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(typescript@5.8.3)(vitest@3.1.2(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@typescript-eslint/utils': 8.31.0(eslint@9.25.1)(typescript@5.8.3) eslint: 9.25.1 optionalDependencies: typescript: 5.8.3 - vitest: 3.1.2(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) + vitest: 3.1.2(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1) '@vitest/expect@3.1.2': dependencies: @@ -3588,13 +4736,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.2(vite@6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1))': + '@vitest/mocker@3.1.2(vite@6.2.5(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@vitest/spy': 3.1.2 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1) '@vitest/pretty-format@3.1.2': dependencies: @@ -3632,12 +4780,28 @@ snapshots: - koa - next + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-import-attributes@1.9.5(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 acorn@8.14.1: {} + agent-base@6.0.2: + dependencies: + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.3: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -3730,6 +4894,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + arrify@2.0.1: {} + asn1js@3.0.6: dependencies: pvtsutils: 1.3.6 @@ -3742,6 +4908,10 @@ snapshots: async-function@1.0.0: {} + asynckit@0.4.0: {} + + atomic-sleep@1.0.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -3754,6 +4924,8 @@ snapshots: base64-js@1.5.1: {} + bignumber.js@9.3.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -3769,8 +4941,8 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001710 - electron-to-chromium: 1.5.132 + caniuse-lite: 1.0.30001715 + electron-to-chromium: 1.5.142 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) @@ -3811,7 +4983,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001710: {} + caniuse-lite@1.0.30001715: {} chai@5.2.0: dependencies: @@ -3836,6 +5008,8 @@ snapshots: ci-info@4.2.0: {} + cjs-module-lexer@1.4.3: {} + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -3849,6 +5023,12 @@ snapshots: slice-ansi: 5.0.0 string-width: 7.2.0 + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -3857,6 +5037,10 @@ snapshots: colorette@2.0.20: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@13.1.0: {} commander@4.1.1: {} @@ -3935,10 +5119,16 @@ snapshots: p-map: 7.0.3 slash: 5.1.0 + delayed-stream@1.0.0: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + dotenv@16.5.0: {} drizzle-kit@0.31.0: @@ -3950,15 +5140,16 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.42.0(@types/pg@8.11.13)(pg@8.15.5)(postgres@3.4.5): + drizzle-orm@0.43.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.13)(pg@8.15.5)(postgres@3.4.5): optionalDependencies: + '@opentelemetry/api': 1.9.0 '@types/pg': 8.11.13 pg: 8.15.5 postgres: 3.4.5 - drizzle-zod@0.7.1(drizzle-orm@0.42.0(@types/pg@8.11.13)(pg@8.15.5)(postgres@3.4.5))(zod@3.24.3): + drizzle-zod@0.7.1(drizzle-orm@0.43.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.13)(pg@8.15.5)(postgres@3.4.5))(zod@3.24.3): dependencies: - drizzle-orm: 0.42.0(@types/pg@8.11.13)(pg@8.15.5)(postgres@3.4.5) + drizzle-orm: 0.43.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.13)(pg@8.15.5)(postgres@3.4.5) zod: 3.24.3 dunder-proto@1.0.1: @@ -3967,13 +5158,24 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 - electron-to-chromium@1.5.132: {} + ee-first@1.1.1: {} + + electron-to-chromium@1.5.142: {} + + email-validator@2.0.4: {} emoji-regex@10.4.0: {} @@ -3981,6 +5183,10 @@ snapshots: emoji-regex@9.2.2: {} + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + environment@1.1.0: {} es-abstract@1.23.9: @@ -4364,8 +5570,14 @@ snapshots: esutils@2.0.3: {} + event-target-shim@5.0.1: {} + eventemitter3@5.0.1: {} + eventid@2.0.1: + dependencies: + uuid: 8.3.2 + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -4382,6 +5594,8 @@ snapshots: expect-type@1.2.1: {} + extend@3.0.2: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -4396,6 +5610,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-redact@3.5.0: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -4435,6 +5651,16 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data@2.5.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + safe-buffer: 5.2.1 + + forwarded-parse@2.1.2: {} + fsevents@2.3.3: optional: true @@ -4451,6 +5677,28 @@ snapshots: functions-have-names@1.2.3: {} + gaxios@6.7.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@6.1.1: + dependencies: + gaxios: 6.7.1 + google-logging-utils: 0.0.2 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + get-caller-file@2.0.5: {} + get-east-asian-width@1.3.0: {} get-intrinsic@1.3.0: @@ -4518,10 +5766,52 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.3.0 + globrex@0.1.2: {} + + google-auth-library@9.15.1: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.7.1 + gcp-metadata: 6.1.1 + gtoken: 7.1.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + google-gax@4.6.0: + dependencies: + '@grpc/grpc-js': 1.13.3 + '@grpc/proto-loader': 0.7.15 + '@types/long': 4.0.2 + abort-controller: 3.0.0 + duplexify: 4.1.3 + google-auth-library: 9.15.1 + node-fetch: 2.7.0 + object-hash: 3.0.0 + proto3-json-serializer: 2.0.2 + protobufjs: 7.5.0 + retry-request: 7.0.2 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + google-logging-utils@0.0.2: {} + gopd@1.2.0: {} graphemer@1.4.0: {} + gtoken@7.1.0: + dependencies: + gaxios: 6.7.1 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -4550,6 +5840,30 @@ snapshots: dependencies: lru-cache: 10.4.3 + html-entities@2.6.0: {} + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + human-signals@5.0.0: {} ieee754@1.2.1: {} @@ -4563,11 +5877,20 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@1.13.1: + dependencies: + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.3 + imurmurhash@0.1.4: {} indent-string@5.0.0: {} - index-to-position@1.0.0: {} + index-to-position@1.1.0: {} + + inherits@2.0.4: {} internal-slot@1.1.0: dependencies: @@ -4589,6 +5912,8 @@ snapshots: dependencies: buffer: 6.0.3 + is-absolute-url@4.0.1: {} + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -4667,6 +5992,8 @@ snapshots: is-number@7.0.0: {} + is-obj@2.0.0: {} + is-path-cwd@3.0.0: {} is-path-inside@4.0.0: {} @@ -4678,12 +6005,18 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-relative-url@4.0.0: + dependencies: + is-absolute-url: 4.0.1 + is-set@2.0.3: {} is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 + is-stream@2.0.1: {} + is-stream@3.0.0: {} is-string@1.1.1: @@ -4747,6 +6080,10 @@ snapshots: jsesc@3.1.0: {} + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.0 + json-buffer@3.0.1: {} json-parse-even-better-errors@4.0.0: {} @@ -4785,11 +6122,22 @@ snapshots: ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 + jwa@2.0.0: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + jws@3.2.2: dependencies: jwa: 1.4.1 safe-buffer: 5.2.1 + jws@4.0.0: + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -4841,6 +6189,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -4867,6 +6217,8 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + long@5.3.2: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -4894,6 +6246,12 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mimic-fn@4.0.0: {} mimic-function@5.0.1: {} @@ -4912,6 +6270,8 @@ snapshots: minipass@7.1.2: {} + module-details-from-path@1.0.3: {} + ms@2.1.3: {} mz@2.7.0: @@ -4924,6 +6284,10 @@ snapshots: natural-compare@1.4.0: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-releases@2.0.19: {} normalize-package-data@6.0.2: @@ -4951,6 +6315,8 @@ snapshots: object-assign@4.1.1: {} + object-hash@3.0.0: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -4991,8 +6357,17 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - obuf@1.1.2: - optional: true + obuf@1.1.2: {} + + on-exit-leak-free@2.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 onetime@6.0.0: dependencies: @@ -5037,10 +6412,10 @@ snapshots: dependencies: callsites: 3.1.0 - parse-json@8.2.0: + parse-json@8.3.0: dependencies: '@babel/code-frame': 7.26.2 - index-to-position: 1.0.0 + index-to-position: 1.1.0 type-fest: 4.40.0 path-exists@4.0.0: {} @@ -5068,19 +6443,16 @@ snapshots: pg-connection-string@2.8.5: optional: true - pg-int8@1.0.1: - optional: true + pg-int8@1.0.1: {} - pg-numeric@1.0.2: - optional: true + pg-numeric@1.0.2: {} pg-pool@3.9.5(pg@8.15.5): dependencies: pg: 8.15.5 optional: true - pg-protocol@1.9.5: - optional: true + pg-protocol@1.9.5: {} pg-types@2.2.0: dependencies: @@ -5089,7 +6461,6 @@ snapshots: postgres-bytea: 1.0.0 postgres-date: 1.0.7 postgres-interval: 1.2.0 - optional: true pg-types@4.0.2: dependencies: @@ -5100,7 +6471,6 @@ snapshots: postgres-date: 2.1.0 postgres-interval: 3.0.0 postgres-range: 1.1.4 - optional: true pg@8.15.5: dependencies: @@ -5126,6 +6496,26 @@ snapshots: pidtree@0.6.0: {} + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.0.0: {} + + pino@9.6.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.1 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pirates@4.0.7: {} pluralize@8.0.0: {} @@ -5146,36 +6536,27 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postgres-array@2.0.0: - optional: true + postgres-array@2.0.0: {} - postgres-array@3.0.4: - optional: true + postgres-array@3.0.4: {} - postgres-bytea@1.0.0: - optional: true + postgres-bytea@1.0.0: {} postgres-bytea@3.0.0: dependencies: obuf: 1.1.2 - optional: true - postgres-date@1.0.7: - optional: true + postgres-date@1.0.7: {} - postgres-date@2.1.0: - optional: true + postgres-date@2.1.0: {} postgres-interval@1.2.0: dependencies: xtend: 4.0.2 - optional: true - postgres-interval@3.0.0: - optional: true + postgres-interval@3.0.0: {} - postgres-range@1.1.4: - optional: true + postgres-range@1.1.4: {} postgres@3.4.5: {} @@ -5183,12 +6564,44 @@ snapshots: prettier@3.5.3: {} + process-warning@4.0.1: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + proto3-json-serializer@2.0.2: + dependencies: + protobufjs: 7.5.0 + + protobufjs@7.5.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.14.1 + long: 5.3.2 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@2.0.1: + dependencies: + duplexify: 4.1.3 + inherits: 2.0.4 + pump: 3.0.2 + punycode@2.3.1: {} pvtsutils@1.3.6: @@ -5199,6 +6612,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + react-is@16.13.1: {} read-package-json-fast@4.0.0: @@ -5216,12 +6631,20 @@ snapshots: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 - parse-json: 8.2.0 + parse-json: 8.3.0 type-fest: 4.40.0 unicorn-magic: 0.1.0 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} + real-require@0.2.0: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -5250,6 +6673,16 @@ snapshots: dependencies: jsesc: 3.0.2 + require-directory@2.1.1: {} + + require-in-the-middle@7.5.2: + dependencies: + debug: 4.4.0 + module-details-from-path: 1.0.3 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + requireindex@1.2.0: {} resolve-from@4.0.0: {} @@ -5275,6 +6708,15 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + retry-request@7.0.2: + dependencies: + '@types/request': 2.48.12 + extend: 3.0.2 + teeny-request: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -5334,6 +6776,8 @@ snapshots: dependencies: regexp-tree: 0.1.27 + safe-stable-stringify@2.5.0: {} + semver@6.3.1: {} semver@7.7.1: {} @@ -5368,6 +6812,8 @@ snapshots: shell-quote@1.8.2: {} + shimmer@1.2.1: {} + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -5400,7 +6846,7 @@ snapshots: signal-exit@4.1.0: {} - simple-git-hooks@2.12.1: {} + simple-git-hooks@2.13.0: {} slash@5.1.0: {} @@ -5414,6 +6860,10 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -5441,13 +6891,18 @@ snapshots: spdx-license-ids@3.0.21: {} - split2@4.2.0: - optional: true + split2@4.2.0: {} stackback@0.0.2: {} std-env@3.9.0: {} + stream-events@1.0.5: + dependencies: + stubs: 3.0.0 + + stream-shift@1.0.3: {} + string-argv@0.3.2: {} string-width@4.2.3: @@ -5518,6 +6973,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -5536,6 +6995,8 @@ snapshots: strip-json-comments@3.1.1: {} + stubs@3.0.0: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -5552,6 +7013,17 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + teeny-request@9.0.0: + dependencies: + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -5560,6 +7032,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -5579,6 +7055,14 @@ snapshots: dependencies: is-number: 7.0.0 + toucan-js@4.1.1: + dependencies: + '@sentry/core': 8.9.2 + '@sentry/types': 8.9.2 + '@sentry/utils': 8.9.2 + + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -5591,6 +7075,10 @@ snapshots: ts-interface-checker@0.1.13: {} + tsconfck@3.1.5(typescript@5.8.3): + optionalDependencies: + typescript: 5.8.3 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -5634,32 +7122,32 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.5.0: + turbo-darwin-64@2.5.1: optional: true - turbo-darwin-arm64@2.5.0: + turbo-darwin-arm64@2.5.1: optional: true - turbo-linux-64@2.5.0: + turbo-linux-64@2.5.1: optional: true - turbo-linux-arm64@2.5.0: + turbo-linux-arm64@2.5.1: optional: true - turbo-windows-64@2.5.0: + turbo-windows-64@2.5.1: optional: true - turbo-windows-arm64@2.5.0: + turbo-windows-arm64@2.5.1: optional: true - turbo@2.5.0: + turbo@2.5.1: optionalDependencies: - turbo-darwin-64: 2.5.0 - turbo-darwin-arm64: 2.5.0 - turbo-linux-64: 2.5.0 - turbo-linux-arm64: 2.5.0 - turbo-windows-64: 2.5.0 - turbo-windows-arm64: 2.5.0 + turbo-darwin-64: 2.5.1 + turbo-darwin-arm64: 2.5.1 + turbo-linux-64: 2.5.1 + turbo-linux-arm64: 2.5.1 + turbo-windows-64: 2.5.1 + turbo-windows-arm64: 2.5.1 type-check@0.4.0: dependencies: @@ -5735,18 +7223,24 @@ snapshots: dependencies: punycode: 2.3.1 + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@3.1.2(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1): + vite-node@3.1.2(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - '@types/node' - jiti @@ -5761,21 +7255,32 @@ snapshots: - tsx - yaml - vite@6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.2.5(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1)): + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.8.3) + optionalDependencies: + vite: 6.2.5(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1) + transitivePeerDependencies: + - supports-color + - typescript + + vite@6.2.5(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1): dependencies: esbuild: 0.25.2 postcss: 8.5.3 rollup: 4.39.0 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.0 fsevents: 2.3.3 tsx: 4.19.3 yaml: 2.7.1 - vitest@3.1.2(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1): + vitest@3.1.2(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1): dependencies: '@vitest/expect': 3.1.2 - '@vitest/mocker': 3.1.2(vite@6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1)) + '@vitest/mocker': 3.1.2(vite@6.2.5(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1)) '@vitest/pretty-format': 3.1.2 '@vitest/runner': 3.1.2 '@vitest/snapshot': 3.1.2 @@ -5792,11 +7297,11 @@ snapshots: tinyglobby: 0.2.13 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) - vite-node: 3.1.2(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1) + vite-node: 3.1.2(@types/node@22.15.0)(tsx@4.19.3)(yaml@2.7.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.0 transitivePeerDependencies: - jiti - less @@ -5819,8 +7324,15 @@ snapshots: pvtsutils: 1.3.6 tslib: 2.8.1 + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -5903,11 +7415,26 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.0 - xtend@4.0.2: - optional: true + wrappy@1.0.2: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} yaml@2.7.1: {} + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yocto-queue@0.1.0: {} zod-validation-error@3.4.0(zod@3.24.3): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f71762c1..5755526e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,11 +1,12 @@ packages: - packages/* - apps/* + catalog: '@ai-sdk/openai': ^1.3.6 - '@fisch0920/config': ^1.0.4 + '@fisch0920/config': ^1.1.0 '@modelcontextprotocol/sdk': ^1.8.0 - '@types/node': ^22.14.1 + '@types/node': ^22.15.0 ai: ^4.2.11 cleye: ^1.3.4 del-cli: ^6.0.0 @@ -17,13 +18,13 @@ catalog: npm-run-all2: ^7.0.2 only-allow: ^1.2.1 p-map: ^7.0.3 - p-throttle: 6.2.0 # pinned for now + p-throttle: 6.2.0 prettier: ^3.5.3 restore-cursor: ^5.1.0 - simple-git-hooks: ^2.12.1 + simple-git-hooks: ^2.13.0 tsup: ^8.4.0 tsx: ^4.19.3 - turbo: ^2.5.0 + turbo: ^2.5.1 type-fest: ^4.40.0 typescript: ^5.8.3 vitest: ^3.1.2