@spotsdev/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 (79) hide show
  1. package/dist/api/client.d.ts +12 -0
  2. package/dist/api/client.js +68 -0
  3. package/dist/api/mutations/clubs.d.ts +47 -0
  4. package/dist/api/mutations/clubs.js +95 -0
  5. package/dist/api/mutations/conversations.d.ts +45 -0
  6. package/dist/api/mutations/conversations.js +110 -0
  7. package/dist/api/mutations/index.d.ts +13 -0
  8. package/dist/api/mutations/index.js +38 -0
  9. package/dist/api/mutations/notifications.d.ts +38 -0
  10. package/dist/api/mutations/notifications.js +64 -0
  11. package/dist/api/mutations/orders.d.ts +73 -0
  12. package/dist/api/mutations/orders.js +116 -0
  13. package/dist/api/mutations/posts.d.ts +123 -0
  14. package/dist/api/mutations/posts.js +229 -0
  15. package/dist/api/mutations/products.d.ts +81 -0
  16. package/dist/api/mutations/products.js +102 -0
  17. package/dist/api/mutations/spots.d.ts +59 -0
  18. package/dist/api/mutations/spots.js +129 -0
  19. package/dist/api/mutations/users.d.ts +71 -0
  20. package/dist/api/mutations/users.js +173 -0
  21. package/dist/api/queries/auth.d.ts +37 -0
  22. package/dist/api/queries/auth.js +61 -0
  23. package/dist/api/queries/clubs.d.ts +52 -0
  24. package/dist/api/queries/clubs.js +116 -0
  25. package/dist/api/queries/conversations.d.ts +52 -0
  26. package/dist/api/queries/conversations.js +83 -0
  27. package/dist/api/queries/index.d.ts +26 -0
  28. package/dist/api/queries/index.js +65 -0
  29. package/dist/api/queries/misc.d.ts +54 -0
  30. package/dist/api/queries/misc.js +129 -0
  31. package/dist/api/queries/notifications.d.ts +34 -0
  32. package/dist/api/queries/notifications.js +62 -0
  33. package/dist/api/queries/orders.d.ts +45 -0
  34. package/dist/api/queries/orders.js +93 -0
  35. package/dist/api/queries/posts.d.ts +55 -0
  36. package/dist/api/queries/posts.js +130 -0
  37. package/dist/api/queries/products.d.ts +52 -0
  38. package/dist/api/queries/products.js +89 -0
  39. package/dist/api/queries/spots.d.ts +78 -0
  40. package/dist/api/queries/spots.js +168 -0
  41. package/dist/api/queries/templates.d.ts +42 -0
  42. package/dist/api/queries/templates.js +86 -0
  43. package/dist/api/queries/users.d.ts +90 -0
  44. package/dist/api/queries/users.js +187 -0
  45. package/dist/api/services/index.d.ts +2 -0
  46. package/dist/api/services/index.js +8 -0
  47. package/dist/api/services/marketplace.d.ts +129 -0
  48. package/dist/api/services/marketplace.js +168 -0
  49. package/dist/api/types.d.ts +54 -0
  50. package/dist/api/types.js +34 -0
  51. package/dist/index.d.ts +38 -0
  52. package/dist/index.js +73 -0
  53. package/package.json +57 -0
  54. package/src/api/client.ts +78 -0
  55. package/src/api/mutations/clubs.ts +107 -0
  56. package/src/api/mutations/conversations.ts +124 -0
  57. package/src/api/mutations/index.ts +29 -0
  58. package/src/api/mutations/notifications.ts +70 -0
  59. package/src/api/mutations/orders.ts +174 -0
  60. package/src/api/mutations/posts.ts +278 -0
  61. package/src/api/mutations/products.ts +160 -0
  62. package/src/api/mutations/spots.ts +146 -0
  63. package/src/api/mutations/users.ts +197 -0
  64. package/src/api/queries/auth.ts +67 -0
  65. package/src/api/queries/clubs.ts +135 -0
  66. package/src/api/queries/conversations.ts +94 -0
  67. package/src/api/queries/index.ts +48 -0
  68. package/src/api/queries/misc.ts +140 -0
  69. package/src/api/queries/notifications.ts +66 -0
  70. package/src/api/queries/orders.ts +119 -0
  71. package/src/api/queries/posts.ts +142 -0
  72. package/src/api/queries/products.ts +123 -0
  73. package/src/api/queries/spots.ts +201 -0
  74. package/src/api/queries/templates.ts +95 -0
  75. package/src/api/queries/users.ts +206 -0
  76. package/src/api/services/index.ts +6 -0
  77. package/src/api/services/marketplace.ts +265 -0
  78. package/src/api/types.ts +144 -0
  79. package/src/index.ts +63 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Users Query Hooks
