@growsober/sdk 1.0.0

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.
Files changed (129) hide show
  1. package/README.md +276 -0
  2. package/dist/__tests__/e2e.test.d.ts +7 -0
  3. package/dist/__tests__/e2e.test.js +472 -0
  4. package/dist/api/client.d.ts +11 -0
  5. package/dist/api/client.js +61 -0
  6. package/dist/api/mutations/admin.d.ts +167 -0
  7. package/dist/api/mutations/admin.js +326 -0
  8. package/dist/api/mutations/ambassadors.d.ts +52 -0
  9. package/dist/api/mutations/ambassadors.js +148 -0
  10. package/dist/api/mutations/auth.d.ts +267 -0
  11. package/dist/api/mutations/auth.js +332 -0
  12. package/dist/api/mutations/bookings.d.ts +59 -0
  13. package/dist/api/mutations/bookings.js +143 -0
  14. package/dist/api/mutations/event-chat.d.ts +35 -0
  15. package/dist/api/mutations/event-chat.js +147 -0
  16. package/dist/api/mutations/events.d.ts +87 -0
  17. package/dist/api/mutations/events.js +205 -0
  18. package/dist/api/mutations/grow90.d.ts +36 -0
  19. package/dist/api/mutations/grow90.js +132 -0
  20. package/dist/api/mutations/hubs.d.ts +111 -0
  21. package/dist/api/mutations/hubs.js +240 -0
  22. package/dist/api/mutations/index.d.ts +22 -0
  23. package/dist/api/mutations/index.js +39 -0
  24. package/dist/api/mutations/jack.d.ts +61 -0
  25. package/dist/api/mutations/jack.js +104 -0
  26. package/dist/api/mutations/library.d.ts +67 -0
  27. package/dist/api/mutations/library.js +168 -0
  28. package/dist/api/mutations/map.d.ts +153 -0
  29. package/dist/api/mutations/map.js +181 -0
  30. package/dist/api/mutations/matching.d.ts +130 -0
  31. package/dist/api/mutations/matching.js +204 -0
  32. package/dist/api/mutations/notifications.d.ts +63 -0
  33. package/dist/api/mutations/notifications.js +106 -0
  34. package/dist/api/mutations/offers.d.ts +26 -0
  35. package/dist/api/mutations/offers.js +47 -0
  36. package/dist/api/mutations/subscriptions.d.ts +127 -0
  37. package/dist/api/mutations/subscriptions.js +140 -0
  38. package/dist/api/mutations/support.d.ts +165 -0
  39. package/dist/api/mutations/support.js +307 -0
  40. package/dist/api/mutations/users.d.ts +211 -0
  41. package/dist/api/mutations/users.js +261 -0
  42. package/dist/api/queries/admin.d.ts +257 -0
  43. package/dist/api/queries/admin.js +320 -0
  44. package/dist/api/queries/ambassadors.d.ts +53 -0
  45. package/dist/api/queries/ambassadors.js +98 -0
  46. package/dist/api/queries/auth.d.ts +16 -0
  47. package/dist/api/queries/auth.js +25 -0
  48. package/dist/api/queries/bookings.d.ts +91 -0
  49. package/dist/api/queries/bookings.js +102 -0
  50. package/dist/api/queries/businesses.d.ts +212 -0
  51. package/dist/api/queries/businesses.js +154 -0
  52. package/dist/api/queries/event-chat.d.ts +19 -0
  53. package/dist/api/queries/event-chat.js +75 -0
  54. package/dist/api/queries/events.d.ts +322 -0
  55. package/dist/api/queries/events.js +221 -0
  56. package/dist/api/queries/grow90.d.ts +26 -0
  57. package/dist/api/queries/grow90.js +85 -0
  58. package/dist/api/queries/hubs.d.ts +165 -0
  59. package/dist/api/queries/hubs.js +143 -0
  60. package/dist/api/queries/index.d.ts +23 -0
  61. package/dist/api/queries/index.js +40 -0
  62. package/dist/api/queries/jack.d.ts +63 -0
  63. package/dist/api/queries/jack.js +92 -0
  64. package/dist/api/queries/library.d.ts +132 -0
  65. package/dist/api/queries/library.js +120 -0
  66. package/dist/api/queries/map.d.ts +216 -0
  67. package/dist/api/queries/map.js +278 -0
  68. package/dist/api/queries/matching.d.ts +136 -0
  69. package/dist/api/queries/matching.js +161 -0
  70. package/dist/api/queries/notifications.d.ts +78 -0
  71. package/dist/api/queries/notifications.js +88 -0
  72. package/dist/api/queries/offers.d.ts +91 -0
  73. package/dist/api/queries/offers.js +103 -0
  74. package/dist/api/queries/subscriptions.d.ts +56 -0
  75. package/dist/api/queries/subscriptions.js +73 -0
  76. package/dist/api/queries/support.d.ts +106 -0
  77. package/dist/api/queries/support.js +202 -0
  78. package/dist/api/queries/users.d.ts +293 -0
  79. package/dist/api/queries/users.js +370 -0
  80. package/dist/api/types.d.ts +464 -0
  81. package/dist/api/types.js +9 -0
  82. package/dist/hooks/useAuth.d.ts +5 -0
  83. package/dist/hooks/useAuth.js +39 -0
  84. package/dist/hooks/useUser.d.ts +43 -0
  85. package/dist/hooks/useUser.js +44 -0
  86. package/dist/index.d.ts +36 -0
  87. package/dist/index.js +67 -0
  88. package/package.json +62 -0
  89. package/src/__tests__/e2e.test.ts +502 -0
  90. package/src/api/client.ts +71 -0
  91. package/src/api/mutations/admin.ts +531 -0
  92. package/src/api/mutations/ambassadors.ts +185 -0
  93. package/src/api/mutations/auth.ts +350 -0
  94. package/src/api/mutations/bookings.ts +190 -0
  95. package/src/api/mutations/event-chat.ts +177 -0
  96. package/src/api/mutations/events.ts +273 -0
  97. package/src/api/mutations/grow90.ts +169 -0
  98. package/src/api/mutations/hubs.ts +385 -0
  99. package/src/api/mutations/index.ts +23 -0
  100. package/src/api/mutations/jack.ts +130 -0
  101. package/src/api/mutations/library.ts +212 -0
  102. package/src/api/mutations/map.ts +230 -0
  103. package/src/api/mutations/matching.ts +271 -0
  104. package/src/api/mutations/notifications.ts +114 -0
  105. package/src/api/mutations/offers.ts +73 -0
  106. package/src/api/mutations/subscriptions.ts +162 -0
  107. package/src/api/mutations/support.ts +390 -0
  108. package/src/api/mutations/users.ts +271 -0
  109. package/src/api/queries/admin.ts +480 -0
  110. package/src/api/queries/ambassadors.ts +139 -0
  111. package/src/api/queries/auth.ts +24 -0
  112. package/src/api/queries/bookings.ts +135 -0
  113. package/src/api/queries/businesses.ts +203 -0
  114. package/src/api/queries/event-chat.ts +78 -0
  115. package/src/api/queries/events.ts +272 -0
  116. package/src/api/queries/grow90.ts +98 -0
  117. package/src/api/queries/hubs.ts +211 -0
  118. package/src/api/queries/index.ts +24 -0
  119. package/src/api/queries/jack.ts +127 -0
  120. package/src/api/queries/library.ts +166 -0
  121. package/src/api/queries/map.ts +331 -0
  122. package/src/api/queries/matching.ts +238 -0
  123. package/src/api/queries/notifications.ts +103 -0
  124. package/src/api/queries/offers.ts +136 -0
  125. package/src/api/queries/subscriptions.ts +91 -0
  126. package/src/api/queries/support.ts +235 -0
  127. package/src/api/queries/users.ts +393 -0
  128. package/src/api/types.ts +596 -0
  129. package/src/index.ts +57 -0
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ /**
3
+ * Map Query Hooks
4
+ *
5
+ * TanStack Query hooks for map-related read operations.
6
+ * These hooks handle fetching map data including users, events, and businesses
7
+ * for display on the member map feature.
8
+ *
9
+ * @module api/queries/map
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.mapKeys = void 0;
13
+ exports.useMapMembers = useMapMembers;
14
+ exports.useMapEvents = useMapEvents;
15
+ exports.useMapHubs = useMapHubs;
16
+ exports.useMapBusinesses = useMapBusinesses;
17
+ const react_query_1 = require("@tanstack/react-query");
18
+ const client_1 = require("../client");
19
+ // ============================================================================
20
+ // QUERY KEYS
21
+ // ============================================================================
22
+ /**
23
+ * Query key factory for map-related queries
24
+ */
25
+ exports.mapKeys = {
26
+ all: ['map'],
27
+ members: (params) => [...exports.mapKeys.all, 'members', params],
28
+ events: (params) => [...exports.mapKeys.all, 'events', params],
29
+ hubs: (params) => [...exports.mapKeys.all, 'hubs', params],
30
+ businesses: (params) => [...exports.mapKeys.all, 'businesses', params],
31
+ };
32
+ // ============================================================================
33
+ // QUERY HOOKS
34
+ // ============================================================================
35
+ /**
36
+ * Get members for map display
37
+ *
38
+ * @description
39
+ * Retrieves users who have opted to be visible on the member map.
40
+ * Only shows users who have enabled "open to meet" and shared their location.
41
+ * Premium feature.
42
+ *
43
+ * @endpoint GET /api/v1/map/members
44
+ *
45
+ * @example
46
+ * ```tsx
47
+ * import { useMapMembers } from '@growsober/sdk';
48
+ *
49
+ * function MemberMap() {
50
+ * const { data: members, isLoading } = useMapMembers({
51
+ * lat: 51.5074,
52
+ * lng: -0.1278,
53
+ * radius: 50, // 50km radius
54
+ * });
55
+ *
56
+ * if (isLoading) return <MapLoader />;
57
+ *
58
+ * return (
59
+ * <Map>
60
+ * {members?.map(member => (
61
+ * <Marker
62
+ * key={member.id}
63
+ * position={[member.locationLat, member.locationLong]}
64
+ * >
65
+ * <Avatar src={member.avatar} />
66
+ * </Marker>
67
+ * ))}
68
+ * </Map>
69
+ * );
70
+ * }
71
+ * ```
72
+ *
73
+ * @param params - Location and filter parameters
74
+ * @param options - TanStack Query options
75
+ * @returns TanStack Query result with array of map users
76
+ */
77
+ function useMapMembers(params, options) {
78
+ return (0, react_query_1.useQuery)({
79
+ queryKey: exports.mapKeys.members(params),
80
+ queryFn: async () => {
81
+ const client = (0, client_1.getApiClient)();
82
+ const response = await client.get('/api/v1/map/members', {
83
+ params: {
84
+ lat: params.lat,
85
+ lng: params.lng,
86
+ radius: params.radius,
87
+ hubId: params.hubId,
88
+ openToMeetOnly: params.openToMeetOnly,
89
+ },
90
+ });
91
+ return response.data;
92
+ },
93
+ enabled: params.lat !== undefined && params.lng !== undefined,
94
+ ...options,
95
+ });
96
+ }
97
+ /**
98
+ * Get events for map display
99
+ *
100
+ * @description
101
+ * Retrieves events with location data for display on the map.
102
+ * Shows upcoming events within the specified radius.
103
+ *
104
+ * @endpoint GET /api/v1/map/events
105
+ *
106
+ * @example
107
+ * ```tsx
108
+ * import { useMapEvents } from '@growsober/sdk';
109
+ *
110
+ * function EventMap() {
111
+ * const { data: events, isLoading } = useMapEvents({
112
+ * lat: 51.5074,
113
+ * lng: -0.1278,
114
+ * radius: 25,
115
+ * upcoming: true,
116
+ * });
117
+ *
118
+ * return (
119
+ * <Map>
120
+ * {events?.map(event => (
121
+ * <Marker
122
+ * key={event.id}
123
+ * position={[event.locationLat, event.locationLong]}
124
+ * icon="event"
125
+ * >
126
+ * <EventPopup event={event} />
127
+ * </Marker>
128
+ * ))}
129
+ * </Map>
130
+ * );
131
+ * }
132
+ * ```
133
+ *
134
+ * @param params - Location and filter parameters
135
+ * @param options - TanStack Query options
136
+ * @returns TanStack Query result with array of map events
137
+ */
138
+ function useMapEvents(params, options) {
139
+ return (0, react_query_1.useQuery)({
140
+ queryKey: exports.mapKeys.events(params),
141
+ queryFn: async () => {
142
+ const client = (0, client_1.getApiClient)();
143
+ const response = await client.get('/api/v1/map/events', {
144
+ params: {
145
+ lat: params.lat,
146
+ lng: params.lng,
147
+ radius: params.radius,
148
+ hubId: params.hubId,
149
+ upcoming: params.upcoming,
150
+ },
151
+ });
152
+ return response.data;
153
+ },
154
+ enabled: params.lat !== undefined && params.lng !== undefined,
155
+ ...options,
156
+ });
157
+ }
158
+ /**
159
+ * Get hubs for map display
160
+ *
161
+ * @description
162
+ * Retrieves hubs with location data for display on the map.
163
+ * Shows active hubs within the specified radius.
164
+ *
165
+ * @endpoint GET /api/v1/map/hubs
166
+ *
167
+ * @example
168
+ * ```tsx
169
+ * import { useMapHubs } from '@growsober/sdk';
170
+ *
171
+ * function HubMap() {
172
+ * const { data: hubs, isLoading } = useMapHubs({
173
+ * lat: 51.5074,
174
+ * lng: -0.1278,
175
+ * radius: 50,
176
+ * });
177
+ *
178
+ * return (
179
+ * <Map>
180
+ * {hubs?.map(hub => (
181
+ * <Marker
182
+ * key={hub.id}
183
+ * position={[hub.locationLat, hub.locationLong]}
184
+ * icon="hub"
185
+ * >
186
+ * <HubPopup hub={hub} />
187
+ * </Marker>
188
+ * ))}
189
+ * </Map>
190
+ * );
191
+ * }
192
+ * ```
193
+ *
194
+ * @param params - Location and filter parameters
195
+ * @param options - TanStack Query options
196
+ * @returns TanStack Query result with array of map hubs
197
+ */
198
+ function useMapHubs(params, options) {
199
+ return (0, react_query_1.useQuery)({
200
+ queryKey: exports.mapKeys.hubs(params),
201
+ queryFn: async () => {
202
+ const client = (0, client_1.getApiClient)();
203
+ const response = await client.get('/api/v1/map/hubs', {
204
+ params: {
205
+ lat: params.lat,
206
+ lng: params.lng,
207
+ radius: params.radius,
208
+ city: params.city,
209
+ },
210
+ });
211
+ return response.data;
212
+ },
213
+ enabled: params.lat !== undefined && params.lng !== undefined,
214
+ ...options,
215
+ });
216
+ }
217
+ /**
218
+ * Get businesses for map display
219
+ *
220
+ * @description
221
+ * Retrieves partner businesses with location data for display on the map.
222
+ * Can filter by type and whether they serve alcohol-free drinks.
223
+ *
224
+ * @endpoint GET /api/v1/map/businesses
225
+ *
226
+ * @example
227
+ * ```tsx
228
+ * import { useMapBusinesses } from '@growsober/sdk';
229
+ *
230
+ * function BusinessMap() {
231
+ * const { data: businesses, isLoading } = useMapBusinesses({
232
+ * lat: 51.5074,
233
+ * lng: -0.1278,
234
+ * radius: 10,
235
+ * afDrinksOnly: true, // Only show AF-friendly venues
236
+ * });
237
+ *
238
+ * return (
239
+ * <Map>
240
+ * {businesses?.map(business => (
241
+ * <Marker
242
+ * key={business.id}
243
+ * position={[business.locationLat, business.locationLong]}
244
+ * icon={business.hasAfDrinks ? 'af-venue' : 'venue'}
245
+ * >
246
+ * <BusinessPopup business={business} />
247
+ * </Marker>
248
+ * ))}
249
+ * </Map>
250
+ * );
251
+ * }
252
+ * ```
253
+ *
254
+ * @param params - Location and filter parameters
255
+ * @param options - TanStack Query options
256
+ * @returns TanStack Query result with array of map businesses
257
+ */
258
+ function useMapBusinesses(params, options) {
259
+ return (0, react_query_1.useQuery)({
260
+ queryKey: exports.mapKeys.businesses(params),
261
+ queryFn: async () => {
262
+ const client = (0, client_1.getApiClient)();
263
+ const response = await client.get('/api/v1/map/businesses', {
264
+ params: {
265
+ lat: params.lat,
266
+ lng: params.lng,
267
+ radius: params.radius,
268
+ type: params.type,
269
+ afDrinksOnly: params.afDrinksOnly,
270
+ },
271
+ });
272
+ return response.data;
273
+ },
274
+ enabled: params.lat !== undefined && params.lng !== undefined,
275
+ ...options,
276
+ });
277
+ }
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9xdWVyaWVzL21hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQTJHSCxzQ0FzQkM7QUEyQ0Qsb0NBc0JDO0FBMENELGdDQXFCQztBQTJDRCw0Q0FzQkM7QUFoVUQsdURBQWtGO0FBQ2xGLHNDQUF5QztBQVF6QywrRUFBK0U7QUFDL0UsYUFBYTtBQUNiLCtFQUErRTtBQUUvRTs7R0FFRztBQUNVLFFBQUEsT0FBTyxHQUFHO0lBQ3JCLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBVTtJQUNyQixPQUFPLEVBQUUsQ0FBQyxNQUF5QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZUFBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFVO0lBQ3BGLE1BQU0sRUFBRSxDQUFDLE1BQXdCLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxlQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQVU7SUFDakYsSUFBSSxFQUFFLENBQUMsTUFBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGVBQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBVTtJQUMzRSxVQUFVLEVBQUUsQ0FBQyxNQUE0QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZUFBTyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFVO0NBQzlGLENBQUM7QUFxQ0YsK0VBQStFO0FBQy9FLGNBQWM7QUFDZCwrRUFBK0U7QUFFL0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUNHO0FBQ0gsU0FBZ0IsYUFBYSxDQUMzQixNQUF3QixFQUN4QixPQUEwRTtJQUUxRSxPQUFPLElBQUEsc0JBQVEsRUFBQztRQUNkLFFBQVEsRUFBRSxlQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNqQyxPQUFP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QTJCLEVBQzNCLE9BQThFO0lBRTlFLE9BQU8sSUFBQSxzQkFBUSxFQUFDO1FBQ2QsUUFBUSxFQUFFLGVBQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3BDLE9BQU8sRUFBRSxLQUFLLElBQW9DLEVBQUU7WUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUF3Qix3QkFBd0IsRUFBRTtnQkFDakYsTUFBTSxFQUFFO29CQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztvQkFDZixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7b0JBQ2YsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO29CQUNyQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ2pCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtpQkFDbEM7YUFDRixDQUFDLENBQUM7WUFDSCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVM7UUFDN0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFwIFF1ZXJ5IEhvb2tzXG4gKlxuICogVGFuU3RhY2sgUXVlcnkgaG9va3MgZm9yIG1hcC1yZWxhdGVkIHJlYWQgb3BlcmF0aW9ucy5cbiAqIFRoZXNlIGhvb2tzIGhhbmRsZSBmZXRjaGluZyBtYXAgZGF0YSBpbmNsdWRpbmcgdXNlcnMsIGV2ZW50cywgYW5kIGJ1c2luZXNzZXNcbiAqIGZvciBkaXNwbGF5IG9uIHRoZSBtZW1iZXIgbWFwIGZlYXR1cmUuXG4gKlxuICogQG1vZHVsZSBhcGkvcXVlcmllcy9tYXBcbiAqL1xuXG5pbXBvcnQgeyB1c2VRdWVyeSwgVXNlUXVlcnlPcHRpb25zLCBVc2VRdWVyeVJlc3VsdCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBnZXRBcGlDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUge1xuICBNYXBVc2VyUmVzcG9uc2UsXG4gIE1hcEV2ZW50UmVzcG9uc2UsXG4gIE1hcEh1YlJlc3BvbnNlLFxuICBNYXBCdXNpbmVzc1Jlc3BvbnNlLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEtFWVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBRdWVyeSBrZXkgZmFjdG9yeSBmb3IgbWFwLXJlbGF0ZWQgcXVlcmllc1xuICovXG5leHBvcnQgY29uc3QgbWFwS2V5cyA9IHtcbiAgYWxsOiBbJ21hcCddIGFzIGNvbnN0LFxuICBtZW1iZXJzOiAocGFyYW1zPzogTWFwTWVtYmVyc1BhcmFtcykgPT4gWy4uLm1hcEtleXMuYWxsLCAnbWVtYmVycycsIHBhcmFtc10gYXMgY29uc3QsXG4gIGV2ZW50czogKHBhcmFtcz86IE1hcEV2ZW50c1BhcmFtcykgPT4gWy4uLm1hcEtleXMuYWxsLCAnZXZlbnRzJywgcGFyYW1zXSBhcyBjb25zdCxcbiAgaHViczogKHBhcmFtcz86IE1hcEh1YnNQYXJhbXMpID0+IFsuLi5tYXBLZXlzLmFsbCwgJ2h1YnMnLCBwYXJhbXNdIGFzIGNvbnN0LFxuICBidXNpbmVzc2VzOiAocGFyYW1zPzogTWFwQnVzaW5lc3Nlc1BhcmFtcykgPT4gWy4uLm1hcEtleXMuYWxsLCAnYnVzaW5lc3NlcycsIHBhcmFtc10gYXMgY29uc3QsXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQQVJBTSBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcE1lbWJlcnNQYXJhbXMge1xuICBsYXQ6IG51bWJlcjtcbiAgbG5nOiBudW1iZXI7XG4gIHJhZGl1cz86IG51bWJlcjsgLy8ga21cbiAgaHViSWQ/OiBzdHJpbmc7XG4gIG9wZW5Ub01lZXRPbmx5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXBFdmVudHNQYXJhbXMge1xuICBsYXQ6IG51bWJlcjtcbiAgbG5nOiBudW1iZXI7XG4gIHJhZGl1cz86IG51bWJlcjsgLy8ga21cbiAgaHViSWQ/OiBzdHJpbmc7XG4gIHVwY29taW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXBIdWJzUGFyYW1zIHtcbiAgbGF0OiBudW1iZXI7XG4gIGxuZzogbnVtYmVyO1xuICByYWRpdXM/OiBudW1iZXI7IC8vIGttXG4gIGNpdHk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFwQnVzaW5lc3Nlc1BhcmFtcyB7XG4gIGxhdDogbnVtYmVyO1xuICBsbmc6IG51bWJlcjtcbiAgcmFkaXVzPzogbnVtYmVyOyAvLyBrbVxuICB0eXBlPzogc3RyaW5nO1xuICBhZkRyaW5rc09ubHk/OiBib29sZWFuO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBIT09LU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBtZW1iZXJzIGZvciBtYXAgZGlzcGxheVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0cmlldmVzIHVzZXJzIHdobyBoYXZlIG9wdGVkIHRvIGJlIHZpc2libGUgb24gdGhlIG1lbWJlciBtYXAuXG4gKiBPbmx5IHNob3dzIHVzZXJzIHdobyBoYXZlIGVuYWJsZWQgXCJvcGVuIHRvIG1lZXRcIiBhbmQgc2hhcmVkIHRoZWlyIGxvY2F0aW9uLlxuICogUHJlbWl1bSBmZWF0dXJlLlxuICpcbiAqIEBlbmRwb2ludCBHRVQgL2FwaS92MS9tYXAvbWVtYmVyc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZU1hcE1lbWJlcnMgfSBmcm9tICdAZ3Jvd3NvYmVyL3Nkayc7XG4gKlxuICogZnVuY3Rpb24gTWVtYmVyTWFwKCkge1xuICogICBjb25zdCB7IGRhdGE6IG1lbWJlcnMsIGlzTG9hZGluZyB9ID0gdXNlTWFwTWVtYmVycyh7XG4gKiAgICAgbGF0OiA1MS41MDc0LFxuICogICAgIGxuZzogLTAuMTI3OCxcbiAqICAgICByYWRpdXM6IDUwLCAvLyA1MGttIHJhZGl1c1xuICogICB9KTtcbiAqXG4gKiAgIGlmIChpc0xvYWRpbmcpIHJldHVybiA8TWFwTG9hZGVyIC8+O1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8TWFwPlxuICogICAgICAge21lbWJlcnM/Lm1hcChtZW1iZXIgPT4gKFxuICogICAgICAgICA8TWFya2VyXG4gKiAgICAgICAgICAga2V5PXttZW1iZXIuaWR9XG4gKiAgICAgICAgICAgcG9zaXRpb249e1ttZW1iZXIubG9jYXRpb25MYXQsIG1lbWJlci5sb2NhdGlvbkxvbmddfVxuICogICAgICAgICA+XG4gKiAgICAgICAgICAgPEF2YXRhciBzcmM9e21lbWJlci5hdmF0YXJ9IC8+XG4gKiAgICAgICAgIDwvTWFya2VyPlxuICogICAgICAgKSl9XG4gKiAgICAgPC9NYXA+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gTG9jYXRpb24gYW5kIGZpbHRlciBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IHJlc3VsdCB3aXRoIGFycmF5IG9mIG1hcCB1c2Vyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWFwTWVtYmVycyhcbiAgcGFyYW1zOiBNYXBNZW1iZXJzUGFyYW1zLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8TWFwVXNlclJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKTogVXNlUXVlcnlSZXN1bHQ8TWFwVXNlclJlc3BvbnNlW10+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogbWFwS2V5cy5tZW1iZXJzKHBhcmFtcyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8TWFwVXNlclJlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PE1hcFVzZXJSZXNwb25zZVtdPignL2FwaS92MS9tYXAvbWVtYmVycycsIHtcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgbGF0OiBwYXJhbXMubGF0LFxuICAgICAgICAgIGxuZzogcGFyYW1zLmxuZyxcbiAgICAgICAgICByYWRpdXM6IHBhcmFtcy5yYWRpdXMsXG4gICAgICAgICAgaHViSWQ6IHBhcmFtcy5odWJJZCxcbiAgICAgICAgICBvcGVuVG9NZWV0T25seTogcGFyYW1zLm9wZW5Ub01lZXRPbmx5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6IHBhcmFtcy5sYXQgIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMubG5nICE9PSB1bmRlZmluZWQsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGV2ZW50cyBmb3IgbWFwIGRpc3BsYXlcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHJpZXZlcyBldmVudHMgd2l0aCBsb2NhdGlvbiBkYXRhIGZvciBkaXNwbGF5IG9uIHRoZSBtYXAuXG4gKiBTaG93cyB1cGNvbWluZyBldmVudHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFkaXVzLlxuICpcbiAqIEBlbmRwb2ludCBHRVQgL2FwaS92MS9tYXAvZXZlbnRzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlTWFwRXZlbnRzIH0gZnJvbSAnQGdyb3dzb2Jlci9zZGsnO1xuICpcbiAqIGZ1bmN0aW9uIEV2ZW50TWFwKCkge1xuICogICBjb25zdCB7IGRhdGE6IGV2ZW50cywgaXNMb2FkaW5nIH0gPSB1c2VNYXBFdmVudHMoe1xuICogICAgIGxhdDogNTEuNTA3NCxcbiAqICAgICBsbmc6IC0wLjEyNzgsXG4gKiAgICAgcmFkaXVzOiAyNSxcbiAqICAgICB1cGNvbWluZzogdHJ1ZSxcbiAqICAgfSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxNYXA+XG4gKiAgICAgICB7ZXZlbnRzPy5tYXAoZXZlbnQgPT4gKFxuICogICAgICAgICA8TWFya2VyXG4gKiAgICAgICAgICAga2V5PXtldmVudC5pZH1cbiAqICAgICAgICAgICBwb3NpdGlvbj17W2V2ZW50LmxvY2F0aW9uTGF0LCBldmVudC5sb2NhdGlvbkxvbmddfVxuICogICAgICAgICAgIGljb249XCJldmVudFwiXG4gKiAgICAgICAgID5cbiAqICAgICAgICAgICA8RXZlbnRQb3B1cCBldmVudD17ZXZlbnR9IC8+XG4gKiAgICAgICAgIDwvTWFya2VyPlxuICogICAgICAgKSl9XG4gKiAgICAgPC9NYXA+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gTG9jYXRpb24gYW5kIGZpbHRlciBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IHJlc3VsdCB3aXRoIGFycmF5IG9mIG1hcCBldmVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1hcEV2ZW50cyhcbiAgcGFyYW1zOiBNYXBFdmVudHNQYXJhbXMsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxNYXBFdmVudFJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKTogVXNlUXVlcnlSZXN1bHQ8TWFwRXZlbnRSZXNwb25zZVtdPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IG1hcEtleXMuZXZlbnRzKHBhcmFtcyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8TWFwRXZlbnRSZXNwb25zZVtdPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxNYXBFdmVudFJlc3BvbnNlW10+KCcvYXBpL3YxL21hcC9ldmVudHMnLCB7XG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGxhdDogcGFyYW1zLmxhdCxcbiAgICAgICAgICBsbmc6IHBhcmFtcy5sbmcsXG4gICAgICAgICAgcmFkaXVzOiBwYXJhbXMucmFkaXVzLFxuICAgICAgICAgIGh1YklkOiBwYXJhbXMuaHViSWQsXG4gICAgICAgICAgdXBjb21pbmc6IHBhcmFtcy51cGNvbWluZyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBlbmFibGVkOiBwYXJhbXMubGF0ICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLmxuZyAhPT0gdW5kZWZpbmVkLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBodWJzIGZvciBtYXAgZGlzcGxheVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0cmlldmVzIGh1YnMgd2l0aCBsb2NhdGlvbiBkYXRhIGZvciBkaXNwbGF5IG9uIHRoZSBtYXAuXG4gKiBTaG93cyBhY3RpdmUgaHVicyB3aXRoaW4gdGhlIHNwZWNpZmllZCByYWRpdXMuXG4gKlxuICogQGVuZHBvaW50IEdFVCAvYXBpL3YxL21hcC9odWJzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlTWFwSHVicyB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiBmdW5jdGlvbiBIdWJNYXAoKSB7XG4gKiAgIGNvbnN0IHsgZGF0YTogaHVicywgaXNMb2FkaW5nIH0gPSB1c2VNYXBIdWJzKHtcbiAqICAgICBsYXQ6IDUxLjUwNzQsXG4gKiAgICAgbG5nOiAtMC4xMjc4LFxuICogICAgIHJhZGl1czogNTAsXG4gKiAgIH0pO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8TWFwPlxuICogICAgICAge2h1YnM/Lm1hcChodWIgPT4gKFxuICogICAgICAgICA8TWFya2VyXG4gKiAgICAgICAgICAga2V5PXtodWIuaWR9XG4gKiAgICAgICAgICAgcG9zaXRpb249e1todWIubG9jYXRpb25MYXQsIGh1Yi5sb2NhdGlvbkxvbmddfVxuICogICAgICAgICAgIGljb249XCJodWJcIlxuICogICAgICAgICA+XG4gKiAgICAgICAgICAgPEh1YlBvcHVwIGh1Yj17aHVifSAvPlxuICogICAgICAgICA8L01hcmtlcj5cbiAqICAgICAgICkpfVxuICogICAgIDwvTWFwPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIExvY2F0aW9uIGFuZCBmaWx0ZXIgcGFyYW1ldGVyc1xuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKiBAcmV0dXJucyBUYW5TdGFjayBRdWVyeSByZXN1bHQgd2l0aCBhcnJheSBvZiBtYXAgaHVic1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWFwSHVicyhcbiAgcGFyYW1zOiBNYXBIdWJzUGFyYW1zLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8TWFwSHViUmVzcG9uc2VbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pOiBVc2VRdWVyeVJlc3VsdDxNYXBIdWJSZXNwb25zZVtdPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IG1hcEtleXMuaHVicyhwYXJhbXMpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPE1hcEh1YlJlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PE1hcEh1YlJlc3BvbnNlW10+KCcvYXBpL3YxL21hcC9odWJzJywge1xuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBsYXQ6IHBhcmFtcy5sYXQsXG4gICAgICAgICAgbG5nOiBwYXJhbXMubG5nLFxuICAgICAgICAgIHJhZGl1czogcGFyYW1zLnJhZGl1cyxcbiAgICAgICAgICBjaXR5OiBwYXJhbXMuY2l0eSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBlbmFibGVkOiBwYXJhbXMubGF0ICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLmxuZyAhPT0gdW5kZWZpbmVkLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBidXNpbmVzc2VzIGZvciBtYXAgZGlzcGxheVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0cmlldmVzIHBhcnRuZXIgYnVzaW5lc3NlcyB3aXRoIGxvY2F0aW9uIGRhdGEgZm9yIGRpc3BsYXkgb24gdGhlIG1hcC5cbiAqIENhbiBmaWx0ZXIgYnkgdHlwZSBhbmQgd2hldGhlciB0aGV5IHNlcnZlIGFsY29ob2wtZnJlZSBkcmlua3MuXG4gKlxuICogQGVuZHBvaW50IEdFVCAvYXBpL3YxL21hcC9idXNpbmVzc2VzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlTWFwQnVzaW5lc3NlcyB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiBmdW5jdGlvbiBCdXNpbmVzc01hcCgpIHtcbiAqICAgY29uc3QgeyBkYXRhOiBidXNpbmVzc2VzLCBpc0xvYWRpbmcgfSA9IHVzZU1hcEJ1c2luZXNzZXMoe1xuICogICAgIGxhdDogNTEuNTA3NCxcbiAqICAgICBsbmc6IC0wLjEyNzgsXG4gKiAgICAgcmFkaXVzOiAxMCxcbiAqICAgICBhZkRyaW5rc09ubHk6IHRydWUsIC8vIE9ubHkgc2hvdyBBRi1mcmllbmRseSB2ZW51ZXNcbiAqICAgfSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxNYXA+XG4gKiAgICAgICB7YnVzaW5lc3Nlcz8ubWFwKGJ1c2luZXNzID0+IChcbiAqICAgICAgICAgPE1hcmtlclxuICogICAgICAgICAgIGtleT17YnVzaW5lc3MuaWR9XG4gKiAgICAgICAgICAgcG9zaXRpb249e1tidXNpbmVzcy5sb2NhdGlvbkxhdCwgYnVzaW5lc3MubG9jYXRpb25Mb25nXX1cbiAqICAgICAgICAgICBpY29uPXtidXNpbmVzcy5oYXNBZkRyaW5rcyA/ICdhZi12ZW51ZScgOiAndmVudWUnfVxuICogICAgICAgICA+XG4gKiAgICAgICAgICAgPEJ1c2luZXNzUG9wdXAgYnVzaW5lc3M9e2J1c2luZXNzfSAvPlxuICogICAgICAgICA8L01hcmtlcj5cbiAqICAgICAgICkpfVxuICogICAgIDwvTWFwPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIExvY2F0aW9uIGFuZCBmaWx0ZXIgcGFyYW1ldGVyc1xuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKiBAcmV0dXJucyBUYW5TdGFjayBRdWVyeSByZXN1bHQgd2l0aCBhcnJheSBvZiBtYXAgYnVzaW5lc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWFwQnVzaW5lc3NlcyhcbiAgcGFyYW1zOiBNYXBCdXNpbmVzc2VzUGFyYW1zLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8TWFwQnVzaW5lc3NSZXNwb25zZVtdPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbik6IFVzZVF1ZXJ5UmVzdWx0PE1hcEJ1c2luZXNzUmVzcG9uc2VbXT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBtYXBLZXlzLmJ1c2luZXNzZXMocGFyYW1zKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxNYXBCdXNpbmVzc1Jlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PE1hcEJ1c2luZXNzUmVzcG9uc2VbXT4oJy9hcGkvdjEvbWFwL2J1c2luZXNzZXMnLCB7XG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGxhdDogcGFyYW1zLmxhdCxcbiAgICAgICAgICBsbmc6IHBhcmFtcy5sbmcsXG4gICAgICAgICAgcmFkaXVzOiBwYXJhbXMucmFkaXVzLFxuICAgICAgICAgIHR5cGU6IHBhcmFtcy50eXBlLFxuICAgICAgICAgIGFmRHJpbmtzT25seTogcGFyYW1zLmFmRHJpbmtzT25seSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBlbmFibGVkOiBwYXJhbXMubGF0ICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLmxuZyAhPT0gdW5kZWZpbmVkLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
@@ -0,0 +1,136 @@
1
+ import { UseQueryOptions } from '@tanstack/react-query';
2
+ export declare const matchingKeys: {
3
+ all: readonly ["matching"];
4
+ discover: (filters?: MatchQueryFilters) => readonly ["matching", "discover", MatchQueryFilters | undefined];
5
+ matches: (filters?: MatchQueryFilters) => readonly ["matching", "matches", MatchQueryFilters | undefined];
6
+ match: (id: string) => readonly ["matching", "match", string];
7
+ buddies: () => readonly ["matching", "buddies"];
8
+ buddyRequests: () => readonly ["matching", "buddy-requests"];
9
+ stats: () => readonly ["matching", "stats"];
10
+ };
11
+ export interface MatchQueryFilters {
12
+ status?: 'PENDING' | 'ACCEPTED' | 'DECLINED' | 'BLOCKED';
13
+ limit?: number;
14
+ offset?: number;
15
+ }
16
+ export interface MatchResponse {
17
+ id: string;
18
+ userId: string;
19
+ matchedUserId: string;
20
+ status: 'PENDING' | 'ACCEPTED' | 'DECLINED' | 'BLOCKED';
21
+ matchScore?: number;
22
+ sharedInterests?: string[];
23
+ createdAt: string;
24
+ updatedAt: string;
25
+ matchedUser?: {
26
+ id: string;
27
+ name: string;
28
+ avatarUrl?: string;
29
+ bio?: string;
30
+ city?: string;
31
+ };
32
+ }
33
+ export interface DiscoverMatchResponse {
34
+ id: string;
35
+ name: string;
36
+ avatarUrl?: string;
37
+ bio?: string;
38
+ city?: string;
39
+ matchScore: number;
40
+ sharedInterests: string[];
41
+ distance?: number;
42
+ }
43
+ export interface BuddyResponse {
44
+ id: string;
45
+ userId: string;
46
+ buddyId: string;
47
+ status: 'PENDING' | 'ACTIVE' | 'ENDED';
48
+ startDate?: string;
49
+ endDate?: string;
50
+ lastActivity?: string;
51
+ buddy?: {
52
+ id: string;
53
+ name: string;
54
+ avatarUrl?: string;
55
+ };
56
+ }
57
+ export interface MatchingStatsResponse {
58
+ totalMatches: number;
59
+ pendingMatches: number;
60
+ acceptedMatches: number;
61
+ activeBuddies: number;
62
+ matchRate: number;
63
+ }
64
+ /**
65
+ * Discover potential matches based on shared interests and location
66
+ *
67
+ * @endpoint GET /api/v1/matching/discover
68
+ *
69
+ * @example
70
+ * ```tsx
71
+ * const { data: matches, isLoading } = useDiscoverMatches();
72
+ * ```
73
+ */
74
+ export declare function useDiscoverMatches(filters?: MatchQueryFilters, options?: Omit<UseQueryOptions<DiscoverMatchResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<DiscoverMatchResponse[], Error>;
75
+ /**
76
+ * Get all my matches
77
+ *
78
+ * @endpoint GET /api/v1/matching/matches
79
+ *
80
+ * @example
81
+ * ```tsx
82
+ * const { data: matches, isLoading } = useMyMatches({ status: 'PENDING' });
83
+ * ```
84
+ */
85
+ export declare function useMyMatches(filters?: MatchQueryFilters, options?: Omit<UseQueryOptions<MatchResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<MatchResponse[], Error>;
86
+ /**
87
+ * Get pending matches (convenience hook)
88
+ *
89
+ * @example
90
+ * ```tsx
91
+ * const { data: pendingMatches } = usePendingMatches();
92
+ * ```
93
+ */
94
+ export declare function usePendingMatches(options?: Omit<UseQueryOptions<MatchResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<MatchResponse[], Error>;
95
+ /**
96
+ * Get accepted matches (convenience hook)
97
+ *
98
+ * @example
99
+ * ```tsx
100
+ * const { data: acceptedMatches } = useAcceptedMatches();
101
+ * ```
102
+ */
103
+ export declare function useAcceptedMatches(options?: Omit<UseQueryOptions<MatchResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<MatchResponse[], Error>;
104
+ /**
105
+ * Get my accountability buddies
106
+ *
107
+ * @endpoint GET /api/v1/matching/buddies
108
+ *
109
+ * @example
110
+ * ```tsx
111
+ * const { data: buddies, isLoading } = useMyBuddies();
112
+ * ```
113
+ */
114
+ export declare function useMyBuddies(options?: Omit<UseQueryOptions<BuddyResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<BuddyResponse[], Error>;
115
+ /**
116
+ * Get pending buddy requests
117
+ *
118
+ * @endpoint GET /api/v1/matching/buddies/requests
119
+ *
120
+ * @example
121
+ * ```tsx
122
+ * const { data: requests } = useBuddyRequests();
123
+ * ```
124
+ */
125
+ export declare function useBuddyRequests(options?: Omit<UseQueryOptions<BuddyResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<BuddyResponse[], Error>;
126
+ /**
127
+ * Get matching statistics
128
+ *
129
+ * @endpoint GET /api/v1/matching/stats
130
+ *
131
+ * @example
132
+ * ```tsx
133
+ * const { data: stats } = useMatchingStats();
134
+ * ```
135
+ */
136
+ export declare function useMatchingStats(options?: Omit<UseQueryOptions<MatchingStatsResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<MatchingStatsResponse, Error>;
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchingKeys = void 0;
4
+ exports.useDiscoverMatches = useDiscoverMatches;
5
+ exports.useMyMatches = useMyMatches;
6
+ exports.usePendingMatches = usePendingMatches;
7
+ exports.useAcceptedMatches = useAcceptedMatches;
8
+ exports.useMyBuddies = useMyBuddies;
9
+ exports.useBuddyRequests = useBuddyRequests;
10
+ exports.useMatchingStats = useMatchingStats;
11
+ const react_query_1 = require("@tanstack/react-query");
12
+ const client_1 = require("../client");
13
+ // ============================================================================
14
+ // QUERY KEY FACTORY
15
+ // ============================================================================
16
+ exports.matchingKeys = {
17
+ all: ['matching'],
18
+ discover: (filters) => [...exports.matchingKeys.all, 'discover', filters],
19
+ matches: (filters) => [...exports.matchingKeys.all, 'matches', filters],
20
+ match: (id) => [...exports.matchingKeys.all, 'match', id],
21
+ buddies: () => [...exports.matchingKeys.all, 'buddies'],
22
+ buddyRequests: () => [...exports.matchingKeys.all, 'buddy-requests'],
23
+ stats: () => [...exports.matchingKeys.all, 'stats'],
24
+ };
25
+ // ============================================================================
26
+ // QUERY HOOKS
27
+ // ============================================================================
28
+ /**
29
+ * Discover potential matches based on shared interests and location
30
+ *
31
+ * @endpoint GET /api/v1/matching/discover
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * const { data: matches, isLoading } = useDiscoverMatches();
36
+ * ```
37
+ */
38
+ function useDiscoverMatches(filters, options) {
39
+ return (0, react_query_1.useQuery)({
40
+ queryKey: exports.matchingKeys.discover(filters),
41
+ queryFn: async () => {
42
+ const client = (0, client_1.getApiClient)();
43
+ const response = await client.get('/api/v1/matching/discover', {
44
+ params: filters,
45
+ });
46
+ return response.data?.data || response.data;
47
+ },
48
+ ...options,
49
+ });
50
+ }
51
+ /**
52
+ * Get all my matches
53
+ *
54
+ * @endpoint GET /api/v1/matching/matches
55
+ *
56
+ * @example
57
+ * ```tsx
58
+ * const { data: matches, isLoading } = useMyMatches({ status: 'PENDING' });
59
+ * ```
60
+ */
61
+ function useMyMatches(filters, options) {
62
+ return (0, react_query_1.useQuery)({
63
+ queryKey: exports.matchingKeys.matches(filters),
64
+ queryFn: async () => {
65
+ const client = (0, client_1.getApiClient)();
66
+ const response = await client.get('/api/v1/matching/matches', {
67
+ params: filters,
68
+ });
69
+ return response.data?.data || response.data;
70
+ },
71
+ staleTime: 30 * 1000,
72
+ ...options,
73
+ });
74
+ }
75
+ /**
76
+ * Get pending matches (convenience hook)
77
+ *
78
+ * @example
79
+ * ```tsx
80
+ * const { data: pendingMatches } = usePendingMatches();
81
+ * ```
82
+ */
83
+ function usePendingMatches(options) {
84
+ return useMyMatches({ status: 'PENDING' }, options);
85
+ }
86
+ /**
87
+ * Get accepted matches (convenience hook)
88
+ *
89
+ * @example
90
+ * ```tsx
91
+ * const { data: acceptedMatches } = useAcceptedMatches();
92
+ * ```
93
+ */
94
+ function useAcceptedMatches(options) {
95
+ return useMyMatches({ status: 'ACCEPTED' }, options);
96
+ }
97
+ /**
98
+ * Get my accountability buddies
99
+ *
100
+ * @endpoint GET /api/v1/matching/buddies
101
+ *
102
+ * @example
103
+ * ```tsx
104
+ * const { data: buddies, isLoading } = useMyBuddies();
105
+ * ```
106
+ */
107
+ function useMyBuddies(options) {
108
+ return (0, react_query_1.useQuery)({
109
+ queryKey: exports.matchingKeys.buddies(),
110
+ queryFn: async () => {
111
+ const client = (0, client_1.getApiClient)();
112
+ const response = await client.get('/api/v1/matching/buddies');
113
+ return response.data?.data || response.data;
114
+ },
115
+ ...options,
116
+ });
117
+ }
118
+ /**
119
+ * Get pending buddy requests
120
+ *
121
+ * @endpoint GET /api/v1/matching/buddies/requests
122
+ *
123
+ * @example
124
+ * ```tsx
125
+ * const { data: requests } = useBuddyRequests();
126
+ * ```
127
+ */
128
+ function useBuddyRequests(options) {
129
+ return (0, react_query_1.useQuery)({
130
+ queryKey: exports.matchingKeys.buddyRequests(),
131
+ queryFn: async () => {
132
+ const client = (0, client_1.getApiClient)();
133
+ const response = await client.get('/api/v1/matching/buddies/requests');
134
+ return response.data?.data || response.data;
135
+ },
136
+ ...options,
137
+ });
138
+ }
139
+ /**
140
+ * Get matching statistics
141
+ *
142
+ * @endpoint GET /api/v1/matching/stats
143
+ *
144
+ * @example
145
+ * ```tsx
146
+ * const { data: stats } = useMatchingStats();
147
+ * ```
148
+ */
149
+ function useMatchingStats(options) {
150
+ return (0, react_query_1.useQuery)({
151
+ queryKey: exports.matchingKeys.stats(),
152
+ queryFn: async () => {
153
+ const client = (0, client_1.getApiClient)();
154
+ const response = await client.get('/api/v1/matching/stats');
155
+ return response.data?.data || response.data;
156
+ },
157
+ staleTime: 5 * 60 * 1000,
158
+ ...options,
159
+ });
160
+ }
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2hpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3F1ZXJpZXMvbWF0Y2hpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBNkZBLGdEQWVDO0FBWUQsb0NBZ0JDO0FBVUQsOENBSUM7QUFVRCxnREFJQztBQVlELG9DQVlDO0FBWUQsNENBWUM7QUFZRCw0Q0FhQztBQTdPRCx1REFBa0U7QUFDbEUsc0NBQXlDO0FBRXpDLCtFQUErRTtBQUMvRSxvQkFBb0I7QUFDcEIsK0VBQStFO0FBRWxFLFFBQUEsWUFBWSxHQUFHO0lBQzFCLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBVTtJQUMxQixRQUFRLEVBQUUsQ0FBQyxPQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsb0JBQVksQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBVTtJQUM5RixPQUFPLEVBQUUsQ0FBQyxPQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsb0JBQVksQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVTtJQUM1RixLQUFLLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxvQkFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFVO0lBQ2xFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsb0JBQVksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFVO0lBQ3hELGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsb0JBQVksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQVU7SUFDckUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxvQkFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQVU7Q0FDckQsQ0FBQztBQWdFRiwrRUFBK0U7QUFDL0UsY0FBYztBQUNkLCtFQUErRTtBQUUvRTs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixrQkFB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O0dBU0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FDOUIsT0FBOEU7SUFFOUUsT0FBTyxJQUFBLHNCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUsb0JBQVksQ0FBQyxLQUFLLEVBQUU7UUFDOUIsT0FBTyxFQUFFLEtBQUssSUFBb0MsRUFBRTtZQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUM1RCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDOUMsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUk7UUFDeEIsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVF1ZXJ5LCBVc2VRdWVyeU9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUVVFUlkgS0VZIEZBQ1RPUllcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IG1hdGNoaW5nS2V5cyA9IHtcbiAgYWxsOiBbJ21hdGNoaW5nJ10gYXMgY29uc3QsXG4gIGRpc2NvdmVyOiAoZmlsdGVycz86IE1hdGNoUXVlcnlGaWx0ZXJzKSA9PiBbLi4ubWF0Y2hpbmdLZXlzLmFsbCwgJ2Rpc2NvdmVyJywgZmlsdGVyc10gYXMgY29uc3QsXG4gIG1hdGNoZXM6IChmaWx0ZXJzPzogTWF0Y2hRdWVyeUZpbHRlcnMpID0+IFsuLi5tYXRjaGluZ0tleXMuYWxsLCAnbWF0Y2hlcycsIGZpbHRlcnNdIGFzIGNvbnN0LFxuICBtYXRjaDogKGlkOiBzdHJpbmcpID0+IFsuLi5tYXRjaGluZ0tleXMuYWxsLCAnbWF0Y2gnLCBpZF0gYXMgY29uc3QsXG4gIGJ1ZGRpZXM6ICgpID0+IFsuLi5tYXRjaGluZ0tleXMuYWxsLCAnYnVkZGllcyddIGFzIGNvbnN0LFxuICBidWRkeVJlcXVlc3RzOiAoKSA9PiBbLi4ubWF0Y2hpbmdLZXlzLmFsbCwgJ2J1ZGR5LXJlcXVlc3RzJ10gYXMgY29uc3QsXG4gIHN0YXRzOiAoKSA9PiBbLi4ubWF0Y2hpbmdLZXlzLmFsbCwgJ3N0YXRzJ10gYXMgY29uc3QsXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGNoUXVlcnlGaWx0ZXJzIHtcbiAgc3RhdHVzPzogJ1BFTkRJTkcnIHwgJ0FDQ0VQVEVEJyB8ICdERUNMSU5FRCcgfCAnQkxPQ0tFRCc7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvZmZzZXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2hSZXNwb25zZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHVzZXJJZDogc3RyaW5nO1xuICBtYXRjaGVkVXNlcklkOiBzdHJpbmc7XG4gIHN0YXR1czogJ1BFTkRJTkcnIHwgJ0FDQ0VQVEVEJyB8ICdERUNMSU5FRCcgfCAnQkxPQ0tFRCc7XG4gIG1hdGNoU2NvcmU/OiBudW1iZXI7XG4gIHNoYXJlZEludGVyZXN0cz86IHN0cmluZ1tdO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gIG1hdGNoZWRVc2VyPzoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGF2YXRhclVybD86IHN0cmluZztcbiAgICBiaW8/OiBzdHJpbmc7XG4gICAgY2l0eT86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXNjb3Zlck1hdGNoUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGF2YXRhclVybD86IHN0cmluZztcbiAgYmlvPzogc3RyaW5nO1xuICBjaXR5Pzogc3RyaW5nO1xuICBtYXRjaFNjb3JlOiBudW1iZXI7XG4gIHNoYXJlZEludGVyZXN0czogc3RyaW5nW107XG4gIGRpc3RhbmNlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZGR5UmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICB1c2VySWQ6IHN0cmluZztcbiAgYnVkZHlJZDogc3RyaW5nO1xuICBzdGF0dXM6ICdQRU5ESU5HJyB8ICdBQ1RJVkUnIHwgJ0VOREVEJztcbiAgc3RhcnREYXRlPzogc3RyaW5nO1xuICBlbmREYXRlPzogc3RyaW5nO1xuICBsYXN0QWN0aXZpdHk/OiBzdHJpbmc7XG4gIGJ1ZGR5Pzoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGF2YXRhclVybD86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRjaGluZ1N0YXRzUmVzcG9uc2Uge1xuICB0b3RhbE1hdGNoZXM6IG51bWJlcjtcbiAgcGVuZGluZ01hdGNoZXM6IG51bWJlcjtcbiAgYWNjZXB0ZWRNYXRjaGVzOiBudW1iZXI7XG4gIGFjdGl2ZUJ1ZGRpZXM6IG51bWJlcjtcbiAgbWF0Y2hSYXRlOiBudW1iZXI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRGlzY292ZXIgcG90ZW50aWFsIG1hdGNoZXMgYmFzZWQgb24gc2hhcmVkIGludGVyZXN0cyBhbmQgbG9jYXRpb25cbiAqXG4gKiBAZW5kcG9pbnQgR0VUIC9hcGkvdjEvbWF0Y2hpbmcvZGlzY292ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGE6IG1hdGNoZXMsIGlzTG9hZGluZyB9ID0gdXNlRGlzY292ZXJNYXRjaGVzKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURpc2NvdmVyTWF0Y2hlcyhcbiAgZmlsdGVycz86IE1hdGNoUXVlcnlGaWx0ZXJzLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8RGlzY292ZXJNYXRjaFJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IG1hdGNoaW5nS2V5cy5kaXNjb3ZlcihmaWx0ZXJzKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxEaXNjb3Zlck1hdGNoUmVzcG9uc2VbXT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvbWF0Y2hpbmcvZGlzY292ZXInLCB7XG4gICAgICAgIHBhcmFtczogZmlsdGVycyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LmRhdGEgfHwgcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBhbGwgbXkgbWF0Y2hlc1xuICpcbiAqIEBlbmRwb2ludCBHRVQgL2FwaS92MS9tYXRjaGluZy9tYXRjaGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhOiBtYXRjaGVzLCBpc0xvYWRpbmcgfSA9IHVzZU15TWF0Y2hlcyh7IHN0YXR1czogJ1BFTkRJTkcnIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNeU1hdGNoZXMoXG4gIGZpbHRlcnM/OiBNYXRjaFF1ZXJ5RmlsdGVycyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPE1hdGNoUmVzcG9uc2VbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogbWF0Y2hpbmdLZXlzLm1hdGNoZXMoZmlsdGVycyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8TWF0Y2hSZXNwb25zZVtdPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS9tYXRjaGluZy9tYXRjaGVzJywge1xuICAgICAgICBwYXJhbXM6IGZpbHRlcnMsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy5kYXRhIHx8IHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBzdGFsZVRpbWU6IDMwICogMTAwMCxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgcGVuZGluZyBtYXRjaGVzIChjb252ZW5pZW5jZSBob29rKVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YTogcGVuZGluZ01hdGNoZXMgfSA9IHVzZVBlbmRpbmdNYXRjaGVzKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBlbmRpbmdNYXRjaGVzKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8TWF0Y2hSZXNwb25zZVtdPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlTXlNYXRjaGVzKHsgc3RhdHVzOiAnUEVORElORycgfSwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogR2V0IGFjY2VwdGVkIG1hdGNoZXMgKGNvbnZlbmllbmNlIGhvb2spXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhOiBhY2NlcHRlZE1hdGNoZXMgfSA9IHVzZUFjY2VwdGVkTWF0Y2hlcygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBY2NlcHRlZE1hdGNoZXMoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxNYXRjaFJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VNeU1hdGNoZXMoeyBzdGF0dXM6ICdBQ0NFUFRFRCcgfSwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogR2V0IG15IGFjY291bnRhYmlsaXR5IGJ1ZGRpZXNcbiAqXG4gKiBAZW5kcG9pbnQgR0VUIC9hcGkvdjEvbWF0Y2hpbmcvYnVkZGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YTogYnVkZGllcywgaXNMb2FkaW5nIH0gPSB1c2VNeUJ1ZGRpZXMoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTXlCdWRkaWVzKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8QnVkZHlSZXNwb25zZVtdPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBtYXRjaGluZ0tleXMuYnVkZGllcygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPEJ1ZGR5UmVzcG9uc2VbXT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvbWF0Y2hpbmcvYnVkZGllcycpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LmRhdGEgfHwgcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBwZW5kaW5nIGJ1ZGR5IHJlcXVlc3RzXG4gKlxuICogQGVuZHBvaW50IEdFVCAvYXBpL3YxL21hdGNoaW5nL2J1ZGRpZXMvcmVxdWVzdHNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGE6IHJlcXVlc3RzIH0gPSB1c2VCdWRkeVJlcXVlc3RzKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUJ1ZGR5UmVxdWVzdHMoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxCdWRkeVJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IG1hdGNoaW5nS2V5cy5idWRkeVJlcXVlc3RzKCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8QnVkZHlSZXNwb25zZVtdPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS9tYXRjaGluZy9idWRkaWVzL3JlcXVlc3RzJyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YT8uZGF0YSB8fCByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IG1hdGNoaW5nIHN0YXRpc3RpY3NcbiAqXG4gKiBAZW5kcG9pbnQgR0VUIC9hcGkvdjEvbWF0Y2hpbmcvc3RhdHNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGE6IHN0YXRzIH0gPSB1c2VNYXRjaGluZ1N0YXRzKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1hdGNoaW5nU3RhdHMoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxNYXRjaGluZ1N0YXRzUmVzcG9uc2U+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IG1hdGNoaW5nS2V5cy5zdGF0cygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPE1hdGNoaW5nU3RhdHNSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvbWF0Y2hpbmcvc3RhdHMnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy5kYXRhIHx8IHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBzdGFsZVRpbWU6IDUgKiA2MCAqIDEwMDAsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG4iXX0=