@bycrawl/nodejs-sdk 0.1.1 → 0.2.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.cjs CHANGED
@@ -475,8 +475,15 @@ var Facebook = class extends APIResource {
475
475
  castTo: (r) => r
476
476
  });
477
477
  }
478
- async getUserPosts(username) {
479
- return this._request("GET", `/facebook/users/${username}/posts`);
478
+ async getUserPosts(username, options) {
479
+ return this._request("GET", `/facebook/users/${username}/posts`, {
480
+ params: { count: options?.count }
481
+ });
482
+ }
483
+ async getPagePosts(pageId, options) {
484
+ return this._request("GET", `/facebook/pages/${pageId}/posts`, {
485
+ params: { count: options?.count }
486
+ });
480
487
  }
481
488
  async getPost(options) {
482
489
  return this._get(`/facebook/posts`, {
@@ -486,25 +493,25 @@ var Facebook = class extends APIResource {
486
493
  }
487
494
  async getPostComments(options) {
488
495
  return this._get(`/facebook/posts/comments`, {
489
- params: { url: options.url, cursor: options.cursor }
496
+ params: { url: options.url }
490
497
  });
491
498
  }
492
499
  async searchPosts(q, options) {
493
500
  return this._get(`/facebook/posts/search`, {
494
- params: { q, count: options?.count, cursor: options?.cursor }
501
+ params: { q, count: options?.count }
495
502
  });
496
503
  }
497
- async marketplaceBrowse(location, options) {
504
+ async browseMarketplace(options) {
498
505
  return this._get(`/facebook/marketplace/listings`, {
499
- params: { location, category: options?.category }
506
+ params: { location: options?.location, category: options?.category }
500
507
  });
501
508
  }
502
- async marketplaceSearch(q, options) {
509
+ async searchMarketplace(q, options) {
503
510
  return this._get(`/facebook/marketplace/search`, {
504
- params: { q, location: options?.location }
511
+ params: { q, location: options?.location, category: options?.category }
505
512
  });
506
513
  }
507
- async marketplaceItem(listingId) {
514
+ async getMarketplaceItem(listingId) {
508
515
  return this._get(`/facebook/marketplace/items/${listingId}`);
509
516
  }
510
517
  // -- Auto-pagination iterators --
@@ -629,10 +636,10 @@ var LinkedIn = class extends APIResource {
629
636
  params: { count: options?.count, offset: options?.offset }
630
637
  });
631
638
  }
632
- async searchJobs(query, options) {
639
+ async searchJobs(q, options) {
633
640
  return this._getList(`/linkedin/jobs/search`, {
634
641
  params: {
635
- q: query,
642
+ q,
636
643
  location: options?.location,
637
644
  count: options?.count,
638
645
  offset: options?.offset
@@ -651,9 +658,9 @@ var LinkedIn = class extends APIResource {
651
658
  castTo: (r) => r
652
659
  });
653
660
  }
654
- async searchUsers(query, options) {
661
+ async searchUsers(q, options) {
655
662
  return this._getList(`/linkedin/users/search`, {
656
- params: { q: query, count: options?.count, offset: options?.offset },
663
+ params: { q, count: options?.count, offset: options?.offset },
657
664
  itemsKey: "users",
658
665
  castTo: (r) => r
659
666
  });
@@ -672,16 +679,38 @@ var LinkedIn = class extends APIResource {
672
679
  castTo: (r) => r
673
680
  });
674
681
  }
675
- iterSearchJobs(query, options) {
682
+ iterSearchJobs(q, options) {
676
683
  const count = options?.count ?? 10;
677
684
  return this._paginateByOffset(`/linkedin/jobs/search`, {
678
- params: { q: query, location: options?.location, count, limit: count },
685
+ params: { q, location: options?.location, count, limit: count },
679
686
  itemsKey: "jobs",
680
687
  castTo: (r) => r
681
688
  });
682
689
  }
683
690
  };
684
691
 
692
+ // src/platforms/ptt.ts
693
+ var PTT = class extends APIResource {
694
+ async getBoard(boardName) {
695
+ return this._get(`/ptt/boards/${boardName}`);
696
+ }
697
+ async getBoardPosts(boardName, options) {
698
+ return this._get(`/ptt/boards/${boardName}/posts`, {
699
+ params: { page: options?.page, count: options?.count }
700
+ });
701
+ }
702
+ async getPost(url) {
703
+ return this._get(`/ptt/posts`, {
704
+ params: { url }
705
+ });
706
+ }
707
+ async searchPosts(boardName, q, options) {
708
+ return this._get(`/ptt/boards/${boardName}/search`, {
709
+ params: { q, count: options?.count }
710
+ });
711
+ }
712
+ };
713
+
685
714
  // src/platforms/reddit.ts
686
715
  var Reddit = class extends APIResource {
687
716
  async getSubreddit(name) {
@@ -691,7 +720,12 @@ var Reddit = class extends APIResource {
691
720
  }
692
721
  async getSubredditPosts(name, options) {
693
722
  return this._getList(`/reddit/subreddits/${name}/posts`, {
694
- params: { sort: options?.sort, t: options?.t, count: options?.count },
723
+ params: {
724
+ sort: options?.sort,
725
+ t: options?.t,
726
+ count: options?.count,
727
+ after: options?.after
728
+ },
695
729
  itemsKey: "posts",
696
730
  castTo: (r) => r
697
731
  });
@@ -703,7 +737,13 @@ var Reddit = class extends APIResource {
703
737
  }
704
738
  async searchPosts(q, options) {
705
739
  return this._getList(`/reddit/posts/search`, {
706
- params: { q, sort: options?.sort, count: options?.count },
740
+ params: {
741
+ q,
742
+ sort: options?.sort,
743
+ t: options?.t,
744
+ count: options?.count,
745
+ after: options?.after
746
+ },
707
747
  itemsKey: "posts",
708
748
  castTo: (r) => r
709
749
  });
@@ -725,17 +765,35 @@ var Reddit = class extends APIResource {
725
765
  }
726
766
  };
727
767
 
768
+ // src/platforms/rent591.ts
769
+ var Rent591 = class extends APIResource {
770
+ async getListings(options) {
771
+ return this._get(`/rent591/listings`, {
772
+ params: {
773
+ region: options?.region,
774
+ first_row: options?.first_row,
775
+ kind: options?.kind,
776
+ section: options?.section,
777
+ price: options?.price,
778
+ count: options?.count
779
+ }
780
+ });
781
+ }
782
+ async getListing(listingId) {
783
+ return this._get(`/rent591/listings/${listingId}`);
784
+ }
785
+ };
786
+
728
787
  // src/platforms/threads.ts
729
788
  var Threads = class extends APIResource {
730
- async getPost(postId, options) {
789
+ async getPost(postId) {
731
790
  return this._get(`/threads/posts/${postId}`, {
732
- params: { mode: options?.mode },
733
791
  castTo: (r) => r
734
792
  });
735
793
  }
736
- async getPosts(ids, options) {
794
+ async getPosts(ids) {
737
795
  const resp = await this._request("GET", `/threads/posts`, {
738
- params: { ids: ids.join(","), mode: options?.mode }
796
+ params: { ids: ids.join(",") }
739
797
  });
740
798
  return resp;
741
799
  }
@@ -851,13 +909,15 @@ var TikTok = class extends APIResource {
851
909
  params: { category: options?.category, count: options?.count }
852
910
  });
853
911
  }
854
- async search(keyword, options) {
912
+ async search(q, options) {
855
913
  return this._get(`/tiktok/videos/search`, {
856
- params: { q: keyword, count: options?.count }
914
+ params: { q, count: options?.count }
857
915
  });
858
916
  }
859
- async getVideoSubtitles(videoId) {
860
- return this._get(`/tiktok/videos/${videoId}/subtitles`);
917
+ async getVideoSubtitles(videoId, options) {
918
+ return this._get(`/tiktok/videos/${videoId}/subtitles`, {
919
+ params: { language: options?.language }
920
+ });
861
921
  }
862
922
  // -- Auto-pagination iterators --
863
923
  iterVideoComments(videoId) {
@@ -869,6 +929,38 @@ var TikTok = class extends APIResource {
869
929
  }
870
930
  };
871
931
 
932
+ // src/platforms/trustpilot.ts
933
+ var Trustpilot = class extends APIResource {
934
+ async getBusiness(domain) {
935
+ return this._get(`/trustpilot/businesses/${domain}`);
936
+ }
937
+ async getBusinessReviews(domain, options) {
938
+ return this._get(`/trustpilot/businesses/${domain}/reviews`, {
939
+ params: {
940
+ page: options?.page,
941
+ sort: options?.sort,
942
+ stars: options?.stars,
943
+ languages: options?.languages
944
+ }
945
+ });
946
+ }
947
+ async searchBusinesses(q, options) {
948
+ return this._get(`/trustpilot/businesses/search`, {
949
+ params: { q, page: options?.page }
950
+ });
951
+ }
952
+ async searchCategories(q) {
953
+ return this._get(`/trustpilot/categories/search`, {
954
+ params: { q }
955
+ });
956
+ }
957
+ async getSuggestions(q) {
958
+ return this._get(`/trustpilot/suggestions`, {
959
+ params: { q }
960
+ });
961
+ }
962
+ };
963
+
872
964
  // src/platforms/webfetch.ts
873
965
  var WebFetch = class extends APIResource {
874
966
  async fetch(url, options) {
@@ -981,6 +1073,9 @@ var ByCrawl = class {
981
1073
  dcard;
982
1074
  gmaps;
983
1075
  job104;
1076
+ trustpilot;
1077
+ ptt;
1078
+ rent591;
984
1079
  web;
985
1080
  _transport;
986
1081
  constructor(options) {
@@ -1007,6 +1102,9 @@ var ByCrawl = class {
1007
1102
  this.dcard = new Dcard(this._transport);
1008
1103
  this.gmaps = new GMaps(this._transport);
1009
1104
  this.job104 = new Job104(this._transport);
1105
+ this.trustpilot = new Trustpilot(this._transport);
1106
+ this.ptt = new PTT(this._transport);
1107
+ this.rent591 = new Rent591(this._transport);
1010
1108
  this.web = new WebFetch(this._transport);
1011
1109
  }
1012
1110
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/exceptions.ts","../src/http.ts","../src/resource.ts","../src/platforms/dcard.ts","../src/platforms/facebook.ts","../src/platforms/gmaps.ts","../src/platforms/instagram.ts","../src/platforms/job104.ts","../src/platforms/linkedin.ts","../src/platforms/reddit.ts","../src/platforms/threads.ts","../src/platforms/tiktok.ts","../src/platforms/webfetch.ts","../src/platforms/x.ts","../src/platforms/youtube.ts","../src/client.ts"],"sourcesContent":["/**\n * ByCrawl Node.js SDK\n *\n * @example\n * ```ts\n * import { ByCrawl } from \"bycrawl\";\n *\n * const client = new ByCrawl({ apiKey: \"sk_byc_...\" });\n * const post = await client.threads.getPost(\"DQt-ox3kdE4\");\n * console.log(post.data);\n * ```\n */\n\nexport { ByCrawl } from \"./client.js\";\nexport type { ByCrawlOptions } from \"./client.js\";\n\nexport { SDK_VERSION } from \"./http.js\";\n\nexport {\n APIError,\n AuthenticationError,\n ByCrawlError,\n ConnectionError,\n NotFoundError,\n PermissionError,\n RateLimitError,\n ServerError,\n TimeoutError,\n} from \"./exceptions.js\";\n\nexport type {\n APIResponse,\n BulkJob,\n BulkJobStatus,\n CreditInfo,\n DcardForum,\n DcardPersona,\n DcardPost,\n FacebookPost,\n FacebookUser,\n GMapsPlace,\n InstagramTag,\n InstagramUser,\n Job104Company,\n Job104Job,\n LinkedInCompany,\n LinkedInJob,\n LinkedInPost,\n LinkedInUser,\n PaginatedData,\n RateLimit,\n RedditPost,\n RedditUser,\n Subreddit,\n ThreadsMedia,\n ThreadsPost,\n ThreadsPostStats,\n ThreadsUser,\n TikTokCategory,\n TikTokComment,\n TikTokUser,\n TikTokVideo,\n XPost,\n XUser,\n YouTubeChannel,\n YouTubeComment,\n YouTubeVideo,\n} from \"./types.js\";\n","/**\n * ByCrawl Exception Hierarchy\n *\n * All SDK exceptions inherit from ByCrawlError.\n * HTTP errors are mapped to specific subclasses by status code.\n */\n\nexport class ByCrawlError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ByCrawlError\";\n }\n}\n\nexport class APIError extends ByCrawlError {\n readonly statusCode: number;\n readonly body: Record<string, unknown> | null;\n\n constructor(\n message: string,\n options: { statusCode: number; body?: Record<string, unknown> | null },\n ) {\n super(message);\n this.name = \"APIError\";\n this.statusCode = options.statusCode;\n this.body = options.body ?? null;\n }\n}\n\nexport class AuthenticationError extends APIError {\n constructor(\n message = \"Invalid or missing API key\",\n body?: Record<string, unknown> | null,\n ) {\n super(message, { statusCode: 401, body });\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class PermissionError extends APIError {\n constructor(\n message = \"Insufficient scope\",\n body?: Record<string, unknown> | null,\n ) {\n super(message, { statusCode: 403, body });\n this.name = \"PermissionError\";\n }\n}\n\nexport class NotFoundError extends APIError {\n constructor(\n message = \"Resource not found\",\n body?: Record<string, unknown> | null,\n ) {\n super(message, { statusCode: 404, body });\n this.name = \"NotFoundError\";\n }\n}\n\nexport class RateLimitError extends APIError {\n readonly retryAfter: number | null;\n\n constructor(\n message = \"Rate limit exceeded\",\n options?: { retryAfter?: number | null; body?: Record<string, unknown> | null },\n ) {\n super(message, { statusCode: 429, body: options?.body });\n this.name = \"RateLimitError\";\n this.retryAfter = options?.retryAfter ?? null;\n }\n}\n\nexport class ServerError extends APIError {\n constructor(\n message: string,\n options: { statusCode: number; body?: Record<string, unknown> | null },\n ) {\n super(message, options);\n this.name = \"ServerError\";\n }\n}\n\nexport class TimeoutError extends ByCrawlError {\n constructor(message = \"Request timed out\") {\n super(message);\n this.name = \"TimeoutError\";\n }\n}\n\nexport class ConnectionError extends ByCrawlError {\n constructor(message = \"Network connection error\") {\n super(message);\n this.name = \"ConnectionError\";\n }\n}\n","/**\n * HTTP Transport Layer\n *\n * Wraps native fetch with:\n * - API key authentication (x-api-key header)\n * - Automatic retry with exponential backoff + jitter\n * - Consistent error mapping to ByCrawl exceptions\n * - ResponseWrapper with headers for rate limit / credit parsing\n */\n\nimport {\n APIError,\n AuthenticationError,\n ByCrawlError,\n ConnectionError,\n NotFoundError,\n PermissionError,\n RateLimitError,\n ServerError,\n TimeoutError,\n} from \"./exceptions.js\";\n\nexport const DEFAULT_BASE_URL = \"https://api.bycrawl.com\";\nexport const DEFAULT_TIMEOUT = 60_000;\nexport const DEFAULT_MAX_RETRIES = 2;\nexport const SDK_VERSION = \"0.1.1\";\n\nconst RETRYABLE_STATUS_CODES = new Set([429, 500, 502, 503, 504]);\n\nfunction userAgent(): string {\n return `bycrawl-node/${SDK_VERSION}`;\n}\n\nfunction makeHeaders(apiKey: string): Record<string, string> {\n return {\n \"x-api-key\": apiKey,\n \"User-Agent\": userAgent(),\n Accept: \"application/json\",\n };\n}\n\nfunction backoffDelay(attempt: number, base = 0.5, maxDelay = 8.0): number {\n const delay = Math.min(base * 2 ** attempt, maxDelay);\n return Math.random() * delay;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface ResponseWrapper {\n statusCode: number;\n data: Record<string, unknown>;\n headers: Record<string, string>;\n}\n\nfunction raiseForStatus(\n status: number,\n body: Record<string, unknown> | null,\n headers: Headers,\n): void {\n if (status >= 200 && status < 300) return;\n\n const message =\n (body?.error as string) ?? `HTTP ${status}`;\n\n if (status === 401) {\n throw new AuthenticationError(message, body);\n }\n if (status === 403) {\n throw new PermissionError(message, body);\n }\n if (status === 404) {\n throw new NotFoundError(message, body);\n }\n if (status === 429) {\n const retryAfter = headers.get(\"retry-after\");\n throw new RateLimitError(message, {\n retryAfter: retryAfter ? parseFloat(retryAfter) : null,\n body,\n });\n }\n if (status >= 500) {\n throw new ServerError(message, { statusCode: status, body });\n }\n\n throw new APIError(message, { statusCode: status, body });\n}\n\nfunction headersToRecord(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n maxRetries?: number;\n}\n\nexport class Transport {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly defaultHeaders: Record<string, string>;\n\n constructor(options: TransportOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.defaultHeaders = makeHeaders(this.apiKey);\n }\n\n async request(\n method: string,\n path: string,\n options?: {\n params?: Record<string, unknown>;\n json?: Record<string, unknown>;\n headers?: Record<string, string>;\n },\n ): Promise<ResponseWrapper> {\n const url = new URL(path, this.baseUrl);\n\n if (options?.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value != null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const requestHeaders: Record<string, string> = {\n ...this.defaultHeaders,\n ...options?.headers,\n };\n\n if (options?.json) {\n requestHeaders[\"Content-Type\"] = \"application/json\";\n }\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.timeout,\n );\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method,\n headers: requestHeaders,\n body: options?.json ? JSON.stringify(options.json) : undefined,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (\n RETRYABLE_STATUS_CODES.has(response.status) &&\n attempt < this.maxRetries\n ) {\n let delay = backoffDelay(attempt);\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n if (retryAfter) {\n delay = Math.max(delay, parseFloat(retryAfter) * 1000);\n }\n }\n await sleep(delay);\n continue;\n }\n\n let body: Record<string, unknown> | null = null;\n try {\n body = (await response.json()) as Record<string, unknown>;\n } catch {\n if (!response.ok) {\n throw new APIError(\"Invalid JSON response\", { statusCode: 502 });\n }\n }\n\n raiseForStatus(response.status, body, response.headers);\n\n return {\n statusCode: response.status,\n data: body ?? {},\n headers: headersToRecord(response.headers),\n };\n } catch (error) {\n if (\n error instanceof AuthenticationError ||\n error instanceof PermissionError ||\n error instanceof NotFoundError ||\n error instanceof RateLimitError ||\n error instanceof ServerError ||\n error instanceof APIError\n ) {\n throw error;\n }\n\n if (error instanceof DOMException && error.name === \"AbortError\") {\n lastError = error;\n if (attempt < this.maxRetries) {\n const delay = backoffDelay(attempt);\n await sleep(delay);\n continue;\n }\n throw new TimeoutError(String(error));\n }\n\n if (error instanceof TypeError && error.message.includes(\"fetch\")) {\n lastError = error;\n if (attempt < this.maxRetries) {\n const delay = backoffDelay(attempt);\n await sleep(delay);\n continue;\n }\n throw new ConnectionError(String(error));\n }\n\n if (error instanceof ByCrawlError) {\n throw error;\n }\n\n throw new ByCrawlError(`Unexpected error: ${error}`);\n }\n }\n\n if (lastError) {\n throw new ConnectionError(String(lastError));\n }\n throw new ConnectionError(\"Request failed after retries\");\n }\n}\n","/**\n * APIResource Base Class\n *\n * All platform namespaces inherit from APIResource.\n * Handles HTTP call delegation, response wrapping, header parsing, and pagination.\n */\n\nimport { ByCrawlError } from \"./exceptions.js\";\nimport type { ResponseWrapper, Transport } from \"./http.js\";\nimport type { APIResponse, CreditInfo, RateLimit } from \"./types.js\";\n\nfunction parseRateLimit(headers: Record<string, string>): RateLimit | null {\n const limit = headers[\"x-ratelimit-limit\"];\n const remaining = headers[\"x-ratelimit-remaining\"];\n const reset = headers[\"x-ratelimit-reset\"];\n if (limit == null && remaining == null && reset == null) return null;\n return {\n limit: limit ? parseInt(limit, 10) : null,\n remaining: remaining ? parseInt(remaining, 10) : null,\n reset: reset ? parseFloat(reset) : null,\n };\n}\n\nfunction parseCredit(headers: Record<string, string>): CreditInfo | null {\n const remaining = headers[\"x-credit-remaining\"];\n const used = headers[\"x-credit-used\"];\n if (remaining == null && used == null) return null;\n return {\n remaining: remaining ? parseInt(remaining, 10) : null,\n used: used ? parseInt(used, 10) : null,\n };\n}\n\nfunction wrapResponse<T>(\n wrapper: ResponseWrapper,\n castTo?: (raw: Record<string, unknown>) => T,\n): APIResponse<T> {\n const data = wrapper.data;\n let bodyData: unknown;\n let success: boolean;\n let error: string | null;\n let queued: boolean;\n\n if (typeof data === \"object\" && data !== null && \"data\" in data) {\n bodyData = data.data;\n success = (data.success as boolean) ?? true;\n error = (data.error as string) ?? null;\n queued = (data.queued as boolean) ?? false;\n } else if (typeof data === \"object\" && data !== null && \"error\" in data) {\n bodyData = null;\n success = false;\n error = (data.error as string) ?? null;\n queued = false;\n } else {\n bodyData = data;\n success = true;\n error = null;\n queued = false;\n }\n\n let parsed: T | null = bodyData as T | null;\n if (castTo && bodyData != null) {\n if (Array.isArray(bodyData)) {\n parsed = bodyData.map((item) =>\n castTo(item as Record<string, unknown>),\n ) as T;\n } else if (typeof bodyData === \"object\") {\n parsed = castTo(bodyData as Record<string, unknown>);\n }\n }\n\n return {\n success,\n data: parsed,\n error,\n queued,\n rateLimit: parseRateLimit(wrapper.headers),\n credit: parseCredit(wrapper.headers),\n };\n}\n\nexport class APIResource {\n protected readonly _transport: Transport;\n\n constructor(transport: Transport) {\n this._transport = transport;\n }\n\n protected async _get<T>(\n path: string,\n options?: {\n params?: Record<string, unknown>;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T>> {\n return this._request(\"GET\", path, { params: options?.params, castTo: options?.castTo });\n }\n\n protected async _post<T>(\n path: string,\n options?: {\n body?: Record<string, unknown>;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T>> {\n return this._request(\"POST\", path, { body: options?.body, castTo: options?.castTo });\n }\n\n protected async _getList<T>(\n path: string,\n options: {\n params?: Record<string, unknown>;\n itemsKey: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T[]>> {\n const resp = await this._get<Record<string, unknown>>(path, {\n params: options.params,\n });\n const raw = resp.data;\n let items: T[];\n\n if (raw && typeof raw === \"object\" && !Array.isArray(raw) && options.itemsKey in raw) {\n const arr = (raw as Record<string, unknown>)[options.itemsKey];\n if (Array.isArray(arr)) {\n items = options.castTo\n ? arr.map((item) => options.castTo!(item as Record<string, unknown>))\n : (arr as T[]);\n } else {\n items = [];\n }\n } else if (Array.isArray(raw)) {\n items = options.castTo\n ? raw.map((item) => options.castTo!(item as Record<string, unknown>))\n : (raw as T[]);\n } else {\n items = [];\n }\n\n return {\n ...resp,\n data: items,\n } as APIResponse<T[]>;\n }\n\n protected async _request<T>(\n method: string,\n path: string,\n options?: {\n params?: Record<string, unknown>;\n body?: Record<string, unknown>;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T>> {\n const wrapper = await this._transport.request(method, path, {\n params: options?.params,\n json: options?.body,\n });\n return wrapResponse<T>(wrapper, options?.castTo);\n }\n\n protected async *_paginate<T>(\n path: string,\n options: {\n params: Record<string, unknown>;\n itemsKey?: string;\n cursorKey?: string;\n hasMoreKey?: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): AsyncGenerator<T> {\n const itemsKey = options.itemsKey ?? \"items\";\n const cursorKey = options.cursorKey ?? \"cursor\";\n const hasMoreKey = options.hasMoreKey ?? \"hasMore\";\n let params = { ...options.params };\n\n while (true) {\n const wrapper = await this._transport.request(\"GET\", path, { params });\n const responseData = wrapper.data;\n const data =\n typeof responseData === \"object\" &&\n responseData !== null &&\n \"data\" in responseData\n ? (responseData.data as Record<string, unknown>)\n : (responseData as Record<string, unknown>);\n\n const items = (data[itemsKey] as unknown[]) ?? [];\n for (const item of items) {\n if (options.castTo) {\n yield options.castTo(item as Record<string, unknown>);\n } else {\n yield item as T;\n }\n }\n\n if (!data[hasMoreKey]) break;\n const nextCursor =\n (data[cursorKey] as string) ?? (data[\"next_cursor\"] as string);\n if (!nextCursor) break;\n params = { ...params, [cursorKey]: nextCursor };\n }\n }\n\n protected async *_paginateByPage<T>(\n path: string,\n options: {\n params: Record<string, unknown>;\n itemsKey?: string;\n pageKey?: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): AsyncGenerator<T> {\n const itemsKey = options.itemsKey ?? \"items\";\n const pageKey = options.pageKey ?? \"page\";\n let page = (options.params[pageKey] as number) ?? 1;\n\n while (true) {\n const params = { ...options.params, [pageKey]: page };\n const wrapper = await this._transport.request(\"GET\", path, { params });\n const responseData = wrapper.data;\n const data =\n typeof responseData === \"object\" &&\n responseData !== null &&\n \"data\" in responseData\n ? (responseData.data as Record<string, unknown>)\n : (responseData as Record<string, unknown>);\n\n const items = (data[itemsKey] as unknown[]) ?? [];\n if (items.length === 0) break;\n\n for (const item of items) {\n if (options.castTo) {\n yield options.castTo(item as Record<string, unknown>);\n } else {\n yield item as T;\n }\n }\n\n const hasMore = data[\"hasMore\"] as boolean | undefined;\n if (hasMore === false) break;\n const limit = (params[\"limit\"] as number) ?? 20;\n if (items.length < limit) break;\n page += 1;\n }\n }\n\n protected async *_paginateByOffset<T>(\n path: string,\n options: {\n params: Record<string, unknown>;\n itemsKey?: string;\n countKey?: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): AsyncGenerator<T> {\n const itemsKey = options.itemsKey ?? \"items\";\n const countKey = options.countKey ?? \"count\";\n let offset = (options.params[\"offset\"] as number) ?? 0;\n const limit = (options.params[\"limit\"] as number) ?? 20;\n\n while (true) {\n const params = { ...options.params, offset, limit };\n const wrapper = await this._transport.request(\"GET\", path, { params });\n const responseData = wrapper.data;\n const data =\n typeof responseData === \"object\" &&\n responseData !== null &&\n \"data\" in responseData\n ? (responseData.data as Record<string, unknown>)\n : (responseData as Record<string, unknown>);\n\n const items = (data[itemsKey] as unknown[]) ?? [];\n if (items.length === 0) break;\n\n for (const item of items) {\n if (options.castTo) {\n yield options.castTo(item as Record<string, unknown>);\n } else {\n yield item as T;\n }\n }\n\n const total = data[countKey] as number | undefined;\n offset += items.length;\n if (total != null && offset >= total) break;\n if (items.length < limit) break;\n }\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, DcardForum, DcardPersona, DcardPost } from \"../types.js\";\n\nexport class Dcard extends APIResource {\n async getForum(alias: string): Promise<APIResponse<DcardForum>> {\n return this._get(`/dcard/forums/${alias}`, {\n castTo: (r) => r as DcardForum,\n });\n }\n\n async getForumPosts(\n alias: string,\n options?: { count?: number; popular?: boolean },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/dcard/forums/${alias}/posts`, {\n params: { count: options?.count, popular: options?.popular },\n });\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number; offset?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/dcard/posts/search`, {\n params: { q, count: options?.count, offset: options?.offset },\n });\n }\n\n async getPersona(username: string): Promise<APIResponse<DcardPersona>> {\n return this._get(`/dcard/personas/${username}`, {\n castTo: (r) => r as DcardPersona,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterSearchPosts(\n q: string,\n options?: { count?: number },\n ): AsyncGenerator<DcardPost> {\n return this._paginateByOffset(`/dcard/posts/search`, {\n params: { q, count: options?.count ?? 30 },\n itemsKey: \"posts\",\n castTo: (r) => r as DcardPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, FacebookPost, FacebookUser } from \"../types.js\";\n\nexport class Facebook extends APIResource {\n async getUser(username: string): Promise<APIResponse<FacebookUser>> {\n return this._get(`/facebook/users/${username}`, {\n castTo: (r) => r as FacebookUser,\n });\n }\n\n async getUserPosts(\n username: string,\n ): Promise<APIResponse<FacebookPost[]>> {\n return this._request<FacebookPost[]>(\"GET\", `/facebook/users/${username}/posts`);\n }\n\n async getPost(options: { url: string }): Promise<APIResponse<FacebookPost>> {\n return this._get(`/facebook/posts`, {\n params: { url: options.url },\n castTo: (r) => r as FacebookPost,\n });\n }\n\n async getPostComments(options: {\n url: string;\n cursor?: string;\n }): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/posts/comments`, {\n params: { url: options.url, cursor: options.cursor },\n });\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number; cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/posts/search`, {\n params: { q, count: options?.count, cursor: options?.cursor },\n });\n }\n\n async marketplaceBrowse(\n location: string,\n options?: { category?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/marketplace/listings`, {\n params: { location, category: options?.category },\n });\n }\n\n async marketplaceSearch(\n q: string,\n options?: { location?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/marketplace/search`, {\n params: { q, location: options?.location },\n });\n }\n\n async marketplaceItem(\n listingId: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/marketplace/items/${listingId}`);\n }\n\n // -- Auto-pagination iterators --\n\n iterPostComments(options: {\n url: string;\n }): AsyncGenerator<Record<string, unknown>> {\n return this._paginate(`/facebook/posts/comments`, {\n params: { url: options.url },\n itemsKey: \"comments\",\n });\n }\n\n iterSearchPosts(\n q: string,\n options?: { count?: number },\n ): AsyncGenerator<FacebookPost> {\n return this._paginate(`/facebook/posts/search`, {\n params: { q, count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as FacebookPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, GMapsPlace } from \"../types.js\";\n\nexport class GMaps extends APIResource {\n async search(\n q: string,\n options?: { language?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/gmaps/places/search`, {\n params: { q, language: options?.language },\n });\n }\n\n async getPlace(\n query: string,\n options?: { language?: string },\n ): Promise<APIResponse<GMapsPlace>> {\n return this._get(`/gmaps/places`, {\n params: { query, language: options?.language },\n castTo: (r) => r as GMapsPlace,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, InstagramUser } from \"../types.js\";\n\nexport class Instagram extends APIResource {\n async getUser(username: string): Promise<APIResponse<InstagramUser>> {\n return this._get(`/instagram/users/${username}`, {\n castTo: (r) => r as InstagramUser,\n });\n }\n\n async searchTags(\n q: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/tags/search`, { params: { q } });\n }\n\n async getPost(\n shortcode: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/posts/${shortcode}`);\n }\n\n async getPostComments(\n shortcode: string,\n options?: { cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/posts/${shortcode}/comments`, {\n params: { cursor: options?.cursor },\n });\n }\n\n async getUserPosts(\n username: string,\n options?: { cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/users/${username}/posts`, {\n params: { cursor: options?.cursor },\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterUserPosts(\n username: string,\n ): AsyncGenerator<Record<string, unknown>> {\n return this._paginate(`/instagram/users/${username}/posts`, {\n params: {},\n itemsKey: \"posts\",\n });\n }\n\n iterPostComments(\n shortcode: string,\n ): AsyncGenerator<Record<string, unknown>> {\n return this._paginate(`/instagram/posts/${shortcode}/comments`, {\n params: {},\n itemsKey: \"comments\",\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, Job104Company, Job104Job } from \"../types.js\";\n\nexport class Job104 extends APIResource {\n async searchJobs(options?: {\n q?: string;\n welfare?: string;\n area?: string;\n page?: number;\n count?: number;\n }): Promise<APIResponse<Job104Job[]>> {\n return this._getList(`/job104/jobs/search`, {\n params: {\n q: options?.q,\n welfare: options?.welfare,\n area: options?.area,\n page: options?.page,\n count: options?.count,\n },\n itemsKey: \"jobs\",\n castTo: (r) => r as Job104Job,\n });\n }\n\n async getCompany(companyId: string): Promise<APIResponse<Job104Company>> {\n return this._get(`/job104/companies/${companyId}`, {\n castTo: (r) => r as Job104Company,\n });\n }\n\n async getJob(jobId: string): Promise<APIResponse<Job104Job>> {\n return this._get(`/job104/jobs/${jobId}`, {\n castTo: (r) => r as Job104Job,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterSearchJobs(options?: {\n q?: string;\n welfare?: string;\n area?: string;\n count?: number;\n }): AsyncGenerator<Job104Job> {\n return this._paginateByPage(`/job104/jobs/search`, {\n params: {\n q: options?.q,\n welfare: options?.welfare,\n area: options?.area,\n count: options?.count ?? 20,\n },\n itemsKey: \"jobs\",\n pageKey: \"page\",\n castTo: (r) => r as Job104Job,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type {\n APIResponse,\n LinkedInCompany,\n LinkedInJob,\n LinkedInPost,\n LinkedInUser,\n} from \"../types.js\";\n\nexport class LinkedIn extends APIResource {\n async getCompany(\n companyId: string,\n ): Promise<APIResponse<LinkedInCompany>> {\n return this._get(`/linkedin/companies/${companyId}`, {\n castTo: (r) => r as LinkedInCompany,\n });\n }\n\n async getCompanyJobs(\n companyId: string,\n options?: { count?: number; offset?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/linkedin/companies/${companyId}/jobs`, {\n params: { count: options?.count, offset: options?.offset },\n });\n }\n\n async searchJobs(\n query: string,\n options?: { location?: string; count?: number; offset?: number },\n ): Promise<APIResponse<LinkedInJob[]>> {\n return this._getList(`/linkedin/jobs/search`, {\n params: {\n q: query,\n location: options?.location,\n count: options?.count,\n offset: options?.offset,\n },\n itemsKey: \"jobs\",\n castTo: (r) => r as LinkedInJob,\n });\n }\n\n async getJob(jobId: string): Promise<APIResponse<LinkedInJob>> {\n return this._get(`/linkedin/jobs/${jobId}`, {\n castTo: (r) => r as LinkedInJob,\n });\n }\n\n async getPost(postId: string): Promise<APIResponse<LinkedInPost>> {\n return this._get(`/linkedin/posts/${postId}`, {\n castTo: (r) => r as LinkedInPost,\n });\n }\n\n async searchUsers(\n query: string,\n options?: { count?: number; offset?: number },\n ): Promise<APIResponse<LinkedInUser[]>> {\n return this._getList(`/linkedin/users/search`, {\n params: { q: query, count: options?.count, offset: options?.offset },\n itemsKey: \"users\",\n castTo: (r) => r as LinkedInUser,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<LinkedInUser>> {\n return this._get(`/linkedin/users/${username}`, {\n castTo: (r) => r as LinkedInUser,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterCompanyJobs(\n companyId: string,\n options?: { count?: number },\n ): AsyncGenerator<LinkedInJob> {\n const count = options?.count ?? 10;\n return this._paginateByOffset(`/linkedin/companies/${companyId}/jobs`, {\n params: { count, limit: count },\n itemsKey: \"jobs\",\n castTo: (r) => r as LinkedInJob,\n });\n }\n\n iterSearchJobs(\n query: string,\n options?: { location?: string; count?: number },\n ): AsyncGenerator<LinkedInJob> {\n const count = options?.count ?? 10;\n return this._paginateByOffset(`/linkedin/jobs/search`, {\n params: { q: query, location: options?.location, count, limit: count },\n itemsKey: \"jobs\",\n castTo: (r) => r as LinkedInJob,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, RedditPost, RedditUser, Subreddit } from \"../types.js\";\n\nexport class Reddit extends APIResource {\n async getSubreddit(name: string): Promise<APIResponse<Subreddit>> {\n return this._get(`/reddit/subreddits/${name}`, {\n castTo: (r) => r as Subreddit,\n });\n }\n\n async getSubredditPosts(\n name: string,\n options?: { sort?: string; t?: string; count?: number },\n ): Promise<APIResponse<RedditPost[]>> {\n return this._getList(`/reddit/subreddits/${name}/posts`, {\n params: { sort: options?.sort, t: options?.t, count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as RedditPost,\n });\n }\n\n async getPost(postId: string): Promise<APIResponse<RedditPost>> {\n return this._get(`/reddit/posts/${postId}`, {\n castTo: (r) => r as RedditPost,\n });\n }\n\n async searchPosts(\n q: string,\n options?: { sort?: string; count?: number },\n ): Promise<APIResponse<RedditPost[]>> {\n return this._getList(`/reddit/posts/search`, {\n params: { q, sort: options?.sort, count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as RedditPost,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<RedditUser>> {\n return this._get(`/reddit/users/${username}`, {\n castTo: (r) => r as RedditUser,\n });\n }\n\n async getUserPosts(\n username: string,\n options?: {\n sort?: string;\n t?: string;\n count?: number;\n after?: string;\n },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/reddit/users/${username}/posts`, {\n params: {\n sort: options?.sort,\n t: options?.t,\n count: options?.count,\n after: options?.after,\n },\n });\n }\n}\n","import { ByCrawlError, TimeoutError } from \"../exceptions.js\";\nimport { APIResource } from \"../resource.js\";\nimport type { APIResponse, BulkJob, BulkJobStatus, ThreadsPost, ThreadsUser } from \"../types.js\";\n\nexport class Threads extends APIResource {\n async getPost(\n postId: string,\n options?: { mode?: string },\n ): Promise<APIResponse<ThreadsPost>> {\n return this._get(`/threads/posts/${postId}`, {\n params: { mode: options?.mode },\n castTo: (r) => r as ThreadsPost,\n });\n }\n\n async getPosts(\n ids: string[],\n options?: { mode?: string },\n ): Promise<APIResponse<ThreadsPost[]>> {\n const resp = await this._request<ThreadsPost[]>(\"GET\", `/threads/posts`, {\n params: { ids: ids.join(\",\"), mode: options?.mode },\n });\n return resp;\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<ThreadsPost[]>> {\n return this._getList(`/threads/posts/search`, {\n params: { q, count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as ThreadsPost,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<ThreadsUser>> {\n return this._get(`/threads/users/${username}`, {\n castTo: (r) => r as ThreadsUser,\n });\n }\n\n async getUserPosts(\n userId: string,\n options?: { cursor?: string; count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/threads/users/${userId}/posts`, {\n params: { cursor: options?.cursor, count: options?.count },\n });\n }\n\n async getUserReplies(\n userId: string,\n options?: { cursor?: string; count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/threads/users/${userId}/replies`, {\n params: { cursor: options?.cursor, count: options?.count },\n });\n }\n\n async searchUsers(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<ThreadsUser[]>> {\n return this._getList(`/threads/users/search`, {\n params: { q, count: options?.count },\n itemsKey: \"users\",\n castTo: (r) => r as ThreadsUser,\n });\n }\n\n async getPublicFeed(options?: {\n cursor?: string;\n count?: number;\n }): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/threads/feed/public`, {\n params: { cursor: options?.cursor, count: options?.count },\n });\n }\n\n // -- Bulk operations --\n\n async bulkSubmit(\n ids: string[],\n options?: { type?: string },\n ): Promise<APIResponse<BulkJob>> {\n return this._post(`/threads/bulk`, {\n body: { ids, type: options?.type ?? \"content\" },\n castTo: (r) => r as BulkJob,\n });\n }\n\n async bulkStatus(jobId: string): Promise<APIResponse<BulkJobStatus>> {\n return this._get(`/threads/bulk/${jobId}`, {\n castTo: (r) => r as BulkJobStatus,\n });\n }\n\n async bulkResults(jobId: string): Promise<APIResponse<ThreadsPost[]>> {\n return this._request<ThreadsPost[]>(\"GET\", `/threads/bulk/${jobId}/results`);\n }\n\n async bulkSubmitAndWait(\n ids: string[],\n options?: { pollInterval?: number; timeout?: number },\n ): Promise<APIResponse<ThreadsPost[]>> {\n const pollInterval = options?.pollInterval ?? 2000;\n const timeout = options?.timeout ?? 300_000;\n\n const submitResp = await this.bulkSubmit(ids);\n const jobId = submitResp.data!.jobId;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const statusResp = await this.bulkStatus(jobId);\n const status = statusResp.data!.status;\n if (status === \"completed\") {\n return this.bulkResults(jobId);\n }\n if (status === \"failed\") {\n throw new ByCrawlError(`Bulk job ${jobId} failed`);\n }\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new TimeoutError(`Bulk job ${jobId} timed out after ${timeout}ms`);\n }\n\n // -- Auto-pagination iterators --\n\n iterUserPosts(\n userId: string,\n options?: { count?: number },\n ): AsyncGenerator<ThreadsPost> {\n return this._paginate(`/threads/users/${userId}/posts`, {\n params: { count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as ThreadsPost,\n });\n }\n\n iterUserReplies(\n userId: string,\n options?: { count?: number },\n ): AsyncGenerator<ThreadsPost> {\n return this._paginate(`/threads/users/${userId}/replies`, {\n params: { count: options?.count },\n itemsKey: \"replies\",\n castTo: (r) => r as ThreadsPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, TikTokComment, TikTokUser, TikTokVideo } from \"../types.js\";\n\nexport class TikTok extends APIResource {\n async getVideo(videoId: string): Promise<APIResponse<TikTokVideo>> {\n return this._get(`/tiktok/videos/${videoId}`, {\n castTo: (r) => r as TikTokVideo,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<TikTokUser>> {\n return this._get(`/tiktok/users/${username}`, {\n castTo: (r) => r as TikTokUser,\n });\n }\n\n async getUserVideos(\n username: string,\n options?: { count?: number },\n ): Promise<APIResponse<TikTokVideo[]>> {\n return this._request<TikTokVideo[]>(\"GET\", `/tiktok/users/${username}/videos`, {\n params: { count: options?.count },\n });\n }\n\n async getVideoComments(\n videoId: string,\n options?: { cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/videos/${videoId}/comments`, {\n params: { cursor: options?.cursor },\n });\n }\n\n async getCategories(options?: {\n category?: string;\n count?: number;\n }): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/categories`, {\n params: { category: options?.category, count: options?.count },\n });\n }\n\n async search(\n keyword: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/videos/search`, {\n params: { q: keyword, count: options?.count },\n });\n }\n\n async getVideoSubtitles(\n videoId: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/videos/${videoId}/subtitles`);\n }\n\n // -- Auto-pagination iterators --\n\n iterVideoComments(videoId: string): AsyncGenerator<TikTokComment> {\n return this._paginate(`/tiktok/videos/${videoId}/comments`, {\n params: {},\n itemsKey: \"comments\",\n castTo: (r) => r as TikTokComment,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse } from \"../types.js\";\n\nexport class WebFetch extends APIResource {\n async fetch(\n url: string,\n options?: { format?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/web/fetch`, {\n params: { url, format: options?.format },\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, XPost, XUser } from \"../types.js\";\n\nexport class X extends APIResource {\n async getUser(username: string): Promise<APIResponse<XUser>> {\n return this._get(`/x/users/${username}`, {\n castTo: (r) => r as XUser,\n });\n }\n\n async getUserPosts(\n username: string,\n options?: { count?: number; cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/x/users/${username}/posts`, {\n params: { count: options?.count, cursor: options?.cursor },\n });\n }\n\n async getPost(postId: string): Promise<APIResponse<XPost>> {\n return this._get(`/x/posts/${postId}`, {\n castTo: (r) => r as XPost,\n });\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number; cursor?: string; product?: string },\n ): Promise<APIResponse<XPost[]>> {\n return this._getList(`/x/posts/search`, {\n params: {\n q,\n count: options?.count,\n cursor: options?.cursor,\n product: options?.product,\n },\n itemsKey: \"tweets\",\n castTo: (r) => r as XPost,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterUserPosts(\n username: string,\n options?: { count?: number },\n ): AsyncGenerator<XPost> {\n return this._paginate(`/x/users/${username}/posts`, {\n params: { count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as XPost,\n });\n }\n\n iterSearchPosts(\n q: string,\n options?: { count?: number; product?: string },\n ): AsyncGenerator<XPost> {\n return this._paginate(`/x/posts/search`, {\n params: { q, count: options?.count, product: options?.product },\n itemsKey: \"posts\",\n castTo: (r) => r as XPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, YouTubeChannel, YouTubeComment, YouTubeVideo } from \"../types.js\";\n\nexport class YouTube extends APIResource {\n async getVideo(videoId: string): Promise<APIResponse<YouTubeVideo>> {\n return this._get(`/youtube/videos/${videoId}`, {\n castTo: (r) => r as YouTubeVideo,\n });\n }\n\n async getChannel(channelId: string): Promise<APIResponse<YouTubeChannel>> {\n return this._get(`/youtube/channels/${channelId}`, {\n castTo: (r) => r as YouTubeChannel,\n });\n }\n\n async search(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/youtube/videos/search`, {\n params: { q, count: options?.count },\n });\n }\n\n async getVideoComments(\n videoId: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/youtube/videos/${videoId}/comments`, {\n params: { count: options?.count },\n });\n }\n\n async getVideoTranscription(\n videoId: string,\n options?: { language?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/youtube/videos/${videoId}/transcription`, {\n params: { language: options?.language },\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterSearch(\n q: string,\n options?: { count?: number },\n ): AsyncGenerator<YouTubeVideo> {\n return this._paginate(`/youtube/videos/search`, {\n params: { q, count: options?.count },\n itemsKey: \"videos\",\n castTo: (r) => r as YouTubeVideo,\n });\n }\n\n iterVideoComments(\n videoId: string,\n options?: { count?: number },\n ): AsyncGenerator<YouTubeComment> {\n return this._paginate(`/youtube/videos/${videoId}/comments`, {\n params: { count: options?.count },\n itemsKey: \"comments\",\n castTo: (r) => r as YouTubeComment,\n });\n }\n}\n","/**\n * ByCrawl Client\n *\n * Main entry point for the SDK. Wires up all platform namespaces\n * and manages the HTTP transport.\n */\n\nimport {\n DEFAULT_BASE_URL,\n DEFAULT_MAX_RETRIES,\n DEFAULT_TIMEOUT,\n Transport,\n} from \"./http.js\";\nimport { Dcard } from \"./platforms/dcard.js\";\nimport { Facebook } from \"./platforms/facebook.js\";\nimport { GMaps } from \"./platforms/gmaps.js\";\nimport { Instagram } from \"./platforms/instagram.js\";\nimport { Job104 } from \"./platforms/job104.js\";\nimport { LinkedIn } from \"./platforms/linkedin.js\";\nimport { Reddit } from \"./platforms/reddit.js\";\nimport { Threads } from \"./platforms/threads.js\";\nimport { TikTok } from \"./platforms/tiktok.js\";\nimport { WebFetch } from \"./platforms/webfetch.js\";\nimport { X } from \"./platforms/x.js\";\nimport { YouTube } from \"./platforms/youtube.js\";\n\nexport interface ByCrawlOptions {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n maxRetries?: number;\n}\n\n/**\n * ByCrawl client for the ByCrawl social media data API.\n *\n * @example\n * ```ts\n * const client = new ByCrawl({ apiKey: \"sk_byc_...\" });\n * const post = await client.threads.getPost(\"DQt-ox3kdE4\");\n * console.log(post.data);\n * ```\n */\nexport class ByCrawl {\n readonly threads: Threads;\n readonly facebook: Facebook;\n readonly x: X;\n readonly instagram: Instagram;\n readonly reddit: Reddit;\n readonly linkedin: LinkedIn;\n readonly tiktok: TikTok;\n readonly youtube: YouTube;\n readonly dcard: Dcard;\n readonly gmaps: GMaps;\n readonly job104: Job104;\n readonly web: WebFetch;\n\n private readonly _transport: Transport;\n\n constructor(options?: ByCrawlOptions) {\n const apiKey =\n options?.apiKey ?? process.env[\"BYCRAWL_API_KEY\"] ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"apiKey must be provided or set via the BYCRAWL_API_KEY environment variable\",\n );\n }\n\n this._transport = new Transport({\n apiKey,\n baseUrl: options?.baseUrl ?? DEFAULT_BASE_URL,\n timeout: options?.timeout ?? DEFAULT_TIMEOUT,\n maxRetries: options?.maxRetries ?? DEFAULT_MAX_RETRIES,\n });\n\n this.threads = new Threads(this._transport);\n this.facebook = new Facebook(this._transport);\n this.x = new X(this._transport);\n this.instagram = new Instagram(this._transport);\n this.reddit = new Reddit(this._transport);\n this.linkedin = new LinkedIn(this._transport);\n this.tiktok = new TikTok(this._transport);\n this.youtube = new YouTube(this._transport);\n this.dcard = new Dcard(this._transport);\n this.gmaps = new GMaps(this._transport);\n this.job104 = new Job104(this._transport);\n this.web = new WebFetch(this._transport);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/exceptions.ts","../src/http.ts","../src/resource.ts","../src/platforms/dcard.ts","../src/platforms/facebook.ts","../src/platforms/gmaps.ts","../src/platforms/instagram.ts","../src/platforms/job104.ts","../src/platforms/linkedin.ts","../src/platforms/ptt.ts","../src/platforms/reddit.ts","../src/platforms/rent591.ts","../src/platforms/threads.ts","../src/platforms/tiktok.ts","../src/platforms/trustpilot.ts","../src/platforms/webfetch.ts","../src/platforms/x.ts","../src/platforms/youtube.ts","../src/client.ts"],"sourcesContent":["/**\n * ByCrawl Node.js SDK\n *\n * @example\n * ```ts\n * import { ByCrawl } from \"bycrawl\";\n *\n * const client = new ByCrawl({ apiKey: \"sk_byc_...\" });\n * const post = await client.threads.getPost(\"DQt-ox3kdE4\");\n * console.log(post.data);\n * ```\n */\n\nexport { ByCrawl } from \"./client.js\";\nexport type { ByCrawlOptions } from \"./client.js\";\n\nexport { SDK_VERSION } from \"./http.js\";\n\nexport {\n APIError,\n AuthenticationError,\n ByCrawlError,\n ConnectionError,\n NotFoundError,\n PermissionError,\n RateLimitError,\n ServerError,\n TimeoutError,\n} from \"./exceptions.js\";\n\nexport type {\n APIResponse,\n BulkJob,\n BulkJobStatus,\n CreditInfo,\n DcardForum,\n DcardPersona,\n DcardPost,\n FacebookPost,\n FacebookUser,\n GMapsPlace,\n InstagramTag,\n InstagramUser,\n Job104Company,\n Job104Job,\n LinkedInCompany,\n LinkedInJob,\n LinkedInPost,\n LinkedInUser,\n PaginatedData,\n RateLimit,\n RedditPost,\n RedditUser,\n Subreddit,\n ThreadsMedia,\n ThreadsPost,\n ThreadsPostStats,\n ThreadsUser,\n TikTokCategory,\n TikTokComment,\n TikTokUser,\n TikTokVideo,\n XPost,\n XUser,\n YouTubeChannel,\n YouTubeComment,\n YouTubeVideo,\n} from \"./types.js\";\n","/**\n * ByCrawl Exception Hierarchy\n *\n * All SDK exceptions inherit from ByCrawlError.\n * HTTP errors are mapped to specific subclasses by status code.\n */\n\nexport class ByCrawlError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ByCrawlError\";\n }\n}\n\nexport class APIError extends ByCrawlError {\n readonly statusCode: number;\n readonly body: Record<string, unknown> | null;\n\n constructor(\n message: string,\n options: { statusCode: number; body?: Record<string, unknown> | null },\n ) {\n super(message);\n this.name = \"APIError\";\n this.statusCode = options.statusCode;\n this.body = options.body ?? null;\n }\n}\n\nexport class AuthenticationError extends APIError {\n constructor(\n message = \"Invalid or missing API key\",\n body?: Record<string, unknown> | null,\n ) {\n super(message, { statusCode: 401, body });\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class PermissionError extends APIError {\n constructor(\n message = \"Insufficient scope\",\n body?: Record<string, unknown> | null,\n ) {\n super(message, { statusCode: 403, body });\n this.name = \"PermissionError\";\n }\n}\n\nexport class NotFoundError extends APIError {\n constructor(\n message = \"Resource not found\",\n body?: Record<string, unknown> | null,\n ) {\n super(message, { statusCode: 404, body });\n this.name = \"NotFoundError\";\n }\n}\n\nexport class RateLimitError extends APIError {\n readonly retryAfter: number | null;\n\n constructor(\n message = \"Rate limit exceeded\",\n options?: { retryAfter?: number | null; body?: Record<string, unknown> | null },\n ) {\n super(message, { statusCode: 429, body: options?.body });\n this.name = \"RateLimitError\";\n this.retryAfter = options?.retryAfter ?? null;\n }\n}\n\nexport class ServerError extends APIError {\n constructor(\n message: string,\n options: { statusCode: number; body?: Record<string, unknown> | null },\n ) {\n super(message, options);\n this.name = \"ServerError\";\n }\n}\n\nexport class TimeoutError extends ByCrawlError {\n constructor(message = \"Request timed out\") {\n super(message);\n this.name = \"TimeoutError\";\n }\n}\n\nexport class ConnectionError extends ByCrawlError {\n constructor(message = \"Network connection error\") {\n super(message);\n this.name = \"ConnectionError\";\n }\n}\n","/**\n * HTTP Transport Layer\n *\n * Wraps native fetch with:\n * - API key authentication (x-api-key header)\n * - Automatic retry with exponential backoff + jitter\n * - Consistent error mapping to ByCrawl exceptions\n * - ResponseWrapper with headers for rate limit / credit parsing\n */\n\nimport {\n APIError,\n AuthenticationError,\n ByCrawlError,\n ConnectionError,\n NotFoundError,\n PermissionError,\n RateLimitError,\n ServerError,\n TimeoutError,\n} from \"./exceptions.js\";\n\nexport const DEFAULT_BASE_URL = \"https://api.bycrawl.com\";\nexport const DEFAULT_TIMEOUT = 60_000;\nexport const DEFAULT_MAX_RETRIES = 2;\nexport const SDK_VERSION = \"0.1.1\";\n\nconst RETRYABLE_STATUS_CODES = new Set([429, 500, 502, 503, 504]);\n\nfunction userAgent(): string {\n return `bycrawl-node/${SDK_VERSION}`;\n}\n\nfunction makeHeaders(apiKey: string): Record<string, string> {\n return {\n \"x-api-key\": apiKey,\n \"User-Agent\": userAgent(),\n Accept: \"application/json\",\n };\n}\n\nfunction backoffDelay(attempt: number, base = 0.5, maxDelay = 8.0): number {\n const delay = Math.min(base * 2 ** attempt, maxDelay);\n return Math.random() * delay;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface ResponseWrapper {\n statusCode: number;\n data: Record<string, unknown>;\n headers: Record<string, string>;\n}\n\nfunction raiseForStatus(\n status: number,\n body: Record<string, unknown> | null,\n headers: Headers,\n): void {\n if (status >= 200 && status < 300) return;\n\n const message =\n (body?.error as string) ?? `HTTP ${status}`;\n\n if (status === 401) {\n throw new AuthenticationError(message, body);\n }\n if (status === 403) {\n throw new PermissionError(message, body);\n }\n if (status === 404) {\n throw new NotFoundError(message, body);\n }\n if (status === 429) {\n const retryAfter = headers.get(\"retry-after\");\n throw new RateLimitError(message, {\n retryAfter: retryAfter ? parseFloat(retryAfter) : null,\n body,\n });\n }\n if (status >= 500) {\n throw new ServerError(message, { statusCode: status, body });\n }\n\n throw new APIError(message, { statusCode: status, body });\n}\n\nfunction headersToRecord(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n maxRetries?: number;\n}\n\nexport class Transport {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly defaultHeaders: Record<string, string>;\n\n constructor(options: TransportOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.defaultHeaders = makeHeaders(this.apiKey);\n }\n\n async request(\n method: string,\n path: string,\n options?: {\n params?: Record<string, unknown>;\n json?: Record<string, unknown>;\n headers?: Record<string, string>;\n },\n ): Promise<ResponseWrapper> {\n const url = new URL(path, this.baseUrl);\n\n if (options?.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value != null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const requestHeaders: Record<string, string> = {\n ...this.defaultHeaders,\n ...options?.headers,\n };\n\n if (options?.json) {\n requestHeaders[\"Content-Type\"] = \"application/json\";\n }\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.timeout,\n );\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method,\n headers: requestHeaders,\n body: options?.json ? JSON.stringify(options.json) : undefined,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (\n RETRYABLE_STATUS_CODES.has(response.status) &&\n attempt < this.maxRetries\n ) {\n let delay = backoffDelay(attempt);\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n if (retryAfter) {\n delay = Math.max(delay, parseFloat(retryAfter) * 1000);\n }\n }\n await sleep(delay);\n continue;\n }\n\n let body: Record<string, unknown> | null = null;\n try {\n body = (await response.json()) as Record<string, unknown>;\n } catch {\n if (!response.ok) {\n throw new APIError(\"Invalid JSON response\", { statusCode: 502 });\n }\n }\n\n raiseForStatus(response.status, body, response.headers);\n\n return {\n statusCode: response.status,\n data: body ?? {},\n headers: headersToRecord(response.headers),\n };\n } catch (error) {\n if (\n error instanceof AuthenticationError ||\n error instanceof PermissionError ||\n error instanceof NotFoundError ||\n error instanceof RateLimitError ||\n error instanceof ServerError ||\n error instanceof APIError\n ) {\n throw error;\n }\n\n if (error instanceof DOMException && error.name === \"AbortError\") {\n lastError = error;\n if (attempt < this.maxRetries) {\n const delay = backoffDelay(attempt);\n await sleep(delay);\n continue;\n }\n throw new TimeoutError(String(error));\n }\n\n if (error instanceof TypeError && error.message.includes(\"fetch\")) {\n lastError = error;\n if (attempt < this.maxRetries) {\n const delay = backoffDelay(attempt);\n await sleep(delay);\n continue;\n }\n throw new ConnectionError(String(error));\n }\n\n if (error instanceof ByCrawlError) {\n throw error;\n }\n\n throw new ByCrawlError(`Unexpected error: ${error}`);\n }\n }\n\n if (lastError) {\n throw new ConnectionError(String(lastError));\n }\n throw new ConnectionError(\"Request failed after retries\");\n }\n}\n","/**\n * APIResource Base Class\n *\n * All platform namespaces inherit from APIResource.\n * Handles HTTP call delegation, response wrapping, header parsing, and pagination.\n */\n\nimport { ByCrawlError } from \"./exceptions.js\";\nimport type { ResponseWrapper, Transport } from \"./http.js\";\nimport type { APIResponse, CreditInfo, RateLimit } from \"./types.js\";\n\nfunction parseRateLimit(headers: Record<string, string>): RateLimit | null {\n const limit = headers[\"x-ratelimit-limit\"];\n const remaining = headers[\"x-ratelimit-remaining\"];\n const reset = headers[\"x-ratelimit-reset\"];\n if (limit == null && remaining == null && reset == null) return null;\n return {\n limit: limit ? parseInt(limit, 10) : null,\n remaining: remaining ? parseInt(remaining, 10) : null,\n reset: reset ? parseFloat(reset) : null,\n };\n}\n\nfunction parseCredit(headers: Record<string, string>): CreditInfo | null {\n const remaining = headers[\"x-credit-remaining\"];\n const used = headers[\"x-credit-used\"];\n if (remaining == null && used == null) return null;\n return {\n remaining: remaining ? parseInt(remaining, 10) : null,\n used: used ? parseInt(used, 10) : null,\n };\n}\n\nfunction wrapResponse<T>(\n wrapper: ResponseWrapper,\n castTo?: (raw: Record<string, unknown>) => T,\n): APIResponse<T> {\n const data = wrapper.data;\n let bodyData: unknown;\n let success: boolean;\n let error: string | null;\n let queued: boolean;\n\n if (typeof data === \"object\" && data !== null && \"data\" in data) {\n bodyData = data.data;\n success = (data.success as boolean) ?? true;\n error = (data.error as string) ?? null;\n queued = (data.queued as boolean) ?? false;\n } else if (typeof data === \"object\" && data !== null && \"error\" in data) {\n bodyData = null;\n success = false;\n error = (data.error as string) ?? null;\n queued = false;\n } else {\n bodyData = data;\n success = true;\n error = null;\n queued = false;\n }\n\n let parsed: T | null = bodyData as T | null;\n if (castTo && bodyData != null) {\n if (Array.isArray(bodyData)) {\n parsed = bodyData.map((item) =>\n castTo(item as Record<string, unknown>),\n ) as T;\n } else if (typeof bodyData === \"object\") {\n parsed = castTo(bodyData as Record<string, unknown>);\n }\n }\n\n return {\n success,\n data: parsed,\n error,\n queued,\n rateLimit: parseRateLimit(wrapper.headers),\n credit: parseCredit(wrapper.headers),\n };\n}\n\nexport class APIResource {\n protected readonly _transport: Transport;\n\n constructor(transport: Transport) {\n this._transport = transport;\n }\n\n protected async _get<T>(\n path: string,\n options?: {\n params?: Record<string, unknown>;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T>> {\n return this._request(\"GET\", path, { params: options?.params, castTo: options?.castTo });\n }\n\n protected async _post<T>(\n path: string,\n options?: {\n body?: Record<string, unknown>;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T>> {\n return this._request(\"POST\", path, { body: options?.body, castTo: options?.castTo });\n }\n\n protected async _getList<T>(\n path: string,\n options: {\n params?: Record<string, unknown>;\n itemsKey: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T[]>> {\n const resp = await this._get<Record<string, unknown>>(path, {\n params: options.params,\n });\n const raw = resp.data;\n let items: T[];\n\n if (raw && typeof raw === \"object\" && !Array.isArray(raw) && options.itemsKey in raw) {\n const arr = (raw as Record<string, unknown>)[options.itemsKey];\n if (Array.isArray(arr)) {\n items = options.castTo\n ? arr.map((item) => options.castTo!(item as Record<string, unknown>))\n : (arr as T[]);\n } else {\n items = [];\n }\n } else if (Array.isArray(raw)) {\n items = options.castTo\n ? raw.map((item) => options.castTo!(item as Record<string, unknown>))\n : (raw as T[]);\n } else {\n items = [];\n }\n\n return {\n ...resp,\n data: items,\n } as APIResponse<T[]>;\n }\n\n protected async _request<T>(\n method: string,\n path: string,\n options?: {\n params?: Record<string, unknown>;\n body?: Record<string, unknown>;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): Promise<APIResponse<T>> {\n const wrapper = await this._transport.request(method, path, {\n params: options?.params,\n json: options?.body,\n });\n return wrapResponse<T>(wrapper, options?.castTo);\n }\n\n protected async *_paginate<T>(\n path: string,\n options: {\n params: Record<string, unknown>;\n itemsKey?: string;\n cursorKey?: string;\n hasMoreKey?: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): AsyncGenerator<T> {\n const itemsKey = options.itemsKey ?? \"items\";\n const cursorKey = options.cursorKey ?? \"cursor\";\n const hasMoreKey = options.hasMoreKey ?? \"hasMore\";\n let params = { ...options.params };\n\n while (true) {\n const wrapper = await this._transport.request(\"GET\", path, { params });\n const responseData = wrapper.data;\n const data =\n typeof responseData === \"object\" &&\n responseData !== null &&\n \"data\" in responseData\n ? (responseData.data as Record<string, unknown>)\n : (responseData as Record<string, unknown>);\n\n const items = (data[itemsKey] as unknown[]) ?? [];\n for (const item of items) {\n if (options.castTo) {\n yield options.castTo(item as Record<string, unknown>);\n } else {\n yield item as T;\n }\n }\n\n if (!data[hasMoreKey]) break;\n const nextCursor =\n (data[cursorKey] as string) ?? (data[\"next_cursor\"] as string);\n if (!nextCursor) break;\n params = { ...params, [cursorKey]: nextCursor };\n }\n }\n\n protected async *_paginateByPage<T>(\n path: string,\n options: {\n params: Record<string, unknown>;\n itemsKey?: string;\n pageKey?: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): AsyncGenerator<T> {\n const itemsKey = options.itemsKey ?? \"items\";\n const pageKey = options.pageKey ?? \"page\";\n let page = (options.params[pageKey] as number) ?? 1;\n\n while (true) {\n const params = { ...options.params, [pageKey]: page };\n const wrapper = await this._transport.request(\"GET\", path, { params });\n const responseData = wrapper.data;\n const data =\n typeof responseData === \"object\" &&\n responseData !== null &&\n \"data\" in responseData\n ? (responseData.data as Record<string, unknown>)\n : (responseData as Record<string, unknown>);\n\n const items = (data[itemsKey] as unknown[]) ?? [];\n if (items.length === 0) break;\n\n for (const item of items) {\n if (options.castTo) {\n yield options.castTo(item as Record<string, unknown>);\n } else {\n yield item as T;\n }\n }\n\n const hasMore = data[\"hasMore\"] as boolean | undefined;\n if (hasMore === false) break;\n const limit = (params[\"limit\"] as number) ?? 20;\n if (items.length < limit) break;\n page += 1;\n }\n }\n\n protected async *_paginateByOffset<T>(\n path: string,\n options: {\n params: Record<string, unknown>;\n itemsKey?: string;\n countKey?: string;\n castTo?: (raw: Record<string, unknown>) => T;\n },\n ): AsyncGenerator<T> {\n const itemsKey = options.itemsKey ?? \"items\";\n const countKey = options.countKey ?? \"count\";\n let offset = (options.params[\"offset\"] as number) ?? 0;\n const limit = (options.params[\"limit\"] as number) ?? 20;\n\n while (true) {\n const params = { ...options.params, offset, limit };\n const wrapper = await this._transport.request(\"GET\", path, { params });\n const responseData = wrapper.data;\n const data =\n typeof responseData === \"object\" &&\n responseData !== null &&\n \"data\" in responseData\n ? (responseData.data as Record<string, unknown>)\n : (responseData as Record<string, unknown>);\n\n const items = (data[itemsKey] as unknown[]) ?? [];\n if (items.length === 0) break;\n\n for (const item of items) {\n if (options.castTo) {\n yield options.castTo(item as Record<string, unknown>);\n } else {\n yield item as T;\n }\n }\n\n const total = data[countKey] as number | undefined;\n offset += items.length;\n if (total != null && offset >= total) break;\n if (items.length < limit) break;\n }\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, DcardForum, DcardPersona, DcardPost } from \"../types.js\";\n\nexport class Dcard extends APIResource {\n async getForum(alias: string): Promise<APIResponse<DcardForum>> {\n return this._get(`/dcard/forums/${alias}`, {\n castTo: (r) => r as DcardForum,\n });\n }\n\n async getForumPosts(\n alias: string,\n options?: { count?: number; popular?: boolean },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/dcard/forums/${alias}/posts`, {\n params: { count: options?.count, popular: options?.popular },\n });\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number; offset?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/dcard/posts/search`, {\n params: { q, count: options?.count, offset: options?.offset },\n });\n }\n\n async getPersona(username: string): Promise<APIResponse<DcardPersona>> {\n return this._get(`/dcard/personas/${username}`, {\n castTo: (r) => r as DcardPersona,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterSearchPosts(\n q: string,\n options?: { count?: number },\n ): AsyncGenerator<DcardPost> {\n return this._paginateByOffset(`/dcard/posts/search`, {\n params: { q, count: options?.count ?? 30 },\n itemsKey: \"posts\",\n castTo: (r) => r as DcardPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, FacebookPost, FacebookUser } from \"../types.js\";\n\nexport class Facebook extends APIResource {\n async getUser(username: string): Promise<APIResponse<FacebookUser>> {\n return this._get(`/facebook/users/${username}`, {\n castTo: (r) => r as FacebookUser,\n });\n }\n\n async getUserPosts(\n username: string,\n options?: { count?: number },\n ): Promise<APIResponse<FacebookPost[]>> {\n return this._request<FacebookPost[]>(\"GET\", `/facebook/users/${username}/posts`, {\n params: { count: options?.count },\n });\n }\n\n async getPagePosts(\n pageId: string,\n options?: { count?: number },\n ): Promise<APIResponse<FacebookPost[]>> {\n return this._request<FacebookPost[]>(\"GET\", `/facebook/pages/${pageId}/posts`, {\n params: { count: options?.count },\n });\n }\n\n async getPost(options: { url: string }): Promise<APIResponse<FacebookPost>> {\n return this._get(`/facebook/posts`, {\n params: { url: options.url },\n castTo: (r) => r as FacebookPost,\n });\n }\n\n async getPostComments(options: {\n url: string;\n }): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/posts/comments`, {\n params: { url: options.url },\n });\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/posts/search`, {\n params: { q, count: options?.count },\n });\n }\n\n async browseMarketplace(\n options?: { location?: string; category?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/marketplace/listings`, {\n params: { location: options?.location, category: options?.category },\n });\n }\n\n async searchMarketplace(\n q: string,\n options?: { location?: string; category?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/marketplace/search`, {\n params: { q, location: options?.location, category: options?.category },\n });\n }\n\n async getMarketplaceItem(\n listingId: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/facebook/marketplace/items/${listingId}`);\n }\n\n // -- Auto-pagination iterators --\n\n iterPostComments(options: {\n url: string;\n }): AsyncGenerator<Record<string, unknown>> {\n return this._paginate(`/facebook/posts/comments`, {\n params: { url: options.url },\n itemsKey: \"comments\",\n });\n }\n\n iterSearchPosts(\n q: string,\n options?: { count?: number },\n ): AsyncGenerator<FacebookPost> {\n return this._paginate(`/facebook/posts/search`, {\n params: { q, count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as FacebookPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, GMapsPlace } from \"../types.js\";\n\nexport class GMaps extends APIResource {\n async search(\n q: string,\n options?: { language?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/gmaps/places/search`, {\n params: { q, language: options?.language },\n });\n }\n\n async getPlace(\n query: string,\n options?: { language?: string },\n ): Promise<APIResponse<GMapsPlace>> {\n return this._get(`/gmaps/places`, {\n params: { query, language: options?.language },\n castTo: (r) => r as GMapsPlace,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, InstagramUser } from \"../types.js\";\n\nexport class Instagram extends APIResource {\n async getUser(username: string): Promise<APIResponse<InstagramUser>> {\n return this._get(`/instagram/users/${username}`, {\n castTo: (r) => r as InstagramUser,\n });\n }\n\n async searchTags(\n q: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/tags/search`, { params: { q } });\n }\n\n async getPost(\n shortcode: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/posts/${shortcode}`);\n }\n\n async getPostComments(\n shortcode: string,\n options?: { cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/posts/${shortcode}/comments`, {\n params: { cursor: options?.cursor },\n });\n }\n\n async getUserPosts(\n username: string,\n options?: { cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/instagram/users/${username}/posts`, {\n params: { cursor: options?.cursor },\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterUserPosts(\n username: string,\n ): AsyncGenerator<Record<string, unknown>> {\n return this._paginate(`/instagram/users/${username}/posts`, {\n params: {},\n itemsKey: \"posts\",\n });\n }\n\n iterPostComments(\n shortcode: string,\n ): AsyncGenerator<Record<string, unknown>> {\n return this._paginate(`/instagram/posts/${shortcode}/comments`, {\n params: {},\n itemsKey: \"comments\",\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, Job104Company, Job104Job } from \"../types.js\";\n\nexport class Job104 extends APIResource {\n async searchJobs(options?: {\n q?: string;\n welfare?: string;\n area?: string;\n page?: number;\n count?: number;\n }): Promise<APIResponse<Job104Job[]>> {\n return this._getList(`/job104/jobs/search`, {\n params: {\n q: options?.q,\n welfare: options?.welfare,\n area: options?.area,\n page: options?.page,\n count: options?.count,\n },\n itemsKey: \"jobs\",\n castTo: (r) => r as Job104Job,\n });\n }\n\n async getCompany(companyId: string): Promise<APIResponse<Job104Company>> {\n return this._get(`/job104/companies/${companyId}`, {\n castTo: (r) => r as Job104Company,\n });\n }\n\n async getJob(jobId: string): Promise<APIResponse<Job104Job>> {\n return this._get(`/job104/jobs/${jobId}`, {\n castTo: (r) => r as Job104Job,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterSearchJobs(options?: {\n q?: string;\n welfare?: string;\n area?: string;\n count?: number;\n }): AsyncGenerator<Job104Job> {\n return this._paginateByPage(`/job104/jobs/search`, {\n params: {\n q: options?.q,\n welfare: options?.welfare,\n area: options?.area,\n count: options?.count ?? 20,\n },\n itemsKey: \"jobs\",\n pageKey: \"page\",\n castTo: (r) => r as Job104Job,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type {\n APIResponse,\n LinkedInCompany,\n LinkedInJob,\n LinkedInPost,\n LinkedInUser,\n} from \"../types.js\";\n\nexport class LinkedIn extends APIResource {\n async getCompany(\n companyId: string,\n ): Promise<APIResponse<LinkedInCompany>> {\n return this._get(`/linkedin/companies/${companyId}`, {\n castTo: (r) => r as LinkedInCompany,\n });\n }\n\n async getCompanyJobs(\n companyId: string,\n options?: { count?: number; offset?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/linkedin/companies/${companyId}/jobs`, {\n params: { count: options?.count, offset: options?.offset },\n });\n }\n\n async searchJobs(\n q: string,\n options?: { location?: string; count?: number; offset?: number },\n ): Promise<APIResponse<LinkedInJob[]>> {\n return this._getList(`/linkedin/jobs/search`, {\n params: {\n q,\n location: options?.location,\n count: options?.count,\n offset: options?.offset,\n },\n itemsKey: \"jobs\",\n castTo: (r) => r as LinkedInJob,\n });\n }\n\n async getJob(jobId: string): Promise<APIResponse<LinkedInJob>> {\n return this._get(`/linkedin/jobs/${jobId}`, {\n castTo: (r) => r as LinkedInJob,\n });\n }\n\n async getPost(postId: string): Promise<APIResponse<LinkedInPost>> {\n return this._get(`/linkedin/posts/${postId}`, {\n castTo: (r) => r as LinkedInPost,\n });\n }\n\n async searchUsers(\n q: string,\n options?: { count?: number; offset?: number },\n ): Promise<APIResponse<LinkedInUser[]>> {\n return this._getList(`/linkedin/users/search`, {\n params: { q, count: options?.count, offset: options?.offset },\n itemsKey: \"users\",\n castTo: (r) => r as LinkedInUser,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<LinkedInUser>> {\n return this._get(`/linkedin/users/${username}`, {\n castTo: (r) => r as LinkedInUser,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterCompanyJobs(\n companyId: string,\n options?: { count?: number },\n ): AsyncGenerator<LinkedInJob> {\n const count = options?.count ?? 10;\n return this._paginateByOffset(`/linkedin/companies/${companyId}/jobs`, {\n params: { count, limit: count },\n itemsKey: \"jobs\",\n castTo: (r) => r as LinkedInJob,\n });\n }\n\n iterSearchJobs(\n q: string,\n options?: { location?: string; count?: number },\n ): AsyncGenerator<LinkedInJob> {\n const count = options?.count ?? 10;\n return this._paginateByOffset(`/linkedin/jobs/search`, {\n params: { q, location: options?.location, count, limit: count },\n itemsKey: \"jobs\",\n castTo: (r) => r as LinkedInJob,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse } from \"../types.js\";\n\nexport class PTT extends APIResource {\n async getBoard(\n boardName: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/ptt/boards/${boardName}`);\n }\n\n async getBoardPosts(\n boardName: string,\n options?: { page?: number; count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/ptt/boards/${boardName}/posts`, {\n params: { page: options?.page, count: options?.count },\n });\n }\n\n async getPost(url: string): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/ptt/posts`, {\n params: { url },\n });\n }\n\n async searchPosts(\n boardName: string,\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/ptt/boards/${boardName}/search`, {\n params: { q, count: options?.count },\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, RedditPost, RedditUser, Subreddit } from \"../types.js\";\n\nexport class Reddit extends APIResource {\n async getSubreddit(name: string): Promise<APIResponse<Subreddit>> {\n return this._get(`/reddit/subreddits/${name}`, {\n castTo: (r) => r as Subreddit,\n });\n }\n\n async getSubredditPosts(\n name: string,\n options?: { sort?: string; t?: string; count?: number; after?: string },\n ): Promise<APIResponse<RedditPost[]>> {\n return this._getList(`/reddit/subreddits/${name}/posts`, {\n params: {\n sort: options?.sort,\n t: options?.t,\n count: options?.count,\n after: options?.after,\n },\n itemsKey: \"posts\",\n castTo: (r) => r as RedditPost,\n });\n }\n\n async getPost(postId: string): Promise<APIResponse<RedditPost>> {\n return this._get(`/reddit/posts/${postId}`, {\n castTo: (r) => r as RedditPost,\n });\n }\n\n async searchPosts(\n q: string,\n options?: { sort?: string; t?: string; count?: number; after?: string },\n ): Promise<APIResponse<RedditPost[]>> {\n return this._getList(`/reddit/posts/search`, {\n params: {\n q,\n sort: options?.sort,\n t: options?.t,\n count: options?.count,\n after: options?.after,\n },\n itemsKey: \"posts\",\n castTo: (r) => r as RedditPost,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<RedditUser>> {\n return this._get(`/reddit/users/${username}`, {\n castTo: (r) => r as RedditUser,\n });\n }\n\n async getUserPosts(\n username: string,\n options?: {\n sort?: string;\n t?: string;\n count?: number;\n after?: string;\n },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/reddit/users/${username}/posts`, {\n params: {\n sort: options?.sort,\n t: options?.t,\n count: options?.count,\n after: options?.after,\n },\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse } from \"../types.js\";\n\nexport class Rent591 extends APIResource {\n async getListings(options?: {\n region?: number;\n first_row?: number;\n kind?: number;\n section?: number;\n price?: string;\n count?: number;\n }): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/rent591/listings`, {\n params: {\n region: options?.region,\n first_row: options?.first_row,\n kind: options?.kind,\n section: options?.section,\n price: options?.price,\n count: options?.count,\n },\n });\n }\n\n async getListing(\n listingId: number,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/rent591/listings/${listingId}`);\n }\n}\n","import { ByCrawlError, TimeoutError } from \"../exceptions.js\";\nimport { APIResource } from \"../resource.js\";\nimport type { APIResponse, BulkJob, BulkJobStatus, ThreadsPost, ThreadsUser } from \"../types.js\";\n\nexport class Threads extends APIResource {\n async getPost(\n postId: string,\n ): Promise<APIResponse<ThreadsPost>> {\n return this._get(`/threads/posts/${postId}`, {\n castTo: (r) => r as ThreadsPost,\n });\n }\n\n async getPosts(\n ids: string[],\n ): Promise<APIResponse<ThreadsPost[]>> {\n const resp = await this._request<ThreadsPost[]>(\"GET\", `/threads/posts`, {\n params: { ids: ids.join(\",\") },\n });\n return resp;\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<ThreadsPost[]>> {\n return this._getList(`/threads/posts/search`, {\n params: { q, count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as ThreadsPost,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<ThreadsUser>> {\n return this._get(`/threads/users/${username}`, {\n castTo: (r) => r as ThreadsUser,\n });\n }\n\n async getUserPosts(\n userId: string,\n options?: { cursor?: string; count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/threads/users/${userId}/posts`, {\n params: { cursor: options?.cursor, count: options?.count },\n });\n }\n\n async getUserReplies(\n userId: string,\n options?: { cursor?: string; count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/threads/users/${userId}/replies`, {\n params: { cursor: options?.cursor, count: options?.count },\n });\n }\n\n async searchUsers(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<ThreadsUser[]>> {\n return this._getList(`/threads/users/search`, {\n params: { q, count: options?.count },\n itemsKey: \"users\",\n castTo: (r) => r as ThreadsUser,\n });\n }\n\n async getPublicFeed(options?: {\n cursor?: string;\n count?: number;\n }): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/threads/feed/public`, {\n params: { cursor: options?.cursor, count: options?.count },\n });\n }\n\n // -- Bulk operations --\n\n async bulkSubmit(\n ids: string[],\n options?: { type?: string },\n ): Promise<APIResponse<BulkJob>> {\n return this._post(`/threads/bulk`, {\n body: { ids, type: options?.type ?? \"content\" },\n castTo: (r) => r as BulkJob,\n });\n }\n\n async bulkStatus(jobId: string): Promise<APIResponse<BulkJobStatus>> {\n return this._get(`/threads/bulk/${jobId}`, {\n castTo: (r) => r as BulkJobStatus,\n });\n }\n\n async bulkResults(jobId: string): Promise<APIResponse<ThreadsPost[]>> {\n return this._request<ThreadsPost[]>(\"GET\", `/threads/bulk/${jobId}/results`);\n }\n\n async bulkSubmitAndWait(\n ids: string[],\n options?: { pollInterval?: number; timeout?: number },\n ): Promise<APIResponse<ThreadsPost[]>> {\n const pollInterval = options?.pollInterval ?? 2000;\n const timeout = options?.timeout ?? 300_000;\n\n const submitResp = await this.bulkSubmit(ids);\n const jobId = submitResp.data!.jobId;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const statusResp = await this.bulkStatus(jobId);\n const status = statusResp.data!.status;\n if (status === \"completed\") {\n return this.bulkResults(jobId);\n }\n if (status === \"failed\") {\n throw new ByCrawlError(`Bulk job ${jobId} failed`);\n }\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new TimeoutError(`Bulk job ${jobId} timed out after ${timeout}ms`);\n }\n\n // -- Auto-pagination iterators --\n\n iterUserPosts(\n userId: string,\n options?: { count?: number },\n ): AsyncGenerator<ThreadsPost> {\n return this._paginate(`/threads/users/${userId}/posts`, {\n params: { count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as ThreadsPost,\n });\n }\n\n iterUserReplies(\n userId: string,\n options?: { count?: number },\n ): AsyncGenerator<ThreadsPost> {\n return this._paginate(`/threads/users/${userId}/replies`, {\n params: { count: options?.count },\n itemsKey: \"replies\",\n castTo: (r) => r as ThreadsPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, TikTokComment, TikTokUser, TikTokVideo } from \"../types.js\";\n\nexport class TikTok extends APIResource {\n async getVideo(videoId: string): Promise<APIResponse<TikTokVideo>> {\n return this._get(`/tiktok/videos/${videoId}`, {\n castTo: (r) => r as TikTokVideo,\n });\n }\n\n async getUser(username: string): Promise<APIResponse<TikTokUser>> {\n return this._get(`/tiktok/users/${username}`, {\n castTo: (r) => r as TikTokUser,\n });\n }\n\n async getUserVideos(\n username: string,\n options?: { count?: number },\n ): Promise<APIResponse<TikTokVideo[]>> {\n return this._request<TikTokVideo[]>(\"GET\", `/tiktok/users/${username}/videos`, {\n params: { count: options?.count },\n });\n }\n\n async getVideoComments(\n videoId: string,\n options?: { cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/videos/${videoId}/comments`, {\n params: { cursor: options?.cursor },\n });\n }\n\n async getCategories(options?: {\n category?: string;\n count?: number;\n }): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/categories`, {\n params: { category: options?.category, count: options?.count },\n });\n }\n\n async search(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/videos/search`, {\n params: { q, count: options?.count },\n });\n }\n\n async getVideoSubtitles(\n videoId: string,\n options?: { language?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/tiktok/videos/${videoId}/subtitles`, {\n params: { language: options?.language },\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterVideoComments(videoId: string): AsyncGenerator<TikTokComment> {\n return this._paginate(`/tiktok/videos/${videoId}/comments`, {\n params: {},\n itemsKey: \"comments\",\n castTo: (r) => r as TikTokComment,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse } from \"../types.js\";\n\nexport class Trustpilot extends APIResource {\n async getBusiness(\n domain: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/trustpilot/businesses/${domain}`);\n }\n\n async getBusinessReviews(\n domain: string,\n options?: { page?: number; sort?: string; stars?: number; languages?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/trustpilot/businesses/${domain}/reviews`, {\n params: {\n page: options?.page,\n sort: options?.sort,\n stars: options?.stars,\n languages: options?.languages,\n },\n });\n }\n\n async searchBusinesses(\n q: string,\n options?: { page?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/trustpilot/businesses/search`, {\n params: { q, page: options?.page },\n });\n }\n\n async searchCategories(\n q: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/trustpilot/categories/search`, {\n params: { q },\n });\n }\n\n async getSuggestions(\n q: string,\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/trustpilot/suggestions`, {\n params: { q },\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse } from \"../types.js\";\n\nexport class WebFetch extends APIResource {\n async fetch(\n url: string,\n options?: { format?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/web/fetch`, {\n params: { url, format: options?.format },\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, XPost, XUser } from \"../types.js\";\n\nexport class X extends APIResource {\n async getUser(username: string): Promise<APIResponse<XUser>> {\n return this._get(`/x/users/${username}`, {\n castTo: (r) => r as XUser,\n });\n }\n\n async getUserPosts(\n username: string,\n options?: { count?: number; cursor?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/x/users/${username}/posts`, {\n params: { count: options?.count, cursor: options?.cursor },\n });\n }\n\n async getPost(postId: string): Promise<APIResponse<XPost>> {\n return this._get(`/x/posts/${postId}`, {\n castTo: (r) => r as XPost,\n });\n }\n\n async searchPosts(\n q: string,\n options?: { count?: number; cursor?: string; product?: string },\n ): Promise<APIResponse<XPost[]>> {\n return this._getList(`/x/posts/search`, {\n params: {\n q,\n count: options?.count,\n cursor: options?.cursor,\n product: options?.product,\n },\n itemsKey: \"tweets\",\n castTo: (r) => r as XPost,\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterUserPosts(\n username: string,\n options?: { count?: number },\n ): AsyncGenerator<XPost> {\n return this._paginate(`/x/users/${username}/posts`, {\n params: { count: options?.count },\n itemsKey: \"posts\",\n castTo: (r) => r as XPost,\n });\n }\n\n iterSearchPosts(\n q: string,\n options?: { count?: number; product?: string },\n ): AsyncGenerator<XPost> {\n return this._paginate(`/x/posts/search`, {\n params: { q, count: options?.count, product: options?.product },\n itemsKey: \"posts\",\n castTo: (r) => r as XPost,\n });\n }\n}\n","import { APIResource } from \"../resource.js\";\nimport type { APIResponse, YouTubeChannel, YouTubeComment, YouTubeVideo } from \"../types.js\";\n\nexport class YouTube extends APIResource {\n async getVideo(videoId: string): Promise<APIResponse<YouTubeVideo>> {\n return this._get(`/youtube/videos/${videoId}`, {\n castTo: (r) => r as YouTubeVideo,\n });\n }\n\n async getChannel(channelId: string): Promise<APIResponse<YouTubeChannel>> {\n return this._get(`/youtube/channels/${channelId}`, {\n castTo: (r) => r as YouTubeChannel,\n });\n }\n\n async search(\n q: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/youtube/videos/search`, {\n params: { q, count: options?.count },\n });\n }\n\n async getVideoComments(\n videoId: string,\n options?: { count?: number },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/youtube/videos/${videoId}/comments`, {\n params: { count: options?.count },\n });\n }\n\n async getVideoTranscription(\n videoId: string,\n options?: { language?: string },\n ): Promise<APIResponse<Record<string, unknown>>> {\n return this._get(`/youtube/videos/${videoId}/transcription`, {\n params: { language: options?.language },\n });\n }\n\n // -- Auto-pagination iterators --\n\n iterSearch(\n q: string,\n options?: { count?: number },\n ): AsyncGenerator<YouTubeVideo> {\n return this._paginate(`/youtube/videos/search`, {\n params: { q, count: options?.count },\n itemsKey: \"videos\",\n castTo: (r) => r as YouTubeVideo,\n });\n }\n\n iterVideoComments(\n videoId: string,\n options?: { count?: number },\n ): AsyncGenerator<YouTubeComment> {\n return this._paginate(`/youtube/videos/${videoId}/comments`, {\n params: { count: options?.count },\n itemsKey: \"comments\",\n castTo: (r) => r as YouTubeComment,\n });\n }\n}\n","/**\n * ByCrawl Client\n *\n * Main entry point for the SDK. Wires up all platform namespaces\n * and manages the HTTP transport.\n */\n\nimport {\n DEFAULT_BASE_URL,\n DEFAULT_MAX_RETRIES,\n DEFAULT_TIMEOUT,\n Transport,\n} from \"./http.js\";\nimport { Dcard } from \"./platforms/dcard.js\";\nimport { Facebook } from \"./platforms/facebook.js\";\nimport { GMaps } from \"./platforms/gmaps.js\";\nimport { Instagram } from \"./platforms/instagram.js\";\nimport { Job104 } from \"./platforms/job104.js\";\nimport { LinkedIn } from \"./platforms/linkedin.js\";\nimport { PTT } from \"./platforms/ptt.js\";\nimport { Reddit } from \"./platforms/reddit.js\";\nimport { Rent591 } from \"./platforms/rent591.js\";\nimport { Threads } from \"./platforms/threads.js\";\nimport { TikTok } from \"./platforms/tiktok.js\";\nimport { Trustpilot } from \"./platforms/trustpilot.js\";\nimport { WebFetch } from \"./platforms/webfetch.js\";\nimport { X } from \"./platforms/x.js\";\nimport { YouTube } from \"./platforms/youtube.js\";\n\nexport interface ByCrawlOptions {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n maxRetries?: number;\n}\n\n/**\n * ByCrawl client for the ByCrawl social media data API.\n *\n * @example\n * ```ts\n * const client = new ByCrawl({ apiKey: \"sk_byc_...\" });\n * const post = await client.threads.getPost(\"DQt-ox3kdE4\");\n * console.log(post.data);\n * ```\n */\nexport class ByCrawl {\n readonly threads: Threads;\n readonly facebook: Facebook;\n readonly x: X;\n readonly instagram: Instagram;\n readonly reddit: Reddit;\n readonly linkedin: LinkedIn;\n readonly tiktok: TikTok;\n readonly youtube: YouTube;\n readonly dcard: Dcard;\n readonly gmaps: GMaps;\n readonly job104: Job104;\n readonly trustpilot: Trustpilot;\n readonly ptt: PTT;\n readonly rent591: Rent591;\n readonly web: WebFetch;\n\n private readonly _transport: Transport;\n\n constructor(options?: ByCrawlOptions) {\n const apiKey =\n options?.apiKey ?? process.env[\"BYCRAWL_API_KEY\"] ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"apiKey must be provided or set via the BYCRAWL_API_KEY environment variable\",\n );\n }\n\n this._transport = new Transport({\n apiKey,\n baseUrl: options?.baseUrl ?? DEFAULT_BASE_URL,\n timeout: options?.timeout ?? DEFAULT_TIMEOUT,\n maxRetries: options?.maxRetries ?? DEFAULT_MAX_RETRIES,\n });\n\n this.threads = new Threads(this._transport);\n this.facebook = new Facebook(this._transport);\n this.x = new X(this._transport);\n this.instagram = new Instagram(this._transport);\n this.reddit = new Reddit(this._transport);\n this.linkedin = new LinkedIn(this._transport);\n this.tiktok = new TikTok(this._transport);\n this.youtube = new YouTube(this._transport);\n this.dcard = new Dcard(this._transport);\n this.gmaps = new GMaps(this._transport);\n this.job104 = new Job104(this._transport);\n this.trustpilot = new Trustpilot(this._transport);\n this.ptt = new PTT(this._transport);\n this.rent591 = new Rent591(this._transport);\n this.web = new WebFetch(this._transport);\n }\n}\n"],"mappings":"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","names":[]}