all repos — stealth-developers @ 60c7770aaf3859b7ded2371dd62d6e72be931242

bot,db: use correct types for components
vi did:web:vt3e.cat
Mon, 29 Jun 2026 02:10:04 +0100
commit

60c7770aaf3859b7ded2371dd62d6e72be931242

parent

750b579d9db8101d4b6ffdd2f814de11d899963e

M apps/bot/src/feats/tickets/listeners.tsapps/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.lockbun.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.jsonpkgs/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.tspkgs/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.tspkgs/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.tspkgs/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;