nest-inngest
v1.3.2
Published
Strongly typed Inngest module for Nest.js 💪😾
Downloads
1,360
Maintainers
Readme
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