@olastudio/social-media-sdk 0.1.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 (76) hide show
  1. package/README.md +112 -0
  2. package/dist/adapters/expo.d.mts +19 -0
  3. package/dist/adapters/expo.d.ts +19 -0
  4. package/dist/adapters/expo.js +100 -0
  5. package/dist/adapters/expo.js.map +1 -0
  6. package/dist/adapters/expo.mjs +77 -0
  7. package/dist/adapters/expo.mjs.map +1 -0
  8. package/dist/adapters/index.d.mts +21 -0
  9. package/dist/adapters/index.d.ts +21 -0
  10. package/dist/adapters/index.js +6 -0
  11. package/dist/adapters/index.js.map +1 -0
  12. package/dist/adapters/index.mjs +3 -0
  13. package/dist/adapters/index.mjs.map +1 -0
  14. package/dist/auth.types-DTXCyA56.d.mts +128 -0
  15. package/dist/auth.types-DTXCyA56.d.ts +128 -0
  16. package/dist/chunk-36RADUUO.mjs +31 -0
  17. package/dist/chunk-36RADUUO.mjs.map +1 -0
  18. package/dist/chunk-7QAMNVQU.js +666 -0
  19. package/dist/chunk-7QAMNVQU.js.map +1 -0
  20. package/dist/chunk-B6NUTR54.js +4 -0
  21. package/dist/chunk-B6NUTR54.js.map +1 -0
  22. package/dist/chunk-BX3RO5PW.js +4 -0
  23. package/dist/chunk-BX3RO5PW.js.map +1 -0
  24. package/dist/chunk-CGNGZNVG.mjs +391 -0
  25. package/dist/chunk-CGNGZNVG.mjs.map +1 -0
  26. package/dist/chunk-ER5A6TIL.js +296 -0
  27. package/dist/chunk-ER5A6TIL.js.map +1 -0
  28. package/dist/chunk-GF3OEIKI.mjs +3 -0
  29. package/dist/chunk-GF3OEIKI.mjs.map +1 -0
  30. package/dist/chunk-H5GAC4UG.mjs +277 -0
  31. package/dist/chunk-H5GAC4UG.mjs.map +1 -0
  32. package/dist/chunk-HPLIHYLQ.js +35 -0
  33. package/dist/chunk-HPLIHYLQ.js.map +1 -0
  34. package/dist/chunk-MV6HJQQO.mjs +3 -0
  35. package/dist/chunk-MV6HJQQO.mjs.map +1 -0
  36. package/dist/chunk-ONR2OJOB.mjs +848 -0
  37. package/dist/chunk-ONR2OJOB.mjs.map +1 -0
  38. package/dist/chunk-PJ4KYVHH.js +854 -0
  39. package/dist/chunk-PJ4KYVHH.js.map +1 -0
  40. package/dist/chunk-QRGJXASL.js +402 -0
  41. package/dist/chunk-QRGJXASL.js.map +1 -0
  42. package/dist/chunk-QZHJXRRW.mjs +661 -0
  43. package/dist/chunk-QZHJXRRW.mjs.map +1 -0
  44. package/dist/core/index.d.mts +105 -0
  45. package/dist/core/index.d.ts +105 -0
  46. package/dist/core/index.js +94 -0
  47. package/dist/core/index.js.map +1 -0
  48. package/dist/core/index.mjs +5 -0
  49. package/dist/core/index.mjs.map +1 -0
  50. package/dist/index.d.mts +7 -0
  51. package/dist/index.d.ts +7 -0
  52. package/dist/index.js +174 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/index.mjs +9 -0
  55. package/dist/index.mjs.map +1 -0
  56. package/dist/insights.types-5z7HJnbt.d.mts +351 -0
  57. package/dist/insights.types-DF2_r0L1.d.ts +351 -0
  58. package/dist/providers/facebook/index.d.mts +464 -0
  59. package/dist/providers/facebook/index.d.ts +464 -0
  60. package/dist/providers/facebook/index.js +30 -0
  61. package/dist/providers/facebook/index.js.map +1 -0
  62. package/dist/providers/facebook/index.mjs +5 -0
  63. package/dist/providers/facebook/index.mjs.map +1 -0
  64. package/dist/providers/instagram/index.d.mts +355 -0
  65. package/dist/providers/instagram/index.d.ts +355 -0
  66. package/dist/providers/instagram/index.js +26 -0
  67. package/dist/providers/instagram/index.js.map +1 -0
  68. package/dist/providers/instagram/index.mjs +5 -0
  69. package/dist/providers/instagram/index.mjs.map +1 -0
  70. package/dist/providers/tiktok/index.d.mts +346 -0
  71. package/dist/providers/tiktok/index.d.ts +346 -0
  72. package/dist/providers/tiktok/index.js +48 -0
  73. package/dist/providers/tiktok/index.js.map +1 -0
  74. package/dist/providers/tiktok/index.mjs +3 -0
  75. package/dist/providers/tiktok/index.mjs.map +1 -0
  76. package/package.json +97 -0
