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