@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,296 @@
1
+ 'use strict';
2
+
3
+ var chunkHPLIHYLQ_js = require('./chunk-HPLIHYLQ.js');
4
+
5
+ // core/http/HttpClient.ts
6
+ var HttpClient = class {
7
+ constructor(config) {
8
+ this.config = {
9
+ timeout: 3e4,
10
+ // 30 seconds default
11
+ headers: {
12
+ "Content-Type": "application/json"
13
+ },
14
+ ...config
15
+ };
16
+ }
17
+ /**
18
+ * Generic request
19
+ */
20
+ async request(endpoint, options = {}) {
21
+ const url = this.buildURL(endpoint, options.params);
22
+ const method = options.method || "GET";
23
+ const headers = {
24
+ ...this.config.headers,
25
+ ...options.headers
26
+ };
27
+ if (this.config.accessToken) {
28
+ headers["Authorization"] = `Bearer ${this.config.accessToken}`;
29
+ }
30
+ const config = {
31
+ method,
32
+ headers,
33
+ signal: this.createAbortSignal(options.timeout || this.config.timeout)
34
+ };
35
+ if (options.body && method !== "GET") {
36
+ if (headers["Content-Type"] === "application/json") {
37
+ config.body = JSON.stringify(options.body);
38
+ } else if (headers["Content-Type"] === "application/x-www-form-urlencoded") {
39
+ config.body = this.encodeFormBody(options.body);
40
+ } else {
41
+ config.body = options.body;
42
+ }
43
+ }
44
+ try {
45
+ const response = await fetch(url, config);
46
+ return await this.handleResponse(response);
47
+ } catch (error) {
48
+ if (error instanceof chunkHPLIHYLQ_js.APIError) {
49
+ throw error;
50
+ }
51
+ throw new chunkHPLIHYLQ_js.APIError(
52
+ `Network error: ${error instanceof Error ? error.message : "Unknown error"}`,
53
+ 0,
54
+ "NETWORK_ERROR",
55
+ error
56
+ );
57
+ }
58
+ }
59
+ /**
60
+ * GET request
61
+ */
62
+ async get(endpoint, params) {
63
+ return this.request(endpoint, { method: "GET", params });
64
+ }
65
+ /**
66
+ * POST request
67
+ */
68
+ async post(endpoint, body) {
69
+ return this.request(endpoint, { method: "POST", body });
70
+ }
71
+ /**
72
+ * PUT request
73
+ */
74
+ async put(endpoint, body) {
75
+ return this.request(endpoint, { method: "PUT", body });
76
+ }
77
+ /**
78
+ * DELETE request
79
+ */
80
+ async delete(endpoint) {
81
+ return this.request(endpoint, { method: "DELETE" });
82
+ }
83
+ /**
84
+ * Build URL with query params
85
+ */
86
+ buildURL(endpoint, params) {
87
+ const url = endpoint.startsWith("http") ? endpoint : `${this.config.baseURL}${endpoint}`;
88
+ if (!params || Object.keys(params).length === 0) {
89
+ return url;
90
+ }
91
+ const queryString = Object.entries(params).filter(([_, value]) => value !== void 0 && value !== null).map(
92
+ ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`
93
+ ).join("&");
94
+ return queryString ? `${url}?${queryString}` : url;
95
+ }
96
+ /**
97
+ * Encode body as form-urlencoded
98
+ */
99
+ encodeFormBody(body) {
100
+ return Object.entries(body).filter(([_, value]) => value !== void 0 && value !== null).map(
101
+ ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`
102
+ ).join("&");
103
+ }
104
+ /**
105
+ * Create AbortSignal for timeout
106
+ */
107
+ createAbortSignal(timeout) {
108
+ if (!timeout) return void 0;
109
+ const controller = new AbortController();
110
+ setTimeout(() => controller.abort(), timeout);
111
+ return controller.signal;
112
+ }
113
+ /**
114
+ * Handle HTTP response
115
+ */
116
+ async handleResponse(response) {
117
+ let data;
118
+ const contentType = response.headers.get("content-type");
119
+ if (contentType?.includes("application/json")) {
120
+ data = await response.json();
121
+ } else {
122
+ data = await response.text();
123
+ }
124
+ if (!response.ok) {
125
+ const errorMessage = data?.error?.message || data?.message || "API request failed";
126
+ const errorCode = data?.error?.code || data?.code || response.status;
127
+ throw new chunkHPLIHYLQ_js.APIError(errorMessage, response.status, errorCode, data);
128
+ }
129
+ return data;
130
+ }
131
+ /**
132
+ * Update access token
133
+ */
134
+ setAccessToken(token) {
135
+ this.config.accessToken = token;
136
+ }
137
+ /**
138
+ * Get current configuration
139
+ */
140
+ getConfig() {
141
+ return { ...this.config };
142
+ }
143
+ };
144
+
145
+ // core/constants.ts
146
+ var FACEBOOK_GRAPH_API_VERSION = "v24.0";
147
+ var FACEBOOK_GRAPH_API_BASE_URL = `https://graph.facebook.com/${FACEBOOK_GRAPH_API_VERSION}`;
148
+ var FACEBOOK_OAUTH_AUTHORIZATION_URL = `https://www.facebook.com/${FACEBOOK_GRAPH_API_VERSION}/dialog/oauth`;
149
+
150
+ // core/insights.constants.ts
151
+ var PAGE_METRICS_LIFETIME = [
152
+ "page_fans_country",
153
+ "page_fans_city",
154
+ "page_fans_gender_age"
155
+ ];
156
+ var PAGE_METRICS_PERIODIC = [
157
+ "page_views_total",
158
+ "page_views",
159
+ "page_post_engagements",
160
+ "page_fans_online",
161
+ "page_fans_online_per_day",
162
+ "page_video_views",
163
+ "page_daily_follows",
164
+ "page_daily_unfollows"
165
+ ];
166
+ var POST_METRICS = [
167
+ "post_engaged_users",
168
+ "post_negative_feedback",
169
+ "post_engaged_fan",
170
+ "post_clicks",
171
+ "post_clicks_unique",
172
+ "post_reactions_by_type_total"
173
+ ];
174
+ var VIDEO_METRICS = [
175
+ "total_video_views",
176
+ "total_video_views_unique",
177
+ "total_video_views_autoplayed",
178
+ "total_video_views_clicked_to_play",
179
+ "total_video_views_organic",
180
+ "total_video_views_organic_unique",
181
+ "total_video_views_paid",
182
+ "total_video_views_paid_unique",
183
+ "total_video_avg_time_watched",
184
+ "total_video_view_total_time",
185
+ "total_video_complete_views",
186
+ "total_video_complete_views_unique",
187
+ "total_video_complete_views_organic",
188
+ "total_video_complete_views_organic_unique",
189
+ "total_video_complete_views_paid",
190
+ "total_video_complete_views_paid_unique"
191
+ ];
192
+ var REELS_METRICS = [
193
+ "blue_reels_play_count",
194
+ "post_video_avg_time_watched",
195
+ "post_video_views",
196
+ "post_video_social_actions"
197
+ ];
198
+ var REELS_METRICS_EXTENDED = [
199
+ "plays",
200
+ "comments",
201
+ "likes",
202
+ "shares",
203
+ "reach",
204
+ "total_plays",
205
+ "average_minutes_viewed",
206
+ "minutes_viewed"
207
+ ];
208
+ var PHOTO_METRICS = [
209
+ "photo_views",
210
+ "photo_reach",
211
+ "engaged_users"
212
+ ];
213
+ var INSTAGRAM_ACCOUNT_METRICS = [
214
+ "views",
215
+ "reach",
216
+ "accounts_engaged",
217
+ "total_interactions",
218
+ "likes",
219
+ "comments",
220
+ "shares",
221
+ "saves",
222
+ "follows_and_unfollows",
223
+ "profile_links_taps",
224
+ "profile_views"
225
+ ];
226
+ var INSTAGRAM_DEMOGRAPHICS_METRICS = [
227
+ "follower_demographics",
228
+ "reached_audience_demographics",
229
+ "engaged_audience_demographics"
230
+ ];
231
+ var INSTAGRAM_MEDIA_METRICS_COMMON = [
232
+ "views",
233
+ "reach",
234
+ "likes",
235
+ "comments",
236
+ "shares",
237
+ "saved",
238
+ "total_interactions"
239
+ ];
240
+ var INSTAGRAM_REELS_METRICS = [
241
+ "plays",
242
+ "reach",
243
+ "likes",
244
+ "comments",
245
+ "shares",
246
+ "saved",
247
+ "total_interactions"
248
+ ];
249
+ var INSTAGRAM_STORIES_METRICS = [
250
+ "exits",
251
+ "replies",
252
+ "taps_forward",
253
+ "taps_back",
254
+ "views",
255
+ "reach"
256
+ ];
257
+ var INSIGHTS_PERIODS = {
258
+ DAY: "day",
259
+ WEEK: "week",
260
+ DAYS_28: "days_28",
261
+ MONTH: "month",
262
+ LIFETIME: "lifetime"
263
+ };
264
+ var METRIC_PRESETS = {
265
+ // Facebook Page quick overview
266
+ PAGE_OVERVIEW: ["page_views_total", "page_post_engagements", "page_video_views"],
267
+ // Facebook Video performance
268
+ VIDEO_PERFORMANCE: ["total_video_views", "total_video_avg_time_watched", "total_video_complete_views"],
269
+ // Facebook Reels performance
270
+ REELS_PERFORMANCE: ["blue_reels_play_count", "post_video_avg_time_watched", "post_video_social_actions"],
271
+ // Instagram account overview
272
+ INSTAGRAM_OVERVIEW: ["views", "reach", "accounts_engaged", "total_interactions"],
273
+ // Instagram content engagement
274
+ INSTAGRAM_ENGAGEMENT: ["likes", "comments", "shares", "saves"]
275
+ };
276
+
277
+ exports.FACEBOOK_GRAPH_API_BASE_URL = FACEBOOK_GRAPH_API_BASE_URL;
278
+ exports.FACEBOOK_GRAPH_API_VERSION = FACEBOOK_GRAPH_API_VERSION;
279
+ exports.FACEBOOK_OAUTH_AUTHORIZATION_URL = FACEBOOK_OAUTH_AUTHORIZATION_URL;
280
+ exports.HttpClient = HttpClient;
281
+ exports.INSIGHTS_PERIODS = INSIGHTS_PERIODS;
282
+ exports.INSTAGRAM_ACCOUNT_METRICS = INSTAGRAM_ACCOUNT_METRICS;
283
+ exports.INSTAGRAM_DEMOGRAPHICS_METRICS = INSTAGRAM_DEMOGRAPHICS_METRICS;
284
+ exports.INSTAGRAM_MEDIA_METRICS_COMMON = INSTAGRAM_MEDIA_METRICS_COMMON;
285
+ exports.INSTAGRAM_REELS_METRICS = INSTAGRAM_REELS_METRICS;
286
+ exports.INSTAGRAM_STORIES_METRICS = INSTAGRAM_STORIES_METRICS;
287
+ exports.METRIC_PRESETS = METRIC_PRESETS;
288
+ exports.PAGE_METRICS_LIFETIME = PAGE_METRICS_LIFETIME;
289
+ exports.PAGE_METRICS_PERIODIC = PAGE_METRICS_PERIODIC;
290
+ exports.PHOTO_METRICS = PHOTO_METRICS;
291
+ exports.POST_METRICS = POST_METRICS;
292
+ exports.REELS_METRICS = REELS_METRICS;
293
+ exports.REELS_METRICS_EXTENDED = REELS_METRICS_EXTENDED;
294
+ exports.VIDEO_METRICS = VIDEO_METRICS;
295
+ //# sourceMappingURL=chunk-ER5A6TIL.js.map
296
+ //# sourceMappingURL=chunk-ER5A6TIL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../core/http/HttpClient.ts","../core/constants.ts","../core/insights.constants.ts"],"names":["APIError"],"mappings":"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","file":"chunk-ER5A6TIL.js","sourcesContent":["/**\n * HTTP Client - Generic HTTP client for all APIs\n */\n\nimport { APIClient, HttpClientConfig, RequestOptions } from '../types';\nimport { APIError } from '../errors';\n\nexport class HttpClient implements APIClient {\n private config: HttpClientConfig;\n\n constructor(config: HttpClientConfig) {\n this.config = {\n timeout: 30000, // 30 seconds default\n headers: {\n 'Content-Type': 'application/json',\n },\n ...config,\n };\n }\n\n /**\n * Generic request\n */\n async request<T>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n const url = this.buildURL(endpoint, options.params);\n const method = options.method || 'GET';\n\n const headers: Record<string, string> = {\n ...this.config.headers,\n ...options.headers,\n };\n\n // Add token if exists\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n\n const config: RequestInit = {\n method,\n headers,\n signal: this.createAbortSignal(options.timeout || this.config.timeout),\n };\n\n // Add body if exists (not for GET)\n if (options.body && method !== 'GET') {\n if (headers['Content-Type'] === 'application/json') {\n config.body = JSON.stringify(options.body);\n } else if (\n headers['Content-Type'] === 'application/x-www-form-urlencoded'\n ) {\n config.body = this.encodeFormBody(options.body);\n } else {\n config.body = options.body;\n }\n }\n\n try {\n const response = await fetch(url, config);\n return await this.handleResponse<T>(response);\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n 'NETWORK_ERROR',\n error\n );\n }\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string, params?: Record<string, any>): Promise<T> {\n return this.request<T>(endpoint, { method: 'GET', params });\n }\n\n /**\n * POST request\n */\n async post<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'POST', body });\n }\n\n /**\n * PUT request\n */\n async put<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'PUT', body });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'DELETE' });\n }\n\n /**\n * Build URL with query params\n */\n private buildURL(endpoint: string, params?: Record<string, any>): string {\n const url = endpoint.startsWith('http')\n ? endpoint\n : `${this.config.baseURL}${endpoint}`;\n\n if (!params || Object.keys(params).length === 0) {\n return url;\n }\n\n const queryString = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n )\n .join('&');\n\n return queryString ? `${url}?${queryString}` : url;\n }\n\n /**\n * Encode body as form-urlencoded\n */\n private encodeFormBody(body: Record<string, any>): string {\n return Object.entries(body)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n )\n .join('&');\n }\n\n /**\n * Create AbortSignal for timeout\n */\n private createAbortSignal(timeout?: number): AbortSignal | undefined {\n if (!timeout) return undefined;\n\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n return controller.signal;\n }\n\n /**\n * Handle HTTP response\n */\n private async handleResponse<T>(response: Response): Promise<T> {\n // Try to parse as JSON\n let data: any;\n const contentType = response.headers.get('content-type');\n\n if (contentType?.includes('application/json')) {\n data = await response.json();\n } else {\n data = await response.text();\n }\n\n // If response is not successful, throw error\n if (!response.ok) {\n const errorMessage =\n data?.error?.message || data?.message || 'API request failed';\n const errorCode = data?.error?.code || data?.code || response.status;\n\n throw new APIError(errorMessage, response.status, errorCode, data);\n }\n\n return data as T;\n }\n\n /**\n * Update access token\n */\n setAccessToken(token: string) {\n this.config.accessToken = token;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): HttpClientConfig {\n return { ...this.config };\n }\n}\n\n\n","/**\n * Constants - SDK global constants\n */\n\n/**\n * Facebook & Instagram Graph API Version\n * IMPORTANT: Do not change this version unless you have tested all functionality\n * Different API versions may have different response structures\n * \n * @see https://developers.facebook.com/docs/graph-api/changelog\n */\nexport const FACEBOOK_GRAPH_API_VERSION = 'v24.0' as const;\n\n/**\n * Facebook Graph API Base URL\n */\nexport const FACEBOOK_GRAPH_API_BASE_URL = `https://graph.facebook.com/${FACEBOOK_GRAPH_API_VERSION}` as const;\n\n/**\n * Facebook OAuth Authorization Endpoint\n */\nexport const FACEBOOK_OAUTH_AUTHORIZATION_URL = `https://www.facebook.com/${FACEBOOK_GRAPH_API_VERSION}/dialog/oauth` as const;\n\n","/**\n * Insights Constants - Metrics available for Facebook/Instagram APIs\n * Updated for Graph API v24.0 (includes Nov 2025 changes)\n * \n * @see https://developers.facebook.com/docs/insights/guides\n */\n\n// ============= Page Insights Metrics =============\n\n/**\n * Facebook Page metrics (lifetime)\n * Note: 'page_fans' deprecated Nov 2025, use 'followers_count' field instead\n */\nexport const PAGE_METRICS_LIFETIME = [\n 'page_fans_country',\n 'page_fans_city',\n 'page_fans_gender_age',\n] as const;\n\n/**\n * Facebook Page metrics (day/week/days_28)\n * Note: 'page_impressions' deprecated Nov 2025, use 'page_views' instead\n */\nexport const PAGE_METRICS_PERIODIC = [\n 'page_views_total',\n 'page_views',\n 'page_post_engagements',\n 'page_fans_online',\n 'page_fans_online_per_day',\n 'page_video_views',\n 'page_daily_follows',\n 'page_daily_unfollows',\n] as const;\n\n// ============= Post Insights Metrics =============\n\n/**\n * Post metrics (lifetime only)\n * Note: 'post_impressions' deprecated, use 'post_views' equivalents\n */\nexport const POST_METRICS = [\n 'post_engaged_users',\n 'post_negative_feedback',\n 'post_engaged_fan',\n 'post_clicks',\n 'post_clicks_unique',\n 'post_reactions_by_type_total',\n] as const;\n\n// ============= Video Insights Metrics =============\n\n/**\n * Video metrics (lifetime)\n * Note: 'video_views' deprecated Apr 2024, use 'total_video_views'\n */\nexport const VIDEO_METRICS = [\n 'total_video_views',\n 'total_video_views_unique',\n 'total_video_views_autoplayed',\n 'total_video_views_clicked_to_play',\n 'total_video_views_organic',\n 'total_video_views_organic_unique',\n 'total_video_views_paid',\n 'total_video_views_paid_unique',\n 'total_video_avg_time_watched',\n 'total_video_view_total_time',\n 'total_video_complete_views',\n 'total_video_complete_views_unique',\n 'total_video_complete_views_organic',\n 'total_video_complete_views_organic_unique',\n 'total_video_complete_views_paid',\n 'total_video_complete_views_paid_unique',\n] as const;\n\n// ============= Reels Insights Metrics =============\n\n/**\n * Facebook Reels metrics (added Dec 2024)\n * Available via Video Insights API\n */\nexport const REELS_METRICS = [\n 'blue_reels_play_count',\n 'post_video_avg_time_watched',\n 'post_video_views',\n 'post_video_social_actions',\n] as const;\n\n/**\n * Extended Reels metrics for detailed analysis\n */\nexport const REELS_METRICS_EXTENDED = [\n 'plays',\n 'comments',\n 'likes',\n 'shares',\n 'reach',\n 'total_plays',\n 'average_minutes_viewed',\n 'minutes_viewed',\n] as const;\n\n// ============= Photo Insights Metrics =============\n\n/**\n * Photo metrics (lifetime only)\n */\nexport const PHOTO_METRICS = [\n 'photo_views',\n 'photo_reach',\n 'engaged_users',\n] as const;\n\n// ============= Instagram Account Metrics =============\n\n/**\n * Instagram account metrics (day/week/days_28)\n * Note: 'impressions' deprecated Apr 2025, use 'views'\n */\nexport const INSTAGRAM_ACCOUNT_METRICS = [\n 'views',\n 'reach',\n 'accounts_engaged',\n 'total_interactions',\n 'likes',\n 'comments',\n 'shares',\n 'saves',\n 'follows_and_unfollows',\n 'profile_links_taps',\n 'profile_views',\n] as const;\n\n/**\n * Instagram account metrics - Demographics\n */\nexport const INSTAGRAM_DEMOGRAPHICS_METRICS = [\n 'follower_demographics',\n 'reached_audience_demographics',\n 'engaged_audience_demographics',\n] as const;\n\n// ============= Instagram Media Metrics =============\n\n/**\n * Instagram media metrics (all types)\n */\nexport const INSTAGRAM_MEDIA_METRICS_COMMON = [\n 'views',\n 'reach',\n 'likes',\n 'comments',\n 'shares',\n 'saved',\n 'total_interactions',\n] as const;\n\n/**\n * Instagram Reels specific metrics\n */\nexport const INSTAGRAM_REELS_METRICS = [\n 'plays',\n 'reach',\n 'likes',\n 'comments',\n 'shares',\n 'saved',\n 'total_interactions',\n] as const;\n\n/**\n * Instagram Stories specific metrics\n */\nexport const INSTAGRAM_STORIES_METRICS = [\n 'exits',\n 'replies',\n 'taps_forward',\n 'taps_back',\n 'views',\n 'reach',\n] as const;\n\n// ============= Insights Periods =============\n\nexport const INSIGHTS_PERIODS = {\n DAY: 'day',\n WEEK: 'week',\n DAYS_28: 'days_28',\n MONTH: 'month',\n LIFETIME: 'lifetime',\n} as const;\n\nexport type InsightsPeriod = typeof INSIGHTS_PERIODS[keyof typeof INSIGHTS_PERIODS];\n\n// ============= Helper - Preset Metric Groups =============\n\n/**\n * Common metric presets for quick access\n */\nexport const METRIC_PRESETS = {\n // Facebook Page quick overview\n PAGE_OVERVIEW: ['page_views_total', 'page_post_engagements', 'page_video_views'],\n \n // Facebook Video performance\n VIDEO_PERFORMANCE: ['total_video_views', 'total_video_avg_time_watched', 'total_video_complete_views'],\n \n // Facebook Reels performance\n REELS_PERFORMANCE: ['blue_reels_play_count', 'post_video_avg_time_watched', 'post_video_social_actions'],\n \n // Instagram account overview\n INSTAGRAM_OVERVIEW: ['views', 'reach', 'accounts_engaged', 'total_interactions'],\n \n // Instagram content engagement\n INSTAGRAM_ENGAGEMENT: ['likes', 'comments', 'shares', 'saves'],\n} as const;\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-GF3OEIKI.mjs.map
3
+ //# sourceMappingURL=chunk-GF3OEIKI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-GF3OEIKI.mjs"}
@@ -0,0 +1,277 @@
1
+ import { APIError } from './chunk-36RADUUO.mjs';
2
+
3
+ // core/http/HttpClient.ts
4
+ var HttpClient = class {
5
+ constructor(config) {
6
+ this.config = {
7
+ timeout: 3e4,
8
+ // 30 seconds default
9
+ headers: {
10
+ "Content-Type": "application/json"
11
+ },
12
+ ...config
13
+ };
14
+ }
15
+ /**
16
+ * Generic request
17
+ */
18
+ async request(endpoint, options = {}) {
19
+ const url = this.buildURL(endpoint, options.params);
20
+ const method = options.method || "GET";
21
+ const headers = {
22
+ ...this.config.headers,
23
+ ...options.headers
24
+ };
25
+ if (this.config.accessToken) {
26
+ headers["Authorization"] = `Bearer ${this.config.accessToken}`;
27
+ }
28
+ const config = {
29
+ method,
30
+ headers,
31
+ signal: this.createAbortSignal(options.timeout || this.config.timeout)
32
+ };
33
+ if (options.body && method !== "GET") {
34
+ if (headers["Content-Type"] === "application/json") {
35
+ config.body = JSON.stringify(options.body);
36
+ } else if (headers["Content-Type"] === "application/x-www-form-urlencoded") {
37
+ config.body = this.encodeFormBody(options.body);
38
+ } else {
39
+ config.body = options.body;
40
+ }
41
+ }
42
+ try {
43
+ const response = await fetch(url, config);
44
+ return await this.handleResponse(response);
45
+ } catch (error) {
46
+ if (error instanceof APIError) {
47
+ throw error;
48
+ }
49
+ throw new APIError(
50
+ `Network error: ${error instanceof Error ? error.message : "Unknown error"}`,
51
+ 0,
52
+ "NETWORK_ERROR",
53
+ error
54
+ );
55
+ }
56
+ }
57
+ /**
58
+ * GET request
59
+ */
60
+ async get(endpoint, params) {
61
+ return this.request(endpoint, { method: "GET", params });
62
+ }
63
+ /**
64
+ * POST request
65
+ */
66
+ async post(endpoint, body) {
67
+ return this.request(endpoint, { method: "POST", body });
68
+ }
69
+ /**
70
+ * PUT request
71
+ */
72
+ async put(endpoint, body) {
73
+ return this.request(endpoint, { method: "PUT", body });
74
+ }
75
+ /**
76
+ * DELETE request
77
+ */
78
+ async delete(endpoint) {
79
+ return this.request(endpoint, { method: "DELETE" });
80
+ }
81
+ /**
82
+ * Build URL with query params
83
+ */
84
+ buildURL(endpoint, params) {
85
+ const url = endpoint.startsWith("http") ? endpoint : `${this.config.baseURL}${endpoint}`;
86
+ if (!params || Object.keys(params).length === 0) {
87
+ return url;
88
+ }
89
+ const queryString = Object.entries(params).filter(([_, value]) => value !== void 0 && value !== null).map(
90
+ ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`
91
+ ).join("&");
92
+ return queryString ? `${url}?${queryString}` : url;
93
+ }
94
+ /**
95
+ * Encode body as form-urlencoded
96
+ */
97
+ encodeFormBody(body) {
98
+ return Object.entries(body).filter(([_, value]) => value !== void 0 && value !== null).map(
99
+ ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`
100
+ ).join("&");
101
+ }
102
+ /**
103
+ * Create AbortSignal for timeout
104
+ */
105
+ createAbortSignal(timeout) {
106
+ if (!timeout) return void 0;
107
+ const controller = new AbortController();
108
+ setTimeout(() => controller.abort(), timeout);
109
+ return controller.signal;
110
+ }
111
+ /**
112
+ * Handle HTTP response
113
+ */
114
+ async handleResponse(response) {
115
+ let data;
116
+ const contentType = response.headers.get("content-type");
117
+ if (contentType?.includes("application/json")) {
118
+ data = await response.json();
119
+ } else {
120
+ data = await response.text();
121
+ }
122
+ if (!response.ok) {
123
+ const errorMessage = data?.error?.message || data?.message || "API request failed";
124
+ const errorCode = data?.error?.code || data?.code || response.status;
125
+ throw new APIError(errorMessage, response.status, errorCode, data);
126
+ }
127
+ return data;
128
+ }
129
+ /**
130
+ * Update access token
131
+ */
132
+ setAccessToken(token) {
133
+ this.config.accessToken = token;
134
+ }
135
+ /**
136
+ * Get current configuration
137
+ */
138
+ getConfig() {
139
+ return { ...this.config };
140
+ }
141
+ };
142
+
143
+ // core/constants.ts
144
+ var FACEBOOK_GRAPH_API_VERSION = "v24.0";
145
+ var FACEBOOK_GRAPH_API_BASE_URL = `https://graph.facebook.com/${FACEBOOK_GRAPH_API_VERSION}`;
146
+ var FACEBOOK_OAUTH_AUTHORIZATION_URL = `https://www.facebook.com/${FACEBOOK_GRAPH_API_VERSION}/dialog/oauth`;
147
+
148
+ // core/insights.constants.ts
149
+ var PAGE_METRICS_LIFETIME = [
150
+ "page_fans_country",
151
+ "page_fans_city",
152
+ "page_fans_gender_age"
153
+ ];
154
+ var PAGE_METRICS_PERIODIC = [
155
+ "page_views_total",
156
+ "page_views",
157
+ "page_post_engagements",
158
+ "page_fans_online",
159
+ "page_fans_online_per_day",
160
+ "page_video_views",
161
+ "page_daily_follows",
162
+ "page_daily_unfollows"
163
+ ];
164
+ var POST_METRICS = [
165
+ "post_engaged_users",
166
+ "post_negative_feedback",
167
+ "post_engaged_fan",
168
+ "post_clicks",
169
+ "post_clicks_unique",
170
+ "post_reactions_by_type_total"
171
+ ];
172
+ var VIDEO_METRICS = [
173
+ "total_video_views",
174
+ "total_video_views_unique",
175
+ "total_video_views_autoplayed",
176
+ "total_video_views_clicked_to_play",
177
+ "total_video_views_organic",
178
+ "total_video_views_organic_unique",
179
+ "total_video_views_paid",
180
+ "total_video_views_paid_unique",
181
+ "total_video_avg_time_watched",
182
+ "total_video_view_total_time",
183
+ "total_video_complete_views",
184
+ "total_video_complete_views_unique",
185
+ "total_video_complete_views_organic",
186
+ "total_video_complete_views_organic_unique",
187
+ "total_video_complete_views_paid",
188
+ "total_video_complete_views_paid_unique"
189
+ ];
190
+ var REELS_METRICS = [
191
+ "blue_reels_play_count",
192
+ "post_video_avg_time_watched",
193
+ "post_video_views",
194
+ "post_video_social_actions"
195
+ ];
196
+ var REELS_METRICS_EXTENDED = [
197
+ "plays",
198
+ "comments",
199
+ "likes",
200
+ "shares",
201
+ "reach",
202
+ "total_plays",
203
+ "average_minutes_viewed",
204
+ "minutes_viewed"
205
+ ];
206
+ var PHOTO_METRICS = [
207
+ "photo_views",
208
+ "photo_reach",
209
+ "engaged_users"
210
+ ];
211
+ var INSTAGRAM_ACCOUNT_METRICS = [
212
+ "views",
213
+ "reach",
214
+ "accounts_engaged",
215
+ "total_interactions",
216
+ "likes",
217
+ "comments",
218
+ "shares",
219
+ "saves",
220
+ "follows_and_unfollows",
221
+ "profile_links_taps",
222
+ "profile_views"
223
+ ];
224
+ var INSTAGRAM_DEMOGRAPHICS_METRICS = [
225
+ "follower_demographics",
226
+ "reached_audience_demographics",
227
+ "engaged_audience_demographics"
228
+ ];
229
+ var INSTAGRAM_MEDIA_METRICS_COMMON = [
230
+ "views",
231
+ "reach",
232
+ "likes",
233
+ "comments",
234
+ "shares",
235
+ "saved",
236
+ "total_interactions"
237
+ ];
238
+ var INSTAGRAM_REELS_METRICS = [
239
+ "plays",
240
+ "reach",
241
+ "likes",
242
+ "comments",
243
+ "shares",
244
+ "saved",
245
+ "total_interactions"
246
+ ];
247
+ var INSTAGRAM_STORIES_METRICS = [
248
+ "exits",
249
+ "replies",
250
+ "taps_forward",
251
+ "taps_back",
252
+ "views",
253
+ "reach"
254
+ ];
255
+ var INSIGHTS_PERIODS = {
256
+ DAY: "day",
257
+ WEEK: "week",
258
+ DAYS_28: "days_28",
259
+ MONTH: "month",
260
+ LIFETIME: "lifetime"
261
+ };
262
+ var METRIC_PRESETS = {
263
+ // Facebook Page quick overview
264
+ PAGE_OVERVIEW: ["page_views_total", "page_post_engagements", "page_video_views"],
265
+ // Facebook Video performance
266
+ VIDEO_PERFORMANCE: ["total_video_views", "total_video_avg_time_watched", "total_video_complete_views"],
267
+ // Facebook Reels performance
268
+ REELS_PERFORMANCE: ["blue_reels_play_count", "post_video_avg_time_watched", "post_video_social_actions"],
269
+ // Instagram account overview
270
+ INSTAGRAM_OVERVIEW: ["views", "reach", "accounts_engaged", "total_interactions"],
271
+ // Instagram content engagement
272
+ INSTAGRAM_ENGAGEMENT: ["likes", "comments", "shares", "saves"]
273
+ };
274
+
275
+ export { FACEBOOK_GRAPH_API_BASE_URL, FACEBOOK_GRAPH_API_VERSION, FACEBOOK_OAUTH_AUTHORIZATION_URL, HttpClient, INSIGHTS_PERIODS, INSTAGRAM_ACCOUNT_METRICS, INSTAGRAM_DEMOGRAPHICS_METRICS, INSTAGRAM_MEDIA_METRICS_COMMON, INSTAGRAM_REELS_METRICS, INSTAGRAM_STORIES_METRICS, METRIC_PRESETS, PAGE_METRICS_LIFETIME, PAGE_METRICS_PERIODIC, PHOTO_METRICS, POST_METRICS, REELS_METRICS, REELS_METRICS_EXTENDED, VIDEO_METRICS };
276
+ //# sourceMappingURL=chunk-H5GAC4UG.mjs.map
277
+ //# sourceMappingURL=chunk-H5GAC4UG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../core/http/HttpClient.ts","../core/constants.ts","../core/insights.constants.ts"],"names":[],"mappings":"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","file":"chunk-H5GAC4UG.mjs","sourcesContent":["/**\n * HTTP Client - Generic HTTP client for all APIs\n */\n\nimport { APIClient, HttpClientConfig, RequestOptions } from '../types';\nimport { APIError } from '../errors';\n\nexport class HttpClient implements APIClient {\n private config: HttpClientConfig;\n\n constructor(config: HttpClientConfig) {\n this.config = {\n timeout: 30000, // 30 seconds default\n headers: {\n 'Content-Type': 'application/json',\n },\n ...config,\n };\n }\n\n /**\n * Generic request\n */\n async request<T>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n const url = this.buildURL(endpoint, options.params);\n const method = options.method || 'GET';\n\n const headers: Record<string, string> = {\n ...this.config.headers,\n ...options.headers,\n };\n\n // Add token if exists\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n\n const config: RequestInit = {\n method,\n headers,\n signal: this.createAbortSignal(options.timeout || this.config.timeout),\n };\n\n // Add body if exists (not for GET)\n if (options.body && method !== 'GET') {\n if (headers['Content-Type'] === 'application/json') {\n config.body = JSON.stringify(options.body);\n } else if (\n headers['Content-Type'] === 'application/x-www-form-urlencoded'\n ) {\n config.body = this.encodeFormBody(options.body);\n } else {\n config.body = options.body;\n }\n }\n\n try {\n const response = await fetch(url, config);\n return await this.handleResponse<T>(response);\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n 'NETWORK_ERROR',\n error\n );\n }\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string, params?: Record<string, any>): Promise<T> {\n return this.request<T>(endpoint, { method: 'GET', params });\n }\n\n /**\n * POST request\n */\n async post<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'POST', body });\n }\n\n /**\n * PUT request\n */\n async put<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'PUT', body });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'DELETE' });\n }\n\n /**\n * Build URL with query params\n */\n private buildURL(endpoint: string, params?: Record<string, any>): string {\n const url = endpoint.startsWith('http')\n ? endpoint\n : `${this.config.baseURL}${endpoint}`;\n\n if (!params || Object.keys(params).length === 0) {\n return url;\n }\n\n const queryString = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n )\n .join('&');\n\n return queryString ? `${url}?${queryString}` : url;\n }\n\n /**\n * Encode body as form-urlencoded\n */\n private encodeFormBody(body: Record<string, any>): string {\n return Object.entries(body)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n )\n .join('&');\n }\n\n /**\n * Create AbortSignal for timeout\n */\n private createAbortSignal(timeout?: number): AbortSignal | undefined {\n if (!timeout) return undefined;\n\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n return controller.signal;\n }\n\n /**\n * Handle HTTP response\n */\n private async handleResponse<T>(response: Response): Promise<T> {\n // Try to parse as JSON\n let data: any;\n const contentType = response.headers.get('content-type');\n\n if (contentType?.includes('application/json')) {\n data = await response.json();\n } else {\n data = await response.text();\n }\n\n // If response is not successful, throw error\n if (!response.ok) {\n const errorMessage =\n data?.error?.message || data?.message || 'API request failed';\n const errorCode = data?.error?.code || data?.code || response.status;\n\n throw new APIError(errorMessage, response.status, errorCode, data);\n }\n\n return data as T;\n }\n\n /**\n * Update access token\n */\n setAccessToken(token: string) {\n this.config.accessToken = token;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): HttpClientConfig {\n return { ...this.config };\n }\n}\n\n\n","/**\n * Constants - SDK global constants\n */\n\n/**\n * Facebook & Instagram Graph API Version\n * IMPORTANT: Do not change this version unless you have tested all functionality\n * Different API versions may have different response structures\n * \n * @see https://developers.facebook.com/docs/graph-api/changelog\n */\nexport const FACEBOOK_GRAPH_API_VERSION = 'v24.0' as const;\n\n/**\n * Facebook Graph API Base URL\n */\nexport const FACEBOOK_GRAPH_API_BASE_URL = `https://graph.facebook.com/${FACEBOOK_GRAPH_API_VERSION}` as const;\n\n/**\n * Facebook OAuth Authorization Endpoint\n */\nexport const FACEBOOK_OAUTH_AUTHORIZATION_URL = `https://www.facebook.com/${FACEBOOK_GRAPH_API_VERSION}/dialog/oauth` as const;\n\n","/**\n * Insights Constants - Metrics available for Facebook/Instagram APIs\n * Updated for Graph API v24.0 (includes Nov 2025 changes)\n * \n * @see https://developers.facebook.com/docs/insights/guides\n */\n\n// ============= Page Insights Metrics =============\n\n/**\n * Facebook Page metrics (lifetime)\n * Note: 'page_fans' deprecated Nov 2025, use 'followers_count' field instead\n */\nexport const PAGE_METRICS_LIFETIME = [\n 'page_fans_country',\n 'page_fans_city',\n 'page_fans_gender_age',\n] as const;\n\n/**\n * Facebook Page metrics (day/week/days_28)\n * Note: 'page_impressions' deprecated Nov 2025, use 'page_views' instead\n */\nexport const PAGE_METRICS_PERIODIC = [\n 'page_views_total',\n 'page_views',\n 'page_post_engagements',\n 'page_fans_online',\n 'page_fans_online_per_day',\n 'page_video_views',\n 'page_daily_follows',\n 'page_daily_unfollows',\n] as const;\n\n// ============= Post Insights Metrics =============\n\n/**\n * Post metrics (lifetime only)\n * Note: 'post_impressions' deprecated, use 'post_views' equivalents\n */\nexport const POST_METRICS = [\n 'post_engaged_users',\n 'post_negative_feedback',\n 'post_engaged_fan',\n 'post_clicks',\n 'post_clicks_unique',\n 'post_reactions_by_type_total',\n] as const;\n\n// ============= Video Insights Metrics =============\n\n/**\n * Video metrics (lifetime)\n * Note: 'video_views' deprecated Apr 2024, use 'total_video_views'\n */\nexport const VIDEO_METRICS = [\n 'total_video_views',\n 'total_video_views_unique',\n 'total_video_views_autoplayed',\n 'total_video_views_clicked_to_play',\n 'total_video_views_organic',\n 'total_video_views_organic_unique',\n 'total_video_views_paid',\n 'total_video_views_paid_unique',\n 'total_video_avg_time_watched',\n 'total_video_view_total_time',\n 'total_video_complete_views',\n 'total_video_complete_views_unique',\n 'total_video_complete_views_organic',\n 'total_video_complete_views_organic_unique',\n 'total_video_complete_views_paid',\n 'total_video_complete_views_paid_unique',\n] as const;\n\n// ============= Reels Insights Metrics =============\n\n/**\n * Facebook Reels metrics (added Dec 2024)\n * Available via Video Insights API\n */\nexport const REELS_METRICS = [\n 'blue_reels_play_count',\n 'post_video_avg_time_watched',\n 'post_video_views',\n 'post_video_social_actions',\n] as const;\n\n/**\n * Extended Reels metrics for detailed analysis\n */\nexport const REELS_METRICS_EXTENDED = [\n 'plays',\n 'comments',\n 'likes',\n 'shares',\n 'reach',\n 'total_plays',\n 'average_minutes_viewed',\n 'minutes_viewed',\n] as const;\n\n// ============= Photo Insights Metrics =============\n\n/**\n * Photo metrics (lifetime only)\n */\nexport const PHOTO_METRICS = [\n 'photo_views',\n 'photo_reach',\n 'engaged_users',\n] as const;\n\n// ============= Instagram Account Metrics =============\n\n/**\n * Instagram account metrics (day/week/days_28)\n * Note: 'impressions' deprecated Apr 2025, use 'views'\n */\nexport const INSTAGRAM_ACCOUNT_METRICS = [\n 'views',\n 'reach',\n 'accounts_engaged',\n 'total_interactions',\n 'likes',\n 'comments',\n 'shares',\n 'saves',\n 'follows_and_unfollows',\n 'profile_links_taps',\n 'profile_views',\n] as const;\n\n/**\n * Instagram account metrics - Demographics\n */\nexport const INSTAGRAM_DEMOGRAPHICS_METRICS = [\n 'follower_demographics',\n 'reached_audience_demographics',\n 'engaged_audience_demographics',\n] as const;\n\n// ============= Instagram Media Metrics =============\n\n/**\n * Instagram media metrics (all types)\n */\nexport const INSTAGRAM_MEDIA_METRICS_COMMON = [\n 'views',\n 'reach',\n 'likes',\n 'comments',\n 'shares',\n 'saved',\n 'total_interactions',\n] as const;\n\n/**\n * Instagram Reels specific metrics\n */\nexport const INSTAGRAM_REELS_METRICS = [\n 'plays',\n 'reach',\n 'likes',\n 'comments',\n 'shares',\n 'saved',\n 'total_interactions',\n] as const;\n\n/**\n * Instagram Stories specific metrics\n */\nexport const INSTAGRAM_STORIES_METRICS = [\n 'exits',\n 'replies',\n 'taps_forward',\n 'taps_back',\n 'views',\n 'reach',\n] as const;\n\n// ============= Insights Periods =============\n\nexport const INSIGHTS_PERIODS = {\n DAY: 'day',\n WEEK: 'week',\n DAYS_28: 'days_28',\n MONTH: 'month',\n LIFETIME: 'lifetime',\n} as const;\n\nexport type InsightsPeriod = typeof INSIGHTS_PERIODS[keyof typeof INSIGHTS_PERIODS];\n\n// ============= Helper - Preset Metric Groups =============\n\n/**\n * Common metric presets for quick access\n */\nexport const METRIC_PRESETS = {\n // Facebook Page quick overview\n PAGE_OVERVIEW: ['page_views_total', 'page_post_engagements', 'page_video_views'],\n \n // Facebook Video performance\n VIDEO_PERFORMANCE: ['total_video_views', 'total_video_avg_time_watched', 'total_video_complete_views'],\n \n // Facebook Reels performance\n REELS_PERFORMANCE: ['blue_reels_play_count', 'post_video_avg_time_watched', 'post_video_social_actions'],\n \n // Instagram account overview\n INSTAGRAM_OVERVIEW: ['views', 'reach', 'accounts_engaged', 'total_interactions'],\n \n // Instagram content engagement\n INSTAGRAM_ENGAGEMENT: ['likes', 'comments', 'shares', 'saves'],\n} as const;\n"]}