import { parseAuth, requireAuthMode } from './auth.ts' import { intercomRequest } from './client.ts' import { inferOperationFromPath, intercomUrl, isMutatingMethod, isSearchPath } from './setup.ts' import type { IntercomAuthInput, JsonRecord, MutationInput } from './types.ts' import { optionalBoolean, optionalString, requireRecord, requireString } from './types.ts' export type IntercomRawRequestInput = IntercomAuthInput & MutationInput & { path: string method?: string query?: JsonRecord body?: JsonRecord } /** * Call the Intercom REST API with a saved OAuth integration or access token. * Search POST `/contacts/search` and `/conversations/search` are treated as * reads. Other mutating methods require `confirm: true`; use `dryRun: true` * to preview. * @example * import request from 'kody:@kody/intercom/request' * const result = await request({ path: '/contacts', query: { per_page: 5 } }) */ export async function request(input: IntercomRawRequestInput) { const path = requireString(input.path, 'path') const method = (input.method ?? 'GET').toUpperCase() const mutating = isMutatingMethod(method) && !isSearchPath(path) if (input.dryRun) { return { dryRun: true as const, url: intercomUrl(path, input.query, input), method, operation: inferOperationFromPath(method, path), path, query: input.query ?? {}, body: input.body ?? null, readOnly: !mutating, } } return intercomRequest({ ...input, path, method, operation: inferOperationFromPath(method, path), }) } /** * Call the Intercom REST API with a saved OAuth integration or access token. * @example * import request from 'kody:@kody/intercom/request' * const result = await request({ path: '/me' }) */ export default async function requestEntrypoint( params: Partial & Record = {}, ) { const input = requireRecord(params, 'request') return request({ ...parseAuth(input), path: requireString(input.path, 'path'), method: optionalString(input.method, 'method'), query: input.query as JsonRecord | undefined, body: input.body as JsonRecord | undefined, auth: requireAuthMode(input.auth), confirm: optionalBoolean(input.confirm, 'confirm'), dryRun: optionalBoolean(input.dryRun, 'dryRun'), }) }