@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.
- package/README.md +90 -0
- package/dist/client-options.d.ts +39 -0
- package/dist/client-options.js +29 -0
- package/dist/generated/client/client.gen.d.ts +2 -0
- package/dist/generated/client/client.gen.js +216 -0
- package/dist/generated/client/index.d.ts +8 -0
- package/dist/generated/client/index.js +6 -0
- package/dist/generated/client/types.gen.d.ts +120 -0
- package/dist/generated/client/types.gen.js +2 -0
- package/dist/generated/client/utils.gen.d.ts +37 -0
- package/dist/generated/client/utils.gen.js +228 -0
- package/dist/generated/client.gen.d.ts +12 -0
- package/dist/generated/client.gen.js +3 -0
- package/dist/generated/core/auth.gen.d.ts +18 -0
- package/dist/generated/core/auth.gen.js +14 -0
- package/dist/generated/core/bodySerializer.gen.d.ts +25 -0
- package/dist/generated/core/bodySerializer.gen.js +57 -0
- package/dist/generated/core/params.gen.d.ts +43 -0
- package/dist/generated/core/params.gen.js +100 -0
- package/dist/generated/core/pathSerializer.gen.d.ts +33 -0
- package/dist/generated/core/pathSerializer.gen.js +106 -0
- package/dist/generated/core/queryKeySerializer.gen.d.ts +18 -0
- package/dist/generated/core/queryKeySerializer.gen.js +92 -0
- package/dist/generated/core/serverSentEvents.gen.d.ts +71 -0
- package/dist/generated/core/serverSentEvents.gen.js +132 -0
- package/dist/generated/core/types.gen.d.ts +78 -0
- package/dist/generated/core/types.gen.js +2 -0
- package/dist/generated/core/utils.gen.d.ts +19 -0
- package/dist/generated/core/utils.gen.js +87 -0
- package/dist/generated/index.d.ts +2 -0
- package/dist/generated/index.js +2 -0
- package/dist/generated/sdk.gen.d.ts +3054 -0
- package/dist/generated/sdk.gen.js +5962 -0
- package/dist/generated/types.gen.d.ts +39711 -0
- package/dist/generated/types.gen.js +2 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +39 -0
- package/dist/nesting.d.ts +18 -0
- package/dist/nesting.js +75 -0
- package/dist/reference/concepts-reference.generated.d.ts +9 -0
- package/dist/reference/concepts-reference.generated.js +356 -0
- package/dist/reference/concepts-schema.d.ts +16 -0
- package/dist/reference/concepts-schema.js +39 -0
- package/dist/reference/concepts.d.ts +15 -0
- package/dist/reference/concepts.js +354 -0
- package/dist/reference/domains.d.ts +65 -0
- package/dist/reference/domains.js +32 -0
- package/dist/reference/recipes-reference.generated.d.ts +11 -0
- package/dist/reference/recipes-reference.generated.js +11415 -0
- package/dist/reference/recipes-schema.d.ts +676 -0
- package/dist/reference/recipes-schema.js +406 -0
- package/dist/reference/resources-reference.generated.d.ts +11 -0
- package/dist/reference/resources-reference.generated.js +7174 -0
- package/dist/reference/resources-schema.d.ts +78 -0
- package/dist/reference/resources-schema.js +71 -0
- package/dist/reference/schema.d.ts +153 -0
- package/dist/reference/schema.js +151 -0
- package/dist/reference/sdk-reference.generated.d.ts +10 -0
- package/dist/reference/sdk-reference.generated.js +65703 -0
- package/dist/reference/tutorials.d.ts +76 -0
- package/dist/reference/tutorials.js +65 -0
- package/dist/session-events.d.ts +92 -0
- package/dist/session-events.js +213 -0
- 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,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,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 {};
|