diff --git a/packages/helpers/prune-nullish-values.ts b/packages/helpers/prune-nullish-values.ts index 19f066a..1ce4b5a 100644 --- a/packages/helpers/prune-nullish-values.ts +++ b/packages/helpers/prune-nullish-values.ts @@ -8,7 +8,9 @@ export function pruneNullishValues(input: T): PruneNullishValues { if (Array.isArray(input)) { return input .filter(Boolean) - .map((item) => pruneNullishValues(item)) as PruneNullishValues + .map( + (item) => pruneNullishValues(item) as unknown, + ) as PruneNullishValues } const result: Record = {} diff --git a/packages/helpers/with-logged-method-calls.ts b/packages/helpers/with-logged-method-calls.ts index 2dc864a..424c414 100644 --- a/packages/helpers/with-logged-method-calls.ts +++ b/packages/helpers/with-logged-method-calls.ts @@ -17,7 +17,7 @@ export function withLoggedMethodCalls(value: T) { ) .join(", ")})`, ) - return value.apply(target, values) + return value.apply(target, values) as unknown } }, }) as T diff --git a/packages/reacord/library/core/component-event.ts b/packages/reacord/library/core/component-event.ts index c6d3429..62c7d6f 100644 --- a/packages/reacord/library/core/component-event.ts +++ b/packages/reacord/library/core/component-event.ts @@ -97,6 +97,6 @@ export interface UserInfo { username: string discriminator: string tag: string - avatarUrl: string + avatarUrl: string | null accentColor?: number } diff --git a/packages/reacord/library/core/components/select.tsx b/packages/reacord/library/core/components/select.tsx index c937444..f122cf0 100644 --- a/packages/reacord/library/core/components/select.tsx +++ b/packages/reacord/library/core/components/select.tsx @@ -11,6 +11,7 @@ import type { import { Node } from "../../internal/node.js" import type { ComponentEvent } from "../component-event" import { OptionNode } from "./option-node" +import { omit } from "@reacord/helpers/omit.js" /** @category Select */ export interface SelectProps { @@ -102,12 +103,13 @@ class SelectNode extends Node { values, minValues = 0, maxValues = 25, - children, - onChange, - onChangeValue, - onChangeMultiple, ...props - } = this.props + } = omit(this.props, [ + "children", + "onChange", + "onChangeValue", + "onChangeMultiple", + ]) const item: ActionRowItem = { ...props, diff --git a/packages/reacord/library/core/reacord-discord-js.ts b/packages/reacord/library/core/reacord-discord-js.ts index 6412818..458ff86 100644 --- a/packages/reacord/library/core/reacord-discord-js.ts +++ b/packages/reacord/library/core/reacord-discord-js.ts @@ -237,7 +237,7 @@ export class ReacordDiscordJs extends Reacord { ...pruneNullishValues( pick(interaction.user, ["id", "username", "discriminator", "tag"]), ), - avatarUrl: interaction.user.avatarURL()!, + avatarUrl: interaction.user.avatarURL(), accentColor: interaction.user.accentColor ?? undefined, } diff --git a/packages/reacord/library/core/reacord.tsx b/packages/reacord/library/core/reacord.tsx index 5cb3bf0..02eba7e 100644 --- a/packages/reacord/library/core/reacord.tsx +++ b/packages/reacord/library/core/reacord.tsx @@ -38,13 +38,13 @@ export abstract class Reacord { } protected createInstance(renderer: Renderer, initialContent?: ReactNode) { - if (this.renderers.length > this.maxInstances) { - this.deactivate(this.renderers[0]!) + if (this.renderers.length > this.maxInstances && this.renderers[0]) { + this.deactivate(this.renderers[0]) } this.renderers.push(renderer) - const container = reconciler.createContainer( + const container: unknown = reconciler.createContainer( renderer, 0, null, diff --git a/packages/reacord/library/internal/reconciler.ts b/packages/reacord/library/internal/reconciler.ts index 062f202..1737f8a 100644 --- a/packages/reacord/library/internal/reconciler.ts +++ b/packages/reacord/library/internal/reconciler.ts @@ -41,7 +41,7 @@ const config: HostConfig< raise(`Missing createNode function`) } - const node = props.createNode(props.props) + const node: unknown = props.createNode(props.props) if (!(node instanceof Node)) { raise(`createNode function did not return a Node`) } diff --git a/packages/reacord/scripts/discordjs-manual-test.tsx b/packages/reacord/scripts/discordjs-manual-test.tsx index 96cbf39..3a06058 100644 --- a/packages/reacord/scripts/discordjs-manual-test.tsx +++ b/packages/reacord/scripts/discordjs-manual-test.tsx @@ -1,3 +1,4 @@ +import { raise } from "@reacord/helpers/raise.js" import { Button, Link, @@ -18,9 +19,13 @@ const reacord = new ReacordDiscordJs(client) await client.login(process.env.TEST_BOT_TOKEN) -const guild = await client.guilds.fetch(process.env.TEST_GUILD_ID!) +const guild = await client.guilds.fetch( + process.env.TEST_GUILD_ID ?? raise("TEST_GUILD_ID not defined"), +) -const category = await guild.channels.fetch(process.env.TEST_CATEGORY_ID!) +const category = await guild.channels.fetch( + process.env.TEST_CATEGORY_ID ?? raise("TEST_CATEGORY_ID not defined"), +) if (category?.type !== ChannelType.GuildCategory) { throw new Error( `channel ${process.env.TEST_CATEGORY_ID} is not a guild category. received ${category?.type}`, diff --git a/packages/reacord/test/commonjs-require.test.ts b/packages/reacord/test/commonjs-require.test.ts index 15f51bf..6959e40 100644 --- a/packages/reacord/test/commonjs-require.test.ts +++ b/packages/reacord/test/commonjs-require.test.ts @@ -8,5 +8,5 @@ beforeAll(() => { test("can require commonjs", () => { const require = createRequire(import.meta.url) - expect(() => require("../dist/main.cjs")).not.toThrow() + expect(() => require("../dist/main.cjs") as unknown).not.toThrow() }) diff --git a/packages/reacord/test/select.test.tsx b/packages/reacord/test/select.test.tsx index 4bf7d99..895b1f7 100644 --- a/packages/reacord/test/select.test.tsx +++ b/packages/reacord/test/select.test.tsx @@ -128,13 +128,17 @@ test("multiple select", async () => { await tester.findSelectByPlaceholder("select").select("1", "3") await assertSelect(expect.arrayContaining(["1", "3"]) as unknown as string[]) expect(onSelect).toHaveBeenCalledWith( - expect.objectContaining({ values: expect.arrayContaining(["1", "3"]) }), + expect.objectContaining({ + values: expect.arrayContaining(["1", "3"]) as unknown, + }), ) await tester.findSelectByPlaceholder("select").select("2") await assertSelect(expect.arrayContaining(["2"]) as unknown as string[]) expect(onSelect).toHaveBeenCalledWith( - expect.objectContaining({ values: expect.arrayContaining(["2"]) }), + expect.objectContaining({ + values: expect.arrayContaining(["2"]) as unknown, + }), ) await tester.findSelectByPlaceholder("select").select() diff --git a/packages/website/package.json b/packages/website/package.json index 8cdb0bf..b9991bf 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -18,6 +18,7 @@ "@fontsource/jetbrains-mono": "^4.5.12", "@fontsource/rubik": "^4.5.14", "@heroicons/react": "^2.0.18", + "@reacord/helpers": "workspace:^", "@tailwindcss/typography": "^0.5.10", "astro": "^2.10.9", "clsx": "^2.0.0", diff --git a/packages/website/src/components/landing-animation.tsx b/packages/website/src/components/landing-animation.tsx index 0fc632f..010deb6 100644 --- a/packages/website/src/components/landing-animation.tsx +++ b/packages/website/src/components/landing-animation.tsx @@ -3,6 +3,7 @@ import { useEffect, useRef, useState } from "react" import blobComfyUrl from "~/assets/blob-comfy.png" import cursorIbeamUrl from "~/assets/cursor-ibeam.png" import cursorUrl from "~/assets/cursor.png" +import { raise } from "@reacord/helpers/raise.ts" const defaultState = { chatInputText: "", @@ -70,7 +71,7 @@ export function LandingAnimation() { count: state.count + 1, chatInputCursorVisible: false, })) - animateClick(addRef.current!) + animateClick(addRef.current ?? raise("addRef is null")) await delay(700) } @@ -82,7 +83,7 @@ export function LandingAnimation() { })) await delay(1000) - animateClick(deleteRef.current!) + animateClick(deleteRef.current ?? raise("deleteRef is null")) setState((state) => ({ ...state, messageVisible: false })) await delay(1000) @@ -105,16 +106,19 @@ export function LandingAnimation() { void (async () => { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition while (running) { + const cursor = cursorRef.current ?? raise("cursorRef is null") + const chatInput = chatInputRef.current ?? raise("chatInputRef is null") + // check if the cursor is in the input - const cursorRect = cursorRef.current!.getBoundingClientRect() - const chatInputRect = chatInputRef.current!.getBoundingClientRect() + const cursorRect = cursor.getBoundingClientRect() + const chatInputRect = chatInput.getBoundingClientRect() const isOverInput = cursorRef.current && chatInputRef.current && cursorRect.top + cursorRect.height / 2 > chatInputRect.top - cursorRef.current!.src = isOverInput ? cursorIbeamUrl : cursorUrl + cursor.src = isOverInput ? cursorIbeamUrl : cursorUrl await animationFrame() } diff --git a/packages/website/src/components/main-navigation.astro b/packages/website/src/components/main-navigation.astro index 65b4a8a..1e1539f 100644 --- a/packages/website/src/components/main-navigation.astro +++ b/packages/website/src/components/main-navigation.astro @@ -1,8 +1,8 @@ --- import { - ArrowTopRightOnSquareIcon, - CodeBracketIcon, - DocumentTextIcon, + ArrowTopRightOnSquareIcon, + CodeBracketIcon, + DocumentTextIcon, } from "@heroicons/react/20/solid" import { Bars3Icon } from "@heroicons/react/24/outline" import { getCollection } from "astro:content" @@ -12,69 +12,70 @@ import MenuItem from "./menu-item.astro" import Menu from "./menu.astro" const links = [ - { - href: "/guides/getting-started", - label: "Guides", - icon: DocumentTextIcon, - component: "a", - prefetch: true, - }, - { - href: "/api/", - label: "API Reference", - icon: CodeBracketIcon, - component: "a", - }, - { - href: "https://github.com/itsMapleLeaf/reacord", - label: "GitHub", - icon: ArrowTopRightOnSquareIcon, - component: ExternalLink, - }, + { + href: "/guides/getting-started", + label: "Guides", + icon: DocumentTextIcon, + component: "a", + prefetch: true, + }, + { + href: "/api/", + label: "API Reference", + icon: CodeBracketIcon, + component: "a", + }, + { + href: "https://github.com/itsMapleLeaf/reacord", + label: "GitHub", + icon: ArrowTopRightOnSquareIcon, + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + component: ExternalLink, + }, ] const guides = await getCollection("guides") --- -