eden2query 0.3.6 → 0.3.8

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,138 +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
+ ```
52
171
 
53
- const postMutation = useMutation(postOptions);
54
- postMutation.mutate({ body: { name: "World" }, query: { q: "hello" } });
172
+ ## API Reference
55
173
 
56
- const putMutation = useMutation(putOptions);
57
- putMutation.mutate({ name: "World" });
174
+ ### `treatyQueryHook`
58
175
 
59
- const deleteMutation = useMutation(deleteOptions);
60
- deleteMutation.mutate(); // no arguments
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
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`)
64
189
 
190
+ **Returns:** A hook function that accepts a request object and optional query options
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
+ });
68
224
  ```
69
225
 
70
- ### Hook builders: `treatyQueryHook` / `treatyMutationHook`
226
+ ### `treatyMutationHook`
227
+
228
+ Creates a type-safe React Query hook for mutations (POST, PUT, DELETE, etc.).
71
229
 
72
- Create reusable, pre-configured hooks for a Treaty endpoint. The first parameter is the **Treaty function**, and the second optional parameter is **`useOptions`** — a hook that returns default options (so you can use React hooks like `useQueryClient()`).
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
+ ```
73
237
 
74
- **Mutation hook** — pass the mutation function and optional `useOptions`:
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`)
75
241
 
242
+ **Returns:** A hook function that accepts optional mutation options
243
+
244
+ **Example:**
76
245
  ```ts
