@labelbox/rl-sdk 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +90 -0
  2. package/dist/client-options.d.ts +39 -0
  3. package/dist/client-options.js +29 -0
  4. package/dist/generated/client/client.gen.d.ts +2 -0
  5. package/dist/generated/client/client.gen.js +216 -0
  6. package/dist/generated/client/index.d.ts +8 -0
  7. package/dist/generated/client/index.js +6 -0
  8. package/dist/generated/client/types.gen.d.ts +120 -0
  9. package/dist/generated/client/types.gen.js +2 -0
  10. package/dist/generated/client/utils.gen.d.ts +37 -0
  11. package/dist/generated/client/utils.gen.js +228 -0
  12. package/dist/generated/client.gen.d.ts +12 -0
  13. package/dist/generated/client.gen.js +3 -0
  14. package/dist/generated/core/auth.gen.d.ts +18 -0
  15. package/dist/generated/core/auth.gen.js +14 -0
  16. package/dist/generated/core/bodySerializer.gen.d.ts +25 -0
  17. package/dist/generated/core/bodySerializer.gen.js +57 -0
  18. package/dist/generated/core/params.gen.d.ts +43 -0
  19. package/dist/generated/core/params.gen.js +100 -0
  20. package/dist/generated/core/pathSerializer.gen.d.ts +33 -0
  21. package/dist/generated/core/pathSerializer.gen.js +106 -0
  22. package/dist/generated/core/queryKeySerializer.gen.d.ts +18 -0
  23. package/dist/generated/core/queryKeySerializer.gen.js +92 -0
  24. package/dist/generated/core/serverSentEvents.gen.d.ts +71 -0
  25. package/dist/generated/core/serverSentEvents.gen.js +132 -0
  26. package/dist/generated/core/types.gen.d.ts +78 -0
  27. package/dist/generated/core/types.gen.js +2 -0
  28. package/dist/generated/core/utils.gen.d.ts +19 -0
  29. package/dist/generated/core/utils.gen.js +87 -0
  30. package/dist/generated/index.d.ts +2 -0
  31. package/dist/generated/index.js +2 -0
  32. package/dist/generated/sdk.gen.d.ts +3054 -0
  33. package/dist/generated/sdk.gen.js +5962 -0
  34. package/dist/generated/types.gen.d.ts +39711 -0
  35. package/dist/generated/types.gen.js +2 -0
  36. package/dist/index.d.ts +21 -0
  37. package/dist/index.js +39 -0
  38. package/dist/nesting.d.ts +18 -0
  39. package/dist/nesting.js +75 -0
  40. package/dist/reference/concepts-reference.generated.d.ts +9 -0
  41. package/dist/reference/concepts-reference.generated.js +356 -0
  42. package/dist/reference/concepts-schema.d.ts +16 -0
  43. package/dist/reference/concepts-schema.js +39 -0
  44. package/dist/reference/concepts.d.ts +15 -0
  45. package/dist/reference/concepts.js +354 -0
  46. package/dist/reference/domains.d.ts +65 -0
  47. package/dist/reference/domains.js +32 -0
  48. package/dist/reference/recipes-reference.generated.d.ts +11 -0
  49. package/dist/reference/recipes-reference.generated.js +11415 -0
  50. package/dist/reference/recipes-schema.d.ts +676 -0
  51. package/dist/reference/recipes-schema.js +406 -0
  52. package/dist/reference/resources-reference.generated.d.ts +11 -0
  53. package/dist/reference/resources-reference.generated.js +7174 -0
  54. package/dist/reference/resources-schema.d.ts +78 -0
  55. package/dist/reference/resources-schema.js +71 -0
  56. package/dist/reference/schema.d.ts +153 -0
  57. package/dist/reference/schema.js +151 -0
  58. package/dist/reference/sdk-reference.generated.d.ts +10 -0
  59. package/dist/reference/sdk-reference.generated.js +65703 -0
  60. package/dist/reference/tutorials.d.ts +76 -0
  61. package/dist/reference/tutorials.js +65 -0
  62. package/dist/session-events.d.ts +92 -0
  63. package/dist/session-events.js +213 -0
  64. package/package.json +126 -0
package/README.md ADDED
@@ -0,0 +1,90 @@
1
+ # @labelbox/rl-sdk
2
+
3
+ The rl-gym TypeScript SDK, **generated from the backend OpenAPI spec** with
4
+ [`@hey-api/openapi-ts`](https://heyapi.dev). Almost the entire package is
5
+ generated — the only hand-written code is the path reader (`src/nesting.ts`) and
6
+ a thin auth constructor (`src/index.ts`).
7
+
8
+ ```ts
9
+ import { createRecursionClient } from '@labelbox/rl-sdk';
10
+
11
+ const rl = createRecursionClient({ apiKey: process.env.LABELBOX_API_KEY });
12
+ const job = await rl.synthesizers.create({
13
+ environmentId: 'env_…',
14
+ body: { name: 'Variant generator', systemPrompt: '…' },
15
+ });
16
+ ```
17
+
18
+ ## Install
19
+
20
+ Published to **public npm** as `@labelbox/rl-sdk` — no registry configuration,
21
+ repository access, or install-time credential is needed:
22
+
23
+ ```sh
24
+ npm install @labelbox/rl-sdk
25
+ ```
26
+
27
+ Full setup steps:
28
+ `apps/recursion/web/public/docs/ts-sdk-getting-started.md`. The SDK releases independently
29
+ of the CLI: a `packages/sdk-ts/**` change (e.g. a committed `openapi.json` update)
30
+ cuts an SDK release via the **Release / SDK** GitHub Action — see `yarn dx help release`.
31
+
32
+ ## Surface
33
+
34
+ Calls use flat params — path/query values and the request body are all top-level
35
+ keys of a single options argument; the request body sits under `body`.
36
+ Instance-based: `rl.<namespace>.<method>(...)`.
37
+
38
+ The body param would otherwise be named after its DTO (e.g.
39
+ `createSynthesizerJobBodyDto`) — `yarn dx sdk:generate` renames it to `body` via a
40
+ deterministic post-pass (`renameBodyParam` in `tools/dx/src/commands/sdk.ts`),
41
+ since hey-api offers no lever for this.
42
+
43
+ **Opt-in, declared at the source.** An operation is in the SDK iff its backend
44
+ handler carries `@SdkRoute(...segments)` (`apps/recursion/api/src/common/sdk-route.decorator.ts`),
45
+ which emits an `x-sdk-path` OpenAPI extension. `@SdkRoute('synthesizers', 'create')`
46
+ → `rl.synthesizers.create(...)`. There is **no heuristic and no per-operation
47
+ code here** — `src/nesting.ts` just reads the declared paths and asserts (at
48
+ codegen time) that every path is unique and a valid identifier. Endpoints without
49
+ `@SdkRoute` are not generated (that is also how you exclude one).
50
+
51
+ Scope grows by annotating more handlers — e.g. the `synthesizer` tag is exposed
52
+ as `rl.synthesizers` (jobs) and `rl.synthesizerRuns` (runs).
53
+
54
+ ## Regenerating
55
+
56
+ ```sh
57
+ # Regenerate the client + the SDK reference docs from the committed spec snapshot.
58
+ yarn dx sdk:generate
59
+
60
+ # Also re-dump the spec snapshot (packages/sdk-ts/openapi.json) from the backend first.
61
+ yarn dx sdk:generate --refresh-spec
62
+ ```
63
+
64
+ `src/generated/**` and `src/reference/*.generated.ts` are **git-ignored** and
65
+ regenerated from the committed `openapi.json` by `yarn dx codegen` on every
66
+ install / CI job / build (wired into `build:libs`, the `setup-node-yarn` action,
67
+ and `postinstall`). Never hand-edit them; only `openapi.json` is committed.
68
+
69
+ ## Generation choices (and why)
70
+
71
+ - **`bundle: true`** — the fetch runtime is vendored into `src/generated` so the
72
+ SDK is self-contained and version-locked to the generator (the standalone
73
+ `@hey-api/client-fetch` package drifts independently). `@hey-api/client-fetch`
74
+ is therefore a devDependency, used only at generation time.
75
+ - **`output.importFileExtension: '.js'`** — makes generated relative imports
76
+ compatible with the repo's `moduleResolution: NodeNext`.
77
+ - **No `exactOptionalPropertyTypes: true`** (tsconfig) — the vendored fetch
78
+ runtime does not satisfy this flag, so this package leaves it off (defaulting
79
+ to false) while every other package in the repo opts in explicitly. It is the
80
+ one strictness relaxation this generated-heavy package makes; hand-written code
81
+ stays clean.
82
+ - **`src/generated` excluded from Biome** — generated output is not linted; its
83
+ determinism is what the freshness check relies on.
84
+
85
+ ## Docs
86
+
87
+ The generated SDK reference shown in the in-app API docs is derived from the
88
+ same spec by `yarn dx sdk:generate` into this package's `./reference` export
89
+ (`SDK_REFERENCE`, with its `./schema` shape), keyed by `operationId` so each
90
+ operation's doc page renders its TS SDK / CLI / cURL examples.
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Default base URL — the public API gateway, the host external clients are meant
3
+ * to reach (the direct rl-gym host serves the static frontend, not the API). A
4
+ * bare origin with no path suffix: the API version lives in each operation's
5
+ * path (`/v1/environments`), not here. Matches the cURL examples in the
6
+ * generated reference, so the SDK works out of the box. Override `baseUrl` for
7
+ * staging/local.
8
+ *
9
+ * The backend behind it does not validate a Labelbox API key itself — it trusts
10
+ * the identity headers a fronting hop injects after validating one. So the
11
+ * `apiKey` below works against this default only once the gateway does that,
12
+ * which is a gateway requirement tracked in Labelbox/recursion-platform#2610
13
+ * rather than something this package can assert. `API_KEY_DISPATCH_BASE_URL` in
14
+ * `infra/cloudrun.ts` draws the same distinction from the other side: it sends
15
+ * the *server-side* embedded CLI through the Labelbox app proxy precisely because
16
+ * that hop is known to validate such a key today.
17
+ *
18
+ * Keep in sync with `PUBLIC_API_BASE_URL` in `../openapi-ts.config.ts`,
19
+ * `CURL_BASE_URL` in `tools/dx/src/commands/sdk.ts`, and `DEFAULT_BASE_URL`
20
+ * in `packages/cli/src/manifest.ts`.
21
+ */
22
+ export declare const DEFAULT_BASE_URL = "https://api.recursion.labelbox.com";
23
+ export interface RecursionClientOptions {
24
+ /** Labelbox API key. Sent as `Authorization: Bearer <key>`. */
25
+ apiKey: string;
26
+ /**
27
+ * Base URL of the rl-gym API. Defaults to the production API gateway
28
+ * (`DEFAULT_BASE_URL`); override it to target staging or a local backend
29
+ * during development.
30
+ */
31
+ baseUrl?: string;
32
+ /**
33
+ * Extra headers sent on every request, merged in before `Authorization` (so
34
+ * this can't be used to override the auth header). For callers that need to
35
+ * attach a per-request routing header — e.g. `X-Proxy-Target-Url` to pin the
36
+ * Labelbox rl-gym proxy at an ephemeral preview backend.
37
+ */
38
+ headers?: Record<string, string>;
39
+ }
@@ -0,0 +1,29 @@
1
+ // Connection options shared by the generated client and the hand-written
2
+ // event-stream transport.
3
+ //
4
+ // These live here rather than in `index.ts` because `session-events.ts` needs
5
+ // `DEFAULT_BASE_URL` at runtime, and importing it from the entry point that
6
+ // re-exports the stream would be a cycle. `index.ts` re-exports both names, so
7
+ // the public surface is unchanged.
8
+ /**
9
+ * Default base URL — the public API gateway, the host external clients are meant
10
+ * to reach (the direct rl-gym host serves the static frontend, not the API). A
11
+ * bare origin with no path suffix: the API version lives in each operation's
12
+ * path (`/v1/environments`), not here. Matches the cURL examples in the
13
+ * generated reference, so the SDK works out of the box. Override `baseUrl` for
14
+ * staging/local.
15
+ *
16
+ * The backend behind it does not validate a Labelbox API key itself — it trusts
17
+ * the identity headers a fronting hop injects after validating one. So the
18
+ * `apiKey` below works against this default only once the gateway does that,
19
+ * which is a gateway requirement tracked in Labelbox/recursion-platform#2610
20
+ * rather than something this package can assert. `API_KEY_DISPATCH_BASE_URL` in
21
+ * `infra/cloudrun.ts` draws the same distinction from the other side: it sends
22
+ * the *server-side* embedded CLI through the Labelbox app proxy precisely because
23
+ * that hop is known to validate such a key today.
24
+ *
25
+ * Keep in sync with `PUBLIC_API_BASE_URL` in `../openapi-ts.config.ts`,
26
+ * `CURL_BASE_URL` in `tools/dx/src/commands/sdk.ts`, and `DEFAULT_BASE_URL`
27
+ * in `packages/cli/src/manifest.ts`.
28
+ */
29
+ export const DEFAULT_BASE_URL = 'https://api.recursion.labelbox.com';
@@ -0,0 +1,2 @@
1
+ import type { Client, Config } from './types.gen.js';
2
+ export declare const createClient: (config?: Config) => Client;
@@ -0,0 +1,216 @@
1
+ // This file is auto-generated by @hey-api/openapi-ts
2
+ import { createSseClient } from '../core/serverSentEvents.gen.js';
3
+ import { getValidRequestBody } from '../core/utils.gen.js';
4
+ import { buildUrl, createConfig, createInterceptors, getParseAs, mergeConfigs, mergeHeaders, setAuthParams, } from './utils.gen.js';
5
+ export const createClient = (config = {}) => {
6
+ let _config = mergeConfigs(createConfig(), config);
7
+ const getConfig = () => ({ ..._config });
8
+ const setConfig = (config) => {
9
+ _config = mergeConfigs(_config, config);
10
+ return getConfig();
11
+ };
12
+ const interceptors = createInterceptors();
13
+ const beforeRequest = async (options) => {
14
+ const opts = {
15
+ ..._config,
16
+ ...options,
17
+ fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,
18
+ headers: mergeHeaders(_config.headers, options.headers),
19
+ serializedBody: undefined,
20
+ };
21
+ if (opts.security) {
22
+ await setAuthParams(opts);
23
+ }
24
+ if (opts.requestValidator) {
25
+ await opts.requestValidator(opts);
26
+ }
27
+ if (opts.body !== undefined && opts.bodySerializer) {
28
+ opts.serializedBody = opts.bodySerializer(opts.body);
29
+ }
30
+ // remove Content-Type header if body is empty to avoid sending invalid requests
31
+ if (opts.body === undefined || opts.serializedBody === '') {
32
+ opts.headers.delete('Content-Type');
33
+ }
34
+ const resolvedOpts = opts;
35
+ const url = buildUrl(resolvedOpts);
36
+ return { opts: resolvedOpts, url };
37
+ };
38
+ const request = async (options) => {
39
+ const throwOnError = options.throwOnError ?? _config.throwOnError;
40
+ const responseStyle = options.responseStyle ?? _config.responseStyle;
41
+ let request;
42
+ let response;
43
+ try {
44
+ const { opts, url } = await beforeRequest(options);
45
+ const requestInit = {
46
+ redirect: 'follow',
47
+ ...opts,
48
+ body: getValidRequestBody(opts),
49
+ };
50
+ request = new Request(url, requestInit);
51
+ for (const fn of interceptors.request.fns) {
52
+ if (fn) {
53
+ request = await fn(request, opts);
54
+ }
55
+ }
56
+ // fetch must be assigned here, otherwise it would throw the error:
57
+ // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation
58
+ const _fetch = opts.fetch;
59
+ response = await _fetch(request);
60
+ for (const fn of interceptors.response.fns) {
61
+ if (fn) {
62
+ response = await fn(response, request, opts);
63
+ }
64
+ }
65
+ const result = {
66
+ request,
67
+ response,
68
+ };
69
+ if (response.ok) {
70
+ const parseAs = (opts.parseAs === 'auto'
71
+ ? getParseAs(response.headers.get('Content-Type'))
72
+ : opts.parseAs) ?? 'json';
73
+ if (response.status === 204 || response.headers.get('Content-Length') === '0') {
74
+ let emptyData;
75
+ switch (parseAs) {
76
+ case 'arrayBuffer':
77
+ case 'blob':
78
+ case 'text':
79
+ emptyData = await response[parseAs]();
80
+ break;
81
+ case 'formData':
82
+ emptyData = new FormData();
83
+ break;
84
+ case 'stream':
85
+ emptyData = response.body;
86
+ break;
87
+ case 'json':
88
+ default:
89
+ emptyData = {};
90
+ break;
91
+ }
92
+ return opts.responseStyle === 'data'
93
+ ? emptyData
94
+ : {
95
+ data: emptyData,
96
+ ...result,
97
+ };
98
+ }
99
+ let data;
100
+ switch (parseAs) {
101
+ case 'arrayBuffer':
102
+ case 'blob':
103
+ case 'formData':
104
+ case 'text':
105
+ data = await response[parseAs]();
106
+ break;
107
+ case 'json': {
108
+ // Some servers return 200 with no Content-Length and empty body.
109
+ // response.json() would throw; read as text and parse if non-empty.
110
+ const text = await response.text();
111
+ data = text ? JSON.parse(text) : {};
112
+ break;
113
+ }
114
+ case 'stream':
115
+ return opts.responseStyle === 'data'
116
+ ? response.body
117
+ : {
118
+ data: response.body,
119
+ ...result,
120
+ };
121
+ }
122
+ if (parseAs === 'json') {
123
+ if (opts.responseValidator) {
124
+ await opts.responseValidator(data);
125
+ }
126
+ if (opts.responseTransformer) {
127
+ data = await opts.responseTransformer(data);
128
+ }
129
+ }
130
+ return opts.responseStyle === 'data'
131
+ ? data
132
+ : {
133
+ data,
134
+ ...result,
135
+ };
136
+ }
137
+ const textError = await response.text();
138
+ let jsonError;
139
+ try {
140
+ jsonError = JSON.parse(textError);
141
+ }
142
+ catch {
143
+ // noop
144
+ }
145
+ throw jsonError ?? textError;
146
+ }
147
+ catch (error) {
148
+ let finalError = error;
149
+ for (const fn of interceptors.error.fns) {
150
+ if (fn) {
151
+ finalError = await fn(finalError, response, request, options);
152
+ }
153
+ }
154
+ finalError = finalError || {};
155
+ if (throwOnError) {
156
+ throw finalError;
157
+ }
158
+ // TODO: we probably want to return error and improve types
159
+ return responseStyle === 'data'
160
+ ? undefined
161
+ : {
162
+ error: finalError,
163
+ request,
164
+ response,
165
+ };
166
+ }
167
+ };
168
+ const makeMethodFn = (method) => (options) => request({ ...options, method });
169
+ const makeSseFn = (method) => async (options) => {
170
+ const { opts, url } = await beforeRequest(options);
171
+ return createSseClient({
172
+ ...opts,
173
+ body: opts.body,
174
+ method,
175
+ onRequest: async (url, init) => {
176
+ let request = new Request(url, init);
177
+ for (const fn of interceptors.request.fns) {
178
+ if (fn) {
179
+ request = await fn(request, opts);
180
+ }
181
+ }
182
+ return request;
183
+ },
184
+ serializedBody: getValidRequestBody(opts),
185
+ url,
186
+ });
187
+ };
188
+ const _buildUrl = (options) => buildUrl({ ..._config, ...options });
189
+ return {
190
+ buildUrl: _buildUrl,
191
+ connect: makeMethodFn('CONNECT'),
192
+ delete: makeMethodFn('DELETE'),
193
+ get: makeMethodFn('GET'),
194
+ getConfig,
195
+ head: makeMethodFn('HEAD'),
196
+ interceptors,
197
+ options: makeMethodFn('OPTIONS'),
198
+ patch: makeMethodFn('PATCH'),
199
+ post: makeMethodFn('POST'),
200
+ put: makeMethodFn('PUT'),
201
+ request,
202
+ setConfig,
203
+ sse: {
204
+ connect: makeSseFn('CONNECT'),
205
+ delete: makeSseFn('DELETE'),
206
+ get: makeSseFn('GET'),
207
+ head: makeSseFn('HEAD'),
208
+ options: makeSseFn('OPTIONS'),
209
+ patch: makeSseFn('PATCH'),
210
+ post: makeSseFn('POST'),
211
+ put: makeSseFn('PUT'),
212
+ trace: makeSseFn('TRACE'),
213
+ },
214
+ trace: makeMethodFn('TRACE'),
215
+ };
216
+ };
@@ -0,0 +1,8 @@
1
+ export type { Auth } from '../core/auth.gen.js';
2
+ export type { QuerySerializerOptions } from '../core/bodySerializer.gen.js';
3
+ export { formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer, } from '../core/bodySerializer.gen.js';
4
+ export { buildClientParams } from '../core/params.gen.js';
5
+ export { serializeQueryKeyValue } from '../core/queryKeySerializer.gen.js';
6
+ export { createClient } from './client.gen.js';
7
+ export type { Client, ClientOptions, Config, CreateClientConfig, Options, RequestOptions, RequestResult, ResolvedRequestOptions, ResponseStyle, TDataShape, } from './types.gen.js';
8
+ export { createConfig, mergeHeaders } from './utils.gen.js';
@@ -0,0 +1,6 @@
1
+ // This file is auto-generated by @hey-api/openapi-ts
2
+ export { formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer, } from '../core/bodySerializer.gen.js';
3
+ export { buildClientParams } from '../core/params.gen.js';
4
+ export { serializeQueryKeyValue } from '../core/queryKeySerializer.gen.js';
5
+ export { createClient } from './client.gen.js';
6
+ export { createConfig, mergeHeaders } from './utils.gen.js';
@@ -0,0 +1,120 @@
1
+ import type { Auth } from '../core/auth.gen.js';
2
+ import type { ServerSentEventsOptions, ServerSentEventsResult } from '../core/serverSentEvents.gen.js';
3
+ import type { Client as CoreClient, Config as CoreConfig } from '../core/types.gen.js';
4
+ import type { Middleware } from './utils.gen.js';
5
+ export type ResponseStyle = 'data' | 'fields';
6
+ export interface Config<T extends ClientOptions = ClientOptions> extends Omit<RequestInit, 'body' | 'headers' | 'method'>, CoreConfig {
7
+ /**
8
+ * Base URL for all requests made by this client.
9
+ */
10
+ baseUrl?: T['baseUrl'];
11
+ /**
12
+ * Fetch API implementation. You can use this option to provide a custom
13
+ * fetch instance.
14
+ *
15
+ * @default globalThis.fetch
16
+ */
17
+ fetch?: typeof fetch;
18
+ /**
19
+ * Please don't use the Fetch client for Next.js applications. The `next`
20
+ * options won't have any effect.
21
+ *
22
+ * Install {@link https://www.npmjs.com/package/@hey-api/client-next `@hey-api/client-next`} instead.
23
+ */
24
+ next?: never;
25
+ /**
26
+ * Return the response data parsed in a specified format. By default, `auto`
27
+ * will infer the appropriate method from the `Content-Type` response header.
28
+ * You can override this behavior with any of the {@link Body} methods.
29
+ * Select `stream` if you don't want to parse response data at all.
30
+ *
31
+ * @default 'auto'
32
+ */
33
+ parseAs?: 'arrayBuffer' | 'auto' | 'blob' | 'formData' | 'json' | 'stream' | 'text';
34
+ /**
35
+ * Should we return only data or multiple fields (data, error, response, etc.)?
36
+ *
37
+ * @default 'fields'
38
+ */
39
+ responseStyle?: ResponseStyle;
40
+ /**
41
+ * Throw an error instead of returning it in the response?
42
+ *
43
+ * @default false
44
+ */
45
+ throwOnError?: T['throwOnError'];
46
+ }
47
+ export interface RequestOptions<TData = unknown, TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string> extends Config<{
48
+ responseStyle: TResponseStyle;
49
+ throwOnError: ThrowOnError;
50
+ }>, Pick<ServerSentEventsOptions<TData>, 'onRequest' | 'onSseError' | 'onSseEvent' | 'sseDefaultRetryDelay' | 'sseMaxRetryAttempts' | 'sseMaxRetryDelay'> {
51
+ /**
52
+ * Any body that you want to add to your request.
53
+ *
54
+ * {@link https://developer.mozilla.org/docs/Web/API/fetch#body}
55
+ */
56
+ body?: unknown;
57
+ path?: Record<string, unknown>;
58
+ query?: Record<string, unknown>;
59
+ /**
60
+ * Security mechanism(s) to use for the request.
61
+ */
62
+ security?: ReadonlyArray<Auth>;
63
+ url: Url;
64
+ }
65
+ export interface ResolvedRequestOptions<TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string> extends RequestOptions<unknown, TResponseStyle, ThrowOnError, Url> {
66
+ headers: Headers;
67
+ serializedBody?: string;
68
+ }
69
+ export type RequestResult<TData = unknown, TError = unknown, ThrowOnError extends boolean = boolean, TResponseStyle extends ResponseStyle = 'fields'> = ThrowOnError extends true ? Promise<TResponseStyle extends 'data' ? TData extends Record<string, unknown> ? TData[keyof TData] : TData : {
70
+ data: TData extends Record<string, unknown> ? TData[keyof TData] : TData;
71
+ request: Request;
72
+ response: Response;
73
+ }> : Promise<TResponseStyle extends 'data' ? (TData extends Record<string, unknown> ? TData[keyof TData] : TData) | undefined : ({
74
+ data: TData extends Record<string, unknown> ? TData[keyof TData] : TData;
75
+ error: undefined;
76
+ } | {
77
+ data: undefined;
78
+ error: TError extends Record<string, unknown> ? TError[keyof TError] : TError;
79
+ }) & {
80
+ /** request may be undefined, because error may be from building the request object itself */
81
+ request?: Request;
82
+ /** response may be undefined, because error may be from building the request object itself or from a network error */
83
+ response?: Response;
84
+ }>;
85
+ export interface ClientOptions {
86
+ baseUrl?: string;
87
+ responseStyle?: ResponseStyle;
88
+ throwOnError?: boolean;
89
+ }
90
+ type MethodFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false, TResponseStyle extends ResponseStyle = 'fields'>(options: Omit<RequestOptions<TData, TResponseStyle, ThrowOnError>, 'method'>) => RequestResult<TData, TError, ThrowOnError, TResponseStyle>;
91
+ type SseFn = <TData = unknown, _TError = unknown, ThrowOnError extends boolean = false, TResponseStyle extends ResponseStyle = 'fields'>(options: Omit<RequestOptions<never, TResponseStyle, ThrowOnError>, 'method'>) => Promise<ServerSentEventsResult<TData>>;
92
+ type RequestFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false, TResponseStyle extends ResponseStyle = 'fields'>(options: Omit<RequestOptions<TData, TResponseStyle, ThrowOnError>, 'method'> & Pick<Required<RequestOptions<TData, TResponseStyle, ThrowOnError>>, 'method'>) => RequestResult<TData, TError, ThrowOnError, TResponseStyle>;
93
+ type BuildUrlFn = <TData extends {
94
+ body?: unknown;
95
+ path?: Record<string, unknown>;
96
+ query?: Record<string, unknown>;
97
+ url: string;
98
+ }>(options: TData & Options<TData>) => string;
99
+ export type Client = CoreClient<RequestFn, Config, MethodFn, BuildUrlFn, SseFn> & {
100
+ interceptors: Middleware<Request, Response, unknown, ResolvedRequestOptions>;
101
+ };
102
+ /**
103
+ * The `createClientConfig()` function will be called on client initialization
104
+ * and the returned object will become the client's initial configuration.
105
+ *
106
+ * You may want to initialize your client this way instead of calling
107
+ * `setConfig()`. This is useful for example if you're using Next.js
108
+ * to ensure your client always has the correct values.
109
+ */
110
+ export type CreateClientConfig<T extends ClientOptions = ClientOptions> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;
111
+ export interface TDataShape {
112
+ body?: unknown;
113
+ headers?: unknown;
114
+ path?: unknown;
115
+ query?: unknown;
116
+ url: string;
117
+ }
118
+ type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>;
119
+ export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown, TResponseStyle extends ResponseStyle = 'fields'> = OmitKeys<RequestOptions<TResponse, TResponseStyle, ThrowOnError>, 'body' | 'path' | 'query' | 'url'> & ([TData] extends [never] ? unknown : Omit<TData, 'url'>);
120
+ export {};
@@ -0,0 +1,2 @@
1
+ // This file is auto-generated by @hey-api/openapi-ts
2
+ export {};
@@ -0,0 +1,37 @@
1
+ import type { QuerySerializerOptions } from '../core/bodySerializer.gen.js';
2
+ import type { Client, ClientOptions, Config, RequestOptions } from './types.gen.js';
3
+ export declare const createQuerySerializer: <T = unknown>({ parameters, ...args }?: QuerySerializerOptions) => (queryParams: T) => string;
4
+ /**
5
+ * Infers parseAs value from provided Content-Type header.
6
+ */
7
+ export declare const getParseAs: (contentType: string | null) => Exclude<Config["parseAs"], "auto">;
8
+ export declare function setAuthParams(options: Pick<RequestOptions, 'auth' | 'query' | 'security'> & {
9
+ headers: Headers;
10
+ }): Promise<void>;
11
+ export declare const buildUrl: Client['buildUrl'];
12
+ export declare const mergeConfigs: (a: Config, b: Config) => Config;
13
+ export declare const mergeHeaders: (...headers: Array<Required<Config>["headers"] | undefined>) => Headers;
14
+ type ErrInterceptor<Err, Res, Req, Options> = (error: Err,
15
+ /** response may be undefined due to a network error where no response object is produced */
16
+ response: Res | undefined,
17
+ /** request may be undefined, because error may be from building the request object itself */
18
+ request: Req | undefined, options: Options) => Err | Promise<Err>;
19
+ type ReqInterceptor<Req, Options> = (request: Req, options: Options) => Req | Promise<Req>;
20
+ type ResInterceptor<Res, Req, Options> = (response: Res, request: Req, options: Options) => Res | Promise<Res>;
21
+ declare class Interceptors<Interceptor> {
22
+ fns: Array<Interceptor | null>;
23
+ clear(): void;
24
+ eject(id: number | Interceptor): void;
25
+ exists(id: number | Interceptor): boolean;
26
+ getInterceptorIndex(id: number | Interceptor): number;
27
+ update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false;
28
+ use(fn: Interceptor): number;
29
+ }
30
+ export interface Middleware<Req, Res, Err, Options> {
31
+ error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;
32
+ request: Interceptors<ReqInterceptor<Req, Options>>;
33
+ response: Interceptors<ResInterceptor<Res, Req, Options>>;
34
+ }
35
+ export declare const createInterceptors: <Req, Res, Err, Options>() => Middleware<Req, Res, Err, Options>;
36
+ export declare const createConfig: <T extends ClientOptions = ClientOptions>(override?: Config<Omit<ClientOptions, keyof T> & T>) => Config<Omit<ClientOptions, keyof T> & T>;
37
+ export {};