@@ -0,0 +1,661 @@
1
+ import { HttpClient, FACEBOOK_GRAPH_API_BASE_URL, FACEBOOK_OAUTH_AUTHORIZATION_URL, FACEBOOK_GRAPH_API_VERSION, METRIC_PRESETS, INSTAGRAM_MEDIA_METRICS_COMMON, INSTAGRAM_STORIES_METRICS, INSTAGRAM_REELS_METRICS } from './chunk-H5GAC4UG.mjs';
2
+ import { AuthError, APIError } from './chunk-36RADUUO.mjs';
3
+
4
+ // providers/instagram/auth/InstagramAuth.ts
5
+ var InstagramAuth = class {
6
+ constructor(config) {
7
+ this.config = config;
8
+ this.httpClient = new HttpClient({
9
+ baseURL: FACEBOOK_GRAPH_API_BASE_URL
10
+ });
11
+ }
12
+ /**
13
+ * Exchange Instagram/Facebook token for session
14
+ */
15
+ async exchangeToken(instagramToken) {
16
+ try {
17
+ const profile = await this.getProfile(instagramToken);
18
+ return {
19
+ accessToken: instagramToken,
20
+ user: profile
21
+ };
22
+ } catch (error) {
23
+ throw new AuthError(
24
+ `Failed to exchange Instagram token: ${error instanceof Error ? error.message : "Unknown error"}`,
25
+ "TOKEN_EXCHANGE_ERROR",
26
+ error
27
+ );
28
+ }
29
+ }
30
+ /**
31
+ * Get Instagram user profile
32
+ * First gets Facebook profile, then Instagram Business profile
33
+ */
34
+ async getProfile(accessToken) {
35
+ try {
36
+ const response = await this.httpClient.get("/me/accounts", {
37
+ fields: "instagram_business_account",
38
+ access_token: accessToken
39
+ });
40
+ if (!response.data || response.data.length === 0) {
41
+ throw new AuthError(
42
+ "No Instagram business account found",
43
+ "NO_INSTAGRAM_ACCOUNT"
44
+ );
45
+ }
46
+ const instagramAccountId = response.data[0]?.instagram_business_account?.id;
47
+ if (!instagramAccountId) {
48
+ throw new AuthError(
49
+ "No Instagram business account ID found",
50
+ "NO_INSTAGRAM_ACCOUNT_ID"
51
+ );
52
+ }
53
+ const profile = await this.httpClient.get(
54
+ `/${instagramAccountId}`,
55
+ {
56
+ fields: "id,username,name,account_type,profile_picture_url",
57
+ access_token: accessToken
58
+ }
59
+ );
60
+ return {
61
+ id: profile.id,
62
+ name: profile.name || profile.username,
63
+ username: profile.username,
64
+ picture: profile.profile_picture_url
65
+ };
66
+ } catch (error) {
67
+ throw new AuthError(
68
+ `Failed to fetch Instagram profile: ${error instanceof Error ? error.message : "Unknown error"}`,
69
+ "PROFILE_FETCH_ERROR",
70
+ error
71
+ );
72
+ }
73
+ }
74
+ /**
75
+ * Get OAuth configuration for Instagram
76
+ * Instagram uses the same OAuth flow as Facebook
77
+ */
78
+ getOAuthConfig(scopes, redirectUri) {
79
+ return {
80
+ authorizationEndpoint: FACEBOOK_OAUTH_AUTHORIZATION_URL,
81
+ tokenEndpoint: `${FACEBOOK_GRAPH_API_BASE_URL}/oauth/access_token`,
82
+ clientId: this.config.appId,
83
+ clientSecret: this.config.appSecret,
84
+ redirectUri,
85
+ scopes,
86
+ responseType: "token",
87
+ extraParams: {
88
+ display: "popup"
89
+ }
90
+ };
91
+ }
92
+ /**
93
+ * Get authorization URL
94
+ */
95
+ getAuthorizationUrl(scopes, redirectUri, state) {
96
+ const params = new URLSearchParams({
97
+ client_id: this.config.appId,
98
+ redirect_uri: redirectUri,
99
+ scope: scopes.join(","),
100
+ response_type: "token",
101
+ display: "popup",
102
+ ...state && { state }
103
+ });
104
+ return `${FACEBOOK_OAUTH_AUTHORIZATION_URL}?${params.toString()}`;
105
+ }
106
+ /**
107
+ * Get current API version (read-only)
108
+ */
109
+ getApiVersion() {
110
+ return FACEBOOK_GRAPH_API_VERSION;
111
+ }
112
+ };
113
+
114
+ // providers/instagram/api/InstagramAPI.ts
115
+ var InstagramAPI = class {
116
+ constructor(config, accessToken) {
117
+ this.config = config;
118
+ this.accessToken = accessToken;
119
+ this.httpClient = new HttpClient({
120
+ baseURL: FACEBOOK_GRAPH_API_BASE_URL,
121
+ accessToken: this.accessToken
122
+ });
123
+ }
124
+ /**
125
+ * Generic request
126
+ */
127
+ async request(endpoint, options = {}) {
128
+ if (this.accessToken && !options.params?.access_token) {
129
+ options.params = {
130
+ ...options.params,
131
+ access_token: this.accessToken
132
+ };
133
+ }
134
+ return this.httpClient.request(endpoint, options);
135
+ }
136
+ /**
137
+ * GET request
138
+ */
139
+ async get(endpoint, params) {
140
+ return this.request(endpoint, { method: "GET", params });
141
+ }
142
+ /**
143
+ * POST request
144
+ */
145
+ async post(endpoint, body) {
146
+ return this.request(endpoint, { method: "POST", body });
147
+ }
148
+ /**
149
+ * PUT request
150
+ */
151
+ async put(endpoint, body) {
152
+ return this.request(endpoint, { method: "PUT", body });
153
+ }
154
+ /**
155
+ * DELETE request
156
+ */
157
+ async delete(endpoint) {
158
+ return this.request(endpoint, { method: "DELETE" });
159
+ }
160
+ /**
161
+ * Update access token
162
+ */
163
+ setAccessToken(token) {
164
+ this.accessToken = token;
165
+ this.httpClient.setAccessToken(token);
166
+ }
167
+ /**
168
+ * Get current access token
169
+ */
170
+ getAccessToken() {
171
+ return this.accessToken;
172
+ }
173
+ // ============= Instagram-specific methods =============
174
+ /**
175
+ * Get user's Instagram Business account (single account from first page)
176
+ */
177
+ async getAccount(pageAccessToken) {
178
+ try {
179
+ const token = pageAccessToken || this.accessToken;
180
+ if (!token) {
181
+ throw new APIError("Access token is required", 401, "NO_TOKEN");
182
+ }
183
+ const response = await this.get("/me/accounts", {
184
+ fields: "instagram_business_account",
185
+ access_token: token
186
+ });
187
+ if (!response.data || response.data.length === 0) {
188
+ throw new APIError(
189
+ "No Instagram business account found",
190
+ 404,
191
+ "NO_INSTAGRAM_ACCOUNT"
192
+ );
193
+ }
194
+ const instagramAccountId = response.data[0]?.instagram_business_account?.id;
195
+ if (!instagramAccountId) {
196
+ throw new APIError(
197
+ "No Instagram business account ID found",
198
+ 404,
199
+ "NO_INSTAGRAM_ACCOUNT_ID"
200
+ );
201
+ }
202
+ const account = await this.get(
203
+ `/${instagramAccountId}`,
204
+ {
205
+ fields: "id,username,name,profile_picture_url,followers_count,follows_count,media_count",
206
+ access_token: token
207
+ }
208
+ );
209
+ return account;
210
+ } catch (error) {
211
+ throw new APIError(
212
+ `Failed to fetch Instagram account: ${error instanceof Error ? error.message : "Unknown error"}`,
213
+ void 0,
214
+ "ACCOUNT_FETCH_ERROR",
215
+ error
216
+ );
217
+ }
218
+ }
219
+ /**
220
+ * Get all Instagram Business accounts linked to user's Facebook pages
221
+ * Returns all Instagram accounts from all connected Facebook pages
222
+ */
223
+ async getInstagramAccounts(userAccessToken) {
224
+ try {
225
+ const token = userAccessToken || this.accessToken;
226
+ if (!token) {
227
+ throw new APIError("Access token is required", 401, "NO_TOKEN");
228
+ }
229
+ const response = await this.get("/me/accounts", {
230
+ fields: "id,name,instagram_business_account{id,username,name,profile_picture_url,followers_count,follows_count,media_count}",
231
+ access_token: token
232
+ });
233
+ if (!response.data || response.data.length === 0) {
234
+ console.log(" \u2139\uFE0F No Facebook pages found");
235
+ return [];
236
+ }
237
+ const instagramAccounts = [];
238
+ for (const page of response.data) {
239
+ if (page.instagram_business_account) {
240
+ instagramAccounts.push({
241
+ id: page.instagram_business_account.id,
242
+ username: page.instagram_business_account.username,
243
+ name: page.instagram_business_account.name,
244
+ profile_picture_url: page.instagram_business_account.profile_picture_url,
245
+ followers_count: page.instagram_business_account.followers_count,
246
+ follows_count: page.instagram_business_account.follows_count,
247
+ media_count: page.instagram_business_account.media_count
248
+ });
249
+ }
250
+ }
251
+ console.log(` \u2705 Found ${instagramAccounts.length} Instagram account(s)`);
252
+ return instagramAccounts;
253
+ } catch (error) {
254
+ throw new APIError(
255
+ `Failed to fetch Instagram accounts: ${error instanceof Error ? error.message : "Unknown error"}`,
256
+ void 0,
257
+ "ACCOUNTS_FETCH_ERROR",
258
+ error
259
+ );
260
+ }
261
+ }
262
+ /**
263
+ * Get Instagram media
264
+ */
265
+ async getMedia(instagramAccountId, limit = 25) {
266
+ try {
267
+ const response = await this.get(
268
+ `/${instagramAccountId}/media`,
269
+ {
270
+ fields: "id,media_type,media_url,thumbnail_url,permalink,caption,timestamp,like_count,comments_count",
271
+ limit
272
+ }
273
+ );
274
+ return response.data;
275
+ } catch (error) {
276
+ throw new APIError(
277
+ `Failed to fetch Instagram media: ${error instanceof Error ? error.message : "Unknown error"}`,
278
+ void 0,
279
+ "MEDIA_FETCH_ERROR",
280
+ error
281
+ );
282
+ }
283
+ }
284
+ /**
285
+ * Publish photo to Instagram (2-step process)
286
+ */
287
+ async publishPhoto(params) {
288
+ const { instagramAccountId, imageUrl, caption } = params;
289
+ if (!imageUrl) {
290
+ throw new APIError(
291
+ "Image URL is required for photo posts",
292
+ 400,
293
+ "INVALID_PARAMS"
294
+ );
295
+ }
296
+ try {
297
+ const containerResponse = await this.post(
298
+ `/${instagramAccountId}/media`,
299
+ {
300
+ image_url: imageUrl,
301
+ caption: caption || ""
302
+ }
303
+ );
304
+ const publishResponse = await this.post(
305
+ `/${instagramAccountId}/media_publish`,
306
+ {
307
+ creation_id: containerResponse.id
308
+ }
309
+ );
310
+ return publishResponse;
311
+ } catch (error) {
312
+ throw new APIError(
313
+ `Failed to publish photo: ${error instanceof Error ? error.message : "Unknown error"}`,
314
+ void 0,
315
+ "PHOTO_PUBLISH_ERROR",
316
+ error
317
+ );
318
+ }
319
+ }
320
+ /**
321
+ * Publish video to Instagram (2-step process)
322
+ */
323
+ async publishVideo(params) {
324
+ const { instagramAccountId, videoUrl, caption } = params;
325
+ if (!videoUrl) {
326
+ throw new APIError(
327
+ "Video URL is required for video posts",
328
+ 400,
329
+ "INVALID_PARAMS"
330
+ );
331
+ }
332
+ try {
333
+ const containerResponse = await this.post(
334
+ `/${instagramAccountId}/media`,
335
+ {
336
+ media_type: "VIDEO",
337
+ video_url: videoUrl,
338
+ caption: caption || ""
339
+ }
340
+ );
341
+ const publishResponse = await this.post(
342
+ `/${instagramAccountId}/media_publish`,
343
+ {
344
+ creation_id: containerResponse.id
345
+ }
346
+ );
347
+ return publishResponse;
348
+ } catch (error) {
349
+ throw new APIError(
350
+ `Failed to publish video: ${error instanceof Error ? error.message : "Unknown error"}`,
351
+ void 0,
352
+ "VIDEO_PUBLISH_ERROR",
353
+ error
354
+ );
355
+ }
356
+ }
357
+ /**
358
+ * Delete Instagram media
359
+ */
360
+ async deleteMedia(mediaId) {
361
+ try {
362
+ const response = await this.delete(
363
+ `/${mediaId}`
364
+ );
365
+ return response.success === true;
366
+ } catch (error) {
367
+ throw new APIError(
368
+ `Failed to delete media: ${error instanceof Error ? error.message : "Unknown error"}`,
369
+ void 0,
370
+ "MEDIA_DELETE_ERROR",
371
+ error
372
+ );
373
+ }
374
+ }
375
+ /**
376
+ * Get Instagram account insights
377
+ */
378
+ async getAccountInsights(instagramAccountId, params) {
379
+ try {
380
+ const { metric, period, metric_type, since, until } = params;
381
+ const response = await this.get(
382
+ `/${instagramAccountId}/insights`,
383
+ {
384
+ metric: metric.join(","),
385
+ period: period || "day",
386
+ metric_type: metric_type || "total_value",
387
+ ...since && { since },
388
+ ...until && { until }
389
+ }
390
+ );
391
+ return response;
392
+ } catch (error) {
393
+ throw new APIError(
394
+ `Failed to fetch insights: ${error instanceof Error ? error.message : "Unknown error"}`,
395
+ void 0,
396
+ "INSIGHTS_FETCH_ERROR",
397
+ error
398
+ );
399
+ }
400
+ }
401
+ /**
402
+ * Get specific media insights
403
+ */
404
+ async getMediaInsights(mediaId, metrics) {
405
+ try {
406
+ const response = await this.get(
407
+ `/${mediaId}/insights`,
408
+ {
409
+ metric: metrics.join(",")
410
+ }
411
+ );
412
+ return response;
413
+ } catch (error) {
414
+ throw new APIError(
415
+ `Failed to fetch media insights: ${error instanceof Error ? error.message : "Unknown error"}`,
416
+ void 0,
417
+ "MEDIA_INSIGHTS_ERROR",
418
+ error
419
+ );
420
+ }
421
+ }
422
+ // ============= Enhanced Insights Methods =============
423
+ /**
424
+ * Get account insights with default metrics
425
+ * Uses updated metrics (views instead of impressions)
426
+ * @param instagramAccountId - Instagram Account ID
427
+ * @param period - Period for metrics
428
+ * @returns Account insights
429
+ */
430
+ async getAccountInsightsOverview(instagramAccountId, period = "days_28") {
431
+ return this.getAccountInsights(instagramAccountId, {
432
+ metric: [...METRIC_PRESETS.INSTAGRAM_OVERVIEW],
433
+ period,
434
+ metric_type: "total_value"
435
+ });
436
+ }
437
+ /**
438
+ * Get account summary with parsed values
439
+ * @param instagramAccountId - Instagram Account ID
440
+ * @param period - Period for metrics
441
+ * @returns Parsed account summary
442
+ */
443
+ async getAccountSummary(instagramAccountId, period = "days_28") {
444
+ try {
445
+ const account = await this.get(`/${instagramAccountId}`, {
446
+ fields: "id,username,followers_count"
447
+ });
448
+ const insights = await this.getAccountInsightsOverview(instagramAccountId, period);
449
+ const summary = {
450
+ id: account.id,
451
+ username: account.username,
452
+ followers_count: account.followers_count || 0
453
+ };
454
+ for (const item of insights.data) {
455
+ const value = item.total_value?.value ?? item.values?.[0]?.value;
456
+ if (typeof value !== "number") continue;
457
+ switch (item.name) {
458
+ case "views":
459
+ summary.views = value;
460
+ break;
461
+ case "reach":
462
+ summary.reach = value;
463
+ break;
464
+ case "accounts_engaged":
465
+ summary.accounts_engaged = value;
466
+ break;
467
+ case "total_interactions":
468
+ summary.total_interactions = value;
469
+ break;
470
+ }
471
+ }
472
+ return summary;
473
+ } catch (error) {
474
+ throw new APIError(
475
+ `Failed to fetch account summary: ${error instanceof Error ? error.message : "Unknown error"}`,
476
+ void 0,
477
+ "ACCOUNT_SUMMARY_ERROR",
478
+ error
479
+ );
480
+ }
481
+ }
482
+ /**
483
+ * Get media insights based on media type
484
+ * Automatically selects appropriate metrics
485
+ * @param mediaId - Media ID
486
+ * @param mediaType - Type of media
487
+ * @returns Media insights
488
+ */
489
+ async getMediaInsightsByType(mediaId, mediaType) {
490
+ let metrics;
491
+ switch (mediaType) {
492
+ case "REELS":
493
+ metrics = INSTAGRAM_REELS_METRICS;
494
+ break;
495
+ case "VIDEO":
496
+ metrics = [...INSTAGRAM_MEDIA_METRICS_COMMON, "plays"];
497
+ break;
498
+ default:
499
+ metrics = INSTAGRAM_MEDIA_METRICS_COMMON;
500
+ }
501
+ return this.getMediaInsights(mediaId, [...metrics]);
502
+ }
503
+ /**
504
+ * Get media insights with parsed values
505
+ * @param mediaId - Media ID
506
+ * @param mediaType - Type of media
507
+ * @returns Parsed media insights
508
+ */
509
+ async getMediaInsightsParsed(mediaId, mediaType = "IMAGE") {
510
+ try {
511
+ const response = await this.getMediaInsightsByType(mediaId, mediaType);
512
+ const insights = {
513
+ id: mediaId,
514
+ media_type: mediaType
515
+ };
516
+ for (const item of response.data) {
517
+ const value = item.total_value?.value ?? item.values?.[0]?.value;
518
+ if (typeof value !== "number") continue;
519
+ switch (item.name) {
520
+ case "views":
521
+ insights.views = value;
522
+ break;
523
+ case "reach":
524
+ insights.reach = value;
525
+ break;
526
+ case "likes":
527
+ insights.likes = value;
528
+ break;
529
+ case "comments":
530
+ insights.comments = value;
531
+ break;
532
+ case "shares":
533
+ insights.shares = value;
534
+ break;
535
+ case "saved":
536
+ insights.saves = value;
537
+ break;
538
+ case "plays":
539
+ insights.plays = value;
540
+ break;
541
+ case "total_interactions":
542
+ insights.total_interactions = value;
543
+ break;
544
+ }
545
+ }
546
+ return insights;
547
+ } catch (error) {
548
+ throw new APIError(
549
+ `Failed to fetch parsed media insights: ${error instanceof Error ? error.message : "Unknown error"}`,
550
+ void 0,
551
+ "MEDIA_INSIGHTS_PARSED_ERROR",
552
+ error
553
+ );
554
+ }
555
+ }
556
+ /**
557
+ * Get story insights
558
+ * @param storyId - Story media ID
559
+ * @returns Story insights
560
+ */
561
+ async getStoryInsights(storyId) {
562
+ return this.getMediaInsights(storyId, [...INSTAGRAM_STORIES_METRICS]);
563
+ }
564
+ /**
565
+ * Get reels insights
566
+ * @param reelId - Reel media ID
567
+ * @returns Reel insights
568
+ */
569
+ async getReelInsights(reelId) {
570
+ return this.getMediaInsights(reelId, [...INSTAGRAM_REELS_METRICS]);
571
+ }
572
+ /**
573
+ * Get engagement metrics for account
574
+ * @param instagramAccountId - Instagram Account ID
575
+ * @param period - Period for metrics
576
+ * @returns Engagement insights
577
+ */
578
+ async getEngagementInsights(instagramAccountId, period = "days_28") {
579
+ return this.getAccountInsights(instagramAccountId, {
580
+ metric: [...METRIC_PRESETS.INSTAGRAM_ENGAGEMENT],
581
+ period,
582
+ metric_type: "total_value"
583
+ });
584
+ }
585
+ /**
586
+ * Get demographics insights for account
587
+ * @param instagramAccountId - Instagram Account ID
588
+ * @param breakdown - Demographic breakdown type
589
+ * @returns Demographics insights
590
+ */
591
+ async getDemographicsInsights(instagramAccountId, breakdown = "country") {
592
+ try {
593
+ const response = await this.get(
594
+ `/${instagramAccountId}/insights`,
595
+ {
596
+ metric: "follower_demographics",
597
+ period: "lifetime",
598
+ metric_type: "total_value",
599
+ breakdown
600
+ }
601
+ );
602
+ return response;
603
+ } catch (error) {
604
+ throw new APIError(
605
+ `Failed to fetch demographics insights: ${error instanceof Error ? error.message : "Unknown error"}`,
606
+ void 0,
607
+ "DEMOGRAPHICS_ERROR",
608
+ error
609
+ );
610
+ }
611
+ }
612
+ /**
613
+ * Get current API version (read-only)
614
+ */
615
+ getApiVersion() {
616
+ return FACEBOOK_GRAPH_API_VERSION;
617
+ }
618
+ };
619
+
620
+ // providers/instagram/InstagramProvider.ts
621
+ var InstagramProvider = class {
622
+ constructor(config) {
623
+ this.name = "instagram";
624
+ this.config = config;
625
+ this.auth = new InstagramAuth(config);
626
+ this.api = new InstagramAPI(config);
627
+ }
628
+ /**
629
+ * Create new API instance with access token
630
+ */
631
+ createAPIClient(accessToken) {
632
+ return new InstagramAPI(this.config, accessToken);
633
+ }
634
+ /**
635
+ * Update access token of existing API client
636
+ */
637
+ setAccessToken(accessToken) {
638
+ this.api.setAccessToken(accessToken);
639
+ }
640
+ /**
641
+ * Get current access token
642
+ */
643
+ getAccessToken() {
644
+ return this.api.getAccessToken();
645
+ }
646
+ };
647
+
648
+ // providers/instagram/types/index.ts
649
+ var InstagramScopes = /* @__PURE__ */ ((InstagramScopes2) => {
650
+ InstagramScopes2["BASIC"] = "instagram_basic";
651
+ InstagramScopes2["CONTENT_PUBLISH"] = "instagram_content_publish";
652
+ InstagramScopes2["MANAGE_COMMENTS"] = "instagram_manage_comments";
653
+ InstagramScopes2["MANAGE_INSIGHTS"] = "instagram_manage_insights";
654
+ InstagramScopes2["MANAGE_MESSAGES"] = "instagram_manage_messages";
655
+ InstagramScopes2["SHOPPING_TAG_PRODUCTS"] = "instagram_shopping_tag_products";
656
+ return InstagramScopes2;
657
+ })(InstagramScopes || {});
658
+
659
+ export { InstagramAPI, InstagramAuth, InstagramProvider, InstagramScopes };
660
+ //# sourceMappingURL=chunk-QZHJXRRW.mjs.map
661
+ //# sourceMappingURL=chunk-QZHJXRRW.mjs.map