@dealcrawl/sdk 2.1.1 → 2.1.3
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.d.mts +2335 -0
- package/dist/index.d.ts +2314 -37
- package/dist/index.js +2280 -64
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2260 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +14 -7
- package/dist/client.d.ts +0 -285
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -336
- package/dist/client.js.map +0 -1
- package/dist/error.d.ts +0 -55
- package/dist/error.d.ts.map +0 -1
- package/dist/error.js +0 -128
- package/dist/error.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/resources/account.d.ts +0 -143
- package/dist/resources/account.d.ts.map +0 -1
- package/dist/resources/account.js +0 -186
- package/dist/resources/account.js.map +0 -1
- package/dist/resources/crawl.d.ts +0 -101
- package/dist/resources/crawl.d.ts.map +0 -1
- package/dist/resources/crawl.js +0 -234
- package/dist/resources/crawl.js.map +0 -1
- package/dist/resources/data.d.ts +0 -157
- package/dist/resources/data.d.ts.map +0 -1
- package/dist/resources/data.js +0 -245
- package/dist/resources/data.js.map +0 -1
- package/dist/resources/dork.d.ts +0 -104
- package/dist/resources/dork.d.ts.map +0 -1
- package/dist/resources/dork.js +0 -163
- package/dist/resources/dork.js.map +0 -1
- package/dist/resources/extract.d.ts +0 -105
- package/dist/resources/extract.d.ts.map +0 -1
- package/dist/resources/extract.js +0 -246
- package/dist/resources/extract.js.map +0 -1
- package/dist/resources/index.d.ts +0 -14
- package/dist/resources/index.d.ts.map +0 -1
- package/dist/resources/index.js +0 -14
- package/dist/resources/index.js.map +0 -1
- package/dist/resources/keys.d.ts +0 -124
- package/dist/resources/keys.d.ts.map +0 -1
- package/dist/resources/keys.js +0 -168
- package/dist/resources/keys.js.map +0 -1
- package/dist/resources/scrape.d.ts +0 -53
- package/dist/resources/scrape.d.ts.map +0 -1
- package/dist/resources/scrape.js +0 -85
- package/dist/resources/scrape.js.map +0 -1
- package/dist/resources/status.d.ts +0 -100
- package/dist/resources/status.d.ts.map +0 -1
- package/dist/resources/status.js +0 -133
- package/dist/resources/status.js.map +0 -1
- package/dist/resources/webhooks.d.ts +0 -126
- package/dist/resources/webhooks.d.ts.map +0 -1
- package/dist/resources/webhooks.js +0 -167
- package/dist/resources/webhooks.js.map +0 -1
- package/dist/types/config.d.ts +0 -45
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -10
- package/dist/types/config.js.map +0 -1
- package/dist/types/index.d.ts +0 -8
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -8
- package/dist/types/index.js.map +0 -1
- package/dist/types/options.d.ts +0 -328
- package/dist/types/options.d.ts.map +0 -1
- package/dist/types/options.js +0 -6
- package/dist/types/options.js.map +0 -1
- package/dist/types/responses.d.ts +0 -422
- package/dist/types/responses.d.ts.map +0 -1
- package/dist/types/responses.js +0 -6
- package/dist/types/responses.js.map +0 -1
- package/dist/types/shared.d.ts +0 -234
- package/dist/types/shared.d.ts.map +0 -1
- package/dist/types/shared.js +0 -37
- package/dist/types/shared.js.map +0 -1
- package/dist/utils/polling.d.ts +0 -57
- package/dist/utils/polling.d.ts.map +0 -1
- package/dist/utils/polling.js +0 -110
- package/dist/utils/polling.js.map +0 -1
- package/dist/utils/request.d.ts +0 -47
- package/dist/utils/request.d.ts.map +0 -1
- package/dist/utils/request.js +0 -192
- package/dist/utils/request.js.map +0 -1
package/dist/types/shared.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Types imported from @dealcrawl/shared
|
|
3
|
-
* Bundled here to make SDK self-contained (no external dependency)
|
|
4
|
-
*/
|
|
5
|
-
// ============================================
|
|
6
|
-
// ERROR CODES
|
|
7
|
-
// ============================================
|
|
8
|
-
export const ERROR_CODES = {
|
|
9
|
-
// Authentication
|
|
10
|
-
INVALID_API_KEY: "INVALID_API_KEY",
|
|
11
|
-
MISSING_API_KEY: "MISSING_API_KEY",
|
|
12
|
-
API_KEY_EXPIRED: "API_KEY_EXPIRED",
|
|
13
|
-
ACCOUNT_SUSPENDED: "ACCOUNT_SUSPENDED",
|
|
14
|
-
// Rate limiting
|
|
15
|
-
RATE_LIMIT_EXCEEDED: "RATE_LIMIT_EXCEEDED",
|
|
16
|
-
QUOTA_EXCEEDED: "QUOTA_EXCEEDED",
|
|
17
|
-
// Validation
|
|
18
|
-
INVALID_URL: "INVALID_URL",
|
|
19
|
-
INVALID_REQUEST: "INVALID_REQUEST",
|
|
20
|
-
MISSING_REQUIRED_FIELD: "MISSING_REQUIRED_FIELD",
|
|
21
|
-
// Job errors
|
|
22
|
-
JOB_NOT_FOUND: "JOB_NOT_FOUND",
|
|
23
|
-
JOB_FAILED: "JOB_FAILED",
|
|
24
|
-
JOB_TIMEOUT: "JOB_TIMEOUT",
|
|
25
|
-
// Scraping errors
|
|
26
|
-
FETCH_FAILED: "FETCH_FAILED",
|
|
27
|
-
PARSE_FAILED: "PARSE_FAILED",
|
|
28
|
-
BLOCKED_BY_ROBOTS: "BLOCKED_BY_ROBOTS",
|
|
29
|
-
CAPTCHA_DETECTED: "CAPTCHA_DETECTED",
|
|
30
|
-
SITE_UNREACHABLE: "SITE_UNREACHABLE",
|
|
31
|
-
// System errors
|
|
32
|
-
INTERNAL_ERROR: "INTERNAL_ERROR",
|
|
33
|
-
SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE",
|
|
34
|
-
REDIS_ERROR: "REDIS_ERROR",
|
|
35
|
-
DATABASE_ERROR: "DATABASE_ERROR",
|
|
36
|
-
};
|
|
37
|
-
//# sourceMappingURL=shared.js.map
|
package/dist/types/shared.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/types/shared.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+CAA+C;AAC/C,cAAc;AACd,+CAA+C;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,iBAAiB;IACjB,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IAEtC,gBAAgB;IAChB,mBAAmB,EAAE,qBAAqB;IAC1C,cAAc,EAAE,gBAAgB;IAEhC,aAAa;IACb,WAAW,EAAE,aAAa;IAC1B,eAAe,EAAE,iBAAiB;IAClC,sBAAsB,EAAE,wBAAwB;IAEhD,aAAa;IACb,aAAa,EAAE,eAAe;IAC9B,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAE1B,kBAAkB;IAClB,YAAY,EAAE,cAAc;IAC5B,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IAEpC,gBAAgB;IAChB,cAAc,EAAE,gBAAgB;IAChC,mBAAmB,EAAE,qBAAqB;IAC1C,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;CACxB,CAAC"}
|
package/dist/utils/polling.d.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Polling Utilities
|
|
3
|
-
* Helpers for waiting on async job completion
|
|
4
|
-
*/
|
|
5
|
-
import type { RequestContext } from "../types/config";
|
|
6
|
-
import type { JobStatusResponse } from "../types/responses";
|
|
7
|
-
/** Options for waiting on a job */
|
|
8
|
-
export interface WaitOptions {
|
|
9
|
-
/** Polling interval in milliseconds (default: 2000) */
|
|
10
|
-
pollInterval?: number;
|
|
11
|
-
/** Maximum time to wait in milliseconds (default: 300000 = 5 minutes) */
|
|
12
|
-
timeout?: number;
|
|
13
|
-
/** Callback on each poll */
|
|
14
|
-
onProgress?: (status: JobStatusResponse) => void;
|
|
15
|
-
/** Callback on status change */
|
|
16
|
-
onStatusChange?: (newStatus: string, oldStatus: string) => void;
|
|
17
|
-
/** AbortSignal for cancellation */
|
|
18
|
-
signal?: AbortSignal;
|
|
19
|
-
}
|
|
20
|
-
/** Result of waiting for a job */
|
|
21
|
-
export interface WaitResult<T = unknown> {
|
|
22
|
-
/** Job ID */
|
|
23
|
-
jobId: string;
|
|
24
|
-
/** Final status */
|
|
25
|
-
status: "completed" | "failed";
|
|
26
|
-
/** Result data (if completed) */
|
|
27
|
-
result?: T;
|
|
28
|
-
/** Error message (if failed) */
|
|
29
|
-
error?: string;
|
|
30
|
-
/** Total time waited in ms */
|
|
31
|
-
waitTime: number;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Wait for a job to complete
|
|
35
|
-
* Polls the status endpoint until the job is done
|
|
36
|
-
*/
|
|
37
|
-
export declare function waitForResult<T = unknown>(ctx: RequestContext, jobId: string, options?: WaitOptions): Promise<WaitResult<T>>;
|
|
38
|
-
/**
|
|
39
|
-
* Wait for multiple jobs to complete
|
|
40
|
-
* Returns when all jobs are done (either completed or failed)
|
|
41
|
-
*/
|
|
42
|
-
export declare function waitForAll<T = unknown>(ctx: RequestContext, jobIds: string[], options?: WaitOptions): Promise<WaitResult<T>[]>;
|
|
43
|
-
/**
|
|
44
|
-
* Wait for any job to complete
|
|
45
|
-
* Returns as soon as one job finishes
|
|
46
|
-
*/
|
|
47
|
-
export declare function waitForAny<T = unknown>(ctx: RequestContext, jobIds: string[], options?: WaitOptions): Promise<WaitResult<T>>;
|
|
48
|
-
/**
|
|
49
|
-
* Poll with custom condition
|
|
50
|
-
* Generic polling utility
|
|
51
|
-
*/
|
|
52
|
-
export declare function pollUntil<T>(fetchFn: () => Promise<T>, conditionFn: (data: T) => boolean, options?: {
|
|
53
|
-
pollInterval?: number;
|
|
54
|
-
timeout?: number;
|
|
55
|
-
signal?: AbortSignal;
|
|
56
|
-
}): Promise<T>;
|
|
57
|
-
//# sourceMappingURL=polling.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../src/utils/polling.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAI5D,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,gCAAgC;IAChC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,mCAAmC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,kCAAkC;AAClC,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,iCAAiC;IACjC,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,CAAC,GAAG,OAAO,EAC7C,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAwExB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1C,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAG1B;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1C,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAGxB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,EACjC,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACjB,GACL,OAAO,CAAC,CAAC,CAAC,CAqBZ"}
|
package/dist/utils/polling.js
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Polling Utilities
|
|
3
|
-
* Helpers for waiting on async job completion
|
|
4
|
-
*/
|
|
5
|
-
import { DealCrawlError, ERROR_CODES } from "../error";
|
|
6
|
-
import { get } from "./request";
|
|
7
|
-
/**
|
|
8
|
-
* Wait for a job to complete
|
|
9
|
-
* Polls the status endpoint until the job is done
|
|
10
|
-
*/
|
|
11
|
-
export async function waitForResult(ctx, jobId, options = {}) {
|
|
12
|
-
const { pollInterval = 2000, timeout = 300000, // 5 minutes
|
|
13
|
-
onProgress, onStatusChange, signal, } = options;
|
|
14
|
-
const startTime = Date.now();
|
|
15
|
-
let lastStatus = null;
|
|
16
|
-
while (true) {
|
|
17
|
-
// Check for abort
|
|
18
|
-
if (signal?.aborted) {
|
|
19
|
-
throw new DealCrawlError({
|
|
20
|
-
code: ERROR_CODES.JOB_TIMEOUT,
|
|
21
|
-
message: "Wait cancelled by user",
|
|
22
|
-
statusCode: 0,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
// Check timeout
|
|
26
|
-
const elapsed = Date.now() - startTime;
|
|
27
|
-
if (elapsed >= timeout) {
|
|
28
|
-
throw new DealCrawlError({
|
|
29
|
-
code: ERROR_CODES.JOB_TIMEOUT,
|
|
30
|
-
message: `Job did not complete within ${timeout}ms`,
|
|
31
|
-
statusCode: 408,
|
|
32
|
-
details: { jobId, elapsed },
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
// Fetch status
|
|
36
|
-
const { data: status } = await get(ctx, `/v1/status/${jobId}`);
|
|
37
|
-
// Call progress callback
|
|
38
|
-
if (onProgress) {
|
|
39
|
-
onProgress(status);
|
|
40
|
-
}
|
|
41
|
-
// Call status change callback
|
|
42
|
-
if (onStatusChange && lastStatus !== null && lastStatus !== status.status) {
|
|
43
|
-
onStatusChange(status.status, lastStatus);
|
|
44
|
-
}
|
|
45
|
-
lastStatus = status.status;
|
|
46
|
-
// Check if done
|
|
47
|
-
if (status.status === "completed") {
|
|
48
|
-
return {
|
|
49
|
-
jobId,
|
|
50
|
-
status: "completed",
|
|
51
|
-
result: status.result,
|
|
52
|
-
waitTime: Date.now() - startTime,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
if (status.status === "failed") {
|
|
56
|
-
return {
|
|
57
|
-
jobId,
|
|
58
|
-
status: "failed",
|
|
59
|
-
error: status.error,
|
|
60
|
-
waitTime: Date.now() - startTime,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
// Wait before next poll
|
|
64
|
-
await sleep(pollInterval);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Wait for multiple jobs to complete
|
|
69
|
-
* Returns when all jobs are done (either completed or failed)
|
|
70
|
-
*/
|
|
71
|
-
export async function waitForAll(ctx, jobIds, options = {}) {
|
|
72
|
-
const promises = jobIds.map((jobId) => waitForResult(ctx, jobId, options));
|
|
73
|
-
return Promise.all(promises);
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Wait for any job to complete
|
|
77
|
-
* Returns as soon as one job finishes
|
|
78
|
-
*/
|
|
79
|
-
export async function waitForAny(ctx, jobIds, options = {}) {
|
|
80
|
-
const promises = jobIds.map((jobId) => waitForResult(ctx, jobId, options));
|
|
81
|
-
return Promise.race(promises);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Poll with custom condition
|
|
85
|
-
* Generic polling utility
|
|
86
|
-
*/
|
|
87
|
-
export async function pollUntil(fetchFn, conditionFn, options = {}) {
|
|
88
|
-
const { pollInterval = 2000, timeout = 300000, signal } = options;
|
|
89
|
-
const startTime = Date.now();
|
|
90
|
-
while (true) {
|
|
91
|
-
if (signal?.aborted) {
|
|
92
|
-
throw new Error("Polling cancelled");
|
|
93
|
-
}
|
|
94
|
-
if (Date.now() - startTime >= timeout) {
|
|
95
|
-
throw new Error(`Polling timeout after ${timeout}ms`);
|
|
96
|
-
}
|
|
97
|
-
const data = await fetchFn();
|
|
98
|
-
if (conditionFn(data)) {
|
|
99
|
-
return data;
|
|
100
|
-
}
|
|
101
|
-
await sleep(pollInterval);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Sleep helper
|
|
106
|
-
*/
|
|
107
|
-
function sleep(ms) {
|
|
108
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=polling.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/utils/polling.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/request.d.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import type { RateLimitInfo } from "../types/shared";
|
|
2
|
-
import type { RequestContext } from "../types/config";
|
|
3
|
-
/**
|
|
4
|
-
* Request options for the HTTP helper
|
|
5
|
-
*/
|
|
6
|
-
export interface RequestOptions {
|
|
7
|
-
/** HTTP method */
|
|
8
|
-
method?: "GET" | "POST" | "PATCH" | "DELETE";
|
|
9
|
-
/** Request body (will be JSON stringified) */
|
|
10
|
-
body?: unknown;
|
|
11
|
-
/** Query parameters */
|
|
12
|
-
query?: Record<string, string | number | boolean | undefined>;
|
|
13
|
-
/** Request timeout in milliseconds (overrides default) */
|
|
14
|
-
timeout?: number;
|
|
15
|
-
/** AbortSignal for request cancellation */
|
|
16
|
-
signal?: AbortSignal;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Response wrapper with rate limit info
|
|
20
|
-
*/
|
|
21
|
-
export interface RequestResult<T> {
|
|
22
|
-
/** Response data */
|
|
23
|
-
data: T;
|
|
24
|
-
/** Rate limit information from headers */
|
|
25
|
-
rateLimit: RateLimitInfo;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Make an HTTP request with authentication, error handling, and retries
|
|
29
|
-
*/
|
|
30
|
-
export declare function request<T>(ctx: RequestContext, path: string, options?: RequestOptions): Promise<RequestResult<T>>;
|
|
31
|
-
/**
|
|
32
|
-
* Convenience method for GET requests
|
|
33
|
-
*/
|
|
34
|
-
export declare function get<T>(ctx: RequestContext, path: string, query?: Record<string, string | number | boolean | undefined>): Promise<RequestResult<T>>;
|
|
35
|
-
/**
|
|
36
|
-
* Convenience method for POST requests
|
|
37
|
-
*/
|
|
38
|
-
export declare function post<T>(ctx: RequestContext, path: string, body?: unknown): Promise<RequestResult<T>>;
|
|
39
|
-
/**
|
|
40
|
-
* Convenience method for PATCH requests
|
|
41
|
-
*/
|
|
42
|
-
export declare function patch<T>(ctx: RequestContext, path: string, body?: unknown): Promise<RequestResult<T>>;
|
|
43
|
-
/**
|
|
44
|
-
* Convenience method for DELETE requests
|
|
45
|
-
*/
|
|
46
|
-
export declare function del<T>(ctx: RequestContext, path: string, body?: unknown): Promise<RequestResult<T>>;
|
|
47
|
-
//# sourceMappingURL=request.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/utils/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAE7C,8CAA8C;IAC9C,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAE9D,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,oBAAoB;IACpB,IAAI,EAAE,CAAC,CAAC;IAER,0CAA0C;IAC1C,SAAS,EAAE,aAAa,CAAC;CAC1B;AAoCD;;GAEG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAC7B,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CA4K3B;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EACnB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC5D,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAE3B;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,EACpB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAE3B;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAE3B;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EACnB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAE3B"}
|
package/dist/utils/request.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { DealCrawlError, ERROR_CODES } from "../error";
|
|
2
|
-
/**
|
|
3
|
-
* Build query string from object
|
|
4
|
-
*/
|
|
5
|
-
function buildQueryString(params) {
|
|
6
|
-
const entries = Object.entries(params)
|
|
7
|
-
.filter(([, value]) => value !== undefined)
|
|
8
|
-
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
|
|
9
|
-
return entries.length > 0 ? `?${entries.join("&")}` : "";
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Parse rate limit headers from response
|
|
13
|
-
*/
|
|
14
|
-
function parseRateLimitHeaders(headers) {
|
|
15
|
-
return {
|
|
16
|
-
limit: parseInt(headers.get("X-RateLimit-Limit") || "0", 10) || 0,
|
|
17
|
-
remaining: parseInt(headers.get("X-RateLimit-Remaining") || "0", 10) || 0,
|
|
18
|
-
reset: parseInt(headers.get("X-RateLimit-Reset") || "0", 10) || 0,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Sleep helper for retries
|
|
23
|
-
*/
|
|
24
|
-
function sleep(ms) {
|
|
25
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Make an HTTP request with authentication, error handling, and retries
|
|
29
|
-
*/
|
|
30
|
-
export async function request(ctx, path, options = {}) {
|
|
31
|
-
const { method = "GET", body, query, timeout, signal } = options;
|
|
32
|
-
// Build URL with query string
|
|
33
|
-
const queryString = query ? buildQueryString(query) : "";
|
|
34
|
-
const url = `${ctx.baseUrl}${path}${queryString}`;
|
|
35
|
-
const timeoutMs = timeout ?? ctx.timeout;
|
|
36
|
-
// Track current controller for external signal handling
|
|
37
|
-
let currentController = null;
|
|
38
|
-
// Named handler for external abort signal
|
|
39
|
-
const onAbort = () => {
|
|
40
|
-
if (currentController) {
|
|
41
|
-
currentController.abort();
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
// Attach external signal listener once (if provided)
|
|
45
|
-
if (signal) {
|
|
46
|
-
signal.addEventListener("abort", onAbort);
|
|
47
|
-
}
|
|
48
|
-
// Cleanup external signal listener (called at end of all retries)
|
|
49
|
-
const cleanupExternalSignal = () => {
|
|
50
|
-
if (signal) {
|
|
51
|
-
signal.removeEventListener("abort", onAbort);
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
let lastError = null;
|
|
55
|
-
let attempt = 0;
|
|
56
|
-
while (attempt <= ctx.maxRetries) {
|
|
57
|
-
// Create a new AbortController and timeout for each attempt
|
|
58
|
-
const controller = new AbortController();
|
|
59
|
-
currentController = controller;
|
|
60
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
61
|
-
// Cleanup function for this specific attempt - idempotent
|
|
62
|
-
let attemptCleanupDone = false;
|
|
63
|
-
const cleanupAttempt = () => {
|
|
64
|
-
if (attemptCleanupDone)
|
|
65
|
-
return;
|
|
66
|
-
attemptCleanupDone = true;
|
|
67
|
-
clearTimeout(timeoutId);
|
|
68
|
-
currentController = null;
|
|
69
|
-
};
|
|
70
|
-
try {
|
|
71
|
-
const response = await fetch(url, {
|
|
72
|
-
method,
|
|
73
|
-
headers: {
|
|
74
|
-
"Content-Type": "application/json",
|
|
75
|
-
Authorization: `Bearer ${ctx.apiKey}`,
|
|
76
|
-
},
|
|
77
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
78
|
-
signal: controller.signal,
|
|
79
|
-
});
|
|
80
|
-
cleanupAttempt();
|
|
81
|
-
// Parse rate limit headers
|
|
82
|
-
const rateLimit = parseRateLimitHeaders(response.headers);
|
|
83
|
-
// Handle rate limiting
|
|
84
|
-
if (response.status === 429) {
|
|
85
|
-
const retryAfter = parseInt(response.headers.get("Retry-After") || "60", 10);
|
|
86
|
-
// Notify callback
|
|
87
|
-
if (ctx.onRateLimit) {
|
|
88
|
-
ctx.onRateLimit(rateLimit);
|
|
89
|
-
}
|
|
90
|
-
throw new DealCrawlError({
|
|
91
|
-
code: ERROR_CODES.RATE_LIMIT_EXCEEDED,
|
|
92
|
-
message: "Rate limit exceeded",
|
|
93
|
-
statusCode: 429,
|
|
94
|
-
retryAfter,
|
|
95
|
-
details: { rateLimit },
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
// Handle errors
|
|
99
|
-
if (!response.ok) {
|
|
100
|
-
let errorBody = {};
|
|
101
|
-
try {
|
|
102
|
-
errorBody = (await response.json());
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
// Response might not be JSON
|
|
106
|
-
}
|
|
107
|
-
// Extract Retry-After header if present
|
|
108
|
-
const retryAfterHeader = response.headers.get("Retry-After");
|
|
109
|
-
throw DealCrawlError.fromResponse(response.status, errorBody, retryAfterHeader);
|
|
110
|
-
}
|
|
111
|
-
// Parse response
|
|
112
|
-
let data;
|
|
113
|
-
const contentType = response.headers.get("Content-Type") || "";
|
|
114
|
-
if (contentType.includes("application/json")) {
|
|
115
|
-
data = (await response.json());
|
|
116
|
-
}
|
|
117
|
-
else if (contentType.includes("text/csv") ||
|
|
118
|
-
contentType.includes("text/plain")) {
|
|
119
|
-
data = (await response.text());
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
data = (await response.json());
|
|
123
|
-
}
|
|
124
|
-
cleanupExternalSignal();
|
|
125
|
-
return { data, rateLimit };
|
|
126
|
-
}
|
|
127
|
-
catch (error) {
|
|
128
|
-
cleanupAttempt();
|
|
129
|
-
// Handle abort/timeout
|
|
130
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
131
|
-
cleanupExternalSignal();
|
|
132
|
-
throw new DealCrawlError({
|
|
133
|
-
code: ERROR_CODES.JOB_TIMEOUT,
|
|
134
|
-
message: `Request timeout after ${timeoutMs}ms`,
|
|
135
|
-
statusCode: 408,
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
// Handle DealCrawlError
|
|
139
|
-
if (error instanceof DealCrawlError) {
|
|
140
|
-
lastError = error;
|
|
141
|
-
// Retry if error is retryable and we have attempts left
|
|
142
|
-
if (error.isRetryable() && attempt < ctx.maxRetries) {
|
|
143
|
-
attempt++;
|
|
144
|
-
await sleep(ctx.retryDelay * attempt); // Exponential backoff
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
147
|
-
cleanupExternalSignal();
|
|
148
|
-
throw error;
|
|
149
|
-
}
|
|
150
|
-
// Handle network errors
|
|
151
|
-
cleanupExternalSignal();
|
|
152
|
-
throw new DealCrawlError({
|
|
153
|
-
code: ERROR_CODES.FETCH_FAILED,
|
|
154
|
-
message: error instanceof Error ? error.message : "Network request failed",
|
|
155
|
-
statusCode: 0,
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
// Should not reach here, but throw last error if we do
|
|
160
|
-
cleanupExternalSignal();
|
|
161
|
-
throw (lastError ??
|
|
162
|
-
new DealCrawlError({
|
|
163
|
-
code: ERROR_CODES.INTERNAL_ERROR,
|
|
164
|
-
message: "Request failed after retries",
|
|
165
|
-
statusCode: 500,
|
|
166
|
-
}));
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Convenience method for GET requests
|
|
170
|
-
*/
|
|
171
|
-
export function get(ctx, path, query) {
|
|
172
|
-
return request(ctx, path, { method: "GET", query });
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Convenience method for POST requests
|
|
176
|
-
*/
|
|
177
|
-
export function post(ctx, path, body) {
|
|
178
|
-
return request(ctx, path, { method: "POST", body });
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Convenience method for PATCH requests
|
|
182
|
-
*/
|
|
183
|
-
export function patch(ctx, path, body) {
|
|
184
|
-
return request(ctx, path, { method: "PATCH", body });
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Convenience method for DELETE requests
|
|
188
|
-
*/
|
|
189
|
-
export function del(ctx, path, body) {
|
|
190
|
-
return request(ctx, path, { method: "DELETE", body });
|
|
191
|
-
}
|
|
192
|
-
//# sourceMappingURL=request.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/utils/request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAkCvD;;GAEG;AACH,SAAS,gBAAgB,CACvB,MAA6D;IAE7D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACnC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;SAC1C,GAAG,CACF,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CACf,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CACpE,CAAC;IAEJ,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,OAAgB;IAC7C,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;QACjE,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;QACzE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;KAClE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAmB,EACnB,IAAY,EACZ,UAA0B,EAAE;IAE5B,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEjE,8BAA8B;IAC9B,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,WAAW,EAAE,CAAC;IAElD,MAAM,SAAS,GAAG,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC;IAEzC,wDAAwD;IACxD,IAAI,iBAAiB,GAA2B,IAAI,CAAC;IAErD,0CAA0C;IAC1C,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,iBAAiB,EAAE,CAAC;YACtB,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,qDAAqD;IACrD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,kEAAkE;IAClE,MAAM,qBAAqB,GAAG,GAAG,EAAE;QACjC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,SAAS,GAA0B,IAAI,CAAC;IAC5C,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,OAAO,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACjC,4DAA4D;QAC5D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,iBAAiB,GAAG,UAAU,CAAC;QAE/B,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAElE,0DAA0D;QAC1D,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,IAAI,kBAAkB;gBAAE,OAAO;YAC/B,kBAAkB,GAAG,IAAI,CAAC;YAC1B,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,iBAAiB,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM;gBACN,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE;iBACtC;gBACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,cAAc,EAAE,CAAC;YAEjB,2BAA2B;YAC3B,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAE1D,uBAAuB;YACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,UAAU,GAAG,QAAQ,CACzB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,EAC3C,EAAE,CACH,CAAC;gBAEF,kBAAkB;gBAClB,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;oBACpB,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBAC7B,CAAC;gBAED,MAAM,IAAI,cAAc,CAAC;oBACvB,IAAI,EAAE,WAAW,CAAC,mBAAmB;oBACrC,OAAO,EAAE,qBAAqB;oBAC9B,UAAU,EAAE,GAAG;oBACf,UAAU;oBACV,OAAO,EAAE,EAAE,SAAS,EAAE;iBACvB,CAAC,CAAC;YACL,CAAC;YAED,gBAAgB;YAChB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,IAAI,SAAS,GAA4B,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;gBACjE,CAAC;gBAAC,MAAM,CAAC;oBACP,6BAA6B;gBAC/B,CAAC;gBAED,wCAAwC;gBACxC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBAE7D,MAAM,cAAc,CAAC,YAAY,CAC/B,QAAQ,CAAC,MAAM,EACf,SAAS,EACT,gBAAgB,CACjB,CAAC;YACJ,CAAC;YAED,iBAAiB;YACjB,IAAI,IAAO,CAAC;YACZ,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAE/D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC7C,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;YACtC,CAAC;iBAAM,IACL,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAChC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAClC,CAAC;gBACD,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;YACtC,CAAC;YAED,qBAAqB,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,EAAE,CAAC;YAEjB,uBAAuB;YACvB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1D,qBAAqB,EAAE,CAAC;gBACxB,MAAM,IAAI,cAAc,CAAC;oBACvB,IAAI,EAAE,WAAW,CAAC,WAAW;oBAC7B,OAAO,EAAE,yBAAyB,SAAS,IAAI;oBAC/C,UAAU,EAAE,GAAG;iBAChB,CAAC,CAAC;YACL,CAAC;YAED,wBAAwB;YACxB,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;gBACpC,SAAS,GAAG,KAAK,CAAC;gBAElB,wDAAwD;gBACxD,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;oBACpD,OAAO,EAAE,CAAC;oBACV,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,sBAAsB;oBAC7D,SAAS;gBACX,CAAC;gBAED,qBAAqB,EAAE,CAAC;gBACxB,MAAM,KAAK,CAAC;YACd,CAAC;YAED,wBAAwB;YACxB,qBAAqB,EAAE,CAAC;YACxB,MAAM,IAAI,cAAc,CAAC;gBACvB,IAAI,EAAE,WAAW,CAAC,YAAY;gBAC9B,OAAO,EACL,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;gBACnE,UAAU,EAAE,CAAC;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,qBAAqB,EAAE,CAAC;IACxB,MAAM,CACJ,SAAS;QACT,IAAI,cAAc,CAAC;YACjB,IAAI,EAAE,WAAW,CAAC,cAAc;YAChC,OAAO,EAAE,8BAA8B;YACvC,UAAU,EAAE,GAAG;SAChB,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,GAAmB,EACnB,IAAY,EACZ,KAA6D;IAE7D,OAAO,OAAO,CAAI,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,GAAmB,EACnB,IAAY,EACZ,IAAc;IAEd,OAAO,OAAO,CAAI,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CACnB,GAAmB,EACnB,IAAY,EACZ,IAAc;IAEd,OAAO,OAAO,CAAI,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,GAAmB,EACnB,IAAY,EACZ,IAAc;IAEd,OAAO,OAAO,CAAI,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3D,CAAC"}
|