@erinjs/core 1.0.0 → 1.2.4

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.
Files changed (394) hide show
  1. package/{core/LICENSE → LICENSE} +203 -203
  2. package/README.md +46 -0
  3. package/dist/index.d.mts +2084 -0
  4. package/dist/index.d.ts +2084 -0
  5. package/dist/index.js +3867 -0
  6. package/dist/index.mjs +3809 -0
  7. package/package.json +50 -15
  8. package/core/.changeset/README.md +0 -8
  9. package/core/.changeset/community-bootstrap-release.md +0 -17
  10. package/core/.changeset/config.json +0 -11
  11. package/core/.changeset/no-changelog.js +0 -16
  12. package/core/.changeset/pre.json +0 -17
  13. package/core/.editorconfig +0 -13
  14. package/core/.gitattributes +0 -2
  15. package/core/.github/CODE_OF_CONDUCT.md +0 -23
  16. package/core/.github/FUNDING.yml +0 -7
  17. package/core/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
  18. package/core/.github/ISSUE_TEMPLATE/feature_request.md +0 -23
  19. package/core/.github/PULL_REQUEST_TEMPLATE.md +0 -16
  20. package/core/.github/dependabot.yml +0 -16
  21. package/core/.github/workflows/autoapp.yml +0 -16
  22. package/core/.github/workflows/ci.yml +0 -187
  23. package/core/.github/workflows/codeql.yml +0 -30
  24. package/core/.github/workflows/deploy-docs.yml +0 -54
  25. package/core/.github/workflows/publish.yml +0 -43
  26. package/core/.lintstagedrc.json +0 -4
  27. package/core/.nvmrc +0 -1
  28. package/core/.prettierignore +0 -8
  29. package/core/.prettierrc +0 -11
  30. package/core/CONTRIBUTING.md +0 -70
  31. package/core/README.md +0 -61
  32. package/core/SECURITY.md +0 -21
  33. package/core/apps/docs/index.html +0 -28
  34. package/core/apps/docs/middleware.ts +0 -21
  35. package/core/apps/docs/package.json +0 -33
  36. package/core/apps/docs/public/@flux.png +0 -0
  37. package/core/apps/docs/public/docs/latest/guides.json +0 -1420
  38. package/core/apps/docs/public/docs/latest/main.json +0 -14981
  39. package/core/apps/docs/public/docs/latest/rag-index.json +0 -1
  40. package/core/apps/docs/public/docs/v1.0.5/guides.json +0 -226
  41. package/core/apps/docs/public/docs/v1.0.5/main.json +0 -7920
  42. package/core/apps/docs/public/docs/v1.0.6/guides.json +0 -226
  43. package/core/apps/docs/public/docs/v1.0.6/main.json +0 -7920
  44. package/core/apps/docs/public/docs/v1.0.7/guides.json +0 -259
  45. package/core/apps/docs/public/docs/v1.0.7/main.json +0 -8652
  46. package/core/apps/docs/public/docs/v1.0.8/guides.json +0 -313
  47. package/core/apps/docs/public/docs/v1.0.8/main.json +0 -9618
  48. package/core/apps/docs/public/docs/v1.0.9/guides.json +0 -319
  49. package/core/apps/docs/public/docs/v1.0.9/main.json +0 -10694
  50. package/core/apps/docs/public/docs/v1.1.0/guides.json +0 -589
  51. package/core/apps/docs/public/docs/v1.1.0/main.json +0 -12576
  52. package/core/apps/docs/public/docs/v1.1.2/guides.json +0 -650
  53. package/core/apps/docs/public/docs/v1.1.2/main.json +0 -13239
  54. package/core/apps/docs/public/docs/v1.1.3/guides.json +0 -650
  55. package/core/apps/docs/public/docs/v1.1.3/main.json +0 -13239
  56. package/core/apps/docs/public/docs/v1.1.4/guides.json +0 -708
  57. package/core/apps/docs/public/docs/v1.1.4/main.json +0 -13231
  58. package/core/apps/docs/public/docs/v1.1.5/guides.json +0 -1035
  59. package/core/apps/docs/public/docs/v1.1.5/main.json +0 -13838
  60. package/core/apps/docs/public/docs/v1.1.6/guides.json +0 -1041
  61. package/core/apps/docs/public/docs/v1.1.6/main.json +0 -14313
  62. package/core/apps/docs/public/docs/v1.1.8/guides.json +0 -1047
  63. package/core/apps/docs/public/docs/v1.1.8/main.json +0 -14421
  64. package/core/apps/docs/public/docs/v1.1.9/guides.json +0 -1047
  65. package/core/apps/docs/public/docs/v1.1.9/main.json +0 -14421
  66. package/core/apps/docs/public/docs/v1.2.0/guides.json +0 -1212
  67. package/core/apps/docs/public/docs/v1.2.0/main.json +0 -14663
  68. package/core/apps/docs/public/docs/v1.2.1/guides.json +0 -1293
  69. package/core/apps/docs/public/docs/v1.2.1/main.json +0 -14828
  70. package/core/apps/docs/public/docs/v1.2.2/guides.json +0 -1293
  71. package/core/apps/docs/public/docs/v1.2.2/main.json +0 -15025
  72. package/core/apps/docs/public/docs/v1.2.3/guides.json +0 -1420
  73. package/core/apps/docs/public/docs/v1.2.3/main.json +0 -14954
  74. package/core/apps/docs/public/docs/v1.2.4/guides.json +0 -1420
  75. package/core/apps/docs/public/docs/v1.2.4/main.json +0 -14981
  76. package/core/apps/docs/public/docs/versions.json +0 -24
  77. package/core/apps/docs/public/flux.png +0 -0
  78. package/core/apps/docs/public/locales/en.json +0 -50
  79. package/core/apps/docs/public/locales/guides-en.json +0 -512
  80. package/core/apps/docs/public/robots.txt +0 -4
  81. package/core/apps/docs/public/sitemap.xml +0 -33
  82. package/core/apps/docs/src/App.vue +0 -538
  83. package/core/apps/docs/src/components/ApiCategorySection.vue +0 -42
  84. package/core/apps/docs/src/components/ApiDiscordCompat.vue +0 -65
  85. package/core/apps/docs/src/components/ApiEndpointCard.vue +0 -313
  86. package/core/apps/docs/src/components/ApiSchemaBlock.vue +0 -131
  87. package/core/apps/docs/src/components/CodeBlock.vue +0 -177
  88. package/core/apps/docs/src/components/CommunityCallout.vue +0 -90
  89. package/core/apps/docs/src/components/ConstructorSection.vue +0 -82
  90. package/core/apps/docs/src/components/DocDescription.vue +0 -40
  91. package/core/apps/docs/src/components/FluxerLogo.vue +0 -3
  92. package/core/apps/docs/src/components/Footer.vue +0 -106
  93. package/core/apps/docs/src/components/GuideCodeBlock.vue +0 -102
  94. package/core/apps/docs/src/components/GuideDiscordCompat.vue +0 -77
  95. package/core/apps/docs/src/components/GuideDiscordCompatCallout.vue +0 -83
  96. package/core/apps/docs/src/components/GuideTable.vue +0 -77
  97. package/core/apps/docs/src/components/GuideTip.vue +0 -38
  98. package/core/apps/docs/src/components/MethodsSection.vue +0 -195
  99. package/core/apps/docs/src/components/ParamsTable.vue +0 -70
  100. package/core/apps/docs/src/components/PropertiesSection.vue +0 -143
  101. package/core/apps/docs/src/components/SearchBar.vue +0 -76
  102. package/core/apps/docs/src/components/SearchModal.vue +0 -361
  103. package/core/apps/docs/src/components/SidebarNav.vue +0 -225
  104. package/core/apps/docs/src/components/SponsorBanner.vue +0 -153
  105. package/core/apps/docs/src/components/TypeSignature.vue +0 -187
  106. package/core/apps/docs/src/components/VersionPicker.vue +0 -191
  107. package/core/apps/docs/src/composables/useSearchIndex.ts +0 -144
  108. package/core/apps/docs/src/composables/useVersionedPath.ts +0 -20
  109. package/core/apps/docs/src/data/apiEndpoints.ts +0 -1073
  110. package/core/apps/docs/src/data/changelog.ts +0 -717
  111. package/core/apps/docs/src/data/guides.ts +0 -2362
  112. package/core/apps/docs/src/env.d.ts +0 -7
  113. package/core/apps/docs/src/locales/guides-en.json +0 -512
  114. package/core/apps/docs/src/main.ts +0 -27
  115. package/core/apps/docs/src/pages/ApiReferenceLayout.vue +0 -175
  116. package/core/apps/docs/src/pages/ApiReferencePage.vue +0 -128
  117. package/core/apps/docs/src/pages/Changelog.vue +0 -288
  118. package/core/apps/docs/src/pages/ClassPage.vue +0 -319
  119. package/core/apps/docs/src/pages/ClassesList.vue +0 -100
  120. package/core/apps/docs/src/pages/DocsLayout.vue +0 -127
  121. package/core/apps/docs/src/pages/GuidePage.vue +0 -279
  122. package/core/apps/docs/src/pages/GuidesIndex.vue +0 -166
  123. package/core/apps/docs/src/pages/GuidesLayout.vue +0 -245
  124. package/core/apps/docs/src/pages/Home.vue +0 -125
  125. package/core/apps/docs/src/pages/NotFound.vue +0 -57
  126. package/core/apps/docs/src/pages/TypedefPage.vue +0 -230
  127. package/core/apps/docs/src/pages/TypedefsList.vue +0 -168
  128. package/core/apps/docs/src/pages/VersionLayout.vue +0 -15
  129. package/core/apps/docs/src/router.ts +0 -73
  130. package/core/apps/docs/src/stores/docs.ts +0 -54
  131. package/core/apps/docs/src/stores/guides.ts +0 -53
  132. package/core/apps/docs/src/stores/version.ts +0 -67
  133. package/core/apps/docs/src/styles/main.css +0 -278
  134. package/core/apps/docs/src/styles/prism.css +0 -95
  135. package/core/apps/docs/src/types/doc-schema.ts +0 -112
  136. package/core/apps/docs/tsconfig.json +0 -17
  137. package/core/apps/docs/tsconfig.node.json +0 -10
  138. package/core/apps/docs/vite.config.d.ts +0 -2
  139. package/core/apps/docs/vite.config.js +0 -26
  140. package/core/apps/docs/vite.config.ts +0 -28
  141. package/core/apps/docs-vitepress/.vitepress/config.ts +0 -141
  142. package/core/apps/docs-vitepress/api-data/latest/main.json +0 -15035
  143. package/core/apps/docs-vitepress/api-data/v1.2.4/main.json +0 -15035
  144. package/core/apps/docs-vitepress/api-data/versions.json +0 -6
  145. package/core/apps/docs-vitepress/index.md +0 -15
  146. package/core/apps/docs-vitepress/package-lock.json +0 -2924
  147. package/core/apps/docs-vitepress/package.json +0 -20
  148. package/core/apps/docs-vitepress/public/CNAME +0 -1
  149. package/core/apps/docs-vitepress/scripts/generate-api.ts +0 -243
  150. package/core/apps/docs-vitepress/scripts/migrate-guides.ts +0 -129
  151. package/core/apps/docs-vitepress/tsconfig.json +0 -11
  152. package/core/apps/docs-vitepress/v/latest/guides/attachments-by-url.md +0 -57
  153. package/core/apps/docs-vitepress/v/latest/guides/attachments.md +0 -62
  154. package/core/apps/docs-vitepress/v/latest/guides/basic-bot.md +0 -49
  155. package/core/apps/docs-vitepress/v/latest/guides/channels.md +0 -180
  156. package/core/apps/docs-vitepress/v/latest/guides/deprecated-apis.md +0 -58
  157. package/core/apps/docs-vitepress/v/latest/guides/discord-js-compatibility.md +0 -42
  158. package/core/apps/docs-vitepress/v/latest/guides/editing-embeds.md +0 -65
  159. package/core/apps/docs-vitepress/v/latest/guides/embed-media.md +0 -87
  160. package/core/apps/docs-vitepress/v/latest/guides/embeds.md +0 -166
  161. package/core/apps/docs-vitepress/v/latest/guides/emojis.md +0 -77
  162. package/core/apps/docs-vitepress/v/latest/guides/events.md +0 -202
  163. package/core/apps/docs-vitepress/v/latest/guides/gifs.md +0 -47
  164. package/core/apps/docs-vitepress/v/latest/guides/installation.md +0 -10
  165. package/core/apps/docs-vitepress/v/latest/guides/moderation.md +0 -89
  166. package/core/apps/docs-vitepress/v/latest/guides/permissions.md +0 -130
  167. package/core/apps/docs-vitepress/v/latest/guides/prefix-commands.md +0 -41
  168. package/core/apps/docs-vitepress/v/latest/guides/profile-urls.md +0 -58
  169. package/core/apps/docs-vitepress/v/latest/guides/reactions.md +0 -69
  170. package/core/apps/docs-vitepress/v/latest/guides/roles.md +0 -130
  171. package/core/apps/docs-vitepress/v/latest/guides/sending-without-reply.md +0 -172
  172. package/core/apps/docs-vitepress/v/latest/guides/voice.md +0 -109
  173. package/core/apps/docs-vitepress/v/latest/guides/wait-for-guilds.md +0 -37
  174. package/core/apps/docs-vitepress/v/latest/guides/webhook-attachments-embeds.md +0 -73
  175. package/core/apps/docs-vitepress/v/latest/guides/webhooks.md +0 -131
  176. package/core/eslint.config.js +0 -80
  177. package/core/examples/.env.example +0 -22
  178. package/core/examples/README.md +0 -68
  179. package/core/examples/first-steps-bot.js +0 -118
  180. package/core/examples/minimal-bot.js +0 -17
  181. package/core/examples/moderation-bot.js +0 -209
  182. package/core/examples/package.json +0 -14
  183. package/core/examples/ping-bot.js +0 -1146
  184. package/core/examples/reaction-bot.js +0 -70
  185. package/core/examples/reaction-roles-bot.js +0 -140
  186. package/core/examples/webhook-bot.js +0 -239
  187. package/core/flux.png +0 -0
  188. package/core/package.json +0 -78
  189. package/core/packages/builders/package.json +0 -51
  190. package/core/packages/builders/src/index.ts +0 -13
  191. package/core/packages/builders/src/messages/AttachmentBuilder.test.ts +0 -79
  192. package/core/packages/builders/src/messages/AttachmentBuilder.ts +0 -69
  193. package/core/packages/builders/src/messages/EmbedBuilder.test.ts +0 -266
  194. package/core/packages/builders/src/messages/EmbedBuilder.ts +0 -239
  195. package/core/packages/builders/src/messages/MessagePayload.test.ts +0 -118
  196. package/core/packages/builders/src/messages/MessagePayload.ts +0 -122
  197. package/core/packages/builders/tsconfig.json +0 -9
  198. package/core/packages/builders/tsup.config.ts +0 -9
  199. package/core/packages/builders/vitest.config.ts +0 -9
  200. package/core/packages/collection/package.json +0 -47
  201. package/core/packages/collection/src/Collection.test.ts +0 -232
  202. package/core/packages/collection/src/Collection.ts +0 -196
  203. package/core/packages/collection/src/index.ts +0 -1
  204. package/core/packages/collection/tsconfig.json +0 -9
  205. package/core/packages/collection/tsup.config.ts +0 -9
  206. package/core/packages/collection/vitest.config.ts +0 -9
  207. package/core/packages/docgen/package.json +0 -26
  208. package/core/packages/docgen/src/extract.ts +0 -262
  209. package/core/packages/docgen/src/formatType.ts +0 -24
  210. package/core/packages/docgen/src/index.ts +0 -103
  211. package/core/packages/docgen/src/schema.ts +0 -100
  212. package/core/packages/docgen/src/visitor.ts +0 -147
  213. package/core/packages/docgen/tsconfig.json +0 -9
  214. package/core/packages/docgen/tsup.config.ts +0 -9
  215. package/core/packages/fluxer-core/README.md +0 -26
  216. package/core/packages/fluxer-core/package.json +0 -60
  217. package/core/packages/fluxer-core/src/client/ChannelManager.ts +0 -143
  218. package/core/packages/fluxer-core/src/client/Client.gateway.test.ts +0 -84
  219. package/core/packages/fluxer-core/src/client/Client.resolveEmoji.test.ts +0 -45
  220. package/core/packages/fluxer-core/src/client/Client.ts +0 -558
  221. package/core/packages/fluxer-core/src/client/ClientUser.ts +0 -40
  222. package/core/packages/fluxer-core/src/client/EventHandlerRegistry.ts +0 -469
  223. package/core/packages/fluxer-core/src/client/GuildManager.ts +0 -79
  224. package/core/packages/fluxer-core/src/client/GuildMemberManager.ts +0 -91
  225. package/core/packages/fluxer-core/src/client/MessageManager.ts +0 -58
  226. package/core/packages/fluxer-core/src/client/UsersManager.ts +0 -122
  227. package/core/packages/fluxer-core/src/errors/ErrorCodes.test.ts +0 -19
  228. package/core/packages/fluxer-core/src/errors/ErrorCodes.ts +0 -12
  229. package/core/packages/fluxer-core/src/errors/FluxerError.test.ts +0 -32
  230. package/core/packages/fluxer-core/src/errors/FluxerError.ts +0 -15
  231. package/core/packages/fluxer-core/src/index.ts +0 -85
  232. package/core/packages/fluxer-core/src/structures/Base.ts +0 -7
  233. package/core/packages/fluxer-core/src/structures/Channel.ts +0 -508
  234. package/core/packages/fluxer-core/src/structures/Guild.test.ts +0 -189
  235. package/core/packages/fluxer-core/src/structures/Guild.ts +0 -734
  236. package/core/packages/fluxer-core/src/structures/GuildBan.ts +0 -35
  237. package/core/packages/fluxer-core/src/structures/GuildEmoji.ts +0 -57
  238. package/core/packages/fluxer-core/src/structures/GuildMember.test.ts +0 -203
  239. package/core/packages/fluxer-core/src/structures/GuildMember.ts +0 -213
  240. package/core/packages/fluxer-core/src/structures/GuildMemberRoleManager.ts +0 -121
  241. package/core/packages/fluxer-core/src/structures/GuildSticker.ts +0 -56
  242. package/core/packages/fluxer-core/src/structures/Invite.test.ts +0 -103
  243. package/core/packages/fluxer-core/src/structures/Invite.ts +0 -121
  244. package/core/packages/fluxer-core/src/structures/Message.test.ts +0 -109
  245. package/core/packages/fluxer-core/src/structures/Message.ts +0 -397
  246. package/core/packages/fluxer-core/src/structures/MessageReaction.ts +0 -72
  247. package/core/packages/fluxer-core/src/structures/PartialMessage.ts +0 -12
  248. package/core/packages/fluxer-core/src/structures/Role.test.ts +0 -77
  249. package/core/packages/fluxer-core/src/structures/Role.ts +0 -112
  250. package/core/packages/fluxer-core/src/structures/User.test.ts +0 -110
  251. package/core/packages/fluxer-core/src/structures/User.ts +0 -109
  252. package/core/packages/fluxer-core/src/structures/Webhook.test.ts +0 -109
  253. package/core/packages/fluxer-core/src/structures/Webhook.ts +0 -258
  254. package/core/packages/fluxer-core/src/util/Constants.test.ts +0 -16
  255. package/core/packages/fluxer-core/src/util/Constants.ts +0 -7
  256. package/core/packages/fluxer-core/src/util/Events.ts +0 -46
  257. package/core/packages/fluxer-core/src/util/MessageCollector.ts +0 -87
  258. package/core/packages/fluxer-core/src/util/Options.ts +0 -33
  259. package/core/packages/fluxer-core/src/util/ReactionCollector.ts +0 -116
  260. package/core/packages/fluxer-core/src/util/cdn.test.ts +0 -108
  261. package/core/packages/fluxer-core/src/util/cdn.ts +0 -130
  262. package/core/packages/fluxer-core/src/util/guildUtils.ts +0 -33
  263. package/core/packages/fluxer-core/src/util/messageUtils.test.ts +0 -74
  264. package/core/packages/fluxer-core/src/util/messageUtils.ts +0 -119
  265. package/core/packages/fluxer-core/src/util/permissions.test.ts +0 -95
  266. package/core/packages/fluxer-core/src/util/permissions.ts +0 -43
  267. package/core/packages/fluxer-core/tsconfig.json +0 -9
  268. package/core/packages/fluxer-core/tsup.config.ts +0 -9
  269. package/core/packages/fluxer-core/vitest.config.ts +0 -9
  270. package/core/packages/rest/package.json +0 -52
  271. package/core/packages/rest/src/REST.test.ts +0 -64
  272. package/core/packages/rest/src/REST.ts +0 -90
  273. package/core/packages/rest/src/RateLimitManager.test.ts +0 -71
  274. package/core/packages/rest/src/RateLimitManager.ts +0 -60
  275. package/core/packages/rest/src/RequestManager.test.ts +0 -87
  276. package/core/packages/rest/src/RequestManager.ts +0 -172
  277. package/core/packages/rest/src/errors/FluxerAPIError.test.ts +0 -57
  278. package/core/packages/rest/src/errors/FluxerAPIError.ts +0 -21
  279. package/core/packages/rest/src/errors/HTTPError.test.ts +0 -55
  280. package/core/packages/rest/src/errors/HTTPError.ts +0 -25
  281. package/core/packages/rest/src/errors/RateLimitError.test.ts +0 -41
  282. package/core/packages/rest/src/errors/RateLimitError.ts +0 -15
  283. package/core/packages/rest/src/errors/index.ts +0 -3
  284. package/core/packages/rest/src/index.ts +0 -6
  285. package/core/packages/rest/src/utils/constants.test.ts +0 -31
  286. package/core/packages/rest/src/utils/constants.ts +0 -5
  287. package/core/packages/rest/src/utils/files.test.ts +0 -37
  288. package/core/packages/rest/src/utils/files.ts +0 -75
  289. package/core/packages/rest/tsconfig.json +0 -9
  290. package/core/packages/rest/tsup.config.ts +0 -9
  291. package/core/packages/rest/vitest.config.ts +0 -9
  292. package/core/packages/types/package.json +0 -46
  293. package/core/packages/types/src/api/ban.ts +0 -8
  294. package/core/packages/types/src/api/channel.ts +0 -65
  295. package/core/packages/types/src/api/embed.ts +0 -82
  296. package/core/packages/types/src/api/emoji.ts +0 -12
  297. package/core/packages/types/src/api/errors.ts +0 -68
  298. package/core/packages/types/src/api/gateway.ts +0 -14
  299. package/core/packages/types/src/api/guild.ts +0 -123
  300. package/core/packages/types/src/api/index.ts +0 -15
  301. package/core/packages/types/src/api/instance.ts +0 -32
  302. package/core/packages/types/src/api/interaction.ts +0 -26
  303. package/core/packages/types/src/api/invite.ts +0 -28
  304. package/core/packages/types/src/api/message.ts +0 -140
  305. package/core/packages/types/src/api/role.ts +0 -41
  306. package/core/packages/types/src/api/sticker.ts +0 -14
  307. package/core/packages/types/src/api/user.ts +0 -79
  308. package/core/packages/types/src/api/webhook.ts +0 -41
  309. package/core/packages/types/src/common/index.ts +0 -1
  310. package/core/packages/types/src/common/snowflake.test.ts +0 -9
  311. package/core/packages/types/src/common/snowflake.ts +0 -8
  312. package/core/packages/types/src/gateway/events.ts +0 -189
  313. package/core/packages/types/src/gateway/index.ts +0 -3
  314. package/core/packages/types/src/gateway/opcodes.ts +0 -17
  315. package/core/packages/types/src/gateway/payloads.ts +0 -481
  316. package/core/packages/types/src/index.ts +0 -4
  317. package/core/packages/types/src/rest/index.ts +0 -1
  318. package/core/packages/types/src/rest/routes.test.ts +0 -169
  319. package/core/packages/types/src/rest/routes.ts +0 -109
  320. package/core/packages/types/tsconfig.json +0 -9
  321. package/core/packages/types/tsup.config.ts +0 -9
  322. package/core/packages/types/vitest.config.ts +0 -9
  323. package/core/packages/util/package.json +0 -51
  324. package/core/packages/util/src/BitField.test.ts +0 -96
  325. package/core/packages/util/src/BitField.ts +0 -105
  326. package/core/packages/util/src/MessageFlagsBitField.test.ts +0 -42
  327. package/core/packages/util/src/MessageFlagsBitField.ts +0 -20
  328. package/core/packages/util/src/PermissionsBitField.test.ts +0 -79
  329. package/core/packages/util/src/PermissionsBitField.ts +0 -97
  330. package/core/packages/util/src/SnowflakeUtil.test.ts +0 -69
  331. package/core/packages/util/src/SnowflakeUtil.ts +0 -65
  332. package/core/packages/util/src/UserFlagsBitField.test.ts +0 -39
  333. package/core/packages/util/src/UserFlagsBitField.ts +0 -48
  334. package/core/packages/util/src/deprecation.test.ts +0 -44
  335. package/core/packages/util/src/deprecation.ts +0 -28
  336. package/core/packages/util/src/emojiShortcodes.generated.ts +0 -5
  337. package/core/packages/util/src/emojiShortcodes.test.ts +0 -41
  338. package/core/packages/util/src/emojiShortcodes.ts +0 -22
  339. package/core/packages/util/src/formatters.test.ts +0 -65
  340. package/core/packages/util/src/formatters.ts +0 -35
  341. package/core/packages/util/src/index.ts +0 -34
  342. package/core/packages/util/src/resolvers.test.ts +0 -198
  343. package/core/packages/util/src/resolvers.ts +0 -127
  344. package/core/packages/util/src/tenorUtils.test.ts +0 -75
  345. package/core/packages/util/src/tenorUtils.ts +0 -86
  346. package/core/packages/util/tsconfig.json +0 -9
  347. package/core/packages/util/tsup.config.ts +0 -9
  348. package/core/packages/util/vitest.config.ts +0 -9
  349. package/core/packages/voice/README.md +0 -42
  350. package/core/packages/voice/package.json +0 -67
  351. package/core/packages/voice/src/LiveKitRtcConnection.receive.test.ts +0 -24
  352. package/core/packages/voice/src/LiveKitRtcConnection.ts +0 -1767
  353. package/core/packages/voice/src/VoiceConnection.ts +0 -413
  354. package/core/packages/voice/src/VoiceManager.receive.test.ts +0 -61
  355. package/core/packages/voice/src/VoiceManager.test.ts +0 -44
  356. package/core/packages/voice/src/VoiceManager.ts +0 -503
  357. package/core/packages/voice/src/exports.test.ts +0 -38
  358. package/core/packages/voice/src/index.ts +0 -51
  359. package/core/packages/voice/src/livekit.test.ts +0 -48
  360. package/core/packages/voice/src/livekit.ts +0 -33
  361. package/core/packages/voice/src/mp4box.d.ts +0 -32
  362. package/core/packages/voice/src/opusUtils.test.ts +0 -29
  363. package/core/packages/voice/src/opusUtils.ts +0 -86
  364. package/core/packages/voice/src/streamPreviewPlaceholder.test.ts +0 -16
  365. package/core/packages/voice/src/streamPreviewPlaceholder.ts +0 -8
  366. package/core/packages/voice/src/ws.d.ts +0 -1
  367. package/core/packages/voice/tsconfig.json +0 -5
  368. package/core/packages/voice/tsup.config.ts +0 -10
  369. package/core/packages/voice/vitest.config.ts +0 -9
  370. package/core/packages/ws/package.json +0 -52
  371. package/core/packages/ws/src/WebSocketManager.ts +0 -130
  372. package/core/packages/ws/src/WebSocketShard.ts +0 -296
  373. package/core/packages/ws/src/index.ts +0 -12
  374. package/core/packages/ws/src/utils/constants.test.ts +0 -46
  375. package/core/packages/ws/src/utils/constants.ts +0 -22
  376. package/core/packages/ws/src/utils/getWebSocket.ts +0 -55
  377. package/core/packages/ws/src/ws.d.ts +0 -10
  378. package/core/packages/ws/tsconfig.json +0 -9
  379. package/core/packages/ws/tsup.config.ts +0 -9
  380. package/core/pnpm-lock.yaml +0 -7033
  381. package/core/pnpm-workspace.yaml +0 -4
  382. package/core/scripts/generate-ai-rag.ts +0 -240
  383. package/core/scripts/generate-docs.ts +0 -143
  384. package/core/scripts/generate-emoji-shortcodes.ts +0 -58
  385. package/core/scripts/generate-types.ts +0 -6
  386. package/core/scripts/publish-ordered.js +0 -63
  387. package/core/scripts/test-cjs-require.mjs +0 -43
  388. package/core/scripts/test-esm-imports.mjs +0 -42
  389. package/core/scripts/test-package-exports.mjs +0 -98
  390. package/core/scripts/test-smoke.mjs +0 -103
  391. package/core/tsconfig.json +0 -18
  392. package/core/turbo.json +0 -30
  393. package/core/vitest.config.ts +0 -17
  394. package/core/wrangler.jsonc +0 -9
