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 & Record = {}, ) { 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'), }) }