@dracoonghost/trndup-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,414 @@
1
+ 'use strict';
2
+
3
+ // client.ts
4
+ var TrndUpApiError = class extends Error {
5
+ constructor(response, status, endpoint) {
6
+ super(response.error);
7
+ this.response = response;
8
+ this.status = status;
9
+ this.endpoint = endpoint;
10
+ this.name = "TrndUpApiError";
11
+ }
12
+ get code() {
13
+ return this.response.code;
14
+ }
15
+ get metadata() {
16
+ return this.response.metadata;
17
+ }
18
+ /** Check if error is due to authentication failure */
19
+ isAuthError() {
20
+ return this.status === 401 || this.code === "AUTH_EXPIRED" || this.code === "AUTH_INVALID";
21
+ }
22
+ /** Check if error is due to rate limiting */
23
+ isRateLimitError() {
24
+ return this.status === 429 || this.code === "RATE_LIMITED";
25
+ }
26
+ };
27
+ var TrndUpNetworkError = class extends Error {
28
+ constructor(originalError, endpoint) {
29
+ super(`Network error calling ${endpoint}: ${originalError.message}`);
30
+ this.originalError = originalError;
31
+ this.endpoint = endpoint;
32
+ this.name = "TrndUpNetworkError";
33
+ }
34
+ };
35
+ var TrndUpClient = class {
36
+ constructor(config) {
37
+ this.config = {
38
+ baseUrl: config.baseUrl.replace(/\/$/, ""),
39
+ // Remove trailing slash
40
+ getToken: config.getToken,
41
+ timeout: config.timeout ?? 3e4,
42
+ onAuthFailure: config.onAuthFailure,
43
+ onError: config.onError,
44
+ defaultHeaders: config.defaultHeaders,
45
+ debug: config.debug ?? false
46
+ };
47
+ }
48
+ // =============================================================================
49
+ // PUBLIC REQUEST METHODS
50
+ // =============================================================================
51
+ async get(path, params, options) {
52
+ return this.request({ method: "GET", path, params, ...options });
53
+ }
54
+ async post(path, body, options) {
55
+ return this.request({ method: "POST", path, body, ...options });
56
+ }
57
+ async put(path, body, options) {
58
+ return this.request({ method: "PUT", path, body, ...options });
59
+ }
60
+ async patch(path, body, options) {
61
+ return this.request({ method: "PATCH", path, body, ...options });
62
+ }
63
+ async delete(path, options) {
64
+ return this.request({ method: "DELETE", path, ...options });
65
+ }
66
+ // =============================================================================
67
+ // CORE REQUEST LOGIC
68
+ // =============================================================================
69
+ async request(config) {
70
+ const { method, path, params, body, skipAuth, headers, signal, timeout } = config;
71
+ const url = this.buildUrl(path, params);
72
+ const requestHeaders = await this.buildHeaders(skipAuth, headers);
73
+ const init = {
74
+ method,
75
+ headers: requestHeaders,
76
+ signal
77
+ };
78
+ if (body && method !== "GET") {
79
+ init.body = JSON.stringify(body);
80
+ }
81
+ const controller = new AbortController();
82
+ const timeoutId = setTimeout(
83
+ () => controller.abort(),
84
+ timeout ?? this.config.timeout
85
+ );
86
+ try {
87
+ if (this.config.debug) {
88
+ console.log(`[TrndUp SDK] ${method} ${url}`, { body, headers: requestHeaders });
89
+ }
90
+ const response = await fetch(url, {
91
+ ...init,
92
+ signal: signal ?? controller.signal
93
+ });
94
+ clearTimeout(timeoutId);
95
+ return await this.handleResponse(response, path);
96
+ } catch (error) {
97
+ clearTimeout(timeoutId);
98
+ if (error instanceof TrndUpApiError) {
99
+ throw error;
100
+ }
101
+ const networkError = new TrndUpNetworkError(
102
+ error,
103
+ path
104
+ );
105
+ if (this.config.debug) {
106
+ console.error("[TrndUp SDK] Network error:", networkError);
107
+ }
108
+ throw networkError;
109
+ }
110
+ }
111
+ buildUrl(path, params) {
112
+ const url = new URL(`${this.config.baseUrl}${path}`);
113
+ if (params) {
114
+ Object.entries(params).forEach(([key, value]) => {
115
+ if (value !== void 0 && value !== null) {
116
+ url.searchParams.append(key, String(value));
117
+ }
118
+ });
119
+ }
120
+ return url.toString();
121
+ }
122
+ async buildHeaders(skipAuth, additionalHeaders) {
123
+ const headers = {
124
+ "Content-Type": "application/json",
125
+ ...this.config.defaultHeaders,
126
+ ...additionalHeaders
127
+ };
128
+ if (!skipAuth) {
129
+ const token = await this.config.getToken();
130
+ if (token) {
131
+ headers["Authorization"] = `Bearer ${token}`;
132
+ }
133
+ }
134
+ return headers;
135
+ }
136
+ async handleResponse(response, endpoint) {
137
+ const contentType = response.headers.get("content-type");
138
+ const isJson = contentType?.includes("application/json");
139
+ if (!response.ok) {
140
+ let errorResponse;
141
+ if (isJson) {
142
+ try {
143
+ const parsed = await response.json();
144
+ errorResponse = parsed;
145
+ } catch {
146
+ errorResponse = {
147
+ success: false,
148
+ error: response.statusText || "Unknown error",
149
+ code: `HTTP_${response.status}`
150
+ };
151
+ }
152
+ } else {
153
+ const text = await response.text();
154
+ errorResponse = {
155
+ success: false,
156
+ error: text || response.statusText || "Unknown error",
157
+ code: `HTTP_${response.status}`
158
+ };
159
+ }
160
+ const apiError = new TrndUpApiError(errorResponse, response.status, endpoint);
161
+ if (this.config.onError) {
162
+ this.config.onError(errorResponse, endpoint);
163
+ }
164
+ if (apiError.isAuthError() && this.config.onAuthFailure) {
165
+ await this.config.onAuthFailure();
166
+ }
167
+ if (this.config.debug) {
168
+ console.error("[TrndUp SDK] API error:", apiError);
169
+ }
170
+ throw apiError;
171
+ }
172
+ if (isJson) {
173
+ const parsed = await response.json();
174
+ const jsonResponse = parsed;
175
+ if (jsonResponse.success === false) {
176
+ throw new TrndUpApiError(jsonResponse, response.status, endpoint);
177
+ }
178
+ return jsonResponse.data;
179
+ }
180
+ return await response.text();
181
+ }
182
+ };
183
+
184
+ // modules/auth.ts
185
+ var AuthModule = class {
186
+ constructor(client) {
187
+ this.client = client;
188
+ }
189
+ /**
190
+ * Login with Firebase ID token
191
+ * POST /auth/login
192
+ */
193
+ async login(idToken) {
194
+ return this.client.post("/auth/login", { idToken }, { skipAuth: true });
195
+ }
196
+ /**
197
+ * Get current authenticated user's profile
198
+ * GET /auth/me
199
+ */
200
+ async getCurrentUser() {
201
+ return this.client.get("/auth/me");
202
+ }
203
+ /**
204
+ * Update user profile
205
+ * PATCH /auth/me
206
+ */
207
+ async updateProfile(data) {
208
+ return this.client.patch("/auth/me", data);
209
+ }
210
+ /**
211
+ * Logout (acknowledge logout on backend)
212
+ * POST /auth/logout
213
+ */
214
+ async logout() {
215
+ return this.client.post("/auth/logout");
216
+ }
217
+ /**
218
+ * Check auth service status
219
+ * GET /auth/status
220
+ */
221
+ async getStatus() {
222
+ return this.client.get("/auth/status", void 0, { skipAuth: true });
223
+ }
224
+ };
225
+
226
+ // modules/youtube.ts
227
+ var YouTubeModule = class {
228
+ constructor(client) {
229
+ this.client = client;
230
+ }
231
+ /**
232
+ * Get YouTube initialization status
233
+ * GET /v1/platforms/youtube/init/status
234
+ */
235
+ async getInitStatus() {
236
+ return this.client.get("/v1/platforms/youtube/init/status");
237
+ }
238
+ /**
239
+ * Initialize YouTube data sync
240
+ * POST /v1/platforms/youtube/init
241
+ */
242
+ async initialize() {
243
+ return this.client.post("/v1/platforms/youtube/init");
244
+ }
245
+ /**
246
+ * Get YouTube videos
247
+ * GET /v1/platforms/youtube/videos
248
+ */
249
+ async getVideos(params) {
250
+ return this.client.get(
251
+ "/v1/platforms/youtube/videos",
252
+ params
253
+ );
254
+ }
255
+ /**
256
+ * Get specific video by ID
257
+ * GET /v1/platforms/youtube/videos/:videoId
258
+ */
259
+ async getVideo(videoId) {
260
+ return this.client.get(`/v1/platforms/youtube/videos/${videoId}`);
261
+ }
262
+ /**
263
+ * Get channel metrics
264
+ * GET /v1/platforms/youtube/channel/metrics
265
+ */
266
+ async getChannelMetrics() {
267
+ return this.client.get("/v1/platforms/youtube/channel/metrics");
268
+ }
269
+ /**
270
+ * Get channel health score
271
+ * GET /v1/platforms/youtube/health
272
+ */
273
+ async getHealthScore(params) {
274
+ return this.client.get(
275
+ "/v1/platforms/youtube/health",
276
+ params
277
+ );
278
+ }
279
+ /**
280
+ * Refresh YouTube data
281
+ * POST /v1/platforms/youtube/refresh
282
+ */
283
+ async refresh() {
284
+ return this.client.post("/v1/platforms/youtube/refresh");
285
+ }
286
+ };
287
+
288
+ // modules/instagram.ts
289
+ var InstagramModule = class {
290
+ constructor(client) {
291
+ this.client = client;
292
+ }
293
+ /**
294
+ * Get Instagram initialization status
295
+ * GET /v1/platforms/instagram/init/status
296
+ */
297
+ async getInitStatus() {
298
+ return this.client.get("/v1/platforms/instagram/init/status");
299
+ }
300
+ /**
301
+ * Initialize Instagram data sync
302
+ * POST /v1/platforms/instagram/init
303
+ */
304
+ async initialize() {
305
+ return this.client.post("/v1/platforms/instagram/init");
306
+ }
307
+ /**
308
+ * Get Instagram posts
309
+ * GET /v1/platforms/instagram/posts
310
+ */
311
+ async getPosts(params) {
312
+ return this.client.get(
313
+ "/v1/platforms/instagram/posts",
314
+ params
315
+ );
316
+ }
317
+ /**
318
+ * Get specific post by ID
319
+ * GET /v1/platforms/instagram/posts/:postId
320
+ */
321
+ async getPost(postId) {
322
+ return this.client.get(`/v1/platforms/instagram/posts/${postId}`);
323
+ }
324
+ /**
325
+ * Get account metrics
326
+ * GET /v1/platforms/instagram/account/metrics
327
+ */
328
+ async getAccountMetrics() {
329
+ return this.client.get("/v1/platforms/instagram/account/metrics");
330
+ }
331
+ /**
332
+ * Refresh Instagram data
333
+ * POST /v1/platforms/instagram/refresh
334
+ */
335
+ async refresh() {
336
+ return this.client.post("/v1/platforms/instagram/refresh");
337
+ }
338
+ };
339
+
340
+ // modules/social.ts
341
+ var SocialModule = class {
342
+ constructor(client) {
343
+ this.client = client;
344
+ }
345
+ /**
346
+ * Link YouTube account
347
+ * POST /social/link/youtube
348
+ */
349
+ async linkYouTube(data) {
350
+ return this.client.post("/social/link/youtube", data);
351
+ }
352
+ /**
353
+ * Link Instagram account
354
+ * POST /social/link/instagram
355
+ */
356
+ async linkInstagram(data) {
357
+ return this.client.post("/social/link/instagram", data);
358
+ }
359
+ /**
360
+ * Get all connected social accounts
361
+ * GET /social/accounts
362
+ */
363
+ async getConnectedAccounts() {
364
+ return this.client.get("/social/accounts");
365
+ }
366
+ /**
367
+ * Unlink a social account
368
+ * DELETE /social/unlink/:provider
369
+ */
370
+ async unlinkAccount(provider) {
371
+ return this.client.delete(`/social/unlink/${provider}`);
372
+ }
373
+ };
374
+
375
+ // modules/insights.ts
376
+ var InsightsModule = class {
377
+ constructor(client) {
378
+ this.client = client;
379
+ }
380
+ /**
381
+ * Get cross-platform metrics
382
+ * GET /v1/insights/overview
383
+ */
384
+ async getOverview() {
385
+ return this.client.get("/v1/insights/overview");
386
+ }
387
+ /**
388
+ * Get trending content across all platforms
389
+ * GET /v1/insights/trending
390
+ */
391
+ async getTrending() {
392
+ return this.client.get("/v1/insights/trending");
393
+ }
394
+ };
395
+
396
+ // index.ts
397
+ var TrndUpSDK = class extends TrndUpClient {
398
+ constructor(config) {
399
+ super(config);
400
+ this.auth = new AuthModule(this);
401
+ this.youtube = new YouTubeModule(this);
402
+ this.instagram = new InstagramModule(this);
403
+ this.social = new SocialModule(this);
404
+ this.insights = new InsightsModule(this);
405
+ }
406
+ };
407
+ var SDK_VERSION = "1.0.0";
408
+
409
+ exports.SDK_VERSION = SDK_VERSION;
410
+ exports.TrndUpApiError = TrndUpApiError;
411
+ exports.TrndUpNetworkError = TrndUpNetworkError;
412
+ exports.TrndUpSDK = TrndUpSDK;
413
+ //# sourceMappingURL=index.js.map
414
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../client.ts","../modules/auth.ts","../modules/youtube.ts","../modules/instagram.ts","../modules/social.ts","../modules/insights.ts","../index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * TrndUp SDK - Base Client\n * \n * Core HTTP client with Firebase authentication support,\n * error handling, and automatic retries.\n */\n\nimport type { ApiResponse, ApiErrorResponse, ApiSuccessResponse } from './types';\n\n// =============================================================================\n// CONFIGURATION\n// =============================================================================\n\nexport interface TrndUpClientConfig {\n /** Base URL for the API (e.g., 'https://api.trndup.app' or 'http://localhost:3000') */\n baseUrl: string;\n \n /** Function to get the current Firebase ID token */\n getToken: () => string | null | Promise<string | null>;\n \n /** Called when auth completely fails (user needs to re-login) */\n onAuthFailure?: () => void | Promise<void>;\n \n /** Called on any API error */\n onError?: (error: ApiErrorResponse, endpoint: string) => void;\n \n /** Custom headers to include in all requests */\n defaultHeaders?: Record<string, string>;\n \n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n \n /** Enable debug logging (default: false) */\n debug?: boolean;\n}\n\nexport interface RequestOptions {\n /** Skip authentication for this request */\n skipAuth?: boolean;\n \n /** Additional headers for this request */\n headers?: Record<string, string>;\n \n /** AbortController signal for cancellation */\n signal?: AbortSignal;\n \n /** Custom timeout for this request */\n timeout?: number;\n}\n\ninterface RequestConfig extends RequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n}\n\n// =============================================================================\n// ERROR CLASSES\n// =============================================================================\n\nexport class TrndUpApiError extends Error {\n constructor(\n public readonly response: ApiErrorResponse,\n public readonly status: number,\n public readonly endpoint: string\n ) {\n super(response.error);\n this.name = 'TrndUpApiError';\n }\n \n get code(): string | undefined {\n return this.response.code;\n }\n\n get metadata(): Record<string, unknown> | undefined {\n return this.response.metadata;\n }\n\n /** Check if error is due to authentication failure */\n isAuthError(): boolean {\n return this.status === 401 || this.code === 'AUTH_EXPIRED' || this.code === 'AUTH_INVALID';\n }\n\n /** Check if error is due to rate limiting */\n isRateLimitError(): boolean {\n return this.status === 429 || this.code === 'RATE_LIMITED';\n }\n}\n\nexport class TrndUpNetworkError extends Error {\n constructor(\n public readonly originalError: Error,\n public readonly endpoint: string\n ) {\n super(`Network error calling ${endpoint}: ${originalError.message}`);\n this.name = 'TrndUpNetworkError';\n }\n}\n\n// =============================================================================\n// BASE CLIENT\n// =============================================================================\n\nexport class TrndUpClient {\n private config: Required<Omit<TrndUpClientConfig, 'onAuthFailure' | 'onError' | 'defaultHeaders' | 'debug'>> & {\n onAuthFailure?: TrndUpClientConfig['onAuthFailure'];\n onError?: TrndUpClientConfig['onError'];\n defaultHeaders?: Record<string, string>;\n debug?: boolean;\n };\n\n // Module instances (imported by subclasses or external modules)\n public auth!: any;\n public youtube!: any;\n public instagram!: any;\n public social!: any;\n public insights!: any;\n\n constructor(config: TrndUpClientConfig) {\n this.config = {\n baseUrl: config.baseUrl.replace(/\\/$/, ''), // Remove trailing slash\n getToken: config.getToken,\n timeout: config.timeout ?? 30000,\n onAuthFailure: config.onAuthFailure,\n onError: config.onError,\n defaultHeaders: config.defaultHeaders,\n debug: config.debug ?? false,\n };\n }\n\n // =============================================================================\n // PUBLIC REQUEST METHODS\n // =============================================================================\n\n async get<T = unknown>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({ method: 'GET', path, params, ...options });\n }\n\n async post<T = unknown>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({ method: 'POST', path, body, ...options });\n }\n\n async put<T = unknown>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({ method: 'PUT', path, body, ...options });\n }\n\n async patch<T = unknown>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({ method: 'PATCH', path, body, ...options });\n }\n\n async delete<T = unknown>(\n path: string,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({ method: 'DELETE', path, ...options });\n }\n\n // =============================================================================\n // CORE REQUEST LOGIC\n // =============================================================================\n\n private async request<T>(config: RequestConfig): Promise<T> {\n const { method, path, params, body, skipAuth, headers, signal, timeout } = config;\n\n // Build URL\n const url = this.buildUrl(path, params);\n\n // Build headers\n const requestHeaders = await this.buildHeaders(skipAuth, headers);\n\n // Build request init\n const init: RequestInit = {\n method,\n headers: requestHeaders,\n signal,\n };\n\n if (body && method !== 'GET') {\n init.body = JSON.stringify(body);\n }\n\n // Add timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n timeout ?? this.config.timeout\n );\n\n try {\n if (this.config.debug) {\n console.log(`[TrndUp SDK] ${method} ${url}`, { body, headers: requestHeaders });\n }\n\n const response = await fetch(url, {\n ...init,\n signal: signal ?? controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n return await this.handleResponse<T>(response, path);\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof TrndUpApiError) {\n throw error;\n }\n\n // Network error\n const networkError = new TrndUpNetworkError(\n error as Error,\n path\n );\n\n if (this.config.debug) {\n console.error('[TrndUp SDK] Network error:', networkError);\n }\n\n throw networkError;\n }\n }\n\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(`${this.config.baseUrl}${path}`);\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value));\n }\n });\n }\n\n return url.toString();\n }\n\n private async buildHeaders(\n skipAuth?: boolean,\n additionalHeaders?: Record<string, string>\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.config.defaultHeaders,\n ...additionalHeaders,\n };\n\n // Add Firebase ID token for authentication\n if (!skipAuth) {\n const token = await this.config.getToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n private async handleResponse<T>(response: Response, endpoint: string): Promise<T> {\n const contentType = response.headers.get('content-type');\n const isJson = contentType?.includes('application/json');\n\n if (!response.ok) {\n // Try to parse error response\n let errorResponse: ApiErrorResponse;\n\n if (isJson) {\n try {\n const parsed = await response.json();\n errorResponse = parsed as ApiErrorResponse;\n } catch {\n errorResponse = {\n success: false,\n error: response.statusText || 'Unknown error',\n code: `HTTP_${response.status}`,\n };\n }\n } else {\n const text = await response.text();\n errorResponse = {\n success: false,\n error: text || response.statusText || 'Unknown error',\n code: `HTTP_${response.status}`,\n };\n }\n\n const apiError = new TrndUpApiError(errorResponse, response.status, endpoint);\n\n // Call error handler\n if (this.config.onError) {\n this.config.onError(errorResponse, endpoint);\n }\n\n // Call auth failure handler for 401 errors\n if (apiError.isAuthError() && this.config.onAuthFailure) {\n await this.config.onAuthFailure();\n }\n\n if (this.config.debug) {\n console.error('[TrndUp SDK] API error:', apiError);\n }\n\n throw apiError;\n }\n\n // Parse success response\n if (isJson) {\n const parsed = await response.json();\n const jsonResponse = parsed as ApiResponse<T>;\n\n if (jsonResponse.success === false) {\n // This shouldn't happen with 2xx status, but handle it\n throw new TrndUpApiError(jsonResponse, response.status, endpoint);\n }\n\n return (jsonResponse as ApiSuccessResponse<T>).data;\n }\n\n // Non-JSON response\n return (await response.text()) as unknown as T;\n }\n}\n","/**\n * TrndUp SDK - Auth Module\n * \n * Firebase authentication methods\n */\n\nimport type { TrndUpClient } from '../client';\nimport type { Auth } from '../types';\n\nexport class AuthModule {\n constructor(private client: TrndUpClient) {}\n\n /**\n * Login with Firebase ID token\n * POST /auth/login\n */\n async login(idToken: string): Promise<Auth.LoginResponse> {\n return this.client.post<Auth.LoginResponse>('/auth/login', { idToken }, { skipAuth: true });\n }\n\n /**\n * Get current authenticated user's profile\n * GET /auth/me\n */\n async getCurrentUser(): Promise<Auth.CurrentUserResponse> {\n return this.client.get<Auth.CurrentUserResponse>('/auth/me');\n }\n\n /**\n * Update user profile\n * PATCH /auth/me\n */\n async updateProfile(data: Auth.UpdateProfileRequest): Promise<Auth.UpdateProfileResponse> {\n return this.client.patch<Auth.UpdateProfileResponse>('/auth/me', data);\n }\n\n /**\n * Logout (acknowledge logout on backend)\n * POST /auth/logout\n */\n async logout(): Promise<{ message: string }> {\n return this.client.post<{ message: string }>('/auth/logout');\n }\n\n /**\n * Check auth service status\n * GET /auth/status\n */\n async getStatus(): Promise<{ success: boolean; message: string }> {\n return this.client.get('/auth/status', undefined, { skipAuth: true });\n }\n}\n","/**\n * TrndUp SDK - YouTube Module\n * \n * YouTube analytics and data methods\n */\n\nimport type { TrndUpClient } from '../client';\nimport type { YouTube } from '../types';\n\nexport class YouTubeModule {\n constructor(private client: TrndUpClient) {}\n\n /**\n * Get YouTube initialization status\n * GET /v1/platforms/youtube/init/status\n */\n async getInitStatus(): Promise<YouTube.InitStatusResponse> {\n return this.client.get<YouTube.InitStatusResponse>('/v1/platforms/youtube/init/status');\n }\n\n /**\n * Initialize YouTube data sync\n * POST /v1/platforms/youtube/init\n */\n async initialize(): Promise<{ message: string; jobId?: string }> {\n return this.client.post<{ message: string; jobId?: string }>('/v1/platforms/youtube/init');\n }\n\n /**\n * Get YouTube videos\n * GET /v1/platforms/youtube/videos\n */\n async getVideos(params?: YouTube.GetVideosParams): Promise<YouTube.GetVideosResponse> {\n return this.client.get<YouTube.GetVideosResponse>(\n '/v1/platforms/youtube/videos', \n params as Record<string, string | number | boolean | undefined>\n );\n }\n\n /**\n * Get specific video by ID\n * GET /v1/platforms/youtube/videos/:videoId\n */\n async getVideo(videoId: string): Promise<YouTube.Video> {\n return this.client.get<YouTube.Video>(`/v1/platforms/youtube/videos/${videoId}`);\n }\n\n /**\n * Get channel metrics\n * GET /v1/platforms/youtube/channel/metrics\n */\n async getChannelMetrics(): Promise<YouTube.ChannelMetrics> {\n return this.client.get<YouTube.ChannelMetrics>('/v1/platforms/youtube/channel/metrics');\n }\n\n /**\n * Get channel health score\n * GET /v1/platforms/youtube/health\n */\n async getHealthScore(params?: YouTube.GetHealthScoreParams): Promise<YouTube.HealthScore> {\n return this.client.get<YouTube.HealthScore>(\n '/v1/platforms/youtube/health', \n params as Record<string, string | number | boolean | undefined>\n );\n }\n\n /**\n * Refresh YouTube data\n * POST /v1/platforms/youtube/refresh\n */\n async refresh(): Promise<{ message: string; jobId?: string }> {\n return this.client.post<{ message: string; jobId?: string }>('/v1/platforms/youtube/refresh');\n }\n}\n","/**\n * TrndUp SDK - Instagram Module\n * \n * Instagram analytics and data methods\n */\n\nimport type { TrndUpClient } from '../client';\nimport type { Instagram } from '../types';\n\nexport class InstagramModule {\n constructor(private client: TrndUpClient) {}\n\n /**\n * Get Instagram initialization status\n * GET /v1/platforms/instagram/init/status\n */\n async getInitStatus(): Promise<Instagram.InitStatusResponse> {\n return this.client.get<Instagram.InitStatusResponse>('/v1/platforms/instagram/init/status');\n }\n\n /**\n * Initialize Instagram data sync\n * POST /v1/platforms/instagram/init\n */\n async initialize(): Promise<{ message: string }> {\n return this.client.post<{ message: string }>('/v1/platforms/instagram/init');\n }\n\n /**\n * Get Instagram posts\n * GET /v1/platforms/instagram/posts\n */\n async getPosts(params?: Instagram.GetPostsParams): Promise<Instagram.GetPostsResponse> {\n return this.client.get<Instagram.GetPostsResponse>(\n '/v1/platforms/instagram/posts', \n params as Record<string, string | number | boolean | undefined>\n );\n }\n\n /**\n * Get specific post by ID\n * GET /v1/platforms/instagram/posts/:postId\n */\n async getPost(postId: string): Promise<Instagram.Post> {\n return this.client.get<Instagram.Post>(`/v1/platforms/instagram/posts/${postId}`);\n }\n\n /**\n * Get account metrics\n * GET /v1/platforms/instagram/account/metrics\n */\n async getAccountMetrics(): Promise<Instagram.AccountMetrics> {\n return this.client.get<Instagram.AccountMetrics>('/v1/platforms/instagram/account/metrics');\n }\n\n /**\n * Refresh Instagram data\n * POST /v1/platforms/instagram/refresh\n */\n async refresh(): Promise<{ message: string }> {\n return this.client.post<{ message: string }>('/v1/platforms/instagram/refresh');\n }\n}\n","/**\n * TrndUp SDK - Social Module\n * \n * Social account linking methods\n */\n\nimport type { TrndUpClient } from '../client';\nimport type { Social } from '../types';\n\nexport class SocialModule {\n constructor(private client: TrndUpClient) {}\n\n /**\n * Link YouTube account\n * POST /social/link/youtube\n */\n async linkYouTube(data: Social.LinkYouTubeRequest): Promise<Social.LinkAccountResponse> {\n return this.client.post<Social.LinkAccountResponse>('/social/link/youtube', data);\n }\n\n /**\n * Link Instagram account\n * POST /social/link/instagram\n */\n async linkInstagram(data: Social.LinkInstagramRequest): Promise<Social.LinkAccountResponse> {\n return this.client.post<Social.LinkAccountResponse>('/social/link/instagram', data);\n }\n\n /**\n * Get all connected social accounts\n * GET /social/accounts\n */\n async getConnectedAccounts(): Promise<Social.ConnectedAccount[]> {\n return this.client.get<Social.ConnectedAccount[]>('/social/accounts');\n }\n\n /**\n * Unlink a social account\n * DELETE /social/unlink/:provider\n */\n async unlinkAccount(provider: string): Promise<{ message: string }> {\n return this.client.delete<{ message: string }>(`/social/unlink/${provider}`);\n }\n}\n","/**\n * TrndUp SDK - Insights Module\n * \n * Cross-platform insights and analytics\n */\n\nimport type { TrndUpClient } from '../client';\nimport type { Insights } from '../types';\n\nexport class InsightsModule {\n constructor(private client: TrndUpClient) {}\n\n /**\n * Get cross-platform metrics\n * GET /v1/insights/overview\n */\n async getOverview(): Promise<Insights.CrossPlatformMetrics> {\n return this.client.get<Insights.CrossPlatformMetrics>('/v1/insights/overview');\n }\n\n /**\n * Get trending content across all platforms\n * GET /v1/insights/trending\n */\n async getTrending(): Promise<Insights.TrendingContent> {\n return this.client.get<Insights.TrendingContent>('/v1/insights/trending');\n }\n}\n","/**\n * TrndUp API SDK\n * \n * Official TypeScript SDK for the TrndUp API.\n * Provides type-safe methods for all API endpoints with Firebase authentication.\n * \n * @example\n * ```typescript\n * import { TrndUpSDK } from '@trndup/sdk';\n * import auth from '@react-native-firebase/auth';\n * \n * const sdk = new TrndUpSDK({\n * baseUrl: 'https://api.trndup.app',\n * getToken: async () => {\n * const user = auth().currentUser;\n * return user ? await user.getIdToken() : null;\n * },\n * onAuthFailure: () => {\n * // Handle auth failure - navigate to login\n * navigation.navigate('Login');\n * },\n * });\n * \n * // Type-safe API calls\n * const user = await sdk.auth.getCurrentUser();\n * const videos = await sdk.youtube.getVideos({ limit: 10 });\n * const healthScore = await sdk.youtube.getHealthScore({ range: '30d' });\n * ```\n */\n\nimport { TrndUpClient, TrndUpClientConfig } from './client';\nimport { AuthModule } from './modules/auth';\nimport { YouTubeModule } from './modules/youtube';\nimport { InstagramModule } from './modules/instagram';\nimport { SocialModule } from './modules/social';\nimport { InsightsModule } from './modules/insights';\n\nexport class TrndUpSDK extends TrndUpClient {\n public auth: AuthModule;\n public youtube: YouTubeModule;\n public instagram: InstagramModule;\n public social: SocialModule;\n public insights: InsightsModule;\n\n constructor(config: TrndUpClientConfig) {\n super(config);\n\n // Initialize all modules\n this.auth = new AuthModule(this);\n this.youtube = new YouTubeModule(this);\n this.instagram = new InstagramModule(this);\n this.social = new SocialModule(this);\n this.insights = new InsightsModule(this);\n }\n}\n\n// Re-export types and classes\nexport type { TrndUpClientConfig, RequestOptions } from './client';\nexport { TrndUpApiError, TrndUpNetworkError } from './client';\n\n// Re-export all type namespaces\nexport type { Auth, Social, YouTube, Instagram, Insights } from './types';\n\n// Version\nexport const SDK_VERSION = '1.0.0';\n"]}