litescrape-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/dist/cjs/batch.d.ts +12 -0
  4. package/dist/cjs/batch.d.ts.map +1 -0
  5. package/dist/cjs/batch.js +131 -0
  6. package/dist/cjs/batch.js.map +1 -0
  7. package/dist/cjs/cache.d.ts +21 -0
  8. package/dist/cjs/cache.d.ts.map +1 -0
  9. package/dist/cjs/cache.js +112 -0
  10. package/dist/cjs/cache.js.map +1 -0
  11. package/dist/cjs/client.d.ts +38 -0
  12. package/dist/cjs/client.d.ts.map +1 -0
  13. package/dist/cjs/client.js +143 -0
  14. package/dist/cjs/client.js.map +1 -0
  15. package/dist/cjs/errors.d.ts +53 -0
  16. package/dist/cjs/errors.d.ts.map +1 -0
  17. package/dist/cjs/errors.js +121 -0
  18. package/dist/cjs/errors.js.map +1 -0
  19. package/dist/cjs/index.d.ts +8 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +40 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/models.d.ts +1735 -0
  24. package/dist/cjs/models.d.ts.map +1 -0
  25. package/dist/cjs/models.js +389 -0
  26. package/dist/cjs/models.js.map +1 -0
  27. package/dist/cjs/package.json +1 -0
  28. package/dist/cjs/result.d.ts +23 -0
  29. package/dist/cjs/result.d.ts.map +1 -0
  30. package/dist/cjs/result.js +49 -0
  31. package/dist/cjs/result.js.map +1 -0
  32. package/dist/cjs/runtime.d.ts +53 -0
  33. package/dist/cjs/runtime.d.ts.map +1 -0
  34. package/dist/cjs/runtime.js +237 -0
  35. package/dist/cjs/runtime.js.map +1 -0
  36. package/dist/cjs/stores.d.ts +143 -0
  37. package/dist/cjs/stores.d.ts.map +1 -0
  38. package/dist/cjs/stores.js +194 -0
  39. package/dist/cjs/stores.js.map +1 -0
  40. package/dist/cjs/validation.d.ts +65 -0
  41. package/dist/cjs/validation.d.ts.map +1 -0
  42. package/dist/cjs/validation.js +122 -0
  43. package/dist/cjs/validation.js.map +1 -0
  44. package/dist/cjs/version.d.ts +2 -0
  45. package/dist/cjs/version.d.ts.map +1 -0
  46. package/dist/cjs/version.js +5 -0
  47. package/dist/cjs/version.js.map +1 -0
  48. package/dist/esm/batch.d.ts +12 -0
  49. package/dist/esm/batch.d.ts.map +1 -0
  50. package/dist/esm/batch.js +128 -0
  51. package/dist/esm/batch.js.map +1 -0
  52. package/dist/esm/cache.d.ts +21 -0
  53. package/dist/esm/cache.d.ts.map +1 -0
  54. package/dist/esm/cache.js +106 -0
  55. package/dist/esm/cache.js.map +1 -0
  56. package/dist/esm/client.d.ts +38 -0
  57. package/dist/esm/client.d.ts.map +1 -0
  58. package/dist/esm/client.js +138 -0
  59. package/dist/esm/client.js.map +1 -0
  60. package/dist/esm/errors.d.ts +53 -0
  61. package/dist/esm/errors.d.ts.map +1 -0
  62. package/dist/esm/errors.js +106 -0
  63. package/dist/esm/errors.js.map +1 -0
  64. package/dist/esm/index.d.ts +8 -0
  65. package/dist/esm/index.d.ts.map +1 -0
  66. package/dist/esm/index.js +6 -0
  67. package/dist/esm/index.js.map +1 -0
  68. package/dist/esm/models.d.ts +1735 -0
  69. package/dist/esm/models.d.ts.map +1 -0
  70. package/dist/esm/models.js +384 -0
  71. package/dist/esm/models.js.map +1 -0
  72. package/dist/esm/result.d.ts +23 -0
  73. package/dist/esm/result.d.ts.map +1 -0
  74. package/dist/esm/result.js +45 -0
  75. package/dist/esm/result.js.map +1 -0
  76. package/dist/esm/runtime.d.ts +53 -0
  77. package/dist/esm/runtime.d.ts.map +1 -0
  78. package/dist/esm/runtime.js +226 -0
  79. package/dist/esm/runtime.js.map +1 -0
  80. package/dist/esm/stores.d.ts +143 -0
  81. package/dist/esm/stores.d.ts.map +1 -0
  82. package/dist/esm/stores.js +190 -0
  83. package/dist/esm/stores.js.map +1 -0
  84. package/dist/esm/validation.d.ts +65 -0
  85. package/dist/esm/validation.d.ts.map +1 -0
  86. package/dist/esm/validation.js +109 -0
  87. package/dist/esm/validation.js.map +1 -0
  88. package/dist/esm/version.d.ts +2 -0
  89. package/dist/esm/version.d.ts.map +1 -0
  90. package/dist/esm/version.js +2 -0
  91. package/dist/esm/version.js.map +1 -0
  92. package/package.json +74 -0
  93. package/src/batch.ts +158 -0
  94. package/src/cache.ts +123 -0
  95. package/src/client.ts +199 -0
  96. package/src/errors.ts +120 -0
  97. package/src/index.ts +17 -0
  98. package/src/models.ts +570 -0
  99. package/src/package.json +3 -0
  100. package/src/result.ts +49 -0
  101. package/src/runtime.ts +255 -0
  102. package/src/stores.ts +206 -0
  103. package/src/validation.ts +140 -0
  104. package/src/version.ts +1 -0
