From 6d9ea194b8103a6ec9f74222d9474a3c13152c64 Mon Sep 17 00:00:00 2001 From: Jeroen Claassens Date: Sun, 10 Dec 2023 15:50:31 +0100 Subject: [PATCH] refactor: remove discordjs-docs search in favour of official bot --- package.json | 6 +- src/commands/discordjs-docs.ts | 149 --------------------- src/interaction-handlers/discordjs-docs.ts | 37 ----- src/lib/constants/emotes.ts | 16 --- src/lib/util/discordjs-docs.ts | 111 --------------- src/lib/util/setup.ts | 5 - yarn.lock | 103 +++++--------- 7 files changed, 38 insertions(+), 389 deletions(-) delete mode 100644 src/commands/discordjs-docs.ts delete mode 100644 src/interaction-handlers/discordjs-docs.ts delete mode 100644 src/lib/util/discordjs-docs.ts diff --git a/package.json b/package.json index 0c0e45f7..479f0a05 100644 --- a/package.json +++ b/package.json @@ -32,11 +32,9 @@ "@sapphire/fetch": "^2.4.2", "@sapphire/result": "^2.6.5", "@sapphire/utilities": "^3.14.0", - "@skyra/env-utilities": "^1.2.1", - "@skyra/http-framework": "^1.2.2", + "@skyra/env-utilities": "^1.2.2", + "@skyra/http-framework": "^2.0.0", "@skyra/jaro-winkler": "^1.1.0", - "date-fns": "^2.30.0", - "discordjs-docs-parser": "^1.3.3", "he": "^1.2.0", "ioredis": "^5.3.2", "turndown": "^7.1.2" diff --git a/src/commands/discordjs-docs.ts b/src/commands/discordjs-docs.ts deleted file mode 100644 index f67a97e5..00000000 --- a/src/commands/discordjs-docs.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { DjsDocsDevIcon, DjsDocsStableIcon } from '#constants/emotes'; -import { buildSelectOption, fetchDocResult, fetchDocs } from '#utils/discordjs-docs'; -import { errorResponse } from '#utils/response-utils'; -import { buildSelectMenuResponse, getGuildIds } from '#utils/utils'; -import { SlashCommandSubcommandBuilder, inlineCode } from '@discordjs/builders'; -import { cast } from '@sapphire/utilities'; -import { - Command, - RegisterCommand, - RegisterSubCommand, - RestrictGuildIds, - type AutocompleteInteractionArguments, - type InteractionArguments, - type TransformedArguments -} from '@skyra/http-framework'; -import { - MessageFlags, - type APIApplicationCommandOptionChoice, - type APIInteractionResponseCallbackData, - type APISelectMenuOption -} from 'discord-api-types/v10'; -import type { DocElement, SourcesStringUnion } from 'discordjs-docs-parser'; - -@RegisterCommand((builder) => builder.setName('discordjs-docs').setDescription('Search discord.js documentation')) -@RestrictGuildIds(getGuildIds()) -export class UserCommand extends Command { - public override async autocompleteRun(interaction: Command.AutocompleteInteraction, args: AutocompleteInteractionArguments) { - if (!args.subCommand || args.focused !== 'query') { - return interaction.replyEmpty(); - } - - const query = args.query.trim().toLowerCase(); - const doc = await fetchDocs(args.subCommand as SourcesStringUnion); - - const results: APIApplicationCommandOptionChoice[] = []; - - if (query.length) { - const element = doc.get(...query.split(/\.|#/)); - if (element) { - results.push({ name: element.formattedName, value: element.formattedName }); - } else { - const searchResult = doc.search(query) ?? []; - for (const r of searchResult) { - results.push({ - name: r.formattedName, - value: r.formattedName - }); - } - } - } else { - const searchResult = doc.search('Client') ?? []; - for (const r of searchResult) { - results.push({ - name: r.formattedName, - value: r.formattedName - }); - } - } - - return interaction.reply({ - choices: results.slice(0, 19) - }); - } - - @RegisterSubCommand(buildSubcommandBuilders('stable', 'Search the discord.js documentation (stable version)')) - @RegisterSubCommand(buildSubcommandBuilders('main', 'Search the discord.js documentation (main branch)')) - @RegisterSubCommand(buildSubcommandBuilders('collection', 'Search the @discordjs/collection documentation')) - @RegisterSubCommand(buildSubcommandBuilders('builders', 'Search the @discordjs/builders documentation')) - @RegisterSubCommand(buildSubcommandBuilders('voice', 'Search the @discordjs/voice documentation')) - // TODO: re-enable when issue with rest docs is fixed - // @RegisterSubCommand(buildSubcommandBuilders('rest', 'Search the @discordjs/rest documentation')) - @RegisterSubCommand(buildSubcommandBuilders('rpc', 'Search the discord-rpc documentation')) - protected async sharedRun(interaction: Command.Interaction, { subCommand, query, target }: InteractionArguments) { - const source = cast(subCommand); - - const doc = await fetchDocs(source); - - const singleResult = fetchDocResult({ source, doc, query, target: target?.user.id }); - - if (singleResult) { - return interaction.reply({ - content: singleResult, - allowed_mentions: { - users: target?.user.id ? [target?.user.id] : [] - } - }); - } - - const results = doc.search(query); - - if (results?.length) { - const selectMenuData = this.buildSelectMenuResponse(query, source, results, target); - return interaction.reply(buildSelectMenuResponse(selectMenuData.customId, selectMenuData.selectMenuOptions, selectMenuData.data)); - } - - return interaction.reply( - errorResponse({ - content: `no results were found for ${inlineCode(query)}` - }) - ); - } - - private buildSelectMenuResponse( - query: string, - source: SourcesStringUnion, - results: DocElement[], - target: TransformedArguments.User | undefined - ): BuildSelectMenuResponseReturnType { - return { - customId: `discordjs-docs.${target?.user.id ?? ''}.${source}`, - selectMenuOptions: results.map((r) => buildSelectOption(r, source === 'main')), - data: { - flags: MessageFlags.Ephemeral, - content: `${ - source === 'main' ? DjsDocsDevIcon : DjsDocsStableIcon - } Could not find anything in the DiscordJS documentation for ${inlineCode(query)}. Select a similar search result to send instead:` - } - }; - } -} - -function buildSubcommandBuilders(name: SourcesStringUnion, description: string) { - return new SlashCommandSubcommandBuilder() // - .setName(name) - .setDescription(description) - .addStringOption((builder) => - builder // - .setName('query') - .setDescription('The phrase to search for') - .setRequired(true) - .setAutocomplete(true) - ) - .addUserOption((builder) => - builder // - .setName('target') - .setDescription('Who should I ping that should look at these results?') - ); -} - -interface Args { - query: string; - target?: TransformedArguments.User; -} - -interface BuildSelectMenuResponseReturnType { - customId: string; - selectMenuOptions: APISelectMenuOption[]; - data: APIInteractionResponseCallbackData; -} diff --git a/src/interaction-handlers/discordjs-docs.ts b/src/interaction-handlers/discordjs-docs.ts deleted file mode 100644 index 1ead8e30..00000000 --- a/src/interaction-handlers/discordjs-docs.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { SupportServerButton } from '#constants/constants'; -import { fetchDocResult, fetchDocs } from '#utils/discordjs-docs'; -import { errorResponse } from '#utils/response-utils'; -import { ActionRowBuilder, type MessageActionRowComponentBuilder } from '@discordjs/builders'; -import { InteractionHandler, type Interactions } from '@skyra/http-framework'; -import type { Snowflake } from 'discord-api-types/v10'; -import type { SourcesStringUnion } from 'discordjs-docs-parser'; - -export class UserInteractionHandler extends InteractionHandler { - public override async run( - interaction: Interactions.MessageComponentStringSelect, - [customIdValue, source]: [Snowflake | null, SourcesStringUnion] - ) { - const doc = await fetchDocs(source); - - const selectedValue = interaction.values[0]; - const content = fetchDocResult({ source, doc, query: selectedValue, target: customIdValue ?? undefined }); - - if (!content) { - return interaction.reply( - errorResponse({ - content: 'I failed to find the selected discord.js documentation entry. Try again or contact the developer.', - components: [new ActionRowBuilder().addComponents([SupportServerButton]).toJSON()] - }) - ); - } - - await interaction.update({ content: 'Docs query sent', components: [] }); - - return interaction.followup({ - content, - allowed_mentions: { - users: customIdValue ? [customIdValue] : [] - } - }); - } -} diff --git a/src/lib/constants/emotes.ts b/src/lib/constants/emotes.ts index 71384612..a8d8bc16 100644 --- a/src/lib/constants/emotes.ts +++ b/src/lib/constants/emotes.ts @@ -1,8 +1,6 @@ export const ExtractEmojiIdRegex = /\d{17,18})>/; export const DjsGuideIcon = `<:_:814216203466965052>` as const; -export const DjsDocsStableIcon = '<:_:851461487498493952>' as const; -export const DjsDocsDevIcon = '<:_:851461195554619442>' as const; export const GreenTick = '<:_:637706251253317669>' as const; export const RedCross = '<:_:637706251257511973>' as const; export const MdnIcon = '<:_:861671077365284884>' as const; @@ -15,17 +13,3 @@ export const GhPrMerged = '<:_:864240877416873984>' as const; export const GhPrOpen = '<:_:864240877479657482>' as const; export const DiscordDevelopersIcon = '' as const; export const SapphireGemId = '<:_:746069730170896405>' as const; - -// #region Discord Docs Emojis -export const DiscordJsDocsClass = '<:_:898645160349552700>' as const; -export const DiscordJsDocsClassDev = '<:_:898645160219512864>' as const; -export const DiscordJsDocsEnumDev = '<:_:898645160257290240>' as const; -export const DiscordJsDocsEnumOrInterface = '<:_:898645160219521134>' as const; -export const DiscordJsDocsEvent = '<:_:898645159942713406>' as const; -export const DiscordJsDocsEventDev = '<:_:898645160253087816>' as const; -export const DiscordJsDocsField = '<:_:898645160286646322>' as const; -export const DiscordJsDocsFieldDev = '<:_:898645160248897586>' as const; -export const DiscordJsDocsInterfaceDev = '<:_:898645160336977960>' as const; -export const DiscordJsDocsMethod = '<:_:898645159934316565>' as const; -export const DiscordJsDocsMethodDev = '<:_:898645160244674560>' as const; -// #endregion diff --git a/src/lib/util/discordjs-docs.ts b/src/lib/util/discordjs-docs.ts deleted file mode 100644 index a1f2bfa0..00000000 --- a/src/lib/util/discordjs-docs.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { - DiscordJsDocsClass, - DiscordJsDocsClassDev, - DiscordJsDocsEnumOrInterface, - DiscordJsDocsEvent, - DiscordJsDocsEventDev, - DiscordJsDocsField, - DiscordJsDocsFieldDev, - DiscordJsDocsInterfaceDev, - DiscordJsDocsMethod, - DiscordJsDocsMethodDev, - DjsDocsDevIcon, - DjsDocsStableIcon, - ExtractEmojiIdRegex -} from '#constants/emotes'; -import { suggestionString } from '#utils/utils'; -import { bold, hideLinkEmbed, hyperlink, italic, underscore } from '@discordjs/builders'; -import { cutText, filterNullishOrEmpty, isNullishOrEmpty } from '@sapphire/utilities'; -import type { APISelectMenuOption } from 'discord-api-types/v10'; -import { Doc, DocTypes, type DocElement, type SourcesStringUnion } from 'discordjs-docs-parser'; - -function docTypeEmojiId(docType: DocTypes | null, dev = false): string { - switch (docType) { - case DocTypes.Typedef: - return dev ? DiscordJsDocsInterfaceDev : DiscordJsDocsEnumOrInterface; - case DocTypes.Prop: - return dev ? DiscordJsDocsFieldDev : DiscordJsDocsField; - case DocTypes.Class: - return dev ? DiscordJsDocsClassDev : DiscordJsDocsClass; - case DocTypes.Method: - case DocTypes.Function: - return dev ? DiscordJsDocsMethodDev : DiscordJsDocsMethod; - case DocTypes.Event: - return dev ? DiscordJsDocsEventDev : DiscordJsDocsEvent; - default: - return dev ? DjsDocsDevIcon : DjsDocsStableIcon; - } -} - -function stripMd(s = ''): string { - return s.replace(/[`\*_]/gi, ''); -} - -function extractGenericTypeInfill(type: string): string { - const match = type.match(/<(?[A-Za-z]+)>/); - return match?.groups?.type ? match.groups.type : type; -} - -function formatInheritance(prefix: string, inherits: string[][], doc: Doc): string { - const res = inherits.flatMap((element) => { - if (Array.isArray(element)) return element.flat(5); - return [element]; - }); - - const inheritedLinks = res.map((element) => doc.get(extractGenericTypeInfill(element))?.link).filter(filterNullishOrEmpty); - - if (isNullishOrEmpty(inheritedLinks)) return ''; - - return ` (${prefix} ${inheritedLinks.join(' and ')})`; -} - -function resolveElementString(element: DocElement, doc: Doc): string { - const parts = []; - if (element.docType === 'event') parts.push(`${bold('(event)')} `); - if (element.static) parts.push(`${bold('(static)')} `); - - parts.push(underscore(bold(element.link))); - - if (element.extends) parts.push(formatInheritance('extends', element.extends, doc)); - if (element.implements) parts.push(formatInheritance('implements', element.implements, doc)); - - if (element.access === 'private') parts.push(` ${bold('[PRIVATE]')}`); - if (element.scope === 'global') parts.push(` ${bold('[GLOBAL]')}`); - - if (element.deprecated) parts.push(` ${bold(italic('[DEPRECATED]'))}`); - - const s = ((element.formattedDescription || element.description) ?? '').split('\n'); - const description = s.length > 1 ? `${s[0]} ${hyperlink('(more...)', hideLinkEmbed(element.url ?? ''))}` : s[0]; - - return `${parts.join('')}\n${description}`; -} - -export function buildSelectOption(result: DocElement, dev = false): APISelectMenuOption { - return { - label: result.formattedName, - value: result.formattedName, - description: cutText(stripMd(result.description ?? 'No description found'), 95), - emoji: { - id: ExtractEmojiIdRegex.exec(docTypeEmojiId(result.docType, dev))?.groups?.id - } - }; -} - -export function fetchDocs(source: SourcesStringUnion) { - return Doc.fetch(source, { force: true }); -} - -export function fetchDocResult({ source, doc, query, target }: FetchDocResultParameters): string | null { - const element = doc.get(...query.split(/\.|#/)); - if (!element) return null; - - const icon = docTypeEmojiId(element.docType, source === 'main'); - return suggestionString('documentation', `${icon} ${resolveElementString(element, doc)}`, target); -} - -interface FetchDocResultParameters { - source: SourcesStringUnion; - doc: Doc; - query: string; - target?: string; -} diff --git a/src/lib/util/setup.ts b/src/lib/util/setup.ts index 4772b24f..0b96dd40 100644 --- a/src/lib/util/setup.ts +++ b/src/lib/util/setup.ts @@ -1,15 +1,10 @@ import { RedisCacheClient } from '#lib/redis-cache/RedisCacheClient'; import { loadTags } from '#utils/tags'; import { setup } from '@skyra/env-utilities'; -import { Doc } from 'discordjs-docs-parser'; import { URL } from 'node:url'; process.env.NODE_ENV ??= 'development'; -Doc.setGlobalOptions({ - escapeMarkdownLinks: true -}); - setup(new URL('../../../.env', import.meta.url)); await loadTags(); diff --git a/yarn.lock b/yarn.lock index c5f24509..776d542f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,15 +40,6 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.21.0": - version: 7.22.15 - resolution: "@babel/runtime@npm:7.22.15" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 9670da63b77ea6d8234117c55a6d9888be5cf220b91a5954d7faefe7a537e06fa8992e11d36b7cff2ab0ef5301fe6effb3d41bec8b4e0bae10d386b7c377568b - languageName: node - linkType: hard - "@commitlint/cli@npm:^18.4.3": version: 18.4.3 resolution: "@commitlint/cli@npm:18.4.3" @@ -776,7 +767,7 @@ __metadata: languageName: node linkType: hard -"@sapphire/fetch@npm:^2.4.1, @sapphire/fetch@npm:^2.4.2": +"@sapphire/fetch@npm:^2.4.2": version: 2.4.2 resolution: "@sapphire/fetch@npm:2.4.2" dependencies: @@ -785,14 +776,14 @@ __metadata: languageName: node linkType: hard -"@sapphire/pieces@npm:^3.10.0": - version: 3.10.0 - resolution: "@sapphire/pieces@npm:3.10.0" +"@sapphire/pieces@npm:^4.1.0": + version: 4.1.0 + resolution: "@sapphire/pieces@npm:4.1.0" dependencies: "@discordjs/collection": "npm:^1.5.3" - "@sapphire/utilities": "npm:^3.13.0" + "@sapphire/utilities": "npm:^3.14.0" tslib: "npm:^2.6.2" - checksum: 70c227989967f02de72150eebc4815bd884ab490c76b5ef0a240cec23871a4426f355cb855d891ef5b9170e0fd04618c8c0415a8ffd6e1d468661af0c4572ce6 + checksum: fbca477af861bf215bac422b338d11b983ba5a7d9b63bcea260d82812b3c74c79882e556b31c0b0f0580fd028f3474c7c6ec649e93589787127d6c181b2c08d0 languageName: node linkType: hard @@ -805,7 +796,7 @@ __metadata: languageName: node linkType: hard -"@sapphire/result@npm:^2.6.4, @sapphire/result@npm:^2.6.5": +"@sapphire/result@npm:^2.6.5": version: 2.6.5 resolution: "@sapphire/result@npm:2.6.5" checksum: 819e43adcd756ec96a3ccba1d9e112d52be8254ec18f36826012e9755963e8b57bed9c69d3a8e2bd8030f0a0dde75372a1c47b749dcf43d6440041a82c0d55c3 @@ -839,7 +830,7 @@ __metadata: languageName: node linkType: hard -"@sapphire/utilities@npm:^3.13.0, @sapphire/utilities@npm:^3.14.0": +"@sapphire/utilities@npm:^3.14.0": version: 3.14.0 resolution: "@sapphire/utilities@npm:3.14.0" checksum: 1176c3e7fecb73d4d2b3f2e626c57eb3168188bdf546363fcd07362d2320bca905733c19311d4ebe98968ac1d5669d32eda37afdb7bc4d7496cfeb3a06a750fb @@ -853,30 +844,30 @@ __metadata: languageName: node linkType: hard -"@skyra/env-utilities@npm:^1.2.1": - version: 1.2.1 - resolution: "@skyra/env-utilities@npm:1.2.1" +"@skyra/env-utilities@npm:^1.2.2": + version: 1.2.2 + resolution: "@skyra/env-utilities@npm:1.2.2" dependencies: - dotenv: "npm:^16.3.0" + dotenv: "npm:^16.3.1" dotenv-expand: "npm:^10.0.0" - checksum: e9ba9f38197ae1b5b339c5f126113ff0e41475f34faa52ed2e0472031b6d3f540e04e56a54858eafdc7bf8cc7b84f0a925ebaa55fe668884d65823ea72abcac5 + checksum: 09e926d6b92906ba91f7a7f8b2e3b079e657ac52a0df05e200f4e9a703383337b392248b497a765d2798fdabc938409a166de5a8aa93c49b57666c1d62dff77d languageName: node linkType: hard -"@skyra/http-framework@npm:^1.2.2": - version: 1.2.2 - resolution: "@skyra/http-framework@npm:1.2.2" +"@skyra/http-framework@npm:^2.0.0": + version: 2.0.0 + resolution: "@skyra/http-framework@npm:2.0.0" dependencies: "@discordjs/builders": "npm:^1.7.0" "@discordjs/collection": "npm:^1.5.3" "@discordjs/rest": "npm:^2.2.0" "@discordjs/util": "npm:^1.0.2" - "@sapphire/pieces": "npm:^3.10.0" - "@sapphire/result": "npm:^2.6.4" - "@sapphire/utilities": "npm:^3.13.0" - "@vladfrangu/async_event_emitter": "npm:^2.2.2" - discord-api-types: "npm:^0.37.63" - checksum: c7eadf9c5685314a966d2b570c8fe93116b5e28d625f67175b6cbf85cb44e892423f2c0b8276a4f46af6f6444f5fc4cfd021c05fc95535f919e08b69439db4b0 + "@sapphire/pieces": "npm:^4.1.0" + "@sapphire/result": "npm:^2.6.5" + "@sapphire/utilities": "npm:^3.14.0" + "@vladfrangu/async_event_emitter": "npm:^2.2.4" + discord-api-types: "npm:^0.37.66" + checksum: 74f70d36524163faef3a329f69c1fd184e50949d878b488584454705936cb0c06541d1de0daeeb4865d52751a8b8b53c8b8d48a2ac67489defe471f017eb835c languageName: node linkType: hard @@ -1141,6 +1132,13 @@ __metadata: languageName: node linkType: hard +"@vladfrangu/async_event_emitter@npm:^2.2.4": + version: 2.2.4 + resolution: "@vladfrangu/async_event_emitter@npm:2.2.4" + checksum: 06de49380dc47fe712768b0e49286e54a114de962da36ef021d4b03fcff7ec8338b46179d8b3eba4c0e02b2926bbf1e6ea0f9c6c08f6f081361947a7f6719ce9 + languageName: node + linkType: hard + "JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -1920,15 +1918,6 @@ __metadata: languageName: node linkType: hard -"date-fns@npm:^2.30.0": - version: 2.30.0 - resolution: "date-fns@npm:2.30.0" - dependencies: - "@babel/runtime": "npm:^7.21.0" - checksum: 70b3e8ea7aaaaeaa2cd80bd889622a4bcb5d8028b4de9162cbcda359db06e16ff6e9309e54eead5341e71031818497f19aaf9839c87d1aba1e27bb4796e758a9 - languageName: node - linkType: hard - "debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" @@ -2070,21 +2059,10 @@ __metadata: languageName: node linkType: hard -"discord-api-types@npm:^0.37.63": - version: 0.37.63 - resolution: "discord-api-types@npm:0.37.63" - checksum: 7ed40b03053b1f019a6d637ad3f873d38d7a347b9d7b846f78b5166e854868cf9690a5c5d9206d2c04087e98a5ec0333edcae7cf6c87f14e8625ecc3b6377376 - languageName: node - linkType: hard - -"discordjs-docs-parser@npm:^1.3.3": - version: 1.3.3 - resolution: "discordjs-docs-parser@npm:1.3.3" - dependencies: - "@sapphire/fetch": "npm:^2.4.1" - "@sapphire/utilities": "npm:^3.13.0" - "@skyra/jaro-winkler": "npm:^1.1.0" - checksum: 0949cfdeb8fda22c58b56112e119d0e538afd3a7ec8afcd41bbbcc261588a4948c1de95bddba0668a72d80ddc1c61a527905db727e059a46ad765336818f7b1f +"discord-api-types@npm:^0.37.66": + version: 0.37.66 + resolution: "discord-api-types@npm:0.37.66" + checksum: 5acb574e09796ead9dd43ffa9e18f577e33bd166d9805c184cceb919a9e54d0dad1e44d52d6dc7ef512a8c39df676ac3ac4eb3ea4c237443ad4095478e247f64 languageName: node linkType: hard @@ -2120,7 +2098,7 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^16.3.0": +"dotenv@npm:^16.3.1": version: 16.3.1 resolution: "dotenv@npm:16.3.1" checksum: dbb778237ef8750e9e3cd1473d3c8eaa9cc3600e33a75c0e36415d0fa0848197f56c3800f77924c70e7828f0b03896818cd52f785b07b9ad4d88dba73fbba83f @@ -4662,13 +4640,6 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.14.0": - version: 0.14.0 - resolution: "regenerator-runtime@npm:0.14.0" - checksum: 6c19495baefcf5fbb18a281b56a97f0197b5f219f42e571e80877f095320afac0bdb31dab8f8186858e6126950068c3f17a1226437881e3e70446ea66751897c - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -5076,8 +5047,8 @@ __metadata: "@sapphire/result": "npm:^2.6.5" "@sapphire/ts-config": "npm:^5.0.0" "@sapphire/utilities": "npm:^3.14.0" - "@skyra/env-utilities": "npm:^1.2.1" - "@skyra/http-framework": "npm:^1.2.2" + "@skyra/env-utilities": "npm:^1.2.2" + "@skyra/http-framework": "npm:^2.0.0" "@skyra/jaro-winkler": "npm:^1.1.0" "@types/he": "npm:^1.2.3" "@types/node": "npm:^20.10.4" @@ -5086,8 +5057,6 @@ __metadata: "@typescript-eslint/parser": "npm:^6.13.2" colorette: "npm:^2.0.20" cz-conventional-changelog: "npm:^3.3.0" - date-fns: "npm:^2.30.0" - discordjs-docs-parser: "npm:^1.3.3" esbuild: "npm:^0.19.9" eslint: "npm:^8.55.0" eslint-config-prettier: "npm:^9.1.0"