77
- function myMutationFn(variables: { name: string; q: string }) {
78
- return client.api.resource.post(
79
- { name: variables.name },
80
- { query: { q: variables.q } }
81
- );
246
+ // Without params, with body
247
+ function createUser() {
248
+ return client.api.users.post;
82
249
  }
83
250
 
84
- const useMutationHook = treatyMutationHook(myMutationFn, () => {
251
+ const useCreateUser = treatyMutationHook(createUser, () => {
85
252
  const queryClient = useQueryClient();
86
253
  return {
87
254
  onSuccess: () => {
88
- queryClient.invalidateQueries({ queryKey: ["resource"] });
255
+ queryClient.invalidateQueries({ queryKey: ["users"] });
89
256
  },
90
257
  };
91
258
  });
92
259
 
93
- // In a component
94
- const mutationResult = useMutationHook({
95
- onSuccess: (data, variables) => {
96
- console.log(data, variables);
97
- },
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" },
98
282
  });
99
- mutationResult.mutate({
100
- name: "World",
101
- q: "hello",
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
102
296
  });
103
297
  ```
104
298
 
105
- **Query hook** — pass the query function and optional `useOptions` that receives the `request` and returns options including `queryKey`:
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:
106
315
 
107
316
  ```ts
108
- function myQueryFn(request: { q: string }) {
109
- return client.api.resource.get({ query: { q: request.q } });
317
+ function getUser(params: { id: string }) {
318
+ return client.api.users({ id: params.id }).get;
110
319
  }
111
320
 
112
- const useQueryHook = treatyQueryHook(myQueryFn, (request) => ({
113
- queryKey: ["resource", request] as const,
114
- enabled: true,
321
+ const useGetUser = treatyQueryHook(getUser, (request) => ({
322
+ queryKey: ["users", request.params.id], // params is required here
115
323
  }));
116
324
 
117
- // In a component
118
- const queryResult = useQueryHook({ q: "hello" });
325
+ // Must provide params
326
+ useGetUser({
327
+ params: { id: "123" }, // ✅ Required - params is part of the request type
328
+ query: { name: "John" },
329
+ });
119
330
  ```
120
331
 
121
- Hooks accept the same options as `useQuery` / `useMutation`; call-time options are merged with the base options from `useOptions`. Callbacks are chained: base options run first, then `useOptions` callbacks, then call-site callbacks.
332
+ ### Routes without Params
122
333
 
123
- ## API
334
+ For routes without params, params are **absent** from the request type (not optional):
124
335
 
125
- **`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`.
336
+ ```ts
337
+ function getUsers() {
338
+ return client.api.users.get;
339
+ }
126
340
 
127
- **`treatyMutationOptions(fn, mutationOptions?)`** wraps a Treaty mutation into `mutationOptions`. Two shapes:
341
+ const useGetUsers = treatyQueryHook(getUsers, (request) => ({
342
+ queryKey: ["users"],
343
+ }));
128
344
 
129
- - **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.
130
- - **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`).
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
+ }
131
360
 
132
- The optional second argument accepts all `mutationOptions` fields except `mutationFn` (e.g. `onSuccess`, `onSettled`, `onMutate`).
361
+ const useCreateUser = treatyMutationHook(createUser, () => ({}));
133
362
 
134
- **`treatyMutationHook(mutationFn, useOptions?)`** — returns a hook that wraps `useMutation` with the given Treaty mutation function. **`mutationFn`** is the Treaty mutation function (e.g. `myMutationFn`). **`useOptions`** is optional; it's a hook that returns default mutation options (so you can use `useQueryClient()` for invalidation). The returned hook accepts the same options as `useMutation`; callbacks are chained (base → `useOptions` → call-site).
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
+ ```
135
405
 
136
- **`treatyQueryHook(queryFn, useOptions?)`** — returns a hook that wraps `useQuery` with the given Treaty query function. **`queryFn`** is the Treaty query function (e.g. `myQueryFn`). **`useOptions`** is optional; it's a function `(request) => ...` that receives the query request and returns default query options including `queryKey` (so you can use React hooks like `useQueryClient()`). The returned hook is called with `(request, options?)`; callbacks are chained (base → `useOptions` → call-site).
406
+ ## Options Merging
137
407
 
138
- **`InferTreatyQueryOptions<T>`** full `UseQueryOptions` type for a given Treaty query.
408
+ Options are merged in this order (later options override earlier ones):
139
409
 
140
- **`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
141
413
 
142
- 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.
143
415
 
144
416
  ## License
145
417
 
package/dist/index.d.ts CHANGED
@@ -1,48 +1,70 @@
1
1
  import { Treaty } from "@elysiajs/eden";
2
- import { QueryKey, UseMutationOptions, UseMutationResult, UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
3
- type TreatyFunction = (...request: any[]) => Promise<Treaty.TreatyResponse<Record<number, unknown>>>;
4
- type InferTreatyData<TFn extends TreatyFunction> = Awaited<ReturnType<TFn>>["data"];
5
- type InferTreatyError<TFn extends TreatyFunction> = Awaited<ReturnType<TFn>>["error"];
6
- type InferTreatyRequest<TFn extends TreatyFunction> = Parameters<TFn>[0];
7
- type InferTreatyMutationOptions<TFn extends TreatyFunction> = UseMutationOptions<InferTreatyData<TFn>, InferTreatyError<TFn>, InferTreatyRequest<TFn>>;
8
- type InferTreatyQueryOptions<
9
- TFn extends TreatyFunction,
10
- TQueryKey extends QueryKey = unknown[]
11
- > = UseQueryOptions<InferTreatyData<TFn>, InferTreatyError<TFn>, InferTreatyData<TFn>, TQueryKey>;
12
- declare function treatyMutationOptions<TFn extends TreatyFunction>(options: {
13
- mutationFn: TFn;
14
- } & Omit<InferTreatyMutationOptions<TFn>, "mutationFn">): InferTreatyMutationOptions<TFn>;
15
- declare function treatyQueryOptions<
16
- TFn extends TreatyFunction,
17
- const TQueryKey extends QueryKey
18
- >(options: {
19
- queryKey: TQueryKey;
20
- queryFn: TFn;
21
- } & Omit<InferTreatyQueryOptions<TFn, TQueryKey>, "queryKey" | "queryFn">): InferTreatyQueryOptions<TFn, TQueryKey>;
22
- type UseTreatyMutationResult<TFn extends TreatyFunction> = UseMutationResult<InferTreatyData<TFn>, InferTreatyError<TFn>, InferTreatyRequest<TFn>>;
23
- type UseTreatyQueryResult<
24
- TFn extends TreatyFunction,
25
- TQueryKey extends QueryKey = unknown[]
26
- > = UseQueryResult<InferTreatyData<TFn>, InferTreatyError<TFn>>;
27
- type TreatyMutationHookOptions<TFn extends TreatyFunction> = Omit<InferTreatyMutationOptions<TFn>, "mutationFn">;
28
- type TreatyQueryHookOptions<
29
- TFn extends TreatyFunction,
30
- TQueryKey extends QueryKey = unknown[]
31
- > = Omit<InferTreatyQueryOptions<TFn, TQueryKey>, "queryKey" | "queryFn">;
32
- type TreatyQueryHookUseOptions<
33
- TFn extends TreatyFunction,
34
- TQueryKey extends QueryKey = unknown[]
35
- > = {
36
- queryKey: TQueryKey;
37
- } & TreatyQueryHookOptions<TFn, TQueryKey>;
38
- type TreatyMutationHook<TFn extends TreatyFunction> = (options?: TreatyMutationHookOptions<TFn>) => UseTreatyMutationResult<TFn>;
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;
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"];
26
+ type TreatyMutationOptions<
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
+ });
59
+ type TreatyQueryOptions<TResponse extends Record<number, unknown>> = UseQueryOptions<TreatyData<TResponse>, TreatyError<TResponse>>;
39
60
  type TreatyQueryHook<
40
- TFn extends TreatyFunction,
41
- TQueryKey extends QueryKey = unknown[]
42
- > = (request: InferTreatyRequest<TFn>, options?: TreatyQueryHookOptions<TFn, TQueryKey>) => UseTreatyQueryResult<TFn, TQueryKey>;
43
- declare function treatyMutationHook<TFn extends TreatyFunction>(mutationFn: TFn, useOptions?: () => TreatyMutationHookOptions<TFn>): TreatyMutationHook<TFn>;
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>>;
44
65
  declare function treatyQueryHook<
45
- TFn extends TreatyFunction,
46
- TQueryKey extends QueryKey = QueryKey
47
- >(queryFn: TFn, useOptions?: (request: InferTreatyRequest<TFn>) => TreatyQueryHookUseOptions<TFn, TQueryKey>): TreatyQueryHook<TFn, TQueryKey>;
48
- export { treatyQueryOptions, treatyQueryHook, treatyMutationOptions, treatyMutationHook, InferTreatyQueryOptions, InferTreatyMutationOptions };
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,5 +1,8 @@
1
1
  // src/treaty.ts
2
- import { mutationOptions, queryOptions, useMutation, useQuery } from "@tanstack/react-query";
2
+ import {
3
+ useMutation,
4
+ useQuery
5
+ } from "@tanstack/react-query";
3
6
 
4
7
  // src/utils.ts
5
8
  function mergeMutationOptions(base, options) {
@@ -36,69 +39,44 @@ function mergeMutationOptions(base, options) {
36
39
  }
37
40
  };
38
41
  }
39
- function mergeQueryOptions(base, options) {
40
- if (!options)
41
- return base;
42
- return {
43
- ...base,
44
- ...options
45
- };
46
- }
47
42
 
48
43
  // src/treaty.ts
49
- function treatyMutationOptions(options) {
50
- const { mutationFn, ...rest } = options;
51
- return mutationOptions({
52
- ...rest,
53
- mutationFn: async (variables) => {
54
- const response = await mutationFn(variables);
55
- const { data, error } = response;
56
- if (error)
57
- throw error;
58
- return data;
59
- }
60
- });
61
- }
62
- function treatyQueryOptions(options) {
63
- const { queryFn, queryKey, ...rest } = options;
64
- return queryOptions({
65
- ...rest,
66
- queryKey,
67
- queryFn: async () => {
68
- const response = await queryFn();
69
- const { data, error } = response;
70
- if (error)
71
- throw error;
72
- return data;
73
- }
74
- });
75
- }
76
- function treatyMutationHook(mutationFn, useOptions) {
44
+ function treatyMutationHook(fn, useOptions) {
77
45
  return (options) => {
78
- const baseOptions = treatyMutationOptions({ mutationFn });
79
- const defaultOptions = useOptions?.();
80
- const merged = mergeMutationOptions(mergeMutationOptions(baseOptions, defaultOptions), options);
81
- return useMutation(merged);
46
+ const baseOptions = useOptions?.() ?? {};
47
+ return useMutation({
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
+ }
57
+ });
82
58
  };
83
59
  }
84
- function treatyQueryHook(queryFn, useOptions) {
60
+ function treatyQueryHook(fn, useOptions) {
85
61
  return (request, options) => {
86
- const defaultOptions = useOptions?.(request);
87
- const baseOptions = treatyQueryOptions({
88
- queryKey: defaultOptions?.queryKey ?? ["resource", request],
89
- queryFn: () => queryFn(request),
90
- ...defaultOptions
62
+ const queryFn = "params" in request && request.params !== undefined ? fn(request.params) : fn();
63
+ const baseOptions = useOptions(request);
64
+ return useQuery({
65
+ ...options,
66
+ ...baseOptions,
67
+ queryFn: async () => {
68
+ const { data, error } = await queryFn(request);
69
+ if (error)
70
+ throw error;
71
+ return data;
72
+ }
91
73
  });
92
- const merged = mergeQueryOptions(baseOptions, options);
93
- return useQuery(merged);
94
74
  };
95
75
  }
96
76
  export {
97
- treatyQueryOptions,
98
77
  treatyQueryHook,
99
- treatyMutationOptions,
100
78
  treatyMutationHook
101
79
  };
102
80
 
103
- //# debugId=3974E80E199B9F8064756E2164756E21
104
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFx0cmVhdHkudHMiLCAic3JjXFx1dGlscy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7IFRyZWF0eSB9IGZyb20gXCJAZWx5c2lhanMvZWRlblwiO1xyXG5pbXBvcnQgeyBtdXRhdGlvbk9wdGlvbnMsIHF1ZXJ5T3B0aW9ucywgdXNlTXV0YXRpb24sIHVzZVF1ZXJ5LCB0eXBlIFF1ZXJ5S2V5LCB0eXBlIFVzZU11dGF0aW9uT3B0aW9ucywgdHlwZSBVc2VNdXRhdGlvblJlc3VsdCwgdHlwZSBVc2VRdWVyeU9wdGlvbnMsIHR5cGUgVXNlUXVlcnlSZXN1bHQgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5XCI7XHJcbmltcG9ydCB7IG1lcmdlTXV0YXRpb25PcHRpb25zLCBtZXJnZVF1ZXJ5T3B0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG50eXBlIFRyZWF0eUZ1bmN0aW9uID0gKC4uLnJlcXVlc3Q6IGFueVtdKSA9PiBcclxuICBQcm9taXNlPFRyZWF0eS5UcmVhdHlSZXNwb25zZTxSZWNvcmQ8bnVtYmVyLCB1bmtub3duPj4+O1xyXG5cclxuZXhwb3J0IHR5cGUgSW5mZXJUcmVhdHlEYXRhPFxyXG4gIFRGbiBleHRlbmRzIFRyZWF0eUZ1bmN0aW9uLFxyXG4+ID0gQXdhaXRlZDxSZXR1cm5UeXBlPFRGbj4+W1wiZGF0YVwiXTtcclxuXHJcbmV4cG9ydCB0eXBlIEluZmVyVHJlYXR5RXJyb3I8XHJcbiAgVEZuIGV4dGVuZHMgVHJlYXR5RnVuY3Rpb24sXHJcbj4gPSBBd2FpdGVkPFJldHVyblR5cGU8VEZuPj5bXCJlcnJvclwiXTtcclxuXHJcbmV4cG9ydCB0eXBlIEluZmVyVHJlYXR5UmVxdWVzdDxcclxuICBURm4gZXh0ZW5kcyBUcmVhdHlGdW5jdGlvbixcclxuPiA9IFBhcmFtZXRlcnM8VEZuPlswXTtcclxuXHJcbmV4cG9ydCB0eXBlIEluZmVyVHJlYXR5TXV0YXRpb25PcHRpb25zPFxyXG4gIFRGbiBleHRlbmRzIFRyZWF0eUZ1bmN0aW9uLFxyXG4+ID0gVXNlTXV0YXRpb25PcHRpb25zPFxyXG4gIEluZmVyVHJlYXR5RGF0YTxURm4+LFxyXG4gIEluZmVyVHJlYXR5RXJyb3I8VEZuPixcclxuICBJbmZlclRyZWF0eVJlcXVlc3Q8VEZuPlxyXG4+O1xyXG5cclxuZXhwb3J0IHR5cGUgSW5mZXJUcmVhdHlRdWVyeU9wdGlvbnM8XHJcbiAgVEZuIGV4dGVuZHMgVHJlYXR5RnVuY3Rpb24sXHJcbiAgVFF1ZXJ5S2V5IGV4dGVuZHMgUXVlcnlLZXkgPSB1bmtub3duW10sXHJcbj4gPSBVc2VRdWVyeU9wdGlvbnM8XHJcbiAgSW5mZXJUcmVhdHlEYXRhPFRGbj4sXHJcbiAgSW5mZXJUcmVhdHlFcnJvcjxURm4+LFxyXG4gIEluZmVyVHJlYXR5RGF0YTxURm4+LFxyXG4gIFRRdWVyeUtleVxyXG4+O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRyZWF0eU11dGF0aW9uT3B0aW9uczxURm4gZXh0ZW5kcyBUcmVhdHlGdW5jdGlvbj4oXHJcbiAgb3B0aW9uczoge1xyXG4gICAgbXV0YXRpb25GbjogVEZuO1xyXG4gIH0gJiBPbWl0PFxyXG4gICAgSW5mZXJUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VEZuPixcclxuICAgIFwibXV0YXRpb25GblwiXHJcbiAgPlxyXG4pOiBJbmZlclRyZWF0eU11dGF0aW9uT3B0aW9uczxURm4+IHtcclxuICB0eXBlIFREYXRhID0gSW5mZXJUcmVhdHlEYXRhPFRGbj47XHJcbiAgdHlwZSBURXJyb3IgPSBJbmZlclRyZWF0eUVycm9yPFRGbj47XHJcbiAgdHlwZSBUVmFyaWFibGVzID0gSW5mZXJUcmVhdHlSZXF1ZXN0PFRGbj47XHJcbiAgY29uc3QgeyBtdXRhdGlvbkZuLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xyXG4gIHJldHVybiBtdXRhdGlvbk9wdGlvbnM8VERhdGEsIFRFcnJvciwgVFZhcmlhYmxlcz4oe1xyXG4gICAgLi4ucmVzdCxcclxuICAgIG11dGF0aW9uRm46IGFzeW5jICh2YXJpYWJsZXMpID0+IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtdXRhdGlvbkZuKHZhcmlhYmxlcyk7XHJcbiAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IHJlc3BvbnNlO1xyXG4gICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmVhdHlRdWVyeU9wdGlvbnM8XHJcbiAgVEZuIGV4dGVuZHMgVHJlYXR5RnVuY3Rpb24sXHJcbiAgY29uc3QgVFF1ZXJ5S2V5IGV4dGVuZHMgUXVlcnlLZXksXHJcbj4oXHJcbiAgb3B0aW9uczoge1xyXG4gICAgcXVlcnlLZXk6IFRRdWVyeUtleTtcclxuICAgIHF1ZXJ5Rm46IFRGbjtcclxuICB9ICYgT21pdDxcclxuICAgIEluZmVyVHJlYXR5UXVlcnlPcHRpb25zPFRGbiwgVFF1ZXJ5S2V5PixcclxuICAgIFwicXVlcnlLZXlcIiB8IFwicXVlcnlGblwiXHJcbiAgPlxyXG4pOiBJbmZlclRyZWF0eVF1ZXJ5T3B0aW9uczxURm4sIFRRdWVyeUtleT4ge1xyXG4gIHR5cGUgVERhdGEgPSBJbmZlclRyZWF0eURhdGE8VEZuPjtcclxuICB0eXBlIFRFcnJvciA9IEluZmVyVHJlYXR5RXJyb3I8VEZuPjtcclxuICBjb25zdCB7IHF1ZXJ5Rm4sIHF1ZXJ5S2V5LCAuLi5yZXN0IH0gPSBvcHRpb25zO1xyXG4gIHJldHVybiBxdWVyeU9wdGlvbnM8VERhdGEsIFRFcnJvciwgVERhdGEsIFRRdWVyeUtleT4oe1xyXG4gICAgLi4ucmVzdCxcclxuICAgIHF1ZXJ5S2V5LFxyXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHF1ZXJ5Rm4oKTtcclxuICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzcG9uc2U7XHJcbiAgICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVXNlVHJlYXR5TXV0YXRpb25SZXN1bHQ8VEZuIGV4dGVuZHMgVHJlYXR5RnVuY3Rpb24+ID0gVXNlTXV0YXRpb25SZXN1bHQ8XHJcbiAgSW5mZXJUcmVhdHlEYXRhPFRGbj4sXHJcbiAgSW5mZXJUcmVhdHlFcnJvcjxURm4+LFxyXG4gIEluZmVyVHJlYXR5UmVxdWVzdDxURm4+XHJcbj47XHJcblxyXG5leHBvcnQgdHlwZSBVc2VUcmVhdHlRdWVyeVJlc3VsdDxcclxuICBURm4gZXh0ZW5kcyBUcmVhdHlGdW5jdGlvbixcclxuICBUUXVlcnlLZXkgZXh0ZW5kcyBRdWVyeUtleSA9IHVua25vd25bXSxcclxuPiA9IFVzZVF1ZXJ5UmVzdWx0PFxyXG4gIEluZmVyVHJlYXR5RGF0YTxURm4+LFxyXG4gIEluZmVyVHJlYXR5RXJyb3I8VEZuPlxyXG4+O1xyXG5cclxuZXhwb3J0IHR5cGUgVHJlYXR5TXV0YXRpb25Ib29rT3B0aW9uczxURm4gZXh0ZW5kcyBUcmVhdHlGdW5jdGlvbj4gPSBPbWl0PFxyXG4gIEluZmVyVHJlYXR5TXV0YXRpb25PcHRpb25zPFRGbj4sXHJcbiAgXCJtdXRhdGlvbkZuXCJcclxuPjtcclxuXHJcbmV4cG9ydCB0eXBlIFRyZWF0eVF1ZXJ5SG9va09wdGlvbnM8XHJcbiAgVEZuIGV4dGVuZHMgVHJlYXR5RnVuY3Rpb24sXHJcbiAgVFF1ZXJ5S2V5IGV4dGVuZHMgUXVlcnlLZXkgPSB1bmtub3duW10sXHJcbj4gPSBPbWl0PFxyXG4gIEluZmVyVHJlYXR5UXVlcnlPcHRpb25zPFRGbiwgVFF1ZXJ5S2V5PixcclxuICBcInF1ZXJ5S2V5XCIgfCBcInF1ZXJ5Rm5cIlxyXG4+O1xyXG5cclxuZXhwb3J0IHR5cGUgVHJlYXR5UXVlcnlIb29rVXNlT3B0aW9uczxcclxuICBURm4gZXh0ZW5kcyBUcmVhdHlGdW5jdGlvbixcclxuICBUUXVlcnlLZXkgZXh0ZW5kcyBRdWVyeUtleSA9IHVua25vd25bXSxcclxuPiA9IHtcclxuICBxdWVyeUtleTogVFF1ZXJ5S2V5O1xyXG59ICYgVHJlYXR5UXVlcnlIb29rT3B0aW9uczxURm4sIFRRdWVyeUtleT47XHJcblxyXG5leHBvcnQgdHlwZSBUcmVhdHlNdXRhdGlvbkhvb2s8VEZuIGV4dGVuZHMgVHJlYXR5RnVuY3Rpb24+ID0gKFxyXG4gIG9wdGlvbnM/OiBUcmVhdHlNdXRhdGlvbkhvb2tPcHRpb25zPFRGbj5cclxuKSA9PiBVc2VUcmVhdHlNdXRhdGlvblJlc3VsdDxURm4+O1xyXG5cclxuZXhwb3J0IHR5cGUgVHJlYXR5UXVlcnlIb29rPFxyXG4gIFRGbiBleHRlbmRzIFRyZWF0eUZ1bmN0aW9uLFxyXG4gIFRRdWVyeUtleSBleHRlbmRzIFF1ZXJ5S2V5ID0gdW5rbm93bltdLFxyXG4+ID0gKFxyXG4gIHJlcXVlc3Q6IEluZmVyVHJlYXR5UmVxdWVzdDxURm4+LFxyXG4gIG9wdGlvbnM/OiBUcmVhdHlRdWVyeUhvb2tPcHRpb25zPFRGbiwgVFF1ZXJ5S2V5PlxyXG4pID0+IFVzZVRyZWF0eVF1ZXJ5UmVzdWx0PFRGbiwgVFF1ZXJ5S2V5PjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmVhdHlNdXRhdGlvbkhvb2s8VEZuIGV4dGVuZHMgVHJlYXR5RnVuY3Rpb24+KFxyXG4gIG11dGF0aW9uRm46IFRGbixcclxuICB1c2VPcHRpb25zPzogKCkgPT4gVHJlYXR5TXV0YXRpb25Ib29rT3B0aW9uczxURm4+XHJcbik6IFRyZWF0eU11dGF0aW9uSG9vazxURm4+IHtcclxuICByZXR1cm4gKG9wdGlvbnMpID0+IHtcclxuICAgIGNvbnN0IGJhc2VPcHRpb25zID0gdHJlYXR5TXV0YXRpb25PcHRpb25zKHsgbXV0YXRpb25GbiB9KTtcclxuICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gdXNlT3B0aW9ucz8uKCk7XHJcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZU11dGF0aW9uT3B0aW9ucyhcclxuICAgICAgbWVyZ2VNdXRhdGlvbk9wdGlvbnMoYmFzZU9wdGlvbnMsIGRlZmF1bHRPcHRpb25zKSxcclxuICAgICAgb3B0aW9uc1xyXG4gICAgKTtcclxuICAgIHJldHVybiB1c2VNdXRhdGlvbihtZXJnZWQpO1xyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmVhdHlRdWVyeUhvb2s8XHJcbiAgVEZuIGV4dGVuZHMgVHJlYXR5RnVuY3Rpb24sXHJcbiAgVFF1ZXJ5S2V5IGV4dGVuZHMgUXVlcnlLZXkgPSBRdWVyeUtleSxcclxuPihcclxuICBxdWVyeUZuOiBURm4sXHJcbiAgdXNlT3B0aW9ucz86IChcclxuICAgIHJlcXVlc3Q6IEluZmVyVHJlYXR5UmVxdWVzdDxURm4+XHJcbiAgKSA9PiBUcmVhdHlRdWVyeUhvb2tVc2VPcHRpb25zPFRGbiwgVFF1ZXJ5S2V5PlxyXG4pOiBUcmVhdHlRdWVyeUhvb2s8VEZuLCBUUXVlcnlLZXk+IHtcclxuICByZXR1cm4gKHJlcXVlc3QsIG9wdGlvbnMpID0+IHtcclxuICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gdXNlT3B0aW9ucz8uKHJlcXVlc3QpO1xyXG4gICAgY29uc3QgYmFzZU9wdGlvbnMgPSB0cmVhdHlRdWVyeU9wdGlvbnMoe1xyXG4gICAgICBxdWVyeUtleTogKGRlZmF1bHRPcHRpb25zPy5xdWVyeUtleSA/PyAoW1wicmVzb3VyY2VcIiwgcmVxdWVzdF0gYXMgdW5rbm93bikpIGFzIFRRdWVyeUtleSxcclxuICAgICAgcXVlcnlGbjogKCgpID0+IHF1ZXJ5Rm4ocmVxdWVzdCkpIGFzIFRGbixcclxuICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUXVlcnlPcHRpb25zKFxyXG4gICAgICBiYXNlT3B0aW9ucyxcclxuICAgICAgb3B0aW9ucyBhcyBVc2VRdWVyeU9wdGlvbnM8XHJcbiAgICAgICAgSW5mZXJUcmVhdHlEYXRhPFRGbj4sXHJcbiAgICAgICAgSW5mZXJUcmVhdHlFcnJvcjxURm4+LFxyXG4gICAgICAgIEluZmVyVHJlYXR5RGF0YTxURm4+LFxyXG4gICAgICAgIFRRdWVyeUtleVxyXG4gICAgICA+IHwgdW5kZWZpbmVkXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHVzZVF1ZXJ5KG1lcmdlZCk7XHJcbiAgfTtcclxufSIsCiAgICAiaW1wb3J0IHR5cGUgeyBRdWVyeUtleSwgVXNlTXV0YXRpb25PcHRpb25zLCBVc2VRdWVyeU9wdGlvbnMgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5XCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VNdXRhdGlvbk9wdGlvbnM8VERhdGEsIFRFcnJvciwgVFZhcmlhYmxlcywgVENvbnRleHQ+KFxyXG4gIGJhc2U6IFVzZU11dGF0aW9uT3B0aW9uczxURGF0YSwgVEVycm9yLCBUVmFyaWFibGVzLCBUQ29udGV4dD4sXHJcbiAgb3B0aW9ucz86IFBhcnRpYWw8VXNlTXV0YXRpb25PcHRpb25zPFREYXRhLCBURXJyb3IsIFRWYXJpYWJsZXMsIFRDb250ZXh0Pj5cclxuKTogVXNlTXV0YXRpb25PcHRpb25zPFREYXRhLCBURXJyb3IsIFRWYXJpYWJsZXMsIFRDb250ZXh0PiB7XHJcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gYmFzZTtcclxuICBjb25zdCB7IG9uU3VjY2Vzcywgb25FcnJvciwgb25TZXR0bGVkLCBvbk11dGF0ZSwgLi4ucmVzdCB9ID0gb3B0aW9ucztcclxuICByZXR1cm4ge1xyXG4gICAgLi4uYmFzZSxcclxuICAgIC4uLnJlc3QsXHJcbiAgICAuLi4ob25NdXRhdGUgIT09IHVuZGVmaW5lZCAmJiB7XHJcbiAgICAgIG9uTXV0YXRlOiBhc3luYyAodmFyaWFibGVzLCBjb250ZXh0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJldiA9IGF3YWl0IGJhc2Uub25NdXRhdGU/Lih2YXJpYWJsZXMsIGNvbnRleHQpO1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSBhd2FpdCBvcHRpb25zLm9uTXV0YXRlPy4odmFyaWFibGVzLCBjb250ZXh0KTtcclxuICAgICAgICByZXR1cm4gKG5leHQgIT09IHVuZGVmaW5lZCA/IG5leHQgOiBwcmV2KSBhcyBUQ29udGV4dDtcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gICAgLi4uKG9uU3VjY2VzcyAhPT0gdW5kZWZpbmVkICYmIHtcclxuICAgICAgb25TdWNjZXNzOiBhc3luYyAoZGF0YSwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGJhc2Uub25TdWNjZXNzPy4oZGF0YSwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCk7XHJcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblN1Y2Nlc3M/LihkYXRhLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KTtcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gICAgLi4uKG9uRXJyb3IgIT09IHVuZGVmaW5lZCAmJiB7XHJcbiAgICAgIG9uRXJyb3I6IGFzeW5jIChlcnJvciwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGJhc2Uub25FcnJvcj8uKGVycm9yLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KTtcclxuICAgICAgICBhd2FpdCBvcHRpb25zLm9uRXJyb3I/LihlcnJvciwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KSxcclxuICAgIC4uLihvblNldHRsZWQgIT09IHVuZGVmaW5lZCAmJiB7XHJcbiAgICAgIG9uU2V0dGxlZDogYXN5bmMgKGRhdGEsIGVycm9yLCB2YXJpYWJsZXMsIG9uTXV0YXRlUmVzdWx0LCBjb250ZXh0KSA9PiB7XHJcbiAgICAgICAgYXdhaXQgYmFzZS5vblNldHRsZWQ/LihkYXRhLCBlcnJvciwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCk7XHJcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblNldHRsZWQ/LihkYXRhLCBlcnJvciwgdmFyaWFibGVzLCBvbk11dGF0ZVJlc3VsdCwgY29udGV4dCk7XHJcbiAgICAgIH0sXHJcbiAgICB9KSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VRdWVyeU9wdGlvbnM8VERhdGEsIFRFcnJvciwgVFF1ZXJ5S2V5IGV4dGVuZHMgUXVlcnlLZXk+KFxyXG4gIGJhc2U6IFVzZVF1ZXJ5T3B0aW9uczxURGF0YSwgVEVycm9yLCBURGF0YSwgVFF1ZXJ5S2V5PixcclxuICBvcHRpb25zPzogUGFydGlhbDxVc2VRdWVyeU9wdGlvbnM8VERhdGEsIFRFcnJvciwgVERhdGEsIFRRdWVyeUtleT4+XHJcbik6IFVzZVF1ZXJ5T3B0aW9uczxURGF0YSwgVEVycm9yLCBURGF0YSwgVFF1ZXJ5S2V5PiB7XHJcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gYmFzZTtcclxuICByZXR1cm4ge1xyXG4gICAgLi4uYmFzZSxcclxuICAgIC4uLm9wdGlvbnMsXHJcbiAgfTtcclxufVxyXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBQ0E7OztBQ0NPLFNBQVMsb0JBQXlELENBQ3ZFLE1BQ0EsU0FDeUQ7QUFBQSxFQUN6RCxJQUFJLENBQUM7QUFBQSxJQUFTLE9BQU87QUFBQSxFQUNyQixRQUFRLFdBQVcsU0FBUyxXQUFXLGFBQWEsU0FBUztBQUFBLEVBQzdELE9BQU87QUFBQSxPQUNGO0FBQUEsT0FDQTtBQUFBLE9BQ0MsYUFBYSxhQUFhO0FBQUEsTUFDNUIsVUFBVSxPQUFPLFdBQVcsWUFBWTtBQUFBLFFBQ3RDLE1BQU0sT0FBTyxNQUFNLEtBQUssV0FBVyxXQUFXLE9BQU87QUFBQSxRQUNyRCxNQUFNLE9BQU8sTUFBTSxRQUFRLFdBQVcsV0FBVyxPQUFPO0FBQUEsUUFDeEQsT0FBUSxTQUFTLFlBQVksT0FBTztBQUFBO0FBQUEsSUFFeEM7QUFBQSxPQUNJLGNBQWMsYUFBYTtBQUFB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
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==
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.6",
4
+ "version": "0.3.8",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist"