@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
JavaScript
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