@omnitron-dev/prism 0.1.1

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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -0
  3. package/bin/prism.js +13 -0
  4. package/dist/accessibility/index.d.ts +157 -0
  5. package/dist/accessibility/index.js +186 -0
  6. package/dist/accessibility/index.js.map +1 -0
  7. package/dist/blocks/index.d.ts +1239 -0
  8. package/dist/blocks/index.js +1712 -0
  9. package/dist/blocks/index.js.map +1 -0
  10. package/dist/chunk-77KIJLPP.js +37 -0
  11. package/dist/chunk-77KIJLPP.js.map +1 -0
  12. package/dist/chunk-BTIT7WYH.js +339 -0
  13. package/dist/chunk-BTIT7WYH.js.map +1 -0
  14. package/dist/chunk-BV32OJ2A.js +1409 -0
  15. package/dist/chunk-BV32OJ2A.js.map +1 -0
  16. package/dist/chunk-DDY7TLUI.js +139 -0
  17. package/dist/chunk-DDY7TLUI.js.map +1 -0
  18. package/dist/chunk-DXXZ3ITR.js +4227 -0
  19. package/dist/chunk-DXXZ3ITR.js.map +1 -0
  20. package/dist/chunk-E3XANPTO.js +2319 -0
  21. package/dist/chunk-E3XANPTO.js.map +1 -0
  22. package/dist/chunk-FU52GL2E.js +3 -0
  23. package/dist/chunk-FU52GL2E.js.map +1 -0
  24. package/dist/chunk-GYDT5EKX.js +16505 -0
  25. package/dist/chunk-GYDT5EKX.js.map +1 -0
  26. package/dist/chunk-HO2GKTWJ.js +28 -0
  27. package/dist/chunk-HO2GKTWJ.js.map +1 -0
  28. package/dist/chunk-JDTC2SBY.js +140 -0
  29. package/dist/chunk-JDTC2SBY.js.map +1 -0
  30. package/dist/chunk-JNU4QHJK.js +6 -0
  31. package/dist/chunk-JNU4QHJK.js.map +1 -0
  32. package/dist/chunk-LAEY5USO.js +2621 -0
  33. package/dist/chunk-LAEY5USO.js.map +1 -0
  34. package/dist/chunk-UR6X3W5I.js +530 -0
  35. package/dist/chunk-UR6X3W5I.js.map +1 -0
  36. package/dist/chunk-WC2WM2JD.js +883 -0
  37. package/dist/chunk-WC2WM2JD.js.map +1 -0
  38. package/dist/chunk-XWL6J6IO.js +40 -0
  39. package/dist/chunk-XWL6J6IO.js.map +1 -0
  40. package/dist/cli/index.js +2695 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/config-BA6IeTq9.d.ts +100 -0
  43. package/dist/core/index.d.ts +454 -0
  44. package/dist/core/index.js +9 -0
  45. package/dist/core/index.js.map +1 -0
  46. package/dist/forms/index.d.ts +562 -0
  47. package/dist/forms/index.js +545 -0
  48. package/dist/forms/index.js.map +1 -0
  49. package/dist/hooks/index.d.ts +7 -0
  50. package/dist/hooks/index.js +10 -0
  51. package/dist/hooks/index.js.map +1 -0
  52. package/dist/http/index.d.ts +233 -0
  53. package/dist/http/index.js +282 -0
  54. package/dist/http/index.js.map +1 -0
  55. package/dist/index-odhPSv9I.d.ts +2491 -0
  56. package/dist/index.css +131 -0
  57. package/dist/index.css.map +1 -0
  58. package/dist/index.d.ts +9109 -0
  59. package/dist/index.js +13280 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/layouts/index.d.ts +854 -0
  62. package/dist/layouts/index.js +6 -0
  63. package/dist/layouts/index.js.map +1 -0
  64. package/dist/netron/index.d.ts +4 -0
  65. package/dist/netron/index.js +4 -0
  66. package/dist/netron/index.js.map +1 -0
  67. package/dist/registry/index.d.ts +352 -0
  68. package/dist/registry/index.js +4 -0
  69. package/dist/registry/index.js.map +1 -0
  70. package/dist/registry-BrDNftd5.d.ts +574 -0
  71. package/dist/settings-plpR26Xk.d.ts +455 -0
  72. package/dist/state/index.d.ts +981 -0
  73. package/dist/state/index.js +5 -0
  74. package/dist/state/index.js.map +1 -0
  75. package/dist/theme/index.d.ts +1049 -0
  76. package/dist/theme/index.js +5 -0
  77. package/dist/theme/index.js.map +1 -0
  78. package/dist/theme-CrXLfP1c.d.ts +389 -0
  79. package/dist/types/index.d.ts +146 -0
  80. package/dist/types/index.js +5 -0
  81. package/dist/types/index.js.map +1 -0
  82. package/dist/use-timeout-D7U3EAtH.d.ts +808 -0
  83. package/package.json +194 -0
