bot,db: use correct types for components
vi did:web:vt3e.cat
Mon, 29 Jun 2026 02:10:04 +0100
6 files changed,
25 insertions(+),
10 deletions(-)
M
apps/bot/src/feats/tickets/listeners.ts
→
apps/bot/src/feats/tickets/listeners.ts
@@ -2,6 +2,8 @@ import type { Message } from "discord.js";
import { Result } from "@sapphire/framework"; import { + type APIEmbed, + type APIMessageTopLevelComponent, createTicketMessageWithAttachments, deleteTicketMessage, editTicket,@@ -151,6 +153,11 @@ content: `Attachments uploaded successfully.\n${renderBoard(attachmentStatuses)}`,
}); } + const components: APIMessageTopLevelComponent[] = message.components.map((component) => + component.toJSON(), + ); + const embeds: APIEmbed[] = message.embeds.map((embed) => embed.toJSON()); + const messageResult = await Result.fromAsync( await createTicketMessageWithAttachments({ id: messageId,@@ -160,8 +167,8 @@ messageId: message.id,
content: anonymisedContent, actorRole: role, isPrivate: isThread, - embeds: message.embeds, - components: message.components, + embeds: embeds, + components: components, attachments: attachmentStatuses.map((status) => ({ id: status.uploadedUrl!, fileName: status.fileName,
M
bun.lock
→
bun.lock
@@ -23,6 +23,7 @@ "name": "@stealth-developers/api",
"version": "1.0.50", "dependencies": { "@elysia/cors": "^1.4.2", + "@elysia/openapi": "^1.4.15", "@stealth-developers/config": "workspace:*", "@stealth-developers/db": "workspace:*", "elysia": "latest",@@ -90,7 +91,7 @@ "pkgs/db": {
"name": "@stealth-developers/db", "dependencies": { "@libsql/client": "^0.17.4", - "discord.js": "^14.26.4", + "discord-api-types": "^0.38.49", "drizzle-orm": "v1.0.0-rc.3", }, "devDependencies": {@@ -121,6 +122,8 @@
"@drizzle-team/brocli": ["@drizzle-team/brocli@0.11.0", "", {}, "sha512-hD3pekGiPg0WPCCGAZmusBBJsDqGUR66Y452YgQsZOnkdQ7ViEPKuyP4huUGEZQefp8g34RRodXYmJ2TbCH+tg=="], "@elysia/cors": ["@elysia/cors@1.4.2", "", { "peerDependencies": { "elysia": ">= 1.4.0" } }, "sha512-dXkfo1IxZWJkJReNYnPJorJqb+XpWno0D/YWlMEJSkiFIFd751zJ4R/YswAYdo88mLWo8cycEj673o7L+gbxsw=="], + + "@elysia/openapi": ["@elysia/openapi@1.4.15", "", { "peerDependencies": { "elysia": ">= 1.4.0" } }, "sha512-MrVGCPo5hnRF4/yWGOyH5ddjt4DlSIbeC5rrkupQtHY8TEQe+XdJa2YM9aUOrtgtRcy4UNGyiVlLl/jllPkPQA=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],@@ -557,6 +560,8 @@
"@sapphire/pieces/@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="], "@stealth-developers/bot/typescript": ["typescript@5.4.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ=="], + + "@stealth-developers/db/discord-api-types": ["discord-api-types@0.38.49", "", {}, "sha512-XnqcWmnFZFAE8ZM8SHAw9DIV8D3Or00rMQ8iQLotrEA2PmXhl+ykaf6L6q4l474hrSUH1JaYcv+iOMRWp2p6Tg=="], "@stealth-developers/migration/drizzle-kit": ["drizzle-kit@1.0.0-rc.4-ca0f029", "", { "dependencies": { "@drizzle-team/brocli": "^0.11.0", "@js-temporal/polyfill": "^0.5.1", "esbuild": "^0.25.10", "get-tsconfig": "^4.13.6", "jiti": "^2.6.1" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-hM1K72ptIPOpJDScHo7cAF+K8A8Tr3q2yHvBJvOZWvLn2lN+G4RDUvG3rT3ohlSE2O3BN/s7g3e3JiQLStt8iQ=="],
M
pkgs/db/package.json
→
pkgs/db/package.json
@@ -8,7 +8,7 @@ "db": "bun ./scripts/db.ts"
}, "dependencies": { "@libsql/client": "^0.17.4", - "discord.js": "^14.26.4", + "discord-api-types": "^0.38.49", "drizzle-orm": "v1.0.0-rc.3" }, "devDependencies": {
M
pkgs/db/src/index.ts
→
pkgs/db/src/index.ts
@@ -1,3 +1,5 @@
+import type { APIEmbed, APIMessageTopLevelComponent } from "discord-api-types/v10"; + import { createClient } from "@libsql/client"; import config from "@stealth-developers/config"; import { drizzle } from "drizzle-orm/libsql";@@ -18,4 +20,5 @@
export * from "./schemas"; export * from "./utils"; export * from "drizzle-orm"; +export type { APIEmbed, APIMessageTopLevelComponent }; export default db;
M
pkgs/db/src/schemas/tickets.ts
→
pkgs/db/src/schemas/tickets.ts
@@ -1,4 +1,4 @@
-import type { Embed, TopLevelComponent } from "discord.js"; +import type { APIEmbed, APIMessageTopLevelComponent } from "discord-api-types/v10"; import * as s from "drizzle-orm/sqlite-core";@@ -101,8 +101,8 @@
isPrivate: s.integer("is_private", { mode: "boolean" }).notNull().default(false), content: s.text("content").notNull(), - embeds: s.text("embeds", { mode: "json" }).$type<Embed[]>(), - components: s.text("components", { mode: "json" }).$type<TopLevelComponent[]>(), + embeds: s.text("embeds", { mode: "json" }).$type<APIEmbed[]>(), + components: s.text("components", { mode: "json" }).$type<APIMessageTopLevelComponent[]>(), createdAt: s.integer("created_at", { mode: "timestamp" }).notNull(), editedAt: s.integer("edited_at", { mode: "timestamp" }),
M
pkgs/db/src/utils/ticket.ts
→
pkgs/db/src/utils/ticket.ts
@@ -1,4 +1,4 @@
-import type { Embed, TopLevelComponent } from "discord.js"; +import type { APIEmbed, APIMessageTopLevelComponent } from "discord-api-types/v10"; import { and, desc, eq, inArray, or } from "drizzle-orm"; import { randomUUID } from "node:crypto";@@ -488,8 +488,8 @@ messageId?: string | null;
content: string; actorRole: "participant" | "moderator" | "subject" | "bot"; isPrivate?: boolean; - embeds?: Embed[]; - components?: TopLevelComponent[]; + embeds?: APIEmbed[]; + components?: APIMessageTopLevelComponent[]; attachments?: { id: string; fileName: string;