@pipe0/client 0.0.39 → 0.0.41
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/CHANGELOG.md +13 -0
- package/dist/generated/openapi.types.d.mts +680 -608
- package/dist/generated/openapi.types.d.mts.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/pipe0.d.mts +104 -41
- package/dist/pipe0.d.mts.map +1 -1
- package/dist/pipe0.mjs +91 -2
- package/dist/pipe0.mjs.map +1 -1
- package/package.json +1 -1
package/dist/pipe0.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { paths } from "./generated/openapi.types.mjs";
|
|
1
|
+
import { components, paths } from "./generated/openapi.types.mjs";
|
|
2
2
|
import { Client } from "openapi-fetch";
|
|
3
3
|
|
|
4
4
|
//#region src/pipe0.d.ts
|
|
@@ -53,6 +53,59 @@ interface BatchOptions {
|
|
|
53
53
|
*/
|
|
54
54
|
signal?: AbortSignal;
|
|
55
55
|
}
|
|
56
|
+
interface SearchAllItem {
|
|
57
|
+
/** The search payload (`search_id` + `config`), same shape as `searches.search`. */
|
|
58
|
+
search: SearchRequest["search"];
|
|
59
|
+
/**
|
|
60
|
+
* Max pages to fetch for this search. Pagination is auto-detected from each
|
|
61
|
+
* response's `next_page`, so cursor- and page-number-based searches both work.
|
|
62
|
+
* @default the call-level `maxPages`
|
|
63
|
+
*/
|
|
64
|
+
maxPages?: number;
|
|
65
|
+
}
|
|
66
|
+
interface SearchAllOptions {
|
|
67
|
+
/** Searches to run concurrently. Results are merged into one array. */
|
|
68
|
+
searches: SearchAllItem[];
|
|
69
|
+
/** Shared request config (e.g. `{ environment }`) applied to every search. */
|
|
70
|
+
config?: SearchRequest["config"];
|
|
71
|
+
/**
|
|
72
|
+
* Field names to dedupe the merged results by, compared on each field's
|
|
73
|
+
* resolved `.value`. Multiple fields form a composite key; first match wins.
|
|
74
|
+
* Rows missing any key field are kept as-is (never deduped away).
|
|
75
|
+
*/
|
|
76
|
+
dedupeBy?: string[];
|
|
77
|
+
/**
|
|
78
|
+
* Default max pages per search when an item doesn't set its own. Pass
|
|
79
|
+
* `Infinity` to fetch every page until the server reports no `next_page`.
|
|
80
|
+
* @default 1
|
|
81
|
+
*/
|
|
82
|
+
maxPages?: number;
|
|
83
|
+
/**
|
|
84
|
+
* Normalize the merged results to a single shape: every row gets the union of
|
|
85
|
+
* all field names seen across every search, with absent fields set to `null`
|
|
86
|
+
* (e.g. so `crustdata_company_match` / `amplemarket_company_match` both exist
|
|
87
|
+
* on every row). @default true
|
|
88
|
+
*/
|
|
89
|
+
normalize?: boolean;
|
|
90
|
+
/** Max searches to run at once. @default maxConcurrentBatches */
|
|
91
|
+
maxConcurrency?: number;
|
|
92
|
+
/** AbortSignal to cancel all searches. */
|
|
93
|
+
signal?: AbortSignal;
|
|
94
|
+
/**
|
|
95
|
+
* Throw on the first search error. When `false`, failed searches are collected
|
|
96
|
+
* in `errors` and partial results are returned. @default true
|
|
97
|
+
*/
|
|
98
|
+
stopOnError?: boolean;
|
|
99
|
+
}
|
|
100
|
+
interface SearchAllResult {
|
|
101
|
+
/** Merged (and optionally deduped) results across every search and page. */
|
|
102
|
+
results: SearchResponse["results"];
|
|
103
|
+
/** Per-search failures, populated only when `stopOnError` is `false`. */
|
|
104
|
+
errors: Array<{
|
|
105
|
+
searchIndex: number;
|
|
106
|
+
error: Error;
|
|
107
|
+
}>;
|
|
108
|
+
}
|
|
56
109
|
interface Pipe0Options {
|
|
57
110
|
apiKey?: string;
|
|
58
111
|
baseUrl?: string;
|
|
@@ -175,10 +228,10 @@ declare class Pipe0 {
|
|
|
175
228
|
};
|
|
176
229
|
waterfall?: {
|
|
177
230
|
attempted_providers: {
|
|
178
|
-
provider: "pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket";
|
|
231
|
+
provider: "pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket" | "parallel";
|
|
179
232
|
}[];
|
|
180
|
-
available_providers: ("pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket")[];
|
|
181
|
-
successful_provider?: "pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket";
|
|
233
|
+
available_providers: ("pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket" | "parallel")[];
|
|
234
|
+
successful_provider?: "pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket" | "parallel";
|
|
182
235
|
};
|
|
183
236
|
icon?: {
|
|
184
237
|
key: "linkedin" | "job";
|
|
@@ -229,21 +282,27 @@ declare class Pipe0 {
|
|
|
229
282
|
/**
|
|
230
283
|
* Create and immediately wait for completion (convenience method)
|
|
231
284
|
*/
|
|
232
|
-
search: (payload:
|
|
233
|
-
onPoll?: (_response:
|
|
285
|
+
search: (payload: SearchRequest, options?: {
|
|
286
|
+
onPoll?: (_response: SearchResponse) => unknown;
|
|
234
287
|
signal?: AbortSignal;
|
|
235
|
-
}) => Promise<
|
|
288
|
+
}) => Promise<SearchResponse>;
|
|
236
289
|
/**
|
|
237
290
|
* Create a searches task but don't wait for it.
|
|
238
291
|
* Use this if you want fire and forget.
|
|
239
292
|
*/
|
|
240
|
-
create: (payload:
|
|
293
|
+
create: (payload: SearchRequest) => Promise<string>;
|
|
241
294
|
/**
|
|
242
295
|
* Check the status of a search task manually.
|
|
243
296
|
*/
|
|
244
297
|
check: (runId: string) => Promise<{
|
|
245
298
|
id: string;
|
|
246
299
|
status: "completed" | "failed" | "pending" | "processing";
|
|
300
|
+
search_id: "companies:profiles:crustdata@1" | "companies:profiles:crustdata@2" | "companies:profiles:amplemarket@1" | "companies:profiles:amplemarket@2" | "people:profiles:crustdata@1" | "people:profiles:crustdata@2" | "people:profiles:amplemarket@1" | "people:profiles:amplemarket@2";
|
|
301
|
+
errors: {
|
|
302
|
+
code: string;
|
|
303
|
+
message: string;
|
|
304
|
+
path?: string;
|
|
305
|
+
}[];
|
|
247
306
|
results: {
|
|
248
307
|
[key: string]: {
|
|
249
308
|
value: string | number | boolean | null | {
|
|
@@ -275,10 +334,10 @@ declare class Pipe0 {
|
|
|
275
334
|
};
|
|
276
335
|
waterfall?: {
|
|
277
336
|
attempted_providers: {
|
|
278
|
-
provider: "pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket";
|
|
337
|
+
provider: "pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket" | "parallel";
|
|
279
338
|
}[];
|
|
280
|
-
available_providers: ("pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket")[];
|
|
281
|
-
successful_provider?: "pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket";
|
|
339
|
+
available_providers: ("pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket" | "parallel")[];
|
|
340
|
+
successful_provider?: "pipe0" | "findymail" | "crustdata" | "hunter" | "zerobounce" | "millionverifier" | "googlemaps" | "gemini" | "leadmagic" | "mixrank" | "builtwith" | "perplexity" | "serper" | "icypeas" | "prospeo" | "clado" | "resend" | "slack" | "gmail" | "firecrawl" | "exa" | "openai" | "companyenrich" | "logodev" | "amplemarket" | "parallel";
|
|
282
341
|
};
|
|
283
342
|
icon?: {
|
|
284
343
|
key: "linkedin" | "job";
|
|
@@ -299,44 +358,48 @@ declare class Pipe0 {
|
|
|
299
358
|
};
|
|
300
359
|
} | null;
|
|
301
360
|
}[];
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
status: "pending" | "processing" | "failed" | "completed";
|
|
307
|
-
errors: {
|
|
308
|
-
code: string;
|
|
309
|
-
message: string;
|
|
310
|
-
path?: string;
|
|
311
|
-
}[];
|
|
312
|
-
meta: {
|
|
313
|
-
providers?: {
|
|
314
|
-
clado?: {
|
|
315
|
-
pagination: {
|
|
316
|
-
search_id?: string;
|
|
317
|
-
offset?: number;
|
|
318
|
-
};
|
|
319
|
-
};
|
|
320
|
-
crustdata?: {
|
|
321
|
-
pagination: {
|
|
322
|
-
cursor: string | null;
|
|
323
|
-
};
|
|
324
|
-
};
|
|
325
|
-
};
|
|
326
|
-
};
|
|
327
|
-
}[];
|
|
328
|
-
organizationId: string;
|
|
361
|
+
organization_id: string;
|
|
362
|
+
next_page: components["schemas"]["SearchPayloadSchema"];
|
|
363
|
+
pagination_type: "cursor" | "page_number" | null;
|
|
364
|
+
total_pages: number | null;
|
|
329
365
|
}>;
|
|
330
366
|
/**
|
|
331
367
|
* Poll until the search completes or fails.
|
|
332
368
|
*/
|
|
333
369
|
waitUntilComplete: (runId: string | Promise<string>, options?: {
|
|
334
|
-
onPoll?: (_response:
|
|
370
|
+
onPoll?: (_response: SearchResponse) => unknown;
|
|
335
371
|
signal?: AbortSignal;
|
|
336
|
-
}) => Promise<
|
|
372
|
+
}) => Promise<SearchResponse>;
|
|
373
|
+
/**
|
|
374
|
+
* Run several searches concurrently, auto-paginate each, and return one merged
|
|
375
|
+
* (optionally deduped) result set. Pagination is detected from each response's
|
|
376
|
+
* `next_page` token — which is itself a ready-to-send payload — so cursor- and
|
|
377
|
+
* page-number-based searches are handled transparently.
|
|
378
|
+
*
|
|
379
|
+
* @example
|
|
380
|
+
* const { results } = await pipe0.searches.searchAll({
|
|
381
|
+
* config: { environment: "production" },
|
|
382
|
+
* dedupeBy: ["company_domain"],
|
|
383
|
+
* maxPages: 3,
|
|
384
|
+
* searches: [
|
|
385
|
+
* { search: { search_id: "companies:profiles:crustdata@2", config: { filters } } },
|
|
386
|
+
* { search: { search_id: "companies:profiles:amplemarket@2", config: { filters } } },
|
|
387
|
+
* ],
|
|
388
|
+
* });
|
|
389
|
+
*/
|
|
390
|
+
searchAll: ({
|
|
391
|
+
searches,
|
|
392
|
+
config,
|
|
393
|
+
dedupeBy,
|
|
394
|
+
maxPages,
|
|
395
|
+
normalize,
|
|
396
|
+
maxConcurrency,
|
|
397
|
+
signal,
|
|
398
|
+
stopOnError
|
|
399
|
+
}: SearchAllOptions) => Promise<SearchAllResult>;
|
|
337
400
|
};
|
|
338
401
|
private sleep;
|
|
339
402
|
}
|
|
340
403
|
//#endregion
|
|
341
|
-
export { BatchOptions, Pipe0, Pipe0AbortError, Pipe0BatchError, Pipe0Options, Pipe0ServerError, Pipe0TaskError, Pipe0TimeoutError, PipesRequest, PipesResponse, SearchRequest, SearchResponse, SearchesRequest, SearchesResponse };
|
|
404
|
+
export { BatchOptions, Pipe0, Pipe0AbortError, Pipe0BatchError, Pipe0Options, Pipe0ServerError, Pipe0TaskError, Pipe0TimeoutError, PipesRequest, PipesResponse, SearchAllItem, SearchAllOptions, SearchAllResult, SearchRequest, SearchResponse, SearchesRequest, SearchesResponse };
|
|
342
405
|
//# sourceMappingURL=pipe0.d.mts.map
|
package/dist/pipe0.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipe0.d.mts","names":[],"sources":["../src/pipe0.ts"],"mappings":";;;;KAGY,YAAA,GACV,KAAA;AAAA,KACU,aAAA,GACV,KAAA;AAAA,KAEU,eAAA,GACV,KAAA;AAAA,KACU,gBAAA,GACV,KAAA;AAAA,KAEU,aAAA,GACV,KAAA;AAAA,KACU,cAAA,GACV,KAAA;AAAA,cAEW,iBAAA,SAA0B,KAAA;EAAA,SAGnB,KAAA;cADhB,OAAA,UACgB,KAAA;AAAA;AAAA,cAQP,eAAA,SAAwB,KAAA;EAAA,SAGjB,KAAA;cADhB,OAAA,UACgB,KAAA;AAAA;AAAA,cAQP,eAAA,SAAwB,KAAA;EAAA,SAGjB,MAAA,EAAQ,KAAA;IAAQ,UAAA;IAAoB,KAAA,EAAO,KAAA;EAAA;EAAA,SAC3C,iBAAA,EAAmB,aAAA;cAFnC,OAAA,UACgB,MAAA,EAAQ,KAAA;IAAQ,UAAA;IAAoB,KAAA,EAAO,KAAA;EAAA,IAC3C,iBAAA,EAAmB,aAAA;AAAA;AAAA,cAS1B,cAAA,SAAuB,KAAA;EAAA,SAGhB,YAAA;cADhB,OAAA,UACgB,YAAA;AAAA;AAAA,cAQP,gBAAA,SAAyB,KAAA;cACxB,OAAA;AAAA;AAAA,UAMG,YAAA;EArDc;;;EAyD7B,MAAA,IAAU,WAAA,UAAqB,SAAA,EAAW,aAAA;EAtDxB;;;EA0DlB,eAAA,IAAmB,WAAA,UAAqB,OAAA,EAAS,aAAA;EA1DjB;;AAQlC;;EAuDE,WAAA;EAvDwC;;;EA2DxC,MAAA,GAAS,WAAA;AAAA;AAAA,UAGM,YAAA;EACf,MAAA;EACA,OAAA;EACA,WAAA,GAAc,WAAA;
|
|
1
|
+
{"version":3,"file":"pipe0.d.mts","names":[],"sources":["../src/pipe0.ts"],"mappings":"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"}
|
package/dist/pipe0.mjs
CHANGED
|
@@ -159,17 +159,61 @@ var Pipe0 = class {
|
|
|
159
159
|
return this.searches.waitUntilComplete(await this.searches.create(payload), options);
|
|
160
160
|
},
|
|
161
161
|
create: async (payload) => {
|
|
162
|
-
const response = await this.client.POST("/v1/
|
|
162
|
+
const response = await this.client.POST("/v1/search/run", { body: payload });
|
|
163
163
|
if (response.error) throw new Pipe0ServerError(JSON.stringify(response.error));
|
|
164
164
|
return response.data.id;
|
|
165
165
|
},
|
|
166
166
|
check: async (runId) => {
|
|
167
|
-
const response = await this.client.GET("/v1/
|
|
167
|
+
const response = await this.client.GET("/v1/search/check/{run_id}", { params: { path: { run_id: runId } } });
|
|
168
168
|
if (response.error) throw new Pipe0ServerError(JSON.stringify(response.error));
|
|
169
169
|
return response.data;
|
|
170
170
|
},
|
|
171
171
|
waitUntilComplete: async (runId, options = {}) => {
|
|
172
172
|
return this._pollUntilComplete(runId, this.searches.check, "Search", options);
|
|
173
|
+
},
|
|
174
|
+
searchAll: async ({ searches, config, dedupeBy, maxPages = 1, normalize = true, maxConcurrency = this.maxConcurrentBatches, signal, stopOnError = true }) => {
|
|
175
|
+
const errors = [];
|
|
176
|
+
const merged = [];
|
|
177
|
+
const runItem = async (item) => {
|
|
178
|
+
const rows = [];
|
|
179
|
+
let search = item.search;
|
|
180
|
+
const pages = item.maxPages ?? maxPages;
|
|
181
|
+
for (let page = 0; page < pages; page++) {
|
|
182
|
+
if (signal?.aborted) throw new Pipe0AbortError("searchAll was aborted");
|
|
183
|
+
const res = await this.searches.search({
|
|
184
|
+
config,
|
|
185
|
+
search
|
|
186
|
+
}, { signal });
|
|
187
|
+
rows.push(...res.results);
|
|
188
|
+
const next = res.next_page;
|
|
189
|
+
if (!next) break;
|
|
190
|
+
search = next;
|
|
191
|
+
}
|
|
192
|
+
return rows;
|
|
193
|
+
};
|
|
194
|
+
for (let i = 0; i < searches.length; i += maxConcurrency) {
|
|
195
|
+
if (signal?.aborted) throw new Pipe0AbortError("searchAll was aborted");
|
|
196
|
+
const group = searches.slice(i, i + maxConcurrency);
|
|
197
|
+
const settled = await Promise.all(group.map(async (item, groupIndex) => {
|
|
198
|
+
try {
|
|
199
|
+
return await runItem(item);
|
|
200
|
+
} catch (err) {
|
|
201
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
202
|
+
errors.push({
|
|
203
|
+
searchIndex: i + groupIndex,
|
|
204
|
+
error
|
|
205
|
+
});
|
|
206
|
+
if (stopOnError) throw error;
|
|
207
|
+
return [];
|
|
208
|
+
}
|
|
209
|
+
}));
|
|
210
|
+
for (const rows of settled) merged.push(...rows);
|
|
211
|
+
}
|
|
212
|
+
const deduped = dedupeBy?.length ? dedupeResults(merged, dedupeBy) : merged;
|
|
213
|
+
return {
|
|
214
|
+
results: normalize ? normalizeResults(deduped) : deduped,
|
|
215
|
+
errors
|
|
216
|
+
};
|
|
173
217
|
}
|
|
174
218
|
};
|
|
175
219
|
sleep(ms, signal) {
|
|
@@ -190,6 +234,51 @@ var Pipe0 = class {
|
|
|
190
234
|
});
|
|
191
235
|
}
|
|
192
236
|
};
|
|
237
|
+
/**
|
|
238
|
+
* Dedupe search-result rows by the resolved `.value` of one or more fields.
|
|
239
|
+
* First occurrence wins; rows missing any key field are kept (can't be deduped).
|
|
240
|
+
*/
|
|
241
|
+
function dedupeResults(rows, fields) {
|
|
242
|
+
const seen = /* @__PURE__ */ new Set();
|
|
243
|
+
const out = [];
|
|
244
|
+
for (const row of rows) {
|
|
245
|
+
const cells = row;
|
|
246
|
+
const parts = [];
|
|
247
|
+
let keyable = true;
|
|
248
|
+
for (const field of fields) {
|
|
249
|
+
const cell = cells[field];
|
|
250
|
+
if (cell == null || cell.value == null) {
|
|
251
|
+
keyable = false;
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
parts.push(JSON.stringify(cell.value));
|
|
255
|
+
}
|
|
256
|
+
if (!keyable) {
|
|
257
|
+
out.push(row);
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const key = parts.join("\0");
|
|
261
|
+
if (seen.has(key)) continue;
|
|
262
|
+
seen.add(key);
|
|
263
|
+
out.push(row);
|
|
264
|
+
}
|
|
265
|
+
return out;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Normalize merged rows to a uniform shape: every row gains the union of all
|
|
269
|
+
* field names seen across the set, with absent fields set to `null`. A field
|
|
270
|
+
* already present (even if its value is null) is left untouched.
|
|
271
|
+
*/
|
|
272
|
+
function normalizeResults(rows) {
|
|
273
|
+
const keys = /* @__PURE__ */ new Set();
|
|
274
|
+
for (const row of rows) for (const key of Object.keys(row)) keys.add(key);
|
|
275
|
+
return rows.map((row) => {
|
|
276
|
+
const source = row;
|
|
277
|
+
const out = {};
|
|
278
|
+
for (const key of keys) out[key] = key in source ? source[key] : null;
|
|
279
|
+
return out;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
193
282
|
|
|
194
283
|
//#endregion
|
|
195
284
|
export { Pipe0, Pipe0AbortError, Pipe0BatchError, Pipe0ServerError, Pipe0TaskError, Pipe0TimeoutError };
|
package/dist/pipe0.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipe0.mjs","names":[],"sources":["../src/pipe0.ts"],"sourcesContent":["import createFetchClient, { type Client } from \"openapi-fetch\";\nimport type { paths } from \"./generated/openapi.types.js\";\n\nexport type PipesRequest =\n paths[\"/v1/pipes/run\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\nexport type PipesResponse =\n paths[\"/v1/pipes/check/{run_id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport type SearchesRequest =\n paths[\"/v1/searches/run\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\nexport type SearchesResponse =\n paths[\"/v1/searches/check/{run_id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport type SearchRequest =\n paths[\"/v1/search/run\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\nexport type SearchResponse =\n paths[\"/v1/search/check/{run_id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport class Pipe0TimeoutError extends Error {\n constructor(\n message: string,\n public readonly runId?: string,\n ) {\n super(message);\n this.name = \"Pipe0TimeoutError\";\n this.runId = runId;\n }\n}\n\nexport class Pipe0AbortError extends Error {\n constructor(\n message: string,\n public readonly runId?: string,\n ) {\n super(message);\n this.name = \"Pipe0AbortError\";\n this.runId = runId;\n }\n}\n\nexport class Pipe0BatchError extends Error {\n constructor(\n message: string,\n public readonly errors: Array<{ batchIndex: number; error: Error }>,\n public readonly successfulBatches: PipesResponse[],\n ) {\n super(message);\n this.name = \"Pipe0BatchError\";\n this.errors = errors;\n this.successfulBatches = successfulBatches;\n }\n}\n\nexport class Pipe0TaskError extends Error {\n constructor(\n message: string,\n public readonly responseBody?: unknown,\n ) {\n super(message);\n this.name = \"Pipe0TaskError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class Pipe0ServerError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"Pipe0ServerError\";\n }\n}\n\nexport interface BatchOptions {\n /**\n * Callback invoked on each poll for any batch\n */\n onPoll?: (_batchIndex: number, _response: PipesResponse) => void;\n /**\n * Callback invoked when each batch completes\n */\n onBatchComplete?: (_batchIndex: number, _result: PipesResponse) => void;\n /**\n * Whether to stop all batches if one fails\n * @default true\n */\n stopOnError?: boolean;\n /**\n * AbortSignal to cancel all batch operations\n */\n signal?: AbortSignal;\n}\n\nexport interface Pipe0Options {\n apiKey?: string;\n baseUrl?: string;\n credentials?: RequestInit[\"credentials\"];\n /**\n * Default timeout for polling operations in milliseconds\n * @default 900000 (15 minutes)\n */\n pollingTimeoutMs?: number;\n /**\n * Default polling interval in milliseconds\n * @default 1000 (1 second)\n */\n minPollingIntervalMs?: number;\n /**\n * Maximum polling interval in milliseconds (for exponential backoff)\n * @default 3000 (3 seconds)\n */\n maxPollingIntervalMs?: number;\n /**\n * Default batch size for large payloads\n * @default 100\n */\n defaultBatchSize?: number;\n /**\n * Maximum number of concurrent batch requests\n * @default 5\n */\n maxConcurrentBatches?: number;\n}\n\n// Utility type for any possible API response data shape\ntype Pipe0TaskStatusResponse = PipesResponse | SearchesResponse;\n\nexport class Pipe0 {\n public client: Client<paths, `${string}/${string}`>;\n private apiKey?: string;\n\n private pollingTimeoutMs: number;\n private minPollingIntervalMs: number;\n private maxPollingIntervalMs: number;\n private defaultBatchSize: number;\n private maxConcurrentBatches: number;\n\n constructor(options: Pipe0Options = {}) {\n // eslint-disable-next-line turbo/no-undeclared-env-vars\n const envApiKey = typeof process !== \"undefined\" ? process.env?.PIPE0_API_KEY : undefined;\n this.apiKey = options.apiKey ?? envApiKey;\n\n this.pollingTimeoutMs = options.pollingTimeoutMs ?? 900000;\n this.minPollingIntervalMs = options.minPollingIntervalMs ?? 1000;\n this.maxPollingIntervalMs = options.maxPollingIntervalMs ?? this.minPollingIntervalMs * 3;\n this.defaultBatchSize = options.defaultBatchSize ?? 100;\n this.maxConcurrentBatches = options.maxConcurrentBatches ?? 5;\n\n const headers: Record<string, string> = {};\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n this.client = createFetchClient<paths>({\n baseUrl: options.baseUrl ?? \"https://api.pipe0.com\",\n credentials: options.credentials\n ? options.credentials\n : options.baseUrl\n ? \"same-origin\"\n : \"include\",\n headers,\n });\n }\n\n /**\n * Centralized logic to poll until a task completes, fails, or times out.\n */\n private async _pollUntilComplete<TResponse extends Pipe0TaskStatusResponse>(\n runId: string | Promise<string>,\n checkFn: (_id: string) => Promise<TResponse>,\n taskType: \"Pipe\" | \"Search\",\n options: {\n onPoll?: (_response: TResponse) => unknown;\n signal?: AbortSignal;\n } = {},\n ): Promise<TResponse> {\n const resolvedRunId = await runId;\n\n const timeout = this.pollingTimeoutMs;\n const initialInterval = this.minPollingIntervalMs;\n const maxInterval = this.maxPollingIntervalMs;\n // We can hardcode backoff for simplicity since it's the only logic\n const useBackoff = true;\n\n const startTime = Date.now();\n let currentInterval = initialInterval;\n\n while (true) {\n if (Date.now() - startTime >= timeout) {\n throw new Pipe0TimeoutError(\n `${taskType} polling timed out after ${timeout}ms`,\n resolvedRunId,\n );\n }\n\n if (options.signal?.aborted) {\n throw new Pipe0AbortError(`${taskType} polling was aborted`, resolvedRunId);\n }\n\n const polledResponse = await checkFn(resolvedRunId);\n\n if (options.onPoll) {\n await options.onPoll(polledResponse);\n }\n\n if (polledResponse.status === \"completed\") {\n return polledResponse;\n }\n\n if (polledResponse.status === \"failed\") {\n throw new Pipe0TaskError(\n `${taskType} failed with status: ${polledResponse.status}`,\n polledResponse,\n );\n }\n\n await this.sleep(currentInterval, options.signal);\n\n if (useBackoff) {\n currentInterval = Math.min(currentInterval * 1.1, maxInterval);\n }\n }\n }\n\n public pipes = {\n /**\n * Create and immediately wait for completion (convenience method)\n */\n pipe: async (\n payload: PipesRequest,\n options: {\n onPoll?: (_response: PipesResponse) => unknown;\n signal?: AbortSignal;\n } = {},\n ): Promise<PipesResponse> => {\n return this.pipes.waitUntilComplete(await this.pipes.create(payload), options);\n },\n /**\n * Create a pipes task but don't want for it. Use this method if you want to fire and forget.\n */\n create: async (payload: PipesRequest) => {\n const response = await this.client.POST(\"/v1/pipes/run\", {\n body: payload,\n });\n\n if (response.error) {\n throw new Pipe0ServerError(JSON.stringify(response.error));\n }\n\n return response.data.id;\n },\n /**\n * Check the status of a pipes task manually.\n */\n check: async (runId: string) => {\n const response = await this.client.GET(\"/v1/pipes/check/{run_id}\", {\n params: { path: { run_id: runId } },\n });\n\n if (response.error) {\n throw new Pipe0ServerError(JSON.stringify(response.error));\n }\n\n return response.data;\n },\n waitUntilComplete: async (\n runId: string | Promise<string>,\n options: {\n /**\n * Callback invoked on each poll with the current status\n */\n onPoll?: (_response: PipesResponse) => unknown;\n /**\n * AbortSignal to cancel the polling operation\n */\n signal?: AbortSignal;\n } = {},\n ): Promise<PipesResponse> => {\n return this._pollUntilComplete<PipesResponse>(runId, this.pipes.check, \"Pipe\", options);\n },\n /**\n * Process a large payload by batching the input array\n * @param payload - The pipe request payload with a large input array\n * @param options - Batching options\n * @returns Array of completed batch responses\n */\n pipeInBatches: async (\n payload: PipesRequest,\n { stopOnError = true, ...options }: BatchOptions = {},\n ): Promise<PipesResponse[]> => {\n const batchSize = this.defaultBatchSize;\n const maxConcurrency = this.maxConcurrentBatches;\n\n // Extract and validate input array\n if (!Array.isArray(payload.input)) {\n throw new Error(\"payload.input must be an array for batched operations\");\n }\n\n const inputArray = payload.input;\n const totalItems = inputArray.length;\n\n // Create batches\n const batches: PipesRequest[] = [];\n for (let i = 0; i < totalItems; i += batchSize) {\n const batchInput = inputArray.slice(i, i + batchSize);\n batches.push({\n ...payload,\n input: batchInput,\n });\n }\n\n // Process batches with concurrency control\n const resultsArr: PipesResponse[] = [];\n const errors: Array<{ batchIndex: number; error: Error }> = [];\n\n for (let i = 0; i < batches.length; i += maxConcurrency) {\n if (options.signal?.aborted) {\n throw new Pipe0AbortError(\"Batch operation was aborted\");\n }\n\n const batchGroup = batches.slice(i, i + maxConcurrency);\n const batchPromises = batchGroup.map(async (batch, groupIndex) => {\n const batchIndex = i + groupIndex;\n\n try {\n // Create and wait for batch\n const runId = await this.pipes.create(batch);\n const result = await this.pipes.waitUntilComplete(runId, {\n signal: options.signal,\n onPoll: options.onPoll\n ? (response) => options.onPoll!(batchIndex, response)\n : undefined,\n });\n\n if (options.onBatchComplete) {\n options.onBatchComplete(batchIndex, result);\n }\n\n return { batchIndex, result };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n errors.push({ batchIndex, error: err });\n\n if (stopOnError) {\n throw new Pipe0BatchError(\n `Batch ${batchIndex} failed and stopOnError is enabled`,\n errors,\n resultsArr,\n );\n }\n\n return { batchIndex, result: null };\n }\n });\n\n const batchResults = await Promise.all(batchPromises);\n\n // Collect results in order\n for (const { result } of batchResults) {\n if (result) {\n resultsArr.push(result);\n }\n }\n }\n\n // If any errors occurred and stopOnError wasn't enabled, throw at the end\n if (errors.length > 0) {\n throw new Pipe0BatchError(\n `${errors.length} batch(es) failed out of ${batches.length} total`,\n errors,\n resultsArr,\n );\n }\n\n return resultsArr;\n },\n };\n\n searches = {\n /**\n * Create and immediately wait for completion (convenience method)\n */\n search: async (\n payload: SearchesRequest,\n options: {\n onPoll?: (_response: SearchesResponse) => unknown;\n signal?: AbortSignal;\n } = {},\n ): Promise<SearchesResponse> => {\n return this.searches.waitUntilComplete(await this.searches.create(payload), options);\n },\n\n /**\n * Create a searches task but don't wait for it.\n * Use this if you want fire and forget.\n */\n create: async (payload: SearchesRequest) => {\n const response = await this.client.POST(\"/v1/searches/run\", {\n body: payload,\n });\n\n if (response.error) {\n throw new Pipe0ServerError(JSON.stringify(response.error));\n }\n\n return response.data.id;\n },\n\n /**\n * Check the status of a search task manually.\n */\n check: async (runId: string) => {\n const response = await this.client.GET(\"/v1/searches/check/{run_id}\", {\n params: { path: { run_id: runId } },\n });\n\n if (response.error) {\n throw new Pipe0ServerError(JSON.stringify(response.error));\n }\n\n return response.data;\n },\n\n /**\n * Poll until the search completes or fails.\n */\n waitUntilComplete: async (\n runId: string | Promise<string>,\n options: {\n onPoll?: (_response: SearchesResponse) => unknown;\n signal?: AbortSignal;\n } = {},\n ): Promise<SearchesResponse> => {\n return this._pollUntilComplete<SearchesResponse>(\n runId,\n this.searches.check,\n \"Search\",\n options,\n );\n },\n };\n\n private sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(resolve, ms);\n\n if (signal) {\n const onAbort = () => {\n clearTimeout(timeout);\n reject(new Pipe0AbortError(\"Sleep was aborted\"));\n };\n\n if (signal.aborted) {\n clearTimeout(timeout);\n reject(new Pipe0AbortError(\"Sleep was aborted\"));\n return;\n }\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pipe0.mjs","names":[],"sources":["../src/pipe0.ts"],"sourcesContent":["import createFetchClient, { type Client } from \"openapi-fetch\";\nimport type { paths } from \"./generated/openapi.types.js\";\n\nexport type PipesRequest =\n paths[\"/v1/pipes/run\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\nexport type PipesResponse =\n paths[\"/v1/pipes/check/{run_id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport type SearchesRequest =\n paths[\"/v1/searches/run\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\nexport type SearchesResponse =\n paths[\"/v1/searches/check/{run_id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport type SearchRequest =\n paths[\"/v1/search/run\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\nexport type SearchResponse =\n paths[\"/v1/search/check/{run_id}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"];\n\nexport class Pipe0TimeoutError extends Error {\n constructor(\n message: string,\n public readonly runId?: string,\n ) {\n super(message);\n this.name = \"Pipe0TimeoutError\";\n this.runId = runId;\n }\n}\n\nexport class Pipe0AbortError extends Error {\n constructor(\n message: string,\n public readonly runId?: string,\n ) {\n super(message);\n this.name = \"Pipe0AbortError\";\n this.runId = runId;\n }\n}\n\nexport class Pipe0BatchError extends Error {\n constructor(\n message: string,\n public readonly errors: Array<{ batchIndex: number; error: Error }>,\n public readonly successfulBatches: PipesResponse[],\n ) {\n super(message);\n this.name = \"Pipe0BatchError\";\n this.errors = errors;\n this.successfulBatches = successfulBatches;\n }\n}\n\nexport class Pipe0TaskError extends Error {\n constructor(\n message: string,\n public readonly responseBody?: unknown,\n ) {\n super(message);\n this.name = \"Pipe0TaskError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class Pipe0ServerError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"Pipe0ServerError\";\n }\n}\n\nexport interface BatchOptions {\n /**\n * Callback invoked on each poll for any batch\n */\n onPoll?: (_batchIndex: number, _response: PipesResponse) => void;\n /**\n * Callback invoked when each batch completes\n */\n onBatchComplete?: (_batchIndex: number, _result: PipesResponse) => void;\n /**\n * Whether to stop all batches if one fails\n * @default true\n */\n stopOnError?: boolean;\n /**\n * AbortSignal to cancel all batch operations\n */\n signal?: AbortSignal;\n}\n\nexport interface SearchAllItem {\n /** The search payload (`search_id` + `config`), same shape as `searches.search`. */\n search: SearchRequest[\"search\"];\n /**\n * Max pages to fetch for this search. Pagination is auto-detected from each\n * response's `next_page`, so cursor- and page-number-based searches both work.\n * @default the call-level `maxPages`\n */\n maxPages?: number;\n}\n\nexport interface SearchAllOptions {\n /** Searches to run concurrently. Results are merged into one array. */\n searches: SearchAllItem[];\n /** Shared request config (e.g. `{ environment }`) applied to every search. */\n config?: SearchRequest[\"config\"];\n /**\n * Field names to dedupe the merged results by, compared on each field's\n * resolved `.value`. Multiple fields form a composite key; first match wins.\n * Rows missing any key field are kept as-is (never deduped away).\n */\n dedupeBy?: string[];\n /**\n * Default max pages per search when an item doesn't set its own. Pass\n * `Infinity` to fetch every page until the server reports no `next_page`.\n * @default 1\n */\n maxPages?: number;\n /**\n * Normalize the merged results to a single shape: every row gets the union of\n * all field names seen across every search, with absent fields set to `null`\n * (e.g. so `crustdata_company_match` / `amplemarket_company_match` both exist\n * on every row). @default true\n */\n normalize?: boolean;\n /** Max searches to run at once. @default maxConcurrentBatches */\n maxConcurrency?: number;\n /** AbortSignal to cancel all searches. */\n signal?: AbortSignal;\n /**\n * Throw on the first search error. When `false`, failed searches are collected\n * in `errors` and partial results are returned. @default true\n */\n stopOnError?: boolean;\n}\n\nexport interface SearchAllResult {\n /** Merged (and optionally deduped) results across every search and page. */\n results: SearchResponse[\"results\"];\n /** Per-search failures, populated only when `stopOnError` is `false`. */\n errors: Array<{ searchIndex: number; error: Error }>;\n}\n\nexport interface Pipe0Options {\n apiKey?: string;\n baseUrl?: string;\n credentials?: RequestInit[\"credentials\"];\n /**\n * Default timeout for polling operations in milliseconds\n * @default 900000 (15 minutes)\n */\n pollingTimeoutMs?: number;\n /**\n * Default polling interval in milliseconds\n * @default 1000 (1 second)\n */\n minPollingIntervalMs?: number;\n /**\n * Maximum polling interval in milliseconds (for exponential backoff)\n * @default 3000 (3 seconds)\n */\n maxPollingIntervalMs?: number;\n /**\n * Default batch size for large payloads\n * @default 100\n */\n defaultBatchSize?: number;\n /**\n * Maximum number of concurrent batch requests\n * @default 5\n */\n maxConcurrentBatches?: number;\n}\n\n// Utility type for any possible API response data shape\ntype Pipe0TaskStatusResponse = PipesResponse | SearchResponse;\n\nexport class Pipe0 {\n public client: Client<paths, `${string}/${string}`>;\n private apiKey?: string;\n\n private pollingTimeoutMs: number;\n private minPollingIntervalMs: number;\n private maxPollingIntervalMs: number;\n private defaultBatchSize: number;\n private maxConcurrentBatches: number;\n\n constructor(options: Pipe0Options = {}) {\n // eslint-disable-next-line turbo/no-undeclared-env-vars\n const envApiKey = typeof process !== \"undefined\" ? process.env?.PIPE0_API_KEY : undefined;\n this.apiKey = options.apiKey ?? envApiKey;\n\n this.pollingTimeoutMs = options.pollingTimeoutMs ?? 900000;\n this.minPollingIntervalMs = options.minPollingIntervalMs ?? 1000;\n this.maxPollingIntervalMs = options.maxPollingIntervalMs ?? this.minPollingIntervalMs * 3;\n this.defaultBatchSize = options.defaultBatchSize ?? 100;\n this.maxConcurrentBatches = options.maxConcurrentBatches ?? 5;\n\n const headers: Record<string, string> = {};\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n this.client = createFetchClient<paths>({\n baseUrl: options.baseUrl ?? \"https://api.pipe0.com\",\n credentials: options.credentials\n ? options.credentials\n : options.baseUrl\n ? \"same-origin\"\n : \"include\",\n headers,\n });\n }\n\n /**\n * Centralized logic to poll until a task completes, fails, or times out.\n */\n private async _pollUntilComplete<TResponse extends Pipe0TaskStatusResponse>(\n runId: string | Promise<string>,\n checkFn: (_id: string) => Promise<TResponse>,\n taskType: \"Pipe\" | \"Search\",\n options: {\n onPoll?: (_response: TResponse) => unknown;\n signal?: AbortSignal;\n } = {},\n ): Promise<TResponse> {\n const resolvedRunId = await runId;\n\n const timeout = this.pollingTimeoutMs;\n const initialInterval = this.minPollingIntervalMs;\n const maxInterval = this.maxPollingIntervalMs;\n // We can hardcode backoff for simplicity since it's the only logic\n const useBackoff = true;\n\n const startTime = Date.now();\n let currentInterval = initialInterval;\n\n while (true) {\n if (Date.now() - startTime >= timeout) {\n throw new Pipe0TimeoutError(\n `${taskType} polling timed out after ${timeout}ms`,\n resolvedRunId,\n );\n }\n\n if (options.signal?.aborted) {\n throw new Pipe0AbortError(`${taskType} polling was aborted`, resolvedRunId);\n }\n\n const polledResponse = await checkFn(resolvedRunId);\n\n if (options.onPoll) {\n await options.onPoll(polledResponse);\n }\n\n if (polledResponse.status === \"completed\") {\n return polledResponse;\n }\n\n if (polledResponse.status === \"failed\") {\n throw new Pipe0TaskError(\n `${taskType} failed with status: ${polledResponse.status}`,\n polledResponse,\n );\n }\n\n await this.sleep(currentInterval, options.signal);\n\n if (useBackoff) {\n currentInterval = Math.min(currentInterval * 1.1, maxInterval);\n }\n }\n }\n\n public pipes = {\n /**\n * Create and immediately wait for completion (convenience method)\n */\n pipe: async (\n payload: PipesRequest,\n options: {\n onPoll?: (_response: PipesResponse) => unknown;\n signal?: AbortSignal;\n } = {},\n ): Promise<PipesResponse> => {\n return this.pipes.waitUntilComplete(await this.pipes.create(payload), options);\n },\n /**\n * Create a pipes task but don't want for it. Use this method if you want to fire and forget.\n */\n create: async (payload: PipesRequest) => {\n const response = await this.client.POST(\"/v1/pipes/run\", {\n body: payload,\n });\n\n if (response.error) {\n throw new Pipe0ServerError(JSON.stringify(response.error));\n }\n\n return response.data.id;\n },\n /**\n * Check the status of a pipes task manually.\n */\n check: async (runId: string) => {\n const response = await this.client.GET(\"/v1/pipes/check/{run_id}\", {\n params: { path: { run_id: runId } },\n });\n\n if (response.error) {\n throw new Pipe0ServerError(JSON.stringify(response.error));\n }\n\n return response.data;\n },\n waitUntilComplete: async (\n runId: string | Promise<string>,\n options: {\n /**\n * Callback invoked on each poll with the current status\n */\n onPoll?: (_response: PipesResponse) => unknown;\n /**\n * AbortSignal to cancel the polling operation\n */\n signal?: AbortSignal;\n } = {},\n ): Promise<PipesResponse> => {\n return this._pollUntilComplete<PipesResponse>(runId, this.pipes.check, \"Pipe\", options);\n },\n /**\n * Process a large payload by batching the input array\n * @param payload - The pipe request payload with a large input array\n * @param options - Batching options\n * @returns Array of completed batch responses\n */\n pipeInBatches: async (\n payload: PipesRequest,\n { stopOnError = true, ...options }: BatchOptions = {},\n ): Promise<PipesResponse[]> => {\n const batchSize = this.defaultBatchSize;\n const maxConcurrency = this.maxConcurrentBatches;\n\n // Extract and validate input array\n if (!Array.isArray(payload.input)) {\n throw new Error(\"payload.input must be an array for batched operations\");\n }\n\n const inputArray = payload.input;\n const totalItems = inputArray.length;\n\n // Create batches\n const batches: PipesRequest[] = [];\n for (let i = 0; i < totalItems; i += batchSize) {\n const batchInput = inputArray.slice(i, i + batchSize);\n batches.push({\n ...payload,\n input: batchInput,\n });\n }\n\n // Process batches with concurrency control\n const resultsArr: PipesResponse[] = [];\n const errors: Array<{ batchIndex: number; error: Error }> = [];\n\n for (let i = 0; i < batches.length; i += maxConcurrency) {\n if (options.signal?.aborted) {\n throw new Pipe0AbortError(\"Batch operation was aborted\");\n }\n\n const batchGroup = batches.slice(i, i + maxConcurrency);\n const batchPromises = batchGroup.map(async (batch, groupIndex) => {\n const batchIndex = i + groupIndex;\n\n try {\n // Create and wait for batch\n const runId = await this.pipes.create(batch);\n const result = await this.pipes.waitUntilComplete(runId, {\n signal: options.signal,\n onPoll: options.onPoll\n ? (response) => options.onPoll!(batchIndex, response)\n : undefined,\n });\n\n if (options.onBatchComplete) {\n options.onBatchComplete(batchIndex, result);\n }\n\n return { batchIndex, result };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n errors.push({ batchIndex, error: err });\n\n if (stopOnError) {\n throw new Pipe0BatchError(\n `Batch ${batchIndex} failed and stopOnError is enabled`,\n errors,\n resultsArr,\n );\n }\n\n return { batchIndex, result: null };\n }\n });\n\n const batchResults = await Promise.all(batchPromises);\n\n // Collect results in order\n for (const { result } of batchResults) {\n if (result) {\n resultsArr.push(result);\n }\n }\n }\n\n // If any errors occurred and stopOnError wasn't enabled, throw at the end\n if (errors.length > 0) {\n throw new Pipe0BatchError(\n `${errors.length} batch(es) failed out of ${batches.length} total`,\n errors,\n resultsArr,\n );\n }\n\n return resultsArr;\n },\n };\n\n searches = {\n /**\n * Create and immediately wait for completion (convenience method)\n */\n search: async (\n payload: SearchRequest,\n options: {\n onPoll?: (_response: SearchResponse) => unknown;\n signal?: AbortSignal;\n } = {},\n ): Promise<SearchResponse> => {\n return this.searches.waitUntilComplete(await this.searches.create(payload), options);\n },\n\n /**\n * Create a searches task but don't wait for it.\n * Use this if you want fire and forget.\n */\n create: async (payload: SearchRequest) => {\n const response = await this.client.POST(\"/v1/search/run\", {\n body: payload,\n });\n\n if (response.error) {\n throw new Pipe0ServerError(JSON.stringify(response.error));\n }\n\n return response.data.id;\n },\n\n /**\n * Check the status of a search task manually.\n */\n check: async (runId: string) => {\n const response = await this.client.GET(\"/v1/search/check/{run_id}\", {\n params: { path: { run_id: runId } },\n });\n\n if (response.error) {\n throw new Pipe0ServerError(JSON.stringify(response.error));\n }\n\n return response.data;\n },\n\n /**\n * Poll until the search completes or fails.\n */\n waitUntilComplete: async (\n runId: string | Promise<string>,\n options: {\n onPoll?: (_response: SearchResponse) => unknown;\n signal?: AbortSignal;\n } = {},\n ): Promise<SearchResponse> => {\n return this._pollUntilComplete<SearchResponse>(runId, this.searches.check, \"Search\", options);\n },\n\n /**\n * Run several searches concurrently, auto-paginate each, and return one merged\n * (optionally deduped) result set. Pagination is detected from each response's\n * `next_page` token — which is itself a ready-to-send payload — so cursor- and\n * page-number-based searches are handled transparently.\n *\n * @example\n * const { results } = await pipe0.searches.searchAll({\n * config: { environment: \"production\" },\n * dedupeBy: [\"company_domain\"],\n * maxPages: 3,\n * searches: [\n * { search: { search_id: \"companies:profiles:crustdata@2\", config: { filters } } },\n * { search: { search_id: \"companies:profiles:amplemarket@2\", config: { filters } } },\n * ],\n * });\n */\n searchAll: async ({\n searches,\n config,\n dedupeBy,\n maxPages = 1,\n normalize = true,\n maxConcurrency = this.maxConcurrentBatches,\n signal,\n stopOnError = true,\n }: SearchAllOptions): Promise<SearchAllResult> => {\n const errors: SearchAllResult[\"errors\"] = [];\n const merged: SearchResponse[\"results\"] = [];\n\n const runItem = async (item: SearchAllItem): Promise<SearchResponse[\"results\"]> => {\n const rows: SearchResponse[\"results\"] = [];\n let search = item.search;\n const pages = item.maxPages ?? maxPages;\n for (let page = 0; page < pages; page++) {\n if (signal?.aborted) throw new Pipe0AbortError(\"searchAll was aborted\");\n const res = await this.searches.search({ config, search }, { signal });\n rows.push(...res.results);\n // `next_page` is a complete, re-sendable payload (original filters +\n // output_fields with only the cursor/page_number advanced), so we send\n // it verbatim — no need to know which pagination style the search uses.\n const next = res.next_page as SearchRequest[\"search\"] | null;\n if (!next) break;\n search = next;\n }\n return rows;\n };\n\n for (let i = 0; i < searches.length; i += maxConcurrency) {\n if (signal?.aborted) throw new Pipe0AbortError(\"searchAll was aborted\");\n const group = searches.slice(i, i + maxConcurrency);\n const settled = await Promise.all(\n group.map(async (item, groupIndex) => {\n try {\n return await runItem(item);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n errors.push({ searchIndex: i + groupIndex, error });\n if (stopOnError) throw error;\n return [] as SearchResponse[\"results\"];\n }\n }),\n );\n for (const rows of settled) merged.push(...rows);\n }\n\n const deduped = dedupeBy?.length ? dedupeResults(merged, dedupeBy) : merged;\n return {\n results: normalize ? normalizeResults(deduped) : deduped,\n errors,\n };\n },\n };\n\n private sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(resolve, ms);\n\n if (signal) {\n const onAbort = () => {\n clearTimeout(timeout);\n reject(new Pipe0AbortError(\"Sleep was aborted\"));\n };\n\n if (signal.aborted) {\n clearTimeout(timeout);\n reject(new Pipe0AbortError(\"Sleep was aborted\"));\n return;\n }\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n }\n}\n\n/**\n * Dedupe search-result rows by the resolved `.value` of one or more fields.\n * First occurrence wins; rows missing any key field are kept (can't be deduped).\n */\nfunction dedupeResults(\n rows: SearchResponse[\"results\"],\n fields: string[],\n): SearchResponse[\"results\"] {\n const seen = new Set<string>();\n const out: SearchResponse[\"results\"] = [];\n for (const row of rows) {\n const cells = row as Record<string, { value?: unknown } | null>;\n const parts: string[] = [];\n let keyable = true;\n for (const field of fields) {\n const cell = cells[field];\n if (cell == null || cell.value == null) {\n keyable = false;\n break;\n }\n parts.push(JSON.stringify(cell.value));\n }\n if (!keyable) {\n out.push(row);\n continue;\n }\n const key = parts.join(\"\u0000\");\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(row);\n }\n return out;\n}\n\n/**\n * Normalize merged rows to a uniform shape: every row gains the union of all\n * field names seen across the set, with absent fields set to `null`. A field\n * already present (even if its value is null) is left untouched.\n */\nfunction normalizeResults(rows: SearchResponse[\"results\"]): SearchResponse[\"results\"] {\n const keys = new Set<string>();\n for (const row of rows) {\n for (const key of Object.keys(row)) keys.add(key);\n }\n return rows.map((row) => {\n const source = row as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of keys) {\n out[key] = key in source ? source[key] : null;\n }\n return out as SearchResponse[\"results\"][number];\n });\n}\n\nfunction test() {\n const piper = new Pipe0({ apiKey: \"\" });\n\n piper.searches.search({\n search: {\n search_id: \"companies:profiles:amplemarket@2\",\n config: {\n filters: { hq_locations: { include: [\"sldjkf\"] } },\n },\n },\n });\n\n piper.searches.search({\n search: {\n search_id: \"people:profiles:crustdata@2\",\n config: {\n filters: {\n current_employer_domains: {\n include: [\"google.com\", \"microsoft.com\"],\n },\n },\n },\n },\n });\n}\n"],"mappings":";;;AAkBA,IAAa,oBAAb,cAAuC,MAAM;CAC3C,YACE,SACA,AAAgB,OAChB;AACA,QAAM,QAAQ;EAFE;AAGhB,OAAK,OAAO;AACZ,OAAK,QAAQ;;;AAIjB,IAAa,kBAAb,cAAqC,MAAM;CACzC,YACE,SACA,AAAgB,OAChB;AACA,QAAM,QAAQ;EAFE;AAGhB,OAAK,OAAO;AACZ,OAAK,QAAQ;;;AAIjB,IAAa,kBAAb,cAAqC,MAAM;CACzC,YACE,SACA,AAAgB,QAChB,AAAgB,mBAChB;AACA,QAAM,QAAQ;EAHE;EACA;AAGhB,OAAK,OAAO;AACZ,OAAK,SAAS;AACd,OAAK,oBAAoB;;;AAI7B,IAAa,iBAAb,cAAoC,MAAM;CACxC,YACE,SACA,AAAgB,cAChB;AACA,QAAM,QAAQ;EAFE;AAGhB,OAAK,OAAO;AACZ,OAAK,eAAe;;;AAIxB,IAAa,mBAAb,cAAsC,MAAM;CAC1C,YAAY,SAAiB;AAC3B,QAAM,QAAQ;AACd,OAAK,OAAO;;;AA+GhB,IAAa,QAAb,MAAmB;CACjB,AAAO;CACP,AAAQ;CAER,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAY,UAAwB,EAAE,EAAE;EAEtC,MAAM,YAAY,OAAO,YAAY,cAAc,QAAQ,KAAK,gBAAgB;AAChF,OAAK,SAAS,QAAQ,UAAU;AAEhC,OAAK,mBAAmB,QAAQ,oBAAoB;AACpD,OAAK,uBAAuB,QAAQ,wBAAwB;AAC5D,OAAK,uBAAuB,QAAQ,wBAAwB,KAAK,uBAAuB;AACxF,OAAK,mBAAmB,QAAQ,oBAAoB;AACpD,OAAK,uBAAuB,QAAQ,wBAAwB;EAE5D,MAAM,UAAkC,EAAE;AAE1C,MAAI,KAAK,OACP,SAAQ,gBAAgB,UAAU,KAAK;AAGzC,OAAK,SAAS,kBAAyB;GACrC,SAAS,QAAQ,WAAW;GAC5B,aAAa,QAAQ,cACjB,QAAQ,cACR,QAAQ,UACN,gBACA;GACN;GACD,CAAC;;;;;CAMJ,MAAc,mBACZ,OACA,SACA,UACA,UAGI,EAAE,EACc;EACpB,MAAM,gBAAgB,MAAM;EAE5B,MAAM,UAAU,KAAK;EACrB,MAAM,kBAAkB,KAAK;EAC7B,MAAM,cAAc,KAAK;EAIzB,MAAM,YAAY,KAAK,KAAK;EAC5B,IAAI,kBAAkB;AAEtB,SAAO,MAAM;AACX,OAAI,KAAK,KAAK,GAAG,aAAa,QAC5B,OAAM,IAAI,kBACR,GAAG,SAAS,2BAA2B,QAAQ,KAC/C,cACD;AAGH,OAAI,QAAQ,QAAQ,QAClB,OAAM,IAAI,gBAAgB,GAAG,SAAS,uBAAuB,cAAc;GAG7E,MAAM,iBAAiB,MAAM,QAAQ,cAAc;AAEnD,OAAI,QAAQ,OACV,OAAM,QAAQ,OAAO,eAAe;AAGtC,OAAI,eAAe,WAAW,YAC5B,QAAO;AAGT,OAAI,eAAe,WAAW,SAC5B,OAAM,IAAI,eACR,GAAG,SAAS,uBAAuB,eAAe,UAClD,eACD;AAGH,SAAM,KAAK,MAAM,iBAAiB,QAAQ,OAAO;AAG/C,qBAAkB,KAAK,IAAI,kBAAkB,KAAK,YAAY;;;CAKpE,AAAO,QAAQ;EAIb,MAAM,OACJ,SACA,UAGI,EAAE,KACqB;AAC3B,UAAO,KAAK,MAAM,kBAAkB,MAAM,KAAK,MAAM,OAAO,QAAQ,EAAE,QAAQ;;EAKhF,QAAQ,OAAO,YAA0B;GACvC,MAAM,WAAW,MAAM,KAAK,OAAO,KAAK,iBAAiB,EACvD,MAAM,SACP,CAAC;AAEF,OAAI,SAAS,MACX,OAAM,IAAI,iBAAiB,KAAK,UAAU,SAAS,MAAM,CAAC;AAG5D,UAAO,SAAS,KAAK;;EAKvB,OAAO,OAAO,UAAkB;GAC9B,MAAM,WAAW,MAAM,KAAK,OAAO,IAAI,4BAA4B,EACjE,QAAQ,EAAE,MAAM,EAAE,QAAQ,OAAO,EAAE,EACpC,CAAC;AAEF,OAAI,SAAS,MACX,OAAM,IAAI,iBAAiB,KAAK,UAAU,SAAS,MAAM,CAAC;AAG5D,UAAO,SAAS;;EAElB,mBAAmB,OACjB,OACA,UASI,EAAE,KACqB;AAC3B,UAAO,KAAK,mBAAkC,OAAO,KAAK,MAAM,OAAO,QAAQ,QAAQ;;EAQzF,eAAe,OACb,SACA,EAAE,cAAc,MAAM,GAAG,YAA0B,EAAE,KACxB;GAC7B,MAAM,YAAY,KAAK;GACvB,MAAM,iBAAiB,KAAK;AAG5B,OAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,CAC/B,OAAM,IAAI,MAAM,wDAAwD;GAG1E,MAAM,aAAa,QAAQ;GAC3B,MAAM,aAAa,WAAW;GAG9B,MAAM,UAA0B,EAAE;AAClC,QAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK,WAAW;IAC9C,MAAM,aAAa,WAAW,MAAM,GAAG,IAAI,UAAU;AACrD,YAAQ,KAAK;KACX,GAAG;KACH,OAAO;KACR,CAAC;;GAIJ,MAAM,aAA8B,EAAE;GACtC,MAAM,SAAsD,EAAE;AAE9D,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,gBAAgB;AACvD,QAAI,QAAQ,QAAQ,QAClB,OAAM,IAAI,gBAAgB,8BAA8B;IAI1D,MAAM,gBADa,QAAQ,MAAM,GAAG,IAAI,eAAe,CACtB,IAAI,OAAO,OAAO,eAAe;KAChE,MAAM,aAAa,IAAI;AAEvB,SAAI;MAEF,MAAM,QAAQ,MAAM,KAAK,MAAM,OAAO,MAAM;MAC5C,MAAM,SAAS,MAAM,KAAK,MAAM,kBAAkB,OAAO;OACvD,QAAQ,QAAQ;OAChB,QAAQ,QAAQ,UACX,aAAa,QAAQ,OAAQ,YAAY,SAAS,GACnD;OACL,CAAC;AAEF,UAAI,QAAQ,gBACV,SAAQ,gBAAgB,YAAY,OAAO;AAG7C,aAAO;OAAE;OAAY;OAAQ;cACtB,OAAO;MACd,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;AACrE,aAAO,KAAK;OAAE;OAAY,OAAO;OAAK,CAAC;AAEvC,UAAI,YACF,OAAM,IAAI,gBACR,SAAS,WAAW,qCACpB,QACA,WACD;AAGH,aAAO;OAAE;OAAY,QAAQ;OAAM;;MAErC;IAEF,MAAM,eAAe,MAAM,QAAQ,IAAI,cAAc;AAGrD,SAAK,MAAM,EAAE,YAAY,aACvB,KAAI,OACF,YAAW,KAAK,OAAO;;AAM7B,OAAI,OAAO,SAAS,EAClB,OAAM,IAAI,gBACR,GAAG,OAAO,OAAO,2BAA2B,QAAQ,OAAO,SAC3D,QACA,WACD;AAGH,UAAO;;EAEV;CAED,WAAW;EAIT,QAAQ,OACN,SACA,UAGI,EAAE,KACsB;AAC5B,UAAO,KAAK,SAAS,kBAAkB,MAAM,KAAK,SAAS,OAAO,QAAQ,EAAE,QAAQ;;EAOtF,QAAQ,OAAO,YAA2B;GACxC,MAAM,WAAW,MAAM,KAAK,OAAO,KAAK,kBAAkB,EACxD,MAAM,SACP,CAAC;AAEF,OAAI,SAAS,MACX,OAAM,IAAI,iBAAiB,KAAK,UAAU,SAAS,MAAM,CAAC;AAG5D,UAAO,SAAS,KAAK;;EAMvB,OAAO,OAAO,UAAkB;GAC9B,MAAM,WAAW,MAAM,KAAK,OAAO,IAAI,6BAA6B,EAClE,QAAQ,EAAE,MAAM,EAAE,QAAQ,OAAO,EAAE,EACpC,CAAC;AAEF,OAAI,SAAS,MACX,OAAM,IAAI,iBAAiB,KAAK,UAAU,SAAS,MAAM,CAAC;AAG5D,UAAO,SAAS;;EAMlB,mBAAmB,OACjB,OACA,UAGI,EAAE,KACsB;AAC5B,UAAO,KAAK,mBAAmC,OAAO,KAAK,SAAS,OAAO,UAAU,QAAQ;;EAoB/F,WAAW,OAAO,EAChB,UACA,QACA,UACA,WAAW,GACX,YAAY,MACZ,iBAAiB,KAAK,sBACtB,QACA,cAAc,WACkC;GAChD,MAAM,SAAoC,EAAE;GAC5C,MAAM,SAAoC,EAAE;GAE5C,MAAM,UAAU,OAAO,SAA4D;IACjF,MAAM,OAAkC,EAAE;IAC1C,IAAI,SAAS,KAAK;IAClB,MAAM,QAAQ,KAAK,YAAY;AAC/B,SAAK,IAAI,OAAO,GAAG,OAAO,OAAO,QAAQ;AACvC,SAAI,QAAQ,QAAS,OAAM,IAAI,gBAAgB,wBAAwB;KACvE,MAAM,MAAM,MAAM,KAAK,SAAS,OAAO;MAAE;MAAQ;MAAQ,EAAE,EAAE,QAAQ,CAAC;AACtE,UAAK,KAAK,GAAG,IAAI,QAAQ;KAIzB,MAAM,OAAO,IAAI;AACjB,SAAI,CAAC,KAAM;AACX,cAAS;;AAEX,WAAO;;AAGT,QAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,gBAAgB;AACxD,QAAI,QAAQ,QAAS,OAAM,IAAI,gBAAgB,wBAAwB;IACvE,MAAM,QAAQ,SAAS,MAAM,GAAG,IAAI,eAAe;IACnD,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,IAAI,OAAO,MAAM,eAAe;AACpC,SAAI;AACF,aAAO,MAAM,QAAQ,KAAK;cACnB,KAAK;MACZ,MAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC;AACjE,aAAO,KAAK;OAAE,aAAa,IAAI;OAAY;OAAO,CAAC;AACnD,UAAI,YAAa,OAAM;AACvB,aAAO,EAAE;;MAEX,CACH;AACD,SAAK,MAAM,QAAQ,QAAS,QAAO,KAAK,GAAG,KAAK;;GAGlD,MAAM,UAAU,UAAU,SAAS,cAAc,QAAQ,SAAS,GAAG;AACrE,UAAO;IACL,SAAS,YAAY,iBAAiB,QAAQ,GAAG;IACjD;IACD;;EAEJ;CAED,AAAQ,MAAM,IAAY,QAAqC;AAC7D,SAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,UAAU,WAAW,SAAS,GAAG;AAEvC,OAAI,QAAQ;IACV,MAAM,gBAAgB;AACpB,kBAAa,QAAQ;AACrB,YAAO,IAAI,gBAAgB,oBAAoB,CAAC;;AAGlD,QAAI,OAAO,SAAS;AAClB,kBAAa,QAAQ;AACrB,YAAO,IAAI,gBAAgB,oBAAoB,CAAC;AAChD;;AAGF,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM,CAAC;;IAE3D;;;;;;;AAQN,SAAS,cACP,MACA,QAC2B;CAC3B,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,MAAiC,EAAE;AACzC,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ;EACd,MAAM,QAAkB,EAAE;EAC1B,IAAI,UAAU;AACd,OAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,OAAO,MAAM;AACnB,OAAI,QAAQ,QAAQ,KAAK,SAAS,MAAM;AACtC,cAAU;AACV;;AAEF,SAAM,KAAK,KAAK,UAAU,KAAK,MAAM,CAAC;;AAExC,MAAI,CAAC,SAAS;AACZ,OAAI,KAAK,IAAI;AACb;;EAEF,MAAM,MAAM,MAAM,KAAK,KAAI;AAC3B,MAAI,KAAK,IAAI,IAAI,CAAE;AACnB,OAAK,IAAI,IAAI;AACb,MAAI,KAAK,IAAI;;AAEf,QAAO;;;;;;;AAQT,SAAS,iBAAiB,MAA4D;CACpF,MAAM,uBAAO,IAAI,KAAa;AAC9B,MAAK,MAAM,OAAO,KAChB,MAAK,MAAM,OAAO,OAAO,KAAK,IAAI,CAAE,MAAK,IAAI,IAAI;AAEnD,QAAO,KAAK,KAAK,QAAQ;EACvB,MAAM,SAAS;EACf,MAAM,MAA+B,EAAE;AACvC,OAAK,MAAM,OAAO,KAChB,KAAI,OAAO,OAAO,SAAS,OAAO,OAAO;AAE3C,SAAO;GACP"}
|