@@ -1,87 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import { Collection } from '@erinjs/collection';
3
- import { Client } from '../client/Client.js';
4
- import { Message } from '../structures/Message.js';
5
- import { Events } from './Events.js';
6
-
7
- export interface MessageCollectorOptions {
8
- /** Filter function. Return true to collect the message. */
9
- filter?: (message: Message) => boolean;
10
- /** Max duration in ms. Collector stops when time expires. */
11
- time?: number;
12
- /** Max messages to collect. Collector stops when limit reached. */
13
- max?: number;
14
- }
15
-
16
- export type MessageCollectorEndReason = 'time' | 'limit' | 'user';
17
-
18
- export interface MessageCollectorEvents {
19
- collect: [message: Message];
20
- end: [collected: Collection<string, Message>, reason: MessageCollectorEndReason];
21
- }
22
-
23
- /**
24
- * Collects messages in a channel. Use channel.createMessageCollector().
25
- * @example
26
- * const collector = channel.createMessageCollector({ filter: m => m.author.id === userId, time: 10000 });
27
- * collector.on('collect', m => console.log(m.content));
28
- * collector.on('end', (collected, reason) => console.log(`Stopped: ${reason}`));
29
- */
30
- export class MessageCollector extends EventEmitter {
31
- readonly client: Client;
32
- readonly channelId: string;
33
- readonly options: Required<MessageCollectorOptions>;
34
- readonly collected = new Collection<string, Message>();
35
- private _timeout: ReturnType<typeof setTimeout> | null = null;
36
- private _ended = false;
37
- private _listener: (message: Message) => void;
38
-
39
- constructor(client: Client, channelId: string, options: MessageCollectorOptions = {}) {
40
- super();
41
- this.client = client;
42
- this.channelId = channelId;
43
- this.options = {
44
- filter: options.filter ?? (() => true),
45
- time: options.time ?? 0,
46
- max: options.max ?? 0,
47
- };
48
- this._listener = (message: Message) => {
49
- if (this._ended || message.channelId !== this.channelId) return;
50
- if (!this.options.filter(message)) return;
51
- this.collected.set(message.id, message);
52
- this.emit('collect', message);
53
- if (this.options.max > 0 && this.collected.size >= this.options.max) {
54
- this.stop('limit');
55
- }
56
- };
57
- this.client.on(Events.MessageCreate, this._listener);
58
- if (this.options.time > 0) {
59
- this._timeout = setTimeout(() => this.stop('time'), this.options.time);
60
- }
61
- }
62
-
63
- stop(reason: MessageCollectorEndReason = 'user'): void {
64
- if (this._ended) return;
65
- this._ended = true;
66
- this.client.off(Events.MessageCreate, this._listener);
67
- if (this._timeout) {
68
- clearTimeout(this._timeout);
69
- this._timeout = null;
70
- }
71
- this.emit('end', this.collected, reason);
72
- }
73
-
74
- override on<K extends keyof MessageCollectorEvents>(
75
- event: K,
76
- listener: (...args: MessageCollectorEvents[K]) => void,
77
- ): this {
78
- return super.on(event, listener as (...args: unknown[]) => void) as this;
79
- }
80
-
81
- override emit<K extends keyof MessageCollectorEvents>(
82
- event: K,
83
- ...args: MessageCollectorEvents[K]
84
- ): boolean {
85
- return super.emit(event, ...args);
86
- }
87
- }
@@ -1,33 +0,0 @@
1
- import { REST } from '@erinjs/rest';
2
- import { GatewayPresenceUpdateData } from '@erinjs/types';
3
-
4
- /** Optional cache size limits. When exceeded, oldest entries are evicted (FIFO). Omit or use 0 for unbounded. */
5
- export interface CacheSizeLimits {
6
- channels?: number;
7
- guilds?: number;
8
- users?: number;
9
- /** Max messages per channel to cache. Enables channel.messages.get() and oldMessage in messageUpdate. 0 = disabled. */
10
- messages?: number;
11
- }
12
-
13
- export interface ClientOptions {
14
- rest?: Partial<ConstructorParameters<typeof REST>[0]>;
15
- /** Gateway intents. Not yet supported by Fluxer—value is always sent as 0. Set suppressIntentWarning to silence the warning. */
16
- intents?: number;
17
- /** Suppress the warning when intents are set (Fluxer does not support intents yet). */
18
- suppressIntentWarning?: boolean;
19
- /** When true, delay the Ready event until all guilds from READY (including unavailable) have been received via GUILD_CREATE. Default: false. */
20
- waitForGuilds?: boolean;
21
- /** Cache size limits (channels, guilds, users). When exceeded, oldest entries are evicted. Omit or 0 = unbounded. */
22
- cache?: CacheSizeLimits;
23
- /** Initial presence (status, custom_status, etc.) sent on identify. Can also update via PresenceUpdate after connect. */
24
- presence?: GatewayPresenceUpdateData;
25
- /** Optional WebSocket constructor (e.g. `require('ws')` in Node for compatibility) */
26
- WebSocket?: new (url: string) => {
27
- send(data: string | ArrayBufferLike): void;
28
- close(code?: number): void;
29
- readyState: number;
30
- addEventListener?(type: string, listener: (e: unknown) => void): void;
31
- on?(event: string, cb: (data?: unknown) => void): void;
32
- };
33
- }
@@ -1,116 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import { Collection } from '@erinjs/collection';
3
- import { Client } from '../client/Client.js';
4
- import { MessageReaction } from '../structures/MessageReaction.js';
5
- import { User } from '../structures/User.js';
6
- import { GatewayReactionEmoji } from '@erinjs/types';
7
- import { Events } from './Events.js';
8
-
9
- export interface ReactionCollectorOptions {
10
- /** Filter function. Return true to collect the reaction. */
11
- filter?: (reaction: MessageReaction, user: User) => boolean;
12
- /** Max duration in ms. Collector stops when time expires. */
13
- time?: number;
14
- /** Max reactions to collect. Collector stops when limit reached. */
15
- max?: number;
16
- }
17
-
18
- export type ReactionCollectorEndReason = 'time' | 'limit' | 'user';
19
-
20
- export interface CollectedReaction {
21
- reaction: MessageReaction;
22
- user: User;
23
- }
24
-
25
- export interface ReactionCollectorEvents {
26
- collect: [reaction: MessageReaction, user: User];
27
- end: [collected: Collection<string, CollectedReaction>, reason: ReactionCollectorEndReason];
28
- }
29
-
30
- /**
31
- * Collects reactions on a message. Use message.createReactionCollector().
32
- * @example
33
- * const collector = message.createReactionCollector({ filter: (r, u) => u.id === userId, time: 10000 });
34
- * collector.on('collect', (reaction, user) => console.log(user.username, 'reacted', reaction.emoji.name));
35
- * collector.on('end', (collected, reason) => console.log(`Stopped: ${reason}`));
36
- */
37
- export class ReactionCollector extends EventEmitter {
38
- readonly client: Client;
39
- readonly messageId: string;
40
- readonly channelId: string;
41
- readonly options: Required<ReactionCollectorOptions>;
42
- readonly collected = new Collection<string, CollectedReaction>();
43
- private _timeout: ReturnType<typeof setTimeout> | null = null;
44
- private _ended = false;
45
- private _listener: (
46
- reaction: MessageReaction,
47
- user: User,
48
- _msgId: string,
49
- channelId: string,
50
- _emoji: GatewayReactionEmoji,
51
- userId: string,
52
- ) => void;
53
-
54
- constructor(
55
- client: Client,
56
- messageId: string,
57
- channelId: string,
58
- options: ReactionCollectorOptions = {},
59
- ) {
60
- super();
61
- this.client = client;
62
- this.messageId = messageId;
63
- this.channelId = channelId;
64
- this.options = {
65
- filter: options.filter ?? (() => true),
66
- time: options.time ?? 0,
67
- max: options.max ?? 0,
68
- };
69
- this._listener = (
70
- reaction: MessageReaction,
71
- user: User,
72
- _msgId: string,
73
- chId: string,
74
- _emoji: GatewayReactionEmoji,
75
- userId: string,
76
- ) => {
77
- if (this._ended || reaction.messageId !== this.messageId || chId !== this.channelId) return;
78
- if (!this.options.filter(reaction, user)) return;
79
- const key = `${userId}:${reaction.emoji.id ?? reaction.emoji.name}`;
80
- this.collected.set(key, { reaction, user });
81
- this.emit('collect', reaction, user);
82
- if (this.options.max > 0 && this.collected.size >= this.options.max) {
83
- this.stop('limit');
84
- }
85
- };
86
- this.client.on(Events.MessageReactionAdd, this._listener);
87
- if (this.options.time > 0) {
88
- this._timeout = setTimeout(() => this.stop('time'), this.options.time);
89
- }
90
- }
91
-
92
- stop(reason: ReactionCollectorEndReason = 'user'): void {
93
- if (this._ended) return;
94
- this._ended = true;
95
- this.client.off(Events.MessageReactionAdd, this._listener);
96
- if (this._timeout) {
97
- clearTimeout(this._timeout);
98
- this._timeout = null;
99
- }
100
- this.emit('end', this.collected, reason);
101
- }
102
-
103
- override on<K extends keyof ReactionCollectorEvents>(
104
- event: K,
105
- listener: (...args: ReactionCollectorEvents[K]) => void,
106
- ): this {
107
- return super.on(event, listener as (...args: unknown[]) => void) as this;
108
- }
109
-
110
- override emit<K extends keyof ReactionCollectorEvents>(
111
- event: K,
112
- ...args: ReactionCollectorEvents[K]
113
- ): boolean {
114
- return super.emit(event, ...args);
115
- }
116
- }
@@ -1,108 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import {
3
- cdnAvatarURL,
4
- cdnDisplayAvatarURL,
5
- cdnBannerURL,
6
- cdnMemberAvatarURL,
7
- cdnMemberBannerURL,
8
- cdnDefaultAvatarURL,
9
- } from './cdn.js';
10
-
11
- describe('cdnAvatarURL', () => {
12
- it('returns null for null hash', () => {
13
- expect(cdnAvatarURL('123', null)).toBeNull();
14
- });
15
-
16
- it('builds avatar URL with default extension', () => {
17
- const url = cdnAvatarURL('123456789012345678', 'abc123hash');
18
- expect(url).toContain('fluxerusercontent.com/avatars/123456789012345678/abc123hash.png');
19
- });
20
-
21
- it('uses gif for a_ prefix (animated)', () => {
22
- const url = cdnAvatarURL('123', 'a_animatedhash');
23
- expect(url).toContain('.gif');
24
- });
25
-
26
- it('appends size when provided', () => {
27
- const url = cdnAvatarURL('123', 'hash', { size: 256 });
28
- expect(url).toContain('?size=256');
29
- });
30
-
31
- it('uses custom extension', () => {
32
- const url = cdnAvatarURL('123', 'hash', { extension: 'webp' });
33
- expect(url).toContain('.webp');
34
- });
35
- });
36
-
37
- describe('cdnDisplayAvatarURL', () => {
38
- it('returns default avatar when hash is null', () => {
39
- const url = cdnDisplayAvatarURL('123', null);
40
- expect(url).toContain('fluxerstatic.com/avatars/');
41
- expect(url).toContain('.png');
42
- });
43
-
44
- it('returns custom avatar when hash present', () => {
45
- const url = cdnDisplayAvatarURL('123', 'abc');
46
- expect(url).toContain('fluxerusercontent.com/avatars/');
47
- });
48
- });
49
-
50
- describe('cdnBannerURL', () => {
51
- it('returns null for null hash', () => {
52
- expect(cdnBannerURL('123', null)).toBeNull();
53
- });
54
-
55
- it('builds banner URL', () => {
56
- const url = cdnBannerURL('123456789012345678', 'bannerhash');
57
- expect(url).toContain('fluxerusercontent.com/banners/123456789012345678/bannerhash.png');
58
- });
59
-
60
- it('uses gif for a_ prefix', () => {
61
- const url = cdnBannerURL('123', 'a_banner');
62
- expect(url).toContain('.gif');
63
- });
64
- });
65
-
66
- describe('cdnMemberAvatarURL', () => {
67
- it('returns null for null hash', () => {
68
- expect(cdnMemberAvatarURL('g1', 'u1', null)).toBeNull();
69
- });
70
-
71
- it('builds member avatar URL', () => {
72
- const url = cdnMemberAvatarURL('guild123', 'user456', 'memberhash');
73
- expect(url).toContain(
74
- 'fluxerusercontent.com/guilds/guild123/users/user456/avatars/memberhash.png',
75
- );
76
- });
77
- });
78
-
79
- describe('cdnMemberBannerURL', () => {
80
- it('returns null for null hash', () => {
81
- expect(cdnMemberBannerURL('g1', 'u1', null)).toBeNull();
82
- });
83
-
84
- it('builds member banner URL', () => {
85
- const url = cdnMemberBannerURL('guild123', 'user456', 'bannerhash');
86
- expect(url).toContain(
87
- 'fluxerusercontent.com/guilds/guild123/users/user456/banners/bannerhash.png',
88
- );
89
- });
90
- });
91
-
92
- describe('cdnDefaultAvatarURL', () => {
93
- it('returns URL with index 0-5 from user ID', () => {
94
- const url = cdnDefaultAvatarURL('0');
95
- expect(url).toContain('fluxerstatic.com/avatars/');
96
- expect(url).toContain('.png');
97
- });
98
-
99
- it('accepts numeric index', () => {
100
- const url = cdnDefaultAvatarURL(3);
101
- expect(url).toContain('/avatars/3.png');
102
- });
103
-
104
- it('handles negative index by taking abs and mod', () => {
105
- const url = cdnDefaultAvatarURL(-1);
106
- expect(url).toContain('/avatars/1.png');
107
- });
108
- });
@@ -1,130 +0,0 @@
1
- import { CDN_URL, STATIC_CDN_URL } from './Constants.js';
2
-
3
- export interface CdnUrlOptions {
4
- size?: number;
5
- extension?: string;
6
- }
7
-
8
- function getExtension(hash: string | null, options?: CdnUrlOptions): string {
9
- const ext = options?.extension ?? 'png';
10
- // Animated avatars/banners have hash starting with a_
11
- if (hash?.startsWith('a_')) return 'gif';
12
- return ext;
13
- }
14
-
15
- function appendSize(options?: CdnUrlOptions): string {
16
- return options?.size ? `?size=${options.size}` : '';
17
- }
18
-
19
- /**
20
- * Build a user avatar URL from raw API data.
21
- * @param userId - The user's snowflake ID
22
- * @param avatarHash - The avatar hash from the API, or null if no custom avatar
23
- * @param options - Optional size and extension (default: png; auto-detects gif for a_ hashes)
24
- * @returns The avatar URL, or null if no avatar hash
25
- * @example
26
- * const url = cdnAvatarURL(userData.id, userData.avatar, { size: 256 });
27
- */
28
- export function cdnAvatarURL(
29
- userId: string,
30
- avatarHash: string | null,
31
- options?: CdnUrlOptions,
32
- ): string | null {
33
- if (!avatarHash) return null;
34
- const ext = getExtension(avatarHash, options);
35
- const size = appendSize(options);
36
- return `${CDN_URL}/avatars/${userId}/${avatarHash}.${ext}${size}`;
37
- }
38
-
39
- /**
40
- * Build an avatar URL, or the default avatar when none set.
41
- * @param userId - The user's snowflake ID
42
- * @param avatarHash - The avatar hash from the API, or null
43
- * @param options - Optional size and extension
44
- * @returns The avatar URL (never null)
45
- * @example
46
- * const url = cdnDisplayAvatarURL(user.id, user.avatar, { size: 64 });
47
- */
48
- export function cdnDisplayAvatarURL(
49
- userId: string,
50
- avatarHash: string | null,
51
- options?: CdnUrlOptions,
52
- ): string {
53
- return cdnAvatarURL(userId, avatarHash, options) ?? cdnDefaultAvatarURL(userId);
54
- }
55
-
56
- /**
57
- * Build a user or guild banner URL from raw API data.
58
- * @param resourceId - The user ID or guild ID
59
- * @param bannerHash - The banner hash from the API, or null
60
- * @param options - Optional size and extension (default: png; auto-detects gif for a_ hashes)
61
- * @returns The banner URL, or null if no banner
62
- * @example
63
- * const url = cdnBannerURL(userData.id, profile.banner, { size: 512 });
64
- */
65
- export function cdnBannerURL(
66
- resourceId: string,
67
- bannerHash: string | null,
68
- options?: CdnUrlOptions,
69
- ): string | null {
70
- if (!bannerHash) return null;
71
- const ext = getExtension(bannerHash, options);
72
- const size = appendSize(options);
73
- return `${CDN_URL}/banners/${resourceId}/${bannerHash}.${ext}${size}`;
74
- }
75
-
76
- /**
77
- * Build a guild member avatar URL (guild-specific avatar).
78
- * @param guildId - The guild ID
79
- * @param userId - The user ID
80
- * @param avatarHash - The member avatar hash, or null
81
- * @param options - Optional size and extension
82
- * @returns The member avatar URL, or null if no guild avatar
83
- * @example
84
- * const url = cdnMemberAvatarURL(member.guild.id, member.id, member.avatar);
85
- */
86
- export function cdnMemberAvatarURL(
87
- guildId: string,
88
- userId: string,
89
- avatarHash: string | null,
90
- options?: CdnUrlOptions,
91
- ): string | null {
92
- if (!avatarHash) return null;
93
- const ext = getExtension(avatarHash, options);
94
- const size = appendSize(options);
95
- return `${CDN_URL}/guilds/${guildId}/users/${userId}/avatars/${avatarHash}.${ext}${size}`;
96
- }
97
-
98
- /**
99
- * Build a guild member banner URL (guild-specific banner).
100
- * @param guildId - The guild ID
101
- * @param userId - The user ID
102
- * @param bannerHash - The member banner hash, or null
103
- * @param options - Optional size and extension
104
- * @returns The member banner URL, or null if no guild banner
105
- */
106
- export function cdnMemberBannerURL(
107
- guildId: string,
108
- userId: string,
109
- bannerHash: string | null,
110
- options?: CdnUrlOptions,
111
- ): string | null {
112
- if (!bannerHash) return null;
113
- const ext = getExtension(bannerHash, options);
114
- const size = appendSize(options);
115
- return `${CDN_URL}/guilds/${guildId}/users/${userId}/banners/${bannerHash}.${ext}${size}`;
116
- }
117
-
118
- /**
119
- * Get the default avatar URL (used when user has no custom avatar).
120
- * Fluxer uses fluxerstatic.com with index = userId % 6 (six default avatar variants).
121
- * @param userIdOrIndex - User ID (snowflake string) to derive index, or explicit index 0-5
122
- * @returns The default avatar URL
123
- */
124
- export function cdnDefaultAvatarURL(userIdOrIndex: string | number): string {
125
- const index =
126
- typeof userIdOrIndex === 'string'
127
- ? Number(BigInt(userIdOrIndex) % 6n)
128
- : Math.abs(Math.floor(userIdOrIndex) % 6);
129
- return `${STATIC_CDN_URL}/avatars/${index}.png`;
130
- }
@@ -1,33 +0,0 @@
1
- import { APIGuild, APIRole } from '@erinjs/types';
2
-
3
- /** Guild payload shape from Fluxer gateway (GUILD_CREATE, GUILD_UPDATE, READY). */
4
- type GatewayGuildPayload =
5
- | APIGuild
6
- | {
7
- id: string;
8
- properties?: Record<string, unknown>;
9
- roles?: APIRole[] | unknown;
10
- [key: string]: unknown;
11
- };
12
-
13
- /**
14
- * Normalize gateway guild payload to APIGuild shape.
15
- * Fluxer gateway may send { id, properties: { owner_id, ... }, roles } instead of flat APIGuild.
16
- * @param raw - Raw guild data from gateway (accepts unknown for gateway payloads)
17
- * @returns Normalized APIGuild with roles, or null if raw is null/undefined
18
- */
19
- export function normalizeGuildPayload(
20
- raw: GatewayGuildPayload | null | undefined | unknown,
21
- ): (APIGuild & { roles?: APIRole[] }) | null {
22
- if (!raw || typeof raw !== 'object') {
23
- return null;
24
- }
25
- if ('properties' in raw && raw.properties != null && typeof raw.properties === 'object') {
26
- const r = raw as { properties: Record<string, unknown>; roles?: APIRole[] | unknown };
27
- return {
28
- ...r.properties,
29
- roles: r.roles as APIRole[] | undefined,
30
- } as APIGuild & { roles?: APIRole[] };
31
- }
32
- return raw as APIGuild & { roles?: APIRole[] };
33
- }
@@ -1,74 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { Message } from '../';
3
- import { EmbedBuilder } from '@erinjs/builders';
4
-
5
- describe('Message._createMessageBody', () => {
6
- it('converts string to content-only body', async () => {
7
- const result = await Message._createMessageBody('Hello world');
8
- expect(result.body).toEqual({ content: 'Hello world' });
9
- });
10
-
11
- it('passes through content from options', async () => {
12
- const result = await Message._createMessageBody({ content: 'Test' });
13
- expect(result.body.content).toBe('Test');
14
- });
15
-
16
- it('serializes EmbedBuilder to APIEmbed', async () => {
17
- const embed = new EmbedBuilder().setTitle('Test').setDescription('Desc');
18
- const result = await Message._createMessageBody({ embeds: [embed] });
19
- expect(result.body.embeds).toHaveLength(1);
20
- expect(result.body.embeds![0]).toEqual(embed.toJSON());
21
- });
22
-
23
- it('passes through raw APIEmbed', async () => {
24
- const raw = { title: 'Raw', type: 'rich' as const };
25
- const result = await Message._createMessageBody({ embeds: [raw] });
26
- expect(result.body.embeds).toHaveLength(1);
27
- expect(result.body.embeds![0]).toBe(raw);
28
- });
29
-
30
- it('builds attachments from files when no attachments metadata', async () => {
31
- const result = await Message._createMessageBody({
32
- files: [
33
- { name: 'a.txt', data: new Uint8Array() },
34
- { name: 'b.png', data: new Uint8Array(), filename: 'custom.png' },
35
- ],
36
- });
37
- expect(result.body.attachments).toEqual([
38
- { id: 0, filename: 'a.txt' },
39
- { id: 1, filename: 'custom.png' },
40
- ]);
41
- });
42
-
43
- it('uses attachments metadata when provided with files', async () => {
44
- const result = await Message._createMessageBody({
45
- files: [{ name: 'a.txt', data: new Uint8Array() }],
46
- attachments: [{ id: 0, filename: 'a.txt', title: 'My File', description: 'A file' }],
47
- });
48
- expect(result.body.attachments).toEqual([
49
- { id: 0, filename: 'a.txt', title: 'My File', description: 'A file' },
50
- ]);
51
- });
52
-
53
- it('includes flags in attachment metadata', async () => {
54
- const result = await Message._createMessageBody({
55
- files: [{ name: 'a.txt', data: new Uint8Array() }],
56
- attachments: [{ id: 0, filename: 'a.txt', flags: 8 }],
57
- });
58
- expect(result.body.attachments![0].flags).toBe(8);
59
- });
60
-
61
- it('returns empty result when no content, embeds, or files', async () => {
62
- const result = await Message._createMessageBody({});
63
- expect(result.body).toEqual({});
64
- });
65
-
66
- it('handles mixed EmbedBuilder and raw embed', async () => {
67
- const raw = { title: 'Raw', type: 'rich' as const };
68
- const built = new EmbedBuilder().setTitle('Built').setDescription('D');
69
- const result = await Message._createMessageBody({ embeds: [raw, built] });
70
- expect(result.body.embeds).toHaveLength(2);
71
- expect(result.body.embeds![0]).toBe(raw);
72
- expect(result.body.embeds![1]).toEqual(built.toJSON());
73
- });
74
- });