@@ -0,0 +1,138 @@
1
+ import { APIError, AuthenticationError, PaymentRequiredError, TransportError, ValidationError, } from "./errors.js";
2
+ import { keyStatusSchema, parseRequest, } from "./models.js";
3
+ import { Result } from "./result.js";
4
+ import { DEFAULT_BASE_URL, Semaphore, each, keySemaphore, requestWithRetries, } from "./runtime.js";
5
+ import { timeoutSeconds } from "./validation.js";
6
+ function checkArgs(options) {
7
+ for (const [name, value] of [
8
+ ["attempts", options.attempts ?? 5],
9
+ ["concurrency", options.concurrency ?? 1],
10
+ ])
11
+ if (!Number.isSafeInteger(value) || value < 1)
12
+ throw new RangeError(`${name} must be a positive integer`);
13
+ const timeout = options.timeout ?? 120;
14
+ if (typeof timeout !== "number" ||
15
+ !Number.isFinite(timeout) ||
16
+ timeout <= 0 ||
17
+ timeout * 1000 > 2 ** 31 - 1)
18
+ throw new RangeError("timeout must be a finite positive number of seconds within the timer range");
19
+ if (options.requestTimeout !== undefined && !timeoutSeconds.safeParse(options.requestTimeout).success)
20
+ throw new RangeError("requestTimeout must be a finite number greater than 0 and at most 90");
21
+ if (options.useCache && !options.batched)
22
+ throw new RangeError("useCache requires batched: true");
23
+ }
24
+ function runtimeOptions(options) {
25
+ const apiKey = (options.apiKey || process.env.LITESCRAPE_API_KEY || "").trim();
26
+ if (!apiKey)
27
+ throw new AuthenticationError("Pass apiKey or set the LITESCRAPE_API_KEY environment variable.", {
28
+ statusCode: null,
29
+ errorCode: "missing_api_key",
30
+ });
31
+ const url = new URL(options.baseUrl || process.env.LITESCRAPE_API_URL || DEFAULT_BASE_URL);
32
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.search || url.hash)
33
+ throw new TypeError("baseUrl must be an HTTP(S) URL without credentials, a query, or a fragment");
34
+ return {
35
+ apiKey,
36
+ baseUrl: url.toString().replace(/\/+$/, ""),
37
+ attempts: options.attempts ?? 5,
38
+ timeout: options.timeout ?? 120,
39
+ fetch: options.fetch ?? globalThis.fetch,
40
+ signal: options.signal,
41
+ };
42
+ }
43
+ async function fetchStatus(options) {
44
+ const outcome = await requestWithRetries("/api/keys/status", options);
45
+ if (outcome.error)
46
+ throw outcome.error;
47
+ const status = keyStatusSchema.safeParse({ ...outcome.data, request_id: outcome.requestId });
48
+ if (!status.success)
49
+ throw new TransportError(`Unexpected key status body: ${status.error.message}`, {
50
+ retryable: false,
51
+ cause: status.error,
52
+ });
53
+ return status.data;
54
+ }
55
+ /** Read the key's balance and limits. This endpoint is not billed. */
56
+ export async function keyStatus(options = {}) {
57
+ checkArgs(options);
58
+ options.signal?.throwIfAborted();
59
+ return fetchStatus(runtimeOptions(options));
60
+ }
61
+ /** Validate all inputs first, then return one Result per input, in input order. */
62
+ export async function scrape(requests, options = {}) {
63
+ checkArgs(options);
64
+ options.signal?.throwIfAborted();
65
+ if (!Array.isArray(requests))
66
+ throw new TypeError("requests must be an array");
67
+ const problems = [];
68
+ const items = [];
69
+ for (const [index, input] of requests.entries()) {
70
+ try {
71
+ let item = parseRequest(input);
72
+ if (item.timeout == null && options.requestTimeout !== undefined)
73
+ item = item.withTimeout(options.requestTimeout);
74
+ items.push(item);
75
+ }
76
+ catch (error) {
77
+ if (!(error instanceof ValidationError))
78
+ throw error;
79
+ problems.push([index, error.problems.map(([, message]) => message).join("; ")]);
80
+ }
81
+ }
82
+ if (problems.length)
83
+ throw new ValidationError(problems);
84
+ if (!items.length)
85
+ return [];
86
+ const context = runtimeOptions(options);
87
+ let completed = 0;
88
+ const onResult = (result) => options.onProgress?.(++completed, items.length, result);
89
+ if (options.batched) {
90
+ const { runBatch } = await import("./batch.js");
91
+ return runBatch(items, {
92
+ ...context,
93
+ concurrency: options.concurrency,
94
+ useCache: options.useCache ?? false,
95
+ cachePath: options.cachePath,
96
+ onResult,
97
+ });
98
+ }
99
+ const status = await fetchStatus(context);
100
+ if (status.remaining_calls < items.length)
101
+ throw new PaymentRequiredError(`This batch needs ${items.length} calls but the key has ${status.remaining_calls} remaining.`, { statusCode: 402, errorCode: "payment_required", requestId: status.request_id });
102
+ const keyLimit = Math.max(1, status.concurrency_limit || 25);
103
+ const limit = Math.min(keyLimit, options.concurrency ?? keyLimit);
104
+ const shared = keySemaphore(context.apiKey, context.baseUrl, keyLimit);
105
+ const semaphores = [new Semaphore(limit), shared.semaphore];
106
+ let fatal = null;
107
+ const results = new Array(items.length);
108
+ const started = performance.now();
109
+ try {
110
+ await each(items.map((_, i) => i), limit, async (index) => {
111
+ const request = items[index];
112
+ const outcome = await requestWithRetries(request.path, {
113
+ ...context,
114
+ params: request.queryParams(),
115
+ semaphores,
116
+ gate: () => fatal,
117
+ onOutcome: (outcome) => {
118
+ const error = outcome.error;
119
+ if (error instanceof APIError &&
120
+ ([401, 402].includes(error.statusCode ?? 0) || error.errorCode === "api_key_disabled"))
121
+ fatal = error;
122
+ },
123
+ });
124
+ const result = new Result(index, request, outcome, (performance.now() - started) / 1000);
125
+ results[index] = result;
126
+ onResult(result);
127
+ });
128
+ return results;
129
+ }
130
+ finally {
131
+ shared.release();
132
+ }
133
+ }
134
+ // JavaScript is asynchronous throughout; these aliases ease migration from Python.
135
+ export const ascrape = scrape;
136
+ export const key_status = keyStatus;
137
+ export const akey_status = keyStatus;
138
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /** Base class for every error raised by the SDK. */
2
+ export declare class LitescrapeError extends Error {
3
+ constructor(message: string, options?: ErrorOptions);
4
+ }
5
+ /** All invalid input indices are reported before any HTTP request is sent. */
6
+ export declare class ValidationError extends LitescrapeError {
7
+ readonly problems: ReadonlyArray<readonly [number, string]>;
8
+ constructor(problems: ReadonlyArray<readonly [number, string]>);
9
+ }
10
+ export declare class TransportError extends LitescrapeError {
11
+ readonly retryable: boolean;
12
+ constructor(message: string, options: {
13
+ retryable: boolean;
14
+ cause?: unknown;
15
+ });
16
+ }
17
+ export interface APIErrorOptions {
18
+ statusCode: number | null;
19
+ errorCode: string;
20
+ requestId?: string;
21
+ retryable?: boolean;
22
+ body?: Record<string, unknown>;
23
+ retryAfter?: number | null;
24
+ }
25
+ export declare class APIError extends LitescrapeError {
26
+ readonly statusCode: number | null;
27
+ readonly errorCode: string;
28
+ readonly requestId: string;
29
+ readonly retryable: boolean;
30
+ readonly body: Record<string, unknown>;
31
+ /** Retry-After in seconds. */
32
+ readonly retryAfter: number | null;
33
+ constructor(message: string, options: APIErrorOptions);
34
+ get status_code(): number | null;
35
+ get error_code(): string;
36
+ get request_id(): string;
37
+ get retry_after(): number | null;
38
+ toString(): string;
39
+ }
40
+ export declare class AuthenticationError extends APIError {
41
+ }
42
+ export declare class PaymentRequiredError extends APIError {
43
+ }
44
+ export declare class NotFoundError extends APIError {
45
+ }
46
+ export declare class RateLimitError extends APIError {
47
+ }
48
+ export declare class RequestDeadlineExceededError extends APIError {
49
+ }
50
+ export declare function isObject(value: unknown): value is Record<string, unknown>;
51
+ export declare function parseRetryAfter(value: string | null): number | null;
52
+ export declare function apiError(status: number, data: unknown, headers?: Headers): APIError;
53
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,qBAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAGlD;CACF;AAED,8EAA8E;AAC9E,qBAAa,eAAgB,SAAQ,eAAe;aACtB,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAA9E,YAA4B,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAI7E;CACF;AAED,qBAAa,cAAe,SAAQ,eAAe;IACjD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAG5E;CACF;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,qBAAa,QAAS,SAAQ,eAAe;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAQpD;IAED,IAAI,WAAW,kBAEd;IACD,IAAI,UAAU,WAEb;IACD,IAAI,UAAU,WAEb;IACD,IAAI,WAAW,kBAEd;IAEQ,QAAQ,IAAI,MAAM,CAK1B;CACF;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;CAAG;AACpD,qBAAa,oBAAqB,SAAQ,QAAQ;CAAG;AACrD,qBAAa,aAAc,SAAQ,QAAQ;CAAG;AAC9C,qBAAa,cAAe,SAAQ,QAAQ;CAAG;AAC/C,qBAAa,4BAA6B,SAAQ,QAAQ;CAAG;AAE7D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAQnE;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,UAAgB,GAAG,QAAQ,CAyBzF"}
@@ -0,0 +1,106 @@
1
+ /** Base class for every error raised by the SDK. */
2
+ export class LitescrapeError extends Error {
3
+ constructor(message, options) {
4
+ super(message, options);
5
+ this.name = new.target.name;
6
+ }
7
+ }
8
+ /** All invalid input indices are reported before any HTTP request is sent. */
9
+ export class ValidationError extends LitescrapeError {
10
+ problems;
11
+ constructor(problems) {
12
+ super(`${problems.length} invalid request item(s):\n${problems.map(([i, m]) => ` [${i}] ${m}`).join("\n")}`);
13
+ this.problems = problems;
14
+ }
15
+ }
16
+ export class TransportError extends LitescrapeError {
17
+ retryable;
18
+ constructor(message, options) {
19
+ super(message, { cause: options.cause });
20
+ this.retryable = options.retryable;
21
+ }
22
+ }
23
+ export class APIError extends LitescrapeError {
24
+ statusCode;
25
+ errorCode;
26
+ requestId;
27
+ retryable;
28
+ body;
29
+ /** Retry-After in seconds. */
30
+ retryAfter;
31
+ constructor(message, options) {
32
+ super(message);
33
+ this.statusCode = options.statusCode;
34
+ this.errorCode = options.errorCode;
35
+ this.requestId = options.requestId ?? "";
36
+ this.retryable = options.retryable ?? false;
37
+ this.body = options.body ?? {};
38
+ this.retryAfter = options.retryAfter ?? null;
39
+ }
40
+ get status_code() {
41
+ return this.statusCode;
42
+ }
43
+ get error_code() {
44
+ return this.errorCode;
45
+ }
46
+ get request_id() {
47
+ return this.requestId;
48
+ }
49
+ get retry_after() {
50
+ return this.retryAfter;
51
+ }
52
+ toString() {
53
+ const details = [this.errorCode];
54
+ if (this.statusCode !== null)
55
+ details.push(`HTTP ${this.statusCode}`);
56
+ if (this.requestId)
57
+ details.push(`request ${this.requestId}`);
58
+ return `${this.message} (${details.join(", ")})`;
59
+ }
60
+ }
61
+ export class AuthenticationError extends APIError {
62
+ }
63
+ export class PaymentRequiredError extends APIError {
64
+ }
65
+ export class NotFoundError extends APIError {
66
+ }
67
+ export class RateLimitError extends APIError {
68
+ }
69
+ export class RequestDeadlineExceededError extends APIError {
70
+ }
71
+ export function isObject(value) {
72
+ return typeof value === "object" && value !== null && !Array.isArray(value);
73
+ }
74
+ export function parseRetryAfter(value) {
75
+ if (!value?.trim())
76
+ return null;
77
+ if (/^\d+$/.test(value.trim())) {
78
+ const seconds = Number(value);
79
+ return Number.isFinite(seconds) ? seconds : null;
80
+ }
81
+ const when = Date.parse(value);
82
+ return Number.isFinite(when) ? Math.max(0, (when - Date.now()) / 1000) : null;
83
+ }
84
+ export function apiError(status, data, headers = new Headers()) {
85
+ const body = isObject(data) && "error_code" in data
86
+ ? data
87
+ : {
88
+ error: isObject(data) && data.detail ? String(data.detail) : `HTTP ${status}`,
89
+ error_code: status === 404 ? "not_found" : "request_failed",
90
+ status_code: status,
91
+ request_id: headers.get("x-request-id") ?? "",
92
+ retryable: status === 429 || status >= 500,
93
+ };
94
+ const ErrorClass = status === 503 && body.error_code === "request_deadline_exceeded"
95
+ ? RequestDeadlineExceededError
96
+ : ({ 401: AuthenticationError, 402: PaymentRequiredError, 404: NotFoundError, 429: RateLimitError }[status] ?? APIError);
97
+ return new ErrorClass(String(body.error || `HTTP ${status}`), {
98
+ statusCode: status,
99
+ errorCode: String(body.error_code),
100
+ requestId: String(body.request_id || headers.get("x-request-id") || ""),
101
+ retryable: body.retryable === true,
102
+ body,
103
+ retryAfter: parseRetryAfter(headers.get("retry-after")),
104
+ });
105
+ }
106
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { scrape, ascrape, keyStatus, key_status, akey_status } from "./client.js";
2
+ export type { ClientOptions, ScrapeOptions } from "./client.js";
3
+ export { Result } from "./result.js";
4
+ export * from "./models.js";
5
+ export { LitescrapeError, ValidationError, TransportError, APIError, AuthenticationError, PaymentRequiredError, NotFoundError, RateLimitError, RequestDeadlineExceededError, } from "./errors.js";
6
+ export type { APIErrorOptions } from "./errors.js";
7
+ export { VERSION, VERSION as __version__ } from "./version.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClF,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { scrape, ascrape, keyStatus, key_status, akey_status } from "./client.js";
2
+ export { Result } from "./result.js";
3
+ export * from "./models.js";
4
+ export { LitescrapeError, ValidationError, TransportError, APIError, AuthenticationError, PaymentRequiredError, NotFoundError, RateLimitError, RequestDeadlineExceededError, } from "./errors.js";
5
+ export { VERSION, VERSION as __version__ } from "./version.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC"}