@spotsdev/sdk 1.4.0 → 1.5.2

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 (67) hide show
  1. package/dist/index.cjs +2166 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +1656 -0
  4. package/dist/index.d.ts +1655 -36
  5. package/dist/index.js +2021 -64
  6. package/dist/index.js.map +1 -0
  7. package/package.json +22 -6
  8. package/src/api/entities.ts +171 -170
  9. package/src/api/mutations/products.ts +18 -2
  10. package/src/api/queries/index.ts +4 -0
  11. package/src/api/queries/payments.ts +67 -0
  12. package/dist/api/client.d.ts +0 -12
  13. package/dist/api/client.js +0 -72
  14. package/dist/api/entities.d.ts +0 -305
  15. package/dist/api/entities.js +0 -13
  16. package/dist/api/mutations/clubs.d.ts +0 -47
  17. package/dist/api/mutations/clubs.js +0 -97
  18. package/dist/api/mutations/conversations.d.ts +0 -45
  19. package/dist/api/mutations/conversations.js +0 -114
  20. package/dist/api/mutations/index.d.ts +0 -14
  21. package/dist/api/mutations/index.js +0 -40
  22. package/dist/api/mutations/notifications.d.ts +0 -38
  23. package/dist/api/mutations/notifications.js +0 -64
  24. package/dist/api/mutations/orders.d.ts +0 -73
  25. package/dist/api/mutations/orders.js +0 -114
  26. package/dist/api/mutations/posts.d.ts +0 -123
  27. package/dist/api/mutations/posts.js +0 -242
  28. package/dist/api/mutations/products.d.ts +0 -81
  29. package/dist/api/mutations/products.js +0 -98
  30. package/dist/api/mutations/redemptions.d.ts +0 -33
  31. package/dist/api/mutations/redemptions.js +0 -63
  32. package/dist/api/mutations/spots.d.ts +0 -93
  33. package/dist/api/mutations/spots.js +0 -167
  34. package/dist/api/mutations/users.d.ts +0 -73
  35. package/dist/api/mutations/users.js +0 -175
  36. package/dist/api/queries/auth.d.ts +0 -37
  37. package/dist/api/queries/auth.js +0 -61
  38. package/dist/api/queries/clubs.d.ts +0 -52
  39. package/dist/api/queries/clubs.js +0 -116
  40. package/dist/api/queries/conversations.d.ts +0 -52
  41. package/dist/api/queries/conversations.js +0 -83
  42. package/dist/api/queries/index.d.ts +0 -28
  43. package/dist/api/queries/index.js +0 -69
  44. package/dist/api/queries/misc.d.ts +0 -30
  45. package/dist/api/queries/misc.js +0 -91
  46. package/dist/api/queries/notifications.d.ts +0 -34
  47. package/dist/api/queries/notifications.js +0 -62
  48. package/dist/api/queries/orders.d.ts +0 -45
  49. package/dist/api/queries/orders.js +0 -93
  50. package/dist/api/queries/posts.d.ts +0 -92
  51. package/dist/api/queries/posts.js +0 -233
  52. package/dist/api/queries/products.d.ts +0 -48
  53. package/dist/api/queries/products.js +0 -87
  54. package/dist/api/queries/spots.d.ts +0 -93
  55. package/dist/api/queries/spots.js +0 -250
  56. package/dist/api/queries/templates.d.ts +0 -39
  57. package/dist/api/queries/templates.js +0 -81
  58. package/dist/api/queries/users.d.ts +0 -104
  59. package/dist/api/queries/users.js +0 -235
  60. package/dist/api/queries/wallet.d.ts +0 -109
  61. package/dist/api/queries/wallet.js +0 -136
  62. package/dist/api/services/index.d.ts +0 -2
  63. package/dist/api/services/index.js +0 -8
  64. package/dist/api/services/marketplace.d.ts +0 -129
  65. package/dist/api/services/marketplace.js +0 -168
  66. package/dist/api/types.d.ts +0 -57
  67. package/dist/api/types.js +0 -33
