@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.
- package/core/.changeset/README.md +8 -0
- package/core/.changeset/community-bootstrap-release.md +17 -0
- package/core/.changeset/config.json +11 -0
- package/core/.changeset/no-changelog.js +16 -0
- package/core/.changeset/pre.json +17 -0
- package/core/.editorconfig +13 -0
- package/core/.gitattributes +2 -0
- package/core/.github/CODE_OF_CONDUCT.md +23 -0
- package/core/.github/FUNDING.yml +7 -0
- package/core/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
- package/core/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- package/core/.github/PULL_REQUEST_TEMPLATE.md +16 -0
- package/core/.github/dependabot.yml +16 -0
- package/core/.github/workflows/autoapp.yml +16 -0
- package/core/.github/workflows/ci.yml +187 -0
- package/core/.github/workflows/codeql.yml +30 -0
- package/core/.github/workflows/deploy-docs.yml +54 -0
- package/core/.github/workflows/publish.yml +43 -0
- package/core/.lintstagedrc.json +4 -0
- package/core/.nvmrc +1 -0
- package/core/.prettierignore +8 -0
- package/core/.prettierrc +11 -0
- package/core/CONTRIBUTING.md +70 -0
- package/core/LICENSE +203 -0
- package/core/README.md +61 -0
- package/core/SECURITY.md +21 -0
- package/core/apps/docs/index.html +28 -0
- package/core/apps/docs/middleware.ts +21 -0
- package/core/apps/docs/package.json +33 -0
- package/core/apps/docs/public/@flux.png +0 -0
- package/core/apps/docs/public/docs/latest/guides.json +1420 -0
- package/core/apps/docs/public/docs/latest/main.json +14981 -0
- package/core/apps/docs/public/docs/latest/rag-index.json +1 -0
- package/core/apps/docs/public/docs/v1.0.5/guides.json +226 -0
- package/core/apps/docs/public/docs/v1.0.5/main.json +7920 -0
- package/core/apps/docs/public/docs/v1.0.6/guides.json +226 -0
- package/core/apps/docs/public/docs/v1.0.6/main.json +7920 -0
- package/core/apps/docs/public/docs/v1.0.7/guides.json +259 -0
- package/core/apps/docs/public/docs/v1.0.7/main.json +8652 -0
- package/core/apps/docs/public/docs/v1.0.8/guides.json +313 -0
- package/core/apps/docs/public/docs/v1.0.8/main.json +9618 -0
- package/core/apps/docs/public/docs/v1.0.9/guides.json +319 -0
- package/core/apps/docs/public/docs/v1.0.9/main.json +10694 -0
- package/core/apps/docs/public/docs/v1.1.0/guides.json +589 -0
- package/core/apps/docs/public/docs/v1.1.0/main.json +12576 -0
- package/core/apps/docs/public/docs/v1.1.2/guides.json +650 -0
- package/core/apps/docs/public/docs/v1.1.2/main.json +13239 -0
- package/core/apps/docs/public/docs/v1.1.3/guides.json +650 -0
- package/core/apps/docs/public/docs/v1.1.3/main.json +13239 -0
- package/core/apps/docs/public/docs/v1.1.4/guides.json +708 -0
- package/core/apps/docs/public/docs/v1.1.4/main.json +13231 -0
- package/core/apps/docs/public/docs/v1.1.5/guides.json +1035 -0
- package/core/apps/docs/public/docs/v1.1.5/main.json +13838 -0
- package/core/apps/docs/public/docs/v1.1.6/guides.json +1041 -0
- package/core/apps/docs/public/docs/v1.1.6/main.json +14313 -0
- package/core/apps/docs/public/docs/v1.1.8/guides.json +1047 -0
- package/core/apps/docs/public/docs/v1.1.8/main.json +14421 -0
- package/core/apps/docs/public/docs/v1.1.9/guides.json +1047 -0
- package/core/apps/docs/public/docs/v1.1.9/main.json +14421 -0
- package/core/apps/docs/public/docs/v1.2.0/guides.json +1212 -0
- package/core/apps/docs/public/docs/v1.2.0/main.json +14663 -0
- package/core/apps/docs/public/docs/v1.2.1/guides.json +1293 -0
- package/core/apps/docs/public/docs/v1.2.1/main.json +14828 -0
- package/core/apps/docs/public/docs/v1.2.2/guides.json +1293 -0
- package/core/apps/docs/public/docs/v1.2.2/main.json +15025 -0
- package/core/apps/docs/public/docs/v1.2.3/guides.json +1420 -0
- package/core/apps/docs/public/docs/v1.2.3/main.json +14954 -0
- package/core/apps/docs/public/docs/v1.2.4/guides.json +1420 -0
- package/core/apps/docs/public/docs/v1.2.4/main.json +14981 -0
- package/core/apps/docs/public/docs/versions.json +24 -0
- package/core/apps/docs/public/flux.png +0 -0
- package/core/apps/docs/public/locales/en.json +50 -0
- package/core/apps/docs/public/locales/guides-en.json +512 -0
- package/core/apps/docs/public/robots.txt +4 -0
- package/core/apps/docs/public/sitemap.xml +33 -0
- package/core/apps/docs/src/App.vue +538 -0
- package/core/apps/docs/src/components/ApiCategorySection.vue +42 -0
- package/core/apps/docs/src/components/ApiDiscordCompat.vue +65 -0
- package/core/apps/docs/src/components/ApiEndpointCard.vue +313 -0
- package/core/apps/docs/src/components/ApiSchemaBlock.vue +131 -0
- package/core/apps/docs/src/components/CodeBlock.vue +177 -0
- package/core/apps/docs/src/components/CommunityCallout.vue +90 -0
- package/core/apps/docs/src/components/ConstructorSection.vue +82 -0
- package/core/apps/docs/src/components/DocDescription.vue +40 -0
- package/core/apps/docs/src/components/FluxerLogo.vue +3 -0
- package/core/apps/docs/src/components/Footer.vue +106 -0
- package/core/apps/docs/src/components/GuideCodeBlock.vue +102 -0
- package/core/apps/docs/src/components/GuideDiscordCompat.vue +77 -0
- package/core/apps/docs/src/components/GuideDiscordCompatCallout.vue +83 -0
- package/core/apps/docs/src/components/GuideTable.vue +77 -0
- package/core/apps/docs/src/components/GuideTip.vue +38 -0
- package/core/apps/docs/src/components/MethodsSection.vue +195 -0
- package/core/apps/docs/src/components/ParamsTable.vue +70 -0
- package/core/apps/docs/src/components/PropertiesSection.vue +143 -0
- package/core/apps/docs/src/components/SearchBar.vue +76 -0
- package/core/apps/docs/src/components/SearchModal.vue +361 -0
- package/core/apps/docs/src/components/SidebarNav.vue +225 -0
- package/core/apps/docs/src/components/SponsorBanner.vue +153 -0
- package/core/apps/docs/src/components/TypeSignature.vue +187 -0
- package/core/apps/docs/src/components/VersionPicker.vue +191 -0
- package/core/apps/docs/src/composables/useSearchIndex.ts +144 -0
- package/core/apps/docs/src/composables/useVersionedPath.ts +20 -0
- package/core/apps/docs/src/data/apiEndpoints.ts +1073 -0
- package/core/apps/docs/src/data/changelog.ts +717 -0
- package/core/apps/docs/src/data/guides.ts +2362 -0
- package/core/apps/docs/src/env.d.ts +7 -0
- package/core/apps/docs/src/locales/guides-en.json +512 -0
- package/core/apps/docs/src/main.ts +27 -0
- package/core/apps/docs/src/pages/ApiReferenceLayout.vue +175 -0
- package/core/apps/docs/src/pages/ApiReferencePage.vue +128 -0
- package/core/apps/docs/src/pages/Changelog.vue +288 -0
- package/core/apps/docs/src/pages/ClassPage.vue +319 -0
- package/core/apps/docs/src/pages/ClassesList.vue +100 -0
- package/core/apps/docs/src/pages/DocsLayout.vue +127 -0
- package/core/apps/docs/src/pages/GuidePage.vue +279 -0
- package/core/apps/docs/src/pages/GuidesIndex.vue +166 -0
- package/core/apps/docs/src/pages/GuidesLayout.vue +245 -0
- package/core/apps/docs/src/pages/Home.vue +125 -0
- package/core/apps/docs/src/pages/NotFound.vue +57 -0
- package/core/apps/docs/src/pages/TypedefPage.vue +230 -0
- package/core/apps/docs/src/pages/TypedefsList.vue +168 -0
- package/core/apps/docs/src/pages/VersionLayout.vue +15 -0
- package/core/apps/docs/src/router.ts +73 -0
- package/core/apps/docs/src/stores/docs.ts +54 -0
- package/core/apps/docs/src/stores/guides.ts +53 -0
- package/core/apps/docs/src/stores/version.ts +67 -0
- package/core/apps/docs/src/styles/main.css +278 -0
- package/core/apps/docs/src/styles/prism.css +95 -0
- package/core/apps/docs/src/types/doc-schema.ts +112 -0
- package/core/apps/docs/tsconfig.json +17 -0
- package/core/apps/docs/tsconfig.node.json +10 -0
- package/core/apps/docs/vite.config.d.ts +2 -0
- package/core/apps/docs/vite.config.js +26 -0
- package/core/apps/docs/vite.config.ts +28 -0
- package/core/apps/docs-vitepress/.vitepress/config.ts +141 -0
- package/core/apps/docs-vitepress/api-data/latest/main.json +15035 -0
- package/core/apps/docs-vitepress/api-data/v1.2.4/main.json +15035 -0
- package/core/apps/docs-vitepress/api-data/versions.json +6 -0
- package/core/apps/docs-vitepress/index.md +15 -0
- package/core/apps/docs-vitepress/package-lock.json +2924 -0
- package/core/apps/docs-vitepress/package.json +20 -0
- package/core/apps/docs-vitepress/public/CNAME +1 -0
- package/core/apps/docs-vitepress/scripts/generate-api.ts +243 -0
- package/core/apps/docs-vitepress/scripts/migrate-guides.ts +129 -0
- package/core/apps/docs-vitepress/tsconfig.json +11 -0
- package/core/apps/docs-vitepress/v/latest/guides/attachments-by-url.md +57 -0
- package/core/apps/docs-vitepress/v/latest/guides/attachments.md +62 -0
- package/core/apps/docs-vitepress/v/latest/guides/basic-bot.md +49 -0
- package/core/apps/docs-vitepress/v/latest/guides/channels.md +180 -0
- package/core/apps/docs-vitepress/v/latest/guides/deprecated-apis.md +58 -0
- package/core/apps/docs-vitepress/v/latest/guides/discord-js-compatibility.md +42 -0
- package/core/apps/docs-vitepress/v/latest/guides/editing-embeds.md +65 -0
- package/core/apps/docs-vitepress/v/latest/guides/embed-media.md +87 -0
- package/core/apps/docs-vitepress/v/latest/guides/embeds.md +166 -0
- package/core/apps/docs-vitepress/v/latest/guides/emojis.md +77 -0
- package/core/apps/docs-vitepress/v/latest/guides/events.md +202 -0
- package/core/apps/docs-vitepress/v/latest/guides/gifs.md +47 -0
- package/core/apps/docs-vitepress/v/latest/guides/installation.md +10 -0
- package/core/apps/docs-vitepress/v/latest/guides/moderation.md +89 -0
- package/core/apps/docs-vitepress/v/latest/guides/permissions.md +130 -0
- package/core/apps/docs-vitepress/v/latest/guides/prefix-commands.md +41 -0
- package/core/apps/docs-vitepress/v/latest/guides/profile-urls.md +58 -0
- package/core/apps/docs-vitepress/v/latest/guides/reactions.md +69 -0
- package/core/apps/docs-vitepress/v/latest/guides/roles.md +130 -0
- package/core/apps/docs-vitepress/v/latest/guides/sending-without-reply.md +172 -0
- package/core/apps/docs-vitepress/v/latest/guides/voice.md +109 -0
- package/core/apps/docs-vitepress/v/latest/guides/wait-for-guilds.md +37 -0
- package/core/apps/docs-vitepress/v/latest/guides/webhook-attachments-embeds.md +73 -0
- package/core/apps/docs-vitepress/v/latest/guides/webhooks.md +131 -0
- package/core/eslint.config.js +80 -0
- package/core/examples/.env.example +22 -0
- package/core/examples/README.md +68 -0
- package/core/examples/first-steps-bot.js +118 -0
- package/core/examples/minimal-bot.js +17 -0
- package/core/examples/moderation-bot.js +209 -0
- package/core/examples/package.json +14 -0
- package/core/examples/ping-bot.js +1146 -0
- package/core/examples/reaction-bot.js +70 -0
- package/core/examples/reaction-roles-bot.js +140 -0
- package/core/examples/webhook-bot.js +239 -0
- package/core/flux.png +0 -0
- package/core/package.json +78 -0
- package/core/packages/builders/package.json +51 -0
- package/core/packages/builders/src/index.ts +13 -0
- package/core/packages/builders/src/messages/AttachmentBuilder.test.ts +79 -0
- package/core/packages/builders/src/messages/AttachmentBuilder.ts +69 -0
- package/core/packages/builders/src/messages/EmbedBuilder.test.ts +266 -0
- package/core/packages/builders/src/messages/EmbedBuilder.ts +239 -0
- package/core/packages/builders/src/messages/MessagePayload.test.ts +118 -0
- package/core/packages/builders/src/messages/MessagePayload.ts +122 -0
- package/core/packages/builders/tsconfig.json +9 -0
- package/core/packages/builders/tsup.config.ts +9 -0
- package/core/packages/builders/vitest.config.ts +9 -0
- package/core/packages/collection/package.json +47 -0
- package/core/packages/collection/src/Collection.test.ts +232 -0
- package/core/packages/collection/src/Collection.ts +196 -0
- package/core/packages/collection/src/index.ts +1 -0
- package/core/packages/collection/tsconfig.json +9 -0
- package/core/packages/collection/tsup.config.ts +9 -0
- package/core/packages/collection/vitest.config.ts +9 -0
- package/core/packages/docgen/package.json +26 -0
- package/core/packages/docgen/src/extract.ts +262 -0
- package/core/packages/docgen/src/formatType.ts +24 -0
- package/core/packages/docgen/src/index.ts +103 -0
- package/core/packages/docgen/src/schema.ts +100 -0
- package/core/packages/docgen/src/visitor.ts +147 -0
- package/core/packages/docgen/tsconfig.json +9 -0
- package/core/packages/docgen/tsup.config.ts +9 -0
- package/core/packages/fluxer-core/README.md +26 -0
- package/core/packages/fluxer-core/package.json +60 -0
- package/core/packages/fluxer-core/src/client/ChannelManager.ts +143 -0
- package/core/packages/fluxer-core/src/client/Client.gateway.test.ts +84 -0
- package/core/packages/fluxer-core/src/client/Client.resolveEmoji.test.ts +45 -0
- package/core/packages/fluxer-core/src/client/Client.ts +558 -0
- package/core/packages/fluxer-core/src/client/ClientUser.ts +40 -0
- package/core/packages/fluxer-core/src/client/EventHandlerRegistry.ts +469 -0
- package/core/packages/fluxer-core/src/client/GuildManager.ts +79 -0
- package/core/packages/fluxer-core/src/client/GuildMemberManager.ts +91 -0
- package/core/packages/fluxer-core/src/client/MessageManager.ts +58 -0
- package/core/packages/fluxer-core/src/client/UsersManager.ts +122 -0
- package/core/packages/fluxer-core/src/errors/ErrorCodes.test.ts +19 -0
- package/core/packages/fluxer-core/src/errors/ErrorCodes.ts +12 -0
- package/core/packages/fluxer-core/src/errors/FluxerError.test.ts +32 -0
- package/core/packages/fluxer-core/src/errors/FluxerError.ts +15 -0
- package/core/packages/fluxer-core/src/index.ts +85 -0
- package/core/packages/fluxer-core/src/structures/Base.ts +7 -0
- package/core/packages/fluxer-core/src/structures/Channel.ts +508 -0
- package/core/packages/fluxer-core/src/structures/Guild.test.ts +189 -0
- package/core/packages/fluxer-core/src/structures/Guild.ts +734 -0
- package/core/packages/fluxer-core/src/structures/GuildBan.ts +35 -0
- package/core/packages/fluxer-core/src/structures/GuildEmoji.ts +57 -0
- package/core/packages/fluxer-core/src/structures/GuildMember.test.ts +203 -0
- package/core/packages/fluxer-core/src/structures/GuildMember.ts +213 -0
- package/core/packages/fluxer-core/src/structures/GuildMemberRoleManager.ts +121 -0
- package/core/packages/fluxer-core/src/structures/GuildSticker.ts +56 -0
- package/core/packages/fluxer-core/src/structures/Invite.test.ts +103 -0
- package/core/packages/fluxer-core/src/structures/Invite.ts +121 -0
- package/core/packages/fluxer-core/src/structures/Message.test.ts +109 -0
- package/core/packages/fluxer-core/src/structures/Message.ts +397 -0
- package/core/packages/fluxer-core/src/structures/MessageReaction.ts +72 -0
- package/core/packages/fluxer-core/src/structures/PartialMessage.ts +12 -0
- package/core/packages/fluxer-core/src/structures/Role.test.ts +77 -0
- package/core/packages/fluxer-core/src/structures/Role.ts +112 -0
- package/core/packages/fluxer-core/src/structures/User.test.ts +110 -0
- package/core/packages/fluxer-core/src/structures/User.ts +109 -0
- package/core/packages/fluxer-core/src/structures/Webhook.test.ts +109 -0
- package/core/packages/fluxer-core/src/structures/Webhook.ts +258 -0
- package/core/packages/fluxer-core/src/util/Constants.test.ts +16 -0
- package/core/packages/fluxer-core/src/util/Constants.ts +7 -0
- package/core/packages/fluxer-core/src/util/Events.ts +46 -0
- package/core/packages/fluxer-core/src/util/MessageCollector.ts +87 -0
- package/core/packages/fluxer-core/src/util/Options.ts +33 -0
- package/core/packages/fluxer-core/src/util/ReactionCollector.ts +116 -0
- package/core/packages/fluxer-core/src/util/cdn.test.ts +108 -0
- package/core/packages/fluxer-core/src/util/cdn.ts +130 -0
- package/core/packages/fluxer-core/src/util/guildUtils.ts +33 -0
- package/core/packages/fluxer-core/src/util/messageUtils.test.ts +74 -0
- package/core/packages/fluxer-core/src/util/messageUtils.ts +119 -0
- package/core/packages/fluxer-core/src/util/permissions.test.ts +95 -0
- package/core/packages/fluxer-core/src/util/permissions.ts +43 -0
- package/core/packages/fluxer-core/tsconfig.json +9 -0
- package/core/packages/fluxer-core/tsup.config.ts +9 -0
- package/core/packages/fluxer-core/vitest.config.ts +9 -0
- package/core/packages/rest/package.json +52 -0
- package/core/packages/rest/src/REST.test.ts +64 -0
- package/core/packages/rest/src/REST.ts +90 -0
- package/core/packages/rest/src/RateLimitManager.test.ts +71 -0
- package/core/packages/rest/src/RateLimitManager.ts +60 -0
- package/core/packages/rest/src/RequestManager.test.ts +87 -0
- package/core/packages/rest/src/RequestManager.ts +172 -0
- package/core/packages/rest/src/errors/FluxerAPIError.test.ts +57 -0
- package/core/packages/rest/src/errors/FluxerAPIError.ts +21 -0
- package/core/packages/rest/src/errors/HTTPError.test.ts +55 -0
- package/core/packages/rest/src/errors/HTTPError.ts +25 -0
- package/core/packages/rest/src/errors/RateLimitError.test.ts +41 -0
- package/core/packages/rest/src/errors/RateLimitError.ts +15 -0
- package/core/packages/rest/src/errors/index.ts +3 -0
- package/core/packages/rest/src/index.ts +6 -0
- package/core/packages/rest/src/utils/constants.test.ts +31 -0
- package/core/packages/rest/src/utils/constants.ts +5 -0
- package/core/packages/rest/src/utils/files.test.ts +37 -0
- package/core/packages/rest/src/utils/files.ts +75 -0
- package/core/packages/rest/tsconfig.json +9 -0
- package/core/packages/rest/tsup.config.ts +9 -0
- package/core/packages/rest/vitest.config.ts +9 -0
- package/core/packages/types/package.json +46 -0
- package/core/packages/types/src/api/ban.ts +8 -0
- package/core/packages/types/src/api/channel.ts +65 -0
- package/core/packages/types/src/api/embed.ts +82 -0
- package/core/packages/types/src/api/emoji.ts +12 -0
- package/core/packages/types/src/api/errors.ts +68 -0
- package/core/packages/types/src/api/gateway.ts +14 -0
- package/core/packages/types/src/api/guild.ts +123 -0
- package/core/packages/types/src/api/index.ts +15 -0
- package/core/packages/types/src/api/instance.ts +32 -0
- package/core/packages/types/src/api/interaction.ts +26 -0
- package/core/packages/types/src/api/invite.ts +28 -0
- package/core/packages/types/src/api/message.ts +140 -0
- package/core/packages/types/src/api/role.ts +41 -0
- package/core/packages/types/src/api/sticker.ts +14 -0
- package/core/packages/types/src/api/user.ts +79 -0
- package/core/packages/types/src/api/webhook.ts +41 -0
- package/core/packages/types/src/common/index.ts +1 -0
- package/core/packages/types/src/common/snowflake.test.ts +9 -0
- package/core/packages/types/src/common/snowflake.ts +8 -0
- package/core/packages/types/src/gateway/events.ts +189 -0
- package/core/packages/types/src/gateway/index.ts +3 -0
- package/core/packages/types/src/gateway/opcodes.ts +17 -0
- package/core/packages/types/src/gateway/payloads.ts +481 -0
- package/core/packages/types/src/index.ts +4 -0
- package/core/packages/types/src/rest/index.ts +1 -0
- package/core/packages/types/src/rest/routes.test.ts +169 -0
- package/core/packages/types/src/rest/routes.ts +109 -0
- package/core/packages/types/tsconfig.json +9 -0
- package/core/packages/types/tsup.config.ts +9 -0
- package/core/packages/types/vitest.config.ts +9 -0
- package/core/packages/util/package.json +51 -0
- package/core/packages/util/src/BitField.test.ts +96 -0
- package/core/packages/util/src/BitField.ts +105 -0
- package/core/packages/util/src/MessageFlagsBitField.test.ts +42 -0
- package/core/packages/util/src/MessageFlagsBitField.ts +20 -0
- package/core/packages/util/src/PermissionsBitField.test.ts +79 -0
- package/core/packages/util/src/PermissionsBitField.ts +97 -0
- package/core/packages/util/src/SnowflakeUtil.test.ts +69 -0
- package/core/packages/util/src/SnowflakeUtil.ts +65 -0
- package/core/packages/util/src/UserFlagsBitField.test.ts +39 -0
- package/core/packages/util/src/UserFlagsBitField.ts +48 -0
- package/core/packages/util/src/deprecation.test.ts +44 -0
- package/core/packages/util/src/deprecation.ts +28 -0
- package/core/packages/util/src/emojiShortcodes.generated.ts +5 -0
- package/core/packages/util/src/emojiShortcodes.test.ts +41 -0
- package/core/packages/util/src/emojiShortcodes.ts +22 -0
- package/core/packages/util/src/formatters.test.ts +65 -0
- package/core/packages/util/src/formatters.ts +35 -0
- package/core/packages/util/src/index.ts +34 -0
- package/core/packages/util/src/resolvers.test.ts +198 -0
- package/core/packages/util/src/resolvers.ts +127 -0
- package/core/packages/util/src/tenorUtils.test.ts +75 -0
- package/core/packages/util/src/tenorUtils.ts +86 -0
- package/core/packages/util/tsconfig.json +9 -0
- package/core/packages/util/tsup.config.ts +9 -0
- package/core/packages/util/vitest.config.ts +9 -0
- package/core/packages/voice/README.md +42 -0
- package/core/packages/voice/package.json +67 -0
- package/core/packages/voice/src/LiveKitRtcConnection.receive.test.ts +24 -0
- package/core/packages/voice/src/LiveKitRtcConnection.ts +1767 -0
- package/core/packages/voice/src/VoiceConnection.ts +413 -0
- package/core/packages/voice/src/VoiceManager.receive.test.ts +61 -0
- package/core/packages/voice/src/VoiceManager.test.ts +44 -0
- package/core/packages/voice/src/VoiceManager.ts +503 -0
- package/core/packages/voice/src/exports.test.ts +38 -0
- package/core/packages/voice/src/index.ts +51 -0
- package/core/packages/voice/src/livekit.test.ts +48 -0
- package/core/packages/voice/src/livekit.ts +33 -0
- package/core/packages/voice/src/mp4box.d.ts +32 -0
- package/core/packages/voice/src/opusUtils.test.ts +29 -0
- package/core/packages/voice/src/opusUtils.ts +86 -0
- package/core/packages/voice/src/streamPreviewPlaceholder.test.ts +16 -0
- package/core/packages/voice/src/streamPreviewPlaceholder.ts +8 -0
- package/core/packages/voice/src/ws.d.ts +1 -0
- package/core/packages/voice/tsconfig.json +5 -0
- package/core/packages/voice/tsup.config.ts +10 -0
- package/core/packages/voice/vitest.config.ts +9 -0
- package/core/packages/ws/package.json +52 -0
- package/core/packages/ws/src/WebSocketManager.ts +130 -0
- package/core/packages/ws/src/WebSocketShard.ts +296 -0
- package/core/packages/ws/src/index.ts +12 -0
- package/core/packages/ws/src/utils/constants.test.ts +46 -0
- package/core/packages/ws/src/utils/constants.ts +22 -0
- package/core/packages/ws/src/utils/getWebSocket.ts +55 -0
- package/core/packages/ws/src/ws.d.ts +10 -0
- package/core/packages/ws/tsconfig.json +9 -0
- package/core/packages/ws/tsup.config.ts +9 -0
- package/core/pnpm-lock.yaml +7033 -0
- package/core/pnpm-workspace.yaml +4 -0
- package/core/scripts/generate-ai-rag.ts +240 -0
- package/core/scripts/generate-docs.ts +143 -0
- package/core/scripts/generate-emoji-shortcodes.ts +58 -0
- package/core/scripts/generate-types.ts +6 -0
- package/core/scripts/publish-ordered.js +63 -0
- package/core/scripts/test-cjs-require.mjs +43 -0
- package/core/scripts/test-esm-imports.mjs +42 -0
- package/core/scripts/test-package-exports.mjs +98 -0
- package/core/scripts/test-smoke.mjs +103 -0
- package/core/tsconfig.json +18 -0
- package/core/turbo.json +30 -0
- package/core/vitest.config.ts +17 -0
- package/core/wrangler.jsonc +9 -0
- package/package.json +26 -0
|
@@ -0,0 +1,717 @@
|
|
|
1
|
+
export interface ChangelogSection {
|
|
2
|
+
title: string;
|
|
3
|
+
items: string[];
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface ChangelogEntry {
|
|
7
|
+
version: string;
|
|
8
|
+
date: string;
|
|
9
|
+
sections: ChangelogSection[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const changelogEntries: ChangelogEntry[] = [
|
|
13
|
+
{
|
|
14
|
+
version: '1.2.4',
|
|
15
|
+
date: '2026-03-19',
|
|
16
|
+
sections: [
|
|
17
|
+
{
|
|
18
|
+
title: '@erinjs/core — waitForGuilds fix',
|
|
19
|
+
items: [
|
|
20
|
+
'Fixed waitForGuilds: true — Ready event now receives populated client.guilds when the gateway sends READY with an empty guilds array and guilds via GUILD_CREATE; SDK defers Ready by 500ms so guild stream settles before emitting',
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
title: '@erinjs/core — GuildMember.move()',
|
|
25
|
+
items: ['GuildMember.move(channelId) — move members between voice channels (#27)'],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
title: '@erinjs/ws — Reconnect fixes',
|
|
29
|
+
items: [
|
|
30
|
+
'Close socket before reconnecting on invalid session (#25)',
|
|
31
|
+
'Add gateway close code 4013 (AckBackpressure) as reconnectable (#24)',
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
version: '1.2.3',
|
|
38
|
+
date: '2026-02-23',
|
|
39
|
+
sections: [
|
|
40
|
+
{
|
|
41
|
+
title: '@erinjs/core — Message.reply() fix',
|
|
42
|
+
items: [
|
|
43
|
+
'Fixed message.reply() not creating actual replies — SDK now sends message_reference (not referenced_message) in the request body per Discord/Fluxer API spec',
|
|
44
|
+
'Added !replytest command to ping-bot example for verification',
|
|
45
|
+
'Added structure tests (Message, User, GuildMember, Guild, Invite) including regression test for reply payload',
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
version: '1.2.2',
|
|
52
|
+
date: '2026-02-22',
|
|
53
|
+
sections: [
|
|
54
|
+
{
|
|
55
|
+
title: '@erinjs/voice — LiveKit inbound receive',
|
|
56
|
+
items: [
|
|
57
|
+
'LiveKit inbound audio receive APIs for participant subscriptions, audioFrame events, and speaking lifecycle events',
|
|
58
|
+
'VoiceManager helpers for channel participant subscriptions',
|
|
59
|
+
'Docs/examples for transcription-oriented usage',
|
|
60
|
+
'Fixed broken voice changes due to packing',
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
title: '@erinjs/voice — ESM fix',
|
|
65
|
+
items: [
|
|
66
|
+
'Fixed "Dynamic require of path is not supported" when using @erinjs/voice in ESM projects',
|
|
67
|
+
'node-webcodecs is now loaded via dynamic import and externalized from the bundle',
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
title: '@erinjs/core — Message.channel.send() & Channel.canSendMessage()',
|
|
72
|
+
items: [
|
|
73
|
+
'Message.channel — now typed as (TextChannel | DMChannel | GuildChannel) | null so message.channel.send() works (messages only exist in text-based channels)',
|
|
74
|
+
'Channel.canSendMessage() — returns true for DMs; for guild channels checks ViewChannel and SendMessages via guild.members.me permissions',
|
|
75
|
+
'GuildChannel.send() — added for guild channels that support messages (e.g. announcement channels); TextChannel and DMChannel already had send',
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
title: '@erinjs/core — Ready & guilds',
|
|
80
|
+
items: [
|
|
81
|
+
'ClientOptions.waitForGuilds — when true, delays the Ready event until all guilds from READY (including unavailable stubs) have been received via GUILD_CREATE; opt-in for bots that need full guild cache before handling Ready',
|
|
82
|
+
'New guide: Wait for All Guilds',
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
title: '@erinjs/core — Channel type guards',
|
|
87
|
+
items: [
|
|
88
|
+
'BREAKING: isSendable() renamed to isTextBased() — migrate callers to isTextBased()',
|
|
89
|
+
'Added isLink(), isDM(), isVoice() type guards on Channel',
|
|
90
|
+
'LinkChannel.url is now a required field',
|
|
91
|
+
'Refactored Message.send() and reply() for testability; added check for empty messages',
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
title: 'Build & tooling',
|
|
96
|
+
items: [
|
|
97
|
+
'Added vite build artifacts to gitignore',
|
|
98
|
+
'Modernized vite config (const, modern syntax)',
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
title: 'Docs & assets',
|
|
103
|
+
items: ['Docs improvements', 'Updated favicon', 'RAG generation updates'],
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
version: '1.2.1',
|
|
109
|
+
date: '2026-02-21',
|
|
110
|
+
sections: [
|
|
111
|
+
{
|
|
112
|
+
title: 'BREAKING: MessageReaction events',
|
|
113
|
+
items: [
|
|
114
|
+
'MessageReactionAdd and MessageReactionRemove now emit (reaction, user) only — messageId, channelId, emoji, and userId are accessible via reaction.messageId, reaction.channelId, reaction.emoji, and user.id',
|
|
115
|
+
'Handlers that destructured the extra args (messageId, channelId, emoji, userId) will break; migrate to reaction/user properties',
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
title: 'BREAKING: GuildMember.roles',
|
|
120
|
+
items: [
|
|
121
|
+
'member.roles is now GuildMemberRoleManager (was string[]). Migrate: member.roles.includes(roleId) → member.roles.cache.has(roleId); array iteration → member.roles.roleIds',
|
|
122
|
+
'member.addRole() and member.removeRole() still work; prefer member.roles.add() and member.roles.remove() for Discord.js parity',
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
title: 'SDK — GuildMemberRoleManager',
|
|
127
|
+
items: [
|
|
128
|
+
'member.roles — add(roleOrId), remove(roleOrId), set(roleIds), cache (Collection of Role objects), roleIds, has(roleOrId). Discord.js parity.',
|
|
129
|
+
'GuildMemberRoleManager and RoleResolvable exported from @erinjs/core',
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
title: 'SDK — Guild emojis',
|
|
134
|
+
items: [
|
|
135
|
+
'guild.emojis — Collection of GuildEmoji (cached after fetch)',
|
|
136
|
+
'guild.fetchEmojis() — fetch all emojis; cached in guild.emojis',
|
|
137
|
+
'guild.fetchEmoji(emojiId) — fetch single emoji; throws FluxerError with EmojiNotFound code on 404',
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
title: 'SDK — Types & resolution',
|
|
142
|
+
items: [
|
|
143
|
+
'ChannelManager — return type now includes GuildChannel when fetching a guild channel; client.channels.get(guildChannelId) and fetch() return Channel | GuildChannel',
|
|
144
|
+
'GatewayReactionEmoji — id is now optional (id?: Snowflake) to match API; default/unicode emoji omit id',
|
|
145
|
+
'@erinjs/util BitField — BitFieldResolvable now accepts bigint',
|
|
146
|
+
],
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
title: 'SDK — Error codes',
|
|
150
|
+
items: ['ErrorCodes.EmojiNotFound — used when fetchEmoji returns 404'],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
title: 'Build & tooling',
|
|
154
|
+
items: [
|
|
155
|
+
'tsup configs added for all packages; build scripts simplified',
|
|
156
|
+
'Runtime dynamic imports removed in favor of compile-time imports — smaller bundle, faster startup (#17)',
|
|
157
|
+
'Emoji shortcodes generated file — minified format for smaller bundle',
|
|
158
|
+
'scripts/generate-ai-rag.ts — generate RAG index from docs for AI bot; pnpm run generate:rag',
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
title: 'Docs site — Discord.js compatibility',
|
|
163
|
+
items: [
|
|
164
|
+
'@discordJsCompat JSDoc tag — docgen extracts and surfaces in API docs; classes, methods, properties can show "Discord.js compatible" badge with optional link',
|
|
165
|
+
'ApiDiscordCompat, GuideDiscordCompat, GuideDiscordCompatCallout — new components for badges and callouts',
|
|
166
|
+
'ClassPage, MethodsSection, PropertiesSection — green Discord.js compat styling and badges on compatible APIs',
|
|
167
|
+
'ClassPage — "Class not found in this version" shows link to latest docs when class may exist in newer release',
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
title: 'Docs — Guides',
|
|
172
|
+
items: [
|
|
173
|
+
'New guide: Discord.js Compatibility — overview of member.roles, guild.members.me, client.channels.cache; migration from member.roles.includes() to member.roles.cache.has()',
|
|
174
|
+
'New guide: Channels — create, edit, delete; permission overwrites; roles; invites; emojis & stickers',
|
|
175
|
+
'Guides category order — channels category; Roles guide; discordJsCompat badges on relevant sections',
|
|
176
|
+
'Roles guide — new section "Add/remove roles from members (member.roles)" with Discord.js-style examples',
|
|
177
|
+
'Channels guide — new "Fetch Emojis" section (guild.fetchEmojis, guild.fetchEmoji, emoji.delete)',
|
|
178
|
+
],
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
title: 'Examples',
|
|
182
|
+
items: [
|
|
183
|
+
'ping-bot — userinfo uses guild-specific avatar (cdnMemberAvatarURL) when member has one; improved embed layout with setAuthor',
|
|
184
|
+
'reaction-roles-bot — updated to member.roles.cache.has() for role checks',
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
title: 'Chore',
|
|
189
|
+
items: ['.gitignore — removed IDE and OS-specific entries', '.env.example — minor cleanup'],
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
version: '1.2.0',
|
|
195
|
+
date: '2026-02-20',
|
|
196
|
+
sections: [
|
|
197
|
+
{
|
|
198
|
+
title: 'Docs site',
|
|
199
|
+
items: [
|
|
200
|
+
'Support banner — closable with × button; preference persisted in localStorage',
|
|
201
|
+
'Guides page — wider content area and improved layout to use more screen space',
|
|
202
|
+
'Join our erin.js community — prominent callout on homepage, Guides sidebar, Docs sidebar, REST API sidebar, and Footer',
|
|
203
|
+
'CommunityCallout component with hero and sidebar variants linking to fluxer.gg/fluxer-js',
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
title: 'SDK — Resolve helpers',
|
|
208
|
+
items: [
|
|
209
|
+
'client.channels.resolve(channelId) — get from cache or fetch; replaces common get(id) ?? fetch(id) pattern',
|
|
210
|
+
'client.guilds.resolve(guildId) — same pattern for guilds',
|
|
211
|
+
'guild.members.resolve(userId) — resolve member from cache or API',
|
|
212
|
+
'message.resolveChannel(), message.resolveGuild() — convenience for resolving message context',
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
title: 'SDK — Cache & options',
|
|
217
|
+
items: [
|
|
218
|
+
'ClientOptions.cache — optional size limits (channels, guilds, users); FIFO eviction when exceeded',
|
|
219
|
+
'ChannelManager, GuildManager, UsersManager — respect cache limits when set; omit or 0 = unbounded',
|
|
220
|
+
'ClientOptions.suppressIntentWarning — silence warning when intents are set (Fluxer does not support intents yet)',
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
title: 'SDK — Embeds',
|
|
225
|
+
items: [
|
|
226
|
+
'message.send(), message.sendTo(), channel.send(), webhook.send() — embeds accept EmbedBuilder directly; no need to call .toJSON()',
|
|
227
|
+
],
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
title: 'SDK — Emoji',
|
|
231
|
+
items: [
|
|
232
|
+
'Client.resolveEmoji — Unicode emoji no longer double-encoded; fix for message.react() with shortcodes',
|
|
233
|
+
],
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
title: 'SDK — Events & gateway',
|
|
237
|
+
items: [
|
|
238
|
+
'GUILD_CREATE, GUILD_UPDATE — use normalizeGuildPayload for Fluxer/Discord payload compatibility',
|
|
239
|
+
'GuildBanAdd — correct payload shape for GuildBan constructor',
|
|
240
|
+
],
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
title: 'SDK — Bug fixes',
|
|
244
|
+
items: [
|
|
245
|
+
'guild.channels — now correctly populated when channels arrive via gateway (GUILD_CREATE, READY, CHANNEL_CREATE, CHANNEL_UPDATE) or client.channels.fetch(); previously guild.channels stayed empty while client.channels had them',
|
|
246
|
+
],
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
title: '@erinjs/collection',
|
|
250
|
+
items: [
|
|
251
|
+
'findKey(predicate), some(predicate), every(predicate), partition(predicate)',
|
|
252
|
+
'clone(), concat(other), last(amount?), tap(fn), toString()',
|
|
253
|
+
],
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
title: '@erinjs/rest',
|
|
257
|
+
items: [
|
|
258
|
+
'FluxerAPIError.isRetryable, HTTPError.isRetryable — true for 429 and 5xx; useful for retry logic',
|
|
259
|
+
],
|
|
260
|
+
},
|
|
261
|
+
],
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
version: '1.1.9',
|
|
265
|
+
date: '2026-02-19',
|
|
266
|
+
sections: [
|
|
267
|
+
{
|
|
268
|
+
title: 'SDK — Emoji shortcodes',
|
|
269
|
+
items: [
|
|
270
|
+
"Unicode emoji shortcodes now use Discord's official data (anyascii/discord-emojis) instead of emojilib — Fluxer Discord compatibility",
|
|
271
|
+
'message.react(:arrow_backward:), :flag_ad:, etc. resolve correctly per Discord naming',
|
|
272
|
+
'Removed emojilib dependency; generate script fetches from GitHub at build time',
|
|
273
|
+
],
|
|
274
|
+
},
|
|
275
|
+
],
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
version: '1.1.8',
|
|
279
|
+
date: '2026-02-18',
|
|
280
|
+
sections: [
|
|
281
|
+
{
|
|
282
|
+
title: 'Types',
|
|
283
|
+
items: ['GatewayMessageDeleteDispatchData — added content?, author_id? (Fluxer payload)'],
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
title: 'SDK — Events',
|
|
287
|
+
items: [
|
|
288
|
+
'GuildMemberRemove — always emits; builds partial member from payload when not cached (username fallback for Fluxer)',
|
|
289
|
+
'MessageDelete — PartialMessage now includes content?, authorId? from gateway payload',
|
|
290
|
+
],
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
title: 'SDK — Reactions',
|
|
294
|
+
items: [
|
|
295
|
+
'message.react() — Unicode shortcodes (e.g. :red_square:, :light_blue_heart:) now resolve correctly; no longer misclassified as custom emojis requiring guild context; uses emojilib data (6k+ shortcodes) via getUnicodeFromShortcode',
|
|
296
|
+
],
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
title: 'SDK — CDN / Avatars',
|
|
300
|
+
items: [
|
|
301
|
+
'displayAvatarURL, cdnDisplayAvatarURL, cdnDefaultAvatarURL — default avatars now use fluxerstatic.com (index = userId % 6) per Fluxer API',
|
|
302
|
+
'STATIC_CDN_URL exported for fluxerstatic.com; CDN_URL remains fluxerusercontent.com',
|
|
303
|
+
],
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
title: '@erinjs/voice',
|
|
307
|
+
items: [
|
|
308
|
+
'LiveKitRtcConnection — setVolume(0-200), getVolume() for playback volume control',
|
|
309
|
+
'VoiceManager — multi-channel: connections keyed by channel_id; leave(guildId) leaves all channels; leaveChannel(channelId), getConnection(channelOrGuildId)',
|
|
310
|
+
],
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
title: '@erinjs/ws',
|
|
314
|
+
items: [
|
|
315
|
+
'WebSocketManager — retry loop for getDefaultWebSocket() and gateway fetch with exponential backoff (1s → 45s max); no longer crashes when API or gateway is unreachable',
|
|
316
|
+
'WebSocketShard — max reconnect backoff increased from 30s to 45s; reconnects on additional close codes: 1005, 1006, 1012–1015 (Abnormal Closure, Service Restart, Bad Gateway, etc.)',
|
|
317
|
+
'destroy() — aborts retry loop when client is destroyed',
|
|
318
|
+
],
|
|
319
|
+
},
|
|
320
|
+
],
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
version: '1.1.6',
|
|
324
|
+
date: '2026-02-18',
|
|
325
|
+
sections: [
|
|
326
|
+
{
|
|
327
|
+
title: 'Routes',
|
|
328
|
+
items: [
|
|
329
|
+
'instance() — GET /instance',
|
|
330
|
+
'channelRecipient(channelId, userId) — PUT/DELETE recipients',
|
|
331
|
+
'channelMessageAttachment(channelId, messageId, attachmentId) — DELETE attachment',
|
|
332
|
+
'guilds() — POST /guilds',
|
|
333
|
+
'guildDelete(guildId) — POST guild delete',
|
|
334
|
+
'guildVanityUrl(guildId) — GET vanity URL',
|
|
335
|
+
'guildTextChannelFlexibleNames(guildId), guildDetachedBanner(guildId), guildDisallowUnclaimedAccounts(guildId) — PATCH feature toggles',
|
|
336
|
+
'guildTransferOwnership(guildId) — POST transfer ownership',
|
|
337
|
+
'guildRolesHoistPositions(guildId) — PATCH/DELETE role hoist positions',
|
|
338
|
+
'guildEmojisBulk(guildId), guildStickersBulk(guildId) — POST bulk emojis/stickers',
|
|
339
|
+
],
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
title: 'Types',
|
|
343
|
+
items: [
|
|
344
|
+
'APIInstance — response for GET /instance',
|
|
345
|
+
'APIVanityURL — response for GET vanity-url',
|
|
346
|
+
'APIGuildFeatureToggle — body for guild feature toggles',
|
|
347
|
+
],
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
title: 'SDK — Client',
|
|
351
|
+
items: ['client.fetchInstance() — unauthenticated instance info'],
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
title: 'SDK — Channel / GuildChannel',
|
|
355
|
+
items: [
|
|
356
|
+
'guildChannel.edit(options) — PATCH channel',
|
|
357
|
+
'guildChannel.delete(options?) — DELETE channel',
|
|
358
|
+
'guildChannel.editPermission(overwriteId, options) — PUT permission overwrite',
|
|
359
|
+
'guildChannel.deletePermission(overwriteId) — DELETE permission overwrite',
|
|
360
|
+
],
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
title: 'SDK — DMChannel',
|
|
364
|
+
items: [
|
|
365
|
+
'dmChannel.addRecipient(userId) — add recipient in group DMs',
|
|
366
|
+
'dmChannel.removeRecipient(userId, options?) — remove recipient',
|
|
367
|
+
],
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
title: 'SDK — Message',
|
|
371
|
+
items: ['message.deleteAttachment(attachmentId) — delete a single attachment'],
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
title: 'SDK — GuildManager',
|
|
375
|
+
items: ['client.guilds.create(options) — create guild'],
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
title: 'SDK — Guild',
|
|
379
|
+
items: [
|
|
380
|
+
'guild.edit(options) — PATCH guild',
|
|
381
|
+
'guild.delete() — delete guild',
|
|
382
|
+
'guild.fetchVanityURL() — fetch vanity URL',
|
|
383
|
+
'guild.transferOwnership(newOwnerId, password?) — transfer ownership',
|
|
384
|
+
'guild.setTextChannelFlexibleNames(enabled), guild.setDetachedBanner(enabled), guild.setDisallowUnclaimedAccounts(enabled) — feature toggles',
|
|
385
|
+
'guild.setRolePositions(updates), guild.setRoleHoistPositions(updates), guild.resetRoleHoistPositions() — reorder roles',
|
|
386
|
+
'guild.createEmojisBulk(emojis), guild.createStickersBulk(stickers) — bulk create',
|
|
387
|
+
],
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
title: 'SDK — GuildMemberManager',
|
|
391
|
+
items: ['guild.members.fetch(options?) — list members with pagination'],
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
title: 'SDK — GuildMember',
|
|
395
|
+
items: ['member.edit(options) — PATCH member (including @me for the bot)'],
|
|
396
|
+
},
|
|
397
|
+
],
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
version: '1.1.5',
|
|
401
|
+
date: '2026-02-18',
|
|
402
|
+
sections: [
|
|
403
|
+
{
|
|
404
|
+
title: 'Gateway events & docs',
|
|
405
|
+
items: [
|
|
406
|
+
'GatewayDispatchEvents — documented all 60+ events from fluxer_gateway with JSDoc; new payload types for ChannelUpdateBulk, ChannelRecipientAdd/Remove, ChannelPinsAck, GuildMembersChunk, GuildMemberListUpdate, GuildRoleUpdateBulk, MessageAck, and session/user/call/relationship events',
|
|
407
|
+
'Guides — proper HTML tables for Gateway Dispatch Events Reference and Event Payload Reference (replacing code blocks); new GuideTable component',
|
|
408
|
+
],
|
|
409
|
+
},
|
|
410
|
+
],
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
version: '1.1.4',
|
|
414
|
+
date: '2026-02-18',
|
|
415
|
+
sections: [
|
|
416
|
+
{
|
|
417
|
+
title: 'File attachments by URL',
|
|
418
|
+
items: [
|
|
419
|
+
'files option now accepts URL — pass { name, url } to attach files from a URL; SDK fetches automatically (channel.send, message.reply, webhook.send)',
|
|
420
|
+
'30s fetch timeout; URL validation with URL.canParse()',
|
|
421
|
+
'New guide: File Attachments by URL',
|
|
422
|
+
],
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
title: 'Guides',
|
|
426
|
+
items: ['Guides index — category order and quick links for easier discovery'],
|
|
427
|
+
},
|
|
428
|
+
],
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
version: '1.1.3',
|
|
432
|
+
date: '2026-02-18',
|
|
433
|
+
sections: [
|
|
434
|
+
{
|
|
435
|
+
title: 'Guild members cache',
|
|
436
|
+
items: [
|
|
437
|
+
'GUILD_CREATE — cache members from payload when gateway sends them (Discord.js parity; guild.members.me often populated on join)',
|
|
438
|
+
],
|
|
439
|
+
},
|
|
440
|
+
],
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
version: '1.1.2',
|
|
444
|
+
date: '2026-02-18',
|
|
445
|
+
sections: [
|
|
446
|
+
{
|
|
447
|
+
title: 'Guild members',
|
|
448
|
+
items: [
|
|
449
|
+
'guild.members.me — Discord.js parity: returns the current bot user as a GuildMember in that guild, or null if not cached',
|
|
450
|
+
"guild.members.fetchMe() — fetch and cache the bot's member when not in cache",
|
|
451
|
+
'GuildMemberManager — guild.members extends Collection with me getter and fetchMe()',
|
|
452
|
+
],
|
|
453
|
+
},
|
|
454
|
+
],
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
version: '1.1.0',
|
|
458
|
+
date: '2026-02-16',
|
|
459
|
+
sections: [
|
|
460
|
+
{
|
|
461
|
+
title: 'BREAKING: Reaction events',
|
|
462
|
+
items: [
|
|
463
|
+
'MessageReactionAdd and MessageReactionRemove now emit (reaction, user, messageId, channelId, emoji, userId). Migrate from (reaction, user) or raw data destructuring.',
|
|
464
|
+
'Handlers expecting message_id, channel_id, user_id from raw data will break. Use reaction.messageId, reaction.channelId, user.id or the new convenience args.',
|
|
465
|
+
],
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
title: 'New: client.events API',
|
|
469
|
+
items: [
|
|
470
|
+
'client.events — typed shorthand for event handlers. client.events.MessageReactionAdd((reaction, user, messageId, channelId, emoji, userId) => {...}).',
|
|
471
|
+
],
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
title: 'Typing',
|
|
475
|
+
items: [
|
|
476
|
+
'MessageSendOptions — shared type for Channel.send, User.send, DMChannel.send, Message.send, Message.reply; embeds accept (APIEmbed | EmbedBuilder)[]',
|
|
477
|
+
'Webhook.send — embeds typed as (APIEmbed | EmbedBuilder)[]; optional wait param returns Message when true',
|
|
478
|
+
'ClientEvents — GuildEmojisUpdate, GuildStickersUpdate, and other events now use typed dispatch data',
|
|
479
|
+
'Gateway dispatch types — GatewayGuildEmojisUpdateDispatchData, GatewayChannelPinsUpdateDispatchData, etc. exported from @erinjs/types',
|
|
480
|
+
'APIApplicationCommandInteraction — member and user fields typed as APIGuildMember and APIUser',
|
|
481
|
+
'APIGuildAuditLogEntry changes — old_value/new_value typed; fetchPinnedMessages pinned items typed',
|
|
482
|
+
],
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
title: 'Webhook & message attachments',
|
|
486
|
+
items: [
|
|
487
|
+
'Webhook.send() — files and attachments support; multipart/form-data when files provided',
|
|
488
|
+
'Channel.send, Message.reply, Message.send, Message.sendTo, client.channels.send — files and attachments support',
|
|
489
|
+
'MessageSendOptions and WebhookSendOptions — files (Blob/ArrayBuffer/Uint8Array) and attachments metadata',
|
|
490
|
+
'REST RequestManager — builds FormData from body + files when files present',
|
|
491
|
+
'EmbedBuilder — JSDoc: embeds can use description-only (no title required)',
|
|
492
|
+
],
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
title: 'Media & embeds',
|
|
496
|
+
items: [
|
|
497
|
+
'@erinjs/util — resolveTenorToImageUrl() — resolve Tenor view URLs to GIF URLs for embed images; returns { url, flags: IS_ANIMATED }; derives GIF from JSON-LD or oEmbed (embeds require GIF, not MP4)',
|
|
498
|
+
'EmbedBuilder — setImage/setThumbnail accept EmbedMediaOptions with flags (e.g. EmbedMediaFlags.IS_ANIMATED)',
|
|
499
|
+
],
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
title: 'Profile URLs (avatars, banners)',
|
|
503
|
+
items: [
|
|
504
|
+
'User — avatarURL(), displayAvatarURL(), bannerURL(); auto-detects animated avatars (a_ → gif); optional banner from profile/member context',
|
|
505
|
+
'GuildMember — avatarURL(), displayAvatarURL(), bannerURL() for guild-specific avatars/banners',
|
|
506
|
+
'Webhook — avatarURL()',
|
|
507
|
+
'CDN helpers — cdnAvatarURL(), cdnDisplayAvatarURL(), cdnBannerURL(), cdnMemberAvatarURL(), cdnMemberBannerURL(), cdnDefaultAvatarURL() for raw API data',
|
|
508
|
+
'New guide: Profile URLs — User/Webhook/GuildMember methods and standalone CDN helpers',
|
|
509
|
+
],
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
title: 'Deprecation warnings',
|
|
513
|
+
items: [
|
|
514
|
+
'Runtime deprecation warnings — deprecated APIs (e.g. ChannelManager.fetchMessage, Channel.fetchMessage, Client.fetchMessage) now emit a one-time console.warn when used',
|
|
515
|
+
'emitDeprecationWarning(symbol, message) — exported from @erinjs/util for SDK use',
|
|
516
|
+
'FLUXER_SUPPRESS_DEPRECATION=1 — set to silence all deprecation warnings',
|
|
517
|
+
],
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
title: 'Permissions & guild owner',
|
|
521
|
+
items: [
|
|
522
|
+
'Guild owner override — server owner now receives all permissions in member.permissions and member.permissionsIn(channel)',
|
|
523
|
+
'GuildMember.permissions — guild-level permissions (roles only); GuildMember.permissionsIn(channel) — channel-specific permissions (includes overwrites)',
|
|
524
|
+
'Fluxer gateway compatibility — READY, GUILD_CREATE, GUILD_UPDATE now correctly parse GuildReadyData (properties.owner_id) so owner_id is available for permission checks',
|
|
525
|
+
'Guild constructor — supports both owner_id and ownerId; defensive fallback when missing',
|
|
526
|
+
'New guide: Permissions & Moderation — member.permissions, PermissionFlags, owner override, ban/kick examples',
|
|
527
|
+
],
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
title: 'SDK missing properties',
|
|
531
|
+
items: [
|
|
532
|
+
'Channel — icon, lastPinTimestamp on base; permissionOverwrites on GuildChannel',
|
|
533
|
+
'DMChannel — ownerId, recipients (User[]), nicks (Group DM support)',
|
|
534
|
+
'Guild — splash, splashURL(), vanityURLCode, features, verificationLevel, defaultMessageNotifications, explicitContentFilter, afkChannelId, afkTimeout, systemChannelId, rulesChannelId, nsfwLevel, mfaLevel, bannerWidth/Height, splashWidth/Height',
|
|
535
|
+
'User — avatarColor, flags, system',
|
|
536
|
+
'Message — webhookId, mentions (User[]), mentionRoles, nonce',
|
|
537
|
+
'Role — hoistPosition',
|
|
538
|
+
'Webhook — user (creator)',
|
|
539
|
+
],
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
title: 'Fluxer API alignment (bot features)',
|
|
543
|
+
items: [
|
|
544
|
+
'BREAKING: Guild.ban() — now uses delete_message_days (0–7) instead of delete_message_seconds; added ban_duration_seconds for temporary bans',
|
|
545
|
+
'Routes — currentUserGuilds(), leaveGuild(guildId)',
|
|
546
|
+
'ClientUser — fetchGuilds(), leaveGuild(guildId)',
|
|
547
|
+
'GuildChannel — createInvite(options?), fetchInvites()',
|
|
548
|
+
'Channel — bulkDeleteMessages(ids), sendTyping()',
|
|
549
|
+
'Guild — createChannel(data), fetchChannels(), setChannelPositions(updates)',
|
|
550
|
+
'Message — fetchReactionUsers(emoji, options?)',
|
|
551
|
+
'GuildBan and APIBan — expires_at for temporary bans',
|
|
552
|
+
],
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
title: 'Docs',
|
|
556
|
+
items: [
|
|
557
|
+
'New guide: Webhook Attachments & Embeds — description-only embeds, file attachments, full examples',
|
|
558
|
+
'New guides (Media category): Embed Media — images, thumbnails, video, audio; GIFs (Tenor) — send URL as content for gifv, resolveTenorToImageUrl() for Tenor in embeds; File Attachments — files with metadata and flags (spoiler, animated, explicit)',
|
|
559
|
+
'Embeds guide expanded — full EmbedBuilder reference: title, description, URL, color, author, footer, timestamp, fields, image, thumbnail, video, audio, multiple embeds, EmbedBuilder.from(), limits',
|
|
560
|
+
'Docgen — getters (channel, guild, displayName) now appear in API docs',
|
|
561
|
+
'Docgen — AttachmentBuilder.setSpoiler param type fixed; Base class and Client properties documented',
|
|
562
|
+
],
|
|
563
|
+
},
|
|
564
|
+
],
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
version: '1.0.9',
|
|
568
|
+
date: '2026-02-15',
|
|
569
|
+
sections: [
|
|
570
|
+
{
|
|
571
|
+
title: 'OpenAPI gap fixes',
|
|
572
|
+
items: [
|
|
573
|
+
'Fixed pin/unpin route path — channelPinMessage() uses /channels/{id}/pins/{messageId} (was /messages/pins/...)',
|
|
574
|
+
'Message.pin() and Message.unpin() — pin or unpin a message',
|
|
575
|
+
'TextChannel.fetchPinnedMessages() and DMChannel.fetchPinnedMessages() — fetch pinned messages',
|
|
576
|
+
'Webhook.edit(options) — edit webhook name, avatar, and (with bot auth) channel_id; APIWebhookUpdateRequest and APIWebhookTokenUpdateRequest types',
|
|
577
|
+
'Guild.fetchAuditLogs(options?) — fetch guild audit logs with limit, before, after, userId, actionType filters',
|
|
578
|
+
],
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
title: 'Invite metadata',
|
|
582
|
+
items: ['APIInvite and Invite class — temporary, createdAt, uses, maxUses, maxAge'],
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
title: 'Audit log types',
|
|
586
|
+
items: ['APIGuildAuditLog and APIGuildAuditLogEntry — types for guild audit log responses'],
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
title: 'Docs',
|
|
590
|
+
items: ['Webhooks guide — Editing a Webhook section with token vs bot auth examples'],
|
|
591
|
+
},
|
|
592
|
+
],
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
version: '1.0.8',
|
|
596
|
+
date: '2026-02-15',
|
|
597
|
+
sections: [
|
|
598
|
+
{
|
|
599
|
+
title: 'Discord.js portability',
|
|
600
|
+
items: [
|
|
601
|
+
'Message.channel and Message.guild — getters that resolve from cache',
|
|
602
|
+
'MessageReaction — reaction events emit (reaction, user); use reaction.emoji, reaction.fetchMessage()',
|
|
603
|
+
'MessageManager — channel.messages.fetch(messageId) for Discord.js-style message access; client.fetchMessage and channel.fetchMessage deprecated',
|
|
604
|
+
'Role and guild.roles — Role class; guild.roles Collection',
|
|
605
|
+
'PartialMessage — MessageDelete emits { id, channelId, channel? }',
|
|
606
|
+
'client.guilds.fetch(guildId) — fetch guilds by ID',
|
|
607
|
+
'client.channels.cache and client.guilds.cache — Discord.js compatibility alias',
|
|
608
|
+
],
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
title: 'Role management',
|
|
612
|
+
items: [
|
|
613
|
+
'Guild.addRoleToMember(userId, roleId) — assign a role by user ID and role ID without fetching the member',
|
|
614
|
+
'Guild.removeRoleFromMember(userId, roleId) — remove a role by user ID and role ID',
|
|
615
|
+
'Guild.resolveRoleId(arg) — resolve role mention (@role), raw snowflake ID, or role name to role ID (fetches guild roles when needed)',
|
|
616
|
+
'parseRoleMention(arg) in @erinjs/util — extract role ID from <@&id> format',
|
|
617
|
+
],
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
title: 'Custom emoji resolution',
|
|
621
|
+
items: [
|
|
622
|
+
'Message.react(), removeReaction(), removeReactionEmoji() now accept :name:, name:id, <:name:id>, and unicode — custom emojis resolve via guild emoji lookup when message has guild context',
|
|
623
|
+
'Client.resolveEmoji(emoji, guildId?) — resolve any emoji input to API format for reactions; fetches guild emojis when id is missing',
|
|
624
|
+
'Extended parseEmoji() — supports :name: (colons), name:id (API format), and <a?:name:id> (mention)',
|
|
625
|
+
],
|
|
626
|
+
},
|
|
627
|
+
{
|
|
628
|
+
title: 'Gateway event handlers',
|
|
629
|
+
items: [
|
|
630
|
+
'New handlers: MessageDeleteBulk, GuildBanAdd, GuildBanRemove, GuildEmojisUpdate, GuildStickersUpdate, GuildIntegrationsUpdate',
|
|
631
|
+
'GuildRoleCreate, GuildRoleUpdate, GuildRoleDelete',
|
|
632
|
+
'GuildScheduledEventCreate, GuildScheduledEventUpdate, GuildScheduledEventDelete',
|
|
633
|
+
'ChannelPinsUpdate, InviteCreate, InviteDelete',
|
|
634
|
+
'TypingStart, UserUpdate, PresenceUpdate, WebhooksUpdate, Resumed',
|
|
635
|
+
'USER_UPDATE patches client.user when the bot updates',
|
|
636
|
+
],
|
|
637
|
+
},
|
|
638
|
+
{
|
|
639
|
+
title: 'Architecture',
|
|
640
|
+
items: [
|
|
641
|
+
'Event handler registry pattern — handleDispatch uses a Map of handlers instead of a switch; add handlers via eventHandlers.set()',
|
|
642
|
+
'User caching with getOrCreateUser — Message and GuildMember use client.getOrCreateUser(); User._patch() updates cached users',
|
|
643
|
+
],
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
title: 'REST package',
|
|
647
|
+
items: [
|
|
648
|
+
'Fixed timeout leak — clearTimeout moved to finally block in RequestManager',
|
|
649
|
+
'Fixed rate limit race — proper mutex handling',
|
|
650
|
+
'Error chaining with { cause } on retries',
|
|
651
|
+
'NaN handling in RateLimitManager for malformed Retry-After headers',
|
|
652
|
+
],
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
title: 'WebSocket package',
|
|
656
|
+
items: [
|
|
657
|
+
'Fixed double-reconnect race — scheduleReconnect guarded with reconnectTimeout check',
|
|
658
|
+
'Explicit reconnect on heartbeat ack timeout',
|
|
659
|
+
'try/catch around shard.connect() in WebSocketManager',
|
|
660
|
+
'Unhandled promise catch for connect',
|
|
661
|
+
],
|
|
662
|
+
},
|
|
663
|
+
{
|
|
664
|
+
title: 'Voice package',
|
|
665
|
+
items: [
|
|
666
|
+
'Null guards for client.user before use',
|
|
667
|
+
'Buffer bounds check in VoiceConnection setupUDP (msg.length < 70)',
|
|
668
|
+
'currentStream cleanup in VoiceConnection.destroy()',
|
|
669
|
+
'Video cleanup race guard in LiveKitRtcConnection',
|
|
670
|
+
'MP4 track validation (info.tracks) in LiveKitRtcConnection',
|
|
671
|
+
],
|
|
672
|
+
},
|
|
673
|
+
{
|
|
674
|
+
title: 'Core package',
|
|
675
|
+
items: [
|
|
676
|
+
'Double-login guard — throws FluxerError if already logged in',
|
|
677
|
+
'Unhandled dispatch promise — .catch() on handleDispatch so rejections emit as errors',
|
|
678
|
+
],
|
|
679
|
+
},
|
|
680
|
+
{
|
|
681
|
+
title: 'Builders & util',
|
|
682
|
+
items: [
|
|
683
|
+
'EmbedBuilder.setURL() — URL validation with URL.canParse()',
|
|
684
|
+
'AttachmentBuilder — filename validation in constructor and setName()',
|
|
685
|
+
'parseEmoji() — null/undefined/empty checks',
|
|
686
|
+
'SnowflakeUtil.deconstruct — try/catch for BigInt with descriptive error',
|
|
687
|
+
'BitField — JSDoc for 32-bit limitation',
|
|
688
|
+
],
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
title: 'Docs site',
|
|
692
|
+
items: [
|
|
693
|
+
'404 page and catch-all route for invalid URLs',
|
|
694
|
+
'Skip link, SearchModal aria-label and focus trap for accessibility',
|
|
695
|
+
'Changelog section anchors and copy-link buttons',
|
|
696
|
+
'Breadcrumbs on guide pages',
|
|
697
|
+
'On this page TOC on class docs (right sidebar)',
|
|
698
|
+
'Guides grouped by category on index',
|
|
699
|
+
'Minimal bot example and quick-start in examples README',
|
|
700
|
+
'robots.txt, sitemap.xml, SEO meta tags',
|
|
701
|
+
],
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
title: 'Infrastructure & tooling',
|
|
705
|
+
items: [
|
|
706
|
+
'ESLint 9 flat config, Prettier, .editorconfig',
|
|
707
|
+
'Vitest with coverage — tests for collection and util',
|
|
708
|
+
'GitHub Actions: ci.yml, publish.yml, docs-deploy.yml, codeql.yml, dependabot.yml',
|
|
709
|
+
'Husky + lint-staged pre-commit hooks',
|
|
710
|
+
'Changesets for versioning; docs changelog in changelog.ts',
|
|
711
|
+
'Package metadata: repository, bugs, homepage, keywords, license on all packages',
|
|
712
|
+
'GitHub templates: bug_report, feature_request, PULL_REQUEST_TEMPLATE, CONTRIBUTING, SECURITY, CODE_OF_CONDUCT',
|
|
713
|
+
],
|
|
714
|
+
},
|
|
715
|
+
],
|
|
716
|
+
},
|
|
717
|
+
];
|