@erinjs/core 1.0.0

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 (389) hide show
  1. package/core/.changeset/README.md +8 -0
  2. package/core/.changeset/community-bootstrap-release.md +17 -0
  3. package/core/.changeset/config.json +11 -0
  4. package/core/.changeset/no-changelog.js +16 -0
  5. package/core/.changeset/pre.json +17 -0
  6. package/core/.editorconfig +13 -0
  7. package/core/.gitattributes +2 -0
  8. package/core/.github/CODE_OF_CONDUCT.md +23 -0
  9. package/core/.github/FUNDING.yml +7 -0
  10. package/core/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
  11. package/core/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  12. package/core/.github/PULL_REQUEST_TEMPLATE.md +16 -0
  13. package/core/.github/dependabot.yml +16 -0
  14. package/core/.github/workflows/autoapp.yml +16 -0
  15. package/core/.github/workflows/ci.yml +187 -0
  16. package/core/.github/workflows/codeql.yml +30 -0
  17. package/core/.github/workflows/deploy-docs.yml +54 -0
  18. package/core/.github/workflows/publish.yml +43 -0
  19. package/core/.lintstagedrc.json +4 -0
  20. package/core/.nvmrc +1 -0
  21. package/core/.prettierignore +8 -0
  22. package/core/.prettierrc +11 -0
  23. package/core/CONTRIBUTING.md +70 -0
  24. package/core/LICENSE +203 -0
  25. package/core/README.md +61 -0
  26. package/core/SECURITY.md +21 -0
  27. package/core/apps/docs/index.html +28 -0
  28. package/core/apps/docs/middleware.ts +21 -0
  29. package/core/apps/docs/package.json +33 -0
  30. package/core/apps/docs/public/@flux.png +0 -0
  31. package/core/apps/docs/public/docs/latest/guides.json +1420 -0
  32. package/core/apps/docs/public/docs/latest/main.json +14981 -0
  33. package/core/apps/docs/public/docs/latest/rag-index.json +1 -0
  34. package/core/apps/docs/public/docs/v1.0.5/guides.json +226 -0
  35. package/core/apps/docs/public/docs/v1.0.5/main.json +7920 -0
  36. package/core/apps/docs/public/docs/v1.0.6/guides.json +226 -0
  37. package/core/apps/docs/public/docs/v1.0.6/main.json +7920 -0
  38. package/core/apps/docs/public/docs/v1.0.7/guides.json +259 -0
  39. package/core/apps/docs/public/docs/v1.0.7/main.json +8652 -0
  40. package/core/apps/docs/public/docs/v1.0.8/guides.json +313 -0
  41. package/core/apps/docs/public/docs/v1.0.8/main.json +9618 -0
  42. package/core/apps/docs/public/docs/v1.0.9/guides.json +319 -0
  43. package/core/apps/docs/public/docs/v1.0.9/main.json +10694 -0
  44. package/core/apps/docs/public/docs/v1.1.0/guides.json +589 -0
  45. package/core/apps/docs/public/docs/v1.1.0/main.json +12576 -0
  46. package/core/apps/docs/public/docs/v1.1.2/guides.json +650 -0
  47. package/core/apps/docs/public/docs/v1.1.2/main.json +13239 -0
  48. package/core/apps/docs/public/docs/v1.1.3/guides.json +650 -0
  49. package/core/apps/docs/public/docs/v1.1.3/main.json +13239 -0
  50. package/core/apps/docs/public/docs/v1.1.4/guides.json +708 -0
  51. package/core/apps/docs/public/docs/v1.1.4/main.json +13231 -0
  52. package/core/apps/docs/public/docs/v1.1.5/guides.json +1035 -0
  53. package/core/apps/docs/public/docs/v1.1.5/main.json +13838 -0
  54. package/core/apps/docs/public/docs/v1.1.6/guides.json +1041 -0
  55. package/core/apps/docs/public/docs/v1.1.6/main.json +14313 -0
  56. package/core/apps/docs/public/docs/v1.1.8/guides.json +1047 -0
  57. package/core/apps/docs/public/docs/v1.1.8/main.json +14421 -0
  58. package/core/apps/docs/public/docs/v1.1.9/guides.json +1047 -0
  59. package/core/apps/docs/public/docs/v1.1.9/main.json +14421 -0
  60. package/core/apps/docs/public/docs/v1.2.0/guides.json +1212 -0
  61. package/core/apps/docs/public/docs/v1.2.0/main.json +14663 -0
  62. package/core/apps/docs/public/docs/v1.2.1/guides.json +1293 -0
  63. package/core/apps/docs/public/docs/v1.2.1/main.json +14828 -0
  64. package/core/apps/docs/public/docs/v1.2.2/guides.json +1293 -0
  65. package/core/apps/docs/public/docs/v1.2.2/main.json +15025 -0
  66. package/core/apps/docs/public/docs/v1.2.3/guides.json +1420 -0
  67. package/core/apps/docs/public/docs/v1.2.3/main.json +14954 -0
  68. package/core/apps/docs/public/docs/v1.2.4/guides.json +1420 -0
  69. package/core/apps/docs/public/docs/v1.2.4/main.json +14981 -0
  70. package/core/apps/docs/public/docs/versions.json +24 -0
  71. package/core/apps/docs/public/flux.png +0 -0
  72. package/core/apps/docs/public/locales/en.json +50 -0
  73. package/core/apps/docs/public/locales/guides-en.json +512 -0
  74. package/core/apps/docs/public/robots.txt +4 -0
  75. package/core/apps/docs/public/sitemap.xml +33 -0
  76. package/core/apps/docs/src/App.vue +538 -0
  77. package/core/apps/docs/src/components/ApiCategorySection.vue +42 -0
  78. package/core/apps/docs/src/components/ApiDiscordCompat.vue +65 -0
  79. package/core/apps/docs/src/components/ApiEndpointCard.vue +313 -0
  80. package/core/apps/docs/src/components/ApiSchemaBlock.vue +131 -0
  81. package/core/apps/docs/src/components/CodeBlock.vue +177 -0
  82. package/core/apps/docs/src/components/CommunityCallout.vue +90 -0
  83. package/core/apps/docs/src/components/ConstructorSection.vue +82 -0
  84. package/core/apps/docs/src/components/DocDescription.vue +40 -0
  85. package/core/apps/docs/src/components/FluxerLogo.vue +3 -0
  86. package/core/apps/docs/src/components/Footer.vue +106 -0
  87. package/core/apps/docs/src/components/GuideCodeBlock.vue +102 -0
  88. package/core/apps/docs/src/components/GuideDiscordCompat.vue +77 -0
  89. package/core/apps/docs/src/components/GuideDiscordCompatCallout.vue +83 -0
  90. package/core/apps/docs/src/components/GuideTable.vue +77 -0
  91. package/core/apps/docs/src/components/GuideTip.vue +38 -0
  92. package/core/apps/docs/src/components/MethodsSection.vue +195 -0
  93. package/core/apps/docs/src/components/ParamsTable.vue +70 -0
  94. package/core/apps/docs/src/components/PropertiesSection.vue +143 -0
  95. package/core/apps/docs/src/components/SearchBar.vue +76 -0
  96. package/core/apps/docs/src/components/SearchModal.vue +361 -0
  97. package/core/apps/docs/src/components/SidebarNav.vue +225 -0
  98. package/core/apps/docs/src/components/SponsorBanner.vue +153 -0
  99. package/core/apps/docs/src/components/TypeSignature.vue +187 -0
  100. package/core/apps/docs/src/components/VersionPicker.vue +191 -0
  101. package/core/apps/docs/src/composables/useSearchIndex.ts +144 -0
  102. package/core/apps/docs/src/composables/useVersionedPath.ts +20 -0
  103. package/core/apps/docs/src/data/apiEndpoints.ts +1073 -0
  104. package/core/apps/docs/src/data/changelog.ts +717 -0
  105. package/core/apps/docs/src/data/guides.ts +2362 -0
  106. package/core/apps/docs/src/env.d.ts +7 -0
  107. package/core/apps/docs/src/locales/guides-en.json +512 -0
  108. package/core/apps/docs/src/main.ts +27 -0
  109. package/core/apps/docs/src/pages/ApiReferenceLayout.vue +175 -0
  110. package/core/apps/docs/src/pages/ApiReferencePage.vue +128 -0
  111. package/core/apps/docs/src/pages/Changelog.vue +288 -0
  112. package/core/apps/docs/src/pages/ClassPage.vue +319 -0
  113. package/core/apps/docs/src/pages/ClassesList.vue +100 -0
  114. package/core/apps/docs/src/pages/DocsLayout.vue +127 -0
  115. package/core/apps/docs/src/pages/GuidePage.vue +279 -0
  116. package/core/apps/docs/src/pages/GuidesIndex.vue +166 -0
  117. package/core/apps/docs/src/pages/GuidesLayout.vue +245 -0
  118. package/core/apps/docs/src/pages/Home.vue +125 -0
  119. package/core/apps/docs/src/pages/NotFound.vue +57 -0
  120. package/core/apps/docs/src/pages/TypedefPage.vue +230 -0
  121. package/core/apps/docs/src/pages/TypedefsList.vue +168 -0
  122. package/core/apps/docs/src/pages/VersionLayout.vue +15 -0
  123. package/core/apps/docs/src/router.ts +73 -0
  124. package/core/apps/docs/src/stores/docs.ts +54 -0
  125. package/core/apps/docs/src/stores/guides.ts +53 -0
  126. package/core/apps/docs/src/stores/version.ts +67 -0
  127. package/core/apps/docs/src/styles/main.css +278 -0
  128. package/core/apps/docs/src/styles/prism.css +95 -0
  129. package/core/apps/docs/src/types/doc-schema.ts +112 -0
  130. package/core/apps/docs/tsconfig.json +17 -0
  131. package/core/apps/docs/tsconfig.node.json +10 -0
  132. package/core/apps/docs/vite.config.d.ts +2 -0
  133. package/core/apps/docs/vite.config.js +26 -0
  134. package/core/apps/docs/vite.config.ts +28 -0
  135. package/core/apps/docs-vitepress/.vitepress/config.ts +141 -0
  136. package/core/apps/docs-vitepress/api-data/latest/main.json +15035 -0
  137. package/core/apps/docs-vitepress/api-data/v1.2.4/main.json +15035 -0
  138. package/core/apps/docs-vitepress/api-data/versions.json +6 -0
  139. package/core/apps/docs-vitepress/index.md +15 -0
  140. package/core/apps/docs-vitepress/package-lock.json +2924 -0
  141. package/core/apps/docs-vitepress/package.json +20 -0
  142. package/core/apps/docs-vitepress/public/CNAME +1 -0
  143. package/core/apps/docs-vitepress/scripts/generate-api.ts +243 -0
  144. package/core/apps/docs-vitepress/scripts/migrate-guides.ts +129 -0
  145. package/core/apps/docs-vitepress/tsconfig.json +11 -0
  146. package/core/apps/docs-vitepress/v/latest/guides/attachments-by-url.md +57 -0
  147. package/core/apps/docs-vitepress/v/latest/guides/attachments.md +62 -0
  148. package/core/apps/docs-vitepress/v/latest/guides/basic-bot.md +49 -0
  149. package/core/apps/docs-vitepress/v/latest/guides/channels.md +180 -0
  150. package/core/apps/docs-vitepress/v/latest/guides/deprecated-apis.md +58 -0
  151. package/core/apps/docs-vitepress/v/latest/guides/discord-js-compatibility.md +42 -0
  152. package/core/apps/docs-vitepress/v/latest/guides/editing-embeds.md +65 -0
  153. package/core/apps/docs-vitepress/v/latest/guides/embed-media.md +87 -0
  154. package/core/apps/docs-vitepress/v/latest/guides/embeds.md +166 -0
  155. package/core/apps/docs-vitepress/v/latest/guides/emojis.md +77 -0
  156. package/core/apps/docs-vitepress/v/latest/guides/events.md +202 -0
  157. package/core/apps/docs-vitepress/v/latest/guides/gifs.md +47 -0
  158. package/core/apps/docs-vitepress/v/latest/guides/installation.md +10 -0
  159. package/core/apps/docs-vitepress/v/latest/guides/moderation.md +89 -0
  160. package/core/apps/docs-vitepress/v/latest/guides/permissions.md +130 -0
  161. package/core/apps/docs-vitepress/v/latest/guides/prefix-commands.md +41 -0
  162. package/core/apps/docs-vitepress/v/latest/guides/profile-urls.md +58 -0
  163. package/core/apps/docs-vitepress/v/latest/guides/reactions.md +69 -0
  164. package/core/apps/docs-vitepress/v/latest/guides/roles.md +130 -0
  165. package/core/apps/docs-vitepress/v/latest/guides/sending-without-reply.md +172 -0
  166. package/core/apps/docs-vitepress/v/latest/guides/voice.md +109 -0
  167. package/core/apps/docs-vitepress/v/latest/guides/wait-for-guilds.md +37 -0
  168. package/core/apps/docs-vitepress/v/latest/guides/webhook-attachments-embeds.md +73 -0
  169. package/core/apps/docs-vitepress/v/latest/guides/webhooks.md +131 -0
  170. package/core/eslint.config.js +80 -0
  171. package/core/examples/.env.example +22 -0
  172. package/core/examples/README.md +68 -0
  173. package/core/examples/first-steps-bot.js +118 -0
  174. package/core/examples/minimal-bot.js +17 -0
  175. package/core/examples/moderation-bot.js +209 -0
  176. package/core/examples/package.json +14 -0
  177. package/core/examples/ping-bot.js +1146 -0
  178. package/core/examples/reaction-bot.js +70 -0
  179. package/core/examples/reaction-roles-bot.js +140 -0
  180. package/core/examples/webhook-bot.js +239 -0
  181. package/core/flux.png +0 -0
  182. package/core/package.json +78 -0
  183. package/core/packages/builders/package.json +51 -0
  184. package/core/packages/builders/src/index.ts +13 -0
  185. package/core/packages/builders/src/messages/AttachmentBuilder.test.ts +79 -0
  186. package/core/packages/builders/src/messages/AttachmentBuilder.ts +69 -0
  187. package/core/packages/builders/src/messages/EmbedBuilder.test.ts +266 -0
  188. package/core/packages/builders/src/messages/EmbedBuilder.ts +239 -0
  189. package/core/packages/builders/src/messages/MessagePayload.test.ts +118 -0
  190. package/core/packages/builders/src/messages/MessagePayload.ts +122 -0
  191. package/core/packages/builders/tsconfig.json +9 -0
  192. package/core/packages/builders/tsup.config.ts +9 -0
  193. package/core/packages/builders/vitest.config.ts +9 -0
  194. package/core/packages/collection/package.json +47 -0
  195. package/core/packages/collection/src/Collection.test.ts +232 -0
  196. package/core/packages/collection/src/Collection.ts +196 -0
  197. package/core/packages/collection/src/index.ts +1 -0
  198. package/core/packages/collection/tsconfig.json +9 -0
  199. package/core/packages/collection/tsup.config.ts +9 -0
  200. package/core/packages/collection/vitest.config.ts +9 -0
  201. package/core/packages/docgen/package.json +26 -0
  202. package/core/packages/docgen/src/extract.ts +262 -0
  203. package/core/packages/docgen/src/formatType.ts +24 -0
  204. package/core/packages/docgen/src/index.ts +103 -0
  205. package/core/packages/docgen/src/schema.ts +100 -0
  206. package/core/packages/docgen/src/visitor.ts +147 -0
  207. package/core/packages/docgen/tsconfig.json +9 -0
  208. package/core/packages/docgen/tsup.config.ts +9 -0
  209. package/core/packages/fluxer-core/README.md +26 -0
  210. package/core/packages/fluxer-core/package.json +60 -0
  211. package/core/packages/fluxer-core/src/client/ChannelManager.ts +143 -0
  212. package/core/packages/fluxer-core/src/client/Client.gateway.test.ts +84 -0
  213. package/core/packages/fluxer-core/src/client/Client.resolveEmoji.test.ts +45 -0
  214. package/core/packages/fluxer-core/src/client/Client.ts +558 -0
  215. package/core/packages/fluxer-core/src/client/ClientUser.ts +40 -0
  216. package/core/packages/fluxer-core/src/client/EventHandlerRegistry.ts +469 -0
  217. package/core/packages/fluxer-core/src/client/GuildManager.ts +79 -0
  218. package/core/packages/fluxer-core/src/client/GuildMemberManager.ts +91 -0
  219. package/core/packages/fluxer-core/src/client/MessageManager.ts +58 -0
  220. package/core/packages/fluxer-core/src/client/UsersManager.ts +122 -0
  221. package/core/packages/fluxer-core/src/errors/ErrorCodes.test.ts +19 -0
  222. package/core/packages/fluxer-core/src/errors/ErrorCodes.ts +12 -0
  223. package/core/packages/fluxer-core/src/errors/FluxerError.test.ts +32 -0
  224. package/core/packages/fluxer-core/src/errors/FluxerError.ts +15 -0
  225. package/core/packages/fluxer-core/src/index.ts +85 -0
  226. package/core/packages/fluxer-core/src/structures/Base.ts +7 -0
  227. package/core/packages/fluxer-core/src/structures/Channel.ts +508 -0
  228. package/core/packages/fluxer-core/src/structures/Guild.test.ts +189 -0
  229. package/core/packages/fluxer-core/src/structures/Guild.ts +734 -0
  230. package/core/packages/fluxer-core/src/structures/GuildBan.ts +35 -0
  231. package/core/packages/fluxer-core/src/structures/GuildEmoji.ts +57 -0
  232. package/core/packages/fluxer-core/src/structures/GuildMember.test.ts +203 -0
  233. package/core/packages/fluxer-core/src/structures/GuildMember.ts +213 -0
  234. package/core/packages/fluxer-core/src/structures/GuildMemberRoleManager.ts +121 -0
  235. package/core/packages/fluxer-core/src/structures/GuildSticker.ts +56 -0
  236. package/core/packages/fluxer-core/src/structures/Invite.test.ts +103 -0
  237. package/core/packages/fluxer-core/src/structures/Invite.ts +121 -0
  238. package/core/packages/fluxer-core/src/structures/Message.test.ts +109 -0
  239. package/core/packages/fluxer-core/src/structures/Message.ts +397 -0
  240. package/core/packages/fluxer-core/src/structures/MessageReaction.ts +72 -0
  241. package/core/packages/fluxer-core/src/structures/PartialMessage.ts +12 -0
  242. package/core/packages/fluxer-core/src/structures/Role.test.ts +77 -0
  243. package/core/packages/fluxer-core/src/structures/Role.ts +112 -0
  244. package/core/packages/fluxer-core/src/structures/User.test.ts +110 -0
  245. package/core/packages/fluxer-core/src/structures/User.ts +109 -0
  246. package/core/packages/fluxer-core/src/structures/Webhook.test.ts +109 -0
  247. package/core/packages/fluxer-core/src/structures/Webhook.ts +258 -0
  248. package/core/packages/fluxer-core/src/util/Constants.test.ts +16 -0
  249. package/core/packages/fluxer-core/src/util/Constants.ts +7 -0
  250. package/core/packages/fluxer-core/src/util/Events.ts +46 -0
  251. package/core/packages/fluxer-core/src/util/MessageCollector.ts +87 -0
  252. package/core/packages/fluxer-core/src/util/Options.ts +33 -0
  253. package/core/packages/fluxer-core/src/util/ReactionCollector.ts +116 -0
  254. package/core/packages/fluxer-core/src/util/cdn.test.ts +108 -0
  255. package/core/packages/fluxer-core/src/util/cdn.ts +130 -0
  256. package/core/packages/fluxer-core/src/util/guildUtils.ts +33 -0
  257. package/core/packages/fluxer-core/src/util/messageUtils.test.ts +74 -0
  258. package/core/packages/fluxer-core/src/util/messageUtils.ts +119 -0
  259. package/core/packages/fluxer-core/src/util/permissions.test.ts +95 -0
  260. package/core/packages/fluxer-core/src/util/permissions.ts +43 -0
  261. package/core/packages/fluxer-core/tsconfig.json +9 -0
  262. package/core/packages/fluxer-core/tsup.config.ts +9 -0
  263. package/core/packages/fluxer-core/vitest.config.ts +9 -0
  264. package/core/packages/rest/package.json +52 -0
  265. package/core/packages/rest/src/REST.test.ts +64 -0
  266. package/core/packages/rest/src/REST.ts +90 -0
  267. package/core/packages/rest/src/RateLimitManager.test.ts +71 -0
  268. package/core/packages/rest/src/RateLimitManager.ts +60 -0
  269. package/core/packages/rest/src/RequestManager.test.ts +87 -0
  270. package/core/packages/rest/src/RequestManager.ts +172 -0
  271. package/core/packages/rest/src/errors/FluxerAPIError.test.ts +57 -0
  272. package/core/packages/rest/src/errors/FluxerAPIError.ts +21 -0
  273. package/core/packages/rest/src/errors/HTTPError.test.ts +55 -0
  274. package/core/packages/rest/src/errors/HTTPError.ts +25 -0
  275. package/core/packages/rest/src/errors/RateLimitError.test.ts +41 -0
  276. package/core/packages/rest/src/errors/RateLimitError.ts +15 -0
  277. package/core/packages/rest/src/errors/index.ts +3 -0
  278. package/core/packages/rest/src/index.ts +6 -0
  279. package/core/packages/rest/src/utils/constants.test.ts +31 -0
  280. package/core/packages/rest/src/utils/constants.ts +5 -0
  281. package/core/packages/rest/src/utils/files.test.ts +37 -0
  282. package/core/packages/rest/src/utils/files.ts +75 -0
  283. package/core/packages/rest/tsconfig.json +9 -0
  284. package/core/packages/rest/tsup.config.ts +9 -0
  285. package/core/packages/rest/vitest.config.ts +9 -0
  286. package/core/packages/types/package.json +46 -0
  287. package/core/packages/types/src/api/ban.ts +8 -0
  288. package/core/packages/types/src/api/channel.ts +65 -0
  289. package/core/packages/types/src/api/embed.ts +82 -0
  290. package/core/packages/types/src/api/emoji.ts +12 -0
  291. package/core/packages/types/src/api/errors.ts +68 -0
  292. package/core/packages/types/src/api/gateway.ts +14 -0
  293. package/core/packages/types/src/api/guild.ts +123 -0
  294. package/core/packages/types/src/api/index.ts +15 -0
  295. package/core/packages/types/src/api/instance.ts +32 -0
  296. package/core/packages/types/src/api/interaction.ts +26 -0
  297. package/core/packages/types/src/api/invite.ts +28 -0
  298. package/core/packages/types/src/api/message.ts +140 -0
  299. package/core/packages/types/src/api/role.ts +41 -0
  300. package/core/packages/types/src/api/sticker.ts +14 -0
  301. package/core/packages/types/src/api/user.ts +79 -0
  302. package/core/packages/types/src/api/webhook.ts +41 -0
  303. package/core/packages/types/src/common/index.ts +1 -0
  304. package/core/packages/types/src/common/snowflake.test.ts +9 -0
  305. package/core/packages/types/src/common/snowflake.ts +8 -0
  306. package/core/packages/types/src/gateway/events.ts +189 -0
  307. package/core/packages/types/src/gateway/index.ts +3 -0
  308. package/core/packages/types/src/gateway/opcodes.ts +17 -0
  309. package/core/packages/types/src/gateway/payloads.ts +481 -0
  310. package/core/packages/types/src/index.ts +4 -0
  311. package/core/packages/types/src/rest/index.ts +1 -0
  312. package/core/packages/types/src/rest/routes.test.ts +169 -0
  313. package/core/packages/types/src/rest/routes.ts +109 -0
  314. package/core/packages/types/tsconfig.json +9 -0
  315. package/core/packages/types/tsup.config.ts +9 -0
  316. package/core/packages/types/vitest.config.ts +9 -0
  317. package/core/packages/util/package.json +51 -0
  318. package/core/packages/util/src/BitField.test.ts +96 -0
  319. package/core/packages/util/src/BitField.ts +105 -0
  320. package/core/packages/util/src/MessageFlagsBitField.test.ts +42 -0
  321. package/core/packages/util/src/MessageFlagsBitField.ts +20 -0
  322. package/core/packages/util/src/PermissionsBitField.test.ts +79 -0
  323. package/core/packages/util/src/PermissionsBitField.ts +97 -0
  324. package/core/packages/util/src/SnowflakeUtil.test.ts +69 -0
  325. package/core/packages/util/src/SnowflakeUtil.ts +65 -0
  326. package/core/packages/util/src/UserFlagsBitField.test.ts +39 -0
  327. package/core/packages/util/src/UserFlagsBitField.ts +48 -0
  328. package/core/packages/util/src/deprecation.test.ts +44 -0
  329. package/core/packages/util/src/deprecation.ts +28 -0
  330. package/core/packages/util/src/emojiShortcodes.generated.ts +5 -0
  331. package/core/packages/util/src/emojiShortcodes.test.ts +41 -0
  332. package/core/packages/util/src/emojiShortcodes.ts +22 -0
  333. package/core/packages/util/src/formatters.test.ts +65 -0
  334. package/core/packages/util/src/formatters.ts +35 -0
  335. package/core/packages/util/src/index.ts +34 -0
  336. package/core/packages/util/src/resolvers.test.ts +198 -0
  337. package/core/packages/util/src/resolvers.ts +127 -0
  338. package/core/packages/util/src/tenorUtils.test.ts +75 -0
  339. package/core/packages/util/src/tenorUtils.ts +86 -0
  340. package/core/packages/util/tsconfig.json +9 -0
  341. package/core/packages/util/tsup.config.ts +9 -0
  342. package/core/packages/util/vitest.config.ts +9 -0
  343. package/core/packages/voice/README.md +42 -0
  344. package/core/packages/voice/package.json +67 -0
  345. package/core/packages/voice/src/LiveKitRtcConnection.receive.test.ts +24 -0
  346. package/core/packages/voice/src/LiveKitRtcConnection.ts +1767 -0
  347. package/core/packages/voice/src/VoiceConnection.ts +413 -0
  348. package/core/packages/voice/src/VoiceManager.receive.test.ts +61 -0
  349. package/core/packages/voice/src/VoiceManager.test.ts +44 -0
  350. package/core/packages/voice/src/VoiceManager.ts +503 -0
  351. package/core/packages/voice/src/exports.test.ts +38 -0
  352. package/core/packages/voice/src/index.ts +51 -0
  353. package/core/packages/voice/src/livekit.test.ts +48 -0
  354. package/core/packages/voice/src/livekit.ts +33 -0
  355. package/core/packages/voice/src/mp4box.d.ts +32 -0
  356. package/core/packages/voice/src/opusUtils.test.ts +29 -0
  357. package/core/packages/voice/src/opusUtils.ts +86 -0
  358. package/core/packages/voice/src/streamPreviewPlaceholder.test.ts +16 -0
  359. package/core/packages/voice/src/streamPreviewPlaceholder.ts +8 -0
  360. package/core/packages/voice/src/ws.d.ts +1 -0
  361. package/core/packages/voice/tsconfig.json +5 -0
  362. package/core/packages/voice/tsup.config.ts +10 -0
  363. package/core/packages/voice/vitest.config.ts +9 -0
  364. package/core/packages/ws/package.json +52 -0
  365. package/core/packages/ws/src/WebSocketManager.ts +130 -0
  366. package/core/packages/ws/src/WebSocketShard.ts +296 -0
  367. package/core/packages/ws/src/index.ts +12 -0
  368. package/core/packages/ws/src/utils/constants.test.ts +46 -0
  369. package/core/packages/ws/src/utils/constants.ts +22 -0
  370. package/core/packages/ws/src/utils/getWebSocket.ts +55 -0
  371. package/core/packages/ws/src/ws.d.ts +10 -0
  372. package/core/packages/ws/tsconfig.json +9 -0
  373. package/core/packages/ws/tsup.config.ts +9 -0
  374. package/core/pnpm-lock.yaml +7033 -0
  375. package/core/pnpm-workspace.yaml +4 -0
  376. package/core/scripts/generate-ai-rag.ts +240 -0
  377. package/core/scripts/generate-docs.ts +143 -0
  378. package/core/scripts/generate-emoji-shortcodes.ts +58 -0
  379. package/core/scripts/generate-types.ts +6 -0
  380. package/core/scripts/publish-ordered.js +63 -0
  381. package/core/scripts/test-cjs-require.mjs +43 -0
  382. package/core/scripts/test-esm-imports.mjs +42 -0
  383. package/core/scripts/test-package-exports.mjs +98 -0
  384. package/core/scripts/test-smoke.mjs +103 -0
  385. package/core/tsconfig.json +18 -0
  386. package/core/turbo.json +30 -0
  387. package/core/vitest.config.ts +17 -0
  388. package/core/wrangler.jsonc +9 -0
  389. package/package.json +26 -0