3
+ *
4
+ * TanStack Query hooks for user-related operations.
5
+ */
6
+ import { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';
7
+ import type { User, Post, Club, Spot, SpotSubscription, FavoriteSpot } from '../types';
8
+ export declare const userKeys: {
9
+ all: readonly ["users"];
10
+ me: () => readonly ["users", "me"];
11
+ stats: () => readonly ["users", "me", "stats"];
12
+ activity: (limit?: number) => readonly ["users", "me", "activity", number | undefined];
13
+ posts: (params?: {
14
+ page?: number;
15
+ limit?: number;
16
+ }) => readonly ["users", "me", "posts", {
17
+ page?: number;
18
+ limit?: number;
19
+ } | undefined];
20
+ clubs: () => readonly ["users", "me", "clubs"];
21
+ subscriptions: () => readonly ["users", "me", "subscriptions"];
22
+ blocked: () => readonly ["users", "me", "blocked"];
23
+ ownedSpots: () => readonly ["users", "me", "owned-spots"];
24
+ favorites: () => readonly ["users", "me", "favorites"];
25
+ };
26
+ /**
27
+ * Get current user's profile
28
+ *
29
+ * @endpoint GET /api/v1/users/me
30
+ */
31
+ export declare function useCurrentUser(options?: Omit<UseQueryOptions<User>, 'queryKey' | 'queryFn'>): UseQueryResult<User>;
32
+ /**
33
+ * Get current user's stats
34
+ *
35
+ * @endpoint GET /api/v1/users/me/stats
36
+ */
37
+ export declare function useUserStats(options?: Omit<UseQueryOptions<{
38
+ posts: number;
39
+ responses: number;
40
+ upvotes: number;
41
+ }>, 'queryKey' | 'queryFn'>): UseQueryResult<{
42
+ posts: number;
43
+ responses: number;
44
+ upvotes: number;
45
+ }>;
46
+ /**
47
+ * Get current user's activity
48
+ *
49
+ * @endpoint GET /api/v1/users/me/activity
50
+ */
51
+ export declare function useUserActivity(limit?: number, options?: Omit<UseQueryOptions<unknown[]>, 'queryKey' | 'queryFn'>): UseQueryResult<unknown[]>;
52
+ /**
53
+ * Get current user's posts
54
+ *
55
+ * @endpoint GET /api/v1/user/me/posts
56
+ */
57
+ export declare function useUserPosts(params?: {
58
+ page?: number;
59
+ limit?: number;
60
+ }, options?: Omit<UseQueryOptions<Post[]>, 'queryKey' | 'queryFn'>): UseQueryResult<Post[]>;
61
+ /**
62
+ * Get current user's clubs
63
+ *
64
+ * @endpoint GET /api/v1/user/me/clubs
65
+ */
66
+ export declare function useUserClubs(options?: Omit<UseQueryOptions<Club[]>, 'queryKey' | 'queryFn'>): UseQueryResult<Club[]>;
67
+ /**
68
+ * Get current user's spot subscriptions
69
+ *
70
+ * @endpoint GET /api/v1/user/me/subscriptions
71
+ */
72
+ export declare function useUserSubscriptions(options?: Omit<UseQueryOptions<SpotSubscription[]>, 'queryKey' | 'queryFn'>): UseQueryResult<SpotSubscription[]>;
73
+ /**
74
+ * Get blocked users list
75
+ *
76
+ * @endpoint GET /api/v1/user/me/blocked
77
+ */
78
+ export declare function useBlockedUsers(options?: Omit<UseQueryOptions<User[]>, 'queryKey' | 'queryFn'>): UseQueryResult<User[]>;
79
+ /**
80
+ * Get current user's owned spots (for business owners)
81
+ *
82
+ * @endpoint GET /api/v1/users/me/owned-spots
83
+ */
84
+ export declare function useOwnedSpots(options?: Omit<UseQueryOptions<Spot[]>, 'queryKey' | 'queryFn'>): UseQueryResult<Spot[]>;
85
+ /**
86
+ * Get current user's favorite spots
87
+ *
88
+ * @endpoint GET /api/v1/users/me/favorites
89
+ */
90
+ export declare function useUserFavorites(options?: Omit<UseQueryOptions<FavoriteSpot[]>, 'queryKey' | 'queryFn'>): UseQueryResult<FavoriteSpot[]>;
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /**
3
+ * Users Query Hooks
4
+ *
5
+ * TanStack Query hooks for user-related operations.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.userKeys = void 0;
9
+ exports.useCurrentUser = useCurrentUser;
10
+ exports.useUserStats = useUserStats;
11
+ exports.useUserActivity = useUserActivity;
12
+ exports.useUserPosts = useUserPosts;
13
+ exports.useUserClubs = useUserClubs;
14
+ exports.useUserSubscriptions = useUserSubscriptions;
15
+ exports.useBlockedUsers = useBlockedUsers;
16
+ exports.useOwnedSpots = useOwnedSpots;
17
+ exports.useUserFavorites = useUserFavorites;
18
+ const react_query_1 = require("@tanstack/react-query");
19
+ const client_1 = require("../client");
20
+ // ============================================================================
21
+ // QUERY KEYS
22
+ // ============================================================================
23
+ exports.userKeys = {
24
+ all: ['users'],
25
+ me: () => [...exports.userKeys.all, 'me'],
26
+ stats: () => [...exports.userKeys.me(), 'stats'],
27
+ activity: (limit) => [...exports.userKeys.me(), 'activity', limit],
28
+ posts: (params) => [...exports.userKeys.me(), 'posts', params],
29
+ clubs: () => [...exports.userKeys.me(), 'clubs'],
30
+ subscriptions: () => [...exports.userKeys.me(), 'subscriptions'],
31
+ blocked: () => [...exports.userKeys.me(), 'blocked'],
32
+ ownedSpots: () => [...exports.userKeys.me(), 'owned-spots'],
33
+ favorites: () => [...exports.userKeys.me(), 'favorites'],
34
+ };
35
+ // ============================================================================
36
+ // QUERY HOOKS
37
+ // ============================================================================
38
+ /**
39
+ * Get current user's profile
40
+ *
41
+ * @endpoint GET /api/v1/users/me
42
+ */
43
+ function useCurrentUser(options) {
44
+ return (0, react_query_1.useQuery)({
45
+ queryKey: exports.userKeys.me(),
46
+ queryFn: async () => {
47
+ const client = (0, client_1.getApiClient)();
48
+ const response = await client.get('/api/v1/users/me');
49
+ return response.data.data;
50
+ },
51
+ ...options,
52
+ });
53
+ }
54
+ /**
55
+ * Get current user's stats
56
+ *
57
+ * @endpoint GET /api/v1/users/me/stats
58
+ */
59
+ function useUserStats(options) {
60
+ return (0, react_query_1.useQuery)({
61
+ queryKey: exports.userKeys.stats(),
62
+ queryFn: async () => {
63
+ const client = (0, client_1.getApiClient)();
64
+ const response = await client.get('/api/v1/users/me/stats');
65
+ return response.data.data;
66
+ },
67
+ ...options,
68
+ });
69
+ }
70
+ /**
71
+ * Get current user's activity
72
+ *
73
+ * @endpoint GET /api/v1/users/me/activity
74
+ */
75
+ function useUserActivity(limit = 10, options) {
76
+ return (0, react_query_1.useQuery)({
77
+ queryKey: exports.userKeys.activity(limit),
78
+ queryFn: async () => {
79
+ const client = (0, client_1.getApiClient)();
80
+ const response = await client.get(`/api/v1/users/me/activity?limit=${limit}`);
81
+ return response.data.data;
82
+ },
83
+ ...options,
84
+ });
85
+ }
86
+ /**
87
+ * Get current user's posts
88
+ *
89
+ * @endpoint GET /api/v1/user/me/posts
90
+ */
91
+ function useUserPosts(params, options) {
92
+ return (0, react_query_1.useQuery)({
93
+ queryKey: exports.userKeys.posts(params),
94
+ queryFn: async () => {
95
+ const client = (0, client_1.getApiClient)();
96
+ const queryParams = new URLSearchParams();
97
+ if (params?.page)
98
+ queryParams.set('page', String(params.page));
99
+ if (params?.limit)
100
+ queryParams.set('limit', String(params.limit));
101
+ const response = await client.get(`/api/v1/user/me/posts?${queryParams}`);
102
+ return response.data.data;
103
+ },
104
+ ...options,
105
+ });
106
+ }
107
+ /**
108
+ * Get current user's clubs
109
+ *
110
+ * @endpoint GET /api/v1/user/me/clubs
111
+ */
112
+ function useUserClubs(options) {
113
+ return (0, react_query_1.useQuery)({
114
+ queryKey: exports.userKeys.clubs(),
115
+ queryFn: async () => {
116
+ const client = (0, client_1.getApiClient)();
117
+ const response = await client.get('/api/v1/user/me/clubs');
118
+ return response.data.data;
119
+ },
120
+ ...options,
121
+ });
122
+ }
123
+ /**
124
+ * Get current user's spot subscriptions
125
+ *
126
+ * @endpoint GET /api/v1/user/me/subscriptions
127
+ */
128
+ function useUserSubscriptions(options) {
129
+ return (0, react_query_1.useQuery)({
130
+ queryKey: exports.userKeys.subscriptions(),
131
+ queryFn: async () => {
132
+ const client = (0, client_1.getApiClient)();
133
+ const response = await client.get('/api/v1/user/me/subscriptions');
134
+ return response.data.data;
135
+ },
136
+ ...options,
137
+ });
138
+ }
139
+ /**
140
+ * Get blocked users list
141
+ *
142
+ * @endpoint GET /api/v1/user/me/blocked
143
+ */
144
+ function useBlockedUsers(options) {
145
+ return (0, react_query_1.useQuery)({
146
+ queryKey: exports.userKeys.blocked(),
147
+ queryFn: async () => {
148
+ const client = (0, client_1.getApiClient)();
149
+ const response = await client.get('/api/v1/user/me/blocked');
150
+ return response.data.data;
151
+ },
152
+ ...options,
153
+ });
154
+ }
155
+ /**
156
+ * Get current user's owned spots (for business owners)
157
+ *
158
+ * @endpoint GET /api/v1/users/me/owned-spots
159
+ */
160
+ function useOwnedSpots(options) {
161
+ return (0, react_query_1.useQuery)({
162
+ queryKey: exports.userKeys.ownedSpots(),
163
+ queryFn: async () => {
164
+ const client = (0, client_1.getApiClient)();
165
+ const response = await client.get('/api/v1/users/me/owned-spots');
166
+ return response.data.data;
167
+ },
168
+ ...options,
169
+ });
170
+ }
171
+ /**
172
+ * Get current user's favorite spots
173
+ *
174
+ * @endpoint GET /api/v1/users/me/favorites
175
+ */
176
+ function useUserFavorites(options) {
177
+ return (0, react_query_1.useQuery)({
178
+ queryKey: exports.userKeys.favorites(),
179
+ queryFn: async () => {
180
+ const client = (0, client_1.getApiClient)();
181
+ const response = await client.get('/api/v1/users/me/favorites');
182
+ return response.data.data;
183
+ },
184
+ ...options,
185
+ });
186
+ }
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3F1ZXJpZXMvdXNlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQWdDSCx3Q0FZQztBQU9ELG9DQVlDO0FBT0QsMENBYUM7QUFPRCxvQ0FnQkM7QUFPRCxvQ0FZQztBQU9ELG9EQVlDO0FBT0QsMENBWUM7QUFPRCxzQ0FZQztBQU9ELDRDQVlDO0FBdk1ELHVEQUFrRjtBQUNsRixzQ0FBeUM7QUFHekMsK0VBQStFO0FBQy9FLGFBQWE7QUFDYiwrRUFBK0U7QUFFbEUsUUFBQSxRQUFRLEdBQUc7SUFDdEIsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFVO0lBQ3ZCLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZ0JBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFVO0lBQzFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZ0JBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQVU7SUFDakQsUUFBUSxFQUFFLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZ0JBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFVO0lBQzVFLEtBQUssRUFBRSxDQUFDLE1BQTBDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxnQkFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQVU7SUFDbkcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxnQkFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBVTtJQUNqRCxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLGdCQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsZUFBZSxDQUFVO0lBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZ0JBQVEsQ0FBQyxF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YWNrIFF1ZXJ5IGhvb2tzIGZvciB1c2VyLXJlbGF0ZWQgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQgeyB1c2VRdWVyeSwgVXNlUXVlcnlPcHRpb25zLCBVc2VRdWVyeVJlc3VsdCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBnZXRBcGlDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBVc2VyLCBQb3N0LCBDbHViLCBTcG90LCBTcG90U3Vic2NyaXB0aW9uLCBGYXZvcml0ZVNwb3QsIEFwaVJlc3BvbnNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBLRVlTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCB1c2VyS2V5cyA9IHtcbiAgYWxsOiBbJ3VzZXJzJ10gYXMgY29uc3QsXG4gIG1lOiAoKSA9PiBbLi4udXNlcktleXMuYWxsLCAnbWUnXSBhcyBjb25zdCxcbiAgc3RhdHM6ICgpID0+IFsuLi51c2VyS2V5cy5tZSgpLCAnc3RhdHMnXSBhcyBjb25zdCxcbiAgYWN0aXZpdHk6IChsaW1pdD86IG51bWJlcikgPT4gWy4uLnVzZXJLZXlzLm1lKCksICdhY3Rpdml0eScsIGxpbWl0XSBhcyBjb25zdCxcbiAgcG9zdHM6IChwYXJhbXM/OiB7IHBhZ2U/OiBudW1iZXI7IGxpbWl0PzogbnVtYmVyIH0pID0+IFsuLi51c2VyS2V5cy5tZSgpLCAncG9zdHMnLCBwYXJhbXNdIGFzIGNvbnN0LFxuICBjbHViczogKCkgPT4gWy4uLnVzZXJLZXlzLm1lKCksICdjbHVicyddIGFzIGNvbnN0LFxuICBzdWJzY3JpcHRpb25zOiAoKSA9PiBbLi4udXNlcktleXMubWUoKSwgJ3N1YnNjcmlwdGlvbnMnXSBhcyBjb25zdCxcbiAgYmxvY2tlZDogKCkgPT4gWy4uLnVzZXJLZXlzLm1lKCksICdibG9ja2VkJ10gYXMgY29uc3QsXG4gIG93bmVkU3BvdHM6ICgpID0+IFsuLi51c2VyS2V5cy5tZSgpLCAnb3duZWQtc3BvdHMnXSBhcyBjb25zdCxcbiAgZmF2b3JpdGVzOiAoKSA9PiBbLi4udXNlcktleXMubWUoKSwgJ2Zhdm9yaXRlcyddIGFzIGNvbnN0LFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUVVFUlkgSE9PS1Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgY3VycmVudCB1c2VyJ3MgcHJvZmlsZVxuICpcbiAqIEBlbmRwb2ludCBHRVQgL2FwaS92MS91c2Vycy9tZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ3VycmVudFVzZXIoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxVc2VyPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbik6IFVzZVF1ZXJ5UmVzdWx0PFVzZXI+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogdXNlcktleXMubWUoKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTxVc2VyPj4oJy9hcGkvdjEvdXNlcnMvbWUnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgY3VycmVudCB1c2VyJ3Mgc3RhdHNcbiAqXG4gKiBAZW5kcG9pbnQgR0VUIC9hcGkvdjEvdXNlcnMvbWUvc3RhdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJTdGF0cyhcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPHsgcG9zdHM6IG51bWJlcjsgcmVzcG9uc2VzOiBudW1iZXI7IHVwdm90ZXM6IG51bWJlciB9PiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbik6IFVzZVF1ZXJ5UmVzdWx0PHsgcG9zdHM6IG51bWJlcjsgcmVzcG9uc2VzOiBudW1iZXI7IHVwdm90ZXM6IG51bWJlciB9PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHVzZXJLZXlzLnN0YXRzKCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8QXBpUmVzcG9uc2U8eyBwb3N0czogbnVtYmVyOyByZXNwb25zZXM6IG51bWJlcjsgdXB2b3RlczogbnVtYmVyIH0+PignL2FwaS92MS91c2Vycy9tZS9zdGF0cycpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBjdXJyZW50IHVzZXIncyBhY3Rpdml0eVxuICpcbiAqIEBlbmRwb2ludCBHRVQgL2FwaS92MS91c2Vycy9tZS9hY3Rpdml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVXNlckFjdGl2aXR5KFxuICBsaW1pdDogbnVtYmVyID0gMTAsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczx1bmtub3duW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKTogVXNlUXVlcnlSZXN1bHQ8dW5rbm93bltdPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHVzZXJLZXlzLmFjdGl2aXR5KGxpbWl0KSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTx1bmtub3duW10+PihgL2FwaS92MS91c2Vycy9tZS9hY3Rpdml0eT9saW1pdD0ke2xpbWl0fWApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBjdXJyZW50IHVzZXIncyBwb3N0c1xuICpcbiAqIEBlbmRwb2ludCBHRVQgL2FwaS92MS91c2VyL21lL3Bvc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyUG9zdHMoXG4gIHBhcmFtcz86IHsgcGFnZT86IG51bWJlcjsgbGltaXQ/OiBudW1iZXIgfSxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFBvc3RbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pOiBVc2VRdWVyeVJlc3VsdDxQb3N0W10+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogdXNlcktleXMucG9zdHMocGFyYW1zKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgaWYgKHBhcmFtcz8ucGFnZSkgcXVlcnlQYXJhbXMuc2V0KCdwYWdlJywgU3RyaW5nKHBhcmFtcy5wYWdlKSk7XG4gICAgICBpZiAocGFyYW1zPy5saW1pdCkgcXVlcnlQYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhwYXJhbXMubGltaXQpKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTxQb3N0W10+PihgL2FwaS92MS91c2VyL21lL3Bvc3RzPyR7cXVlcnlQYXJhbXN9YCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGN1cnJlbnQgdXNlcidzIGNsdWJzXG4gKlxuICogQGVuZHBvaW50IEdFVCAvYXBpL3YxL3VzZXIvbWUvY2x1YnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJDbHVicyhcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPENsdWJbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pOiBVc2VRdWVyeVJlc3VsdDxDbHViW10+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogdXNlcktleXMuY2x1YnMoKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTxDbHViW10+PignL2FwaS92MS91c2VyL21lL2NsdWJzJyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGN1cnJlbnQgdXNlcidzIHNwb3Qgc3Vic2NyaXB0aW9uc1xuICpcbiAqIEBlbmRwb2ludCBHRVQgL2FwaS92MS91c2VyL21lL3N1YnNjcmlwdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJTdWJzY3JpcHRpb25zKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8U3BvdFN1YnNjcmlwdGlvbltdPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbik6IFVzZVF1ZXJ5UmVzdWx0PFNwb3RTdWJzY3JpcHRpb25bXT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiB1c2VyS2V5cy5zdWJzY3JpcHRpb25zKCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8QXBpUmVzcG9uc2U8U3BvdFN1YnNjcmlwdGlvbltdPj4oJy9hcGkvdjEvdXNlci9tZS9zdWJzY3JpcHRpb25zJyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGJsb2NrZWQgdXNlcnMgbGlzdFxuICpcbiAqIEBlbmRwb2ludCBHRVQgL2FwaS92MS91c2VyL21lL2Jsb2NrZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUJsb2NrZWRVc2VycyhcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFVzZXJbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pOiBVc2VRdWVyeVJlc3VsdDxVc2VyW10+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogdXNlcktleXMuYmxvY2tlZCgpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PEFwaVJlc3BvbnNlPFVzZXJbXT4+KCcvYXBpL3YxL3VzZXIvbWUvYmxvY2tlZCcpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBjdXJyZW50IHVzZXIncyBvd25lZCBzcG90cyAoZm9yIGJ1c2luZXNzIG93bmVycylcbiAqXG4gKiBAZW5kcG9pbnQgR0VUIC9hcGkvdjEvdXNlcnMvbWUvb3duZWQtc3BvdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU93bmVkU3BvdHMoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxTcG90W10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKTogVXNlUXVlcnlSZXN1bHQ8U3BvdFtdPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHVzZXJLZXlzLm93bmVkU3BvdHMoKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTxTcG90W10+PignL2FwaS92MS91c2Vycy9tZS9vd25lZC1zcG90cycpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBjdXJyZW50IHVzZXIncyBmYXZvcml0ZSBzcG90c1xuICpcbiAqIEBlbmRwb2ludCBHRVQgL2FwaS92MS91c2Vycy9tZS9mYXZvcml0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJGYXZvcml0ZXMoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxGYXZvcml0ZVNwb3RbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pOiBVc2VRdWVyeVJlc3VsdDxGYXZvcml0ZVNwb3RbXT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiB1c2VyS2V5cy5mYXZvcml0ZXMoKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTxGYXZvcml0ZVNwb3RbXT4+KCcvYXBpL3YxL3VzZXJzL21lL2Zhdm9yaXRlcycpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export { productsService, ordersService, paymentsService } from './marketplace';
2
+ export type { CreateProductInput, UpdateProductInput, CreateOrderInput, } from './marketplace';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.paymentsService = exports.ordersService = exports.productsService = void 0;
4
+ var marketplace_1 = require("./marketplace");
5
+ Object.defineProperty(exports, "productsService", { enumerable: true, get: function () { return marketplace_1.productsService; } });
6
+ Object.defineProperty(exports, "ordersService", { enumerable: true, get: function () { return marketplace_1.ordersService; } });
7
+ Object.defineProperty(exports, "paymentsService", { enumerable: true, get: function () { return marketplace_1.paymentsService; } });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFnRjtBQUF2RSw4R0FBQSxlQUFlLE9BQUE7QUFBRSw0R0FBQSxhQUFhLE9BQUE7QUFBRSw4R0FBQSxlQUFlLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBwcm9kdWN0c1NlcnZpY2UsIG9yZGVyc1NlcnZpY2UsIHBheW1lbnRzU2VydmljZSB9IGZyb20gJy4vbWFya2V0cGxhY2UnO1xuZXhwb3J0IHR5cGUge1xuICBDcmVhdGVQcm9kdWN0SW5wdXQsXG4gIFVwZGF0ZVByb2R1Y3RJbnB1dCxcbiAgQ3JlYXRlT3JkZXJJbnB1dCxcbn0gZnJvbSAnLi9tYXJrZXRwbGFjZSc7XG4iXX0=
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Marketplace API Service
3
+ *
4
+ * Plain async functions for products and orders.
5
+ * Can be used in tests or non-React environments.
6
+ */
7
+ import type { Product, ProductType, ProductStatus, OrderStatus, PaginatedResponse } from '../types';
8
+ import type { ProductWithSpot } from '../queries/products';
9
+ import type { OrderWithDetails } from '../queries/orders';
10
+ export type { ProductWithSpot, OrderWithDetails };
11
+ export interface CreateProductInput {
12
+ name: string;
13
+ description?: string;
14
+ type: ProductType;
15
+ price: number;
16
+ currency?: string;
17
+ stockQuantity?: number;
18
+ lowStockAlert?: number;
19
+ deliveryRadius?: number;
20
+ prepTimeMinutes?: number;
21
+ eventDate?: string;
22
+ imageUrl?: string;
23
+ }
24
+ export interface UpdateProductInput {
25
+ name?: string;
26
+ description?: string;
27
+ price?: number;
28
+ stockQuantity?: number;
29
+ lowStockAlert?: number;
30
+ status?: ProductStatus;
31
+ deliveryRadius?: number;
32
+ prepTimeMinutes?: number;
33
+ eventDate?: string;
34
+ imageUrl?: string;
35
+ }
36
+ export interface CreateOrderInput {
37
+ spotId: string;
38
+ items: Array<{
39
+ productId: string;
40
+ quantity: number;
41
+ }>;
42
+ notes?: string;
43
+ }
44
+ export declare const productsService: {
45
+ /**
46
+ * List products for a spot
47
+ */
48
+ listBySpot(spotId: string, params?: {
49
+ type?: ProductType;
50
+ status?: ProductStatus;
51
+ limit?: number;
52
+ page?: number;
53
+ }): Promise<PaginatedResponse<Product>>;
54
+ /**
55
+ * Get product by ID
56
+ */
57
+ getById(productId: string): Promise<ProductWithSpot>;
58
+ /**
59
+ * Get product by slug
60
+ */
61
+ getBySlug(spotId: string, slug: string): Promise<ProductWithSpot>;
62
+ /**
63
+ * Create a product (requires owner auth)
64
+ */
65
+ create(spotId: string, data: CreateProductInput): Promise<Product>;
66
+ /**
67
+ * Update a product (requires owner auth)
68
+ */
69
+ update(productId: string, data: UpdateProductInput): Promise<Product>;
70
+ /**
71
+ * Delete a product (requires owner auth)
72
+ */
73
+ delete(productId: string): Promise<void>;
74
+ /**
75
+ * Adjust stock (requires owner auth)
76
+ */
77
+ adjustStock(productId: string, quantity: number, reason: "RESTOCK" | "ADJUSTMENT", notes?: string): Promise<Product>;
78
+ };
79
+ export declare const ordersService: {
80
+ /**
81
+ * Create an order
82
+ */
83
+ create(data: CreateOrderInput): Promise<OrderWithDetails>;
84
+ /**
85
+ * Get order by ID
86
+ */
87
+ getById(orderId: string): Promise<OrderWithDetails>;
88
+ /**
89
+ * List my orders (as buyer)
90
+ */
91
+ listMyOrders(params?: {
92
+ status?: OrderStatus;
93
+ limit?: number;
94
+ page?: number;
95
+ }): Promise<PaginatedResponse<OrderWithDetails>>;
96
+ /**
97
+ * List spot orders (as seller)
98
+ */
99
+ listSpotOrders(spotId: string, params?: {
100
+ status?: OrderStatus;
101
+ limit?: number;
102
+ page?: number;
103
+ }): Promise<PaginatedResponse<OrderWithDetails>>;
104
+ /**
105
+ * Update order status (as seller)
106
+ */
107
+ updateStatus(orderId: string, status: OrderStatus): Promise<OrderWithDetails>;
108
+ /**
109
+ * Cancel order (as buyer)
110
+ */
111
+ cancel(orderId: string): Promise<OrderWithDetails>;
112
+ };
113
+ export declare const paymentsService: {
114
+ /**
115
+ * Create Stripe PaymentIntent
116
+ */
117
+ createStripeIntent(orderId: string): Promise<{
118
+ clientSecret: string;
119
+ paymentIntentId: string;
120
+ }>;
121
+ /**
122
+ * Create Coinbase charge
123
+ */
124
+ createCoinbaseCharge(orderId: string): Promise<{
125
+ chargeId: string;
126
+ chargeCode: string;
127
+ hostedUrl: string;
128
+ }>;
129
+ };
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /**
3
+ * Marketplace API Service
4
+ *
5
+ * Plain async functions for products and orders.
6
+ * Can be used in tests or non-React environments.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.paymentsService = exports.ordersService = exports.productsService = void 0;
10
+ const client_1 = require("../client");
11
+ // ============================================================================
12
+ // PRODUCTS SERVICE
13
+ // ============================================================================
14
+ exports.productsService = {
15
+ /**
16
+ * List products for a spot
17
+ */
18
+ async listBySpot(spotId, params) {
19
+ const client = (0, client_1.getApiClient)();
20
+ const queryParams = new URLSearchParams();
21
+ if (params?.type)
22
+ queryParams.set('type', params.type);
23
+ if (params?.status)
24
+ queryParams.set('status', params.status);
25
+ if (params?.limit)
26
+ queryParams.set('limit', String(params.limit));
27
+ if (params?.page)
28
+ queryParams.set('page', String(params.page));
29
+ const response = await client.get(`/api/v1/spots/${spotId}/products?${queryParams}`);
30
+ return response.data.data;
31
+ },
32
+ /**
33
+ * Get product by ID
34
+ */
35
+ async getById(productId) {
36
+ const client = (0, client_1.getApiClient)();
37
+ const response = await client.get(`/api/v1/products/${productId}`);
38
+ return response.data.data;
39
+ },
40
+ /**
41
+ * Get product by slug
42
+ */
43
+ async getBySlug(spotId, slug) {
44
+ const client = (0, client_1.getApiClient)();
45
+ const response = await client.get(`/api/v1/spots/${spotId}/products/slug/${slug}`);
46
+ return response.data.data;
47
+ },
48
+ /**
49
+ * Create a product (requires owner auth)
50
+ */
51
+ async create(spotId, data) {
52
+ const client = (0, client_1.getApiClient)();
53
+ const response = await client.post(`/api/v1/spots/${spotId}/products`, data);
54
+ return response.data.data;
55
+ },
56
+ /**
57
+ * Update a product (requires owner auth)
58
+ */
59
+ async update(productId, data) {
60
+ const client = (0, client_1.getApiClient)();
61
+ const response = await client.put(`/api/v1/products/${productId}`, data);
62
+ return response.data.data;
63
+ },
64
+ /**
65
+ * Delete a product (requires owner auth)
66
+ */
67
+ async delete(productId) {
68
+ const client = (0, client_1.getApiClient)();
69
+ await client.delete(`/api/v1/products/${productId}`);
70
+ },
71
+ /**
72
+ * Adjust stock (requires owner auth)
73
+ */
74
+ async adjustStock(productId, quantity, reason, notes) {
75
+ const client = (0, client_1.getApiClient)();
76
+ const response = await client.post(`/api/v1/products/${productId}/stock`, { quantity, reason, notes });
77
+ return response.data.data;
78
+ },
79
+ };
80
+ // ============================================================================
81
+ // ORDERS SERVICE
82
+ // ============================================================================
83
+ exports.ordersService = {
84
+ /**
85
+ * Create an order
86
+ */
87
+ async create(data) {
88
+ const client = (0, client_1.getApiClient)();
89
+ const response = await client.post('/api/v1/orders', data);
90
+ return response.data.data;
91
+ },
92
+ /**
93
+ * Get order by ID
94
+ */
95
+ async getById(orderId) {
96
+ const client = (0, client_1.getApiClient)();
97
+ const response = await client.get(`/api/v1/orders/${orderId}`);
98
+ return response.data.data;
99
+ },
100
+ /**
101
+ * List my orders (as buyer)
102
+ */
103
+ async listMyOrders(params) {
104
+ const client = (0, client_1.getApiClient)();
105
+ const queryParams = new URLSearchParams();
106
+ if (params?.status)
107
+ queryParams.set('status', params.status);
108
+ if (params?.limit)
109
+ queryParams.set('limit', String(params.limit));
110
+ if (params?.page)
111
+ queryParams.set('page', String(params.page));
112
+ const response = await client.get(`/api/v1/users/me/orders?${queryParams}`);
113
+ return response.data.data;
114
+ },
115
+ /**
116
+ * List spot orders (as seller)
117
+ */
118
+ async listSpotOrders(spotId, params) {
119
+ const client = (0, client_1.getApiClient)();
120
+ const queryParams = new URLSearchParams();
121
+ if (params?.status)
122
+ queryParams.set('status', params.status);
123
+ if (params?.limit)
124
+ queryParams.set('limit', String(params.limit));
125
+ if (params?.page)
126
+ queryParams.set('page', String(params.page));
127
+ const response = await client.get(`/api/v1/seller/spots/${spotId}/orders?${queryParams}`);
128
+ return response.data.data;
129
+ },
130
+ /**
131
+ * Update order status (as seller)
132
+ */
133
+ async updateStatus(orderId, status) {
134
+ const client = (0, client_1.getApiClient)();
135
+ const response = await client.put(`/api/v1/orders/${orderId}/status`, { status });
136
+ return response.data.data;
137
+ },
138
+ /**
139
+ * Cancel order (as buyer)
140
+ */
141
+ async cancel(orderId) {
142
+ const client = (0, client_1.getApiClient)();
143
+ const response = await client.post(`/api/v1/orders/${orderId}/cancel`);
144
+ return response.data.data;
145
+ },
146
+ };
147
+ // ============================================================================
148
+ // PAYMENTS SERVICE
149
+ // ============================================================================
150
+ exports.paymentsService = {
151
+ /**
152
+ * Create Stripe PaymentIntent
153
+ */
154
+ async createStripeIntent(orderId) {
155
+ const client = (0, client_1.getApiClient)();
156
+ const response = await client.post(`/api/v1/payments/stripe/intent/${orderId}`);
157
+ return response.data.data;
158
+ },
159
+ /**
160
+ * Create Coinbase charge
161
+ */
162
+ async createCoinbaseCharge(orderId) {
163
+ const client = (0, client_1.getApiClient)();
164
+ const response = await client.post(`/api/v1/payments/coinbase/charge/${orderId}`);
165
+ return response.data.data;
166
+ },
167
+ };
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2V0cGxhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3NlcnZpY2VzL21hcmtldHBsYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBRUgsc0NBQXlDO0FBZ0R6QywrRUFBK0U7QUFDL0UsbUJBQW1CO0FBQ25CLCtFQUErRTtBQUVsRSxRQUFBLGVBQWUsR0FBRztJQUM3Qjs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQ2QsTUFBYyxFQUNkLE1BQXNGO1FBRXRGLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1FBQzlCLE1BQU0sV0FBVyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFDMUMsSUFBSSxNQUFNLEVBQUUsSUFBSTtZQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLE1BQU0sRUFBRSxNQUFNO1lBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdELElBQUksTUFBTSxFQUFFLEtBQUs7WUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxNQUFNLEVBQUUsSUFBSTtZQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQy9CLGlCQUFpQixNQUFNLGFBQWEsV0FBVyxFQUFFLENBQ2xELENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPLENB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Q0FBQyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE9BQWU7UUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUNoQyxvQ0FBb0MsT0FBTyxFQUFFLENBQzlDLENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXJrZXRwbGFjZSBBUEkgU2VydmljZVxuICpcbiAqIFBsYWluIGFzeW5jIGZ1bmN0aW9ucyBmb3IgcHJvZHVjdHMgYW5kIG9yZGVycy5cbiAqIENhbiBiZSB1c2VkIGluIHRlc3RzIG9yIG5vbi1SZWFjdCBlbnZpcm9ubWVudHMuXG4gKi9cblxuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHtcbiAgUHJvZHVjdCxcbiAgUHJvZHVjdFR5cGUsXG4gIFByb2R1Y3RTdGF0dXMsXG4gIE9yZGVyU3RhdHVzLFxuICBBcGlSZXNwb25zZSxcbiAgUGFnaW5hdGVkUmVzcG9uc2UsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgUHJvZHVjdFdpdGhTcG90IH0gZnJvbSAnLi4vcXVlcmllcy9wcm9kdWN0cyc7XG5pbXBvcnQgdHlwZSB7IE9yZGVyV2l0aERldGFpbHMgfSBmcm9tICcuLi9xdWVyaWVzL29yZGVycyc7XG5cbi8vIFJlLWV4cG9ydCBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHsgUHJvZHVjdFdpdGhTcG90LCBPcmRlcldpdGhEZXRhaWxzIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUHJvZHVjdElucHV0IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdHlwZTogUHJvZHVjdFR5cGU7XG4gIHByaWNlOiBudW1iZXI7XG4gIGN1cnJlbmN5Pzogc3RyaW5nO1xuICBzdG9ja1F1YW50aXR5PzogbnVtYmVyO1xuICBsb3dTdG9ja0FsZXJ0PzogbnVtYmVyO1xuICBkZWxpdmVyeVJhZGl1cz86IG51bWJlcjtcbiAgcHJlcFRpbWVNaW51dGVzPzogbnVtYmVyO1xuICBldmVudERhdGU/OiBzdHJpbmc7XG4gIGltYWdlVXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVByb2R1Y3RJbnB1dCB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBwcmljZT86IG51bWJlcjtcbiAgc3RvY2tRdWFudGl0eT86IG51bWJlcjtcbiAgbG93U3RvY2tBbGVydD86IG51bWJlcjtcbiAgc3RhdHVzPzogUHJvZHVjdFN0YXR1cztcbiAgZGVsaXZlcnlSYWRpdXM/OiBudW1iZXI7XG4gIHByZXBUaW1lTWludXRlcz86IG51bWJlcjtcbiAgZXZlbnREYXRlPzogc3RyaW5nO1xuICBpbWFnZVVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPcmRlcklucHV0IHtcbiAgc3BvdElkOiBzdHJpbmc7XG4gIGl0ZW1zOiBBcnJheTx7IHByb2R1Y3RJZDogc3RyaW5nOyBxdWFudGl0eTogbnVtYmVyIH0+O1xuICBub3Rlcz86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUFJPRFVDVFMgU0VSVklDRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgcHJvZHVjdHNTZXJ2aWNlID0ge1xuICAvKipcbiAgICogTGlzdCBwcm9kdWN0cyBmb3IgYSBzcG90XG4gICAqL1xuICBhc3luYyBsaXN0QnlTcG90KFxuICAgIHNwb3RJZDogc3RyaW5nLFxuICAgIHBhcmFtcz86IHsgdHlwZT86IFByb2R1Y3RUeXBlOyBzdGF0dXM/OiBQcm9kdWN0U3RhdHVzOyBsaW1pdD86IG51bWJlcjsgcGFnZT86IG51bWJlciB9XG4gICk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8UHJvZHVjdD4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAocGFyYW1zPy50eXBlKSBxdWVyeVBhcmFtcy5zZXQoJ3R5cGUnLCBwYXJhbXMudHlwZSk7XG4gICAgaWYgKHBhcmFtcz8uc3RhdHVzKSBxdWVyeVBhcmFtcy5zZXQoJ3N0YXR1cycsIHBhcmFtcy5zdGF0dXMpO1xuICAgIGlmIChwYXJhbXM/LmxpbWl0KSBxdWVyeVBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKHBhcmFtcy5saW1pdCkpO1xuICAgIGlmIChwYXJhbXM/LnBhZ2UpIHF1ZXJ5UGFyYW1zLnNldCgncGFnZScsIFN0cmluZyhwYXJhbXMucGFnZSkpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTxQYWdpbmF0ZWRSZXNwb25zZTxQcm9kdWN0Pj4+KFxuICAgICAgYC9hcGkvdjEvc3BvdHMvJHtzcG90SWR9L3Byb2R1Y3RzPyR7cXVlcnlQYXJhbXN9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IHByb2R1Y3QgYnkgSURcbiAgICovXG4gIGFzeW5jIGdldEJ5SWQocHJvZHVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFByb2R1Y3RXaXRoU3BvdD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxBcGlSZXNwb25zZTxQcm9kdWN0V2l0aFNwb3Q+PihcbiAgICAgIGAvYXBpL3YxL3Byb2R1Y3RzLyR7cHJvZHVjdElkfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGE7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBwcm9kdWN0IGJ5IHNsdWdcbiAgICovXG4gIGFzeW5jIGdldEJ5U2x1ZyhzcG90SWQ6IHN0cmluZywgc2x1Zzogc3RyaW5nKTogUHJvbWlzZTxQcm9kdWN0V2l0aFNwb3Q+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8QXBpUmVzcG9uc2U8UHJvZHVjdFdpdGhTcG90Pj4oXG4gICAgICBgL2FwaS92MS9zcG90cy8ke3Nwb3RJZH0vcHJvZHVjdHMvc2x1Zy8ke3NsdWd9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgcHJvZHVjdCAocmVxdWlyZXMgb3duZXIgYXV0aClcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShzcG90SWQ6IHN0cmluZywgZGF0YTogQ3JlYXRlUHJvZHVjdElucHV0KTogUHJvbWlzZTxQcm9kdWN0PiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDxBcGlSZXNwb25zZTxQcm9kdWN0Pj4oXG4gICAgICBgL2FwaS92MS9zcG90cy8ke3Nwb3RJZH0vcHJvZHVjdHNgLFxuICAgICAgZGF0YVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlIGEgcHJvZHVjdCAocmVxdWlyZXMgb3duZXIgYXV0aClcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShwcm9kdWN0SWQ6IHN0cmluZywgZGF0YTogVXBkYXRlUHJvZHVjdElucHV0KTogUHJvbWlzZTxQcm9kdWN0PiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucHV0PEFwaVJlc3BvbnNlPFByb2R1Y3Q+PihcbiAgICAgIGAvYXBpL3YxL3Byb2R1Y3RzLyR7cHJvZHVjdElkfWAsXG4gICAgICBkYXRhXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBwcm9kdWN0IChyZXF1aXJlcyBvd25lciBhdXRoKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKHByb2R1Y3RJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgYXdhaXQgY2xpZW50LmRlbGV0ZShgL2FwaS92MS9wcm9kdWN0cy8ke3Byb2R1Y3RJZH1gKTtcbiAgfSxcblxuICAvKipcbiAgICogQWRqdXN0IHN0b2NrIChyZXF1aXJlcyBvd25lciBhdXRoKVxuICAgKi9cbiAgYXN5bmMgYWRqdXN0U3RvY2soXG4gICAgcHJvZHVjdElkOiBzdHJpbmcsXG4gICAgcXVhbnRpdHk6IG51bWJlcixcbiAgICByZWFzb246ICdSRVNUT0NLJyB8ICdBREpVU1RNRU5UJyxcbiAgICBub3Rlcz86IHN0cmluZ1xuICApOiBQcm9taXNlPFByb2R1Y3Q+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PEFwaVJlc3BvbnNlPFByb2R1Y3Q+PihcbiAgICAgIGAvYXBpL3YxL3Byb2R1Y3RzLyR7cHJvZHVjdElkfS9zdG9ja2AsXG4gICAgICB7IHF1YW50aXR5LCByZWFzb24sIG5vdGVzIH1cbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGE7XG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPUkRFUlMgU0VSVklDRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3Qgb3JkZXJzU2VydmljZSA9IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBvcmRlclxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IENyZWF0ZU9yZGVySW5wdXQpOiBQcm9taXNlPE9yZGVyV2l0aERldGFpbHM+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PEFwaVJlc3BvbnNlPE9yZGVyV2l0aERldGFpbHM+PihcbiAgICAgICcvYXBpL3YxL29yZGVycycsXG4gICAgICBkYXRhXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgb3JkZXIgYnkgSURcbiAgICovXG4gIGFzeW5jIGdldEJ5SWQob3JkZXJJZDogc3RyaW5nKTogUHJvbWlzZTxPcmRlcldpdGhEZXRhaWxzPiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PEFwaVJlc3BvbnNlPE9yZGVyV2l0aERldGFpbHM+PihcbiAgICAgIGAvYXBpL3YxL29yZGVycy8ke29yZGVySWR9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogTGlzdCBteSBvcmRlcnMgKGFzIGJ1eWVyKVxuICAgKi9cbiAgYXN5bmMgbGlzdE15T3JkZXJzKFxuICAgIHBhcmFtcz86IHsgc3RhdHVzPzogT3JkZXJTdGF0dXM7IGxpbWl0PzogbnVtYmVyOyBwYWdlPzogbnVtYmVyIH1cbiAgKTogUHJvbWlzZTxQYWdpbmF0ZWRSZXNwb25zZTxPcmRlcldpdGhEZXRhaWxzPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGlmIChwYXJhbXM/LnN0YXR1cykgcXVlcnlQYXJhbXMuc2V0KCdzdGF0dXMnLCBwYXJhbXMuc3RhdHVzKTtcbiAgICBpZiAocGFyYW1zPy5saW1pdCkgcXVlcnlQYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhwYXJhbXMubGltaXQpKTtcbiAgICBpZiAocGFyYW1zPy5wYWdlKSBxdWVyeVBhcmFtcy5zZXQoJ3BhZ2UnLCBTdHJpbmcocGFyYW1zLnBhZ2UpKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8QXBpUmVzcG9uc2U8UGFnaW5hdGVkUmVzcG9uc2U8T3JkZXJXaXRoRGV0YWlscz4+PihcbiAgICAgIGAvYXBpL3YxL3VzZXJzL21lL29yZGVycz8ke3F1ZXJ5UGFyYW1zfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGE7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExpc3Qgc3BvdCBvcmRlcnMgKGFzIHNlbGxlcilcbiAgICovXG4gIGFzeW5jIGxpc3RTcG90T3JkZXJzKFxuICAgIHNwb3RJZDogc3RyaW5nLFxuICAgIHBhcmFtcz86IHsgc3RhdHVzPzogT3JkZXJTdGF0dXM7IGxpbWl0PzogbnVtYmVyOyBwYWdlPzogbnVtYmVyIH1cbiAgKTogUHJvbWlzZTxQYWdpbmF0ZWRSZXNwb25zZTxPcmRlcldpdGhEZXRhaWxzPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGlmIChwYXJhbXM/LnN0YXR1cykgcXVlcnlQYXJhbXMuc2V0KCdzdGF0dXMnLCBwYXJhbXMuc3RhdHVzKTtcbiAgICBpZiAocGFyYW1zPy5saW1pdCkgcXVlcnlQYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhwYXJhbXMubGltaXQpKTtcbiAgICBpZiAocGFyYW1zPy5wYWdlKSBxdWVyeVBhcmFtcy5zZXQoJ3BhZ2UnLCBTdHJpbmcocGFyYW1zLnBhZ2UpKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8QXBpUmVzcG9uc2U8UGFnaW5hdGVkUmVzcG9uc2U8T3JkZXJXaXRoRGV0YWlscz4+PihcbiAgICAgIGAvYXBpL3YxL3NlbGxlci9zcG90cy8ke3Nwb3RJZH0vb3JkZXJzPyR7cXVlcnlQYXJhbXN9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlIG9yZGVyIHN0YXR1cyAoYXMgc2VsbGVyKVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlU3RhdHVzKG9yZGVySWQ6IHN0cmluZywgc3RhdHVzOiBPcmRlclN0YXR1cyk6IFByb21pc2U8T3JkZXJXaXRoRGV0YWlscz4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnB1dDxBcGlSZXNwb25zZTxPcmRlcldpdGhEZXRhaWxzPj4oXG4gICAgICBgL2FwaS92MS9vcmRlcnMvJHtvcmRlcklkfS9zdGF0dXNgLFxuICAgICAgeyBzdGF0dXMgfVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogQ2FuY2VsIG9yZGVyIChhcyBidXllcilcbiAgICovXG4gIGFzeW5jIGNhbmNlbChvcmRlcklkOiBzdHJpbmcpOiBQcm9taXNlPE9yZGVyV2l0aERldGFpbHM+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PEFwaVJlc3BvbnNlPE9yZGVyV2l0aERldGFpbHM+PihcbiAgICAgIGAvYXBpL3YxL29yZGVycy8ke29yZGVySWR9L2NhbmNlbGBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGE7XG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQQVlNRU5UUyBTRVJWSUNFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBwYXltZW50c1NlcnZpY2UgPSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgU3RyaXBlIFBheW1lbnRJbnRlbnRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVN0cmlwZUludGVudChvcmRlcklkOiBzdHJpbmcpOiBQcm9taXNlPHsgY2xpZW50U2VjcmV0OiBzdHJpbmc7IHBheW1lbnRJbnRlbnRJZDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PEFwaVJlc3BvbnNlPHsgY2xpZW50U2VjcmV0OiBzdHJpbmc7IHBheW1lbnRJbnRlbnRJZDogc3RyaW5nIH0+PihcbiAgICAgIGAvYXBpL3YxL3BheW1lbnRzL3N0cmlwZS9pbnRlbnQvJHtvcmRlcklkfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGE7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBDb2luYmFzZSBjaGFyZ2VcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUNvaW5iYXNlQ2hhcmdlKG9yZGVySWQ6IHN0cmluZyk6IFByb21pc2U8eyBjaGFyZ2VJZDogc3RyaW5nOyBjaGFyZ2VDb2RlOiBzdHJpbmc7IGhvc3RlZFVybDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PEFwaVJlc3BvbnNlPHsgY2hhcmdlSWQ6IHN0cmluZzsgY2hhcmdlQ29kZTogc3RyaW5nOyBob3N0ZWRVcmw6IHN0cmluZyB9Pj4oXG4gICAgICBgL2FwaS92MS9wYXltZW50cy9jb2luYmFzZS9jaGFyZ2UvJHtvcmRlcklkfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGE7XG4gIH0sXG59O1xuIl19