Skip to main content

Astro Adapter

Adapter for integrating Better Auth Studio with Astro applications.

Import

import { betterAuthStudio } from 'better-auth-studio/astro';

betterAuthStudio()

Creates an Astro-compatible API route handler for Better Auth Studio.

Function Signature

function betterAuthStudio(config: StudioConfig): (ctx: { request: Request }) => Promise<Response>

Parameters

config
StudioConfig
required
Studio configuration object containing authentication and feature settings.

Returns

An async function that accepts an Astro context object and returns a Response

Usage

Catch-all API Route

Create a catch-all endpoint to handle all studio requests:
// pages/api/studio/[...all].ts
import { betterAuthStudio } from 'better-auth-studio/astro';
import { auth } from '~/lib/auth';
import { defineStudioConfig } from 'better-auth-studio';
import type { APIRoute } from 'astro';

const studioConfig = defineStudioConfig({
  auth,
  basePath: '/api/studio',
  metadata: {
    title: 'My App Studio',
    theme: 'dark'
  },
  events: {
    enabled: true,
    tableName: 'auth_events'
  }
});

const handler = betterAuthStudio(studioConfig);

export const ALL: APIRoute = async (ctx) => {
  return handler(ctx);
};

Simplified Version

// pages/api/studio/[...all].ts
import { betterAuthStudio } from 'better-auth-studio/astro';
import { auth } from '~/lib/auth';
import type { APIRoute } from 'astro';

const handler = betterAuthStudio({ auth });

export const ALL: APIRoute = handler;

With Access Control

// pages/api/studio/[...all].ts
import { betterAuthStudio } from 'better-auth-studio/astro';
import { auth } from '~/lib/auth';
import type { APIRoute } from 'astro';

const handler = betterAuthStudio({
  auth,
  access: {
    roles: ['admin'],
    allowEmails: ['[email protected]']
  }
});

export const ALL: APIRoute = handler;

With Custom Middleware

// pages/api/studio/[...all].ts
import { betterAuthStudio } from 'better-auth-studio/astro';
import { auth } from '~/lib/auth';
import type { APIRoute, APIContext } from 'astro';

const studioHandler = betterAuthStudio({ auth });

export const ALL: APIRoute = async (ctx: APIContext) => {
  // Custom middleware logic
  console.log(`Studio request: ${ctx.request.method} ${ctx.url}`);
  
  // Call studio handler
  const response = await studioHandler(ctx);
  
  console.log(`Studio response: ${response.status}`);
  return response;
};

Separate HTTP Methods

You can also export individual HTTP method handlers:
// pages/api/studio/[...all].ts
import { betterAuthStudio } from 'better-auth-studio/astro';
import { auth } from '~/lib/auth';
import type { APIRoute } from 'astro';

const handler = betterAuthStudio({ auth });

export const GET: APIRoute = handler;
export const POST: APIRoute = handler;
export const PUT: APIRoute = handler;
export const DELETE: APIRoute = handler;
export const PATCH: APIRoute = handler;

Implementation Details

Request Conversion

The adapter converts Astro context objects to the universal format:
type UniversalRequest = {
  url: string;           // Pathname + search (with basePath stripped)
  method: string;        // ctx.request.method
  headers: Record<string, string>; // ctx.request.headers
  body?: any;            // Parsed from ctx.request
};

Base Path Handling

The adapter automatically strips the base path from URLs:
// If basePath is '/api/studio'
// And request URL is '/api/studio/users'
// The universal URL will be '/users'

Content Type Handling

The adapter handles multiple content types:
  • application/jsonctx.request.json()
  • application/x-www-form-urlencoded → FormData converted to object
  • multipart/form-data → FormData converted to object
  • Other → Attempts to parse as text, then JSON

Error Handling

Errors are caught and returned as JSON responses:
{
  error: "Internal server error"
}
Status code: 500

Astro API Routes

ALL Handler

The ALL export handles all HTTP methods:
export const ALL: APIRoute = handler;
This is equivalent to:
export const GET = handler;
export const POST = handler;
export const PUT = handler;
export const DELETE = handler;
export const PATCH = handler;

File Location

API routes must be placed in the pages/api/ directory:
pages/api/studio/[...all].ts → /api/studio/*

File Structure

project/
├── src/
│   ├── pages/
│   │   └── api/
│   │       └── studio/
│   │           └── [...all].ts
│   └── lib/
│       └── auth.ts
└── astro.config.mjs

Build docs developers (and LLMs) love