@harishmano/react-enterprise-api 1.0.0

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.
@@ -0,0 +1,280 @@
1
+ import * as _tanstack_react_query from '@tanstack/react-query';
2
+ import * as _tanstack_query_core from '@tanstack/query-core';
3
+ import { AxiosError, AxiosRequestConfig, AxiosInstance } from 'axios';
4
+
5
+ interface ApiClientConfig {
6
+ baseURL: string;
7
+ /** Return the current auth token */
8
+ getToken?: () => string | null | Promise<string | null>;
9
+ /** Called with a new token after refresh */
10
+ onTokenRefresh?: (newToken: string) => void;
11
+ /** Called when a refresh fails (e.g., redirect to login) */
12
+ onAuthFailure?: () => void;
13
+ /** Global error handler */
14
+ onError?: (error: AxiosError) => void;
15
+ /** Default headers added to every request */
16
+ headers?: Record<string, string>;
17
+ /** Request timeout in ms (default: 30000) */
18
+ timeout?: number;
19
+ /** Retry config */
20
+ retry?: RetryConfig;
21
+ }
22
+ interface RetryConfig {
23
+ count: number;
24
+ delay?: number;
25
+ statusCodes?: number[];
26
+ }
27
+ interface PaginationParams {
28
+ page?: number;
29
+ pageSize?: number;
30
+ sortBy?: string;
31
+ sortOrder?: "asc" | "desc";
32
+ }
33
+ interface PaginatedResponse<T> {
34
+ data: T[];
35
+ total: number;
36
+ page: number;
37
+ pageSize: number;
38
+ totalPages: number;
39
+ hasNextPage: boolean;
40
+ hasPreviousPage: boolean;
41
+ }
42
+ interface CursorPaginationParams {
43
+ cursor?: string | null;
44
+ pageSize?: number;
45
+ sortBy?: string;
46
+ sortOrder?: "asc" | "desc";
47
+ }
48
+ interface CursorPaginatedResponse<T> {
49
+ data: T[];
50
+ nextCursor: string | null;
51
+ prevCursor: string | null;
52
+ hasMore: boolean;
53
+ }
54
+ type FilterOperator = "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "endsWith" | "in" | "nin" | "between" | "isNull" | "isNotNull";
55
+ interface FilterCondition {
56
+ field: string;
57
+ operator: FilterOperator;
58
+ value: unknown;
59
+ }
60
+ interface QueryOptions {
61
+ filters?: FilterCondition[] | Record<string, unknown>;
62
+ search?: string;
63
+ searchFields?: string[];
64
+ pagination?: PaginationParams;
65
+ axiosConfig?: AxiosRequestConfig;
66
+ enabled?: boolean;
67
+ staleTime?: number;
68
+ /** Poll for fresh data every N ms */
69
+ refetchInterval?: number;
70
+ }
71
+ interface ResourceOptions {
72
+ path?: string;
73
+ defaultParams?: Record<string, unknown>;
74
+ transform?: <T>(data: unknown) => T;
75
+ staleTime?: number;
76
+ optimistic?: boolean;
77
+ }
78
+ interface MutationOptions<TData = unknown, TVariables = unknown> {
79
+ onSuccess?: (data: TData, variables: TVariables) => void;
80
+ onError?: (error: AxiosError, variables: TVariables) => void;
81
+ onSettled?: (data: TData | undefined, error: AxiosError | null) => void;
82
+ }
83
+ interface UploadOptions {
84
+ /** Progress callback, 0–100 */
85
+ onProgress?: (percent: number) => void;
86
+ /** FormData field name (default: "file") */
87
+ fieldName?: string;
88
+ /** Extra FormData fields to merge (e.g. { category: "docs" }) */
89
+ extraFields?: Record<string, string>;
90
+ }
91
+ interface DownloadOptions {
92
+ /** Triggers browser "Save As" dialog */
93
+ saveAs?: boolean;
94
+ /** Override filename (e.g. "report.pdf") */
95
+ filename?: string;
96
+ /** Mime type hint (e.g. "application/pdf") */
97
+ mimeType?: string;
98
+ /** Download progress callback, 0–100 */
99
+ onProgress?: (percent: number) => void;
100
+ }
101
+ type ID = string | number;
102
+ interface ApiError {
103
+ message: string;
104
+ status: number;
105
+ code?: string;
106
+ details?: unknown;
107
+ }
108
+
109
+ /**
110
+ * Creates a fully configured enterprise API client
111
+ */
112
+ declare function createApiClient(config: ApiClientConfig): {
113
+ /** Access the raw axios instance for custom requests */
114
+ axiosInstance: AxiosInstance;
115
+ /** Create a resource with CRUD hooks */
116
+ resource: (name: string, options?: ResourceOptions) => {
117
+ useList: <T = unknown[]>(options?: QueryOptions) => _tanstack_react_query.UseQueryResult<_tanstack_query_core.NoInfer<T>, Error>;
118
+ useGet: <T = unknown>(id: ID, options?: QueryOptions) => _tanstack_react_query.UseQueryResult<_tanstack_query_core.NoInfer<T>, Error>;
119
+ usePaginatedList: <T = unknown>(pagination: PaginationParams & {
120
+ page: number;
121
+ }, options?: Omit<QueryOptions, "pagination">) => _tanstack_react_query.UseQueryResult<PaginatedResponse<T>, Error>;
122
+ useInfiniteList: <T = unknown>(options?: (Omit<QueryOptions, "pagination"> & {
123
+ pageSize?: number;
124
+ }) | undefined) => _tanstack_react_query.UseInfiniteQueryResult<_tanstack_query_core.InfiniteData<T[], unknown>, Error>;
125
+ useCursorList: <T = unknown>(pagination?: CursorPaginationParams, options?: Omit<QueryOptions, "pagination">) => _tanstack_react_query.UseInfiniteQueryResult<_tanstack_query_core.InfiniteData<CursorPaginatedResponse<T>, unknown>, Error>;
126
+ useCreate: <TPayload = Partial<unknown>, TResponse = unknown>(mutationOptions?: MutationOptions<TResponse, TPayload> | undefined) => _tanstack_react_query.UseMutationResult<TResponse, Error, TPayload, unknown>;
127
+ useUpdate: <TPayload = Partial<unknown>, TResponse = unknown>(mutationOptions?: MutationOptions<TResponse, {
128
+ id: ID;
129
+ data: TPayload;
130
+ }> | undefined) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
131
+ id: ID;
132
+ data: TPayload;
133
+ }, unknown>;
134
+ usePatch: <TPayload = Partial<unknown>, TResponse = unknown>(mutationOptions?: MutationOptions<TResponse, {
135
+ id: ID;
136
+ data: TPayload;
137
+ }> | undefined) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
138
+ id: ID;
139
+ data: TPayload;
140
+ }, unknown>;
141
+ useDelete: (mutationOptions?: MutationOptions<void, ID>) => _tanstack_react_query.UseMutationResult<void, Error, ID, unknown>;
142
+ useBulkDelete: (mutationOptions?: MutationOptions<void, ID[]>) => _tanstack_react_query.UseMutationResult<void, Error, ID[], unknown>;
143
+ useBulkUpdate: <TPayload = Partial<unknown>>(mutationOptions?: MutationOptions<unknown[], {
144
+ ids: ID[];
145
+ data: TPayload;
146
+ }> | undefined) => _tanstack_react_query.UseMutationResult<unknown[], Error, {
147
+ ids: ID[];
148
+ data: TPayload;
149
+ }, unknown>;
150
+ useUpload: <TResponse = unknown>(uploadOptions?: UploadOptions) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
151
+ id?: ID;
152
+ file: File | File[];
153
+ extraFields?: Record<string, string>;
154
+ }, unknown>;
155
+ useFormData: <TResponse = unknown>(opts?: {
156
+ id?: ID;
157
+ method?: "post" | "put" | "patch";
158
+ onProgress?: ((percent: number) => void) | undefined;
159
+ mutationOptions?: MutationOptions<TResponse, FormData> | undefined;
160
+ } | undefined) => _tanstack_react_query.UseMutationResult<TResponse, Error, FormData, unknown>;
161
+ useDownload: (downloadOptions?: DownloadOptions) => _tanstack_react_query.UseMutationResult<Blob, Error, {
162
+ id?: ID;
163
+ params?: Record<string, unknown>;
164
+ }, unknown>;
165
+ useExport: (opts?: {
166
+ format?: "csv" | "xlsx" | "pdf";
167
+ filename?: string;
168
+ onProgress?: ((percent: number) => void) | undefined;
169
+ } | undefined) => _tanstack_react_query.UseMutationResult<Blob, Error, QueryOptions | undefined, unknown>;
170
+ useAction: <TPayload = unknown, TResponse = unknown>(action: string, opts?: {
171
+ id?: ID;
172
+ method?: "post" | "put" | "patch" | "delete";
173
+ invalidate?: boolean;
174
+ mutationOptions?: MutationOptions<TResponse, TPayload> | undefined;
175
+ } | undefined) => _tanstack_react_query.UseMutationResult<TResponse, Error, TPayload, unknown>;
176
+ useInvalidate: () => (id?: ID) => void;
177
+ usePrefetch: () => (id?: ID) => void;
178
+ useSetCache: () => (data: unknown, id?: ID) => void;
179
+ path: string;
180
+ name: string;
181
+ };
182
+ /** Raw GET */
183
+ get: <T>(url: string, axiosConfig?: object) => Promise<T>;
184
+ /** Raw POST */
185
+ post: <T>(url: string, data?: unknown, axiosConfig?: object) => Promise<T>;
186
+ /** Raw PUT */
187
+ put: <T>(url: string, data?: unknown, axiosConfig?: object) => Promise<T>;
188
+ /** Raw PATCH */
189
+ patch: <T>(url: string, data?: unknown, axiosConfig?: object) => Promise<T>;
190
+ /** Raw DELETE */
191
+ delete: <T>(url: string, axiosConfig?: object) => Promise<T>;
192
+ };
193
+
194
+ declare function createResource<TData = unknown>(client: AxiosInstance, name: string, resourceOptions?: ResourceOptions): {
195
+ /** Full list — with filters, search, sorting, polling */
196
+ useList: <T = TData[]>(options?: QueryOptions) => _tanstack_react_query.UseQueryResult<_tanstack_query_core.NoInfer<T>, Error>;
197
+ /** Single item by ID */
198
+ useGet: <T = TData>(id: ID, options?: QueryOptions) => _tanstack_react_query.UseQueryResult<_tanstack_query_core.NoInfer<T>, Error>;
199
+ /** Page-number pagination */
200
+ usePaginatedList: <T = TData>(pagination: QueryOptions["pagination"] & {
201
+ page: number;
202
+ }, options?: Omit<QueryOptions, "pagination">) => _tanstack_react_query.UseQueryResult<PaginatedResponse<T>, Error>;
203
+ /** Offset-based infinite scroll */
204
+ useInfiniteList: <T = TData>(options?: Omit<QueryOptions, "pagination"> & {
205
+ pageSize?: number;
206
+ }) => _tanstack_react_query.UseInfiniteQueryResult<_tanstack_query_core.InfiniteData<T[], unknown>, Error>;
207
+ /** Cursor-based infinite scroll (for DB cursor pagination) */
208
+ useCursorList: <T = TData>(pagination?: CursorPaginationParams, options?: Omit<QueryOptions, "pagination">) => _tanstack_react_query.UseInfiniteQueryResult<_tanstack_query_core.InfiniteData<CursorPaginatedResponse<T>, unknown>, Error>;
209
+ /** Create — POST /resource */
210
+ useCreate: <TPayload = Partial<TData>, TResponse = TData>(mutationOptions?: MutationOptions<TResponse, TPayload>) => _tanstack_react_query.UseMutationResult<TResponse, Error, TPayload, unknown>;
211
+ /** Full replace — PUT /resource/:id */
212
+ useUpdate: <TPayload = Partial<TData>, TResponse = TData>(mutationOptions?: MutationOptions<TResponse, {
213
+ id: ID;
214
+ data: TPayload;
215
+ }>) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
216
+ id: ID;
217
+ data: TPayload;
218
+ }, unknown>;
219
+ /** Partial update — PATCH /resource/:id */
220
+ usePatch: <TPayload = Partial<TData>, TResponse = TData>(mutationOptions?: MutationOptions<TResponse, {
221
+ id: ID;
222
+ data: TPayload;
223
+ }>) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
224
+ id: ID;
225
+ data: TPayload;
226
+ }, unknown>;
227
+ /** Delete — DELETE /resource/:id */
228
+ useDelete: (mutationOptions?: MutationOptions<void, ID>) => _tanstack_react_query.UseMutationResult<void, Error, ID, unknown>;
229
+ /** Delete many — DELETE /resource { ids: [...] } */
230
+ useBulkDelete: (mutationOptions?: MutationOptions<void, ID[]>) => _tanstack_react_query.UseMutationResult<void, Error, ID[], unknown>;
231
+ /** Update many — PATCH /resource { ids: [...], ...fields } */
232
+ useBulkUpdate: <TPayload = Partial<TData>>(mutationOptions?: MutationOptions<TData[], {
233
+ ids: ID[];
234
+ data: TPayload;
235
+ }>) => _tanstack_react_query.UseMutationResult<TData[], Error, {
236
+ ids: ID[];
237
+ data: TPayload;
238
+ }, unknown>;
239
+ /** Upload file(s) with progress tracking */
240
+ useUpload: <TResponse = TData>(uploadOptions?: UploadOptions) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
241
+ id?: ID;
242
+ file: File | File[];
243
+ extraFields?: Record<string, string>;
244
+ }, unknown>;
245
+ /** Submit any FormData (mixed files + fields) */
246
+ useFormData: <TResponse = TData>(opts?: {
247
+ id?: ID;
248
+ method?: "post" | "put" | "patch";
249
+ onProgress?: (percent: number) => void;
250
+ mutationOptions?: MutationOptions<TResponse, FormData>;
251
+ }) => _tanstack_react_query.UseMutationResult<TResponse, Error, FormData, unknown>;
252
+ /** Download blob file with progress + auto "Save As" */
253
+ useDownload: (downloadOptions?: DownloadOptions) => _tanstack_react_query.UseMutationResult<Blob, Error, {
254
+ id?: ID;
255
+ params?: Record<string, unknown>;
256
+ }, unknown>;
257
+ /** Export list to CSV / XLSX / PDF */
258
+ useExport: (opts?: {
259
+ format?: "csv" | "xlsx" | "pdf";
260
+ filename?: string;
261
+ onProgress?: (percent: number) => void;
262
+ }) => _tanstack_react_query.UseMutationResult<Blob, Error, QueryOptions | undefined, unknown>;
263
+ /** Arbitrary endpoint action (e.g. /resource/:id/approve) */
264
+ useAction: <TPayload = unknown, TResponse = unknown>(action: string, opts?: {
265
+ id?: ID;
266
+ method?: "post" | "put" | "patch" | "delete";
267
+ invalidate?: boolean;
268
+ mutationOptions?: MutationOptions<TResponse, TPayload>;
269
+ }) => _tanstack_react_query.UseMutationResult<TResponse, Error, TPayload, unknown>;
270
+ /** Manually invalidate cache */
271
+ useInvalidate: () => (id?: ID) => void;
272
+ /** Prefetch on hover/navigation */
273
+ usePrefetch: () => (id?: ID) => void;
274
+ /** Manually write data into cache (SSR/seed) */
275
+ useSetCache: () => (data: TData[] | TData, id?: ID) => void;
276
+ path: string;
277
+ name: string;
278
+ };
279
+
280
+ export { type ApiClientConfig, type ApiError, type CursorPaginatedResponse, type CursorPaginationParams, type DownloadOptions, type FilterCondition, type FilterOperator, type ID, type MutationOptions, type PaginatedResponse, type PaginationParams, type QueryOptions, type ResourceOptions, type RetryConfig, type UploadOptions, createApiClient, createResource };
@@ -0,0 +1,280 @@
1
+ import * as _tanstack_react_query from '@tanstack/react-query';
2
+ import * as _tanstack_query_core from '@tanstack/query-core';
3
+ import { AxiosError, AxiosRequestConfig, AxiosInstance } from 'axios';
4
+
5
+ interface ApiClientConfig {
6
+ baseURL: string;
7
+ /** Return the current auth token */
8
+ getToken?: () => string | null | Promise<string | null>;
9
+ /** Called with a new token after refresh */
10
+ onTokenRefresh?: (newToken: string) => void;
11
+ /** Called when a refresh fails (e.g., redirect to login) */
12
+ onAuthFailure?: () => void;
13
+ /** Global error handler */
14
+ onError?: (error: AxiosError) => void;
15
+ /** Default headers added to every request */
16
+ headers?: Record<string, string>;
17
+ /** Request timeout in ms (default: 30000) */
18
+ timeout?: number;
19
+ /** Retry config */
20
+ retry?: RetryConfig;
21
+ }
22
+ interface RetryConfig {
23
+ count: number;
24
+ delay?: number;
25
+ statusCodes?: number[];
26
+ }
27
+ interface PaginationParams {
28
+ page?: number;
29
+ pageSize?: number;
30
+ sortBy?: string;
31
+ sortOrder?: "asc" | "desc";
32
+ }
33
+ interface PaginatedResponse<T> {
34
+ data: T[];
35
+ total: number;
36
+ page: number;
37
+ pageSize: number;
38
+ totalPages: number;
39
+ hasNextPage: boolean;
40
+ hasPreviousPage: boolean;
41
+ }
42
+ interface CursorPaginationParams {
43
+ cursor?: string | null;
44
+ pageSize?: number;
45
+ sortBy?: string;
46
+ sortOrder?: "asc" | "desc";
47
+ }
48
+ interface CursorPaginatedResponse<T> {
49
+ data: T[];
50
+ nextCursor: string | null;
51
+ prevCursor: string | null;
52
+ hasMore: boolean;
53
+ }
54
+ type FilterOperator = "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "endsWith" | "in" | "nin" | "between" | "isNull" | "isNotNull";
55
+ interface FilterCondition {
56
+ field: string;
57
+ operator: FilterOperator;
58
+ value: unknown;
59
+ }
60
+ interface QueryOptions {
61
+ filters?: FilterCondition[] | Record<string, unknown>;
62
+ search?: string;
63
+ searchFields?: string[];
64
+ pagination?: PaginationParams;
65
+ axiosConfig?: AxiosRequestConfig;
66
+ enabled?: boolean;
67
+ staleTime?: number;
68
+ /** Poll for fresh data every N ms */
69
+ refetchInterval?: number;
70
+ }
71
+ interface ResourceOptions {
72
+ path?: string;
73
+ defaultParams?: Record<string, unknown>;
74
+ transform?: <T>(data: unknown) => T;
75
+ staleTime?: number;
76
+ optimistic?: boolean;
77
+ }
78
+ interface MutationOptions<TData = unknown, TVariables = unknown> {
79
+ onSuccess?: (data: TData, variables: TVariables) => void;
80
+ onError?: (error: AxiosError, variables: TVariables) => void;
81
+ onSettled?: (data: TData | undefined, error: AxiosError | null) => void;
82
+ }
83
+ interface UploadOptions {
84
+ /** Progress callback, 0–100 */
85
+ onProgress?: (percent: number) => void;
86
+ /** FormData field name (default: "file") */
87
+ fieldName?: string;
88
+ /** Extra FormData fields to merge (e.g. { category: "docs" }) */
89
+ extraFields?: Record<string, string>;
90
+ }
91
+ interface DownloadOptions {
92
+ /** Triggers browser "Save As" dialog */
93
+ saveAs?: boolean;
94
+ /** Override filename (e.g. "report.pdf") */
95
+ filename?: string;
96
+ /** Mime type hint (e.g. "application/pdf") */
97
+ mimeType?: string;
98
+ /** Download progress callback, 0–100 */
99
+ onProgress?: (percent: number) => void;
100
+ }
101
+ type ID = string | number;
102
+ interface ApiError {
103
+ message: string;
104
+ status: number;
105
+ code?: string;
106
+ details?: unknown;
107
+ }
108
+
109
+ /**
110
+ * Creates a fully configured enterprise API client
111
+ */
112
+ declare function createApiClient(config: ApiClientConfig): {
113
+ /** Access the raw axios instance for custom requests */
114
+ axiosInstance: AxiosInstance;
115
+ /** Create a resource with CRUD hooks */
116
+ resource: (name: string, options?: ResourceOptions) => {
117
+ useList: <T = unknown[]>(options?: QueryOptions) => _tanstack_react_query.UseQueryResult<_tanstack_query_core.NoInfer<T>, Error>;
118
+ useGet: <T = unknown>(id: ID, options?: QueryOptions) => _tanstack_react_query.UseQueryResult<_tanstack_query_core.NoInfer<T>, Error>;
119
+ usePaginatedList: <T = unknown>(pagination: PaginationParams & {
120
+ page: number;
121
+ }, options?: Omit<QueryOptions, "pagination">) => _tanstack_react_query.UseQueryResult<PaginatedResponse<T>, Error>;
122
+ useInfiniteList: <T = unknown>(options?: (Omit<QueryOptions, "pagination"> & {
123
+ pageSize?: number;
124
+ }) | undefined) => _tanstack_react_query.UseInfiniteQueryResult<_tanstack_query_core.InfiniteData<T[], unknown>, Error>;
125
+ useCursorList: <T = unknown>(pagination?: CursorPaginationParams, options?: Omit<QueryOptions, "pagination">) => _tanstack_react_query.UseInfiniteQueryResult<_tanstack_query_core.InfiniteData<CursorPaginatedResponse<T>, unknown>, Error>;
126
+ useCreate: <TPayload = Partial<unknown>, TResponse = unknown>(mutationOptions?: MutationOptions<TResponse, TPayload> | undefined) => _tanstack_react_query.UseMutationResult<TResponse, Error, TPayload, unknown>;
127
+ useUpdate: <TPayload = Partial<unknown>, TResponse = unknown>(mutationOptions?: MutationOptions<TResponse, {
128
+ id: ID;
129
+ data: TPayload;
130
+ }> | undefined) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
131
+ id: ID;
132
+ data: TPayload;
133
+ }, unknown>;
134
+ usePatch: <TPayload = Partial<unknown>, TResponse = unknown>(mutationOptions?: MutationOptions<TResponse, {
135
+ id: ID;
136
+ data: TPayload;
137
+ }> | undefined) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
138
+ id: ID;
139
+ data: TPayload;
140
+ }, unknown>;
141
+ useDelete: (mutationOptions?: MutationOptions<void, ID>) => _tanstack_react_query.UseMutationResult<void, Error, ID, unknown>;
142
+ useBulkDelete: (mutationOptions?: MutationOptions<void, ID[]>) => _tanstack_react_query.UseMutationResult<void, Error, ID[], unknown>;
143
+ useBulkUpdate: <TPayload = Partial<unknown>>(mutationOptions?: MutationOptions<unknown[], {
144
+ ids: ID[];
145
+ data: TPayload;
146
+ }> | undefined) => _tanstack_react_query.UseMutationResult<unknown[], Error, {
147
+ ids: ID[];
148
+ data: TPayload;
149
+ }, unknown>;
150
+ useUpload: <TResponse = unknown>(uploadOptions?: UploadOptions) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
151
+ id?: ID;
152
+ file: File | File[];
153
+ extraFields?: Record<string, string>;
154
+ }, unknown>;
155
+ useFormData: <TResponse = unknown>(opts?: {
156
+ id?: ID;
157
+ method?: "post" | "put" | "patch";
158
+ onProgress?: ((percent: number) => void) | undefined;
159
+ mutationOptions?: MutationOptions<TResponse, FormData> | undefined;
160
+ } | undefined) => _tanstack_react_query.UseMutationResult<TResponse, Error, FormData, unknown>;
161
+ useDownload: (downloadOptions?: DownloadOptions) => _tanstack_react_query.UseMutationResult<Blob, Error, {
162
+ id?: ID;
163
+ params?: Record<string, unknown>;
164
+ }, unknown>;
165
+ useExport: (opts?: {
166
+ format?: "csv" | "xlsx" | "pdf";
167
+ filename?: string;
168
+ onProgress?: ((percent: number) => void) | undefined;
169
+ } | undefined) => _tanstack_react_query.UseMutationResult<Blob, Error, QueryOptions | undefined, unknown>;
170
+ useAction: <TPayload = unknown, TResponse = unknown>(action: string, opts?: {
171
+ id?: ID;
172
+ method?: "post" | "put" | "patch" | "delete";
173
+ invalidate?: boolean;
174
+ mutationOptions?: MutationOptions<TResponse, TPayload> | undefined;
175
+ } | undefined) => _tanstack_react_query.UseMutationResult<TResponse, Error, TPayload, unknown>;
176
+ useInvalidate: () => (id?: ID) => void;
177
+ usePrefetch: () => (id?: ID) => void;
178
+ useSetCache: () => (data: unknown, id?: ID) => void;
179
+ path: string;
180
+ name: string;
181
+ };
182
+ /** Raw GET */
183
+ get: <T>(url: string, axiosConfig?: object) => Promise<T>;
184
+ /** Raw POST */
185
+ post: <T>(url: string, data?: unknown, axiosConfig?: object) => Promise<T>;
186
+ /** Raw PUT */
187
+ put: <T>(url: string, data?: unknown, axiosConfig?: object) => Promise<T>;
188
+ /** Raw PATCH */
189
+ patch: <T>(url: string, data?: unknown, axiosConfig?: object) => Promise<T>;
190
+ /** Raw DELETE */
191
+ delete: <T>(url: string, axiosConfig?: object) => Promise<T>;
192
+ };
193
+
194
+ declare function createResource<TData = unknown>(client: AxiosInstance, name: string, resourceOptions?: ResourceOptions): {
195
+ /** Full list — with filters, search, sorting, polling */
196
+ useList: <T = TData[]>(options?: QueryOptions) => _tanstack_react_query.UseQueryResult<_tanstack_query_core.NoInfer<T>, Error>;
197
+ /** Single item by ID */
198
+ useGet: <T = TData>(id: ID, options?: QueryOptions) => _tanstack_react_query.UseQueryResult<_tanstack_query_core.NoInfer<T>, Error>;
199
+ /** Page-number pagination */
200
+ usePaginatedList: <T = TData>(pagination: QueryOptions["pagination"] & {
201
+ page: number;
202
+ }, options?: Omit<QueryOptions, "pagination">) => _tanstack_react_query.UseQueryResult<PaginatedResponse<T>, Error>;
203
+ /** Offset-based infinite scroll */
204
+ useInfiniteList: <T = TData>(options?: Omit<QueryOptions, "pagination"> & {
205
+ pageSize?: number;
206
+ }) => _tanstack_react_query.UseInfiniteQueryResult<_tanstack_query_core.InfiniteData<T[], unknown>, Error>;
207
+ /** Cursor-based infinite scroll (for DB cursor pagination) */
208
+ useCursorList: <T = TData>(pagination?: CursorPaginationParams, options?: Omit<QueryOptions, "pagination">) => _tanstack_react_query.UseInfiniteQueryResult<_tanstack_query_core.InfiniteData<CursorPaginatedResponse<T>, unknown>, Error>;
209
+ /** Create — POST /resource */
210
+ useCreate: <TPayload = Partial<TData>, TResponse = TData>(mutationOptions?: MutationOptions<TResponse, TPayload>) => _tanstack_react_query.UseMutationResult<TResponse, Error, TPayload, unknown>;
211
+ /** Full replace — PUT /resource/:id */
212
+ useUpdate: <TPayload = Partial<TData>, TResponse = TData>(mutationOptions?: MutationOptions<TResponse, {
213
+ id: ID;
214
+ data: TPayload;
215
+ }>) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
216
+ id: ID;
217
+ data: TPayload;
218
+ }, unknown>;
219
+ /** Partial update — PATCH /resource/:id */
220
+ usePatch: <TPayload = Partial<TData>, TResponse = TData>(mutationOptions?: MutationOptions<TResponse, {
221
+ id: ID;
222
+ data: TPayload;
223
+ }>) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
224
+ id: ID;
225
+ data: TPayload;
226
+ }, unknown>;
227
+ /** Delete — DELETE /resource/:id */
228
+ useDelete: (mutationOptions?: MutationOptions<void, ID>) => _tanstack_react_query.UseMutationResult<void, Error, ID, unknown>;
229
+ /** Delete many — DELETE /resource { ids: [...] } */
230
+ useBulkDelete: (mutationOptions?: MutationOptions<void, ID[]>) => _tanstack_react_query.UseMutationResult<void, Error, ID[], unknown>;
231
+ /** Update many — PATCH /resource { ids: [...], ...fields } */
232
+ useBulkUpdate: <TPayload = Partial<TData>>(mutationOptions?: MutationOptions<TData[], {
233
+ ids: ID[];
234
+ data: TPayload;
235
+ }>) => _tanstack_react_query.UseMutationResult<TData[], Error, {
236
+ ids: ID[];
237
+ data: TPayload;
238
+ }, unknown>;
239
+ /** Upload file(s) with progress tracking */
240
+ useUpload: <TResponse = TData>(uploadOptions?: UploadOptions) => _tanstack_react_query.UseMutationResult<TResponse, Error, {
241
+ id?: ID;
242
+ file: File | File[];
243
+ extraFields?: Record<string, string>;
244
+ }, unknown>;
245
+ /** Submit any FormData (mixed files + fields) */
246
+ useFormData: <TResponse = TData>(opts?: {
247
+ id?: ID;
248
+ method?: "post" | "put" | "patch";
249
+ onProgress?: (percent: number) => void;
250
+ mutationOptions?: MutationOptions<TResponse, FormData>;
251
+ }) => _tanstack_react_query.UseMutationResult<TResponse, Error, FormData, unknown>;
252
+ /** Download blob file with progress + auto "Save As" */
253
+ useDownload: (downloadOptions?: DownloadOptions) => _tanstack_react_query.UseMutationResult<Blob, Error, {
254
+ id?: ID;
255
+ params?: Record<string, unknown>;
256
+ }, unknown>;
257
+ /** Export list to CSV / XLSX / PDF */
258
+ useExport: (opts?: {
259
+ format?: "csv" | "xlsx" | "pdf";
260
+ filename?: string;
261
+ onProgress?: (percent: number) => void;
262
+ }) => _tanstack_react_query.UseMutationResult<Blob, Error, QueryOptions | undefined, unknown>;
263
+ /** Arbitrary endpoint action (e.g. /resource/:id/approve) */
264
+ useAction: <TPayload = unknown, TResponse = unknown>(action: string, opts?: {
265
+ id?: ID;
266
+ method?: "post" | "put" | "patch" | "delete";
267
+ invalidate?: boolean;
268
+ mutationOptions?: MutationOptions<TResponse, TPayload>;
269
+ }) => _tanstack_react_query.UseMutationResult<TResponse, Error, TPayload, unknown>;
270
+ /** Manually invalidate cache */
271
+ useInvalidate: () => (id?: ID) => void;
272
+ /** Prefetch on hover/navigation */
273
+ usePrefetch: () => (id?: ID) => void;
274
+ /** Manually write data into cache (SSR/seed) */
275
+ useSetCache: () => (data: TData[] | TData, id?: ID) => void;
276
+ path: string;
277
+ name: string;
278
+ };
279
+
280
+ export { type ApiClientConfig, type ApiError, type CursorPaginatedResponse, type CursorPaginationParams, type DownloadOptions, type FilterCondition, type FilterOperator, type ID, type MutationOptions, type PaginatedResponse, type PaginationParams, type QueryOptions, type ResourceOptions, type RetryConfig, type UploadOptions, createApiClient, createResource };