diff --git a/apps/api/drizzle.config.ts b/apps/api/drizzle.config.ts new file mode 100644 index 00000000..6fc3ed40 --- /dev/null +++ b/apps/api/drizzle.config.ts @@ -0,0 +1,14 @@ +import 'dotenv/config' + +import { defineConfig } from 'drizzle-kit' + +import { env } from '@/lib/env' + +export default defineConfig({ + out: './drizzle', + schema: './src/db/schema', + dialect: 'postgresql', + dbCredentials: { + url: env.DATABASE_URL + } +}) diff --git a/apps/api/package.json b/apps/api/package.json new file mode 100644 index 00000000..f26d97f4 --- /dev/null +++ b/apps/api/package.json @@ -0,0 +1,49 @@ +{ + "name": "agentic-platform-api", + "private": true, + "version": "0.1.0", + "description": "Agentic platform API.", + "author": "Travis Fischer ", + "license": "UNLICENSED", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic-platform.git", + "directory": "apps/api" + }, + "type": "module", + "source": "./src/index.ts", + "types": "./dist/index.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "del dist", + "test": "run-s test:*", + "test:lint": "eslint .", + "test:typecheck": "tsc --noEmit", + "test:unit": "vitest run" + }, + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "drizzle-orm": "^0.42.0", + "drizzle-zod": "^0.7.1", + "jsonwebtoken": "^9.0.2", + "postgres": "^3.4.5", + "type-fest": "catalog:", + "zod": "catalog:" + }, + "devDependencies": { + "@types/jsonwebtoken": "^9.0.9", + "drizzle-kit": "^0.31.0" + } +} diff --git a/apps/api/src/db/index.ts b/apps/api/src/db/index.ts new file mode 100644 index 00000000..1f793812 --- /dev/null +++ b/apps/api/src/db/index.ts @@ -0,0 +1,12 @@ +import { drizzle, type NodePgClient } from 'drizzle-orm/node-postgres' +import postgres from 'postgres' + +import { env } from '@/lib/env' + +import * as schema from './schema' + +let _postgresClient: NodePgClient | undefined +const postgresClient = + _postgresClient ?? (_postgresClient = postgres(env.DATABASE_URL)) + +export const db = drizzle({ client: postgresClient, schema }) diff --git a/apps/api/src/db/schema/deployment.ts b/apps/api/src/db/schema/deployment.ts new file mode 100644 index 00000000..a932f554 --- /dev/null +++ b/apps/api/src/db/schema/deployment.ts @@ -0,0 +1,113 @@ +import { relations } from 'drizzle-orm' +import { boolean, index, jsonb, pgTable, text } from 'drizzle-orm/pg-core' + +import type { Coupon, PricingPlan } from './types' +import { projects } from './project' +import { teams } from './team' +import { users } from './user' +import { + createInsertSchema, + createSelectSchema, + createUpdateSchema, + timestamps +} from './utils' + +export const deployments = pgTable( + 'deployments', + { + // namespace/projectName@hash + id: text('id').primaryKey(), + ...timestamps, + + hash: text().notNull(), + version: text(), + + enabled: boolean().notNull().default(true), + published: boolean().notNull().default(false), + + description: text().notNull().default(''), + readme: text().notNull().default(''), + + userId: text() + .notNull() + .references(() => users.id), + teamId: text().references(() => teams.id), + projectId: text() + .notNull() + .references(() => projects.id, { + onDelete: 'cascade' + }), + + // TODO: tools? + // services: jsonb().$type().default([]), + + // Environment variables & secrets + build: jsonb().$type(), + env: jsonb().$type(), + + // TODO: metadata config (logo, keywords, etc) + // TODO: webhooks + // TODO: third-party auth provider config? + + // Backend API URL + _url: text().notNull(), + + pricingPlans: jsonb().$type(), + coupons: jsonb().$type() + }, + (table) => [ + index('deployment_userId_idx').on(table.userId), + index('deployment_teamId_idx').on(table.teamId), + index('deployment_projectId_idx').on(table.projectId), + index('deployment_enabled_idx').on(table.enabled), + index('deployment_published_idx').on(table.published), + index('deployment_version_idx').on(table.version), + index('deployment_createdAt_idx').on(table.createdAt), + index('deployment_updatedAt_idx').on(table.updatedAt) + ] +) + +export const deploymentsRelations = relations(deployments, ({ one }) => ({ + user: one(users, { + fields: [deployments.userId], + references: [users.id] + }), + team: one(teams, { + fields: [deployments.teamId], + references: [teams.id] + }), + project: one(projects, { + fields: [deployments.projectId], + references: [projects.id] + }) +})) + +// TODO: virtual hasFreeTier +// TODO: virtual url +// TODO: virtual openApiUrl +// TODO: virtual saasUrl +// TODO: virtual authProviders? +// TODO: virtual openapi spec? (hide openapi.servers) + +export type Deployment = typeof deployments.$inferSelect + +// TODO: narrow +export const deploymentInsertSchema = createInsertSchema(deployments, { + // TODO: validate deployment id + // id: (schema) => + // schema.refine((id) => validators.deployment(id), 'Invalid deployment id') +}) + +export const deploymentSelectSchema = createSelectSchema(deployments).omit({ + _url: true +}) + +// TODO: narrow +export const deploymentUpdateSchema = createUpdateSchema(deployments).pick({ + enabled: true, + published: true, + version: true, + description: true +}) + +// TODO: add admin select schema which includes all fields? diff --git a/apps/api/src/db/schema/index.ts b/apps/api/src/db/schema/index.ts new file mode 100644 index 00000000..1ba057a1 --- /dev/null +++ b/apps/api/src/db/schema/index.ts @@ -0,0 +1,7 @@ +export * from './deployment' +export * from './project' +export * from './team' +export * from './team-members' +export type * from './types' +export * from './user' +export * from './utils' diff --git a/apps/api/src/db/schema/project.ts b/apps/api/src/db/schema/project.ts new file mode 100644 index 00000000..3a4ef0e1 --- /dev/null +++ b/apps/api/src/db/schema/project.ts @@ -0,0 +1,174 @@ +import { relations } from 'drizzle-orm' +import { + boolean, + index, + integer, + jsonb, + pgTable, + text +} from 'drizzle-orm/pg-core' + +import { getProviderToken } from '@/lib/auth/get-provider-token' + +import type { Webhook } from './types' +import { deployments } from './deployment' +import { teams } from './team' +import { users } from './user' +import { + createInsertSchema, + createSelectSchema, + createUpdateSchema, + timestamps +} from './utils' + +export const projects = pgTable( + 'projects', + { + // namespace/projectName + id: text('id').primaryKey(), + ...timestamps, + + name: text().notNull(), + alias: text(), + + userId: text() + .notNull() + .references(() => users.id), + teamId: text().notNull(), + + // Most recently published Deployment if one exists + lastPublishedDeploymentId: text(), + + // Most recent Deployment if one exists + lastDeploymentId: text(), + + applicationFeePercent: integer().notNull().default(20), + + // TODO: This is going to need to vary from dev to prod + isStripeConnectEnabled: boolean().notNull().default(false), + + // All deployments share the same underlying proxy secret + _secret: text(), + + // Auth token used to access the saasify API on behalf of this project + _providerToken: text().notNull(), + + // TODO: Full-text search + _text: text().default(''), + + _webhooks: jsonb().$type().default([]), + + // Stripe products corresponding to the stripe plans across deployments + stripeBaseProduct: text(), + stripeRequestProduct: text(), + + // [metricSlug: string]: string + stripeMetricProducts: jsonb().$type>().default({}), + + // Stripe coupons associated with this project, mapping from unique coupon + // hash to stripe coupon id. + // `[hash: string]: string` + _stripeCoupons: jsonb().$type>().default({}), + + // Stripe billing plans associated with this project (created lazily), + // mapping from unique plan hash to stripe plan ids for base and request + // respectively. + // `[hash: string]: { basePlan: string, requestPlan: string }` + _stripePlans: jsonb() + .$type>() + .default({}), + + // Connected Stripe account (standard or express). + // If not defined, then subscriptions for this project route through our + // main Stripe account. + // NOTE: the connected account is shared between dev and prod, so we're not using + // the stripeID utility. + // TODO: is it wise to share this between dev and prod? + // TODO: is it okay for this to be public? + _stripeAccount: text() + }, + (table) => [ + index('project_userId_idx').on(table.userId), + index('project_teamId_idx').on(table.teamId), + index('project_teamId_idx').on(table.teamId), + index('project_createdAt_idx').on(table.createdAt), + index('project_updatedAt_idx').on(table.updatedAt) + ] +) + +export const projectsRelations = relations(projects, ({ one, many }) => ({ + user: one(users, { + fields: [projects.userId], + references: [users.id] + }), + team: one(teams, { + fields: [projects.teamId], + references: [teams.id] + }), + lastPublishedDeployment: one(deployments, { + fields: [projects.lastPublishedDeploymentId], + references: [deployments.id], + relationName: 'lastPublishedDeployment' + }), + lastDeployment: one(deployments, { + fields: [projects.lastDeploymentId], + references: [deployments.id], + relationName: 'lastDeployment' + }), + deployments: many(deployments, { relationName: 'deployments' }), + publishedDeployments: many(deployments, { + relationName: 'publishedDeployments' + }) +})) + +export type Project = typeof projects.$inferSelect + +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') +}) + .pick({ + id: true, + name: true, + userId: true + }) + .refine((data) => { + return { + ...data, + _providerToken: getProviderToken(data) + } + }) + +export const projectSelectSchema = createSelectSchema(projects).omit({ + _secret: true, + _providerToken: true, + _text: true, + _webhooks: true, + _stripeCoupons: true, + _stripePlans: true, + _stripeAccount: true +}) + +// TODO: narrow update schema +export const projectUpdateSchema = createUpdateSchema(projects) + +export const projectDebugSelectSchema = createSelectSchema(projects).pick({ + id: true, + name: true, + alias: true, + userId: true, + teamId: true, + createdAt: true, + updatedAt: true, + isStripeConnectEnabled: true, + lastPublishedDeploymentId: true, + lastDeploymentId: true +}) + +// TODO: virtual saasUrl +// TODO: virtual aliasUrl +// TODO: virtual stripeConnectParams diff --git a/apps/api/src/db/schema/team-members.ts b/apps/api/src/db/schema/team-members.ts new file mode 100644 index 00000000..3a86ef16 --- /dev/null +++ b/apps/api/src/db/schema/team-members.ts @@ -0,0 +1,47 @@ +import { relations } from 'drizzle-orm' +import { + index, + pgTable, + primaryKey, + text, + uniqueIndex +} from 'drizzle-orm/pg-core' + +import { teams } from './team' +import { users } from './user' +import { teamMemberRoleEnum, timestamps } from './utils' + +export const teamMembers = pgTable( + 'team_members', + { + ...timestamps, + + userId: text() + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + teamId: text() + .notNull() + .references(() => teams.id, { onDelete: 'cascade' }), + role: teamMemberRoleEnum().default('user').notNull() + }, + (table) => [ + primaryKey({ columns: [table.userId, table.teamId] }), + uniqueIndex('team_member_user_idx').on(table.userId), + uniqueIndex('team_member_team_idx').on(table.teamId), + index('team_member_createdAt_idx').on(table.createdAt), + index('team_member_updatedAt_idx').on(table.updatedAt) + ] +) + +export const teamMembersRelations = relations(teamMembers, ({ one }) => ({ + user: one(users, { + fields: [teamMembers.userId], + references: [users.id] + }), + team: one(teams, { + fields: [teamMembers.teamId], + references: [teams.id] + }) +})) + +export type TeamMember = typeof teamMembers.$inferSelect diff --git a/apps/api/src/db/schema/team.ts b/apps/api/src/db/schema/team.ts new file mode 100644 index 00000000..8e85a1a2 --- /dev/null +++ b/apps/api/src/db/schema/team.ts @@ -0,0 +1,46 @@ +import { relations } from 'drizzle-orm' +import { index, pgTable, text, uniqueIndex } from 'drizzle-orm/pg-core' + +import { teamMembers } from './team-members' +import { users } from './user' +import { + createInsertSchema, + createSelectSchema, + createUpdateSchema, + id, + timestamps +} from './utils' + +export const teams = pgTable( + 'teams', + { + id, + ...timestamps, + + slug: text().notNull().unique(), + name: text().notNull(), + + ownerId: text('owner').notNull() + }, + (table) => [ + uniqueIndex('team_slug_idx').on(table.slug), + index('team_createdAt_idx').on(table.createdAt), + index('team_updatedAt_idx').on(table.updatedAt) + ] +) + +export const teamsRelations = relations(teams, ({ one, many }) => ({ + owner: one(users, { + fields: [teams.ownerId], + references: [users.id] + }), + members: many(teamMembers) +})) + +export type Team = typeof teams.$inferSelect + +export const teamInsertSchema = createInsertSchema(teams, { + slug: (schema) => schema.min(3).max(20) // TODO +}) +export const teamSelectSchema = createSelectSchema(teams) +export const teamUpdateSchema = createUpdateSchema(teams).omit({ slug: true }) diff --git a/apps/api/src/db/schema/types.ts b/apps/api/src/db/schema/types.ts new file mode 100644 index 00000000..7da01378 --- /dev/null +++ b/apps/api/src/db/schema/types.ts @@ -0,0 +1,146 @@ +export type AuthProviderType = + | 'github' + | 'google' + | 'spotify' + | 'twitter' + | 'linkedin' + | 'stripe' + +export type AuthProvider = { + provider: AuthProviderType + + /** Provider-specific user id */ + id: string + + /** Provider-specific username */ + username?: string + + /** Standard oauth2 access token */ + accessToken?: string + + /** Standard oauth2 refresh token */ + refreshToken?: string + + /** Stripe public key */ + publicKey?: string + + /** OAuth scope(s) */ + scope?: string +} + +export type AuthProviders = { + github?: AuthProvider + google?: AuthProvider + spotify?: AuthProvider + twitter?: AuthProvider + linkedin?: AuthProvider + stripeTest?: AuthProvider + stripeLive?: AuthProvider +} + +export type Webhook = { + url: string + events: string[] +} + +export type RateLimit = { + enabled: boolean + + // informal description that overrides any other properties + desc?: string + + interval: number // seconds + maxPerInterval: number // unitless +} + +export type PricingPlanTier = { + unitAmount?: number + flatAmount?: number + upTo: string +} & ( + | { + unitAmount: number + } + | { + flatAmount: number + } +) + +export type PricingPlanMetric = { + // slug acts as a primary key for metrics + slug: string + + amount: number + + label: string + unitLabel: string + + // TODO: should this default be 'licensed' or 'metered'? + // methinks licensed for "sites", "jobs", etc... + // TODO: this should probably be explicit since its easy to confuse + usageType: 'licensed' | 'metered' + + billingScheme: 'per_unit' | 'tiered' + + tiersMode: 'graduated' | 'volume' + tiers: PricingPlanTier[] + + // TODO (low priority): add aggregateUsage + + rateLimit?: RateLimit +} + +export type PricingPlan = { + name: string + slug: string + + desc?: string + features: string[] + + auth: boolean + amount: number + trialPeriodDays?: number + + requests: PricingPlanMetric + metrics: PricingPlanMetric[] + + rateLimit?: RateLimit + + // used to uniquely identify this plan across deployments + baseId: string + + // used to uniquely identify this plan across deployments + requestsId: string + + // [metricSlug: string]: string + metricIds: Record + + // NOTE: the stripe billing plan id(s) for this PricingPlan are referenced + // in the Project._stripePlans mapping via the plan's hash. + // NOTE: all metered billing usage is stored in stripe + stripeBasePlan: string + stripeRequestPlan: string + + // [metricSlug: string]: string + stripeMetricPlans: Record +} + +export type Coupon = { + // used to uniquely identify this coupon across deployments + id: string + + valid: boolean + stripeCoupon: string + + name?: string + + currency?: string + amount_off?: number + percent_off?: number + + duration: string + duration_in_months?: number + + redeem_by?: Date + max_redemptions?: number +} diff --git a/apps/api/src/db/schema/user.ts b/apps/api/src/db/schema/user.ts new file mode 100644 index 00000000..2efe747a --- /dev/null +++ b/apps/api/src/db/schema/user.ts @@ -0,0 +1,82 @@ +import { relations } from 'drizzle-orm' +import { + boolean, + index, + jsonb, + pgTable, + text, + timestamp, + uniqueIndex +} from 'drizzle-orm/pg-core' + +import { sha256 } from '@/lib/utils' + +import type { AuthProviders } from './types' +import { teams } from './team' +import { + createInsertSchema, + createSelectSchema, + createUpdateSchema, + id, + timestamps, + userRoleEnum +} from './utils' + +export const users = pgTable( + 'users', + { + id, + ...timestamps, + + username: text().notNull().unique(), + role: userRoleEnum().default('user').notNull(), + + email: text().unique(), + password: text(), + + // metadata + firstName: text(), + lastName: text(), + image: text(), + + emailConfirmed: boolean().default(false), + emailConfirmedAt: timestamp(), + emailConfirmToken: text().unique().default(sha256()), + passwordResetToken: text().unique(), + + isStripeConnectEnabledByDefault: boolean().default(true), + + // third-party auth providers + providers: jsonb().$type().default({}), + + stripeCustomerId: text() + }, + (table) => [ + uniqueIndex('user_email_idx').on(table.email), + uniqueIndex('user_username_idx').on(table.username), + uniqueIndex('user_emailConfirmToken_idx').on(table.emailConfirmToken), + uniqueIndex('user_passwordResetToken_idx').on(table.passwordResetToken), + index('user_createdAt_idx').on(table.createdAt), + index('user_updatedAt_idx').on(table.updatedAt) + ] +) + +export const usersRelations = relations(users, ({ many }) => ({ + teamsOwned: many(teams) + + // TODO: team memberships +})) + +export type User = typeof users.$inferSelect + +export const userInsertSchema = createInsertSchema(users).pick({ + username: true, + email: true, + password: true, + firstName: true, + lastName: true, + image: true +}) + +export const userSelectSchema = createSelectSchema(users) +export const userUpdateSchema = createUpdateSchema(users) diff --git a/apps/api/src/db/schema/utils.ts b/apps/api/src/db/schema/utils.ts new file mode 100644 index 00000000..da01fc32 --- /dev/null +++ b/apps/api/src/db/schema/utils.ts @@ -0,0 +1,24 @@ +import { createId } from '@paralleldrive/cuid2' +import { sql } from 'drizzle-orm' +import { pgEnum, text, timestamp } from 'drizzle-orm/pg-core' +import { createSchemaFactory } from 'drizzle-zod' + +export const id = text('id').primaryKey().$defaultFn(createId) + +export const timestamps = { + createdAt: timestamp('createdAt').notNull().defaultNow(), + updatedAt: timestamp('updatedAt') + .notNull() + .default(sql`now()`) +} + +export const userRoleEnum = pgEnum('UserRole', ['user', 'admin']) +export const teamMemberRoleEnum = pgEnum('TeamMemberRole', ['user', 'admin']) + +export const { createInsertSchema, createSelectSchema, createUpdateSchema } = + createSchemaFactory({ + coerce: { + // Coerce dates / strings to timetamps + date: true + } + }) diff --git a/apps/api/src/lib/auth/get-provider-token.ts b/apps/api/src/lib/auth/get-provider-token.ts new file mode 100644 index 00000000..76e626a5 --- /dev/null +++ b/apps/api/src/lib/auth/get-provider-token.ts @@ -0,0 +1,9 @@ +import jwt from 'jsonwebtoken' + +import { env } from '@/lib/env' + +export function getProviderToken(project: { id: string }) { + // TODO: Possibly in the future store stripe account ID as well and require + // provider tokens to refresh after account changes? + return jwt.sign({ projectId: project.id }, env.JWT_SECRET) +} diff --git a/apps/api/src/lib/env.ts b/apps/api/src/lib/env.ts new file mode 100644 index 00000000..25df2a02 --- /dev/null +++ b/apps/api/src/lib/env.ts @@ -0,0 +1,16 @@ +import 'dotenv/config' + +import { z } from 'zod' + +export const envSchema = z.object({ + NODE_ENV: z + .enum(['development', 'test', 'production']) + .default('development'), + DATABASE_URL: z.string().url(), + JWT_SECRET: z.string() +}) + +// eslint-disable-next-line no-process-env +export const env = envSchema.parse(process.env) + +export const isProd = env.NODE_ENV === 'production' diff --git a/apps/api/src/lib/types.ts b/apps/api/src/lib/types.ts new file mode 100644 index 00000000..fad44344 --- /dev/null +++ b/apps/api/src/lib/types.ts @@ -0,0 +1 @@ +export type Operation = 'create' | 'read' | 'update' | 'delete' | 'debug' diff --git a/apps/api/src/lib/utils.ts b/apps/api/src/lib/utils.ts new file mode 100644 index 00000000..c7237f45 --- /dev/null +++ b/apps/api/src/lib/utils.ts @@ -0,0 +1,5 @@ +import { createHash, randomUUID } from 'node:crypto' + +export function sha256(input: string = randomUUID()) { + return createHash('sha256').update(input).digest('hex') +} diff --git a/apps/api/src/reset.d.ts b/apps/api/src/reset.d.ts new file mode 100644 index 00000000..e708f4a1 --- /dev/null +++ b/apps/api/src/reset.d.ts @@ -0,0 +1 @@ +import '@fisch0920/config/ts-reset' diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json new file mode 100644 index 00000000..9d4212bd --- /dev/null +++ b/apps/api/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src", "drizzle.config.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/eslint.config.js b/eslint.config.js index c4abb958..0dabe36f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,3 +1,15 @@ import { config } from '@fisch0920/config/eslint' +import drizzle from 'eslint-plugin-drizzle' -export default [ ...config ] +export default [ + ...config, + { + files: ['**/*.ts', '**/*.tsx'], + plugins: { + drizzle + }, + rules: { + ...drizzle.configs.recommended.rules + } + } +] diff --git a/package.json b/package.json index e2fc5772..7eabc5e5 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "agentic-platform", "private": true, "author": "Travis Fischer ", - "license": "PROPRIETARY", + "license": "UNLICENSED", "repository": { "type": "git", "url": "git+https://github.com/transitive-bullshit/agentic-platform.git" @@ -33,6 +33,7 @@ "del-cli": "catalog:", "dotenv": "catalog:", "eslint": "catalog:", + "eslint-plugin-drizzle": "^0.2.3", "lint-staged": "catalog:", "npm-run-all2": "catalog:", "only-allow": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 980cbb1b..67762a8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,23 +7,23 @@ settings: catalogs: default: '@fisch0920/config': - specifier: ^1.0.1 - version: 1.0.2 + specifier: ^1.0.3 + version: 1.0.3 '@types/node': - specifier: ^22.13.16 - version: 22.14.0 + specifier: ^22.14.1 + version: 22.14.1 del-cli: specifier: ^6.0.0 version: 6.0.0 dotenv: - specifier: ^16.4.7 - version: 16.4.7 + specifier: ^16.5.0 + version: 16.5.0 eslint: - specifier: ^9.23.0 - version: 9.23.0 + specifier: ^9.25.0 + version: 9.25.0 lint-staged: - specifier: ^15.5.0 - version: 15.5.0 + specifier: ^15.5.1 + version: 15.5.1 npm-run-all2: specifier: ^7.0.2 version: 7.0.2 @@ -43,17 +43,20 @@ catalogs: specifier: ^4.19.3 version: 4.19.3 turbo: - specifier: ^2.4.4 + specifier: ^2.5.0 version: 2.5.0 + type-fest: + specifier: ^4.40.0 + version: 4.40.0 typescript: - specifier: ^5.8.2 - version: 5.8.2 + specifier: ^5.8.3 + version: 5.8.3 vitest: specifier: ^3.1.1 version: 3.1.1 zod: - specifier: ^3.24.2 - version: 3.24.2 + specifier: ^3.24.3 + version: 3.24.3 importers: @@ -61,22 +64,25 @@ importers: devDependencies: '@fisch0920/config': specifier: 'catalog:' - version: 1.0.2(@typescript-eslint/parser@8.29.0(eslint@9.23.0)(typescript@5.8.2))(@typescript-eslint/utils@8.29.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(prettier@3.5.3)(typescript@5.8.2)(vitest@3.1.1(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1)) + version: 1.0.3(@typescript-eslint/parser@8.29.0(eslint@9.25.0)(typescript@5.8.3))(@typescript-eslint/utils@8.29.0(eslint@9.25.0)(typescript@5.8.3))(eslint@9.25.0)(prettier@3.5.3)(typescript@5.8.3)(vitest@3.1.1(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1)) '@types/node': specifier: 'catalog:' - version: 22.14.0 + version: 22.14.1 del-cli: specifier: 'catalog:' version: 6.0.0 dotenv: specifier: 'catalog:' - version: 16.4.7 + version: 16.5.0 eslint: specifier: 'catalog:' - version: 9.23.0 + version: 9.25.0 + eslint-plugin-drizzle: + specifier: ^0.2.3 + version: 0.2.3(eslint@9.25.0) lint-staged: specifier: 'catalog:' - version: 15.5.0 + version: 15.5.1 npm-run-all2: specifier: 'catalog:' version: 7.0.2 @@ -91,7 +97,7 @@ importers: version: 2.12.1 tsup: specifier: 'catalog:' - version: 8.4.0(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.1) + version: 8.4.0(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.7.1) tsx: specifier: 'catalog:' version: 4.19.3 @@ -100,13 +106,44 @@ importers: version: 2.5.0 typescript: specifier: 'catalog:' - version: 5.8.2 + version: 5.8.3 vitest: specifier: 'catalog:' - version: 3.1.1(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1) + version: 3.1.1(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) zod: specifier: 'catalog:' - version: 3.24.2 + version: 3.24.3 + + apps/api: + dependencies: + '@paralleldrive/cuid2': + specifier: ^2.2.2 + version: 2.2.2 + drizzle-orm: + specifier: ^0.42.0 + version: 0.42.0(postgres@3.4.5) + drizzle-zod: + specifier: ^0.7.1 + version: 0.7.1(drizzle-orm@0.42.0(postgres@3.4.5))(zod@3.24.3) + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.2 + postgres: + specifier: ^3.4.5 + version: 3.4.5 + type-fest: + specifier: 'catalog:' + version: 4.40.0 + zod: + specifier: 'catalog:' + version: 3.24.3 + devDependencies: + '@types/jsonwebtoken': + specifier: ^9.0.9 + version: 9.0.9 + drizzle-kit: + specifier: ^0.31.0 + version: 0.31.0 packages: @@ -122,102 +159,209 @@ packages: resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' + '@esbuild/aix-ppc64@0.25.2': resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.2': resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.2': resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.2': resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.2': resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.2': resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.2': resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.2': resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.2': resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.2': resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.2': resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.2': resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.2': resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.2': resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.2': resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.2': resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.2': resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} engines: {node: '>=18'} @@ -230,6 +374,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.2': resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} engines: {node: '>=18'} @@ -242,30 +392,60 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.2': resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.2': resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.2': resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.2': resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.2': resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} engines: {node: '>=18'} @@ -282,18 +462,14 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.2.1': resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.13.0': resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -306,6 +482,10 @@ packages: resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.25.0': + resolution: {integrity: sha512-iWhsUS8Wgxz9AXNfvfOPFSW4VfMXdVhp1hjkZVhXCrpgh/aLcc45rX6MPu+tIVUWDw0HfNwth7O28M1xDxNf9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -314,8 +494,8 @@ packages: resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fisch0920/config@1.0.2': - resolution: {integrity: sha512-9/44RKlsZZ2Hnq+etYR7YviyjtlMDDCfv9t5RSv3eeG4fLThdyPSmaFp5mL4g26bMZDmUycev0jV1HufmISdSw==} + '@fisch0920/config@1.0.3': + resolution: {integrity: sha512-CtXpprNuh8x/U3pDy7eRLKPhsXAw4Zp3Fk6Ej6AcYdk5aiMtf6cgbd+QD2lcC48sL9dr8y57rBdSX0GSeBpRsQ==} engines: {node: '>=18'} peerDependencies: eslint: '>= 9' @@ -364,6 +544,10 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@noble/hashes@1.7.2': + resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -376,6 +560,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@paralleldrive/cuid2@2.2.2': + resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -499,8 +686,14 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@22.14.0': - resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} + '@types/jsonwebtoken@9.0.9': + resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.14.1': + resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -710,6 +903,12 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + builtin-modules@5.0.0: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} @@ -871,10 +1070,109 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} + drizzle-kit@0.31.0: + resolution: {integrity: sha512-pcKVT+GbfPA+bUovPIilgVOoq+onNBo/YQBG86sf3/GFHkN6lRJPm1l7dKN0IMAk57RQoIm4GUllRrasLlcaSg==} + hasBin: true + + drizzle-orm@0.42.0: + resolution: {integrity: sha512-pS8nNJm2kBNZwrOjTHJfdKkaU+KuUQmV/vk5D57NojDq4FG+0uAYGMulXtYT///HfgsMF0hnFFvu1ezI3OwOkg==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1.13' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + drizzle-zod@0.7.1: + resolution: {integrity: sha512-nZzALOdz44/AL2U005UlmMqaQ1qe5JfanvLujiTHiiT8+vZJTBFhj3pY4Vk+L6UWyKFfNmLhk602Hn4kCTynKQ==} + peerDependencies: + drizzle-orm: '>=0.36.0' + zod: '>=3.0.0' + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -882,6 +1180,9 @@ packages: 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==} @@ -933,6 +1234,16 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.25.2: resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} engines: {node: '>=18'} @@ -980,6 +1291,11 @@ packages: eslint-import-resolver-webpack: optional: true + eslint-plugin-drizzle@0.2.3: + resolution: {integrity: sha512-BO+ymHo33IUNoJlC0rbd7HP9EwwpW4VIp49R/tWQF/d2E1K2kgTf0tCXT0v9MSiBr6gGR1LtPwMLapTKEWSg9A==} + peerDependencies: + eslint: '>=8.0.0' + eslint-plugin-import@2.31.0: resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} @@ -1057,8 +1373,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.23.0: - resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==} + eslint@9.25.0: + resolution: {integrity: sha512-MsBdObhM4cEwkzCiraDv7A6txFXEqtNXOb877TsSp2FCkBNl8JfVQrmiuDqC1IkejT6JLPzYBXx/xAiYhyzgGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1471,10 +1787,20 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1496,8 +1822,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@15.5.0: - resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==} + lint-staged@15.5.1: + resolution: {integrity: sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -1513,9 +1839,30 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -1778,6 +2125,10 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} + postgres@3.4.5: + resolution: {integrity: sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==} + engines: {node: '>=12'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -1882,6 +2233,9 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -1969,6 +2323,13 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -2181,8 +2542,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@4.39.1: - resolution: {integrity: sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==} + type-fest@4.40.0: + resolution: {integrity: sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==} engines: {node: '>=16'} typed-array-buffer@1.0.3: @@ -2208,8 +2569,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true @@ -2379,8 +2740,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.24.3: + resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} snapshots: @@ -2396,89 +2757,167 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@drizzle-team/brocli@0.10.2': {} + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.10.0 + '@esbuild/aix-ppc64@0.25.2': optional: true + '@esbuild/android-arm64@0.18.20': + optional: true + '@esbuild/android-arm64@0.25.2': optional: true + '@esbuild/android-arm@0.18.20': + optional: true + '@esbuild/android-arm@0.25.2': optional: true + '@esbuild/android-x64@0.18.20': + optional: true + '@esbuild/android-x64@0.25.2': optional: true + '@esbuild/darwin-arm64@0.18.20': + optional: true + '@esbuild/darwin-arm64@0.25.2': optional: true + '@esbuild/darwin-x64@0.18.20': + optional: true + '@esbuild/darwin-x64@0.25.2': optional: true + '@esbuild/freebsd-arm64@0.18.20': + optional: true + '@esbuild/freebsd-arm64@0.25.2': optional: true + '@esbuild/freebsd-x64@0.18.20': + optional: true + '@esbuild/freebsd-x64@0.25.2': optional: true + '@esbuild/linux-arm64@0.18.20': + optional: true + '@esbuild/linux-arm64@0.25.2': optional: true + '@esbuild/linux-arm@0.18.20': + optional: true + '@esbuild/linux-arm@0.25.2': optional: true + '@esbuild/linux-ia32@0.18.20': + optional: true + '@esbuild/linux-ia32@0.25.2': optional: true + '@esbuild/linux-loong64@0.18.20': + optional: true + '@esbuild/linux-loong64@0.25.2': optional: true + '@esbuild/linux-mips64el@0.18.20': + optional: true + '@esbuild/linux-mips64el@0.25.2': optional: true + '@esbuild/linux-ppc64@0.18.20': + optional: true + '@esbuild/linux-ppc64@0.25.2': optional: true + '@esbuild/linux-riscv64@0.18.20': + optional: true + '@esbuild/linux-riscv64@0.25.2': optional: true + '@esbuild/linux-s390x@0.18.20': + optional: true + '@esbuild/linux-s390x@0.25.2': optional: true + '@esbuild/linux-x64@0.18.20': + optional: true + '@esbuild/linux-x64@0.25.2': optional: true '@esbuild/netbsd-arm64@0.25.2': optional: true + '@esbuild/netbsd-x64@0.18.20': + optional: true + '@esbuild/netbsd-x64@0.25.2': optional: true '@esbuild/openbsd-arm64@0.25.2': optional: true + '@esbuild/openbsd-x64@0.18.20': + optional: true + '@esbuild/openbsd-x64@0.25.2': optional: true + '@esbuild/sunos-x64@0.18.20': + optional: true + '@esbuild/sunos-x64@0.25.2': optional: true + '@esbuild/win32-arm64@0.18.20': + optional: true + '@esbuild/win32-arm64@0.25.2': optional: true + '@esbuild/win32-ia32@0.18.20': + optional: true + '@esbuild/win32-ia32@0.25.2': optional: true + '@esbuild/win32-x64@0.18.20': + optional: true + '@esbuild/win32-x64@0.25.2': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@9.23.0)': + '@eslint-community/eslint-utils@4.5.1(eslint@9.25.0)': dependencies: - eslint: 9.23.0 + eslint: 9.25.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.0 @@ -2488,10 +2927,6 @@ snapshots: '@eslint/config-helpers@0.2.1': {} - '@eslint/core@0.12.0': - dependencies: - '@types/json-schema': 7.0.15 - '@eslint/core@0.13.0': dependencies: '@types/json-schema': 7.0.15 @@ -2512,6 +2947,8 @@ snapshots: '@eslint/js@9.23.0': {} + '@eslint/js@9.25.0': {} + '@eslint/object-schema@2.1.6': {} '@eslint/plugin-kit@0.2.8': @@ -2519,27 +2956,27 @@ snapshots: '@eslint/core': 0.13.0 levn: 0.4.1 - '@fisch0920/config@1.0.2(@typescript-eslint/parser@8.29.0(eslint@9.23.0)(typescript@5.8.2))(@typescript-eslint/utils@8.29.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(prettier@3.5.3)(typescript@5.8.2)(vitest@3.1.1(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1))': + '@fisch0920/config@1.0.3(@typescript-eslint/parser@8.29.0(eslint@9.25.0)(typescript@5.8.3))(@typescript-eslint/utils@8.29.0(eslint@9.25.0)(typescript@5.8.3))(eslint@9.25.0)(prettier@3.5.3)(typescript@5.8.3)(vitest@3.1.1(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@eslint/js': 9.23.0 '@total-typescript/ts-reset': 0.6.1 - '@vitest/eslint-plugin': 1.1.39(@typescript-eslint/utils@8.29.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)(vitest@3.1.1(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1)) - eslint: 9.23.0 - eslint-config-prettier: 10.1.1(eslint@9.23.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0) - eslint-plugin-jest-dom: 5.5.0(eslint@9.23.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.23.0) - eslint-plugin-perfectionist: 4.11.0(eslint@9.23.0)(typescript@5.8.2) - eslint-plugin-react: 7.37.5(eslint@9.23.0) - eslint-plugin-react-hooks: 5.2.0(eslint@9.23.0) + '@vitest/eslint-plugin': 1.1.39(@typescript-eslint/utils@8.29.0(eslint@9.25.0)(typescript@5.8.3))(eslint@9.25.0)(typescript@5.8.3)(vitest@3.1.1(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1)) + eslint: 9.25.0 + eslint-config-prettier: 10.1.1(eslint@9.25.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.25.0)(typescript@5.8.3))(eslint@9.25.0) + eslint-plugin-jest-dom: 5.5.0(eslint@9.25.0) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.25.0) + eslint-plugin-perfectionist: 4.11.0(eslint@9.25.0)(typescript@5.8.3) + eslint-plugin-react: 7.37.5(eslint@9.25.0) + eslint-plugin-react-hooks: 5.2.0(eslint@9.25.0) eslint-plugin-security: 3.0.1 - eslint-plugin-simple-import-sort: 12.1.1(eslint@9.23.0) - eslint-plugin-testing-library: 7.1.1(eslint@9.23.0)(typescript@5.8.2) - eslint-plugin-unicorn: 58.0.0(eslint@9.23.0) + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.25.0) + eslint-plugin-testing-library: 7.1.1(eslint@9.25.0)(typescript@5.8.3) + eslint-plugin-unicorn: 58.0.0(eslint@9.25.0) globals: 16.0.0 prettier: 3.5.3 - typescript: 5.8.2 - typescript-eslint: 8.29.0(eslint@9.23.0)(typescript@5.8.2) + typescript: 5.8.3 + typescript-eslint: 8.29.0(eslint@9.25.0)(typescript@5.8.3) transitivePeerDependencies: - '@testing-library/dom' - '@typescript-eslint/parser' @@ -2588,6 +3025,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@noble/hashes@1.7.2': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2600,6 +3039,10 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@paralleldrive/cuid2@2.2.2': + dependencies: + '@noble/hashes': 1.7.2 + '@pkgjs/parseargs@0.11.0': optional: true @@ -2675,38 +3118,45 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@22.14.0': + '@types/jsonwebtoken@9.0.9': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 22.14.1 + + '@types/ms@2.1.0': {} + + '@types/node@22.14.1': dependencies: undici-types: 6.21.0 '@types/normalize-package-data@2.4.4': {} - '@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.25.0)(typescript@5.8.3))(eslint@9.25.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.29.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.29.0(eslint@9.25.0)(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.29.0 - '@typescript-eslint/type-utils': 8.29.0(eslint@9.23.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.29.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/type-utils': 8.29.0(eslint@9.25.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.25.0)(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.29.0 - eslint: 9.23.0 + eslint: 9.25.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.29.0(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/parser@8.29.0(eslint@9.25.0)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.29.0 '@typescript-eslint/types': 8.29.0 - '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.29.0 debug: 4.4.0 - eslint: 9.23.0 - typescript: 5.8.2 + eslint: 9.25.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -2715,20 +3165,20 @@ snapshots: '@typescript-eslint/types': 8.29.0 '@typescript-eslint/visitor-keys': 8.29.0 - '@typescript-eslint/type-utils@8.29.0(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/type-utils@8.29.0(eslint@9.25.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.29.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.25.0)(typescript@5.8.3) debug: 4.4.0 - eslint: 9.23.0 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + eslint: 9.25.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.29.0': {} - '@typescript-eslint/typescript-estree@8.29.0(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@8.29.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.29.0 '@typescript-eslint/visitor-keys': 8.29.0 @@ -2737,19 +3187,19 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.29.0(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/utils@8.29.0(eslint@9.25.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.25.0) '@typescript-eslint/scope-manager': 8.29.0 '@typescript-eslint/types': 8.29.0 - '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.2) - eslint: 9.23.0 - typescript: 5.8.2 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.3) + eslint: 9.25.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -2758,13 +3208,13 @@ snapshots: '@typescript-eslint/types': 8.29.0 eslint-visitor-keys: 4.2.0 - '@vitest/eslint-plugin@1.1.39(@typescript-eslint/utils@8.29.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)(vitest@3.1.1(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1))': + '@vitest/eslint-plugin@1.1.39(@typescript-eslint/utils@8.29.0(eslint@9.25.0)(typescript@5.8.3))(eslint@9.25.0)(typescript@5.8.3)(vitest@3.1.1(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1))': dependencies: - '@typescript-eslint/utils': 8.29.0(eslint@9.23.0)(typescript@5.8.2) - eslint: 9.23.0 + '@typescript-eslint/utils': 8.29.0(eslint@9.25.0)(typescript@5.8.3) + eslint: 9.25.0 optionalDependencies: - typescript: 5.8.2 - vitest: 3.1.1(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1) + typescript: 5.8.3 + vitest: 3.1.1(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) '@vitest/expect@3.1.1': dependencies: @@ -2773,13 +3223,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.2.5(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1))': + '@vitest/mocker@3.1.1(vite@6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.5(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) '@vitest/pretty-format@3.1.1': dependencies: @@ -2940,6 +3390,10 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + builtin-modules@5.0.0: {} bundle-require@5.1.0(esbuild@0.25.2): @@ -3094,7 +3548,25 @@ snapshots: dependencies: esutils: 2.0.3 - dotenv@16.4.7: {} + dotenv@16.5.0: {} + + drizzle-kit@0.31.0: + dependencies: + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.25.2 + esbuild-register: 3.6.0(esbuild@0.25.2) + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.42.0(postgres@3.4.5): + optionalDependencies: + postgres: 3.4.5 + + drizzle-zod@0.7.1(drizzle-orm@0.42.0(postgres@3.4.5))(zod@3.24.3): + dependencies: + drizzle-orm: 0.42.0(postgres@3.4.5) + zod: 3.24.3 dunder-proto@1.0.1: dependencies: @@ -3104,6 +3576,10 @@ snapshots: eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + electron-to-chromium@1.5.132: {} emoji-regex@10.4.0: {} @@ -3214,6 +3690,38 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esbuild-register@3.6.0(esbuild@0.25.2): + dependencies: + debug: 4.4.0 + esbuild: 0.25.2 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + esbuild@0.25.2: optionalDependencies: '@esbuild/aix-ppc64': 0.25.2 @@ -3248,9 +3756,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.1(eslint@9.23.0): + eslint-config-prettier@10.1.1(eslint@9.25.0): dependencies: - eslint: 9.23.0 + eslint: 9.25.0 eslint-import-resolver-node@0.3.9: dependencies: @@ -3260,17 +3768,21 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@9.23.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.29.0(eslint@9.25.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.25.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.29.0(eslint@9.23.0)(typescript@5.8.2) - eslint: 9.23.0 + '@typescript-eslint/parser': 8.29.0(eslint@9.25.0)(typescript@5.8.3) + eslint: 9.25.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0): + eslint-plugin-drizzle@0.2.3(eslint@9.25.0): + dependencies: + eslint: 9.25.0 + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.25.0)(typescript@5.8.3))(eslint@9.25.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -3279,9 +3791,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.23.0 + eslint: 9.25.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@9.23.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.29.0(eslint@9.25.0)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.25.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3293,19 +3805,19 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.29.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.29.0(eslint@9.25.0)(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest-dom@5.5.0(eslint@9.23.0): + eslint-plugin-jest-dom@5.5.0(eslint@9.25.0): dependencies: '@babel/runtime': 7.27.0 - eslint: 9.23.0 + eslint: 9.25.0 requireindex: 1.2.0 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.23.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.25.0): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -3315,7 +3827,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.23.0 + eslint: 9.25.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -3324,21 +3836,21 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-perfectionist@4.11.0(eslint@9.23.0)(typescript@5.8.2): + eslint-plugin-perfectionist@4.11.0(eslint@9.25.0)(typescript@5.8.3): dependencies: '@typescript-eslint/types': 8.29.0 - '@typescript-eslint/utils': 8.29.0(eslint@9.23.0)(typescript@5.8.2) - eslint: 9.23.0 + '@typescript-eslint/utils': 8.29.0(eslint@9.25.0)(typescript@5.8.3) + eslint: 9.25.0 natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-react-hooks@5.2.0(eslint@9.23.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.25.0): dependencies: - eslint: 9.23.0 + eslint: 9.25.0 - eslint-plugin-react@7.37.5(eslint@9.23.0): + eslint-plugin-react@7.37.5(eslint@9.25.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -3346,7 +3858,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.23.0 + eslint: 9.25.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -3364,28 +3876,28 @@ snapshots: dependencies: safe-regex: 2.1.1 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.23.0): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.25.0): dependencies: - eslint: 9.23.0 + eslint: 9.25.0 - eslint-plugin-testing-library@7.1.1(eslint@9.23.0)(typescript@5.8.2): + eslint-plugin-testing-library@7.1.1(eslint@9.25.0)(typescript@5.8.3): dependencies: '@typescript-eslint/scope-manager': 8.29.0 - '@typescript-eslint/utils': 8.29.0(eslint@9.23.0)(typescript@5.8.2) - eslint: 9.23.0 + '@typescript-eslint/utils': 8.29.0(eslint@9.25.0)(typescript@5.8.3) + eslint: 9.25.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-unicorn@58.0.0(eslint@9.23.0): + eslint-plugin-unicorn@58.0.0(eslint@9.25.0): dependencies: '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.25.0) '@eslint/plugin-kit': 0.2.8 ci-info: 4.2.0 clean-regexp: 1.0.0 core-js-compat: 3.41.0 - eslint: 9.23.0 + eslint: 9.25.0 esquery: 1.6.0 globals: 16.0.0 indent-string: 5.0.0 @@ -3407,15 +3919,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.23.0: + eslint@9.25.0: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.25.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 + '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.1 - '@eslint/core': 0.12.0 + '@eslint/core': 0.13.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.23.0 + '@eslint/js': 9.25.0 '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -3842,6 +4354,19 @@ snapshots: dependencies: minimist: 1.2.8 + jsonwebtoken@9.0.2: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.1 + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 @@ -3849,6 +4374,17 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 + jwa@1.4.1: + 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 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -3868,7 +4404,7 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@15.5.0: + lint-staged@15.5.1: dependencies: chalk: 5.4.1 commander: 13.1.0 @@ -3898,8 +4434,22 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + lodash.merge@4.6.2: {} + lodash.once@4.1.1: {} + lodash.sortby@4.7.0: {} log-update@6.1.0: @@ -4083,7 +4633,7 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 index-to-position: 1.0.0 - type-fest: 4.39.1 + type-fest: 4.40.0 path-exists@4.0.0: {} @@ -4132,6 +4682,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postgres@3.4.5: {} + prelude-ls@1.2.1: {} prettier@3.5.3: {} @@ -4157,14 +4709,14 @@ snapshots: dependencies: find-up-simple: 1.0.1 read-pkg: 9.0.1 - type-fest: 4.39.1 + type-fest: 4.40.0 read-pkg@9.0.1: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 parse-json: 8.2.0 - type-fest: 4.39.1 + type-fest: 4.40.0 unicorn-magic: 0.1.0 readdirp@4.1.2: {} @@ -4264,6 +4816,8 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -4361,6 +4915,13 @@ snapshots: source-map-js@1.2.1: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 @@ -4520,9 +5081,9 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.8.2): + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: - typescript: 5.8.2 + typescript: 5.8.3 ts-interface-checker@0.1.13: {} @@ -4533,7 +5094,7 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsup@8.4.0(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.1): + tsup@8.4.0(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.7.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.2) cac: 6.7.14 @@ -4553,7 +5114,7 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: postcss: 8.5.3 - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - jiti - supports-color @@ -4598,7 +5159,7 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@4.39.1: {} + type-fest@4.40.0: {} typed-array-buffer@1.0.3: dependencies: @@ -4633,17 +5194,17 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.29.0(eslint@9.23.0)(typescript@5.8.2): + typescript-eslint@8.29.0(eslint@9.25.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) - '@typescript-eslint/parser': 8.29.0(eslint@9.23.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.29.0(eslint@9.23.0)(typescript@5.8.2) - eslint: 9.23.0 - typescript: 5.8.2 + '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.25.0)(typescript@5.8.3))(eslint@9.25.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.29.0(eslint@9.25.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.25.0)(typescript@5.8.3) + eslint: 9.25.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - typescript@5.8.2: {} + typescript@5.8.3: {} unbox-primitive@1.1.0: dependencies: @@ -4673,13 +5234,13 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@3.1.1(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1): + vite-node@3.1.1(@types/node@22.14.1)(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.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - '@types/node' - jiti @@ -4694,21 +5255,21 @@ snapshots: - tsx - yaml - vite@6.2.5(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1): + vite@6.2.5(@types/node@22.14.1)(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.0 + '@types/node': 22.14.1 fsevents: 2.3.3 tsx: 4.19.3 yaml: 2.7.1 - vitest@3.1.1(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1): + vitest@3.1.1(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1): dependencies: '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.2.5(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1)) + '@vitest/mocker': 3.1.1(vite@6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.1.1 '@vitest/snapshot': 3.1.1 @@ -4724,11 +5285,11 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.5(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1) - vite-node: 3.1.1(@types/node@22.14.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) + vite-node: 3.1.1(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 transitivePeerDependencies: - jiti - less @@ -4831,4 +5392,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@3.24.2: {} + zod@3.24.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b313720a..35be139f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,19 +1,19 @@ packages: - packages/* - - services/* + - apps/* catalog: '@ai-sdk/openai': ^1.3.6 - '@fisch0920/config': ^1.0.2 + '@fisch0920/config': ^1.0.3 '@modelcontextprotocol/sdk': ^1.8.0 - '@types/node': ^22.14.0 + '@types/node': ^22.14.1 ai: ^4.2.11 cleye: ^1.3.4 del-cli: ^6.0.0 - dotenv: ^16.4.7 - eslint: ^9.23.0 + dotenv: ^16.5.0 + eslint: ^9.25.0 exit-hook: ^4.0.0 ky: ^1.8.0 - lint-staged: ^15.5.0 + lint-staged: ^15.5.1 npm-run-all2: ^7.0.2 only-allow: ^1.2.1 p-map: ^7.0.3 @@ -24,7 +24,7 @@ catalog: tsup: ^8.4.0 tsx: ^4.19.3 turbo: ^2.5.0 - type-fest: ^4.39.1 - typescript: ^5.8.2 + type-fest: ^4.40.0 + typescript: ^5.8.3 vitest: ^3.1.1 - zod: ^3.24.2 + zod: ^3.24.3