import { asanaRequest, asanaUrl, inferOperationFromPath, isMutatingMethod } from './client.ts' import { ASANA_API_BASE_URL } from './setup.ts' import type { AsanaAuthInput, JsonRecord } from './types.ts' import { optionalBoolean, optionalString, requireRecord, requireString, } from './types.ts' import { requireAuthMode } from './auth.ts' export type AsanaRawRequestInput = AsanaAuthInput & { path: string method?: string query?: JsonRecord body?: JsonRecord confirm?: boolean dryRun?: boolean } /** * Call the Asana REST API with a saved OAuth integration or personal access * token. Unknown and mutating operations require `confirm: true`; use * `dryRun: true` to preview. * @example * import request from 'kody:@kody/asana/request' * const result = await request({ path: '/workspaces' }) */ export async function request(input: AsanaRawRequestInput) { const path = requireString(input.path, 'path') const method = (input.method ?? 'GET').toUpperCase() const operation = inferOperationFromPath(method, path) const integrationName = optionalString(input.integrationName, 'integrationName') ?? optionalString(input.integration, 'integration') const secretName = optionalString(input.secretName, 'secretName') const account = optionalString(input.account, 'account') const mutating = isMutatingMethod(method) if (input.dryRun) { return { dryRun: true, url: asanaUrl(path, input.query), apiBaseUrl: ASANA_API_BASE_URL, method, operation, path, query: input.query ?? {}, body: input.body ?? null, integrationName: integrationName ?? null, secretName: secretName ?? null, account: account ?? null, readOnly: !mutating, } } if (mutating && input.confirm !== true) { throw new Error( 'This Asana request may mutate data. Pass confirm: true only after explicit user approval, or use dryRun: true.', ) } return asanaRequest({ path, method, query: input.query, body: input.body, operation, integrationName, integration: input.integration, account, secretName, auth: input.auth, }) } /** * Call the Asana REST API with a saved OAuth integration or personal access * token. Mutating methods require `confirm: true`; use `dryRun: true` to preview. * @example * import request from 'kody:@kody/asana/request' * const result = await request({ path: '/users/me', query: { opt_fields: 'gid,name' } }) */ export default async function requestEntrypoint( params: Partial & Record = {}, ) { const input = requireRecord(params, 'request') return request({ path: requireString(input.path, 'path'), method: optionalString(input.method, 'method'), query: input.query as JsonRecord | undefined, body: input.body as JsonRecord | undefined, integrationName: optionalString(input.integrationName, 'integrationName'), integration: optionalString(input.integration, 'integration'), account: optionalString(input.account, 'account'), secretName: optionalString(input.secretName, 'secretName'), auth: requireAuthMode(input.auth), confirm: optionalBoolean(input.confirm, 'confirm'), dryRun: optionalBoolean(input.dryRun, 'dryRun'), }) }