@zerolith/client 0.0.0-stage → 0.1.0-alpha.2
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/LICENSE +201 -0
- package/README.md +25 -2
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +61 -0
- package/dist/cli.js.map +1 -0
- package/dist/generate.d.ts +112 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +345 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +121 -0
- package/dist/index.js.map +1 -0
- package/dist/port.d.ts +50 -0
- package/dist/port.d.ts.map +1 -0
- package/dist/port.js +81 -0
- package/dist/port.js.map +1 -0
- package/package.json +59 -5
- package/src/cli.ts +85 -0
- package/src/generate.ts +572 -0
- package/src/index.ts +228 -0
- package/src/port.ts +140 -0
package/dist/generate.js
ADDED
|
@@ -0,0 +1,345 @@
|
|
|
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
|
+
const METHODS = ["get", "put", "post", "delete", "options", "head", "patch", "trace", "query"];
|
|
8
|
+
const IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
9
|
+
function fail(message) {
|
|
10
|
+
throw new Error(`zerolith/client: ${message}`);
|
|
11
|
+
}
|
|
12
|
+
function words(text) {
|
|
13
|
+
return text.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[^A-Za-z0-9]+/).filter((word) => word !== "");
|
|
14
|
+
}
|
|
15
|
+
function pascal(text) {
|
|
16
|
+
return words(text).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("");
|
|
17
|
+
}
|
|
18
|
+
function camel(text) {
|
|
19
|
+
const name = pascal(text);
|
|
20
|
+
return name.charAt(0).toLowerCase() + name.slice(1);
|
|
21
|
+
}
|
|
22
|
+
function typeName(text) {
|
|
23
|
+
const name = pascal(text);
|
|
24
|
+
return /^[0-9]/.test(name) ? `_${name}` : name === "" ? "_" : name;
|
|
25
|
+
}
|
|
26
|
+
function key(name) {
|
|
27
|
+
return IDENTIFIER.test(name) ? name : JSON.stringify(name);
|
|
28
|
+
}
|
|
29
|
+
function comment(text, indent) {
|
|
30
|
+
if (text === undefined || text.trim() === "") {
|
|
31
|
+
return "";
|
|
32
|
+
}
|
|
33
|
+
const lines = text.trim().replace(/\*\//g, "* /").split(/\r?\n/);
|
|
34
|
+
return lines.length === 1 ? `${indent}/** ${lines[0]} */\n` : `${indent}/**\n${lines.map((line) => `${indent} * ${line}`.trimEnd()).join("\n")}\n${indent} */\n`;
|
|
35
|
+
}
|
|
36
|
+
function indentLines(text, indent) {
|
|
37
|
+
return text.split("\n").map((line, index) => (index === 0 ? line : `${indent}${line}`)).join("\n");
|
|
38
|
+
}
|
|
39
|
+
function resolveRef(context, ref, section) {
|
|
40
|
+
const prefix = `#/components/${section}/`;
|
|
41
|
+
if (!ref.startsWith(prefix)) {
|
|
42
|
+
fail(`only local references into components are supported, found ${ref}`);
|
|
43
|
+
}
|
|
44
|
+
const name = decodeURIComponent(ref.slice(prefix.length).replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
45
|
+
const table = context.document.components?.[section];
|
|
46
|
+
const found = table?.[name];
|
|
47
|
+
if (found === undefined) {
|
|
48
|
+
fail(`${ref} does not exist`);
|
|
49
|
+
}
|
|
50
|
+
return found;
|
|
51
|
+
}
|
|
52
|
+
function deref(context, value, section) {
|
|
53
|
+
let current = value;
|
|
54
|
+
for (let depth = 0; current.$ref !== undefined; depth++) {
|
|
55
|
+
if (depth > 16) {
|
|
56
|
+
fail(`reference loop at ${current.$ref}`);
|
|
57
|
+
}
|
|
58
|
+
current = resolveRef(context, current.$ref, section);
|
|
59
|
+
}
|
|
60
|
+
return current;
|
|
61
|
+
}
|
|
62
|
+
function schemaRefName(ref) {
|
|
63
|
+
const prefix = "#/components/schemas/";
|
|
64
|
+
if (!ref.startsWith(prefix)) {
|
|
65
|
+
fail(`only local schema references are supported, found ${ref}`);
|
|
66
|
+
}
|
|
67
|
+
return typeName(decodeURIComponent(ref.slice(prefix.length)));
|
|
68
|
+
}
|
|
69
|
+
function literal(value) {
|
|
70
|
+
return value === undefined ? "undefined" : JSON.stringify(value);
|
|
71
|
+
}
|
|
72
|
+
/** Renders a schema as a TypeScript type. `indent` is the current indentation for nested object types. */
|
|
73
|
+
function typeOf(schema, indent) {
|
|
74
|
+
if (schema === undefined) {
|
|
75
|
+
return "unknown";
|
|
76
|
+
}
|
|
77
|
+
if (schema.$ref !== undefined) {
|
|
78
|
+
return schemaRefName(schema.$ref);
|
|
79
|
+
}
|
|
80
|
+
const parts = [];
|
|
81
|
+
if (schema.const !== undefined) {
|
|
82
|
+
parts.push(literal(schema.const));
|
|
83
|
+
}
|
|
84
|
+
else if (schema.enum !== undefined) {
|
|
85
|
+
parts.push(schema.enum.map(literal).join(" | "));
|
|
86
|
+
}
|
|
87
|
+
else if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
|
|
88
|
+
parts.push((schema.oneOf ?? schema.anyOf ?? []).map((option) => typeOf(option, indent)).join(" | "));
|
|
89
|
+
}
|
|
90
|
+
else if (schema.allOf !== undefined) {
|
|
91
|
+
parts.push(schema.allOf.map((option) => wrap(typeOf(option, indent))).join(" & "));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const types = Array.isArray(schema.type) ? schema.type : schema.type === undefined ? [] : [schema.type];
|
|
95
|
+
if (types.length === 0 && (schema.properties !== undefined || schema.additionalProperties !== undefined)) {
|
|
96
|
+
types.push("object");
|
|
97
|
+
}
|
|
98
|
+
if (types.length === 0 && (schema.items !== undefined || schema.prefixItems !== undefined)) {
|
|
99
|
+
types.push("array");
|
|
100
|
+
}
|
|
101
|
+
if (types.length === 0) {
|
|
102
|
+
parts.push("unknown");
|
|
103
|
+
}
|
|
104
|
+
for (const type of types) {
|
|
105
|
+
parts.push(primitive(type, schema, indent));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (schema.nullable === true && !parts.includes("null")) {
|
|
109
|
+
parts.push("null");
|
|
110
|
+
}
|
|
111
|
+
return [...new Set(parts)].join(" | ");
|
|
112
|
+
}
|
|
113
|
+
function wrap(type) {
|
|
114
|
+
return type.includes(" | ") ? `(${type})` : type;
|
|
115
|
+
}
|
|
116
|
+
function primitive(type, schema, indent) {
|
|
117
|
+
switch (type) {
|
|
118
|
+
case "string":
|
|
119
|
+
return "string";
|
|
120
|
+
case "number":
|
|
121
|
+
case "integer":
|
|
122
|
+
return "number";
|
|
123
|
+
case "boolean":
|
|
124
|
+
return "boolean";
|
|
125
|
+
case "null":
|
|
126
|
+
return "null";
|
|
127
|
+
case "array":
|
|
128
|
+
if (schema.prefixItems !== undefined) {
|
|
129
|
+
const rest = schema.items === undefined ? "" : `, ...${wrap(typeOf(schema.items, indent))}[]`;
|
|
130
|
+
return `[${schema.prefixItems.map((item) => typeOf(item, indent)).join(", ")}${rest}]`;
|
|
131
|
+
}
|
|
132
|
+
return `${wrap(typeOf(schema.items, indent))}[]`;
|
|
133
|
+
case "object":
|
|
134
|
+
return objectType(schema, indent);
|
|
135
|
+
default:
|
|
136
|
+
return "unknown";
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function objectType(schema, indent) {
|
|
140
|
+
const properties = Object.entries(schema.properties ?? {});
|
|
141
|
+
const required = new Set(schema.required ?? []);
|
|
142
|
+
const extra = schema.additionalProperties;
|
|
143
|
+
const record = extra === undefined || extra === false ? undefined : `Record<string, ${extra === true ? "unknown" : typeOf(extra, indent)}>`;
|
|
144
|
+
if (properties.length === 0) {
|
|
145
|
+
return record ?? (extra === false ? "Record<string, never>" : "Record<string, unknown>");
|
|
146
|
+
}
|
|
147
|
+
const inner = `${indent} `;
|
|
148
|
+
const lines = properties.map(([name, property]) => {
|
|
149
|
+
const optional = required.has(name) ? "" : "?";
|
|
150
|
+
return `${comment(property.description, inner)}${inner}${key(name)}${optional}: ${indentLines(typeOf(property, inner), "")};`;
|
|
151
|
+
});
|
|
152
|
+
const body = `{\n${lines.join("\n")}\n${indent}}`;
|
|
153
|
+
return record === undefined ? body : `${body} & ${record}`;
|
|
154
|
+
}
|
|
155
|
+
function jsonSchemaOf(content) {
|
|
156
|
+
if (content === undefined || Object.keys(content).length === 0) {
|
|
157
|
+
return { kind: "none" };
|
|
158
|
+
}
|
|
159
|
+
for (const [type, media] of Object.entries(content)) {
|
|
160
|
+
const bare = type.split(";")[0]?.trim().toLowerCase() ?? "";
|
|
161
|
+
if (bare === "application/json" || bare.endsWith("+json")) {
|
|
162
|
+
return { kind: "json", schema: media.schema };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const types = Object.keys(content).map((type) => type.split(";")[0]?.trim().toLowerCase() ?? "");
|
|
166
|
+
if (types.includes("multipart/form-data")) {
|
|
167
|
+
return { kind: "form" };
|
|
168
|
+
}
|
|
169
|
+
if (types.includes("application/x-www-form-urlencoded")) {
|
|
170
|
+
return { kind: "urlencoded" };
|
|
171
|
+
}
|
|
172
|
+
if (types.some((type) => type.startsWith("text/"))) {
|
|
173
|
+
return { kind: "text" };
|
|
174
|
+
}
|
|
175
|
+
return { kind: "other" };
|
|
176
|
+
}
|
|
177
|
+
function operationName(operation, method, path) {
|
|
178
|
+
if (operation.operationId !== undefined && operation.operationId.trim() !== "") {
|
|
179
|
+
return camel(operation.operationId);
|
|
180
|
+
}
|
|
181
|
+
const segments = path.split("/").filter((segment) => segment !== "").map((segment) => {
|
|
182
|
+
const match = /^\{(.+)\}$/.exec(segment);
|
|
183
|
+
return match === null ? pascal(segment) : `By${pascal(match[1] ?? "")}`;
|
|
184
|
+
});
|
|
185
|
+
return camel(`${method} ${segments.join(" ")}`);
|
|
186
|
+
}
|
|
187
|
+
function parameterGroups(context, item, operation) {
|
|
188
|
+
const merged = new Map();
|
|
189
|
+
for (const list of [item.parameters ?? [], operation.parameters ?? []]) {
|
|
190
|
+
for (const raw of list) {
|
|
191
|
+
const parameter = deref(context, raw, "parameters");
|
|
192
|
+
if (parameter.name === undefined || parameter.in === undefined) {
|
|
193
|
+
fail(`a parameter needs a name and a location`);
|
|
194
|
+
}
|
|
195
|
+
merged.set(`${parameter.in}:${parameter.name}`, parameter);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const params = [];
|
|
199
|
+
const query = [];
|
|
200
|
+
let queryRequired = false;
|
|
201
|
+
for (const parameter of merged.values()) {
|
|
202
|
+
const name = parameter.name ?? "";
|
|
203
|
+
const schema = parameter.schema ?? (parameter.content === undefined ? undefined : Object.values(parameter.content)[0]?.schema);
|
|
204
|
+
const type = typeOf(schema, " ");
|
|
205
|
+
const doc = comment(parameter.description, " ");
|
|
206
|
+
if (parameter.in === "path") {
|
|
207
|
+
params.push(`${doc} ${key(name)}: ${type};`);
|
|
208
|
+
}
|
|
209
|
+
else if (parameter.in === "query") {
|
|
210
|
+
const required = parameter.required === true;
|
|
211
|
+
queryRequired ||= required;
|
|
212
|
+
query.push(`${doc} ${key(name)}${required ? "" : "?"}: ${type}${required ? "" : " | undefined"};`);
|
|
213
|
+
}
|
|
214
|
+
else if (parameter.in === "querystring") {
|
|
215
|
+
queryRequired ||= parameter.required === true;
|
|
216
|
+
query.push(`${doc} [name: string]: unknown;`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return { params, query, queryRequired };
|
|
220
|
+
}
|
|
221
|
+
function bodyType(context, operation) {
|
|
222
|
+
if (operation.requestBody === undefined) {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
const body = deref(context, operation.requestBody, "requestBodies");
|
|
226
|
+
const content = jsonSchemaOf(body.content);
|
|
227
|
+
const required = body.required === true;
|
|
228
|
+
switch (content.kind) {
|
|
229
|
+
case "json":
|
|
230
|
+
return { type: typeOf(content.schema, " "), required };
|
|
231
|
+
case "form":
|
|
232
|
+
return { type: "FormData", required };
|
|
233
|
+
case "urlencoded":
|
|
234
|
+
return { type: "URLSearchParams", required };
|
|
235
|
+
case "text":
|
|
236
|
+
return { type: "string", required };
|
|
237
|
+
case "none":
|
|
238
|
+
return undefined;
|
|
239
|
+
default:
|
|
240
|
+
return { type: "BodyInit", required };
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function outputType(context, operation) {
|
|
244
|
+
const responses = Object.entries(operation.responses ?? {});
|
|
245
|
+
const successful = responses.filter(([status]) => /^2(\d\d|XX)$/.test(status)).toSorted(([a], [b]) => a.localeCompare(b));
|
|
246
|
+
const chosen = successful.length > 0 ? successful : responses.filter(([status]) => status === "default");
|
|
247
|
+
if (chosen.length === 0) {
|
|
248
|
+
return "unknown";
|
|
249
|
+
}
|
|
250
|
+
const types = new Set();
|
|
251
|
+
for (const [, raw] of chosen) {
|
|
252
|
+
const response = deref(context, raw, "responses");
|
|
253
|
+
const content = jsonSchemaOf(response.content);
|
|
254
|
+
switch (content.kind) {
|
|
255
|
+
case "json":
|
|
256
|
+
types.add(typeOf(content.schema, " "));
|
|
257
|
+
break;
|
|
258
|
+
case "text":
|
|
259
|
+
types.add("string");
|
|
260
|
+
break;
|
|
261
|
+
case "none":
|
|
262
|
+
types.add("undefined");
|
|
263
|
+
break;
|
|
264
|
+
default:
|
|
265
|
+
types.add("unknown");
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return [...types].join(" | ");
|
|
269
|
+
}
|
|
270
|
+
function entryOf(context, path, item, method, operation) {
|
|
271
|
+
const { params, query, queryRequired } = parameterGroups(context, item, operation);
|
|
272
|
+
const lines = [` method: "${method}";`, ` path: ${JSON.stringify(path)};`];
|
|
273
|
+
if (params.length > 0) {
|
|
274
|
+
lines.push(` params: {\n${params.join("\n")}\n };`);
|
|
275
|
+
}
|
|
276
|
+
if (query.length > 0) {
|
|
277
|
+
lines.push(` query${queryRequired ? "" : "?"}: {\n${query.join("\n")}\n };`);
|
|
278
|
+
}
|
|
279
|
+
const body = bodyType(context, operation);
|
|
280
|
+
if (body !== undefined) {
|
|
281
|
+
lines.push(` body${body.required ? "" : "?"}: ${body.type}${body.required ? "" : " | undefined"};`);
|
|
282
|
+
}
|
|
283
|
+
lines.push(` output: ${outputType(context, operation)};`);
|
|
284
|
+
const doc = [operation.summary, operation.description, operation.deprecated === true ? "@deprecated" : undefined].filter((part) => part !== undefined && part !== "").join("\n\n");
|
|
285
|
+
return { name: operationName(operation, method, path), method, path, lines, doc: doc === "" ? undefined : doc };
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Generates the contract module for an OpenAPI 3.x document given as a
|
|
289
|
+
* parsed object (JSON; convert YAML first). Schemas under
|
|
290
|
+
* `components.schemas` become exported types, every operation becomes an
|
|
291
|
+
* entry of the `Api` interface named by its `operationId` (or by its
|
|
292
|
+
* method and path), and `routes` carries the method and path of each.
|
|
293
|
+
* Header and cookie parameters, security, and non-local references are
|
|
294
|
+
* left out; the client sends headers through its options.
|
|
295
|
+
*/
|
|
296
|
+
export function generateClient(document, options = {}) {
|
|
297
|
+
if (typeof document.openapi !== "string" || !document.openapi.startsWith("3.")) {
|
|
298
|
+
fail(`expected an OpenAPI 3.x document, found openapi: ${JSON.stringify(document.openapi)}`);
|
|
299
|
+
}
|
|
300
|
+
const context = { document, apiName: options.apiName ?? "Api" };
|
|
301
|
+
const specifier = options.clientSpecifier ?? "@zerolith/client";
|
|
302
|
+
const out = [];
|
|
303
|
+
const title = document.info?.title === undefined ? "an OpenAPI document" : `${document.info.title}${document.info.version === undefined ? "" : ` ${document.info.version}`}`;
|
|
304
|
+
out.push(`// Generated by @zerolith/client from ${title}. Do not edit; regenerate instead.`);
|
|
305
|
+
out.push(`import type { RouteTable } from ${JSON.stringify(specifier)};`);
|
|
306
|
+
out.push("");
|
|
307
|
+
const schemas = Object.entries(document.components?.schemas ?? {}).toSorted(([a], [b]) => a.localeCompare(b));
|
|
308
|
+
for (const [name, schema] of schemas) {
|
|
309
|
+
out.push(`${comment(schema.description ?? schema.title, "")}export type ${typeName(name)} = ${typeOf(schema, "")};`);
|
|
310
|
+
out.push("");
|
|
311
|
+
}
|
|
312
|
+
const entries = [];
|
|
313
|
+
const seen = new Set();
|
|
314
|
+
for (const [path, rawItem] of Object.entries(document.paths ?? {}).toSorted(([a], [b]) => a.localeCompare(b))) {
|
|
315
|
+
const item = deref(context, rawItem, "pathItems");
|
|
316
|
+
const operations = [];
|
|
317
|
+
for (const method of METHODS) {
|
|
318
|
+
const operation = item[method];
|
|
319
|
+
if (operation !== undefined) {
|
|
320
|
+
operations.push([method, operation]);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
for (const [method, operation] of Object.entries(item.additionalOperations ?? {})) {
|
|
324
|
+
operations.push([method.toLowerCase(), operation]);
|
|
325
|
+
}
|
|
326
|
+
for (const [method, operation] of operations) {
|
|
327
|
+
const entry = entryOf(context, path, item, method, operation);
|
|
328
|
+
if (seen.has(entry.name)) {
|
|
329
|
+
fail(`two operations resolve to the name "${entry.name}"; give them distinct operationId values`);
|
|
330
|
+
}
|
|
331
|
+
seen.add(entry.name);
|
|
332
|
+
entries.push(entry);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
out.push(`export interface ${context.apiName}\n{`);
|
|
336
|
+
out.push(entries.map((entry) => `${comment(entry.doc, " ")} ${key(entry.name)}: {\n${entry.lines.join("\n")}\n };`).join("\n"));
|
|
337
|
+
out.push("}");
|
|
338
|
+
out.push("");
|
|
339
|
+
out.push("export const routes = {");
|
|
340
|
+
out.push(entries.map((entry) => ` ${key(entry.name)}: { method: "${entry.method}", path: ${JSON.stringify(entry.path)} }`).join(",\n"));
|
|
341
|
+
out.push(`} as const satisfies RouteTable<${context.apiName}>;`);
|
|
342
|
+
out.push("");
|
|
343
|
+
return out.join("\n");
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
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
|
+
/** The HTTP methods an operation can use; `query` is the HTTP QUERY method. */
|
|
9
|
+
export type Method = "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "trace" | "query";
|
|
10
|
+
/** One operation as the generated `Api` interface describes it. */
|
|
11
|
+
export interface Operation {
|
|
12
|
+
readonly method: Method;
|
|
13
|
+
readonly path: string;
|
|
14
|
+
/** Path parameters, by the name inside the braces. */
|
|
15
|
+
readonly params?: Record<string, string | number | boolean>;
|
|
16
|
+
/** Query parameters; arrays repeat the key, objects are JSON. */
|
|
17
|
+
readonly query?: Record<string, unknown>;
|
|
18
|
+
/** The request body; JSON unless it is a `FormData`, `URLSearchParams`, `Blob`, `ArrayBuffer`, or string. */
|
|
19
|
+
readonly body?: unknown;
|
|
20
|
+
/** What a successful call resolves to. */
|
|
21
|
+
readonly output: unknown;
|
|
22
|
+
}
|
|
23
|
+
/** What a generated `Api` interface satisfies: every member is an operation. */
|
|
24
|
+
export type Contract<A> = {
|
|
25
|
+
readonly [K in keyof A]: Operation;
|
|
26
|
+
};
|
|
27
|
+
/** The runtime half of a contract: the method and path of every operation. */
|
|
28
|
+
export type RouteTable<A extends Contract<A>> = {
|
|
29
|
+
readonly [K in keyof A]: {
|
|
30
|
+
readonly method: A[K]["method"];
|
|
31
|
+
readonly path: A[K]["path"];
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
/** What a call takes: the operation's `params`, `query`, and `body`, as optional as the contract makes them. */
|
|
35
|
+
export type Input<Op extends Operation> = Omit<Op, "method" | "path" | "output">;
|
|
36
|
+
/** What a call resolves to. */
|
|
37
|
+
export type Output<Op extends Operation> = Op["output"];
|
|
38
|
+
/** Per-call options. */
|
|
39
|
+
export interface CallOptions {
|
|
40
|
+
signal?: AbortSignal;
|
|
41
|
+
headers?: HeadersInit;
|
|
42
|
+
}
|
|
43
|
+
type InputArgs<Op extends Operation> = Record<never, never> extends Input<Op> ? [input?: Input<Op>, options?: CallOptions] : [input: Input<Op>, options?: CallOptions];
|
|
44
|
+
/** Sends a request. The default is `fetch`; a test or an Electron bridge can answer in process. */
|
|
45
|
+
export type Transport = (request: Request) => Promise<Response>;
|
|
46
|
+
/** Options for `createClient`. */
|
|
47
|
+
export interface ClientOptions {
|
|
48
|
+
/** Prepended to every path. Defaults to "", the page's origin in a browser; pass an absolute URL elsewhere. */
|
|
49
|
+
baseUrl?: string;
|
|
50
|
+
transport?: Transport;
|
|
51
|
+
/** Headers sent with every request, or a function returning them, for values such as a bearer token. */
|
|
52
|
+
headers?: HeadersInit | (() => HeadersInit);
|
|
53
|
+
}
|
|
54
|
+
/** Thrown for a response outside 2xx, carrying the problem the server sent or one built from the status line. */
|
|
55
|
+
export declare class ProblemError extends Error {
|
|
56
|
+
readonly problem: Problem;
|
|
57
|
+
readonly response: Response;
|
|
58
|
+
constructor(problem: Problem, response: Response);
|
|
59
|
+
}
|
|
60
|
+
/** The client for one contract. */
|
|
61
|
+
export interface Client<A extends Contract<A>> {
|
|
62
|
+
/** Calls an operation and resolves with its output, or rejects with a `ProblemError` for a response outside 2xx. */
|
|
63
|
+
call<K extends keyof A>(name: K, ...args: InputArgs<A[K]>): Promise<Output<A[K]>>;
|
|
64
|
+
/** A resource over an operation: it calls again when the signals read by `input` change, and is idle while `input` returns undefined. */
|
|
65
|
+
query<K extends keyof A>(name: K, input: () => Input<A[K]> | undefined, options?: CallOptions): Resource<Output<A[K]>>;
|
|
66
|
+
/** The `Request` a call would send, for tests and custom transports. */
|
|
67
|
+
request<K extends keyof A>(name: K, ...args: InputArgs<A[K]>): Request;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Creates a client for a generated route table. `routes` and the `Api`
|
|
71
|
+
* type parameter come from the same generated module, so an operation
|
|
72
|
+
* name, its parameters, its body, and its output are checked together.
|
|
73
|
+
*/
|
|
74
|
+
export declare function createClient<A extends Contract<A>>(routes: RouteTable<A>, options?: ClientOptions): Client<A>;
|
|
75
|
+
export {};
|
|
76
|
+
//# 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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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
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 { PROBLEM_MEDIA_TYPE, isProblem, resource } from "zerolith";
|
|
8
|
+
/** Thrown for a response outside 2xx, carrying the problem the server sent or one built from the status line. */
|
|
9
|
+
export class ProblemError extends Error {
|
|
10
|
+
problem;
|
|
11
|
+
response;
|
|
12
|
+
constructor(problem, response) {
|
|
13
|
+
super(problem.title ?? `HTTP ${response.status}`);
|
|
14
|
+
this.name = "ProblemError";
|
|
15
|
+
this.problem = problem;
|
|
16
|
+
this.response = response;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function isRawBody(body) {
|
|
20
|
+
return typeof body === "string" || body instanceof FormData || body instanceof URLSearchParams || body instanceof Blob || body instanceof ArrayBuffer || ArrayBuffer.isView(body) || body instanceof ReadableStream;
|
|
21
|
+
}
|
|
22
|
+
function searchOf(query) {
|
|
23
|
+
const search = new URLSearchParams();
|
|
24
|
+
for (const [key, value] of Object.entries(query)) {
|
|
25
|
+
if (value === undefined || value === null) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
for (const item of Array.isArray(value) ? value : [value]) {
|
|
29
|
+
search.append(key, typeof item === "object" && item !== null ? JSON.stringify(item) : String(item));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return search.size > 0 ? `?${search.toString()}` : "";
|
|
33
|
+
}
|
|
34
|
+
function buildRequest(route, input, options, client) {
|
|
35
|
+
const path = route.path.replace(/\{([^}]+)\}/g, (_match, name) => {
|
|
36
|
+
const value = input.params?.[name];
|
|
37
|
+
if (value === undefined) {
|
|
38
|
+
throw new TypeError(`zerolith/client: ${route.method.toUpperCase()} ${route.path} needs the path parameter "${name}"`);
|
|
39
|
+
}
|
|
40
|
+
return encodeURIComponent(String(value));
|
|
41
|
+
});
|
|
42
|
+
const base = (client.baseUrl ?? "").replace(/\/$/, "");
|
|
43
|
+
const headers = new Headers(typeof client.headers === "function" ? client.headers() : client.headers);
|
|
44
|
+
new Headers(options.headers).forEach((value, key) => headers.set(key, value));
|
|
45
|
+
if (!headers.has("accept")) {
|
|
46
|
+
headers.set("accept", `application/json, ${PROBLEM_MEDIA_TYPE}`);
|
|
47
|
+
}
|
|
48
|
+
const init = { method: route.method.toUpperCase(), headers };
|
|
49
|
+
if (options.signal !== undefined) {
|
|
50
|
+
init.signal = options.signal;
|
|
51
|
+
}
|
|
52
|
+
if (input.body !== undefined) {
|
|
53
|
+
if (isRawBody(input.body)) {
|
|
54
|
+
init.body = input.body;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
init.body = JSON.stringify(input.body);
|
|
58
|
+
if (!headers.has("content-type")) {
|
|
59
|
+
headers.set("content-type", "application/json");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return new Request(`${base}${path}${searchOf(input.query ?? {})}`, init);
|
|
64
|
+
}
|
|
65
|
+
async function readBody(response) {
|
|
66
|
+
if (response.status === 204 || response.status === 205) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
const type = response.headers.get("content-type") ?? "";
|
|
70
|
+
if (type.includes("json")) {
|
|
71
|
+
return response.json();
|
|
72
|
+
}
|
|
73
|
+
const text = await response.text();
|
|
74
|
+
return text === "" ? undefined : text;
|
|
75
|
+
}
|
|
76
|
+
async function settle(response) {
|
|
77
|
+
if (response.ok) {
|
|
78
|
+
return readBody(response);
|
|
79
|
+
}
|
|
80
|
+
let problem;
|
|
81
|
+
if ((response.headers.get("content-type") ?? "").includes("json")) {
|
|
82
|
+
const body = await response.json().catch(() => undefined);
|
|
83
|
+
if (isProblem(body)) {
|
|
84
|
+
problem = { status: response.status, ...body };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
throw new ProblemError(problem ?? { status: response.status, title: response.statusText === "" ? `HTTP ${response.status}` : response.statusText }, response);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Creates a client for a generated route table. `routes` and the `Api`
|
|
91
|
+
* type parameter come from the same generated module, so an operation
|
|
92
|
+
* name, its parameters, its body, and its output are checked together.
|
|
93
|
+
*/
|
|
94
|
+
export function createClient(routes, options = {}) {
|
|
95
|
+
const transport = options.transport ?? ((request) => fetch(request));
|
|
96
|
+
const request = (name, input, callOptions) => {
|
|
97
|
+
const route = routes[name];
|
|
98
|
+
if (route === undefined) {
|
|
99
|
+
throw new TypeError(`zerolith/client: unknown operation "${String(name)}"`);
|
|
100
|
+
}
|
|
101
|
+
return buildRequest(route, input ?? {}, callOptions ?? {}, options);
|
|
102
|
+
};
|
|
103
|
+
const call = async (name, input, callOptions) => {
|
|
104
|
+
return settle(await transport(request(name, input, callOptions)));
|
|
105
|
+
};
|
|
106
|
+
return {
|
|
107
|
+
call(name, ...args) {
|
|
108
|
+
return call(name, args[0], args[1]);
|
|
109
|
+
},
|
|
110
|
+
query(name, input, callOptions = {}) {
|
|
111
|
+
return resource({
|
|
112
|
+
params: input,
|
|
113
|
+
loader: ({ params, abort }) => call(name, params, { ...callOptions, signal: abort })
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
request(name, ...args) {
|
|
117
|
+
return request(name, args[0], args[1]);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/port.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A transport over a message port, for the places `fetch` cannot reach the
|
|
3
|
+
* server: an Electron renderer behind `contextBridge`, a worker, a test.
|
|
4
|
+
* `portTransport` runs where the client runs; `servePort` runs where the
|
|
5
|
+
* handler runs. Bodies travel as text, which covers JSON and encoded forms.
|
|
6
|
+
*/
|
|
7
|
+
import type { Transport } from "./index.js";
|
|
8
|
+
/** The port shapes supported: a DOM `MessagePort`, Node's, or Electron's `MessagePortMain`. */
|
|
9
|
+
export interface PortLike {
|
|
10
|
+
postMessage(message: unknown): void;
|
|
11
|
+
start?(): void;
|
|
12
|
+
addEventListener?(type: "message", listener: (event: {
|
|
13
|
+
data: unknown;
|
|
14
|
+
}) => void): void;
|
|
15
|
+
on?(type: "message", listener: (event: {
|
|
16
|
+
data: unknown;
|
|
17
|
+
}) => void): void;
|
|
18
|
+
}
|
|
19
|
+
/** What crosses the port for a request. */
|
|
20
|
+
export interface PortRequest {
|
|
21
|
+
kind: "zerolith:request";
|
|
22
|
+
id: number;
|
|
23
|
+
url: string;
|
|
24
|
+
method: string;
|
|
25
|
+
headers: [string, string][];
|
|
26
|
+
body: string | null;
|
|
27
|
+
}
|
|
28
|
+
/** What crosses the port for a response. */
|
|
29
|
+
export interface PortResponse {
|
|
30
|
+
kind: "zerolith:response";
|
|
31
|
+
id: number;
|
|
32
|
+
status: number;
|
|
33
|
+
statusText: string;
|
|
34
|
+
headers: [string, string][];
|
|
35
|
+
body: string | null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A `Transport` that sends each request over the port as a message and
|
|
39
|
+
* resolves with the response that comes back under the same id. Aborting
|
|
40
|
+
* the request's signal rejects the call; the message already sent is
|
|
41
|
+
* answered and ignored.
|
|
42
|
+
*/
|
|
43
|
+
export declare function portTransport(port: PortLike): Transport;
|
|
44
|
+
/**
|
|
45
|
+
* Answers the requests `portTransport` sends by building a `Request`,
|
|
46
|
+
* calling `handler`, and posting the response back. A handler that throws
|
|
47
|
+
* answers with a 500 problem so the client sees a `ProblemError`.
|
|
48
|
+
*/
|
|
49
|
+
export declare function servePort(port: PortLike, handler: (request: Request) => Response | Promise<Response>): void;
|
|
50
|
+
//# sourceMappingURL=port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../src/port.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,+FAA+F;AAC/F,MAAM,WAAW,QAAQ;IAErB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,KAAK,CAAC,IAAI,IAAI,CAAC;IACf,gBAAgB,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACvF,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAC5E;AAED,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAExB,IAAI,EAAE,kBAAkB,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAEzB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAmBD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,CA0CvD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CA4B3G"}
|