import { isMutatingMethod, kitRequest } from './client.ts'
import { parseAuthInput } from './auth.ts'
import type { JsonRecord, KitAuthInput, MutationInput } from './types.ts'
import { optionalBoolean, optionalString, requireRecord, requireString } from './types.ts'
export type KitRawRequestInput = KitAuthInput &
MutationInput & {
path: string
method?: string
query?: JsonRecord
body?: JsonRecord
}
/**
* Call any Kit v4 REST path. GET is read-only. POST / PUT / PATCH / DELETE
* need `confirm: true` or `dryRun: true`.
* @example
* import { request } from 'kody:@kody/kit/request'
* const page = await request({ path: '/subscribers', query: { per_page: 5 } })
*/
export async function request(input: KitRawRequestInput) {
const method = (input.method ?? 'GET').toUpperCase()
const path = requireString(input.path, 'path')
if (isMutatingMethod(method) && input.dryRun !== true && input.confirm !== true) {
throw new Error(
`${method} ${path} requires confirm: true after explicit user approval, or dryRun: true.`,
)
}
return kitRequest({
...input,
method,
path,
})
}
/**
* Call any Kit v4 REST path.
* @example
* import request from 'kody:@kody/kit/request'
* const page = await request({ path: '/account' })
*/
export default async function requestEntrypoint(
params: Partial<KitRawRequestInput> & Record<string, unknown> = {},
) {
const input = requireRecord(params, 'request')
return request({
...parseAuthInput(input),
path: optionalString(input.path, 'path') ?? '',
method: optionalString(input.method, 'method'),
query: input.query && typeof input.query === 'object' ? (input.query as JsonRecord) : undefined,
body: input.body && typeof input.body === 'object' ? (input.body as JsonRecord) : undefined,
confirm: optionalBoolean(input.confirm, 'confirm'),
dryRun: optionalBoolean(input.dryRun, 'dryRun'),
})
}