From 939815510c580269abe6ff7818570a528b658000 Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Thu, 11 Jul 2024 12:56:28 +0200 Subject: [PATCH] refactor: :arrow_up: Upgrade dependencies, use JSR for Hono --- .npmrc | 1 + app.ts | 4 ++- bun.lockb | Bin 252148 -> 258100 bytes middlewares/agent-bans.ts | 2 +- middlewares/bait.ts | 2 +- middlewares/boundary-check.ts | 2 +- middlewares/ip-bans.ts | 2 +- middlewares/logger.ts | 2 +- middlewares/url-check.ts | 2 +- package.json | 27 ++++++++-------- patches/patch.ts | 5 --- server/api/api/auth/login/index.ts | 2 +- server/api/api/auth/mastodon-login/index.ts | 2 +- server/api/api/auth/mastodon-logout/index.ts | 2 +- server/api/api/auth/redirect/index.ts | 2 +- server/api/api/auth/reset/index.ts | 2 +- server/api/api/v1/accounts/:id/block.ts | 2 +- server/api/api/v1/accounts/:id/follow.ts | 2 +- server/api/api/v1/accounts/:id/followers.ts | 2 +- server/api/api/v1/accounts/:id/following.ts | 2 +- server/api/api/v1/accounts/:id/index.ts | 2 +- server/api/api/v1/accounts/:id/mute.ts | 2 +- server/api/api/v1/accounts/:id/note.ts | 2 +- server/api/api/v1/accounts/:id/pin.ts | 2 +- .../v1/accounts/:id/remove_from_followers.ts | 2 +- server/api/api/v1/accounts/:id/statuses.ts | 2 +- server/api/api/v1/accounts/:id/unblock.ts | 2 +- server/api/api/v1/accounts/:id/unfollow.ts | 2 +- server/api/api/v1/accounts/:id/unmute.ts | 2 +- server/api/api/v1/accounts/:id/unpin.ts | 2 +- .../v1/accounts/familiar_followers/index.ts | 2 +- server/api/api/v1/accounts/index.ts | 10 +++--- server/api/api/v1/accounts/lookup/index.ts | 2 +- .../api/v1/accounts/relationships/index.ts | 2 +- server/api/api/v1/accounts/search/index.ts | 2 +- .../v1/accounts/update_credentials/index.ts | 8 ++--- .../v1/accounts/verify_credentials/index.ts | 2 +- server/api/api/v1/apps/index.ts | 8 ++--- .../api/v1/apps/verify_credentials/index.ts | 2 +- server/api/api/v1/blocks/index.ts | 2 +- server/api/api/v1/challenges/index.ts | 2 +- server/api/api/v1/custom_emojis/index.ts | 2 +- server/api/api/v1/emojis/:id/index.ts | 8 ++--- server/api/api/v1/emojis/index.ts | 8 ++--- server/api/api/v1/favourites/index.ts | 2 +- .../follow_requests/:account_id/authorize.ts | 2 +- .../v1/follow_requests/:account_id/reject.ts | 2 +- server/api/api/v1/follow_requests/index.ts | 2 +- server/api/api/v1/frontend/config/index.ts | 2 +- .../api/v1/instance/extended_description.ts | 2 +- server/api/api/v1/instance/index.ts | 2 +- server/api/api/v1/instance/privacy_policy.ts | 2 +- server/api/api/v1/instance/rules.ts | 2 +- server/api/api/v1/instance/tos.ts | 2 +- server/api/api/v1/markers/index.ts | 2 +- server/api/api/v1/media/:id/index.ts | 2 +- server/api/api/v1/media/index.ts | 2 +- server/api/api/v1/mutes/index.ts | 2 +- .../api/api/v1/notifications/:id/dismiss.ts | 2 +- server/api/api/v1/notifications/:id/index.ts | 2 +- .../api/api/v1/notifications/clear/index.ts | 2 +- .../notifications/destroy_multiple/index.ts | 2 +- server/api/api/v1/notifications/index.ts | 2 +- server/api/api/v1/profile/avatar.ts | 2 +- server/api/api/v1/profile/header.ts | 2 +- server/api/api/v1/roles/:id/index.ts | 5 ++- server/api/api/v1/roles/index.ts | 2 +- server/api/api/v1/sso/:id/index.ts | 2 +- server/api/api/v1/sso/index.ts | 8 ++--- server/api/api/v1/statuses/:id/context.ts | 2 +- server/api/api/v1/statuses/:id/favourite.ts | 2 +- .../api/api/v1/statuses/:id/favourited_by.ts | 2 +- server/api/api/v1/statuses/:id/index.ts | 8 ++--- server/api/api/v1/statuses/:id/pin.ts | 2 +- server/api/api/v1/statuses/:id/reblog.ts | 8 ++--- .../api/api/v1/statuses/:id/reblogged_by.ts | 2 +- server/api/api/v1/statuses/:id/source.ts | 2 +- server/api/api/v1/statuses/:id/unfavourite.ts | 2 +- server/api/api/v1/statuses/:id/unpin.ts | 2 +- server/api/api/v1/statuses/:id/unreblog.ts | 2 +- server/api/api/v1/statuses/index.ts | 8 ++--- server/api/api/v1/timelines/home.ts | 2 +- server/api/api/v1/timelines/public.ts | 2 +- server/api/api/v2/filters/:id/index.ts | 8 ++--- server/api/api/v2/filters/index.ts | 8 ++--- server/api/api/v2/instance/index.ts | 2 +- server/api/api/v2/media/index.ts | 2 +- server/api/api/v2/search/index.ts | 2 +- server/api/media/:hash/:name/index.ts | 2 +- server/api/media/proxy/:id.ts | 2 +- server/api/oauth/authorize/index.ts | 10 +++--- .../api/oauth/sso/:issuer/callback/index.ts | 2 +- server/api/oauth/sso/index.ts | 2 +- server/api/oauth/token/index.ts | 8 ++--- server/api/objects/:id/index.ts | 2 +- server/api/users/:uuid/inbox/index.ts | 2 +- server/api/users/:uuid/index.ts | 2 +- server/api/users/:uuid/outbox/index.ts | 2 +- server/api/well-known/host-meta/index.ts | 2 +- server/api/well-known/jwks/index.ts | 2 +- server/api/well-known/lysand.ts | 2 +- server/api/well-known/nodeinfo/2.0/index.ts | 2 +- server/api/well-known/nodeinfo/index.ts | 2 +- .../well-known/openid-configuration/index.ts | 2 +- server/api/well-known/webfinger/index.ts | 2 +- tests/utils.ts | 6 ++-- types/api.ts | 4 +-- utils/api.ts | 29 ++++++++++-------- utils/server.ts | 2 +- 109 files changed, 183 insertions(+), 180 deletions(-) create mode 100644 .npmrc delete mode 100644 patches/patch.ts diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..41583e36 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@jsr:registry=https://npm.jsr.io diff --git a/app.ts b/app.ts index 3fd5caf7..e2ea11e4 100644 --- a/app.ts +++ b/app.ts @@ -1,7 +1,7 @@ import { errorResponse, response } from "@/response"; +import { Hono } from "@hono/hono"; import { getLogger } from "@logtape/logtape"; import { config } from "config-manager"; -import { Hono } from "hono"; import { agentBans } from "./middlewares/agent-bans"; import { bait } from "./middlewares/bait"; import { boundaryCheck } from "./middlewares/boundary-check"; @@ -95,3 +95,5 @@ export const appFactory = async () => { return app; }; + +export type App = Awaited>; diff --git a/bun.lockb b/bun.lockb index 377893f2ec705904fee7d33f8abb6799d9dbe352..71a35b2ecc1dc4e3ac1208646cc872440c5eec85 100755 GIT binary patch delta 62770 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 S;Wf{Bb}N*t#hkD32mT)zSXWp8 delta 57994 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 diff --git a/middlewares/agent-bans.ts b/middlewares/agent-bans.ts index 9e5a7a80..7bec2451 100644 --- a/middlewares/agent-bans.ts +++ b/middlewares/agent-bans.ts @@ -1,5 +1,5 @@ import { errorResponse } from "@/response"; -import { createMiddleware } from "hono/factory"; +import { createMiddleware } from "@hono/hono/factory"; import { config } from "~/packages/config-manager"; export const agentBans = createMiddleware(async (context, next) => { diff --git a/middlewares/bait.ts b/middlewares/bait.ts index d09c1db4..08ae8c40 100644 --- a/middlewares/bait.ts +++ b/middlewares/bait.ts @@ -1,7 +1,7 @@ import { response } from "@/response"; +import { createMiddleware } from "@hono/hono/factory"; import { getLogger } from "@logtape/logtape"; import type { SocketAddress } from "bun"; -import { createMiddleware } from "hono/factory"; import { matches } from "ip-matching"; import { config } from "~/packages/config-manager"; diff --git a/middlewares/boundary-check.ts b/middlewares/boundary-check.ts index b8f38fce..bbed965f 100644 --- a/middlewares/boundary-check.ts +++ b/middlewares/boundary-check.ts @@ -1,5 +1,5 @@ import { errorResponse } from "@/response"; -import { createMiddleware } from "hono/factory"; +import { createMiddleware } from "@hono/hono/factory"; export const boundaryCheck = createMiddleware(async (context, next) => { // Checks that FormData boundary is present diff --git a/middlewares/ip-bans.ts b/middlewares/ip-bans.ts index 6540b80e..6042ac42 100644 --- a/middlewares/ip-bans.ts +++ b/middlewares/ip-bans.ts @@ -1,7 +1,7 @@ import { errorResponse } from "@/response"; +import { createMiddleware } from "@hono/hono/factory"; import { getLogger } from "@logtape/logtape"; import type { SocketAddress } from "bun"; -import { createMiddleware } from "hono/factory"; import { matches } from "ip-matching"; import { config } from "~/packages/config-manager"; diff --git a/middlewares/logger.ts b/middlewares/logger.ts index d433e952..188f3d09 100644 --- a/middlewares/logger.ts +++ b/middlewares/logger.ts @@ -1,5 +1,5 @@ import { debugRequest } from "@/api"; -import { createMiddleware } from "hono/factory"; +import { createMiddleware } from "@hono/hono/factory"; import { config } from "~/packages/config-manager"; export const logger = createMiddleware(async (context, next) => { diff --git a/middlewares/url-check.ts b/middlewares/url-check.ts index 387a924f..6cbb77ca 100644 --- a/middlewares/url-check.ts +++ b/middlewares/url-check.ts @@ -1,5 +1,5 @@ import { errorResponse } from "@/response"; -import { createMiddleware } from "hono/factory"; +import { createMiddleware } from "@hono/hono/factory"; import { config } from "~/packages/config-manager"; export const urlCheck = createMiddleware(async (context, next) => { diff --git a/package.json b/package.json index fdf1525b..86d45e63 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,6 @@ "cli": "bun run cli/index.ts", "prune": "ts-prune | grep -v server/ | grep -v dist/ | grep -v '(used in module)'", "check": "bunx tsc -p .", - "postinstall": "bun run patches/patch.ts", "prepare": "bunx husky" }, "trustedDependencies": [ @@ -78,19 +77,19 @@ "devDependencies": { "@biomejs/biome": "^1.8.3", "@types/bun": "^1.1.6", - "@types/cli-progress": "^3.11.5", + "@types/cli-progress": "^3.11.6", "@types/cli-table": "^0.3.4", "@types/html-to-text": "^9.0.4", "@types/ioredis": "^5.0.0", - "@types/jsonld": "^1.5.14", + "@types/jsonld": "^1.5.15", "@types/markdown-it-container": "^2.0.10", "@types/mime-types": "^2.1.4", "@types/pg": "^8.11.6", "@types/qs": "^6.9.15", "drizzle-kit": "^0.22.8", - "oclif": "^4.13.12", + "oclif": "^4.14.0", "ts-prune": "^0.10.3", - "typescript": "^5.5.2" + "typescript": "^5.5.3" }, "peerDependencies": { "typescript": "^5.3.2" @@ -98,30 +97,32 @@ "dependencies": { "@bradenmacdonald/s3-lite-client": "npm:@jsr/bradenmacdonald__s3-lite-client", "@hackmd/markdown-it-task-lists": "^2.1.4", + "@hono/hono": "npm:@jsr/hono__hono", + "hono": "npm:@jsr/hono__hono", "@hono/zod-validator": "^0.2.2", - "@inquirer/confirm": "^3.1.11", - "@inquirer/input": "^2.1.11", + "@inquirer/confirm": "^3.1.14", + "@inquirer/input": "^2.2.1", "@json2csv/plainjs": "^7.0.6", - "@logtape/logtape": "npm:@jsr/logtape__logtape", + "@logtape/logtape": "npm:@jsr/logtape__logtape@0.4.1", "@lysand-org/client": "^0.2.3", "@lysand-org/federation": "^2.1.0", - "@oclif/core": "^4.0.7", + "@oclif/core": "^4.0.11", "@tufjs/canonical-json": "^2.0.0", "altcha-lib": "^0.3.0", "blurhash": "^2.0.5", + "bullmq": "^5.8.6", "chalk": "^5.3.0", "cli-progress": "^3.12.0", "cli-table": "^0.3.11", "config-manager": "workspace:*", - "drizzle-orm": "^0.31.2", + "drizzle-orm": "^0.31.4", "extract-zip": "^2.0.1", - "hono": "^4.4.10", "html-to-text": "^9.0.5", "husky": "^9.0.11", "ioredis": "^5.4.1", "ip-matching": "^2.1.2", "iso-639-1": "^3.1.2", - "jose": "^5.6.2", + "jose": "^5.6.3", "linkify-html": "^4.1.3", "linkify-string": "^4.1.3", "linkifyjs": "^4.1.3", @@ -134,7 +135,7 @@ "oauth4webapi": "^2.11.1", "ora": "^8.0.1", "pg": "^8.12.0", - "qs": "^6.12.1", + "qs": "^6.12.3", "sharp": "^0.33.4", "sonic-channel": "^1.3.1", "string-comparison": "^1.3.0", diff --git a/patches/patch.ts b/patches/patch.ts deleted file mode 100644 index b47a3d3a..00000000 --- a/patches/patch.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { $ } from "bun"; - -// Replace all occurrences of 'Deno' with '{}' in node_modules/@logtape/logtape/logtape/filesink.deno.js -// LogTape assumes a Deno global exists which causes it to break in Bun -await $`sed -i 's/Deno/{}/g' '${import.meta.dir}/../node_modules/@logtape/logtape/logtape/filesink.deno.js'`; diff --git a/server/api/api/auth/login/index.ts b/server/api/api/auth/login/index.ts index fa83a531..ed381690 100644 --- a/server/api/api/auth/login/index.ts +++ b/server/api/api/auth/login/index.ts @@ -1,8 +1,8 @@ import { applyConfig, handleZodError } from "@/api"; import { errorResponse, redirect } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq, or } from "drizzle-orm"; -import type { Hono } from "hono"; import { SignJWT } from "jose"; import { z } from "zod"; import { db } from "~/drizzle/db"; diff --git a/server/api/api/auth/mastodon-login/index.ts b/server/api/api/auth/mastodon-login/index.ts index 1ab4ddec..85103c93 100644 --- a/server/api/api/auth/mastodon-login/index.ts +++ b/server/api/api/auth/mastodon-login/index.ts @@ -1,9 +1,9 @@ import { applyConfig, handleZodError } from "@/api"; import { randomString } from "@/math"; import { response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { TokenType } from "~/classes/functions/token"; import { db } from "~/drizzle/db"; diff --git a/server/api/api/auth/mastodon-logout/index.ts b/server/api/api/auth/mastodon-logout/index.ts index 50b99c12..ed0d736d 100644 --- a/server/api/api/auth/mastodon-logout/index.ts +++ b/server/api/api/auth/mastodon-logout/index.ts @@ -1,5 +1,5 @@ import { applyConfig } from "@/api"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { config } from "~/packages/config-manager"; export const meta = applyConfig({ diff --git a/server/api/api/auth/redirect/index.ts b/server/api/api/auth/redirect/index.ts index c2fc4b7d..8f782b7f 100644 --- a/server/api/api/auth/redirect/index.ts +++ b/server/api/api/auth/redirect/index.ts @@ -1,7 +1,7 @@ import { applyConfig, handleZodError } from "@/api"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { Applications, Tokens } from "~/drizzle/schema"; diff --git a/server/api/api/auth/reset/index.ts b/server/api/api/auth/reset/index.ts index 0c454d9e..e9f5e7ad 100644 --- a/server/api/api/auth/reset/index.ts +++ b/server/api/api/auth/reset/index.ts @@ -1,8 +1,8 @@ import { applyConfig, handleZodError } from "@/api"; import { response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { Users } from "~/drizzle/schema"; import { config } from "~/packages/config-manager"; diff --git a/server/api/api/v1/accounts/:id/block.ts b/server/api/api/v1/accounts/:id/block.ts index 0eb6931d..9f461a24 100644 --- a/server/api/api/v1/accounts/:id/block.ts +++ b/server/api/api/v1/accounts/:id/block.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { relationshipToApi } from "~/classes/functions/relationship"; import { getRelationshipToOtherUser } from "~/classes/functions/user"; diff --git a/server/api/api/v1/accounts/:id/follow.ts b/server/api/api/v1/accounts/:id/follow.ts index 81863504..6497fafc 100644 --- a/server/api/api/v1/accounts/:id/follow.ts +++ b/server/api/api/v1/accounts/:id/follow.ts @@ -1,7 +1,7 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import ISO6391 from "iso-639-1"; import { z } from "zod"; import { relationshipToApi } from "~/classes/functions/relationship"; diff --git a/server/api/api/v1/accounts/:id/followers.ts b/server/api/api/v1/accounts/:id/followers.ts index 43501b87..61ffd5fa 100644 --- a/server/api/api/v1/accounts/:id/followers.ts +++ b/server/api/api/v1/accounts/:id/followers.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, gt, gte, lt, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions, Users } from "~/drizzle/schema"; import { Timeline } from "~/packages/database-interface/timeline"; diff --git a/server/api/api/v1/accounts/:id/following.ts b/server/api/api/v1/accounts/:id/following.ts index 4de7262c..cebc1945 100644 --- a/server/api/api/v1/accounts/:id/following.ts +++ b/server/api/api/v1/accounts/:id/following.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, gt, gte, lt, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions, Users } from "~/drizzle/schema"; import { Timeline } from "~/packages/database-interface/timeline"; diff --git a/server/api/api/v1/accounts/:id/index.ts b/server/api/api/v1/accounts/:id/index.ts index 273b6463..b57d0500 100644 --- a/server/api/api/v1/accounts/:id/index.ts +++ b/server/api/api/v1/accounts/:id/index.ts @@ -1,7 +1,7 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions } from "~/drizzle/schema"; import { User } from "~/packages/database-interface/user"; diff --git a/server/api/api/v1/accounts/:id/mute.ts b/server/api/api/v1/accounts/:id/mute.ts index b411cb4b..64baefa4 100644 --- a/server/api/api/v1/accounts/:id/mute.ts +++ b/server/api/api/v1/accounts/:id/mute.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { relationshipToApi } from "~/classes/functions/relationship"; import { getRelationshipToOtherUser } from "~/classes/functions/user"; diff --git a/server/api/api/v1/accounts/:id/note.ts b/server/api/api/v1/accounts/:id/note.ts index 09b1165a..2b38fc1e 100644 --- a/server/api/api/v1/accounts/:id/note.ts +++ b/server/api/api/v1/accounts/:id/note.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { relationshipToApi } from "~/classes/functions/relationship"; import { getRelationshipToOtherUser } from "~/classes/functions/user"; diff --git a/server/api/api/v1/accounts/:id/pin.ts b/server/api/api/v1/accounts/:id/pin.ts index a70d2d64..a0912bbb 100644 --- a/server/api/api/v1/accounts/:id/pin.ts +++ b/server/api/api/v1/accounts/:id/pin.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { relationshipToApi } from "~/classes/functions/relationship"; import { getRelationshipToOtherUser } from "~/classes/functions/user"; diff --git a/server/api/api/v1/accounts/:id/remove_from_followers.ts b/server/api/api/v1/accounts/:id/remove_from_followers.ts index 3f0a6c02..be51431a 100644 --- a/server/api/api/v1/accounts/:id/remove_from_followers.ts +++ b/server/api/api/v1/accounts/:id/remove_from_followers.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { relationshipToApi } from "~/classes/functions/relationship"; import { getRelationshipToOtherUser } from "~/classes/functions/user"; diff --git a/server/api/api/v1/accounts/:id/statuses.ts b/server/api/api/v1/accounts/:id/statuses.ts index c42d0b8a..3b244398 100644 --- a/server/api/api/v1/accounts/:id/statuses.ts +++ b/server/api/api/v1/accounts/:id/statuses.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq, gt, gte, isNull, lt, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { Notes, RolePermissions } from "~/drizzle/schema"; import { Timeline } from "~/packages/database-interface/timeline"; diff --git a/server/api/api/v1/accounts/:id/unblock.ts b/server/api/api/v1/accounts/:id/unblock.ts index 677e8c13..ea71bc6e 100644 --- a/server/api/api/v1/accounts/:id/unblock.ts +++ b/server/api/api/v1/accounts/:id/unblock.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { relationshipToApi } from "~/classes/functions/relationship"; import { getRelationshipToOtherUser } from "~/classes/functions/user"; diff --git a/server/api/api/v1/accounts/:id/unfollow.ts b/server/api/api/v1/accounts/:id/unfollow.ts index 81668479..2b0bea37 100644 --- a/server/api/api/v1/accounts/:id/unfollow.ts +++ b/server/api/api/v1/accounts/:id/unfollow.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { relationshipToApi } from "~/classes/functions/relationship"; import { getRelationshipToOtherUser } from "~/classes/functions/user"; diff --git a/server/api/api/v1/accounts/:id/unmute.ts b/server/api/api/v1/accounts/:id/unmute.ts index d3662632..8e5c0c6b 100644 --- a/server/api/api/v1/accounts/:id/unmute.ts +++ b/server/api/api/v1/accounts/:id/unmute.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { relationshipToApi } from "~/classes/functions/relationship"; import { getRelationshipToOtherUser } from "~/classes/functions/user"; diff --git a/server/api/api/v1/accounts/:id/unpin.ts b/server/api/api/v1/accounts/:id/unpin.ts index 7a61744e..04a97781 100644 --- a/server/api/api/v1/accounts/:id/unpin.ts +++ b/server/api/api/v1/accounts/:id/unpin.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { relationshipToApi } from "~/classes/functions/relationship"; import { getRelationshipToOtherUser } from "~/classes/functions/user"; diff --git a/server/api/api/v1/accounts/familiar_followers/index.ts b/server/api/api/v1/accounts/familiar_followers/index.ts index cabbd499..b2545cd6 100644 --- a/server/api/api/v1/accounts/familiar_followers/index.ts +++ b/server/api/api/v1/accounts/familiar_followers/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, qsQuery } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { inArray } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { RolePermissions, Users } from "~/drizzle/schema"; diff --git a/server/api/api/v1/accounts/index.ts b/server/api/api/v1/accounts/index.ts index 61df5630..da29d35a 100644 --- a/server/api/api/v1/accounts/index.ts +++ b/server/api/api/v1/accounts/index.ts @@ -1,9 +1,9 @@ import { applyConfig, auth, handleZodError, jsonOrForm } from "@/api"; import { jsonResponse, response } from "@/response"; import { tempmailDomains } from "@/tempmail"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq, isNull } from "drizzle-orm"; -import type { Hono } from "hono"; import ISO6391 from "iso-639-1"; import { z } from "zod"; import { Users } from "~/drizzle/schema"; @@ -27,7 +27,7 @@ export const meta = applyConfig({ }); export const schemas = { - form: z.object({ + json: z.object({ username: z.string(), email: z.string().toLowerCase(), password: z.string().optional(), @@ -46,11 +46,11 @@ export default (app: Hono) => meta.route, auth(meta.auth, meta.permissions, meta.challenge), jsonOrForm(), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), async (context) => { - const form = context.req.valid("form"); + const form = context.req.valid("json"); const { username, email, password, agreement, locale } = - context.req.valid("form"); + context.req.valid("json"); if (!config.signups.registration) { return jsonResponse( diff --git a/server/api/api/v1/accounts/lookup/index.ts b/server/api/api/v1/accounts/lookup/index.ts index e3ff6ca5..fc2a2bbb 100644 --- a/server/api/api/v1/accounts/lookup/index.ts +++ b/server/api/api/v1/accounts/lookup/index.ts @@ -1,10 +1,10 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { SignatureConstructor } from "@lysand-org/federation"; import { FederationRequester } from "@lysand-org/federation/requester"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { anyOf, charIn, diff --git a/server/api/api/v1/accounts/relationships/index.ts b/server/api/api/v1/accounts/relationships/index.ts index 62d1ffff..f4dd264f 100644 --- a/server/api/api/v1/accounts/relationships/index.ts +++ b/server/api/api/v1/accounts/relationships/index.ts @@ -1,7 +1,7 @@ import { applyConfig, auth, handleZodError, qsQuery } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { createNewRelationship, diff --git a/server/api/api/v1/accounts/search/index.ts b/server/api/api/v1/accounts/search/index.ts index 99250301..4c3350fd 100644 --- a/server/api/api/v1/accounts/search/index.ts +++ b/server/api/api/v1/accounts/search/index.ts @@ -1,10 +1,10 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { SignatureConstructor } from "@lysand-org/federation"; import { FederationRequester } from "@lysand-org/federation/requester"; import { eq, like, not, or, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { anyOf, charIn, diff --git a/server/api/api/v1/accounts/update_credentials/index.ts b/server/api/api/v1/accounts/update_credentials/index.ts index 480c79e5..00410b27 100644 --- a/server/api/api/v1/accounts/update_credentials/index.ts +++ b/server/api/api/v1/accounts/update_credentials/index.ts @@ -1,10 +1,10 @@ import { applyConfig, auth, handleZodError, jsonOrForm } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; import { sanitizedHtmlStrip } from "@/sanitization"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { config } from "config-manager"; import { and, eq, isNull } from "drizzle-orm"; -import type { Hono } from "hono"; import ISO6391 from "iso-639-1"; import { z } from "zod"; import { parseEmojis } from "~/classes/functions/emoji"; @@ -33,7 +33,7 @@ export const meta = applyConfig({ }); export const schemas = { - form: z.object({ + json: z.object({ display_name: z .string() .min(3) @@ -133,7 +133,7 @@ export default (app: Hono) => meta.allowedMethods, meta.route, jsonOrForm(), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), auth(meta.auth, meta.permissions), async (context) => { const { user } = context.req.valid("header"); @@ -148,7 +148,7 @@ export default (app: Hono) => discoverable, source, fields_attributes, - } = context.req.valid("form"); + } = context.req.valid("json"); if (!user) { return errorResponse("Unauthorized", 401); diff --git a/server/api/api/v1/accounts/verify_credentials/index.ts b/server/api/api/v1/accounts/verify_credentials/index.ts index 1624547c..c490e77f 100644 --- a/server/api/api/v1/accounts/verify_credentials/index.ts +++ b/server/api/api/v1/accounts/verify_credentials/index.ts @@ -1,6 +1,6 @@ import { applyConfig, auth } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; export const meta = applyConfig({ allowedMethods: ["GET"], diff --git a/server/api/api/v1/apps/index.ts b/server/api/api/v1/apps/index.ts index 3d317a39..7540fe23 100644 --- a/server/api/api/v1/apps/index.ts +++ b/server/api/api/v1/apps/index.ts @@ -1,8 +1,8 @@ import { applyConfig, handleZodError, jsonOrForm } from "@/api"; import { randomString } from "@/math"; import { jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { Applications, RolePermissions } from "~/drizzle/schema"; @@ -23,7 +23,7 @@ export const meta = applyConfig({ }); export const schemas = { - form: z.object({ + json: z.object({ client_name: z.string().trim().min(1).max(100), redirect_uris: z .string() @@ -49,10 +49,10 @@ export default (app: Hono) => meta.allowedMethods, meta.route, jsonOrForm(), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), async (context) => { const { client_name, redirect_uris, scopes, website } = - context.req.valid("form"); + context.req.valid("json"); const app = ( await db diff --git a/server/api/api/v1/apps/verify_credentials/index.ts b/server/api/api/v1/apps/verify_credentials/index.ts index 90a88f72..edc4be3e 100644 --- a/server/api/api/v1/apps/verify_credentials/index.ts +++ b/server/api/api/v1/apps/verify_credentials/index.ts @@ -1,6 +1,6 @@ import { applyConfig, auth } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { getFromToken } from "~/classes/functions/application"; import { RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/blocks/index.ts b/server/api/api/v1/blocks/index.ts index 884b856f..03d822df 100644 --- a/server/api/api/v1/blocks/index.ts +++ b/server/api/api/v1/blocks/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, gt, gte, lt, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions, Users } from "~/drizzle/schema"; import { Timeline } from "~/packages/database-interface/timeline"; diff --git a/server/api/api/v1/challenges/index.ts b/server/api/api/v1/challenges/index.ts index 0591393d..f15109e1 100644 --- a/server/api/api/v1/challenges/index.ts +++ b/server/api/api/v1/challenges/index.ts @@ -1,7 +1,7 @@ import { applyConfig, auth } from "@/api"; import { generateChallenge } from "@/challenges"; import { errorResponse, jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { config } from "~/packages/config-manager"; export const meta = applyConfig({ diff --git a/server/api/api/v1/custom_emojis/index.ts b/server/api/api/v1/custom_emojis/index.ts index 1c5c74fb..94522b9f 100644 --- a/server/api/api/v1/custom_emojis/index.ts +++ b/server/api/api/v1/custom_emojis/index.ts @@ -1,7 +1,7 @@ import { applyConfig, auth } from "@/api"; import { jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { and, eq, isNull, or } from "drizzle-orm"; -import type { Hono } from "hono"; import { Emojis, RolePermissions } from "~/drizzle/schema"; import { Emoji } from "~/packages/database-interface/emoji"; diff --git a/server/api/api/v1/emojis/:id/index.ts b/server/api/api/v1/emojis/:id/index.ts index 69726ca9..1ca914a4 100644 --- a/server/api/api/v1/emojis/:id/index.ts +++ b/server/api/api/v1/emojis/:id/index.ts @@ -7,9 +7,9 @@ import { } from "@/api"; import { mimeLookup } from "@/content_types"; import { errorResponse, jsonResponse, response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { MediaManager } from "~/classes/media/media-manager"; import { db } from "~/drizzle/db"; @@ -37,7 +37,7 @@ export const schemas = { param: z.object({ id: z.string().uuid(), }), - form: z + json: z .object({ shortcode: z .string() @@ -73,7 +73,7 @@ export default (app: Hono) => meta.route, jsonOrForm(), zValidator("param", schemas.param, handleZodError), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), auth(meta.auth, meta.permissions), async (context) => { const { id } = context.req.valid("param"); @@ -114,7 +114,7 @@ export default (app: Hono) => } case "PATCH": { - const form = context.req.valid("form"); + const form = context.req.valid("json"); if (!form) { return errorResponse( diff --git a/server/api/api/v1/emojis/index.ts b/server/api/api/v1/emojis/index.ts index 255daf00..1d6129cf 100644 --- a/server/api/api/v1/emojis/index.ts +++ b/server/api/api/v1/emojis/index.ts @@ -7,9 +7,9 @@ import { } from "@/api"; import { mimeLookup } from "@/content_types"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq, isNull, or } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { MediaManager } from "~/classes/media/media-manager"; import { Emojis, RolePermissions } from "~/drizzle/schema"; @@ -33,7 +33,7 @@ export const meta = applyConfig({ }); export const schemas = { - form: z.object({ + json: z.object({ shortcode: z .string() .trim() @@ -65,11 +65,11 @@ export default (app: Hono) => meta.allowedMethods, meta.route, jsonOrForm(), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), auth(meta.auth, meta.permissions), async (context) => { const { shortcode, element, alt, global, category } = - context.req.valid("form"); + context.req.valid("json"); const { user } = context.req.valid("header"); if (!user) { diff --git a/server/api/api/v1/favourites/index.ts b/server/api/api/v1/favourites/index.ts index 50bffd59..f7d860f1 100644 --- a/server/api/api/v1/favourites/index.ts +++ b/server/api/api/v1/favourites/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, gt, gte, lt, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { Notes, RolePermissions } from "~/drizzle/schema"; import { Timeline } from "~/packages/database-interface/timeline"; diff --git a/server/api/api/v1/follow_requests/:account_id/authorize.ts b/server/api/api/v1/follow_requests/:account_id/authorize.ts index 66c83337..db9a947b 100644 --- a/server/api/api/v1/follow_requests/:account_id/authorize.ts +++ b/server/api/api/v1/follow_requests/:account_id/authorize.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { checkForBidirectionalRelationships, diff --git a/server/api/api/v1/follow_requests/:account_id/reject.ts b/server/api/api/v1/follow_requests/:account_id/reject.ts index 96b593b4..d5c6b660 100644 --- a/server/api/api/v1/follow_requests/:account_id/reject.ts +++ b/server/api/api/v1/follow_requests/:account_id/reject.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { checkForBidirectionalRelationships, diff --git a/server/api/api/v1/follow_requests/index.ts b/server/api/api/v1/follow_requests/index.ts index 539c2ec3..da67baec 100644 --- a/server/api/api/v1/follow_requests/index.ts +++ b/server/api/api/v1/follow_requests/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, gt, gte, lt, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions, Users } from "~/drizzle/schema"; import { Timeline } from "~/packages/database-interface/timeline"; diff --git a/server/api/api/v1/frontend/config/index.ts b/server/api/api/v1/frontend/config/index.ts index 2eebc439..1afa9d8b 100644 --- a/server/api/api/v1/frontend/config/index.ts +++ b/server/api/api/v1/frontend/config/index.ts @@ -1,6 +1,6 @@ import { applyConfig } from "@/api"; import { jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { config } from "~/packages/config-manager"; export const meta = applyConfig({ diff --git a/server/api/api/v1/instance/extended_description.ts b/server/api/api/v1/instance/extended_description.ts index c84c7bef..a7b26ed7 100644 --- a/server/api/api/v1/instance/extended_description.ts +++ b/server/api/api/v1/instance/extended_description.ts @@ -1,7 +1,7 @@ import { applyConfig, auth } from "@/api"; import { renderMarkdownInPath } from "@/markdown"; import { jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { config } from "~/packages/config-manager"; export const meta = applyConfig({ diff --git a/server/api/api/v1/instance/index.ts b/server/api/api/v1/instance/index.ts index 5b381383..f218aa4f 100644 --- a/server/api/api/v1/instance/index.ts +++ b/server/api/api/v1/instance/index.ts @@ -1,7 +1,7 @@ import { applyConfig, auth } from "@/api"; import { jsonResponse, proxyUrl } from "@/response"; +import type { Hono } from "@hono/hono"; import { and, eq, isNull } from "drizzle-orm"; -import type { Hono } from "hono"; import { Users } from "~/drizzle/schema"; import manifest from "~/package.json"; import { config } from "~/packages/config-manager"; diff --git a/server/api/api/v1/instance/privacy_policy.ts b/server/api/api/v1/instance/privacy_policy.ts index 7ba3f31c..8e99bdb9 100644 --- a/server/api/api/v1/instance/privacy_policy.ts +++ b/server/api/api/v1/instance/privacy_policy.ts @@ -1,7 +1,7 @@ import { applyConfig, auth } from "@/api"; import { renderMarkdownInPath } from "@/markdown"; import { jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { config } from "~/packages/config-manager"; export const meta = applyConfig({ diff --git a/server/api/api/v1/instance/rules.ts b/server/api/api/v1/instance/rules.ts index cd14b1da..1f7e3991 100644 --- a/server/api/api/v1/instance/rules.ts +++ b/server/api/api/v1/instance/rules.ts @@ -1,6 +1,6 @@ import { applyConfig, auth } from "@/api"; import { jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { config } from "~/packages/config-manager"; export const meta = applyConfig({ diff --git a/server/api/api/v1/instance/tos.ts b/server/api/api/v1/instance/tos.ts index c5986882..ea3f5f63 100644 --- a/server/api/api/v1/instance/tos.ts +++ b/server/api/api/v1/instance/tos.ts @@ -1,7 +1,7 @@ import { applyConfig, auth } from "@/api"; import { renderMarkdownInPath } from "@/markdown"; import { jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { config } from "~/packages/config-manager"; export const meta = applyConfig({ diff --git a/server/api/api/v1/markers/index.ts b/server/api/api/v1/markers/index.ts index a8562963..47b55a05 100644 --- a/server/api/api/v1/markers/index.ts +++ b/server/api/api/v1/markers/index.ts @@ -1,9 +1,9 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import type { Marker as ApiMarker } from "@lysand-org/client/types"; import { and, count, eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { Markers, RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/media/:id/index.ts b/server/api/api/v1/media/:id/index.ts index 9f5323c6..c39f5c1c 100644 --- a/server/api/api/v1/media/:id/index.ts +++ b/server/api/api/v1/media/:id/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse, response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { config } from "config-manager"; -import type { Hono } from "hono"; import { z } from "zod"; import { MediaManager } from "~/classes/media/media-manager"; import { RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/media/index.ts b/server/api/api/v1/media/index.ts index 279c46d2..3b762d99 100644 --- a/server/api/api/v1/media/index.ts +++ b/server/api/api/v1/media/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { config } from "config-manager"; -import type { Hono } from "hono"; import sharp from "sharp"; import { z } from "zod"; import { MediaManager } from "~/classes/media/media-manager"; diff --git a/server/api/api/v1/mutes/index.ts b/server/api/api/v1/mutes/index.ts index 7cfc49d5..f0f03172 100644 --- a/server/api/api/v1/mutes/index.ts +++ b/server/api/api/v1/mutes/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, gt, gte, lt, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions, Users } from "~/drizzle/schema"; import { Timeline } from "~/packages/database-interface/timeline"; diff --git a/server/api/api/v1/notifications/:id/dismiss.ts b/server/api/api/v1/notifications/:id/dismiss.ts index 7e402f1e..db805500 100644 --- a/server/api/api/v1/notifications/:id/dismiss.ts +++ b/server/api/api/v1/notifications/:id/dismiss.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { Notifications, RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/notifications/:id/index.ts b/server/api/api/v1/notifications/:id/index.ts index 04daaede..a320a957 100644 --- a/server/api/api/v1/notifications/:id/index.ts +++ b/server/api/api/v1/notifications/:id/index.ts @@ -1,7 +1,7 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { findManyNotifications } from "~/classes/functions/notification"; import { RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/notifications/clear/index.ts b/server/api/api/v1/notifications/clear/index.ts index c4564e58..8479322e 100644 --- a/server/api/api/v1/notifications/clear/index.ts +++ b/server/api/api/v1/notifications/clear/index.ts @@ -1,7 +1,7 @@ import { applyConfig, auth } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { db } from "~/drizzle/db"; import { Notifications, RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/notifications/destroy_multiple/index.ts b/server/api/api/v1/notifications/destroy_multiple/index.ts index 23511cc5..a4419b6f 100644 --- a/server/api/api/v1/notifications/destroy_multiple/index.ts +++ b/server/api/api/v1/notifications/destroy_multiple/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq, inArray } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { Notifications, RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/notifications/index.ts b/server/api/api/v1/notifications/index.ts index 8df5391f..58ef7998 100644 --- a/server/api/api/v1/notifications/index.ts +++ b/server/api/api/v1/notifications/index.ts @@ -1,9 +1,9 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; import { fetchTimeline } from "@/timelines"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { findManyNotifications, diff --git a/server/api/api/v1/profile/avatar.ts b/server/api/api/v1/profile/avatar.ts index 0c9c3472..4dc0f3d4 100644 --- a/server/api/api/v1/profile/avatar.ts +++ b/server/api/api/v1/profile/avatar.ts @@ -1,6 +1,6 @@ import { applyConfig, auth } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { RolePermissions } from "~/drizzle/schema"; export const meta = applyConfig({ diff --git a/server/api/api/v1/profile/header.ts b/server/api/api/v1/profile/header.ts index 871b4bb5..b68f919b 100644 --- a/server/api/api/v1/profile/header.ts +++ b/server/api/api/v1/profile/header.ts @@ -1,6 +1,6 @@ import { applyConfig, auth } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { RolePermissions } from "~/drizzle/schema"; export const meta = applyConfig({ diff --git a/server/api/api/v1/roles/:id/index.ts b/server/api/api/v1/roles/:id/index.ts index 7c3b6329..bd241bc6 100644 --- a/server/api/api/v1/roles/:id/index.ts +++ b/server/api/api/v1/roles/:id/index.ts @@ -1,7 +1,7 @@ -import { applyConfig, auth, handleZodError, jsonOrForm } from "@/api"; +import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse, response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions } from "~/drizzle/schema"; import { Role } from "~/packages/database-interface/role"; @@ -34,7 +34,6 @@ export default (app: Hono) => app.on( meta.allowedMethods, meta.route, - jsonOrForm(), zValidator("param", schemas.param, handleZodError), auth(meta.auth, meta.permissions), async (context) => { diff --git a/server/api/api/v1/roles/index.ts b/server/api/api/v1/roles/index.ts index a251617e..40788a7e 100644 --- a/server/api/api/v1/roles/index.ts +++ b/server/api/api/v1/roles/index.ts @@ -1,6 +1,6 @@ import { applyConfig, auth } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { Role } from "~/packages/database-interface/role"; export const meta = applyConfig({ diff --git a/server/api/api/v1/sso/:id/index.ts b/server/api/api/v1/sso/:id/index.ts index 7b4b19c8..dcdec255 100644 --- a/server/api/api/v1/sso/:id/index.ts +++ b/server/api/api/v1/sso/:id/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse, proxyUrl, response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { OpenIdAccounts, RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/sso/index.ts b/server/api/api/v1/sso/index.ts index 6f9769ef..c797f63f 100644 --- a/server/api/api/v1/sso/index.ts +++ b/server/api/api/v1/sso/index.ts @@ -2,8 +2,8 @@ import { applyConfig, auth, handleZodError, jsonOrForm } from "@/api"; import { oauthRedirectUri } from "@/constants"; import { randomString } from "@/math"; import { errorResponse, jsonResponse, proxyUrl } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { calculatePKCECodeChallenge, discoveryRequest, @@ -35,7 +35,7 @@ export const meta = applyConfig({ }); export const schemas = { - form: z + json: z .object({ issuer: z.string(), }) @@ -52,10 +52,10 @@ export default (app: Hono) => meta.allowedMethods, meta.route, jsonOrForm(), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), auth(meta.auth, meta.permissions), async (context) => { - const form = context.req.valid("form"); + const form = context.req.valid("json"); const { user } = context.req.valid("header"); if (!user) { diff --git a/server/api/api/v1/statuses/:id/context.ts b/server/api/api/v1/statuses/:id/context.ts index 3e7570bd..e1b42951 100644 --- a/server/api/api/v1/statuses/:id/context.ts +++ b/server/api/api/v1/statuses/:id/context.ts @@ -1,7 +1,7 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions } from "~/drizzle/schema"; import { Note } from "~/packages/database-interface/note"; diff --git a/server/api/api/v1/statuses/:id/favourite.ts b/server/api/api/v1/statuses/:id/favourite.ts index 62853f86..3169ac0a 100644 --- a/server/api/api/v1/statuses/:id/favourite.ts +++ b/server/api/api/v1/statuses/:id/favourite.ts @@ -1,7 +1,7 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { createLike } from "~/classes/functions/like"; import { db } from "~/drizzle/db"; diff --git a/server/api/api/v1/statuses/:id/favourited_by.ts b/server/api/api/v1/statuses/:id/favourited_by.ts index 2924ae4d..79cf041e 100644 --- a/server/api/api/v1/statuses/:id/favourited_by.ts +++ b/server/api/api/v1/statuses/:id/favourited_by.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, gt, gte, lt, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions, Users } from "~/drizzle/schema"; import { Note } from "~/packages/database-interface/note"; diff --git a/server/api/api/v1/statuses/:id/index.ts b/server/api/api/v1/statuses/:id/index.ts index 3fa0a331..1be75fe2 100644 --- a/server/api/api/v1/statuses/:id/index.ts +++ b/server/api/api/v1/statuses/:id/index.ts @@ -6,9 +6,9 @@ import { jsonOrForm, } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { config } from "config-manager"; -import type { Hono } from "hono"; import ISO6391 from "iso-639-1"; import { z } from "zod"; import { undoFederationRequest } from "~/classes/functions/federation"; @@ -43,7 +43,7 @@ export const schemas = { param: z.object({ id: z.string().regex(idValidator), }), - form: z + json: z .object({ status: z .string() @@ -103,7 +103,7 @@ export default (app: Hono) => meta.route, jsonOrForm(), zValidator("param", schemas.param, handleZodError), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), auth(meta.auth, meta.permissions), async (context) => { const { id } = context.req.valid("param"); @@ -116,7 +116,7 @@ export default (app: Hono) => media_ids, spoiler_text, sensitive, - } = context.req.valid("form"); + } = context.req.valid("json"); const note = await Note.fromId(id, user?.id); diff --git a/server/api/api/v1/statuses/:id/pin.ts b/server/api/api/v1/statuses/:id/pin.ts index 0ddc1b5d..d5e2f45a 100644 --- a/server/api/api/v1/statuses/:id/pin.ts +++ b/server/api/api/v1/statuses/:id/pin.ts @@ -1,7 +1,7 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/statuses/:id/reblog.ts b/server/api/api/v1/statuses/:id/reblog.ts index 44d7fb79..6b032cec 100644 --- a/server/api/api/v1/statuses/:id/reblog.ts +++ b/server/api/api/v1/statuses/:id/reblog.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, jsonOrForm } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { Notes, Notifications, RolePermissions } from "~/drizzle/schema"; @@ -27,7 +27,7 @@ export const schemas = { param: z.object({ id: z.string().uuid(), }), - form: z.object({ + json: z.object({ visibility: z.enum(["public", "unlisted", "private"]).default("public"), }), }; @@ -38,11 +38,11 @@ export default (app: Hono) => meta.route, jsonOrForm(), zValidator("param", schemas.param, handleZodError), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), auth(meta.auth, meta.permissions), async (context) => { const { id } = context.req.valid("param"); - const { visibility } = context.req.valid("form"); + const { visibility } = context.req.valid("json"); const { user } = context.req.valid("header"); if (!user) { diff --git a/server/api/api/v1/statuses/:id/reblogged_by.ts b/server/api/api/v1/statuses/:id/reblogged_by.ts index 1031f0b8..4e2393b6 100644 --- a/server/api/api/v1/statuses/:id/reblogged_by.ts +++ b/server/api/api/v1/statuses/:id/reblogged_by.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, gt, gte, lt, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions, Users } from "~/drizzle/schema"; import { Note } from "~/packages/database-interface/note"; diff --git a/server/api/api/v1/statuses/:id/source.ts b/server/api/api/v1/statuses/:id/source.ts index 310c7c11..949544c1 100644 --- a/server/api/api/v1/statuses/:id/source.ts +++ b/server/api/api/v1/statuses/:id/source.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import type { StatusSource as ApiStatusSource } from "@lysand-org/client/types"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions } from "~/drizzle/schema"; import { Note } from "~/packages/database-interface/note"; diff --git a/server/api/api/v1/statuses/:id/unfavourite.ts b/server/api/api/v1/statuses/:id/unfavourite.ts index d776f68f..9e48dfad 100644 --- a/server/api/api/v1/statuses/:id/unfavourite.ts +++ b/server/api/api/v1/statuses/:id/unfavourite.ts @@ -1,7 +1,7 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { deleteLike } from "~/classes/functions/like"; import { RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/statuses/:id/unpin.ts b/server/api/api/v1/statuses/:id/unpin.ts index ff628a96..8142e2b1 100644 --- a/server/api/api/v1/statuses/:id/unpin.ts +++ b/server/api/api/v1/statuses/:id/unpin.ts @@ -1,7 +1,7 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { RolePermissions } from "~/drizzle/schema"; import { Note } from "~/packages/database-interface/note"; diff --git a/server/api/api/v1/statuses/:id/unreblog.ts b/server/api/api/v1/statuses/:id/unreblog.ts index 0f36a21a..913ed915 100644 --- a/server/api/api/v1/statuses/:id/unreblog.ts +++ b/server/api/api/v1/statuses/:id/unreblog.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { undoFederationRequest } from "~/classes/functions/federation"; import { Notes, RolePermissions } from "~/drizzle/schema"; diff --git a/server/api/api/v1/statuses/index.ts b/server/api/api/v1/statuses/index.ts index b3ab8f36..fdd3dfc8 100644 --- a/server/api/api/v1/statuses/index.ts +++ b/server/api/api/v1/statuses/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, jsonOrForm } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { config } from "config-manager"; -import type { Hono } from "hono"; import ISO6391 from "iso-639-1"; import { z } from "zod"; import { federateNote } from "~/classes/functions/status"; @@ -26,7 +26,7 @@ export const meta = applyConfig({ }); export const schemas = { - form: z + json: z .object({ status: z .string() @@ -108,7 +108,7 @@ export default (app: Hono) => meta.allowedMethods, meta.route, jsonOrForm(), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), auth(meta.auth, meta.permissions), async (context) => { const { user, application } = context.req.valid("header"); @@ -127,7 +127,7 @@ export default (app: Hono) => visibility, content_type, local_only, - } = context.req.valid("form"); + } = context.req.valid("json"); // Check if media attachments are all valid if (media_ids.length > 0) { diff --git a/server/api/api/v1/timelines/home.ts b/server/api/api/v1/timelines/home.ts index 13d8ccba..15738c2b 100644 --- a/server/api/api/v1/timelines/home.ts +++ b/server/api/api/v1/timelines/home.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq, gt, gte, lt, or, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { Notes, RolePermissions } from "~/drizzle/schema"; import { Timeline } from "~/packages/database-interface/timeline"; diff --git a/server/api/api/v1/timelines/public.ts b/server/api/api/v1/timelines/public.ts index 03a3dcf4..cae9f350 100644 --- a/server/api/api/v1/timelines/public.ts +++ b/server/api/api/v1/timelines/public.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, idValidator } from "@/api"; import { jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, gt, gte, lt, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { Notes, RolePermissions } from "~/drizzle/schema"; import { Timeline } from "~/packages/database-interface/timeline"; diff --git a/server/api/api/v2/filters/:id/index.ts b/server/api/api/v2/filters/:id/index.ts index 7ac8bcf6..08b98596 100644 --- a/server/api/api/v2/filters/:id/index.ts +++ b/server/api/api/v2/filters/:id/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError, jsonOrForm } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq, inArray } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { FilterKeywords, Filters, RolePermissions } from "~/drizzle/schema"; @@ -26,7 +26,7 @@ export const schemas = { param: z.object({ id: z.string().uuid(), }), - form: z.object({ + json: z.object({ title: z.string().trim().min(1).max(100).optional(), context: z .array( @@ -76,7 +76,7 @@ export default (app: Hono) => meta.route, jsonOrForm(), zValidator("param", schemas.param, handleZodError), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), auth(meta.auth, meta.permissions), async (context) => { const { user } = context.req.valid("header"); @@ -123,7 +123,7 @@ export default (app: Hono) => filter_action, expires_in, keywords_attributes, - } = context.req.valid("form"); + } = context.req.valid("json"); await db .update(Filters) diff --git a/server/api/api/v2/filters/index.ts b/server/api/api/v2/filters/index.ts index 338a8d89..718df75c 100644 --- a/server/api/api/v2/filters/index.ts +++ b/server/api/api/v2/filters/index.ts @@ -1,7 +1,7 @@ import { applyConfig, auth, handleZodError, jsonOrForm } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { FilterKeywords, Filters, RolePermissions } from "~/drizzle/schema"; @@ -21,7 +21,7 @@ export const meta = applyConfig({ }); export const schemas = { - form: z + json: z .object({ title: z.string().trim().min(1).max(100).optional(), context: z @@ -64,7 +64,7 @@ export default (app: Hono) => meta.allowedMethods, meta.route, jsonOrForm(), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), auth(meta.auth, meta.permissions), async (context) => { const { user } = context.req.valid("header"); @@ -102,7 +102,7 @@ export default (app: Hono) => ); } case "POST": { - const form = context.req.valid("form"); + const form = context.req.valid("json"); if (!form) { return errorResponse( "Missing required Form fields", diff --git a/server/api/api/v2/instance/index.ts b/server/api/api/v2/instance/index.ts index 9cdda872..c8f78e39 100644 --- a/server/api/api/v2/instance/index.ts +++ b/server/api/api/v2/instance/index.ts @@ -1,8 +1,8 @@ import { applyConfig } from "@/api"; import { jsonResponse, proxyUrl } from "@/response"; +import type { Hono } from "@hono/hono"; import type { Instance as ApiInstance } from "@lysand-org/client/types"; import { and, eq, isNull } from "drizzle-orm"; -import type { Hono } from "hono"; import { Users } from "~/drizzle/schema"; import manifest from "~/package.json"; import { config } from "~/packages/config-manager"; diff --git a/server/api/api/v2/media/index.ts b/server/api/api/v2/media/index.ts index e4f2db6f..f8390218 100644 --- a/server/api/api/v2/media/index.ts +++ b/server/api/api/v2/media/index.ts @@ -1,8 +1,8 @@ import { applyConfig, auth, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { config } from "config-manager"; -import type { Hono } from "hono"; import sharp from "sharp"; import { z } from "zod"; import { MediaManager } from "~/classes/media/media-manager"; diff --git a/server/api/api/v2/search/index.ts b/server/api/api/v2/search/index.ts index 4e411c00..05137c51 100644 --- a/server/api/api/v2/search/index.ts +++ b/server/api/api/v2/search/index.ts @@ -1,10 +1,10 @@ import { applyConfig, auth, handleZodError, userAddressValidator } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { SignatureConstructor } from "@lysand-org/federation"; import { FederationRequester } from "@lysand-org/federation/requester"; import { and, eq, inArray, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { searchManager } from "~/classes/search/search-manager"; import { db } from "~/drizzle/db"; diff --git a/server/api/media/:hash/:name/index.ts b/server/api/media/:hash/:name/index.ts index efa36b81..b2e67bd7 100644 --- a/server/api/media/:hash/:name/index.ts +++ b/server/api/media/:hash/:name/index.ts @@ -1,7 +1,7 @@ import { applyConfig, handleZodError } from "@/api"; import { errorResponse, response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; export const meta = applyConfig({ diff --git a/server/api/media/proxy/:id.ts b/server/api/media/proxy/:id.ts index 22edea34..de3341bb 100644 --- a/server/api/media/proxy/:id.ts +++ b/server/api/media/proxy/:id.ts @@ -1,7 +1,7 @@ import { applyConfig, handleZodError } from "@/api"; import { errorResponse, response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { config } from "~/packages/config-manager"; diff --git a/server/api/oauth/authorize/index.ts b/server/api/oauth/authorize/index.ts index 15db19ff..2b0f88a9 100644 --- a/server/api/oauth/authorize/index.ts +++ b/server/api/oauth/authorize/index.ts @@ -1,8 +1,8 @@ import { applyConfig, handleZodError, jsonOrForm } from "@/api"; import { randomString } from "@/math"; import { response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { SignJWT, jwtVerify } from "jose"; import { z } from "zod"; import { TokenType } from "~/classes/functions/token"; @@ -35,7 +35,7 @@ export const schemas = { .optional() .default(60 * 60 * 24 * 7), }), - form: z.object({ + json: z.object({ scope: z.string().optional(), redirect_uri: z .string() @@ -83,12 +83,12 @@ export default (app: Hono) => meta.route, jsonOrForm(), zValidator("query", schemas.query, handleZodError), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), async (context) => { const { scope, redirect_uri, response_type, client_id, state } = - context.req.valid("form"); + context.req.valid("json"); - const body = context.req.valid("form"); + const body = context.req.valid("json"); const cookie = context.req.header("Cookie"); diff --git a/server/api/oauth/sso/:issuer/callback/index.ts b/server/api/oauth/sso/:issuer/callback/index.ts index 9741b466..46f5c414 100644 --- a/server/api/oauth/sso/:issuer/callback/index.ts +++ b/server/api/oauth/sso/:issuer/callback/index.ts @@ -1,9 +1,9 @@ import { applyConfig, handleZodError } from "@/api"; import { randomString } from "@/math"; import { errorResponse, response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, eq, isNull } from "drizzle-orm"; -import type { Hono } from "hono"; import { SignJWT } from "jose"; import { z } from "zod"; import { TokenType } from "~/classes/functions/token"; diff --git a/server/api/oauth/sso/index.ts b/server/api/oauth/sso/index.ts index 58928d70..0e02b839 100644 --- a/server/api/oauth/sso/index.ts +++ b/server/api/oauth/sso/index.ts @@ -1,8 +1,8 @@ import { applyConfig, handleZodError } from "@/api"; import { oauthRedirectUri } from "@/constants"; import { redirect, response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { calculatePKCECodeChallenge, discoveryRequest, diff --git a/server/api/oauth/token/index.ts b/server/api/oauth/token/index.ts index 9cc7876a..c0f42a4c 100644 --- a/server/api/oauth/token/index.ts +++ b/server/api/oauth/token/index.ts @@ -1,8 +1,8 @@ import { applyConfig, handleZodError, jsonOrForm } from "@/api"; import { jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { Tokens } from "~/drizzle/schema"; @@ -20,7 +20,7 @@ export const meta = applyConfig({ }); export const schemas = { - form: z.object({ + json: z.object({ code: z.string().optional(), code_verifier: z.string().optional(), grant_type: z.enum([ @@ -64,10 +64,10 @@ export default (app: Hono) => meta.allowedMethods, meta.route, jsonOrForm(), - zValidator("form", schemas.form, handleZodError), + zValidator("json", schemas.json, handleZodError), async (context) => { const { grant_type, code, redirect_uri, client_id, client_secret } = - context.req.valid("form"); + context.req.valid("json"); switch (grant_type) { case "authorization_code": { diff --git a/server/api/objects/:id/index.ts b/server/api/objects/:id/index.ts index b50fe9f7..aa7bade0 100644 --- a/server/api/objects/:id/index.ts +++ b/server/api/objects/:id/index.ts @@ -1,9 +1,9 @@ import { applyConfig, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import type { Entity } from "@lysand-org/federation/types"; import { and, eq, inArray, sql } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { type LikeType, likeToLysand } from "~/classes/functions/like"; import { db } from "~/drizzle/db"; diff --git a/server/api/users/:uuid/inbox/index.ts b/server/api/users/:uuid/inbox/index.ts index c3e4c7d6..6b92954d 100644 --- a/server/api/users/:uuid/inbox/index.ts +++ b/server/api/users/:uuid/inbox/index.ts @@ -1,5 +1,6 @@ import { applyConfig, debugRequest, handleZodError } from "@/api"; import { errorResponse, jsonResponse, response } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { getLogger } from "@logtape/logtape"; import { @@ -10,7 +11,6 @@ import { import type { Entity } from "@lysand-org/federation/types"; import type { SocketAddress } from "bun"; import { and, eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { matches } from "ip-matching"; import { z } from "zod"; import { type ValidationError, isValidationError } from "zod-validation-error"; diff --git a/server/api/users/:uuid/index.ts b/server/api/users/:uuid/index.ts index a52c0f46..10027eed 100644 --- a/server/api/users/:uuid/index.ts +++ b/server/api/users/:uuid/index.ts @@ -1,7 +1,7 @@ import { applyConfig, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; -import type { Hono } from "hono"; import { z } from "zod"; import { User } from "~/packages/database-interface/user"; diff --git a/server/api/users/:uuid/outbox/index.ts b/server/api/users/:uuid/outbox/index.ts index e6e3ae99..73715547 100644 --- a/server/api/users/:uuid/outbox/index.ts +++ b/server/api/users/:uuid/outbox/index.ts @@ -1,8 +1,8 @@ import { applyConfig, handleZodError } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { and, count, eq, inArray } from "drizzle-orm"; -import type { Hono } from "hono"; import { z } from "zod"; import { db } from "~/drizzle/db"; import { Notes } from "~/drizzle/schema"; diff --git a/server/api/well-known/host-meta/index.ts b/server/api/well-known/host-meta/index.ts index 4b3c37c2..36754d77 100644 --- a/server/api/well-known/host-meta/index.ts +++ b/server/api/well-known/host-meta/index.ts @@ -1,6 +1,6 @@ import { applyConfig } from "@/api"; import { xmlResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { config } from "~/packages/config-manager"; export const meta = applyConfig({ diff --git a/server/api/well-known/jwks/index.ts b/server/api/well-known/jwks/index.ts index 5a0f0ab7..2b43ae81 100644 --- a/server/api/well-known/jwks/index.ts +++ b/server/api/well-known/jwks/index.ts @@ -1,6 +1,6 @@ import { applyConfig } from "@/api"; import { jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { exportJWK } from "jose"; import { config } from "~/packages/config-manager"; diff --git a/server/api/well-known/lysand.ts b/server/api/well-known/lysand.ts index f64f1447..cd783620 100644 --- a/server/api/well-known/lysand.ts +++ b/server/api/well-known/lysand.ts @@ -1,8 +1,8 @@ import { applyConfig } from "@/api"; import { urlToContentFormat } from "@/content_types"; import { jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import type { ServerMetadata } from "@lysand-org/federation/types"; -import type { Hono } from "hono"; import pkg from "~/package.json"; import { config } from "~/packages/config-manager"; diff --git a/server/api/well-known/nodeinfo/2.0/index.ts b/server/api/well-known/nodeinfo/2.0/index.ts index 69191b74..b539f79f 100644 --- a/server/api/well-known/nodeinfo/2.0/index.ts +++ b/server/api/well-known/nodeinfo/2.0/index.ts @@ -1,6 +1,6 @@ import { applyConfig } from "@/api"; import { jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import manifest from "~/package.json"; export const meta = applyConfig({ diff --git a/server/api/well-known/nodeinfo/index.ts b/server/api/well-known/nodeinfo/index.ts index d580f44c..ef6663fd 100644 --- a/server/api/well-known/nodeinfo/index.ts +++ b/server/api/well-known/nodeinfo/index.ts @@ -1,6 +1,6 @@ import { applyConfig } from "@/api"; import { redirect } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { config } from "~/packages/config-manager"; export const meta = applyConfig({ diff --git a/server/api/well-known/openid-configuration/index.ts b/server/api/well-known/openid-configuration/index.ts index 56115e97..33fcc98b 100644 --- a/server/api/well-known/openid-configuration/index.ts +++ b/server/api/well-known/openid-configuration/index.ts @@ -1,6 +1,6 @@ import { applyConfig } from "@/api"; import { jsonResponse } from "@/response"; -import type { Hono } from "hono"; +import type { Hono } from "@hono/hono"; import { config } from "~/packages/config-manager"; export const meta = applyConfig({ diff --git a/server/api/well-known/webfinger/index.ts b/server/api/well-known/webfinger/index.ts index 036c37ee..58022380 100644 --- a/server/api/well-known/webfinger/index.ts +++ b/server/api/well-known/webfinger/index.ts @@ -5,9 +5,9 @@ import { webfingerMention, } from "@/api"; import { errorResponse, jsonResponse } from "@/response"; +import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; import { eq } from "drizzle-orm"; -import type { Hono } from "hono"; import { lookup } from "mime-types"; import { z } from "zod"; import { Users } from "~/drizzle/schema"; diff --git a/tests/utils.ts b/tests/utils.ts index 31e0e331..3a30cb38 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -17,14 +17,16 @@ if (config.sonic.enabled) { await searchManager.connect(); } +const app = await appFactory(); + /** * This allows us to send a test request to the server even when it isnt running * @param req Request to send * @returns Response from the server */ -export async function sendTestRequest(req: Request): Promise { +export function sendTestRequest(req: Request): Promise { // return fetch(req); - return Promise.resolve((await appFactory()).fetch(req)); + return Promise.resolve(app.fetch(req)); } export function wrapRelativeUrl(url: string, baseUrl: string) { diff --git a/types/api.ts b/types/api.ts index 03f3e35b..5630dfef 100644 --- a/types/api.ts +++ b/types/api.ts @@ -1,5 +1,5 @@ -import type { Hono } from "hono"; -import type { RouterRoute } from "hono/types"; +import type { Hono } from "@hono/hono"; +import type { RouterRoute } from "@hono/hono/types"; import type { z } from "zod"; import type { RolePermissions } from "~/drizzle/schema"; diff --git a/utils/api.ts b/utils/api.ts index 6c339fc9..efc960d0 100644 --- a/utils/api.ts +++ b/utils/api.ts @@ -1,13 +1,13 @@ import { errorResponse } from "@/response"; +import type { Context } from "@hono/hono"; +import { createMiddleware } from "@hono/hono/factory"; +import type { StatusCode } from "@hono/hono/utils/http-status"; +import { validator } from "@hono/hono/validator"; import { getLogger } from "@logtape/logtape"; import { extractParams, verifySolution } from "altcha-lib"; import chalk from "chalk"; import { config } from "config-manager"; import { eq } from "drizzle-orm"; -import type { Context } from "hono"; -import { createMiddleware } from "hono/factory"; -import type { StatusCode } from "hono/utils/http-status"; -import { validator } from "hono/validator"; import { anyOf, caseInsensitive, @@ -110,7 +110,7 @@ export const handleZodError = ( result: | { success: true; data?: object } | { success: false; error: z.ZodError; data?: object }, - _context: Context, + _context: unknown, ) => { if (!result.success) { return errorResponse(fromZodError(result.error).message, 422); @@ -127,7 +127,8 @@ const returnContextError = ( context: Context, error: string, code?: StatusCode, -) => { + // @ts-expect-error The return type is too complex for TypeScript to work with, but it's fine since this isn't a library +): ReturnType => { const templateError = errorResponse(error, code); return context.json( @@ -197,7 +198,7 @@ const checkRouteNeedsAuth = ( export const checkRouteNeedsChallenge = async ( challengeData: ApiRouteMetadata["challenge"], context: Context, -) => { +): Promise> => { if (!challengeData) { return true; } @@ -357,12 +358,9 @@ export const setContextFormDataToObject = ( context: Context, setTo: object, ): Context => { - // @ts-expect-error HACK - context.req.bodyCache.formData = setTo; - context.req.parseBody = async () => - context.req.bodyCache.formData as FormData; - context.req.formData = async () => - context.req.bodyCache.formData as FormData; + context.req.bodyCache.json = setTo; + context.req.parseBody = async () => context.req.bodyCache.json; + context.req.json = async () => context.req.bodyCache.json; return context; }; @@ -382,6 +380,7 @@ export const jsonOrForm = () => { const parsed = await parseUrlEncoded(context); setContextFormDataToObject(context, parsed); + context.req.raw.headers.set("Content-Type", "application/json"); } else if (contentType?.includes("multipart/form-data")) { const { parsed, files } = await parseFormData(context); @@ -389,6 +388,10 @@ export const jsonOrForm = () => { ...parsed, ...Object.fromEntries(files), }); + context.req.raw.headers.set("Content-Type", "application/json"); + } else if (!contentType) { + setContextFormDataToObject(context, {}); + context.req.raw.headers.set("Content-Type", "application/json"); } await next(); diff --git a/utils/server.ts b/utils/server.ts index d32dd826..902f05e0 100644 --- a/utils/server.ts +++ b/utils/server.ts @@ -1,5 +1,5 @@ +import type { Hono } from "@hono/hono"; import type { Config } from "config-manager"; -import type { Hono } from "hono"; export const createServer = (config: Config, app: Hono) => Bun.serve({