Context
Baeta allows you to define a shared context that's available throughout your resolvers and middlewares.
Define Context Type
First, define your context type:
// src/types/context.ts
import type { PubSub } from "graphql-yoga";
import type { PubSubMap } from "../lib/pubsub.ts";
export type Context = {
userId?: string;
pubsub: PubSub<PubSubMap>;
};
// biome-ignore lint/complexity/noBannedTypes: Empty context
export type ServerContext = {};
Configuration
The context type is picked up through the Ctx type alias in src/modules/types.ts. Update this alias to point to your context type:
// src/modules/types.ts
import type { Context } from "../types/context.ts";
export type Ctx = Context;
For more details on the types file, see Custom Types.
Usage in Resolvers
The context is automatically typed in your resolvers:
const { Query } = UserModule;
const userQuery = Query.user.resolve(({ args, ctx }) => {
// ctx is typed as Context
return db.user.findUnique({
where: args.where,
});
});
Usage in Middlewares
Middlewares also get the typed context:
const updateUserMutation = Mutation.updateUser
.$use(async (next, { ctx }) => {
// ctx is typed as Context
const result = await next();
ctx.pubsub.publish("user-updated", result);
return result;
})
.resolve(async ({ args }) => {
return db.user.update({ where: args.where, data: args.data });
});