@gusnips/sdkgen 0.2.0 → 0.2.1

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 CHANGED
@@ -105,7 +105,7 @@ const { members } = sdkMethods([
105
105
  /**
106
106
  * Check the API is up.
107
107
  */
108
- health(opts?: RequestOptions): Promise<HealthDto> {
108
+ health(opts?: Omit<RequestOptions, "idempotencyKey">): Promise<HealthDto> {
109
109
  return this.request({ method: "GET", path: "/health" }, undefined, opts);
110
110
  }
111
111
  ```
@@ -123,6 +123,10 @@ through the transport, below. `sdkMethods` also returns:
123
123
  operation's `input` schema. A path slot is filled from the field of its name, or the one
124
124
  `params` maps to it.
125
125
  - `paramTypes` and `returnTypes`: the names your file has to import.
126
+ - `routes`: where each generated method sends its call, keyed by the method. Here that is
127
+ `{ health: { method: "GET", path: "/health", pathParams: [] } }`. A slot in `path` carries the
128
+ argument's name, and `pathParams` lists those arguments in path order. Use it for a docs page
129
+ that shows a REST call beside the SDK call that makes it.
126
130
 
127
131
  Four options:
128
132
 
@@ -246,7 +250,8 @@ error and not "out of date".
246
250
  - **A call with a missing path value throws a TypeError** before anything is sent, rather than
247
251
  calling `/numbers//pair`.
248
252
  - **An idempotency key on a call that takes none throws.** The API would ignore it, so it could not
249
- stop the call running twice.
253
+ stop the call running twice. The method's type refuses it first: only a call that takes a key
254
+ accepts `idempotencyKey` in its options.
250
255
 
251
256
  ## Why it exists
252
257
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { liftContract, type LiftOptions } from "./contract.ts";
2
- export { retrySource, sdkMethods, transportSource, type InjectedMember, type SdkMethods, type SdkMethodsOptions, type SdkOperation, type SdkPlacement, } from "./methods.ts";
2
+ export { retrySource, sdkMethods, transportSource, type InjectedMember, type SdkMethods, type SdkMethodsOptions, type SdkOperation, type SdkPlacement, type SdkRoute, } from "./methods.ts";
3
3
  export { camelCase, docComment, fieldsOf, inputJsonSchema, paramsInterface, pascalCase, typeNames, typeOf, wrapLines, type JsonObject, type SchemaSource, type StandardJsonSchema, } from "./types.ts";
4
4
  export { writeGenerated, type GeneratedFiles, type WriteOptions, type WriteResult, } from "./write.ts";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,eAAe,EACf,eAAe,EACf,UAAU,EACV,SAAS,EACT,MAAM,EACN,SAAS,EACT,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,eAAe,EACf,eAAe,EACf,UAAU,EACV,SAAS,EACT,MAAM,EACN,SAAS,EACT,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,GAMhB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,eAAe,EACf,eAAe,EACf,UAAU,EACV,SAAS,EACT,MAAM,EACN,SAAS,GAIV,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,GAIf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,GAOhB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,eAAe,EACf,eAAe,EACf,UAAU,EACV,SAAS,EACT,MAAM,EACN,SAAS,GAIV,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,GAIf,MAAM,YAAY,CAAC"}
package/dist/methods.d.ts CHANGED
@@ -77,6 +77,20 @@ export interface SdkMethods {
77
77
  paramTypes: string[];
78
78
  /** The declared types the `returns` name, sorted, for their import from the contract. */
79
79
  returnTypes: string[];
80
+ /**
81
+ * Each generated method's route as the SDK spells it, keyed by the method: `numbers.get` →
82
+ * `{ method: "GET", path: "/numbers/:numberId", pathParams: ["numberId"] }`. For a page that
83
+ * shows a REST call beside the SDK call that makes it. Hand-written members have none.
84
+ */
85
+ routes: Record<string, SdkRoute>;
86
+ }
87
+ /** Where a generated method sends its call. */
88
+ export interface SdkRoute {
89
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
90
+ /** The path with each slot named for the argument that fills it: `/numbers/:numberId`. */
91
+ path: string;
92
+ /** The arguments that fill the path, in the order the path has them. */
93
+ pathParams: string[];
80
94
  }
81
95
  /**
82
96
  * The SDK's methods for every operation that names an `sdk` place, with the params interfaces they
@@ -1 +1 @@
1
- {"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":"AAmBA,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AAEpB,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,6FAA6F;IAC7F,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,iFAAiF;IACjF,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,iEAAiE;IACjE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,2FAA2F;IAC3F,OAAO,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,sEAAsE;IACtE,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB;AAED,6FAA6F;AAC7F,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B;;;OAGG;IACH,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IAC5D,gGAAgG;IAChG,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAChF,2EAA2E;IAC3E,MAAM,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,mGAAmG;IACnG,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,yFAAyF;IACzF,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAuBD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,UAAU,EAAE,SAAS,YAAY,EAAE,EACnC,OAAO,GAAE,iBAAsB,GAC9B,UAAU,CA0EZ;AAgID;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAGpC;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAGxC"}
1
+ {"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":"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"}
package/dist/methods.js CHANGED
@@ -25,6 +25,7 @@ const RESERVED = new Set(["request", "constructor"]);
25
25
  /** The spec fields the generator writes, which `specExtra` must not overwrite. */
26
26
  const SPEC_FIELDS = new Set(["method", "path", "keyed", "repeatable"]);
27
27
  const IDENTIFIER = /^[A-Za-z_$][\w$]*$/;
28
+ const VERB = { get: "GET", post: "POST", put: "PUT", patch: "PATCH", delete: "DELETE" };
28
29
  /**
29
30
  * The SDK's methods for every operation that names an `sdk` place, with the params interfaces they
30
31
  * take.
@@ -42,6 +43,7 @@ export function sdkMethods(operations, options = {}) {
42
43
  const params = [];
43
44
  const paramTypes = [];
44
45
  const returnTypes = new Set();
46
+ const routes = {};
45
47
  for (const op of operations) {
46
48
  const sdk = op.sdk;
47
49
  if (sdk === undefined)
@@ -64,11 +66,16 @@ export function sdkMethods(operations, options = {}) {
64
66
  const required = new Set(Array.isArray(listed)
65
67
  ? listed.filter((f) => typeof f === "string" && !fixed.includes(f))
66
68
  : []);
67
- const fields = [
68
- `method: "${op.method.toUpperCase()}"`,
69
- `path: ${JSON.stringify(sdkPath(op, required, where))}`,
70
- ];
71
- if (op.headers?.some((h) => h.name.toLowerCase() === "idempotency-key"))
69
+ const method = VERB[op.method];
70
+ const path = sdkPath(op, required, where);
71
+ routes[sdk.method] = {
72
+ method,
73
+ path,
74
+ pathParams: [...path.matchAll(/:(\w+)/g)].flatMap((match) => match[1] ?? []),
75
+ };
76
+ const fields = [`method: "${method}"`, `path: ${JSON.stringify(path)}`];
77
+ const keyed = op.headers?.some((h) => h.name.toLowerCase() === "idempotency-key") === true;
78
+ if (keyed)
72
79
  fields.push("keyed: true");
73
80
  if (sdk.repeatable !== undefined)
74
81
  fields.push(`repeatable: ${sdk.repeatable}`);
@@ -80,11 +87,14 @@ export function sdkMethods(operations, options = {}) {
80
87
  fields.push(`${propertyKey(key)}: ${JSON.stringify(value)}`);
81
88
  }
82
89
  const argument = iface === null ? "" : `params${iface.optional ? "?" : ""}: ${typeName}, `;
90
+ // A key on a call that takes none is refused by the transport at runtime; the type refuses it
91
+ // first, where the caller's editor shows it.
92
+ const options = keyed ? "RequestOptions" : `Omit<RequestOptions, "idempotencyKey">`;
83
93
  members.push({
84
94
  where,
85
95
  ...place(sdk.method, where),
86
96
  doc: doc(op),
87
- signature: `(${argument}opts?: RequestOptions): Promise<${sdk.returns}>`,
97
+ signature: `(${argument}opts?: ${options}): Promise<${sdk.returns}>`,
88
98
  call: `this.request({ ${fields.join(", ")} }, ${iface === null ? "undefined" : "params"}, opts)`,
89
99
  });
90
100
  }
@@ -103,6 +113,7 @@ export function sdkMethods(operations, options = {}) {
103
113
  members: writeMembers(members, options.namespaces),
104
114
  paramTypes: paramTypes.sort(),
105
115
  returnTypes: [...returnTypes].sort(),
116
+ routes,
106
117
  };
107
118
  }
108
119
  /** `numbers.pair` → its namespace and name, each checked to be a name a class member can have. */
@@ -1 +1 @@
1
- {"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gusnips/sdkgen",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "The pieces of an SDK generator: copy your API's types with their comments, write a schema as a TypeScript type, and keep the output current.",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/index.ts CHANGED
@@ -8,6 +8,7 @@ export {
8
8
  type SdkMethodsOptions,
9
9
  type SdkOperation,
10
10
  type SdkPlacement,
11
+ type SdkRoute,
11
12
  } from "./methods.ts";
12
13
  export {
13
14
  camelCase,
@@ -89,7 +89,7 @@ describe("sdkMethods", () => {
89
89
  /**
90
90
  * Read a number.
91
91
  */
92
- get: (params: GetNumberParams, opts?: RequestOptions): Promise<NumberDto> =>
92
+ get: (params: GetNumberParams, opts?: Omit<RequestOptions, "idempotencyKey">): Promise<NumberDto> =>
93
93
  this.request({ method: "GET", path: "/numbers/:numberId" }, params, opts),
94
94
  };
95
95
  `);
@@ -131,9 +131,11 @@ export interface DeleteNumberParams {
131
131
  it("makes params optional when nothing in them is required, and takes none without input", () => {
132
132
  const { members } = sdkMethods([LIST_NUMBERS, HEALTH]);
133
133
  expect(members).toContain(
134
- "list: (params?: ListNumbersParams, opts?: RequestOptions): Promise<Page<NumberDto>> =>",
134
+ 'list: (params?: ListNumbersParams, opts?: Omit<RequestOptions, "idempotencyKey">): Promise<Page<NumberDto>> =>',
135
+ );
136
+ expect(members).toContain(
137
+ 'health(opts?: Omit<RequestOptions, "idempotencyKey">): Promise<HealthDto> {',
135
138
  );
136
- expect(members).toContain("health(opts?: RequestOptions): Promise<HealthDto> {");
137
139
  expect(members).toContain(`this.request({ method: "GET", path: "/health" }, undefined, opts);`);
138
140
  });
139
141
 
@@ -179,12 +181,35 @@ export interface DeleteNumberParams {
179
181
  " /**\n * Check the API is up.\n *\n * `GET /v1/health`\n */\n",
180
182
  );
181
183
  expect(sdkMethods([HEALTH], { doc: () => [] }).members).toBe(`
182
- health(opts?: RequestOptions): Promise<HealthDto> {
184
+ health(opts?: Omit<RequestOptions, "idempotencyKey">): Promise<HealthDto> {
183
185
  return this.request({ method: "GET", path: "/health" }, undefined, opts);
184
186
  }
185
187
  `);
186
188
  });
187
189
 
190
+ it("hands back each generated method's route, with the arguments that fill its path", () => {
191
+ const renamed: SdkOperation = {
192
+ ...GET_NUMBER,
193
+ name: "pairNumber",
194
+ method: "post",
195
+ path: "/numbers/:id/pair/:slot{[0-9]+}",
196
+ input: z.object({ numberId: z.string(), slot: z.number() }),
197
+ params: { numberId: "id" },
198
+ sdk: { method: "numbers.pair", returns: "NumberDto" },
199
+ };
200
+ const { routes } = sdkMethods([renamed, HEALTH, INTERNAL], {
201
+ inject: [{ method: "numbers.watch", signature: "(): void", call: "undefined" }],
202
+ });
203
+ expect(routes).toEqual({
204
+ "numbers.pair": {
205
+ method: "POST",
206
+ path: "/numbers/:numberId/pair/:slot",
207
+ pathParams: ["numberId", "slot"],
208
+ },
209
+ health: { method: "GET", path: "/health", pathParams: [] },
210
+ });
211
+ });
212
+
188
213
  it("adds the spec fields the hook gives, quoting a key that needs it", () => {
189
214
  const specExtra = () => ({ proxy: ["country", "city"], "x-cost": 2, skipped: undefined });
190
215
  expect(sdkMethods([SEND], { specExtra }).members).toContain(
@@ -411,6 +436,16 @@ ${members}}
411
436
  `,
412
437
  "retry.ts": retrySource(),
413
438
  "transport.ts": transportSource(),
439
+ "uses.ts": `import type { Example } from "./client.ts";
440
+
441
+ // What a caller may pass, and what it may not. Typechecked, never run.
442
+ export function uses(client: Example): void {
443
+ void client.sendMessage({ to: "a", text: "hi" }, { idempotencyKey: "k", timeoutMs: 5_000 });
444
+ void client.numbers.get({ numberId: "n1" }, { timeoutMs: 5_000 });
445
+ // @ts-expect-error numbers.get takes no key, and the transport would throw on one
446
+ void client.numbers.get({ numberId: "n1" }, { idempotencyKey: "k" });
447
+ }
448
+ `,
414
449
  "client.ts": `import { GeneratedOperations } from "./operations.ts";
415
450
  import { send, type Failure, type RequestOptions, type RequestSpec, type Transport } from "./transport.ts";
416
451
 
@@ -455,7 +490,7 @@ export class Example extends GeneratedOperations {
455
490
  const dir = await sdk();
456
491
  // The flags the SDKs on this stack publish with. DOM and no Node types: an SDK runs wherever
457
492
  // fetch does, so the transport may lean on nothing only Node has.
458
- const errors = typeErrors(join(dir, "client.ts"), {
493
+ const errors = typeErrors(join(dir, "uses.ts"), {
459
494
  lib: ["lib.esnext.d.ts", "lib.dom.d.ts"],
460
495
  types: [],
461
496
  noImplicitOverride: true,
package/src/methods.ts CHANGED
@@ -107,6 +107,21 @@ export interface SdkMethods {
107
107
  paramTypes: string[];
108
108
  /** The declared types the `returns` name, sorted, for their import from the contract. */
109
109
  returnTypes: string[];
110
+ /**
111
+ * Each generated method's route as the SDK spells it, keyed by the method: `numbers.get` →
112
+ * `{ method: "GET", path: "/numbers/:numberId", pathParams: ["numberId"] }`. For a page that
113
+ * shows a REST call beside the SDK call that makes it. Hand-written members have none.
114
+ */
115
+ routes: Record<string, SdkRoute>;
116
+ }
117
+
118
+ /** Where a generated method sends its call. */
119
+ export interface SdkRoute {
120
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
121
+ /** The path with each slot named for the argument that fills it: `/numbers/:numberId`. */
122
+ path: string;
123
+ /** The arguments that fill the path, in the order the path has them. */
124
+ pathParams: string[];
110
125
  }
111
126
 
112
127
  /** Success statuses with no body (RFC 9110), the same three the server's reference documents so. */
@@ -120,6 +135,8 @@ const SPEC_FIELDS = new Set(["method", "path", "keyed", "repeatable"]);
120
135
 
121
136
  const IDENTIFIER = /^[A-Za-z_$][\w$]*$/;
122
137
 
138
+ const VERB = { get: "GET", post: "POST", put: "PUT", patch: "PATCH", delete: "DELETE" } as const;
139
+
123
140
  interface Member {
124
141
  /** Who asked for it, for an error message. */
125
142
  where: string;
@@ -150,6 +167,7 @@ export function sdkMethods(
150
167
  const params: string[] = [];
151
168
  const paramTypes: string[] = [];
152
169
  const returnTypes = new Set<string>();
170
+ const routes: Record<string, SdkRoute> = {};
153
171
 
154
172
  for (const op of operations) {
155
173
  const sdk = op.sdk;
@@ -176,12 +194,16 @@ export function sdkMethods(
176
194
  ? listed.filter((f): f is string => typeof f === "string" && !fixed.includes(f))
177
195
  : [],
178
196
  );
179
- const fields = [
180
- `method: "${op.method.toUpperCase()}"`,
181
- `path: ${JSON.stringify(sdkPath(op, required, where))}`,
182
- ];
183
- if (op.headers?.some((h) => h.name.toLowerCase() === "idempotency-key"))
184
- fields.push("keyed: true");
197
+ const method = VERB[op.method];
198
+ const path = sdkPath(op, required, where);
199
+ routes[sdk.method] = {
200
+ method,
201
+ path,
202
+ pathParams: [...path.matchAll(/:(\w+)/g)].flatMap((match) => match[1] ?? []),
203
+ };
204
+ const fields = [`method: "${method}"`, `path: ${JSON.stringify(path)}`];
205
+ const keyed = op.headers?.some((h) => h.name.toLowerCase() === "idempotency-key") === true;
206
+ if (keyed) fields.push("keyed: true");
185
207
  if (sdk.repeatable !== undefined) fields.push(`repeatable: ${sdk.repeatable}`);
186
208
  for (const [key, value] of Object.entries(specExtra?.(op) ?? {})) {
187
209
  if (SPEC_FIELDS.has(key)) {
@@ -193,11 +215,14 @@ export function sdkMethods(
193
215
  }
194
216
 
195
217
  const argument = iface === null ? "" : `params${iface.optional ? "?" : ""}: ${typeName}, `;
218
+ // A key on a call that takes none is refused by the transport at runtime; the type refuses it
219
+ // first, where the caller's editor shows it.
220
+ const options = keyed ? "RequestOptions" : `Omit<RequestOptions, "idempotencyKey">`;
196
221
  members.push({
197
222
  where,
198
223
  ...place(sdk.method, where),
199
224
  doc: doc(op),
200
- signature: `(${argument}opts?: RequestOptions): Promise<${sdk.returns}>`,
225
+ signature: `(${argument}opts?: ${options}): Promise<${sdk.returns}>`,
201
226
  call: `this.request({ ${fields.join(", ")} }, ${iface === null ? "undefined" : "params"}, opts)`,
202
227
  });
203
228
  }
@@ -217,6 +242,7 @@ export function sdkMethods(
217
242
  members: writeMembers(members, options.namespaces),
218
243
  paramTypes: paramTypes.sort(),
219
244
  returnTypes: [...returnTypes].sort(),
245
+ routes,
220
246
  };
221
247
  }
222
248
 
@@ -28,7 +28,7 @@ describe("README", () => {
28
28
  expect(
29
29
  fieldsOf({ type: "object", properties: { "content-type": { type: "string" } } }, ""),
30
30
  ).toBe('"content-type"?: string;\n');
31
- const { members } = sdkMethods([
31
+ const { members, routes } = sdkMethods([
32
32
  {
33
33
  name: "health",
34
34
  method: "get",
@@ -41,9 +41,10 @@ describe("README", () => {
41
41
  /**
42
42
  * Check the API is up.
43
43
  */
44
- health(opts?: RequestOptions): Promise<HealthDto> {
44
+ health(opts?: Omit<RequestOptions, "idempotencyKey">): Promise<HealthDto> {
45
45
  return this.request({ method: "GET", path: "/health" }, undefined, opts);
46
46
  }
47
47
  `);
48
+ expect(routes).toEqual({ health: { method: "GET", path: "/health", pathParams: [] } });
48
49
  });
49
50
  });