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 +346 -74
- package/dist/index.d.ts +67 -45
- package/dist/index.js +31 -53
- package/package.json +1 -1
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.
|
|
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
|
-
##
|
|
11
|
+
## Quick Start
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
### 1. Define your Elysia API
|
|
14
14
|
|
|
15
15
|
```ts
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
47
|
+
### 2. Create Treaty Client
|
|
23
48
|
|
|
24
49
|
```ts
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
55
|
+
### 3. Create Type-Safe Hooks
|
|
40
56
|
|
|
41
57
|
```ts
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
115
|
+
### 4. Use in Components
|
|
49
116
|
|
|
50
117
|
```tsx
|
|
51
|
-
|
|
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
|
-
|
|
54
|
-
postMutation.mutate({ body: { name: "World" }, query: { q: "hello" } });
|
|
172
|
+
## API Reference
|
|
55
173
|
|
|
56
|
-
|
|
57
|
-
putMutation.mutate({ name: "World" });
|
|
174
|
+
### `treatyQueryHook`
|
|
58
175
|
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
67
|
-
|
|
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
|
-
###
|
|
226
|
+
### `treatyMutationHook`
|
|
227
|
+
|
|
228
|
+
Creates a type-safe React Query hook for mutations (POST, PUT, DELETE, etc.).
|
|
71
229
|
|
|
72
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
|
251
|
+
const useCreateUser = treatyMutationHook(createUser, () => {
|
|
85
252
|
const queryClient = useQueryClient();
|
|
86
253
|
return {
|
|
87
254
|
onSuccess: () => {
|
|
88
|
-
queryClient.invalidateQueries({ queryKey: ["
|
|
255
|
+
queryClient.invalidateQueries({ queryKey: ["users"] });
|
|
89
256
|
},
|
|
90
257
|
};
|
|
91
258
|
});
|
|
92
259
|
|
|
93
|
-
//
|
|
94
|
-
const
|
|
95
|
-
onSuccess: (data
|
|
96
|
-
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
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
|
|
109
|
-
return client.api.
|
|
317
|
+
function getUser(params: { id: string }) {
|
|
318
|
+
return client.api.users({ id: params.id }).get;
|
|
110
319
|
}
|
|
111
320
|
|
|
112
|
-
const
|
|
113
|
-
queryKey: ["
|
|
114
|
-
enabled: true,
|
|
321
|
+
const useGetUser = treatyQueryHook(getUser, (request) => ({
|
|
322
|
+
queryKey: ["users", request.params.id], // params is required here
|
|
115
323
|
}));
|
|
116
324
|
|
|
117
|
-
//
|
|
118
|
-
|
|
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
|
-
|
|
332
|
+
### Routes without Params
|
|
122
333
|
|
|
123
|
-
|
|
334
|
+
For routes without params, params are **absent** from the request type (not optional):
|
|
124
335
|
|
|
125
|
-
|
|
336
|
+
```ts
|
|
337
|
+
function getUsers() {
|
|
338
|
+
return client.api.users.get;
|
|
339
|
+
}
|
|
126
340
|
|
|
127
|
-
|
|
341
|
+
const useGetUsers = treatyQueryHook(getUsers, (request) => ({
|
|
342
|
+
queryKey: ["users"],
|
|
343
|
+
}));
|
|
128
344
|
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
361
|
+
const useCreateUser = treatyMutationHook(createUser, () => ({}));
|
|
133
362
|
|
|
134
|
-
|
|
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
|
-
|
|
406
|
+
## Options Merging
|
|
137
407
|
|
|
138
|
-
|
|
408
|
+
Options are merged in this order (later options override earlier ones):
|
|
139
409
|
|
|
140
|
-
|
|
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
|
-
|
|
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 {
|
|
3
|
-
type
|
|
4
|
-
type
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
} &
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
> =
|
|
32
|
-
type
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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 {
|
|
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
|
|
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 =
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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(
|
|
60
|
+
function treatyQueryHook(fn, useOptions) {
|
|
85
61
|
return (request, options) => {
|
|
86
|
-
const
|
|
87
|
-
const baseOptions =
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
...
|
|
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=
|
|
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==
|