import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; import { IAxiosRetryConfig } from "axios-retry"; import type { ActionInputParameters } from "../../types/ActionInputParameters"; import { inputs } from "./inputs"; export type HttpClient = AxiosInstance; interface RetryConfig extends Omit { /** The number of milliseconds to wait between retry attempts. */ retryDelay?: IAxiosRetryConfig["retryDelay"] | number; /** * When true, all errors will be retried. When false, specify * a retryCondition function to determine when retries should occur. */ retryAllErrors?: boolean; /** * When true, double the retryDelay after each attempt (e.g. 1000ms, 2000ms, 4000ms, 8000ms, etc.). * If no retryDelay is specified, defaults to axios-retry's exponentialDelay function. */ useExponentialBackoff?: boolean; } export interface ClientProps { /** The API's base URL (e.g. `https://api.acme.com/v2/`). */ baseUrl?: string; /** The type of response to expect. Set to 'json' to automatically parse a JSON response, or 'arraybuffer' for a binary file. */ responseType?: AxiosRequestConfig["responseType"]; /** Headers to send for all requests (e.g. Authorization header, etc.). */ headers?: AxiosRequestConfig["headers"]; /** URL Search parameters to add to all requests. */ params?: Record; /** The maximum amount of time (in milliseconds) to wait for a response. Defaults to infinity. */ timeout?: number; /** When enabled, log all HTTP requests and responses. */ debug?: boolean; /** Configuration used to determine if and how failed HTTP requests should be retried. */ retryConfig?: RetryConfig; } export declare const toAxiosRetryConfig: ({ retryDelay, retryAllErrors, retryCondition, useExponentialBackoff, ...rest }: RetryConfig) => IAxiosRetryConfig; /** * Creates a reusable Axios HTTP client pre-configured with a base URL, * headers, timeout, and optional retry logic. This is the recommended * way to make HTTP requests from custom component actions. * * @param props Configuration for the HTTP client. * @returns An Axios instance configured with the provided options. * @see {@link https://prismatic.io/docs/custom-connectors/connections/#using-the-built-in-createclient-http-client | Using the Built-in HTTP Client} * @example * import { createClient } from "@prismatic-io/spectral/dist/clients/http"; * * const client = createClient({ * baseUrl: "https://api.acme.com/v2", * headers: { Authorization: `Bearer ${accessToken}` }, * responseType: "json", * timeout: 30000, * debug: false, * retryConfig: { * retries: 3, * retryDelay: 1000, * useExponentialBackoff: true, * retryAllErrors: false, * }, * }); * * const { data } = await client.get("/items"); */ export declare const createClient: ({ baseUrl, responseType, headers, timeout, params, debug, retryConfig, }: ClientProps) => HttpClient; /** * A global error handler that examines a thrown error and yields additional * information if the error was produced by Spectral's HTTP client. If the * error is an Axios error, returns a structured object with the response * `data`, `status`, and `headers`. Otherwise, returns the error as-is. * * Commonly used as a component-level `hooks.error` handler. * * @param error A JavaScript error to handle. * @returns An error with data, status and headers if it was an Axios error, or the error otherwise. * @see {@link https://prismatic.io/docs/custom-connectors/error-handling/ | Error Handling} * @example * import { component } from "@prismatic-io/spectral"; * import { handleErrors } from "@prismatic-io/spectral/dist/clients/http"; * * export default component({ * key: "acme", * display: { label: "Acme", description: "Acme connector", iconPath: "icon.png" }, * hooks: { error: handleErrors }, * actions: { ... }, * }); */ export declare const handleErrors: (error: unknown) => unknown; type SendRawRequestValues = ActionInputParameters; /** * This function sends a raw HTTP request with full control over method, URL, * headers, query parameters, and body. Used internally by `buildRawRequestAction`. * * @param baseUrl The base URL of the API you're integrating with. * @param values An object comprising the HTTP request you'd like to make. * @param authorizationHeaders Auth headers to apply to the request. * @returns The Axios response to the request. * @see {@link https://prismatic.io/docs/integrations/low-code-integration-designer/raw-request-actions/#building-an-http-raw-request-action-in-your-custom-component | Raw Request Actions} * @example * import { sendRawRequest } from "@prismatic-io/spectral/dist/clients/http"; * * const response = await sendRawRequest( * "https://api.acme.com/v2", * { * method: "GET", * url: "/items", * headers: [], * queryParams: [{ key: "limit", value: "10" }], * responseType: "json", * }, * { Authorization: "Bearer my-token" }, * ); */ export declare const sendRawRequest: (baseUrl: string, values: SendRawRequestValues, authorizationHeaders?: Record) => Promise; /** * Builds a pre-configured "Raw Request" action for a custom connector. * This action exposes a full HTTP interface (method, URL, headers, query * params, body) so integration builders can make arbitrary API calls. * * @param baseUrl The base URL of the API you're integrating with. * @param label The display label for the action. Defaults to `"Raw Request"`. * @param description The display description for the action. Defaults to `"Issue a raw HTTP request"`. * @returns An action definition for the raw request action. * @see {@link https://prismatic.io/docs/integrations/low-code-integration-designer/raw-request-actions/#building-an-http-raw-request-action-in-your-custom-component | Raw Request Actions} * @example * import { buildRawRequestAction } from "@prismatic-io/spectral/dist/clients/http"; * * // Add a raw request action to your component * const actions = { * listItems: action({ ... }), * rawRequest: buildRawRequestAction("https://api.acme.com/v2"), * }; */ export declare const buildRawRequestAction: (baseUrl: string, label?: string, description?: string) => import("../..").ActionDefinition<{ url: { label: string; placeholder: string; type: "string"; required: true; comments: string; example: string; clean: (value: unknown) => string; }; method: { label: string; type: "string"; required: true; model: { label: import("axios").Method; value: import("axios").Method; }[]; comments: string; clean: (value: unknown) => string; }; data: { label: string; placeholder: string; type: "string"; required: false; comments: string; example: string; }; formData: { label: string; placeholder: string; type: "string"; collection: "keyvaluelist"; required: false; comments: string; example: string; }; fileData: { label: string; placeholder: string; type: "string"; collection: "keyvaluelist"; required: false; comments: string; example: string; }; fileDataFileNames: { label: string; placeholder: string; type: "string"; collection: "keyvaluelist"; required: false; comments: string; clean: (values: any) => Record | undefined; }; queryParams: { label: string; placeholder: string; type: "string"; collection: "keyvaluelist"; required: false; comments: string; }; headers: { label: string; placeholder: string; type: "string"; collection: "keyvaluelist"; required: false; comments: string; example: string; }; responseType: { label: string; placeholder: string; type: "string"; default: string; required: true; comments: string; model: { label: import("axios").ResponseType; value: import("axios").ResponseType; }[]; clean: (value: unknown) => import("axios").ResponseType; }; timeout: { label: string; type: "string"; required: false; comments: string; example: string; clean: (value: unknown) => number; }; debugRequest: { label: string; type: "boolean"; required: false; comments: string; clean: (value: unknown) => boolean; }; retryDelayMS: { label: string; placeholder: string; type: "string"; required: false; comments: string; default: string; clean: (value: unknown) => number; }; retryAllErrors: { label: string; type: "boolean"; default: string; required: false; comments: string; clean: (value: unknown) => boolean; }; maxRetries: { label: string; placeholder: string; type: "string"; required: false; comments: string; default: string; clean: (value: unknown) => number; }; useExponentialBackoff: { label: string; type: "boolean"; default: string; required: false; comments: string; clean: (value: unknown) => boolean; }; connection: { label: string; type: "connection"; required: true; }; }, import("../..").ConfigVarResultCollection, boolean, { data: any; }>; export { inputs };