eden2query 0.3.8 → 0.3.10

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.
package/README.md CHANGED
@@ -1,418 +1,418 @@
1
- # eden2query
2
-
3
- Type-safe [Eden Treaty](https://elysiajs.com/eden/overview) to [React Query](https://tanstack.com/query) helpers. Create fully type-safe React Query hooks from your Elysia API with zero runtime overhead.
4
-
5
- ## Install
6
-
7
- ```bash
8
- bun add eden2query @elysiajs/eden @tanstack/react-query
9
- ```
10
-
11
- ## Quick Start
12
-
13
- ### 1. Define your Elysia API
14
-
15
- ```ts
16
- import Elysia, { t } from "elysia";
17
-
18
- const app = new Elysia({ prefix: "/api" })
19
- .get("/users/:id", ({ params, query }) => {
20
- return { user: { id: params.id, name: query.name } };
21
- }, {
22
- params: t.Object({ id: t.String() }),
23
- query: t.Object({ name: t.String() }),
24
- response: { 200: t.Object({ user: t.Object({ id: t.String(), name: t.String() }) }) },
25
- })
26
- .post("/users", ({ body }) => {
27
- return { id: "123", ...body };
28
- }, {
29
- body: t.Object({ name: t.String(), email: t.String() }),
30
- response: { 200: t.Object({ id: t.String(), name: t.String(), email: t.String() }) },
31
- })
32
- .put("/users/:id", ({ params, body }) => {
33
- return { id: params.id, ...body };
34
- }, {
35
- params: t.Object({ id: t.String() }),
36
- body: t.Object({ name: t.String() }),
37
- response: { 200: t.Object({ id: t.String(), name: t.String() }) },
38
- })
39
- .delete("/users/:id", ({ params }) => {
40
- return { deleted: params.id };
41
- }, {
42
- params: t.Object({ id: t.String() }),
43
- response: { 200: t.Object({ deleted: t.String() }) },
44
- });
45
- ```
46
-
47
- ### 2. Create Treaty Client
48
-
49
- ```ts
50
- import { treaty } from "@elysiajs/eden";
51
-
52
- const client = treaty<typeof app>("http://localhost:3000");
53
- ```
54
-
55
- ### 3. Create Type-Safe Hooks
56
-
57
- ```ts
58
- import { treatyQueryHook, treatyMutationHook } from "eden2query";
59
- import { useQueryClient } from "@tanstack/react-query";
60
-
61
- // GET - Query Hook (with params)
62
- function getUser(params: { id: string }) {
63
- return client.api.users({ id: params.id }).get;
64
- }
65
-
66
- const useGetUser = treatyQueryHook(getUser, (request) => {
67
- return {
68
- queryKey: ["users", request.params.id],
69
- };
70
- });
71
-
72
- // POST - Mutation Hook
73
- function createUser() {
74
- return client.api.users.post;
75
- }
76
-
77
- const useCreateUser = treatyMutationHook(createUser, () => {
78
- const queryClient = useQueryClient();
79
- return {
80
- onSuccess: () => {
81
- queryClient.invalidateQueries({ queryKey: ["users"] });
82
- },
83
- };
84
- });
85
-
86
- // PUT - Mutation Hook with Params
87
- function updateUser(params: { id: string }) {
88
- return client.api.users({ id: params.id }).put;
89
- }
90
-
91
- const useUpdateUser = treatyMutationHook(updateUser, () => {
92
- const queryClient = useQueryClient();
93
- return {
94
- onSuccess: () => {
95
- queryClient.invalidateQueries({ queryKey: ["users"] });
96
- },
97
- };
98
- });
99
-
100
- // DELETE - Mutation Hook with Params (no body)
101
- function deleteUser(params: { id: string }) {
102
- return client.api.users({ id: params.id }).delete;
103
- }
104
-
105
- const useDeleteUser = treatyMutationHook(deleteUser, () => {
106
- const queryClient = useQueryClient();
107
- return {
108
- onSuccess: () => {
109
- queryClient.invalidateQueries({ queryKey: ["users"] });
110
- },
111
- };
112
- });
113
- ```
114
-
115
- ### 4. Use in Components
116
-
117
- ```tsx
118
- function UserProfile({ userId }: { userId: string }) {
119
- // Query - automatically typed
120
- const { data, isLoading } = useGetUser({
121
- params: { id: userId },
122
- query: { name: "John" },
123
- });
124
-
125
- // Mutations - fully typed
126
- const createMutation = useCreateUser({
127
- onSuccess: (data) => {
128
- console.log("Created:", data);
129
- },
130
- });
131
-
132
- const updateMutation = useUpdateUser({
133
- onSuccess: (data) => {
134
- console.log("Updated:", data);
135
- },
136
- });
137
-
138
- const deleteMutation = useDeleteUser({
139
- onSuccess: (data) => {
140
- console.log("Deleted:", data);
141
- },
142
- });
143
-
144
- return (
145
- <div>
146
- {isLoading ? "Loading..." : <div>{data?.user.name}</div>}
147
-
148
- <button onClick={() => createMutation.mutate({
149
- body: { name: "New User", email: "user@example.com" },
150
- })}>
151
- Create User
152
- </button>
153
-
154
- <button onClick={() => updateMutation.mutate({
155
- params: { id: userId },
156
- body: { name: "Updated Name" },
157
- })}>
158
- Update User
159
- </button>
160
-
161
- <button onClick={() => deleteMutation.mutate({
162
- params: { id: userId },
163
- // body is not required for DELETE mutations
164
- })}>
165
- Delete User
166
- </button>
167
- </div>
168
- );
169
- }
170
- ```
171
-
172
- ## API Reference
173
-
174
- ### `treatyQueryHook`
175
-
176
- Creates a type-safe React Query hook for GET requests.
177
-
178
- **Signature:**
179
- ```ts
180
- function treatyQueryHook<TParams, TOption extends object, TResponse extends Record<number, unknown>>(
181
- fn: TreatyQueryFunctionFactory<TParams, TOption, TResponse>,
182
- useOptions: (request: TreatyQueryRequest<TParams, TOption>) => Omit<UseQueryOptions<TResponse>, "queryFn">
183
- ): (request: TreatyQueryRequest<TParams, TOption>, options?: UseQueryOptions) => UseQueryResult
184
- ```
185
-
186
- **Parameters:**
187
- - `fn`: A factory function that accepts params (if route has params) or no params (if route doesn't have params), and returns a Treaty query function
188
- - `useOptions`: A function that receives the request and returns query options (including `queryKey`)
189
-
190
- **Returns:** A hook function that accepts a request object and optional query options
191
-
192
- **Example:**
193
- ```ts
194
- // With params
195
- function getUser(params: { id: string }) {
196
- return client.api.users({ id: params.id }).get;
197
- }
198
-
199
- const useGetUser = treatyQueryHook(getUser, (request) => ({
200
- queryKey: ["users", request.params.id], // params is required when route has params
201
- staleTime: 5000,
202
- }));
203
-
204
- // Usage
205
- const { data } = useGetUser({
206
- params: { id: "123" }, // Required when route has params
207
- query: { name: "John" },
208
- });
209
-
210
- // Without params
211
- function getUsers() {
212
- return client.api.users.get;
213
- }
214
-
215
- const useGetUsers = treatyQueryHook(getUsers, (request) => ({
216
- queryKey: ["users"],
217
- }));
218
-
219
- // Usage - params are absent from the type
220
- const { data } = useGetUsers({
221
- query: { page: "1" },
222
- // params is not part of the request type
223
- });
224
- ```
225
-
226
- ### `treatyMutationHook`
227
-
228
- Creates a type-safe React Query hook for mutations (POST, PUT, DELETE, etc.).
229
-
230
- **Signature:**
231
- ```ts
232
- function treatyMutationHook<TParams, TBody, TOption, TResponse extends Record<number, unknown>>(
233
- fn: TreatyMutationFunctionFactory<TParams, TBody, TOption, TResponse>,
234
- useOptions: () => Omit<UseMutationOptions<TParams, TBody, TOption, TResponse>, "mutationFn">
235
- ): (options?: UseMutationOptions) => UseMutationResult
236
- ```
237
-
238
- **Parameters:**
239
- - `fn`: A factory function that accepts params (if route has params) or no params (if route doesn't have params), and returns a Treaty mutation function
240
- - `useOptions`: A hook function that returns default mutation options (can use React hooks like `useQueryClient`)
241
-
242
- **Returns:** A hook function that accepts optional mutation options
243
-
244
- **Example:**
245
- ```ts
246
- // Without params, with body
247
- function createUser() {
248
- return client.api.users.post;
249
- }
250
-
251
- const useCreateUser = treatyMutationHook(createUser, () => {
252
- const queryClient = useQueryClient();
253
- return {
254
- onSuccess: () => {
255
- queryClient.invalidateQueries({ queryKey: ["users"] });
256
- },
257
- };
258
- });
259
-
260
- // Usage
261
- const mutation = useCreateUser({
262
- onSuccess: (data) => console.log(data),
263
- });
264
-
265
- mutation.mutate({
266
- body: { name: "John", email: "john@example.com" },
267
- // params is not part of the request type
268
- });
269
-
270
- // With params and body
271
- function updateUser(params: { id: string }) {
272
- return client.api.users({ id: params.id }).put;
273
- }
274
-
275
- const useUpdateUser = treatyMutationHook(updateUser, () => ({
276
- onSuccess: () => console.log("Updated"),
277
- }));
278
-
279
- useUpdateUser().mutate({
280
- params: { id: "123" },
281
- body: { name: "Updated Name" },
282
- });
283
-
284
- // With params, without body
285
- function deleteUser(params: { id: string }) {
286
- return client.api.users({ id: params.id }).delete;
287
- }
288
-
289
- const useDeleteUser = treatyMutationHook(deleteUser, () => ({
290
- onSuccess: () => console.log("Deleted"),
291
- }));
292
-
293
- useDeleteUser().mutate({
294
- params: { id: "123" },
295
- // body is not part of the request type
296
- });
297
- ```
298
-
299
- ## Type Safety
300
-
301
- All types are inferred end-to-end from your Elysia route definitions:
302
-
303
- - **Request types**: Automatically inferred from route params, query, and body schemas
304
- - `params` and `body` are **conditionally included** in request types - they're absent (not optional) when the route doesn't require them
305
- - This means you don't need to pass `undefined` or `unknown` values - the fields simply don't exist in the type
306
- - **Response types**: Extracted from your response schema definitions
307
- - **Error types**: Typed based on your error response schemas
308
- - **Query keys**: Type-safe based on your request structure
309
-
310
- ## Patterns
311
-
312
- ### Routes with Params
313
-
314
- For routes like `/users/:id`, params are **required** and included in the request type:
315
-
316
- ```ts
317
- function getUser(params: { id: string }) {
318
- return client.api.users({ id: params.id }).get;
319
- }
320
-
321
- const useGetUser = treatyQueryHook(getUser, (request) => ({
322
- queryKey: ["users", request.params.id], // params is required here
323
- }));
324
-
325
- // Must provide params
326
- useGetUser({
327
- params: { id: "123" }, // ✅ Required - params is part of the request type
328
- query: { name: "John" },
329
- });
330
- ```
331
-
332
- ### Routes without Params
333
-
334
- For routes without params, params are **absent** from the request type (not optional):
335
-
336
- ```ts
337
- function getUsers() {
338
- return client.api.users.get;
339
- }
340
-
341
- const useGetUsers = treatyQueryHook(getUsers, (request) => ({
342
- queryKey: ["users"],
343
- }));
344
-
345
- // Params are absent from the type - you cannot include them
346
- useGetUsers({
347
- query: { page: "1" },
348
- // params is not part of the request type at all
349
- });
350
- ```
351
-
352
- ### Mutations with Body (no params)
353
-
354
- POST mutations without route params include a `body` field:
355
-
356
- ```ts
357
- function createUser() {
358
- return client.api.users.post;
359
- }
360
-
361
- const useCreateUser = treatyMutationHook(createUser, () => ({}));
362
-
363
- const mutation = useCreateUser();
364
- mutation.mutate({
365
- body: { name: "John", email: "john@example.com" },
366
- // params is not part of the request type
367
- });
368
- ```
369
-
370
- ### Mutations with Params and Body
371
-
372
- PUT mutations can have both params and body:
373
-
374
- ```ts
375
- function updateUser(params: { id: string }) {
376
- return client.api.users({ id: params.id }).put;
377
- }
378
-
379
- const useUpdateUser = treatyMutationHook(updateUser, () => ({}));
380
-
381
- const mutation = useUpdateUser();
382
- mutation.mutate({
383
- params: { id: "123" }, // Required - params is part of the request type
384
- body: { name: "Updated Name" }, // Required - body is part of the request type
385
- });
386
- ```
387
-
388
- ### Mutations with Only Params (no body)
389
-
390
- DELETE mutations typically only have params, and body is **absent** from the request type:
391
-
392
- ```ts
393
- function deleteUser(params: { id: string }) {
394
- return client.api.users({ id: params.id }).delete;
395
- }
396
-
397
- const useDeleteUser = treatyMutationHook(deleteUser, () => ({}));
398
-
399
- const mutation = useDeleteUser();
400
- mutation.mutate({
401
- params: { id: "123" }, // Required - params is part of the request type
402
- // body is not part of the request type at all
403
- });
404
- ```
405
-
406
- ## Options Merging
407
-
408
- Options are merged in this order (later options override earlier ones):
409
-
410
- 1. Base options from `useOptions` hook
411
- 2. Options passed to the hook factory
412
- 3. Options passed when calling the hook
413
-
414
- Callbacks (`onSuccess`, `onError`, etc.) are **chained** - all callbacks run in order.
415
-
416
- ## License
417
-
418
- MIT
1
+ # eden2query
2
+
3
+ Type-safe [Eden Treaty](https://elysiajs.com/eden/overview) to [React Query](https://tanstack.com/query) helpers. Create fully type-safe React Query hooks from your Elysia API with zero runtime overhead.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ bun add eden2query @elysiajs/eden @tanstack/react-query
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ### 1. Define your Elysia API
14
+
15
+ ```ts
16
+ import Elysia, { t } from "elysia";
17
+
18
+ const app = new Elysia({ prefix: "/api" })
19
+ .get("/users/:id", ({ params, query }) => {
20
+ return { user: { id: params.id, name: query.name } };
21
+ }, {
22
+ params: t.Object({ id: t.String() }),
23
+ query: t.Object({ name: t.String() }),
24
+ response: { 200: t.Object({ user: t.Object({ id: t.String(), name: t.String() }) }) },
25
+ })
26
+ .post("/users", ({ body }) => {
27
+ return { id: "123", ...body };
28
+ }, {
29
+ body: t.Object({ name: t.String(), email: t.String() }),
30
+ response: { 200: t.Object({ id: t.String(), name: t.String(), email: t.String() }) },
31
+ })
32
+ .put("/users/:id", ({ params, body }) => {
33
+ return { id: params.id, ...body };
34
+ }, {
35
+ params: t.Object({ id: t.String() }),
36
+ body: t.Object({ name: t.String() }),
37
+ response: { 200: t.Object({ id: t.String(), name: t.String() }) },
38
+ })
39
+ .delete("/users/:id", ({ params }) => {
40
+ return { deleted: params.id };
41
+ }, {
42
+ params: t.Object({ id: t.String() }),
43
+ response: { 200: t.Object({ deleted: t.String() }) },
44
+ });
45
+ ```
46
+
47
+ ### 2. Create Treaty Client
48
+
49
+ ```ts
50
+ import { treaty } from "@elysiajs/eden";
51
+
52
+ const client = treaty<typeof app>("http://localhost:3000");
53
+ ```
54
+
55
+ ### 3. Create Type-Safe Hooks
56
+
57
+ ```ts
58
+ import { treatyQueryHook, treatyMutationHook } from "eden2query";
59
+ import { useQueryClient } from "@tanstack/react-query";
60
+
61
+ // GET - Query Hook (with params)
62
+ function getUser(params: { id: string }) {
63
+ return client.api.users({ id: params.id }).get;
64
+ }
65
+
66
+ const useGetUser = treatyQueryHook(getUser, (request) => {
67
+ return {
68
+ queryKey: ["users", request.params.id],
69
+ };
70
+ });
71
+
72
+ // POST - Mutation Hook
73
+ function createUser() {
74
+ return client.api.users.post;
75
+ }
76
+
77
+ const useCreateUser = treatyMutationHook(createUser, () => {
78
+ const queryClient = useQueryClient();
79
+ return {
80
+ onSuccess: () => {
81
+ queryClient.invalidateQueries({ queryKey: ["users"] });
82
+ },
83
+ };
84
+ });
85
+
86
+ // PUT - Mutation Hook with Params
87
+ function updateUser(params: { id: string }) {
88
+ return client.api.users({ id: params.id }).put;
89
+ }
90
+
91
+ const useUpdateUser = treatyMutationHook(updateUser, () => {
92
+ const queryClient = useQueryClient();
93
+ return {
94
+ onSuccess: () => {
95
+ queryClient.invalidateQueries({ queryKey: ["users"] });
96
+ },
97
+ };
98
+ });
99
+
100
+ // DELETE - Mutation Hook with Params (no body)
101
+ function deleteUser(params: { id: string }) {
102
+ return client.api.users({ id: params.id }).delete;
103
+ }
104
+
105
+ const useDeleteUser = treatyMutationHook(deleteUser, () => {
106
+ const queryClient = useQueryClient();
107
+ return {
108
+ onSuccess: () => {
109
+ queryClient.invalidateQueries({ queryKey: ["users"] });
110
+ },
111
+ };
112
+ });
113
+ ```
114
+
115
+ ### 4. Use in Components
116
+
117
+ ```tsx
118
+ function UserProfile({ userId }: { userId: string }) {
119
+ // Query - automatically typed
120
+ const { data, isLoading } = useGetUser({
121
+ params: { id: userId },
122
+ query: { name: "John" },
123
+ });
124
+
125
+ // Mutations - fully typed
126
+ const createMutation = useCreateUser({
127
+ onSuccess: (data) => {
128
+ console.log("Created:", data);
129
+ },
130
+ });
131
+
132
+ const updateMutation = useUpdateUser({
133
+ onSuccess: (data) => {
134
+ console.log("Updated:", data);
135
+ },
136
+ });
137
+
138
+ const deleteMutation = useDeleteUser({
139
+ onSuccess: (data) => {
140
+ console.log("Deleted:", data);
141
+ },
142
+ });
143
+
144
+ return (
145
+ <div>
146
+ {isLoading ? "Loading..." : <div>{data?.user.name}</div>}
147
+
148
+ <button onClick={() => createMutation.mutate({
149
+ body: { name: "New User", email: "user@example.com" },
150
+ })}>
151
+ Create User
152
+ </button>
153
+
154
+ <button onClick={() => updateMutation.mutate({
155
+ params: { id: userId },
156
+ body: { name: "Updated Name" },
157
+ })}>
158
+ Update User
159
+ </button>
160
+
161
+ <button onClick={() => deleteMutation.mutate({
162
+ params: { id: userId },
163
+ // body is not required for DELETE mutations
164
+ })}>
165
+ Delete User
166
+ </button>
167
+ </div>
168
+ );
169
+ }
170
+ ```
171
+
172
+ ## API Reference
173
+
174
+ ### `treatyQueryHook`
175
+
176
+ Creates a type-safe React Query hook for GET requests.
177
+
178
+ **Signature:**
179
+ ```ts
180
+ function treatyQueryHook<TParams, TOption extends object, TResponse extends Record<number, unknown>>(
181
+ fn: TreatyQueryFunctionFactory<TParams, TOption, TResponse>,
182
+ useOptions: (request: TreatyQueryRequest<TParams, TOption>) => Omit<UseQueryOptions<TResponse>, "queryFn">
183
+ ): (request: TreatyQueryRequest<TParams, TOption>, options?: UseQueryOptions) => UseQueryResult
184
+ ```
185
+
186
+ **Parameters:**
187
+ - `fn`: A factory function that accepts params (if route has params) or no params (if route doesn't have params), and returns a Treaty query function
188
+ - `useOptions`: A function that receives the request and returns query options (including `queryKey`)
189
+
190
+ **Returns:** A hook function that accepts a request object and optional query options
191
+
192
+ **Example:**
193
+ ```ts
194
+ // With params
195
+ function getUser(params: { id: string }) {
196
+ return client.api.users({ id: params.id }).get;
197
+ }
198
+
199
+ const useGetUser = treatyQueryHook(getUser, (request) => ({
200
+ queryKey: ["users", request.params.id], // params is required when route has params
201
+ staleTime: 5000,
202
+ }));
203
+
204
+ // Usage
205
+ const { data } = useGetUser({
206
+ params: { id: "123" }, // Required when route has params
207
+ query: { name: "John" },
208
+ });
209
+
210
+ // Without params
211
+ function getUsers() {
212
+ return client.api.users.get;
213
+ }
214
+
215
+ const useGetUsers = treatyQueryHook(getUsers, (request) => ({
216
+ queryKey: ["users"],
217
+ }));
218
+
219
+ // Usage - params are absent from the type
220
+ const { data } = useGetUsers({
221
+ query: { page: "1" },
222
+ // params is not part of the request type
223
+ });
224
+ ```
225
+
226
+ ### `treatyMutationHook`
227
+
228
+ Creates a type-safe React Query hook for mutations (POST, PUT, DELETE, etc.).
229
+
230
+ **Signature:**
231
+ ```ts
232
+ function treatyMutationHook<TParams, TBody, TOption, TResponse extends Record<number, unknown>>(
233
+ fn: TreatyMutationFunctionFactory<TParams, TBody, TOption, TResponse>,
234
+ useOptions: () => Omit<UseMutationOptions<TParams, TBody, TOption, TResponse>, "mutationFn">
235
+ ): (options?: UseMutationOptions) => UseMutationResult
236
+ ```
237
+
238
+ **Parameters:**
239
+ - `fn`: A factory function that accepts params (if route has params) or no params (if route doesn't have params), and returns a Treaty mutation function
240
+ - `useOptions`: A hook function that returns default mutation options (can use React hooks like `useQueryClient`)
241
+
242
+ **Returns:** A hook function that accepts optional mutation options
243
+
244
+ **Example:**
245
+ ```ts
246
+ // Without params, with body
247
+ function createUser() {
248
+ return client.api.users.post;
249
+ }
250
+
251
+ const useCreateUser = treatyMutationHook(createUser, () => {
252
+ const queryClient = useQueryClient();
253
+ return {
254
+ onSuccess: () => {
255
+ queryClient.invalidateQueries({ queryKey: ["users"] });
256
+ },
257
+ };
258
+ });
259
+
260
+ // Usage
261
+ const mutation = useCreateUser({
262
+ onSuccess: (data) => console.log(data),
263
+ });
264
+
265
+ mutation.mutate({
266
+ body: { name: "John", email: "john@example.com" },
267
+ // params is not part of the request type
268
+ });
269
+
270
+ // With params and body
271
+ function updateUser(params: { id: string }) {
272
+ return client.api.users({ id: params.id }).put;
273
+ }
274
+
275
+ const useUpdateUser = treatyMutationHook(updateUser, () => ({
276
+ onSuccess: () => console.log("Updated"),
277
+ }));
278
+
279
+ useUpdateUser().mutate({
280
+ params: { id: "123" },
281
+ body: { name: "Updated Name" },
282
+ });
283
+
284
+ // With params, without body
285
+ function deleteUser(params: { id: string }) {
286
+ return client.api.users({ id: params.id }).delete;
287
+ }
288
+
289
+ const useDeleteUser = treatyMutationHook(deleteUser, () => ({
290
+ onSuccess: () => console.log("Deleted"),
291
+ }));
292
+
293
+ useDeleteUser().mutate({
294
+ params: { id: "123" },
295
+ // body is not part of the request type
296
+ });
297
+ ```
298
+
299
+ ## Type Safety
300
+
301
+ All types are inferred end-to-end from your Elysia route definitions:
302
+
303
+ - **Request types**: Automatically inferred from route params, query, and body schemas
304
+ - `params` and `body` are **conditionally included** in request types - they're absent (not optional) when the route doesn't require them
305
+ - This means you don't need to pass `undefined` or `unknown` values - the fields simply don't exist in the type
306
+ - **Response types**: Extracted from your response schema definitions
307
+ - **Error types**: Typed based on your error response schemas
308
+ - **Query keys**: Type-safe based on your request structure
309
+
310
+ ## Patterns
311
+
312
+ ### Routes with Params
313
+
314
+ For routes like `/users/:id`, params are **required** and included in the request type:
315
+
316
+ ```ts
317
+ function getUser(params: { id: string }) {
318
+ return client.api.users({ id: params.id }).get;
319
+ }
320
+
321
+ const useGetUser = treatyQueryHook(getUser, (request) => ({
322
+ queryKey: ["users", request.params.id], // params is required here
323
+ }));
324
+
325
+ // Must provide params
326
+ useGetUser({
327
+ params: { id: "123" }, // ✅ Required - params is part of the request type
328
+ query: { name: "John" },
329
+ });
330
+ ```
331
+
332
+ ### Routes without Params
333
+
334
+ For routes without params, params are **absent** from the request type (not optional):
335
+
336
+ ```ts
337
+ function getUsers() {
338
+ return client.api.users.get;
339
+ }
340
+
341
+ const useGetUsers = treatyQueryHook(getUsers, (request) => ({
342
+ queryKey: ["users"],
343
+ }));
344
+
345
+ // Params are absent from the type - you cannot include them
346
+ useGetUsers({
347
+ query: { page: "1" },
348
+ // params is not part of the request type at all
349
+ });
350
+ ```
351
+
352
+ ### Mutations with Body (no params)
353
+
354
+ POST mutations without route params include a `body` field:
355
+
356
+ ```ts
357
+ function createUser() {
358
+ return client.api.users.post;
359
+ }
360
+
361
+ const useCreateUser = treatyMutationHook(createUser, () => ({}));
362
+
363
+ const mutation = useCreateUser();
364
+ mutation.mutate({
365
+ body: { name: "John", email: "john@example.com" },
366
+ // params is not part of the request type
367
+ });
368
+ ```
369
+
370
+ ### Mutations with Params and Body
371
+
372
+ PUT mutations can have both params and body:
373
+
374
+ ```ts
375
+ function updateUser(params: { id: string }) {
376
+ return client.api.users({ id: params.id }).put;
377
+ }
378
+
379
+ const useUpdateUser = treatyMutationHook(updateUser, () => ({}));
380
+
381
+ const mutation = useUpdateUser();
382
+ mutation.mutate({
383
+ params: { id: "123" }, // Required - params is part of the request type
384
+ body: { name: "Updated Name" }, // Required - body is part of the request type
385
+ });
386
+ ```
387
+
388
+ ### Mutations with Only Params (no body)
389
+
390
+ DELETE mutations typically only have params, and body is **absent** from the request type:
391
+
392
+ ```ts
393
+ function deleteUser(params: { id: string }) {
394
+ return client.api.users({ id: params.id }).delete;
395
+ }
396
+
397
+ const useDeleteUser = treatyMutationHook(deleteUser, () => ({}));
398
+
399
+ const mutation = useDeleteUser();
400
+ mutation.mutate({
401
+ params: { id: "123" }, // Required - params is part of the request type
402
+ // body is not part of the request type at all
403
+ });
404
+ ```
405
+
406
+ ## Options Merging
407
+
408
+ Options are merged in this order (later options override earlier ones):
409
+
410
+ 1. Base options from `useOptions` hook
411
+ 2. Options passed to the hook factory
412
+ 3. Options passed when calling the hook
413
+
414
+ Callbacks (`onSuccess`, `onError`, etc.) are **chained** - all callbacks run in order.
415
+
416
+ ## License
417
+
418
+ MIT
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Treaty } from "@elysiajs/eden";
2
2
  import { UseMutationOptions, UseMutationResult, UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
3
- type IsEmpty<T> = [T] extends [never | undefined | void] ? true : [unknown] extends [T] ? [T] extends [unknown] ? true : false : false;
3
+ type IsEmpty<T> = [T] extends [never | undefined | void] ? true : [unknown] extends [T] ? [T] extends [unknown] ? true : false : [T] extends [object] ? [keyof T] extends [never] ? true : false : false;
4
4
  type TreatyMutationFunctionFactory<
5
5
  TParams,
6
6
  TBody,
@@ -16,9 +16,13 @@ type TreatyMutationRequest<
16
16
  TParams,
17
17
  TBody,
18
18
  TOption
19
- > = TOption & (IsEmpty<TParams> extends true ? {} : {
19
+ > = TOption & (IsEmpty<TParams> extends true ? {
20
+ params?: TParams;
21
+ } : {
20
22
  params: TParams;
21
- }) & (IsEmpty<TBody> extends true ? {} : {
23
+ }) & (IsEmpty<TBody> extends true ? {
24
+ body?: TBody;
25
+ } : {
22
26
  body: TBody;
23
27
  });
24
28
  type TreatyData<TResponse extends Record<number, unknown>> = Treaty.TreatyResponse<TResponse>["data"];
@@ -53,7 +57,9 @@ type TreatyQueryFunctionFactory<
53
57
  type TreatyQueryRequest<
54
58
  TParams,
55
59
  TOption extends object
56
- > = TOption & (IsEmpty<TParams> extends true ? {} : {
60
+ > = TOption & (IsEmpty<TParams> extends true ? {
61
+ params?: TParams;
62
+ } : {
57
63
  params: TParams;
58
64
  });
59
65
  type TreatyQueryOptions<TResponse extends Record<number, unknown>> = UseQueryOptions<TreatyData<TResponse>, TreatyError<TResponse>>;
package/dist/index.js CHANGED
@@ -48,7 +48,7 @@ function treatyMutationHook(fn, useOptions) {
48
48
  ...mergeMutationOptions(baseOptions, options),
49
49
  mutationFn: async (request) => {
50
50
  const mutationFn = "params" in request && request.params !== undefined ? fn(request.params) : fn();
51
- const body = "body" in request && request.body !== undefined ? request.body : undefined;
51
+ const body = "body" in request && request.body !== undefined ? request.body : {};
52
52
  const { data, error } = await mutationFn(body, request);
53
53
  if (error)
54
54
  throw error;
@@ -78,5 +78,5 @@ export {
78
78
  treatyMutationHook
79
79
  };
80
80
 
81
- //# debugId=89C48BF36DA4F8BA64756E2164756E21
82
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFx0cmVhdHkudHMiLCAic3JjXFx1dGlscy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7IFRyZWF0eSB9IGZyb20gXCJAZWx5c2lhanMvZWRlblwiO1xyXG5pbXBvcnQge1xyXG4gIHVzZU11dGF0aW9uLFxyXG4gIHVzZVF1ZXJ5LFxyXG4gIHR5cGUgUXVlcnlLZXksXHJcbiAgdHlwZSBVc2VNdXRhdGlvbk9wdGlvbnMsXHJcbiAgdHlwZSBVc2VNdXRhdGlvblJlc3VsdCxcclxuICB0eXBlIFVzZVF1ZXJ5T3B0aW9ucyxcclxuICB0eXBlIFVzZVF1ZXJ5UmVzdWx0LFxyXG59IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcclxuaW1wb3J0IHsgbWVyZ2VNdXRhdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuLy8gSGVscGVyIHR5cGUgdG8gY2hlY2sgaWYgYSB0eXBlIHJlcHJlc2VudHMgXCJubyBwYXJhbXNcIiAoYWJzZW50L2VtcHR5KVxyXG4vLyBDaGVja3MgZm9yIG5ldmVyLCB1bmRlZmluZWQsIHZvaWQsIGFuZCBhbHNvIGhhbmRsZXMgdW5rbm93biB3aGVuIGl0IHJlcHJlc2VudHMgYW4gdW5jb25zdHJhaW5lZCB0eXBlXHJcbnR5cGUgSXNFbXB0eTxUPiA9IFxyXG4gIC8vIENoZWNrIGZvciBuZXZlciwgdW5kZWZpbmVkLCB2b2lkXHJcbiAgW1RdIGV4dGVuZHMgW25ldmVyIHwgdW5kZWZpbmVkIHwgdm9pZF0gXHJcbiAgICA/IHRydWVcclxuICAgIC8vIENoZWNrIGlmIFQgaXMgdW5rbm93biAodW5jb25zdHJhaW5lZCB0eXBlIHBhcmFtZXRlcilcclxuICAgIDogW3Vua25vd25dIGV4dGVuZHMgW1RdXHJcbiAgICAgID8gW1RdIGV4dGVuZHMgW3Vua25vd25dXHJcbiAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgOiBmYWxzZVxyXG4gICAgICA6IGZhbHNlO1xyXG5cclxudHlwZSBUcmVhdHlNdXRhdGlvbkZ1bmN0aW9uRmFjdG9yeTxcclxuICBUUGFyYW1zLFxyXG4gIFRCb2R5LFxyXG4gIFRPcHRpb24sXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgUmVjb3JkPG51bWJlciwgdW5rbm93bj4sXHJcbj4gPSBJc0VtcHR5PFRQYXJhbXM+IGV4dGVuZHMgdHJ1ZVxyXG4gID8gKCkgPT4gVHJlYXR5TXV0YXRpb25GdW5jdGlvbjxUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPiBcclxuICA6IChwYXJhbXM6IFRQYXJhbXMpID0+IFRyZWF0eU11dGF0aW9uRnVuY3Rpb248VEJvZHksIFRPcHRpb24sIFRSZXNwb25zZT47XHJcblxyXG50eXBlIFRyZWF0eU11dGF0aW9uRnVuY3Rpb248XHJcbiAgVEJvZHksXHJcbiAgVE9wdGlvbixcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPiA9IChcclxuICBib2R5OiBUQm9keSxcclxuICBvcHRpb25zOiBUT3B0aW9uLFxyXG4pID0+IFByb21pc2U8VHJlYXR5LlRyZWF0eVJlc3BvbnNlPFRSZXNwb25zZT4+O1xyXG5cclxudHlwZSBUcmVhdHlNdXRhdGlvblJlcXVlc3Q8XHJcbiAgVFBhcmFtcyxcclxuICBUQm9keSxcclxuICBUT3B0aW9uLFxyXG4+ID0gVE9wdGlvbiAmXHJcbiAgKElzRW1wdHk8VFBhcmFtcz4gZXh0ZW5kcyB0cnVlID8ge30gOiB7IHBhcmFtczogVFBhcmFtcyB9KSAmXHJcbiAgKElzRW1wdHk8VEJvZHk+IGV4dGVuZHMgdHJ1ZSA/IHt9IDogeyBib2R5OiBUQm9keSB9KTtcclxuXHJcbnR5cGUgVHJlYXR5RGF0YTxUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPj4gPVxyXG4gIFRyZWF0eS5UcmVhdHlSZXNwb25zZTxUUmVzcG9uc2U+W1wiZGF0YVwiXTtcclxuXHJcbnR5cGUgVHJlYXR5RXJyb3I8VFJlc3BvbnNlIGV4dGVuZHMgUmVjb3JkPG51bWJlciwgdW5rbm93bj4+ID1cclxuICBUcmVhdHkuVHJlYXR5UmVzcG9uc2U8VFJlc3BvbnNlPltcImVycm9yXCJdO1xyXG5cclxudHlwZSBUcmVhdHlNdXRhdGlvbk9wdGlvbnM8XHJcbiAgVFBhcmFtcyxcclxuICBUQm9keSxcclxuICBUT3B0aW9uLFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFJlY29yZDxudW1iZXIsIHVua25vd24+LFxyXG4+ID0gVXNlTXV0YXRpb25PcHRpb25zPFxyXG4gIFRyZWF0eURhdGE8VFJlc3BvbnNlPixcclxuICBUcmVhdHlFcnJvcjxUUmVzcG9uc2U+LFxyXG4gIFRyZWF0eU11dGF0aW9uUmVxdWVzdDxUUGFyYW1zLCBUQm9keSwgVE9wdGlvbj5cclxuPjtcclxuXHJcbnR5cGUgVHJlYXR5TXV0YXRpb25Ib29rPFxyXG4gIFRQYXJhbXMsXHJcbiAgVEJvZHksXHJcbiAgVE9wdGlvbixcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPiA9IChcclxuICBvcHRpb25zPzogT21pdDxcclxuICAgIFRyZWF0eU11dGF0aW9uT3B0aW9uczxUUGFyYW1zLCBUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPixcclxuICAgIFwibXV0YXRpb25GblwiXHJcbiAgPixcclxuKSA9PiBVc2VNdXRhdGlvblJlc3VsdDxcclxuICBUcmVhdHlEYXRhPFRSZXNwb25zZT4sXHJcbiAgVHJlYXR5RXJyb3I8VFJlc3BvbnNlPixcclxuICBUcmVhdHlNdXRhdGlvblJlcXVlc3Q8VFBhcmFtcywgVEJvZHksIFRPcHRpb24+XHJcbj47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJlYXR5TXV0YXRpb25Ib29rPFxyXG4gIFRQYXJhbXMsXHJcbiAgVEJvZHksXHJcbiAgVE9wdGlvbixcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPihcclxuICBmbjogVHJlYXR5TXV0YXRpb25GdW5jdGlvbkZhY3Rvcnk8VFBhcmFtcywgVEJvZHksIFRPcHRpb24sIFRSZXNwb25zZT4sXHJcbiAgdXNlT3B0aW9ucz86ICgpID0+IE9taXQ8XHJcbiAgICBUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VFBhcmFtcywgVEJvZHksIFRPcHRpb24sIFRSZXNwb25zZT4sXHJcbiAgICBcIm11dGF0aW9uRm5cIlxyXG4gID4sXHJcbik6IFRyZWF0eU11dGF0aW9uSG9vazxUUGFyYW1zLCBUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPiB7XHJcbiAgcmV0dXJuIChvcHRpb25zKSA9PiB7XHJcbiAgICBjb25zdCBiYXNlT3B0aW9ucyA9IHVzZU9wdGlvbnM/LigpID8/IHt9O1xyXG4gICAgcmV0dXJuIHVzZU11dGF0aW9uKHtcclxuICAgICAgLi4ubWVyZ2VNdXRhdGlvbk9wdGlvbnMoYmFzZU9wdGlvbnMsIG9wdGlvbnMpLFxyXG4gICAgICBtdXRhdGlvbkZuOiBhc3luYyAocmVxdWVzdCkgPT4ge1xyXG4gICAgICAgIC8vIEhhbmRsZSBvcHRpb25hbCBwYXJhbXM6IGlmIHBhcmFtcyBleGlzdHMsIHBhc3MgaXQ7IG90aGVyd2lzZSBjYWxsIGZuKCkgd2l0aG91dCBhcmdzXHJcbiAgICAgICAgY29uc3QgbXV0YXRpb25GbiA9XHJcbiAgICAgICAgICBcInBhcmFtc1wiIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5wYXJhbXMgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICA/IChmbiBhcyAocGFyYW1zOiBUUGFyYW1zKSA9PiBUcmVhdHlNdXRhdGlvbkZ1bmN0aW9uPFRCb2R5LCBUT3B0aW9uLCBUUmVzcG9uc2U+KShyZXF1ZXN0LnBhcmFtcylcclxuICAgICAgICAgICAgOiAoZm4gYXMgKCkgPT4gVHJlYXR5TXV0YXRpb25GdW5jdGlvbjxUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPikoKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBIYW5kbGUgb3B0aW9uYWwgYm9keTogaWYgYm9keSBleGlzdHMsIHBhc3MgaXQ7IG90aGVyd2lzZSBwYXNzIHVuZGVmaW5lZFxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBcImJvZHlcIiBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuYm9keSAhPT0gdW5kZWZpbmVkID8gcmVxdWVzdC5ib2R5IDogKHVuZGVmaW5lZCBhcyBUQm9keSk7XHJcbiAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgbXV0YXRpb25Gbihib2R5LCByZXF1ZXN0KTtcclxuICAgICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfTtcclxufVxyXG5cclxudHlwZSBUcmVhdHlRdWVyeUZ1bmN0aW9uPFxyXG4gIFRPcHRpb24gZXh0ZW5kcyBvYmplY3QsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgUmVjb3JkPG51bWJlciwgdW5rbm93bj4sXHJcbj4gPSAob3B0aW9uczogVE9wdGlvbikgPT4gUHJvbWlzZTxUcmVhdHkuVHJlYXR5UmVzcG9uc2U8VFJlc3BvbnNlPj47XHJcblxyXG50eXBlIFRyZWF0eVF1ZXJ5RnVuY3Rpb25GYWN0b3J5PFxyXG4gIFRQYXJhbXMsXHJcbiAgVE9wdGlvbiBleHRlbmRzIG9iamVjdCxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPiA9IElzRW1wdHk8VFBhcmFtcz4gZXh0ZW5kcyB0cnVlXHJcbiAgPyAoKSA9PiBUcmVhdHlRdWVyeUZ1bmN0aW9uPFRPcHRpb24sIFRSZXNwb25zZT5cclxuICA6IChwYXJhbXM6IFRQYXJhbXMpID0+IFRyZWF0eVF1ZXJ5RnVuY3Rpb248VE9wdGlvbiwgVFJlc3BvbnNlPjtcclxuXHJcbnR5cGUgVHJlYXR5UXVlcnlSZXF1ZXN0PFxyXG4gIFRQYXJhbXMsXHJcbiAgVE9wdGlvbiBleHRlbmRzIG9iamVjdCxcclxuPiA9IFRPcHRpb24gJlxyXG4gIChJc0VtcHR5PFRQYXJhbXM+IGV4dGVuZHMgdHJ1ZSA/IHt9IDogeyBwYXJhbXM6IFRQYXJhbXMgfSk7XHJcblxyXG50eXBlIFRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPj4gPVxyXG4gIFVzZVF1ZXJ5T3B0aW9uczxUcmVhdHlEYXRhPFRSZXNwb25zZT4sIFRyZWF0eUVycm9yPFRSZXNwb25zZT4+O1xyXG5cclxudHlwZSBUcmVhdHlRdWVyeUhvb2s8XHJcbiAgVFBhcmFtcyxcclxuICBUT3B0aW9uIGV4dGVuZHMgb2JqZWN0LFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFJlY29yZDxudW1iZXIsIHVua25vd24+LFxyXG4+ID0gKFxyXG4gIHJlcXVlc3Q6IFRyZWF0eVF1ZXJ5UmVxdWVzdDxUUGFyYW1zLCBUT3B0aW9uPixcclxuICBvcHRpb25zPzogT21pdDxUcmVhdHlRdWVyeU9wdGlvbnM8VFJlc3BvbnNlPiwgXCJxdWVyeUtleVwiIHwgXCJxdWVyeUZuXCI+LFxyXG4pID0+IFVzZVF1ZXJ5UmVzdWx0PFRyZWF0eURhdGE8VFJlc3BvbnNlPiwgVHJlYXR5RXJyb3I8VFJlc3BvbnNlPj47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJlYXR5UXVlcnlIb29rPFxyXG4gIFRQYXJhbXMsXHJcbiAgVE9wdGlvbiBleHRlbmRzIG9iamVjdCxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPihcclxuICBmbjogVHJlYXR5UXVlcnlGdW5jdGlvbkZhY3Rvcnk8VFBhcmFtcywgVE9wdGlvbiwgVFJlc3BvbnNlPixcclxuICB1c2VPcHRpb25zOiAoXHJcbiAgICByZXF1ZXN0OiBUcmVhdHlRdWVyeVJlcXVlc3Q8VFBhcmFtcywgVE9wdGlvbj4sXHJcbiAgKSA9PiBPbWl0PFRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2U+LCBcInF1ZXJ5Rm5cIj4sXHJcbik6IFRyZWF0eVF1ZXJ5SG9vazxUUGFyYW1zLCBUT3B0aW9uLCBUUmVzcG9uc2U+IHtcclxuICByZXR1cm4gKHJlcXVlc3QsIG9wdGlvbnMpID0+IHtcclxuICAgIC8vIEhhbmRsZSBvcHRpb25hbCBwYXJhbXM6IGlmIHBhcmFtcyBleGlzdHMsIHBhc3MgaXQ7IG90aGVyd2lzZSBjYWxsIGZuKCkgd2l0aG91dCBhcmdzXHJcbiAgICBjb25zdCBxdWVyeUZuID1cclxuICAgICAgXCJwYXJhbXNcIiBpbiByZXF1ZXN0ICYmIHJlcXVlc3QucGFyYW1zICE9PSB1bmRlZmluZWRcclxuICAgICAgICA/IChmbiBhcyAocGFyYW1zOiBUUGFyYW1zKSA9PiBUcmVhdHlRdWVyeUZ1bmN0aW9uPFRPcHRpb24sIFRSZXNwb25zZT4pKHJlcXVlc3QucGFyYW1zKVxyXG4gICAgICAgIDogKGZuIGFzICgpID0+IFRyZWF0eVF1ZXJ5RnVuY3Rpb248VE9wdGlvbiwgVFJlc3BvbnNlPikoKTtcclxuICAgIGNvbnN0IGJhc2VPcHRpb25zID0gdXNlT3B0aW9ucyhyZXF1ZXN0KTtcclxuICAgIHJldHVybiB1c2VRdWVyeSh7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIC4uLmJhc2VPcHRpb25zLFxyXG4gICAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgcXVlcnlGbihyZXF1ZXN0KTtcclxuICAgICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfTtcclxufVxyXG4iLAogICAgImltcG9ydCB0eXBlIHtcclxuICBRdWVyeUtleSxcclxuICBVc2VNdXRhdGlvbk9wdGlvbnMsXHJcbiAgVXNlUXVlcnlPcHRpb25zLFxyXG59IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU11dGF0aW9uT3B0aW9uczxURGF0YSwgVEVycm9yLCBUVmFyaWFibGVzLCBUQ29udGV4dD4oXHJcbiAgYmFzZTogVXNlTXV0YXRpb25PcHRpb25zPFREYXRhLCBURXJyb3IsIFRWYXJpYWJsZXMsIFRDb250ZXh0PixcclxuICBvcHRpb25zPzogUGFydGlhbDxVc2VNdXRhdGlvbk9wdGlvbnM8VERhdGEsIFRFcnJvciwgVFZhcmlhYmxlcywgVENvbnRleHQ+PixcclxuKTogVXNlTXV0YXRpb25PcHRpb25zPFREYXRhLCBURXJyb3IsIFRWYXJpYWJsZXMsIFRDb250ZXh0PiB7XHJcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gYmFzZTtcclxuICBjb25zdCB7IG9uU3VjY2Vzcywgb25FcnJvciwgb25TZXR0bGVkLCBvbk11dGF0ZSwgLi4ucmVzdCB9ID0gb3B0aW9ucztcclxuICByZXR1cm4ge1xyXG4gICAgLi4uYmFzZSxcclxuICAgIC4uLnJlc3QsXHJcbiAgICAuLi4ob25NdXRhdGUgIT09IHVuZGVmaW5lZCAmJiB7XHJcbiAgICAgIG9uTXV0YXRlOiBhc3luYyAodmFyaWFibGVzLCBjb250ZXh0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJldiA9IGF3YWl0IGJhc2Uub25NdXRhdGU/Lih2YXJpYWJsZXMsIGNvbnRleHQpO1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSBhd2FpdCBvcHRpb25zLm9uTXV0YXRlPy4odmFyaWFibGVzLCBjb250ZXh0KTtcclxuICAgICAgICByZXR1cm4gKG5leHQgIT09IHVuZGVmaW5lZCA/IG5leHQgOiBwcmV2KSBhcyBUQ29udGV4dDtcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gICAgLi4uKG9uU3VjY2VzcyAhPT0gdW5kZWZpbmVkICYmIHtcclxuICAgICAgb25TdWNjZXNzOiBhc3luYyAoZGF0YSwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGJhc2Uub25TdWNjZXNzPy4oZGF0YSwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCk7XHJcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblN1Y2Nlc3M/LihkYXRhLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KTtcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gICAgLi4uKG9uRXJyb3IgIT09IHVuZGVmaW5lZCAmJiB7XHJcbiAgICAgIG9uRXJyb3I6IGFzeW5jIChlcnJvciwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGJhc2Uub25FcnJvcj8uKGVycm9yLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KTtcclxuICAgICAgICBhd2FpdCBvcHRpb25zLm9uRXJyb3I/LihlcnJvciwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KSxcclxuICAgIC4uLihvblNldHRsZWQgIT09IHVuZGVmaW5lZCAmJiB7XHJcbiAgICAgIG9uU2V0dGxlZDogYXN5bmMgKGRhdGEsIGVycm9yLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KSA9PiB7XHJcbiAgICAgICAgYXdhaXQgYmFzZS5vblNldHRsZWQ/LihkYXRhLCBlcnJvciwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCk7XHJcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblNldHRsZWQ/LihcclxuICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgIHZhcmlhYmxlcyxcclxuICAgICAgICAgIG9uTXV0YXRlUmVzdWx0LFxyXG4gICAgICAgICAgY29udGV4dCxcclxuICAgICAgICApO1xyXG4gICAgICB9LFxyXG4gICAgfSksXHJcbiAgfTtcclxufVxyXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBQ0E7QUFBQTtBQUFBO0FBQUE7OztBQ0tPLFNBQVMsb0JBQXlELENBQ3ZFLE1BQ0EsU0FDeUQ7QUFBQSxFQUN6RCxJQUFJLENBQUM7QUFBQSxJQUFTLE9BQU87QUFBQSxFQUNyQixRQUFRLFdBQVcsU0FBUyxXQUFXLGFBQWEsU0FBUztBQUFBLEVBQzdELE9BQU87QUFBQSxPQUNGO0FBQUEsT0FDQTtBQUFBLE9BQ0MsYUFBYSxhQUFhO0FBQUEsTUFDNUIsVUFBVSxPQUFPLFdBQVcsWUFBWTtBQUFBLFFBQ3RDLE1BQU0sT0FBTyxNQUFNLEtBQUssV0FBVyxXQUFXLE9BQU87QUFBQSxRQUNyRCxNQUFNLE9BQU8sTUFBTSxRQUFRLFdBQVcsV0FBVyxPQUFPO0FBQUEsUUFDeEQsT0FBUSxTQUFTLFlBQVksT0FBTztBQUFBO0FBQUEsSUFFeEM7QUFBQSxPQUNJLGNBQWMsYUFBYTtBQUFBLE1BQzdCLFdBQVcsT0FBTyxNQUFNLFdBQVcsZ0JBQWdCLFlBQVk7QUFBQSxRQUM3RCxNQUFNLEtBQUssWUFBWSxNQUFNLFdBQVcsZ0JBQWdCLE9BQU87QUFBQSxRQUMvRCxNQUFNLFFBQVEsWUFBWSxNQUFNLFdBQVcsZ0JBQWdCLE9BQU87QUFBQTtBQUFBLElBRXRFO0FBQUEsT0FDSSxZQUFZLGFBQWE7QUFBQSxNQUMzQixTQUFTLE9BQU8sT0FBTyxXQUFXLGdCQUFnQixZQUFZO0FBQUEsUUFDNUQsTUFBTSxLQUFLLFVBQVUsT0FBTyxXQUFXLGdCQUFnQixPQUFPO0FBQUEsUUFDOUQsTUFBTSxRQUFRLFVBQVUsT0FBTyxXQUFXLGdCQUFnQixPQUFPO0FBQUE7QUFBQSxJQUVyRTtBQUFBLE9BQ0ksY0FBYyxhQUFhO0FBQUEsTUFDN0IsV0FBVyxPQUFPLE1BQU0sT0FBTyxXQUFXLGdCQUFnQixZQUFZO0FBQUEsUUFDcEUsTUFBTSxLQUFLLFlBQVksTUFBTSxPQUFPLFdBQVcsZ0JBQWdCLE9BQU87QUFBQSxRQUN0RSxNQUFNLFFBQVEsWUFDWixNQUNBLE9BQ0EsV0FDQSxnQkFDQSxPQUNGO0FBQUE7QUFBQSxJQUVKO0FBQUEsRUFDRjtBQUFBOzs7QURzQ0ssU0FBUyxrQkFLZixDQUNDLElBQ0EsWUFJd0Q7QUFBQSxFQUN4RCxPQUFPLENBQUMsWUFBWTtBQUFBLElBQ2xCLE1BQU0sY0FBYyxhQUFhLEtBQUssQ0FBQztBQUFBLElBQ3ZDLE9BQU8sWUFBWTtBQUFBLFNBQ2QscUJBQXFCLGFBQWEsT0FBTztBQUFBLE1BQzVDLFlBQVksT0FBTyxZQUFZO0FBQUEsUUFFN0IsTUFBTSxhQUNKLFlBQVksV0FBVyxRQUFRLFdBQVcsWUFDckMsR0FBOEUsUUFBUSxNQUFNLElBQzVGLEdBQStEO0FBQUEsUUFHdEUsTUFBTSxPQUFPLFVBQVUsV0FBVyxRQUFRLFNBQVMsWUFBWSxRQUFRLE9BQVE7QUFBQSxRQUMvRSxRQUFRLE1BQU0sVUFBVSxNQUFNLFdBQVcsTUFBTSxPQUFPO0FBQUEsUUFDdEQsSUFBSTtBQUFBLFVBQU8sTUFBTTtBQUFBLFFBQ2pCLE9BQU87QUFBQTtBQUFBLElBRVgsQ0FBQztBQUFBO0FBQUE7QUFtQ0UsU0FBUyxlQUlmLENBQ0MsSUFDQSxZQUc4QztBQUFBLEVBQzlDLE9BQU8sQ0FBQyxTQUFTLFlBQVk7QUFBQSxJQUUzQixNQUFNLFVBQ0osWUFBWSxXQUFXLFFBQVEsV0FBVyxZQUNyQyxHQUFvRSxRQUFRLE1BQU0sSUFDbEYsR0FBcUQ7QUFBQSxJQUM1RCxNQUFNLGNBQWMsV0FBVyxPQUFPO0FBQUEsSUFDdEMsT0FBTyxTQUFTO0FBQUEsU0FDWDtBQUFBLFNBQ0E7QUFBQSxNQUNILFNBQVMsWUFBWTtBQUFBLFFBQ25CLFFBQVEsTUFBTSxVQUFVLE1BQU0sUUFBUSxPQUFPO0FBQUEsUUFDN0MsSUFBSTtBQUFBLFVBQU8sTUFBTTtBQUFBLFFBQ2pCLE9BQU87QUFBQTtBQUFBLElBRVgsQ0FBQztBQUFBO0FBQUE7IiwKICAiZGVidWdJZCI6ICI4OUM0OEJGMzZEQTRGOEJBNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
81
+ //# debugId=D2B04DF79F0D08F564756E2164756E21
82
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFx0cmVhdHkudHMiLCAic3JjXFx1dGlscy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7IFRyZWF0eSB9IGZyb20gXCJAZWx5c2lhanMvZWRlblwiO1xyXG5pbXBvcnQge1xyXG4gIHVzZU11dGF0aW9uLFxyXG4gIHVzZVF1ZXJ5LFxyXG4gIHR5cGUgUXVlcnlLZXksXHJcbiAgdHlwZSBVc2VNdXRhdGlvbk9wdGlvbnMsXHJcbiAgdHlwZSBVc2VNdXRhdGlvblJlc3VsdCxcclxuICB0eXBlIFVzZVF1ZXJ5T3B0aW9ucyxcclxuICB0eXBlIFVzZVF1ZXJ5UmVzdWx0LFxyXG59IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcclxuaW1wb3J0IHsgbWVyZ2VNdXRhdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuLy8gSGVscGVyIHR5cGUgdG8gY2hlY2sgaWYgYSB0eXBlIHJlcHJlc2VudHMgXCJubyBwYXJhbXNcIiBvciBcIm5vIGJvZHlcIiAoYWJzZW50L2VtcHR5KVxyXG4vLyBDaGVja3MgZm9yIG5ldmVyLCB1bmRlZmluZWQsIHZvaWQsIHVua25vd24gKHVuY29uc3RyYWluZWQpLCBhbmQgZW1wdHkgb2JqZWN0IHt9XHJcbnR5cGUgSXNFbXB0eTxUPiA9XHJcbiAgLy8gQ2hlY2sgZm9yIG5ldmVyLCB1bmRlZmluZWQsIHZvaWRcclxuICBbVF0gZXh0ZW5kcyBbbmV2ZXIgfCB1bmRlZmluZWQgfCB2b2lkXVxyXG4gICAgPyB0cnVlXHJcbiAgICAvLyBDaGVjayBpZiBUIGlzIHVua25vd24gKHVuY29uc3RyYWluZWQgdHlwZSBwYXJhbWV0ZXIpXHJcbiAgICA6IFt1bmtub3duXSBleHRlbmRzIFtUXVxyXG4gICAgICA/IFtUXSBleHRlbmRzIFt1bmtub3duXVxyXG4gICAgICAgID8gdHJ1ZVxyXG4gICAgICAgIDogZmFsc2VcclxuICAgICAgLy8gQ2hlY2sgaWYgVCBpcyBhbiBlbXB0eSBvYmplY3Qge31cclxuICAgICAgOiBbVF0gZXh0ZW5kcyBbb2JqZWN0XVxyXG4gICAgICAgID8gW2tleW9mIFRdIGV4dGVuZHMgW25ldmVyXVxyXG4gICAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgICA6IGZhbHNlXHJcbiAgICAgICAgOiBmYWxzZTtcclxuXHJcbnR5cGUgVHJlYXR5TXV0YXRpb25GdW5jdGlvbkZhY3Rvcnk8XHJcbiAgVFBhcmFtcyxcclxuICBUQm9keSxcclxuICBUT3B0aW9uLFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFJlY29yZDxudW1iZXIsIHVua25vd24+LFxyXG4+ID0gSXNFbXB0eTxUUGFyYW1zPiBleHRlbmRzIHRydWVcclxuICA/ICgpID0+IFRyZWF0eU11dGF0aW9uRnVuY3Rpb248VEJvZHksIFRPcHRpb24sIFRSZXNwb25zZT4gXHJcbiAgOiAocGFyYW1zOiBUUGFyYW1zKSA9PiBUcmVhdHlNdXRhdGlvbkZ1bmN0aW9uPFRCb2R5LCBUT3B0aW9uLCBUUmVzcG9uc2U+O1xyXG5cclxudHlwZSBUcmVhdHlNdXRhdGlvbkZ1bmN0aW9uPFxyXG4gIFRCb2R5LFxyXG4gIFRPcHRpb24sXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgUmVjb3JkPG51bWJlciwgdW5rbm93bj4sXHJcbj4gPSAoXHJcbiAgYm9keTogVEJvZHksXHJcbiAgb3B0aW9uczogVE9wdGlvbixcclxuKSA9PiBQcm9taXNlPFRyZWF0eS5UcmVhdHlSZXNwb25zZTxUUmVzcG9uc2U+PjtcclxuXHJcbnR5cGUgVHJlYXR5TXV0YXRpb25SZXF1ZXN0PFxyXG4gIFRQYXJhbXMsXHJcbiAgVEJvZHksXHJcbiAgVE9wdGlvbixcclxuPiA9IFRPcHRpb24gJlxyXG4gIChJc0VtcHR5PFRQYXJhbXM+IGV4dGVuZHMgdHJ1ZSA/IHsgcGFyYW1zPzogVFBhcmFtcyB9IDogeyBwYXJhbXM6IFRQYXJhbXMgfSkgJlxyXG4gIChJc0VtcHR5PFRCb2R5PiBleHRlbmRzIHRydWUgPyB7IGJvZHk/OiBUQm9keSB9IDogeyBib2R5OiBUQm9keSB9KTtcclxuXHJcbnR5cGUgVHJlYXR5RGF0YTxUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPj4gPVxyXG4gIFRyZWF0eS5UcmVhdHlSZXNwb25zZTxUUmVzcG9uc2U+W1wiZGF0YVwiXTtcclxuXHJcbnR5cGUgVHJlYXR5RXJyb3I8VFJlc3BvbnNlIGV4dGVuZHMgUmVjb3JkPG51bWJlciwgdW5rbm93bj4+ID1cclxuICBUcmVhdHkuVHJlYXR5UmVzcG9uc2U8VFJlc3BvbnNlPltcImVycm9yXCJdO1xyXG5cclxudHlwZSBUcmVhdHlNdXRhdGlvbk9wdGlvbnM8XHJcbiAgVFBhcmFtcyxcclxuICBUQm9keSxcclxuICBUT3B0aW9uLFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFJlY29yZDxudW1iZXIsIHVua25vd24+LFxyXG4+ID0gVXNlTXV0YXRpb25PcHRpb25zPFxyXG4gIFRyZWF0eURhdGE8VFJlc3BvbnNlPixcclxuICBUcmVhdHlFcnJvcjxUUmVzcG9uc2U+LFxyXG4gIFRyZWF0eU11dGF0aW9uUmVxdWVzdDxUUGFyYW1zLCBUQm9keSwgVE9wdGlvbj5cclxuPjtcclxuXHJcbnR5cGUgVHJlYXR5TXV0YXRpb25Ib29rPFxyXG4gIFRQYXJhbXMsXHJcbiAgVEJvZHksXHJcbiAgVE9wdGlvbixcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPiA9IChcclxuICBvcHRpb25zPzogT21pdDxcclxuICAgIFRyZWF0eU11dGF0aW9uT3B0aW9uczxUUGFyYW1zLCBUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPixcclxuICAgIFwibXV0YXRpb25GblwiXHJcbiAgPixcclxuKSA9PiBVc2VNdXRhdGlvblJlc3VsdDxcclxuICBUcmVhdHlEYXRhPFRSZXNwb25zZT4sXHJcbiAgVHJlYXR5RXJyb3I8VFJlc3BvbnNlPixcclxuICBUcmVhdHlNdXRhdGlvblJlcXVlc3Q8VFBhcmFtcywgVEJvZHksIFRPcHRpb24+XHJcbj47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJlYXR5TXV0YXRpb25Ib29rPFxyXG4gIFRQYXJhbXMsXHJcbiAgVEJvZHksXHJcbiAgVE9wdGlvbixcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPihcclxuICBmbjogVHJlYXR5TXV0YXRpb25GdW5jdGlvbkZhY3Rvcnk8VFBhcmFtcywgVEJvZHksIFRPcHRpb24sIFRSZXNwb25zZT4sXHJcbiAgdXNlT3B0aW9ucz86ICgpID0+IE9taXQ8XHJcbiAgICBUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VFBhcmFtcywgVEJvZHksIFRPcHRpb24sIFRSZXNwb25zZT4sXHJcbiAgICBcIm11dGF0aW9uRm5cIlxyXG4gID4sXHJcbik6IFRyZWF0eU11dGF0aW9uSG9vazxUUGFyYW1zLCBUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPiB7XHJcbiAgcmV0dXJuIChvcHRpb25zKSA9PiB7XHJcbiAgICBjb25zdCBiYXNlT3B0aW9ucyA9IHVzZU9wdGlvbnM/LigpID8/IHt9O1xyXG4gICAgcmV0dXJuIHVzZU11dGF0aW9uKHtcclxuICAgICAgLi4ubWVyZ2VNdXRhdGlvbk9wdGlvbnMoYmFzZU9wdGlvbnMsIG9wdGlvbnMpLFxyXG4gICAgICBtdXRhdGlvbkZuOiBhc3luYyAocmVxdWVzdCkgPT4ge1xyXG4gICAgICAgIC8vIEhhbmRsZSBvcHRpb25hbCBwYXJhbXM6IGlmIHBhcmFtcyBleGlzdHMsIHBhc3MgaXQ7IG90aGVyd2lzZSBjYWxsIGZuKCkgd2l0aG91dCBhcmdzXHJcbiAgICAgICAgY29uc3QgbXV0YXRpb25GbiA9XHJcbiAgICAgICAgICBcInBhcmFtc1wiIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5wYXJhbXMgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICA/IChmbiBhcyAocGFyYW1zOiBUUGFyYW1zKSA9PiBUcmVhdHlNdXRhdGlvbkZ1bmN0aW9uPFRCb2R5LCBUT3B0aW9uLCBUUmVzcG9uc2U+KShyZXF1ZXN0LnBhcmFtcylcclxuICAgICAgICAgICAgOiAoZm4gYXMgKCkgPT4gVHJlYXR5TXV0YXRpb25GdW5jdGlvbjxUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPikoKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBIYW5kbGUgb3B0aW9uYWwgYm9keTogaWYgYm9keSBleGlzdHMsIHBhc3MgaXQ7IG90aGVyd2lzZSBkZWZhdWx0IHRvIGVtcHR5IG9iamVjdFxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBcImJvZHlcIiBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuYm9keSAhPT0gdW5kZWZpbmVkID8gcmVxdWVzdC5ib2R5IDogKHt9IGFzIFRCb2R5KTtcclxuICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBtdXRhdGlvbkZuKGJvZHksIHJlcXVlc3QpO1xyXG4gICAgICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9O1xyXG59XHJcblxyXG50eXBlIFRyZWF0eVF1ZXJ5RnVuY3Rpb248XHJcbiAgVE9wdGlvbiBleHRlbmRzIG9iamVjdCxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPiA9IChvcHRpb25zOiBUT3B0aW9uKSA9PiBQcm9taXNlPFRyZWF0eS5UcmVhdHlSZXNwb25zZTxUUmVzcG9uc2U+PjtcclxuXHJcbnR5cGUgVHJlYXR5UXVlcnlGdW5jdGlvbkZhY3Rvcnk8XHJcbiAgVFBhcmFtcyxcclxuICBUT3B0aW9uIGV4dGVuZHMgb2JqZWN0LFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFJlY29yZDxudW1iZXIsIHVua25vd24+LFxyXG4+ID0gSXNFbXB0eTxUUGFyYW1zPiBleHRlbmRzIHRydWVcclxuICA/ICgpID0+IFRyZWF0eVF1ZXJ5RnVuY3Rpb248VE9wdGlvbiwgVFJlc3BvbnNlPlxyXG4gIDogKHBhcmFtczogVFBhcmFtcykgPT4gVHJlYXR5UXVlcnlGdW5jdGlvbjxUT3B0aW9uLCBUUmVzcG9uc2U+O1xyXG5cclxudHlwZSBUcmVhdHlRdWVyeVJlcXVlc3Q8XHJcbiAgVFBhcmFtcyxcclxuICBUT3B0aW9uIGV4dGVuZHMgb2JqZWN0LFxyXG4+ID0gVE9wdGlvbiAmXHJcbiAgKElzRW1wdHk8VFBhcmFtcz4gZXh0ZW5kcyB0cnVlID8geyBwYXJhbXM/OiBUUGFyYW1zIH0gOiB7IHBhcmFtczogVFBhcmFtcyB9KTtcclxuXHJcbnR5cGUgVHJlYXR5UXVlcnlPcHRpb25zPFRSZXNwb25zZSBleHRlbmRzIFJlY29yZDxudW1iZXIsIHVua25vd24+PiA9XHJcbiAgVXNlUXVlcnlPcHRpb25zPFRyZWF0eURhdGE8VFJlc3BvbnNlPiwgVHJlYXR5RXJyb3I8VFJlc3BvbnNlPj47XHJcblxyXG50eXBlIFRyZWF0eVF1ZXJ5SG9vazxcclxuICBUUGFyYW1zLFxyXG4gIFRPcHRpb24gZXh0ZW5kcyBvYmplY3QsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgUmVjb3JkPG51bWJlciwgdW5rbm93bj4sXHJcbj4gPSAoXHJcbiAgcmVxdWVzdDogVHJlYXR5UXVlcnlSZXF1ZXN0PFRQYXJhbXMsIFRPcHRpb24+LFxyXG4gIG9wdGlvbnM/OiBPbWl0PFRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2U+LCBcInF1ZXJ5S2V5XCIgfCBcInF1ZXJ5Rm5cIj4sXHJcbikgPT4gVXNlUXVlcnlSZXN1bHQ8VHJlYXR5RGF0YTxUUmVzcG9uc2U+LCBUcmVhdHlFcnJvcjxUUmVzcG9uc2U+PjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmVhdHlRdWVyeUhvb2s8XHJcbiAgVFBhcmFtcyxcclxuICBUT3B0aW9uIGV4dGVuZHMgb2JqZWN0LFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFJlY29yZDxudW1iZXIsIHVua25vd24+LFxyXG4+KFxyXG4gIGZuOiBUcmVhdHlRdWVyeUZ1bmN0aW9uRmFjdG9yeTxUUGFyYW1zLCBUT3B0aW9uLCBUUmVzcG9uc2U+LFxyXG4gIHVzZU9wdGlvbnM6IChcclxuICAgIHJlcXVlc3Q6IFRyZWF0eVF1ZXJ5UmVxdWVzdDxUUGFyYW1zLCBUT3B0aW9uPixcclxuICApID0+IE9taXQ8VHJlYXR5UXVlcnlPcHRpb25zPFRSZXNwb25zZT4sIFwicXVlcnlGblwiPixcclxuKTogVHJlYXR5UXVlcnlIb29rPFRQYXJhbXMsIFRPcHRpb24sIFRSZXNwb25zZT4ge1xyXG4gIHJldHVybiAocmVxdWVzdCwgb3B0aW9ucykgPT4ge1xyXG4gICAgLy8gSGFuZGxlIG9wdGlvbmFsIHBhcmFtczogaWYgcGFyYW1zIGV4aXN0cywgcGFzcyBpdDsgb3RoZXJ3aXNlIGNhbGwgZm4oKSB3aXRob3V0IGFyZ3NcclxuICAgIGNvbnN0IHF1ZXJ5Rm4gPVxyXG4gICAgICBcInBhcmFtc1wiIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5wYXJhbXMgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgID8gKGZuIGFzIChwYXJhbXM6IFRQYXJhbXMpID0+IFRyZWF0eVF1ZXJ5RnVuY3Rpb248VE9wdGlvbiwgVFJlc3BvbnNlPikocmVxdWVzdC5wYXJhbXMpXHJcbiAgICAgICAgOiAoZm4gYXMgKCkgPT4gVHJlYXR5UXVlcnlGdW5jdGlvbjxUT3B0aW9uLCBUUmVzcG9uc2U+KSgpO1xyXG4gICAgY29uc3QgYmFzZU9wdGlvbnMgPSB1c2VPcHRpb25zKHJlcXVlc3QpO1xyXG4gICAgcmV0dXJuIHVzZVF1ZXJ5KHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgLi4uYmFzZU9wdGlvbnMsXHJcbiAgICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBxdWVyeUZuKHJlcXVlc3QpO1xyXG4gICAgICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9O1xyXG59XHJcbiIsCiAgICAiaW1wb3J0IHR5cGUge1xyXG4gIFF1ZXJ5S2V5LFxyXG4gIFVzZU11dGF0aW9uT3B0aW9ucyxcclxuICBVc2VRdWVyeU9wdGlvbnMsXHJcbn0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1xdWVyeVwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTXV0YXRpb25PcHRpb25zPFREYXRhLCBURXJyb3IsIFRWYXJpYWJsZXMsIFRDb250ZXh0PihcclxuICBiYXNlOiBVc2VNdXRhdGlvbk9wdGlvbnM8VERhdGEsIFRFcnJvciwgVFZhcmlhYmxlcywgVENvbnRleHQ+LFxyXG4gIG9wdGlvbnM/OiBQYXJ0aWFsPFVzZU11dGF0aW9uT3B0aW9uczxURGF0YSwgVEVycm9yLCBUVmFyaWFibGVzLCBUQ29udGV4dD4+LFxyXG4pOiBVc2VNdXRhdGlvbk9wdGlvbnM8VERhdGEsIFRFcnJvciwgVFZhcmlhYmxlcywgVENvbnRleHQ+IHtcclxuICBpZiAoIW9wdGlvbnMpIHJldHVybiBiYXNlO1xyXG4gIGNvbnN0IHsgb25TdWNjZXNzLCBvbkVycm9yLCBvblNldHRsZWQsIG9uTXV0YXRlLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xyXG4gIHJldHVybiB7XHJcbiAgICAuLi5iYXNlLFxyXG4gICAgLi4ucmVzdCxcclxuICAgIC4uLihvbk11dGF0ZSAhPT0gdW5kZWZpbmVkICYmIHtcclxuICAgICAgb25NdXRhdGU6IGFzeW5jICh2YXJpYWJsZXMsIGNvbnRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBwcmV2ID0gYXdhaXQgYmFzZS5vbk11dGF0ZT8uKHZhcmlhYmxlcywgY29udGV4dCk7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IGF3YWl0IG9wdGlvbnMub25NdXRhdGU/Lih2YXJpYWJsZXMsIGNvbnRleHQpO1xyXG4gICAgICAgIHJldHVybiAobmV4dCAhPT0gdW5kZWZpbmVkID8gbmV4dCA6IHByZXYpIGFzIFRDb250ZXh0O1xyXG4gICAgICB9LFxyXG4gICAgfSksXHJcbiAgICAuLi4ob25TdWNjZXNzICE9PSB1bmRlZmluZWQgJiYge1xyXG4gICAgICBvblN1Y2Nlc3M6IGFzeW5jIChkYXRhLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KSA9PiB7XHJcbiAgICAgICAgYXdhaXQgYmFzZS5vblN1Y2Nlc3M/LihkYXRhLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KTtcclxuICAgICAgICBhd2FpdCBvcHRpb25zLm9uU3VjY2Vzcz8uKGRhdGEsIHZhcmlhYmxlcywgb25NdXRhdGVSZXN1bHQsIGNvbnRleHQpO1xyXG4gICAgICB9LFxyXG4gICAgfSksXHJcbiAgICAuLi4ob25FcnJvciAhPT0gdW5kZWZpbmVkICYmIHtcclxuICAgICAgb25FcnJvcjogYXN5bmMgKGVycm9yLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KSA9PiB7XHJcbiAgICAgICAgYXdhaXQgYmFzZS5vbkVycm9yPy4oZXJyb3IsIHZhcmlhYmxlcywgb25NdXRhdGVSZXN1bHQsIGNvbnRleHQpO1xyXG4gICAgICAgIGF3YWl0IG9wdGlvbnMub25FcnJvcj8uKGVycm9yLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KTtcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gICAgLi4uKG9uU2V0dGxlZCAhPT0gdW5kZWZpbmVkICYmIHtcclxuICAgICAgb25TZXR0bGVkOiBhc3luYyAoZGF0YSwgZXJyb3IsIHZhcmlhYmxlcywgb25NdXRhdGVSZXN1bHQsIGNvbnRleHQpID0+IHtcclxuICAgICAgICBhd2FpdCBiYXNlLm9uU2V0dGxlZD8uKGRhdGEsIGVycm9yLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KTtcclxuICAgICAgICBhd2FpdCBvcHRpb25zLm9uU2V0dGxlZD8uKFxyXG4gICAgICAgICAgZGF0YSxcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgdmFyaWFibGVzLFxyXG4gICAgICAgICAgb25NdXRhdGVSZXN1bHQsXHJcbiAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0sXHJcbiAgICB9KSxcclxuICB9O1xyXG59XHJcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFDQTtBQUFBO0FBQUE7QUFBQTs7O0FDS08sU0FBUyxvQkFBeUQsQ0FDdkUsTUFDQSxTQUN5RDtBQUFBLEVBQ3pELElBQUksQ0FBQztBQUFBLElBQVMsT0FBTztBQUFBLEVBQ3JCLFFBQVEsV0FBVyxTQUFTLFdBQVcsYUFBYSxTQUFTO0FBQUEsRUFDN0QsT0FBTztBQUFBLE9BQ0Y7QUFBQSxPQUNBO0FBQUEsT0FDQyxhQUFhLGFBQWE7QUFBQSxNQUM1QixVQUFVLE9BQU8sV0FBVyxZQUFZO0FBQUEsUUFDdEMsTUFBTSxPQUFPLE1BQU0sS0FBSyxXQUFXLFdBQVcsT0FBTztBQUFBLFFBQ3JELE1BQU0sT0FBTyxNQUFNLFFBQVEsV0FBVyxXQUFXLE9BQU87QUFBQSxRQUN4RCxPQUFRLFNBQVMsWUFBWSxPQUFPO0FBQUE7QUFBQSxJQUV4QztBQUFBLE9BQ0ksY0FBYyxhQUFhO0FBQUEsTUFDN0IsV0FBVyxPQUFPLE1BQU0sV0FBVyxnQkFBZ0IsWUFBWTtBQUFBLFFBQzdELE1BQU0sS0FBSyxZQUFZLE1BQU0sV0FBVyxnQkFBZ0IsT0FBTztBQUFBLFFBQy9ELE1BQU0sUUFBUSxZQUFZLE1BQU0sV0FBVyxnQkFBZ0IsT0FBTztBQUFBO0FBQUEsSUFFdEU7QUFBQSxPQUNJLFlBQVksYUFBYTtBQUFBLE1BQzNCLFNBQVMsT0FBTyxPQUFPLFdBQVcsZ0JBQWdCLFlBQVk7QUFBQSxRQUM1RCxNQUFNLEtBQUssVUFBVSxPQUFPLFdBQVcsZ0JBQWdCLE9BQU87QUFBQSxRQUM5RCxNQUFNLFFBQVEsVUFBVSxPQUFPLFdBQVcsZ0JBQWdCLE9BQU87QUFBQTtBQUFBLElBRXJFO0FBQUEsT0FDSSxjQUFjLGFBQWE7QUFBQSxNQUM3QixXQUFXLE9BQU8sTUFBTSxPQUFPLFdBQVcsZ0JBQWdCLFlBQVk7QUFBQSxRQUNwRSxNQUFNLEtBQUssWUFBWSxNQUFNLE9BQU8sV0FBVyxnQkFBZ0IsT0FBTztBQUFBLFFBQ3RFLE1BQU0sUUFBUSxZQUNaLE1BQ0EsT0FDQSxXQUNBLGdCQUNBLE9BQ0Y7QUFBQTtBQUFBLElBRUo7QUFBQSxFQUNGO0FBQUE7OztBRDJDSyxTQUFTLGtCQUtmLENBQ0MsSUFDQSxZQUl3RDtBQUFBLEVBQ3hELE9BQU8sQ0FBQyxZQUFZO0FBQUEsSUFDbEIsTUFBTSxjQUFjLGFBQWEsS0FBSyxDQUFDO0FBQUEsSUFDdkMsT0FBTyxZQUFZO0FBQUEsU0FDZCxxQkFBcUIsYUFBYSxPQUFPO0FBQUEsTUFDNUMsWUFBWSxPQUFPLFlBQVk7QUFBQSxRQUU3QixNQUFNLGFBQ0osWUFBWSxXQUFXLFFBQVEsV0FBVyxZQUNyQyxHQUE4RSxRQUFRLE1BQU0sSUFDNUYsR0FBK0Q7QUFBQSxRQUd0RSxNQUFNLE9BQU8sVUFBVSxXQUFXLFFBQVEsU0FBUyxZQUFZLFFBQVEsT0FBUSxDQUFDO0FBQUEsUUFDaEYsUUFBUSxNQUFNLFVBQVUsTUFBTSxXQUFXLE1BQU0sT0FBTztBQUFBLFFBQ3RELElBQUk7QUFBQSxVQUFPLE1BQU07QUFBQSxRQUNqQixPQUFPO0FBQUE7QUFBQSxJQUVYLENBQUM7QUFBQTtBQUFBO0FBbUNFLFNBQVMsZUFJZixDQUNDLElBQ0EsWUFHOEM7QUFBQSxFQUM5QyxPQUFPLENBQUMsU0FBUyxZQUFZO0FBQUEsSUFFM0IsTUFBTSxVQUNKLFlBQVksV0FBVyxRQUFRLFdBQVcsWUFDckMsR0FBb0UsUUFBUSxNQUFNLElBQ2xGLEdBQXFEO0FBQUEsSUFDNUQsTUFBTSxjQUFjLFdBQVcsT0FBTztBQUFBLElBQ3RDLE9BQU8sU0FBUztBQUFBLFNBQ1g7QUFBQSxTQUNBO0FBQUEsTUFDSCxTQUFTLFlBQVk7QUFBQSxRQUNuQixRQUFRLE1BQU0sVUFBVSxNQUFNLFFBQVEsT0FBTztBQUFBLFFBQzdDLElBQUk7QUFBQSxVQUFPLE1BQU07QUFBQSxRQUNqQixPQUFPO0FBQUE7QUFBQSxJQUVYLENBQUM7QUFBQTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiRDJCMDRERjc5RjBEMDhGNTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "eden2query",
3
3
  "description": "Type-safe Eden Treaty to React Query helpers",
4
- "version": "0.3.8",
4
+ "version": "0.3.10",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist"
@@ -39,7 +39,7 @@
39
39
  "prepublishOnly": "bun run build"
40
40
  },
41
41
  "peerDependencies": {
42
- "@elysiajs/eden": "^1.4.6",
42
+ "@elysiajs/eden": "^1.4.8",
43
43
  "@tanstack/react-query": "^5.90.20",
44
44
  "react": "^19.2.4",
45
45
  "typescript": "^5"
@@ -48,7 +48,7 @@
48
48
  "@types/bun": "latest",
49
49
  "@types/react": "^19.2.14",
50
50
  "bunup": "^0.16.22",
51
- "elysia": "^1.4.22",
51
+ "elysia": "^1.4.25",
52
52
  "prettier": "^3.4.2"
53
53
  }
54
54
  }