import { Auth } from '@auth/core' import { setEnvDefaults } from './utils' import { serverSignIn, serverSignOut } from './actions' import type { AuthRequestContext, StartAuthJSConfig } from './types' const authorizationParamsPrefix = 'authorizationParams-' export interface StartAuthJSHandlers { GET: (context: AuthRequestContext) => Promise POST: (context: AuthRequestContext) => Promise signIn: (context: AuthRequestContext) => Promise signOut: (context: AuthRequestContext) => Promise } /** * Create Start Auth.js handlers for API routes * * Usage in your API route (e.g., routes/api/auth/[...all].ts): * ```ts * import { StartAuthJS } from 'start-authjs' * import GitHub from '@auth/core/providers/github' * * const { GET, POST } = StartAuthJS({ * providers: [GitHub], * }) * * export { GET, POST } * ``` */ export function StartAuthJS( config: | StartAuthJSConfig | ((context: AuthRequestContext) => PromiseLike), ): StartAuthJSHandlers { const handler = async (context: AuthRequestContext): Promise => { const _config = typeof config === 'object' ? config : await config(context) setEnvDefaults(process.env, _config) const { request } = context // Pass directly to Auth - it handles action extraction internally return Auth(request, _config) } return { GET: handler, POST: handler, signIn: async (context: AuthRequestContext) => { const { request } = context const _config = typeof config === 'object' ? config : await config(context) setEnvDefaults(process.env, _config) const formData = await request.formData() const { providerId: provider, ...options } = Object.fromEntries(formData) // Extract authorization params from options prefixed with `authorizationParams-` const authorizationParams: Record = {} const _options: Record = {} for (const key in options) { if (key.startsWith(authorizationParamsPrefix)) { authorizationParams[key.slice(authorizationParamsPrefix.length)] = options[key] as string } else { _options[key] = options[key] } } return serverSignIn( provider as string, _options, authorizationParams, _config, context, ) }, signOut: async (context: AuthRequestContext) => { const _config = typeof config === 'object' ? config : await config(context) setEnvDefaults(process.env, _config) const options = Object.fromEntries(await context.request.formData()) return serverSignOut(options, _config, context) }, } }