From 14d6f87dda8e42ec407a56cd3c2a0df14b34c7ae Mon Sep 17 00:00:00 2001 From: itsMapleLeaf <19603573+itsMapleLeaf@users.noreply.github.com> Date: Thu, 4 Aug 2022 10:29:06 -0500 Subject: [PATCH] untested rewrite --- .../reacord/library/components/action-row.tsx | 16 +- .../reacord/library/components/button.tsx | 2 +- .../library/components/embed-author.tsx | 22 +- .../library/components/embed-field.tsx | 34 +- .../library/components/embed-footer.tsx | 32 +- .../library/components/embed-image.tsx | 11 +- .../library/components/embed-thumbnail.tsx | 11 +- .../library/components/embed-title.tsx | 20 +- packages/reacord/library/components/embed.tsx | 46 +- packages/reacord/library/components/link.tsx | 25 +- .../reacord/library/components/option-node.ts | 19 - .../reacord/library/components/option.tsx | 14 +- .../reacord/library/components/select.tsx | 74 +-- .../library/make-message-update-payload.ts | 244 ++++++++++ packages/reacord/library/node.ts | 16 + .../{reacord-client.tsx => reacord-client.ts} | 10 +- .../element.ts => reacord-element.ts} | 0 packages/reacord/library/reacord-instance.ts | 16 +- packages/reacord/library/reconciler.ts | 3 +- packages/reacord/library/renderer.ts | 61 ++- packages/reacord/library/text-node.ts | 3 - packages/reacord/package.json | 10 +- .../reacord/scripts/discordjs-manual-test.tsx | 18 +- pnpm-lock.yaml | 441 +++++++++--------- 24 files changed, 640 insertions(+), 508 deletions(-) delete mode 100644 packages/reacord/library/components/option-node.ts create mode 100644 packages/reacord/library/make-message-update-payload.ts rename packages/reacord/library/{reacord-client.tsx => reacord-client.ts} (93%) rename packages/reacord/library/{internal/element.ts => reacord-element.ts} (100%) delete mode 100644 packages/reacord/library/text-node.ts diff --git a/packages/reacord/library/components/action-row.tsx b/packages/reacord/library/components/action-row.tsx index b067032..e16a3ca 100644 --- a/packages/reacord/library/components/action-row.tsx +++ b/packages/reacord/library/components/action-row.tsx @@ -1,8 +1,7 @@ import type { ReactNode } from "react" import React from "react" -import { ReacordElement } from "../internal/element.js" -import type { MessageOptions } from "../../internal/message" -import { Node } from "../internal/node.js" +import { Node } from "../node.js" +import { ReacordElement } from "../reacord-element.js" /** * Props for an action row @@ -31,17 +30,10 @@ export type ActionRowProps = { */ export function ActionRow(props: ActionRowProps) { return ( - new ActionRowNode(props)}> + new ActionRowNode({})}> {props.children} ) } -class ActionRowNode extends Node<{}> { - override modifyMessageOptions(options: MessageOptions): void { - options.actionRows.push([]) - for (const child of this.children) { - child.modifyMessageOptions(options) - } - } -} +export class ActionRowNode extends Node<{}> {} diff --git a/packages/reacord/library/components/button.tsx b/packages/reacord/library/components/button.tsx index 8972f36..e70b62e 100644 --- a/packages/reacord/library/components/button.tsx +++ b/packages/reacord/library/components/button.tsx @@ -2,8 +2,8 @@ import type { APIMessageComponentButtonInteraction } from "discord.js" import { randomUUID } from "node:crypto" import React from "react" import type { ComponentEvent } from "../core/component-event.js" -import { ReacordElement } from "../internal/element.js" import { Node } from "../node.js" +import { ReacordElement } from "../reacord-element.js" import type { ButtonSharedProps } from "./button-shared-props" /** diff --git a/packages/reacord/library/components/embed-author.tsx b/packages/reacord/library/components/embed-author.tsx index 5316770..450715b 100644 --- a/packages/reacord/library/components/embed-author.tsx +++ b/packages/reacord/library/components/embed-author.tsx @@ -1,9 +1,7 @@ import type { ReactNode } from "react" import React from "react" -import { ReacordElement } from "../internal/element.js" -import { Node } from "../internal/node.js" -import { EmbedChildNode } from "./embed-child.js" -import type { EmbedOptions } from "./embed-options" +import { Node } from "../node.js" +import { ReacordElement } from "../reacord-element.js" /** * @category Embed @@ -21,21 +19,9 @@ export type EmbedAuthorProps = { export function EmbedAuthor(props: EmbedAuthorProps) { return ( new EmbedAuthorNode(props)}> - new AuthorTextNode({})}> - {props.name ?? props.children} - + {props.name ?? props.children} ) } -class EmbedAuthorNode extends EmbedChildNode { - override modifyEmbedOptions(options: EmbedOptions): void { - options.author = { - name: this.children.findType(AuthorTextNode)?.text ?? "", - url: this.props.url, - icon_url: this.props.iconUrl, - } - } -} - -class AuthorTextNode extends Node<{}> {} +export class EmbedAuthorNode extends Node {} diff --git a/packages/reacord/library/components/embed-field.tsx b/packages/reacord/library/components/embed-field.tsx index 08a5e8f..782296b 100644 --- a/packages/reacord/library/components/embed-field.tsx +++ b/packages/reacord/library/components/embed-field.tsx @@ -1,9 +1,7 @@ import type { ReactNode } from "react" import React from "react" -import { ReacordElement } from "../internal/element.js" -import { Node } from "../internal/node.js" -import { EmbedChildNode } from "./embed-child.js" -import type { EmbedOptions } from "./embed-options" +import { Node } from "../node.js" +import { ReacordElement } from "../reacord-element.js" /** * @category Embed @@ -21,26 +19,26 @@ export type EmbedFieldProps = { export function EmbedField(props: EmbedFieldProps) { return ( new EmbedFieldNode(props)}> - new FieldNameNode({})}> + new EmbedFieldNameNode({})}> {props.name} - new FieldValueNode({})}> - {props.value || props.children} + new EmbedFieldValueNode({})}> + {props.value ?? props.children} ) } -class EmbedFieldNode extends EmbedChildNode { - override modifyEmbedOptions(options: EmbedOptions): void { - options.fields ??= [] - options.fields.push({ - name: this.children.findType(FieldNameNode)?.text ?? "", - value: this.children.findType(FieldValueNode)?.text ?? "", - inline: this.props.inline, - }) - } +export class EmbedFieldNode extends Node { + // override modifyEmbedOptions(options: EmbedOptions): void { + // options.fields ??= [] + // options.fields.push({ + // name: this.children.findType(FieldNameNode)?.text ?? "", + // value: this.children.findType(FieldValueNode)?.text ?? "", + // inline: this.props.inline, + // }) + // } } -class FieldNameNode extends Node<{}> {} -class FieldValueNode extends Node<{}> {} +export class EmbedFieldNameNode extends Node<{}> {} +export class EmbedFieldValueNode extends Node<{}> {} diff --git a/packages/reacord/library/components/embed-footer.tsx b/packages/reacord/library/components/embed-footer.tsx index b3ca2f9..5e944dc 100644 --- a/packages/reacord/library/components/embed-footer.tsx +++ b/packages/reacord/library/components/embed-footer.tsx @@ -1,9 +1,7 @@ import type { ReactNode } from "react" import React from "react" -import { ReacordElement } from "../internal/element.js" -import { Node } from "../internal/node.js" -import { EmbedChildNode } from "./embed-child.js" -import type { EmbedOptions } from "./embed-options" +import { Node } from "../node.js" +import { ReacordElement } from "../reacord-element.js" /** * @category Embed @@ -21,25 +19,21 @@ export type EmbedFooterProps = { export function EmbedFooter({ text, children, ...props }: EmbedFooterProps) { return ( new EmbedFooterNode(props)}> - new FooterTextNode({})}> - {text ?? children} - + {text ?? children} ) } -class EmbedFooterNode extends EmbedChildNode< +export class EmbedFooterNode extends Node< Omit > { - override modifyEmbedOptions(options: EmbedOptions): void { - options.footer = { - text: this.children.findType(FooterTextNode)?.text ?? "", - icon_url: this.props.iconUrl, - } - options.timestamp = this.props.timestamp - ? new Date(this.props.timestamp).toISOString() - : undefined - } + // override modifyEmbedOptions(options: EmbedOptions): void { + // options.footer = { + // text: this.children.findType(FooterTextNode)?.text ?? "", + // icon_url: this.props.iconUrl, + // } + // options.timestamp = this.props.timestamp + // ? new Date(this.props.timestamp).toISOString() + // : undefined + // } } - -class FooterTextNode extends Node<{}> {} diff --git a/packages/reacord/library/components/embed-image.tsx b/packages/reacord/library/components/embed-image.tsx index c1e518b..3906c0f 100644 --- a/packages/reacord/library/components/embed-image.tsx +++ b/packages/reacord/library/components/embed-image.tsx @@ -1,7 +1,6 @@ import React from "react" -import { ReacordElement } from "../internal/element.js" -import { EmbedChildNode } from "./embed-child.js" -import type { EmbedOptions } from "./embed-options" +import { Node } from "../node" +import { ReacordElement } from "../reacord-element.js" /** * @category Embed @@ -22,8 +21,4 @@ export function EmbedImage(props: EmbedImageProps) { ) } -class EmbedImageNode extends EmbedChildNode { - override modifyEmbedOptions(options: EmbedOptions): void { - options.image = { url: this.props.url } - } -} +export class EmbedImageNode extends Node {} diff --git a/packages/reacord/library/components/embed-thumbnail.tsx b/packages/reacord/library/components/embed-thumbnail.tsx index 98a9087..4c6bec4 100644 --- a/packages/reacord/library/components/embed-thumbnail.tsx +++ b/packages/reacord/library/components/embed-thumbnail.tsx @@ -1,7 +1,6 @@ import React from "react" -import { ReacordElement } from "../internal/element.js" -import { EmbedChildNode } from "./embed-child.js" -import type { EmbedOptions } from "./embed-options" +import { Node } from "../node" +import { ReacordElement } from "../reacord-element.js" /** * @category Embed @@ -22,8 +21,4 @@ export function EmbedThumbnail(props: EmbedThumbnailProps) { ) } -class EmbedThumbnailNode extends EmbedChildNode { - override modifyEmbedOptions(options: EmbedOptions): void { - options.thumbnail = { url: this.props.url } - } -} +export class EmbedThumbnailNode extends Node {} diff --git a/packages/reacord/library/components/embed-title.tsx b/packages/reacord/library/components/embed-title.tsx index 4bbf6c2..09d33be 100644 --- a/packages/reacord/library/components/embed-title.tsx +++ b/packages/reacord/library/components/embed-title.tsx @@ -1,9 +1,8 @@ import type { ReactNode } from "react" import React from "react" -import { ReacordElement } from "../internal/element.js" -import { Node } from "../internal/node.js" -import { EmbedChildNode } from "./embed-child.js" -import type { EmbedOptions } from "./embed-options" +import type { Except } from "type-fest" +import { Node } from "../node" +import { ReacordElement } from "../reacord-element.js" /** * @category Embed @@ -19,18 +18,9 @@ export type EmbedTitleProps = { export function EmbedTitle({ children, ...props }: EmbedTitleProps) { return ( new EmbedTitleNode(props)}> - new TitleTextNode({})}> - {children} - + {children} ) } -class EmbedTitleNode extends EmbedChildNode> { - override modifyEmbedOptions(options: EmbedOptions): void { - options.title = this.children.findType(TitleTextNode)?.text ?? "" - options.url = this.props.url - } -} - -class TitleTextNode extends Node<{}> {} +export class EmbedTitleNode extends Node> {} diff --git a/packages/reacord/library/components/embed.tsx b/packages/reacord/library/components/embed.tsx index 67c43d3..8995953 100644 --- a/packages/reacord/library/components/embed.tsx +++ b/packages/reacord/library/components/embed.tsx @@ -1,12 +1,6 @@ -import { snakeCaseDeep } from "@reacord/helpers/convert-object-property-case.js" -import { omit } from "@reacord/helpers/omit.js" import React from "react" -import type { MessageOptions } from "../../internal/message" -import { ReacordElement } from "../internal/element.js" import { Node } from "../node.js" -import { TextNode } from "../text-node" -import { EmbedChildNode } from "./embed-child.js" -import type { EmbedOptions } from "./embed-options" +import { ReacordElement } from "../reacord-element.js" /** * @category Embed @@ -39,24 +33,22 @@ export function Embed(props: EmbedProps) { ) } -class EmbedNode extends Node { - override modifyMessageOptions(options: MessageOptions): void { - const embed: EmbedOptions = { - ...snakeCaseDeep(omit(this.props, ["children", "timestamp"])), - timestamp: this.props.timestamp - ? new Date(this.props.timestamp).toISOString() - : undefined, - } - - for (const child of this.children) { - if (child instanceof EmbedChildNode) { - child.modifyEmbedOptions(embed) - } - if (child instanceof TextNode) { - embed.description = (embed.description || "") + child.props - } - } - - options.embeds.push(embed) - } +export class EmbedNode extends Node { + // override modifyMessageOptions(options: MessageOptions): void { + // const embed: EmbedOptions = { + // ...snakeCaseDeep(omit(this.props, ["children", "timestamp"])), + // timestamp: this.props.timestamp + // ? new Date(this.props.timestamp).toISOString() + // : undefined, + // } + // for (const child of this.children) { + // if (child instanceof EmbedChildNode) { + // child.modifyEmbedOptions(embed) + // } + // if (child instanceof TextNode) { + // embed.description = (embed.description || "") + child.props + // } + // } + // options.embeds.push(embed) + // } } diff --git a/packages/reacord/library/components/link.tsx b/packages/reacord/library/components/link.tsx index cad0a79..81ec27f 100644 --- a/packages/reacord/library/components/link.tsx +++ b/packages/reacord/library/components/link.tsx @@ -1,8 +1,7 @@ import React from "react" -import { ReacordElement } from "../internal/element.js" -import type { MessageOptions } from "../../internal/message" -import { getNextActionRow } from "../internal/message" -import { Node } from "../internal/node.js" +import type { Except } from "type-fest" +import { Node } from "../node.js" +import { ReacordElement } from "../reacord-element.js" import type { ButtonSharedProps } from "./button-shared-props" /** @@ -21,23 +20,9 @@ export type LinkProps = ButtonSharedProps & { export function Link({ label, children, ...props }: LinkProps) { return ( new LinkNode(props)}> - new LinkTextNode({})}> - {label || children} - + {label || children} ) } -class LinkNode extends Node> { - override modifyMessageOptions(options: MessageOptions): void { - getNextActionRow(options).push({ - type: "link", - disabled: this.props.disabled, - emoji: this.props.emoji, - label: this.children.findType(LinkTextNode)?.text, - url: this.props.url, - }) - } -} - -class LinkTextNode extends Node<{}> {} +export class LinkNode extends Node> {} diff --git a/packages/reacord/library/components/option-node.ts b/packages/reacord/library/components/option-node.ts deleted file mode 100644 index 2b842be..0000000 --- a/packages/reacord/library/components/option-node.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { MessageSelectOptionOptions } from "../../internal/message" -import { Node } from "../node" -import type { OptionProps } from "./option" - -export class OptionNode extends Node< - Omit -> { - get options(): MessageSelectOptionOptions { - return { - label: this.children.findType(OptionLabelNode)?.text ?? this.props.value, - value: this.props.value, - description: this.children.findType(OptionDescriptionNode)?.text, - emoji: this.props.emoji, - } - } -} - -export class OptionLabelNode extends Node<{}> {} -export class OptionDescriptionNode extends Node<{}> {} diff --git a/packages/reacord/library/components/option.tsx b/packages/reacord/library/components/option.tsx index abdf108..2af4384 100644 --- a/packages/reacord/library/components/option.tsx +++ b/packages/reacord/library/components/option.tsx @@ -1,11 +1,7 @@ import type { ReactNode } from "react" import React from "react" -import { ReacordElement } from "../internal/element" -import { - OptionDescriptionNode, - OptionLabelNode, - OptionNode, -} from "./option-node" +import { Node } from "../node" +import { ReacordElement } from "../reacord-element" /** * @category Select @@ -60,3 +56,9 @@ export function Option({ ) } + +export class OptionNode extends Node< + Omit +> {} +export class OptionLabelNode extends Node<{}> {} +export class OptionDescriptionNode extends Node<{}> {} diff --git a/packages/reacord/library/components/select.tsx b/packages/reacord/library/components/select.tsx index 28ef7ec..be5c6c3 100644 --- a/packages/reacord/library/components/select.tsx +++ b/packages/reacord/library/components/select.tsx @@ -1,18 +1,10 @@ -import { isInstanceOf } from "@reacord/helpers/is-instance-of.js" import type { APIMessageComponentSelectMenuInteraction } from "discord.js" import { randomUUID } from "node:crypto" import type { ReactNode } from "react" import React from "react" -import { ReacordElement } from "../internal/element.js" -import type { ComponentInteraction } from "../../internal/interaction" -import type { - ActionRow, - ActionRowItem, - MessageOptions, -} from "../../internal/message" -import { Node } from "../internal/node.js" -import type { ComponentEvent } from "../component-event" -import { OptionNode } from "./option-node" +import type { ComponentEvent } from "../core/component-event.js" +import { Node } from "../node.js" +import { ReacordElement } from "../reacord-element.js" /** * @category Select @@ -100,64 +92,4 @@ export function Select(props: SelectProps) { export class SelectNode extends Node { readonly customId = randomUUID() - - override modifyMessageOptions(message: MessageOptions): void { - const actionRow: ActionRow = [] - message.actionRows.push(actionRow) - - const options = [...this.children] - .filter(isInstanceOf(OptionNode)) - .map((node) => node.options) - - const { - multiple, - value, - values, - minValues = 0, - maxValues = 25, - children, - onChange, - onChangeValue, - onChangeMultiple, - ...props - } = this.props - - const item: ActionRowItem = { - ...props, - type: "select", - customId: this.customId, - options, - values: [], - } - - if (multiple) { - item.minValues = minValues - item.maxValues = maxValues - if (values) item.values = values - } - - if (!multiple && value != undefined) { - item.values = [value] - } - - actionRow.push(item) - } - - override handleComponentInteraction( - interaction: ComponentInteraction, - ): boolean { - const isSelectInteraction = - interaction.type === "select" && - interaction.customId === this.customId && - !this.props.disabled - - if (!isSelectInteraction) return false - - this.props.onChange?.(interaction.event) - this.props.onChangeMultiple?.(interaction.event.values, interaction.event) - if (interaction.event.values[0]) { - this.props.onChangeValue?.(interaction.event.values[0], interaction.event) - } - return true - } } diff --git a/packages/reacord/library/make-message-update-payload.ts b/packages/reacord/library/make-message-update-payload.ts new file mode 100644 index 0000000..08c9e00 --- /dev/null +++ b/packages/reacord/library/make-message-update-payload.ts @@ -0,0 +1,244 @@ +import type { + APIActionRowComponent, + APIButtonComponent, + APIEmbed, + APISelectMenuComponent, + APISelectMenuOption, +} from "discord-api-types/v10" +import { ButtonStyle, ComponentType } from "discord-api-types/v10" +import { ActionRowNode } from "./components/action-row" +import type { ButtonProps } from "./components/button" +import { ButtonNode } from "./components/button" +import { EmbedNode } from "./components/embed" +import { EmbedAuthorNode } from "./components/embed-author" +import { + EmbedFieldNameNode, + EmbedFieldNode, + EmbedFieldValueNode, +} from "./components/embed-field" +import { EmbedFooterNode } from "./components/embed-footer" +import { EmbedImageNode } from "./components/embed-image" +import { EmbedThumbnailNode } from "./components/embed-thumbnail" +import { EmbedTitleNode } from "./components/embed-title" +import { LinkNode } from "./components/link" +import { + OptionDescriptionNode, + OptionLabelNode, + OptionNode, +} from "./components/option" +import { SelectNode } from "./components/select" +import type { Node } from "./node" + +export type MessageUpdatePayload = { + content: string + embeds: APIEmbed[] + components: Array< + APIActionRowComponent + > +} + +export function makeMessageUpdatePayload(root: Node): MessageUpdatePayload { + return { + content: root.extractText(), + embeds: makeEmbeds(root), + components: makeActionRows(root), + } +} + +function makeEmbeds(root: Node) { + const embeds: APIEmbed[] = [] + + for (const node of root.children) { + if (node instanceof EmbedNode) { + const { props, children } = node + + const embed: APIEmbed = { + author: props.author && { + name: props.author.name, + icon_url: props.author.iconUrl, + url: props.author.url, + }, + color: props.color, + description: props.description, + fields: props.fields?.map(({ name, value, inline }) => ({ + name, + value, + inline, + })), + footer: props.footer && { + text: props.footer.text, + icon_url: props.footer.iconUrl, + }, + image: props.image, + thumbnail: props.thumbnail, + title: props.title, + url: props.url, + video: props.video, + } + + if (props.timestamp !== undefined) { + embed.timestamp = normalizeDatePropToISOString(props.timestamp) + } + + applyEmbedChildren(embed, children) + + embeds.push(embed) + } + } + + return embeds +} + +function applyEmbedChildren(embed: APIEmbed, children: Node[]) { + for (const child of children) { + if (child instanceof EmbedAuthorNode) { + embed.author = { + name: child.extractText(), + icon_url: child.props.iconUrl, + url: child.props.url, + } + } + + if (child instanceof EmbedFieldNode) { + embed.fields ??= [] + embed.fields.push({ + name: child.findInstanceOf(EmbedFieldNameNode)?.extractText() ?? "", + value: child.findInstanceOf(EmbedFieldValueNode)?.extractText() ?? "", + inline: child.props.inline, + }) + } + + if (child instanceof EmbedFooterNode) { + embed.footer = { + text: child.extractText(), + icon_url: child.props.iconUrl, + } + if (child.props.timestamp != undefined) { + embed.timestamp = normalizeDatePropToISOString(child.props.timestamp) + } + } + + if (child instanceof EmbedImageNode) { + embed.image = { url: child.props.url } + } + + if (child instanceof EmbedThumbnailNode) { + embed.thumbnail = { url: child.props.url } + } + + if (child instanceof EmbedTitleNode) { + embed.title = child.extractText() + embed.url = child.props.url + } + + if (child instanceof EmbedNode) { + applyEmbedChildren(embed, child.children) + } + } +} + +function normalizeDatePropToISOString(value: string | number | Date) { + return value instanceof Date + ? value.toISOString() + : new Date(value).toISOString() +} + +function makeActionRows(root: Node) { + const actionRows: Array< + APIActionRowComponent + > = [] + + for (const node of root.children) { + let currentRow = actionRows[actionRows.length - 1] + if ( + !currentRow || + currentRow.components.length >= 5 || + currentRow.components[0]?.type === ComponentType.SelectMenu + ) { + currentRow = { + type: ComponentType.ActionRow, + components: [], + } + actionRows.push(currentRow) + } + + if (node instanceof ButtonNode) { + currentRow.components.push({ + type: ComponentType.Button, + custom_id: node.customId, + label: node.extractText(Number.POSITIVE_INFINITY), + emoji: { name: node.props.emoji }, + style: translateButtonStyle(node.props.style ?? "secondary"), + disabled: node.props.disabled, + }) + } + + if (node instanceof LinkNode) { + currentRow.components.push({ + type: ComponentType.Button, + label: node.extractText(Number.POSITIVE_INFINITY), + url: node.props.url, + style: ButtonStyle.Link, + disabled: node.props.disabled, + }) + } + + if (node instanceof SelectNode) { + const actionRow: APIActionRowComponent = { + type: ComponentType.ActionRow, + components: [], + } + actionRows.push(actionRow) + + let selectedValues: string[] = [] + if (node.props.multiple && node.props.values) { + selectedValues = node.props.values ?? [] + } + if (!node.props.multiple && node.props.value != undefined) { + selectedValues = [node.props.value] + } + + const options = [...node.children] + .flatMap((child) => (child instanceof OptionNode ? child : [])) + .map((child) => ({ + label: child.findInstanceOf(OptionLabelNode)?.extractText() ?? "", + description: child + .findInstanceOf(OptionDescriptionNode) + ?.extractText(), + value: child.props.value, + default: selectedValues.includes(child.props.value), + emoji: { name: child.props.emoji }, + })) + + const select: APISelectMenuComponent = { + type: ComponentType.SelectMenu, + custom_id: node.customId, + options, + disabled: node.props.disabled, + } + + if (node.props.multiple) { + select.min_values = node.props.minValues + select.max_values = node.props.maxValues + } + + actionRow.components.push(select) + } + + if (node instanceof ActionRowNode) { + actionRows.push(...makeActionRows(node)) + } + } + + return actionRows +} + +function translateButtonStyle(style: NonNullable) { + const styleMap = { + primary: ButtonStyle.Primary, + secondary: ButtonStyle.Secondary, + danger: ButtonStyle.Danger, + success: ButtonStyle.Success, + } as const + return styleMap[style] +} diff --git a/packages/reacord/library/node.ts b/packages/reacord/library/node.ts index 6cfb5ca..acd4343 100644 --- a/packages/reacord/library/node.ts +++ b/packages/reacord/library/node.ts @@ -38,4 +38,20 @@ export class Node { yield* child.walk() } } + + findInstanceOf( + cls: new (...args: any[]) => T, + ): T | undefined { + for (const child of this.children) { + if (child instanceof cls) return child + } + } + + extractText(depth = 1): string { + if (this instanceof TextNode) return this.props.text + if (depth <= 0) return "" + return this.children.map((child) => child.extractText(depth - 1)).join("") + } } + +export class TextNode extends Node<{ text: string }> {} diff --git a/packages/reacord/library/reacord-client.tsx b/packages/reacord/library/reacord-client.ts similarity index 93% rename from packages/reacord/library/reacord-client.tsx rename to packages/reacord/library/reacord-client.ts index 3d70705..5f8a65d 100644 --- a/packages/reacord/library/reacord-client.tsx +++ b/packages/reacord/library/reacord-client.ts @@ -6,7 +6,7 @@ import { InteractionType, } from "discord.js" import * as React from "react" -import { InstanceProvider } from "./core/instance-context.js" +import { InstanceProvider } from "./core/instance-context" import type { ReacordInstance } from "./reacord-instance.js" import { ReacordInstancePrivate } from "./reacord-instance.js" import type { Renderer } from "./renderer.js" @@ -79,7 +79,7 @@ export class ReacordClient { send(channelId: string, initialContent?: React.ReactNode): ReacordInstance { return this.createInstance( - new ChannelMessageRenderer(channelId), + new ChannelMessageRenderer(channelId, this.client), initialContent, ) } @@ -127,7 +127,11 @@ export class ReacordClient { const publicInstance: ReacordInstance = { render: (content: React.ReactNode) => { instance.render( - {content}, + React.createElement( + InstanceProvider, + { value: publicInstance }, + content, + ), ) }, deactivate: () => { diff --git a/packages/reacord/library/internal/element.ts b/packages/reacord/library/reacord-element.ts similarity index 100% rename from packages/reacord/library/internal/element.ts rename to packages/reacord/library/reacord-element.ts diff --git a/packages/reacord/library/reacord-instance.ts b/packages/reacord/library/reacord-instance.ts index 3f253ea..db170fa 100644 --- a/packages/reacord/library/reacord-instance.ts +++ b/packages/reacord/library/reacord-instance.ts @@ -4,14 +4,14 @@ import type { APIMessageComponentSelectMenuInteraction, } from "discord.js" import { ComponentType } from "discord.js" -import { ButtonNode } from "./components/button.js" -import type { SelectChangeEvent } from "./components/select.js" -import { SelectNode } from "./components/select.js" -import type { ComponentEvent } from "./core/component-event.js" -import { reconciler } from "./internal/reconciler.js" -import { Node } from "./node.js" -import type { ReacordClient } from "./reacord-client.js" -import type { Renderer } from "./renderer.js" +import { ButtonNode } from "./components/button" +import type { SelectChangeEvent } from "./components/select" +import { SelectNode } from "./components/select" +import type { ComponentEvent } from "./core/component-event" +import { Node } from "./node" +import type { ReacordClient } from "./reacord-client" +import { reconciler } from "./reconciler" +import type { Renderer } from "./renderer" /** * Represents an interactive message, which can later be replaced or deleted. diff --git a/packages/reacord/library/reconciler.ts b/packages/reacord/library/reconciler.ts index 1169669..57d014f 100644 --- a/packages/reacord/library/reconciler.ts +++ b/packages/reacord/library/reconciler.ts @@ -2,9 +2,8 @@ import { raise } from "@reacord/helpers/raise.js" import ReactReconciler from "react-reconciler" import { DefaultEventPriority } from "react-reconciler/constants" -import { Node } from "./node.js" +import { Node, TextNode } from "./node.js" import type { ReacordInstancePrivate } from "./reacord-instance.js" -import { TextNode } from "./text-node.js" export const reconciler = ReactReconciler< string, // Type, diff --git a/packages/reacord/library/renderer.ts b/packages/reacord/library/renderer.ts index 1ea7deb..13a1a44 100644 --- a/packages/reacord/library/renderer.ts +++ b/packages/reacord/library/renderer.ts @@ -1,35 +1,74 @@ import { AsyncQueue } from "@reacord/helpers/async-queue" -import type { Node } from "./internal/node.js" +import type { Client, Message } from "discord.js" +import { TextChannel } from "discord.js" +import { makeMessageUpdatePayload } from "./make-message-update-payload.js" +import type { Node } from "./node.js" import type { InteractionInfo } from "./reacord-client.js" export type Renderer = { - update(tree: Node): Promise + update(tree: Node): Promise deactivate(): Promise destroy(): Promise } export class ChannelMessageRenderer implements Renderer { private readonly queue = new AsyncQueue() + private channel: TextChannel | undefined + private message: Message | undefined + private active = true - constructor(private readonly channelId: string) {} + constructor( + private readonly channelId: string, + private readonly client: Client, + ) {} - update(tree: Node): Promise { - throw new Error("Method not implemented.") + private async getChannel(): Promise { + if (this.channel) return this.channel + + const channel = + this.client.channels.cache.get(this.channelId) ?? + (await this.client.channels.fetch(this.channelId)) + + if (!(channel instanceof TextChannel)) { + throw new TypeError(`Channel ${this.channelId} is not a text channel`) + } + + this.channel = channel + return channel } - deactivate(): Promise { - throw new Error("Method not implemented.") + update(tree: Node) { + const payload = makeMessageUpdatePayload(tree) + return this.queue.add(async () => { + if (!this.active) return + if (this.message) { + await this.message.edit(payload) + } else { + const channel = await this.getChannel() + this.message = await channel.send(payload) + } + }) } - destroy(): Promise { - throw new Error("Method not implemented.") + async deactivate() { + return this.queue.add(async () => { + this.active = false + // TODO: disable message components + }) + } + + async destroy() { + return this.queue.add(async () => { + this.active = false + await this.message?.delete() + }) } } export class InteractionReplyRenderer implements Renderer { constructor(private readonly interaction: InteractionInfo) {} - update(tree: Node): Promise { + update(tree: Node): Promise { throw new Error("Method not implemented.") } @@ -45,7 +84,7 @@ export class InteractionReplyRenderer implements Renderer { export class EphemeralInteractionReplyRenderer implements Renderer { constructor(private readonly interaction: InteractionInfo) {} - update(tree: Node): Promise { + update(tree: Node): Promise { throw new Error("Method not implemented.") } diff --git a/packages/reacord/library/text-node.ts b/packages/reacord/library/text-node.ts deleted file mode 100644 index 1958b76..0000000 --- a/packages/reacord/library/text-node.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Node } from "./node.js" - -export class TextNode extends Node<{ text: string }> {} diff --git a/packages/reacord/package.json b/packages/reacord/package.json index cfeb895..3cb98d8 100644 --- a/packages/reacord/package.json +++ b/packages/reacord/package.json @@ -38,7 +38,7 @@ "scripts": { "build": "cp ../../README.md . && cp ../../LICENSE . && tsup library/main.ts --target node16 --format cjs,esm --dts --sourcemap", "build-watch": "pnpm build --watch", - "test-manual": "nodemon --exec tsx --ext ts,tsx ./scripts/discordjs-manual-test.tsx", + "test-manual": "tsx watch ./scripts/discordjs-manual-test.tsx", "typecheck": "tsc --noEmit", "release": "bash scripts/release.sh" }, @@ -62,17 +62,17 @@ "devDependencies": { "@reacord/helpers": "workspace:*", "@types/lodash-es": "^4.17.6", - "discord.js": "^14.0.3", + "discord.js": "^14.1.2", "dotenv": "^16.0.1", "lodash-es": "^4.17.21", "nodemon": "^2.0.19", "prettier": "^2.7.1", "pretty-ms": "^8.0.0", "react": "^18.2.0", - "release-it": "^15.1.3", - "tsup": "^6.1.3", + "release-it": "^15.2.0", + "tsup": "^6.2.1", "tsx": "^3.8.0", - "type-fest": "^2.17.0", + "type-fest": "^2.18.0", "typescript": "^4.7.4" }, "resolutions": { diff --git a/packages/reacord/scripts/discordjs-manual-test.tsx b/packages/reacord/scripts/discordjs-manual-test.tsx index 23e2a4f..2d179f3 100644 --- a/packages/reacord/scripts/discordjs-manual-test.tsx +++ b/packages/reacord/scripts/discordjs-manual-test.tsx @@ -3,16 +3,17 @@ import "dotenv/config" import { kebabCase } from "lodash-es" import * as React from "react" import { useState } from "react" -import { - Button, - Option, - ReacordDiscordJs, - Select, - useInstance, -} from "../library/main" +import { Button } from "../library/components/button" +import { Option } from "../library/components/option" +import { Select } from "../library/components/select" +import { useInstance } from "../library/core/instance-context" +import { ReacordClient } from "../library/reacord-client" const client = new Client({ intents: IntentsBitField.Flags.Guilds }) -const reacord = new ReacordDiscordJs(client) + +const reacord = new ReacordClient({ + token: process.env.TEST_BOT_TOKEN!, +}) type TestCase = { name: string @@ -180,6 +181,7 @@ await Promise.all([ tests.map(async (test, index) => { const channelName = getTestCaseChannelName(test, index) const channel = await getTestCaseChannel(channelName, index) + console.info("running test:", test.name) await test.run(channel) }), ), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1975d53..3897860 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,9 +45,9 @@ importers: '@types/lodash-es': ^4.17.6 '@types/node': '*' '@types/react': '*' - '@types/react-reconciler': ^0.28.0 + '@types/react-reconciler': '*' discord-api-types: ^0.36.3 - discord.js: ^14.0.3 + discord.js: ^14.1.2 dotenv: ^16.0.1 lodash-es: ^4.17.21 nodemon: ^2.0.19 @@ -55,14 +55,14 @@ importers: pretty-ms: ^8.0.0 react: ^18.2.0 react-reconciler: ^0.29.0 - release-it: ^15.1.3 + release-it: ^15.2.0 rxjs: ^7.5.6 - tsup: ^6.1.3 + tsup: ^6.2.1 tsx: ^3.8.0 - type-fest: ^2.17.0 + type-fest: ^2.18.0 typescript: ^4.7.4 dependencies: - '@types/node': 18.0.6 + '@types/node': 18.6.3 '@types/react': 18.0.15 '@types/react-reconciler': 0.28.0 discord-api-types: 0.36.3 @@ -71,17 +71,17 @@ importers: devDependencies: '@reacord/helpers': link:../helpers '@types/lodash-es': 4.17.6 - discord.js: 14.0.3 + discord.js: 14.1.2 dotenv: 16.0.1 lodash-es: 4.17.21 nodemon: 2.0.19 prettier: 2.7.1 pretty-ms: 8.0.0 react: 18.2.0 - release-it: 15.1.3 - tsup: 6.1.3_typescript@4.7.4 + release-it: 15.2.0 + tsup: 6.2.1_typescript@4.7.4 tsx: 3.8.0 - type-fest: 2.17.0 + type-fest: 2.18.0 typescript: 4.7.4 packages/website: @@ -1631,8 +1631,8 @@ packages: - supports-color dev: true - /@discordjs/builders/1.0.0: - resolution: {integrity: sha512-8y91ZfpOHubiGJu5tVyGI9tQCEyHZDTeqUWVcJd0dq7B96xIf84S0L4fwmD1k9zTe1eqEFSk0gc7BpY+FKn7Ww==} + /@discordjs/builders/1.1.0: + resolution: {integrity: sha512-EO8TSltiIc9Z1wE854wAFvv5AccqEtvjFmao9PPoxQhRaJ0hEb7FwWRTCA1jGg4ZWI3hcp4m+RET5ufZQz3rOg==} engines: {node: '>=16.9.0'} dependencies: '@sapphire/shapeshift': 3.5.1 @@ -1642,20 +1642,20 @@ packages: tslib: 2.4.0 dev: true - /@discordjs/collection/1.0.0: - resolution: {integrity: sha512-nAxDQYE5dNAzEGQ7HU20sujDsG5vLowUKCEqZkKUIlrXERZFTt/60zKUj/g4+AVCGeq+pXC5hivMaNtiC+PY5Q==} + /@discordjs/collection/1.0.1: + resolution: {integrity: sha512-5V/wswzR3r2RVYXLxxg4TvrAnBhVCNgHTXhC+OUtLoriJ072rPMHo+Iw1SS1vrCckp8Es40XM411+WkNRPaXFw==} engines: {node: '>=16.9.0'} dev: true - /@discordjs/rest/1.0.0: - resolution: {integrity: sha512-uDAvnE0P2a8axMdD4C51EGjvCRQ2HZk2Yxf6vHWZgIqG87D8DGKMPwmquIxrrB07MjV+rwci2ObU+mGhGP+bJg==} + /@discordjs/rest/1.0.1: + resolution: {integrity: sha512-w08CTKVzzYYvKxEjXKOs9AdS7KQ1J502TrPfF8eCZ2lF6AfKuMP/32YgDakiwIyYTDjEQS/v0nKLSFcncHRMtg==} engines: {node: '>=16.9.0'} dependencies: - '@discordjs/collection': 1.0.0 + '@discordjs/collection': 1.0.1 '@sapphire/async-queue': 1.3.2 '@sapphire/snowflake': 3.2.2 discord-api-types: 0.36.3 - file-type: 17.1.3 + file-type: 17.1.4 tslib: 2.4.0 undici: 5.8.0 dev: true @@ -1670,7 +1670,7 @@ packages: /@esbuild-kit/core-utils/2.1.0: resolution: {integrity: sha512-fZirrc2KjeTumVjE4bpleWOk2gD83b7WuGeQqOceKFQL+heNKKkNB5G5pekOUTLzfSBc0hP7hCSBoD9TuR0hLw==} dependencies: - esbuild: 0.14.49 + esbuild: 0.14.51 source-map-support: 0.5.21 dev: true @@ -1893,7 +1893,7 @@ packages: resolution: {integrity: sha512-MDNFUBcJIptB9At7HiV7VCvU3NcL4GnfCQaP8C5lrxWrRPMJBnemYtehaKSOlaM7AYxeRyj9etenu8LVpSpVaQ==} engines: {node: '>= 14'} dependencies: - '@octokit/types': 6.40.0 + '@octokit/types': 6.41.0 dev: true /@octokit/core/4.0.4: @@ -1904,7 +1904,7 @@ packages: '@octokit/graphql': 5.0.0 '@octokit/request': 6.2.0 '@octokit/request-error': 3.0.0 - '@octokit/types': 6.40.0 + '@octokit/types': 6.41.0 before-after-hook: 2.2.2 universal-user-agent: 6.0.0 transitivePeerDependencies: @@ -1915,7 +1915,7 @@ packages: resolution: {integrity: sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ==} engines: {node: '>= 14'} dependencies: - '@octokit/types': 6.40.0 + '@octokit/types': 6.41.0 is-plain-object: 5.0.0 universal-user-agent: 6.0.0 dev: true @@ -1925,24 +1925,24 @@ packages: engines: {node: '>= 14'} dependencies: '@octokit/request': 6.2.0 - '@octokit/types': 6.40.0 + '@octokit/types': 6.41.0 universal-user-agent: 6.0.0 transitivePeerDependencies: - encoding dev: true - /@octokit/openapi-types/12.10.1: - resolution: {integrity: sha512-P+SukKanjFY0ZhsK6wSVnQmxTP2eVPPE8OPSNuxaMYtgVzwJZgfGdwlYjf4RlRU4vLEw4ts2fsE2icG4nZ5ddQ==} + /@octokit/openapi-types/12.11.0: + resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} dev: true - /@octokit/plugin-paginate-rest/3.0.0_@octokit+core@4.0.4: - resolution: {integrity: sha512-fvw0Q5IXnn60D32sKeLIxgXCEZ7BTSAjJd8cFAE6QU5qUp0xo7LjFUjjX1J5D7HgN355CN4EXE4+Q1/96JaNUA==} + /@octokit/plugin-paginate-rest/3.1.0_@octokit+core@4.0.4: + resolution: {integrity: sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA==} engines: {node: '>= 14'} peerDependencies: '@octokit/core': '>=4' dependencies: '@octokit/core': 4.0.4 - '@octokit/types': 6.40.0 + '@octokit/types': 6.41.0 dev: true /@octokit/plugin-request-log/1.0.4_@octokit+core@4.0.4: @@ -1953,14 +1953,14 @@ packages: '@octokit/core': 4.0.4 dev: true - /@octokit/plugin-rest-endpoint-methods/6.1.2_@octokit+core@4.0.4: - resolution: {integrity: sha512-sAfSKtLHNq0UQ2iFuI41I6m5SK6bnKFRJ5kUjDRVbmQXiRVi4aQiIcgG4cM7bt+bhSiWL4HwnTxDkWFlKeKClA==} + /@octokit/plugin-rest-endpoint-methods/6.2.0_@octokit+core@4.0.4: + resolution: {integrity: sha512-PZ+yfkbZAuRUtqu6Y191/V3eM0KBPx+Yq7nh+ONPdpm3EX4pd5UnK2y2XgO/0AtNum5a4aJCDjqsDuUZ2hWRXw==} engines: {node: '>= 14'} peerDependencies: '@octokit/core': '>=3' dependencies: '@octokit/core': 4.0.4 - '@octokit/types': 6.40.0 + '@octokit/types': 6.41.0 deprecation: 2.3.1 dev: true @@ -1968,7 +1968,7 @@ packages: resolution: {integrity: sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w==} engines: {node: '>= 14'} dependencies: - '@octokit/types': 6.40.0 + '@octokit/types': 6.41.0 deprecation: 2.3.1 once: 1.4.0 dev: true @@ -1979,7 +1979,7 @@ packages: dependencies: '@octokit/endpoint': 7.0.0 '@octokit/request-error': 3.0.0 - '@octokit/types': 6.40.0 + '@octokit/types': 6.41.0 is-plain-object: 5.0.0 node-fetch: 2.6.7 universal-user-agent: 6.0.0 @@ -1992,17 +1992,17 @@ packages: engines: {node: '>= 14'} dependencies: '@octokit/core': 4.0.4 - '@octokit/plugin-paginate-rest': 3.0.0_@octokit+core@4.0.4 + '@octokit/plugin-paginate-rest': 3.1.0_@octokit+core@4.0.4 '@octokit/plugin-request-log': 1.0.4_@octokit+core@4.0.4 - '@octokit/plugin-rest-endpoint-methods': 6.1.2_@octokit+core@4.0.4 + '@octokit/plugin-rest-endpoint-methods': 6.2.0_@octokit+core@4.0.4 transitivePeerDependencies: - encoding dev: true - /@octokit/types/6.40.0: - resolution: {integrity: sha512-MFZOU5r8SwgJWDMhrLUSvyJPtVsqA6VnbVI3TNbsmw+Jnvrktzvq2fYES/6RiJA/5Ykdwq4mJmtlYUfW7CGjmw==} + /@octokit/types/6.41.0: + resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} dependencies: - '@octokit/openapi-types': 12.10.1 + '@octokit/openapi-types': 12.11.0 dev: true /@pnpm/network.ca-file/1.0.1: @@ -2265,6 +2265,11 @@ packages: engines: {node: '>=10'} dev: true + /@sindresorhus/is/5.3.0: + resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} + engines: {node: '>=14.16'} + dev: true + /@szmarczak/http-timer/4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} @@ -2339,7 +2344,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.0.6 + '@types/node': 18.6.3 '@types/responselike': 1.0.0 dev: true @@ -2428,7 +2433,7 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.0.6 + '@types/node': 18.6.3 dev: true /@types/lodash-es/4.17.6: @@ -2471,6 +2476,10 @@ packages: /@types/node/18.0.6: resolution: {integrity: sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==} + dev: true + + /@types/node/18.6.3: + resolution: {integrity: sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==} /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -2513,7 +2522,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.0.6 + '@types/node': 18.6.3 dev: true /@types/scheduler/0.16.2: @@ -2559,7 +2568,7 @@ packages: /@types/ws/8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 18.0.6 + '@types/node': 18.6.3 dev: true /@types/yauzl/2.10.0: @@ -3269,7 +3278,7 @@ packages: chalk: 5.0.1 cli-boxes: 3.0.0 string-width: 5.1.2 - type-fest: 2.17.0 + type-fest: 2.18.0 widest-line: 4.0.1 wrap-ansi: 8.0.1 dev: true @@ -3360,13 +3369,13 @@ packages: engines: {node: '>=6'} dev: true - /bundle-require/3.0.4_esbuild@0.14.50: + /bundle-require/3.0.4_esbuild@0.14.51: resolution: {integrity: sha512-VXG6epB1yrLAvWVQpl92qF347/UXmncQj7J3U8kZEbdVZ1ZkQyr4hYeL/9RvcE8vVVdp53dY78Fd/3pqfRqI1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.13' dependencies: - esbuild: 0.14.50 + esbuild: 0.14.51 load-tsconfig: 0.2.3 dev: true @@ -3657,6 +3666,11 @@ packages: engines: {node: '>=6'} dev: true + /cli-spinners/2.7.0: + resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} + engines: {node: '>=6'} + dev: true + /cli-table3/0.6.2: resolution: {integrity: sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==} engines: {node: 10.* || >= 12.*} @@ -4318,13 +4332,13 @@ packages: /discord-api-types/0.36.3: resolution: {integrity: sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==} - /discord.js/14.0.3: - resolution: {integrity: sha512-wH/VQl4CqN8/+dcXEtYis1iurqxGlDpEe0O4CqH5FGqZGIjVpTdtK0STXXx7bVNX8MT/0GvLZLkmO/5gLDWZVg==} + /discord.js/14.1.2: + resolution: {integrity: sha512-apdWNLkjAkeEnuNpB8H6rS/4OgrXQlSAjuuzeodjCOdIXy3OwOjD314V/HiSttcAlr9+r3ONhaT5qvbDad5SIg==} engines: {node: '>=16.9.0'} dependencies: - '@discordjs/builders': 1.0.0 - '@discordjs/collection': 1.0.0 - '@discordjs/rest': 1.0.0 + '@discordjs/builders': 1.1.0 + '@discordjs/collection': 1.0.1 + '@discordjs/rest': 1.0.1 '@sapphire/snowflake': 3.2.2 '@types/ws': 8.5.3 discord-api-types: 0.36.3 @@ -4493,15 +4507,6 @@ packages: is-date-object: 1.0.5 is-symbol: 1.0.4 - /esbuild-android-64/0.14.49: - resolution: {integrity: sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /esbuild-android-64/0.14.50: resolution: {integrity: sha512-H7iUEm7gUJHzidsBlFPGF6FTExazcgXL/46xxLo6i6bMtPim6ZmXyTccS8yOMpy6HAC6dPZ/JCQqrkkin69n6Q==} engines: {node: '>=12'} @@ -4511,10 +4516,10 @@ packages: dev: true optional: true - /esbuild-android-arm64/0.14.49: - resolution: {integrity: sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==} + /esbuild-android-64/0.14.51: + resolution: {integrity: sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [x64] os: [android] requiresBuild: true dev: true @@ -4529,11 +4534,11 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.14.49: - resolution: {integrity: sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==} + /esbuild-android-arm64/0.14.51: + resolution: {integrity: sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==} engines: {node: '>=12'} - cpu: [x64] - os: [darwin] + cpu: [arm64] + os: [android] requiresBuild: true dev: true optional: true @@ -4547,10 +4552,10 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.14.49: - resolution: {integrity: sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==} + /esbuild-darwin-64/0.14.51: + resolution: {integrity: sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [x64] os: [darwin] requiresBuild: true dev: true @@ -4565,11 +4570,11 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.14.49: - resolution: {integrity: sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==} + /esbuild-darwin-arm64/0.14.51: + resolution: {integrity: sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==} engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] + cpu: [arm64] + os: [darwin] requiresBuild: true dev: true optional: true @@ -4583,10 +4588,10 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.14.49: - resolution: {integrity: sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==} + /esbuild-freebsd-64/0.14.51: + resolution: {integrity: sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [x64] os: [freebsd] requiresBuild: true dev: true @@ -4601,11 +4606,11 @@ packages: dev: true optional: true - /esbuild-linux-32/0.14.49: - resolution: {integrity: sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==} + /esbuild-freebsd-arm64/0.14.51: + resolution: {integrity: sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==} engines: {node: '>=12'} - cpu: [ia32] - os: [linux] + cpu: [arm64] + os: [freebsd] requiresBuild: true dev: true optional: true @@ -4619,10 +4624,10 @@ packages: dev: true optional: true - /esbuild-linux-64/0.14.49: - resolution: {integrity: sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==} + /esbuild-linux-32/0.14.51: + resolution: {integrity: sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==} engines: {node: '>=12'} - cpu: [x64] + cpu: [ia32] os: [linux] requiresBuild: true dev: true @@ -4637,10 +4642,10 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.14.49: - resolution: {integrity: sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==} + /esbuild-linux-64/0.14.51: + resolution: {integrity: sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==} engines: {node: '>=12'} - cpu: [arm] + cpu: [x64] os: [linux] requiresBuild: true dev: true @@ -4655,10 +4660,10 @@ packages: dev: true optional: true - /esbuild-linux-arm64/0.14.49: - resolution: {integrity: sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==} + /esbuild-linux-arm/0.14.51: + resolution: {integrity: sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true @@ -4673,10 +4678,10 @@ packages: dev: true optional: true - /esbuild-linux-mips64le/0.14.49: - resolution: {integrity: sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==} + /esbuild-linux-arm64/0.14.51: + resolution: {integrity: sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==} engines: {node: '>=12'} - cpu: [mips64el] + cpu: [arm64] os: [linux] requiresBuild: true dev: true @@ -4691,10 +4696,10 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.14.49: - resolution: {integrity: sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==} + /esbuild-linux-mips64le/0.14.51: + resolution: {integrity: sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==} engines: {node: '>=12'} - cpu: [ppc64] + cpu: [mips64el] os: [linux] requiresBuild: true dev: true @@ -4709,10 +4714,10 @@ packages: dev: true optional: true - /esbuild-linux-riscv64/0.14.49: - resolution: {integrity: sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==} + /esbuild-linux-ppc64le/0.14.51: + resolution: {integrity: sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==} engines: {node: '>=12'} - cpu: [riscv64] + cpu: [ppc64] os: [linux] requiresBuild: true dev: true @@ -4727,10 +4732,10 @@ packages: dev: true optional: true - /esbuild-linux-s390x/0.14.49: - resolution: {integrity: sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==} + /esbuild-linux-riscv64/0.14.51: + resolution: {integrity: sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==} engines: {node: '>=12'} - cpu: [s390x] + cpu: [riscv64] os: [linux] requiresBuild: true dev: true @@ -4745,11 +4750,11 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.14.49: - resolution: {integrity: sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==} + /esbuild-linux-s390x/0.14.51: + resolution: {integrity: sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==} engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] + cpu: [s390x] + os: [linux] requiresBuild: true dev: true optional: true @@ -4763,11 +4768,11 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.14.49: - resolution: {integrity: sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==} + /esbuild-netbsd-64/0.14.51: + resolution: {integrity: sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==} engines: {node: '>=12'} cpu: [x64] - os: [openbsd] + os: [netbsd] requiresBuild: true dev: true optional: true @@ -4781,11 +4786,11 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.14.49: - resolution: {integrity: sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==} + /esbuild-openbsd-64/0.14.51: + resolution: {integrity: sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==} engines: {node: '>=12'} cpu: [x64] - os: [sunos] + os: [openbsd] requiresBuild: true dev: true optional: true @@ -4799,11 +4804,11 @@ packages: dev: true optional: true - /esbuild-windows-32/0.14.49: - resolution: {integrity: sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==} + /esbuild-sunos-64/0.14.51: + resolution: {integrity: sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==} engines: {node: '>=12'} - cpu: [ia32] - os: [win32] + cpu: [x64] + os: [sunos] requiresBuild: true dev: true optional: true @@ -4817,10 +4822,10 @@ packages: dev: true optional: true - /esbuild-windows-64/0.14.49: - resolution: {integrity: sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==} + /esbuild-windows-32/0.14.51: + resolution: {integrity: sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==} engines: {node: '>=12'} - cpu: [x64] + cpu: [ia32] os: [win32] requiresBuild: true dev: true @@ -4835,10 +4840,10 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.14.49: - resolution: {integrity: sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==} + /esbuild-windows-64/0.14.51: + resolution: {integrity: sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [x64] os: [win32] requiresBuild: true dev: true @@ -4853,33 +4858,14 @@ packages: dev: true optional: true - /esbuild/0.14.49: - resolution: {integrity: sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==} + /esbuild-windows-arm64/0.14.51: + resolution: {integrity: sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==} engines: {node: '>=12'} - hasBin: true + cpu: [arm64] + os: [win32] requiresBuild: true - optionalDependencies: - esbuild-android-64: 0.14.49 - esbuild-android-arm64: 0.14.49 - esbuild-darwin-64: 0.14.49 - esbuild-darwin-arm64: 0.14.49 - esbuild-freebsd-64: 0.14.49 - esbuild-freebsd-arm64: 0.14.49 - esbuild-linux-32: 0.14.49 - esbuild-linux-64: 0.14.49 - esbuild-linux-arm: 0.14.49 - esbuild-linux-arm64: 0.14.49 - esbuild-linux-mips64le: 0.14.49 - esbuild-linux-ppc64le: 0.14.49 - esbuild-linux-riscv64: 0.14.49 - esbuild-linux-s390x: 0.14.49 - esbuild-netbsd-64: 0.14.49 - esbuild-openbsd-64: 0.14.49 - esbuild-sunos-64: 0.14.49 - esbuild-windows-32: 0.14.49 - esbuild-windows-64: 0.14.49 - esbuild-windows-arm64: 0.14.49 dev: true + optional: true /esbuild/0.14.50: resolution: {integrity: sha512-SbC3k35Ih2IC6trhbMYW7hYeGdjPKf9atTKwBUHqMCYFZZ9z8zhuvfnZihsnJypl74FjiAKjBRqFkBkAd0rS/w==} @@ -4909,6 +4895,34 @@ packages: esbuild-windows-arm64: 0.14.50 dev: true + /esbuild/0.14.51: + resolution: {integrity: sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-64: 0.14.51 + esbuild-android-arm64: 0.14.51 + esbuild-darwin-64: 0.14.51 + esbuild-darwin-arm64: 0.14.51 + esbuild-freebsd-64: 0.14.51 + esbuild-freebsd-arm64: 0.14.51 + esbuild-linux-32: 0.14.51 + esbuild-linux-64: 0.14.51 + esbuild-linux-arm: 0.14.51 + esbuild-linux-arm64: 0.14.51 + esbuild-linux-mips64le: 0.14.51 + esbuild-linux-ppc64le: 0.14.51 + esbuild-linux-riscv64: 0.14.51 + esbuild-linux-s390x: 0.14.51 + esbuild-netbsd-64: 0.14.51 + esbuild-openbsd-64: 0.14.51 + esbuild-sunos-64: 0.14.51 + esbuild-windows-32: 0.14.51 + esbuild-windows-64: 0.14.51 + esbuild-windows-arm64: 0.14.51 + dev: true + /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -5479,13 +5493,13 @@ packages: flat-cache: 3.0.4 dev: true - /file-type/17.1.3: - resolution: {integrity: sha512-MFVSozBIhvnx2dkxlf+010Xqn6+ojlMUT9LXQiPNoOijgRtXNMghWdGK0u2o1RoCqzHoVsw65IL8ZBcQ4MhIrw==} + /file-type/17.1.4: + resolution: {integrity: sha512-3w/rJUUPBj6CYhVER3D5JCKwYJJiC36uj5dP+LnyubHI6H6FJo1TeWVCEA09YLVoZqV3/mLP26j9+Pz1GjAyjQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: readable-web-to-node-stream: 3.0.2 - strtok3: 7.0.0-alpha.8 - token-types: 5.0.0-alpha.2 + strtok3: 7.0.0-alpha.9 + token-types: 5.0.0-alpha.3 dev: true /file-uri-to-path/1.0.0: @@ -5514,11 +5528,6 @@ packages: dependencies: to-regex-range: 5.0.1 - /filter-obj/1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} - dev: true - /finalhandler/1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} @@ -5628,8 +5637,9 @@ packages: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /form-data-encoder/1.7.1: - resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + /form-data-encoder/2.0.1: + resolution: {integrity: sha512-Oy+P9w5mnO4TWXVgUiQvggNKPI9/ummcSt5usuIV6HkaLKigwzPpoenhEqmGmx3zHqm6ZLJ+CR/99N8JLinaEw==} + engines: {node: '>= 14.17'} dev: true /form-data/2.3.3: @@ -5861,17 +5871,17 @@ packages: resolution: {integrity: sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==} dev: true - /git-up/4.0.5: - resolution: {integrity: sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA==} + /git-up/6.0.0: + resolution: {integrity: sha512-6RUFSNd1c/D0xtGnyWN2sxza2bZtZ/EmI9448n6rCZruFwV/ezeEn2fJP7XnUQGwf0RAtd/mmUCbtH6JPYA2SA==} dependencies: is-ssh: 1.4.0 - parse-url: 6.0.2 + parse-url: 7.0.2 dev: true - /git-url-parse/11.6.0: - resolution: {integrity: sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==} + /git-url-parse/12.0.0: + resolution: {integrity: sha512-I6LMWsxV87vysX1WfsoglXsXg6GjQRKq7+Dgiseo+h0skmp5Hp2rzmcEIRQot9CPA+uzU7x1x7jZdqvTFGnB+Q==} dependencies: - git-up: 4.0.5 + git-up: 6.0.0 dev: true /glob-parent/5.1.2: @@ -5981,18 +5991,18 @@ packages: responselike: 2.0.1 dev: true - /got/12.1.0: - resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + /got/12.2.0: + resolution: {integrity: sha512-A81ll5Z8wzeCmSdIlWVMDWFKDo82v2nmOaMZDQNHKGInNqDBcle+CSb6BBiZcn/Aiefz/kSpo520WBKi9QAO/A==} engines: {node: '>=14.16'} dependencies: - '@sindresorhus/is': 4.6.0 + '@sindresorhus/is': 5.3.0 '@szmarczak/http-timer': 5.0.1 '@types/cacheable-request': 6.0.2 '@types/responselike': 1.0.0 cacheable-lookup: 6.0.4 cacheable-request: 7.0.2 decompress-response: 6.0.0 - form-data-encoder: 1.7.1 + form-data-encoder: 2.0.1 get-stream: 6.0.1 http2-wrapper: 2.1.11 lowercase-keys: 3.0.0 @@ -8026,7 +8036,7 @@ packages: resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - type-fest: 2.17.0 + type-fest: 2.18.0 dev: true /node-addon-api/1.7.2: @@ -8323,7 +8333,7 @@ packages: bl: 5.0.0 chalk: 5.0.1 cli-cursor: 4.0.0 - cli-spinners: 2.6.1 + cli-spinners: 2.7.0 is-interactive: 2.0.0 is-unicode-supported: 1.2.0 log-symbols: 5.1.0 @@ -8484,7 +8494,7 @@ packages: resolution: {integrity: sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==} engines: {node: '>=14.16'} dependencies: - got: 12.1.0 + got: 12.2.0 registry-auth-token: 5.0.1 registry-url: 6.0.1 semver: 7.3.7 @@ -8538,22 +8548,19 @@ packages: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} dev: true - /parse-path/4.0.4: - resolution: {integrity: sha512-Z2lWUis7jlmXC1jeOG9giRO2+FsuyNipeQ43HAjqAZjwSe3SEf+q/84FGPHoso3kyntbxa4c4i77t3m6fGf8cw==} + /parse-path/5.0.0: + resolution: {integrity: sha512-qOpH55/+ZJ4jUu/oLO+ifUKjFPNZGfnPJtzvGzKN/4oLMil5m9OH4VpOj6++9/ytJcfks4kzH2hhi87GL/OU9A==} dependencies: - is-ssh: 1.4.0 - protocols: 1.4.8 - qs: 6.11.0 - query-string: 6.14.1 + protocols: 2.0.1 dev: true - /parse-url/6.0.2: - resolution: {integrity: sha512-uCSjOvD3T+6B/sPWhR+QowAZcU/o4bjPrVBQBGFxcDF6J6FraCGIaDBsdoQawiaaAVdHvtqBe3w3vKlfBKySOQ==} + /parse-url/7.0.2: + resolution: {integrity: sha512-PqO4Z0eCiQ08Wj6QQmrmp5YTTxpYfONdOEamrtvK63AmzXpcavIVQubGHxOEwiIoDZFb8uDOoQFS0NCcjqIYQg==} dependencies: is-ssh: 1.4.0 normalize-url: 6.1.0 - parse-path: 4.0.4 - protocols: 1.4.8 + parse-path: 5.0.0 + protocols: 2.0.1 dev: true /parse5/6.0.1: @@ -8873,10 +8880,6 @@ packages: engines: {node: '>=4'} dev: true - /protocols/1.4.8: - resolution: {integrity: sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==} - dev: true - /protocols/2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} dev: true @@ -8964,28 +8967,11 @@ packages: dependencies: side-channel: 1.0.4 - /qs/6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true - /qs/6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} dev: true - /query-string/6.14.1: - resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} - engines: {node: '>=6'} - dependencies: - decode-uri-component: 0.2.0 - filter-obj: 1.1.0 - split-on-first: 1.1.0 - strict-uri-encode: 2.0.0 - dev: true - /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -9388,8 +9374,8 @@ packages: unist-util-visit: 4.1.0 dev: true - /release-it/15.1.3: - resolution: {integrity: sha512-pdW9Ua59S3upm2wwzrWiQK8N5vXazNBBYk/UhpVf0faHV6mmY8GunS1ZzawSNi4fOOx55zSQFj2IHkOgfBxNUg==} + /release-it/15.2.0: + resolution: {integrity: sha512-zVtk/+BSX941e9lR2dhWGQhOIVdr98Fifgel4xUnsJVycU0uTtalOUhjoZM2jyDgcD22idmuDVgvgOTl9IyJ/g==} engines: {node: '>=14.9'} hasBin: true dependencies: @@ -9400,9 +9386,9 @@ packages: cosmiconfig: 7.0.1 execa: 6.1.0 form-data: 4.0.0 - git-url-parse: 11.6.0 + git-url-parse: 12.0.0 globby: 13.1.2 - got: 12.1.0 + got: 12.2.0 inquirer: 9.0.2 is-ci: 3.0.1 lodash: 4.17.21 @@ -9607,6 +9593,14 @@ packages: fsevents: 2.3.2 dev: true + /rollup/2.77.2: + resolution: {integrity: sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /run-async/2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -10022,11 +10016,6 @@ packages: resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} dev: true - /split-on-first/1.1.0: - resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} - engines: {node: '>=6'} - dev: true - /split-string/3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} @@ -10085,11 +10074,6 @@ packages: mixme: 0.5.4 dev: true - /strict-uri-encode/2.0.0: - resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} - engines: {node: '>=4'} - dev: true - /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -10209,8 +10193,8 @@ packages: engines: {node: '>=8'} dev: true - /strtok3/7.0.0-alpha.8: - resolution: {integrity: sha512-u+k19v+rTxBjGYxncRQjGvZYwYvEd0uP3D+uHKe/s4WB1eXS5ZwpZsTlBu5xSS4zEd89mTXECXg6WW3FSeV8cA==} + /strtok3/7.0.0-alpha.9: + resolution: {integrity: sha512-G8WxjBFjTZ77toVElv1i7k3jCXNkBB14FVaZ/6LIOka/WGo4La5XHLrU7neFVLdKbXESZf4BejVKZu5maOmocA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: '@tokenizer/token': 0.3.0 @@ -10223,8 +10207,8 @@ packages: inline-style-parser: 0.1.1 dev: true - /sucrase/3.24.0: - resolution: {integrity: sha512-SevqflhW356TKEyWjFHg2e5f3eH+5rzmsMJxrVMDvZIEHh/goYrpzDGA6APEj4ME9MdGm8oNgIzi1eF3c3dDQA==} + /sucrase/3.25.0: + resolution: {integrity: sha512-WxTtwEYXSmZArPGStGBicyRsg5TBEFhT5b7N+tF+zauImP0Acy+CoUK0/byJ8JNPK/5lbpWIVuFagI4+0l85QQ==} engines: {node: '>=8'} hasBin: true dependencies: @@ -10444,8 +10428,8 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - /token-types/5.0.0-alpha.2: - resolution: {integrity: sha512-EsG9UxAW4M6VATrEEjhPFTKEUi1OiJqTUMIZOGBN49fGxYjZB36k0p7to3HZSmWRoHm1QfZgrg3e02fpqAt5fQ==} + /token-types/5.0.0-alpha.3: + resolution: {integrity: sha512-GWGtybxmoWRB1pNghnsNBftIfbzGLiTnytq1XKG/0ZQnLmSqgUA4x06dTvqRem5ZuXI0LY3zkNxl2/RG6QwJkA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: '@tokenizer/token': 0.3.0 @@ -10517,8 +10501,8 @@ packages: /tslib/2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - /tsup/6.1.3_typescript@4.7.4: - resolution: {integrity: sha512-eRpBnbfpDFng+EJNTQ90N7QAf4HAGGC7O3buHIjroKWK7D1ibk9/YnR/3cS8HsMU5T+6Oi+cnF+yU5WmCnB//Q==} + /tsup/6.2.1_typescript@4.7.4: + resolution: {integrity: sha512-KhBhCqVA3bHrIWhkcqTUA7R69H05IcBlHEtCVLEu42XDGUzz+bDqCcfu5PwpkKJ8DqK5tpdgM/qmyk4DdUbkZw==} engines: {node: '>=14'} hasBin: true peerDependencies: @@ -10533,19 +10517,19 @@ packages: typescript: optional: true dependencies: - bundle-require: 3.0.4_esbuild@0.14.50 + bundle-require: 3.0.4_esbuild@0.14.51 cac: 6.7.12 chokidar: 3.5.3 debug: 4.3.4 - esbuild: 0.14.50 + esbuild: 0.14.51 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 postcss-load-config: 3.1.4 resolve-from: 5.0.0 - rollup: 2.77.0 + rollup: 2.77.2 source-map: 0.8.0-beta.0 - sucrase: 3.24.0 + sucrase: 3.25.0 tree-kill: 1.2.2 typescript: 4.7.4 transitivePeerDependencies: @@ -10651,6 +10635,11 @@ packages: resolution: {integrity: sha512-U+g3/JVXnOki1kLSc+xZGPRll3Ah9u2VIG6Sn9iH9YX6UkPERmt6O/0fIyTgsd2/whV0+gAaHAg8fz6sG1QzMA==} engines: {node: '>=12.20'} + /type-fest/2.18.0: + resolution: {integrity: sha512-pRS+/yrW5TjPPHNOvxhbNZexr2bS63WjrMU8a+VzEBhUi9Tz1pZeD+vQz3ut0svZ46P+SRqMEPnJmk2XnvNzTw==} + engines: {node: '>=12.20'} + dev: true + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'}