@discordjs/formatters 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,7 +9,8 @@
9
9
  <a href="https://www.npmjs.com/package/@discordjs/formatters"><img src="https://img.shields.io/npm/v/@discordjs/formatters.svg?maxAge=3600" alt="npm version" /></a>
10
10
  <a href="https://www.npmjs.com/package/@discordjs/formatters"><img src="https://img.shields.io/npm/dt/@discordjs/formatters.svg?maxAge=3600" alt="npm downloads" /></a>
11
11
  <a href="https://github.com/discordjs/discord.js/actions"><img src="https://github.com/discordjs/discord.js/actions/workflows/test.yml/badge.svg" alt="Build status" /></a>
12
- <a href="https://codecov.io/gh/discordjs/discord.js" ><img src="https://codecov.io/gh/discordjs/discord.js/branch/main/graph/badge.svg?precision=2&flag=formatters" alt="Code coverage" /></a>
12
+ <a href="https://github.com/discordjs/discord.js/commits/main/packages/formatters"><img alt="Last commit." src="https://img.shields.io/github/last-commit/discordjs/discord.js?logo=github&logoColor=ffffff&path=packages%2Fformatters"></a>
13
+ <a href="https://codecov.io/gh/discordjs/discord.js"><img src="https://codecov.io/gh/discordjs/discord.js/branch/main/graph/badge.svg?precision=2&flag=formatters" alt="Code coverage" /></a>
13
14
  </p>
14
15
  <p>
15
16
  <a href="https://vercel.com/?utm_source=discordjs&utm_campaign=oss"><img src="https://raw.githubusercontent.com/discordjs/discord.js/main/.github/powered-by-vercel.svg" alt="Vercel" /></a>
package/dist/index.d.mts CHANGED
@@ -324,6 +324,13 @@ declare function channelMention<ChannelId extends Snowflake>(channelId: ChannelI
324
324
  * @param roleId - The role id to format
325
325
  */
326
326
  declare function roleMention<RoleId extends Snowflake>(roleId: RoleId): `<@&${RoleId}>`;
327
+ /**
328
+ * Formats a role id into a linked role mention.
329
+ *
330
+ * @typeParam RoleId - This is inferred by the supplied role id
331
+ * @param roleId - The role id to format
332
+ */
333
+ declare function linkedRoleMention<RoleId extends Snowflake>(roleId: RoleId): `<id:linked-roles:${RoleId}>`;
327
334
  /**
328
335
  * Formats an application command name, subcommand group name, subcommand name, and id into an application command mention.
329
336
  *
@@ -363,7 +370,7 @@ declare function chatInputApplicationCommandMention<CommandName extends string,
363
370
  * @typeParam EmojiId - This is inferred by the supplied emoji id
364
371
  * @param emojiId - The emoji id to format
365
372
  */
366
- declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: false): `<:_:${EmojiId}>`;
373
+ declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: false): `<:emoji:${EmojiId}>`;
367
374
  /**
368
375
  * Formats an animated emoji id into a fully qualified emoji identifier.
369
376
  *
@@ -371,7 +378,7 @@ declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animat
371
378
  * @param emojiId - The emoji id to format
372
379
  * @param animated - Whether the emoji is animated
373
380
  */
374
- declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: true): `<a:_:${EmojiId}>`;
381
+ declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: true): `<a:emoji:${EmojiId}>`;
375
382
  /**
376
383
  * Formats an emoji id into a fully qualified emoji identifier.
377
384
  *
@@ -379,7 +386,7 @@ declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animat
379
386
  * @param emojiId - The emoji id to format
380
387
  * @param animated - Whether the emoji is animated
381
388
  */
382
- declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: boolean): `<:_:${EmojiId}>` | `<a:_:${EmojiId}>`;
389
+ declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: boolean): `<:emoji:${EmojiId}>` | `<a:emoji:${EmojiId}>`;
383
390
  /**
384
391
  * Formats a non-animated emoji id and name into a fully qualified emoji identifier.
385
392
  *
@@ -575,6 +582,28 @@ declare function applicationDirectory<ApplicationId extends Snowflake>(applicati
575
582
  * @param skuId - The SKU id
576
583
  */
577
584
  declare function applicationDirectory<ApplicationId extends Snowflake, SKUId extends Snowflake>(applicationId: ApplicationId, skuId: SKUId): `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`;
585
+ /**
586
+ * Formats an email address into an email mention.
587
+ *
588
+ * @typeParam Email - This is inferred by the supplied email address
589
+ * @param email - The email address to format
590
+ */
591
+ declare function email<Email extends string>(email: Email): `<${Email}>`;
592
+ /**
593
+ * Formats an email address and headers into an email mention.
594
+ *
595
+ * @typeParam Email - This is inferred by the supplied email address
596
+ * @param email - The email address to format
597
+ * @param headers - Optional headers to include in the email mention
598
+ */
599
+ declare function email<Email extends string>(email: Email, headers: Record<string, string | readonly string[]> | undefined): `<${Email}?${string}>`;
600
+ /**
601
+ * Formats a phone number into a phone number mention.
602
+ *
603
+ * @typeParam PhoneNumber - This is inferred by the supplied phone number
604
+ * @param phoneNumber - The phone number to format. Must start with a `+` sign.
605
+ */
606
+ declare function phoneNumber<PhoneNumber extends `+${string}`>(phoneNumber: PhoneNumber): `<${PhoneNumber}>`;
578
607
  /**
579
608
  * The {@link https://discord.com/developers/docs/reference#message-formatting-timestamp-styles | message formatting timestamp styles}
580
609
  * supported by Discord.
@@ -586,10 +615,17 @@ declare const TimestampStyles: {
586
615
  * @example `16:20`
587
616
  */
588
617
  readonly ShortTime: "t";
618
+ /**
619
+ * Medium time format, consisting of hours, minutes, and seconds.
620
+ *
621
+ * @example `16:20:30`
622
+ */
623
+ readonly MediumTime: "T";
589
624
  /**
590
625
  * Long time format, consisting of hours, minutes, and seconds.
591
626
  *
592
627
  * @example `16:20:30`
628
+ * @deprecated Use {@link TimestampStyles.MediumTime} instead.
593
629
  */
594
630
  readonly LongTime: "T";
595
631
  /**
@@ -601,21 +637,47 @@ declare const TimestampStyles: {
601
637
  /**
602
638
  * Long date format, consisting of day, month, and year.
603
639
  *
604
- * @example `20 April 2021`
640
+ * @example `April 20, 2021`
605
641
  */
606
642
  readonly LongDate: "D";
643
+ /**
644
+ * Long date-short time format, consisting of long date and short time.
645
+ *
646
+ * @example `April 20, 2021 at 16:20`
647
+ */
648
+ readonly LongDateShortTime: "f";
607
649
  /**
608
650
  * Short date-time format, consisting of short date and short time formats.
609
651
  *
610
652
  * @example `20 April 2021 16:20`
653
+ * @deprecated Use {@link TimestampStyles.LongDateShortTime} instead.
611
654
  */
612
655
  readonly ShortDateTime: "f";
656
+ /**
657
+ * Full date-short time format, consisting of full date and short time.
658
+ *
659
+ * @example `Tuesday, April 20, 2021 at 16:20`
660
+ */
661
+ readonly FullDateShortTime: "F";
613
662
  /**
614
663
  * Long date-time format, consisting of long date and short time formats.
615
664
  *
616
665
  * @example `Tuesday, 20 April 2021 16:20`
666
+ * @deprecated Use {@link TimestampStyles.FullDateShortTime} instead.
617
667
  */
618
668
  readonly LongDateTime: "F";
669
+ /**
670
+ * Short date, short time format, consisting of short date and short time.
671
+ *
672
+ * @example `20/04/2021, 16:20`
673
+ */
674
+ readonly ShortDateShortTime: "s";
675
+ /**
676
+ * Short date, medium time format, consisting of short date and medium time.
677
+ *
678
+ * @example `20/04/2021, 16:20:30`
679
+ */
680
+ readonly ShortDateMediumTime: "S";
619
681
  /**
620
682
  * Relative time format, consisting of a relative duration format.
621
683
  *
@@ -659,7 +721,11 @@ declare enum GuildNavigationMentions {
659
721
  /**
660
722
  * {@link https://support.discord.com/hc/articles/13497665141655 | Server Guide} tab.
661
723
  */
662
- Guide = "<id:guide>"
724
+ Guide = "<id:guide>",
725
+ /**
726
+ * {@link https://support.discord.com/hc/articles/10388356626711 | Linked Roles} tab.
727
+ */
728
+ LinkedRoles = "<id:linked-roles>"
663
729
  }
664
730
 
665
731
  /**
@@ -670,4 +736,4 @@ declare enum GuildNavigationMentions {
670
736
  */
671
737
  declare const version: string;
672
738
 
673
- export { type EscapeMarkdownOptions, Faces, type FormatEmojiOptions, GuildNavigationMentions, HeadingLevel, type RecursiveArray, TimestampStyles, type TimestampStylesString, applicationDirectory, blockQuote, bold, channelLink, channelMention, chatInputApplicationCommandMention, codeBlock, escapeBold, escapeBulletedList, escapeCodeBlock, escapeEscape, escapeHeading, escapeInlineCode, escapeItalic, escapeMarkdown, escapeMaskedLink, escapeNumberedList, escapeSpoiler, escapeStrikethrough, escapeUnderline, formatEmoji, heading, hideLinkEmbed, hyperlink, inlineCode, italic, messageLink, orderedList, quote, roleMention, spoiler, strikethrough, subtext, time, underline, underscore, unorderedList, userMention, version };
739
+ export { type EscapeMarkdownOptions, Faces, type FormatEmojiOptions, GuildNavigationMentions, HeadingLevel, type RecursiveArray, TimestampStyles, type TimestampStylesString, applicationDirectory, blockQuote, bold, channelLink, channelMention, chatInputApplicationCommandMention, codeBlock, email, escapeBold, escapeBulletedList, escapeCodeBlock, escapeEscape, escapeHeading, escapeInlineCode, escapeItalic, escapeMarkdown, escapeMaskedLink, escapeNumberedList, escapeSpoiler, escapeStrikethrough, escapeUnderline, formatEmoji, heading, hideLinkEmbed, hyperlink, inlineCode, italic, linkedRoleMention, messageLink, orderedList, phoneNumber, quote, roleMention, spoiler, strikethrough, subtext, time, underline, underscore, unorderedList, userMention, version };
package/dist/index.d.ts CHANGED
@@ -324,6 +324,13 @@ declare function channelMention<ChannelId extends Snowflake>(channelId: ChannelI
324
324
  * @param roleId - The role id to format
325
325
  */
326
326
  declare function roleMention<RoleId extends Snowflake>(roleId: RoleId): `<@&${RoleId}>`;
327
+ /**
328
+ * Formats a role id into a linked role mention.
329
+ *
330
+ * @typeParam RoleId - This is inferred by the supplied role id
331
+ * @param roleId - The role id to format
332
+ */
333
+ declare function linkedRoleMention<RoleId extends Snowflake>(roleId: RoleId): `<id:linked-roles:${RoleId}>`;
327
334
  /**
328
335
  * Formats an application command name, subcommand group name, subcommand name, and id into an application command mention.
329
336
  *
@@ -363,7 +370,7 @@ declare function chatInputApplicationCommandMention<CommandName extends string,
363
370
  * @typeParam EmojiId - This is inferred by the supplied emoji id
364
371
  * @param emojiId - The emoji id to format
365
372
  */
366
- declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: false): `<:_:${EmojiId}>`;
373
+ declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: false): `<:emoji:${EmojiId}>`;
367
374
  /**
368
375
  * Formats an animated emoji id into a fully qualified emoji identifier.
369
376
  *
@@ -371,7 +378,7 @@ declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animat
371
378
  * @param emojiId - The emoji id to format
372
379
  * @param animated - Whether the emoji is animated
373
380
  */
374
- declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: true): `<a:_:${EmojiId}>`;
381
+ declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: true): `<a:emoji:${EmojiId}>`;
375
382
  /**
376
383
  * Formats an emoji id into a fully qualified emoji identifier.
377
384
  *
@@ -379,7 +386,7 @@ declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animat
379
386
  * @param emojiId - The emoji id to format
380
387
  * @param animated - Whether the emoji is animated
381
388
  */
382
- declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: boolean): `<:_:${EmojiId}>` | `<a:_:${EmojiId}>`;
389
+ declare function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: boolean): `<:emoji:${EmojiId}>` | `<a:emoji:${EmojiId}>`;
383
390
  /**
384
391
  * Formats a non-animated emoji id and name into a fully qualified emoji identifier.
385
392
  *
@@ -575,6 +582,28 @@ declare function applicationDirectory<ApplicationId extends Snowflake>(applicati
575
582
  * @param skuId - The SKU id
576
583
  */
577
584
  declare function applicationDirectory<ApplicationId extends Snowflake, SKUId extends Snowflake>(applicationId: ApplicationId, skuId: SKUId): `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`;
585
+ /**
586
+ * Formats an email address into an email mention.
587
+ *
588
+ * @typeParam Email - This is inferred by the supplied email address
589
+ * @param email - The email address to format
590
+ */
591
+ declare function email<Email extends string>(email: Email): `<${Email}>`;
592
+ /**
593
+ * Formats an email address and headers into an email mention.
594
+ *
595
+ * @typeParam Email - This is inferred by the supplied email address
596
+ * @param email - The email address to format
597
+ * @param headers - Optional headers to include in the email mention
598
+ */
599
+ declare function email<Email extends string>(email: Email, headers: Record<string, string | readonly string[]> | undefined): `<${Email}?${string}>`;
600
+ /**
601
+ * Formats a phone number into a phone number mention.
602
+ *
603
+ * @typeParam PhoneNumber - This is inferred by the supplied phone number
604
+ * @param phoneNumber - The phone number to format. Must start with a `+` sign.
605
+ */
606
+ declare function phoneNumber<PhoneNumber extends `+${string}`>(phoneNumber: PhoneNumber): `<${PhoneNumber}>`;
578
607
  /**
579
608
  * The {@link https://discord.com/developers/docs/reference#message-formatting-timestamp-styles | message formatting timestamp styles}
580
609
  * supported by Discord.
@@ -586,10 +615,17 @@ declare const TimestampStyles: {
586
615
  * @example `16:20`
587
616
  */
588
617
  readonly ShortTime: "t";
618
+ /**
619
+ * Medium time format, consisting of hours, minutes, and seconds.
620
+ *
621
+ * @example `16:20:30`
622
+ */
623
+ readonly MediumTime: "T";
589
624
  /**
590
625
  * Long time format, consisting of hours, minutes, and seconds.
591
626
  *
592
627
  * @example `16:20:30`
628
+ * @deprecated Use {@link TimestampStyles.MediumTime} instead.
593
629
  */
594
630
  readonly LongTime: "T";
595
631
  /**
@@ -601,21 +637,47 @@ declare const TimestampStyles: {
601
637
  /**
602
638
  * Long date format, consisting of day, month, and year.
603
639
  *
604
- * @example `20 April 2021`
640
+ * @example `April 20, 2021`
605
641
  */
606
642
  readonly LongDate: "D";
643
+ /**
644
+ * Long date-short time format, consisting of long date and short time.
645
+ *
646
+ * @example `April 20, 2021 at 16:20`
647
+ */
648
+ readonly LongDateShortTime: "f";
607
649
  /**
608
650
  * Short date-time format, consisting of short date and short time formats.
609
651
  *
610
652
  * @example `20 April 2021 16:20`
653
+ * @deprecated Use {@link TimestampStyles.LongDateShortTime} instead.
611
654
  */
612
655
  readonly ShortDateTime: "f";
656
+ /**
657
+ * Full date-short time format, consisting of full date and short time.
658
+ *
659
+ * @example `Tuesday, April 20, 2021 at 16:20`
660
+ */
661
+ readonly FullDateShortTime: "F";
613
662
  /**
614
663
  * Long date-time format, consisting of long date and short time formats.
615
664
  *
616
665
  * @example `Tuesday, 20 April 2021 16:20`
666
+ * @deprecated Use {@link TimestampStyles.FullDateShortTime} instead.
617
667
  */
618
668
  readonly LongDateTime: "F";
669
+ /**
670
+ * Short date, short time format, consisting of short date and short time.
671
+ *
672
+ * @example `20/04/2021, 16:20`
673
+ */
674
+ readonly ShortDateShortTime: "s";
675
+ /**
676
+ * Short date, medium time format, consisting of short date and medium time.
677
+ *
678
+ * @example `20/04/2021, 16:20:30`
679
+ */
680
+ readonly ShortDateMediumTime: "S";
619
681
  /**
620
682
  * Relative time format, consisting of a relative duration format.
621
683
  *
@@ -659,7 +721,11 @@ declare enum GuildNavigationMentions {
659
721
  /**
660
722
  * {@link https://support.discord.com/hc/articles/13497665141655 | Server Guide} tab.
661
723
  */
662
- Guide = "<id:guide>"
724
+ Guide = "<id:guide>",
725
+ /**
726
+ * {@link https://support.discord.com/hc/articles/10388356626711 | Linked Roles} tab.
727
+ */
728
+ LinkedRoles = "<id:linked-roles>"
663
729
  }
664
730
 
665
731
  /**
@@ -670,4 +736,4 @@ declare enum GuildNavigationMentions {
670
736
  */
671
737
  declare const version: string;
672
738
 