@@ -0,0 +1,7 @@
1
+ import '../theme-CrXLfP1c.js';
2
+ export { C as CopyState, a as CountdownControls, b as CountdownState, S as SetState, U as UseCopyToClipboardOptions, c as UseCopyToClipboardReturn, d as UseCountdownOptions, e as UseCountdownReturn, f as UseMountedReturn, g as UseMultiSelectOptions, h as UseMultiSelectReturn, i as UseSetStateReturn, j as UseTimeoutReturn, u as useBoolean, k as useBreakpoints, l as useClickOutside, m as useCopyToClipboard, n as useCountdown, o as useDebounce, p as useDebounceCallback, q as useEventListener, r as useInterval, s as useIsClient, t as useLocalStorage, v as useMounted, w as useMultiSelect, x as usePrevious, y as useSetState, z as useTimeout } from '../use-timeout-D7U3EAtH.js';
3
+ export { useMediaQuery } from '@mui/material';
4
+ export { a as AsyncState, B as BreakpointChecks, b as Breakpoints, D as DOMRectValue, I as ImageDimensions, e as InfiniteFetchFn, f as InfinitePage, g as InfiniteScrollState, K as KeyboardShortcut, L as LazyQueryState, M as MutationState, P as PageInfo, S as ScrollElValue, i as ScrollPosition, U as UrlConfigValues, j as UseArrayReturn, k as UseAsyncFnReturn, l as UseAsyncOptions, m as UseAsyncReturn, n as UseBackToTopReturn, o as UseClientRectReturn, p as UseConfigFromQueryOptions, q as UseConfigFromQueryReturn, r as UseCookiesOptions, s as UseCookiesReturn, t as UseCountdownDateReturn, u as UseCountdownSecondsReturn, v as UseDoubleClickProps, w as UseDoubleClickReturn, x as UseFocusTrapOptions, y as UseFocusTrapReturn, z as UseImageDimensionsOptions, E as UseImageDimensionsReturn, F as UseInfiniteScrollOptions, G as UseInfiniteScrollReturn, H as UseIntersectionObserverOptions, J as UseIntersectionObserverReturn, N as UseKeyboardShortcutOptions, O as UseLazyQueryOptions, Q as UseLazyQueryReturn, R as UseMutationOptions, T as UseMutationReturn, V as UseOnlineStatusReturn, W as UsePasswordVisibilityOptions, X as UsePasswordVisibilityReturn, Y as UsePopoverHoverReturn, Z as UsePopoverReturn, _ as UseResponsiveQueryReturn, $ as UseScrollOffsetTopReturn, a0 as UseScrollPositionOptions, a1 as UseSessionStorageOptions, a2 as UseSessionStorageReturn, a3 as UseThrottleOptions, a4 as UseWindowSizeOptions, a5 as WindowSize, aa as useArray, ab as useAsync, ac as useAsyncFn, ad as useBackToTop, ae as useBreakpoint, af as useBreakpointChecks, ag as useClientRect, ah as useConfigFromQuery, ai as useCookies, aj as useCountdownDate, ak as useCountdownSeconds, al as useDoubleClick, am as useEnterKey, an as useEscapeKey, ao as useFocusTrap, ap as useImageDimensions, aq as useInfiniteScroll, ar as useIntersectionObserver, as as useIsomorphicLayoutEffect, at as useKeyboardShortcut, au as useLazyQuery, av as useMultipleImageDimensions, aw as useMutation, ax as useOnlineStatus, ay as usePasswordVisibility, az as usePopover, aA as usePopoverHover, aB as useResponsiveQuery, aC as useScrollLock, aD as useScrollOffsetTop, aE as useScrollPosition, aF as useScrollToTop, aG as useSessionStorage, aH as useThrottle, aI as useThrottleCallback, aJ as useUpdateEffect, aK as useUpdateLayoutEffect, aL as useWindowSize } from '../index-odhPSv9I.js';
5
+ import '@mui/material/styles';
6
+ import 'react';
7
+ import '@mui/material/Popover';
@@ -0,0 +1,10 @@
1
+ export { useArray, useAsync, useAsyncFn, useBackToTop, useBreakpoint, useBreakpointChecks, useClientRect, useConfigFromQuery, useCookies, useCountdownDate, useCountdownSeconds, useDoubleClick, useEnterKey, useEscapeKey, useFocusTrap, useImageDimensions, useInfiniteScroll, useIntersectionObserver, useIsomorphicLayoutEffect, useKeyboardShortcut, useLazyQuery, useMultipleImageDimensions, useMutation, useOnlineStatus, usePasswordVisibility, usePopover, usePopoverHover, useResponsiveQuery, useScrollLock, useScrollOffsetTop, useScrollPosition, useScrollToTop, useSessionStorage, useThrottle, useThrottleCallback, useUpdateEffect, useUpdateLayoutEffect, useWindowSize } from '../chunk-E3XANPTO.js';
2
+ export { useBreakpoints, useClickOutside, useCopyToClipboard, useCountdown, useDebounce, useDebounceCallback, useEventListener, useInterval, useIsClient, useLocalStorage, useMuiMediaQuery as useMediaQuery, useMounted, useMultiSelect, usePrevious, useSetState, useTimeout } from '../chunk-WC2WM2JD.js';
3
+ import '../chunk-DXXZ3ITR.js';
4
+ import '../chunk-JDTC2SBY.js';
5
+ export { useBoolean } from '../chunk-HO2GKTWJ.js';
6
+ import '../chunk-XWL6J6IO.js';
7
+ import '../chunk-DDY7TLUI.js';
8
+ import '../chunk-77KIJLPP.js';
9
+ //# sourceMappingURL=index.js.map
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * HTTP Client Types
3
+ *
4
+ * Type definitions for the HTTP client module.
5
+ *
6
+ * @module @omnitron-dev/prism/http/types
7
+ */
8
+ /**
9
+ * HTTP request methods.
10
+ */
11
+ type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';
12
+ /**
13
+ * Request headers type.
14
+ */
15
+ type HttpHeaders = Record<string, string>;
16
+ /**
17
+ * Request parameters type.
18
+ */
19
+ type HttpParams = Record<string, string | number | boolean | string[] | number[] | undefined>;
20
+ /**
21
+ * Request configuration.
22
+ */
23
+ interface HttpRequestConfig<TData = unknown> {
24
+ /** Request URL (relative or absolute) */
25
+ url: string;
26
+ /** HTTP method */
27
+ method?: HttpMethod;
28
+ /** Request headers */
29
+ headers?: HttpHeaders;
30
+ /** Query parameters */
31
+ params?: HttpParams;
32
+ /** Request body */
33
+ data?: TData;
34
+ /** Request timeout in ms */
35
+ timeout?: number;
36
+ /** Response type */
37
+ responseType?: 'json' | 'text' | 'blob' | 'arraybuffer';
38
+ /** Whether to include credentials */
39
+ withCredentials?: boolean;
40
+ /** AbortController signal */
41
+ signal?: AbortSignal;
42
+ /** Custom tags for middleware */
43
+ tags?: string[];
44
+ /** Skip response transformation */
45
+ rawResponse?: boolean;
46
+ }
47
+ /**
48
+ * Response type from HTTP client.
49
+ */
50
+ interface HttpResponse<TData = unknown> {
51
+ /** Response data */
52
+ data: TData;
53
+ /** HTTP status code */
54
+ status: number;
55
+ /** Status text */
56
+ statusText: string;
57
+ /** Response headers */
58
+ headers: Record<string, string>;
59
+ /** Original request config */
60
+ config: HttpRequestConfig;
61
+ }
62
+ /**
63
+ * HTTP error type.
64
+ */
65
+ interface HttpError<TData = unknown> extends Error {
66
+ /** Error name (always 'HttpError') */
67
+ name: 'HttpError';
68
+ /** HTTP status code (if response received) */
69
+ status?: number;
70
+ /** Status text */
71
+ statusText?: string;
72
+ /** Response data (if any) */
73
+ data?: TData;
74
+ /** Response headers */
75
+ headers?: Record<string, string>;
76
+ /** Original request config */
77
+ config: HttpRequestConfig;
78
+ /** Whether request was cancelled */
79
+ cancelled?: boolean;
80
+ /** Whether request timed out */
81
+ timeout?: boolean;
82
+ }
83
+ /**
84
+ * Request interceptor function.
85
+ */
86
+ type RequestInterceptor = (config: HttpRequestConfig) => HttpRequestConfig | Promise<HttpRequestConfig>;
87
+ /**
88
+ * Response interceptor function.
89
+ */
90
+ type ResponseInterceptor<TData = unknown> = (response: HttpResponse<TData>) => HttpResponse<TData> | Promise<HttpResponse<TData>>;
91
+ /**
92
+ * Error interceptor function.
93
+ */
94
+ type ErrorInterceptor = (error: HttpError) => HttpError | Promise<HttpError> | never;
95
+ /**
96
+ * Retry condition function.
97
+ */
98
+ type RetryCondition = (error: HttpError, attempt: number) => boolean;
99
+ /**
100
+ * HTTP client configuration.
101
+ */
102
+ interface HttpClientConfig {
103
+ /** Base URL for all requests */
104
+ baseUrl?: string;
105
+ /** Default headers for all requests */
106
+ headers?: HttpHeaders;
107
+ /** Default timeout in ms */
108
+ timeout?: number;
109
+ /** Whether to include credentials by default */
110
+ withCredentials?: boolean;
111
+ /** Retry configuration */
112
+ retry?: {
113
+ /** Maximum number of retries */
114
+ maxRetries?: number;
115
+ /** Delay between retries in ms */
116
+ retryDelay?: number | ((attempt: number) => number);
117
+ /** Condition to determine if should retry */
118
+ retryCondition?: RetryCondition;
119
+ };
120
+ /** Request interceptors */
121
+ requestInterceptors?: RequestInterceptor[];
122
+ /** Response interceptors */
123
+ responseInterceptors?: ResponseInterceptor[];
124
+ /** Error interceptors */
125
+ errorInterceptors?: ErrorInterceptor[];
126
+ }
127
+ /**
128
+ * HTTP client interface.
129
+ */
130
+ interface HttpClient {
131
+ /** Make a GET request */
132
+ get<TData = unknown>(url: string, config?: Omit<HttpRequestConfig, 'url' | 'method'>): Promise<HttpResponse<TData>>;
133
+ /** Make a POST request */
134
+ post<TData = unknown, TBody = unknown>(url: string, data?: TBody, config?: Omit<HttpRequestConfig, 'url' | 'method' | 'data'>): Promise<HttpResponse<TData>>;
135
+ /** Make a PUT request */
136
+ put<TData = unknown, TBody = unknown>(url: string, data?: TBody, config?: Omit<HttpRequestConfig, 'url' | 'method' | 'data'>): Promise<HttpResponse<TData>>;
137
+ /** Make a PATCH request */
138
+ patch<TData = unknown, TBody = unknown>(url: string, data?: TBody, config?: Omit<HttpRequestConfig, 'url' | 'method' | 'data'>): Promise<HttpResponse<TData>>;
139
+ /** Make a DELETE request */
140
+ delete<TData = unknown>(url: string, config?: Omit<HttpRequestConfig, 'url' | 'method'>): Promise<HttpResponse<TData>>;
141
+ /** Make a HEAD request */
142
+ head(url: string, config?: Omit<HttpRequestConfig, 'url' | 'method'>): Promise<HttpResponse<void>>;
143
+ /** Make an OPTIONS request */
144
+ options<TData = unknown>(url: string, config?: Omit<HttpRequestConfig, 'url' | 'method'>): Promise<HttpResponse<TData>>;
145
+ /** Make a request with full configuration */
146
+ request<TData = unknown>(config: HttpRequestConfig): Promise<HttpResponse<TData>>;
147
+ /** Add request interceptor */
148
+ addRequestInterceptor(interceptor: RequestInterceptor): () => void;
149
+ /** Add response interceptor */
150
+ addResponseInterceptor(interceptor: ResponseInterceptor): () => void;
151
+ /** Add error interceptor */
152
+ addErrorInterceptor(interceptor: ErrorInterceptor): () => void;
153
+ /** Get current configuration */
154
+ getConfig(): HttpClientConfig;
155
+ /** Create a new instance with merged config */
156
+ extend(config: HttpClientConfig): HttpClient;
157
+ }
158
+
159
+ /**
160
+ * HTTP Client Implementation
161
+ *
162
+ * Framework-agnostic HTTP client built on the Fetch API.
163
+ *
164
+ * @module @omnitron-dev/prism/http/client
165
+ */
166
+
167
+ /**
168
+ * Create a new HTTP client instance.
169
+ *
170
+ * @param config - Client configuration
171
+ * @returns HTTP client instance
172
+ *
173
+ * @example
174
+ * ```ts
175
+ * // Create a basic client
176
+ * const api = createHttpClient({
177
+ * baseUrl: 'https://api.example.com',
178
+ * headers: {
179
+ * 'Authorization': 'Bearer token',
180
+ * },
181
+ * });
182
+ *
183
+ * // Make requests
184
+ * const users = await api.get('/users');
185
+ * const newUser = await api.post('/users', { name: 'John' });
186
+ * ```
187
+ *
188
+ * @example
189
+ * ```ts
190
+ * // With interceptors
191
+ * const api = createHttpClient({
192
+ * baseUrl: 'https://api.example.com',
193
+ * requestInterceptors: [
194
+ * (config) => {
195
+ * const token = getAuthToken();
196
+ * if (token) {
197
+ * config.headers = { ...config.headers, Authorization: `Bearer ${token}` };
198
+ * }
199
+ * return config;
200
+ * },
201
+ * ],
202
+ * errorInterceptors: [
203
+ * (error) => {
204
+ * if (error.status === 401) {
205
+ * // Handle unauthorized
206
+ * refreshToken();
207
+ * }
208
+ * throw error;
209
+ * },
210
+ * ],
211
+ * });
212
+ * ```
213
+ *
214
+ * @example
215
+ * ```ts
216
+ * // With retry
217
+ * const api = createHttpClient({
218
+ * baseUrl: 'https://api.example.com',
219
+ * retry: {
220
+ * maxRetries: 3,
221
+ * retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 10000),
222
+ * retryCondition: (error) => error.status === 429 || error.status >= 500,
223
+ * },
224
+ * });
225
+ * ```
226
+ */
227
+ declare function createHttpClient(config?: HttpClientConfig): HttpClient;
228
+ /**
229
+ * Default HTTP client instance.
230
+ */
231
+ declare const http: HttpClient;
232
+
233
+ export { type ErrorInterceptor, type HttpClient, type HttpClientConfig, type HttpError, type HttpHeaders, type HttpMethod, type HttpParams, type HttpRequestConfig, type HttpResponse, type RequestInterceptor, type ResponseInterceptor, type RetryCondition, createHttpClient, http };
@@ -0,0 +1,282 @@
1
+ import '../chunk-77KIJLPP.js';
2
+
3
+ // src/http/client.ts
4
+ var defaultRetryDelay = (attempt) => Math.min(1e3 * 2 ** attempt, 3e4);
5
+ var defaultRetryCondition = (error, attempt) => {
6
+ if (error.cancelled || error.timeout) return false;
7
+ if (!error.status) return true;
8
+ return error.status >= 500 || error.status === 429;
9
+ };
10
+ function buildUrl(baseUrl, url, params) {
11
+ let fullUrl;
12
+ if (url.startsWith("http://") || url.startsWith("https://")) {
13
+ fullUrl = url;
14
+ } else if (baseUrl) {
15
+ fullUrl = `${baseUrl.replace(/\/$/, "")}/${url.replace(/^\//, "")}`;
16
+ } else {
17
+ fullUrl = url;
18
+ }
19
+ if (params && Object.keys(params).length > 0) {
20
+ const searchParams = new URLSearchParams();
21
+ for (const [key, value] of Object.entries(params)) {
22
+ if (value === void 0) continue;
23
+ if (Array.isArray(value)) {
24
+ value.forEach((v) => searchParams.append(key, String(v)));
25
+ } else {
26
+ searchParams.append(key, String(value));
27
+ }
28
+ }
29
+ const queryString = searchParams.toString();
30
+ if (queryString) {
31
+ fullUrl += (fullUrl.includes("?") ? "&" : "?") + queryString;
32
+ }
33
+ }
34
+ return fullUrl;
35
+ }
36
+ function parseHeaders(headers) {
37
+ const result = {};
38
+ headers.forEach((value, key) => {
39
+ result[key.toLowerCase()] = value;
40
+ });
41
+ return result;
42
+ }
43
+ function createHttpError(message, config, options = {}) {
44
+ const error = new Error(message);
45
+ error.name = "HttpError";
46
+ error.config = config;
47
+ Object.assign(error, options);
48
+ return error;
49
+ }
50
+ function createClientImpl(config) {
51
+ const {
52
+ baseUrl = "",
53
+ headers: defaultHeaders = {},
54
+ timeout: defaultTimeout = 3e4,
55
+ withCredentials: defaultWithCredentials = false,
56
+ retry: retryConfig = {},
57
+ requestInterceptors = [],
58
+ responseInterceptors = [],
59
+ errorInterceptors = []
60
+ } = config;
61
+ const { maxRetries = 0, retryDelay = defaultRetryDelay, retryCondition = defaultRetryCondition } = retryConfig;
62
+ const reqInterceptors = [...requestInterceptors];
63
+ const resInterceptors = [...responseInterceptors];
64
+ const errInterceptors = [...errorInterceptors];
65
+ async function executeRequest(requestConfig, attempt = 0) {
66
+ let processedConfig = { ...requestConfig };
67
+ for (const interceptor of reqInterceptors) {
68
+ processedConfig = await interceptor(processedConfig);
69
+ }
70
+ const {
71
+ url,
72
+ method = "GET",
73
+ headers = {},
74
+ params,
75
+ data,
76
+ timeout = defaultTimeout,
77
+ responseType = "json",
78
+ withCredentials = defaultWithCredentials,
79
+ signal,
80
+ rawResponse = false
81
+ } = processedConfig;
82
+ const fullUrl = buildUrl(baseUrl, url, params);
83
+ const mergedHeaders = {
84
+ ...defaultHeaders,
85
+ ...headers
86
+ };
87
+ if (data && typeof data === "object" && !mergedHeaders["content-type"]) {
88
+ mergedHeaders["content-type"] = "application/json";
89
+ }
90
+ const abortController = new AbortController();
91
+ const timeoutId = timeout > 0 ? setTimeout(() => abortController.abort(), timeout) : null;
92
+ const onExternalAbort = signal ? () => abortController.abort() : null;
93
+ if (signal && onExternalAbort) {
94
+ if (signal.aborted) {
95
+ abortController.abort();
96
+ } else {
97
+ signal.addEventListener("abort", onExternalAbort);
98
+ }
99
+ }
100
+ const cleanup = () => {
101
+ if (timeoutId) clearTimeout(timeoutId);
102
+ if (signal && onExternalAbort) signal.removeEventListener("abort", onExternalAbort);
103
+ };
104
+ try {
105
+ const response = await fetch(fullUrl, {
106
+ method,
107
+ headers: mergedHeaders,
108
+ body: data ? JSON.stringify(data) : void 0,
109
+ credentials: withCredentials ? "include" : "same-origin",
110
+ signal: abortController.signal
111
+ });
112
+ cleanup();
113
+ const responseHeaders = parseHeaders(response.headers);
114
+ let responseData;
115
+ if (rawResponse) {
116
+ responseData = response;
117
+ } else {
118
+ try {
119
+ switch (responseType) {
120
+ case "text":
121
+ responseData = await response.text();
122
+ break;
123
+ case "blob":
124
+ responseData = await response.blob();
125
+ break;
126
+ case "arraybuffer":
127
+ responseData = await response.arrayBuffer();
128
+ break;
129
+ case "json":
130
+ default: {
131
+ const text = await response.text();
132
+ responseData = text ? JSON.parse(text) : null;
133
+ break;
134
+ }
135
+ }
136
+ } catch {
137
+ responseData = null;
138
+ }
139
+ }
140
+ if (!response.ok) {
141
+ const error = createHttpError(`Request failed with status ${response.status}`, processedConfig, {
142
+ status: response.status,
143
+ statusText: response.statusText,
144
+ data: responseData,
145
+ headers: responseHeaders
146
+ });
147
+ if (attempt < maxRetries && retryCondition(error, attempt)) {
148
+ if (abortController.signal.aborted) throw error;
149
+ const delay = typeof retryDelay === "function" ? retryDelay(attempt) : retryDelay;
150
+ await new Promise((resolve, reject) => {
151
+ const timerId = setTimeout(resolve, delay);
152
+ const onAbort = () => {
153
+ clearTimeout(timerId);
154
+ reject(new DOMException("Request cancelled", "AbortError"));
155
+ };
156
+ abortController.signal.addEventListener("abort", onAbort, { once: true });
157
+ });
158
+ return executeRequest(requestConfig, attempt + 1);
159
+ }
160
+ throw error;
161
+ }
162
+ let httpResponse = {
163
+ data: responseData,
164
+ status: response.status,
165
+ statusText: response.statusText,
166
+ headers: responseHeaders,
167
+ config: processedConfig
168
+ };
169
+ for (const interceptor of resInterceptors) {
170
+ httpResponse = await interceptor(httpResponse);
171
+ }
172
+ return httpResponse;
173
+ } catch (err) {
174
+ cleanup();
175
+ if (err instanceof DOMException && err.name === "AbortError") {
176
+ const isTimeout = !signal?.aborted;
177
+ const error2 = createHttpError(isTimeout ? "Request timeout" : "Request cancelled", processedConfig, {
178
+ cancelled: !isTimeout,
179
+ timeout: isTimeout
180
+ });
181
+ let processedError2 = error2;
182
+ for (const interceptor of errInterceptors) {
183
+ processedError2 = await interceptor(processedError2);
184
+ }
185
+ throw processedError2;
186
+ }
187
+ if (err.name === "HttpError") {
188
+ const httpError = err;
189
+ if (attempt < maxRetries && retryCondition(httpError, attempt)) {
190
+ const delay = typeof retryDelay === "function" ? retryDelay(attempt) : retryDelay;
191
+ await new Promise((resolve) => setTimeout(resolve, delay));
192
+ return executeRequest(requestConfig, attempt + 1);
193
+ }
194
+ let processedError2 = httpError;
195
+ for (const interceptor of errInterceptors) {
196
+ processedError2 = await interceptor(processedError2);
197
+ }
198
+ throw processedError2;
199
+ }
200
+ const error = createHttpError(err.message || "Network error", processedConfig);
201
+ if (attempt < maxRetries && retryCondition(error, attempt)) {
202
+ const delay = typeof retryDelay === "function" ? retryDelay(attempt) : retryDelay;
203
+ await new Promise((resolve) => setTimeout(resolve, delay));
204
+ return executeRequest(requestConfig, attempt + 1);
205
+ }
206
+ let processedError = error;
207
+ for (const interceptor of errInterceptors) {
208
+ processedError = await interceptor(processedError);
209
+ }
210
+ throw processedError;
211
+ }
212
+ }
213
+ const client = {
214
+ get(url, requestConfig) {
215
+ return executeRequest({ ...requestConfig, url, method: "GET" });
216
+ },
217
+ post(url, data, requestConfig) {
218
+ return executeRequest({ ...requestConfig, url, method: "POST", data });
219
+ },
220
+ put(url, data, requestConfig) {
221
+ return executeRequest({ ...requestConfig, url, method: "PUT", data });
222
+ },
223
+ patch(url, data, requestConfig) {
224
+ return executeRequest({ ...requestConfig, url, method: "PATCH", data });
225
+ },
226
+ delete(url, requestConfig) {
227
+ return executeRequest({ ...requestConfig, url, method: "DELETE" });
228
+ },
229
+ head(url, requestConfig) {
230
+ return executeRequest({ ...requestConfig, url, method: "HEAD" });
231
+ },
232
+ options(url, requestConfig) {
233
+ return executeRequest({ ...requestConfig, url, method: "OPTIONS" });
234
+ },
235
+ request(requestConfig) {
236
+ return executeRequest(requestConfig);
237
+ },
238
+ addRequestInterceptor(interceptor) {
239
+ reqInterceptors.push(interceptor);
240
+ return () => {
241
+ const index = reqInterceptors.indexOf(interceptor);
242
+ if (index > -1) reqInterceptors.splice(index, 1);
243
+ };
244
+ },
245
+ addResponseInterceptor(interceptor) {
246
+ resInterceptors.push(interceptor);
247
+ return () => {
248
+ const index = resInterceptors.indexOf(interceptor);
249
+ if (index > -1) resInterceptors.splice(index, 1);
250
+ };
251
+ },
252
+ addErrorInterceptor(interceptor) {
253
+ errInterceptors.push(interceptor);
254
+ return () => {
255
+ const index = errInterceptors.indexOf(interceptor);
256
+ if (index > -1) errInterceptors.splice(index, 1);
257
+ };
258
+ },
259
+ getConfig() {
260
+ return { ...config };
261
+ },
262
+ extend(extendConfig) {
263
+ return createClientImpl({
264
+ ...config,
265
+ ...extendConfig,
266
+ headers: { ...defaultHeaders, ...extendConfig.headers },
267
+ requestInterceptors: [...reqInterceptors, ...extendConfig.requestInterceptors || []],
268
+ responseInterceptors: [...resInterceptors, ...extendConfig.responseInterceptors || []],
269
+ errorInterceptors: [...errInterceptors, ...extendConfig.errorInterceptors || []]
270
+ });
271
+ }
272
+ };
273
+ return client;
274
+ }
275
+ function createHttpClient(config = {}) {
276
+ return createClientImpl(config);
277
+ }
278
+ var http = createHttpClient();
279
+
280
+ export { createHttpClient, http };
281
+ //# sourceMappingURL=index.js.map
282
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/http/client.ts"],"names":["error","processedError"],"mappings":";;;AAuBA,IAAM,iBAAA,GAAoB,CAAC,OAAA,KAAoB,IAAA,CAAK,IAAI,GAAA,GAAO,CAAA,IAAK,SAAS,GAAK,CAAA;AAKlF,IAAM,qBAAA,GAAwB,CAAC,KAAA,EAAkB,OAAA,KAA6B;AAE5E,EAAA,IAAI,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,OAAA,EAAS,OAAO,KAAA;AAG7C,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAG1B,EAAA,OAAO,KAAA,CAAM,MAAA,IAAU,GAAA,IAAO,KAAA,CAAM,MAAA,KAAW,GAAA;AACjD,CAAA;AAKA,SAAS,QAAA,CAAS,OAAA,EAAiB,GAAA,EAAa,MAAA,EAA6B;AAE3E,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,IAAI,UAAA,CAAW,SAAS,KAAK,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC3D,IAAA,OAAA,GAAU,GAAA;AAAA,EACZ,WAAW,OAAA,EAAS;AAClB,IAAA,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA;AAAA,EACnE,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,GAAA;AAAA,EACZ;AAGA,EAAA,IAAI,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5C,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IAAI,UAAU,MAAA,EAAW;AACzB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,QAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,YAAA,CAAa,OAAO,GAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACxC;AAAA,IACF;AACA,IAAA,MAAM,WAAA,GAAc,aAAa,QAAA,EAAS;AAC1C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,IAAA,CAAY,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,MAAM,GAAA,IAAO,WAAA;AAAA,IACnD;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,aAAa,OAAA,EAA0C;AAC9D,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC9B,IAAA,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,KAAA;AAAA,EAC9B,CAAC,CAAA;AACD,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,eAAA,CACP,OAAA,EACA,MAAA,EACA,OAAA,GAAqC,EAAC,EACpB;AAClB,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,EAAA,KAAA,CAAM,IAAA,GAAO,WAAA;AACb,EAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,EAAA,MAAA,CAAO,MAAA,CAAO,OAAO,OAAO,CAAA;AAC5B,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,iBAAiB,MAAA,EAAsC;AAC9D,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,EAAA;AAAA,IACV,OAAA,EAAS,iBAAiB,EAAC;AAAA,IAC3B,SAAS,cAAA,GAAiB,GAAA;AAAA,IAC1B,iBAAiB,sBAAA,GAAyB,KAAA;AAAA,IAC1C,KAAA,EAAO,cAAc,EAAC;AAAA,IACtB,sBAAsB,EAAC;AAAA,IACvB,uBAAuB,EAAC;AAAA,IACxB,oBAAoB;AAAC,GACvB,GAAI,MAAA;AAEJ,EAAA,MAAM,EAAE,UAAA,GAAa,CAAA,EAAG,aAAa,iBAAA,EAAmB,cAAA,GAAiB,uBAAsB,GAAI,WAAA;AAGnG,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,mBAAmB,CAAA;AAC/C,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,oBAAoB,CAAA;AAChD,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,iBAAiB,CAAA;AAK7C,EAAA,eAAe,cAAA,CAAsB,aAAA,EAAkC,OAAA,GAAU,CAAA,EAAiC;AAEhH,IAAA,IAAI,eAAA,GAAkB,EAAE,GAAG,aAAA,EAAc;AACzC,IAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,MAAA,eAAA,GAAkB,MAAM,YAAY,eAAe,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,MAAA,GAAS,KAAA;AAAA,MACT,UAAU,EAAC;AAAA,MACX,MAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,GAAU,cAAA;AAAA,MACV,YAAA,GAAe,MAAA;AAAA,MACf,eAAA,GAAkB,sBAAA;AAAA,MAClB,MAAA;AAAA,MACA,WAAA,GAAc;AAAA,KAChB,GAAI,eAAA;AAGJ,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,EAAS,GAAA,EAAK,MAAM,CAAA;AAG7C,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,GAAG,cAAA;AAAA,MACH,GAAG;AAAA,KACL;AAGA,IAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,YAAY,CAAC,aAAA,CAAc,cAAc,CAAA,EAAG;AACtE,MAAA,aAAA,CAAc,cAAc,CAAA,GAAI,kBAAA;AAAA,IAClC;AAGA,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,IAAA,MAAM,SAAA,GAAY,UAAU,CAAA,GAAI,UAAA,CAAW,MAAM,eAAA,CAAgB,KAAA,EAAM,EAAG,OAAO,CAAA,GAAI,IAAA;AAGrF,IAAA,MAAM,eAAA,GAAkB,MAAA,GAAS,MAAM,eAAA,CAAgB,OAAM,GAAI,IAAA;AACjE,IAAA,IAAI,UAAU,eAAA,EAAiB;AAC7B,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,eAAe,CAAA;AAAA,MAClD;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,SAAA,eAAwB,SAAS,CAAA;AACrC,MAAA,IAAI,MAAA,IAAU,eAAA,EAAiB,MAAA,CAAO,mBAAA,CAAoB,SAAS,eAAe,CAAA;AAAA,IACpF,CAAA;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAS;AAAA,QACpC,MAAA;AAAA,QACA,OAAA,EAAS,aAAA;AAAA,QACT,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QACpC,WAAA,EAAa,kBAAkB,SAAA,GAAY,aAAA;AAAA,QAC3C,QAAQ,eAAA,CAAgB;AAAA,OACzB,CAAA;AAGD,MAAA,OAAA,EAAQ;AAGR,MAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AACrD,MAAA,IAAI,YAAA;AAEJ,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,YAAA,GAAe,QAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,IAAI;AACF,UAAA,QAAQ,YAAA;AAAc,YACpB,KAAK,MAAA;AACH,cAAA,YAAA,GAAgB,MAAM,SAAS,IAAA,EAAK;AACpC,cAAA;AAAA,YACF,KAAK,MAAA;AACH,cAAA,YAAA,GAAgB,MAAM,SAAS,IAAA,EAAK;AACpC,cAAA;AAAA,YACF,KAAK,aAAA;AACH,cAAA,YAAA,GAAgB,MAAM,SAAS,WAAA,EAAY;AAC3C,cAAA;AAAA,YACF,KAAK,MAAA;AAAA,YACL,SAAS;AACP,cAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,cAAA,YAAA,GAAe,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AACzC,cAAA;AAAA,YACF;AAAA;AACF,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,YAAA,GAAe,IAAA;AAAA,QACjB;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,QAAQ,eAAA,CAAuB,CAAA,2BAAA,EAA8B,QAAA,CAAS,MAAM,IAAI,eAAA,EAAiB;AAAA,UACrG,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,IAAA,EAAM,YAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACV,CAAA;AAGD,QAAA,IAAI,OAAA,GAAU,UAAA,IAAc,cAAA,CAAe,KAAA,EAAO,OAAO,CAAA,EAAG;AAE1D,UAAA,IAAI,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,MAAM,KAAA;AAE1C,UAAA,MAAM,QAAQ,OAAO,UAAA,KAAe,UAAA,GAAa,UAAA,CAAW,OAAO,CAAA,GAAI,UAAA;AACvE,UAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,YAAA,MAAM,OAAA,GAAU,UAAA,CAAW,OAAA,EAAS,KAAK,CAAA;AAEzC,YAAA,MAAM,UAAU,MAAM;AACpB,cAAA,YAAA,CAAa,OAAO,CAAA;AACpB,cAAA,MAAA,CAAO,IAAI,YAAA,CAAa,mBAAA,EAAqB,YAAY,CAAC,CAAA;AAAA,YAC5D,CAAA;AACA,YAAA,eAAA,CAAgB,OAAO,gBAAA,CAAiB,OAAA,EAAS,SAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,UAC1E,CAAC,CAAA;AACD,UAAA,OAAO,cAAA,CAAe,aAAA,EAAe,OAAA,GAAU,CAAC,CAAA;AAAA,QAClD;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAI,YAAA,GAAoC;AAAA,QACtC,IAAA,EAAM,YAAA;AAAA,QACN,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,OAAA,EAAS,eAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAGA,MAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,QAAA,YAAA,GAAgB,MAAM,YAAY,YAAY,CAAA;AAAA,MAChD;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAA,EAAQ;AAGR,MAAA,IAAI,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AAC5D,QAAA,MAAM,SAAA,GAAY,CAAC,MAAA,EAAQ,OAAA;AAC3B,QAAA,MAAMA,MAAAA,GAAQ,eAAA,CAAgB,SAAA,GAAY,iBAAA,GAAoB,qBAAqB,eAAA,EAAiB;AAAA,UAClG,WAAW,CAAC,SAAA;AAAA,UACZ,OAAA,EAAS;AAAA,SACV,CAAA;AAGD,QAAA,IAAIC,eAAAA,GAAiBD,MAAAA;AACrB,QAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,UAAAC,eAAAA,GAAiB,MAAM,WAAA,CAAYA,eAAc,CAAA;AAAA,QACnD;AACA,QAAA,MAAMA,eAAAA;AAAA,MACR;AAGA,MAAA,IAAK,GAAA,CAAkB,SAAS,WAAA,EAAa;AAC3C,QAAA,MAAM,SAAA,GAAY,GAAA;AAGlB,QAAA,IAAI,OAAA,GAAU,UAAA,IAAc,cAAA,CAAe,SAAA,EAAW,OAAO,CAAA,EAAG;AAC9D,UAAA,MAAM,QAAQ,OAAO,UAAA,KAAe,UAAA,GAAa,UAAA,CAAW,OAAO,CAAA,GAAI,UAAA;AACvE,UAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AACzD,UAAA,OAAO,cAAA,CAAe,aAAA,EAAe,OAAA,GAAU,CAAC,CAAA;AAAA,QAClD;AAGA,QAAA,IAAIA,eAAAA,GAAiB,SAAA;AACrB,QAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,UAAAA,eAAAA,GAAiB,MAAM,WAAA,CAAYA,eAAc,CAAA;AAAA,QACnD;AACA,QAAA,MAAMA,eAAAA;AAAA,MACR;AAGA,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAiB,GAAA,CAAc,OAAA,IAAW,iBAAiB,eAAe,CAAA;AAGxF,MAAA,IAAI,OAAA,GAAU,UAAA,IAAc,cAAA,CAAe,KAAA,EAAO,OAAO,CAAA,EAAG;AAC1D,QAAA,MAAM,QAAQ,OAAO,UAAA,KAAe,UAAA,GAAa,UAAA,CAAW,OAAO,CAAA,GAAI,UAAA;AACvE,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AACzD,QAAA,OAAO,cAAA,CAAe,aAAA,EAAe,OAAA,GAAU,CAAC,CAAA;AAAA,MAClD;AAGA,MAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,MAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,QAAA,cAAA,GAAiB,MAAM,YAAY,cAAc,CAAA;AAAA,MACnD;AACA,MAAA,MAAM,cAAA;AAAA,IACR;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,GAAA,CAAW,KAAa,aAAA,EAA2D;AACjF,MAAA,OAAO,eAAsB,EAAE,GAAG,eAAe,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,IACvE,CAAA;AAAA,IAEA,IAAA,CAAmB,GAAA,EAAa,IAAA,EAAc,aAAA,EAAoE;AAChH,MAAA,OAAO,cAAA,CAAsB,EAAE,GAAG,aAAA,EAAe,KAAK,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC9E,CAAA;AAAA,IAEA,GAAA,CAAkB,GAAA,EAAa,IAAA,EAAc,aAAA,EAAoE;AAC/G,MAAA,OAAO,cAAA,CAAsB,EAAE,GAAG,aAAA,EAAe,KAAK,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,IAC7E,CAAA;AAAA,IAEA,KAAA,CAAoB,GAAA,EAAa,IAAA,EAAc,aAAA,EAAoE;AACjH,MAAA,OAAO,cAAA,CAAsB,EAAE,GAAG,aAAA,EAAe,KAAK,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAAA,IAC/E,CAAA;AAAA,IAEA,MAAA,CAAc,KAAa,aAAA,EAA2D;AACpF,MAAA,OAAO,eAAsB,EAAE,GAAG,eAAe,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC1E,CAAA;AAAA,IAEA,IAAA,CAAK,KAAa,aAAA,EAA2D;AAC3E,MAAA,OAAO,eAAqB,EAAE,GAAG,eAAe,GAAA,EAAK,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACvE,CAAA;AAAA,IAEA,OAAA,CAAe,KAAa,aAAA,EAA2D;AACrF,MAAA,OAAO,eAAsB,EAAE,GAAG,eAAe,GAAA,EAAK,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC3E,CAAA;AAAA,IAEA,QAAe,aAAA,EAAkC;AAC/C,MAAA,OAAO,eAAsB,aAAa,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,sBAAsB,WAAA,EAAiC;AACrD,MAAA,eAAA,CAAgB,KAAK,WAAW,CAAA;AAChC,MAAA,OAAO,MAAM;AACX,QAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA;AACjD,QAAA,IAAI,KAAA,GAAQ,EAAA,EAAI,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MACjD,CAAA;AAAA,IACF,CAAA;AAAA,IAEA,uBAAuB,WAAA,EAAkC;AACvD,MAAA,eAAA,CAAgB,KAAK,WAAW,CAAA;AAChC,MAAA,OAAO,MAAM;AACX,QAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA;AACjD,QAAA,IAAI,KAAA,GAAQ,EAAA,EAAI,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MACjD,CAAA;AAAA,IACF,CAAA;AAAA,IAEA,oBAAoB,WAAA,EAA+B;AACjD,MAAA,eAAA,CAAgB,KAAK,WAAW,CAAA;AAChC,MAAA,OAAO,MAAM;AACX,QAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA;AACjD,QAAA,IAAI,KAAA,GAAQ,EAAA,EAAI,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MACjD,CAAA;AAAA,IACF,CAAA;AAAA,IAEA,SAAA,GAAY;AACV,MAAA,OAAO,EAAE,GAAG,MAAA,EAAO;AAAA,IACrB,CAAA;AAAA,IAEA,OAAO,YAAA,EAAgC;AACrC,MAAA,OAAO,gBAAA,CAAiB;AAAA,QACtB,GAAG,MAAA;AAAA,QACH,GAAG,YAAA;AAAA,QACH,SAAS,EAAE,GAAG,cAAA,EAAgB,GAAG,aAAa,OAAA,EAAQ;AAAA,QACtD,mBAAA,EAAqB,CAAC,GAAG,eAAA,EAAiB,GAAI,YAAA,CAAa,mBAAA,IAAuB,EAAG,CAAA;AAAA,QACrF,oBAAA,EAAsB,CAAC,GAAG,eAAA,EAAiB,GAAI,YAAA,CAAa,oBAAA,IAAwB,EAAG,CAAA;AAAA,QACvF,iBAAA,EAAmB,CAAC,GAAG,eAAA,EAAiB,GAAI,YAAA,CAAa,iBAAA,IAAqB,EAAG;AAAA,OAClF,CAAA;AAAA,IACH;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT;AA8DO,SAAS,gBAAA,CAAiB,MAAA,GAA2B,EAAC,EAAe;AAC1E,EAAA,OAAO,iBAAiB,MAAM,CAAA;AAChC;AAKO,IAAM,OAAO,gBAAA","file":"index.js","sourcesContent":["/**\n * HTTP Client Implementation\n *\n * Framework-agnostic HTTP client built on the Fetch API.\n *\n * @module @omnitron-dev/prism/http/client\n */\n\nimport type {\n HttpClient,\n HttpClientConfig,\n HttpRequestConfig,\n HttpResponse,\n HttpError,\n RequestInterceptor,\n ResponseInterceptor,\n ErrorInterceptor,\n HttpParams,\n} from './types.js';\n\n/**\n * Default retry delay function (exponential backoff).\n */\nconst defaultRetryDelay = (attempt: number) => Math.min(1000 * 2 ** attempt, 30000);\n\n/**\n * Default retry condition (retry on network errors and 5xx responses).\n */\nconst defaultRetryCondition = (error: HttpError, attempt: number): boolean => {\n // Don't retry if cancelled or timed out\n if (error.cancelled || error.timeout) return false;\n\n // Retry on network errors (no status)\n if (!error.status) return true;\n\n // Retry on 5xx errors and 429 (rate limit)\n return error.status >= 500 || error.status === 429;\n};\n\n/**\n * Build URL with query parameters.\n */\nfunction buildUrl(baseUrl: string, url: string, params?: HttpParams): string {\n // Resolve URL against base\n let fullUrl: string;\n if (url.startsWith('http://') || url.startsWith('https://')) {\n fullUrl = url;\n } else if (baseUrl) {\n fullUrl = `${baseUrl.replace(/\\/$/, '')}/${url.replace(/^\\//, '')}`;\n } else {\n fullUrl = url;\n }\n\n // Add query parameters\n if (params && Object.keys(params).length > 0) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n value.forEach((v) => searchParams.append(key, String(v)));\n } else {\n searchParams.append(key, String(value));\n }\n }\n const queryString = searchParams.toString();\n if (queryString) {\n fullUrl += (fullUrl.includes('?') ? '&' : '?') + queryString;\n }\n }\n\n return fullUrl;\n}\n\n/**\n * Parse response headers.\n */\nfunction parseHeaders(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key.toLowerCase()] = value;\n });\n return result;\n}\n\n/**\n * Create an HTTP error.\n */\nfunction createHttpError<TData = unknown>(\n message: string,\n config: HttpRequestConfig,\n options: Partial<HttpError<TData>> = {}\n): HttpError<TData> {\n const error = new Error(message) as HttpError<TData>;\n error.name = 'HttpError';\n error.config = config;\n Object.assign(error, options);\n return error;\n}\n\n/**\n * Create HTTP client implementation.\n */\nfunction createClientImpl(config: HttpClientConfig): HttpClient {\n const {\n baseUrl = '',\n headers: defaultHeaders = {},\n timeout: defaultTimeout = 30000,\n withCredentials: defaultWithCredentials = false,\n retry: retryConfig = {},\n requestInterceptors = [],\n responseInterceptors = [],\n errorInterceptors = [],\n } = config;\n\n const { maxRetries = 0, retryDelay = defaultRetryDelay, retryCondition = defaultRetryCondition } = retryConfig;\n\n // Mutable interceptor arrays\n const reqInterceptors = [...requestInterceptors];\n const resInterceptors = [...responseInterceptors];\n const errInterceptors = [...errorInterceptors];\n\n /**\n * Execute request with interceptors and retry logic.\n */\n async function executeRequest<TData>(requestConfig: HttpRequestConfig, attempt = 0): Promise<HttpResponse<TData>> {\n // Apply request interceptors\n let processedConfig = { ...requestConfig };\n for (const interceptor of reqInterceptors) {\n processedConfig = await interceptor(processedConfig);\n }\n\n const {\n url,\n method = 'GET',\n headers = {},\n params,\n data,\n timeout = defaultTimeout,\n responseType = 'json',\n withCredentials = defaultWithCredentials,\n signal,\n rawResponse = false,\n } = processedConfig;\n\n // Build full URL\n const fullUrl = buildUrl(baseUrl, url, params);\n\n // Merge headers\n const mergedHeaders = {\n ...defaultHeaders,\n ...headers,\n };\n\n // Set content-type for JSON data\n if (data && typeof data === 'object' && !mergedHeaders['content-type']) {\n mergedHeaders['content-type'] = 'application/json';\n }\n\n // Create abort controller for timeout\n const abortController = new AbortController();\n const timeoutId = timeout > 0 ? setTimeout(() => abortController.abort(), timeout) : null;\n\n // If external signal provided, link it (with cleanup)\n const onExternalAbort = signal ? () => abortController.abort() : null;\n if (signal && onExternalAbort) {\n if (signal.aborted) {\n abortController.abort();\n } else {\n signal.addEventListener('abort', onExternalAbort);\n }\n }\n\n const cleanup = () => {\n if (timeoutId) clearTimeout(timeoutId);\n if (signal && onExternalAbort) signal.removeEventListener('abort', onExternalAbort);\n };\n\n try {\n // Make request\n const response = await fetch(fullUrl, {\n method,\n headers: mergedHeaders,\n body: data ? JSON.stringify(data) : undefined,\n credentials: withCredentials ? 'include' : 'same-origin',\n signal: abortController.signal,\n });\n\n // Clear timeout\n cleanup();\n\n // Parse response\n const responseHeaders = parseHeaders(response.headers);\n let responseData: TData;\n\n if (rawResponse) {\n responseData = response as unknown as TData;\n } else {\n try {\n switch (responseType) {\n case 'text':\n responseData = (await response.text()) as unknown as TData;\n break;\n case 'blob':\n responseData = (await response.blob()) as unknown as TData;\n break;\n case 'arraybuffer':\n responseData = (await response.arrayBuffer()) as unknown as TData;\n break;\n case 'json':\n default: {\n const text = await response.text();\n responseData = text ? JSON.parse(text) : null;\n break;\n }\n }\n } catch {\n responseData = null as TData;\n }\n }\n\n // Check for error status\n if (!response.ok) {\n const error = createHttpError<TData>(`Request failed with status ${response.status}`, processedConfig, {\n status: response.status,\n statusText: response.statusText,\n data: responseData,\n headers: responseHeaders,\n });\n\n // Check if should retry\n if (attempt < maxRetries && retryCondition(error, attempt)) {\n // Skip retry if already aborted\n if (abortController.signal.aborted) throw error;\n\n const delay = typeof retryDelay === 'function' ? retryDelay(attempt) : retryDelay;\n await new Promise<void>((resolve, reject) => {\n const timerId = setTimeout(resolve, delay);\n // Abort during retry delay should cancel the wait\n const onAbort = () => {\n clearTimeout(timerId);\n reject(new DOMException('Request cancelled', 'AbortError'));\n };\n abortController.signal.addEventListener('abort', onAbort, { once: true });\n });\n return executeRequest(requestConfig, attempt + 1);\n }\n\n throw error;\n }\n\n // Build response object\n let httpResponse: HttpResponse<TData> = {\n data: responseData,\n status: response.status,\n statusText: response.statusText,\n headers: responseHeaders,\n config: processedConfig,\n };\n\n // Apply response interceptors\n for (const interceptor of resInterceptors) {\n httpResponse = (await interceptor(httpResponse)) as HttpResponse<TData>;\n }\n\n return httpResponse;\n } catch (err) {\n // Cleanup on error\n cleanup();\n\n // Handle abort/timeout\n if (err instanceof DOMException && err.name === 'AbortError') {\n const isTimeout = !signal?.aborted;\n const error = createHttpError(isTimeout ? 'Request timeout' : 'Request cancelled', processedConfig, {\n cancelled: !isTimeout,\n timeout: isTimeout,\n });\n\n // Apply error interceptors\n let processedError = error;\n for (const interceptor of errInterceptors) {\n processedError = await interceptor(processedError);\n }\n throw processedError;\n }\n\n // Handle HTTP errors\n if ((err as HttpError).name === 'HttpError') {\n const httpError = err as HttpError;\n\n // Check if should retry\n if (attempt < maxRetries && retryCondition(httpError, attempt)) {\n const delay = typeof retryDelay === 'function' ? retryDelay(attempt) : retryDelay;\n await new Promise((resolve) => setTimeout(resolve, delay));\n return executeRequest(requestConfig, attempt + 1);\n }\n\n // Apply error interceptors\n let processedError = httpError;\n for (const interceptor of errInterceptors) {\n processedError = await interceptor(processedError);\n }\n throw processedError;\n }\n\n // Handle network errors\n const error = createHttpError((err as Error).message || 'Network error', processedConfig);\n\n // Check if should retry\n if (attempt < maxRetries && retryCondition(error, attempt)) {\n const delay = typeof retryDelay === 'function' ? retryDelay(attempt) : retryDelay;\n await new Promise((resolve) => setTimeout(resolve, delay));\n return executeRequest(requestConfig, attempt + 1);\n }\n\n // Apply error interceptors\n let processedError = error;\n for (const interceptor of errInterceptors) {\n processedError = await interceptor(processedError);\n }\n throw processedError;\n }\n }\n\n // Return client interface\n const client: HttpClient = {\n get<TData>(url: string, requestConfig?: Omit<HttpRequestConfig, 'url' | 'method'>) {\n return executeRequest<TData>({ ...requestConfig, url, method: 'GET' });\n },\n\n post<TData, TBody>(url: string, data?: TBody, requestConfig?: Omit<HttpRequestConfig, 'url' | 'method' | 'data'>) {\n return executeRequest<TData>({ ...requestConfig, url, method: 'POST', data });\n },\n\n put<TData, TBody>(url: string, data?: TBody, requestConfig?: Omit<HttpRequestConfig, 'url' | 'method' | 'data'>) {\n return executeRequest<TData>({ ...requestConfig, url, method: 'PUT', data });\n },\n\n patch<TData, TBody>(url: string, data?: TBody, requestConfig?: Omit<HttpRequestConfig, 'url' | 'method' | 'data'>) {\n return executeRequest<TData>({ ...requestConfig, url, method: 'PATCH', data });\n },\n\n delete<TData>(url: string, requestConfig?: Omit<HttpRequestConfig, 'url' | 'method'>) {\n return executeRequest<TData>({ ...requestConfig, url, method: 'DELETE' });\n },\n\n head(url: string, requestConfig?: Omit<HttpRequestConfig, 'url' | 'method'>) {\n return executeRequest<void>({ ...requestConfig, url, method: 'HEAD' });\n },\n\n options<TData>(url: string, requestConfig?: Omit<HttpRequestConfig, 'url' | 'method'>) {\n return executeRequest<TData>({ ...requestConfig, url, method: 'OPTIONS' });\n },\n\n request<TData>(requestConfig: HttpRequestConfig) {\n return executeRequest<TData>(requestConfig);\n },\n\n addRequestInterceptor(interceptor: RequestInterceptor) {\n reqInterceptors.push(interceptor);\n return () => {\n const index = reqInterceptors.indexOf(interceptor);\n if (index > -1) reqInterceptors.splice(index, 1);\n };\n },\n\n addResponseInterceptor(interceptor: ResponseInterceptor) {\n resInterceptors.push(interceptor);\n return () => {\n const index = resInterceptors.indexOf(interceptor);\n if (index > -1) resInterceptors.splice(index, 1);\n };\n },\n\n addErrorInterceptor(interceptor: ErrorInterceptor) {\n errInterceptors.push(interceptor);\n return () => {\n const index = errInterceptors.indexOf(interceptor);\n if (index > -1) errInterceptors.splice(index, 1);\n };\n },\n\n getConfig() {\n return { ...config };\n },\n\n extend(extendConfig: HttpClientConfig) {\n return createClientImpl({\n ...config,\n ...extendConfig,\n headers: { ...defaultHeaders, ...extendConfig.headers },\n requestInterceptors: [...reqInterceptors, ...(extendConfig.requestInterceptors || [])],\n responseInterceptors: [...resInterceptors, ...(extendConfig.responseInterceptors || [])],\n errorInterceptors: [...errInterceptors, ...(extendConfig.errorInterceptors || [])],\n });\n },\n };\n\n return client;\n}\n\n/**\n * Create a new HTTP client instance.\n *\n * @param config - Client configuration\n * @returns HTTP client instance\n *\n * @example\n * ```ts\n * // Create a basic client\n * const api = createHttpClient({\n * baseUrl: 'https://api.example.com',\n * headers: {\n * 'Authorization': 'Bearer token',\n * },\n * });\n *\n * // Make requests\n * const users = await api.get('/users');\n * const newUser = await api.post('/users', { name: 'John' });\n * ```\n *\n * @example\n * ```ts\n * // With interceptors\n * const api = createHttpClient({\n * baseUrl: 'https://api.example.com',\n * requestInterceptors: [\n * (config) => {\n * const token = getAuthToken();\n * if (token) {\n * config.headers = { ...config.headers, Authorization: `Bearer ${token}` };\n * }\n * return config;\n * },\n * ],\n * errorInterceptors: [\n * (error) => {\n * if (error.status === 401) {\n * // Handle unauthorized\n * refreshToken();\n * }\n * throw error;\n * },\n * ],\n * });\n * ```\n *\n * @example\n * ```ts\n * // With retry\n * const api = createHttpClient({\n * baseUrl: 'https://api.example.com',\n * retry: {\n * maxRetries: 3,\n * retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 10000),\n * retryCondition: (error) => error.status === 429 || error.status >= 500,\n * },\n * });\n * ```\n */\nexport function createHttpClient(config: HttpClientConfig = {}): HttpClient {\n return createClientImpl(config);\n}\n\n/**\n * Default HTTP client instance.\n */\nexport const http = createHttpClient();\n"]}