@kubb/plugin-client 5.0.0-beta.56 → 5.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +8 -61
  2. package/dist/index.cjs +754 -1745
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.ts +170 -349
  5. package/dist/index.js +733 -1733
  6. package/dist/index.js.map +1 -1
  7. package/package.json +10 -63
  8. package/src/generators/clientGenerator.tsx +6 -132
  9. package/src/index.ts +1 -9
  10. package/src/plugin.ts +32 -122
  11. package/src/types.ts +27 -249
  12. package/dist/chunk-Bx3C2hgW.cjs +0 -38
  13. package/dist/clients/axios.cjs +0 -68
  14. package/dist/clients/axios.cjs.map +0 -1
  15. package/dist/clients/axios.d.ts +0 -49
  16. package/dist/clients/axios.js +0 -58
  17. package/dist/clients/axios.js.map +0 -1
  18. package/dist/clients/fetch.cjs +0 -128
  19. package/dist/clients/fetch.cjs.map +0 -1
  20. package/dist/clients/fetch.d.ts +0 -50
  21. package/dist/clients/fetch.js +0 -120
  22. package/dist/clients/fetch.js.map +0 -1
  23. package/dist/templates/clients/axios.source.cjs +0 -7
  24. package/dist/templates/clients/axios.source.cjs.map +0 -1
  25. package/dist/templates/clients/axios.source.d.ts +0 -7
  26. package/dist/templates/clients/axios.source.js +0 -6
  27. package/dist/templates/clients/axios.source.js.map +0 -1
  28. package/dist/templates/clients/fetch.source.cjs +0 -7
  29. package/dist/templates/clients/fetch.source.cjs.map +0 -1
  30. package/dist/templates/clients/fetch.source.d.ts +0 -7
  31. package/dist/templates/clients/fetch.source.js +0 -6
  32. package/dist/templates/clients/fetch.source.js.map +0 -1
  33. package/dist/templates/config.source.cjs +0 -7
  34. package/dist/templates/config.source.cjs.map +0 -1
  35. package/dist/templates/config.source.d.ts +0 -7
  36. package/dist/templates/config.source.js +0 -6
  37. package/dist/templates/config.source.js.map +0 -1
  38. package/src/clients/axios.ts +0 -113
  39. package/src/clients/fetch.ts +0 -201
  40. package/src/components/ClassClient.tsx +0 -161
  41. package/src/components/Client.tsx +0 -281
  42. package/src/components/StaticClassClient.tsx +0 -153
  43. package/src/components/Url.tsx +0 -90
  44. package/src/components/WrapperClient.tsx +0 -33
  45. package/src/functionParams.ts +0 -118
  46. package/src/generators/classClientGenerator.tsx +0 -261
  47. package/src/generators/groupedClientGenerator.tsx +0 -82
  48. package/src/generators/operationsGenerator.ts +0 -47
  49. package/src/generators/staticClassClientGenerator.tsx +0 -240
  50. package/src/resolvers/resolverClient.ts +0 -46
  51. package/src/templates/clients/axios.source.ts +0 -4
  52. package/src/templates/clients/fetch.source.ts +0 -4
  53. package/src/templates/config.source.ts +0 -4
  54. package/src/utils.ts +0 -259
  55. /package/dist/{chunk-C0LytTxp.js → rolldown-runtime-C0LytTxp.js} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch.cjs","names":[],"sources":["../../src/clients/fetch.ts"],"sourcesContent":["/**\n * RequestCredentials\n */\nexport type RequestCredentials = 'omit' | 'same-origin' | 'include'\n\n/**\n * Header values may be objects (e.g. JSON-encoded filter headers like `X-Filter`).\n * Non-string values are JSON-serialized before the request is sent.\n */\nexport type HeaderValue = string | number | boolean | null | undefined | object\nexport type HeadersInit = Array<[string, HeaderValue]> | Record<string, HeaderValue>\n\n/**\n * Subset of FetchRequestConfig\n */\nexport type RequestConfig<TData = unknown> = {\n baseURL?: string\n url?: string\n method?: 'GET' | 'PUT' | 'PATCH' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD'\n params?: unknown\n data?: TData | FormData\n responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'\n signal?: AbortSignal\n headers?: HeadersInit\n credentials?: RequestCredentials\n contentType?: string\n}\n\n/**\n * Subset of FetchResponse\n */\nexport type ResponseConfig<TData = unknown> = {\n data: TData\n status: number\n statusText: string\n headers: Headers\n}\n\nlet _config: Partial<RequestConfig> = {}\n\nexport const getConfig = () => _config\n\nexport const setConfig = (config: Partial<RequestConfig>) => {\n _config = config\n return getConfig()\n}\n\nexport const mergeConfig = <T extends RequestConfig>(...configs: Array<Partial<T>>): Partial<T> => {\n return configs.reduce<Partial<T>>((merged, config) => {\n return {\n ...merged,\n ...config,\n headers: {\n ...(Array.isArray(merged.headers) ? Object.fromEntries(merged.headers) : merged.headers),\n ...(Array.isArray(config.headers) ? Object.fromEntries(config.headers) : config.headers),\n },\n }\n }, {})\n}\n\n/**\n * Serializes header values into the string form `fetch` expects.\n * Objects (including arrays) are JSON-stringified so spec-defined object\n * headers like `X-Filter` are sent in their canonical JSON-string form.\n */\nfunction serializeHeaders(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) return {}\n const entries = Array.isArray(headers) ? headers : Object.entries(headers)\n const result: Record<string, string> = {}\n for (const [key, value] of entries) {\n if (value === undefined || value === null) continue\n result[key] = typeof value === 'string' ? value : typeof value === 'object' ? JSON.stringify(value) : String(value)\n }\n return result\n}\n\n/**\n * Serializes the request body into the form `fetch` expects.\n * `FormData`, `URLSearchParams`, `Blob`, `ArrayBuffer` and string bodies are passed through\n * untouched. Plain objects are encoded as `URLSearchParams` for `application/x-www-form-urlencoded`\n * and JSON-serialized otherwise.\n */\nfunction serializeBody(data: unknown, contentType?: string): BodyInit | undefined {\n if (data === undefined || data === null) return undefined\n if (data instanceof FormData || data instanceof URLSearchParams || data instanceof Blob || data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {\n return data as BodyInit\n }\n if (typeof data === 'string') return data\n if (contentType?.includes('application/x-www-form-urlencoded')) {\n return new URLSearchParams(data as Record<string, string>)\n }\n return JSON.stringify(data)\n}\n\n/**\n * Picks a `responseType` from a `Content-Type` header, or `undefined` when it is not recognized.\n */\nfunction detectResponseType(contentType: string | null): RequestConfig['responseType'] {\n if (!contentType) return undefined\n if (contentType.includes('application/json') || contentType.includes('text/json')) return 'json'\n if (contentType.includes('text/')) return 'text'\n if (contentType.includes('image/') || contentType.includes('application/octet-stream')) return 'blob'\n return undefined\n}\n\n/**\n * Parses a `fetch` response body.\n *\n * - Empty responses (204/205/304 or no body) resolve to `{}`.\n * - An explicit `responseType` (or one detected from the `Content-Type` header) forces the matching\n * `Response` method.\n * - As a last resort the body is read as text and `JSON.parse`d, falling back to the raw text.\n */\nasync function parseResponse<TData>(response: Response, responseType?: RequestConfig['responseType']): Promise<TData> {\n if ([204, 205, 304].includes(response.status) || !response.body) {\n return {} as TData\n }\n\n switch (responseType ?? detectResponseType(response.headers.get('Content-Type'))) {\n case 'text':\n case 'document':\n return (await response.text()) as TData\n case 'blob':\n return (await response.blob()) as TData\n case 'arraybuffer':\n return (await response.arrayBuffer()) as TData\n case 'stream':\n return response.body as TData\n case 'json':\n return (await response.json()) as TData\n }\n\n // Explicit but unrecognized responseType keeps the JSON default; otherwise read text and parse it.\n if (responseType) {\n return (await response.json()) as TData\n }\n const text = await response.text()\n if (!text) {\n return {} as TData\n }\n try {\n return JSON.parse(text) as TData\n } catch {\n return text as TData\n }\n}\n\nexport type ResponseErrorConfig<TError = unknown> = TError\n\nexport type Client = <TResponseData, _TError = unknown, TRequestData = unknown>(\n config: RequestConfig<TRequestData>,\n request?: unknown,\n) => Promise<ResponseConfig<TResponseData>>\n\nexport const client = async <TResponseData, _TError = unknown, RequestData = unknown>(\n paramsConfig: RequestConfig<RequestData>,\n _request?: unknown,\n): Promise<ResponseConfig<TResponseData>> => {\n const normalizedParams = new URLSearchParams()\n\n const config = mergeConfig(getConfig(), paramsConfig)\n\n Object.entries(config.params || {}).forEach(([key, value]) => {\n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : value.toString())\n }\n })\n\n let targetUrl = [config.baseURL, config.url].filter(Boolean).join('')\n\n if (config.params) {\n targetUrl += `?${normalizedParams}`\n }\n\n const headers: Record<string, string> = {\n ...(config.contentType && config.contentType !== 'multipart/form-data' ? { 'Content-Type': config.contentType } : {}),\n ...serializeHeaders(config.headers),\n }\n\n const response = await globalThis.fetch(targetUrl, {\n credentials: config.credentials || 'same-origin',\n method: config.method?.toUpperCase(),\n body: serializeBody(config.data, headers['Content-Type'] ?? headers['content-type']),\n signal: config.signal,\n headers,\n })\n\n const data = await parseResponse<TResponseData>(response, config.responseType)\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers as Headers,\n }\n}\n\nclient.getConfig = getConfig\nclient.setConfig = setConfig\n\nexport default client\n"],"mappings":"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"}
@@ -1,50 +0,0 @@
1
- import { t as __name } from "../chunk-C0LytTxp.js";
2
-
3
- //#region src/clients/fetch.d.ts
4
- /**
5
- * RequestCredentials
6
- */
7
- type RequestCredentials = 'omit' | 'same-origin' | 'include';
8
- /**
9
- * Header values may be objects (e.g. JSON-encoded filter headers like `X-Filter`).
10
- * Non-string values are JSON-serialized before the request is sent.
11
- */
12
- type HeaderValue = string | number | boolean | null | undefined | object;
13
- type HeadersInit = Array<[string, HeaderValue]> | Record<string, HeaderValue>;
14
- /**
15
- * Subset of FetchRequestConfig
16
- */
17
- type RequestConfig<TData = unknown> = {
18
- baseURL?: string;
19
- url?: string;
20
- method?: 'GET' | 'PUT' | 'PATCH' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD';
21
- params?: unknown;
22
- data?: TData | FormData;
23
- responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream';
24
- signal?: AbortSignal;
25
- headers?: HeadersInit;
26
- credentials?: RequestCredentials;
27
- contentType?: string;
28
- };
29
- /**
30
- * Subset of FetchResponse
31
- */
32
- type ResponseConfig<TData = unknown> = {
33
- data: TData;
34
- status: number;
35
- statusText: string;
36
- headers: Headers;
37
- };
38
- declare const getConfig: () => Partial<RequestConfig<unknown>>;
39
- declare const setConfig: (config: Partial<RequestConfig>) => Partial<RequestConfig<unknown>>;
40
- declare const mergeConfig: <T extends RequestConfig>(...configs: Array<Partial<T>>) => Partial<T>;
41
- type ResponseErrorConfig<TError = unknown> = TError;
42
- type Client = <TResponseData, _TError = unknown, TRequestData = unknown>(config: RequestConfig<TRequestData>, request?: unknown) => Promise<ResponseConfig<TResponseData>>;
43
- declare const client: {
44
- <TResponseData, _TError = unknown, RequestData = unknown>(paramsConfig: RequestConfig<RequestData>, _request?: unknown): Promise<ResponseConfig<TResponseData>>;
45
- getConfig: () => Partial<RequestConfig<unknown>>;
46
- setConfig: (config: Partial<RequestConfig>) => Partial<RequestConfig<unknown>>;
47
- };
48
- //#endregion
49
- export { Client, HeaderValue, HeadersInit, RequestConfig, RequestCredentials, ResponseConfig, ResponseErrorConfig, client, client as default, getConfig, mergeConfig, setConfig };
50
- //# sourceMappingURL=fetch.d.ts.map
@@ -1,120 +0,0 @@
1
- import "../chunk-C0LytTxp.js";
2
- //#region src/clients/fetch.ts
3
- let _config = {};
4
- const getConfig = () => _config;
5
- const setConfig = (config) => {
6
- _config = config;
7
- return getConfig();
8
- };
9
- const mergeConfig = (...configs) => {
10
- return configs.reduce((merged, config) => {
11
- return {
12
- ...merged,
13
- ...config,
14
- headers: {
15
- ...Array.isArray(merged.headers) ? Object.fromEntries(merged.headers) : merged.headers,
16
- ...Array.isArray(config.headers) ? Object.fromEntries(config.headers) : config.headers
17
- }
18
- };
19
- }, {});
20
- };
21
- /**
22
- * Serializes header values into the string form `fetch` expects.
23
- * Objects (including arrays) are JSON-stringified so spec-defined object
24
- * headers like `X-Filter` are sent in their canonical JSON-string form.
25
- */
26
- function serializeHeaders(headers) {
27
- if (!headers) return {};
28
- const entries = Array.isArray(headers) ? headers : Object.entries(headers);
29
- const result = {};
30
- for (const [key, value] of entries) {
31
- if (value === void 0 || value === null) continue;
32
- result[key] = typeof value === "string" ? value : typeof value === "object" ? JSON.stringify(value) : String(value);
33
- }
34
- return result;
35
- }
36
- /**
37
- * Serializes the request body into the form `fetch` expects.
38
- * `FormData`, `URLSearchParams`, `Blob`, `ArrayBuffer` and string bodies are passed through
39
- * untouched. Plain objects are encoded as `URLSearchParams` for `application/x-www-form-urlencoded`
40
- * and JSON-serialized otherwise.
41
- */
42
- function serializeBody(data, contentType) {
43
- if (data === void 0 || data === null) return void 0;
44
- if (data instanceof FormData || data instanceof URLSearchParams || data instanceof Blob || data instanceof ArrayBuffer || ArrayBuffer.isView(data)) return data;
45
- if (typeof data === "string") return data;
46
- if (contentType?.includes("application/x-www-form-urlencoded")) return new URLSearchParams(data);
47
- return JSON.stringify(data);
48
- }
49
- /**
50
- * Picks a `responseType` from a `Content-Type` header, or `undefined` when it is not recognized.
51
- */
52
- function detectResponseType(contentType) {
53
- if (!contentType) return void 0;
54
- if (contentType.includes("application/json") || contentType.includes("text/json")) return "json";
55
- if (contentType.includes("text/")) return "text";
56
- if (contentType.includes("image/") || contentType.includes("application/octet-stream")) return "blob";
57
- }
58
- /**
59
- * Parses a `fetch` response body.
60
- *
61
- * - Empty responses (204/205/304 or no body) resolve to `{}`.
62
- * - An explicit `responseType` (or one detected from the `Content-Type` header) forces the matching
63
- * `Response` method.
64
- * - As a last resort the body is read as text and `JSON.parse`d, falling back to the raw text.
65
- */
66
- async function parseResponse(response, responseType) {
67
- if ([
68
- 204,
69
- 205,
70
- 304
71
- ].includes(response.status) || !response.body) return {};
72
- switch (responseType ?? detectResponseType(response.headers.get("Content-Type"))) {
73
- case "text":
74
- case "document": return await response.text();
75
- case "blob": return await response.blob();
76
- case "arraybuffer": return await response.arrayBuffer();
77
- case "stream": return response.body;
78
- case "json": return await response.json();
79
- }
80
- if (responseType) return await response.json();
81
- const text = await response.text();
82
- if (!text) return {};
83
- try {
84
- return JSON.parse(text);
85
- } catch {
86
- return text;
87
- }
88
- }
89
- const client = async (paramsConfig, _request) => {
90
- const normalizedParams = new URLSearchParams();
91
- const config = mergeConfig(getConfig(), paramsConfig);
92
- Object.entries(config.params || {}).forEach(([key, value]) => {
93
- if (value !== void 0) normalizedParams.append(key, value === null ? "null" : value.toString());
94
- });
95
- let targetUrl = [config.baseURL, config.url].filter(Boolean).join("");
96
- if (config.params) targetUrl += `?${normalizedParams}`;
97
- const headers = {
98
- ...config.contentType && config.contentType !== "multipart/form-data" ? { "Content-Type": config.contentType } : {},
99
- ...serializeHeaders(config.headers)
100
- };
101
- const response = await globalThis.fetch(targetUrl, {
102
- credentials: config.credentials || "same-origin",
103
- method: config.method?.toUpperCase(),
104
- body: serializeBody(config.data, headers["Content-Type"] ?? headers["content-type"]),
105
- signal: config.signal,
106
- headers
107
- });
108
- return {
109
- data: await parseResponse(response, config.responseType),
110
- status: response.status,
111
- statusText: response.statusText,
112
- headers: response.headers
113
- };
114
- };
115
- client.getConfig = getConfig;
116
- client.setConfig = setConfig;
117
- //#endregion
118
- export { client, client as default, getConfig, mergeConfig, setConfig };
119
-
120
- //# sourceMappingURL=fetch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch.js","names":[],"sources":["../../src/clients/fetch.ts"],"sourcesContent":["/**\n * RequestCredentials\n */\nexport type RequestCredentials = 'omit' | 'same-origin' | 'include'\n\n/**\n * Header values may be objects (e.g. JSON-encoded filter headers like `X-Filter`).\n * Non-string values are JSON-serialized before the request is sent.\n */\nexport type HeaderValue = string | number | boolean | null | undefined | object\nexport type HeadersInit = Array<[string, HeaderValue]> | Record<string, HeaderValue>\n\n/**\n * Subset of FetchRequestConfig\n */\nexport type RequestConfig<TData = unknown> = {\n baseURL?: string\n url?: string\n method?: 'GET' | 'PUT' | 'PATCH' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD'\n params?: unknown\n data?: TData | FormData\n responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'\n signal?: AbortSignal\n headers?: HeadersInit\n credentials?: RequestCredentials\n contentType?: string\n}\n\n/**\n * Subset of FetchResponse\n */\nexport type ResponseConfig<TData = unknown> = {\n data: TData\n status: number\n statusText: string\n headers: Headers\n}\n\nlet _config: Partial<RequestConfig> = {}\n\nexport const getConfig = () => _config\n\nexport const setConfig = (config: Partial<RequestConfig>) => {\n _config = config\n return getConfig()\n}\n\nexport const mergeConfig = <T extends RequestConfig>(...configs: Array<Partial<T>>): Partial<T> => {\n return configs.reduce<Partial<T>>((merged, config) => {\n return {\n ...merged,\n ...config,\n headers: {\n ...(Array.isArray(merged.headers) ? Object.fromEntries(merged.headers) : merged.headers),\n ...(Array.isArray(config.headers) ? Object.fromEntries(config.headers) : config.headers),\n },\n }\n }, {})\n}\n\n/**\n * Serializes header values into the string form `fetch` expects.\n * Objects (including arrays) are JSON-stringified so spec-defined object\n * headers like `X-Filter` are sent in their canonical JSON-string form.\n */\nfunction serializeHeaders(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) return {}\n const entries = Array.isArray(headers) ? headers : Object.entries(headers)\n const result: Record<string, string> = {}\n for (const [key, value] of entries) {\n if (value === undefined || value === null) continue\n result[key] = typeof value === 'string' ? value : typeof value === 'object' ? JSON.stringify(value) : String(value)\n }\n return result\n}\n\n/**\n * Serializes the request body into the form `fetch` expects.\n * `FormData`, `URLSearchParams`, `Blob`, `ArrayBuffer` and string bodies are passed through\n * untouched. Plain objects are encoded as `URLSearchParams` for `application/x-www-form-urlencoded`\n * and JSON-serialized otherwise.\n */\nfunction serializeBody(data: unknown, contentType?: string): BodyInit | undefined {\n if (data === undefined || data === null) return undefined\n if (data instanceof FormData || data instanceof URLSearchParams || data instanceof Blob || data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {\n return data as BodyInit\n }\n if (typeof data === 'string') return data\n if (contentType?.includes('application/x-www-form-urlencoded')) {\n return new URLSearchParams(data as Record<string, string>)\n }\n return JSON.stringify(data)\n}\n\n/**\n * Picks a `responseType` from a `Content-Type` header, or `undefined` when it is not recognized.\n */\nfunction detectResponseType(contentType: string | null): RequestConfig['responseType'] {\n if (!contentType) return undefined\n if (contentType.includes('application/json') || contentType.includes('text/json')) return 'json'\n if (contentType.includes('text/')) return 'text'\n if (contentType.includes('image/') || contentType.includes('application/octet-stream')) return 'blob'\n return undefined\n}\n\n/**\n * Parses a `fetch` response body.\n *\n * - Empty responses (204/205/304 or no body) resolve to `{}`.\n * - An explicit `responseType` (or one detected from the `Content-Type` header) forces the matching\n * `Response` method.\n * - As a last resort the body is read as text and `JSON.parse`d, falling back to the raw text.\n */\nasync function parseResponse<TData>(response: Response, responseType?: RequestConfig['responseType']): Promise<TData> {\n if ([204, 205, 304].includes(response.status) || !response.body) {\n return {} as TData\n }\n\n switch (responseType ?? detectResponseType(response.headers.get('Content-Type'))) {\n case 'text':\n case 'document':\n return (await response.text()) as TData\n case 'blob':\n return (await response.blob()) as TData\n case 'arraybuffer':\n return (await response.arrayBuffer()) as TData\n case 'stream':\n return response.body as TData\n case 'json':\n return (await response.json()) as TData\n }\n\n // Explicit but unrecognized responseType keeps the JSON default; otherwise read text and parse it.\n if (responseType) {\n return (await response.json()) as TData\n }\n const text = await response.text()\n if (!text) {\n return {} as TData\n }\n try {\n return JSON.parse(text) as TData\n } catch {\n return text as TData\n }\n}\n\nexport type ResponseErrorConfig<TError = unknown> = TError\n\nexport type Client = <TResponseData, _TError = unknown, TRequestData = unknown>(\n config: RequestConfig<TRequestData>,\n request?: unknown,\n) => Promise<ResponseConfig<TResponseData>>\n\nexport const client = async <TResponseData, _TError = unknown, RequestData = unknown>(\n paramsConfig: RequestConfig<RequestData>,\n _request?: unknown,\n): Promise<ResponseConfig<TResponseData>> => {\n const normalizedParams = new URLSearchParams()\n\n const config = mergeConfig(getConfig(), paramsConfig)\n\n Object.entries(config.params || {}).forEach(([key, value]) => {\n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : value.toString())\n }\n })\n\n let targetUrl = [config.baseURL, config.url].filter(Boolean).join('')\n\n if (config.params) {\n targetUrl += `?${normalizedParams}`\n }\n\n const headers: Record<string, string> = {\n ...(config.contentType && config.contentType !== 'multipart/form-data' ? { 'Content-Type': config.contentType } : {}),\n ...serializeHeaders(config.headers),\n }\n\n const response = await globalThis.fetch(targetUrl, {\n credentials: config.credentials || 'same-origin',\n method: config.method?.toUpperCase(),\n body: serializeBody(config.data, headers['Content-Type'] ?? headers['content-type']),\n signal: config.signal,\n headers,\n })\n\n const data = await parseResponse<TResponseData>(response, config.responseType)\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers as Headers,\n }\n}\n\nclient.getConfig = getConfig\nclient.setConfig = setConfig\n\nexport default client\n"],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/templates/clients/axios.source.ts
3
- const source = "import type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'\nimport axios from 'axios'\n\ndeclare const AXIOS_BASE: string\ndeclare const AXIOS_HEADERS: string\n\n/**\n * Header values may be objects (e.g. JSON-encoded headers like `X-Filter` in the Linode API).\n * Non-string values are JSON-serialized before the request is sent.\n */\nexport type HeaderValue = string | number | boolean | null | undefined | object\nexport type HeadersInit = Array<[string, HeaderValue]> | Record<string, HeaderValue>\n\n/**\n * Subset of AxiosRequestConfig\n */\nexport type RequestConfig<TData = unknown> = {\n baseURL?: string\n url?: string\n method?: 'GET' | 'PUT' | 'PATCH' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD'\n params?: unknown\n data?: TData | FormData\n responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'\n signal?: AbortSignal\n validateStatus?: (status: number) => boolean\n headers?: HeadersInit\n contentType?: string\n}\n\n/**\n * Subset of AxiosResponse\n */\nexport type ResponseConfig<TData = unknown> = {\n data: TData\n status: number\n statusText: string\n headers: AxiosResponse['headers']\n}\n\nexport type ResponseErrorConfig<TError = unknown> = AxiosError<TError>\n\nexport type Client = <TData, _TError = unknown, TVariables = unknown>(config: RequestConfig<TVariables>, request?: unknown) => Promise<ResponseConfig<TData>>\n\nlet _config: Partial<RequestConfig> = {\n baseURL: typeof AXIOS_BASE !== 'undefined' ? AXIOS_BASE : undefined,\n headers: typeof AXIOS_HEADERS !== 'undefined' ? JSON.parse(AXIOS_HEADERS) : undefined,\n}\n\nexport const getConfig = () => _config\n\nexport const setConfig = (config: RequestConfig) => {\n _config = config\n return getConfig()\n}\n\nexport const mergeConfig = <T extends RequestConfig>(...configs: Array<Partial<T>>): Partial<T> => {\n return configs.reduce<Partial<T>>((merged, config) => {\n return {\n ...merged,\n ...config,\n headers: {\n ...(Array.isArray(merged.headers) ? Object.fromEntries(merged.headers) : merged.headers),\n ...(Array.isArray(config.headers) ? Object.fromEntries(config.headers) : config.headers),\n },\n }\n }, {})\n}\n\n/**\n * Serializes header values into the string form `axios` ultimately puts on the wire.\n * Objects (including arrays) are JSON-stringified so spec-defined object headers like `X-Filter`\n * are sent in their canonical JSON-string form rather than `[object Object]`.\n */\nfunction serializeHeaders(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) return {}\n const entries = Array.isArray(headers) ? headers : Object.entries(headers)\n const result: Record<string, string> = {}\n for (const [key, value] of entries) {\n if (value === undefined || value === null) continue\n result[key] = typeof value === 'string' ? value : typeof value === 'object' ? JSON.stringify(value) : String(value)\n }\n return result\n}\n\nexport const axiosInstance = axios.create(getConfig() as AxiosRequestConfig)\n\nexport const client = async <TData, TError = unknown, TVariables = unknown>(\n config: RequestConfig<TVariables>,\n _request?: unknown,\n): Promise<ResponseConfig<TData>> => {\n const requestConfig = mergeConfig(getConfig(), config)\n const { contentType, headers, ...axiosConfig } = requestConfig\n return axiosInstance\n .request<TData, ResponseConfig<TData>>({\n ...axiosConfig,\n headers: {\n ...(contentType && contentType !== 'multipart/form-data' ? { 'Content-Type': contentType } : {}),\n ...serializeHeaders(headers),\n },\n })\n .catch((e: AxiosError<TError>) => {\n throw e\n })\n}\n\nclient.getConfig = getConfig\nclient.setConfig = setConfig\n";
4
- //#endregion
5
- exports.source = source;
6
-
7
- //# sourceMappingURL=axios.source.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"axios.source.cjs","names":[],"sources":[],"mappings":""}
@@ -1,7 +0,0 @@
1
- import { t as __name } from "../../chunk-C0LytTxp.js";
2
-
3
- //#region src/templates/clients/axios.source.d.ts
4
- declare const source: string;
5
- //#endregion
6
- export { source };
7
- //# sourceMappingURL=axios.source.d.ts.map
@@ -1,6 +0,0 @@
1
- //#region src/templates/clients/axios.source.ts
2
- const source = "import type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'\nimport axios from 'axios'\n\ndeclare const AXIOS_BASE: string\ndeclare const AXIOS_HEADERS: string\n\n/**\n * Header values may be objects (e.g. JSON-encoded headers like `X-Filter` in the Linode API).\n * Non-string values are JSON-serialized before the request is sent.\n */\nexport type HeaderValue = string | number | boolean | null | undefined | object\nexport type HeadersInit = Array<[string, HeaderValue]> | Record<string, HeaderValue>\n\n/**\n * Subset of AxiosRequestConfig\n */\nexport type RequestConfig<TData = unknown> = {\n baseURL?: string\n url?: string\n method?: 'GET' | 'PUT' | 'PATCH' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD'\n params?: unknown\n data?: TData | FormData\n responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'\n signal?: AbortSignal\n validateStatus?: (status: number) => boolean\n headers?: HeadersInit\n contentType?: string\n}\n\n/**\n * Subset of AxiosResponse\n */\nexport type ResponseConfig<TData = unknown> = {\n data: TData\n status: number\n statusText: string\n headers: AxiosResponse['headers']\n}\n\nexport type ResponseErrorConfig<TError = unknown> = AxiosError<TError>\n\nexport type Client = <TData, _TError = unknown, TVariables = unknown>(config: RequestConfig<TVariables>, request?: unknown) => Promise<ResponseConfig<TData>>\n\nlet _config: Partial<RequestConfig> = {\n baseURL: typeof AXIOS_BASE !== 'undefined' ? AXIOS_BASE : undefined,\n headers: typeof AXIOS_HEADERS !== 'undefined' ? JSON.parse(AXIOS_HEADERS) : undefined,\n}\n\nexport const getConfig = () => _config\n\nexport const setConfig = (config: RequestConfig) => {\n _config = config\n return getConfig()\n}\n\nexport const mergeConfig = <T extends RequestConfig>(...configs: Array<Partial<T>>): Partial<T> => {\n return configs.reduce<Partial<T>>((merged, config) => {\n return {\n ...merged,\n ...config,\n headers: {\n ...(Array.isArray(merged.headers) ? Object.fromEntries(merged.headers) : merged.headers),\n ...(Array.isArray(config.headers) ? Object.fromEntries(config.headers) : config.headers),\n },\n }\n }, {})\n}\n\n/**\n * Serializes header values into the string form `axios` ultimately puts on the wire.\n * Objects (including arrays) are JSON-stringified so spec-defined object headers like `X-Filter`\n * are sent in their canonical JSON-string form rather than `[object Object]`.\n */\nfunction serializeHeaders(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) return {}\n const entries = Array.isArray(headers) ? headers : Object.entries(headers)\n const result: Record<string, string> = {}\n for (const [key, value] of entries) {\n if (value === undefined || value === null) continue\n result[key] = typeof value === 'string' ? value : typeof value === 'object' ? JSON.stringify(value) : String(value)\n }\n return result\n}\n\nexport const axiosInstance = axios.create(getConfig() as AxiosRequestConfig)\n\nexport const client = async <TData, TError = unknown, TVariables = unknown>(\n config: RequestConfig<TVariables>,\n _request?: unknown,\n): Promise<ResponseConfig<TData>> => {\n const requestConfig = mergeConfig(getConfig(), config)\n const { contentType, headers, ...axiosConfig } = requestConfig\n return axiosInstance\n .request<TData, ResponseConfig<TData>>({\n ...axiosConfig,\n headers: {\n ...(contentType && contentType !== 'multipart/form-data' ? { 'Content-Type': contentType } : {}),\n ...serializeHeaders(headers),\n },\n })\n .catch((e: AxiosError<TError>) => {\n throw e\n })\n}\n\nclient.getConfig = getConfig\nclient.setConfig = setConfig\n";
3
- //#endregion
4
- export { source };
5
-
6
- //# sourceMappingURL=axios.source.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"axios.source.js","names":[],"sources":[],"mappings":""}
@@ -1,7 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/templates/clients/fetch.source.ts
3
- const source = "/**\n * RequestCredentials\n */\nexport type RequestCredentials = 'omit' | 'same-origin' | 'include'\n\n/**\n * Header values may be objects (e.g. JSON-encoded headers like `X-Filter` in the Linode API).\n * Non-string values are JSON-serialized before the request is sent.\n */\nexport type HeaderValue = string | number | boolean | null | undefined | object\nexport type HeadersInit = Array<[string, HeaderValue]> | Record<string, HeaderValue>\n\n/**\n * Subset of FetchRequestConfig\n */\nexport type RequestConfig<TData = unknown> = {\n baseURL?: string\n url?: string\n method?: 'GET' | 'PUT' | 'PATCH' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD'\n params?: unknown\n data?: TData | FormData\n responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'\n signal?: AbortSignal\n headers?: HeadersInit\n credentials?: RequestCredentials\n contentType?: string\n}\n\n/**\n * Subset of FetchResponse\n */\nexport type ResponseConfig<TData = unknown> = {\n data: TData\n status: number\n statusText: string\n headers: Headers\n}\n\nlet _config: Partial<RequestConfig> = {}\n\nexport const getConfig = () => _config\n\nexport const setConfig = (config: Partial<RequestConfig>) => {\n _config = config\n return getConfig()\n}\n\nexport const mergeConfig = <T extends RequestConfig>(...configs: Array<Partial<T>>): Partial<T> => {\n return configs.reduce<Partial<T>>((merged, config) => {\n return {\n ...merged,\n ...config,\n headers: {\n ...(Array.isArray(merged.headers) ? Object.fromEntries(merged.headers) : merged.headers),\n ...(Array.isArray(config.headers) ? Object.fromEntries(config.headers) : config.headers),\n },\n }\n }, {})\n}\n\n/**\n * Serializes header values into the string form `fetch` expects.\n * Objects (including arrays) are JSON-stringified so spec-defined object headers like `X-Filter`\n * are sent in their canonical JSON-string form rather than `[object Object]`.\n */\nfunction serializeHeaders(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) return {}\n const entries = Array.isArray(headers) ? headers : Object.entries(headers)\n const result: Record<string, string> = {}\n for (const [key, value] of entries) {\n if (value === undefined || value === null) continue\n result[key] = typeof value === 'string' ? value : typeof value === 'object' ? JSON.stringify(value) : String(value)\n }\n return result\n}\n\n/**\n * Serializes the request body into the form `fetch` expects.\n * `FormData`, `URLSearchParams`, `Blob`, `ArrayBuffer` and string bodies are passed through\n * untouched. Plain objects are encoded as `URLSearchParams` for `application/x-www-form-urlencoded`\n * and JSON-serialized otherwise.\n */\nfunction serializeBody(data: unknown, contentType?: string): BodyInit | undefined {\n if (data === undefined || data === null) return undefined\n if (data instanceof FormData || data instanceof URLSearchParams || data instanceof Blob || data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {\n return data as BodyInit\n }\n if (typeof data === 'string') return data\n if (contentType?.includes('application/x-www-form-urlencoded')) {\n return new URLSearchParams(data as Record<string, string>)\n }\n return JSON.stringify(data)\n}\n\n/**\n * Picks a `responseType` from a `Content-Type` header, or `undefined` when it is not recognized.\n */\nfunction detectResponseType(contentType: string | null): RequestConfig['responseType'] {\n if (!contentType) return undefined\n if (contentType.includes('application/json') || contentType.includes('text/json')) return 'json'\n if (contentType.includes('text/')) return 'text'\n if (contentType.includes('image/') || contentType.includes('application/octet-stream')) return 'blob'\n return undefined\n}\n\n/**\n * Parses a `fetch` response body.\n *\n * - Empty responses (204/205/304 or no body) resolve to `{}`.\n * - An explicit `responseType` (or one detected from the `Content-Type` header) forces the matching\n * `Response` method.\n * - As a last resort the body is read as text and `JSON.parse`d, falling back to the raw text.\n */\nasync function parseResponse<TData>(response: Response, responseType?: RequestConfig['responseType']): Promise<TData> {\n if ([204, 205, 304].includes(response.status) || !response.body) {\n return {} as TData\n }\n\n switch (responseType ?? detectResponseType(response.headers.get('Content-Type'))) {\n case 'text':\n case 'document':\n return (await response.text()) as TData\n case 'blob':\n return (await response.blob()) as TData\n case 'arraybuffer':\n return (await response.arrayBuffer()) as TData\n case 'stream':\n return response.body as TData\n case 'json':\n return (await response.json()) as TData\n }\n\n // Explicit but unrecognized responseType keeps the JSON default; otherwise read text and parse it.\n if (responseType) {\n return (await response.json()) as TData\n }\n const text = await response.text()\n if (!text) {\n return {} as TData\n }\n try {\n return JSON.parse(text) as TData\n } catch {\n return text as TData\n }\n}\n\nexport type ResponseErrorConfig<TError = unknown> = TError\n\nexport type Client = <TData, _TError = unknown, TVariables = unknown>(config: RequestConfig<TVariables>, request?: unknown) => Promise<ResponseConfig<TData>>\n\nexport const client = async <TData, _TError = unknown, TVariables = unknown>(\n paramsConfig: RequestConfig<TVariables>,\n _request?: unknown,\n): Promise<ResponseConfig<TData>> => {\n const normalizedParams = new URLSearchParams()\n\n const config = mergeConfig(getConfig(), paramsConfig)\n\n Object.entries(config.params || {}).forEach(([key, value]) => {\n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : value.toString())\n }\n })\n\n let targetUrl = [config.baseURL, config.url].filter(Boolean).join('')\n\n if (config.params) {\n targetUrl += `?${normalizedParams}`\n }\n\n const headers: Record<string, string> = {\n ...(config.contentType && config.contentType !== 'multipart/form-data' ? { 'Content-Type': config.contentType } : {}),\n ...serializeHeaders(config.headers),\n }\n\n const response = await globalThis.fetch(targetUrl, {\n credentials: config.credentials || 'same-origin',\n method: config.method?.toUpperCase(),\n body: serializeBody(config.data, headers['Content-Type'] ?? headers['content-type']),\n signal: config.signal,\n headers,\n })\n\n const data = await parseResponse<TData>(response, config.responseType)\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers as Headers,\n }\n}\n\nclient.getConfig = getConfig\nclient.setConfig = setConfig\n";
4
- //#endregion
5
- exports.source = source;
6
-
7
- //# sourceMappingURL=fetch.source.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch.source.cjs","names":[],"sources":[],"mappings":""}
@@ -1,7 +0,0 @@
1
- import { t as __name } from "../../chunk-C0LytTxp.js";
2
-
3
- //#region src/templates/clients/fetch.source.d.ts
4
- declare const source: string;
5
- //#endregion
6
- export { source };
7
- //# sourceMappingURL=fetch.source.d.ts.map
@@ -1,6 +0,0 @@
1
- //#region src/templates/clients/fetch.source.ts
2
- const source = "/**\n * RequestCredentials\n */\nexport type RequestCredentials = 'omit' | 'same-origin' | 'include'\n\n/**\n * Header values may be objects (e.g. JSON-encoded headers like `X-Filter` in the Linode API).\n * Non-string values are JSON-serialized before the request is sent.\n */\nexport type HeaderValue = string | number | boolean | null | undefined | object\nexport type HeadersInit = Array<[string, HeaderValue]> | Record<string, HeaderValue>\n\n/**\n * Subset of FetchRequestConfig\n */\nexport type RequestConfig<TData = unknown> = {\n baseURL?: string\n url?: string\n method?: 'GET' | 'PUT' | 'PATCH' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD'\n params?: unknown\n data?: TData | FormData\n responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'\n signal?: AbortSignal\n headers?: HeadersInit\n credentials?: RequestCredentials\n contentType?: string\n}\n\n/**\n * Subset of FetchResponse\n */\nexport type ResponseConfig<TData = unknown> = {\n data: TData\n status: number\n statusText: string\n headers: Headers\n}\n\nlet _config: Partial<RequestConfig> = {}\n\nexport const getConfig = () => _config\n\nexport const setConfig = (config: Partial<RequestConfig>) => {\n _config = config\n return getConfig()\n}\n\nexport const mergeConfig = <T extends RequestConfig>(...configs: Array<Partial<T>>): Partial<T> => {\n return configs.reduce<Partial<T>>((merged, config) => {\n return {\n ...merged,\n ...config,\n headers: {\n ...(Array.isArray(merged.headers) ? Object.fromEntries(merged.headers) : merged.headers),\n ...(Array.isArray(config.headers) ? Object.fromEntries(config.headers) : config.headers),\n },\n }\n }, {})\n}\n\n/**\n * Serializes header values into the string form `fetch` expects.\n * Objects (including arrays) are JSON-stringified so spec-defined object headers like `X-Filter`\n * are sent in their canonical JSON-string form rather than `[object Object]`.\n */\nfunction serializeHeaders(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) return {}\n const entries = Array.isArray(headers) ? headers : Object.entries(headers)\n const result: Record<string, string> = {}\n for (const [key, value] of entries) {\n if (value === undefined || value === null) continue\n result[key] = typeof value === 'string' ? value : typeof value === 'object' ? JSON.stringify(value) : String(value)\n }\n return result\n}\n\n/**\n * Serializes the request body into the form `fetch` expects.\n * `FormData`, `URLSearchParams`, `Blob`, `ArrayBuffer` and string bodies are passed through\n * untouched. Plain objects are encoded as `URLSearchParams` for `application/x-www-form-urlencoded`\n * and JSON-serialized otherwise.\n */\nfunction serializeBody(data: unknown, contentType?: string): BodyInit | undefined {\n if (data === undefined || data === null) return undefined\n if (data instanceof FormData || data instanceof URLSearchParams || data instanceof Blob || data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {\n return data as BodyInit\n }\n if (typeof data === 'string') return data\n if (contentType?.includes('application/x-www-form-urlencoded')) {\n return new URLSearchParams(data as Record<string, string>)\n }\n return JSON.stringify(data)\n}\n\n/**\n * Picks a `responseType` from a `Content-Type` header, or `undefined` when it is not recognized.\n */\nfunction detectResponseType(contentType: string | null): RequestConfig['responseType'] {\n if (!contentType) return undefined\n if (contentType.includes('application/json') || contentType.includes('text/json')) return 'json'\n if (contentType.includes('text/')) return 'text'\n if (contentType.includes('image/') || contentType.includes('application/octet-stream')) return 'blob'\n return undefined\n}\n\n/**\n * Parses a `fetch` response body.\n *\n * - Empty responses (204/205/304 or no body) resolve to `{}`.\n * - An explicit `responseType` (or one detected from the `Content-Type` header) forces the matching\n * `Response` method.\n * - As a last resort the body is read as text and `JSON.parse`d, falling back to the raw text.\n */\nasync function parseResponse<TData>(response: Response, responseType?: RequestConfig['responseType']): Promise<TData> {\n if ([204, 205, 304].includes(response.status) || !response.body) {\n return {} as TData\n }\n\n switch (responseType ?? detectResponseType(response.headers.get('Content-Type'))) {\n case 'text':\n case 'document':\n return (await response.text()) as TData\n case 'blob':\n return (await response.blob()) as TData\n case 'arraybuffer':\n return (await response.arrayBuffer()) as TData\n case 'stream':\n return response.body as TData\n case 'json':\n return (await response.json()) as TData\n }\n\n // Explicit but unrecognized responseType keeps the JSON default; otherwise read text and parse it.\n if (responseType) {\n return (await response.json()) as TData\n }\n const text = await response.text()\n if (!text) {\n return {} as TData\n }\n try {\n return JSON.parse(text) as TData\n } catch {\n return text as TData\n }\n}\n\nexport type ResponseErrorConfig<TError = unknown> = TError\n\nexport type Client = <TData, _TError = unknown, TVariables = unknown>(config: RequestConfig<TVariables>, request?: unknown) => Promise<ResponseConfig<TData>>\n\nexport const client = async <TData, _TError = unknown, TVariables = unknown>(\n paramsConfig: RequestConfig<TVariables>,\n _request?: unknown,\n): Promise<ResponseConfig<TData>> => {\n const normalizedParams = new URLSearchParams()\n\n const config = mergeConfig(getConfig(), paramsConfig)\n\n Object.entries(config.params || {}).forEach(([key, value]) => {\n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : value.toString())\n }\n })\n\n let targetUrl = [config.baseURL, config.url].filter(Boolean).join('')\n\n if (config.params) {\n targetUrl += `?${normalizedParams}`\n }\n\n const headers: Record<string, string> = {\n ...(config.contentType && config.contentType !== 'multipart/form-data' ? { 'Content-Type': config.contentType } : {}),\n ...serializeHeaders(config.headers),\n }\n\n const response = await globalThis.fetch(targetUrl, {\n credentials: config.credentials || 'same-origin',\n method: config.method?.toUpperCase(),\n body: serializeBody(config.data, headers['Content-Type'] ?? headers['content-type']),\n signal: config.signal,\n headers,\n })\n\n const data = await parseResponse<TData>(response, config.responseType)\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers as Headers,\n }\n}\n\nclient.getConfig = getConfig\nclient.setConfig = setConfig\n";
3
- //#endregion
4
- export { source };
5
-
6
- //# sourceMappingURL=fetch.source.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch.source.js","names":[],"sources":[],"mappings":""}
@@ -1,7 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/templates/config.source.ts
3
- const source = "export function buildFormData<T = unknown>(data: T): FormData {\n const formData = new FormData()\n\n function appendData(key: string, value: any) {\n if (value instanceof Blob) {\n formData.append(key, value)\n return\n }\n if (value instanceof Date) {\n formData.append(key, value.toISOString())\n return\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n formData.append(key, String(value))\n return\n }\n if (typeof value === 'string') {\n formData.append(key, value)\n return\n }\n if (typeof value === 'object') {\n formData.append(key, new Blob([JSON.stringify(value)], { type: 'application/json' }))\n return\n }\n }\n\n if (data) {\n Object.entries(data).forEach(([key, value]) => {\n if (value === undefined || value === null) return\n\n if (Array.isArray(value)) {\n for (const valueItem of value) {\n if (valueItem === undefined || valueItem === null) continue\n appendData(key, valueItem)\n }\n } else {\n appendData(key, value)\n }\n })\n }\n\n return formData\n}\n";
4
- //#endregion
5
- exports.source = source;
6
-
7
- //# sourceMappingURL=config.source.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.source.cjs","names":[],"sources":[],"mappings":""}
@@ -1,7 +0,0 @@
1
- import { t as __name } from "../chunk-C0LytTxp.js";
2
-
3
- //#region src/templates/config.source.d.ts
4
- declare const source: string;
5
- //#endregion
6
- export { source };
7
- //# sourceMappingURL=config.source.d.ts.map
@@ -1,6 +0,0 @@
1
- //#region src/templates/config.source.ts
2
- const source = "export function buildFormData<T = unknown>(data: T): FormData {\n const formData = new FormData()\n\n function appendData(key: string, value: any) {\n if (value instanceof Blob) {\n formData.append(key, value)\n return\n }\n if (value instanceof Date) {\n formData.append(key, value.toISOString())\n return\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n formData.append(key, String(value))\n return\n }\n if (typeof value === 'string') {\n formData.append(key, value)\n return\n }\n if (typeof value === 'object') {\n formData.append(key, new Blob([JSON.stringify(value)], { type: 'application/json' }))\n return\n }\n }\n\n if (data) {\n Object.entries(data).forEach(([key, value]) => {\n if (value === undefined || value === null) return\n\n if (Array.isArray(value)) {\n for (const valueItem of value) {\n if (valueItem === undefined || valueItem === null) continue\n appendData(key, valueItem)\n }\n } else {\n appendData(key, value)\n }\n })\n }\n\n return formData\n}\n";
3
- //#endregion
4
- export { source };
5
-
6
- //# sourceMappingURL=config.source.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.source.js","names":[],"sources":[],"mappings":""}
@@ -1,113 +0,0 @@
1
- import type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
2
- import axios from 'axios'
3
-
4
- declare const AXIOS_BASE: string
5
- declare const AXIOS_HEADERS: string
6
-
7
- /**
8
- * Header values may be objects (e.g. JSON-encoded headers like `X-Filter` in the Linode API).
9
- * Non-string values are JSON-serialized before the request is sent.
10
- */
11
- export type HeaderValue = string | number | boolean | null | undefined | object
12
- export type HeadersInit = Array<[string, HeaderValue]> | Record<string, HeaderValue>
13
-
14
- /**
15
- * Subset of AxiosRequestConfig
16
- */
17
- export type RequestConfig<TData = unknown> = {
18
- baseURL?: string
19
- url?: string
20
- method?: 'GET' | 'PUT' | 'PATCH' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD'
21
- params?: unknown
22
- data?: TData | FormData
23
- responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'
24
- signal?: AbortSignal
25
- validateStatus?: (status: number) => boolean
26
- headers?: HeadersInit
27
- paramsSerializer?: AxiosRequestConfig['paramsSerializer']
28
- contentType?: string
29
- }
30
-
31
- /**
32
- * Subset of AxiosResponse
33
- */
34
- export type ResponseConfig<TData = unknown> = {
35
- data: TData
36
- status: number
37
- statusText: string
38
- headers: AxiosResponse['headers']
39
- }
40
-
41
- export type ResponseErrorConfig<TError = unknown> = AxiosError<TError>
42
-
43
- export type Client = <TResponseData, _TError = unknown, TRequestData = unknown>(
44
- config: RequestConfig<TRequestData>,
45
- request?: unknown,
46
- ) => Promise<ResponseConfig<TResponseData>>
47
-
48
- let _config: Partial<RequestConfig> = {
49
- baseURL: typeof AXIOS_BASE !== 'undefined' ? AXIOS_BASE : undefined,
50
- headers: typeof AXIOS_HEADERS !== 'undefined' ? JSON.parse(AXIOS_HEADERS) : undefined,
51
- }
52
-
53
- export const getConfig = () => _config
54
-
55
- export const setConfig = (config: RequestConfig) => {
56
- _config = config
57
- return getConfig()
58
- }
59
-
60
- export const mergeConfig = <T extends RequestConfig>(...configs: Array<Partial<T>>): Partial<T> => {
61
- return configs.reduce<Partial<T>>((merged, config) => {
62
- return {
63
- ...merged,
64
- ...config,
65
- headers: {
66
- ...(Array.isArray(merged.headers) ? Object.fromEntries(merged.headers) : merged.headers),
67
- ...(Array.isArray(config.headers) ? Object.fromEntries(config.headers) : config.headers),
68
- },
69
- }
70
- }, {})
71
- }
72
-
73
- /**
74
- * Serializes header values into the string form axios ultimately puts on the wire.
75
- * Objects (including arrays) are JSON-stringified so spec-defined object headers like `X-Filter`
76
- * are sent in their canonical JSON-string form rather than `[object Object]`.
77
- */
78
- function serializeHeaders(headers: HeadersInit | undefined): Record<string, string> {
79
- if (!headers) return {}
80
- const entries = Array.isArray(headers) ? headers : Object.entries(headers)
81
- const result: Record<string, string> = {}
82
- for (const [key, value] of entries) {
83
- if (value === undefined || value === null) continue
84
- result[key] = typeof value === 'string' ? value : typeof value === 'object' ? JSON.stringify(value) : String(value)
85
- }
86
- return result
87
- }
88
-
89
- export const axiosInstance = axios.create(getConfig() as AxiosRequestConfig)
90
-
91
- export const client = async <TResponseData, TError = unknown, TRequestData = unknown>(
92
- config: RequestConfig<TRequestData>,
93
- _request?: unknown,
94
- ): Promise<ResponseConfig<TResponseData>> => {
95
- const requestConfig = mergeConfig(getConfig(), config)
96
- const { contentType, headers, ...axiosConfig } = requestConfig
97
- return axiosInstance
98
- .request<TResponseData, ResponseConfig<TResponseData>>({
99
- ...axiosConfig,
100
- headers: {
101
- ...(contentType && contentType !== 'multipart/form-data' ? { 'Content-Type': contentType } : {}),
102
- ...serializeHeaders(headers),
103
- },
104
- })
105
- .catch((e: AxiosError<TError>) => {
106
- throw e
107
- })
108
- }
109
-
110
- client.getConfig = getConfig
111
- client.setConfig = setConfig
112
-
113
- export default client