@zerolith/client 0.0.0-canary.20261102.g8292c77

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.
@@ -0,0 +1,455 @@
1
+ /**
2
+ * Generates the contract module from an OpenAPI 3.x document: one type per
3
+ * component schema, an `Api` interface with one entry per operation, and
4
+ * the `routes` table the client runs on. Pure string work, so it runs
5
+ * anywhere; the `zerolith-client` command wraps it for the shell.
6
+ */
7
+ /** The methods a Path Item names that the client can send; `trace` is left out, since `fetch` refuses TRACE. */
8
+ const METHODS = ["get", "put", "post", "delete", "options", "head", "patch", "query"];
9
+ /** Methods `fetch` refuses to send, left out of `additionalOperations` too. */
10
+ const FORBIDDEN_METHODS = new Set(["connect", "trace", "track"]);
11
+ const IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
12
+ function fail(message) {
13
+ throw new Error(`zerolith/client: ${message}`);
14
+ }
15
+ function words(text) {
16
+ return text.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[^A-Za-z0-9]+/).filter((word) => word !== "");
17
+ }
18
+ function pascal(text) {
19
+ return words(text).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("");
20
+ }
21
+ function camel(text) {
22
+ const name = pascal(text);
23
+ return name.charAt(0).toLowerCase() + name.slice(1);
24
+ }
25
+ function typeName(text) {
26
+ const name = pascal(text);
27
+ return /^[0-9]/.test(name) ? `_${name}` : name === "" ? "_" : name;
28
+ }
29
+ function key(name) {
30
+ return IDENTIFIER.test(name) ? name : JSON.stringify(name);
31
+ }
32
+ /** Line breaks, CR LF counted once, which would end a `//` comment and turn the rest of its line into code. */
33
+ const LINE_BREAKS = new RegExp(`${String.fromCodePoint(13, 10)}|[${String.fromCodePoint(10, 13, 0x2028, 0x2029)}]`, "g");
34
+ /** Text for a `//` comment, kept on one line, so it cannot end the comment. */
35
+ function commentText(text) {
36
+ return text.replace(LINE_BREAKS, " ");
37
+ }
38
+ function comment(text, indent) {
39
+ if (text === undefined || text.trim() === "") {
40
+ return "";
41
+ }
42
+ const lines = text.trim().replace(/\*\//g, "* /").split(/\r?\n/);
43
+ return lines.length === 1 ? `${indent}/** ${lines[0]} */\n` : `${indent}/**\n${lines.map((line) => `${indent} * ${line}`.trimEnd()).join("\n")}\n${indent} */\n`;
44
+ }
45
+ function indentLines(text, indent) {
46
+ return text.split("\n").map((line, index) => (index === 0 ? line : `${indent}${line}`)).join("\n");
47
+ }
48
+ function resolveRef(context, ref, section) {
49
+ const prefix = `#/components/${section}/`;
50
+ if (!ref.startsWith(prefix)) {
51
+ fail(`only local references into components are supported, found ${ref}`);
52
+ }
53
+ const name = decodeURIComponent(ref.slice(prefix.length).replace(/~1/g, "/").replace(/~0/g, "~"));
54
+ const table = context.document.components?.[section];
55
+ const found = table?.[name];
56
+ if (found === undefined) {
57
+ fail(`${ref} does not exist`);
58
+ }
59
+ return found;
60
+ }
61
+ function deref(context, value, section) {
62
+ let current = value;
63
+ for (let depth = 0; current.$ref !== undefined; depth++) {
64
+ if (depth > 16) {
65
+ fail(`reference loop at ${current.$ref}`);
66
+ }
67
+ current = resolveRef(context, current.$ref, section);
68
+ }
69
+ return current;
70
+ }
71
+ /** The type name each schema of the document being generated is written under, by schema name, which a `$ref` to the schema uses; `writeModule` sets it before it writes a type. */
72
+ let schemaTypes = new Map();
73
+ /** The built-in type names the module being generated writes, as `Record` for an object of free keys or `Blob` for a binary response; `writeModule` empties it before it writes. */
74
+ let builtInsUsed = new Set();
75
+ /** A built-in type name, recorded as written by the module being generated. */
76
+ function builtIn(name) {
77
+ builtInsUsed.add(name);
78
+ return name;
79
+ }
80
+ function schemaRefName(ref) {
81
+ const prefix = "#/components/schemas/";
82
+ if (!ref.startsWith(prefix)) {
83
+ fail(`only local schema references are supported, found ${ref}`);
84
+ }
85
+ const name = decodeURIComponent(ref.slice(prefix.length));
86
+ return schemaTypes.get(name) ?? typeName(name);
87
+ }
88
+ function literal(value) {
89
+ return value === undefined ? "undefined" : JSON.stringify(value);
90
+ }
91
+ /** Renders a schema as a TypeScript type. `indent` is the current indentation for nested object types. */
92
+ /** The keywords that combine other schemas; the type they give is intersected with the schema's own keywords. */
93
+ const COMPOSITION_KEYWORDS = new Set(["$ref", "allOf", "oneOf", "anyOf"]);
94
+ /** The keywords that shape a type on their own, beside a composition keyword. */
95
+ const OWN_KEYWORDS = new Set(["const", "enum", "type", "properties", "additionalProperties", "items", "prefixItems"]);
96
+ function typeOf(schema, indent) {
97
+ if (schema === undefined) {
98
+ return "unknown";
99
+ }
100
+ const keywords = Object.keys(schema);
101
+ if (keywords.some((keyword) => COMPOSITION_KEYWORDS.has(keyword)) && keywords.some((keyword) => OWN_KEYWORDS.has(keyword))) {
102
+ const part = (keep) => Object.fromEntries(Object.entries(schema).filter(([keyword]) => keep(keyword)));
103
+ return `${wrap(typeOf(part((keyword) => !OWN_KEYWORDS.has(keyword)), indent))} & ${wrap(typeOf(part((keyword) => !COMPOSITION_KEYWORDS.has(keyword)), indent))}`;
104
+ }
105
+ if (schema.$ref !== undefined) {
106
+ return schemaRefName(schema.$ref);
107
+ }
108
+ const parts = [];
109
+ if (schema.const !== undefined) {
110
+ parts.push(literal(schema.const));
111
+ }
112
+ else if (schema.enum !== undefined) {
113
+ parts.push(schema.enum.map(literal).join(" | "));
114
+ }
115
+ else if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
116
+ parts.push((schema.oneOf ?? schema.anyOf ?? []).map((option) => typeOf(option, indent)).join(" | "));
117
+ }
118
+ else if (schema.allOf !== undefined) {
119
+ parts.push(schema.allOf.map((option) => wrap(typeOf(option, indent))).join(" & "));
120
+ }
121
+ else {
122
+ const types = Array.isArray(schema.type) ? schema.type : schema.type === undefined ? [] : [schema.type];
123
+ if (types.length === 0 && (schema.properties !== undefined || schema.additionalProperties !== undefined)) {
124
+ types.push("object");
125
+ }
126
+ if (types.length === 0 && (schema.items !== undefined || schema.prefixItems !== undefined)) {
127
+ types.push("array");
128
+ }
129
+ if (types.length === 0) {
130
+ parts.push("unknown");
131
+ }
132
+ for (const type of types) {
133
+ parts.push(primitive(type, schema, indent));
134
+ }
135
+ }
136
+ if (schema.nullable === true && !parts.includes("null")) {
137
+ parts.push("null");
138
+ }
139
+ return [...new Set(parts)].join(" | ");
140
+ }
141
+ function wrap(type) {
142
+ return type.includes(" | ") ? `(${type})` : type;
143
+ }
144
+ function primitive(type, schema, indent) {
145
+ switch (type) {
146
+ case "string":
147
+ return "string";
148
+ case "number":
149
+ case "integer":
150
+ return "number";
151
+ case "boolean":
152
+ return "boolean";
153
+ case "null":
154
+ return "null";
155
+ case "array":
156
+ if (schema.prefixItems !== undefined) {
157
+ const rest = schema.items === undefined ? "" : `, ...${wrap(typeOf(schema.items, indent))}[]`;
158
+ return `[${schema.prefixItems.map((item) => typeOf(item, indent)).join(", ")}${rest}]`;
159
+ }
160
+ return `${wrap(typeOf(schema.items, indent))}[]`;
161
+ case "object":
162
+ return objectType(schema, indent);
163
+ default:
164
+ return "unknown";
165
+ }
166
+ }
167
+ function objectType(schema, indent) {
168
+ const properties = Object.entries(schema.properties ?? {});
169
+ const required = new Set(schema.required ?? []);
170
+ const extra = schema.additionalProperties;
171
+ const record = extra === undefined || extra === false ? undefined : `${builtIn("Record")}<string, ${extra === true ? "unknown" : typeOf(extra, indent)}>`;
172
+ if (properties.length === 0) {
173
+ return record ?? `${builtIn("Record")}<string, ${extra === false ? "never" : "unknown"}>`;
174
+ }
175
+ const inner = `${indent} `;
176
+ const lines = properties.map(([name, property]) => {
177
+ const optional = required.has(name) ? "" : "?";
178
+ return `${comment(property.description, inner)}${inner}${key(name)}${optional}: ${indentLines(typeOf(property, inner), "")};`;
179
+ });
180
+ const body = `{\n${lines.join("\n")}\n${indent}}`;
181
+ return record === undefined ? body : `${body} & ${record}`;
182
+ }
183
+ function jsonSchemaOf(content) {
184
+ if (content === undefined || Object.keys(content).length === 0) {
185
+ return { kind: "none" };
186
+ }
187
+ for (const [type, media] of Object.entries(content)) {
188
+ const bare = type.split(";")[0]?.trim().toLowerCase() ?? "";
189
+ if (bare === "application/json" || bare.endsWith("+json")) {
190
+ return { kind: "json", schema: media.schema };
191
+ }
192
+ }
193
+ const types = Object.keys(content).map((type) => type.split(";")[0]?.trim().toLowerCase() ?? "");
194
+ if (types.includes("multipart/form-data")) {
195
+ return { kind: "form" };
196
+ }
197
+ if (types.includes("application/x-www-form-urlencoded")) {
198
+ return { kind: "urlencoded" };
199
+ }
200
+ if (types.some((type) => type.startsWith("text/"))) {
201
+ return { kind: "text" };
202
+ }
203
+ return { kind: "other" };
204
+ }
205
+ function operationName(operation, method, path) {
206
+ if (operation.operationId !== undefined && operation.operationId.trim() !== "") {
207
+ return camel(operation.operationId);
208
+ }
209
+ const segments = path.split("/").filter((segment) => segment !== "").map((segment) => {
210
+ const match = /^\{(.+)\}$/.exec(segment);
211
+ return match === null ? pascal(segment) : `By${pascal(match[1] ?? "")}`;
212
+ });
213
+ return camel(`${method} ${segments.join(" ")}`);
214
+ }
215
+ function parameterGroups(context, item, operation) {
216
+ const merged = new Map();
217
+ for (const list of [item.parameters ?? [], operation.parameters ?? []]) {
218
+ for (const raw of list) {
219
+ const parameter = deref(context, raw, "parameters");
220
+ if (parameter.name === undefined || parameter.in === undefined) {
221
+ fail(`a parameter needs a name and a location`);
222
+ }
223
+ merged.set(`${parameter.in}:${parameter.name}`, parameter);
224
+ }
225
+ }
226
+ const params = [];
227
+ const query = [];
228
+ let queryRequired = false;
229
+ for (const parameter of merged.values()) {
230
+ const name = parameter.name ?? "";
231
+ const schema = parameter.schema ?? (parameter.content === undefined ? undefined : Object.values(parameter.content)[0]?.schema);
232
+ const type = typeOf(schema, " ");
233
+ const doc = comment(parameter.description, " ");
234
+ if (parameter.in === "path") {
235
+ params.push(`${doc} ${key(name)}: ${type};`);
236
+ }
237
+ else if (parameter.in === "query") {
238
+ const required = parameter.required === true;
239
+ queryRequired ||= required;
240
+ query.push(`${doc} ${key(name)}${required ? "" : "?"}: ${type}${required ? "" : " | undefined"};`);
241
+ }
242
+ else if (parameter.in === "querystring") {
243
+ queryRequired ||= parameter.required === true;
244
+ query.push(`${doc} [name: string]: unknown;`);
245
+ }
246
+ }
247
+ return { params, query, queryRequired };
248
+ }
249
+ function bodyType(context, operation) {
250
+ if (operation.requestBody === undefined) {
251
+ return undefined;
252
+ }
253
+ const body = deref(context, operation.requestBody, "requestBodies");
254
+ const content = jsonSchemaOf(body.content);
255
+ const required = body.required === true;
256
+ switch (content.kind) {
257
+ case "json":
258
+ return { type: typeOf(content.schema, " "), required };
259
+ case "form":
260
+ return { type: builtIn("FormData"), required };
261
+ case "urlencoded":
262
+ return { type: builtIn("URLSearchParams"), required };
263
+ case "text":
264
+ return { type: "string", required };
265
+ case "none":
266
+ return undefined;
267
+ default:
268
+ return { type: builtIn("BodyInit"), required };
269
+ }
270
+ }
271
+ function outputType(context, operation) {
272
+ const responses = Object.entries(operation.responses ?? {});
273
+ const successful = responses.filter(([status]) => /^2(\d\d|XX)$/.test(status)).toSorted(([a], [b]) => a.localeCompare(b));
274
+ const chosen = successful.length > 0 ? successful : responses.filter(([status]) => status === "default");
275
+ if (chosen.length === 0) {
276
+ return "unknown";
277
+ }
278
+ const types = new Set();
279
+ for (const [, raw] of chosen) {
280
+ const response = deref(context, raw, "responses");
281
+ const content = jsonSchemaOf(response.content);
282
+ switch (content.kind) {
283
+ case "json":
284
+ types.add(typeOf(content.schema, " "));
285
+ break;
286
+ case "text":
287
+ types.add("string");
288
+ break;
289
+ case "none":
290
+ types.add("undefined");
291
+ break;
292
+ default:
293
+ types.add(builtIn("Blob"));
294
+ }
295
+ }
296
+ return [...types].join(" | ");
297
+ }
298
+ function entryOf(context, path, item, method, operation) {
299
+ const { params, query, queryRequired } = parameterGroups(context, item, operation);
300
+ const lines = [` method: ${JSON.stringify(method)};`, ` path: ${JSON.stringify(path)};`];
301
+ if (params.length > 0) {
302
+ lines.push(` params: {\n${params.join("\n")}\n };`);
303
+ }
304
+ if (query.length > 0) {
305
+ lines.push(` query${queryRequired ? "" : "?"}: {\n${query.join("\n")}\n };`);
306
+ }
307
+ const body = bodyType(context, operation);
308
+ if (body !== undefined) {
309
+ lines.push(` body${body.required ? "" : "?"}: ${body.type}${body.required ? "" : " | undefined"};`);
310
+ }
311
+ lines.push(` output: ${outputType(context, operation)};`);
312
+ const doc = [operation.summary, operation.description, operation.deprecated === true ? "@deprecated" : undefined].filter((part) => part !== undefined && part !== "").join("\n\n");
313
+ return { name: operationName(operation, method, path), method, path, lines, doc: doc === "" ? undefined : doc };
314
+ }
315
+ /** The built-in types a generated module may write, with what each is. */
316
+ const BUILT_INS = new Map([
317
+ ["Record", "TypeScript's Record type"],
318
+ ["Blob", "the global Blob type"],
319
+ ["FormData", "the global FormData type"],
320
+ ["URLSearchParams", "the global URLSearchParams type"],
321
+ ["BodyInit", "the global BodyInit type"]
322
+ ]);
323
+ /** The type names no schema can take in a module, with what each is: the interface of the operations, the `RouteTable` the module imports, and the built-in types in `used`, which the module writes. A built-in the module does not write is left to a schema of that name. */
324
+ function reservedTypeNames(apiName, used) {
325
+ const reserved = new Map([
326
+ ["RouteTable", "the RouteTable type the module imports"],
327
+ [apiName, "the interface of the operations, which apiName renames"]
328
+ ]);
329
+ for (const [name, what] of BUILT_INS) {
330
+ if (used.has(name)) {
331
+ reserved.set(name, `${what}, which this module uses`);
332
+ }
333
+ }
334
+ return reserved;
335
+ }
336
+ /**
337
+ * The type name every schema is written under, by schema name, with the
338
+ * reason for a name that is not the schema's own. A schema keeps its own
339
+ * name, as `note-item` gives `NoteItem`, unless `reserved` holds it or a
340
+ * schema earlier in sorted order takes it; then it gets the first free
341
+ * name with a number added, as `Record2`.
342
+ */
343
+ function schemaTypeNames(names, reserved) {
344
+ const holders = new Map(reserved);
345
+ const assigned = new Map();
346
+ for (const name of names) {
347
+ const type = typeName(name);
348
+ if (!holders.has(type)) {
349
+ holders.set(type, `the type of the schema ${JSON.stringify(name)}`);
350
+ assigned.set(name, { type });
351
+ }
352
+ }
353
+ for (const name of names) {
354
+ if (assigned.has(name)) {
355
+ continue;
356
+ }
357
+ const base = typeName(name);
358
+ let suffix = 2;
359
+ while (holders.has(`${base}${suffix}`)) {
360
+ suffix++;
361
+ }
362
+ const type = `${base}${suffix}`;
363
+ assigned.set(name, { type, reason: `named ${type} because ${base} is already ${holders.get(base) ?? "taken"}` });
364
+ holders.set(type, `the type of the schema ${JSON.stringify(name)}`);
365
+ }
366
+ return assigned;
367
+ }
368
+ /**
369
+ * Generates the contract module for an OpenAPI 3.x document given as a
370
+ * parsed object (JSON; convert YAML first). Schemas under
371
+ * `components.schemas` become exported types, every operation becomes an
372
+ * entry of the `Api` interface named by its `operationId` (or by its
373
+ * method and path), and `routes` carries the method and path of each.
374
+ * Header and cookie parameters, security, and non-local references are
375
+ * left out; the client sends headers through its options. A schema whose
376
+ * type name would clash is written under the first free name with a
377
+ * number added, as `Record2`, with a comment that says why, and every
378
+ * `$ref` to it uses that name: one that another schema takes first, as
379
+ * `note-item` and `note_item` both give `NoteItem`, one named like the
380
+ * interface of the operations or the `RouteTable` the module imports, and
381
+ * one named like a built-in type the module writes, such as `Record` for
382
+ * an object of free keys or `Blob` for a binary response. A schema named
383
+ * like a built-in the module does not write keeps its name.
384
+ */
385
+ export function generateClient(document, options = {}) {
386
+ if (typeof document.openapi !== "string" || !document.openapi.startsWith("3.")) {
387
+ fail(`expected an OpenAPI 3.x document, found openapi: ${JSON.stringify(document.openapi)}`);
388
+ }
389
+ const context = { document, apiName: options.apiName ?? "Api" };
390
+ const specifier = options.clientSpecifier ?? "@zerolith/client";
391
+ const names = Object.keys(document.components?.schemas ?? {}).toSorted((a, b) => a.localeCompare(b));
392
+ const first = writeModule(context, specifier, schemaTypeNames(names, reservedTypeNames(context.apiName, new Set())));
393
+ if (![...first.types.values()].some(({ type }) => first.used.has(type))) {
394
+ return first.code;
395
+ }
396
+ return writeModule(context, specifier, schemaTypeNames(names, reservedTypeNames(context.apiName, first.used))).code;
397
+ }
398
+ /** The module text for the given schema type names, with the built-in types it writes, which a second pass reserves when a schema took one of their names. */
399
+ function writeModule(context, specifier, types) {
400
+ const { document } = context;
401
+ builtInsUsed = new Set();
402
+ const out = [];
403
+ const title = document.info?.title === undefined ? "an OpenAPI document" : `${document.info.title}${document.info.version === undefined ? "" : ` ${document.info.version}`}`;
404
+ out.push(`// Generated by @zerolith/client from ${commentText(title)}. Do not edit; regenerate instead.`);
405
+ out.push(`import type { RouteTable } from ${JSON.stringify(specifier)};`);
406
+ out.push("");
407
+ const schemas = Object.entries(document.components?.schemas ?? {}).toSorted(([a], [b]) => a.localeCompare(b));
408
+ schemaTypes = new Map(Array.from(types, ([name, { type }]) => [name, type]));
409
+ for (const [name, schema] of schemas) {
410
+ const { type, reason } = types.get(name) ?? { type: typeName(name) };
411
+ const note = reason === undefined ? undefined : `The schema ${JSON.stringify(name)}, ${reason}.`;
412
+ const text = [schema.description ?? schema.title, note].filter((part) => part !== undefined && part.trim() !== "").join("\n\n");
413
+ out.push(`${comment(text, "")}export type ${type} = ${typeOf(schema, "")};`);
414
+ out.push("");
415
+ }
416
+ const entries = [];
417
+ const seen = new Set();
418
+ for (const [path, rawItem] of Object.entries(document.paths ?? {}).toSorted(([a], [b]) => a.localeCompare(b))) {
419
+ const item = deref(context, rawItem, "pathItems");
420
+ const operations = [];
421
+ for (const method of METHODS) {
422
+ const operation = item[method];
423
+ if (operation !== undefined) {
424
+ operations.push([method, operation]);
425
+ }
426
+ }
427
+ for (const [method, operation] of Object.entries(item.additionalOperations ?? {})) {
428
+ if (!/^[a-z0-9!#$%&'*+.^_`|~-]+$/i.test(method)) {
429
+ fail(`${JSON.stringify(path)} has the additional operation ${JSON.stringify(method)}, which is not an HTTP method name`);
430
+ }
431
+ if (FORBIDDEN_METHODS.has(method.toLowerCase())) {
432
+ continue;
433
+ }
434
+ operations.push([method.toLowerCase(), operation]);
435
+ }
436
+ for (const [method, operation] of operations) {
437
+ const entry = entryOf(context, path, item, method, operation);
438
+ if (seen.has(entry.name)) {
439
+ fail(`two operations resolve to the name "${entry.name}"; give them distinct operationId values`);
440
+ }
441
+ seen.add(entry.name);
442
+ entries.push(entry);
443
+ }
444
+ }
445
+ out.push(`export interface ${context.apiName}\n{`);
446
+ out.push(entries.map((entry) => `${comment(entry.doc, " ")} ${key(entry.name)}: {\n${entry.lines.join("\n")}\n };`).join("\n"));
447
+ out.push("}");
448
+ out.push("");
449
+ out.push("export const routes = {");
450
+ out.push(entries.map((entry) => ` ${key(entry.name)}: { method: ${JSON.stringify(entry.method)}, path: ${JSON.stringify(entry.path)} }`).join(",\n"));
451
+ out.push(`} as const satisfies RouteTable<${context.apiName}>;`);
452
+ out.push("");
453
+ return { code: out.join("\n"), used: builtInsUsed, types };
454
+ }
455
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * @zerolith/client: a typed HTTP client over a neutral contract. The route
3
+ * table and the types come from `@zerolith/client/generate`, which reads an
4
+ * OpenAPI document; the client itself knows nothing about the server beyond
5
+ * its paths. Failures are RFC 9457 problems, thrown as `ProblemError`.
6
+ */
7
+ import { type Problem, type Resource } from "zerolith";
8
+ /**
9
+ * The HTTP method of an operation, in lowercase: one OpenAPI names, `query`
10
+ * being the HTTP QUERY method, or any other method token, as an OpenAPI 3.2
11
+ * `additionalOperations` entry such as `copy` gives.
12
+ */
13
+ export type Method = "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "query" | (string & {});
14
+ /** One operation as the generated `Api` interface describes it. */
15
+ export interface Operation {
16
+ /** The HTTP method in lowercase, such as `get`; the request sends it uppercased. */
17
+ readonly method: Method;
18
+ /** The path template, such as `/notes/{id}`, whose placeholders the client fills from `params` with URI-encoded values. */
19
+ readonly path: string;
20
+ /** Path parameters, by the name inside the braces. */
21
+ readonly params?: Record<string, string | number | boolean>;
22
+ /** Query parameters; arrays repeat the key, objects are JSON. */
23
+ readonly query?: Record<string, unknown>;
24
+ /** The request body; JSON unless it is a `FormData`, `URLSearchParams`, `Blob`, `ArrayBuffer`, `ReadableStream`, or string, which are sent as they are. */
25
+ readonly body?: unknown;
26
+ /** What a successful call resolves to. */
27
+ readonly output: unknown;
28
+ }
29
+ /** What a generated `Api` interface satisfies: every member is an operation. */
30
+ export type Contract<A> = {
31
+ readonly [K in keyof A]: Operation;
32
+ };
33
+ /** The runtime half of a contract: the method and path of every operation. */
34
+ export type RouteTable<A extends Contract<A>> = {
35
+ readonly [K in keyof A]: {
36
+ readonly method: A[K]["method"];
37
+ readonly path: A[K]["path"];
38
+ };
39
+ };
40
+ /** What a call takes: the operation's `params`, `query`, and `body`, as optional as the contract makes them. */
41
+ export type Input<Op extends Operation> = Omit<Op, "method" | "path" | "output">;
42
+ /** What a call resolves to. */
43
+ export type Output<Op extends Operation> = Op["output"];
44
+ /** Per-call options. */
45
+ export interface CallOptions {
46
+ /** Becomes the request's `signal`, so aborting it rejects the call under `fetch` or `portTransport`; `query` replaces it with the resource's own signal. */
47
+ signal?: AbortSignal;
48
+ /** Headers for this call, set over the client's `headers` so that a name in both takes this value. */
49
+ headers?: HeadersInit;
50
+ }
51
+ type InputArgs<Op extends Operation> = Record<never, never> extends Input<Op> ? [input?: Input<Op>, options?: CallOptions] : [input: Input<Op>, options?: CallOptions];
52
+ /** Sends a request. The default is `fetch`; a test or an Electron bridge can answer in process. */
53
+ export type Transport = (request: Request) => Promise<Response>;
54
+ /** Options for `createClient`. */
55
+ export interface ClientOptions {
56
+ /** Prepended to every path. Defaults to "", the page's origin in a browser; pass an absolute URL elsewhere. */
57
+ baseUrl?: string;
58
+ /** Sends every request the client builds and resolves with the response. Defaults to the global `fetch`, looked up on each call. */
59
+ transport?: Transport;
60
+ /** Headers sent with every request, or a function returning them, for values such as a bearer token. */
61
+ headers?: HeadersInit | (() => HeadersInit);
62
+ }
63
+ /** Thrown for a response outside 2xx, carrying the problem the server sent or one built from the status line. */
64
+ export declare class ProblemError extends Error {
65
+ /** The problem the server sent, with `status` filled from the response when the body omits it; a body that is not a JSON problem yields `status` and a `title` from the status line. */
66
+ readonly problem: Problem;
67
+ /** The response outside 2xx, for its status and headers; its body has already been read when the content type is JSON. */
68
+ readonly response: Response;
69
+ /** Wraps `problem` and the `response` it came from; the message is the problem's `title`, or `HTTP <status>` when it has none. */
70
+ constructor(problem: Problem, response: Response);
71
+ }
72
+ /** The client for one contract. */
73
+ export interface Client<A extends Contract<A>> {
74
+ /** Calls an operation and resolves with its output, or rejects with a `ProblemError` for a response outside 2xx. */
75
+ call<K extends keyof A>(name: K, ...args: InputArgs<A[K]>): Promise<Output<A[K]>>;
76
+ /** A resource over an operation: it calls again when the signals read by `input` change, and is idle while `input` returns undefined. */
77
+ query<K extends keyof A>(name: K, input: () => Input<A[K]> | undefined, options?: CallOptions): Resource<Output<A[K]>>;
78
+ /** The `Request` a call would send, for tests and custom transports. */
79
+ request<K extends keyof A>(name: K, ...args: InputArgs<A[K]>): Request;
80
+ }
81
+ /**
82
+ * Creates a client for a generated route table. `routes` and the `Api`
83
+ * type parameter come from the same generated module, so an operation
84
+ * name, its parameters, its body, and its output are checked together.
85
+ */
86
+ export declare function createClient<A extends Contract<A>>(routes: RouteTable<A>, options?: ClientOptions): Client<A>;
87
+ export {};
88
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}