nest-inngest
An unofficial strongly typed Inngest module for Nest.js projects.
Overview
nest-inngest
is a library designed for the Nest.js framework, allowing you to leverage all the benefits of the framework, such as Dependency Injection (DI).
Getting Started
Disclaimer: This guide serves as an example of how to use the
nest-inngest
library. The structure used in the examples is purely illustrative, and you are free to adapt it to your project's current structure.
-
Install the library using your preferred package manager.
pnpm add nest-inngest
-
In your app.module.ts or a similar file, add a new item to the
imports
array.// app.module.ts import { Module } from "@nestjs/core"; import { InngestModule } from "nest-inngest"; import { inngest } from "../lib/inngest"; @Module({ imports: [ InngestModule.forRoot({ inngest, path: "/api/inngest", }), ], controllers: [], providers: [], }) export class AppModule {}
-
(Optional) In your
inngest.ts
file, include theschemas
using your preferred method.// src/lib/inngest.ts import { Inngest, EventSchemas } from "inngest"; import { NestInngest } from "nest-inngest"; import { z } from "zod"; export const inngest = new Inngest({ id: "orders", // https://www.inngest.com/docs/reference/client/create#defining-event-payload-types schemas: new EventSchemas().fromZod({ "orders/order.created": { data: z.object({ id: z.string().uuid(), product: z.string(), quantity: z.number(), }), }, }), }); // instantiate and export Inngest helper decorator export const OrdersInngest = NestInngest.from(inngest);
-
Assign a new Inngest function to your controller
import { Controller } "@nestjs/common"; import { NestInngest } from "nest-inngest"; import { OrdersInngest } from "../lib/inngest" @Controller("orders") export class OrdersController { constructor(private readonly ordersService: OrdersService) {} @OrdersInngest.Function({ id: "orders-handler" }) @OrdersInngest.Trigger({ event: "orders/order.created" // 👈 Type-safety }) public async handleOrderCreated( { event, step }: NestInngest.context<typeof OrdersInngest, "orders/order.created"> // 👈 Type helper to function context ) { // process recently created order console.log(event.data); await this.ordersService.sendOrderNotification(event.data.id); return { success: true } } }
Roadmap
- [x] Add a global Nest module using the
.forRoot
pattern. - [x] Export a class that accepts an instance of Inngest in the constructor and exposes typed decorators.
- [x]
Function
decorator - [x]
Trigger
decorator
- [x]
- [x] Add typing helpers.
- [x] Helper for typing the
Context
- [x] Helper for typing the
- [ ] Add automated tests.
- [ ] Add automatic documentation in the AsyncAPI spec. (TBD)
- [ ] Add Github actions with changelogs and auto releases