UNPKG

@nekofar/warpcast

Version:

TypeScript client for interacting with Warpcast APIs

314 lines (311 loc) 7.54 kB
import { getAuthToken } from "./chunk-KMCLDZ5F.mjs"; import { jsonBodySerializer } from "./chunk-WA6Q3KIN.mjs"; import { serializeArrayParam, serializeObjectParam, serializePrimitiveParam } from "./chunk-TORJFY4S.mjs"; // src/client/client/utils.ts var PATH_PARAM_RE = /\{[^{}]+\}/g; var defaultPathSerializer = ({ path, url: _url }) => { let url = _url; const matches = _url.match(PATH_PARAM_RE); if (matches) { for (const match of matches) { let explode = false; let name = match.substring(1, match.length - 1); let style = "simple"; if (name.endsWith("*")) { explode = true; name = name.substring(0, name.length - 1); } if (name.startsWith(".")) { name = name.substring(1); style = "label"; } else if (name.startsWith(";")) { name = name.substring(1); style = "matrix"; } const value = path[name]; if (value === void 0 || value === null) { continue; } if (Array.isArray(value)) { url = url.replace( match, serializeArrayParam({ explode, name, style, value }) ); continue; } if (typeof value === "object") { url = url.replace( match, serializeObjectParam({ explode, name, style, value, valueOnly: true }) ); continue; } if (style === "matrix") { url = url.replace( match, `;${serializePrimitiveParam({ name, value })}` ); continue; } const replaceValue = encodeURIComponent( style === "label" ? `.${value}` : value ); url = url.replace(match, replaceValue); } } return url; }; var createQuerySerializer = ({ allowReserved, array, object } = {}) => { const querySerializer = (queryParams) => { const search = []; if (queryParams && typeof queryParams === "object") { for (const name in queryParams) { const value = queryParams[name]; if (value === void 0 || value === null) { continue; } if (Array.isArray(value)) { const serializedArray = serializeArrayParam({ allowReserved, explode: true, name, style: "form", value, ...array }); if (serializedArray) search.push(serializedArray); } else if (typeof value === "object") { const serializedObject = serializeObjectParam({ allowReserved, explode: true, name, style: "deepObject", value, ...object }); if (serializedObject) search.push(serializedObject); } else { const serializedPrimitive = serializePrimitiveParam({ allowReserved, name, value }); if (serializedPrimitive) search.push(serializedPrimitive); } } } return search.join("&"); }; return querySerializer; }; var getParseAs = (contentType) => { if (!contentType) { return "stream"; } const cleanContent = contentType.split(";")[0]?.trim(); if (!cleanContent) { return; } if (cleanContent.startsWith("application/json") || cleanContent.endsWith("+json")) { return "json"; } if (cleanContent === "multipart/form-data") { return "formData"; } if (["application/", "audio/", "image/", "video/"].some( (type) => cleanContent.startsWith(type) )) { return "blob"; } if (cleanContent.startsWith("text/")) { return "text"; } return; }; var setAuthParams = async ({ security, ...options }) => { for (const auth of security) { const token = await getAuthToken(auth, options.auth); if (!token) { continue; } const name = auth.name ?? "Authorization"; switch (auth.in) { case "query": if (!options.query) { options.query = {}; } options.query[name] = token; break; case "cookie": options.headers.append("Cookie", `${name}=${token}`); break; case "header": default: options.headers.set(name, token); break; } return; } }; var buildUrl = (options) => { const url = getUrl({ baseUrl: options.baseUrl, path: options.path, query: options.query, querySerializer: typeof options.querySerializer === "function" ? options.querySerializer : createQuerySerializer(options.querySerializer), url: options.url }); return url; }; var getUrl = ({ baseUrl, path, query, querySerializer, url: _url }) => { const pathUrl = _url.startsWith("/") ? _url : `/${_url}`; let url = (baseUrl ?? "") + pathUrl; if (path) { url = defaultPathSerializer({ path, url }); } let search = query ? querySerializer(query) : ""; if (search.startsWith("?")) { search = search.substring(1); } if (search) { url += `?${search}`; } return url; }; var mergeConfigs = (a, b) => { const config = { ...a, ...b }; if (config.baseUrl?.endsWith("/")) { config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1); } config.headers = mergeHeaders(a.headers, b.headers); return config; }; var mergeHeaders = (...headers) => { const mergedHeaders = new Headers(); for (const header of headers) { if (!header || typeof header !== "object") { continue; } const iterator = header instanceof Headers ? header.entries() : Object.entries(header); for (const [key, value] of iterator) { if (value === null) { mergedHeaders.delete(key); } else if (Array.isArray(value)) { for (const v of value) { mergedHeaders.append(key, v); } } else if (value !== void 0) { mergedHeaders.set( key, typeof value === "object" ? JSON.stringify(value) : value ); } } } return mergedHeaders; }; var Interceptors = class { constructor() { this._fns = []; } clear() { this._fns = []; } getInterceptorIndex(id) { if (typeof id === "number") { return this._fns[id] ? id : -1; } else { return this._fns.indexOf(id); } } exists(id) { const index = this.getInterceptorIndex(id); return !!this._fns[index]; } eject(id) { const index = this.getInterceptorIndex(id); if (this._fns[index]) { this._fns[index] = null; } } update(id, fn) { const index = this.getInterceptorIndex(id); if (this._fns[index]) { this._fns[index] = fn; return id; } else { return false; } } use(fn) { this._fns = [...this._fns, fn]; return this._fns.length - 1; } }; var createInterceptors = () => ({ error: new Interceptors(), request: new Interceptors(), response: new Interceptors() }); var defaultQuerySerializer = createQuerySerializer({ allowReserved: false, array: { explode: true, style: "form" }, object: { explode: true, style: "deepObject" } }); var defaultHeaders = { "Content-Type": "application/json" }; var createConfig = (override = {}) => ({ ...jsonBodySerializer, headers: defaultHeaders, parseAs: "auto", querySerializer: defaultQuerySerializer, ...override }); export { createQuerySerializer, getParseAs, setAuthParams, buildUrl, getUrl, mergeConfigs, mergeHeaders, createInterceptors, createConfig };