diff --git a/.github/workflows/ci-typebox-validator.yml b/.github/workflows/ci-typebox-validator.yml new file mode 100644 index 00000000..0a802c4a --- /dev/null +++ b/.github/workflows/ci-typebox-validator.yml @@ -0,0 +1,25 @@ +name: ci-typebox-validator +on: + push: + branches: [main] + paths: + - 'packages/typebox-validator/**' + pull_request: + branches: ['*'] + paths: + - 'packages/typebox-validator/**' + +jobs: + ci: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./packages/typebox-validator + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 18.x + - run: yarn install --frozen-lockfile + - run: yarn build + - run: yarn test diff --git a/package.json b/package.json index a597677c..67b3094d 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "build:firebase-auth": "yarn workspace @hono/firebase-auth build", "build:trpc-server": "yarn workspace @hono/trpc-server build", "build:authjs-server": "yarn workspace @hono/authjs-server build", + "build:typebox-validator": "yarn workspace @hono/typebox-validator build", "build": "run-p build:*" }, "license": "MIT", diff --git a/packages/firebase-auth/CHANGELOG.md b/packages/firebase-auth/CHANGELOG.md index 919d4f2d..f383771c 100644 --- a/packages/firebase-auth/CHANGELOG.md +++ b/packages/firebase-auth/CHANGELOG.md @@ -1,5 +1,11 @@ # @hono/firebase-auth +## 1.2.0 + +### Minor Changes + +- [#60](https://github.com/honojs/middleware/pull/60) [`a798c30`](https://github.com/honojs/middleware/commit/a798c307e11cd8d414ee23259fe0c5730dfb8841) Thanks [@yusukebe](https://github.com/yusukebe)! - feat: support Hono v3 + ## 1.1.0 ### Minor Changes diff --git a/packages/firebase-auth/package.json b/packages/firebase-auth/package.json index 675f0f4d..53cce878 100644 --- a/packages/firebase-auth/package.json +++ b/packages/firebase-auth/package.json @@ -1,6 +1,6 @@ { "name": "@hono/firebase-auth", - "version": "1.1.0", + "version": "1.2.0", "description": "A third-party firebase auth middleware for Hono", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -31,13 +31,13 @@ "firebase-auth-cloudflare-workers": "^1.0.0" }, "peerDependencies": { - "hono": "^2.7.2" + "hono": "3.*" }, "devDependencies": { "@cloudflare/workers-types": "^3.14.1", "@types/jest": "^28.1.4", "firebase-tools": "^11.4.0", - "hono": "^2.7.2", + "hono": "^3.0.3", "jest": "^28.1.2", "jest-environment-miniflare": "^2.6.0", "prettier": "^2.7.1", diff --git a/packages/firebase-auth/src/index.ts b/packages/firebase-auth/src/index.ts index 38df8768..b0dc335e 100644 --- a/packages/firebase-auth/src/index.ts +++ b/packages/firebase-auth/src/index.ts @@ -1,10 +1,11 @@ -import type { EmulatorEnv, KeyStorer, FirebaseIdToken } from 'firebase-auth-cloudflare-workers' +import type { KeyStorer, FirebaseIdToken } from 'firebase-auth-cloudflare-workers' import { Auth, WorkersKVStoreSingle } from 'firebase-auth-cloudflare-workers' import type { Context, MiddlewareHandler } from 'hono' -export interface VerifyFirebaseAuthEnv extends EmulatorEnv { +export type VerifyFirebaseAuthEnv = { PUBLIC_JWK_CACHE_KEY?: string | undefined PUBLIC_JWK_CACHE_KV?: KVNamespace | undefined + FIREBASE_AUTH_EMULATOR_HOST: string | undefined } export interface VerifyFirebaseAuthConfig { @@ -24,12 +25,6 @@ const defaultKeyStoreInitializer = (c: Context): KeyStorer => { ) } -type Env = { - Bindings: { - FIREBASE_AUTH_EMULATOR_HOST: string - } -} - export const verifyFirebaseAuth = (userConfig: VerifyFirebaseAuthConfig): MiddlewareHandler => { const config = { projectId: userConfig.projectId, diff --git a/packages/graphql-server/CHANGELOG.md b/packages/graphql-server/CHANGELOG.md index 5e222396..0866ed04 100644 --- a/packages/graphql-server/CHANGELOG.md +++ b/packages/graphql-server/CHANGELOG.md @@ -1,5 +1,11 @@ # @hono/graphql-server +## 0.4.0 + +### Minor Changes + +- [#53](https://github.com/honojs/middleware/pull/53) [`ca1a210`](https://github.com/honojs/middleware/commit/ca1a2103a7b2692d05e29c67f891a9a147240efb) Thanks [@lrazovic](https://github.com/lrazovic)! - feat: bump up Hono to version 3.0.0 + ## 0.2.0 ### Minor Changes diff --git a/packages/graphql-server/deno_dist/README.md b/packages/graphql-server/deno_dist/README.md index 4e0d088b..3d10503f 100644 --- a/packages/graphql-server/deno_dist/README.md +++ b/packages/graphql-server/deno_dist/README.md @@ -53,3 +53,7 @@ app.use( app.fire() ``` + +## Author + +Minghe Huang diff --git a/packages/graphql-server/deno_dist/index.ts b/packages/graphql-server/deno_dist/index.ts index 8e654b0e..184a1d15 100644 --- a/packages/graphql-server/deno_dist/index.ts +++ b/packages/graphql-server/deno_dist/index.ts @@ -17,7 +17,7 @@ import type { GraphQLFormattedError, } from 'https://cdn.skypack.dev/graphql@16.6.0?dts' -import type { Context } from 'https://deno.land/x/hono@v2.7.5/mod.ts' +import type { Context } from 'https://deno.land/x/hono@v3.0.0/mod.ts' import { parseBody } from './parse-body.ts' export type RootResolver = (ctx?: Context) => Promise | unknown @@ -46,7 +46,7 @@ export const graphqlServer = (options: Options) => { let params: GraphQLParams try { - params = await getGraphQLParams(c.req) + params = await getGraphQLParams(c.req.raw) } catch (e) { if (e instanceof Error) { console.error(`${e.stack || e.message}`) diff --git a/packages/graphql-server/deno_test/hono.test.ts b/packages/graphql-server/deno_test/hono.test.ts index d4f5c9f2..4d32d4f7 100644 --- a/packages/graphql-server/deno_test/hono.test.ts +++ b/packages/graphql-server/deno_test/hono.test.ts @@ -1,6 +1,6 @@ import { buildSchema } from 'https://cdn.skypack.dev/graphql@16.6.0?dts' -import { assertEquals } from 'https://deno.land/std@0.149.0/testing/asserts.ts' -import { Hono } from 'https://deno.land/x/hono@v2.7.5/mod.ts' +import { assertEquals } from 'https://deno.land/std@0.177.0/testing/asserts.ts' +import { Hono } from 'https://deno.land/x/hono@v3.0.0/mod.ts' import { graphqlServer } from '../deno_dist/index.ts' Deno.test('graphql-server', async (t) => { diff --git a/packages/graphql-server/package.json b/packages/graphql-server/package.json index d0776058..ce3e4b32 100644 --- a/packages/graphql-server/package.json +++ b/packages/graphql-server/package.json @@ -1,6 +1,6 @@ { "name": "@hono/graphql-server", - "version": "0.2.0", + "version": "0.4.0", "repository": "git@github.com:honojs/middleware.git", "author": "Minghe Huang ", "main": "dist/index.js", @@ -27,7 +27,7 @@ "release": "np" }, "peerDependencies": { - "hono": "^2.6.1" + "hono": "^3.0.0" }, "dependencies": { "graphql": "^16.5.0" @@ -46,7 +46,7 @@ "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.26.0", "eslint-plugin-node": "^11.1.0", - "hono": "^2.6.1", + "hono": "^3.0.0", "jest": "^28.1.2", "jest-environment-miniflare": "^2.6.0", "np": "^7.6.2", diff --git a/packages/graphql-server/src/index.ts b/packages/graphql-server/src/index.ts index 74a48253..3e3961c9 100644 --- a/packages/graphql-server/src/index.ts +++ b/packages/graphql-server/src/index.ts @@ -46,7 +46,7 @@ export const graphqlServer = (options: Options) => { let params: GraphQLParams try { - params = await getGraphQLParams(c.req) + params = await getGraphQLParams(c.req.raw) } catch (e) { if (e instanceof Error) { console.error(`${e.stack || e.message}`) diff --git a/packages/sentry/CHANGELOG.md b/packages/sentry/CHANGELOG.md index b74ecd95..3040fdfb 100644 --- a/packages/sentry/CHANGELOG.md +++ b/packages/sentry/CHANGELOG.md @@ -1,5 +1,11 @@ # @hono/sentry +## 0.2.0 + +### Minor Changes + +- [#57](https://github.com/honojs/middleware/pull/57) [`8d57df8`](https://github.com/honojs/middleware/commit/8d57df889d472fe9c40f468ce2103fe9880ff91b) Thanks [@yusukebe](https://github.com/yusukebe)! - feat: support latest Hono version + ## 0.1.0 ### Minor Changes diff --git a/packages/sentry/deno_dist/README.md b/packages/sentry/deno_dist/README.md index 56ca52f6..a6806de0 100644 --- a/packages/sentry/deno_dist/README.md +++ b/packages/sentry/deno_dist/README.md @@ -1,21 +1,13 @@ # Sentry middleware for Hono -## Information - -Sentry Middleware `@honojs/sentry` is renamed to `@hono/sentry`. -`@honojs/sentry` is not maintained, please use `@hono/sentry`. -Also, for Deno, you can use import with `npm:` prefix like `npm:@hono/sentry`. - ---- - Sentry middleware for [Hono](https://github.com/honojs/hono). This middleware sends captured exceptions to the specified Sentry data source name via [toucan-js](https://github.com/robertcepa/toucan-js). ## Usage ```ts -import { sentry } from '@hono/sentry' import { Hono } from 'hono' +import { sentry } from '@hono/sentry' const app = new Hono() diff --git a/packages/sentry/deno_dist/index.ts b/packages/sentry/deno_dist/index.ts index e3816702..75f82148 100644 --- a/packages/sentry/deno_dist/index.ts +++ b/packages/sentry/deno_dist/index.ts @@ -7,11 +7,6 @@ declare module 'https://deno.land/x/hono/mod.ts' { } } -interface Bindings { - SENTRY_DSN?: string - NEXT_PUBLIC_SENTRY_DSN?: string -} - class MockContext implements ExecutionContext { passThroughOnException(): void { throw new Error('Method not implemented.') @@ -37,7 +32,7 @@ export type Options = { export const sentry = ( options?: Options, callback?: (sentry: Toucan) => void -): MiddlewareHandler => { +): MiddlewareHandler => { return async (c, next) => { let hasExecutionContext = true try { @@ -49,7 +44,7 @@ export const sentry = ( dsn: c.env.SENTRY_DSN ?? c.env.NEXT_PUBLIC_SENTRY_DSN, allowedHeaders: ['user-agent'], allowedSearchParams: /(.*)/, - request: c.req, + request: c.req.raw, context: hasExecutionContext ? c.executionCtx : new MockContext(), ...options, }) diff --git a/packages/sentry/package.json b/packages/sentry/package.json index 2b04ccd3..300a7e56 100644 --- a/packages/sentry/package.json +++ b/packages/sentry/package.json @@ -1,6 +1,6 @@ { "name": "@hono/sentry", - "version": "0.1.0", + "version": "0.2.0", "description": "Sentry Middleware for Hono", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -33,7 +33,7 @@ "access": "public" }, "peerDependencies": { - "hono": "^2.6.1" + "hono": "^3.0.2" }, "dependencies": { "toucan-js": "^2.6.1" @@ -52,7 +52,7 @@ "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.26.0", "eslint-plugin-node": "^11.1.0", - "hono": "^2.6.1", + "hono": "^3.0.2", "jest": "^28.1.2", "jest-environment-miniflare": "^2.6.0", "np": "^7.6.2", diff --git a/packages/sentry/src/index.ts b/packages/sentry/src/index.ts index 07e99f7e..2ede2807 100644 --- a/packages/sentry/src/index.ts +++ b/packages/sentry/src/index.ts @@ -7,11 +7,6 @@ declare module 'hono' { } } -interface Bindings { - SENTRY_DSN?: string - NEXT_PUBLIC_SENTRY_DSN?: string -} - class MockContext implements ExecutionContext { passThroughOnException(): void { throw new Error('Method not implemented.') @@ -37,7 +32,7 @@ export type Options = { export const sentry = ( options?: Options, callback?: (sentry: Toucan) => void -): MiddlewareHandler => { +): MiddlewareHandler => { return async (c, next) => { let hasExecutionContext = true try { @@ -49,7 +44,7 @@ export const sentry = ( dsn: c.env.SENTRY_DSN ?? c.env.NEXT_PUBLIC_SENTRY_DSN, allowedHeaders: ['user-agent'], allowedSearchParams: /(.*)/, - request: c.req, + request: c.req.raw, context: hasExecutionContext ? c.executionCtx : new MockContext(), ...options, }) diff --git a/packages/typebox-validator/CHANGELOG.md b/packages/typebox-validator/CHANGELOG.md new file mode 100644 index 00000000..62bc1b43 --- /dev/null +++ b/packages/typebox-validator/CHANGELOG.md @@ -0,0 +1,7 @@ +# @hono/typebox-validator + +## 0.0.1 + +### Patch Changes + +- [#55](https://github.com/honojs/middleware/pull/55) [`2a3245a`](https://github.com/honojs/middleware/commit/2a3245ad060590fee85b4c7b4188196817b41945) Thanks [@curtislarson](https://github.com/curtislarson)! - Add TypeBox validator middleware diff --git a/packages/typebox-validator/README.md b/packages/typebox-validator/README.md new file mode 100644 index 00000000..3a513fc4 --- /dev/null +++ b/packages/typebox-validator/README.md @@ -0,0 +1,53 @@ +# TypeBox validator middleware for Hono + +Validator middleware using [TypeBox](https://github.com/sinclairzx81/typebox) for [Hono](https://honojs.dev) applications. +Define your schema with TypeBox and validate incoming requests. + +## Usage + +No Hook: + +```ts +import { tbValidator } from '@hono/typebox-validator' +import { Type as T } from '@sinclair/typebox' + +const schema = T.Object({ + name: T.String(), + age: T.Number(), +}) + +const route = app.post('/user', tbValidator('json', schema), (c) => { + const user = c.req.valid('json') + return c.json({ success: true, message: `${user.name} is ${user.age}` }) +}) +``` + +Hook: + +```ts +import { tbValidator } from '@hono/typebox-validator' +import { Type as T } from '@sinclair/typebox' + +const schema = T.Object({ + name: T.String(), + age: T.Number(), +}) + +app.post( + '/user', + tbValidator('json', schema, (result, c) => { + if (!result.success) { + return c.text('Invalid!', 400) + } + }) + //... +) +``` + +## Author + +Curtis Larson + +## License + +MIT diff --git a/packages/typebox-validator/jest.config.js b/packages/typebox-validator/jest.config.js new file mode 100644 index 00000000..f697d831 --- /dev/null +++ b/packages/typebox-validator/jest.config.js @@ -0,0 +1 @@ +module.exports = require('../../jest.config.js') diff --git a/packages/typebox-validator/package.json b/packages/typebox-validator/package.json new file mode 100644 index 00000000..3cb24403 --- /dev/null +++ b/packages/typebox-validator/package.json @@ -0,0 +1,38 @@ +{ + "name": "@hono/typebox-validator", + "version": "0.0.1", + "description": "Validator middleware using TypeBox", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/esm/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "test": "jest", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:esm": "tsc -p tsconfig.esm.json", + "build": "rimraf dist && yarn build:cjs && yarn build:esm", + "prerelease": "yarn build && yarn test", + "release": "yarn publish" + }, + "license": "MIT", + "private": false, + "publishConfig": { + "registry": "https://registry.npmjs.org", + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/honojs/middleware.git" + }, + "homepage": "https://github.com/honojs/middleware", + "peerDependencies": { + "hono": "3.*", + "@sinclair/typebox": "^0.25.24" + }, + "devDependencies": { + "hono": "^3.0.0", + "@sinclair/typebox": "^0.25.24" + } +} diff --git a/packages/typebox-validator/src/index.ts b/packages/typebox-validator/src/index.ts new file mode 100644 index 00000000..fc7fa6c5 --- /dev/null +++ b/packages/typebox-validator/src/index.ts @@ -0,0 +1,82 @@ +import type { TSchema, Static } from '@sinclair/typebox' +import { TypeCompiler, type ValueError } from '@sinclair/typebox/compiler' +import type { Context, Env, MiddlewareHandler } from 'hono' +import { validator } from 'hono/validator' + +type ValidationTargets = 'json' | 'form' | 'query' | 'queries' +type Hook = ( + result: { success: true; data: T } | { success: false; errors: ValueError[] }, + c: Context +) => Response | Promise | void + +/** + * Hono middleware that validates incoming data via a [TypeBox](https://github.com/sinclairzx81/typebox) schema. + * + * --- + * + * No Hook + * + * ```ts + * import { tbValidator } from '@hono/typebox-validator' + * import { Type as T } from '@sinclair/typebox' + * + * const schema = T.Object({ + * name: T.String(), + * age: T.Number(), + * }) + * + * const route = app.post('/user', tbValidator('json', schema), (c) => { + * const user = c.req.valid('json') + * return c.json({ success: true, message: `${user.name} is ${user.age}` }) + * }) + * ``` + * + * --- + * Hook + * + * ```ts + * import { tbValidator } from '@hono/typebox-validator' + * import { Type as T } from '@sinclair/typebox' + * + * const schema = T.Object({ + * name: T.String(), + * age: T.Number(), + * }) + * + * app.post( + * '/user', + * tbValidator('json', schema, (result, c) => { + * if (!result.success) { + * return c.text('Invalid!', 400) + * } + * }) + * //... + * ) + * ``` + */ +export function tbValidator< + T extends TSchema, + Target extends ValidationTargets, + E extends Env, + P extends string +>( + target: Target, + schema: T, + hook?: Hook> +): MiddlewareHandler }> { + // Compile the provided schema once rather than per validation. This could be optimized further using a shared schema + // compilation pool similar to the Fastify implementation. + const compiled = TypeCompiler.Compile(schema) + return validator(target, (data, c) => { + if (compiled.Check(data)) { + if (hook) { + const hookResult = hook({ success: true, data }, c) + if (hookResult instanceof Response || hookResult instanceof Promise) { + return hookResult + } + } + return data + } + return c.json({ success: false, errors: [...compiled.Errors(data)] }, 400) + }) +} diff --git a/packages/typebox-validator/test/index.test.ts b/packages/typebox-validator/test/index.test.ts new file mode 100644 index 00000000..9ad3721d --- /dev/null +++ b/packages/typebox-validator/test/index.test.ts @@ -0,0 +1,131 @@ +import { Type as T } from '@sinclair/typebox' +import { Hono } from 'hono' +import type { Equal, Expect } from 'hono/utils/types' +import { tbValidator } from '../src' + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +type ExtractSchema = T extends Hono ? S : never + +describe('Basic', () => { + const app = new Hono() + + const schema = T.Object({ + name: T.String(), + age: T.Number(), + }) + + const route = app.post('/author', tbValidator('json', schema), (c) => { + const data = c.req.valid('json') + return c.jsonT({ + success: true, + message: `${data.name} is ${data.age}`, + }) + }) + + type Actual = ExtractSchema + type Expected = { + '/author': { + $post: { + input: { + json: { + name: string + age: number + } + } + output: { + success: boolean + message: string + } + } + } + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + type verify = Expect> + + it('Should return 200 response', async () => { + const req = new Request('http://localhost/author', { + body: JSON.stringify({ + name: 'Superman', + age: 20, + }), + method: 'POST', + }) + const res = await app.request(req) + expect(res).not.toBeNull() + expect(res.status).toBe(200) + expect(await res.json()).toEqual({ + success: true, + message: 'Superman is 20', + }) + }) + + it('Should return 400 response', async () => { + const req = new Request('http://localhost/author', { + body: JSON.stringify({ + name: 'Superman', + age: '20', + }), + method: 'POST', + }) + const res = await app.request(req) + expect(res).not.toBeNull() + expect(res.status).toBe(400) + const data = (await res.json()) as { success: boolean } + expect(data['success']).toBe(false) + }) +}) + +describe('With Hook', () => { + const app = new Hono() + + const schema = T.Object({ + id: T.Number(), + title: T.String(), + }) + + app.post( + '/post', + tbValidator('json', schema, (result, c) => { + if (!result.success) { + return c.text('Invalid!', 400) + } + const data = result.data + return c.text(`${data.id} is valid!`) + }), + (c) => { + const data = c.req.valid('json') + return c.json({ + success: true, + message: `${data.id} is ${data.title}`, + }) + } + ) + + it('Should return 200 response', async () => { + const req = new Request('http://localhost/post', { + body: JSON.stringify({ + id: 123, + title: 'Hello', + }), + method: 'POST', + }) + const res = await app.request(req) + expect(res).not.toBeNull() + expect(res.status).toBe(200) + expect(await res.text()).toBe('123 is valid!') + }) + + it('Should return 400 response', async () => { + const req = new Request('http://localhost/post', { + body: JSON.stringify({ + id: '123', + title: 'Hello', + }), + method: 'POST', + }) + const res = await app.request(req) + expect(res).not.toBeNull() + expect(res.status).toBe(400) + }) +}) diff --git a/packages/typebox-validator/tsconfig.cjs.json b/packages/typebox-validator/tsconfig.cjs.json new file mode 100644 index 00000000..b8bf50ee --- /dev/null +++ b/packages/typebox-validator/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "declaration": false, + "outDir": "./dist/cjs" + } +} \ No newline at end of file diff --git a/packages/typebox-validator/tsconfig.esm.json b/packages/typebox-validator/tsconfig.esm.json new file mode 100644 index 00000000..8130f1a5 --- /dev/null +++ b/packages/typebox-validator/tsconfig.esm.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "ESNext", + "declaration": true, + "outDir": "./dist/esm" + } +} \ No newline at end of file diff --git a/packages/typebox-validator/tsconfig.json b/packages/typebox-validator/tsconfig.json new file mode 100644 index 00000000..6c1a3990 --- /dev/null +++ b/packages/typebox-validator/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + }, + "include": [ + "src/**/*.ts" + ], +} \ No newline at end of file diff --git a/packages/zod-validator/README.md b/packages/zod-validator/README.md index f0fde26d..34357e13 100644 --- a/packages/zod-validator/README.md +++ b/packages/zod-validator/README.md @@ -7,7 +7,7 @@ You can write a schema with Zod and validate the incoming values. ```ts import { z } from 'zod' -import { zValidator } from '../src' +import { zValidator } from '@hono/zod-validator' const schema = z.object({ name: z.string(), @@ -15,7 +15,7 @@ const schema = z.object({ }) app.post('/author', zValidator('json', schema), (c) => { - const data = c.req.valid() + const data = c.req.valid('json') return c.json({ success: true, message: `${data.name} is ${data.age}`, diff --git a/yarn.lock b/yarn.lock index d8be1e1f..ac5d6e03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1492,6 +1492,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.25.24": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -5229,11 +5234,6 @@ hono@3.0.0-rc.4: resolved "https://registry.yarnpkg.com/hono/-/hono-3.0.0-rc.4.tgz#7bfe8c89d4b004ff90d587c8ba45279a175fbce7" integrity sha512-76R3mb8kPeuD9TOmQ1WZi59w4QbpaUOlyX3wC7zQpt7IM7iFVBTxj2fpv++6ROPtd5iUBMCrmH/65ZrNXYYgmg== -hono@^2.6.1: - version "2.7.5" - resolved "https://registry.yarnpkg.com/hono/-/hono-2.7.5.tgz#2b0c39d39a057575962a7025373be4304dedca9c" - integrity sha512-UYrhUT1Xtalh7Xw/YGXee25wlWMiVIRfr0FbAJMEMyRpX9TFZ/6JKmVdCK7ioRnhAw7PfWBasjSBhdNXQ8/okQ== - hono@^2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/hono/-/hono-2.7.2.tgz#09796d79a2f220c353efaf4aeb82434062ceb911" @@ -5244,6 +5244,16 @@ hono@^3.0.0: resolved "https://registry.yarnpkg.com/hono/-/hono-3.0.0.tgz#f81e49e7540603203b9b576c81b289fa7daf0446" integrity sha512-OBWEvcRydCOLdOiazqOmKy8PXciR8uIyUM9HpmXot7UmwNBGOdEJvTrVRIgjV603w+go6cTXBOvFiQClSABT6Q== +hono@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/hono/-/hono-3.0.2.tgz#807a1b0514c6563917d8c278e6da7101bdac1d19" + integrity sha512-jhb0eCiUTOzbOXZyXQCOk1gf3MKjV4ZXY3PRT6lzma0XPsnnHuDOHYF7RCMHYe7jhl4Y0IAzrmWXneXhOMHypA== + +hono@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/hono/-/hono-3.0.3.tgz#26b62bece753941dd3d290d03ff3338f71535017" + integrity sha512-6Lb/TPH7Me1GAjFR7k/duzTcHS5y+rxFyL6Ky0kYQQlu92l99t53CFMVcdNUpHeStarPOs4Uzl413zIvxaI15A== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"