@@ -0,0 +1,262 @@
1
+ import * as ts from 'typescript';
2
+ import doctrine from 'doctrine';
3
+ import {
4
+ DocParam,
5
+ DocConstructor,
6
+ DocProperty,
7
+ DocMethod,
8
+ DocSource,
9
+ DocInterfaceProperty,
10
+ DocEnumMember,
11
+ } from './schema.js';
12
+ import { formatTypeNode, formatTypeFromType } from './formatType.js';
13
+
14
+ function getJSDoc(node: ts.Node): string {
15
+ const sourceFile = node.getSourceFile();
16
+ const text = sourceFile.getFullText();
17
+ const commentRanges = ts.getLeadingCommentRanges(text, node.getFullStart());
18
+ if (!commentRanges?.length) return '';
19
+ const range = commentRanges[commentRanges.length - 1];
20
+ return text.slice(range.pos, range.end);
21
+ }
22
+
23
+ function parseJSDoc(comment: string): doctrine.Annotation | null {
24
+ try {
25
+ return doctrine.parse(comment, { unwrap: true });
26
+ } catch {
27
+ return null;
28
+ }
29
+ }
30
+
31
+ function cleanDescription(s: string): string {
32
+ return s
33
+ .replace(/\s*\/\s*$/, '')
34
+ .replace(/\n\s*\n\s*\n/g, '\n\n')
35
+ .trim();
36
+ }
37
+
38
+ function getDescriptionFromJSDoc(comment: string): string {
39
+ const parsed = parseJSDoc(comment);
40
+ if (!parsed) return '';
41
+ return cleanDescription(parsed.description ?? '');
42
+ }
43
+
44
+ function getParamDescriptions(comment: string): Map<string, string> {
45
+ const parsed = parseJSDoc(comment);
46
+ const map = new Map<string, string>();
47
+ if (!parsed?.tags) return map;
48
+ for (const tag of parsed.tags) {
49
+ if (tag.title === 'param' && 'name' in tag) {
50
+ const name = (tag as doctrine.type.ParameterTag).name;
51
+ const desc = (tag as doctrine.type.ParameterTag).description ?? '';
52
+ if (name) map.set(name.replace(/^\[|\]$/g, ''), cleanDescription(desc));
53
+ }
54
+ }
55
+ return map;
56
+ }
57
+
58
+ function _getReturnsFromJSDoc(comment: string): string | undefined {
59
+ const parsed = parseJSDoc(comment);
60
+ if (!parsed?.tags) return undefined;
61
+ const tag = parsed.tags.find((t) => t.title === 'returns');
62
+ if (tag && tag.type === 'ReturnTag') {
63
+ return ((tag as doctrine.type.ReturnTag).description ?? '').trim();
64
+ }
65
+ return undefined;
66
+ }
67
+
68
+ function getExamplesFromJSDoc(comment: string): string[] {
69
+ const parsed = parseJSDoc(comment);
70
+ if (!parsed?.tags) return [];
71
+ return parsed.tags
72
+ .filter((t) => t.title === 'example')
73
+ .map((t) => ((t as doctrine.type.Tag).description ?? '').trim())
74
+ .filter(Boolean);
75
+ }
76
+
77
+ export function getDeprecatedFromJSDoc(comment: string): boolean | string | undefined {
78
+ const parsed = parseJSDoc(comment);
79
+ if (!parsed?.tags) return undefined;
80
+ const tag = parsed.tags.find((t) => t.title === 'deprecated');
81
+ if (!tag) return undefined;
82
+ const desc = (tag as doctrine.type.Tag).description?.trim();
83
+ return desc || true;
84
+ }
85
+
86
+ /** @discordJsCompat or @discordJsCompat https://discord.js.org/... — string = URL, true = no link */
87
+ export function getDiscordJsCompatFromJSDoc(comment: string): boolean | string | undefined {
88
+ const parsed = parseJSDoc(comment);
89
+ if (!parsed?.tags) return undefined;
90
+ const tag = parsed.tags.find(
91
+ (t) => t.title === 'discordJsCompat' || t.title === 'discordjscompat',
92
+ );
93
+ if (!tag) return undefined;
94
+ const desc = (tag as doctrine.type.Tag).description?.trim();
95
+ return desc || true;
96
+ }
97
+
98
+ export function getDescriptionFromJSDocComment(comment: string): string {
99
+ return getDescriptionFromJSDoc(comment);
100
+ }
101
+
102
+ function getSource(node: ts.Node): DocSource | undefined {
103
+ const sourceFile = node.getSourceFile();
104
+ const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
105
+ const fileName = sourceFile.fileName.split(/[/\\]/).pop() ?? '';
106
+ return { file: fileName, line: line + 1 };
107
+ }
108
+
109
+ export function extractConstructor(
110
+ checker: ts.TypeChecker,
111
+ node: ts.ConstructorDeclaration,
112
+ ): DocConstructor | undefined {
113
+ const comment = getJSDoc(node);
114
+ const paramDescs = getParamDescriptions(comment);
115
+
116
+ const params: DocParam[] = node.parameters.map((p) => {
117
+ const name = (p.name as ts.Identifier).getText();
118
+ const type = p.type
119
+ ? formatTypeNode(checker, p.type)
120
+ : formatTypeFromType(checker, checker.getTypeAtLocation(p));
121
+ const optional = !!p.questionToken;
122
+ const description = paramDescs.get(name);
123
+ return { name, type, optional, description };
124
+ });
125
+
126
+ const examples = getExamplesFromJSDoc(comment);
127
+
128
+ return {
129
+ params,
130
+ description: getDescriptionFromJSDoc(comment) || undefined,
131
+ examples: examples.length ? examples : undefined,
132
+ };
133
+ }
134
+
135
+ export function extractProperty(
136
+ checker: ts.TypeChecker,
137
+ node: ts.PropertyDeclaration | ts.PropertySignature,
138
+ ): DocProperty | null {
139
+ const name = (node.name as ts.Identifier)?.getText();
140
+ if (!name || name.startsWith('_')) return null;
141
+
142
+ const comment = getJSDoc(node);
143
+ const type = node.type
144
+ ? formatTypeNode(checker, node.type)
145
+ : formatTypeFromType(checker, checker.getTypeAtLocation(node));
146
+ const readonly = !!(node as ts.PropertyDeclaration).modifiers?.some(
147
+ (m) => m.kind === ts.SyntaxKind.ReadonlyKeyword,
148
+ );
149
+ const optional = !!(node as ts.PropertySignature).questionToken;
150
+ const description = getDescriptionFromJSDoc(comment) || undefined;
151
+ const discordJsCompat = getDiscordJsCompatFromJSDoc(comment);
152
+ const examples = getExamplesFromJSDoc(comment);
153
+
154
+ return {
155
+ name,
156
+ type,
157
+ readonly,
158
+ optional,
159
+ description,
160
+ discordJsCompat,
161
+ examples: examples.length ? examples : undefined,
162
+ };
163
+ }
164
+
165
+ export function extractMethod(
166
+ checker: ts.TypeChecker,
167
+ node: ts.MethodDeclaration | ts.MethodSignature,
168
+ ): DocMethod | null {
169
+ const name = (node.name as ts.Identifier)?.getText();
170
+ if (!name || name.startsWith('_')) return null;
171
+
172
+ const comment = getJSDoc(node);
173
+ const paramDescs = getParamDescriptions(comment);
174
+
175
+ const params: DocParam[] = (node.parameters ?? []).map((p) => {
176
+ const pname = (p.name as ts.Identifier).getText();
177
+ const type = p.type
178
+ ? formatTypeNode(checker, p.type)
179
+ : formatTypeFromType(checker, checker.getTypeAtLocation(p));
180
+ const optional = !!p.questionToken;
181
+ const description = paramDescs.get(pname);
182
+ return { name: pname, type, optional, description };
183
+ });
184
+
185
+ const returnType = node.type
186
+ ? formatTypeNode(checker, node.type)
187
+ : (node as ts.MethodDeclaration).body
188
+ ? formatTypeFromType(
189
+ checker,
190
+ checker.getReturnTypeOfSignature(checker.getSignatureFromDeclaration(node)!),
191
+ )
192
+ : 'void';
193
+
194
+ const async = !!(node as ts.MethodDeclaration).modifiers?.some(
195
+ (m) => m.kind === ts.SyntaxKind.AsyncKeyword,
196
+ );
197
+
198
+ const deprecated = getDeprecatedFromJSDoc(comment);
199
+ const discordJsCompat = getDiscordJsCompatFromJSDoc(comment);
200
+ const examples = getExamplesFromJSDoc(comment);
201
+
202
+ return {
203
+ name,
204
+ params,
205
+ returns: returnType,
206
+ description: getDescriptionFromJSDoc(comment) || undefined,
207
+ examples: examples.length ? examples : undefined,
208
+ async,
209
+ deprecated,
210
+ discordJsCompat,
211
+ source: getSource(node),
212
+ };
213
+ }
214
+
215
+ export function extractGetterProperty(
216
+ checker: ts.TypeChecker,
217
+ node: ts.GetAccessorDeclaration,
218
+ ): DocProperty | null {
219
+ const name = (node.name as ts.Identifier)?.getText();
220
+ if (!name || name.startsWith('_')) return null;
221
+
222
+ const comment = getJSDoc(node);
223
+ const returnType = node.type
224
+ ? formatTypeNode(checker, node.type)
225
+ : formatTypeFromType(
226
+ checker,
227
+ checker.getReturnTypeOfSignature(checker.getSignatureFromDeclaration(node)!),
228
+ );
229
+ const description = getDescriptionFromJSDoc(comment) || undefined;
230
+ const discordJsCompat = getDiscordJsCompatFromJSDoc(comment);
231
+ const examples = getExamplesFromJSDoc(comment);
232
+
233
+ return {
234
+ name,
235
+ type: returnType,
236
+ readonly: true,
237
+ optional: false,
238
+ description,
239
+ discordJsCompat,
240
+ examples: examples.length ? examples : undefined,
241
+ };
242
+ }
243
+
244
+ export function extractInterfaceProperty(
245
+ checker: ts.TypeChecker,
246
+ node: ts.PropertySignature,
247
+ ): DocInterfaceProperty | null {
248
+ return extractProperty(checker, node) as DocInterfaceProperty | null;
249
+ }
250
+
251
+ export function extractEnumMember(node: ts.EnumMember): DocEnumMember {
252
+ const name = (node.name as ts.Identifier).getText();
253
+ let value: string | number = name;
254
+ if (node.initializer) {
255
+ if (ts.isNumericLiteral(node.initializer)) {
256
+ value = parseInt(node.initializer.getText(), 10);
257
+ } else if (ts.isStringLiteral(node.initializer)) {
258
+ value = node.initializer.getText().slice(1, -1);
259
+ }
260
+ }
261
+ return { name, value };
262
+ }
@@ -0,0 +1,24 @@
1
+ import * as ts from 'typescript';
2
+
3
+ /**
4
+ * Strip import("..."). prefixes from type strings.
5
+ * TS checker emits these for types from other modules - we want just the type name.
6
+ */
7
+ function sanitizeTypeString(s: string): string {
8
+ return s.replace(/\bimport\s*\(["']([^"']*)["']\)\s*\./g, '');
9
+ }
10
+
11
+ /**
12
+ * Convert a TypeScript type to a readable string for documentation.
13
+ */
14
+ export function formatTypeNode(checker: ts.TypeChecker, typeNode: ts.TypeNode | undefined): string {
15
+ if (!typeNode) return 'void';
16
+ const type = checker.getTypeFromTypeNode(typeNode);
17
+ const raw = checker.typeToString(type, typeNode, ts.TypeFormatFlags.None);
18
+ return sanitizeTypeString(raw);
19
+ }
20
+
21
+ export function formatTypeFromType(checker: ts.TypeChecker, type: ts.Type): string {
22
+ const raw = checker.typeToString(type, undefined, ts.TypeFormatFlags.None);
23
+ return sanitizeTypeString(raw);
24
+ }
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Custom doc generator using TypeScript Compiler API.
4
+ * Outputs clean JSON schema for the docs website.
5
+ */
6
+
7
+ import * as ts from 'typescript';
8
+ import { resolve, dirname } from 'path';
9
+ import { mkdirSync, writeFileSync } from 'fs';
10
+ import { DocOutput } from './schema.js';
11
+
12
+ export type { DocOutput, DocClass, DocInterface, DocEnum } from './schema.js';
13
+ import { visitSourceFile } from './visitor.js';
14
+
15
+ export interface DocgenOptions {
16
+ entryPoints: string[];
17
+ tsconfigPath: string;
18
+ packageName: string;
19
+ outFile: string;
20
+ /** Repo root for source link paths */
21
+ repoRoot?: string;
22
+ }
23
+
24
+ export function generateDocs(options: DocgenOptions): DocOutput {
25
+ const { entryPoints, tsconfigPath, packageName, outFile, repoRoot } = options;
26
+
27
+ const configPath = resolve(tsconfigPath);
28
+ const configFile = ts.readConfigFile(configPath, ts.sys.readFile);
29
+ if (configFile.error) {
30
+ throw new Error(`Failed to read tsconfig: ${configFile.error.messageText}`);
31
+ }
32
+
33
+ const parsedConfig = ts.parseJsonConfigFileContent(
34
+ configFile.config,
35
+ ts.sys,
36
+ dirname(configPath),
37
+ );
38
+
39
+ const rootPath = dirname(configPath);
40
+ const program = ts.createProgram(
41
+ parsedConfig.fileNames.length
42
+ ? parsedConfig.fileNames
43
+ : entryPoints.map((e) => resolve(rootPath, e)),
44
+ parsedConfig.options,
45
+ );
46
+
47
+ const checker = program.getTypeChecker();
48
+ const allClasses: DocOutput['classes'] = [];
49
+ const allInterfaces: DocOutput['interfaces'] = [];
50
+ const allEnums: DocOutput['enums'] = [];
51
+
52
+ const seenClasses = new Set<string>();
53
+ const seenInterfaces = new Set<string>();
54
+ const seenEnums = new Set<string>();
55
+
56
+ const visitOptions = repoRoot ? { repoRoot } : undefined;
57
+
58
+ for (const sourceFile of program.getSourceFiles()) {
59
+ const filePath = sourceFile.fileName;
60
+ if (filePath.includes('node_modules')) continue;
61
+ if (!filePath.includes(rootPath)) continue;
62
+
63
+ const result = visitSourceFile(checker, sourceFile, visitOptions);
64
+ for (const c of result.classes) {
65
+ if (!seenClasses.has(c.name)) {
66
+ seenClasses.add(c.name);
67
+ allClasses.push(c);
68
+ }
69
+ }
70
+ for (const i of result.interfaces) {
71
+ if (!seenInterfaces.has(i.name)) {
72
+ seenInterfaces.add(i.name);
73
+ allInterfaces.push(i);
74
+ }
75
+ }
76
+ for (const e of result.enums) {
77
+ if (!seenEnums.has(e.name)) {
78
+ seenEnums.add(e.name);
79
+ allEnums.push(e);
80
+ }
81
+ }
82
+ }
83
+
84
+ allClasses.sort((a, b) => a.name.localeCompare(b.name));
85
+ allInterfaces.sort((a, b) => a.name.localeCompare(b.name));
86
+ allEnums.sort((a, b) => a.name.localeCompare(b.name));
87
+
88
+ const output: DocOutput = {
89
+ meta: {
90
+ generator: 'fluxer-docgen',
91
+ version: '1',
92
+ date: Date.now(),
93
+ },
94
+ package: packageName,
95
+ classes: allClasses,
96
+ interfaces: allInterfaces,
97
+ enums: allEnums,
98
+ };
99
+
100
+ mkdirSync(dirname(outFile), { recursive: true });
101
+ writeFileSync(outFile, JSON.stringify(output, null, 2), 'utf-8');
102
+ return output;
103
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Output schema for the custom doc generator.
3
+ */
4
+
5
+ export interface DocMeta {
6
+ generator: string;
7
+ version: string;
8
+ date: number;
9
+ }
10
+
11
+ export interface DocParam {
12
+ name: string;
13
+ type: string;
14
+ optional?: boolean;
15
+ description?: string;
16
+ }
17
+
18
+ export interface DocConstructor {
19
+ params: DocParam[];
20
+ description?: string;
21
+ examples?: string[];
22
+ }
23
+
24
+ export interface DocProperty {
25
+ name: string;
26
+ type: string;
27
+ readonly?: boolean;
28
+ description?: string;
29
+ examples?: string[];
30
+ optional?: boolean;
31
+ /** Discord.js compatible: string = link to d.js docs, true = no link */
32
+ discordJsCompat?: boolean | string;
33
+ }
34
+
35
+ export interface DocMethod {
36
+ name: string;
37
+ params: DocParam[];
38
+ returns: string;
39
+ description?: string;
40
+ examples?: string[];
41
+ async?: boolean;
42
+ deprecated?: boolean | string;
43
+ /** Discord.js compatible: string = link to d.js docs, true = no link */
44
+ discordJsCompat?: boolean | string;
45
+ source?: DocSource;
46
+ }
47
+
48
+ export interface DocSource {
49
+ file: string;
50
+ line: number;
51
+ /** Path relative to repo root, e.g. packages/fluxer-core/src/Client.ts */
52
+ path?: string;
53
+ }
54
+
55
+ export interface DocClass {
56
+ name: string;
57
+ description?: string;
58
+ extends?: string;
59
+ constructor?: DocConstructor;
60
+ properties: DocProperty[];
61
+ methods: DocMethod[];
62
+ source?: DocSource;
63
+ deprecated?: boolean | string;
64
+ /** Discord.js compatible: string = link to d.js docs, true = no link */
65
+ discordJsCompat?: boolean | string;
66
+ }
67
+
68
+ export interface DocInterfaceProperty {
69
+ name: string;
70
+ type: string;
71
+ optional?: boolean;
72
+ description?: string;
73
+ }
74
+
75
+ export interface DocInterface {
76
+ name: string;
77
+ description?: string;
78
+ properties: DocInterfaceProperty[];
79
+ source?: DocSource;
80
+ }
81
+
82
+ export interface DocEnumMember {
83
+ name: string;
84
+ value: string | number;
85
+ }
86
+
87
+ export interface DocEnum {
88
+ name: string;
89
+ description?: string;
90
+ members: DocEnumMember[];
91
+ source?: DocSource;
92
+ }
93
+
94
+ export interface DocOutput {
95
+ meta: DocMeta;
96
+ package: string;
97
+ classes: DocClass[];
98
+ interfaces: DocInterface[];
99
+ enums: DocEnum[];
100
+ }
@@ -0,0 +1,147 @@
1
+ import * as ts from 'typescript';
2
+ import { relative } from 'path';
3
+ import { DocClass, DocInterface, DocEnum, DocSource } from './schema.js';
4
+ import {
5
+ extractConstructor,
6
+ extractProperty,
7
+ extractMethod,
8
+ extractGetterProperty,
9
+ extractInterfaceProperty,
10
+ extractEnumMember,
11
+ getDescriptionFromJSDocComment,
12
+ getDeprecatedFromJSDoc,
13
+ getDiscordJsCompatFromJSDoc,
14
+ } from './extract.js';
15
+
16
+ function getJSDoc(node: ts.Node): string {
17
+ const sourceFile = node.getSourceFile();
18
+ const text = sourceFile.getFullText();
19
+ const commentRanges = ts.getLeadingCommentRanges(text, node.getFullStart());
20
+ if (!commentRanges?.length) return '';
21
+ const range = commentRanges[commentRanges.length - 1];
22
+ return text.slice(range.pos, range.end);
23
+ }
24
+
25
+ function getSource(node: ts.Node, repoRoot?: string): DocSource {
26
+ const sourceFile = node.getSourceFile();
27
+ const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
28
+ const fileName = sourceFile.fileName.split(/[/\\]/).pop() ?? '';
29
+ const result: DocSource = { file: fileName, line: line + 1 };
30
+ if (repoRoot) {
31
+ const rel = relative(repoRoot, sourceFile.fileName);
32
+ result.path = rel.replace(/\\/g, '/');
33
+ }
34
+ return result;
35
+ }
36
+
37
+ function isExported(node: ts.Node): boolean {
38
+ return !!(
39
+ ts.getCombinedModifierFlags(node as ts.Declaration) & ts.ModifierFlags.Export ||
40
+ (node.parent &&
41
+ ts.isSourceFile(node.parent) &&
42
+ (node as ts.Declaration).modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword))
43
+ );
44
+ }
45
+
46
+ export function visitSourceFile(
47
+ checker: ts.TypeChecker,
48
+ sourceFile: ts.SourceFile,
49
+ options?: { repoRoot: string },
50
+ ): { classes: DocClass[]; interfaces: DocInterface[]; enums: DocEnum[] } {
51
+ const classes: DocClass[] = [];
52
+ const interfaces: DocInterface[] = [];
53
+ const enums: DocEnum[] = [];
54
+
55
+ function visit(node: ts.Node) {
56
+ if (ts.isClassDeclaration(node)) {
57
+ const name = node.name?.getText();
58
+ if (name && isExported(node)) {
59
+ const comment = getJSDoc(node);
60
+ const docClass: DocClass = {
61
+ name,
62
+ description: getDescriptionFromJSDocComment(comment) || undefined,
63
+ extends: node.heritageClauses
64
+ ?.find((c) => c.token === ts.SyntaxKind.ExtendsKeyword)
65
+ ?.types?.[0]?.expression?.getText(),
66
+ constructor: undefined,
67
+ properties: [],
68
+ methods: [],
69
+ source: getSource(node, options?.repoRoot),
70
+ deprecated: getDeprecatedFromJSDoc(comment),
71
+ discordJsCompat: getDiscordJsCompatFromJSDoc(comment),
72
+ };
73
+
74
+ for (const member of node.members) {
75
+ if (ts.isConstructorDeclaration(member)) {
76
+ docClass.constructor = extractConstructor(checker, member);
77
+ } else if (ts.isPropertyDeclaration(member)) {
78
+ const prop = extractProperty(checker, member);
79
+ if (prop) docClass.properties.push(prop);
80
+ } else if (ts.isGetAccessor(member)) {
81
+ const prop = extractGetterProperty(checker, member);
82
+ if (prop) docClass.properties.push(prop);
83
+ } else if (ts.isSetAccessor(member)) {
84
+ // Setters are not documented as separate properties
85
+ } else if (ts.isMethodDeclaration(member)) {
86
+ const method = extractMethod(checker, member);
87
+ if (method) docClass.methods.push(method);
88
+ }
89
+ }
90
+
91
+ docClass.properties.sort((a, b) => a.name.localeCompare(b.name));
92
+ docClass.methods.sort((a, b) => a.name.localeCompare(b.name));
93
+ classes.push(docClass);
94
+ }
95
+ } else if (ts.isInterfaceDeclaration(node)) {
96
+ const name = node.name.getText();
97
+ if (isExported(node)) {
98
+ const comment = getJSDoc(node);
99
+ const docInterface: DocInterface = {
100
+ name,
101
+ description: getDescriptionFromJSDocComment(comment) || undefined,
102
+ properties: [],
103
+ source: getSource(node, options?.repoRoot),
104
+ };
105
+
106
+ for (const member of node.members) {
107
+ if (ts.isPropertySignature(member)) {
108
+ const prop = extractInterfaceProperty(checker, member);
109
+ if (prop) docInterface.properties.push(prop);
110
+ }
111
+ }
112
+
113
+ docInterface.properties.sort((a, b) => a.name.localeCompare(b.name));
114
+ interfaces.push(docInterface);
115
+ }
116
+ } else if (ts.isEnumDeclaration(node)) {
117
+ const name = node.name.getText();
118
+ if (isExported(node)) {
119
+ const comment = getJSDoc(node);
120
+ const docEnum: DocEnum = {
121
+ name,
122
+ description: getDescriptionFromJSDocComment(comment) || undefined,
123
+ members: node.members.map(extractEnumMember),
124
+ source: getSource(node, options?.repoRoot),
125
+ };
126
+ enums.push(docEnum);
127
+ }
128
+ } else if (ts.isTypeAliasDeclaration(node)) {
129
+ const name = node.name.getText();
130
+ if (isExported(node)) {
131
+ const comment = getJSDoc(node);
132
+ const docInterface: DocInterface = {
133
+ name,
134
+ description: getDescriptionFromJSDocComment(comment) || undefined,
135
+ properties: [],
136
+ source: getSource(node, options?.repoRoot),
137
+ };
138
+ interfaces.push(docInterface);
139
+ }
140
+ }
141
+
142
+ ts.forEachChild(node, visit);
143
+ }
144
+
145
+ visit(sourceFile);
146
+ return { classes, interfaces, enums };
147
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "noEmit": false
7
+ },
8
+ "include": ["src/**/*"]
9
+ }
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from 'tsup';
2
+
3
+ export default defineConfig({
4
+ entry: ['src/index.ts'],
5
+ format: ['cjs', 'esm'],
6
+ dts: true,
7
+ splitting: false,
8
+ clean: true,
9
+ });
@@ -0,0 +1,26 @@
1
+ # @erinjs/core
2
+
3
+ Main client for the Fluxer bot SDK.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @erinjs/core
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```javascript
14
+ import { Client, Events } from '@erinjs/core';
15
+
16
+ const client = new Client({ intents: 0 });
17
+
18
+ client.on(Events.Ready, () => console.log('Ready'));
19
+ client.on(Events.MessageCreate, async (m) => {
20
+ if (m.content === '!ping') await m.reply('Pong');
21
+ });
22
+
23
+ await client.login(process.env.FLUXER_BOT_TOKEN);
24
+ ```
25
+
26
+ For voice, add `@erinjs/voice`. For embeds, use `EmbedBuilder`.