pull/715/head
Travis Fischer 2025-04-23 08:21:18 +07:00
rodzic 2477b0488d
commit f259cee1b9
14 zmienionych plików z 412 dodań i 197 usunięć

Wyświetl plik

@ -11,4 +11,5 @@ const postgresClient =
export const db = drizzle({ client: postgresClient, schema })
export * as schema from './schema'
export type * from './types'

Wyświetl plik

@ -1,5 +1,11 @@
import { relations } from 'drizzle-orm'
import { index, pgTable, primaryKey } from 'drizzle-orm/pg-core'
import {
boolean,
index,
pgTable,
primaryKey,
timestamp
} from 'drizzle-orm/pg-core'
import { teams } from './team'
import { users } from './user'
@ -16,7 +22,10 @@ export const teamMembers = pgTable(
teamId: cuid()
.notNull()
.references(() => teams.id, { onDelete: 'cascade' }),
role: teamMemberRoleEnum().default('user').notNull()
role: teamMemberRoleEnum().default('user').notNull(),
confirmed: boolean().default(false),
confirmedAt: timestamp()
},
(table) => [
primaryKey({ columns: [table.userId, table.teamId] }),

Wyświetl plik

@ -4,30 +4,30 @@ import type * as schema from './schema'
export type Tables = ExtractTablesWithRelations<typeof schema>
export type User = typeof schema.users.$inferInsert
export type User = typeof schema.users.$inferSelect
export type Team = typeof schema.teams.$inferInsert
export type Team = typeof schema.teams.$inferSelect
export type TeamWithMembers = BuildQueryResult<
Tables,
Tables['teams'],
{ with: { members: true } }
>
export type TeamMember = typeof schema.teamMembers.$inferInsert
export type TeamMember = typeof schema.teamMembers.$inferSelect
export type TeamMemberWithTeam = BuildQueryResult<
Tables,
Tables['teamMembers'],
{ with: { team: true } }
>
export type Project = typeof schema.projects.$inferInsert
export type Project = typeof schema.projects.$inferSelect
export type ProjectWithLastPublishedDeployment = BuildQueryResult<
Tables,
Tables['projects'],
{ with: { lastPublishedDeployment: true } }
>
export type Deployment = typeof schema.deployments.$inferInsert
export type Deployment = typeof schema.deployments.$inferSelect
export type DeploymentWithProject = BuildQueryResult<
Tables,
Tables['deployments'],

Wyświetl plik

@ -0,0 +1,24 @@
import type { TeamMemberWithTeam } from '@/db'
import type { AuthenticatedContext } from './types'
import { assert } from './utils'
export async function aclTeamMember(
ctx: AuthenticatedContext,
teamMember: TeamMemberWithTeam
) {
const user = ctx.get('user')
assert(user, 401, 'Authentication required')
assert(
teamMember.userId === user.id,
403,
`User does not have access to team "${teamMember.team.slug}"`
)
assert(
teamMember.confirmed,
403,
`User has not confirmed their invitation to team "${teamMember.team.slug}"`
)
}

Wyświetl plik

@ -0,0 +1,15 @@
export class HttpError extends Error {
readonly statusCode: number
constructor({
statusCode = 500,
message
}: {
statusCode?: number
message: string
}) {
super(message)
this.statusCode = statusCode
}
}

Wyświetl plik

@ -1,6 +1,32 @@
import { eq } from 'drizzle-orm'
import { createMiddleware } from 'hono/factory'
import { jwt } from 'hono/jwt'
export const authenticate = createMiddleware(async (c, next) => {
console.log(`[${c.req.method}] ${c.req.url}`)
await next()
import type { AuthenticatedEnv } from '@/lib/types'
import { db, schema } from '@/db'
import { env } from '@/lib/env'
import { assert } from '../utils'
const jwtMiddleware = jwt({
secret: env.JWT_SECRET
})
export const authenticate = createMiddleware<AuthenticatedEnv>(
async (ctx, next) => {
console.log(`[${ctx.req.method}] ${ctx.req.url}`)
await jwtMiddleware(ctx, async () => {
const payload = ctx.get('jwtPayload')
if (payload.type === 'user') {
const user = await db.query.users.findFirst({
where: eq(schema.users.id, payload.userId)
})
assert(user, 401, 'Unauthorized')
ctx.set('user', user)
}
await next()
})
}
)

Wyświetl plik

@ -1 +1,3 @@
export * from './authenticate'
export * from './me'
export * from './team'

Wyświetl plik

@ -0,0 +1,14 @@
import { createMiddleware } from 'hono/factory'
import type { AuthenticatedEnv } from '@/lib/types'
export const me = createMiddleware<AuthenticatedEnv>(async (ctx, next) => {
const user = ctx.get('user')
const regex = /^\/(me)(\/|$)/
if (user && regex.test(ctx.req.path)) {
ctx.req.path = ctx.req.path.replace(regex, `/users/${user.id}$2`)
}
await next()
})

Wyświetl plik

@ -1,6 +1,30 @@
import { and, eq } from 'drizzle-orm'
import { createMiddleware } from 'hono/factory'
export const authenticate = createMiddleware(async (c, next) => {
console.log(`[${c.req.method}] ${c.req.url}`)
import type { AuthenticatedEnv } from '@/lib/types'
import { db, schema } from '@/db'
import { aclTeamMember } from '../acl-team-member'
import { assert } from '../utils'
export const team = createMiddleware<AuthenticatedEnv>(async (ctx, next) => {
const teamId = ctx.req.query('teamId')
const user = ctx.get('user')
if (teamId && user) {
const teamMember = await db.query.teamMembers.findFirst({
where: and(
eq(schema.teamMembers.teamId, teamId),
eq(schema.teamMembers.userId, user.id)
),
with: { team: true }
})
assert(teamMember, 401, 'Unauthorized')
await aclTeamMember(ctx, teamMember)
ctx.set('teamMember', teamMember)
}
await next()
})

Wyświetl plik

@ -1,8 +1,24 @@
// import type { Context } from 'hono'
import type { Context } from 'hono'
import type { TeamMemberWithTeam, User } from '@/db'
export type AuthenticatedContext = {
export type AuthenticatedEnvVariables = {
user: User
teamMember?: TeamMemberWithTeam
jwtPayload:
| {
type: 'user'
userId: string
username: string
}
| {
type: 'project'
projectId: string
}
}
export type AuthenticatedEnv = {
Variables: AuthenticatedEnvVariables
}
export type AuthenticatedContext = Context<AuthenticatedEnv>

Wyświetl plik

@ -1,5 +1,29 @@
import { createHash, randomUUID } from 'node:crypto'
import { HttpError } from './errors'
export function sha256(input: string = randomUUID()) {
return createHash('sha256').update(input).digest('hex')
}
export function assert(expr: unknown, message?: string): asserts expr
export function assert(
expr: unknown,
statusCode?: number,
message?: string
): asserts expr
export function assert(
expr: unknown,
statusCodeOrMessage?: number | string,
message = 'Internal assertion failed'
): asserts expr {
if (expr) {
return
}
if (typeof statusCodeOrMessage === 'number') {
throw new HttpError({ statusCode: statusCodeOrMessage, message })
} else {
throw new Error(statusCodeOrMessage ?? message)
}
}

Wyświetl plik

@ -2,10 +2,15 @@ import { Hono } from 'hono'
import * as middleware from '@/lib/middleware'
import type { AuthenticatedEnv } from './lib/types'
export const app = new Hono()
const pri = new Hono()
// const pub = new Hono()
const pub = new Hono()
const pri = new Hono<AuthenticatedEnv>()
app.route('/', pri)
app.route('/', pub)
app.use('*', middleware.authenticate)
app.use('*', middleware.team)
app.use('*', middleware.me)
app.route('/', pri)

Wyświetl plik

@ -7,8 +7,8 @@ settings:
catalogs:
default:
'@fisch0920/config':
specifier: ^1.0.3
version: 1.0.3
specifier: ^1.0.4
version: 1.0.4
'@types/node':
specifier: ^22.14.1
version: 22.14.1
@ -19,8 +19,8 @@ catalogs:
specifier: ^16.5.0
version: 16.5.0
eslint:
specifier: ^9.25.0
version: 9.25.0
specifier: ^9.25.1
version: 9.25.1
lint-staged:
specifier: ^15.5.1
version: 15.5.1
@ -52,8 +52,8 @@ catalogs:
specifier: ^5.8.3
version: 5.8.3
vitest:
specifier: ^3.1.1
version: 3.1.1
specifier: ^3.1.2
version: 3.1.2
zod:
specifier: ^3.24.3
version: 3.24.3
@ -64,7 +64,7 @@ importers:
devDependencies:
'@fisch0920/config':
specifier: 'catalog:'
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))
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))
'@types/node':
specifier: 'catalog:'
version: 22.14.1
@ -76,10 +76,10 @@ importers:
version: 16.5.0
eslint:
specifier: 'catalog:'
version: 9.25.0
version: 9.25.1
eslint-plugin-drizzle:
specifier: ^0.2.3
version: 0.2.3(eslint@9.25.0)
version: 0.2.3(eslint@9.25.1)
lint-staged:
specifier: 'catalog:'
version: 15.5.1
@ -109,7 +109,7 @@ importers:
version: 5.8.3
vitest:
specifier: 'catalog:'
version: 3.1.1(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1)
version: 3.1.2(@types/node@22.14.1)(tsx@4.19.3)(yaml@2.7.1)
zod:
specifier: 'catalog:'
version: 3.24.3
@ -487,12 +487,8 @@ packages:
resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/js@9.23.0':
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==}
'@eslint/js@9.25.1':
resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.6':
@ -503,8 +499,8 @@ packages:
resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@fisch0920/config@1.0.3':
resolution: {integrity: sha512-CtXpprNuh8x/U3pDy7eRLKPhsXAw4Zp3Fk6Ej6AcYdk5aiMtf6cgbd+QD2lcC48sL9dr8y57rBdSX0GSeBpRsQ==}
'@fisch0920/config@1.0.4':
resolution: {integrity: sha512-JJwvWs3O2LCs6+LwZqvpjP1qww+o3s72fWcTwnXwb2WpM5T6YA+Glt48N8tJsFOq9Cby/WVRWOV48lqvHRoSzA==}
engines: {node: '>=18'}
peerDependencies:
eslint: '>= 9'
@ -781,16 +777,16 @@ packages:
'@types/serve-static@1.15.7':
resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
'@typescript-eslint/eslint-plugin@8.29.0':
resolution: {integrity: sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==}
'@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}
peerDependencies:
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/parser@8.29.0':
resolution: {integrity: sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==}
'@typescript-eslint/parser@8.31.0':
resolution: {integrity: sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -800,8 +796,12 @@ packages:
resolution: {integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/type-utils@8.29.0':
resolution: {integrity: sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==}
'@typescript-eslint/scope-manager@8.31.0':
resolution: {integrity: sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/type-utils@8.31.0':
resolution: {integrity: sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -811,12 +811,22 @@ packages:
resolution: {integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/types@8.31.0':
resolution: {integrity: sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.29.0':
resolution: {integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/typescript-estree@8.31.0':
resolution: {integrity: sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/utils@8.29.0':
resolution: {integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -824,14 +834,25 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/utils@8.31.0':
resolution: {integrity: sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/visitor-keys@8.29.0':
resolution: {integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@vitest/eslint-plugin@1.1.39':
resolution: {integrity: sha512-l5/MUFCYI8nxwr62JHlWwXfeQNS8E7xy71lSLGQ3CrjGjBdWLs1Rtee+BvYwy2m4YVPwYqUwdcAIOaZOwPUpfg==}
'@typescript-eslint/visitor-keys@8.31.0':
resolution: {integrity: sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@vitest/eslint-plugin@1.1.43':
resolution: {integrity: sha512-OLoUMO67Yg+kr7E6SjF5+Qvl2f6uNJ7ImQYnXT8WgnPiZE41ZQBsnzn70jehXrhFVadphHs2smk+yl0TFKLV5Q==}
peerDependencies:
'@typescript-eslint/utils': ^8.24.0
'@typescript-eslint/utils': '>= 8.24.0'
eslint: '>= 8.57.0'
typescript: '>= 5.0.0'
vitest: '*'
@ -841,11 +862,11 @@ packages:
vitest:
optional: true
'@vitest/expect@3.1.1':
resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==}
'@vitest/expect@3.1.2':
resolution: {integrity: sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==}
'@vitest/mocker@3.1.1':
resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==}
'@vitest/mocker@3.1.2':
resolution: {integrity: sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==}
peerDependencies:
msw: ^2.4.9
vite: ^5.0.0 || ^6.0.0
@ -855,20 +876,20 @@ packages:
vite:
optional: true
'@vitest/pretty-format@3.1.1':
resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==}
'@vitest/pretty-format@3.1.2':
resolution: {integrity: sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==}
'@vitest/runner@3.1.1':
resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==}
'@vitest/runner@3.1.2':
resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==}
'@vitest/snapshot@3.1.1':
resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==}
'@vitest/snapshot@3.1.2':
resolution: {integrity: sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==}
'@vitest/spy@3.1.1':
resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==}
'@vitest/spy@3.1.2':
resolution: {integrity: sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==}
'@vitest/utils@3.1.1':
resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==}
'@vitest/utils@3.1.2':
resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==}
'@workos-inc/node@7.47.0':
resolution: {integrity: sha512-A7K6uIIGmD5qbrLxoXah2BcOzbxyxnrhps+crZ/CFImrkq4CdVAm6BV/wvRaTeAinRF+Ea9cIFFeEAvJ++RaSw==}
@ -1362,8 +1383,8 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
eslint-config-prettier@10.1.1:
resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==}
eslint-config-prettier@10.1.2:
resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
@ -1423,12 +1444,6 @@ packages:
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
eslint-plugin-perfectionist@4.11.0:
resolution: {integrity: sha512-5s+ehXydnLPQpLDj5mJ0CnYj2fQe6v6gKA3tS+FZVBLzwMOh8skH+l+1Gni08rG0SdEcNhJyjQp/mEkDYK8czw==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
eslint: '>=8.45.0'
eslint-plugin-react-hooks@5.2.0:
resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
engines: {node: '>=10'}
@ -1474,8 +1489,8 @@ packages:
resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.25.0:
resolution: {integrity: sha512-MsBdObhM4cEwkzCiraDv7A6txFXEqtNXOb877TsSp2FCkBNl8JfVQrmiuDqC1IkejT6JLPzYBXx/xAiYhyzgGA==}
eslint@9.25.1:
resolution: {integrity: sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@ -1542,6 +1557,14 @@ packages:
picomatch:
optional: true
fdir@6.4.4:
resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==}
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
picomatch:
optional: true
file-entry-cache@8.0.0:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
@ -2078,10 +2101,6 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
natural-orderby@5.0.0:
resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==}
engines: {node: '>=18'}
node-releases@2.0.19:
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
@ -2584,6 +2603,10 @@ packages:
resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
engines: {node: '>=12.0.0'}
tinyglobby@0.2.13:
resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==}
engines: {node: '>=12.0.0'}
tinypool@1.0.2:
resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==}
engines: {node: ^18.0.0 || >=20.0.0}
@ -2704,8 +2727,8 @@ packages:
resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
engines: {node: '>= 0.4'}
typescript-eslint@8.29.0:
resolution: {integrity: sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==}
typescript-eslint@8.31.0:
resolution: {integrity: sha512-u+93F0sB0An8WEAPtwxVhFby573E8ckdjwUUQUj9QA4v8JAvgtoDdIyYR3XFwFHq2W1KJ1AurwJCO+w+Y1ixyQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@ -2743,8 +2766,8 @@ packages:
validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
vite-node@3.1.1:
resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==}
vite-node@3.1.2:
resolution: {integrity: sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
@ -2788,16 +2811,16 @@ packages:
yaml:
optional: true
vitest@3.1.1:
resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==}
vitest@3.1.2:
resolution: {integrity: sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@types/debug': ^4.1.12
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
'@vitest/browser': 3.1.1
'@vitest/ui': 3.1.1
'@vitest/browser': 3.1.2
'@vitest/ui': 3.1.2
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
@ -3055,9 +3078,9 @@ snapshots:
'@esbuild/win32-x64@0.25.2':
optional: true
'@eslint-community/eslint-utils@4.5.1(eslint@9.25.0)':
'@eslint-community/eslint-utils@4.5.1(eslint@9.25.1)':
dependencies:
eslint: 9.25.0
eslint: 9.25.1
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.1': {}
@ -3090,9 +3113,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@eslint/js@9.23.0': {}
'@eslint/js@9.25.0': {}
'@eslint/js@9.25.1': {}
'@eslint/object-schema@2.1.6': {}
@ -3101,27 +3122,26 @@ snapshots:
'@eslint/core': 0.13.0
levn: 0.4.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))':
'@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))':
dependencies:
'@eslint/js': 9.23.0
'@eslint/js': 9.25.1
'@total-typescript/ts-reset': 0.6.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))
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)
'@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))
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)
eslint-plugin-jest-dom: 5.5.0(eslint@9.25.1)
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.25.1)
eslint-plugin-react: 7.37.5(eslint@9.25.1)
eslint-plugin-react-hooks: 5.2.0(eslint@9.25.1)
eslint-plugin-security: 3.0.1
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)
eslint-plugin-simple-import-sort: 12.1.1(eslint@9.25.1)
eslint-plugin-testing-library: 7.1.1(eslint@9.25.1)(typescript@5.8.3)
eslint-plugin-unicorn: 58.0.0(eslint@9.25.1)
globals: 16.0.0
prettier: 3.5.3
typescript: 5.8.3
typescript-eslint: 8.29.0(eslint@9.25.0)(typescript@5.8.3)
typescript-eslint: 8.31.0(eslint@9.25.1)(typescript@5.8.3)
transitivePeerDependencies:
- '@testing-library/dom'
- '@typescript-eslint/parser'
@ -3377,15 +3397,15 @@ snapshots:
'@types/node': 22.14.1
'@types/send': 0.17.4
'@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/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
'@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.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.25.0
'@typescript-eslint/parser': 8.31.0(eslint@9.25.1)(typescript@5.8.3)
'@typescript-eslint/scope-manager': 8.31.0
'@typescript-eslint/type-utils': 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)
'@typescript-eslint/visitor-keys': 8.31.0
eslint: 9.25.1
graphemer: 1.4.0
ignore: 5.3.2
natural-compare: 1.4.0
@ -3394,14 +3414,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.29.0(eslint@9.25.0)(typescript@5.8.3)':
'@typescript-eslint/parser@8.31.0(eslint@9.25.1)(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.3)
'@typescript-eslint/visitor-keys': 8.29.0
'@typescript-eslint/scope-manager': 8.31.0
'@typescript-eslint/types': 8.31.0
'@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3)
'@typescript-eslint/visitor-keys': 8.31.0
debug: 4.4.0
eslint: 9.25.0
eslint: 9.25.1
typescript: 5.8.3
transitivePeerDependencies:
- supports-color
@ -3411,12 +3431,17 @@ snapshots:
'@typescript-eslint/types': 8.29.0
'@typescript-eslint/visitor-keys': 8.29.0
'@typescript-eslint/type-utils@8.29.0(eslint@9.25.0)(typescript@5.8.3)':
'@typescript-eslint/scope-manager@8.31.0':
dependencies:
'@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)
'@typescript-eslint/types': 8.31.0
'@typescript-eslint/visitor-keys': 8.31.0
'@typescript-eslint/type-utils@8.31.0(eslint@9.25.1)(typescript@5.8.3)':
dependencies:
'@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3)
'@typescript-eslint/utils': 8.31.0(eslint@9.25.1)(typescript@5.8.3)
debug: 4.4.0
eslint: 9.25.0
eslint: 9.25.1
ts-api-utils: 2.1.0(typescript@5.8.3)
typescript: 5.8.3
transitivePeerDependencies:
@ -3424,6 +3449,8 @@ snapshots:
'@typescript-eslint/types@8.29.0': {}
'@typescript-eslint/types@8.31.0': {}
'@typescript-eslint/typescript-estree@8.29.0(typescript@5.8.3)':
dependencies:
'@typescript-eslint/types': 8.29.0
@ -3438,13 +3465,38 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.29.0(eslint@9.25.0)(typescript@5.8.3)':
'@typescript-eslint/typescript-estree@8.31.0(typescript@5.8.3)':
dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.25.0)
'@typescript-eslint/types': 8.31.0
'@typescript-eslint/visitor-keys': 8.31.0
debug: 4.4.0
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.7.1
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.25.1)(typescript@5.8.3)':
dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.25.1)
'@typescript-eslint/scope-manager': 8.29.0
'@typescript-eslint/types': 8.29.0
'@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.3)
eslint: 9.25.0
eslint: 9.25.1
typescript: 5.8.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3)':
dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.25.1)
'@typescript-eslint/scope-manager': 8.31.0
'@typescript-eslint/types': 8.31.0
'@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3)
eslint: 9.25.1
typescript: 5.8.3
transitivePeerDependencies:
- supports-color
@ -3454,51 +3506,56 @@ 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.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))':
'@typescript-eslint/visitor-keys@8.31.0':
dependencies:
'@typescript-eslint/utils': 8.29.0(eslint@9.25.0)(typescript@5.8.3)
eslint: 9.25.0
'@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))':
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.1(@types/node@22.14.1)(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/expect@3.1.1':
'@vitest/expect@3.1.2':
dependencies:
'@vitest/spy': 3.1.1
'@vitest/utils': 3.1.1
'@vitest/spy': 3.1.2
'@vitest/utils': 3.1.2
chai: 5.2.0
tinyrainbow: 2.0.0
'@vitest/mocker@3.1.1(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.14.1)(tsx@4.19.3)(yaml@2.7.1))':
dependencies:
'@vitest/spy': 3.1.1
'@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)
'@vitest/pretty-format@3.1.1':
'@vitest/pretty-format@3.1.2':
dependencies:
tinyrainbow: 2.0.0
'@vitest/runner@3.1.1':
'@vitest/runner@3.1.2':
dependencies:
'@vitest/utils': 3.1.1
'@vitest/utils': 3.1.2
pathe: 2.0.3
'@vitest/snapshot@3.1.1':
'@vitest/snapshot@3.1.2':
dependencies:
'@vitest/pretty-format': 3.1.1
'@vitest/pretty-format': 3.1.2
magic-string: 0.30.17
pathe: 2.0.3
'@vitest/spy@3.1.1':
'@vitest/spy@3.1.2':
dependencies:
tinyspy: 3.0.2
'@vitest/utils@3.1.1':
'@vitest/utils@3.1.2':
dependencies:
'@vitest/pretty-format': 3.1.1
'@vitest/pretty-format': 3.1.2
loupe: 3.1.3
tinyrainbow: 2.0.0
@ -4028,9 +4085,9 @@ snapshots:
escape-string-regexp@4.0.0: {}
eslint-config-prettier@10.1.1(eslint@9.25.0):
eslint-config-prettier@10.1.2(eslint@9.25.1):
dependencies:
eslint: 9.25.0
eslint: 9.25.1
eslint-import-resolver-node@0.3.9:
dependencies:
@ -4040,21 +4097,21 @@ snapshots:
transitivePeerDependencies:
- supports-color
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):
eslint-module-utils@2.12.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.25.1):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.29.0(eslint@9.25.0)(typescript@5.8.3)
eslint: 9.25.0
'@typescript-eslint/parser': 8.31.0(eslint@9.25.1)(typescript@5.8.3)
eslint: 9.25.1
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
eslint-plugin-drizzle@0.2.3(eslint@9.25.0):
eslint-plugin-drizzle@0.2.3(eslint@9.25.1):
dependencies:
eslint: 9.25.0
eslint: 9.25.1
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-import@2.31.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
@ -4063,9 +4120,9 @@ snapshots:
array.prototype.flatmap: 1.3.3
debug: 3.2.7
doctrine: 2.1.0
eslint: 9.25.0
eslint: 9.25.1
eslint-import-resolver-node: 0.3.9
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)
eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.25.1)
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@ -4077,19 +4134,19 @@ snapshots:
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
'@typescript-eslint/parser': 8.29.0(eslint@9.25.0)(typescript@5.8.3)
'@typescript-eslint/parser': 8.31.0(eslint@9.25.1)(typescript@5.8.3)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
eslint-plugin-jest-dom@5.5.0(eslint@9.25.0):
eslint-plugin-jest-dom@5.5.0(eslint@9.25.1):
dependencies:
'@babel/runtime': 7.27.0
eslint: 9.25.0
eslint: 9.25.1
requireindex: 1.2.0
eslint-plugin-jsx-a11y@6.10.2(eslint@9.25.0):
eslint-plugin-jsx-a11y@6.10.2(eslint@9.25.1):
dependencies:
aria-query: 5.3.2
array-includes: 3.1.8
@ -4099,7 +4156,7 @@ snapshots:
axobject-query: 4.1.0
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
eslint: 9.25.0
eslint: 9.25.1
hasown: 2.0.2
jsx-ast-utils: 3.3.5
language-tags: 1.0.9
@ -4108,21 +4165,11 @@ snapshots:
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
eslint-plugin-perfectionist@4.11.0(eslint@9.25.0)(typescript@5.8.3):
eslint-plugin-react-hooks@5.2.0(eslint@9.25.1):
dependencies:
'@typescript-eslint/types': 8.29.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: 9.25.1
eslint-plugin-react-hooks@5.2.0(eslint@9.25.0):
dependencies:
eslint: 9.25.0
eslint-plugin-react@7.37.5(eslint@9.25.0):
eslint-plugin-react@7.37.5(eslint@9.25.1):
dependencies:
array-includes: 3.1.8
array.prototype.findlast: 1.2.5
@ -4130,7 +4177,7 @@ snapshots:
array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
es-iterator-helpers: 1.2.1
eslint: 9.25.0
eslint: 9.25.1
estraverse: 5.3.0
hasown: 2.0.2
jsx-ast-utils: 3.3.5
@ -4148,28 +4195,28 @@ snapshots:
dependencies:
safe-regex: 2.1.1
eslint-plugin-simple-import-sort@12.1.1(eslint@9.25.0):
eslint-plugin-simple-import-sort@12.1.1(eslint@9.25.1):
dependencies:
eslint: 9.25.0
eslint: 9.25.1
eslint-plugin-testing-library@7.1.1(eslint@9.25.0)(typescript@5.8.3):
eslint-plugin-testing-library@7.1.1(eslint@9.25.1)(typescript@5.8.3):
dependencies:
'@typescript-eslint/scope-manager': 8.29.0
'@typescript-eslint/utils': 8.29.0(eslint@9.25.0)(typescript@5.8.3)
eslint: 9.25.0
'@typescript-eslint/utils': 8.29.0(eslint@9.25.1)(typescript@5.8.3)
eslint: 9.25.1
transitivePeerDependencies:
- supports-color
- typescript
eslint-plugin-unicorn@58.0.0(eslint@9.25.0):
eslint-plugin-unicorn@58.0.0(eslint@9.25.1):
dependencies:
'@babel/helper-validator-identifier': 7.25.9
'@eslint-community/eslint-utils': 4.5.1(eslint@9.25.0)
'@eslint-community/eslint-utils': 4.5.1(eslint@9.25.1)
'@eslint/plugin-kit': 0.2.8
ci-info: 4.2.0
clean-regexp: 1.0.0
core-js-compat: 3.41.0
eslint: 9.25.0
eslint: 9.25.1
esquery: 1.6.0
globals: 16.0.0
indent-string: 5.0.0
@ -4191,15 +4238,15 @@ snapshots:
eslint-visitor-keys@4.2.0: {}
eslint@9.25.0:
eslint@9.25.1:
dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.25.0)
'@eslint-community/eslint-utils': 4.5.1(eslint@9.25.1)
'@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.20.0
'@eslint/config-helpers': 0.2.1
'@eslint/core': 0.13.0
'@eslint/eslintrc': 3.3.1
'@eslint/js': 9.25.0
'@eslint/js': 9.25.1
'@eslint/plugin-kit': 0.2.8
'@humanfs/node': 0.16.6
'@humanwhocodes/module-importer': 1.0.1
@ -4291,6 +4338,10 @@ snapshots:
optionalDependencies:
picomatch: 4.0.2
fdir@6.4.4(picomatch@4.0.2):
optionalDependencies:
picomatch: 4.0.2
file-entry-cache@8.0.0:
dependencies:
flat-cache: 4.0.1
@ -4811,8 +4862,6 @@ snapshots:
natural-compare@1.4.0: {}
natural-orderby@5.0.0: {}
node-releases@2.0.19: {}
normalize-package-data@6.0.2:
@ -5365,6 +5414,11 @@ snapshots:
fdir: 6.4.3(picomatch@4.0.2)
picomatch: 4.0.2
tinyglobby@0.2.13:
dependencies:
fdir: 6.4.4(picomatch@4.0.2)
picomatch: 4.0.2
tinypool@1.0.2: {}
tinyrainbow@2.0.0: {}
@ -5496,12 +5550,12 @@ snapshots:
possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10
typescript-eslint@8.29.0(eslint@9.25.0)(typescript@5.8.3):
typescript-eslint@8.31.0(eslint@9.25.1)(typescript@5.8.3):
dependencies:
'@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-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)
'@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
typescript: 5.8.3
transitivePeerDependencies:
- supports-color
@ -5536,7 +5590,7 @@ snapshots:
spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1
vite-node@3.1.1(@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):
dependencies:
cac: 6.7.14
debug: 4.4.0
@ -5568,15 +5622,15 @@ snapshots:
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):
vitest@3.1.2(@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.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
'@vitest/spy': 3.1.1
'@vitest/utils': 3.1.1
'@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/pretty-format': 3.1.2
'@vitest/runner': 3.1.2
'@vitest/snapshot': 3.1.2
'@vitest/spy': 3.1.2
'@vitest/utils': 3.1.2
chai: 5.2.0
debug: 4.4.0
expect-type: 1.2.1
@ -5585,10 +5639,11 @@ snapshots:
std-env: 3.9.0
tinybench: 2.9.0
tinyexec: 0.3.2
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.1(@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)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.14.1

Wyświetl plik

@ -3,14 +3,14 @@ packages:
- apps/*
catalog:
'@ai-sdk/openai': ^1.3.6
'@fisch0920/config': ^1.0.3
'@fisch0920/config': ^1.0.4
'@modelcontextprotocol/sdk': ^1.8.0
'@types/node': ^22.14.1
ai: ^4.2.11
cleye: ^1.3.4
del-cli: ^6.0.0
dotenv: ^16.5.0
eslint: ^9.25.0
eslint: ^9.25.1
exit-hook: ^4.0.0
ky: ^1.8.0
lint-staged: ^15.5.1
@ -26,5 +26,5 @@ catalog:
turbo: ^2.5.0
type-fest: ^4.40.0
typescript: ^5.8.3
vitest: ^3.1.1
vitest: ^3.1.2
zod: ^3.24.3