eden2query 0.3.5 → 0.3.7

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,6 +1,6 @@
1
1
  # eden2query
2
2
 
3
- Type-safe [Eden Treaty](https://elysiajs.com/eden/overview) to [React Query](https://tanstack.com/query) helpers. Two functions, zero runtime dependencies.
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
4
 
5
5
  ## Install
6
6
 
@@ -8,136 +8,410 @@ Type-safe [Eden Treaty](https://elysiajs.com/eden/overview) to [React Query](htt
8
8
  bun add eden2query @elysiajs/eden @tanstack/react-query
9
9
  ```
10
10
 
11
- ## Usage
11
+ ## Quick Start
12
12
 
13
- **Queries (GET)** pass a thunk that calls the Treaty GET:
13
+ ### 1. Define your Elysia API
14
14
 
15
15
  ```ts
16
- const getOptions = treatyQueryOptions(
17
- () => client.api.resource.get({ query: { q: "hello" } }),
18
- { queryKey: ["resource"], refetchInterval: 1000 },
19
- );
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
+ });
20
45
  ```
21
46
 
22
- **Mutations with variables (POST, PUT, etc.)** pass a function that receives the mutation input, or a bound Treaty method:
47
+ ### 2. Create Treaty Client
23
48
 
24
49
  ```ts
25
- // Wrapper when Treaty uses (body, options)
26
- const postOptions = treatyMutationOptions(
27
- (vars: { body: { name: string }; query: { q: string } }) =>
28
- client.api.resource.post(vars.body, { query: vars.query }),
29
- { onSuccess: () => console.log("Success") },
30
- );
31
-
32
- // Parameterised routes — bind params first
33
- const putOptions = treatyMutationOptions(
34
- client.api.resource({ id: "dummy" }).put,
35
- { onSettled: () => console.log("Settled") },
36
- );
50
+ import { treaty } from "@elysiajs/eden";
51
+
52
+ const client = treaty<typeof app>("http://localhost:3000");
37
53
  ```
38
54
 
39
- **Mutations without variables (e.g. DELETE with fixed params)** — pass a no-argument function; `mutate()` is then called with no args:
55
+ ### 3. Create Type-Safe Hooks
40
56
 
41
57
  ```ts
42
- const deleteOptions = treatyMutationOptions(
43
- () => client.api.resource({ id: "dummy" }).delete(),
44
- { onMutate: () => console.log("Mutate") },
45
- );
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
+ });
46
113
  ```
47
114
 
48
- Use with React Query as usual:
115
+ ### 4. Use in Components
49
116
 
50
117
  ```tsx
51
- const { data } = useQuery(getOptions);
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
52
173
 
53
- const postMutation = useMutation(postOptions);
54
- postMutation.mutate({ body: { name: "World" }, query: { q: "hello" } });
174
+ ### `treatyQueryHook`
55
175
 
56
- const putMutation = useMutation(putOptions);
57
- putMutation.mutate({ name: "World" });
176
+ Creates a type-safe React Query hook for GET requests.
58
177
 
59
- const deleteMutation = useMutation(deleteOptions);
60
- deleteMutation.mutate(); // no arguments
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
61
184
  ```
62
185
 
63
- Prefetch and other helpers work as usual:
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
64
191
 
192
+ **Example:**
65
193
  ```ts
66
- const queryClient = new QueryClient();
67
- queryClient.prefetchQuery(getOptions);
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
+ });
68
297
  ```
69
298
 
70
- ### Hook builders: `createTreatyQueryHook` / `createTreatyMutationHook`
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
71
311
 
72
- Create reusable, pre-configured hooks for a Treaty endpoint. The second parameter is **`useOptions`**: either a static options object or a **function** that receives the hook’s call-time options and returns options (so you can use React hooks like `useQueryClient()` and forward or merge callbacks).
312
+ ### Routes with Params
73
313
 
74
- **Query hook** pass the Treaty GET thunk and `useOptions` (object or function):
314
+ For routes like `/users/:id`, params are **required** and included in the request type:
75
315
 
76
316
  ```ts
77
- const useResource = createTreatyQueryHook(
78
- () => client.api.resource.get({ query: { q: "hello" } }),
79
- { queryKey: ["resource"] },
80
- );
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):
81
335
 
82
- // In a component
83
- const { data } = useResource(); // or useResource({ refetchInterval: 1000 })
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
+ });
84
350
  ```
85
351
 
86
- **Mutation hook** pass the Treaty mutation and optional `useOptions`. Use a function when you need React hooks (e.g. for invalidation) or need to forward call-site callbacks:
352
+ ### Mutations with Body (no params)
353
+
354
+ POST mutations without route params include a `body` field:
87
355
 
88
356
  ```ts
89
- // Static useOptions
90
- const usePostResource = createTreatyMutationHook(
91
- (vars: { body: { name: string } }) => client.api.resource.post(vars.body),
92
- { onSuccess: () => console.log("Success") },
93
- );
94
-
95
- // useOptions as function — receives hook options, can use React hooks and forward callbacks
96
- const usePostResourceWithInvalidation = createTreatyMutationHook(
97
- (vars: { body: { name: string } }) => client.api.resource.post(vars.body),
98
- (options) => {
99
- const queryClient = useQueryClient();
100
- return {
101
- onSettled(...args) {
102
- queryClient.invalidateQueries({ queryKey: ["resource"] });
103
- options.onSettled?.(...args);
104
- },
105
- };
106
- },
107
- );
108
-
109
- // In a component
110
- const postMutation = usePostResource();
111
- postMutation.mutate({ body: { name: "World" } });
112
-
113
- const postWithInvalidation = usePostResourceWithInvalidation({
114
- onSuccess: () => console.log("Success"),
115
- });
116
- postWithInvalidation.mutate({ body: { name: "World" } });
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
+ });
117
368
  ```
118
369
 
119
- Hooks accept the same options as `useQuery` / `useMutation`; call-time options are merged with the base options from `useOptions`. When `useOptions` is a function, it receives those call-time options so you can forward callbacks (e.g. `options.onSettled?.(...args)`).
370
+ ### Mutations with Params and Body
120
371
 
121
- ## API
372
+ PUT mutations can have both params and body:
122
373
 
123
- **`treatyQueryOptions(fn, queryOptions)`** — wraps a Treaty GET call into `queryOptions`. `fn` is a **thunk** (zero-argument function) that calls the Treaty GET, e.g. `() => client.api.resource.get({ query: { ... } })`. The second argument accepts all `queryOptions` fields except `queryFn`. Extracts `data` from the response and throws on `error`.
374
+ ```ts
375
+ function updateUser(params: { id: string }) {
376
+ return client.api.users({ id: params.id }).put;
377
+ }
124
378
 
125
- **`treatyMutationOptions(fn, mutationOptions?)`** wraps a Treaty mutation into `mutationOptions`. Two shapes:
379
+ const useUpdateUser = treatyMutationHook(updateUser, () => ({}));
126
380
 
127
- - **No-arg:** `fn` is `() => Promise<...>`. Use when the mutation has no call-time input (e.g. DELETE with fixed path params). `mutate()` is called with no arguments.
128
- - **With variables:** `fn` is `(vars) => Promise<...>`. Use for POST/PUT etc. `mutate(vars)` receives a single object (e.g. `{ body, query }` or the Treaty method’s first argument). You can pass the Treaty method directly when its signature matches (e.g. `client.api.resource({ id }).put`).
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)
129
389
 
130
- The optional second argument accepts all `mutationOptions` fields except `mutationFn` (e.g. `onSuccess`, `onSettled`, `onMutate`).
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
+ }
131
396
 
