From 2477b0488d42503e493b00df4d655032f179d6dd Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 23 Apr 2025 06:57:59 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/api/package.json | 3 + apps/api/src/db/index.ts | 2 + apps/api/src/db/schema/deployment.ts | 2 - apps/api/src/db/schema/index.ts | 2 +- apps/api/src/db/schema/project.ts | 2 - .../{team-members.ts => team-member.ts} | 2 - apps/api/src/db/schema/team.ts | 4 +- apps/api/src/db/schema/user.ts | 2 - apps/api/src/db/schema/utils.ts | 7 +- apps/api/src/db/types.ts | 35 ++ apps/api/src/lib/middleware/authenticate.ts | 6 + apps/api/src/lib/middleware/index.ts | 1 + apps/api/src/lib/middleware/team.ts | 6 + apps/api/src/lib/types.ts | 9 +- apps/api/src/server.ts | 11 + package.json | 2 +- pnpm-lock.yaml | 310 ++++++++++++++++++ 17 files changed, 389 insertions(+), 17 deletions(-) rename apps/api/src/db/schema/{team-members.ts => team-member.ts} (95%) create mode 100644 apps/api/src/db/types.ts create mode 100644 apps/api/src/lib/middleware/authenticate.ts create mode 100644 apps/api/src/lib/middleware/index.ts create mode 100644 apps/api/src/lib/middleware/team.ts create mode 100644 apps/api/src/server.ts diff --git a/apps/api/package.json b/apps/api/package.json index f26d97f4..4c569142 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -34,9 +34,12 @@ "test:unit": "vitest run" }, "dependencies": { + "@hono/zod-validator": "^0.4.3", "@paralleldrive/cuid2": "^2.2.2", + "@workos-inc/node": "^7.47.0", "drizzle-orm": "^0.42.0", "drizzle-zod": "^0.7.1", + "hono": "^4.7.7", "jsonwebtoken": "^9.0.2", "postgres": "^3.4.5", "type-fest": "catalog:", diff --git a/apps/api/src/db/index.ts b/apps/api/src/db/index.ts index 1f793812..f5f7b0b2 100644 --- a/apps/api/src/db/index.ts +++ b/apps/api/src/db/index.ts @@ -10,3 +10,5 @@ const postgresClient = _postgresClient ?? (_postgresClient = postgres(env.DATABASE_URL)) export const db = drizzle({ client: postgresClient, schema }) + +export type * from './types' diff --git a/apps/api/src/db/schema/deployment.ts b/apps/api/src/db/schema/deployment.ts index 08d5294f..31d0fae3 100644 --- a/apps/api/src/db/schema/deployment.ts +++ b/apps/api/src/db/schema/deployment.ts @@ -90,8 +90,6 @@ export const deploymentsRelations = relations(deployments, ({ one }) => ({ // 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 diff --git a/apps/api/src/db/schema/index.ts b/apps/api/src/db/schema/index.ts index 1ba057a1..e312decd 100644 --- a/apps/api/src/db/schema/index.ts +++ b/apps/api/src/db/schema/index.ts @@ -1,7 +1,7 @@ export * from './deployment' export * from './project' export * from './team' -export * from './team-members' +export * from './team-member' 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 index 941e3bc3..fe193e7e 100644 --- a/apps/api/src/db/schema/project.ts +++ b/apps/api/src/db/schema/project.ts @@ -123,8 +123,6 @@ export const projectsRelations = relations(projects, ({ one, many }) => ({ }) })) -export type Project = typeof projects.$inferSelect - export const projectInsertSchema = createInsertSchema(projects, { // TODO: validate project id // id: (schema) => diff --git a/apps/api/src/db/schema/team-members.ts b/apps/api/src/db/schema/team-member.ts similarity index 95% rename from apps/api/src/db/schema/team-members.ts rename to apps/api/src/db/schema/team-member.ts index 6e04212a..29d75ca3 100644 --- a/apps/api/src/db/schema/team-members.ts +++ b/apps/api/src/db/schema/team-member.ts @@ -37,5 +37,3 @@ export const teamMembersRelations = relations(teamMembers, ({ one }) => ({ 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 index 850f274e..677f2d71 100644 --- a/apps/api/src/db/schema/team.ts +++ b/apps/api/src/db/schema/team.ts @@ -1,7 +1,7 @@ import { relations } from 'drizzle-orm' import { index, pgTable, text, uniqueIndex } from 'drizzle-orm/pg-core' -import { teamMembers } from './team-members' +import { teamMembers } from './team-member' import { users } from './user' import { createInsertSchema, @@ -38,8 +38,6 @@ export const teamsRelations = relations(teams, ({ one, many }) => ({ members: many(teamMembers) })) -export type Team = typeof teams.$inferSelect - export const teamInsertSchema = createInsertSchema(teams, { slug: (schema) => schema.min(3).max(20) // TODO }) diff --git a/apps/api/src/db/schema/user.ts b/apps/api/src/db/schema/user.ts index 8ee0dda7..22d09872 100644 --- a/apps/api/src/db/schema/user.ts +++ b/apps/api/src/db/schema/user.ts @@ -68,8 +68,6 @@ export const usersRelations = relations(users, ({ many }) => ({ // TODO: team memberships })) -export type User = typeof users.$inferSelect - export const userInsertSchema = createInsertSchema(users, { // TODO: username validation // username: (schema) => schema.min(3).max(20) diff --git a/apps/api/src/db/schema/utils.ts b/apps/api/src/db/schema/utils.ts index 6388b19a..e8d729f6 100644 --- a/apps/api/src/db/schema/utils.ts +++ b/apps/api/src/db/schema/utils.ts @@ -4,14 +4,11 @@ import { pgEnum, type PgVarcharBuilderInitial, type PgVarcharConfig, - text, timestamp, varchar } from 'drizzle-orm/pg-core' import { createSchemaFactory } from 'drizzle-zod' -export const id = text('id').primaryKey().$defaultFn(createId) - export function cuid>( config?: PgVarcharConfig, never> ): PgVarcharBuilderInitial<'', Writable, 24> { @@ -24,6 +21,10 @@ export function stripeId>( return varchar({ length: 255, ...config }) } +export const id = varchar('id', { length: 24 }) + .primaryKey() + .$defaultFn(createId) + export const timestamps = { createdAt: timestamp('createdAt').notNull().defaultNow(), updatedAt: timestamp('updatedAt') diff --git a/apps/api/src/db/types.ts b/apps/api/src/db/types.ts new file mode 100644 index 00000000..634c5b62 --- /dev/null +++ b/apps/api/src/db/types.ts @@ -0,0 +1,35 @@ +import type { BuildQueryResult, ExtractTablesWithRelations } from 'drizzle-orm' + +import type * as schema from './schema' + +export type Tables = ExtractTablesWithRelations + +export type User = typeof schema.users.$inferInsert + +export type Team = typeof schema.teams.$inferInsert +export type TeamWithMembers = BuildQueryResult< + Tables, + Tables['teams'], + { with: { members: true } } +> + +export type TeamMember = typeof schema.teamMembers.$inferInsert +export type TeamMemberWithTeam = BuildQueryResult< + Tables, + Tables['teamMembers'], + { with: { team: true } } +> + +export type Project = typeof schema.projects.$inferInsert +export type ProjectWithLastPublishedDeployment = BuildQueryResult< + Tables, + Tables['projects'], + { with: { lastPublishedDeployment: true } } +> + +export type Deployment = typeof schema.deployments.$inferInsert +export type DeploymentWithProject = BuildQueryResult< + Tables, + Tables['deployments'], + { with: { project: true } } +> diff --git a/apps/api/src/lib/middleware/authenticate.ts b/apps/api/src/lib/middleware/authenticate.ts new file mode 100644 index 00000000..f6a284f7 --- /dev/null +++ b/apps/api/src/lib/middleware/authenticate.ts @@ -0,0 +1,6 @@ +import { createMiddleware } from 'hono/factory' + +export const authenticate = createMiddleware(async (c, next) => { + console.log(`[${c.req.method}] ${c.req.url}`) + await next() +}) diff --git a/apps/api/src/lib/middleware/index.ts b/apps/api/src/lib/middleware/index.ts new file mode 100644 index 00000000..c55ea50b --- /dev/null +++ b/apps/api/src/lib/middleware/index.ts @@ -0,0 +1 @@ +export * from './authenticate' diff --git a/apps/api/src/lib/middleware/team.ts b/apps/api/src/lib/middleware/team.ts new file mode 100644 index 00000000..f6a284f7 --- /dev/null +++ b/apps/api/src/lib/middleware/team.ts @@ -0,0 +1,6 @@ +import { createMiddleware } from 'hono/factory' + +export const authenticate = createMiddleware(async (c, next) => { + console.log(`[${c.req.method}] ${c.req.url}`) + await next() +}) diff --git a/apps/api/src/lib/types.ts b/apps/api/src/lib/types.ts index fad44344..e02efd39 100644 --- a/apps/api/src/lib/types.ts +++ b/apps/api/src/lib/types.ts @@ -1 +1,8 @@ -export type Operation = 'create' | 'read' | 'update' | 'delete' | 'debug' +// import type { Context } from 'hono' + +import type { TeamMemberWithTeam, User } from '@/db' + +export type AuthenticatedContext = { + user: User + teamMember?: TeamMemberWithTeam +} diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts new file mode 100644 index 00000000..9a9db2f2 --- /dev/null +++ b/apps/api/src/server.ts @@ -0,0 +1,11 @@ +import { Hono } from 'hono' + +import * as middleware from '@/lib/middleware' + +export const app = new Hono() + +const pri = new Hono() +// const pub = new Hono() + +app.route('/', pri) +app.use('*', middleware.authenticate) diff --git a/package.json b/package.json index 7eabc5e5..72e669fb 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "type": "git", "url": "git+https://github.com/transitive-bullshit/agentic-platform.git" }, - "packageManager": "pnpm@10.7.0", + "packageManager": "pnpm@10.9.0", "engines": { "node": ">=18" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67762a8b..1d759e52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,15 +116,24 @@ importers: apps/api: dependencies: + '@hono/zod-validator': + specifier: ^0.4.3 + version: 0.4.3(hono@4.7.7)(zod@3.24.3) '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 + '@workos-inc/node': + specifier: ^7.47.0 + version: 7.47.0 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) + hono: + specifier: ^4.7.7 + version: 4.7.7 jsonwebtoken: specifier: ^9.0.2 version: 9.0.2 @@ -502,6 +511,12 @@ packages: prettier: '>= 3' typescript: '>= 5' + '@hono/zod-validator@0.4.3': + resolution: {integrity: sha512-xIgMYXDyJ4Hj6ekm9T9Y27s080Nl9NXHcJkOvkXPhubOLj8hZkOL8pDnnXfvCf5xEE8Q4oMFenQUZZREUY2gqQ==} + peerDependencies: + hono: '>=3.9.0' + zod: ^3.19.1 + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -563,6 +578,17 @@ packages: '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} + '@peculiar/asn1-schema@2.3.15': + resolution: {integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==} + + '@peculiar/json-schema@1.1.12': + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} + engines: {node: '>=8.0.0'} + + '@peculiar/webcrypto@1.5.0': + resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==} + engines: {node: '>=10.12.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -677,9 +703,39 @@ packages: '@total-typescript/ts-reset@0.6.1': resolution: {integrity: sha512-cka47fVSo6lfQDIATYqb/vO1nvFfbPw7uWLayIXIhGETj0wcOOlrlkobOMDNQOFr9QOafegUPq13V2+6vtD7yg==} + '@types/accepts@1.3.7': + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/content-disposition@0.5.8': + resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + + '@types/cookie@0.5.4': + resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==} + + '@types/cookies@0.9.0': + resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} + '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/http-assert@1.5.6': + resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -689,15 +745,42 @@ packages: '@types/jsonwebtoken@9.0.9': resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} + '@types/keygrip@1.0.6': + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + + '@types/koa-compose@3.2.8': + resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + + '@types/koa@2.15.0': + resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + '@types/node@22.14.1': resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/qs@6.9.18': + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@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==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -787,6 +870,10 @@ packages: '@vitest/utils@3.1.1': resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} + '@workos-inc/node@7.47.0': + resolution: {integrity: sha512-A7K6uIIGmD5qbrLxoXah2BcOzbxyxnrhps+crZ/CFImrkq4CdVAm6BV/wvRaTeAinRF+Ea9cIFFeEAvJ++RaSw==} + engines: {node: '>=16'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -862,6 +949,10 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + asn1js@3.0.6: + resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} + engines: {node: '>=12.0.0'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -888,6 +979,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -909,6 +1003,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-modules@5.0.0: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} @@ -1003,6 +1100,10 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + core-js-compat@3.41.0: resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} @@ -1572,6 +1673,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hono@4.7.7: + resolution: {integrity: sha512-2PCpQRbN87Crty8/L/7akZN3UyZIAopSoRxCwRbJgUuV1+MHNFHzYFxZTg4v/03cXUm+jce/qa2VSBZpKBm3Qw==} + engines: {node: '>=16.9.0'} + hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -1580,6 +1685,9 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1608,6 +1716,24 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + iron-session@6.3.1: + resolution: {integrity: sha512-3UJ7y2vk/WomAtEySmPgM6qtYF1cZ3tXuWX5GsVX4PJXAcs5y/sV9HuSfpjKS6HkTL/OhZcTDWJNLZ7w+Erx3A==} + engines: {node: '>=12'} + peerDependencies: + express: '>=4' + koa: '>=2' + next: '>=10' + peerDependenciesMeta: + express: + optional: true + koa: + optional: true + next: + optional: true + + iron-webcrypto@0.2.8: + resolution: {integrity: sha512-YPdCvjFMOBjXaYuDj5tiHst5CEk6Xw84Jo8Y2+jzhMceclAnb3+vNPP/CTtb5fO2ZEuXEaO4N+w62Vfko757KA==} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -1749,6 +1875,9 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jose@5.6.3: + resolution: {integrity: sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -1811,6 +1940,9 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} + leb@1.0.0: + resolution: {integrity: sha512-Y3c3QZfvKWHX60BVOQPhLCvVGmDYWyJEiINE3drOog6KCyN2AOwvuQQzlS3uJg1J85kzpILXIUwRXULWavir+w==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2145,6 +2277,13 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.3: + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2480,6 +2619,9 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.4.0: resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} engines: {node: '>=18'} @@ -2674,6 +2816,9 @@ packages: jsdom: optional: true + webcrypto-core@1.8.1: + resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -2986,6 +3131,11 @@ snapshots: - supports-color - vitest + '@hono/zod-validator@0.4.3(hono@4.7.7)(zod@3.24.3)': + dependencies: + hono: 4.7.7 + zod: 3.24.3 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -3043,6 +3193,24 @@ snapshots: dependencies: '@noble/hashes': 1.7.2 + '@peculiar/asn1-schema@2.3.15': + dependencies: + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/json-schema@1.1.12': + dependencies: + tslib: 2.8.1 + + '@peculiar/webcrypto@1.5.0': + dependencies: + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/json-schema': 1.1.12 + pvtsutils: 1.3.6 + tslib: 2.8.1 + webcrypto-core: 1.8.1 + '@pkgjs/parseargs@0.11.0': optional: true @@ -3112,8 +3280,50 @@ snapshots: '@total-typescript/ts-reset@0.6.1': {} + '@types/accepts@1.3.7': + dependencies: + '@types/node': 22.14.1 + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.14.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.14.1 + + '@types/content-disposition@0.5.8': {} + + '@types/cookie@0.5.4': {} + + '@types/cookies@0.9.0': + dependencies: + '@types/connect': 3.4.38 + '@types/express': 4.17.21 + '@types/keygrip': 1.0.6 + '@types/node': 22.14.1 + '@types/estree@1.0.7': {} + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.14.1 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.18 + '@types/serve-static': 1.15.7 + + '@types/http-assert@1.5.6': {} + + '@types/http-errors@2.0.4': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -3123,14 +3333,50 @@ snapshots: '@types/ms': 2.1.0 '@types/node': 22.14.1 + '@types/keygrip@1.0.6': {} + + '@types/koa-compose@3.2.8': + dependencies: + '@types/koa': 2.15.0 + + '@types/koa@2.15.0': + dependencies: + '@types/accepts': 1.3.7 + '@types/content-disposition': 0.5.8 + '@types/cookies': 0.9.0 + '@types/http-assert': 1.5.6 + '@types/http-errors': 2.0.4 + '@types/keygrip': 1.0.6 + '@types/koa-compose': 3.2.8 + '@types/node': 22.14.1 + + '@types/mime@1.3.5': {} + '@types/ms@2.1.0': {} + '@types/node@17.0.45': {} + '@types/node@22.14.1': dependencies: undici-types: 6.21.0 '@types/normalize-package-data@2.4.4': {} + '@types/qs@6.9.18': {} + + '@types/range-parser@1.2.7': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.14.1 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@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)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -3256,6 +3502,17 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 + '@workos-inc/node@7.47.0': + dependencies: + iron-session: 6.3.1 + jose: 5.6.3 + leb: 1.0.0 + pluralize: 8.0.0 + transitivePeerDependencies: + - express + - koa + - next + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -3354,6 +3611,12 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + asn1js@3.0.6: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.3 + tslib: 2.8.1 + assertion-error@2.0.1: {} ast-types-flow@0.0.8: {} @@ -3370,6 +3633,8 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -3394,6 +3659,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-modules@5.0.0: {} bundle-require@5.1.0(esbuild@0.25.2): @@ -3476,6 +3746,8 @@ snapshots: consola@3.4.2: {} + cookie@0.5.0: {} + core-js-compat@3.41.0: dependencies: browserslist: 4.24.4 @@ -4159,12 +4431,16 @@ snapshots: dependencies: function-bind: 1.1.2 + hono@4.7.7: {} + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 human-signals@5.0.0: {} + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@7.0.3: {} @@ -4186,6 +4462,20 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + iron-session@6.3.1: + dependencies: + '@peculiar/webcrypto': 1.5.0 + '@types/cookie': 0.5.4 + '@types/express': 4.17.21 + '@types/koa': 2.15.0 + '@types/node': 17.0.45 + cookie: 0.5.0 + iron-webcrypto: 0.2.8 + + iron-webcrypto@0.2.8: + dependencies: + buffer: 6.0.3 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -4330,6 +4620,8 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jose@5.6.3: {} + joycon@3.1.1: {} js-tokens@4.0.0: {} @@ -4395,6 +4687,8 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 + leb@1.0.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -4696,6 +4990,12 @@ snapshots: punycode@2.3.1: {} + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.3: {} + queue-microtask@1.2.3: {} react-is@16.13.1: {} @@ -5094,6 +5394,8 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tslib@2.8.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) @@ -5304,6 +5606,14 @@ snapshots: - tsx - yaml + webcrypto-core@1.8.1: + dependencies: + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/json-schema': 1.1.12 + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 + webidl-conversions@4.0.2: {} whatwg-url@7.1.0: