@trigger.dev/core 3.0.0-beta.39 → 3.0.0-beta.40

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.
@@ -1,6 +1,5 @@
1
1
  import { z } from 'zod';
2
2
  import { R as RetryOptions } from '../schemas-Sb0sJcEt.mjs';
3
- import { Readable } from 'node:stream';
4
3
 
5
4
  interface CursorPageParams {
6
5
  limit?: number;
@@ -92,65 +91,10 @@ interface FetchOffsetLimitPageParams extends OffsetLimitPageParams {
92
91
  declare function zodfetch<TResponseBodySchema extends z.ZodTypeAny>(schema: TResponseBodySchema, url: string, requestInit?: RequestInit, options?: ZodFetchOptions): ApiPromise<z.output<TResponseBodySchema>>;
93
92
  declare function zodfetchCursorPage<TItemSchema extends z.ZodTypeAny>(schema: TItemSchema, url: string, params: FetchCursorPageParams, requestInit?: RequestInit, options?: ZodFetchOptions): CursorPagePromise<TItemSchema>;
94
93
  declare function zodfetchOffsetLimitPage<TItemSchema extends z.ZodTypeAny>(schema: TItemSchema, url: string, params: FetchOffsetLimitPageParams, requestInit?: RequestInit, options?: ZodFetchOptions): OffsetLimitPagePromise<TItemSchema>;
95
- declare function zodupload<TResponseBodySchema extends z.ZodTypeAny, TBody = Record<string, unknown>>(schema: TResponseBodySchema, url: string, body: TBody, requestInit?: RequestInit, options?: ZodFetchOptions): ApiPromise<z.output<TResponseBodySchema>>;
96
94
  type ZodFetchResult<T> = {
97
95
  data: T;
98
96
  response: Response;
99
97
  };
100
- type ToFileInput = Uploadable | Exclude<BlobLikePart, string> | AsyncIterable<BlobLikePart>;
101
- /**
102
- * Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats
103
- * @param value the raw content of the file. Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s
104
- * @param {string=} name the name of the file. If omitted, toFile will try to determine a file name from bits if possible
105
- * @param {Object=} options additional properties
106
- * @param {string=} options.type the MIME type of the content
107
- * @param {number=} options.lastModified the last modified timestamp
108
- * @returns a {@link File} with the given properties
109
- */
110
- declare function toFile(value: ToFileInput | PromiseLike<ToFileInput>, name?: string | null | undefined, options?: FilePropertyBag | undefined): Promise<FileLike>;
111
- /**
112
- * Intended to match web.Blob, node.Blob, node-fetch.Blob, etc.
113
- */
114
- interface BlobLike {
115
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size) */
116
- readonly size: number;
117
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type) */
118
- readonly type: string;
119
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text) */
120
- text(): Promise<string>;
121
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice) */
122
- slice(start?: number, end?: number): BlobLike;
123
- }
124
- /**
125
- * Intended to match web.File, node.File, node-fetch.File, etc.
126
- */
127
- interface FileLike extends BlobLike {
128
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified) */
129
- readonly lastModified: number;
130
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name) */
131
- readonly name: string;
132
- }
133
- /**
134
- * Intended to match web.Response, node.Response, node-fetch.Response, etc.
135
- */
136
- interface ResponseLike {
137
- url: string;
138
- blob(): Promise<BlobLike>;
139
- }
140
- type Uploadable = FileLike | ResponseLike | Readable;
141
- declare const isResponseLike: (value: any) => value is ResponseLike;
142
- declare const isFileLike: (value: any) => value is FileLike;
143
- /**
144
- * The BlobLike type omits arrayBuffer() because @types/node-fetch@^2.6.4 lacks it; but this check
145
- * adds the arrayBuffer() method type because it is available and used at runtime
146
- */
147
- declare const isBlobLike: (value: any) => value is BlobLike & {
148
- arrayBuffer(): Promise<ArrayBuffer>;
149
- };
150
- declare const isFsReadStream: (value: any) => value is Readable;
151
- declare const isUploadable: (value: any) => value is Uploadable;
152
- type BlobLikePart = string | ArrayBuffer | ArrayBufferView | BlobLike | Uint8Array | DataView;
153
- declare const isRecordLike: (value: any) => value is Record<string, string>;
154
98
  /**
155
99
  * A subclass of `Promise` providing additional helper methods
156
100
  * for interacting with the SDK.
@@ -259,4 +203,4 @@ declare class RateLimitError extends ApiError {
259
203
  declare class InternalServerError extends ApiError {
260
204
  }
261
205
 
262
- export { type APIHeaders, ApiConnectionError, ApiError, ApiPromise, AuthenticationError, BadRequestError, type BlobLike, type BlobLikePart, ConflictError, CursorPage, type CursorPageParams, CursorPagePromise, type CursorPageResponse, type FileLike, InternalServerError, NotFoundError, OffsetLimitPage, type OffsetLimitPageParams, OffsetLimitPagePromise, type OffsetLimitPageResponse, type Page, type PageResponse, PermissionDeniedError, RateLimitError, type ResponseLike, type ToFileInput, UnprocessableEntityError, type Uploadable, type ZodFetchOptions, defaultRetryOptions, isBlobLike, isFileLike, isFsReadStream, isRecordLike, isResponseLike, isUploadable, toFile, zodfetch, zodfetchCursorPage, zodfetchOffsetLimitPage, zodupload };
206
+ export { type APIHeaders, ApiConnectionError, ApiError, ApiPromise, AuthenticationError, BadRequestError, ConflictError, CursorPage, type CursorPageParams, CursorPagePromise, type CursorPageResponse, InternalServerError, NotFoundError, OffsetLimitPage, type OffsetLimitPageParams, OffsetLimitPagePromise, type OffsetLimitPageResponse, type Page, type PageResponse, PermissionDeniedError, RateLimitError, UnprocessableEntityError, type ZodFetchOptions, defaultRetryOptions, zodfetch, zodfetchCursorPage, zodfetchOffsetLimitPage };
@@ -1,6 +1,5 @@
1
1
  import { z } from 'zod';
2
2
  import { R as RetryOptions } from '../schemas-Sb0sJcEt.js';
3
- import { Readable } from 'node:stream';
4
3
 
5
4
  interface CursorPageParams {
6
5
  limit?: number;
@@ -92,65 +91,10 @@ interface FetchOffsetLimitPageParams extends OffsetLimitPageParams {
92
91
  declare function zodfetch<TResponseBodySchema extends z.ZodTypeAny>(schema: TResponseBodySchema, url: string, requestInit?: RequestInit, options?: ZodFetchOptions): ApiPromise<z.output<TResponseBodySchema>>;
93
92
  declare function zodfetchCursorPage<TItemSchema extends z.ZodTypeAny>(schema: TItemSchema, url: string, params: FetchCursorPageParams, requestInit?: RequestInit, options?: ZodFetchOptions): CursorPagePromise<TItemSchema>;
94
93
  declare function zodfetchOffsetLimitPage<TItemSchema extends z.ZodTypeAny>(schema: TItemSchema, url: string, params: FetchOffsetLimitPageParams, requestInit?: RequestInit, options?: ZodFetchOptions): OffsetLimitPagePromise<TItemSchema>;
95
- declare function zodupload<TResponseBodySchema extends z.ZodTypeAny, TBody = Record<string, unknown>>(schema: TResponseBodySchema, url: string, body: TBody, requestInit?: RequestInit, options?: ZodFetchOptions): ApiPromise<z.output<TResponseBodySchema>>;
96
94
  type ZodFetchResult<T> = {
97
95
  data: T;
98
96
  response: Response;
99
97
  };
100
- type ToFileInput = Uploadable | Exclude<BlobLikePart, string> | AsyncIterable<BlobLikePart>;
101
- /**
102
- * Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats
103
- * @param value the raw content of the file. Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s
104
- * @param {string=} name the name of the file. If omitted, toFile will try to determine a file name from bits if possible
105
- * @param {Object=} options additional properties
106
- * @param {string=} options.type the MIME type of the content
107
- * @param {number=} options.lastModified the last modified timestamp
108
- * @returns a {@link File} with the given properties
109
- */
110
- declare function toFile(value: ToFileInput | PromiseLike<ToFileInput>, name?: string | null | undefined, options?: FilePropertyBag | undefined): Promise<FileLike>;
111
- /**
112
- * Intended to match web.Blob, node.Blob, node-fetch.Blob, etc.
113
- */
114
- interface BlobLike {
115
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size) */
116
- readonly size: number;
117
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type) */
118
- readonly type: string;
119
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text) */
120
- text(): Promise<string>;
121
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice) */
122
- slice(start?: number, end?: number): BlobLike;
123
- }
124
- /**
125
- * Intended to match web.File, node.File, node-fetch.File, etc.
126
- */
127
- interface FileLike extends BlobLike {
128
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified) */
129
- readonly lastModified: number;
130
- /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name) */
131
- readonly name: string;
132
- }
133
- /**
134
- * Intended to match web.Response, node.Response, node-fetch.Response, etc.
135
- */
136
- interface ResponseLike {
137
- url: string;
138
- blob(): Promise<BlobLike>;
139
- }
140
- type Uploadable = FileLike | ResponseLike | Readable;
141
- declare const isResponseLike: (value: any) => value is ResponseLike;
142
- declare const isFileLike: (value: any) => value is FileLike;
143
- /**
144
- * The BlobLike type omits arrayBuffer() because @types/node-fetch@^2.6.4 lacks it; but this check
145
- * adds the arrayBuffer() method type because it is available and used at runtime
146
- */
147
- declare const isBlobLike: (value: any) => value is BlobLike & {
148
- arrayBuffer(): Promise<ArrayBuffer>;
149
- };
150
- declare const isFsReadStream: (value: any) => value is Readable;
151
- declare const isUploadable: (value: any) => value is Uploadable;
152
- type BlobLikePart = string | ArrayBuffer | ArrayBufferView | BlobLike | Uint8Array | DataView;
153
- declare const isRecordLike: (value: any) => value is Record<string, string>;
154
98
  /**
155
99
  * A subclass of `Promise` providing additional helper methods
156
100
  * for interacting with the SDK.
@@ -259,4 +203,4 @@ declare class RateLimitError extends ApiError {
259
203
  declare class InternalServerError extends ApiError {
260
204
  }
261
205
 
262
- export { type APIHeaders, ApiConnectionError, ApiError, ApiPromise, AuthenticationError, BadRequestError, type BlobLike, type BlobLikePart, ConflictError, CursorPage, type CursorPageParams, CursorPagePromise, type CursorPageResponse, type FileLike, InternalServerError, NotFoundError, OffsetLimitPage, type OffsetLimitPageParams, OffsetLimitPagePromise, type OffsetLimitPageResponse, type Page, type PageResponse, PermissionDeniedError, RateLimitError, type ResponseLike, type ToFileInput, UnprocessableEntityError, type Uploadable, type ZodFetchOptions, defaultRetryOptions, isBlobLike, isFileLike, isFsReadStream, isRecordLike, isResponseLike, isUploadable, toFile, zodfetch, zodfetchCursorPage, zodfetchOffsetLimitPage, zodupload };
206
+ export { type APIHeaders, ApiConnectionError, ApiError, ApiPromise, AuthenticationError, BadRequestError, ConflictError, CursorPage, type CursorPageParams, CursorPagePromise, type CursorPageResponse, InternalServerError, NotFoundError, OffsetLimitPage, type OffsetLimitPageParams, OffsetLimitPagePromise, type OffsetLimitPageResponse, type Page, type PageResponse, PermissionDeniedError, RateLimitError, UnprocessableEntityError, type ZodFetchOptions, defaultRetryOptions, zodfetch, zodfetchCursorPage, zodfetchOffsetLimitPage };
@@ -2,8 +2,6 @@
2
2
 
3
3
  var zod = require('zod');
4
4
  var zodValidationError = require('zod-validation-error');
5
- var formDataEncoder = require('form-data-encoder');
6
- var stream = require('stream');
7
5
 
8
6
  var __defProp = Object.defineProperty;
9
7
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -345,37 +343,6 @@ function zodfetchOffsetLimitPage(schema, url, params, requestInit, options) {
345
343
  return new OffsetLimitPagePromise(fetchResult, schema, url, params, requestInit, options);
346
344
  }
347
345
  __name(zodfetchOffsetLimitPage, "zodfetchOffsetLimitPage");
348
- function zodupload(schema, url, body, requestInit, options) {
349
- const finalRequestInit = createMultipartFormRequestInit(body, requestInit);
350
- return new ApiPromise(_doZodFetch(schema, url, finalRequestInit, options));
351
- }
352
- __name(zodupload, "zodupload");
353
- async function createMultipartFormRequestInit(body, requestInit) {
354
- const form = await createForm(body);
355
- const encoder = new formDataEncoder.FormDataEncoder(form);
356
- const finalHeaders = {};
357
- for (const [key, value] of Object.entries(requestInit?.headers || {})) {
358
- finalHeaders[key] = value;
359
- }
360
- for (const [key, value] of Object.entries(encoder.headers)) {
361
- finalHeaders[key] = value;
362
- }
363
- finalHeaders["Content-Length"] = String(encoder.contentLength);
364
- const finalRequestInit = {
365
- ...requestInit,
366
- headers: finalHeaders,
367
- body: stream.Readable.from(encoder),
368
- // @ts-expect-error
369
- duplex: "half"
370
- };
371
- return finalRequestInit;
372
- }
373
- __name(createMultipartFormRequestInit, "createMultipartFormRequestInit");
374
- var createForm = /* @__PURE__ */ __name(async (body) => {
375
- const form = new FormData();
376
- await Promise.all(Object.entries(body || {}).map(([key, value]) => addFormValue(form, key, value)));
377
- return form;
378
- }, "createForm");
379
346
  async function _doZodFetch(schema, url, requestInit, options, attempt = 1) {
380
347
  try {
381
348
  const $requestInit = await requestInit;
@@ -501,95 +468,6 @@ function requestInitWithCache(requestInit) {
501
468
  }
502
469
  }
503
470
  __name(requestInitWithCache, "requestInitWithCache");
504
- var addFormValue = /* @__PURE__ */ __name(async (form, key, value) => {
505
- if (value === void 0)
506
- return;
507
- if (value == null) {
508
- throw new TypeError(`Received null for "${key}"; to pass null in FormData, you must use the string 'null'`);
509
- }
510
- if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
511
- form.append(key, String(value));
512
- } else if (isUploadable(value) || isBlobLike(value) || value instanceof Buffer || value instanceof ArrayBuffer) {
513
- const file = await toFile(value);
514
- form.append(key, file);
515
- } else if (Array.isArray(value)) {
516
- await Promise.all(value.map((entry) => addFormValue(form, key + "[]", entry)));
517
- } else if (typeof value === "object") {
518
- await Promise.all(Object.entries(value).map(([name, prop]) => addFormValue(form, `${key}[${name}]`, prop)));
519
- } else {
520
- throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`);
521
- }
522
- }, "addFormValue");
523
- async function toFile(value, name, options) {
524
- value = await value;
525
- options ??= isFileLike(value) ? {
526
- lastModified: value.lastModified,
527
- type: value.type
528
- } : {};
529
- if (isResponseLike(value)) {
530
- const blob = await value.blob();
531
- name ||= new URL(value.url).pathname.split(/[\\/]/).pop() ?? "unknown_file";
532
- return new File([
533
- blob
534
- ], name, options);
535
- }
536
- const bits = await getBytes(value);
537
- name ||= getName(value) ?? "unknown_file";
538
- if (!options.type) {
539
- const type = bits[0]?.type;
540
- if (typeof type === "string") {
541
- options = {
542
- ...options,
543
- type
544
- };
545
- }
546
- }
547
- return new File(bits, name, options);
548
- }
549
- __name(toFile, "toFile");
550
- function getName(value) {
551
- return getStringFromMaybeBuffer(value.name) || getStringFromMaybeBuffer(value.filename) || // For fs.ReadStream
552
- getStringFromMaybeBuffer(value.path)?.split(/[\\/]/).pop();
553
- }
554
- __name(getName, "getName");
555
- var getStringFromMaybeBuffer = /* @__PURE__ */ __name((x) => {
556
- if (typeof x === "string")
557
- return x;
558
- if (typeof Buffer !== "undefined" && x instanceof Buffer)
559
- return String(x);
560
- return void 0;
561
- }, "getStringFromMaybeBuffer");
562
- async function getBytes(value) {
563
- let parts = [];
564
- if (typeof value === "string" || ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc.
565
- value instanceof ArrayBuffer) {
566
- parts.push(value);
567
- } else if (isBlobLike(value)) {
568
- parts.push(await value.arrayBuffer());
569
- } else if (isAsyncIterableIterator(value)) {
570
- for await (const chunk of value) {
571
- parts.push(chunk);
572
- }
573
- } else {
574
- throw new Error(`Unexpected data type: ${typeof value}; constructor: ${value?.constructor?.name}; props: ${propsForError(value)}`);
575
- }
576
- return parts;
577
- }
578
- __name(getBytes, "getBytes");
579
- function propsForError(value) {
580
- const props = Object.getOwnPropertyNames(value);
581
- return `[${props.map((p) => `"${p}"`).join(", ")}]`;
582
- }
583
- __name(propsForError, "propsForError");
584
- var isAsyncIterableIterator = /* @__PURE__ */ __name((value) => value != null && typeof value === "object" && typeof value[Symbol.asyncIterator] === "function", "isAsyncIterableIterator");
585
- var isResponseLike = /* @__PURE__ */ __name((value) => value != null && typeof value === "object" && typeof value.url === "string" && typeof value.blob === "function", "isResponseLike");
586
- var isFileLike = /* @__PURE__ */ __name((value) => value != null && typeof value === "object" && typeof value.name === "string" && typeof value.lastModified === "number" && isBlobLike(value), "isFileLike");
587
- var isBlobLike = /* @__PURE__ */ __name((value) => value != null && typeof value === "object" && typeof value.size === "number" && typeof value.type === "string" && typeof value.text === "function" && typeof value.slice === "function" && typeof value.arrayBuffer === "function", "isBlobLike");
588
- var isFsReadStream = /* @__PURE__ */ __name((value) => value instanceof stream.Readable, "isFsReadStream");
589
- var isUploadable = /* @__PURE__ */ __name((value) => {
590
- return isFileLike(value) || isResponseLike(value) || isFsReadStream(value);
591
- }, "isUploadable");
592
- var isRecordLike = /* @__PURE__ */ __name((value) => value != null && typeof value === "object" && !Array.isArray(value) && Object.keys(value).length > 0 && Object.keys(value).every((key) => typeof key === "string" && typeof value[key] === "string"), "isRecordLike");
593
471
  var _ApiPromise = class _ApiPromise extends Promise {
594
472
  constructor(responsePromise) {
595
473
  super((resolve) => {
@@ -729,16 +607,8 @@ exports.PermissionDeniedError = PermissionDeniedError;
729
607
  exports.RateLimitError = RateLimitError;
730
608
  exports.UnprocessableEntityError = UnprocessableEntityError;
731
609
  exports.defaultRetryOptions = defaultRetryOptions2;
732
- exports.isBlobLike = isBlobLike;
733
- exports.isFileLike = isFileLike;
734
- exports.isFsReadStream = isFsReadStream;
735
- exports.isRecordLike = isRecordLike;
736
- exports.isResponseLike = isResponseLike;
737
- exports.isUploadable = isUploadable;
738
- exports.toFile = toFile;
739
610
  exports.zodfetch = zodfetch;
740
611
  exports.zodfetchCursorPage = zodfetchCursorPage;
741
612
  exports.zodfetchOffsetLimitPage = zodfetchOffsetLimitPage;
742
- exports.zodupload = zodupload;
743
613
  //# sourceMappingURL=out.js.map
744
614
  //# sourceMappingURL=zodfetch.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/v3/apiClient/core.ts","../../src/v3/apiClient/errors.ts","../../src/v3/utils/retries.ts","../../src/v3/apiClient/pagination.ts"],"names":["z","fromZodError","ApiError","Error","constructor","status","error","message","headers","makeMessage","data","code","param","type","msg","JSON","stringify","generate","errorResponse","ApiConnectionError","cause","castToError","BadRequestError","AuthenticationError","PermissionDeniedError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","undefined","err","defaultRetryOptions","maxAttempts","factor","minTimeoutInMs","maxTimeoutInMs","randomize","defaultFetchRetryOptions","byStatus","strategy","connectionError","timeout","calculateNextRetryDelay","options","attempt","opts","random","Math","min","pow","round","FormDataEncoder","Readable","CursorPage","pagination","pageFetcher","getPaginatedItems","hasNextPage","next","hasPreviousPage","previous","getNextPage","after","getPreviousPage","before","iterPages","page","Symbol","asyncIterator","item","OffsetLimitPage","currentPage","totalPages","zodfetch","schema","url","requestInit","ApiPromise","_doZodFetch","zodfetchCursorPage","params","query","URLSearchParams","limit","set","String","cursorPageSchema","object","array","string","optional","$url","URL","search","toString","fetchResult","href","CursorPagePromise","zodfetchOffsetLimitPage","offsetLimitPageSchema","coerce","number","count","OffsetLimitPagePromise","zodupload","body","finalRequestInit","createMultipartFormRequestInit","form","createForm","encoder","finalHeaders","key","value","Object","entries","contentLength","from","duplex","FormData","Promise","all","map","addFormValue","$requestInit","response","fetch","requestInitWithCache","responseHeaders","createResponseHeaders","ok","retryResult","shouldRetry","retry","resolve","setTimeout","delay","errText","text","catch","e","errJSON","safeJsonParse","errMessage","jsonBody","json","parsedResult","safeParse","success","retryOptions","shouldRetryForOptions","shouldRetryHeader","get","parse","Proxy","fromEntries","target","name","toLowerCase","withCache","cache","_","Request","TypeError","append","isUploadable","isBlobLike","Buffer","ArrayBuffer","file","toFile","Array","isArray","entry","prop","isFileLike","lastModified","isResponseLike","blob","pathname","split","pop","File","bits","getBytes","getName","getStringFromMaybeBuffer","filename","path","x","parts","isView","push","arrayBuffer","isAsyncIterableIterator","chunk","propsForError","props","getOwnPropertyNames","p","join","size","slice","isFsReadStream","isRecordLike","keys","length","every","responsePromise","asResponse","then","withResponse","result","onfulfilled","onrejected","finally","onfinally","bind","_fetchPage","fetchPage_fn"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport { fromZodError } from \"zod-validation-error\";\nimport { ApiConnectionError, ApiError } from \"./errors\";\nimport { RetryOptions } from \"../schemas\";\nimport { calculateNextRetryDelay } from \"../utils/retries\";\nimport { FormDataEncoder } from \"form-data-encoder\";\nimport { Readable } from \"node:stream\";\nimport {\n CursorPage,\n CursorPageParams,\n CursorPageResponse,\n OffsetLimitPage,\n OffsetLimitPageParams,\n OffsetLimitPageResponse,\n} from \"./pagination\";\n\nexport const defaultRetryOptions = {\n maxAttempts: 3,\n factor: 2,\n minTimeoutInMs: 1000,\n maxTimeoutInMs: 60000,\n randomize: false,\n} satisfies RetryOptions;\n\nexport type ZodFetchOptions = {\n retry?: RetryOptions;\n};\n\ninterface FetchCursorPageParams extends CursorPageParams {\n query?: URLSearchParams;\n}\n\ninterface FetchOffsetLimitPageParams extends OffsetLimitPageParams {\n query?: URLSearchParams;\n}\n\nexport function zodfetch<TResponseBodySchema extends z.ZodTypeAny>(\n schema: TResponseBodySchema,\n url: string,\n requestInit?: RequestInit,\n options?: ZodFetchOptions\n): ApiPromise<z.output<TResponseBodySchema>> {\n return new ApiPromise(_doZodFetch(schema, url, requestInit, options));\n}\n\nexport function zodfetchCursorPage<TItemSchema extends z.ZodTypeAny>(\n schema: TItemSchema,\n url: string,\n params: FetchCursorPageParams,\n requestInit?: RequestInit,\n options?: ZodFetchOptions\n) {\n const query = new URLSearchParams(params.query);\n\n if (params.limit) {\n query.set(\"page[size]\", String(params.limit));\n }\n\n if (params.after) {\n query.set(\"page[after]\", params.after);\n }\n\n if (params.before) {\n query.set(\"page[before]\", params.before);\n }\n\n const cursorPageSchema = z.object({\n data: z.array(schema),\n pagination: z.object({\n next: z.string().optional(),\n previous: z.string().optional(),\n }),\n });\n\n const $url = new URL(url);\n $url.search = query.toString();\n\n const fetchResult = _doZodFetch(cursorPageSchema, $url.href, requestInit, options);\n\n return new CursorPagePromise(fetchResult, schema, url, params, requestInit, options);\n}\n\nexport function zodfetchOffsetLimitPage<TItemSchema extends z.ZodTypeAny>(\n schema: TItemSchema,\n url: string,\n params: FetchOffsetLimitPageParams,\n requestInit?: RequestInit,\n options?: ZodFetchOptions\n) {\n const query = new URLSearchParams(params.query);\n\n if (params.limit) {\n query.set(\"perPage\", String(params.limit));\n }\n\n if (params.page) {\n query.set(\"page\", String(params.page));\n }\n\n const offsetLimitPageSchema = z.object({\n data: z.array(schema),\n pagination: z.object({\n currentPage: z.coerce.number(),\n totalPages: z.coerce.number(),\n count: z.coerce.number(),\n }),\n });\n\n const $url = new URL(url);\n $url.search = query.toString();\n\n const fetchResult = _doZodFetch(offsetLimitPageSchema, $url.href, requestInit, options);\n\n return new OffsetLimitPagePromise(fetchResult, schema, url, params, requestInit, options);\n}\n\nexport function zodupload<\n TResponseBodySchema extends z.ZodTypeAny,\n TBody = Record<string, unknown>,\n>(\n schema: TResponseBodySchema,\n url: string,\n body: TBody,\n requestInit?: RequestInit,\n options?: ZodFetchOptions\n): ApiPromise<z.output<TResponseBodySchema>> {\n const finalRequestInit = createMultipartFormRequestInit(body, requestInit);\n\n return new ApiPromise(_doZodFetch(schema, url, finalRequestInit, options));\n}\n\nasync function createMultipartFormRequestInit<TBody = Record<string, unknown>>(\n body: TBody,\n requestInit?: RequestInit\n): Promise<RequestInit> {\n const form = await createForm(body);\n const encoder = new FormDataEncoder(form);\n\n const finalHeaders: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(requestInit?.headers || {})) {\n finalHeaders[key] = value as string;\n }\n\n for (const [key, value] of Object.entries(encoder.headers)) {\n finalHeaders[key] = value;\n }\n\n finalHeaders[\"Content-Length\"] = String(encoder.contentLength);\n\n const finalRequestInit: RequestInit = {\n ...requestInit,\n headers: finalHeaders,\n body: Readable.from(encoder) as any,\n // @ts-expect-error\n duplex: \"half\",\n };\n\n return finalRequestInit;\n}\n\nconst createForm = async <T = Record<string, unknown>>(body: T | undefined): Promise<FormData> => {\n const form = new FormData();\n await Promise.all(\n Object.entries(body || {}).map(([key, value]) => addFormValue(form, key, value))\n );\n return form;\n};\n\ntype ZodFetchResult<T> = {\n data: T;\n response: Response;\n};\n\ntype PromiseOrValue<T> = T | Promise<T>;\n\nasync function _doZodFetch<TResponseBodySchema extends z.ZodTypeAny>(\n schema: TResponseBodySchema,\n url: string,\n requestInit?: PromiseOrValue<RequestInit>,\n options?: ZodFetchOptions,\n attempt = 1\n): Promise<ZodFetchResult<z.output<TResponseBodySchema>>> {\n try {\n const $requestInit = await requestInit;\n\n const response = await fetch(url, requestInitWithCache($requestInit));\n\n const responseHeaders = createResponseHeaders(response.headers);\n\n if (!response.ok) {\n const retryResult = shouldRetry(response, attempt, options?.retry);\n\n if (retryResult.retry) {\n await new Promise((resolve) => setTimeout(resolve, retryResult.delay));\n\n return await _doZodFetch(schema, url, requestInit, options, attempt + 1);\n } else {\n const errText = await response.text().catch((e) => castToError(e).message);\n const errJSON = safeJsonParse(errText);\n const errMessage = errJSON ? undefined : errText;\n\n throw ApiError.generate(response.status, errJSON, errMessage, responseHeaders);\n }\n }\n\n const jsonBody = await response.json();\n const parsedResult = schema.safeParse(jsonBody);\n\n if (parsedResult.success) {\n return { data: parsedResult.data, response };\n }\n\n throw fromZodError(parsedResult.error);\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n\n if (options?.retry) {\n const retry = { ...defaultRetryOptions, ...options.retry };\n\n const delay = calculateNextRetryDelay(retry, attempt);\n\n if (delay) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n return await _doZodFetch(schema, url, requestInit, options, attempt + 1);\n }\n }\n\n throw new ApiConnectionError({ cause: castToError(error) });\n }\n}\n\nfunction castToError(err: any): Error {\n if (err instanceof Error) return err;\n return new Error(err);\n}\n\ntype ShouldRetryResult =\n | {\n retry: false;\n }\n | {\n retry: true;\n delay: number;\n };\n\nfunction shouldRetry(\n response: Response,\n attempt: number,\n retryOptions?: RetryOptions\n): ShouldRetryResult {\n function shouldRetryForOptions(): ShouldRetryResult {\n const retry = { ...defaultRetryOptions, ...retryOptions };\n\n const delay = calculateNextRetryDelay(retry, attempt);\n\n if (delay) {\n return { retry: true, delay };\n } else {\n return { retry: false };\n }\n }\n\n // Note this is not a standard header.\n const shouldRetryHeader = response.headers.get(\"x-should-retry\");\n\n // If the server explicitly says whether or not to retry, obey.\n if (shouldRetryHeader === \"true\") return shouldRetryForOptions();\n if (shouldRetryHeader === \"false\") return { retry: false };\n\n // Retry on request timeouts.\n if (response.status === 408) return shouldRetryForOptions();\n\n // Retry on lock timeouts.\n if (response.status === 409) return shouldRetryForOptions();\n\n // Retry on rate limits.\n if (response.status === 429) return shouldRetryForOptions();\n\n // Retry internal errors.\n if (response.status >= 500) return shouldRetryForOptions();\n\n return { retry: false };\n}\n\nfunction safeJsonParse(text: string): any {\n try {\n return JSON.parse(text);\n } catch (e) {\n return undefined;\n }\n}\n\nfunction createResponseHeaders(headers: Response[\"headers\"]): Record<string, string> {\n return new Proxy(\n Object.fromEntries(\n // @ts-ignore\n headers.entries()\n ),\n {\n get(target, name) {\n const key = name.toString();\n return target[key.toLowerCase()] || target[key];\n },\n }\n );\n}\n\nfunction requestInitWithCache(requestInit?: RequestInit): RequestInit {\n try {\n const withCache: RequestInit = {\n ...requestInit,\n cache: \"no-cache\",\n };\n\n const _ = new Request(\"http://localhost\", withCache);\n\n return withCache;\n } catch (error) {\n return requestInit ?? {};\n }\n}\n\nconst addFormValue = async (form: FormData, key: string, value: unknown): Promise<void> => {\n if (value === undefined) return;\n if (value == null) {\n throw new TypeError(\n `Received null for \"${key}\"; to pass null in FormData, you must use the string 'null'`\n );\n }\n\n // TODO: make nested formats configurable\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n form.append(key, String(value));\n } else if (\n isUploadable(value) ||\n isBlobLike(value) ||\n value instanceof Buffer ||\n value instanceof ArrayBuffer\n ) {\n const file = await toFile(value);\n form.append(key, file as File);\n } else if (Array.isArray(value)) {\n await Promise.all(value.map((entry) => addFormValue(form, key + \"[]\", entry)));\n } else if (typeof value === \"object\") {\n await Promise.all(\n Object.entries(value).map(([name, prop]) => addFormValue(form, `${key}[${name}]`, prop))\n );\n } else {\n throw new TypeError(\n `Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`\n );\n }\n};\n\nexport type ToFileInput = Uploadable | Exclude<BlobLikePart, string> | AsyncIterable<BlobLikePart>;\n\n/**\n * Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats\n * @param value the raw content of the file. Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s\n * @param {string=} name the name of the file. If omitted, toFile will try to determine a file name from bits if possible\n * @param {Object=} options additional properties\n * @param {string=} options.type the MIME type of the content\n * @param {number=} options.lastModified the last modified timestamp\n * @returns a {@link File} with the given properties\n */\nexport async function toFile(\n value: ToFileInput | PromiseLike<ToFileInput>,\n name?: string | null | undefined,\n options?: FilePropertyBag | undefined\n): Promise<FileLike> {\n // If it's a promise, resolve it.\n value = await value;\n\n // Use the file's options if there isn't one provided\n options ??= isFileLike(value) ? { lastModified: value.lastModified, type: value.type } : {};\n\n if (isResponseLike(value)) {\n const blob = await value.blob();\n name ||= new URL(value.url).pathname.split(/[\\\\/]/).pop() ?? \"unknown_file\";\n\n return new File([blob as any], name, options);\n }\n\n const bits = await getBytes(value);\n\n name ||= getName(value) ?? \"unknown_file\";\n\n if (!options.type) {\n const type = (bits[0] as any)?.type;\n if (typeof type === \"string\") {\n options = { ...options, type };\n }\n }\n\n return new File(bits, name, options);\n}\n\nfunction getName(value: any): string | undefined {\n return (\n getStringFromMaybeBuffer(value.name) ||\n getStringFromMaybeBuffer(value.filename) ||\n // For fs.ReadStream\n getStringFromMaybeBuffer(value.path)?.split(/[\\\\/]/).pop()\n );\n}\n\nconst getStringFromMaybeBuffer = (x: string | Buffer | unknown): string | undefined => {\n if (typeof x === \"string\") return x;\n if (typeof Buffer !== \"undefined\" && x instanceof Buffer) return String(x);\n return undefined;\n};\n\nasync function getBytes(value: ToFileInput): Promise<Array<BlobPart>> {\n let parts: Array<BlobPart> = [];\n if (\n typeof value === \"string\" ||\n ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc.\n value instanceof ArrayBuffer\n ) {\n parts.push(value);\n } else if (isBlobLike(value)) {\n parts.push(await value.arrayBuffer());\n } else if (\n isAsyncIterableIterator(value) // includes Readable, ReadableStream, etc.\n ) {\n for await (const chunk of value) {\n parts.push(chunk as BlobPart); // TODO, consider validating?\n }\n } else {\n throw new Error(\n `Unexpected data type: ${typeof value}; constructor: ${value?.constructor\n ?.name}; props: ${propsForError(value)}`\n );\n }\n\n return parts;\n}\n\nfunction propsForError(value: any): string {\n const props = Object.getOwnPropertyNames(value);\n return `[${props.map((p) => `\"${p}\"`).join(\", \")}]`;\n}\n\nconst isAsyncIterableIterator = (value: any): value is AsyncIterableIterator<unknown> =>\n value != null && typeof value === \"object\" && typeof value[Symbol.asyncIterator] === \"function\";\n\n/**\n * Intended to match web.Blob, node.Blob, node-fetch.Blob, etc.\n */\nexport interface BlobLike {\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size) */\n readonly size: number;\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type) */\n readonly type: string;\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text) */\n text(): Promise<string>;\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice) */\n slice(start?: number, end?: number): BlobLike;\n // unfortunately @types/node-fetch@^2.6.4 doesn't type the arrayBuffer method\n}\n\n/**\n * Intended to match web.File, node.File, node-fetch.File, etc.\n */\nexport interface FileLike extends BlobLike {\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified) */\n readonly lastModified: number;\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name) */\n readonly name: string;\n}\n\n/**\n * Intended to match web.Response, node.Response, node-fetch.Response, etc.\n */\nexport interface ResponseLike {\n url: string;\n blob(): Promise<BlobLike>;\n}\n\nexport type Uploadable = FileLike | ResponseLike | Readable;\n\nexport const isResponseLike = (value: any): value is ResponseLike =>\n value != null &&\n typeof value === \"object\" &&\n typeof value.url === \"string\" &&\n typeof value.blob === \"function\";\n\nexport const isFileLike = (value: any): value is FileLike =>\n value != null &&\n typeof value === \"object\" &&\n typeof value.name === \"string\" &&\n typeof value.lastModified === \"number\" &&\n isBlobLike(value);\n\n/**\n * The BlobLike type omits arrayBuffer() because @types/node-fetch@^2.6.4 lacks it; but this check\n * adds the arrayBuffer() method type because it is available and used at runtime\n */\nexport const isBlobLike = (\n value: any\n): value is BlobLike & { arrayBuffer(): Promise<ArrayBuffer> } =>\n value != null &&\n typeof value === \"object\" &&\n typeof value.size === \"number\" &&\n typeof value.type === \"string\" &&\n typeof value.text === \"function\" &&\n typeof value.slice === \"function\" &&\n typeof value.arrayBuffer === \"function\";\n\nexport const isFsReadStream = (value: any): value is Readable => value instanceof Readable;\n\nexport const isUploadable = (value: any): value is Uploadable => {\n return isFileLike(value) || isResponseLike(value) || isFsReadStream(value);\n};\n\nexport type BlobLikePart =\n | string\n | ArrayBuffer\n | ArrayBufferView\n | BlobLike\n | Uint8Array\n | DataView;\n\nexport const isRecordLike = (value: any): value is Record<string, string> =>\n value != null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length > 0 &&\n Object.keys(value).every((key) => typeof key === \"string\" && typeof value[key] === \"string\");\n\n/**\n * A subclass of `Promise` providing additional helper methods\n * for interacting with the SDK.\n */\nexport class ApiPromise<T> extends Promise<T> {\n constructor(private responsePromise: Promise<ZodFetchResult<T>>) {\n super((resolve) => {\n // this is maybe a bit weird but this has to be a no-op to not implicitly\n // parse the response body; instead .then, .catch, .finally are overridden\n // to parse the response\n resolve(null as any);\n });\n }\n\n /**\n * Gets the raw `Response` instance instead of parsing the response\n * data.\n *\n * If you want to parse the response body but still get the `Response`\n * instance, you can use {@link withResponse()}.\n */\n asResponse(): Promise<Response> {\n return this.responsePromise.then((p) => p.response);\n }\n\n /**\n * Gets the parsed response data and the raw `Response` instance.\n *\n * If you just want to get the raw `Response` instance without parsing it,\n * you can use {@link asResponse()}.\n */\n async withResponse(): Promise<{ data: T; response: Response }> {\n const [data, response] = await Promise.all([this.parse(), this.asResponse()]);\n return { data, response };\n }\n\n private parse(): Promise<T> {\n return this.responsePromise.then((result) => result.data);\n }\n\n override then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null\n ): Promise<TResult1 | TResult2> {\n return this.parse().then(onfulfilled, onrejected);\n }\n\n override catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null\n ): Promise<T | TResult> {\n return this.parse().catch(onrejected);\n }\n\n override finally(onfinally?: (() => void) | undefined | null): Promise<T> {\n return this.parse().finally(onfinally);\n }\n}\n\nexport class CursorPagePromise<TItemSchema extends z.ZodTypeAny>\n extends ApiPromise<CursorPage<z.output<TItemSchema>>>\n implements AsyncIterable<z.output<TItemSchema>>\n{\n constructor(\n result: Promise<ZodFetchResult<CursorPageResponse<z.output<TItemSchema>>>>,\n private schema: TItemSchema,\n private url: string,\n private params: FetchCursorPageParams,\n private requestInit?: RequestInit,\n private options?: ZodFetchOptions\n ) {\n super(\n result.then((result) => ({\n data: new CursorPage(result.data.data, result.data.pagination, this.#fetchPage.bind(this)),\n response: result.response,\n }))\n );\n }\n\n #fetchPage(params: Omit<CursorPageParams, \"limit\">): Promise<CursorPage<z.output<TItemSchema>>> {\n return zodfetchCursorPage(\n this.schema,\n this.url,\n { ...this.params, ...params },\n this.requestInit,\n this.options\n );\n }\n\n /**\n * Allow auto-paginating iteration on an unawaited list call, eg:\n *\n * for await (const item of client.items.list()) {\n * console.log(item)\n * }\n */\n async *[Symbol.asyncIterator]() {\n const page = await this;\n for await (const item of page) {\n yield item;\n }\n }\n}\n\nexport class OffsetLimitPagePromise<TItemSchema extends z.ZodTypeAny>\n extends ApiPromise<OffsetLimitPage<z.output<TItemSchema>>>\n implements AsyncIterable<z.output<TItemSchema>>\n{\n constructor(\n result: Promise<ZodFetchResult<OffsetLimitPageResponse<z.output<TItemSchema>>>>,\n private schema: TItemSchema,\n private url: string,\n private params: FetchOffsetLimitPageParams,\n private requestInit?: RequestInit,\n private options?: ZodFetchOptions\n ) {\n super(\n result.then((result) => ({\n data: new OffsetLimitPage(\n result.data.data,\n result.data.pagination,\n this.#fetchPage.bind(this)\n ),\n response: result.response,\n }))\n );\n }\n\n #fetchPage(\n params: Omit<FetchOffsetLimitPageParams, \"limit\">\n ): Promise<OffsetLimitPage<z.output<TItemSchema>>> {\n return zodfetchOffsetLimitPage(\n this.schema,\n this.url,\n { ...this.params, ...params },\n this.requestInit,\n this.options\n );\n }\n\n /**\n * Allow auto-paginating iteration on an unawaited list call, eg:\n *\n * for await (const item of client.items.list()) {\n * console.log(item)\n * }\n */\n async *[Symbol.asyncIterator]() {\n const page = await this;\n for await (const item of page) {\n yield item;\n }\n }\n}\n","export type APIHeaders = Record<string, string | null | undefined>;\n\nexport class ApiError extends Error {\n readonly status: number | undefined;\n readonly headers: APIHeaders | undefined;\n readonly error: Object | undefined;\n\n readonly code: string | null | undefined;\n readonly param: string | null | undefined;\n readonly type: string | undefined;\n\n constructor(\n status: number | undefined,\n error: Object | undefined,\n message: string | undefined,\n headers: APIHeaders | undefined\n ) {\n super(`${ApiError.makeMessage(status, error, message)}`);\n this.status = status;\n this.headers = headers;\n\n const data = error as Record<string, any>;\n this.error = data;\n this.code = data?.[\"code\"];\n this.param = data?.[\"param\"];\n this.type = data?.[\"type\"];\n }\n\n private static makeMessage(status: number | undefined, error: any, message: string | undefined) {\n const msg = error?.message\n ? typeof error.message === \"string\"\n ? error.message\n : JSON.stringify(error.message)\n : error\n ? JSON.stringify(error)\n : message;\n\n if (status && msg) {\n return `${status} ${msg}`;\n }\n if (status) {\n return `${status} status code (no body)`;\n }\n if (msg) {\n return msg;\n }\n return \"(no status code or body)\";\n }\n\n static generate(\n status: number | undefined,\n errorResponse: Object | undefined,\n message: string | undefined,\n headers: APIHeaders | undefined\n ) {\n if (!status) {\n return new ApiConnectionError({ cause: castToError(errorResponse) });\n }\n\n const error = (errorResponse as Record<string, any>)?.[\"error\"];\n\n if (status === 400) {\n return new BadRequestError(status, error, message, headers);\n }\n\n if (status === 401) {\n return new AuthenticationError(status, error, message, headers);\n }\n\n if (status === 403) {\n return new PermissionDeniedError(status, error, message, headers);\n }\n\n if (status === 404) {\n return new NotFoundError(status, error, message, headers);\n }\n\n if (status === 409) {\n return new ConflictError(status, error, message, headers);\n }\n\n if (status === 422) {\n return new UnprocessableEntityError(status, error, message, headers);\n }\n\n if (status === 429) {\n return new RateLimitError(status, error, message, headers);\n }\n\n if (status >= 500) {\n return new InternalServerError(status, error, message, headers);\n }\n\n return new ApiError(status, error, message, headers);\n }\n}\n\nexport class ApiConnectionError extends ApiError {\n override readonly status: undefined = undefined;\n\n constructor({ message, cause }: { message?: string; cause?: Error | undefined }) {\n super(undefined, undefined, message || \"Connection error.\", undefined);\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause) this.cause = cause;\n }\n}\n\nexport class BadRequestError extends ApiError {\n override readonly status: 400 = 400;\n}\n\nexport class AuthenticationError extends ApiError {\n override readonly status: 401 = 401;\n}\n\nexport class PermissionDeniedError extends ApiError {\n override readonly status: 403 = 403;\n}\n\nexport class NotFoundError extends ApiError {\n override readonly status: 404 = 404;\n}\n\nexport class ConflictError extends ApiError {\n override readonly status: 409 = 409;\n}\n\nexport class UnprocessableEntityError extends ApiError {\n override readonly status: 422 = 422;\n}\n\nexport class RateLimitError extends ApiError {\n override readonly status: 429 = 429;\n}\n\nexport class InternalServerError extends ApiError {}\n\nfunction castToError(err: any): Error {\n if (err instanceof Error) return err;\n return new Error(err);\n}\n","import { calculateResetAt as calculateResetAtInternal } from \"../../retry\";\nimport { FetchRetryOptions, type RetryOptions } from \"../schemas\";\n\nexport const defaultRetryOptions = {\n maxAttempts: 3,\n factor: 2,\n minTimeoutInMs: 1000,\n maxTimeoutInMs: 60000,\n randomize: true,\n} satisfies RetryOptions;\n\nexport const defaultFetchRetryOptions = {\n byStatus: {\n \"429,408,409,5xx\": {\n strategy: \"backoff\",\n ...defaultRetryOptions,\n },\n },\n connectionError: defaultRetryOptions,\n timeout: defaultRetryOptions,\n} satisfies FetchRetryOptions;\n\n/**\n *\n * @param options\n * @param attempt - The current attempt number. If the first attempt has failed, this will be 1.\n * @returns\n */\nexport function calculateNextRetryDelay(options: RetryOptions, attempt: number) {\n const opts = { ...defaultRetryOptions, ...options };\n\n if (attempt >= opts.maxAttempts) {\n return;\n }\n\n const { factor, minTimeoutInMs, maxTimeoutInMs, randomize } = opts;\n\n const random = randomize ? Math.random() + 1 : 1;\n\n const timeout = Math.min(maxTimeoutInMs, random * minTimeoutInMs * Math.pow(factor, attempt - 1));\n\n // Round to the nearest integer\n return Math.round(timeout);\n}\n\nexport function calculateResetAt(\n resets: string | undefined | null,\n format:\n | \"unix_timestamp\"\n | \"iso_8601\"\n | \"iso_8601_duration_openai_variant\"\n | \"unix_timestamp_in_ms\",\n now: number = Date.now()\n): number | undefined {\n const resetAt = calculateResetAtInternal(resets, format, new Date(now));\n\n return resetAt?.getTime();\n}\n","export interface CursorPageParams {\n limit?: number;\n after?: string;\n before?: string;\n}\n\nexport interface OffsetLimitPageParams {\n limit?: number;\n page?: number;\n}\n\nexport interface PageResponse<Item> {\n data: Array<Item>;\n}\n\nexport interface CursorPageResponse<Item> extends PageResponse<Item> {\n pagination: {\n next?: string;\n previous?: string;\n };\n}\n\nexport interface OffsetLimitPageResponse<Item> extends PageResponse<Item> {\n pagination: {\n currentPage: number;\n totalPages: number;\n count: number;\n };\n}\n\nexport interface Page<Item> {\n getPaginatedItems(): Item[];\n hasNextPage(): boolean;\n hasPreviousPage(): boolean;\n}\n\nexport class CursorPage<Item> implements CursorPageResponse<Item>, Page<Item>, AsyncIterable<Item> {\n data: Array<Item>;\n pagination: { next?: string; previous?: string };\n\n constructor(\n data: Array<Item>,\n pagination: { next?: string; previous?: string },\n private pageFetcher: (params: Omit<CursorPageParams, \"limit\">) => Promise<CursorPage<Item>>\n ) {\n this.data = data;\n this.pagination = pagination;\n }\n\n getPaginatedItems(): Item[] {\n return this.data ?? [];\n }\n\n hasNextPage(): boolean {\n return !!this.pagination.next;\n }\n\n hasPreviousPage(): boolean {\n return !!this.pagination.previous;\n }\n\n getNextPage(): Promise<CursorPage<Item>> {\n if (!this.pagination.next) {\n throw new Error(\"No next page available\");\n }\n\n return this.pageFetcher({ after: this.pagination.next });\n }\n\n getPreviousPage(): Promise<CursorPage<Item>> {\n if (!this.pagination.previous) {\n throw new Error(\"No previous page available\");\n }\n\n return this.pageFetcher({ before: this.pagination.previous });\n }\n\n async *iterPages() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: CursorPage<Item> = this;\n yield page;\n while (page.hasNextPage()) {\n page = await page.getNextPage();\n yield page;\n }\n }\n\n async *[Symbol.asyncIterator]() {\n for await (const page of this.iterPages()) {\n for (const item of page.getPaginatedItems()) {\n yield item;\n }\n }\n }\n}\n\nexport class OffsetLimitPage<Item>\n implements OffsetLimitPageResponse<Item>, Page<Item>, AsyncIterable<Item>\n{\n data: Array<Item>;\n pagination: { currentPage: number; totalPages: number; count: number };\n\n constructor(\n data: Array<Item>,\n pagination: { currentPage: number; totalPages: number; count: number },\n private pageFetcher: (\n params: Omit<OffsetLimitPageParams, \"limit\">\n ) => Promise<OffsetLimitPage<Item>>\n ) {\n this.data = data;\n this.pagination = pagination;\n }\n\n getPaginatedItems(): Item[] {\n return this.data ?? [];\n }\n\n hasNextPage(): boolean {\n return this.pagination.currentPage < this.pagination.totalPages;\n }\n\n hasPreviousPage(): boolean {\n return this.pagination.currentPage > 1;\n }\n\n getNextPage(): Promise<OffsetLimitPage<Item>> {\n if (!this.hasNextPage()) {\n throw new Error(\"No next page available\");\n }\n\n return this.pageFetcher({\n page: this.pagination.currentPage + 1,\n });\n }\n\n getPreviousPage(): Promise<OffsetLimitPage<Item>> {\n if (!this.hasPreviousPage()) {\n throw new Error(\"No previous page available\");\n }\n\n return this.pageFetcher({\n page: this.pagination.currentPage - 1,\n });\n }\n\n async *iterPages() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: OffsetLimitPage<Item> = this;\n yield page;\n while (page.hasNextPage()) {\n page = await page.getNextPage();\n yield page;\n }\n }\n\n async *[Symbol.asyncIterator]() {\n for await (const page of this.iterPages()) {\n for (const item of page.getPaginatedItems()) {\n yield item;\n }\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/v3/apiClient/core.ts","../../src/v3/apiClient/errors.ts","../../src/v3/utils/retries.ts","../../src/v3/apiClient/pagination.ts"],"names":["z","fromZodError","ApiError","Error","constructor","status","error","message","headers","makeMessage","data","code","param","type","msg","JSON","stringify","generate","errorResponse","ApiConnectionError","cause","castToError","BadRequestError","AuthenticationError","PermissionDeniedError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","undefined","err","defaultRetryOptions","maxAttempts","factor","minTimeoutInMs","maxTimeoutInMs","randomize","defaultFetchRetryOptions","byStatus","strategy","connectionError","timeout","calculateNextRetryDelay","options","attempt","opts","random","Math","min","pow","round","CursorPage","pagination","pageFetcher","getPaginatedItems","hasNextPage","next","hasPreviousPage","previous","getNextPage","after","getPreviousPage","before","iterPages","page","Symbol","asyncIterator","item","OffsetLimitPage","currentPage","totalPages","zodfetch","schema","url","requestInit","ApiPromise","_doZodFetch","zodfetchCursorPage","params","query","URLSearchParams","limit","set","String","cursorPageSchema","object","array","string","optional","$url","URL","search","toString","fetchResult","href","CursorPagePromise","zodfetchOffsetLimitPage","offsetLimitPageSchema","coerce","number","count","OffsetLimitPagePromise","$requestInit","response","fetch","requestInitWithCache","responseHeaders","createResponseHeaders","ok","retryResult","shouldRetry","retry","Promise","resolve","setTimeout","delay","errText","text","catch","e","errJSON","safeJsonParse","errMessage","jsonBody","json","parsedResult","safeParse","success","retryOptions","shouldRetryForOptions","shouldRetryHeader","get","parse","Proxy","Object","fromEntries","entries","target","name","key","toLowerCase","withCache","cache","_","Request","responsePromise","asResponse","then","p","withResponse","all","result","onfulfilled","onrejected","finally","onfinally","bind","_fetchPage","fetchPage_fn"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport { fromZodError } from \"zod-validation-error\";\nimport { ApiConnectionError, ApiError } from \"./errors\";\nimport { RetryOptions } from \"../schemas\";\nimport { calculateNextRetryDelay } from \"../utils/retries\";\n\nimport {\n CursorPage,\n CursorPageParams,\n CursorPageResponse,\n OffsetLimitPage,\n OffsetLimitPageParams,\n OffsetLimitPageResponse,\n} from \"./pagination\";\n\nexport const defaultRetryOptions = {\n maxAttempts: 3,\n factor: 2,\n minTimeoutInMs: 1000,\n maxTimeoutInMs: 60000,\n randomize: false,\n} satisfies RetryOptions;\n\nexport type ZodFetchOptions = {\n retry?: RetryOptions;\n};\n\ninterface FetchCursorPageParams extends CursorPageParams {\n query?: URLSearchParams;\n}\n\ninterface FetchOffsetLimitPageParams extends OffsetLimitPageParams {\n query?: URLSearchParams;\n}\n\nexport function zodfetch<TResponseBodySchema extends z.ZodTypeAny>(\n schema: TResponseBodySchema,\n url: string,\n requestInit?: RequestInit,\n options?: ZodFetchOptions\n): ApiPromise<z.output<TResponseBodySchema>> {\n return new ApiPromise(_doZodFetch(schema, url, requestInit, options));\n}\n\nexport function zodfetchCursorPage<TItemSchema extends z.ZodTypeAny>(\n schema: TItemSchema,\n url: string,\n params: FetchCursorPageParams,\n requestInit?: RequestInit,\n options?: ZodFetchOptions\n) {\n const query = new URLSearchParams(params.query);\n\n if (params.limit) {\n query.set(\"page[size]\", String(params.limit));\n }\n\n if (params.after) {\n query.set(\"page[after]\", params.after);\n }\n\n if (params.before) {\n query.set(\"page[before]\", params.before);\n }\n\n const cursorPageSchema = z.object({\n data: z.array(schema),\n pagination: z.object({\n next: z.string().optional(),\n previous: z.string().optional(),\n }),\n });\n\n const $url = new URL(url);\n $url.search = query.toString();\n\n const fetchResult = _doZodFetch(cursorPageSchema, $url.href, requestInit, options);\n\n return new CursorPagePromise(fetchResult, schema, url, params, requestInit, options);\n}\n\nexport function zodfetchOffsetLimitPage<TItemSchema extends z.ZodTypeAny>(\n schema: TItemSchema,\n url: string,\n params: FetchOffsetLimitPageParams,\n requestInit?: RequestInit,\n options?: ZodFetchOptions\n) {\n const query = new URLSearchParams(params.query);\n\n if (params.limit) {\n query.set(\"perPage\", String(params.limit));\n }\n\n if (params.page) {\n query.set(\"page\", String(params.page));\n }\n\n const offsetLimitPageSchema = z.object({\n data: z.array(schema),\n pagination: z.object({\n currentPage: z.coerce.number(),\n totalPages: z.coerce.number(),\n count: z.coerce.number(),\n }),\n });\n\n const $url = new URL(url);\n $url.search = query.toString();\n\n const fetchResult = _doZodFetch(offsetLimitPageSchema, $url.href, requestInit, options);\n\n return new OffsetLimitPagePromise(fetchResult, schema, url, params, requestInit, options);\n}\n\ntype ZodFetchResult<T> = {\n data: T;\n response: Response;\n};\n\ntype PromiseOrValue<T> = T | Promise<T>;\n\nasync function _doZodFetch<TResponseBodySchema extends z.ZodTypeAny>(\n schema: TResponseBodySchema,\n url: string,\n requestInit?: PromiseOrValue<RequestInit>,\n options?: ZodFetchOptions,\n attempt = 1\n): Promise<ZodFetchResult<z.output<TResponseBodySchema>>> {\n try {\n const $requestInit = await requestInit;\n\n const response = await fetch(url, requestInitWithCache($requestInit));\n\n const responseHeaders = createResponseHeaders(response.headers);\n\n if (!response.ok) {\n const retryResult = shouldRetry(response, attempt, options?.retry);\n\n if (retryResult.retry) {\n await new Promise((resolve) => setTimeout(resolve, retryResult.delay));\n\n return await _doZodFetch(schema, url, requestInit, options, attempt + 1);\n } else {\n const errText = await response.text().catch((e) => castToError(e).message);\n const errJSON = safeJsonParse(errText);\n const errMessage = errJSON ? undefined : errText;\n\n throw ApiError.generate(response.status, errJSON, errMessage, responseHeaders);\n }\n }\n\n const jsonBody = await response.json();\n const parsedResult = schema.safeParse(jsonBody);\n\n if (parsedResult.success) {\n return { data: parsedResult.data, response };\n }\n\n throw fromZodError(parsedResult.error);\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n\n if (options?.retry) {\n const retry = { ...defaultRetryOptions, ...options.retry };\n\n const delay = calculateNextRetryDelay(retry, attempt);\n\n if (delay) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n return await _doZodFetch(schema, url, requestInit, options, attempt + 1);\n }\n }\n\n throw new ApiConnectionError({ cause: castToError(error) });\n }\n}\n\nfunction castToError(err: any): Error {\n if (err instanceof Error) return err;\n return new Error(err);\n}\n\ntype ShouldRetryResult =\n | {\n retry: false;\n }\n | {\n retry: true;\n delay: number;\n };\n\nfunction shouldRetry(\n response: Response,\n attempt: number,\n retryOptions?: RetryOptions\n): ShouldRetryResult {\n function shouldRetryForOptions(): ShouldRetryResult {\n const retry = { ...defaultRetryOptions, ...retryOptions };\n\n const delay = calculateNextRetryDelay(retry, attempt);\n\n if (delay) {\n return { retry: true, delay };\n } else {\n return { retry: false };\n }\n }\n\n // Note this is not a standard header.\n const shouldRetryHeader = response.headers.get(\"x-should-retry\");\n\n // If the server explicitly says whether or not to retry, obey.\n if (shouldRetryHeader === \"true\") return shouldRetryForOptions();\n if (shouldRetryHeader === \"false\") return { retry: false };\n\n // Retry on request timeouts.\n if (response.status === 408) return shouldRetryForOptions();\n\n // Retry on lock timeouts.\n if (response.status === 409) return shouldRetryForOptions();\n\n // Retry on rate limits.\n if (response.status === 429) return shouldRetryForOptions();\n\n // Retry internal errors.\n if (response.status >= 500) return shouldRetryForOptions();\n\n return { retry: false };\n}\n\nfunction safeJsonParse(text: string): any {\n try {\n return JSON.parse(text);\n } catch (e) {\n return undefined;\n }\n}\n\nfunction createResponseHeaders(headers: Response[\"headers\"]): Record<string, string> {\n return new Proxy(\n Object.fromEntries(\n // @ts-ignore\n headers.entries()\n ),\n {\n get(target, name) {\n const key = name.toString();\n return target[key.toLowerCase()] || target[key];\n },\n }\n );\n}\n\nfunction requestInitWithCache(requestInit?: RequestInit): RequestInit {\n try {\n const withCache: RequestInit = {\n ...requestInit,\n cache: \"no-cache\",\n };\n\n const _ = new Request(\"http://localhost\", withCache);\n\n return withCache;\n } catch (error) {\n return requestInit ?? {};\n }\n}\n\n/**\n * A subclass of `Promise` providing additional helper methods\n * for interacting with the SDK.\n */\nexport class ApiPromise<T> extends Promise<T> {\n constructor(private responsePromise: Promise<ZodFetchResult<T>>) {\n super((resolve) => {\n // this is maybe a bit weird but this has to be a no-op to not implicitly\n // parse the response body; instead .then, .catch, .finally are overridden\n // to parse the response\n resolve(null as any);\n });\n }\n\n /**\n * Gets the raw `Response` instance instead of parsing the response\n * data.\n *\n * If you want to parse the response body but still get the `Response`\n * instance, you can use {@link withResponse()}.\n */\n asResponse(): Promise<Response> {\n return this.responsePromise.then((p) => p.response);\n }\n\n /**\n * Gets the parsed response data and the raw `Response` instance.\n *\n * If you just want to get the raw `Response` instance without parsing it,\n * you can use {@link asResponse()}.\n */\n async withResponse(): Promise<{ data: T; response: Response }> {\n const [data, response] = await Promise.all([this.parse(), this.asResponse()]);\n return { data, response };\n }\n\n private parse(): Promise<T> {\n return this.responsePromise.then((result) => result.data);\n }\n\n override then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null\n ): Promise<TResult1 | TResult2> {\n return this.parse().then(onfulfilled, onrejected);\n }\n\n override catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null\n ): Promise<T | TResult> {\n return this.parse().catch(onrejected);\n }\n\n override finally(onfinally?: (() => void) | undefined | null): Promise<T> {\n return this.parse().finally(onfinally);\n }\n}\n\nexport class CursorPagePromise<TItemSchema extends z.ZodTypeAny>\n extends ApiPromise<CursorPage<z.output<TItemSchema>>>\n implements AsyncIterable<z.output<TItemSchema>>\n{\n constructor(\n result: Promise<ZodFetchResult<CursorPageResponse<z.output<TItemSchema>>>>,\n private schema: TItemSchema,\n private url: string,\n private params: FetchCursorPageParams,\n private requestInit?: RequestInit,\n private options?: ZodFetchOptions\n ) {\n super(\n result.then((result) => ({\n data: new CursorPage(result.data.data, result.data.pagination, this.#fetchPage.bind(this)),\n response: result.response,\n }))\n );\n }\n\n #fetchPage(params: Omit<CursorPageParams, \"limit\">): Promise<CursorPage<z.output<TItemSchema>>> {\n return zodfetchCursorPage(\n this.schema,\n this.url,\n { ...this.params, ...params },\n this.requestInit,\n this.options\n );\n }\n\n /**\n * Allow auto-paginating iteration on an unawaited list call, eg:\n *\n * for await (const item of client.items.list()) {\n * console.log(item)\n * }\n */\n async *[Symbol.asyncIterator]() {\n const page = await this;\n for await (const item of page) {\n yield item;\n }\n }\n}\n\nexport class OffsetLimitPagePromise<TItemSchema extends z.ZodTypeAny>\n extends ApiPromise<OffsetLimitPage<z.output<TItemSchema>>>\n implements AsyncIterable<z.output<TItemSchema>>\n{\n constructor(\n result: Promise<ZodFetchResult<OffsetLimitPageResponse<z.output<TItemSchema>>>>,\n private schema: TItemSchema,\n private url: string,\n private params: FetchOffsetLimitPageParams,\n private requestInit?: RequestInit,\n private options?: ZodFetchOptions\n ) {\n super(\n result.then((result) => ({\n data: new OffsetLimitPage(\n result.data.data,\n result.data.pagination,\n this.#fetchPage.bind(this)\n ),\n response: result.response,\n }))\n );\n }\n\n #fetchPage(\n params: Omit<FetchOffsetLimitPageParams, \"limit\">\n ): Promise<OffsetLimitPage<z.output<TItemSchema>>> {\n return zodfetchOffsetLimitPage(\n this.schema,\n this.url,\n { ...this.params, ...params },\n this.requestInit,\n this.options\n );\n }\n\n /**\n * Allow auto-paginating iteration on an unawaited list call, eg:\n *\n * for await (const item of client.items.list()) {\n * console.log(item)\n * }\n */\n async *[Symbol.asyncIterator]() {\n const page = await this;\n for await (const item of page) {\n yield item;\n }\n }\n}\n","export type APIHeaders = Record<string, string | null | undefined>;\n\nexport class ApiError extends Error {\n readonly status: number | undefined;\n readonly headers: APIHeaders | undefined;\n readonly error: Object | undefined;\n\n readonly code: string | null | undefined;\n readonly param: string | null | undefined;\n readonly type: string | undefined;\n\n constructor(\n status: number | undefined,\n error: Object | undefined,\n message: string | undefined,\n headers: APIHeaders | undefined\n ) {\n super(`${ApiError.makeMessage(status, error, message)}`);\n this.status = status;\n this.headers = headers;\n\n const data = error as Record<string, any>;\n this.error = data;\n this.code = data?.[\"code\"];\n this.param = data?.[\"param\"];\n this.type = data?.[\"type\"];\n }\n\n private static makeMessage(status: number | undefined, error: any, message: string | undefined) {\n const msg = error?.message\n ? typeof error.message === \"string\"\n ? error.message\n : JSON.stringify(error.message)\n : error\n ? JSON.stringify(error)\n : message;\n\n if (status && msg) {\n return `${status} ${msg}`;\n }\n if (status) {\n return `${status} status code (no body)`;\n }\n if (msg) {\n return msg;\n }\n return \"(no status code or body)\";\n }\n\n static generate(\n status: number | undefined,\n errorResponse: Object | undefined,\n message: string | undefined,\n headers: APIHeaders | undefined\n ) {\n if (!status) {\n return new ApiConnectionError({ cause: castToError(errorResponse) });\n }\n\n const error = (errorResponse as Record<string, any>)?.[\"error\"];\n\n if (status === 400) {\n return new BadRequestError(status, error, message, headers);\n }\n\n if (status === 401) {\n return new AuthenticationError(status, error, message, headers);\n }\n\n if (status === 403) {\n return new PermissionDeniedError(status, error, message, headers);\n }\n\n if (status === 404) {\n return new NotFoundError(status, error, message, headers);\n }\n\n if (status === 409) {\n return new ConflictError(status, error, message, headers);\n }\n\n if (status === 422) {\n return new UnprocessableEntityError(status, error, message, headers);\n }\n\n if (status === 429) {\n return new RateLimitError(status, error, message, headers);\n }\n\n if (status >= 500) {\n return new InternalServerError(status, error, message, headers);\n }\n\n return new ApiError(status, error, message, headers);\n }\n}\n\nexport class ApiConnectionError extends ApiError {\n override readonly status: undefined = undefined;\n\n constructor({ message, cause }: { message?: string; cause?: Error | undefined }) {\n super(undefined, undefined, message || \"Connection error.\", undefined);\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause) this.cause = cause;\n }\n}\n\nexport class BadRequestError extends ApiError {\n override readonly status: 400 = 400;\n}\n\nexport class AuthenticationError extends ApiError {\n override readonly status: 401 = 401;\n}\n\nexport class PermissionDeniedError extends ApiError {\n override readonly status: 403 = 403;\n}\n\nexport class NotFoundError extends ApiError {\n override readonly status: 404 = 404;\n}\n\nexport class ConflictError extends ApiError {\n override readonly status: 409 = 409;\n}\n\nexport class UnprocessableEntityError extends ApiError {\n override readonly status: 422 = 422;\n}\n\nexport class RateLimitError extends ApiError {\n override readonly status: 429 = 429;\n}\n\nexport class InternalServerError extends ApiError {}\n\nfunction castToError(err: any): Error {\n if (err instanceof Error) return err;\n return new Error(err);\n}\n","import { calculateResetAt as calculateResetAtInternal } from \"../../retry\";\nimport { FetchRetryOptions, type RetryOptions } from \"../schemas\";\n\nexport const defaultRetryOptions = {\n maxAttempts: 3,\n factor: 2,\n minTimeoutInMs: 1000,\n maxTimeoutInMs: 60000,\n randomize: true,\n} satisfies RetryOptions;\n\nexport const defaultFetchRetryOptions = {\n byStatus: {\n \"429,408,409,5xx\": {\n strategy: \"backoff\",\n ...defaultRetryOptions,\n },\n },\n connectionError: defaultRetryOptions,\n timeout: defaultRetryOptions,\n} satisfies FetchRetryOptions;\n\n/**\n *\n * @param options\n * @param attempt - The current attempt number. If the first attempt has failed, this will be 1.\n * @returns\n */\nexport function calculateNextRetryDelay(options: RetryOptions, attempt: number) {\n const opts = { ...defaultRetryOptions, ...options };\n\n if (attempt >= opts.maxAttempts) {\n return;\n }\n\n const { factor, minTimeoutInMs, maxTimeoutInMs, randomize } = opts;\n\n const random = randomize ? Math.random() + 1 : 1;\n\n const timeout = Math.min(maxTimeoutInMs, random * minTimeoutInMs * Math.pow(factor, attempt - 1));\n\n // Round to the nearest integer\n return Math.round(timeout);\n}\n\nexport function calculateResetAt(\n resets: string | undefined | null,\n format:\n | \"unix_timestamp\"\n | \"iso_8601\"\n | \"iso_8601_duration_openai_variant\"\n | \"unix_timestamp_in_ms\",\n now: number = Date.now()\n): number | undefined {\n const resetAt = calculateResetAtInternal(resets, format, new Date(now));\n\n return resetAt?.getTime();\n}\n","export interface CursorPageParams {\n limit?: number;\n after?: string;\n before?: string;\n}\n\nexport interface OffsetLimitPageParams {\n limit?: number;\n page?: number;\n}\n\nexport interface PageResponse<Item> {\n data: Array<Item>;\n}\n\nexport interface CursorPageResponse<Item> extends PageResponse<Item> {\n pagination: {\n next?: string;\n previous?: string;\n };\n}\n\nexport interface OffsetLimitPageResponse<Item> extends PageResponse<Item> {\n pagination: {\n currentPage: number;\n totalPages: number;\n count: number;\n };\n}\n\nexport interface Page<Item> {\n getPaginatedItems(): Item[];\n hasNextPage(): boolean;\n hasPreviousPage(): boolean;\n}\n\nexport class CursorPage<Item> implements CursorPageResponse<Item>, Page<Item>, AsyncIterable<Item> {\n data: Array<Item>;\n pagination: { next?: string; previous?: string };\n\n constructor(\n data: Array<Item>,\n pagination: { next?: string; previous?: string },\n private pageFetcher: (params: Omit<CursorPageParams, \"limit\">) => Promise<CursorPage<Item>>\n ) {\n this.data = data;\n this.pagination = pagination;\n }\n\n getPaginatedItems(): Item[] {\n return this.data ?? [];\n }\n\n hasNextPage(): boolean {\n return !!this.pagination.next;\n }\n\n hasPreviousPage(): boolean {\n return !!this.pagination.previous;\n }\n\n getNextPage(): Promise<CursorPage<Item>> {\n if (!this.pagination.next) {\n throw new Error(\"No next page available\");\n }\n\n return this.pageFetcher({ after: this.pagination.next });\n }\n\n getPreviousPage(): Promise<CursorPage<Item>> {\n if (!this.pagination.previous) {\n throw new Error(\"No previous page available\");\n }\n\n return this.pageFetcher({ before: this.pagination.previous });\n }\n\n async *iterPages() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: CursorPage<Item> = this;\n yield page;\n while (page.hasNextPage()) {\n page = await page.getNextPage();\n yield page;\n }\n }\n\n async *[Symbol.asyncIterator]() {\n for await (const page of this.iterPages()) {\n for (const item of page.getPaginatedItems()) {\n yield item;\n }\n }\n }\n}\n\nexport class OffsetLimitPage<Item>\n implements OffsetLimitPageResponse<Item>, Page<Item>, AsyncIterable<Item>\n{\n data: Array<Item>;\n pagination: { currentPage: number; totalPages: number; count: number };\n\n constructor(\n data: Array<Item>,\n pagination: { currentPage: number; totalPages: number; count: number },\n private pageFetcher: (\n params: Omit<OffsetLimitPageParams, \"limit\">\n ) => Promise<OffsetLimitPage<Item>>\n ) {\n this.data = data;\n this.pagination = pagination;\n }\n\n getPaginatedItems(): Item[] {\n return this.data ?? [];\n }\n\n hasNextPage(): boolean {\n return this.pagination.currentPage < this.pagination.totalPages;\n }\n\n hasPreviousPage(): boolean {\n return this.pagination.currentPage > 1;\n }\n\n getNextPage(): Promise<OffsetLimitPage<Item>> {\n if (!this.hasNextPage()) {\n throw new Error(\"No next page available\");\n }\n\n return this.pageFetcher({\n page: this.pagination.currentPage + 1,\n });\n }\n\n getPreviousPage(): Promise<OffsetLimitPage<Item>> {\n if (!this.hasPreviousPage()) {\n throw new Error(\"No previous page available\");\n }\n\n return this.pageFetcher({\n page: this.pagination.currentPage - 1,\n });\n }\n\n async *iterPages() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: OffsetLimitPage<Item> = this;\n yield page;\n while (page.hasNextPage()) {\n page = await page.getNextPage();\n yield page;\n }\n }\n\n async *[Symbol.asyncIterator]() {\n for await (const page of this.iterPages()) {\n for (const item of page.getPaginatedItems()) {\n yield item;\n }\n }\n }\n}\n"]}