Middlewares
Baeta provides a powerful middleware system that allows you to add functionality before and after your resolvers.
Basic Usage
import { getUserModule } from "./typedef.ts";
const { Query } = getUserModule();
Query.user.$use(async ({ args, ctx }, next) => {
  console.log("Before resolver:", args);
  const result = await next();
  console.log("After resolver:", result);
  return result;
});
Common Use Cases
Logging
Query.user.$use(async (context, next) => {
  const startTime = Date.now();
  const result = await next();
  const duration = Date.now() - startTime;
  console.log(`Query.user took ${duration}ms`);
  return result;
});
Authentication
Query.user.$use(async ({ ctx }, next) => {
  if (!ctx.user) {
    throw new UnauthenticatedError();
  }
  return next();
});
Data Transformation
Query.user.$use(async (context, next) => {
  const user = await next();
  if (user) {
    // Remove sensitive data
    delete user.internalNotes;
  }
  return user;
});
Error Handling
Query.user.$use(async (context, next) => {
  try {
    return await next();
  } catch (error) {
    console.error("Error in user resolver:", error);
    throw new GraphQLError("Failed to fetch user");
  }
});
Middleware Context
Middlewares receive the same context as resolvers:
args: Arguments passed to the resolverctx: Context objectroot: Parent objectinfo: GraphQL resolve info
Multiple Middlewares
Middlewares are executed in the order they are defined:
const { Query } = getUserModule();
// First middleware
Query.user.$use(async (context, next) => {
  console.log("First middleware - before");
  const result = await next();
  console.log("First middleware - after");
  return result;
});
// Second middleware
Query.user.$use(async (context, next) => {
  console.log("Second middleware - before");
  const result = await next();
  console.log("Second middleware - after");
  return result;
});
// Output order:
// First middleware - before
// Second middleware - before
// Second middleware - after
// First middleware - after