UNPKG

@zayne-labs/callapi

Version:

A lightweight wrapper over fetch with quality of life improvements like built-in request cancellation, retries, interceptors and more

116 lines (113 loc) 3.52 kB
import { C as isArray, D as isObject, b as ValidationError, g as getValidatedValue, k as isString, w as isBlob, y as HTTPError } from "../../defaults-D5uiLm4M.js"; import { a as isValidationErrorInstance, i as isValidationError, n as isHTTPErrorInstance, r as isJavascriptError, t as isHTTPError } from "../../guards-BW5MdHRz.js"; //#region src/utils/external/body.ts const toStringOrStringify = (value) => { return isString(value) ? value : JSON.stringify(value); }; const toSearchParams = (data, schema) => { const result = getValidatedValue(data, schema, { variant: "sync" }); if (result.issues) throw new ValidationError({ issueCause: "toQueryString", issues: result.issues, response: null }); const searchParams = new URLSearchParams(); for (const [key, value] of Object.entries(result.value)) { if (value == null) continue; if (isArray(value)) { for (const innerValue of value) searchParams.append(key, toStringOrStringify(innerValue)); continue; } searchParams.set(key, toStringOrStringify(value)); } return searchParams; }; const toQueryString = (...parameters) => { return toSearchParams(...parameters).toString(); }; const toBlobOrString = (value) => { return isBlob(value) ? value : String(value); }; /** * @description Converts a plain object to FormData. * * Handles various data types: * - **Primitives** (string, number, boolean): Converted to strings * - **Blobs/Files**: Added directly to FormData * - **Arrays**: Each item is appended (allows multiple values for same key) * - **Objects**: JSON stringified before adding to FormData * * @example * ```ts * // Basic usage * const formData = toFormData({ * name: "John", * age: 30, * active: true * }); * * // With arrays * const formData = toFormData({ * tags: ["javascript", "typescript"], * name: "John" * }); * * // With files * const formData = toFormData({ * avatar: fileBlob, * name: "John" * }); * * // With nested objects (one level only) * const formData = toFormData({ * user: { name: "John", age: 30 }, * settings: { theme: "dark" } * }); */ const toFormData = (data, schema) => { const formData = new FormData(); const result = getValidatedValue(data, schema, { variant: "sync" }); if (result.issues) throw new ValidationError({ issueCause: "toFormData", issues: result.issues, response: null }); for (const [key, value] of Object.entries(result.value)) { if (isArray(value)) { for (const innerValue of value) formData.append(key, toBlobOrString(innerValue)); continue; } if (isObject(value) && !isBlob(value)) { formData.set(key, JSON.stringify(value)); continue; } formData.set(key, toBlobOrString(value)); } return formData; }; //#endregion //#region src/utils/external/define.ts const defineSchema = (routes, config) => { return { config: defineSchemaConfig(config), routes: defineSchemaRoutes(routes) }; }; const defineSchemaRoutes = (routes) => { return routes; }; const defineMainSchema = (mainSchema) => { return mainSchema; }; const defineSchemaConfig = (config) => { return config; }; const definePlugin = (plugin) => { return plugin; }; const defineBaseConfig = (baseConfig) => { return baseConfig; }; //#endregion export { HTTPError, ValidationError, defineBaseConfig, defineMainSchema, definePlugin, defineSchema, defineSchemaConfig, defineSchemaRoutes, isHTTPError, isHTTPErrorInstance, isJavascriptError, isValidationError, isValidationErrorInstance, toFormData, toQueryString, toSearchParams }; //# sourceMappingURL=index.js.map