673
- export { type EscapeMarkdownOptions, Faces, type FormatEmojiOptions, GuildNavigationMentions, HeadingLevel, type RecursiveArray, TimestampStyles, type TimestampStylesString, applicationDirectory, blockQuote, bold, channelLink, channelMention, chatInputApplicationCommandMention, codeBlock, escapeBold, escapeBulletedList, escapeCodeBlock, escapeEscape, escapeHeading, escapeInlineCode, escapeItalic, escapeMarkdown, escapeMaskedLink, escapeNumberedList, escapeSpoiler, escapeStrikethrough, escapeUnderline, formatEmoji, heading, hideLinkEmbed, hyperlink, inlineCode, italic, messageLink, orderedList, quote, roleMention, spoiler, strikethrough, subtext, time, underline, underscore, unorderedList, userMention, version };
739
+ export { type EscapeMarkdownOptions, Faces, type FormatEmojiOptions, GuildNavigationMentions, HeadingLevel, type RecursiveArray, TimestampStyles, type TimestampStylesString, applicationDirectory, blockQuote, bold, channelLink, channelMention, chatInputApplicationCommandMention, codeBlock, email, escapeBold, escapeBulletedList, escapeCodeBlock, escapeEscape, escapeHeading, escapeInlineCode, escapeItalic, escapeMarkdown, escapeMaskedLink, escapeNumberedList, escapeSpoiler, escapeStrikethrough, escapeUnderline, formatEmoji, heading, hideLinkEmbed, hyperlink, inlineCode, italic, linkedRoleMention, messageLink, orderedList, phoneNumber, quote, roleMention, spoiler, strikethrough, subtext, time, underline, underscore, unorderedList, userMention, version };
package/dist/index.js CHANGED
@@ -19,8 +19,8 @@ var __copyProps = (to, from, except, desc) => {
19
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
20
 
21
21
  // src/index.ts
22
- var src_exports = {};
23
- __export(src_exports, {
22
+ var index_exports = {};
23
+ __export(index_exports, {
24
24
  Faces: () => Faces,
25
25
  GuildNavigationMentions: () => GuildNavigationMentions,
26
26
  HeadingLevel: () => HeadingLevel,
@@ -32,6 +32,7 @@ __export(src_exports, {
32
32
  channelMention: () => channelMention,
33
33
  chatInputApplicationCommandMention: () => chatInputApplicationCommandMention,
34
34
  codeBlock: () => codeBlock,
35
+ email: () => email,
35
36
  escapeBold: () => escapeBold,
36
37
  escapeBulletedList: () => escapeBulletedList,
37
38
  escapeCodeBlock: () => escapeCodeBlock,
@@ -51,8 +52,10 @@ __export(src_exports, {
51
52
  hyperlink: () => hyperlink,
52
53
  inlineCode: () => inlineCode,
53
54
  italic: () => italic,
55
+ linkedRoleMention: () => linkedRoleMention,
54
56
  messageLink: () => messageLink,
55
57
  orderedList: () => orderedList,
58
+ phoneNumber: () => phoneNumber,
56
59
  quote: () => quote,
57
60
  roleMention: () => roleMention,
58
61
  spoiler: () => spoiler,
@@ -65,7 +68,7 @@ __export(src_exports, {
65
68
  userMention: () => userMention,
66
69
  version: () => version
67
70
  });
68
- module.exports = __toCommonJS(src_exports);
71
+ module.exports = __toCommonJS(index_exports);
69
72
 
70
73
  // src/escapers.ts
71
74
  function escapeMarkdown(text, options = {}) {
@@ -148,15 +151,21 @@ function escapeInlineCode(text) {
148
151
  __name(escapeInlineCode, "escapeInlineCode");
149
152
  function escapeItalic(text) {
150
153
  let idx = 0;
151
- const newText = text.replaceAll(/(?<=^|[^*])\*([^*]|\*\*|$)/g, (_, match) => {
152
- if (match === "**") return ++idx % 2 ? `\\*${match}` : `${match}\\*`;
153
- return `\\*${match}`;
154
- });
154
+ const newText = text.replaceAll(
155
+ /(?<=^|[^*])(?<!(?<!<)https?:\/\/\S*|<[^\s:]+:\/[^\s>]*)\*([^*]|\*\*|$)/g,
156
+ (_, match) => {
157
+ if (match === "**") return ++idx % 2 ? `\\*${match}` : `${match}\\*`;
158
+ return `\\*${match}`;
159
+ }
160
+ );
155
161
  idx = 0;
156
- return newText.replaceAll(/(?<=^|[^_])(?<!<a?:.+|https?:\/\/\S+)_(?!:\d+>)([^_]|__|$)/g, (_, match) => {
157
- if (match === "__") return ++idx % 2 ? `\\_${match}` : `${match}\\_`;
158
- return `\\_${match}`;
159
- });
162
+ return newText.replaceAll(
163
+ /(?<=^|[^_])(?<!<a?:.+|(?<!<)https?:\/\/\S*|<[^\s:]:\/[^\s>]*)_(?!:\d+>)([^_]|__|$)/g,
164
+ (_, match) => {
165
+ if (match === "__") return ++idx % 2 ? `\\_${match}` : `${match}\\_`;
166
+ return `\\_${match}`;
167
+ }
168
+ );
160
169
  }
161
170
  __name(escapeItalic, "escapeItalic");
162
171
  function escapeBold(text) {
@@ -269,6 +278,10 @@ function roleMention(roleId) {
269
278
  return `<@&${roleId}>`;
270
279
  }
271
280
  __name(roleMention, "roleMention");
281
+ function linkedRoleMention(roleId) {
282
+ return `<id:linked-roles:${roleId}>`;
283
+ }
284
+ __name(linkedRoleMention, "linkedRoleMention");
272
285
  function chatInputApplicationCommandMention(commandName, subcommandGroupName, subcommandName, commandId) {
273
286
  if (commandId !== void 0) {
274
287
  return `</${commandName} ${subcommandGroupName} ${subcommandName}:${commandId}>`;
@@ -285,7 +298,7 @@ function formatEmoji(emojiIdOrOptions, animated) {
285
298
  animated: animated ?? false
286
299
  } : emojiIdOrOptions;
287
300
  const { id, animated: isAnimated, name: emojiName } = options;
288
- return `<${isAnimated ? "a" : ""}:${emojiName ?? "_"}:${id}>`;
301
+ return `<${isAnimated ? "a" : ""}:${emojiName ?? "emoji"}:${id}>`;
289
302
  }
290
303
  __name(formatEmoji, "formatEmoji");
291
304
  function channelLink(channelId, guildId) {
@@ -344,6 +357,23 @@ function applicationDirectory(applicationId, skuId) {
344
357
  return skuId ? `${url}/${skuId}` : url;
345
358
  }
346
359
  __name(applicationDirectory, "applicationDirectory");
360
+ function email(email2, headers) {
361
+ if (headers) {
362
+ const searchParams = new URLSearchParams(
363
+ Object.fromEntries(Object.entries(headers).map(([key, value]) => [key.toLowerCase(), value]))
364
+ );
365
+ return `<${email2}?${searchParams.toString()}>`;
366
+ }
367
+ return `<${email2}>`;
368
+ }
369
+ __name(email, "email");
370
+ function phoneNumber(phoneNumber2) {
371
+ if (!phoneNumber2.startsWith("+")) {
372
+ throw new Error('Phone number must start with a "+" sign.');
373
+ }
374
+ return `<${phoneNumber2}>`;
375
+ }
376
+ __name(phoneNumber, "phoneNumber");
347
377
  var TimestampStyles = {
348
378
  /**
349
379
  * Short time format, consisting of hours and minutes.
@@ -351,10 +381,17 @@ var TimestampStyles = {
351
381
  * @example `16:20`
352
382
  */
353
383
  ShortTime: "t",
384
+ /**
385
+ * Medium time format, consisting of hours, minutes, and seconds.
386
+ *
387
+ * @example `16:20:30`
388
+ */
389
+ MediumTime: "T",
354
390
  /**
355
391
  * Long time format, consisting of hours, minutes, and seconds.
356
392
  *
357
393
  * @example `16:20:30`
394
+ * @deprecated Use {@link TimestampStyles.MediumTime} instead.
358
395
  */
359
396
  LongTime: "T",
360
397
  /**
@@ -366,21 +403,47 @@ var TimestampStyles = {
366
403
  /**
367
404
  * Long date format, consisting of day, month, and year.
368
405
  *
369
- * @example `20 April 2021`
406
+ * @example `April 20, 2021`
370
407
  */
371
408
  LongDate: "D",
409
+ /**
410
+ * Long date-short time format, consisting of long date and short time.
411
+ *
412
+ * @example `April 20, 2021 at 16:20`
413
+ */
414
+ LongDateShortTime: "f",
372
415
  /**
373
416
  * Short date-time format, consisting of short date and short time formats.
374
417
  *
375
418
  * @example `20 April 2021 16:20`
419
+ * @deprecated Use {@link TimestampStyles.LongDateShortTime} instead.
376
420
  */
377
421
  ShortDateTime: "f",
422
+ /**
423
+ * Full date-short time format, consisting of full date and short time.
424
+ *
425
+ * @example `Tuesday, April 20, 2021 at 16:20`
426
+ */
427
+ FullDateShortTime: "F",
378
428
  /**
379
429
  * Long date-time format, consisting of long date and short time formats.
380
430
  *
381
431
  * @example `Tuesday, 20 April 2021 16:20`
432
+ * @deprecated Use {@link TimestampStyles.FullDateShortTime} instead.
382
433
  */
383
434
  LongDateTime: "F",
435
+ /**
436
+ * Short date, short time format, consisting of short date and short time.
437
+ *
438
+ * @example `20/04/2021, 16:20`
439
+ */
440
+ ShortDateShortTime: "s",
441
+ /**
442
+ * Short date, medium time format, consisting of short date and medium time.
443
+ *
444
+ * @example `20/04/2021, 16:20:30`
445
+ */
446
+ ShortDateMediumTime: "S",
384
447
  /**
385
448
  * Relative time format, consisting of a relative duration format.
386
449
  *
@@ -398,11 +461,12 @@ var GuildNavigationMentions = /* @__PURE__ */ ((GuildNavigationMentions2) => {
398
461
  GuildNavigationMentions2["Browse"] = "<id:browse>";
399
462
  GuildNavigationMentions2["Customize"] = "<id:customize>";
400
463
  GuildNavigationMentions2["Guide"] = "<id:guide>";
464
+ GuildNavigationMentions2["LinkedRoles"] = "<id:linked-roles>";
401
465
  return GuildNavigationMentions2;
402
466
  })(GuildNavigationMentions || {});
403
467
 
404
468
  // src/index.ts
405
- var version = "0.6.1";
469
+ var version = "0.6.2";
406
470
  // Annotate the CommonJS export names for ESM import in node:
407
471
  0 && (module.exports = {
408
472
  Faces,
@@ -416,6 +480,7 @@ var version = "0.6.1";
416
480
  channelMention,
417
481
  chatInputApplicationCommandMention,
418
482
  codeBlock,
483
+ email,
419
484
  escapeBold,
420
485
  escapeBulletedList,
421
486
  escapeCodeBlock,
@@ -435,8 +500,10 @@ var version = "0.6.1";
435
500
  hyperlink,
436
501
  inlineCode,
437
502
  italic,
503
+ linkedRoleMention,
438
504
  messageLink,
439
505
  orderedList,
506
+ phoneNumber,
440
507
  quote,
441
508
  roleMention,
442
509
  spoiler,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/escapers.ts","../src/formatters.ts"],"sourcesContent":["export * from './escapers.js';\nexport * from './formatters.js';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/formatters#readme | @discordjs/formatters} version\n * that you are currently using.\n *\n * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '0.6.1' as string;\n","/* eslint-disable prefer-named-capture-group */\n\n/**\n * The options that affect what will be escaped.\n */\nexport interface EscapeMarkdownOptions {\n\t/**\n\t * Whether to escape bold text.\n\t *\n\t * @defaultValue `true`\n\t */\n\tbold?: boolean;\n\n\t/**\n\t * Whether to escape bulleted lists.\n\t *\n\t * @defaultValue `false`\n\t */\n\tbulletedList?: boolean;\n\n\t/**\n\t * Whether to escape code blocks.\n\t *\n\t * @defaultValue `true`\n\t */\n\tcodeBlock?: boolean;\n\n\t/**\n\t * Whether to escape text inside code blocks.\n\t *\n\t * @defaultValue `true`\n\t */\n\tcodeBlockContent?: boolean;\n\n\t/**\n\t * Whether to escape `\\`.\n\t *\n\t * @defaultValue `true`\n\t */\n\tescape?: boolean;\n\n\t/**\n\t * Whether to escape headings.\n\t *\n\t * @defaultValue `false`\n\t */\n\theading?: boolean;\n\n\t/**\n\t * Whether to escape inline code.\n\t *\n\t * @defaultValue `true`\n\t */\n\tinlineCode?: boolean;\n\n\t/**\n\t * Whether to escape text inside inline code.\n\t *\n\t * @defaultValue `true`\n\t */\n\tinlineCodeContent?: boolean;\n\t/**\n\t * Whether to escape italics.\n\t *\n\t * @defaultValue `true`\n\t */\n\titalic?: boolean;\n\n\t/**\n\t * Whether to escape masked links.\n\t *\n\t * @defaultValue `false`\n\t */\n\tmaskedLink?: boolean;\n\n\t/**\n\t * Whether to escape numbered lists.\n\t *\n\t * @defaultValue `false`\n\t */\n\tnumberedList?: boolean;\n\n\t/**\n\t * Whether to escape spoilers.\n\t *\n\t * @defaultValue `true`\n\t */\n\tspoiler?: boolean;\n\n\t/**\n\t * Whether to escape strikethroughs.\n\t *\n\t * @defaultValue `true`\n\t */\n\tstrikethrough?: boolean;\n\n\t/**\n\t * Whether to escape underlines.\n\t *\n\t * @defaultValue `true`\n\t */\n\tunderline?: boolean;\n}\n\n/**\n * Escapes any Discord-flavored markdown in a string.\n *\n * @param text - Content to escape\n * @param options - Options for escaping the markdown\n */\nexport function escapeMarkdown(text: string, options: EscapeMarkdownOptions = {}): string {\n\tconst {\n\t\tcodeBlock = true,\n\t\tinlineCode = true,\n\t\tbold = true,\n\t\titalic = true,\n\t\tunderline = true,\n\t\tstrikethrough = true,\n\t\tspoiler = true,\n\t\tcodeBlockContent = true,\n\t\tinlineCodeContent = true,\n\t\tescape = true,\n\t\theading = false,\n\t\tbulletedList = false,\n\t\tnumberedList = false,\n\t\tmaskedLink = false,\n\t} = options;\n\n\tif (!codeBlockContent) {\n\t\treturn text\n\t\t\t.split('```')\n\t\t\t.map((subString, index, array) => {\n\t\t\t\tif (index % 2 && index !== array.length - 1) return subString;\n\t\t\t\treturn escapeMarkdown(subString, {\n\t\t\t\t\tinlineCode,\n\t\t\t\t\tbold,\n\t\t\t\t\titalic,\n\t\t\t\t\tunderline,\n\t\t\t\t\tstrikethrough,\n\t\t\t\t\tspoiler,\n\t\t\t\t\tinlineCodeContent,\n\t\t\t\t\tescape,\n\t\t\t\t\theading,\n\t\t\t\t\tbulletedList,\n\t\t\t\t\tnumberedList,\n\t\t\t\t\tmaskedLink,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(codeBlock ? '\\\\`\\\\`\\\\`' : '```');\n\t}\n\n\tif (!inlineCodeContent) {\n\t\treturn text\n\t\t\t.split(/(?<=^|[^`])`(?=[^`]|$)/g)\n\t\t\t.map((subString, index, array) => {\n\t\t\t\tif (index % 2 && index !== array.length - 1) return subString;\n\t\t\t\treturn escapeMarkdown(subString, {\n\t\t\t\t\tcodeBlock,\n\t\t\t\t\tbold,\n\t\t\t\t\titalic,\n\t\t\t\t\tunderline,\n\t\t\t\t\tstrikethrough,\n\t\t\t\t\tspoiler,\n\t\t\t\t\tescape,\n\t\t\t\t\theading,\n\t\t\t\t\tbulletedList,\n\t\t\t\t\tnumberedList,\n\t\t\t\t\tmaskedLink,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(inlineCode ? '\\\\`' : '`');\n\t}\n\n\tlet res = text;\n\tif (escape) res = escapeEscape(res);\n\tif (inlineCode) res = escapeInlineCode(res);\n\tif (codeBlock) res = escapeCodeBlock(res);\n\tif (italic) res = escapeItalic(res);\n\tif (bold) res = escapeBold(res);\n\tif (underline) res = escapeUnderline(res);\n\tif (strikethrough) res = escapeStrikethrough(res);\n\tif (spoiler) res = escapeSpoiler(res);\n\tif (heading) res = escapeHeading(res);\n\tif (bulletedList) res = escapeBulletedList(res);\n\tif (numberedList) res = escapeNumberedList(res);\n\tif (maskedLink) res = escapeMaskedLink(res);\n\treturn res;\n}\n\n/**\n * Escapes code block markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeCodeBlock(text: string): string {\n\treturn text.replaceAll('```', '\\\\`\\\\`\\\\`');\n}\n\n/**\n * Escapes inline code markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeInlineCode(text: string): string {\n\treturn text.replaceAll(/(?<=^|[^`])``?(?=[^`]|$)/g, (match) => (match.length === 2 ? '\\\\`\\\\`' : '\\\\`'));\n}\n\n/**\n * Escapes italic markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeItalic(text: string): string {\n\tlet idx = 0;\n\tconst newText = text.replaceAll(/(?<=^|[^*])\\*([^*]|\\*\\*|$)/g, (_, match) => {\n\t\tif (match === '**') return ++idx % 2 ? `\\\\*${match}` : `${match}\\\\*`;\n\t\treturn `\\\\*${match}`;\n\t});\n\tidx = 0;\n\treturn newText.replaceAll(/(?<=^|[^_])(?<!<a?:.+|https?:\\/\\/\\S+)_(?!:\\d+>)([^_]|__|$)/g, (_, match) => {\n\t\tif (match === '__') return ++idx % 2 ? `\\\\_${match}` : `${match}\\\\_`;\n\t\treturn `\\\\_${match}`;\n\t});\n}\n\n/**\n * Escapes bold markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeBold(text: string): string {\n\tlet idx = 0;\n\treturn text.replaceAll(/\\*\\*(\\*)?/g, (_, match) => {\n\t\tif (match) return ++idx % 2 ? `${match}\\\\*\\\\*` : `\\\\*\\\\*${match}`;\n\t\treturn '\\\\*\\\\*';\n\t});\n}\n\n/**\n * Escapes underline markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeUnderline(text: string): string {\n\tlet idx = 0;\n\treturn text.replaceAll(/(?<!<a?:.+|https?:\\/\\/\\S+)__(_)?(?!:\\d+>)/g, (_, match) => {\n\t\tif (match) return ++idx % 2 ? `${match}\\\\_\\\\_` : `\\\\_\\\\_${match}`;\n\t\treturn '\\\\_\\\\_';\n\t});\n}\n\n/**\n * Escapes strikethrough markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeStrikethrough(text: string): string {\n\treturn text.replaceAll('~~', '\\\\~\\\\~');\n}\n\n/**\n * Escapes spoiler markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeSpoiler(text: string): string {\n\treturn text.replaceAll('||', '\\\\|\\\\|');\n}\n\n/**\n * Escapes escape characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeEscape(text: string): string {\n\treturn text.replaceAll('\\\\', '\\\\\\\\');\n}\n\n/**\n * Escapes heading characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeHeading(text: string): string {\n\treturn text.replaceAll(/^( {0,2})([*-] )?( *)(#{1,3} )/gm, '$1$2$3\\\\$4');\n}\n\n/**\n * Escapes bulleted list characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeBulletedList(text: string): string {\n\treturn text.replaceAll(/^( *)([*-])( +)/gm, '$1\\\\$2$3');\n}\n\n/**\n * Escapes numbered list characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeNumberedList(text: string): string {\n\treturn text.replaceAll(/^( *\\d+)\\./gm, '$1\\\\.');\n}\n\n/**\n * Escapes masked link characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeMaskedLink(text: string): string {\n\treturn text.replaceAll(/\\[.+]\\(.+\\)/gm, '\\\\$&');\n}\n","import type { URL } from 'node:url';\nimport type { Snowflake } from 'discord-api-types/globals';\n\n/**\n * Wraps the content inside a code block with no language.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function codeBlock<Content extends string>(content: Content): `\\`\\`\\`\\n${Content}\\n\\`\\`\\``;\n\n/**\n * Wraps the content inside a code block with the specified language.\n *\n * @typeParam Language - This is inferred by the supplied language\n * @typeParam Content - This is inferred by the supplied content\n * @param language - The language for the code block\n * @param content - The content to wrap\n */\nexport function codeBlock<Language extends string, Content extends string>(\n\tlanguage: Language,\n\tcontent: Content,\n): `\\`\\`\\`${Language}\\n${Content}\\n\\`\\`\\``;\n\nexport function codeBlock(language: string, content?: string): string {\n\treturn content === undefined ? `\\`\\`\\`\\n${language}\\n\\`\\`\\`` : `\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``;\n}\n\n/**\n * Wraps the content inside \\`backticks\\` which formats it as inline code.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function inlineCode<Content extends string>(content: Content): `\\`${Content}\\`` {\n\treturn `\\`${content}\\``;\n}\n\n/**\n * Formats the content into italic text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function italic<Content extends string>(content: Content): `_${Content}_` {\n\treturn `_${content}_`;\n}\n\n/**\n * Formats the content into bold text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function bold<Content extends string>(content: Content): `**${Content}**` {\n\treturn `**${content}**`;\n}\n\n/**\n * Formats the content into underscored text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @deprecated Use {@link underline} instead.\n */\nexport function underscore<Content extends string>(content: Content): `__${Content}__` {\n\treturn underline(content);\n}\n\n/**\n * Formats the content into underlined text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function underline<Content extends string>(content: Content): `__${Content}__` {\n\treturn `__${content}__`;\n}\n\n/**\n * Formats the content into strike-through text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function strikethrough<Content extends string>(content: Content): `~~${Content}~~` {\n\treturn `~~${content}~~`;\n}\n\n/**\n * Formats the content into a quote.\n *\n * @remarks This needs to be at the start of the line for Discord to format it.\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function quote<Content extends string>(content: Content): `> ${Content}` {\n\treturn `> ${content}`;\n}\n\n/**\n * Formats the content into a block quote.\n *\n * @remarks This needs to be at the start of the line for Discord to format it.\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function blockQuote<Content extends string>(content: Content): `>>> ${Content}` {\n\treturn `>>> ${content}`;\n}\n\n/**\n * Wraps the URL into `<>` which stops it from embedding.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed<Content extends string>(url: Content): `<${Content}>`;\n\n/**\n * Wraps the URL into `<>` which stops it from embedding.\n *\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed(url: URL): `<${string}>`;\n\nexport function hideLinkEmbed(url: URL | string) {\n\treturn `<${url}>`;\n}\n\n/**\n * Formats the content and the URL into a masked URL.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink<Content extends string>(content: Content, url: URL): `[${Content}](${string})`;\n\n/**\n * Formats the content and the URL into a masked URL.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Url - This is inferred by the supplied URL\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink<Content extends string, Url extends string>(\n\tcontent: Content,\n\turl: Url,\n): `[${Content}](${Url})`;\n\n/**\n * Formats the content and the URL into a masked URL with a custom tooltip.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Title - This is inferred by the supplied title\n * @param content - The content to display\n * @param url - The URL the content links to\n * @param title - The title shown when hovering on the masked link\n */\nexport function hyperlink<Content extends string, Title extends string>(\n\tcontent: Content,\n\turl: URL,\n\ttitle: Title,\n): `[${Content}](${string} \"${Title}\")`;\n\n/**\n * Formats the content and the URL into a masked URL with a custom tooltip.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Url - This is inferred by the supplied URL\n * @typeParam Title - This is inferred by the supplied title\n * @param content - The content to display\n * @param url - The URL the content links to\n * @param title - The title shown when hovering on the masked link\n */\nexport function hyperlink<Content extends string, Url extends string, Title extends string>(\n\tcontent: Content,\n\turl: Url,\n\ttitle: Title,\n): `[${Content}](${Url} \"${Title}\")`;\n\nexport function hyperlink(content: string, url: URL | string, title?: string) {\n\treturn title ? `[${content}](${url} \"${title}\")` : `[${content}](${url})`;\n}\n\n/**\n * Formats the content into a spoiler.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function spoiler<Content extends string>(content: Content): `||${Content}||` {\n\treturn `||${content}||`;\n}\n\n/**\n * Formats a user id into a user mention.\n *\n * @typeParam UserId - This is inferred by the supplied user id\n * @param userId - The user id to format\n */\nexport function userMention<UserId extends Snowflake>(userId: UserId): `<@${UserId}>` {\n\treturn `<@${userId}>`;\n}\n\n/**\n * Formats a channel id into a channel mention.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @param channelId - The channel id to format\n */\nexport function channelMention<ChannelId extends Snowflake>(channelId: ChannelId): `<#${ChannelId}>` {\n\treturn `<#${channelId}>`;\n}\n\n/**\n * Formats a role id into a role mention.\n *\n * @typeParam RoleId - This is inferred by the supplied role id\n * @param roleId - The role id to format\n */\nexport function roleMention<RoleId extends Snowflake>(roleId: RoleId): `<@&${RoleId}>` {\n\treturn `<@&${roleId}>`;\n}\n\n/**\n * Formats an application command name, subcommand group name, subcommand name, and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam SubcommandGroupName - This is inferred by the supplied subcommand group name\n * @typeParam SubcommandName - This is inferred by the supplied subcommand name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param subcommandGroupName - The subcommand group name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandGroupName extends string,\n\tSubcommandName extends string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandGroupName: SubcommandGroupName,\n\tsubcommandName: SubcommandName,\n\tcommandId: CommandId,\n): `</${CommandName} ${SubcommandGroupName} ${SubcommandName}:${CommandId}>`;\n\n/**\n * Formats an application command name, subcommand name, and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam SubcommandName - This is inferred by the supplied subcommand name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandName extends string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandName: SubcommandName,\n\tcommandId: CommandId,\n): `</${CommandName} ${SubcommandName}:${CommandId}>`;\n\n/**\n * Formats an application command name and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<CommandName extends string, CommandId extends Snowflake>(\n\tcommandName: CommandName,\n\tcommandId: CommandId,\n): `</${CommandName}:${CommandId}>`;\n\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandGroupName extends Snowflake | string,\n\tSubcommandName extends Snowflake | string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandGroupName: SubcommandGroupName,\n\tsubcommandName?: SubcommandName,\n\tcommandId?: CommandId,\n):\n\t| `</${CommandName} ${SubcommandGroupName} ${SubcommandName}:${CommandId}>`\n\t| `</${CommandName} ${SubcommandGroupName}:${SubcommandName}>`\n\t| `</${CommandName}:${SubcommandGroupName}>` {\n\tif (commandId !== undefined) {\n\t\treturn `</${commandName} ${subcommandGroupName} ${subcommandName!}:${commandId}>`;\n\t}\n\n\tif (subcommandName !== undefined) {\n\t\treturn `</${commandName} ${subcommandGroupName}:${subcommandName}>`;\n\t}\n\n\treturn `</${commandName}:${subcommandGroupName}>`;\n}\n\n/**\n * Formats a non-animated emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n */\nexport function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: false): `<:_:${EmojiId}>`;\n\n/**\n * Formats an animated emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n * @param animated - Whether the emoji is animated\n */\nexport function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: true): `<a:_:${EmojiId}>`;\n\n/**\n * Formats an emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n * @param animated - Whether the emoji is animated\n */\nexport function formatEmoji<EmojiId extends Snowflake>(\n\temojiId: EmojiId,\n\tanimated?: boolean,\n): `<:_:${EmojiId}>` | `<a:_:${EmojiId}>`;\n\n/**\n * Formats a non-animated emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName> & { animated: true },\n): `<a:${EmojiName}:${EmojiId}>`;\n\n/**\n * Formats an animated emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName> & { animated?: false },\n): `<:${EmojiName}:${EmojiId}>`;\n\n/**\n * Formats an emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied emoji name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName>,\n): `<:${EmojiName}:${EmojiId}>` | `<a:${EmojiName}:${EmojiId}>`;\n\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\temojiIdOrOptions: EmojiId | FormatEmojiOptions<EmojiId, EmojiName>,\n\tanimated?: boolean,\n): `<:${string}:${EmojiId}>` | `<a:${string}:${EmojiId}>` {\n\tconst options =\n\t\ttypeof emojiIdOrOptions === 'string'\n\t\t\t? {\n\t\t\t\t\tid: emojiIdOrOptions,\n\t\t\t\t\tanimated: animated ?? false,\n\t\t\t\t}\n\t\t\t: emojiIdOrOptions;\n\n\tconst { id, animated: isAnimated, name: emojiName } = options;\n\n\treturn `<${isAnimated ? 'a' : ''}:${emojiName ?? '_'}:${id}>`;\n}\n\n/**\n * The options for formatting an emoji.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied emoji name\n */\nexport interface FormatEmojiOptions<EmojiId extends Snowflake, EmojiName extends string> {\n\t/**\n\t * Whether the emoji is animated\n\t */\n\tanimated?: boolean;\n\t/**\n\t * The emoji id to format\n\t */\n\tid: EmojiId;\n\t/**\n\t * The name of the emoji\n\t */\n\tname?: EmojiName;\n}\n\n/**\n * Formats a channel link for a direct message channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @param channelId - The channel's id\n */\nexport function channelLink<ChannelId extends Snowflake>(\n\tchannelId: ChannelId,\n): `https://discord.com/channels/@me/${ChannelId}`;\n\n/**\n * Formats a channel link for a guild channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam GuildId - This is inferred by the supplied guild id\n * @param channelId - The channel's id\n * @param guildId - The guild's id\n */\nexport function channelLink<ChannelId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tguildId: GuildId,\n): `https://discord.com/channels/${GuildId}/${ChannelId}`;\n\nexport function channelLink<ChannelId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tguildId?: GuildId,\n): `https://discord.com/channels/@me/${ChannelId}` | `https://discord.com/channels/${GuildId}/${ChannelId}` {\n\treturn `https://discord.com/channels/${guildId ?? '@me'}/${channelId}`;\n}\n\n/**\n * Formats a message link for a direct message channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam MessageId - This is inferred by the supplied message id\n * @param channelId - The channel's id\n * @param messageId - The message's id\n */\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n): `https://discord.com/channels/@me/${ChannelId}/${MessageId}`;\n\n/**\n * Formats a message link for a guild channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam MessageId - This is inferred by the supplied message id\n * @typeParam GuildId - This is inferred by the supplied guild id\n * @param channelId - The channel's id\n * @param messageId - The message's id\n * @param guildId - The guild's id\n */\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n\tguildId: GuildId,\n): `https://discord.com/channels/${GuildId}/${ChannelId}/${MessageId}`;\n\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n\tguildId?: GuildId,\n):\n\t| `https://discord.com/channels/@me/${ChannelId}/${MessageId}`\n\t| `https://discord.com/channels/${GuildId}/${ChannelId}/${MessageId}` {\n\treturn `${guildId === undefined ? channelLink(channelId) : channelLink(channelId, guildId)}/${messageId}`;\n}\n\n/**\n * The heading levels for expanded markdown.\n */\nexport enum HeadingLevel {\n\t/**\n\t * The first heading level.\n\t */\n\tOne = 1,\n\t/**\n\t * The second heading level.\n\t */\n\tTwo,\n\t/**\n\t * The third heading level.\n\t */\n\tThree,\n}\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level?: HeadingLevel.One): `# ${Content}`;\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level: HeadingLevel.Two): `## ${Content}`;\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level: HeadingLevel.Three): `### ${Content}`;\n\nexport function heading(content: string, level?: HeadingLevel) {\n\tswitch (level) {\n\t\tcase HeadingLevel.Three:\n\t\t\treturn `### ${content}`;\n\t\tcase HeadingLevel.Two:\n\t\t\treturn `## ${content}`;\n\t\tdefault:\n\t\t\treturn `# ${content}`;\n\t}\n}\n\n/**\n * A type that recursively traverses into arrays.\n */\nexport type RecursiveArray<ItemType> = readonly (ItemType | RecursiveArray<ItemType>)[];\n\n/**\n * Callback function for list formatters.\n *\n * @internal\n */\nfunction listCallback(element: RecursiveArray<string>, startNumber?: number, depth = 0): string {\n\tif (Array.isArray(element)) {\n\t\treturn element.map((element) => listCallback(element, startNumber, depth + 1)).join('\\n');\n\t}\n\n\treturn `${' '.repeat(depth - 1)}${startNumber ? `${startNumber}.` : '-'} ${element}`;\n}\n\n/**\n * Formats the elements in the array to an ordered list.\n *\n * @param list - The array of elements to list\n * @param startNumber - The starting number for the list\n */\nexport function orderedList(list: RecursiveArray<string>, startNumber = 1): string {\n\treturn listCallback(list, Math.max(startNumber, 1));\n}\n\n/**\n * Formats the elements in the array to an unordered list.\n *\n * @param list - The array of elements to list\n */\nexport function unorderedList(list: RecursiveArray<string>): string {\n\treturn listCallback(list);\n}\n\n/**\n * Formats the content into a subtext.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function subtext<Content extends string>(content: Content): `-# ${Content}` {\n\treturn `-# ${content}`;\n}\n\n/**\n * Formats a date into a short date-time string.\n *\n * @param date - The date to format. Defaults to the current time\n */\nexport function time(date?: Date): `<t:${bigint}>`;\n\n/**\n * Formats a date given a format style.\n *\n * @typeParam Style - This is inferred by the supplied {@link TimestampStylesString}\n * @param date - The date to format\n * @param style - The style to use\n */\nexport function time<Style extends TimestampStylesString>(date: Date, style: Style): `<t:${bigint}:${Style}>`;\n\n/**\n * Formats the given timestamp into a short date-time string.\n *\n * @typeParam Seconds - This is inferred by the supplied timestamp\n * @param seconds - A Unix timestamp in seconds\n */\nexport function time<Seconds extends number>(seconds: Seconds): `<t:${Seconds}>`;\n\n/**\n * Formats the given timestamp into a short date-time string.\n *\n * @typeParam Seconds - This is inferred by the supplied timestamp\n * @typeParam Style - This is inferred by the supplied {@link TimestampStylesString}\n * @param seconds - A Unix timestamp in seconds\n * @param style - The style to use\n */\nexport function time<Seconds extends number, Style extends TimestampStylesString>(\n\tseconds: Seconds,\n\tstyle: Style,\n): `<t:${Seconds}:${Style}>`;\n\nexport function time(timeOrSeconds?: Date | number, style?: TimestampStylesString): string {\n\tif (typeof timeOrSeconds !== 'number') {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\ttimeOrSeconds = Math.floor((timeOrSeconds?.getTime() ?? Date.now()) / 1_000);\n\t}\n\n\treturn typeof style === 'string' ? `<t:${timeOrSeconds}:${style}>` : `<t:${timeOrSeconds}>`;\n}\n\n/**\n * Formats an application directory link.\n *\n * @typeParam ApplicationId - This is inferred by the supplied application id\n * @param applicationId - The application id\n */\nexport function applicationDirectory<ApplicationId extends Snowflake>(\n\tapplicationId: ApplicationId,\n): `https://discord.com/application-directory/${ApplicationId}/store`;\n\n/**\n * Formats an application directory SKU link.\n *\n * @typeParam ApplicationId - This is inferred by the supplied application id\n * @typeParam SKUId - This is inferred by the supplied SKU id\n * @param applicationId - The application id\n * @param skuId - The SKU id\n */\nexport function applicationDirectory<ApplicationId extends Snowflake, SKUId extends Snowflake>(\n\tapplicationId: ApplicationId,\n\tskuId: SKUId,\n): `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`;\n\nexport function applicationDirectory<ApplicationId extends Snowflake, SKUId extends Snowflake>(\n\tapplicationId: ApplicationId,\n\tskuId?: SKUId,\n):\n\t| `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`\n\t| `https://discord.com/application-directory/${ApplicationId}/store` {\n\tconst url = `https://discord.com/application-directory/${applicationId}/store` as const;\n\treturn skuId ? `${url}/${skuId}` : url;\n}\n\n/**\n * The {@link https://discord.com/developers/docs/reference#message-formatting-timestamp-styles | message formatting timestamp styles}\n * supported by Discord.\n */\nexport const TimestampStyles = {\n\t/**\n\t * Short time format, consisting of hours and minutes.\n\t *\n\t * @example `16:20`\n\t */\n\tShortTime: 't',\n\n\t/**\n\t * Long time format, consisting of hours, minutes, and seconds.\n\t *\n\t * @example `16:20:30`\n\t */\n\tLongTime: 'T',\n\n\t/**\n\t * Short date format, consisting of day, month, and year.\n\t *\n\t * @example `20/04/2021`\n\t */\n\tShortDate: 'd',\n\n\t/**\n\t * Long date format, consisting of day, month, and year.\n\t *\n\t * @example `20 April 2021`\n\t */\n\tLongDate: 'D',\n\n\t/**\n\t * Short date-time format, consisting of short date and short time formats.\n\t *\n\t * @example `20 April 2021 16:20`\n\t */\n\tShortDateTime: 'f',\n\n\t/**\n\t * Long date-time format, consisting of long date and short time formats.\n\t *\n\t * @example `Tuesday, 20 April 2021 16:20`\n\t */\n\tLongDateTime: 'F',\n\n\t/**\n\t * Relative time format, consisting of a relative duration format.\n\t *\n\t * @example `2 months ago`\n\t */\n\tRelativeTime: 'R',\n} as const satisfies Record<string, string>;\n\n/**\n * The possible {@link TimestampStyles} values.\n */\nexport type TimestampStylesString = (typeof TimestampStyles)[keyof typeof TimestampStyles];\n\n/**\n * All the available faces from Discord's native slash commands.\n */\nexport enum Faces {\n\t/**\n\t * `¯\\_(ツ)_/¯`\n\t */\n\tShrug = '¯\\\\_(ツ)_/¯',\n\n\t/**\n\t * `(╯°□°)╯︵ ┻━┻`\n\t */\n\tTableflip = '(╯°□°)╯︵ ┻━┻',\n\n\t/**\n\t * `┬─┬ノ( º _ ºノ)`\n\t */\n\tUnflip = '┬─┬ノ( º _ ºノ)',\n}\n\n/**\n * All the available guild navigation mentions.\n */\nexport enum GuildNavigationMentions {\n\t/**\n\t * Browse Channels tab.\n\t */\n\tBrowse = '<id:browse>',\n\t/**\n\t * Customize tab with the server's {@link https://discord.com/developers/docs/resources/guild#guild-onboarding-object | onboarding prompts}.\n\t */\n\tCustomize = '<id:customize>',\n\t/**\n\t * {@link https://support.discord.com/hc/articles/13497665141655 | Server Guide} tab.\n\t */\n\tGuide = '<id:guide>',\n}\n"],"mappings":"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","names":["codeBlock","inlineCode","bold","italic","underline","strikethrough","spoiler","heading","HeadingLevel","element","Faces","GuildNavigationMentions"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/escapers.ts","../src/formatters.ts"],"sourcesContent":["export * from './escapers.js';\nexport * from './formatters.js';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/formatters#readme | @discordjs/formatters} version\n * that you are currently using.\n *\n * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '0.6.2' as string;\n","/* eslint-disable prefer-named-capture-group */\n\n/**\n * The options that affect what will be escaped.\n */\nexport interface EscapeMarkdownOptions {\n\t/**\n\t * Whether to escape bold text.\n\t *\n\t * @defaultValue `true`\n\t */\n\tbold?: boolean;\n\n\t/**\n\t * Whether to escape bulleted lists.\n\t *\n\t * @defaultValue `false`\n\t */\n\tbulletedList?: boolean;\n\n\t/**\n\t * Whether to escape code blocks.\n\t *\n\t * @defaultValue `true`\n\t */\n\tcodeBlock?: boolean;\n\n\t/**\n\t * Whether to escape text inside code blocks.\n\t *\n\t * @defaultValue `true`\n\t */\n\tcodeBlockContent?: boolean;\n\n\t/**\n\t * Whether to escape `\\`.\n\t *\n\t * @defaultValue `true`\n\t */\n\tescape?: boolean;\n\n\t/**\n\t * Whether to escape headings.\n\t *\n\t * @defaultValue `false`\n\t */\n\theading?: boolean;\n\n\t/**\n\t * Whether to escape inline code.\n\t *\n\t * @defaultValue `true`\n\t */\n\tinlineCode?: boolean;\n\n\t/**\n\t * Whether to escape text inside inline code.\n\t *\n\t * @defaultValue `true`\n\t */\n\tinlineCodeContent?: boolean;\n\t/**\n\t * Whether to escape italics.\n\t *\n\t * @defaultValue `true`\n\t */\n\titalic?: boolean;\n\n\t/**\n\t * Whether to escape masked links.\n\t *\n\t * @defaultValue `false`\n\t */\n\tmaskedLink?: boolean;\n\n\t/**\n\t * Whether to escape numbered lists.\n\t *\n\t * @defaultValue `false`\n\t */\n\tnumberedList?: boolean;\n\n\t/**\n\t * Whether to escape spoilers.\n\t *\n\t * @defaultValue `true`\n\t */\n\tspoiler?: boolean;\n\n\t/**\n\t * Whether to escape strikethroughs.\n\t *\n\t * @defaultValue `true`\n\t */\n\tstrikethrough?: boolean;\n\n\t/**\n\t * Whether to escape underlines.\n\t *\n\t * @defaultValue `true`\n\t */\n\tunderline?: boolean;\n}\n\n/**\n * Escapes any Discord-flavored markdown in a string.\n *\n * @param text - Content to escape\n * @param options - Options for escaping the markdown\n */\nexport function escapeMarkdown(text: string, options: EscapeMarkdownOptions = {}): string {\n\tconst {\n\t\tcodeBlock = true,\n\t\tinlineCode = true,\n\t\tbold = true,\n\t\titalic = true,\n\t\tunderline = true,\n\t\tstrikethrough = true,\n\t\tspoiler = true,\n\t\tcodeBlockContent = true,\n\t\tinlineCodeContent = true,\n\t\tescape = true,\n\t\theading = false,\n\t\tbulletedList = false,\n\t\tnumberedList = false,\n\t\tmaskedLink = false,\n\t} = options;\n\n\tif (!codeBlockContent) {\n\t\treturn text\n\t\t\t.split('```')\n\t\t\t.map((subString, index, array) => {\n\t\t\t\tif (index % 2 && index !== array.length - 1) return subString;\n\t\t\t\treturn escapeMarkdown(subString, {\n\t\t\t\t\tinlineCode,\n\t\t\t\t\tbold,\n\t\t\t\t\titalic,\n\t\t\t\t\tunderline,\n\t\t\t\t\tstrikethrough,\n\t\t\t\t\tspoiler,\n\t\t\t\t\tinlineCodeContent,\n\t\t\t\t\tescape,\n\t\t\t\t\theading,\n\t\t\t\t\tbulletedList,\n\t\t\t\t\tnumberedList,\n\t\t\t\t\tmaskedLink,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(codeBlock ? '\\\\`\\\\`\\\\`' : '```');\n\t}\n\n\tif (!inlineCodeContent) {\n\t\treturn text\n\t\t\t.split(/(?<=^|[^`])`(?=[^`]|$)/g)\n\t\t\t.map((subString, index, array) => {\n\t\t\t\tif (index % 2 && index !== array.length - 1) return subString;\n\t\t\t\treturn escapeMarkdown(subString, {\n\t\t\t\t\tcodeBlock,\n\t\t\t\t\tbold,\n\t\t\t\t\titalic,\n\t\t\t\t\tunderline,\n\t\t\t\t\tstrikethrough,\n\t\t\t\t\tspoiler,\n\t\t\t\t\tescape,\n\t\t\t\t\theading,\n\t\t\t\t\tbulletedList,\n\t\t\t\t\tnumberedList,\n\t\t\t\t\tmaskedLink,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(inlineCode ? '\\\\`' : '`');\n\t}\n\n\tlet res = text;\n\tif (escape) res = escapeEscape(res);\n\tif (inlineCode) res = escapeInlineCode(res);\n\tif (codeBlock) res = escapeCodeBlock(res);\n\tif (italic) res = escapeItalic(res);\n\tif (bold) res = escapeBold(res);\n\tif (underline) res = escapeUnderline(res);\n\tif (strikethrough) res = escapeStrikethrough(res);\n\tif (spoiler) res = escapeSpoiler(res);\n\tif (heading) res = escapeHeading(res);\n\tif (bulletedList) res = escapeBulletedList(res);\n\tif (numberedList) res = escapeNumberedList(res);\n\tif (maskedLink) res = escapeMaskedLink(res);\n\treturn res;\n}\n\n/**\n * Escapes code block markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeCodeBlock(text: string): string {\n\treturn text.replaceAll('```', '\\\\`\\\\`\\\\`');\n}\n\n/**\n * Escapes inline code markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeInlineCode(text: string): string {\n\treturn text.replaceAll(/(?<=^|[^`])``?(?=[^`]|$)/g, (match) => (match.length === 2 ? '\\\\`\\\\`' : '\\\\`'));\n}\n\n/**\n * Escapes italic markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeItalic(text: string): string {\n\tlet idx = 0;\n\tconst newText = text.replaceAll(\n\t\t/(?<=^|[^*])(?<!(?<!<)https?:\\/\\/\\S*|<[^\\s:]+:\\/[^\\s>]*)\\*([^*]|\\*\\*|$)/g,\n\t\t(_, match) => {\n\t\t\tif (match === '**') return ++idx % 2 ? `\\\\*${match}` : `${match}\\\\*`;\n\t\t\treturn `\\\\*${match}`;\n\t\t},\n\t);\n\tidx = 0;\n\treturn newText.replaceAll(\n\t\t/(?<=^|[^_])(?<!<a?:.+|(?<!<)https?:\\/\\/\\S*|<[^\\s:]:\\/[^\\s>]*)_(?!:\\d+>)([^_]|__|$)/g,\n\t\t(_, match) => {\n\t\t\tif (match === '__') return ++idx % 2 ? `\\\\_${match}` : `${match}\\\\_`;\n\t\t\treturn `\\\\_${match}`;\n\t\t},\n\t);\n}\n\n/**\n * Escapes bold markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeBold(text: string): string {\n\tlet idx = 0;\n\treturn text.replaceAll(/\\*\\*(\\*)?/g, (_, match) => {\n\t\tif (match) return ++idx % 2 ? `${match}\\\\*\\\\*` : `\\\\*\\\\*${match}`;\n\t\treturn '\\\\*\\\\*';\n\t});\n}\n\n/**\n * Escapes underline markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeUnderline(text: string): string {\n\tlet idx = 0;\n\treturn text.replaceAll(/(?<!<a?:.+|https?:\\/\\/\\S+)__(_)?(?!:\\d+>)/g, (_, match) => {\n\t\tif (match) return ++idx % 2 ? `${match}\\\\_\\\\_` : `\\\\_\\\\_${match}`;\n\t\treturn '\\\\_\\\\_';\n\t});\n}\n\n/**\n * Escapes strikethrough markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeStrikethrough(text: string): string {\n\treturn text.replaceAll('~~', '\\\\~\\\\~');\n}\n\n/**\n * Escapes spoiler markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeSpoiler(text: string): string {\n\treturn text.replaceAll('||', '\\\\|\\\\|');\n}\n\n/**\n * Escapes escape characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeEscape(text: string): string {\n\treturn text.replaceAll('\\\\', '\\\\\\\\');\n}\n\n/**\n * Escapes heading characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeHeading(text: string): string {\n\treturn text.replaceAll(/^( {0,2})([*-] )?( *)(#{1,3} )/gm, '$1$2$3\\\\$4');\n}\n\n/**\n * Escapes bulleted list characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeBulletedList(text: string): string {\n\treturn text.replaceAll(/^( *)([*-])( +)/gm, '$1\\\\$2$3');\n}\n\n/**\n * Escapes numbered list characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeNumberedList(text: string): string {\n\treturn text.replaceAll(/^( *\\d+)\\./gm, '$1\\\\.');\n}\n\n/**\n * Escapes masked link characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeMaskedLink(text: string): string {\n\treturn text.replaceAll(/\\[.+]\\(.+\\)/gm, '\\\\$&');\n}\n","import type { URL } from 'node:url';\nimport type { Snowflake } from 'discord-api-types/globals';\n\n/**\n * Wraps the content inside a code block with no language.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function codeBlock<Content extends string>(content: Content): `\\`\\`\\`\\n${Content}\\n\\`\\`\\``;\n\n/**\n * Wraps the content inside a code block with the specified language.\n *\n * @typeParam Language - This is inferred by the supplied language\n * @typeParam Content - This is inferred by the supplied content\n * @param language - The language for the code block\n * @param content - The content to wrap\n */\nexport function codeBlock<Language extends string, Content extends string>(\n\tlanguage: Language,\n\tcontent: Content,\n): `\\`\\`\\`${Language}\\n${Content}\\n\\`\\`\\``;\n\nexport function codeBlock(language: string, content?: string): string {\n\treturn content === undefined ? `\\`\\`\\`\\n${language}\\n\\`\\`\\`` : `\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``;\n}\n\n/**\n * Wraps the content inside \\`backticks\\` which formats it as inline code.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function inlineCode<Content extends string>(content: Content): `\\`${Content}\\`` {\n\treturn `\\`${content}\\``;\n}\n\n/**\n * Formats the content into italic text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function italic<Content extends string>(content: Content): `_${Content}_` {\n\treturn `_${content}_`;\n}\n\n/**\n * Formats the content into bold text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function bold<Content extends string>(content: Content): `**${Content}**` {\n\treturn `**${content}**`;\n}\n\n/**\n * Formats the content into underscored text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @deprecated Use {@link underline} instead.\n */\nexport function underscore<Content extends string>(content: Content): `__${Content}__` {\n\treturn underline(content);\n}\n\n/**\n * Formats the content into underlined text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function underline<Content extends string>(content: Content): `__${Content}__` {\n\treturn `__${content}__`;\n}\n\n/**\n * Formats the content into strike-through text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function strikethrough<Content extends string>(content: Content): `~~${Content}~~` {\n\treturn `~~${content}~~`;\n}\n\n/**\n * Formats the content into a quote.\n *\n * @remarks This needs to be at the start of the line for Discord to format it.\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function quote<Content extends string>(content: Content): `> ${Content}` {\n\treturn `> ${content}`;\n}\n\n/**\n * Formats the content into a block quote.\n *\n * @remarks This needs to be at the start of the line for Discord to format it.\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function blockQuote<Content extends string>(content: Content): `>>> ${Content}` {\n\treturn `>>> ${content}`;\n}\n\n/**\n * Wraps the URL into `<>` which stops it from embedding.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed<Content extends string>(url: Content): `<${Content}>`;\n\n/**\n * Wraps the URL into `<>` which stops it from embedding.\n *\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed(url: URL): `<${string}>`;\n\nexport function hideLinkEmbed(url: URL | string) {\n\treturn `<${url}>`;\n}\n\n/**\n * Formats the content and the URL into a masked URL.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink<Content extends string>(content: Content, url: URL): `[${Content}](${string})`;\n\n/**\n * Formats the content and the URL into a masked URL.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Url - This is inferred by the supplied URL\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink<Content extends string, Url extends string>(\n\tcontent: Content,\n\turl: Url,\n): `[${Content}](${Url})`;\n\n/**\n * Formats the content and the URL into a masked URL with a custom tooltip.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Title - This is inferred by the supplied title\n * @param content - The content to display\n * @param url - The URL the content links to\n * @param title - The title shown when hovering on the masked link\n */\nexport function hyperlink<Content extends string, Title extends string>(\n\tcontent: Content,\n\turl: URL,\n\ttitle: Title,\n): `[${Content}](${string} \"${Title}\")`;\n\n/**\n * Formats the content and the URL into a masked URL with a custom tooltip.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Url - This is inferred by the supplied URL\n * @typeParam Title - This is inferred by the supplied title\n * @param content - The content to display\n * @param url - The URL the content links to\n * @param title - The title shown when hovering on the masked link\n */\nexport function hyperlink<Content extends string, Url extends string, Title extends string>(\n\tcontent: Content,\n\turl: Url,\n\ttitle: Title,\n): `[${Content}](${Url} \"${Title}\")`;\n\nexport function hyperlink(content: string, url: URL | string, title?: string) {\n\treturn title ? `[${content}](${url} \"${title}\")` : `[${content}](${url})`;\n}\n\n/**\n * Formats the content into a spoiler.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function spoiler<Content extends string>(content: Content): `||${Content}||` {\n\treturn `||${content}||`;\n}\n\n/**\n * Formats a user id into a user mention.\n *\n * @typeParam UserId - This is inferred by the supplied user id\n * @param userId - The user id to format\n */\nexport function userMention<UserId extends Snowflake>(userId: UserId): `<@${UserId}>` {\n\treturn `<@${userId}>`;\n}\n\n/**\n * Formats a channel id into a channel mention.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @param channelId - The channel id to format\n */\nexport function channelMention<ChannelId extends Snowflake>(channelId: ChannelId): `<#${ChannelId}>` {\n\treturn `<#${channelId}>`;\n}\n\n/**\n * Formats a role id into a role mention.\n *\n * @typeParam RoleId - This is inferred by the supplied role id\n * @param roleId - The role id to format\n */\nexport function roleMention<RoleId extends Snowflake>(roleId: RoleId): `<@&${RoleId}>` {\n\treturn `<@&${roleId}>`;\n}\n\n/**\n * Formats a role id into a linked role mention.\n *\n * @typeParam RoleId - This is inferred by the supplied role id\n * @param roleId - The role id to format\n */\nexport function linkedRoleMention<RoleId extends Snowflake>(roleId: RoleId): `<id:linked-roles:${RoleId}>` {\n\treturn `<id:linked-roles:${roleId}>`;\n}\n\n/**\n * Formats an application command name, subcommand group name, subcommand name, and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam SubcommandGroupName - This is inferred by the supplied subcommand group name\n * @typeParam SubcommandName - This is inferred by the supplied subcommand name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param subcommandGroupName - The subcommand group name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandGroupName extends string,\n\tSubcommandName extends string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandGroupName: SubcommandGroupName,\n\tsubcommandName: SubcommandName,\n\tcommandId: CommandId,\n): `</${CommandName} ${SubcommandGroupName} ${SubcommandName}:${CommandId}>`;\n\n/**\n * Formats an application command name, subcommand name, and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam SubcommandName - This is inferred by the supplied subcommand name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandName extends string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandName: SubcommandName,\n\tcommandId: CommandId,\n): `</${CommandName} ${SubcommandName}:${CommandId}>`;\n\n/**\n * Formats an application command name and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<CommandName extends string, CommandId extends Snowflake>(\n\tcommandName: CommandName,\n\tcommandId: CommandId,\n): `</${CommandName}:${CommandId}>`;\n\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandGroupName extends Snowflake | string,\n\tSubcommandName extends Snowflake | string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandGroupName: SubcommandGroupName,\n\tsubcommandName?: SubcommandName,\n\tcommandId?: CommandId,\n):\n\t| `</${CommandName} ${SubcommandGroupName} ${SubcommandName}:${CommandId}>`\n\t| `</${CommandName} ${SubcommandGroupName}:${SubcommandName}>`\n\t| `</${CommandName}:${SubcommandGroupName}>` {\n\tif (commandId !== undefined) {\n\t\treturn `</${commandName} ${subcommandGroupName} ${subcommandName!}:${commandId}>`;\n\t}\n\n\tif (subcommandName !== undefined) {\n\t\treturn `</${commandName} ${subcommandGroupName}:${subcommandName}>`;\n\t}\n\n\treturn `</${commandName}:${subcommandGroupName}>`;\n}\n\n/**\n * Formats a non-animated emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n */\nexport function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: false): `<:emoji:${EmojiId}>`;\n\n/**\n * Formats an animated emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n * @param animated - Whether the emoji is animated\n */\nexport function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: true): `<a:emoji:${EmojiId}>`;\n\n/**\n * Formats an emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n * @param animated - Whether the emoji is animated\n */\nexport function formatEmoji<EmojiId extends Snowflake>(\n\temojiId: EmojiId,\n\tanimated?: boolean,\n): `<:emoji:${EmojiId}>` | `<a:emoji:${EmojiId}>`;\n\n/**\n * Formats a non-animated emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName> & { animated: true },\n): `<a:${EmojiName}:${EmojiId}>`;\n\n/**\n * Formats an animated emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName> & { animated?: false },\n): `<:${EmojiName}:${EmojiId}>`;\n\n/**\n * Formats an emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied emoji name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName>,\n): `<:${EmojiName}:${EmojiId}>` | `<a:${EmojiName}:${EmojiId}>`;\n\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\temojiIdOrOptions: EmojiId | FormatEmojiOptions<EmojiId, EmojiName>,\n\tanimated?: boolean,\n): `<:${string}:${EmojiId}>` | `<a:${string}:${EmojiId}>` {\n\tconst options =\n\t\ttypeof emojiIdOrOptions === 'string'\n\t\t\t? {\n\t\t\t\t\tid: emojiIdOrOptions,\n\t\t\t\t\tanimated: animated ?? false,\n\t\t\t\t}\n\t\t\t: emojiIdOrOptions;\n\n\tconst { id, animated: isAnimated, name: emojiName } = options;\n\n\treturn `<${isAnimated ? 'a' : ''}:${emojiName ?? 'emoji'}:${id}>`;\n}\n\n/**\n * The options for formatting an emoji.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied emoji name\n */\nexport interface FormatEmojiOptions<EmojiId extends Snowflake, EmojiName extends string> {\n\t/**\n\t * Whether the emoji is animated\n\t */\n\tanimated?: boolean;\n\t/**\n\t * The emoji id to format\n\t */\n\tid: EmojiId;\n\t/**\n\t * The name of the emoji\n\t */\n\tname?: EmojiName;\n}\n\n/**\n * Formats a channel link for a direct message channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @param channelId - The channel's id\n */\nexport function channelLink<ChannelId extends Snowflake>(\n\tchannelId: ChannelId,\n): `https://discord.com/channels/@me/${ChannelId}`;\n\n/**\n * Formats a channel link for a guild channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam GuildId - This is inferred by the supplied guild id\n * @param channelId - The channel's id\n * @param guildId - The guild's id\n */\nexport function channelLink<ChannelId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tguildId: GuildId,\n): `https://discord.com/channels/${GuildId}/${ChannelId}`;\n\nexport function channelLink<ChannelId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tguildId?: GuildId,\n): `https://discord.com/channels/@me/${ChannelId}` | `https://discord.com/channels/${GuildId}/${ChannelId}` {\n\treturn `https://discord.com/channels/${guildId ?? '@me'}/${channelId}`;\n}\n\n/**\n * Formats a message link for a direct message channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam MessageId - This is inferred by the supplied message id\n * @param channelId - The channel's id\n * @param messageId - The message's id\n */\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n): `https://discord.com/channels/@me/${ChannelId}/${MessageId}`;\n\n/**\n * Formats a message link for a guild channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam MessageId - This is inferred by the supplied message id\n * @typeParam GuildId - This is inferred by the supplied guild id\n * @param channelId - The channel's id\n * @param messageId - The message's id\n * @param guildId - The guild's id\n */\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n\tguildId: GuildId,\n): `https://discord.com/channels/${GuildId}/${ChannelId}/${MessageId}`;\n\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n\tguildId?: GuildId,\n):\n\t| `https://discord.com/channels/@me/${ChannelId}/${MessageId}`\n\t| `https://discord.com/channels/${GuildId}/${ChannelId}/${MessageId}` {\n\treturn `${guildId === undefined ? channelLink(channelId) : channelLink(channelId, guildId)}/${messageId}`;\n}\n\n/**\n * The heading levels for expanded markdown.\n */\nexport enum HeadingLevel {\n\t/**\n\t * The first heading level.\n\t */\n\tOne = 1,\n\t/**\n\t * The second heading level.\n\t */\n\tTwo,\n\t/**\n\t * The third heading level.\n\t */\n\tThree,\n}\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level?: HeadingLevel.One): `# ${Content}`;\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level: HeadingLevel.Two): `## ${Content}`;\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level: HeadingLevel.Three): `### ${Content}`;\n\nexport function heading(content: string, level?: HeadingLevel) {\n\tswitch (level) {\n\t\tcase HeadingLevel.Three:\n\t\t\treturn `### ${content}`;\n\t\tcase HeadingLevel.Two:\n\t\t\treturn `## ${content}`;\n\t\tdefault:\n\t\t\treturn `# ${content}`;\n\t}\n}\n\n/**\n * A type that recursively traverses into arrays.\n */\nexport type RecursiveArray<ItemType> = readonly (ItemType | RecursiveArray<ItemType>)[];\n\n/**\n * Callback function for list formatters.\n *\n * @internal\n */\nfunction listCallback(element: RecursiveArray<string>, startNumber?: number, depth = 0): string {\n\tif (Array.isArray(element)) {\n\t\treturn element.map((element) => listCallback(element, startNumber, depth + 1)).join('\\n');\n\t}\n\n\treturn `${' '.repeat(depth - 1)}${startNumber ? `${startNumber}.` : '-'} ${element}`;\n}\n\n/**\n * Formats the elements in the array to an ordered list.\n *\n * @param list - The array of elements to list\n * @param startNumber - The starting number for the list\n */\nexport function orderedList(list: RecursiveArray<string>, startNumber = 1): string {\n\treturn listCallback(list, Math.max(startNumber, 1));\n}\n\n/**\n * Formats the elements in the array to an unordered list.\n *\n * @param list - The array of elements to list\n */\nexport function unorderedList(list: RecursiveArray<string>): string {\n\treturn listCallback(list);\n}\n\n/**\n * Formats the content into a subtext.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function subtext<Content extends string>(content: Content): `-# ${Content}` {\n\treturn `-# ${content}`;\n}\n\n/**\n * Formats a date into a short date-time string.\n *\n * @param date - The date to format. Defaults to the current time\n */\nexport function time(date?: Date): `<t:${bigint}>`;\n\n/**\n * Formats a date given a format style.\n *\n * @typeParam Style - This is inferred by the supplied {@link TimestampStylesString}\n * @param date - The date to format\n * @param style - The style to use\n */\nexport function time<Style extends TimestampStylesString>(date: Date, style: Style): `<t:${bigint}:${Style}>`;\n\n/**\n * Formats the given timestamp into a short date-time string.\n *\n * @typeParam Seconds - This is inferred by the supplied timestamp\n * @param seconds - A Unix timestamp in seconds\n */\nexport function time<Seconds extends number>(seconds: Seconds): `<t:${Seconds}>`;\n\n/**\n * Formats the given timestamp into a short date-time string.\n *\n * @typeParam Seconds - This is inferred by the supplied timestamp\n * @typeParam Style - This is inferred by the supplied {@link TimestampStylesString}\n * @param seconds - A Unix timestamp in seconds\n * @param style - The style to use\n */\nexport function time<Seconds extends number, Style extends TimestampStylesString>(\n\tseconds: Seconds,\n\tstyle: Style,\n): `<t:${Seconds}:${Style}>`;\n\nexport function time(timeOrSeconds?: Date | number, style?: TimestampStylesString): string {\n\tif (typeof timeOrSeconds !== 'number') {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\ttimeOrSeconds = Math.floor((timeOrSeconds?.getTime() ?? Date.now()) / 1_000);\n\t}\n\n\treturn typeof style === 'string' ? `<t:${timeOrSeconds}:${style}>` : `<t:${timeOrSeconds}>`;\n}\n\n/**\n * Formats an application directory link.\n *\n * @typeParam ApplicationId - This is inferred by the supplied application id\n * @param applicationId - The application id\n */\nexport function applicationDirectory<ApplicationId extends Snowflake>(\n\tapplicationId: ApplicationId,\n): `https://discord.com/application-directory/${ApplicationId}/store`;\n\n/**\n * Formats an application directory SKU link.\n *\n * @typeParam ApplicationId - This is inferred by the supplied application id\n * @typeParam SKUId - This is inferred by the supplied SKU id\n * @param applicationId - The application id\n * @param skuId - The SKU id\n */\nexport function applicationDirectory<ApplicationId extends Snowflake, SKUId extends Snowflake>(\n\tapplicationId: ApplicationId,\n\tskuId: SKUId,\n): `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`;\n\nexport function applicationDirectory<ApplicationId extends Snowflake, SKUId extends Snowflake>(\n\tapplicationId: ApplicationId,\n\tskuId?: SKUId,\n):\n\t| `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`\n\t| `https://discord.com/application-directory/${ApplicationId}/store` {\n\tconst url = `https://discord.com/application-directory/${applicationId}/store` as const;\n\treturn skuId ? `${url}/${skuId}` : url;\n}\n\n/**\n * Formats an email address into an email mention.\n *\n * @typeParam Email - This is inferred by the supplied email address\n * @param email - The email address to format\n */\nexport function email<Email extends string>(email: Email): `<${Email}>`;\n\n/**\n * Formats an email address and headers into an email mention.\n *\n * @typeParam Email - This is inferred by the supplied email address\n * @param email - The email address to format\n * @param headers - Optional headers to include in the email mention\n */\nexport function email<Email extends string>(\n\temail: Email,\n\theaders: Record<string, string | readonly string[]> | undefined,\n): `<${Email}?${string}>`;\n\n/**\n * Formats an email address into an email mention.\n *\n * @typeParam Email - This is inferred by the supplied email address\n * @param email - The email address to format\n * @param headers - Optional headers to include in the email mention\n */\nexport function email<Email extends string>(email: Email, headers?: Record<string, string | readonly string[]>) {\n\tif (headers) {\n\t\t// eslint-disable-next-line n/prefer-global/url-search-params\n\t\tconst searchParams = new URLSearchParams(\n\t\t\tObject.fromEntries(Object.entries(headers).map(([key, value]) => [key.toLowerCase(), value])),\n\t\t);\n\n\t\treturn `<${email}?${searchParams.toString()}>` as const;\n\t}\n\n\treturn `<${email}>` as const;\n}\n\n/**\n * Formats a phone number into a phone number mention.\n *\n * @typeParam PhoneNumber - This is inferred by the supplied phone number\n * @param phoneNumber - The phone number to format. Must start with a `+` sign.\n */\nexport function phoneNumber<PhoneNumber extends `+${string}`>(phoneNumber: PhoneNumber) {\n\tif (!phoneNumber.startsWith('+')) {\n\t\tthrow new Error('Phone number must start with a \"+\" sign.');\n\t}\n\n\treturn `<${phoneNumber}>` as const;\n}\n\n/**\n * The {@link https://discord.com/developers/docs/reference#message-formatting-timestamp-styles | message formatting timestamp styles}\n * supported by Discord.\n */\nexport const TimestampStyles = {\n\t/**\n\t * Short time format, consisting of hours and minutes.\n\t *\n\t * @example `16:20`\n\t */\n\tShortTime: 't',\n\n\t/**\n\t * Medium time format, consisting of hours, minutes, and seconds.\n\t *\n\t * @example `16:20:30`\n\t */\n\tMediumTime: 'T',\n\n\t/**\n\t * Long time format, consisting of hours, minutes, and seconds.\n\t *\n\t * @example `16:20:30`\n\t * @deprecated Use {@link TimestampStyles.MediumTime} instead.\n\t */\n\tLongTime: 'T',\n\n\t/**\n\t * Short date format, consisting of day, month, and year.\n\t *\n\t * @example `20/04/2021`\n\t */\n\tShortDate: 'd',\n\n\t/**\n\t * Long date format, consisting of day, month, and year.\n\t *\n\t * @example `April 20, 2021`\n\t */\n\tLongDate: 'D',\n\n\t/**\n\t * Long date-short time format, consisting of long date and short time.\n\t *\n\t * @example `April 20, 2021 at 16:20`\n\t */\n\tLongDateShortTime: 'f',\n\n\t/**\n\t * Short date-time format, consisting of short date and short time formats.\n\t *\n\t * @example `20 April 2021 16:20`\n\t * @deprecated Use {@link TimestampStyles.LongDateShortTime} instead.\n\t */\n\tShortDateTime: 'f',\n\n\t/**\n\t * Full date-short time format, consisting of full date and short time.\n\t *\n\t * @example `Tuesday, April 20, 2021 at 16:20`\n\t */\n\tFullDateShortTime: 'F',\n\n\t/**\n\t * Long date-time format, consisting of long date and short time formats.\n\t *\n\t * @example `Tuesday, 20 April 2021 16:20`\n\t * @deprecated Use {@link TimestampStyles.FullDateShortTime} instead.\n\t */\n\tLongDateTime: 'F',\n\n\t/**\n\t * Short date, short time format, consisting of short date and short time.\n\t *\n\t * @example `20/04/2021, 16:20`\n\t */\n\tShortDateShortTime: 's',\n\n\t/**\n\t * Short date, medium time format, consisting of short date and medium time.\n\t *\n\t * @example `20/04/2021, 16:20:30`\n\t */\n\tShortDateMediumTime: 'S',\n\n\t/**\n\t * Relative time format, consisting of a relative duration format.\n\t *\n\t * @example `2 months ago`\n\t */\n\tRelativeTime: 'R',\n} as const satisfies Record<string, string>;\n\n/**\n * The possible {@link TimestampStyles} values.\n */\nexport type TimestampStylesString = (typeof TimestampStyles)[keyof typeof TimestampStyles];\n\n/**\n * All the available faces from Discord's native slash commands.\n */\nexport enum Faces {\n\t/**\n\t * `¯\\_(ツ)_/¯`\n\t */\n\tShrug = '¯\\\\_(ツ)_/¯',\n\n\t/**\n\t * `(╯°□°)╯︵ ┻━┻`\n\t */\n\tTableflip = '(╯°□°)╯︵ ┻━┻',\n\n\t/**\n\t * `┬─┬ノ( º _ ºノ)`\n\t */\n\tUnflip = '┬─┬ノ( º _ ºノ)',\n}\n\n/**\n * All the available guild navigation mentions.\n */\nexport enum GuildNavigationMentions {\n\t/**\n\t * Browse Channels tab.\n\t */\n\tBrowse = '<id:browse>',\n\t/**\n\t * Customize tab with the server's {@link https://discord.com/developers/docs/resources/guild#guild-onboarding-object | onboarding prompts}.\n\t */\n\tCustomize = '<id:customize>',\n\t/**\n\t * {@link https://support.discord.com/hc/articles/13497665141655 | Server Guide} tab.\n\t */\n\tGuide = '<id:guide>',\n\t/**\n\t * {@link https://support.discord.com/hc/articles/10388356626711 | Linked Roles} tab.\n\t */\n\tLinkedRoles = '<id:linked-roles>',\n}\n"],"mappings":"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","names":["codeBlock","inlineCode","bold","italic","underline","strikethrough","spoiler","heading","HeadingLevel","element","email","phoneNumber","Faces","GuildNavigationMentions"]}
package/dist/index.mjs CHANGED
@@ -82,15 +82,21 @@ function escapeInlineCode(text) {
82
82
  __name(escapeInlineCode, "escapeInlineCode");
83
83
  function escapeItalic(text) {
84
84
  let idx = 0;
85
- const newText = text.replaceAll(/(?<=^|[^*])\*([^*]|\*\*|$)/g, (_, match) => {
86
- if (match === "**") return ++idx % 2 ? `\\*${match}` : `${match}\\*`;
87
- return `\\*${match}`;
88
- });
85
+ const newText = text.replaceAll(
86
+ /(?<=^|[^*])(?<!(?<!<)https?:\/\/\S*|<[^\s:]+:\/[^\s>]*)\*([^*]|\*\*|$)/g,
87
+ (_, match) => {
88
+ if (match === "**") return ++idx % 2 ? `\\*${match}` : `${match}\\*`;
89
+ return `\\*${match}`;
90
+ }
91
+ );
89
92
  idx = 0;
90
- return newText.replaceAll(/(?<=^|[^_])(?<!<a?:.+|https?:\/\/\S+)_(?!:\d+>)([^_]|__|$)/g, (_, match) => {
91
- if (match === "__") return ++idx % 2 ? `\\_${match}` : `${match}\\_`;
92
- return `\\_${match}`;
93
- });
93
+ return newText.replaceAll(
94
+ /(?<=^|[^_])(?<!<a?:.+|(?<!<)https?:\/\/\S*|<[^\s:]:\/[^\s>]*)_(?!:\d+>)([^_]|__|$)/g,
95
+ (_, match) => {
96
+ if (match === "__") return ++idx % 2 ? `\\_${match}` : `${match}\\_`;
97
+ return `\\_${match}`;
98
+ }
99
+ );
94
100
  }
95
101
  __name(escapeItalic, "escapeItalic");
96
102
  function escapeBold(text) {
@@ -203,6 +209,10 @@ function roleMention(roleId) {
203
209
  return `<@&${roleId}>`;
204
210
  }
205
211
  __name(roleMention, "roleMention");
212
+ function linkedRoleMention(roleId) {
213
+ return `<id:linked-roles:${roleId}>`;
214
+ }
215
+ __name(linkedRoleMention, "linkedRoleMention");
206
216
  function chatInputApplicationCommandMention(commandName, subcommandGroupName, subcommandName, commandId) {
207
217
  if (commandId !== void 0) {
208
218
  return `</${commandName} ${subcommandGroupName} ${subcommandName}:${commandId}>`;
@@ -219,7 +229,7 @@ function formatEmoji(emojiIdOrOptions, animated) {
219
229
  animated: animated ?? false
220
230
  } : emojiIdOrOptions;
221
231
  const { id, animated: isAnimated, name: emojiName } = options;
222
- return `<${isAnimated ? "a" : ""}:${emojiName ?? "_"}:${id}>`;
232
+ return `<${isAnimated ? "a" : ""}:${emojiName ?? "emoji"}:${id}>`;
223
233
  }
224
234
  __name(formatEmoji, "formatEmoji");
225
235
  function channelLink(channelId, guildId) {
@@ -278,6 +288,23 @@ function applicationDirectory(applicationId, skuId) {
278
288
  return skuId ? `${url}/${skuId}` : url;
279
289
  }
280
290
  __name(applicationDirectory, "applicationDirectory");
291
+ function email(email2, headers) {
292
+ if (headers) {
293
+ const searchParams = new URLSearchParams(
294
+ Object.fromEntries(Object.entries(headers).map(([key, value]) => [key.toLowerCase(), value]))
295
+ );
296
+ return `<${email2}?${searchParams.toString()}>`;
297
+ }
298
+ return `<${email2}>`;
299
+ }
300
+ __name(email, "email");
301
+ function phoneNumber(phoneNumber2) {
302
+ if (!phoneNumber2.startsWith("+")) {
303
+ throw new Error('Phone number must start with a "+" sign.');
304
+ }
305
+ return `<${phoneNumber2}>`;
306
+ }
307
+ __name(phoneNumber, "phoneNumber");
281
308
  var TimestampStyles = {
282
309
  /**
283
310
  * Short time format, consisting of hours and minutes.
@@ -285,10 +312,17 @@ var TimestampStyles = {
285
312
  * @example `16:20`
286
313
  */
287
314
  ShortTime: "t",
315
+ /**
316
+ * Medium time format, consisting of hours, minutes, and seconds.
317
+ *
318
+ * @example `16:20:30`
319
+ */
320
+ MediumTime: "T",
288
321
  /**
289
322
  * Long time format, consisting of hours, minutes, and seconds.
290
323
  *
291
324
  * @example `16:20:30`
325
+ * @deprecated Use {@link TimestampStyles.MediumTime} instead.
292
326
  */
293
327
  LongTime: "T",
294
328
  /**
@@ -300,21 +334,47 @@ var TimestampStyles = {
300
334
  /**
301
335
  * Long date format, consisting of day, month, and year.
302
336
  *
303
- * @example `20 April 2021`
337
+ * @example `April 20, 2021`
304
338
  */
305
339
  LongDate: "D",
340
+ /**
341
+ * Long date-short time format, consisting of long date and short time.
342
+ *
343
+ * @example `April 20, 2021 at 16:20`
344
+ */
345
+ LongDateShortTime: "f",
306
346
  /**
307
347
  * Short date-time format, consisting of short date and short time formats.
308
348
  *
309
349
  * @example `20 April 2021 16:20`
350
+ * @deprecated Use {@link TimestampStyles.LongDateShortTime} instead.
310
351
  */
311
352
  ShortDateTime: "f",
353
+ /**
354
+ * Full date-short time format, consisting of full date and short time.
355
+ *
356
+ * @example `Tuesday, April 20, 2021 at 16:20`
357
+ */
358
+ FullDateShortTime: "F",
312
359
  /**
313
360
  * Long date-time format, consisting of long date and short time formats.
314
361
  *
315
362
  * @example `Tuesday, 20 April 2021 16:20`
363
+ * @deprecated Use {@link TimestampStyles.FullDateShortTime} instead.
316
364
  */
317
365
  LongDateTime: "F",
366
+ /**
367
+ * Short date, short time format, consisting of short date and short time.
368
+ *
369
+ * @example `20/04/2021, 16:20`
370
+ */
371
+ ShortDateShortTime: "s",
372
+ /**
373
+ * Short date, medium time format, consisting of short date and medium time.
374
+ *
375
+ * @example `20/04/2021, 16:20:30`
376
+ */
377
+ ShortDateMediumTime: "S",
318
378
  /**
319
379
  * Relative time format, consisting of a relative duration format.
320
380
  *
@@ -332,11 +392,12 @@ var GuildNavigationMentions = /* @__PURE__ */ ((GuildNavigationMentions2) => {
332
392
  GuildNavigationMentions2["Browse"] = "<id:browse>";
333
393
  GuildNavigationMentions2["Customize"] = "<id:customize>";
334
394
  GuildNavigationMentions2["Guide"] = "<id:guide>";
395
+ GuildNavigationMentions2["LinkedRoles"] = "<id:linked-roles>";
335
396
  return GuildNavigationMentions2;
336
397
  })(GuildNavigationMentions || {});
337
398
 
338
399
  // src/index.ts
339
- var version = "0.6.1";
400
+ var version = "0.6.2";
340
401
  export {
341
402
  Faces,
342
403
  GuildNavigationMentions,
@@ -349,6 +410,7 @@ export {
349
410
  channelMention,
350
411
  chatInputApplicationCommandMention,
351
412
  codeBlock,
413
+ email,
352
414
  escapeBold,
353
415
  escapeBulletedList,
354
416
  escapeCodeBlock,
@@ -368,8 +430,10 @@ export {
368
430
  hyperlink,
369
431
  inlineCode,
370
432
  italic,
433
+ linkedRoleMention,
371
434
  messageLink,
372
435
  orderedList,
436
+ phoneNumber,
373
437
  quote,
374
438
  roleMention,
375
439
  spoiler,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/escapers.ts","../src/formatters.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable prefer-named-capture-group */\n\n/**\n * The options that affect what will be escaped.\n */\nexport interface EscapeMarkdownOptions {\n\t/**\n\t * Whether to escape bold text.\n\t *\n\t * @defaultValue `true`\n\t */\n\tbold?: boolean;\n\n\t/**\n\t * Whether to escape bulleted lists.\n\t *\n\t * @defaultValue `false`\n\t */\n\tbulletedList?: boolean;\n\n\t/**\n\t * Whether to escape code blocks.\n\t *\n\t * @defaultValue `true`\n\t */\n\tcodeBlock?: boolean;\n\n\t/**\n\t * Whether to escape text inside code blocks.\n\t *\n\t * @defaultValue `true`\n\t */\n\tcodeBlockContent?: boolean;\n\n\t/**\n\t * Whether to escape `\\`.\n\t *\n\t * @defaultValue `true`\n\t */\n\tescape?: boolean;\n\n\t/**\n\t * Whether to escape headings.\n\t *\n\t * @defaultValue `false`\n\t */\n\theading?: boolean;\n\n\t/**\n\t * Whether to escape inline code.\n\t *\n\t * @defaultValue `true`\n\t */\n\tinlineCode?: boolean;\n\n\t/**\n\t * Whether to escape text inside inline code.\n\t *\n\t * @defaultValue `true`\n\t */\n\tinlineCodeContent?: boolean;\n\t/**\n\t * Whether to escape italics.\n\t *\n\t * @defaultValue `true`\n\t */\n\titalic?: boolean;\n\n\t/**\n\t * Whether to escape masked links.\n\t *\n\t * @defaultValue `false`\n\t */\n\tmaskedLink?: boolean;\n\n\t/**\n\t * Whether to escape numbered lists.\n\t *\n\t * @defaultValue `false`\n\t */\n\tnumberedList?: boolean;\n\n\t/**\n\t * Whether to escape spoilers.\n\t *\n\t * @defaultValue `true`\n\t */\n\tspoiler?: boolean;\n\n\t/**\n\t * Whether to escape strikethroughs.\n\t *\n\t * @defaultValue `true`\n\t */\n\tstrikethrough?: boolean;\n\n\t/**\n\t * Whether to escape underlines.\n\t *\n\t * @defaultValue `true`\n\t */\n\tunderline?: boolean;\n}\n\n/**\n * Escapes any Discord-flavored markdown in a string.\n *\n * @param text - Content to escape\n * @param options - Options for escaping the markdown\n */\nexport function escapeMarkdown(text: string, options: EscapeMarkdownOptions = {}): string {\n\tconst {\n\t\tcodeBlock = true,\n\t\tinlineCode = true,\n\t\tbold = true,\n\t\titalic = true,\n\t\tunderline = true,\n\t\tstrikethrough = true,\n\t\tspoiler = true,\n\t\tcodeBlockContent = true,\n\t\tinlineCodeContent = true,\n\t\tescape = true,\n\t\theading = false,\n\t\tbulletedList = false,\n\t\tnumberedList = false,\n\t\tmaskedLink = false,\n\t} = options;\n\n\tif (!codeBlockContent) {\n\t\treturn text\n\t\t\t.split('```')\n\t\t\t.map((subString, index, array) => {\n\t\t\t\tif (index % 2 && index !== array.length - 1) return subString;\n\t\t\t\treturn escapeMarkdown(subString, {\n\t\t\t\t\tinlineCode,\n\t\t\t\t\tbold,\n\t\t\t\t\titalic,\n\t\t\t\t\tunderline,\n\t\t\t\t\tstrikethrough,\n\t\t\t\t\tspoiler,\n\t\t\t\t\tinlineCodeContent,\n\t\t\t\t\tescape,\n\t\t\t\t\theading,\n\t\t\t\t\tbulletedList,\n\t\t\t\t\tnumberedList,\n\t\t\t\t\tmaskedLink,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(codeBlock ? '\\\\`\\\\`\\\\`' : '```');\n\t}\n\n\tif (!inlineCodeContent) {\n\t\treturn text\n\t\t\t.split(/(?<=^|[^`])`(?=[^`]|$)/g)\n\t\t\t.map((subString, index, array) => {\n\t\t\t\tif (index % 2 && index !== array.length - 1) return subString;\n\t\t\t\treturn escapeMarkdown(subString, {\n\t\t\t\t\tcodeBlock,\n\t\t\t\t\tbold,\n\t\t\t\t\titalic,\n\t\t\t\t\tunderline,\n\t\t\t\t\tstrikethrough,\n\t\t\t\t\tspoiler,\n\t\t\t\t\tescape,\n\t\t\t\t\theading,\n\t\t\t\t\tbulletedList,\n\t\t\t\t\tnumberedList,\n\t\t\t\t\tmaskedLink,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(inlineCode ? '\\\\`' : '`');\n\t}\n\n\tlet res = text;\n\tif (escape) res = escapeEscape(res);\n\tif (inlineCode) res = escapeInlineCode(res);\n\tif (codeBlock) res = escapeCodeBlock(res);\n\tif (italic) res = escapeItalic(res);\n\tif (bold) res = escapeBold(res);\n\tif (underline) res = escapeUnderline(res);\n\tif (strikethrough) res = escapeStrikethrough(res);\n\tif (spoiler) res = escapeSpoiler(res);\n\tif (heading) res = escapeHeading(res);\n\tif (bulletedList) res = escapeBulletedList(res);\n\tif (numberedList) res = escapeNumberedList(res);\n\tif (maskedLink) res = escapeMaskedLink(res);\n\treturn res;\n}\n\n/**\n * Escapes code block markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeCodeBlock(text: string): string {\n\treturn text.replaceAll('```', '\\\\`\\\\`\\\\`');\n}\n\n/**\n * Escapes inline code markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeInlineCode(text: string): string {\n\treturn text.replaceAll(/(?<=^|[^`])``?(?=[^`]|$)/g, (match) => (match.length === 2 ? '\\\\`\\\\`' : '\\\\`'));\n}\n\n/**\n * Escapes italic markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeItalic(text: string): string {\n\tlet idx = 0;\n\tconst newText = text.replaceAll(/(?<=^|[^*])\\*([^*]|\\*\\*|$)/g, (_, match) => {\n\t\tif (match === '**') return ++idx % 2 ? `\\\\*${match}` : `${match}\\\\*`;\n\t\treturn `\\\\*${match}`;\n\t});\n\tidx = 0;\n\treturn newText.replaceAll(/(?<=^|[^_])(?<!<a?:.+|https?:\\/\\/\\S+)_(?!:\\d+>)([^_]|__|$)/g, (_, match) => {\n\t\tif (match === '__') return ++idx % 2 ? `\\\\_${match}` : `${match}\\\\_`;\n\t\treturn `\\\\_${match}`;\n\t});\n}\n\n/**\n * Escapes bold markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeBold(text: string): string {\n\tlet idx = 0;\n\treturn text.replaceAll(/\\*\\*(\\*)?/g, (_, match) => {\n\t\tif (match) return ++idx % 2 ? `${match}\\\\*\\\\*` : `\\\\*\\\\*${match}`;\n\t\treturn '\\\\*\\\\*';\n\t});\n}\n\n/**\n * Escapes underline markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeUnderline(text: string): string {\n\tlet idx = 0;\n\treturn text.replaceAll(/(?<!<a?:.+|https?:\\/\\/\\S+)__(_)?(?!:\\d+>)/g, (_, match) => {\n\t\tif (match) return ++idx % 2 ? `${match}\\\\_\\\\_` : `\\\\_\\\\_${match}`;\n\t\treturn '\\\\_\\\\_';\n\t});\n}\n\n/**\n * Escapes strikethrough markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeStrikethrough(text: string): string {\n\treturn text.replaceAll('~~', '\\\\~\\\\~');\n}\n\n/**\n * Escapes spoiler markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeSpoiler(text: string): string {\n\treturn text.replaceAll('||', '\\\\|\\\\|');\n}\n\n/**\n * Escapes escape characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeEscape(text: string): string {\n\treturn text.replaceAll('\\\\', '\\\\\\\\');\n}\n\n/**\n * Escapes heading characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeHeading(text: string): string {\n\treturn text.replaceAll(/^( {0,2})([*-] )?( *)(#{1,3} )/gm, '$1$2$3\\\\$4');\n}\n\n/**\n * Escapes bulleted list characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeBulletedList(text: string): string {\n\treturn text.replaceAll(/^( *)([*-])( +)/gm, '$1\\\\$2$3');\n}\n\n/**\n * Escapes numbered list characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeNumberedList(text: string): string {\n\treturn text.replaceAll(/^( *\\d+)\\./gm, '$1\\\\.');\n}\n\n/**\n * Escapes masked link characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeMaskedLink(text: string): string {\n\treturn text.replaceAll(/\\[.+]\\(.+\\)/gm, '\\\\$&');\n}\n","import type { URL } from 'node:url';\nimport type { Snowflake } from 'discord-api-types/globals';\n\n/**\n * Wraps the content inside a code block with no language.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function codeBlock<Content extends string>(content: Content): `\\`\\`\\`\\n${Content}\\n\\`\\`\\``;\n\n/**\n * Wraps the content inside a code block with the specified language.\n *\n * @typeParam Language - This is inferred by the supplied language\n * @typeParam Content - This is inferred by the supplied content\n * @param language - The language for the code block\n * @param content - The content to wrap\n */\nexport function codeBlock<Language extends string, Content extends string>(\n\tlanguage: Language,\n\tcontent: Content,\n): `\\`\\`\\`${Language}\\n${Content}\\n\\`\\`\\``;\n\nexport function codeBlock(language: string, content?: string): string {\n\treturn content === undefined ? `\\`\\`\\`\\n${language}\\n\\`\\`\\`` : `\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``;\n}\n\n/**\n * Wraps the content inside \\`backticks\\` which formats it as inline code.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function inlineCode<Content extends string>(content: Content): `\\`${Content}\\`` {\n\treturn `\\`${content}\\``;\n}\n\n/**\n * Formats the content into italic text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function italic<Content extends string>(content: Content): `_${Content}_` {\n\treturn `_${content}_`;\n}\n\n/**\n * Formats the content into bold text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function bold<Content extends string>(content: Content): `**${Content}**` {\n\treturn `**${content}**`;\n}\n\n/**\n * Formats the content into underscored text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @deprecated Use {@link underline} instead.\n */\nexport function underscore<Content extends string>(content: Content): `__${Content}__` {\n\treturn underline(content);\n}\n\n/**\n * Formats the content into underlined text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function underline<Content extends string>(content: Content): `__${Content}__` {\n\treturn `__${content}__`;\n}\n\n/**\n * Formats the content into strike-through text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function strikethrough<Content extends string>(content: Content): `~~${Content}~~` {\n\treturn `~~${content}~~`;\n}\n\n/**\n * Formats the content into a quote.\n *\n * @remarks This needs to be at the start of the line for Discord to format it.\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function quote<Content extends string>(content: Content): `> ${Content}` {\n\treturn `> ${content}`;\n}\n\n/**\n * Formats the content into a block quote.\n *\n * @remarks This needs to be at the start of the line for Discord to format it.\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function blockQuote<Content extends string>(content: Content): `>>> ${Content}` {\n\treturn `>>> ${content}`;\n}\n\n/**\n * Wraps the URL into `<>` which stops it from embedding.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed<Content extends string>(url: Content): `<${Content}>`;\n\n/**\n * Wraps the URL into `<>` which stops it from embedding.\n *\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed(url: URL): `<${string}>`;\n\nexport function hideLinkEmbed(url: URL | string) {\n\treturn `<${url}>`;\n}\n\n/**\n * Formats the content and the URL into a masked URL.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink<Content extends string>(content: Content, url: URL): `[${Content}](${string})`;\n\n/**\n * Formats the content and the URL into a masked URL.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Url - This is inferred by the supplied URL\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink<Content extends string, Url extends string>(\n\tcontent: Content,\n\turl: Url,\n): `[${Content}](${Url})`;\n\n/**\n * Formats the content and the URL into a masked URL with a custom tooltip.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Title - This is inferred by the supplied title\n * @param content - The content to display\n * @param url - The URL the content links to\n * @param title - The title shown when hovering on the masked link\n */\nexport function hyperlink<Content extends string, Title extends string>(\n\tcontent: Content,\n\turl: URL,\n\ttitle: Title,\n): `[${Content}](${string} \"${Title}\")`;\n\n/**\n * Formats the content and the URL into a masked URL with a custom tooltip.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Url - This is inferred by the supplied URL\n * @typeParam Title - This is inferred by the supplied title\n * @param content - The content to display\n * @param url - The URL the content links to\n * @param title - The title shown when hovering on the masked link\n */\nexport function hyperlink<Content extends string, Url extends string, Title extends string>(\n\tcontent: Content,\n\turl: Url,\n\ttitle: Title,\n): `[${Content}](${Url} \"${Title}\")`;\n\nexport function hyperlink(content: string, url: URL | string, title?: string) {\n\treturn title ? `[${content}](${url} \"${title}\")` : `[${content}](${url})`;\n}\n\n/**\n * Formats the content into a spoiler.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function spoiler<Content extends string>(content: Content): `||${Content}||` {\n\treturn `||${content}||`;\n}\n\n/**\n * Formats a user id into a user mention.\n *\n * @typeParam UserId - This is inferred by the supplied user id\n * @param userId - The user id to format\n */\nexport function userMention<UserId extends Snowflake>(userId: UserId): `<@${UserId}>` {\n\treturn `<@${userId}>`;\n}\n\n/**\n * Formats a channel id into a channel mention.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @param channelId - The channel id to format\n */\nexport function channelMention<ChannelId extends Snowflake>(channelId: ChannelId): `<#${ChannelId}>` {\n\treturn `<#${channelId}>`;\n}\n\n/**\n * Formats a role id into a role mention.\n *\n * @typeParam RoleId - This is inferred by the supplied role id\n * @param roleId - The role id to format\n */\nexport function roleMention<RoleId extends Snowflake>(roleId: RoleId): `<@&${RoleId}>` {\n\treturn `<@&${roleId}>`;\n}\n\n/**\n * Formats an application command name, subcommand group name, subcommand name, and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam SubcommandGroupName - This is inferred by the supplied subcommand group name\n * @typeParam SubcommandName - This is inferred by the supplied subcommand name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param subcommandGroupName - The subcommand group name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandGroupName extends string,\n\tSubcommandName extends string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandGroupName: SubcommandGroupName,\n\tsubcommandName: SubcommandName,\n\tcommandId: CommandId,\n): `</${CommandName} ${SubcommandGroupName} ${SubcommandName}:${CommandId}>`;\n\n/**\n * Formats an application command name, subcommand name, and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam SubcommandName - This is inferred by the supplied subcommand name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandName extends string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandName: SubcommandName,\n\tcommandId: CommandId,\n): `</${CommandName} ${SubcommandName}:${CommandId}>`;\n\n/**\n * Formats an application command name and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<CommandName extends string, CommandId extends Snowflake>(\n\tcommandName: CommandName,\n\tcommandId: CommandId,\n): `</${CommandName}:${CommandId}>`;\n\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandGroupName extends Snowflake | string,\n\tSubcommandName extends Snowflake | string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandGroupName: SubcommandGroupName,\n\tsubcommandName?: SubcommandName,\n\tcommandId?: CommandId,\n):\n\t| `</${CommandName} ${SubcommandGroupName} ${SubcommandName}:${CommandId}>`\n\t| `</${CommandName} ${SubcommandGroupName}:${SubcommandName}>`\n\t| `</${CommandName}:${SubcommandGroupName}>` {\n\tif (commandId !== undefined) {\n\t\treturn `</${commandName} ${subcommandGroupName} ${subcommandName!}:${commandId}>`;\n\t}\n\n\tif (subcommandName !== undefined) {\n\t\treturn `</${commandName} ${subcommandGroupName}:${subcommandName}>`;\n\t}\n\n\treturn `</${commandName}:${subcommandGroupName}>`;\n}\n\n/**\n * Formats a non-animated emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n */\nexport function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: false): `<:_:${EmojiId}>`;\n\n/**\n * Formats an animated emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n * @param animated - Whether the emoji is animated\n */\nexport function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: true): `<a:_:${EmojiId}>`;\n\n/**\n * Formats an emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n * @param animated - Whether the emoji is animated\n */\nexport function formatEmoji<EmojiId extends Snowflake>(\n\temojiId: EmojiId,\n\tanimated?: boolean,\n): `<:_:${EmojiId}>` | `<a:_:${EmojiId}>`;\n\n/**\n * Formats a non-animated emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName> & { animated: true },\n): `<a:${EmojiName}:${EmojiId}>`;\n\n/**\n * Formats an animated emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName> & { animated?: false },\n): `<:${EmojiName}:${EmojiId}>`;\n\n/**\n * Formats an emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied emoji name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName>,\n): `<:${EmojiName}:${EmojiId}>` | `<a:${EmojiName}:${EmojiId}>`;\n\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\temojiIdOrOptions: EmojiId | FormatEmojiOptions<EmojiId, EmojiName>,\n\tanimated?: boolean,\n): `<:${string}:${EmojiId}>` | `<a:${string}:${EmojiId}>` {\n\tconst options =\n\t\ttypeof emojiIdOrOptions === 'string'\n\t\t\t? {\n\t\t\t\t\tid: emojiIdOrOptions,\n\t\t\t\t\tanimated: animated ?? false,\n\t\t\t\t}\n\t\t\t: emojiIdOrOptions;\n\n\tconst { id, animated: isAnimated, name: emojiName } = options;\n\n\treturn `<${isAnimated ? 'a' : ''}:${emojiName ?? '_'}:${id}>`;\n}\n\n/**\n * The options for formatting an emoji.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied emoji name\n */\nexport interface FormatEmojiOptions<EmojiId extends Snowflake, EmojiName extends string> {\n\t/**\n\t * Whether the emoji is animated\n\t */\n\tanimated?: boolean;\n\t/**\n\t * The emoji id to format\n\t */\n\tid: EmojiId;\n\t/**\n\t * The name of the emoji\n\t */\n\tname?: EmojiName;\n}\n\n/**\n * Formats a channel link for a direct message channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @param channelId - The channel's id\n */\nexport function channelLink<ChannelId extends Snowflake>(\n\tchannelId: ChannelId,\n): `https://discord.com/channels/@me/${ChannelId}`;\n\n/**\n * Formats a channel link for a guild channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam GuildId - This is inferred by the supplied guild id\n * @param channelId - The channel's id\n * @param guildId - The guild's id\n */\nexport function channelLink<ChannelId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tguildId: GuildId,\n): `https://discord.com/channels/${GuildId}/${ChannelId}`;\n\nexport function channelLink<ChannelId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tguildId?: GuildId,\n): `https://discord.com/channels/@me/${ChannelId}` | `https://discord.com/channels/${GuildId}/${ChannelId}` {\n\treturn `https://discord.com/channels/${guildId ?? '@me'}/${channelId}`;\n}\n\n/**\n * Formats a message link for a direct message channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam MessageId - This is inferred by the supplied message id\n * @param channelId - The channel's id\n * @param messageId - The message's id\n */\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n): `https://discord.com/channels/@me/${ChannelId}/${MessageId}`;\n\n/**\n * Formats a message link for a guild channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam MessageId - This is inferred by the supplied message id\n * @typeParam GuildId - This is inferred by the supplied guild id\n * @param channelId - The channel's id\n * @param messageId - The message's id\n * @param guildId - The guild's id\n */\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n\tguildId: GuildId,\n): `https://discord.com/channels/${GuildId}/${ChannelId}/${MessageId}`;\n\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n\tguildId?: GuildId,\n):\n\t| `https://discord.com/channels/@me/${ChannelId}/${MessageId}`\n\t| `https://discord.com/channels/${GuildId}/${ChannelId}/${MessageId}` {\n\treturn `${guildId === undefined ? channelLink(channelId) : channelLink(channelId, guildId)}/${messageId}`;\n}\n\n/**\n * The heading levels for expanded markdown.\n */\nexport enum HeadingLevel {\n\t/**\n\t * The first heading level.\n\t */\n\tOne = 1,\n\t/**\n\t * The second heading level.\n\t */\n\tTwo,\n\t/**\n\t * The third heading level.\n\t */\n\tThree,\n}\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level?: HeadingLevel.One): `# ${Content}`;\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level: HeadingLevel.Two): `## ${Content}`;\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level: HeadingLevel.Three): `### ${Content}`;\n\nexport function heading(content: string, level?: HeadingLevel) {\n\tswitch (level) {\n\t\tcase HeadingLevel.Three:\n\t\t\treturn `### ${content}`;\n\t\tcase HeadingLevel.Two:\n\t\t\treturn `## ${content}`;\n\t\tdefault:\n\t\t\treturn `# ${content}`;\n\t}\n}\n\n/**\n * A type that recursively traverses into arrays.\n */\nexport type RecursiveArray<ItemType> = readonly (ItemType | RecursiveArray<ItemType>)[];\n\n/**\n * Callback function for list formatters.\n *\n * @internal\n */\nfunction listCallback(element: RecursiveArray<string>, startNumber?: number, depth = 0): string {\n\tif (Array.isArray(element)) {\n\t\treturn element.map((element) => listCallback(element, startNumber, depth + 1)).join('\\n');\n\t}\n\n\treturn `${' '.repeat(depth - 1)}${startNumber ? `${startNumber}.` : '-'} ${element}`;\n}\n\n/**\n * Formats the elements in the array to an ordered list.\n *\n * @param list - The array of elements to list\n * @param startNumber - The starting number for the list\n */\nexport function orderedList(list: RecursiveArray<string>, startNumber = 1): string {\n\treturn listCallback(list, Math.max(startNumber, 1));\n}\n\n/**\n * Formats the elements in the array to an unordered list.\n *\n * @param list - The array of elements to list\n */\nexport function unorderedList(list: RecursiveArray<string>): string {\n\treturn listCallback(list);\n}\n\n/**\n * Formats the content into a subtext.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function subtext<Content extends string>(content: Content): `-# ${Content}` {\n\treturn `-# ${content}`;\n}\n\n/**\n * Formats a date into a short date-time string.\n *\n * @param date - The date to format. Defaults to the current time\n */\nexport function time(date?: Date): `<t:${bigint}>`;\n\n/**\n * Formats a date given a format style.\n *\n * @typeParam Style - This is inferred by the supplied {@link TimestampStylesString}\n * @param date - The date to format\n * @param style - The style to use\n */\nexport function time<Style extends TimestampStylesString>(date: Date, style: Style): `<t:${bigint}:${Style}>`;\n\n/**\n * Formats the given timestamp into a short date-time string.\n *\n * @typeParam Seconds - This is inferred by the supplied timestamp\n * @param seconds - A Unix timestamp in seconds\n */\nexport function time<Seconds extends number>(seconds: Seconds): `<t:${Seconds}>`;\n\n/**\n * Formats the given timestamp into a short date-time string.\n *\n * @typeParam Seconds - This is inferred by the supplied timestamp\n * @typeParam Style - This is inferred by the supplied {@link TimestampStylesString}\n * @param seconds - A Unix timestamp in seconds\n * @param style - The style to use\n */\nexport function time<Seconds extends number, Style extends TimestampStylesString>(\n\tseconds: Seconds,\n\tstyle: Style,\n): `<t:${Seconds}:${Style}>`;\n\nexport function time(timeOrSeconds?: Date | number, style?: TimestampStylesString): string {\n\tif (typeof timeOrSeconds !== 'number') {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\ttimeOrSeconds = Math.floor((timeOrSeconds?.getTime() ?? Date.now()) / 1_000);\n\t}\n\n\treturn typeof style === 'string' ? `<t:${timeOrSeconds}:${style}>` : `<t:${timeOrSeconds}>`;\n}\n\n/**\n * Formats an application directory link.\n *\n * @typeParam ApplicationId - This is inferred by the supplied application id\n * @param applicationId - The application id\n */\nexport function applicationDirectory<ApplicationId extends Snowflake>(\n\tapplicationId: ApplicationId,\n): `https://discord.com/application-directory/${ApplicationId}/store`;\n\n/**\n * Formats an application directory SKU link.\n *\n * @typeParam ApplicationId - This is inferred by the supplied application id\n * @typeParam SKUId - This is inferred by the supplied SKU id\n * @param applicationId - The application id\n * @param skuId - The SKU id\n */\nexport function applicationDirectory<ApplicationId extends Snowflake, SKUId extends Snowflake>(\n\tapplicationId: ApplicationId,\n\tskuId: SKUId,\n): `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`;\n\nexport function applicationDirectory<ApplicationId extends Snowflake, SKUId extends Snowflake>(\n\tapplicationId: ApplicationId,\n\tskuId?: SKUId,\n):\n\t| `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`\n\t| `https://discord.com/application-directory/${ApplicationId}/store` {\n\tconst url = `https://discord.com/application-directory/${applicationId}/store` as const;\n\treturn skuId ? `${url}/${skuId}` : url;\n}\n\n/**\n * The {@link https://discord.com/developers/docs/reference#message-formatting-timestamp-styles | message formatting timestamp styles}\n * supported by Discord.\n */\nexport const TimestampStyles = {\n\t/**\n\t * Short time format, consisting of hours and minutes.\n\t *\n\t * @example `16:20`\n\t */\n\tShortTime: 't',\n\n\t/**\n\t * Long time format, consisting of hours, minutes, and seconds.\n\t *\n\t * @example `16:20:30`\n\t */\n\tLongTime: 'T',\n\n\t/**\n\t * Short date format, consisting of day, month, and year.\n\t *\n\t * @example `20/04/2021`\n\t */\n\tShortDate: 'd',\n\n\t/**\n\t * Long date format, consisting of day, month, and year.\n\t *\n\t * @example `20 April 2021`\n\t */\n\tLongDate: 'D',\n\n\t/**\n\t * Short date-time format, consisting of short date and short time formats.\n\t *\n\t * @example `20 April 2021 16:20`\n\t */\n\tShortDateTime: 'f',\n\n\t/**\n\t * Long date-time format, consisting of long date and short time formats.\n\t *\n\t * @example `Tuesday, 20 April 2021 16:20`\n\t */\n\tLongDateTime: 'F',\n\n\t/**\n\t * Relative time format, consisting of a relative duration format.\n\t *\n\t * @example `2 months ago`\n\t */\n\tRelativeTime: 'R',\n} as const satisfies Record<string, string>;\n\n/**\n * The possible {@link TimestampStyles} values.\n */\nexport type TimestampStylesString = (typeof TimestampStyles)[keyof typeof TimestampStyles];\n\n/**\n * All the available faces from Discord's native slash commands.\n */\nexport enum Faces {\n\t/**\n\t * `¯\\_(ツ)_/¯`\n\t */\n\tShrug = '¯\\\\_(ツ)_/¯',\n\n\t/**\n\t * `(╯°□°)╯︵ ┻━┻`\n\t */\n\tTableflip = '(╯°□°)╯︵ ┻━┻',\n\n\t/**\n\t * `┬─┬ノ( º _ ºノ)`\n\t */\n\tUnflip = '┬─┬ノ( º _ ºノ)',\n}\n\n/**\n * All the available guild navigation mentions.\n */\nexport enum GuildNavigationMentions {\n\t/**\n\t * Browse Channels tab.\n\t */\n\tBrowse = '<id:browse>',\n\t/**\n\t * Customize tab with the server's {@link https://discord.com/developers/docs/resources/guild#guild-onboarding-object | onboarding prompts}.\n\t */\n\tCustomize = '<id:customize>',\n\t/**\n\t * {@link https://support.discord.com/hc/articles/13497665141655 | Server Guide} tab.\n\t */\n\tGuide = '<id:guide>',\n}\n","export * from './escapers.js';\nexport * from './formatters.js';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/formatters#readme | @discordjs/formatters} version\n * that you are currently using.\n *\n * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '0.6.1' as string;\n"],"mappings":";;;;AA8GO,SAAS,eAAe,MAAc,UAAiC,CAAC,GAAW;AACzF,QAAM;AAAA,IACL,WAAAA,aAAY;AAAA,IACZ,YAAAC,cAAa;AAAA,IACb,MAAAC,QAAO;AAAA,IACP,QAAAC,UAAS;AAAA,IACT,WAAAC,aAAY;AAAA,IACZ,eAAAC,iBAAgB;AAAA,IAChB,SAAAC,WAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,SAAAC,WAAU;AAAA,IACV,eAAe;AAAA,IACf,eAAe;AAAA,IACf,aAAa;AAAA,EACd,IAAI;AAEJ,MAAI,CAAC,kBAAkB;AACtB,WAAO,KACL,MAAM,KAAK,EACX,IAAI,CAAC,WAAW,OAAO,UAAU;AACjC,UAAI,QAAQ,KAAK,UAAU,MAAM,SAAS,EAAG,QAAO;AACpD,aAAO,eAAe,WAAW;AAAA,QAChC,YAAAN;AAAA,QACA,MAAAC;AAAA,QACA,QAAAC;AAAA,QACA,WAAAC;AAAA,QACA,eAAAC;AAAA,QACA,SAAAC;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAAC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAAA,IACF,CAAC,EACA,KAAKP,aAAY,cAAc,KAAK;AAAA,EACvC;AAEA,MAAI,CAAC,mBAAmB;AACvB,WAAO,KACL,MAAM,yBAAyB,EAC/B,IAAI,CAAC,WAAW,OAAO,UAAU;AACjC,UAAI,QAAQ,KAAK,UAAU,MAAM,SAAS,EAAG,QAAO;AACpD,aAAO,eAAe,WAAW;AAAA,QAChC,WAAAA;AAAA,QACA,MAAAE;AAAA,QACA,QAAAC;AAAA,QACA,WAAAC;AAAA,QACA,eAAAC;AAAA,QACA,SAAAC;AAAA,QACA;AAAA,QACA,SAAAC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAAA,IACF,CAAC,EACA,KAAKN,cAAa,QAAQ,GAAG;AAAA,EAChC;AAEA,MAAI,MAAM;AACV,MAAI,OAAQ,OAAM,aAAa,GAAG;AAClC,MAAIA,YAAY,OAAM,iBAAiB,GAAG;AAC1C,MAAID,WAAW,OAAM,gBAAgB,GAAG;AACxC,MAAIG,QAAQ,OAAM,aAAa,GAAG;AAClC,MAAID,MAAM,OAAM,WAAW,GAAG;AAC9B,MAAIE,WAAW,OAAM,gBAAgB,GAAG;AACxC,MAAIC,eAAe,OAAM,oBAAoB,GAAG;AAChD,MAAIC,SAAS,OAAM,cAAc,GAAG;AACpC,MAAIC,SAAS,OAAM,cAAc,GAAG;AACpC,MAAI,aAAc,OAAM,mBAAmB,GAAG;AAC9C,MAAI,aAAc,OAAM,mBAAmB,GAAG;AAC9C,MAAI,WAAY,OAAM,iBAAiB,GAAG;AAC1C,SAAO;AACR;AA7EgB;AAoFT,SAAS,gBAAgB,MAAsB;AACrD,SAAO,KAAK,WAAW,OAAO,WAAW;AAC1C;AAFgB;AAST,SAAS,iBAAiB,MAAsB;AACtD,SAAO,KAAK,WAAW,6BAA6B,CAAC,UAAW,MAAM,WAAW,IAAI,WAAW,KAAM;AACvG;AAFgB;AAST,SAAS,aAAa,MAAsB;AAClD,MAAI,MAAM;AACV,QAAM,UAAU,KAAK,WAAW,+BAA+B,CAAC,GAAG,UAAU;AAC5E,QAAI,UAAU,KAAM,QAAO,EAAE,MAAM,IAAI,MAAM,KAAK,KAAK,GAAG,KAAK;AAC/D,WAAO,MAAM,KAAK;AAAA,EACnB,CAAC;AACD,QAAM;AACN,SAAO,QAAQ,WAAW,+DAA+D,CAAC,GAAG,UAAU;AACtG,QAAI,UAAU,KAAM,QAAO,EAAE,MAAM,IAAI,MAAM,KAAK,KAAK,GAAG,KAAK;AAC/D,WAAO,MAAM,KAAK;AAAA,EACnB,CAAC;AACF;AAXgB;AAkBT,SAAS,WAAW,MAAsB;AAChD,MAAI,MAAM;AACV,SAAO,KAAK,WAAW,cAAc,CAAC,GAAG,UAAU;AAClD,QAAI,MAAO,QAAO,EAAE,MAAM,IAAI,GAAG,KAAK,WAAW,SAAS,KAAK;AAC/D,WAAO;AAAA,EACR,CAAC;AACF;AANgB;AAaT,SAAS,gBAAgB,MAAsB;AACrD,MAAI,MAAM;AACV,SAAO,KAAK,WAAW,8CAA8C,CAAC,GAAG,UAAU;AAClF,QAAI,MAAO,QAAO,EAAE,MAAM,IAAI,GAAG,KAAK,WAAW,SAAS,KAAK;AAC/D,WAAO;AAAA,EACR,CAAC;AACF;AANgB;AAaT,SAAS,oBAAoB,MAAsB;AACzD,SAAO,KAAK,WAAW,MAAM,QAAQ;AACtC;AAFgB;AAST,SAAS,cAAc,MAAsB;AACnD,SAAO,KAAK,WAAW,MAAM,QAAQ;AACtC;AAFgB;AAST,SAAS,aAAa,MAAsB;AAClD,SAAO,KAAK,WAAW,MAAM,MAAM;AACpC;AAFgB;AAST,SAAS,cAAc,MAAsB;AACnD,SAAO,KAAK,WAAW,oCAAoC,YAAY;AACxE;AAFgB;AAST,SAAS,mBAAmB,MAAsB;AACxD,SAAO,KAAK,WAAW,qBAAqB,UAAU;AACvD;AAFgB;AAST,SAAS,mBAAmB,MAAsB;AACxD,SAAO,KAAK,WAAW,gBAAgB,OAAO;AAC/C;AAFgB;AAST,SAAS,iBAAiB,MAAsB;AACtD,SAAO,KAAK,WAAW,iBAAiB,MAAM;AAC/C;AAFgB;;;AC9RT,SAAS,UAAU,UAAkB,SAA0B;AACrE,SAAO,YAAY,SAAY;AAAA,EAAW,QAAQ;AAAA,UAAa,SAAS,QAAQ;AAAA,EAAK,OAAO;AAAA;AAC7F;AAFgB;AAUT,SAAS,WAAmC,SAAoC;AACtF,SAAO,KAAK,OAAO;AACpB;AAFgB;AAUT,SAAS,OAA+B,SAAkC;AAChF,SAAO,IAAI,OAAO;AACnB;AAFgB;AAUT,SAAS,KAA6B,SAAoC;AAChF,SAAO,KAAK,OAAO;AACpB;AAFgB;AAWT,SAAS,WAAmC,SAAoC;AACtF,SAAO,UAAU,OAAO;AACzB;AAFgB;AAUT,SAAS,UAAkC,SAAoC;AACrF,SAAO,KAAK,OAAO;AACpB;AAFgB;AAUT,SAAS,cAAsC,SAAoC;AACzF,SAAO,KAAK,OAAO;AACpB;AAFgB;AAWT,SAAS,MAA8B,SAAkC;AAC/E,SAAO,KAAK,OAAO;AACpB;AAFgB;AAWT,SAAS,WAAmC,SAAoC;AACtF,SAAO,OAAO,OAAO;AACtB;AAFgB;AAmBT,SAAS,cAAc,KAAmB;AAChD,SAAO,IAAI,GAAG;AACf;AAFgB;AAyDT,SAAS,UAAU,SAAiB,KAAmB,OAAgB;AAC7E,SAAO,QAAQ,IAAI,OAAO,KAAK,GAAG,KAAK,KAAK,OAAO,IAAI,OAAO,KAAK,GAAG;AACvE;AAFgB;AAUT,SAAS,QAAgC,SAAoC;AACnF,SAAO,KAAK,OAAO;AACpB;AAFgB;AAUT,SAAS,YAAsC,QAAgC;AACrF,SAAO,KAAK,MAAM;AACnB;AAFgB;AAUT,SAAS,eAA4C,WAAyC;AACpG,SAAO,KAAK,SAAS;AACtB;AAFgB;AAUT,SAAS,YAAsC,QAAiC;AACtF,SAAO,MAAM,MAAM;AACpB;AAFgB;AA6DT,SAAS,mCAMf,aACA,qBACA,gBACA,WAI6C;AAC7C,MAAI,cAAc,QAAW;AAC5B,WAAO,KAAK,WAAW,IAAI,mBAAmB,IAAI,cAAe,IAAI,SAAS;AAAA,EAC/E;AAEA,MAAI,mBAAmB,QAAW;AACjC,WAAO,KAAK,WAAW,IAAI,mBAAmB,IAAI,cAAc;AAAA,EACjE;AAEA,SAAO,KAAK,WAAW,IAAI,mBAAmB;AAC/C;AAvBgB;AAuFT,SAAS,YACf,kBACA,UACyD;AACzD,QAAM,UACL,OAAO,qBAAqB,WACzB;AAAA,IACA,IAAI;AAAA,IACJ,UAAU,YAAY;AAAA,EACvB,IACC;AAEJ,QAAM,EAAE,IAAI,UAAU,YAAY,MAAM,UAAU,IAAI;AAEtD,SAAO,IAAI,aAAa,MAAM,EAAE,IAAI,aAAa,GAAG,IAAI,EAAE;AAC3D;AAfgB;AA6DT,SAAS,YACf,WACA,SAC2G;AAC3G,SAAO,gCAAgC,WAAW,KAAK,IAAI,SAAS;AACrE;AALgB;AAoCT,SAAS,YACf,WACA,WACA,SAGsE;AACtE,SAAO,GAAG,YAAY,SAAY,YAAY,SAAS,IAAI,YAAY,WAAW,OAAO,CAAC,IAAI,SAAS;AACxG;AARgB;AAaT,IAAK,eAAL,kBAAKC,kBAAL;AAIN,EAAAA,4BAAA,SAAM,KAAN;AAIA,EAAAA,4BAAA;AAIA,EAAAA,4BAAA;AAZW,SAAAA;AAAA,GAAA;AA0CL,SAAS,QAAQ,SAAiB,OAAsB;AAC9D,UAAQ,OAAO;AAAA,IACd,KAAK;AACJ,aAAO,OAAO,OAAO;AAAA,IACtB,KAAK;AACJ,aAAO,MAAM,OAAO;AAAA,IACrB;AACC,aAAO,KAAK,OAAO;AAAA,EACrB;AACD;AATgB;AAqBhB,SAAS,aAAa,SAAiC,aAAsB,QAAQ,GAAW;AAC/F,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO,QAAQ,IAAI,CAACC,aAAY,aAAaA,UAAS,aAAa,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EACzF;AAEA,SAAO,GAAG,KAAK,OAAO,QAAQ,CAAC,CAAC,GAAG,cAAc,GAAG,WAAW,MAAM,GAAG,IAAI,OAAO;AACpF;AANS;AAcF,SAAS,YAAY,MAA8B,cAAc,GAAW;AAClF,SAAO,aAAa,MAAM,KAAK,IAAI,aAAa,CAAC,CAAC;AACnD;AAFgB;AAST,SAAS,cAAc,MAAsC;AACnE,SAAO,aAAa,IAAI;AACzB;AAFgB;AAUT,SAAS,QAAgC,SAAmC;AAClF,SAAO,MAAM,OAAO;AACrB;AAFgB;AAyCT,SAAS,KAAK,eAA+B,OAAuC;AAC1F,MAAI,OAAO,kBAAkB,UAAU;AAEtC,oBAAgB,KAAK,OAAO,eAAe,QAAQ,KAAK,KAAK,IAAI,KAAK,GAAK;AAAA,EAC5E;AAEA,SAAO,OAAO,UAAU,WAAW,MAAM,aAAa,IAAI,KAAK,MAAM,MAAM,aAAa;AACzF;AAPgB;AAgCT,SAAS,qBACf,eACA,OAGqE;AACrE,QAAM,MAAM,6CAA6C,aAAa;AACtE,SAAO,QAAQ,GAAG,GAAG,IAAI,KAAK,KAAK;AACpC;AARgB;AAcT,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9B,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOX,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOV,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOX,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOV,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,cAAc;AACf;AAUO,IAAK,QAAL,kBAAKC,WAAL;AAIN,EAAAA,OAAA,WAAQ;AAKR,EAAAA,OAAA,eAAY;AAKZ,EAAAA,OAAA,YAAS;AAdE,SAAAA;AAAA,GAAA;AAoBL,IAAK,0BAAL,kBAAKC,6BAAL;AAIN,EAAAA,yBAAA,YAAS;AAIT,EAAAA,yBAAA,eAAY;AAIZ,EAAAA,yBAAA,WAAQ;AAZG,SAAAA;AAAA,GAAA;;;AC9tBL,IAAM,UAAU;","names":["codeBlock","inlineCode","bold","italic","underline","strikethrough","spoiler","heading","HeadingLevel","element","Faces","GuildNavigationMentions"]}
1
+ {"version":3,"sources":["../src/escapers.ts","../src/formatters.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable prefer-named-capture-group */\n\n/**\n * The options that affect what will be escaped.\n */\nexport interface EscapeMarkdownOptions {\n\t/**\n\t * Whether to escape bold text.\n\t *\n\t * @defaultValue `true`\n\t */\n\tbold?: boolean;\n\n\t/**\n\t * Whether to escape bulleted lists.\n\t *\n\t * @defaultValue `false`\n\t */\n\tbulletedList?: boolean;\n\n\t/**\n\t * Whether to escape code blocks.\n\t *\n\t * @defaultValue `true`\n\t */\n\tcodeBlock?: boolean;\n\n\t/**\n\t * Whether to escape text inside code blocks.\n\t *\n\t * @defaultValue `true`\n\t */\n\tcodeBlockContent?: boolean;\n\n\t/**\n\t * Whether to escape `\\`.\n\t *\n\t * @defaultValue `true`\n\t */\n\tescape?: boolean;\n\n\t/**\n\t * Whether to escape headings.\n\t *\n\t * @defaultValue `false`\n\t */\n\theading?: boolean;\n\n\t/**\n\t * Whether to escape inline code.\n\t *\n\t * @defaultValue `true`\n\t */\n\tinlineCode?: boolean;\n\n\t/**\n\t * Whether to escape text inside inline code.\n\t *\n\t * @defaultValue `true`\n\t */\n\tinlineCodeContent?: boolean;\n\t/**\n\t * Whether to escape italics.\n\t *\n\t * @defaultValue `true`\n\t */\n\titalic?: boolean;\n\n\t/**\n\t * Whether to escape masked links.\n\t *\n\t * @defaultValue `false`\n\t */\n\tmaskedLink?: boolean;\n\n\t/**\n\t * Whether to escape numbered lists.\n\t *\n\t * @defaultValue `false`\n\t */\n\tnumberedList?: boolean;\n\n\t/**\n\t * Whether to escape spoilers.\n\t *\n\t * @defaultValue `true`\n\t */\n\tspoiler?: boolean;\n\n\t/**\n\t * Whether to escape strikethroughs.\n\t *\n\t * @defaultValue `true`\n\t */\n\tstrikethrough?: boolean;\n\n\t/**\n\t * Whether to escape underlines.\n\t *\n\t * @defaultValue `true`\n\t */\n\tunderline?: boolean;\n}\n\n/**\n * Escapes any Discord-flavored markdown in a string.\n *\n * @param text - Content to escape\n * @param options - Options for escaping the markdown\n */\nexport function escapeMarkdown(text: string, options: EscapeMarkdownOptions = {}): string {\n\tconst {\n\t\tcodeBlock = true,\n\t\tinlineCode = true,\n\t\tbold = true,\n\t\titalic = true,\n\t\tunderline = true,\n\t\tstrikethrough = true,\n\t\tspoiler = true,\n\t\tcodeBlockContent = true,\n\t\tinlineCodeContent = true,\n\t\tescape = true,\n\t\theading = false,\n\t\tbulletedList = false,\n\t\tnumberedList = false,\n\t\tmaskedLink = false,\n\t} = options;\n\n\tif (!codeBlockContent) {\n\t\treturn text\n\t\t\t.split('```')\n\t\t\t.map((subString, index, array) => {\n\t\t\t\tif (index % 2 && index !== array.length - 1) return subString;\n\t\t\t\treturn escapeMarkdown(subString, {\n\t\t\t\t\tinlineCode,\n\t\t\t\t\tbold,\n\t\t\t\t\titalic,\n\t\t\t\t\tunderline,\n\t\t\t\t\tstrikethrough,\n\t\t\t\t\tspoiler,\n\t\t\t\t\tinlineCodeContent,\n\t\t\t\t\tescape,\n\t\t\t\t\theading,\n\t\t\t\t\tbulletedList,\n\t\t\t\t\tnumberedList,\n\t\t\t\t\tmaskedLink,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(codeBlock ? '\\\\`\\\\`\\\\`' : '```');\n\t}\n\n\tif (!inlineCodeContent) {\n\t\treturn text\n\t\t\t.split(/(?<=^|[^`])`(?=[^`]|$)/g)\n\t\t\t.map((subString, index, array) => {\n\t\t\t\tif (index % 2 && index !== array.length - 1) return subString;\n\t\t\t\treturn escapeMarkdown(subString, {\n\t\t\t\t\tcodeBlock,\n\t\t\t\t\tbold,\n\t\t\t\t\titalic,\n\t\t\t\t\tunderline,\n\t\t\t\t\tstrikethrough,\n\t\t\t\t\tspoiler,\n\t\t\t\t\tescape,\n\t\t\t\t\theading,\n\t\t\t\t\tbulletedList,\n\t\t\t\t\tnumberedList,\n\t\t\t\t\tmaskedLink,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(inlineCode ? '\\\\`' : '`');\n\t}\n\n\tlet res = text;\n\tif (escape) res = escapeEscape(res);\n\tif (inlineCode) res = escapeInlineCode(res);\n\tif (codeBlock) res = escapeCodeBlock(res);\n\tif (italic) res = escapeItalic(res);\n\tif (bold) res = escapeBold(res);\n\tif (underline) res = escapeUnderline(res);\n\tif (strikethrough) res = escapeStrikethrough(res);\n\tif (spoiler) res = escapeSpoiler(res);\n\tif (heading) res = escapeHeading(res);\n\tif (bulletedList) res = escapeBulletedList(res);\n\tif (numberedList) res = escapeNumberedList(res);\n\tif (maskedLink) res = escapeMaskedLink(res);\n\treturn res;\n}\n\n/**\n * Escapes code block markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeCodeBlock(text: string): string {\n\treturn text.replaceAll('```', '\\\\`\\\\`\\\\`');\n}\n\n/**\n * Escapes inline code markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeInlineCode(text: string): string {\n\treturn text.replaceAll(/(?<=^|[^`])``?(?=[^`]|$)/g, (match) => (match.length === 2 ? '\\\\`\\\\`' : '\\\\`'));\n}\n\n/**\n * Escapes italic markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeItalic(text: string): string {\n\tlet idx = 0;\n\tconst newText = text.replaceAll(\n\t\t/(?<=^|[^*])(?<!(?<!<)https?:\\/\\/\\S*|<[^\\s:]+:\\/[^\\s>]*)\\*([^*]|\\*\\*|$)/g,\n\t\t(_, match) => {\n\t\t\tif (match === '**') return ++idx % 2 ? `\\\\*${match}` : `${match}\\\\*`;\n\t\t\treturn `\\\\*${match}`;\n\t\t},\n\t);\n\tidx = 0;\n\treturn newText.replaceAll(\n\t\t/(?<=^|[^_])(?<!<a?:.+|(?<!<)https?:\\/\\/\\S*|<[^\\s:]:\\/[^\\s>]*)_(?!:\\d+>)([^_]|__|$)/g,\n\t\t(_, match) => {\n\t\t\tif (match === '__') return ++idx % 2 ? `\\\\_${match}` : `${match}\\\\_`;\n\t\t\treturn `\\\\_${match}`;\n\t\t},\n\t);\n}\n\n/**\n * Escapes bold markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeBold(text: string): string {\n\tlet idx = 0;\n\treturn text.replaceAll(/\\*\\*(\\*)?/g, (_, match) => {\n\t\tif (match) return ++idx % 2 ? `${match}\\\\*\\\\*` : `\\\\*\\\\*${match}`;\n\t\treturn '\\\\*\\\\*';\n\t});\n}\n\n/**\n * Escapes underline markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeUnderline(text: string): string {\n\tlet idx = 0;\n\treturn text.replaceAll(/(?<!<a?:.+|https?:\\/\\/\\S+)__(_)?(?!:\\d+>)/g, (_, match) => {\n\t\tif (match) return ++idx % 2 ? `${match}\\\\_\\\\_` : `\\\\_\\\\_${match}`;\n\t\treturn '\\\\_\\\\_';\n\t});\n}\n\n/**\n * Escapes strikethrough markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeStrikethrough(text: string): string {\n\treturn text.replaceAll('~~', '\\\\~\\\\~');\n}\n\n/**\n * Escapes spoiler markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeSpoiler(text: string): string {\n\treturn text.replaceAll('||', '\\\\|\\\\|');\n}\n\n/**\n * Escapes escape characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeEscape(text: string): string {\n\treturn text.replaceAll('\\\\', '\\\\\\\\');\n}\n\n/**\n * Escapes heading characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeHeading(text: string): string {\n\treturn text.replaceAll(/^( {0,2})([*-] )?( *)(#{1,3} )/gm, '$1$2$3\\\\$4');\n}\n\n/**\n * Escapes bulleted list characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeBulletedList(text: string): string {\n\treturn text.replaceAll(/^( *)([*-])( +)/gm, '$1\\\\$2$3');\n}\n\n/**\n * Escapes numbered list characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeNumberedList(text: string): string {\n\treturn text.replaceAll(/^( *\\d+)\\./gm, '$1\\\\.');\n}\n\n/**\n * Escapes masked link characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeMaskedLink(text: string): string {\n\treturn text.replaceAll(/\\[.+]\\(.+\\)/gm, '\\\\$&');\n}\n","import type { URL } from 'node:url';\nimport type { Snowflake } from 'discord-api-types/globals';\n\n/**\n * Wraps the content inside a code block with no language.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function codeBlock<Content extends string>(content: Content): `\\`\\`\\`\\n${Content}\\n\\`\\`\\``;\n\n/**\n * Wraps the content inside a code block with the specified language.\n *\n * @typeParam Language - This is inferred by the supplied language\n * @typeParam Content - This is inferred by the supplied content\n * @param language - The language for the code block\n * @param content - The content to wrap\n */\nexport function codeBlock<Language extends string, Content extends string>(\n\tlanguage: Language,\n\tcontent: Content,\n): `\\`\\`\\`${Language}\\n${Content}\\n\\`\\`\\``;\n\nexport function codeBlock(language: string, content?: string): string {\n\treturn content === undefined ? `\\`\\`\\`\\n${language}\\n\\`\\`\\`` : `\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``;\n}\n\n/**\n * Wraps the content inside \\`backticks\\` which formats it as inline code.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function inlineCode<Content extends string>(content: Content): `\\`${Content}\\`` {\n\treturn `\\`${content}\\``;\n}\n\n/**\n * Formats the content into italic text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function italic<Content extends string>(content: Content): `_${Content}_` {\n\treturn `_${content}_`;\n}\n\n/**\n * Formats the content into bold text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function bold<Content extends string>(content: Content): `**${Content}**` {\n\treturn `**${content}**`;\n}\n\n/**\n * Formats the content into underscored text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @deprecated Use {@link underline} instead.\n */\nexport function underscore<Content extends string>(content: Content): `__${Content}__` {\n\treturn underline(content);\n}\n\n/**\n * Formats the content into underlined text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function underline<Content extends string>(content: Content): `__${Content}__` {\n\treturn `__${content}__`;\n}\n\n/**\n * Formats the content into strike-through text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function strikethrough<Content extends string>(content: Content): `~~${Content}~~` {\n\treturn `~~${content}~~`;\n}\n\n/**\n * Formats the content into a quote.\n *\n * @remarks This needs to be at the start of the line for Discord to format it.\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function quote<Content extends string>(content: Content): `> ${Content}` {\n\treturn `> ${content}`;\n}\n\n/**\n * Formats the content into a block quote.\n *\n * @remarks This needs to be at the start of the line for Discord to format it.\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function blockQuote<Content extends string>(content: Content): `>>> ${Content}` {\n\treturn `>>> ${content}`;\n}\n\n/**\n * Wraps the URL into `<>` which stops it from embedding.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed<Content extends string>(url: Content): `<${Content}>`;\n\n/**\n * Wraps the URL into `<>` which stops it from embedding.\n *\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed(url: URL): `<${string}>`;\n\nexport function hideLinkEmbed(url: URL | string) {\n\treturn `<${url}>`;\n}\n\n/**\n * Formats the content and the URL into a masked URL.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink<Content extends string>(content: Content, url: URL): `[${Content}](${string})`;\n\n/**\n * Formats the content and the URL into a masked URL.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Url - This is inferred by the supplied URL\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink<Content extends string, Url extends string>(\n\tcontent: Content,\n\turl: Url,\n): `[${Content}](${Url})`;\n\n/**\n * Formats the content and the URL into a masked URL with a custom tooltip.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Title - This is inferred by the supplied title\n * @param content - The content to display\n * @param url - The URL the content links to\n * @param title - The title shown when hovering on the masked link\n */\nexport function hyperlink<Content extends string, Title extends string>(\n\tcontent: Content,\n\turl: URL,\n\ttitle: Title,\n): `[${Content}](${string} \"${Title}\")`;\n\n/**\n * Formats the content and the URL into a masked URL with a custom tooltip.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Url - This is inferred by the supplied URL\n * @typeParam Title - This is inferred by the supplied title\n * @param content - The content to display\n * @param url - The URL the content links to\n * @param title - The title shown when hovering on the masked link\n */\nexport function hyperlink<Content extends string, Url extends string, Title extends string>(\n\tcontent: Content,\n\turl: Url,\n\ttitle: Title,\n): `[${Content}](${Url} \"${Title}\")`;\n\nexport function hyperlink(content: string, url: URL | string, title?: string) {\n\treturn title ? `[${content}](${url} \"${title}\")` : `[${content}](${url})`;\n}\n\n/**\n * Formats the content into a spoiler.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function spoiler<Content extends string>(content: Content): `||${Content}||` {\n\treturn `||${content}||`;\n}\n\n/**\n * Formats a user id into a user mention.\n *\n * @typeParam UserId - This is inferred by the supplied user id\n * @param userId - The user id to format\n */\nexport function userMention<UserId extends Snowflake>(userId: UserId): `<@${UserId}>` {\n\treturn `<@${userId}>`;\n}\n\n/**\n * Formats a channel id into a channel mention.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @param channelId - The channel id to format\n */\nexport function channelMention<ChannelId extends Snowflake>(channelId: ChannelId): `<#${ChannelId}>` {\n\treturn `<#${channelId}>`;\n}\n\n/**\n * Formats a role id into a role mention.\n *\n * @typeParam RoleId - This is inferred by the supplied role id\n * @param roleId - The role id to format\n */\nexport function roleMention<RoleId extends Snowflake>(roleId: RoleId): `<@&${RoleId}>` {\n\treturn `<@&${roleId}>`;\n}\n\n/**\n * Formats a role id into a linked role mention.\n *\n * @typeParam RoleId - This is inferred by the supplied role id\n * @param roleId - The role id to format\n */\nexport function linkedRoleMention<RoleId extends Snowflake>(roleId: RoleId): `<id:linked-roles:${RoleId}>` {\n\treturn `<id:linked-roles:${roleId}>`;\n}\n\n/**\n * Formats an application command name, subcommand group name, subcommand name, and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam SubcommandGroupName - This is inferred by the supplied subcommand group name\n * @typeParam SubcommandName - This is inferred by the supplied subcommand name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param subcommandGroupName - The subcommand group name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandGroupName extends string,\n\tSubcommandName extends string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandGroupName: SubcommandGroupName,\n\tsubcommandName: SubcommandName,\n\tcommandId: CommandId,\n): `</${CommandName} ${SubcommandGroupName} ${SubcommandName}:${CommandId}>`;\n\n/**\n * Formats an application command name, subcommand name, and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam SubcommandName - This is inferred by the supplied subcommand name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandName extends string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandName: SubcommandName,\n\tcommandId: CommandId,\n): `</${CommandName} ${SubcommandName}:${CommandId}>`;\n\n/**\n * Formats an application command name and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention<CommandName extends string, CommandId extends Snowflake>(\n\tcommandName: CommandName,\n\tcommandId: CommandId,\n): `</${CommandName}:${CommandId}>`;\n\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandGroupName extends Snowflake | string,\n\tSubcommandName extends Snowflake | string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandGroupName: SubcommandGroupName,\n\tsubcommandName?: SubcommandName,\n\tcommandId?: CommandId,\n):\n\t| `</${CommandName} ${SubcommandGroupName} ${SubcommandName}:${CommandId}>`\n\t| `</${CommandName} ${SubcommandGroupName}:${SubcommandName}>`\n\t| `</${CommandName}:${SubcommandGroupName}>` {\n\tif (commandId !== undefined) {\n\t\treturn `</${commandName} ${subcommandGroupName} ${subcommandName!}:${commandId}>`;\n\t}\n\n\tif (subcommandName !== undefined) {\n\t\treturn `</${commandName} ${subcommandGroupName}:${subcommandName}>`;\n\t}\n\n\treturn `</${commandName}:${subcommandGroupName}>`;\n}\n\n/**\n * Formats a non-animated emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n */\nexport function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: false): `<:emoji:${EmojiId}>`;\n\n/**\n * Formats an animated emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n * @param animated - Whether the emoji is animated\n */\nexport function formatEmoji<EmojiId extends Snowflake>(emojiId: EmojiId, animated?: true): `<a:emoji:${EmojiId}>`;\n\n/**\n * Formats an emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n * @param animated - Whether the emoji is animated\n */\nexport function formatEmoji<EmojiId extends Snowflake>(\n\temojiId: EmojiId,\n\tanimated?: boolean,\n): `<:emoji:${EmojiId}>` | `<a:emoji:${EmojiId}>`;\n\n/**\n * Formats a non-animated emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName> & { animated: true },\n): `<a:${EmojiName}:${EmojiId}>`;\n\n/**\n * Formats an animated emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName> & { animated?: false },\n): `<:${EmojiName}:${EmojiId}>`;\n\n/**\n * Formats an emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied emoji name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\toptions: FormatEmojiOptions<EmojiId, EmojiName>,\n): `<:${EmojiName}:${EmojiId}>` | `<a:${EmojiName}:${EmojiId}>`;\n\nexport function formatEmoji<EmojiId extends Snowflake, EmojiName extends string>(\n\temojiIdOrOptions: EmojiId | FormatEmojiOptions<EmojiId, EmojiName>,\n\tanimated?: boolean,\n): `<:${string}:${EmojiId}>` | `<a:${string}:${EmojiId}>` {\n\tconst options =\n\t\ttypeof emojiIdOrOptions === 'string'\n\t\t\t? {\n\t\t\t\t\tid: emojiIdOrOptions,\n\t\t\t\t\tanimated: animated ?? false,\n\t\t\t\t}\n\t\t\t: emojiIdOrOptions;\n\n\tconst { id, animated: isAnimated, name: emojiName } = options;\n\n\treturn `<${isAnimated ? 'a' : ''}:${emojiName ?? 'emoji'}:${id}>`;\n}\n\n/**\n * The options for formatting an emoji.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied emoji name\n */\nexport interface FormatEmojiOptions<EmojiId extends Snowflake, EmojiName extends string> {\n\t/**\n\t * Whether the emoji is animated\n\t */\n\tanimated?: boolean;\n\t/**\n\t * The emoji id to format\n\t */\n\tid: EmojiId;\n\t/**\n\t * The name of the emoji\n\t */\n\tname?: EmojiName;\n}\n\n/**\n * Formats a channel link for a direct message channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @param channelId - The channel's id\n */\nexport function channelLink<ChannelId extends Snowflake>(\n\tchannelId: ChannelId,\n): `https://discord.com/channels/@me/${ChannelId}`;\n\n/**\n * Formats a channel link for a guild channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam GuildId - This is inferred by the supplied guild id\n * @param channelId - The channel's id\n * @param guildId - The guild's id\n */\nexport function channelLink<ChannelId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tguildId: GuildId,\n): `https://discord.com/channels/${GuildId}/${ChannelId}`;\n\nexport function channelLink<ChannelId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tguildId?: GuildId,\n): `https://discord.com/channels/@me/${ChannelId}` | `https://discord.com/channels/${GuildId}/${ChannelId}` {\n\treturn `https://discord.com/channels/${guildId ?? '@me'}/${channelId}`;\n}\n\n/**\n * Formats a message link for a direct message channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam MessageId - This is inferred by the supplied message id\n * @param channelId - The channel's id\n * @param messageId - The message's id\n */\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n): `https://discord.com/channels/@me/${ChannelId}/${MessageId}`;\n\n/**\n * Formats a message link for a guild channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam MessageId - This is inferred by the supplied message id\n * @typeParam GuildId - This is inferred by the supplied guild id\n * @param channelId - The channel's id\n * @param messageId - The message's id\n * @param guildId - The guild's id\n */\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n\tguildId: GuildId,\n): `https://discord.com/channels/${GuildId}/${ChannelId}/${MessageId}`;\n\nexport function messageLink<ChannelId extends Snowflake, MessageId extends Snowflake, GuildId extends Snowflake>(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n\tguildId?: GuildId,\n):\n\t| `https://discord.com/channels/@me/${ChannelId}/${MessageId}`\n\t| `https://discord.com/channels/${GuildId}/${ChannelId}/${MessageId}` {\n\treturn `${guildId === undefined ? channelLink(channelId) : channelLink(channelId, guildId)}/${messageId}`;\n}\n\n/**\n * The heading levels for expanded markdown.\n */\nexport enum HeadingLevel {\n\t/**\n\t * The first heading level.\n\t */\n\tOne = 1,\n\t/**\n\t * The second heading level.\n\t */\n\tTwo,\n\t/**\n\t * The third heading level.\n\t */\n\tThree,\n}\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level?: HeadingLevel.One): `# ${Content}`;\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level: HeadingLevel.Two): `## ${Content}`;\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading<Content extends string>(content: Content, level: HeadingLevel.Three): `### ${Content}`;\n\nexport function heading(content: string, level?: HeadingLevel) {\n\tswitch (level) {\n\t\tcase HeadingLevel.Three:\n\t\t\treturn `### ${content}`;\n\t\tcase HeadingLevel.Two:\n\t\t\treturn `## ${content}`;\n\t\tdefault:\n\t\t\treturn `# ${content}`;\n\t}\n}\n\n/**\n * A type that recursively traverses into arrays.\n */\nexport type RecursiveArray<ItemType> = readonly (ItemType | RecursiveArray<ItemType>)[];\n\n/**\n * Callback function for list formatters.\n *\n * @internal\n */\nfunction listCallback(element: RecursiveArray<string>, startNumber?: number, depth = 0): string {\n\tif (Array.isArray(element)) {\n\t\treturn element.map((element) => listCallback(element, startNumber, depth + 1)).join('\\n');\n\t}\n\n\treturn `${' '.repeat(depth - 1)}${startNumber ? `${startNumber}.` : '-'} ${element}`;\n}\n\n/**\n * Formats the elements in the array to an ordered list.\n *\n * @param list - The array of elements to list\n * @param startNumber - The starting number for the list\n */\nexport function orderedList(list: RecursiveArray<string>, startNumber = 1): string {\n\treturn listCallback(list, Math.max(startNumber, 1));\n}\n\n/**\n * Formats the elements in the array to an unordered list.\n *\n * @param list - The array of elements to list\n */\nexport function unorderedList(list: RecursiveArray<string>): string {\n\treturn listCallback(list);\n}\n\n/**\n * Formats the content into a subtext.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function subtext<Content extends string>(content: Content): `-# ${Content}` {\n\treturn `-# ${content}`;\n}\n\n/**\n * Formats a date into a short date-time string.\n *\n * @param date - The date to format. Defaults to the current time\n */\nexport function time(date?: Date): `<t:${bigint}>`;\n\n/**\n * Formats a date given a format style.\n *\n * @typeParam Style - This is inferred by the supplied {@link TimestampStylesString}\n * @param date - The date to format\n * @param style - The style to use\n */\nexport function time<Style extends TimestampStylesString>(date: Date, style: Style): `<t:${bigint}:${Style}>`;\n\n/**\n * Formats the given timestamp into a short date-time string.\n *\n * @typeParam Seconds - This is inferred by the supplied timestamp\n * @param seconds - A Unix timestamp in seconds\n */\nexport function time<Seconds extends number>(seconds: Seconds): `<t:${Seconds}>`;\n\n/**\n * Formats the given timestamp into a short date-time string.\n *\n * @typeParam Seconds - This is inferred by the supplied timestamp\n * @typeParam Style - This is inferred by the supplied {@link TimestampStylesString}\n * @param seconds - A Unix timestamp in seconds\n * @param style - The style to use\n */\nexport function time<Seconds extends number, Style extends TimestampStylesString>(\n\tseconds: Seconds,\n\tstyle: Style,\n): `<t:${Seconds}:${Style}>`;\n\nexport function time(timeOrSeconds?: Date | number, style?: TimestampStylesString): string {\n\tif (typeof timeOrSeconds !== 'number') {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\ttimeOrSeconds = Math.floor((timeOrSeconds?.getTime() ?? Date.now()) / 1_000);\n\t}\n\n\treturn typeof style === 'string' ? `<t:${timeOrSeconds}:${style}>` : `<t:${timeOrSeconds}>`;\n}\n\n/**\n * Formats an application directory link.\n *\n * @typeParam ApplicationId - This is inferred by the supplied application id\n * @param applicationId - The application id\n */\nexport function applicationDirectory<ApplicationId extends Snowflake>(\n\tapplicationId: ApplicationId,\n): `https://discord.com/application-directory/${ApplicationId}/store`;\n\n/**\n * Formats an application directory SKU link.\n *\n * @typeParam ApplicationId - This is inferred by the supplied application id\n * @typeParam SKUId - This is inferred by the supplied SKU id\n * @param applicationId - The application id\n * @param skuId - The SKU id\n */\nexport function applicationDirectory<ApplicationId extends Snowflake, SKUId extends Snowflake>(\n\tapplicationId: ApplicationId,\n\tskuId: SKUId,\n): `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`;\n\nexport function applicationDirectory<ApplicationId extends Snowflake, SKUId extends Snowflake>(\n\tapplicationId: ApplicationId,\n\tskuId?: SKUId,\n):\n\t| `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`\n\t| `https://discord.com/application-directory/${ApplicationId}/store` {\n\tconst url = `https://discord.com/application-directory/${applicationId}/store` as const;\n\treturn skuId ? `${url}/${skuId}` : url;\n}\n\n/**\n * Formats an email address into an email mention.\n *\n * @typeParam Email - This is inferred by the supplied email address\n * @param email - The email address to format\n */\nexport function email<Email extends string>(email: Email): `<${Email}>`;\n\n/**\n * Formats an email address and headers into an email mention.\n *\n * @typeParam Email - This is inferred by the supplied email address\n * @param email - The email address to format\n * @param headers - Optional headers to include in the email mention\n */\nexport function email<Email extends string>(\n\temail: Email,\n\theaders: Record<string, string | readonly string[]> | undefined,\n): `<${Email}?${string}>`;\n\n/**\n * Formats an email address into an email mention.\n *\n * @typeParam Email - This is inferred by the supplied email address\n * @param email - The email address to format\n * @param headers - Optional headers to include in the email mention\n */\nexport function email<Email extends string>(email: Email, headers?: Record<string, string | readonly string[]>) {\n\tif (headers) {\n\t\t// eslint-disable-next-line n/prefer-global/url-search-params\n\t\tconst searchParams = new URLSearchParams(\n\t\t\tObject.fromEntries(Object.entries(headers).map(([key, value]) => [key.toLowerCase(), value])),\n\t\t);\n\n\t\treturn `<${email}?${searchParams.toString()}>` as const;\n\t}\n\n\treturn `<${email}>` as const;\n}\n\n/**\n * Formats a phone number into a phone number mention.\n *\n * @typeParam PhoneNumber - This is inferred by the supplied phone number\n * @param phoneNumber - The phone number to format. Must start with a `+` sign.\n */\nexport function phoneNumber<PhoneNumber extends `+${string}`>(phoneNumber: PhoneNumber) {\n\tif (!phoneNumber.startsWith('+')) {\n\t\tthrow new Error('Phone number must start with a \"+\" sign.');\n\t}\n\n\treturn `<${phoneNumber}>` as const;\n}\n\n/**\n * The {@link https://discord.com/developers/docs/reference#message-formatting-timestamp-styles | message formatting timestamp styles}\n * supported by Discord.\n */\nexport const TimestampStyles = {\n\t/**\n\t * Short time format, consisting of hours and minutes.\n\t *\n\t * @example `16:20`\n\t */\n\tShortTime: 't',\n\n\t/**\n\t * Medium time format, consisting of hours, minutes, and seconds.\n\t *\n\t * @example `16:20:30`\n\t */\n\tMediumTime: 'T',\n\n\t/**\n\t * Long time format, consisting of hours, minutes, and seconds.\n\t *\n\t * @example `16:20:30`\n\t * @deprecated Use {@link TimestampStyles.MediumTime} instead.\n\t */\n\tLongTime: 'T',\n\n\t/**\n\t * Short date format, consisting of day, month, and year.\n\t *\n\t * @example `20/04/2021`\n\t */\n\tShortDate: 'd',\n\n\t/**\n\t * Long date format, consisting of day, month, and year.\n\t *\n\t * @example `April 20, 2021`\n\t */\n\tLongDate: 'D',\n\n\t/**\n\t * Long date-short time format, consisting of long date and short time.\n\t *\n\t * @example `April 20, 2021 at 16:20`\n\t */\n\tLongDateShortTime: 'f',\n\n\t/**\n\t * Short date-time format, consisting of short date and short time formats.\n\t *\n\t * @example `20 April 2021 16:20`\n\t * @deprecated Use {@link TimestampStyles.LongDateShortTime} instead.\n\t */\n\tShortDateTime: 'f',\n\n\t/**\n\t * Full date-short time format, consisting of full date and short time.\n\t *\n\t * @example `Tuesday, April 20, 2021 at 16:20`\n\t */\n\tFullDateShortTime: 'F',\n\n\t/**\n\t * Long date-time format, consisting of long date and short time formats.\n\t *\n\t * @example `Tuesday, 20 April 2021 16:20`\n\t * @deprecated Use {@link TimestampStyles.FullDateShortTime} instead.\n\t */\n\tLongDateTime: 'F',\n\n\t/**\n\t * Short date, short time format, consisting of short date and short time.\n\t *\n\t * @example `20/04/2021, 16:20`\n\t */\n\tShortDateShortTime: 's',\n\n\t/**\n\t * Short date, medium time format, consisting of short date and medium time.\n\t *\n\t * @example `20/04/2021, 16:20:30`\n\t */\n\tShortDateMediumTime: 'S',\n\n\t/**\n\t * Relative time format, consisting of a relative duration format.\n\t *\n\t * @example `2 months ago`\n\t */\n\tRelativeTime: 'R',\n} as const satisfies Record<string, string>;\n\n/**\n * The possible {@link TimestampStyles} values.\n */\nexport type TimestampStylesString = (typeof TimestampStyles)[keyof typeof TimestampStyles];\n\n/**\n * All the available faces from Discord's native slash commands.\n */\nexport enum Faces {\n\t/**\n\t * `¯\\_(ツ)_/¯`\n\t */\n\tShrug = '¯\\\\_(ツ)_/¯',\n\n\t/**\n\t * `(╯°□°)╯︵ ┻━┻`\n\t */\n\tTableflip = '(╯°□°)╯︵ ┻━┻',\n\n\t/**\n\t * `┬─┬ノ( º _ ºノ)`\n\t */\n\tUnflip = '┬─┬ノ( º _ ºノ)',\n}\n\n/**\n * All the available guild navigation mentions.\n */\nexport enum GuildNavigationMentions {\n\t/**\n\t * Browse Channels tab.\n\t */\n\tBrowse = '<id:browse>',\n\t/**\n\t * Customize tab with the server's {@link https://discord.com/developers/docs/resources/guild#guild-onboarding-object | onboarding prompts}.\n\t */\n\tCustomize = '<id:customize>',\n\t/**\n\t * {@link https://support.discord.com/hc/articles/13497665141655 | Server Guide} tab.\n\t */\n\tGuide = '<id:guide>',\n\t/**\n\t * {@link https://support.discord.com/hc/articles/10388356626711 | Linked Roles} tab.\n\t */\n\tLinkedRoles = '<id:linked-roles>',\n}\n","export * from './escapers.js';\nexport * from './formatters.js';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/formatters#readme | @discordjs/formatters} version\n * that you are currently using.\n *\n * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '0.6.2' as string;\n"],"mappings":"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","names":["codeBlock","inlineCode","bold","italic","underline","strikethrough","spoiler","heading","HeadingLevel","element","email","phoneNumber","Faces","GuildNavigationMentions"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@discordjs/formatters",
4
- "version": "0.6.1",
4
+ "version": "0.6.2",
5
5
  "description": "A set of functions to format strings for Discord.",
6
6
  "exports": {
7
7
  ".": {
@@ -44,7 +44,7 @@
44
44
  "homepage": "https://discord.js.org",
45
45
  "funding": "https://github.com/discordjs/discord.js?sponsor",
46
46
  "dependencies": {
47
- "discord-api-types": "^0.38.1"
47
+ "discord-api-types": "^0.38.33"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@favware/cliff-jumper": "^4.1.0",