@@ -1,19 +1,18 @@
1
1
  /**
2
2
  * Spots SDK Entity Types
3
3
  *
4
- * These types mirror the Prisma schema entities but without @prisma/client dependency.
5
- * This allows the SDK to work in React Native where Prisma is not available.
4
+ * ALL entity and enum types are imported from @spotsdev/types (generated from OpenAPI spec).
5
+ * This file re-exports them with SDK-friendly aliases and adds SDK-specific types.
6
6
  *
7
- * IMPORTANT: Enum types are imported from @spotsdev/types (generated from OpenAPI spec).
8
- * types.ts handles re-exporting from spots-types - this file only defines entity interfaces
9
- * and SDK-specific types not in the OpenAPI spec.
7
+ * IMPORTANT: Do NOT define entity types here - they come from spots-types.
10
8
  */
11
9
 
12
10
  // ============================================================================
13
- // IMPORTS FROM @spotsdev/types (used in interfaces below)
14
- // These are NOT re-exported - types.ts handles the re-export from spots-types
11
+ // RE-EXPORTS FROM @spotsdev/types
12
+ // All entity types come from the generated OpenAPI types
15
13
  // ============================================================================
16
- import type {
14
+ export type {
15
+ // Enums
17
16
  SpotType,
18
17
  AccountStatus,
19
18
  PostType,
@@ -22,101 +21,143 @@ import type {
22
21
  ReportReason,
23
22
  ProductType,
24
23
  ProductStatus,
25
- ProductResponseDto,
24
+ FulfillmentType,
26
25
  ClaimStatus,
27
26
  OrderStatus,
28
27
  NotificationType,
28
+ MediaType,
29
+
30
+ // Spot types
31
+ SpotResponseDto,
32
+ PaginatedSpotsResponseDto,
33
+ SpotClaimResponseDto,
34
+ SpotCityDto,
35
+ SpotImageDto,
36
+ SpotVibeDto,
37
+ SpotIntentionDto,
38
+ SpotOwnerDto,
39
+ CreateSpotDto,
40
+ UpdateSpotDto,
41
+ ClaimSpotDto,
42
+
43
+ // Post types
44
+ PostResponseDto,
45
+ PaginatedPostsResponseDto,
46
+ PostReportResponseDto,
47
+ UpvoteResponseDto,
48
+ PostStatusResponseDto,
49
+ PostUserDto,
50
+ PostSpotDto,
51
+ PostReplyDto,
52
+ CreatePostDto,
53
+ UpdatePostDto,
54
+ CreateReplyDto,
55
+ CreateResponseDto,
56
+ UpdateResponseDto,
57
+ CreateReportDto,
58
+ PostStatusDto,
59
+
60
+ // User types
61
+ UserResponseDto,
62
+ UpdateUserDto,
63
+ AuthUserDto,
64
+ AuthTokensDto,
65
+
66
+ // Product/Marketplace types
67
+ ProductResponseDto,
68
+ CreateProductDto,
69
+ UpdateProductDto,
70
+ PaginatedProductsResponseDto,
71
+ AdjustStockDto,
72
+
73
+ // Order types
74
+ CreateOrderDto,
75
+ OrderItemDto,
76
+ UpdateOrderStatusDto,
77
+
78
+ // Notification types
79
+ NotificationResponseDto,
80
+ NotificationsListResponseDto,
81
+
82
+ // Auth types
83
+ SendOtpDto,
84
+ VerifyOtpDto,
85
+ RefreshTokenDto,
86
+ SendOtpResponseDto,
87
+ RefreshTokenResponseDto,
88
+
89
+ // Other types
90
+ CreateMediaDto,
91
+ CreateConversationDto,
92
+ CreateMessageDto,
93
+ CreateInterestDto,
94
+ UpdateInterestDto,
95
+ AddUserInterestDto,
96
+ CreateIntentionDto,
97
+ UpdateIntentionDto,
98
+
99
+ // Generic API response
100
+ ApiResponse,
29
101
  } from '@spotsdev/types'
30
102
 
31
- // Type alias for backwards compatibility - SDK uses SpotPostType, API uses PostType
32
- export type SpotPostType = PostType
33
-
34
- // Enums not yet in OpenAPI spec DTOs - these stay local until API exposes them
35
- export type ReportStatus = 'PENDING' | 'REVIEWED' | 'RESOLVED' | 'DISMISSED'
103
+ import type {
104
+ PostType,
105
+ SpotResponseDto,
106
+ PostResponseDto,
107
+ PostReplyDto as PostReplyDtoType,
108
+ ProductResponseDto,
109
+ SpotImageDto as SpotImageDtoType,
110
+ SpotVibeDto as SpotVibeDtoType,
111
+ SpotIntentionDto as SpotIntentionDtoType,
112
+ OrderItemDto as OrderItemDtoType,
113
+ NotificationResponseDto,
114
+ SpotOwnerDto,
115
+ PostUserDto,
116
+ ResponseStatus,
117
+ ReportReason,
118
+ ClaimStatus,
119
+ OrderStatus,
120
+ } from '@spotsdev/types'
36
121
 
37
122
  // ============================================================================
38
- // ENTITY INTERFACES
123
+ // TYPE ALIASES FOR SDK BACKWARDS COMPATIBILITY
124
+ // These map old SDK names to new spots-types names
39
125
  // ============================================================================
40
126
 
41
- export interface UserVibe {
42
- id: string
43
- name: string
44
- emoji: string | null
45
- slug?: string
46
- category?: string
47
- }
48
-
49
- export interface User {
50
- id: string
51
- phone: string | null
52
- email: string | null
53
- name: string | null
54
- bio: string | null
55
- avatarUrl: string | null
56
- status: AccountStatus
57
- onboardingCompleted: boolean
58
- vibes?: UserVibe[]
59
- lastActiveAt: Date | null
60
- createdAt: Date
61
- updatedAt: Date
62
- }
127
+ // SpotPostType is the SDK's name for PostType
128
+ export type SpotPostType = PostType
63
129
 
64
- export interface Spot {
65
- id: string
66
- name: string
67
- slug: string
68
- description: string | null
69
- address: string | null
70
- city: string | null
71
- country: string | null
72
- latitude: number | null
73
- longitude: number | null
74
- // Aliases for backwards compatibility
75
- lat?: number | null
76
- lng?: number | null
77
- type: SpotType
78
- googlePlaceId: string | null
79
- website: string | null
80
- phone: string | null
81
- imageUrl: string | null
82
- ownerId: string | null
83
- isVerified: boolean
84
- marketplaceEnabled: boolean
85
- // Dates as strings for JSON serialization compatibility
86
- createdAt: Date | string
87
- updatedAt: Date | string
130
+ // Entity type aliases - map to response DTOs
131
+ export type Spot = SpotResponseDto
132
+ export type SpotPost = PostResponseDto
133
+ export type PostReply = PostReplyDtoType
134
+ export type Product = ProductResponseDto
135
+ export type SpotImage = SpotImageDtoType
136
+ export type SpotVibe = SpotVibeDtoType
137
+ export type SpotIntention = SpotIntentionDtoType
138
+ export type OrderItem = OrderItemDtoType
139
+ export type Notification = NotificationResponseDto
140
+
141
+ // User alias from SpotOwnerDto (simplified user in spot responses)
142
+ export type User = SpotOwnerDto & {
143
+ phone?: string | null
144
+ email?: string | null
145
+ bio?: string | null
146
+ onboardingCompleted?: boolean
147
+ lastActiveAt?: Date | null
148
+ createdAt?: Date
149
+ updatedAt?: Date
88
150
  }
89
151
 
90
- export interface SpotPost {
91
- id: string
92
- spotId: string
93
- userId: string
94
- postType: SpotPostType
95
- title: string
96
- content: string | null
97
- emoji: string | null
98
- expiresAt: Date | null
99
- status: 'ACTIVE' | 'FULFILLED' | 'EXPIRED' | 'DELETED'
100
- upvoteCount: number
101
- responseCount: number
102
- replyCount: number
103
- createdAt: Date
104
- updatedAt: Date
105
- // Relations (optional, populated by API)
106
- user?: User
107
- spot?: Spot
108
- }
152
+ // ============================================================================
153
+ // SDK-SPECIFIC TYPES (not in OpenAPI spec)
154
+ // ============================================================================
109
155
 
110
- export interface PostReply {
111
- id: string
112
- postId: string
113
- userId: string
114
- content: string
115
- createdAt: Date
116
- updatedAt: Date
117
- user?: User
118
- }
156
+ // Enums not yet exposed via API DTOs
157
+ export type ReportStatus = 'PENDING' | 'REVIEWED' | 'RESOLVED' | 'DISMISSED'
158
+ export type ClubMemberRole = 'MEMBER' | 'ADMIN' | 'OWNER'
119
159
 
160
+ // PostResponse entity (different from CreateResponseDto/UpdateResponseDto)
120
161
  export interface PostResponse {
121
162
  id: string
122
163
  postId: string
@@ -129,6 +170,7 @@ export interface PostResponse {
129
170
  post?: SpotPost
130
171
  }
131
172
 
173
+ // PostUpvote entity
132
174
  export interface PostUpvote {
133
175
  id: string
134
176
  postId: string
@@ -136,9 +178,7 @@ export interface PostUpvote {
136
178
  createdAt: Date
137
179
  }
138
180
 
139
- /**
140
- * PostUpvoter - user who upvoted a post (from /posts/:id/upvotes endpoint)
141
- */
181
+ // PostUpvoter for /posts/:id/upvotes endpoint
142
182
  export interface PostUpvoter {
143
183
  id: string
144
184
  userId: string
@@ -147,9 +187,7 @@ export interface PostUpvoter {
147
187
  createdAt: Date
148
188
  }
149
189
 
150
- /**
151
- * PostUpvotesResponse - response from /posts/:id/upvotes endpoint
152
- */
190
+ // PostUpvotesResponse from /posts/:id/upvotes endpoint
153
191
  export interface PostUpvotesResponse {
154
192
  data: PostUpvoter[]
155
193
  meta: {
@@ -162,6 +200,7 @@ export interface PostUpvotesResponse {
162
200
  }
163
201
  }
164
202
 
203
+ // PostReport entity
165
204
  export interface PostReport {
166
205
  id: string
167
206
  postId: string
@@ -173,6 +212,7 @@ export interface PostReport {
173
212
  updatedAt: Date
174
213
  }
175
214
 
215
+ // Club entities (not yet in API DTOs)
176
216
  export interface Club {
177
217
  id: string
178
218
  name: string
@@ -189,10 +229,11 @@ export interface ClubMember {
189
229
  id: string
190
230
  clubId: string
191
231
  userId: string
192
- role: 'MEMBER' | 'ADMIN' | 'OWNER'
232
+ role: ClubMemberRole
193
233
  joinedAt: Date
194
234
  }
195
235
 
236
+ // Conversation entities (not yet in API DTOs)
196
237
  export interface Conversation {
197
238
  id: string
198
239
  createdAt: Date
@@ -210,17 +251,7 @@ export interface Message {
210
251
  sender?: User
211
252
  }
212
253
 
213
- export interface Notification {
214
- id: string
215
- userId: string
216
- type: NotificationType
217
- title: string
218
- body: string | null
219
- data: Record<string, unknown> | null
220
- isRead: boolean
221
- createdAt: Date
222
- }
223
-
254
+ // Template entity (not yet in API DTOs)
224
255
  export interface PostTemplate {
225
256
  id: string
226
257
  postType: SpotPostType
@@ -233,6 +264,7 @@ export interface PostTemplate {
233
264
  updatedAt: Date
234
265
  }
235
266
 
267
+ // Reference entities (not yet in API DTOs)
236
268
  export interface Vibe {
237
269
  id: string
238
270
  name: string
@@ -262,6 +294,16 @@ export interface LifeSituation {
262
294
  createdAt: Date
263
295
  }
264
296
 
297
+ // User vibe (simplified vibe attached to user)
298
+ export interface UserVibe {
299
+ id: string
300
+ name: string
301
+ emoji: string | null
302
+ slug?: string
303
+ category?: string
304
+ }
305
+
306
+ // Favorites and subscriptions (not yet in API DTOs)
265
307
  export interface FavoriteSpot {
266
308
  id: string
267
309
  userId: string
@@ -270,29 +312,15 @@ export interface FavoriteSpot {
270
312
  spot?: Spot
271
313
  }
272
314
 
273
- export interface SpotImage {
315
+ export interface SpotSubscription {
274
316
  id: string
275
317
  spotId: string
276
- url: string
277
- caption: string | null
278
- sortOrder: number
318
+ userId: string
279
319
  createdAt: Date
320
+ spot?: Spot
280
321
  }
281
322
 
282
- export interface SpotVibe {
283
- id: string
284
- spotId: string
285
- vibeId: string
286
- vibe?: Vibe
287
- }
288
-
289
- export interface SpotIntention {
290
- id: string
291
- spotId: string
292
- intentionId: string
293
- intention?: Intention
294
- }
295
-
323
+ // SpotClaim entity
296
324
  export interface SpotClaim {
297
325
  id: string
298
326
  spotId: string
@@ -303,14 +331,7 @@ export interface SpotClaim {
303
331
  updatedAt: Date
304
332
  }
305
333
 
306
- export interface SpotSubscription {
307
- id: string
308
- spotId: string
309
- userId: string
310
- createdAt: Date
311
- spot?: Spot
312
- }
313
-
334
+ // City entity
314
335
  export interface City {
315
336
  id: string
316
337
  name: string
@@ -321,36 +342,7 @@ export interface City {
321
342
  createdAt: Date
322
343
  }
323
344
 
324
- // ============================================================================
325
- // API RESPONSE TYPES
326
- // ============================================================================
327
-
328
- // NOTE: ApiResponse is re-exported from @spots/types in types.ts
329
-
330
- /**
331
- * Paginated response with meta information
332
- */
333
- export interface PaginatedResponse<T> {
334
- data: T[]
335
- meta: PaginationMeta
336
- }
337
-
338
- export interface PaginationMeta {
339
- total: number
340
- page: number
341
- limit: number
342
- totalPages: number
343
- hasNextPage: boolean
344
- hasPreviousPage: boolean
345
- }
346
-
347
- // ============================================================================
348
- // MARKETPLACE TYPES
349
- // ============================================================================
350
-
351
- // Use ProductResponseDto from spots-types directly
352
- export type Product = ProductResponseDto
353
-
345
+ // Order entity (full order, not just OrderItemDto)
354
346
  export interface Order {
355
347
  id: string
356
348
  spotId: string
@@ -364,14 +356,23 @@ export interface Order {
364
356
  metadata: Record<string, unknown> | null
365
357
  createdAt: Date
366
358
  updatedAt: Date
359
+ items?: OrderItem[]
367
360
  }
368
361
 
369
- export interface OrderItem {
370
- id: string
371
- orderId: string
372
- productId: string
373
- quantity: number
374
- unitPrice: number
362
+ // ============================================================================
363
+ // PAGINATION TYPES
364
+ // ============================================================================
365
+
366
+ export interface PaginationMeta {
375
367
  total: number
376
- createdAt: Date
368
+ page: number
369
+ limit: number
370
+ totalPages: number
371
+ hasNextPage: boolean
372
+ hasPreviousPage: boolean
373
+ }
374
+
375
+ export interface PaginatedResponse<T> {
376
+ data: T[]
377
+ meta: PaginationMeta
377
378
  }
@@ -21,6 +21,7 @@ import type {Product, ProductType, ProductStatus, ApiResponse} from '../types'
21
21
  export interface CreateProductRequest {
22
22
  spotId: string
23
23
  name: string
24
+ slug?: string // Optional - auto-generated from name if not provided
24
25
  description?: string
25
26
  type: ProductType
26
27
  price: number
@@ -37,6 +38,17 @@ export interface CreateProductRequest {
37
38
  metadata?: Record<string, unknown>
38
39
  }
39
40
 
41
+ /**
42
+ * Generate URL-friendly slug from name
43
+ */
44
+ function generateSlug(name: string): string {
45
+ return name
46
+ .toLowerCase()
47
+ .replace(/[^a-z0-9]+/g, '-')
48
+ .replace(/^-|-$/g, '')
49
+ .slice(0, 100)
50
+ }
51
+
40
52
  export interface UpdateProductRequest {
41
53
  name?: string
42
54
  description?: string
@@ -74,10 +86,14 @@ export function useCreateProduct(
74
86
  return useMutation({
75
87
  mutationFn: async (data: CreateProductRequest): Promise<Product> => {
76
88
  const client = getApiClient()
77
- const {spotId, ...productData} = data
89
+ const {spotId, slug, ...productData} = data
90
+
91
+ // Auto-generate slug from name if not provided
92
+ const productSlug = slug || generateSlug(productData.name)
93
+
78
94
  const response = await client.post<ApiResponse<Product>>(
79
95
  `/spots/${spotId}/products`,
80
- productData,
96
+ {...productData, slug: productSlug},
81
97
  )
82
98
  return response.data.data
83
99
  },
@@ -50,3 +50,7 @@ export {orderKeys} from './orders'
50
50
  // Wallet (redemptions)
51
51
  export * from './wallet'
52
52
  export {walletKeys} from './wallet'
53
+
54
+ // Payments
55
+ export * from './payments'
56
+ export {paymentKeys} from './payments'
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Payments Query Hooks
3
+ *
4
+ * TanStack Query hooks for payment configuration.
5
+ */
6
+
7
+ import {
8
+ useQuery,
9
+ type UseQueryOptions,
10
+ type UseQueryResult,
11
+ } from '@tanstack/react-query'
12
+ import {getApiClient} from '../client'
13
+ import type {ApiResponse} from '../types'
14
+
15
+ // ============================================================================
16
+ // QUERY KEYS
17
+ // ============================================================================
18
+
19
+ export const paymentKeys = {
20
+ all: ['payments'] as const,
21
+ config: () => [...paymentKeys.all, 'config'] as const,
22
+ }
23
+
24
+ // ============================================================================
25
+ // TYPES
26
+ // ============================================================================
27
+
28
+ /**
29
+ * Payment configuration returned by GET /payments/config
30
+ */
31
+ export interface PaymentConfig {
32
+ stripe: {
33
+ publishableKey: string | null
34
+ enabled: boolean
35
+ }
36
+ coinbase: {
37
+ enabled: boolean
38
+ }
39
+ supportedMethods: Array<'card' | 'apple_pay' | 'google_pay' | 'crypto'>
40
+ }
41
+
42
+ // ============================================================================
43
+ // QUERY HOOKS
44
+ // ============================================================================
45
+
46
+ /**
47
+ * Get payment configuration
48
+ * Returns publishable keys and enabled payment methods
49
+ *
50
+ * @endpoint GET /payments/config
51
+ */
52
+ export function usePaymentConfig(
53
+ options?: Omit<UseQueryOptions<PaymentConfig>, 'queryKey' | 'queryFn'>,
54
+ ): UseQueryResult<PaymentConfig> {
55
+ return useQuery({
56
+ queryKey: paymentKeys.config(),
57
+ queryFn: async (): Promise<PaymentConfig> => {
58
+ const client = getApiClient()
59
+ const response = await client.get<ApiResponse<PaymentConfig>>(
60
+ '/payments/config',
61
+ )
62
+ return response.data.data
63
+ },
64
+ staleTime: 1000 * 60 * 60, // 1 hour - config rarely changes
65
+ ...options,
66
+ })
67
+ }
@@ -1,12 +0,0 @@
1
- import { type AxiosInstance } from 'axios';
2
- export interface SDKConfig {
3
- baseURL: string;
4
- getAccessToken: () => string | null | Promise<string | null>;
5
- refreshAccessToken?: () => Promise<string>;
6
- onUnauthorized?: () => void;
7
- }
8
- declare let apiClient: AxiosInstance | null;
9
- export declare function configureSDK(sdkConfig: SDKConfig): void;
10
- export declare function getApiClient(): AxiosInstance;
11
- export declare function getConfig(): SDKConfig;
12
- export { apiClient };
@@ -1,72 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.apiClient = void 0;
7
- exports.configureSDK = configureSDK;
8
- exports.getApiClient = getApiClient;
9
- exports.getConfig = getConfig;
10
- const axios_1 = __importDefault(require("axios"));
11
- let config = null;
12
- let apiClient = null;
13
- exports.apiClient = apiClient;
14
- function configureSDK(sdkConfig) {
15
- config = sdkConfig;
16
- exports.apiClient = apiClient = createApiClient(sdkConfig);
17
- }
18
- function getApiClient() {
19
- if (!apiClient) {
20
- throw new Error('SDK not configured. Call configureSDK() first.');
21
- }
22
- return apiClient;
23
- }
24
- function getConfig() {
25
- if (!config) {
26
- throw new Error('SDK not configured. Call configureSDK() first.');
27
- }
28
- return config;
29
- }
30
- function createApiClient(sdkConfig) {
31
- const client = axios_1.default.create({
32
- baseURL: sdkConfig.baseURL,
33
- headers: {
34
- 'Content-Type': 'application/json',
35
- },
36
- });
37
- // Request interceptor - add auth token
38
- client.interceptors.request.use(async (requestConfig) => {
39
- const token = await sdkConfig.getAccessToken();
40
- if (token) {
41
- requestConfig.headers.Authorization = `Bearer ${token}`;
42
- }
43
- // Debug logging
44
- console.log(`[SDK] ${requestConfig.method?.toUpperCase()} ${sdkConfig.baseURL}${requestConfig.url}`);
45
- return requestConfig;
46
- }, error => Promise.reject(error));
47
- // Response interceptor - handle 401
48
- client.interceptors.response.use(response => response, async (error) => {
49
- console.log(`[SDK] Error: ${error.response?.status} ${error.config?.url}`, error.message);
50
- // Handle auth token expiration (401)
51
- if (error.response?.status === 401) {
52
- if (sdkConfig.refreshAccessToken) {
53
- try {
54
- const newToken = await sdkConfig.refreshAccessToken();
55
- if (newToken && error.config) {
56
- error.config.headers.Authorization = `Bearer ${newToken}`;
57
- return client.request(error.config);
58
- }
59
- }
60
- catch {
61
- sdkConfig.onUnauthorized?.();
62
- }
63
- }
64
- else {
65
- sdkConfig.onUnauthorized?.();
66
- }
67
- }
68
- return Promise.reject(error);
69
- });
70
- return client;
71
- }
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBZ0JBLG9DQUdDO0FBRUQsb0NBS0M7QUFFRCw4QkFLQztBQWpDRCxrREFJYztBQVNkLElBQUksTUFBTSxHQUFxQixJQUFJLENBQUE7QUFDbkMsSUFBSSxTQUFTLEdBQXlCLElBQUksQ0FBQTtBQThFbEMsOEJBQVM7QUE1RWpCLFNBQWdCLFlBQVksQ0FBQyxTQUFvQjtJQUMvQyxNQUFNLEdBQUcsU0FBUyxDQUFBO0lBQ2xCLG9CQUFBLFNBQVMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDeEMsQ0FBQztBQUVELFNBQWdCLFlBQVk7SUFDMUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsU0FBZ0IsU0FBUztJQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDbkUsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLFNBQW9CO0lBQzNDLE1BQU0sTUFBTSxHQUFHLGVBQUssQ0FBQyxNQUFNLENBQUM7UUFDMUIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO1FBQzFCLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkM7S0FDRixDQUFDLENBQUE7SUFFRix1Q0FBdUM7SUFDdkMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUM3QixLQUFLLEVBQUUsYUFBeUMsRUFBRSxFQUFFO1FBQ2xELE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQzlDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxVQUFVLEtBQUssRUFBRSxDQUFBO1FBQ3pELENBQUM7UUFFRCxnQkFBZ0I7UUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksU0FBUyxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQ3hGLENBQUE7UUFDRCxPQUFPLGFBQWEsQ0FBQTtJQUN0QixDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUMvQixDQUFBO0lBRUQsb0NBQW9DO0lBQ3BDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FDOUIsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQ3BCLEtBQUssRUFBRSxLQUFpQixFQUFFLEVBQUU7UUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxnQkFBZ0IsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFDN0QsS0FBSyxDQUFDLE9BQU8sQ0FDZCxDQUFBO1FBRUQscUNBQXFDO1FBQ3JDLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDbkMsSUFBSSxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDO29CQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUE7b0JBQ3JELElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDN0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLFVBQVUsUUFBUSxFQUFFLENBQUE7d0JBQ3pELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7b0JBQ3JDLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsU0FBUyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUE7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sU0FBUyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUE7WUFDOUIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDOUIsQ0FBQyxDQUNGLENBQUE7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXhpb3MsIHtcbiAgdHlwZSBBeGlvc0Vycm9yLFxuICB0eXBlIEF4aW9zSW5zdGFuY2UsXG4gIHR5cGUgSW50ZXJuYWxBeGlvc1JlcXVlc3RDb25maWcsXG59IGZyb20gJ2F4aW9zJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFNES0NvbmZpZyB7XG4gIGJhc2VVUkw6IHN0cmluZ1xuICBnZXRBY2Nlc3NUb2tlbjogKCkgPT4gc3RyaW5nIHwgbnVsbCB8IFByb21pc2U8c3RyaW5nIHwgbnVsbD5cbiAgcmVmcmVzaEFjY2Vzc1Rva2VuPzogKCkgPT4gUHJvbWlzZTxzdHJpbmc+XG4gIG9uVW5hdXRob3JpemVkPzogKCkgPT4gdm9pZFxufVxuXG5sZXQgY29uZmlnOiBTREtDb25maWcgfCBudWxsID0gbnVsbFxubGV0IGFwaUNsaWVudDogQXhpb3NJbnN0YW5jZSB8IG51bGwgPSBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVTREsoc2RrQ29uZmlnOiBTREtDb25maWcpOiB2b2lkIHtcbiAgY29uZmlnID0gc2RrQ29uZmlnXG4gIGFwaUNsaWVudCA9IGNyZWF0ZUFwaUNsaWVudChzZGtDb25maWcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcGlDbGllbnQoKTogQXhpb3NJbnN0YW5jZSB7XG4gIGlmICghYXBpQ2xpZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTREsgbm90IGNvbmZpZ3VyZWQuIENhbGwgY29uZmlndXJlU0RLKCkgZmlyc3QuJylcbiAgfVxuICByZXR1cm4gYXBpQ2xpZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWcoKTogU0RLQ29uZmlnIHtcbiAgaWYgKCFjb25maWcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NESyBub3QgY29uZmlndXJlZC4gQ2FsbCBjb25maWd1cmVTREsoKSBmaXJzdC4nKVxuICB9XG4gIHJldHVybiBjb25maWdcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXBpQ2xpZW50KHNka0NvbmZpZzogU0RLQ29uZmlnKTogQXhpb3NJbnN0YW5jZSB7XG4gIGNvbnN0IGNsaWVudCA9IGF4aW9zLmNyZWF0ZSh7XG4gICAgYmFzZVVSTDogc2RrQ29uZmlnLmJhc2VVUkwsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICB9KVxuXG4gIC8vIFJlcXVlc3QgaW50ZXJjZXB0b3IgLSBhZGQgYXV0aCB0b2tlblxuICBjbGllbnQuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKFxuICAgIGFzeW5jIChyZXF1ZXN0Q29uZmlnOiBJbnRlcm5hbEF4aW9zUmVxdWVzdENvbmZpZykgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBzZGtDb25maWcuZ2V0QWNjZXNzVG9rZW4oKVxuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHJlcXVlc3RDb25maWcuaGVhZGVycy5BdXRob3JpemF0aW9uID0gYEJlYXJlciAke3Rva2VufWBcbiAgICAgIH1cblxuICAgICAgLy8gRGVidWcgbG9nZ2luZ1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbU0RLXSAke3JlcXVlc3RDb25maWcubWV0aG9kPy50b1VwcGVyQ2FzZSgpfSAke3Nka0NvbmZpZy5iYXNlVVJMfSR7cmVxdWVzdENvbmZpZy51cmx9YCxcbiAgICAgIClcbiAgICAgIHJldHVybiByZXF1ZXN0Q29uZmlnXG4gICAgfSxcbiAgICBlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvciksXG4gIClcblxuICAvLyBSZXNwb25zZSBpbnRlcmNlcHRvciAtIGhhbmRsZSA0MDFcbiAgY2xpZW50LmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoXG4gICAgcmVzcG9uc2UgPT4gcmVzcG9uc2UsXG4gICAgYXN5bmMgKGVycm9yOiBBeGlvc0Vycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtTREtdIEVycm9yOiAke2Vycm9yLnJlc3BvbnNlPy5zdGF0dXN9ICR7ZXJyb3IuY29uZmlnPy51cmx9YCxcbiAgICAgICAgZXJyb3IubWVzc2FnZSxcbiAgICAgIClcblxuICAgICAgLy8gSGFuZGxlIGF1dGggdG9rZW4gZXhwaXJhdGlvbiAoNDAxKVxuICAgICAgaWYgKGVycm9yLnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICBpZiAoc2RrQ29uZmlnLnJlZnJlc2hBY2Nlc3NUb2tlbikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUb2tlbiA9IGF3YWl0IHNka0NvbmZpZy5yZWZyZXNoQWNjZXNzVG9rZW4oKVxuICAgICAgICAgICAgaWYgKG5ld1Rva2VuICYmIGVycm9yLmNvbmZpZykge1xuICAgICAgICAgICAgICBlcnJvci5jb25maWcuaGVhZGVycy5BdXRob3JpemF0aW9uID0gYEJlYXJlciAke25ld1Rva2VufWBcbiAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5yZXF1ZXN0KGVycm9yLmNvbmZpZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHNka0NvbmZpZy5vblVuYXV0aG9yaXplZD8uKClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2RrQ29uZmlnLm9uVW5hdXRob3JpemVkPy4oKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBjbGllbnRcbn1cblxuZXhwb3J0IHthcGlDbGllbnR9XG4iXX0=