132
- **`createTreatyQueryHook(fn, useOptions)`** returns a hook that wraps `useQuery` with the given Treaty GET thunk. **`useOptions`** is either a query options object (e.g. `{ queryKey: [...] }`) or a function `(options) => ...` that receives the hook’s call-time options and returns options; the function runs when the hook runs, so you can use React hooks inside it. Call-time options are merged with the returned options.
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
+ ```
133
405
 
134
- **`createTreatyMutationHook(fn, useOptions?)`** — returns a hook that wraps `useMutation` with the given Treaty mutation. Same fn shapes as `treatyMutationOptions` (no-arg or with variables). **`useOptions`** is optional; it can be a mutation options object or a function `(options) => ...` that receives the hook’s call-time options and returns options (so you can use `useQueryClient()` for invalidation and forward callbacks like `options.onSettled?.(...args)`). The returned hook accepts the same options as `useMutation`.
406
+ ## Options Merging
135
407
 
136
- **`InferTreatyQueryOptions<T>`** full `UseQueryOptions` type for a given Treaty query.
408
+ Options are merged in this order (later options override earlier ones):
137
409
 
138
- **`InferTreatyMutationOptions<TVariables, TResponse>`** full `UseMutationOptions` type for a given Treaty mutation.
410
+ 1. Base options from `useOptions` hook
411
+ 2. Options passed to the hook factory
412
+ 3. Options passed when calling the hook
139
413
 
140
- Data, error, and input types are inferred end-to-end from your Elysia route definitions.
414
+ Callbacks (`onSuccess`, `onError`, etc.) are **chained** - all callbacks run in order.
141
415
 
142
416
  ## License
143
417
 
package/dist/index.d.ts CHANGED
@@ -1,43 +1,70 @@
1
1
  import { Treaty } from "@elysiajs/eden";
2
2
  import { UseMutationOptions, UseMutationResult, UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
3
- type TreatyResponse = Record<number, unknown>;
4
- type TreatyFunctionWithoutParams<TResponse extends TreatyResponse = TreatyResponse> = () => Promise<Treaty.TreatyResponse<TResponse>>;
5
- type TreatyFunctionWithParams<
6
- TParams,
7
- TResponse extends TreatyResponse
8
- > = (params: TParams) => Promise<Treaty.TreatyResponse<TResponse>>;
9
- type TreatyData<TResponse extends TreatyResponse> = Treaty.TreatyResponse<TResponse>["data"];
10
- type TreatyError<TResponse extends TreatyResponse> = Treaty.TreatyResponse<TResponse>["error"];
3
+ type IsEmpty<T> = [T] extends [never | undefined | void] ? true : [unknown] extends [T] ? [T] extends [unknown] ? true : false : false;
4
+ type TreatyMutationFunctionFactory<
5
+ TParams,
6
+ TBody,
7
+ TOption,
8
+ TResponse extends Record<number, unknown>
9
+ > = IsEmpty<TParams> extends true ? () => TreatyMutationFunction<TBody, TOption, TResponse> : (params: TParams) => TreatyMutationFunction<TBody, TOption, TResponse>;
10
+ type TreatyMutationFunction<
11
+ TBody,
12
+ TOption,
13
+ TResponse extends Record<number, unknown>
14
+ > = (body: TBody, options: TOption) => Promise<Treaty.TreatyResponse<TResponse>>;
15
+ type TreatyMutationRequest<
16
+ TParams,
17
+ TBody,
18
+ TOption
19
+ > = TOption & (IsEmpty<TParams> extends true ? {} : {
20
+ params: TParams;
21
+ }) & (IsEmpty<TBody> extends true ? {} : {
22
+ body: TBody;
23
+ });
24
+ type TreatyData<TResponse extends Record<number, unknown>> = Treaty.TreatyResponse<TResponse>["data"];
25
+ type TreatyError<TResponse extends Record<number, unknown>> = Treaty.TreatyResponse<TResponse>["error"];
11
26
  type TreatyMutationOptions<
12
- TVariables,
13
- TResponse extends TreatyResponse
14
- > = UseMutationOptions<TreatyData<TResponse>, TreatyError<TResponse>, TVariables>;
15
- type UseTreatyMutationResult<
16
- TVariables,
17
- TResponse extends TreatyResponse
18
- > = UseMutationResult<TreatyData<TResponse>, TreatyError<TResponse>, TVariables>;
19
- type UseTreatyQueryResult<TResponse extends TreatyResponse> = UseQueryResult<TreatyData<TResponse>, TreatyError<TResponse>>;
27
+ TParams,
28
+ TBody,
29
+ TOption,
30
+ TResponse extends Record<number, unknown>
31
+ > = UseMutationOptions<TreatyData<TResponse>, TreatyError<TResponse>, TreatyMutationRequest<TParams, TBody, TOption>>;
32
+ type TreatyMutationHook<
33
+ TParams,
34
+ TBody,
35
+ TOption,
36
+ TResponse extends Record<number, unknown>
37
+ > = (options?: Omit<TreatyMutationOptions<TParams, TBody, TOption, TResponse>, "mutationFn">) => UseMutationResult<TreatyData<TResponse>, TreatyError<TResponse>, TreatyMutationRequest<TParams, TBody, TOption>>;
38
+ declare function treatyMutationHook<
39
+ TParams,
40
+ TBody,
41
+ TOption,
42
+ TResponse extends Record<number, unknown>
43
+ >(fn: TreatyMutationFunctionFactory<TParams, TBody, TOption, TResponse>, useOptions: () => Omit<TreatyMutationOptions<TParams, TBody, TOption, TResponse>, "mutationFn">): TreatyMutationHook<TParams, TBody, TOption, TResponse>;
44
+ type TreatyQueryFunction<
45
+ TOption extends object,
46
+ TResponse extends Record<number, unknown>
47
+ > = (options: TOption) => Promise<Treaty.TreatyResponse<TResponse>>;
48
+ type TreatyQueryFunctionFactory<
49
+ TParams,
50
+ TOption extends object,
51
+ TResponse extends Record<number, unknown>
52
+ > = IsEmpty<TParams> extends true ? () => TreatyQueryFunction<TOption, TResponse> : (params: TParams) => TreatyQueryFunction<TOption, TResponse>;
53
+ type TreatyQueryRequest<
54
+ TParams,
55
+ TOption extends object
56
+ > = TOption & (IsEmpty<TParams> extends true ? {} : {
57
+ params: TParams;
58
+ });
20
59
  type TreatyQueryOptions<TResponse extends Record<number, unknown>> = UseQueryOptions<TreatyData<TResponse>, TreatyError<TResponse>>;
21
- type UseTreatyQueryOptions<TResponse extends TreatyResponse> = Omit<TreatyQueryOptions<TResponse>, "queryFn">;
22
- type UseTreatyMutationOptions<
23
- TVariables,
24
- TResponse extends TreatyResponse
25
- > = Omit<TreatyMutationOptions<TVariables, TResponse>, "mutationFn">;
26
- type UseTreatyMutationHook<
27
- TVariables,
28
- TResponse extends TreatyResponse
29
- > = (options: Partial<UseTreatyMutationOptions<TVariables, TResponse>>) => UseTreatyMutationResult<TVariables, TResponse>;
30
- type UseTreatyQueryHook<TResponse extends TreatyResponse> = (options: Partial<UseTreatyQueryOptions<TResponse>>) => UseTreatyQueryResult<TResponse>;
31
- declare function treatyMutationOptions<TResponse extends TreatyResponse>(fn: TreatyFunctionWithoutParams<TResponse>, options?: UseTreatyMutationOptions<void, TResponse>): TreatyMutationOptions<void, TResponse>;
32
- declare function treatyMutationOptions<
33
- TVariables,
34
- TResponse extends TreatyResponse
35
- >(fn: TreatyFunctionWithParams<TVariables, TResponse>, options?: UseTreatyMutationOptions<TVariables, TResponse>): TreatyMutationOptions<TVariables, TResponse>;
36
- declare function treatyQueryOptions<TResponse extends TreatyResponse = TreatyResponse>(fn: TreatyFunctionWithoutParams<TResponse>, options: UseTreatyQueryOptions<TResponse>): TreatyQueryOptions<TResponse>;
37
- declare function createTreatyMutationHook<TResponse extends TreatyResponse>(fn: TreatyFunctionWithoutParams<TResponse>, useOptions?: UseTreatyMutationOptions<void, TResponse> | ((options: Partial<UseTreatyMutationOptions<void, TResponse>>) => UseTreatyMutationOptions<void, TResponse>)): UseTreatyMutationHook<void, TResponse>;
38
- declare function createTreatyMutationHook<
39
- TVariables,
40
- TResponse extends TreatyResponse
41
- >(fn: TreatyFunctionWithParams<TVariables, TResponse>, useOptions?: UseTreatyMutationOptions<TVariables, TResponse> | ((options: Partial<UseTreatyMutationOptions<TVariables, TResponse>>) => UseTreatyMutationOptions<TVariables, TResponse>)): UseTreatyMutationHook<TVariables, TResponse>;
42
- declare function createTreatyQueryHook<TResponse extends TreatyResponse>(fn: TreatyFunctionWithoutParams<TResponse>, useOptions: UseTreatyQueryOptions<TResponse> | ((options: Partial<UseTreatyQueryOptions<TResponse>>) => UseTreatyQueryOptions<TResponse>)): UseTreatyQueryHook<TResponse>;
43
- export { treatyQueryOptions, treatyMutationOptions, createTreatyQueryHook, createTreatyMutationHook, UseTreatyQueryOptions, UseTreatyQueryHook, UseTreatyMutationOptions, UseTreatyMutationHook, TreatyQueryOptions, TreatyMutationOptions, TreatyError, TreatyData };
60
+ type TreatyQueryHook<
61
+ TParams,
62
+ TOption extends object,
63
+ TResponse extends Record<number, unknown>
64
+ > = (request: TreatyQueryRequest<TParams, TOption>, options?: Omit<TreatyQueryOptions<TResponse>, "queryKey" | "queryFn">) => UseQueryResult<TreatyData<TResponse>, TreatyError<TResponse>>;
65
+ declare function treatyQueryHook<
66
+ TParams,
67
+ TOption extends object,
68
+ TResponse extends Record<number, unknown>
69
+ >(fn: TreatyQueryFunctionFactory<TParams, TOption, TResponse>, useOptions: (request: TreatyQueryRequest<TParams, TOption>) => Omit<TreatyQueryOptions<TResponse>, "queryFn">): TreatyQueryHook<TParams, TOption, TResponse>;
70
+ export { treatyQueryHook, treatyMutationHook };
package/dist/index.js CHANGED
@@ -1,58 +1,82 @@
1
- // src/lib.ts
1
+ // src/treaty.ts
2
2
  import {
3
- mutationOptions,
4
- queryOptions,
5
3
  useMutation,
6
4
  useQuery
7
5
  } from "@tanstack/react-query";
8
- function treatyMutationOptions(fn, options) {
9
- return mutationOptions({
10
- ...options,
11
- mutationFn: async (variables) => {
12
- const response = await (fn.length === 0 ? fn() : fn(variables));
13
- const { data, error } = response;
14
- if (error)
15
- throw error;
16
- return data;
17
- }
18
- });
19
- }
20
- function treatyQueryOptions(fn, options) {
21
- return queryOptions({
22
- ...options,
23
- queryFn: async () => {
24
- const response = await fn();
25
- const { data, error } = response;
26
- if (error)
27
- throw error;
28
- return data;
6
+
7
+ // src/utils.ts
8
+ function mergeMutationOptions(base, options) {
9
+ if (!options)
10
+ return base;
11
+ const { onSuccess, onError, onSettled, onMutate, ...rest } = options;
12
+ return {
13
+ ...base,
14
+ ...rest,
15
+ ...onMutate !== undefined && {
16
+ onMutate: async (variables, context) => {
17
+ const prev = await base.onMutate?.(variables, context);
18
+ const next = await options.onMutate?.(variables, context);
19
+ return next !== undefined ? next : prev;
20
+ }
21
+ },
22
+ ...onSuccess !== undefined && {
23
+ onSuccess: async (data, variables, onMutateResult, context) => {
24
+ await base.onSuccess?.(data, variables, onMutateResult, context);
25
+ await options.onSuccess?.(data, variables, onMutateResult, context);
26
+ }
27
+ },
28
+ ...onError !== undefined && {
29
+ onError: async (error, variables, onMutateResult, context) => {
30
+ await base.onError?.(error, variables, onMutateResult, context);
31
+ await options.onError?.(error, variables, onMutateResult, context);
32
+ }
33
+ },
34
+ ...onSettled !== undefined && {
35
+ onSettled: async (data, error, variables, onMutateResult, context) => {
36
+ await base.onSettled?.(data, error, variables, onMutateResult, context);
37
+ await options.onSettled?.(data, error, variables, onMutateResult, context);
38
+ }
29
39
  }
30
- });
40
+ };
31
41
  }
32
- function createTreatyMutationHook(fn, useOptions) {
42
+
43
+ // src/treaty.ts
44
+ function treatyMutationHook(fn, useOptions) {
33
45
  return (options) => {
34
- const initOptions = typeof useOptions === "function" ? useOptions(options) : useOptions;
46
+ const baseOptions = useOptions();
35
47
  return useMutation({
36
- ...treatyMutationOptions(fn, initOptions),
37
- ...options
48
+ ...mergeMutationOptions(baseOptions, options),
49
+ mutationFn: async (request) => {
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;
52
+ const { data, error } = await mutationFn(body, request);
53
+ if (error)
54
+ throw error;
55
+ return data;
56
+ }
38
57
  });
39
58
  };
40
59
  }
41
- function createTreatyQueryHook(fn, useOptions) {
42
- return (options) => {
43
- const initOptions = typeof useOptions === "function" ? useOptions(options) : useOptions;
60
+ function treatyQueryHook(fn, useOptions) {
61
+ return (request, options) => {
62
+ const queryFn = "params" in request && request.params !== undefined ? fn(request.params) : fn();
63
+ const baseOptions = useOptions(request);
44
64
  return useQuery({
45
- ...treatyQueryOptions(fn, initOptions),
46
- ...options
65
+ ...options,
66
+ ...baseOptions,
67
+ queryFn: async () => {
68
+ const { data, error } = await queryFn(request);
69
+ if (error)
70
+ throw error;
71
+ return data;
72
+ }
47
73
  });
48
74
  };
49
75
  }
50
76
  export {
51
- treatyQueryOptions,
52
- treatyMutationOptions,
53
- createTreatyQueryHook,
54
- createTreatyMutationHook
77
+ treatyQueryHook,
78
+ treatyMutationHook
55
79
  };
56
80
 
57
- //# debugId=DB20669AEF2C954E64756E2164756E21
58
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFxsaWIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHR5cGUgeyBUcmVhdHkgfSBmcm9tIFwiQGVseXNpYWpzL2VkZW5cIjtcclxuaW1wb3J0IHtcclxuICBtdXRhdGlvbk9wdGlvbnMsXHJcbiAgcXVlcnlPcHRpb25zLFxyXG4gIHVzZU11dGF0aW9uLFxyXG4gIHVzZVF1ZXJ5LFxyXG4gIHR5cGUgVXNlTXV0YXRpb25PcHRpb25zLFxyXG4gIHR5cGUgVXNlTXV0YXRpb25SZXN1bHQsXHJcbiAgdHlwZSBVc2VRdWVyeU9wdGlvbnMsXHJcbiAgdHlwZSBVc2VRdWVyeVJlc3VsdCxcclxufSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5XCI7XHJcblxyXG50eXBlIFRyZWF0eVJlc3BvbnNlID0gUmVjb3JkPG51bWJlciwgdW5rbm93bj47XHJcblxyXG5leHBvcnQgdHlwZSBUcmVhdHlGdW5jdGlvbldpdGhvdXRQYXJhbXM8XHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UgPSBUcmVhdHlSZXNwb25zZSxcclxuPiA9ICgpID0+IFByb21pc2U8VHJlYXR5LlRyZWF0eVJlc3BvbnNlPFRSZXNwb25zZT4+O1xyXG5cclxuZXhwb3J0IHR5cGUgVHJlYXR5RnVuY3Rpb25XaXRoUGFyYW1zPFxyXG4gIFRQYXJhbXMsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UsXHJcbj4gPSAocGFyYW1zOiBUUGFyYW1zKSA9PiBQcm9taXNlPFRyZWF0eS5UcmVhdHlSZXNwb25zZTxUUmVzcG9uc2U+PjtcclxuXHJcbmV4cG9ydCB0eXBlIFRyZWF0eUZ1bmN0aW9uPFRQYXJhbXMsIFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlPiA9XHJcbiAgfCBUcmVhdHlGdW5jdGlvbldpdGhvdXRQYXJhbXM8VFJlc3BvbnNlPlxyXG4gIHwgVHJlYXR5RnVuY3Rpb25XaXRoUGFyYW1zPFRQYXJhbXMsIFRSZXNwb25zZT47XHJcblxyXG5leHBvcnQgdHlwZSBUcmVhdHlEYXRhPFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlPiA9XHJcbiAgVHJlYXR5LlRyZWF0eVJlc3BvbnNlPFRSZXNwb25zZT5bXCJkYXRhXCJdO1xyXG5cclxuZXhwb3J0IHR5cGUgVHJlYXR5RXJyb3I8VFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2U+ID1cclxuICBUcmVhdHkuVHJlYXR5UmVzcG9uc2U8VFJlc3BvbnNlPltcImVycm9yXCJdO1xyXG5cclxuZXhwb3J0IHR5cGUgVHJlYXR5TXV0YXRpb25PcHRpb25zPFxyXG4gIFRWYXJpYWJsZXMsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UsXHJcbj4gPSBVc2VNdXRhdGlvbk9wdGlvbnM8XHJcbiAgVHJlYXR5RGF0YTxUUmVzcG9uc2U+LFxyXG4gIFRyZWF0eUVycm9yPFRSZXNwb25zZT4sXHJcbiAgVFZhcmlhYmxlc1xyXG4+O1xyXG5cclxuZXhwb3J0IHR5cGUgVXNlVHJlYXR5TXV0YXRpb25SZXN1bHQ8XHJcbiAgVFZhcmlhYmxlcyxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBUcmVhdHlSZXNwb25zZSxcclxuPiA9IFVzZU11dGF0aW9uUmVzdWx0PFxyXG4gIFRyZWF0eURhdGE8VFJlc3BvbnNlPixcclxuICBUcmVhdHlFcnJvcjxUUmVzcG9uc2U+LFxyXG4gIFRWYXJpYWJsZXNcclxuPjtcclxuXHJcbmV4cG9ydCB0eXBlIFVzZVRyZWF0eVF1ZXJ5UmVzdWx0PFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlPiA9XHJcbiAgVXNlUXVlcnlSZXN1bHQ8VHJlYXR5RGF0YTxUUmVzcG9uc2U+LCBUcmVhdHlFcnJvcjxUUmVzcG9uc2U+PjtcclxuXHJcbmV4cG9ydCB0eXBlIFRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPj4gPVxyXG4gIFVzZVF1ZXJ5T3B0aW9uczxUcmVhdHlEYXRhPFRSZXNwb25zZT4sIFRyZWF0eUVycm9yPFRSZXNwb25zZT4+O1xyXG5cclxuZXhwb3J0IHR5cGUgVXNlVHJlYXR5UXVlcnlPcHRpb25zPFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlPiA9IE9taXQ8XHJcbiAgVHJlYXR5UXVlcnlPcHRpb25zPFRSZXNwb25zZT4sXHJcbiAgXCJxdWVyeUZuXCJcclxuPjtcclxuXHJcbmV4cG9ydCB0eXBlIFVzZVRyZWF0eU11dGF0aW9uT3B0aW9uczxcclxuICBUVmFyaWFibGVzLFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlLFxyXG4+ID0gT21pdDxUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VFZhcmlhYmxlcywgVFJlc3BvbnNlPiwgXCJtdXRhdGlvbkZuXCI+O1xyXG5cclxuZXhwb3J0IHR5cGUgVXNlVHJlYXR5TXV0YXRpb25Ib29rPFxyXG4gIFRWYXJpYWJsZXMsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UsXHJcbj4gPSAoXHJcbiAgb3B0aW9uczogUGFydGlhbDxVc2VUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VFZhcmlhYmxlcywgVFJlc3BvbnNlPj4sXHJcbikgPT4gVXNlVHJlYXR5TXV0YXRpb25SZXN1bHQ8VFZhcmlhYmxlcywgVFJlc3BvbnNlPjtcclxuXHJcbmV4cG9ydCB0eXBlIFVzZVRyZWF0eVF1ZXJ5SG9vazxUUmVzcG9uc2UgZXh0ZW5kcyBUcmVhdHlSZXNwb25zZT4gPSAoXHJcbiAgb3B0aW9uczogUGFydGlhbDxVc2VUcmVhdHlRdWVyeU9wdGlvbnM8VFJlc3BvbnNlPj4sXHJcbikgPT4gVXNlVHJlYXR5UXVlcnlSZXN1bHQ8VFJlc3BvbnNlPjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmVhdHlNdXRhdGlvbk9wdGlvbnM8VFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2U+KFxyXG4gIGZuOiBUcmVhdHlGdW5jdGlvbldpdGhvdXRQYXJhbXM8VFJlc3BvbnNlPixcclxuICBvcHRpb25zPzogVXNlVHJlYXR5TXV0YXRpb25PcHRpb25zPHZvaWQsIFRSZXNwb25zZT4sXHJcbik6IFRyZWF0eU11dGF0aW9uT3B0aW9uczx2b2lkLCBUUmVzcG9uc2U+O1xyXG5leHBvcnQgZnVuY3Rpb24gdHJlYXR5TXV0YXRpb25PcHRpb25zPFxyXG4gIFRWYXJpYWJsZXMsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UsXHJcbj4oXHJcbiAgZm46IFRyZWF0eUZ1bmN0aW9uV2l0aFBhcmFtczxUVmFyaWFibGVzLCBUUmVzcG9uc2U+LFxyXG4gIG9wdGlvbnM/OiBVc2VUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VFZhcmlhYmxlcywgVFJlc3BvbnNlPixcclxuKTogVHJlYXR5TXV0YXRpb25PcHRpb25zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT47XHJcbmV4cG9ydCBmdW5jdGlvbiB0cmVhdHlNdXRhdGlvbk9wdGlvbnM8XHJcbiAgVFZhcmlhYmxlcyxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBUcmVhdHlSZXNwb25zZSxcclxuPihcclxuICBmbjogVHJlYXR5RnVuY3Rpb248VFZhcmlhYmxlcywgVFJlc3BvbnNlPixcclxuICBvcHRpb25zPzogVXNlVHJlYXR5TXV0YXRpb25PcHRpb25zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4sXHJcbik6IFRyZWF0eU11dGF0aW9uT3B0aW9uczxUVmFyaWFibGVzLCBUUmVzcG9uc2U+IHtcclxuICB0eXBlIFREYXRhID0gVHJlYXR5RGF0YTxUUmVzcG9uc2U+O1xyXG4gIHR5cGUgVEVycm9yID0gVHJlYXR5RXJyb3I8VFJlc3BvbnNlPjtcclxuICByZXR1cm4gbXV0YXRpb25PcHRpb25zPFREYXRhLCBURXJyb3IsIFRWYXJpYWJsZXM+KHtcclxuICAgIC4uLm9wdGlvbnMsXHJcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAodmFyaWFibGVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgKGZuLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgID8gKGZuIGFzICgpID0+IFByb21pc2U8VHJlYXR5LlRyZWF0eVJlc3BvbnNlPFRSZXNwb25zZT4+KSgpXHJcbiAgICAgICAgOiAoZm4gYXMgVHJlYXR5RnVuY3Rpb25XaXRoUGFyYW1zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4pKHZhcmlhYmxlcykpO1xyXG4gICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSByZXNwb25zZTtcclxuICAgICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJlYXR5UXVlcnlPcHRpb25zPFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlID0gVHJlYXR5UmVzcG9uc2UsXHJcbj4oXHJcbiAgZm46IFRyZWF0eUZ1bmN0aW9uV2l0aG91dFBhcmFtczxUUmVzcG9uc2U+LFxyXG4gIG9wdGlvbnM6IFVzZVRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2U+LFxyXG4pOiBUcmVhdHlRdWVyeU9wdGlvbnM8VFJlc3BvbnNlPiB7XHJcbiAgdHlwZSBURGF0YSA9IFRyZWF0eURhdGE8VFJlc3BvbnNlPjtcclxuICB0eXBlIFRFcnJvciA9IFRyZWF0eUVycm9yPFRSZXNwb25zZT47XHJcbiAgcmV0dXJuIHF1ZXJ5T3B0aW9uczxURGF0YSwgVEVycm9yPih7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZuKCk7XHJcbiAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IHJlc3BvbnNlO1xyXG4gICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmVhdHlNdXRhdGlvbkhvb2s8VFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2U+KFxyXG4gIGZuOiBUcmVhdHlGdW5jdGlvbldpdGhvdXRQYXJhbXM8VFJlc3BvbnNlPixcclxuICB1c2VPcHRpb25zPzpcclxuICAgIHwgVXNlVHJlYXR5TXV0YXRpb25PcHRpb25zPHZvaWQsIFRSZXNwb25zZT5cclxuICAgIHwgKChvcHRpb25zOiBQYXJ0aWFsPFVzZVRyZWF0eU11dGF0aW9uT3B0aW9uczx2b2lkLCBUUmVzcG9uc2U+PikgPT4gVXNlVHJlYXR5TXV0YXRpb25PcHRpb25zPHZvaWQsIFRSZXNwb25zZT4pLFxyXG4pOiBVc2VUcmVhdHlNdXRhdGlvbkhvb2s8dm9pZCwgVFJlc3BvbnNlPjtcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyZWF0eU11dGF0aW9uSG9vazxcclxuICBUVmFyaWFibGVzLFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlLFxyXG4+KFxyXG4gIGZuOiBUcmVhdHlGdW5jdGlvbldpdGhQYXJhbXM8VFZhcmlhYmxlcywgVFJlc3BvbnNlPixcclxuICB1c2VPcHRpb25zPzpcclxuICAgIHwgVXNlVHJlYXR5TXV0YXRpb25PcHRpb25zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT5cclxuICAgIHwgKChvcHRpb25zOiBQYXJ0aWFsPFVzZVRyZWF0eU11dGF0aW9uT3B0aW9uczxUVmFyaWFibGVzLCBUUmVzcG9uc2U+PikgPT4gVXNlVHJlYXR5TXV0YXRpb25PcHRpb25zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4pLFxyXG4pOiBVc2VUcmVhdHlNdXRhdGlvbkhvb2s8VFZhcmlhYmxlcywgVFJlc3BvbnNlPjtcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyZWF0eU11dGF0aW9uSG9vazxcclxuICBUVmFyaWFibGVzLFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlLFxyXG4+KFxyXG4gIGZuOiBUcmVhdHlGdW5jdGlvbjxUVmFyaWFibGVzLCBUUmVzcG9uc2U+LFxyXG4gIHVzZU9wdGlvbnM/OlxyXG4gICAgfCBVc2VUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VFZhcmlhYmxlcywgVFJlc3BvbnNlPlxyXG4gICAgfCAoKG9wdGlvbnM6IFBhcnRpYWw8VXNlVHJlYXR5TXV0YXRpb25PcHRpb25zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4+KSA9PiBVc2VUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VFZhcmlhYmxlcywgVFJlc3BvbnNlPiksXHJcbik6IFVzZVRyZWF0eU11dGF0aW9uSG9vazxUVmFyaWFibGVzLCBUUmVzcG9uc2U+IHtcclxuICByZXR1cm4gKG9wdGlvbnMpID0+IHtcclxuICAgIGNvbnN0IGluaXRPcHRpb25zID1cclxuICAgICAgdHlwZW9mIHVzZU9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIiA/IHVzZU9wdGlvbnMob3B0aW9ucykgOiB1c2VPcHRpb25zO1xyXG4gICAgcmV0dXJuIHVzZU11dGF0aW9uKHtcclxuICAgICAgLi4udHJlYXR5TXV0YXRpb25PcHRpb25zKGZuLCBpbml0T3B0aW9ucyksXHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICB9KTtcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHJlYXR5UXVlcnlIb29rPFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlPihcclxuICBmbjogVHJlYXR5RnVuY3Rpb25XaXRob3V0UGFyYW1zPFRSZXNwb25zZT4sXHJcbiAgdXNlT3B0aW9uczpcclxuICAgIHwgVXNlVHJlYXR5UXVlcnlPcHRpb25zPFRSZXNwb25zZT5cclxuICAgIHwgKChvcHRpb25zOiBQYXJ0aWFsPFVzZVRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2U+PikgPT4gVXNlVHJlYXR5UXVlcnlPcHRpb25zPFRSZXNwb25zZT4pLFxyXG4pOiBVc2VUcmVhdHlRdWVyeUhvb2s8VFJlc3BvbnNlPiB7XHJcbiAgcmV0dXJuIChvcHRpb25zKSA9PiB7XHJcbiAgICBjb25zdCBpbml0T3B0aW9ucyA9XHJcbiAgICAgIHR5cGVvZiB1c2VPcHRpb25zID09PSBcImZ1bmN0aW9uXCIgPyB1c2VPcHRpb25zKG9wdGlvbnMpIDogdXNlT3B0aW9ucztcclxuICAgIHJldHVybiB1c2VRdWVyeSh7XHJcbiAgICAgIC4uLnRyZWF0eVF1ZXJ5T3B0aW9ucyhmbiwgaW5pdE9wdGlvbnMpLFxyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgfSk7XHJcbiAgfTtcclxufVxyXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBd0ZPLFNBQVMscUJBR2YsQ0FDQyxJQUNBLFNBQzhDO0FBQUEsRUFHOUMsT0FBTyxnQkFBMkM7QUFBQSxPQUM3QztBQUFBLElBQ0gsWUFBWSxPQUFPLGNBQWM7QUFBQSxNQUMvQixNQUFNLFdBQVcsT0FBTyxHQUFHLFdBQVcsSUFDakMsR0FBdUQsSUFDdkQsR0FBdUQsU0FBUztBQUFBLE1BQ3JFLFFBQVEsTUFBTSxVQUFVO0FBQUEsTUFDeEIsSUFBSTtBQUFBLFFBQU8sTUFBTTtBQUFBLE1BQ2pCLE9BQU87QUFBQTtBQUFBLEVBRVgsQ0FBQztBQUFBO0FBR0ksU0FBUyxrQkFFZixDQUNDLElBQ0EsU0FDK0I7QUFBQSxFQUcvQixPQUFPLGFBQTRCO0FBQUEsT0FDOUI7QUFBQSxJQUNILFNBQVMsWUFBWTtBQUFBLE1BQ25CLE1BQU0sV0FBVyxNQUFNLEdBQUc7QUFBQSxNQUMxQixRQUFRLE1BQU0sVUFBVTtBQUFBLE1BQ3hCLElBQUk7QUFBQSxRQUFPLE1BQU07QUFBQSxNQUNqQixPQUFPO0FBQUE7QUFBQSxFQUVYLENBQUM7QUFBQTtBQWtCSSxTQUFTLHdCQUdmLENBQ0MsSUFDQSxZQUc4QztBQUFBLEVBQzlDLE9BQU8sQ0FBQyxZQUFZO0FBQUEsSUFDbEIsTUFBTSxjQUNKLE9BQU8sZUFBZSxhQUFhLFdBQVcsT0FBTyxJQUFJO0FBQUEsSUFDM0QsT0FBTyxZQUFZO0FBQUEsU0FDZCxzQkFBc0IsSUFBSSxXQUFXO0FBQUEsU0FDckM7QUFBQSxJQUNMLENBQUM7QUFBQTtBQUFBO0FBSUUsU0FBUyxxQkFBdUQsQ0FDckUsSUFDQSxZQUcrQjtBQUFBLEVBQy9CLE9BQU8sQ0FBQyxZQUFZO0FBQUEsSUFDbEIsTUFBTSxjQUNKLE9BQU8sZUFBZSxhQUFhLFdBQVcsT0FBTyxJQUFJO0FBQUEsSUFDM0QsT0FBTyxTQUFTO0FBQUEsU0FDWCxtQkFBbUIsSUFBSSxXQUFXO0FBQUEsU0FDbEM7QUFBQSxJQUNMLENBQUM7QUFBQTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiREIyMDY2OUFFRjJDOTU0RTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
81
+ //# debugId=F9298CEC88E7A7AB64756E2164756E21
82
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFx0cmVhdHkudHMiLCAic3JjXFx1dGlscy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7IFRyZWF0eSB9IGZyb20gXCJAZWx5c2lhanMvZWRlblwiO1xyXG5pbXBvcnQge1xyXG4gIHVzZU11dGF0aW9uLFxyXG4gIHVzZVF1ZXJ5LFxyXG4gIHR5cGUgUXVlcnlLZXksXHJcbiAgdHlwZSBVc2VNdXRhdGlvbk9wdGlvbnMsXHJcbiAgdHlwZSBVc2VNdXRhdGlvblJlc3VsdCxcclxuICB0eXBlIFVzZVF1ZXJ5T3B0aW9ucyxcclxuICB0eXBlIFVzZVF1ZXJ5UmVzdWx0LFxyXG59IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcclxuaW1wb3J0IHsgbWVyZ2VNdXRhdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuLy8gSGVscGVyIHR5cGUgdG8gY2hlY2sgaWYgYSB0eXBlIHJlcHJlc2VudHMgXCJubyBwYXJhbXNcIiAoYWJzZW50L2VtcHR5KVxyXG4vLyBDaGVja3MgZm9yIG5ldmVyLCB1bmRlZmluZWQsIHZvaWQsIGFuZCBhbHNvIGhhbmRsZXMgdW5rbm93biB3aGVuIGl0IHJlcHJlc2VudHMgYW4gdW5jb25zdHJhaW5lZCB0eXBlXHJcbnR5cGUgSXNFbXB0eTxUPiA9IFxyXG4gIC8vIENoZWNrIGZvciBuZXZlciwgdW5kZWZpbmVkLCB2b2lkXHJcbiAgW1RdIGV4dGVuZHMgW25ldmVyIHwgdW5kZWZpbmVkIHwgdm9pZF0gXHJcbiAgICA/IHRydWVcclxuICAgIC8vIENoZWNrIGlmIFQgaXMgdW5rbm93biAodW5jb25zdHJhaW5lZCB0eXBlIHBhcmFtZXRlcilcclxuICAgIDogW3Vua25vd25dIGV4dGVuZHMgW1RdXHJcbiAgICAgID8gW1RdIGV4dGVuZHMgW3Vua25vd25dXHJcbiAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgOiBmYWxzZVxyXG4gICAgICA6IGZhbHNlO1xyXG5cclxudHlwZSBUcmVhdHlNdXRhdGlvbkZ1bmN0aW9uRmFjdG9yeTxcclxuICBUUGFyYW1zLFxyXG4gIFRCb2R5LFxyXG4gIFRPcHRpb24sXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgUmVjb3JkPG51bWJlciwgdW5rbm93bj4sXHJcbj4gPSBJc0VtcHR5PFRQYXJhbXM+IGV4dGVuZHMgdHJ1ZVxyXG4gID8gKCkgPT4gVHJlYXR5TXV0YXRpb25GdW5jdGlvbjxUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPiBcclxuICA6IChwYXJhbXM6IFRQYXJhbXMpID0+IFRyZWF0eU11dGF0aW9uRnVuY3Rpb248VEJvZHksIFRPcHRpb24sIFRSZXNwb25zZT47XHJcblxyXG50eXBlIFRyZWF0eU11dGF0aW9uRnVuY3Rpb248XHJcbiAgVEJvZHksXHJcbiAgVE9wdGlvbixcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPiA9IChcclxuICBib2R5OiBUQm9keSxcclxuICBvcHRpb25zOiBUT3B0aW9uLFxyXG4pID0+IFByb21pc2U8VHJlYXR5LlRyZWF0eVJlc3BvbnNlPFRSZXNwb25zZT4+O1xyXG5cclxudHlwZSBUcmVhdHlNdXRhdGlvblJlcXVlc3Q8XHJcbiAgVFBhcmFtcyxcclxuICBUQm9keSxcclxuICBUT3B0aW9uLFxyXG4+ID0gVE9wdGlvbiAmXHJcbiAgKElzRW1wdHk8VFBhcmFtcz4gZXh0ZW5kcyB0cnVlID8ge30gOiB7IHBhcmFtczogVFBhcmFtcyB9KSAmXHJcbiAgKElzRW1wdHk8VEJvZHk+IGV4dGVuZHMgdHJ1ZSA/IHt9IDogeyBib2R5OiBUQm9keSB9KTtcclxuXHJcbnR5cGUgVHJlYXR5RGF0YTxUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPj4gPVxyXG4gIFRyZWF0eS5UcmVhdHlSZXNwb25zZTxUUmVzcG9uc2U+W1wiZGF0YVwiXTtcclxuXHJcbnR5cGUgVHJlYXR5RXJyb3I8VFJlc3BvbnNlIGV4dGVuZHMgUmVjb3JkPG51bWJlciwgdW5rbm93bj4+ID1cclxuICBUcmVhdHkuVHJlYXR5UmVzcG9uc2U8VFJlc3BvbnNlPltcImVycm9yXCJdO1xyXG5cclxudHlwZSBUcmVhdHlNdXRhdGlvbk9wdGlvbnM8XHJcbiAgVFBhcmFtcyxcclxuICBUQm9keSxcclxuICBUT3B0aW9uLFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFJlY29yZDxudW1iZXIsIHVua25vd24+LFxyXG4+ID0gVXNlTXV0YXRpb25PcHRpb25zPFxyXG4gIFRyZWF0eURhdGE8VFJlc3BvbnNlPixcclxuICBUcmVhdHlFcnJvcjxUUmVzcG9uc2U+LFxyXG4gIFRyZWF0eU11dGF0aW9uUmVxdWVzdDxUUGFyYW1zLCBUQm9keSwgVE9wdGlvbj5cclxuPjtcclxuXHJcbnR5cGUgVHJlYXR5TXV0YXRpb25Ib29rPFxyXG4gIFRQYXJhbXMsXHJcbiAgVEJvZHksXHJcbiAgVE9wdGlvbixcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPiA9IChcclxuICBvcHRpb25zPzogT21pdDxcclxuICAgIFRyZWF0eU11dGF0aW9uT3B0aW9uczxUUGFyYW1zLCBUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPixcclxuICAgIFwibXV0YXRpb25GblwiXHJcbiAgPixcclxuKSA9PiBVc2VNdXRhdGlvblJlc3VsdDxcclxuICBUcmVhdHlEYXRhPFRSZXNwb25zZT4sXHJcbiAgVHJlYXR5RXJyb3I8VFJlc3BvbnNlPixcclxuICBUcmVhdHlNdXRhdGlvblJlcXVlc3Q8VFBhcmFtcywgVEJvZHksIFRPcHRpb24+XHJcbj47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJlYXR5TXV0YXRpb25Ib29rPFxyXG4gIFRQYXJhbXMsXHJcbiAgVEJvZHksXHJcbiAgVE9wdGlvbixcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPihcclxuICBmbjogVHJlYXR5TXV0YXRpb25GdW5jdGlvbkZhY3Rvcnk8VFBhcmFtcywgVEJvZHksIFRPcHRpb24sIFRSZXNwb25zZT4sXHJcbiAgdXNlT3B0aW9uczogKCkgPT4gT21pdDxcclxuICAgIFRyZWF0eU11dGF0aW9uT3B0aW9uczxUUGFyYW1zLCBUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPixcclxuICAgIFwibXV0YXRpb25GblwiXHJcbiAgPixcclxuKTogVHJlYXR5TXV0YXRpb25Ib29rPFRQYXJhbXMsIFRCb2R5LCBUT3B0aW9uLCBUUmVzcG9uc2U+IHtcclxuICByZXR1cm4gKG9wdGlvbnMpID0+IHtcclxuICAgIGNvbnN0IGJhc2VPcHRpb25zID0gdXNlT3B0aW9ucygpO1xyXG4gICAgcmV0dXJuIHVzZU11dGF0aW9uKHtcclxuICAgICAgLi4ubWVyZ2VNdXRhdGlvbk9wdGlvbnMoYmFzZU9wdGlvbnMsIG9wdGlvbnMpLFxyXG4gICAgICBtdXRhdGlvbkZuOiBhc3luYyAocmVxdWVzdCkgPT4ge1xyXG4gICAgICAgIC8vIEhhbmRsZSBvcHRpb25hbCBwYXJhbXM6IGlmIHBhcmFtcyBleGlzdHMsIHBhc3MgaXQ7IG90aGVyd2lzZSBjYWxsIGZuKCkgd2l0aG91dCBhcmdzXHJcbiAgICAgICAgY29uc3QgbXV0YXRpb25GbiA9XHJcbiAgICAgICAgICBcInBhcmFtc1wiIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5wYXJhbXMgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICA/IChmbiBhcyAocGFyYW1zOiBUUGFyYW1zKSA9PiBUcmVhdHlNdXRhdGlvbkZ1bmN0aW9uPFRCb2R5LCBUT3B0aW9uLCBUUmVzcG9uc2U+KShyZXF1ZXN0LnBhcmFtcylcclxuICAgICAgICAgICAgOiAoZm4gYXMgKCkgPT4gVHJlYXR5TXV0YXRpb25GdW5jdGlvbjxUQm9keSwgVE9wdGlvbiwgVFJlc3BvbnNlPikoKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBIYW5kbGUgb3B0aW9uYWwgYm9keTogaWYgYm9keSBleGlzdHMsIHBhc3MgaXQ7IG90aGVyd2lzZSBwYXNzIHVuZGVmaW5lZFxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBcImJvZHlcIiBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuYm9keSAhPT0gdW5kZWZpbmVkID8gcmVxdWVzdC5ib2R5IDogKHVuZGVmaW5lZCBhcyBUQm9keSk7XHJcbiAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgbXV0YXRpb25Gbihib2R5LCByZXF1ZXN0KTtcclxuICAgICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfTtcclxufVxyXG5cclxudHlwZSBUcmVhdHlRdWVyeUZ1bmN0aW9uPFxyXG4gIFRPcHRpb24gZXh0ZW5kcyBvYmplY3QsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgUmVjb3JkPG51bWJlciwgdW5rbm93bj4sXHJcbj4gPSAob3B0aW9uczogVE9wdGlvbikgPT4gUHJvbWlzZTxUcmVhdHkuVHJlYXR5UmVzcG9uc2U8VFJlc3BvbnNlPj47XHJcblxyXG50eXBlIFRyZWF0eVF1ZXJ5RnVuY3Rpb25GYWN0b3J5PFxyXG4gIFRQYXJhbXMsXHJcbiAgVE9wdGlvbiBleHRlbmRzIG9iamVjdCxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPiA9IElzRW1wdHk8VFBhcmFtcz4gZXh0ZW5kcyB0cnVlXHJcbiAgPyAoKSA9PiBUcmVhdHlRdWVyeUZ1bmN0aW9uPFRPcHRpb24sIFRSZXNwb25zZT5cclxuICA6IChwYXJhbXM6IFRQYXJhbXMpID0+IFRyZWF0eVF1ZXJ5RnVuY3Rpb248VE9wdGlvbiwgVFJlc3BvbnNlPjtcclxuXHJcbnR5cGUgVHJlYXR5UXVlcnlSZXF1ZXN0PFxyXG4gIFRQYXJhbXMsXHJcbiAgVE9wdGlvbiBleHRlbmRzIG9iamVjdCxcclxuPiA9IFRPcHRpb24gJlxyXG4gIChJc0VtcHR5PFRQYXJhbXM+IGV4dGVuZHMgdHJ1ZSA/IHt9IDogeyBwYXJhbXM6IFRQYXJhbXMgfSk7XHJcblxyXG50eXBlIFRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPj4gPVxyXG4gIFVzZVF1ZXJ5T3B0aW9uczxUcmVhdHlEYXRhPFRSZXNwb25zZT4sIFRyZWF0eUVycm9yPFRSZXNwb25zZT4+O1xyXG5cclxudHlwZSBUcmVhdHlRdWVyeUhvb2s8XHJcbiAgVFBhcmFtcyxcclxuICBUT3B0aW9uIGV4dGVuZHMgb2JqZWN0LFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFJlY29yZDxudW1iZXIsIHVua25vd24+LFxyXG4+ID0gKFxyXG4gIHJlcXVlc3Q6IFRyZWF0eVF1ZXJ5UmVxdWVzdDxUUGFyYW1zLCBUT3B0aW9uPixcclxuICBvcHRpb25zPzogT21pdDxUcmVhdHlRdWVyeU9wdGlvbnM8VFJlc3BvbnNlPiwgXCJxdWVyeUtleVwiIHwgXCJxdWVyeUZuXCI+LFxyXG4pID0+IFVzZVF1ZXJ5UmVzdWx0PFRyZWF0eURhdGE8VFJlc3BvbnNlPiwgVHJlYXR5RXJyb3I8VFJlc3BvbnNlPj47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJlYXR5UXVlcnlIb29rPFxyXG4gIFRQYXJhbXMsXHJcbiAgVE9wdGlvbiBleHRlbmRzIG9iamVjdCxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPixcclxuPihcclxuICBmbjogVHJlYXR5UXVlcnlGdW5jdGlvbkZhY3Rvcnk8VFBhcmFtcywgVE9wdGlvbiwgVFJlc3BvbnNlPixcclxuICB1c2VPcHRpb25zOiAoXHJcbiAgICByZXF1ZXN0OiBUcmVhdHlRdWVyeVJlcXVlc3Q8VFBhcmFtcywgVE9wdGlvbj4sXHJcbiAgKSA9PiBPbWl0PFRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2U+LCBcInF1ZXJ5Rm5cIj4sXHJcbik6IFRyZWF0eVF1ZXJ5SG9vazxUUGFyYW1zLCBUT3B0aW9uLCBUUmVzcG9uc2U+IHtcclxuICByZXR1cm4gKHJlcXVlc3QsIG9wdGlvbnMpID0+IHtcclxuICAgIC8vIEhhbmRsZSBvcHRpb25hbCBwYXJhbXM6IGlmIHBhcmFtcyBleGlzdHMsIHBhc3MgaXQ7IG90aGVyd2lzZSBjYWxsIGZuKCkgd2l0aG91dCBhcmdzXHJcbiAgICBjb25zdCBxdWVyeUZuID1cclxuICAgICAgXCJwYXJhbXNcIiBpbiByZXF1ZXN0ICYmIHJlcXVlc3QucGFyYW1zICE9PSB1bmRlZmluZWRcclxuICAgICAgICA/IChmbiBhcyAocGFyYW1zOiBUUGFyYW1zKSA9PiBUcmVhdHlRdWVyeUZ1bmN0aW9uPFRPcHRpb24sIFRSZXNwb25zZT4pKHJlcXVlc3QucGFyYW1zKVxyXG4gICAgICAgIDogKGZuIGFzICgpID0+IFRyZWF0eVF1ZXJ5RnVuY3Rpb248VE9wdGlvbiwgVFJlc3BvbnNlPikoKTtcclxuICAgIGNvbnN0IGJhc2VPcHRpb25zID0gdXNlT3B0aW9ucyhyZXF1ZXN0KTtcclxuICAgIHJldHVybiB1c2VRdWVyeSh7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIC4uLmJhc2VPcHRpb25zLFxyXG4gICAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgcXVlcnlGbihyZXF1ZXN0KTtcclxuICAgICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfTtcclxufVxyXG4iLAogICAgImltcG9ydCB0eXBlIHtcclxuICBRdWVyeUtleSxcclxuICBVc2VNdXRhdGlvbk9wdGlvbnMsXHJcbiAgVXNlUXVlcnlPcHRpb25zLFxyXG59IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU11dGF0aW9uT3B0aW9uczxURGF0YSwgVEVycm9yLCBUVmFyaWFibGVzLCBUQ29udGV4dD4oXHJcbiAgYmFzZTogVXNlTXV0YXRpb25PcHRpb25zPFREYXRhLCBURXJyb3IsIFRWYXJpYWJsZXMsIFRDb250ZXh0PixcclxuICBvcHRpb25zPzogUGFydGlhbDxVc2VNdXRhdGlvbk9wdGlvbnM8VERhdGEsIFRFcnJvciwgVFZhcmlhYmxlcywgVENvbnRleHQ+PixcclxuKTogVXNlTXV0YXRpb25PcHRpb25zPFREYXRhLCBURXJyb3IsIFRWYXJpYWJsZXMsIFRDb250ZXh0PiB7XHJcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gYmFzZTtcclxuICBjb25zdCB7IG9uU3VjY2Vzcywgb25FcnJvciwgb25TZXR0bGVkLCBvbk11dGF0ZSwgLi4ucmVzdCB9ID0gb3B0aW9ucztcclxuICByZXR1cm4ge1xyXG4gICAgLi4uYmFzZSxcclxuICAgIC4uLnJlc3QsXHJcbiAgICAuLi4ob25NdXRhdGUgIT09IHVuZGVmaW5lZCAmJiB7XHJcbiAgICAgIG9uTXV0YXRlOiBhc3luYyAodmFyaWFibGVzLCBjb250ZXh0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJldiA9IGF3YWl0IGJhc2Uub25NdXRhdGU/Lih2YXJpYWJsZXMsIGNvbnRleHQpO1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSBhd2FpdCBvcHRpb25zLm9uTXV0YXRlPy4odmFyaWFibGVzLCBjb250ZXh0KTtcclxuICAgICAgICByZXR1cm4gKG5leHQgIT09IHVuZGVmaW5lZCA/IG5leHQgOiBwcmV2KSBhcyBUQ29udGV4dDtcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gICAgLi4uKG9uU3VjY2VzcyAhPT0gdW5kZWZpbmVkICYmIHtcclxuICAgICAgb25TdWNjZXNzOiBhc3luYyAoZGF0YSwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGJhc2Uub25TdWNjZXNzPy4oZGF0YSwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCk7XHJcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblN1Y2Nlc3M/LihkYXRhLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KTtcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gICAgLi4uKG9uRXJyb3IgIT09IHVuZGVmaW5lZCAmJiB7XHJcbiAgICAgIG9uRXJyb3I6IGFzeW5jIChlcnJvciwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGJhc2Uub25FcnJvcj8uKGVycm9yLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KTtcclxuICAgICAgICBhd2FpdCBvcHRpb25zLm9uRXJyb3I/LihlcnJvciwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KSxcclxuICAgIC4uLihvblNldHRsZWQgIT09IHVuZGVmaW5lZCAmJiB7XHJcbiAgICAgIG9uU2V0dGxlZDogYXN5bmMgKGRhdGEsIGVycm9yLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KSA9PiB7XHJcbiAgICAgICAgYXdhaXQgYmFzZS5vblNldHRsZWQ/LihkYXRhLCBlcnJvciwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCk7XHJcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblNldHRsZWQ/LihcclxuICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgIHZhcmlhYmxlcyxcclxuICAgICAgICAgIG9uTXV0YXRlUmVzdWx0LFxyXG4gICAgICAgICAgY29udGV4dCxcclxuICAgICAgICApO1xyXG4gICAgICB9LFxyXG4gICAgfSksXHJcbiAgfTtcclxufVxyXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBQ0E7QUFBQTtBQUFBO0FBQUE7OztBQ0tPLFNBQVMsb0JBQXlELENBQ3ZFLE1BQ0EsU0FDeUQ7QUFBQSxFQUN6RCxJQUFJLENBQUM7QUFBQSxJQUFTLE9BQU87QUFBQSxFQUNyQixRQUFRLFdBQVcsU0FBUyxXQUFXLGFBQWEsU0FBUztBQUFBLEVBQzdELE9BQU87QUFBQSxPQUNGO0FBQUEsT0FDQTtBQUFBLE9BQ0MsYUFBYSxhQUFhO0FBQUEsTUFDNUIsVUFBVSxPQUFPLFdBQVcsWUFBWTtBQUFBLFFBQ3RDLE1BQU0sT0FBTyxNQUFNLEtBQUssV0FBVyxXQUFXLE9BQU87QUFBQSxRQUNyRCxNQUFNLE9BQU8sTUFBTSxRQUFRLFdBQVcsV0FBVyxPQUFPO0FBQUEsUUFDeEQsT0FBUSxTQUFTLFlBQVksT0FBTztBQUFBO0FBQUEsSUFFeEM7QUFBQSxPQUNJLGNBQWMsYUFBYTtBQUFBLE1BQzdCLFdBQVcsT0FBTyxNQUFNLFdBQVcsZ0JBQWdCLFlBQVk7QUFBQSxRQUM3RCxNQUFNLEtBQUssWUFBWSxNQUFNLFdBQVcsZ0JBQWdCLE9BQU87QUFBQSxRQUMvRCxNQUFNLFFBQVEsWUFBWSxNQUFNLFdBQVcsZ0JBQWdCLE9BQU87QUFBQTtBQUFBLElBRXRFO0FBQUEsT0FDSSxZQUFZLGFBQWE7QUFBQSxNQUMzQixTQUFTLE9BQU8sT0FBTyxXQUFXLGdCQUFnQixZQUFZO0FBQUEsUUFDNUQsTUFBTSxLQUFLLFVBQVUsT0FBTyxXQUFXLGdCQUFnQixPQUFPO0FBQUEsUUFDOUQsTUFBTSxRQUFRLFVBQVUsT0FBTyxXQUFXLGdCQUFnQixPQUFPO0FBQUE7QUFBQSxJQUVyRTtBQUFBLE9BQ0ksY0FBYyxhQUFhO0FBQUEsTUFDN0IsV0FBVyxPQUFPLE1BQU0sT0FBTyxXQUFXLGdCQUFnQixZQUFZO0FBQUEsUUFDcEUsTUFBTSxLQUFLLFlBQVksTUFBTSxPQUFPLFdBQVcsZ0JBQWdCLE9BQU87QUFBQSxRQUN0RSxNQUFNLFFBQVEsWUFDWixNQUNBLE9BQ0EsV0FDQSxnQkFDQSxPQUNGO0FBQUE7QUFBQSxJQUVKO0FBQUEsRUFDRjtBQUFBOzs7QURzQ0ssU0FBUyxrQkFLZixDQUNDLElBQ0EsWUFJd0Q7QUFBQSxFQUN4RCxPQUFPLENBQUMsWUFBWTtBQUFBLElBQ2xCLE1BQU0sY0FBYyxXQUFXO0FBQUEsSUFDL0IsT0FBTyxZQUFZO0FBQUEsU0FDZCxxQkFBcUIsYUFBYSxPQUFPO0FBQUEsTUFDNUMsWUFBWSxPQUFPLFlBQVk7QUFBQSxRQUU3QixNQUFNLGFBQ0osWUFBWSxXQUFXLFFBQVEsV0FBVyxZQUNyQyxHQUE4RSxRQUFRLE1BQU0sSUFDNUYsR0FBK0Q7QUFBQSxRQUd0RSxNQUFNLE9BQU8sVUFBVSxXQUFXLFFBQVEsU0FBUyxZQUFZLFFBQVEsT0FBUTtBQUFBLFFBQy9FLFFBQVEsTUFBTSxVQUFVLE1BQU0sV0FBVyxNQUFNLE9BQU87QUFBQSxRQUN0RCxJQUFJO0FBQUEsVUFBTyxNQUFNO0FBQUEsUUFDakIsT0FBTztBQUFBO0FBQUEsSUFFWCxDQUFDO0FBQUE7QUFBQTtBQW1DRSxTQUFTLGVBSWYsQ0FDQyxJQUNBLFlBRzhDO0FBQUEsRUFDOUMsT0FBTyxDQUFDLFNBQVMsWUFBWTtBQUFBLElBRTNCLE1BQU0sVUFDSixZQUFZLFdBQVcsUUFBUSxXQUFXLFlBQ3JDLEdBQW9FLFFBQVEsTUFBTSxJQUNsRixHQUFxRDtBQUFBLElBQzVELE1BQU0sY0FBYyxXQUFXLE9BQU87QUFBQSxJQUN0QyxPQUFPLFNBQVM7QUFBQSxTQUNYO0FBQUEsU0FDQTtBQUFBLE1BQ0gsU0FBUyxZQUFZO0FBQUEsUUFDbkIsUUFBUSxNQUFNLFVBQVUsTUFBTSxRQUFRLE9BQU87QUFBQSxRQUM3QyxJQUFJO0FBQUEsVUFBTyxNQUFNO0FBQUEsUUFDakIsT0FBTztBQUFBO0FBQUEsSUFFWCxDQUFDO0FBQUE7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkY5Mjk4Q0VDODhFN0E3QUI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
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.5",
4
+ "version": "0.3.7",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist"
@@ -41,10 +41,12 @@
41
41
  "peerDependencies": {
42
42
  "@elysiajs/eden": "^1.4.6",
43
43
  "@tanstack/react-query": "^5.90.20",
44
+ "react": "^19.2.4",
44
45
  "typescript": "^5"
45
46
  },
46
47
  "devDependencies": {
47
48
  "@types/bun": "latest",
49
+ "@types/react": "^19.2.14",
48
50
  "bunup": "^0.16.22",
49
51
  "elysia": "^1.4.22",
50
52
  "prettier": "^3.4.2"