Dependency Injection
Built on top of Inversify, Nodecord provides a fully-featured IoC container with scoped modules, global providers, and parent-child container hierarchies.
Decorator-driven
Define commands, listeners, interceptors, and providers with expressive decorators like @SlashCommand, @ContextMenu, @Module, and @Injectable.
Composable execution pipeline
Every interaction flows through a layered pipeline: module-scoped interceptors, handler interceptors, and param resolvers. All composable, all replaceable. Add logging, guards, or response transforms without touching your handlers.
Framework, not a wrapper
@nodecord/core has zero knowledge of any Discord library. The framework defines the pipeline; adapters connect it to the outside world. One ships for discord.js, and you can build your own for anything else.
Built for testing
Full unit and integration testing without a live Discord connection. Override providers with TestingModule, or run end-to-end flows with simulateInteraction().
const ctx = createMockChatInputInteraction('ping'); await adapter.simulateInteraction(ctx); expect(ctx.reply).toHaveBeenCalledWith('Pong!');