UNPKG

sanity

Version:

Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches

74 lines (60 loc) 1.96 kB
import {type CliCommandDefinition} from '@sanity/cli' import {type DeliveryAttempt} from './types' const printHookAttemptCommand: CliCommandDefinition = { name: 'attempt', group: 'hook', signature: 'ATTEMPT_ID', helpText: '', description: 'Print details of a given webhook delivery attempt', action: async (args, context) => { const {apiClient, output} = context const [attemptId] = args.argsWithoutOptions const client = apiClient() let attempt try { attempt = await client.request<DeliveryAttempt>({uri: `/hooks/attempts/${attemptId}`}) } catch (err) { throw new Error(`Hook attempt retrieval failed:\n${err.message}`) } const {createdAt, resultCode, resultBody, failureReason, inProgress} = attempt output.print(`Date: ${createdAt}`) output.print(`Status: ${getStatus(attempt)}`) output.print(`Status code: ${resultCode}`) if (attempt.isFailure) { output.print(`Failure: ${formatFailure(attempt)}`) } if (!inProgress && (!failureReason || failureReason === 'http')) { const body = resultBody ? `\n---\n${resultBody}\n---\n` : '<empty>' output.print(`Response body: ${body}`) } }, } export default printHookAttemptCommand export function formatFailure( attempt: DeliveryAttempt, options: {includeHelp?: boolean} = {}, ): string { const {includeHelp} = options const {id, failureReason, resultCode} = attempt const help = includeHelp ? `(run \`sanity hook attempt ${id}\` for details)` : '' switch (failureReason) { case 'http': return `HTTP ${resultCode} ${help}` case 'timeout': return 'Request timed out' case 'network': return 'Network error' case 'other': default: } return 'Unknown error' } export function getStatus(attempt: DeliveryAttempt): string { if (attempt.isFailure) { return 'Failed' } if (attempt.inProgress) { return 'In progress' } return 'Delivered' }