eden2query 0.3.2 → 0.3.4
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 +54 -0
- package/dist/index.d.ts +18 -2
- package/dist/index.js +26 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -67,6 +67,56 @@ const queryClient = new QueryClient();
|
|
|
67
67
|
queryClient.prefetchQuery(getOptions);
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
+
### Hook builders: `createTreatyQueryHook` / `createTreatyMutationHook`
|
|
71
|
+
|
|
72
|
+
Create reusable, pre-configured hooks for a Treaty endpoint. The second parameter is **`useOptions`**: either a static options object or a **function** that returns options (so you can use React hooks like `useQueryClient()` inside when the hook runs).
|
|
73
|
+
|
|
74
|
+
**Query hook** — pass the Treaty GET thunk and `useOptions` (object or function):
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
const useResource = createTreatyQueryHook(
|
|
78
|
+
() => client.api.resource.get({ query: { q: "hello" } }),
|
|
79
|
+
{ queryKey: ["resource"] },
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
// In a component
|
|
83
|
+
const { data } = useResource(); // or useResource({ refetchInterval: 1000 })
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Mutation hook** — pass the Treaty mutation and optional `useOptions`. Use a function when you need React hooks (e.g. for invalidation):
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
// Static useOptions
|
|
90
|
+
const usePostResource = createTreatyMutationHook(
|
|
91
|
+
(vars: { body: { name: string } }) => client.api.resource.post(vars.body),
|
|
92
|
+
{ onSuccess: () => console.log("Success") },
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
// useOptions as function — use React hooks inside (e.g. useQueryClient)
|
|
96
|
+
const usePostResourceWithInvalidation = createTreatyMutationHook(
|
|
97
|
+
(vars: { body: { name: string } }) => client.api.resource.post(vars.body),
|
|
98
|
+
() => {
|
|
99
|
+
const queryClient = useQueryClient();
|
|
100
|
+
return {
|
|
101
|
+
onSettled() {
|
|
102
|
+
queryClient.invalidateQueries({ queryKey: ["resource"] });
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
// In a component
|
|
109
|
+
const postMutation = usePostResource();
|
|
110
|
+
postMutation.mutate({ body: { name: "World" } });
|
|
111
|
+
|
|
112
|
+
const postWithInvalidation = usePostResourceWithInvalidation({
|
|
113
|
+
onSuccess: () => console.log("Success"),
|
|
114
|
+
});
|
|
115
|
+
postWithInvalidation.mutate({ body: { name: "World" } });
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Hooks accept the same options as `useQuery` / `useMutation`; call-time options are merged with the base options from `useOptions`.
|
|
119
|
+
|
|
70
120
|
## API
|
|
71
121
|
|
|
72
122
|
**`treatyQueryOptions(fn, queryOptions)`** — wraps a Treaty GET call into `queryOptions`. `fn` is a **thunk** (zero-argument function) that calls the Treaty GET, e.g. `() => client.api.resource.get({ query: { ... } })`. The second argument accepts all `queryOptions` fields except `queryFn`. Extracts `data` from the response and throws on `error`.
|
|
@@ -78,6 +128,10 @@ queryClient.prefetchQuery(getOptions);
|
|
|
78
128
|
|
|
79
129
|
The optional second argument accepts all `mutationOptions` fields except `mutationFn` (e.g. `onSuccess`, `onSettled`, `onMutate`).
|
|
80
130
|
|
|
131
|
+
**`createTreatyQueryHook(fn, useOptions)`** — returns a hook that wraps `useQuery` with the given Treaty GET thunk. **`useOptions`** is either a query options object (e.g. `{ queryKey: [...] }`) or a function that returns options; the function is called when the hook runs, so you can use React hooks (e.g. `useQueryClient()`) inside it. The returned hook accepts the same options as `useQuery`; call-time options are merged with the base options.
|
|
132
|
+
|
|
133
|
+
**`createTreatyMutationHook(fn, useOptions?)`** — returns a hook that wraps `useMutation` with the given Treaty mutation. Same fn shapes as `treatyMutationOptions` (no-arg or with variables). **`useOptions`** is optional; it can be a mutation options object or a function that returns options (so you can use `useQueryClient()` etc. for invalidation). The returned hook accepts the same options as `useMutation`.
|
|
134
|
+
|
|
81
135
|
**`InferTreatyQueryOptions<T>`** — full `UseQueryOptions` type for a given Treaty query.
|
|
82
136
|
|
|
83
137
|
**`InferTreatyMutationOptions<TVariables, TResponse>`** — full `UseMutationOptions` type for a given Treaty mutation.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Treaty } from "@elysiajs/eden";
|
|
2
|
-
import { UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
|
|
2
|
+
import { UseMutationOptions, UseMutationResult, UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
|
|
3
3
|
type TreatyResponse = Record<number, unknown>;
|
|
4
4
|
type TreatyFunctionWithoutParams<TResponse extends TreatyResponse = TreatyResponse> = () => Promise<Treaty.TreatyResponse<TResponse>>;
|
|
5
5
|
type TreatyFunctionWithParams<
|
|
@@ -12,11 +12,27 @@ type TreatyMutationOptions<
|
|
|
12
12
|
TVariables,
|
|
13
13
|
TResponse extends TreatyResponse
|
|
14
14
|
> = UseMutationOptions<TreatyData<TResponse>, TreatyError<TResponse>, TVariables>;
|
|
15
|
+
type UseTreatyMutationResult<
|
|
16
|
+
TVariables,
|
|
17
|
+
TResponse extends TreatyResponse
|
|
18
|
+
> = (UseMutationResult<TreatyData<TResponse>, TreatyError<TResponse>, TVariables>);
|
|
19
|
+
type UseTreatyQueryResult<TResponse extends TreatyResponse> = (UseQueryResult<TreatyData<TResponse>, TreatyError<TResponse>>);
|
|
15
20
|
type TreatyQueryOptions<TResponse extends Record<number, unknown>> = UseQueryOptions<TreatyData<TResponse>, TreatyError<TResponse>>;
|
|
21
|
+
type UseTreatyMutationHook<
|
|
22
|
+
TVariables,
|
|
23
|
+
TResponse extends TreatyResponse
|
|
24
|
+
> = ((options: Partial<Omit<TreatyMutationOptions<TVariables, TResponse>, "mutationFn">>) => UseTreatyMutationResult<TVariables, TResponse>);
|
|
25
|
+
type UseTreatyQueryHook<TResponse extends TreatyResponse> = ((options: Partial<Omit<TreatyQueryOptions<TResponse>, "queryFn">>) => UseTreatyQueryResult<TResponse>);
|
|
16
26
|
declare function treatyMutationOptions<TResponse extends TreatyResponse>(fn: TreatyFunctionWithoutParams<TResponse>, options?: Omit<TreatyMutationOptions<void, TResponse>, "mutationFn">): TreatyMutationOptions<void, TResponse>;
|
|
17
27
|
declare function treatyMutationOptions<
|
|
18
28
|
TVariables,
|
|
19
29
|
TResponse extends TreatyResponse
|
|
20
30
|
>(fn: TreatyFunctionWithParams<TVariables, TResponse>, options?: Omit<TreatyMutationOptions<TVariables, TResponse>, "mutationFn">): TreatyMutationOptions<TVariables, TResponse>;
|
|
21
31
|
declare function treatyQueryOptions<TResponse extends TreatyResponse = TreatyResponse>(fn: TreatyFunctionWithoutParams<TResponse>, options: Omit<TreatyQueryOptions<TResponse>, "queryFn">): TreatyQueryOptions<TResponse>;
|
|
22
|
-
|
|
32
|
+
declare function createTreatyMutationHook<TResponse extends TreatyResponse>(fn: TreatyFunctionWithoutParams<TResponse>, useOptions?: (Omit<TreatyMutationOptions<void, TResponse>, "mutationFn"> | (() => Omit<TreatyMutationOptions<void, TResponse>, "mutationFn">))): UseTreatyMutationHook<void, TResponse>;
|
|
33
|
+
declare function createTreatyMutationHook<
|
|
34
|
+
TVariables,
|
|
35
|
+
TResponse extends TreatyResponse
|
|
36
|
+
>(fn: TreatyFunctionWithParams<TVariables, TResponse>, useOptions?: (Omit<TreatyMutationOptions<TVariables, TResponse>, "mutationFn"> | (() => Omit<TreatyMutationOptions<TVariables, TResponse>, "mutationFn">))): UseTreatyMutationHook<TVariables, TResponse>;
|
|
37
|
+
declare function createTreatyQueryHook<TResponse extends TreatyResponse>(fn: TreatyFunctionWithoutParams<TResponse>, useOptions: (Omit<TreatyQueryOptions<TResponse>, "queryFn"> | (() => Omit<TreatyQueryOptions<TResponse>, "queryFn">))): UseTreatyQueryHook<TResponse>;
|
|
38
|
+
export { treatyQueryOptions, treatyMutationOptions, createTreatyQueryHook, createTreatyMutationHook, UseTreatyQueryHook, UseTreatyMutationHook, TreatyQueryOptions, TreatyMutationOptions, TreatyError, TreatyData };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// src/lib.ts
|
|
2
2
|
import {
|
|
3
3
|
mutationOptions,
|
|
4
|
-
queryOptions
|
|
4
|
+
queryOptions,
|
|
5
|
+
useMutation,
|
|
6
|
+
useQuery
|
|
5
7
|
} from "@tanstack/react-query";
|
|
6
8
|
function treatyMutationOptions(fn, options) {
|
|
7
9
|
return mutationOptions({
|
|
@@ -27,10 +29,30 @@ function treatyQueryOptions(fn, options) {
|
|
|
27
29
|
}
|
|
28
30
|
});
|
|
29
31
|
}
|
|
32
|
+
function createTreatyMutationHook(fn, useOptions) {
|
|
33
|
+
return (options) => {
|
|
34
|
+
const initOptions = typeof useOptions === "function" ? useOptions() : useOptions;
|
|
35
|
+
return useMutation({
|
|
36
|
+
...treatyMutationOptions(fn, initOptions),
|
|
37
|
+
...options
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function createTreatyQueryHook(fn, useOptions) {
|
|
42
|
+
return (options) => {
|
|
43
|
+
const initOptions = typeof useOptions === "function" ? useOptions() : useOptions;
|
|
44
|
+
return useQuery({
|
|
45
|
+
...treatyQueryOptions(fn, initOptions),
|
|
46
|
+
...options
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
}
|
|
30
50
|
export {
|
|
31
51
|
treatyQueryOptions,
|
|
32
|
-
treatyMutationOptions
|
|
52
|
+
treatyMutationOptions,
|
|
53
|
+
createTreatyQueryHook,
|
|
54
|
+
createTreatyMutationHook
|
|
33
55
|
};
|
|
34
56
|
|
|
35
|
-
//# debugId=
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# debugId=7C7D36173641BA3264756E2164756E21
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFxsaWIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHR5cGUgeyBUcmVhdHkgfSBmcm9tIFwiQGVseXNpYWpzL2VkZW5cIjtcclxuaW1wb3J0IHtcclxuICBtdXRhdGlvbk9wdGlvbnMsXHJcbiAgcXVlcnlPcHRpb25zLFxyXG4gIHVzZU11dGF0aW9uLFxyXG4gIHVzZVF1ZXJ5LFxyXG4gIHR5cGUgVXNlTXV0YXRpb25PcHRpb25zLFxyXG4gIHR5cGUgVXNlTXV0YXRpb25SZXN1bHQsXHJcbiAgdHlwZSBVc2VRdWVyeU9wdGlvbnMsXHJcbiAgdHlwZSBVc2VRdWVyeVJlc3VsdCxcclxufSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5XCI7XHJcblxyXG50eXBlIFRyZWF0eVJlc3BvbnNlID0gUmVjb3JkPG51bWJlciwgdW5rbm93bj47XHJcblxyXG5leHBvcnQgdHlwZSBUcmVhdHlGdW5jdGlvbldpdGhvdXRQYXJhbXM8XHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UgPSBUcmVhdHlSZXNwb25zZSxcclxuPiA9ICgpID0+IFByb21pc2U8VHJlYXR5LlRyZWF0eVJlc3BvbnNlPFRSZXNwb25zZT4+O1xyXG5cclxuZXhwb3J0IHR5cGUgVHJlYXR5RnVuY3Rpb25XaXRoUGFyYW1zPFxyXG4gIFRQYXJhbXMsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UsXHJcbj4gPSAocGFyYW1zOiBUUGFyYW1zKSA9PiBQcm9taXNlPFRyZWF0eS5UcmVhdHlSZXNwb25zZTxUUmVzcG9uc2U+PjtcclxuXHJcbmV4cG9ydCB0eXBlIFRyZWF0eUZ1bmN0aW9uPFxyXG4gIFRQYXJhbXMsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UsXHJcbj4gPSBUcmVhdHlGdW5jdGlvbldpdGhvdXRQYXJhbXM8VFJlc3BvbnNlPiB8IFRyZWF0eUZ1bmN0aW9uV2l0aFBhcmFtczxUUGFyYW1zLCBUUmVzcG9uc2U+O1xyXG5cclxuZXhwb3J0IHR5cGUgVHJlYXR5RGF0YTxUUmVzcG9uc2UgZXh0ZW5kcyBUcmVhdHlSZXNwb25zZT4gPVxyXG4gIFRyZWF0eS5UcmVhdHlSZXNwb25zZTxUUmVzcG9uc2U+W1wiZGF0YVwiXTtcclxuXHJcbmV4cG9ydCB0eXBlIFRyZWF0eUVycm9yPFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlPiA9XHJcbiAgVHJlYXR5LlRyZWF0eVJlc3BvbnNlPFRSZXNwb25zZT5bXCJlcnJvclwiXTtcclxuXHJcbmV4cG9ydCB0eXBlIFRyZWF0eU11dGF0aW9uT3B0aW9uczxcclxuICBUVmFyaWFibGVzLFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlLFxyXG4+ID0gVXNlTXV0YXRpb25PcHRpb25zPFxyXG4gIFRyZWF0eURhdGE8VFJlc3BvbnNlPixcclxuICBUcmVhdHlFcnJvcjxUUmVzcG9uc2U+LFxyXG4gIFRWYXJpYWJsZXNcclxuPjtcclxuXHJcbmV4cG9ydCB0eXBlIFVzZVRyZWF0eU11dGF0aW9uUmVzdWx0PFxyXG4gIFRWYXJpYWJsZXMsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UsXHJcbj4gPSAoXHJcbiAgVXNlTXV0YXRpb25SZXN1bHQ8XHJcbiAgICBUcmVhdHlEYXRhPFRSZXNwb25zZT4sXHJcbiAgICBUcmVhdHlFcnJvcjxUUmVzcG9uc2U+LFxyXG4gICAgVFZhcmlhYmxlc1xyXG4gID5cclxuKTtcclxuXHJcbmV4cG9ydCB0eXBlIFVzZVRyZWF0eVF1ZXJ5UmVzdWx0PFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlLFxyXG4+ID0gKFxyXG4gIFVzZVF1ZXJ5UmVzdWx0PFxyXG4gICAgVHJlYXR5RGF0YTxUUmVzcG9uc2U+LFxyXG4gICAgVHJlYXR5RXJyb3I8VFJlc3BvbnNlPlxyXG4gID5cclxuKTtcclxuXHJcbmV4cG9ydCB0eXBlIFRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2UgZXh0ZW5kcyBSZWNvcmQ8bnVtYmVyLCB1bmtub3duPj4gPVxyXG4gIFVzZVF1ZXJ5T3B0aW9uczxUcmVhdHlEYXRhPFRSZXNwb25zZT4sIFRyZWF0eUVycm9yPFRSZXNwb25zZT4+O1xyXG5cclxuZXhwb3J0IHR5cGUgVXNlVHJlYXR5TXV0YXRpb25Ib29rPFxyXG4gIFRWYXJpYWJsZXMsXHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UsXHJcbj4gPSAoXHJcbiAgKG9wdGlvbnM6IFBhcnRpYWw8T21pdDxUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VFZhcmlhYmxlcywgVFJlc3BvbnNlPiwgXCJtdXRhdGlvbkZuXCI+PikgPT4gXHJcbiAgICBVc2VUcmVhdHlNdXRhdGlvblJlc3VsdDxUVmFyaWFibGVzLCBUUmVzcG9uc2U+XHJcbik7XHJcblxyXG5leHBvcnQgdHlwZSBVc2VUcmVhdHlRdWVyeUhvb2s8XHJcbiAgVFJlc3BvbnNlIGV4dGVuZHMgVHJlYXR5UmVzcG9uc2UsXHJcbj4gPSAoXHJcbiAgKG9wdGlvbnM6IFBhcnRpYWw8T21pdDxUcmVhdHlRdWVyeU9wdGlvbnM8VFJlc3BvbnNlPiwgXCJxdWVyeUZuXCI+PikgPT4gXHJcbiAgICBVc2VUcmVhdHlRdWVyeVJlc3VsdDxUUmVzcG9uc2U+XHJcbik7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJlYXR5TXV0YXRpb25PcHRpb25zPFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlPihcclxuICBmbjogVHJlYXR5RnVuY3Rpb25XaXRob3V0UGFyYW1zPFRSZXNwb25zZT4sXHJcbiAgb3B0aW9ucz86IE9taXQ8VHJlYXR5TXV0YXRpb25PcHRpb25zPHZvaWQsIFRSZXNwb25zZT4sIFwibXV0YXRpb25GblwiPixcclxuKTogVHJlYXR5TXV0YXRpb25PcHRpb25zPHZvaWQsIFRSZXNwb25zZT47XHJcbmV4cG9ydCBmdW5jdGlvbiB0cmVhdHlNdXRhdGlvbk9wdGlvbnM8XHJcbiAgVFZhcmlhYmxlcyxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBUcmVhdHlSZXNwb25zZSxcclxuPihcclxuICBmbjogVHJlYXR5RnVuY3Rpb25XaXRoUGFyYW1zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4sXHJcbiAgb3B0aW9ucz86IE9taXQ8VHJlYXR5TXV0YXRpb25PcHRpb25zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4sIFwibXV0YXRpb25GblwiPixcclxuKTogVHJlYXR5TXV0YXRpb25PcHRpb25zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT47XHJcbmV4cG9ydCBmdW5jdGlvbiB0cmVhdHlNdXRhdGlvbk9wdGlvbnM8XHJcbiAgVFZhcmlhYmxlcyxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBUcmVhdHlSZXNwb25zZSxcclxuPihcclxuICBmbjogVHJlYXR5RnVuY3Rpb248VFZhcmlhYmxlcywgVFJlc3BvbnNlPixcclxuICBvcHRpb25zPzogT21pdDxUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VFZhcmlhYmxlcywgVFJlc3BvbnNlPiwgXCJtdXRhdGlvbkZuXCI+LFxyXG4pOiBUcmVhdHlNdXRhdGlvbk9wdGlvbnM8VFZhcmlhYmxlcywgVFJlc3BvbnNlPiB7XHJcbiAgdHlwZSBURGF0YSA9IFRyZWF0eURhdGE8VFJlc3BvbnNlPjtcclxuICB0eXBlIFRFcnJvciA9IFRyZWF0eUVycm9yPFRSZXNwb25zZT47XHJcbiAgcmV0dXJuIG11dGF0aW9uT3B0aW9uczxURGF0YSwgVEVycm9yLCBUVmFyaWFibGVzPih7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgbXV0YXRpb25GbjogYXN5bmMgKHZhcmlhYmxlcykgPT4ge1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IChcclxuICAgICAgICBmbi5sZW5ndGggPT09IDAgPyAoZm4gYXMgKCkgPT4gUHJvbWlzZTxUcmVhdHkuVHJlYXR5UmVzcG9uc2U8VFJlc3BvbnNlPj4pKCkgOiAoZm4gYXMgVHJlYXR5RnVuY3Rpb25XaXRoUGFyYW1zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4pKHZhcmlhYmxlcylcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzcG9uc2U7XHJcbiAgICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRyZWF0eVF1ZXJ5T3B0aW9uczxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBUcmVhdHlSZXNwb25zZSA9IFRyZWF0eVJlc3BvbnNlLFxyXG4+KFxyXG4gIGZuOiBUcmVhdHlGdW5jdGlvbldpdGhvdXRQYXJhbXM8VFJlc3BvbnNlPixcclxuICBvcHRpb25zOiBPbWl0PFRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2U+LCBcInF1ZXJ5Rm5cIj4sXHJcbik6IFRyZWF0eVF1ZXJ5T3B0aW9uczxUUmVzcG9uc2U+IHtcclxuICB0eXBlIFREYXRhID0gVHJlYXR5RGF0YTxUUmVzcG9uc2U+O1xyXG4gIHR5cGUgVEVycm9yID0gVHJlYXR5RXJyb3I8VFJlc3BvbnNlPjtcclxuICByZXR1cm4gcXVlcnlPcHRpb25zPFREYXRhLCBURXJyb3I+KHtcclxuICAgIC4uLm9wdGlvbnMsXHJcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZm4oKTtcclxuICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzcG9uc2U7XHJcbiAgICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyZWF0eU11dGF0aW9uSG9vazxUUmVzcG9uc2UgZXh0ZW5kcyBUcmVhdHlSZXNwb25zZT4oXHJcbiAgZm46IFRyZWF0eUZ1bmN0aW9uV2l0aG91dFBhcmFtczxUUmVzcG9uc2U+LFxyXG4gIHVzZU9wdGlvbnM/OiAoXHJcbiAgICBPbWl0PFRyZWF0eU11dGF0aW9uT3B0aW9uczx2b2lkLCBUUmVzcG9uc2U+LCBcIm11dGF0aW9uRm5cIj4gfCBcclxuICAgICgoKSA9PiBPbWl0PFRyZWF0eU11dGF0aW9uT3B0aW9uczx2b2lkLCBUUmVzcG9uc2U+LCBcIm11dGF0aW9uRm5cIj4pXHJcbiAgKSxcclxuKTogVXNlVHJlYXR5TXV0YXRpb25Ib29rPHZvaWQsIFRSZXNwb25zZT47XHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmVhdHlNdXRhdGlvbkhvb2s8XHJcbiAgVFZhcmlhYmxlcyxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBUcmVhdHlSZXNwb25zZSxcclxuPihcclxuICBmbjogVHJlYXR5RnVuY3Rpb25XaXRoUGFyYW1zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4sXHJcbiAgdXNlT3B0aW9ucz86IChcclxuICAgIE9taXQ8VHJlYXR5TXV0YXRpb25PcHRpb25zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4sIFwibXV0YXRpb25GblwiPiB8IFxyXG4gICAgKCgpID0+IE9taXQ8VHJlYXR5TXV0YXRpb25PcHRpb25zPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4sIFwibXV0YXRpb25GblwiPilcclxuICApLFxyXG4pOiBVc2VUcmVhdHlNdXRhdGlvbkhvb2s8VFZhcmlhYmxlcywgVFJlc3BvbnNlPjtcclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyZWF0eU11dGF0aW9uSG9vazxcclxuICBUVmFyaWFibGVzLFxyXG4gIFRSZXNwb25zZSBleHRlbmRzIFRyZWF0eVJlc3BvbnNlLFxyXG4+KFxyXG4gIGZuOiBUcmVhdHlGdW5jdGlvbjxUVmFyaWFibGVzLCBUUmVzcG9uc2U+LFxyXG4gIHVzZU9wdGlvbnM/OiAoXHJcbiAgICBPbWl0PFRyZWF0eU11dGF0aW9uT3B0aW9uczxUVmFyaWFibGVzLCBUUmVzcG9uc2U+LCBcIm11dGF0aW9uRm5cIj4gfCBcclxuICAgICgoKSA9PiBPbWl0PFRyZWF0eU11dGF0aW9uT3B0aW9uczxUVmFyaWFibGVzLCBUUmVzcG9uc2U+LCBcIm11dGF0aW9uRm5cIj4pXHJcbiAgKSxcclxuKTogVXNlVHJlYXR5TXV0YXRpb25Ib29rPFRWYXJpYWJsZXMsIFRSZXNwb25zZT4ge1xyXG4gIHJldHVybiAob3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgaW5pdE9wdGlvbnMgPSB0eXBlb2YgdXNlT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8gdXNlT3B0aW9ucygpIDogdXNlT3B0aW9ucztcclxuICAgIHJldHVybiB1c2VNdXRhdGlvbih7XHJcbiAgICAgIC4uLnRyZWF0eU11dGF0aW9uT3B0aW9ucyhmbiwgaW5pdE9wdGlvbnMpLFxyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgfSk7XHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyZWF0eVF1ZXJ5SG9vazxcclxuICBUUmVzcG9uc2UgZXh0ZW5kcyBUcmVhdHlSZXNwb25zZSxcclxuPihcclxuICBmbjogVHJlYXR5RnVuY3Rpb25XaXRob3V0UGFyYW1zPFRSZXNwb25zZT4sXHJcbiAgdXNlT3B0aW9uczogKFxyXG4gICAgT21pdDxUcmVhdHlRdWVyeU9wdGlvbnM8VFJlc3BvbnNlPiwgXCJxdWVyeUZuXCI+IHwgXHJcbiAgICAoKCkgPT4gT21pdDxUcmVhdHlRdWVyeU9wdGlvbnM8VFJlc3BvbnNlPiwgXCJxdWVyeUZuXCI+KVxyXG4gICksXHJcbik6IFVzZVRyZWF0eVF1ZXJ5SG9vazxUUmVzcG9uc2U+IHtcclxuICByZXR1cm4gKG9wdGlvbnMpID0+IHtcclxuICAgIGNvbnN0IGluaXRPcHRpb25zID0gdHlwZW9mIHVzZU9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIiA/IHVzZU9wdGlvbnMoKSA6IHVzZU9wdGlvbnM7XHJcbiAgICByZXR1cm4gdXNlUXVlcnkoe1xyXG4gICAgICAuLi50cmVhdHlRdWVyeU9wdGlvbnMoZm4sIGluaXRPcHRpb25zKSxcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH0pO1xyXG4gIH07XHJcbn0iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMkZPLFNBQVMscUJBR2YsQ0FDQyxJQUNBLFNBQzhDO0FBQUEsRUFHOUMsT0FBTyxnQkFBMkM7QUFBQSxPQUM3QztBQUFBLElBQ0gsWUFBWSxPQUFPLGNBQWM7QUFBQSxNQUMvQixNQUFNLFdBQVcsT0FDZixHQUFHLFdBQVcsSUFBSyxHQUF1RCxJQUFLLEdBQXVELFNBQVM7QUFBQSxNQUVqSixRQUFRLE1BQU0sVUFBVTtBQUFBLE1BQ3hCLElBQUk7QUFBQSxRQUFPLE1BQU07QUFBQSxNQUNqQixPQUFPO0FBQUE7QUFBQSxFQUVYLENBQUM7QUFBQTtBQUdJLFNBQVMsa0JBRWYsQ0FDQyxJQUNBLFNBQytCO0FBQUEsRUFHL0IsT0FBTyxhQUE0QjtBQUFBLE9BQzlCO0FBQUEsSUFDSCxTQUFTLFlBQVk7QUFBQSxNQUNuQixNQUFNLFdBQVcsTUFBTSxHQUFHO0FBQUEsTUFDMUIsUUFBUSxNQUFNLFVBQVU7QUFBQSxNQUN4QixJQUFJO0FBQUEsUUFBTyxNQUFNO0FBQUEsTUFDakIsT0FBTztBQUFBO0FBQUEsRUFFWCxDQUFDO0FBQUE7QUFvQkksU0FBUyx3QkFHZixDQUNDLElBQ0EsWUFJOEM7QUFBQSxFQUM5QyxPQUFPLENBQUMsWUFBWTtBQUFBLElBQ2xCLE1BQU0sY0FBYyxPQUFPLGVBQWUsYUFBYSxXQUFXLElBQUk7QUFBQSxJQUN0RSxPQUFPLFlBQVk7QUFBQSxTQUNkLHNCQUFzQixJQUFJLFdBQVc7QUFBQSxTQUNyQztBQUFBLElBQ0wsQ0FBQztBQUFBO0FBQUE7QUFJRSxTQUFTLHFCQUVmLENBQ0MsSUFDQSxZQUkrQjtBQUFBLEVBQy9CLE9BQU8sQ0FBQyxZQUFZO0FBQUEsSUFDbEIsTUFBTSxjQUFjLE9BQU8sZUFBZSxhQUFhLFdBQVcsSUFBSTtBQUFBLElBQ3RFLE9BQU8sU0FBUztBQUFBLFNBQ1gsbUJBQW1CLElBQUksV0FBVztBQUFBLFNBQ2xDO0FBQUEsSUFDTCxDQUFDO0FBQUE7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjdDN0QzNjE3MzY0MUJBMzI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|