@redocly/client-generator 0.0.0-snapshot.1784554531

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/README.md +506 -0
  2. package/lib/config-file.d.ts +8 -0
  3. package/lib/config-file.d.ts.map +1 -0
  4. package/lib/config-file.js +32 -0
  5. package/lib/config-file.js.map +1 -0
  6. package/lib/config.d.ts +63 -0
  7. package/lib/config.d.ts.map +1 -0
  8. package/lib/config.js +2 -0
  9. package/lib/config.js.map +1 -0
  10. package/lib/emitters/auth.d.ts +14 -0
  11. package/lib/emitters/auth.d.ts.map +1 -0
  12. package/lib/emitters/auth.js +30 -0
  13. package/lib/emitters/auth.js.map +1 -0
  14. package/lib/emitters/client-assembly.d.ts +15 -0
  15. package/lib/emitters/client-assembly.d.ts.map +1 -0
  16. package/lib/emitters/client-assembly.js +299 -0
  17. package/lib/emitters/client-assembly.js.map +1 -0
  18. package/lib/emitters/descriptor.d.ts +22 -0
  19. package/lib/emitters/descriptor.d.ts.map +1 -0
  20. package/lib/emitters/descriptor.js +207 -0
  21. package/lib/emitters/descriptor.js.map +1 -0
  22. package/lib/emitters/emit-options.d.ts +71 -0
  23. package/lib/emitters/emit-options.d.ts.map +1 -0
  24. package/lib/emitters/emit-options.js +28 -0
  25. package/lib/emitters/emit-options.js.map +1 -0
  26. package/lib/emitters/faker.d.ts +11 -0
  27. package/lib/emitters/faker.d.ts.map +1 -0
  28. package/lib/emitters/faker.js +204 -0
  29. package/lib/emitters/faker.js.map +1 -0
  30. package/lib/emitters/identifier.d.ts +28 -0
  31. package/lib/emitters/identifier.d.ts.map +1 -0
  32. package/lib/emitters/identifier.js +94 -0
  33. package/lib/emitters/identifier.js.map +1 -0
  34. package/lib/emitters/inline-runtime.d.ts +11 -0
  35. package/lib/emitters/inline-runtime.d.ts.map +1 -0
  36. package/lib/emitters/inline-runtime.js +97 -0
  37. package/lib/emitters/inline-runtime.js.map +1 -0
  38. package/lib/emitters/jsdoc.d.ts +9 -0
  39. package/lib/emitters/jsdoc.d.ts.map +1 -0
  40. package/lib/emitters/jsdoc.js +83 -0
  41. package/lib/emitters/jsdoc.js.map +1 -0
  42. package/lib/emitters/mock.d.ts +22 -0
  43. package/lib/emitters/mock.d.ts.map +1 -0
  44. package/lib/emitters/mock.js +243 -0
  45. package/lib/emitters/mock.js.map +1 -0
  46. package/lib/emitters/operation-aliases.d.ts +27 -0
  47. package/lib/emitters/operation-aliases.d.ts.map +1 -0
  48. package/lib/emitters/operation-aliases.js +138 -0
  49. package/lib/emitters/operation-aliases.js.map +1 -0
  50. package/lib/emitters/operation-signature.d.ts +23 -0
  51. package/lib/emitters/operation-signature.d.ts.map +1 -0
  52. package/lib/emitters/operation-signature.js +34 -0
  53. package/lib/emitters/operation-signature.js.map +1 -0
  54. package/lib/emitters/operation-types.d.ts +32 -0
  55. package/lib/emitters/operation-types.d.ts.map +1 -0
  56. package/lib/emitters/operation-types.js +117 -0
  57. package/lib/emitters/operation-types.js.map +1 -0
  58. package/lib/emitters/operations.d.ts +39 -0
  59. package/lib/emitters/operations.d.ts.map +1 -0
  60. package/lib/emitters/operations.js +33 -0
  61. package/lib/emitters/operations.js.map +1 -0
  62. package/lib/emitters/pagination.d.ts +69 -0
  63. package/lib/emitters/pagination.d.ts.map +1 -0
  64. package/lib/emitters/pagination.js +223 -0
  65. package/lib/emitters/pagination.js.map +1 -0
  66. package/lib/emitters/runtime-sources.d.ts +16 -0
  67. package/lib/emitters/runtime-sources.d.ts.map +1 -0
  68. package/lib/emitters/runtime-sources.js +16 -0
  69. package/lib/emitters/runtime-sources.js.map +1 -0
  70. package/lib/emitters/sample.d.ts +27 -0
  71. package/lib/emitters/sample.d.ts.map +1 -0
  72. package/lib/emitters/sample.js +161 -0
  73. package/lib/emitters/sample.js.map +1 -0
  74. package/lib/emitters/setup-bake.d.ts +15 -0
  75. package/lib/emitters/setup-bake.d.ts.map +1 -0
  76. package/lib/emitters/setup-bake.js +65 -0
  77. package/lib/emitters/setup-bake.js.map +1 -0
  78. package/lib/emitters/sse.d.ts +10 -0
  79. package/lib/emitters/sse.d.ts.map +1 -0
  80. package/lib/emitters/sse.js +46 -0
  81. package/lib/emitters/sse.js.map +1 -0
  82. package/lib/emitters/support.d.ts +13 -0
  83. package/lib/emitters/support.d.ts.map +1 -0
  84. package/lib/emitters/support.js +21 -0
  85. package/lib/emitters/support.js.map +1 -0
  86. package/lib/emitters/swr.d.ts +10 -0
  87. package/lib/emitters/swr.d.ts.map +1 -0
  88. package/lib/emitters/swr.js +88 -0
  89. package/lib/emitters/swr.js.map +1 -0
  90. package/lib/emitters/tanstack-query.d.ts +11 -0
  91. package/lib/emitters/tanstack-query.d.ts.map +1 -0
  92. package/lib/emitters/tanstack-query.js +68 -0
  93. package/lib/emitters/tanstack-query.js.map +1 -0
  94. package/lib/emitters/transformers.d.ts +11 -0
  95. package/lib/emitters/transformers.d.ts.map +1 -0
  96. package/lib/emitters/transformers.js +334 -0
  97. package/lib/emitters/transformers.js.map +1 -0
  98. package/lib/emitters/ts.d.ts +40 -0
  99. package/lib/emitters/ts.d.ts.map +1 -0
  100. package/lib/emitters/ts.js +104 -0
  101. package/lib/emitters/ts.js.map +1 -0
  102. package/lib/emitters/type-guards.d.ts +21 -0
  103. package/lib/emitters/type-guards.d.ts.map +1 -0
  104. package/lib/emitters/type-guards.js +183 -0
  105. package/lib/emitters/type-guards.js.map +1 -0
  106. package/lib/emitters/types.d.ts +23 -0
  107. package/lib/emitters/types.d.ts.map +1 -0
  108. package/lib/emitters/types.js +127 -0
  109. package/lib/emitters/types.js.map +1 -0
  110. package/lib/emitters/wrapper-support.d.ts +40 -0
  111. package/lib/emitters/wrapper-support.d.ts.map +1 -0
  112. package/lib/emitters/wrapper-support.js +112 -0
  113. package/lib/emitters/wrapper-support.js.map +1 -0
  114. package/lib/emitters/zod.d.ts +13 -0
  115. package/lib/emitters/zod.d.ts.map +1 -0
  116. package/lib/emitters/zod.js +344 -0
  117. package/lib/emitters/zod.js.map +1 -0
  118. package/lib/errors.d.ts +4 -0
  119. package/lib/errors.d.ts.map +1 -0
  120. package/lib/errors.js +7 -0
  121. package/lib/errors.js.map +1 -0
  122. package/lib/generators/anchor.d.ts +9 -0
  123. package/lib/generators/anchor.d.ts.map +1 -0
  124. package/lib/generators/anchor.js +10 -0
  125. package/lib/generators/anchor.js.map +1 -0
  126. package/lib/generators/index.d.ts +15 -0
  127. package/lib/generators/index.d.ts.map +1 -0
  128. package/lib/generators/index.js +62 -0
  129. package/lib/generators/index.js.map +1 -0
  130. package/lib/generators/mock.d.ts +9 -0
  131. package/lib/generators/mock.d.ts.map +1 -0
  132. package/lib/generators/mock.js +23 -0
  133. package/lib/generators/mock.js.map +1 -0
  134. package/lib/generators/resolve.d.ts +19 -0
  135. package/lib/generators/resolve.d.ts.map +1 -0
  136. package/lib/generators/resolve.js +68 -0
  137. package/lib/generators/resolve.js.map +1 -0
  138. package/lib/generators/sdk.d.ts +12 -0
  139. package/lib/generators/sdk.d.ts.map +1 -0
  140. package/lib/generators/sdk.js +26 -0
  141. package/lib/generators/sdk.js.map +1 -0
  142. package/lib/generators/swr.d.ts +15 -0
  143. package/lib/generators/swr.d.ts.map +1 -0
  144. package/lib/generators/swr.js +27 -0
  145. package/lib/generators/swr.js.map +1 -0
  146. package/lib/generators/tanstack-query.d.ts +17 -0
  147. package/lib/generators/tanstack-query.d.ts.map +1 -0
  148. package/lib/generators/tanstack-query.js +30 -0
  149. package/lib/generators/tanstack-query.js.map +1 -0
  150. package/lib/generators/transformers.d.ts +19 -0
  151. package/lib/generators/transformers.d.ts.map +1 -0
  152. package/lib/generators/transformers.js +28 -0
  153. package/lib/generators/transformers.js.map +1 -0
  154. package/lib/generators/types.d.ts +66 -0
  155. package/lib/generators/types.d.ts.map +1 -0
  156. package/lib/generators/types.js +2 -0
  157. package/lib/generators/types.js.map +1 -0
  158. package/lib/generators/zod.d.ts +14 -0
  159. package/lib/generators/zod.d.ts.map +1 -0
  160. package/lib/generators/zod.js +23 -0
  161. package/lib/generators/zod.js.map +1 -0
  162. package/lib/index.d.ts +29 -0
  163. package/lib/index.d.ts.map +1 -0
  164. package/lib/index.js +119 -0
  165. package/lib/index.js.map +1 -0
  166. package/lib/intermediate-representation/build.d.ts +4 -0
  167. package/lib/intermediate-representation/build.d.ts.map +1 -0
  168. package/lib/intermediate-representation/build.js +761 -0
  169. package/lib/intermediate-representation/build.js.map +1 -0
  170. package/lib/intermediate-representation/model.d.ts +275 -0
  171. package/lib/intermediate-representation/model.d.ts.map +1 -0
  172. package/lib/intermediate-representation/model.js +5 -0
  173. package/lib/intermediate-representation/model.js.map +1 -0
  174. package/lib/intermediate-representation/normalize-swagger2.d.ts +10 -0
  175. package/lib/intermediate-representation/normalize-swagger2.d.ts.map +1 -0
  176. package/lib/intermediate-representation/normalize-swagger2.js +210 -0
  177. package/lib/intermediate-representation/normalize-swagger2.js.map +1 -0
  178. package/lib/intermediate-representation/sanitize-identifiers.d.ts +30 -0
  179. package/lib/intermediate-representation/sanitize-identifiers.d.ts.map +1 -0
  180. package/lib/intermediate-representation/sanitize-identifiers.js +153 -0
  181. package/lib/intermediate-representation/sanitize-identifiers.js.map +1 -0
  182. package/lib/loader.d.ts +4 -0
  183. package/lib/loader.d.ts.map +1 -0
  184. package/lib/loader.js +14 -0
  185. package/lib/loader.js.map +1 -0
  186. package/lib/plugin.d.ts +19 -0
  187. package/lib/plugin.d.ts.map +1 -0
  188. package/lib/plugin.js +41 -0
  189. package/lib/plugin.js.map +1 -0
  190. package/lib/runtime/auth.d.ts +15 -0
  191. package/lib/runtime/auth.d.ts.map +1 -0
  192. package/lib/runtime/auth.js +67 -0
  193. package/lib/runtime/auth.js.map +1 -0
  194. package/lib/runtime/create-client.d.ts +35 -0
  195. package/lib/runtime/create-client.d.ts.map +1 -0
  196. package/lib/runtime/create-client.js +215 -0
  197. package/lib/runtime/create-client.js.map +1 -0
  198. package/lib/runtime/errors.d.ts +11 -0
  199. package/lib/runtime/errors.d.ts.map +1 -0
  200. package/lib/runtime/errors.js +25 -0
  201. package/lib/runtime/errors.js.map +1 -0
  202. package/lib/runtime/index.d.ts +14 -0
  203. package/lib/runtime/index.d.ts.map +1 -0
  204. package/lib/runtime/index.js +24 -0
  205. package/lib/runtime/index.js.map +1 -0
  206. package/lib/runtime/multipart.d.ts +9 -0
  207. package/lib/runtime/multipart.d.ts.map +1 -0
  208. package/lib/runtime/multipart.js +31 -0
  209. package/lib/runtime/multipart.js.map +1 -0
  210. package/lib/runtime/paginate.d.ts +36 -0
  211. package/lib/runtime/paginate.d.ts.map +1 -0
  212. package/lib/runtime/paginate.js +99 -0
  213. package/lib/runtime/paginate.js.map +1 -0
  214. package/lib/runtime/parse.d.ts +9 -0
  215. package/lib/runtime/parse.d.ts.map +1 -0
  216. package/lib/runtime/parse.js +37 -0
  217. package/lib/runtime/parse.js.map +1 -0
  218. package/lib/runtime/retry.d.ts +15 -0
  219. package/lib/runtime/retry.d.ts.map +1 -0
  220. package/lib/runtime/retry.js +51 -0
  221. package/lib/runtime/retry.js.map +1 -0
  222. package/lib/runtime/send.d.ts +31 -0
  223. package/lib/runtime/send.d.ts.map +1 -0
  224. package/lib/runtime/send.js +138 -0
  225. package/lib/runtime/send.js.map +1 -0
  226. package/lib/runtime/setup.d.ts +11 -0
  227. package/lib/runtime/setup.d.ts.map +1 -0
  228. package/lib/runtime/setup.js +13 -0
  229. package/lib/runtime/setup.js.map +1 -0
  230. package/lib/runtime/sse.d.ts +21 -0
  231. package/lib/runtime/sse.d.ts.map +1 -0
  232. package/lib/runtime/sse.js +163 -0
  233. package/lib/runtime/sse.js.map +1 -0
  234. package/lib/runtime/types.d.ts +232 -0
  235. package/lib/runtime/types.d.ts.map +1 -0
  236. package/lib/runtime/types.js +9 -0
  237. package/lib/runtime/types.js.map +1 -0
  238. package/lib/runtime/url.d.ts +25 -0
  239. package/lib/runtime/url.d.ts.map +1 -0
  240. package/lib/runtime/url.js +97 -0
  241. package/lib/runtime/url.js.map +1 -0
  242. package/lib/runtime-contract.d.ts +27 -0
  243. package/lib/runtime-contract.d.ts.map +1 -0
  244. package/lib/runtime-contract.js +14 -0
  245. package/lib/runtime-contract.js.map +1 -0
  246. package/lib/types.d.ts +118 -0
  247. package/lib/types.d.ts.map +1 -0
  248. package/lib/types.js +2 -0
  249. package/lib/types.js.map +1 -0
  250. package/package.json +59 -0
@@ -0,0 +1,153 @@
1
+ import { logger } from '@redocly/openapi-core';
2
+ import { isSafeIdentifier, uniqueIdent } from '../emitters/identifier.js';
3
+ /**
4
+ * Coerce every document-derived name that lands in a TypeScript *declaration*
5
+ * slot — schema type names, operation (function) names — into a valid, unique JS
6
+ * identifier, and rewrite every reference to a renamed schema to match.
7
+ *
8
+ * This is a security boundary, not a nicety. `ts.factory.createIdentifier` prints
9
+ * its text verbatim with no validation, so a spec name like
10
+ * `foo(){};globalThis.x=1;export async function bar` would emit as executable
11
+ * top-level code in every consumer of the generated client. Sanitizing here, once,
12
+ * means no raw name reaches the printer regardless of which emitter consumes it.
13
+ *
14
+ * Valid identifiers pass through unchanged, so well-formed specs are byte-for-byte
15
+ * unaffected; only `-`/`.`/space/reserved-word/hostile names are rewritten (with a
16
+ * warning). `assertSafeIdentifiers` is the belt-and-suspenders gate that fails the
17
+ * build if any name still slips through — it should never fire after this pass.
18
+ */
19
+ export function sanitizeIdentifiers(model) {
20
+ // Schema names share TypeScript's *type* namespace; operation names its *value*
21
+ // namespace. Keep separate `used` sets so a function and a type may share a name.
22
+ const schemaNames = new Set();
23
+ const renamed = new Map();
24
+ for (const schema of model.schemas) {
25
+ const safe = uniqueIdent(schema.name, schemaNames);
26
+ if (safe !== schema.name) {
27
+ renamed.set(schema.name, safe);
28
+ warnRename('schema', schema.name, safe);
29
+ schema.name = safe;
30
+ }
31
+ }
32
+ // Security-scheme keys feed the apiKey setter name (`setApiKey<Key>`, built with a
33
+ // first-char-only pascalCase) and the runtime's security-matching string literals.
34
+ // Sanitize so the setter is a valid identifier, then rewrite each operation's
35
+ // `security` list with the same map so the literals still match.
36
+ const schemeKeys = new Set();
37
+ const renamedKeys = new Map();
38
+ for (const scheme of model.securitySchemes) {
39
+ const safe = uniqueIdent(scheme.key, schemeKeys);
40
+ if (safe !== scheme.key) {
41
+ renamedKeys.set(scheme.key, safe);
42
+ warnRename('security scheme', scheme.key, safe);
43
+ scheme.key = safe;
44
+ }
45
+ }
46
+ // A reference to a renamed schema/scheme must follow it; an unknown/dangling name is
47
+ // still sanitized standalone so it can never carry an injection payload.
48
+ const fixRef = (name) => renamed.get(name) ?? sanitizeRef(name);
49
+ const fixKey = (key) => renamedKeys.get(key) ?? sanitizeRef(key);
50
+ for (const schema of model.schemas)
51
+ rewriteRefs(schema.schema, fixRef);
52
+ const operationNames = new Set();
53
+ for (const service of model.services) {
54
+ for (const op of service.operations) {
55
+ const safe = uniqueIdent(op.name, operationNames);
56
+ if (safe !== op.name) {
57
+ warnRename('operation', op.name, safe);
58
+ op.specName = op.name;
59
+ op.name = safe;
60
+ }
61
+ rewriteOperationRefs(op, fixRef);
62
+ op.security = op.security.map((alternative) => alternative.map(fixKey));
63
+ }
64
+ }
65
+ }
66
+ /**
67
+ * Throw if any declaration name is still not a safe identifier — a generator bug, not
68
+ * bad input.
69
+ *
70
+ * This gates the three names that land *directly* in a binding slot from the model:
71
+ * schema names, security-scheme keys, and operation names. Identifiers an emitter
72
+ * *derives* from these — path-parameter binding names (`uniqueIdent`) and enum
73
+ * const-object keys (`isIdentifier`-gated) — are sanitized at their point of use,
74
+ * not here, so they stay safe even though this gate does not re-check them.
75
+ */
76
+ export function assertSafeIdentifiers(model) {
77
+ for (const schema of model.schemas) {
78
+ if (!isSafeIdentifier(schema.name))
79
+ throw unsafe('schema', schema.name);
80
+ }
81
+ for (const scheme of model.securitySchemes) {
82
+ // The key drives `setApiKey<Key>`, so it must be a safe identifier.
83
+ if (!isSafeIdentifier(scheme.key))
84
+ throw unsafe('security scheme', scheme.key);
85
+ }
86
+ for (const service of model.services) {
87
+ for (const op of service.operations) {
88
+ if (!isSafeIdentifier(op.name))
89
+ throw unsafe('operation', op.name);
90
+ }
91
+ }
92
+ }
93
+ function unsafe(kind, name) {
94
+ return new Error(`Internal error: ${kind} name ${JSON.stringify(name)} is not a safe identifier after sanitization.`);
95
+ }
96
+ /** Sanitize a ref/`omit` target that has no matching declaration (rare: a dangling $ref). */
97
+ function sanitizeRef(name) {
98
+ // No uniqueness context here; a throwaway set yields a pure, deterministic sanitize.
99
+ return uniqueIdent(name, new Set());
100
+ }
101
+ function warnRename(kind, from, to) {
102
+ logger.warn(`generate-client: ${kind} name ${JSON.stringify(from)} is not a valid TypeScript identifier; using ${JSON.stringify(to)}.\n`);
103
+ }
104
+ /** Rewrite `ref`/`omit`/discriminator targets in a schema subtree via `fixRef` (mutates). */
105
+ function rewriteRefs(schema, fixRef) {
106
+ switch (schema.kind) {
107
+ case 'ref':
108
+ schema.name = fixRef(schema.name);
109
+ break;
110
+ case 'omit':
111
+ schema.base = fixRef(schema.base);
112
+ break;
113
+ case 'array':
114
+ rewriteRefs(schema.items, fixRef);
115
+ break;
116
+ case 'record':
117
+ rewriteRefs(schema.value, fixRef);
118
+ break;
119
+ case 'object':
120
+ for (const prop of schema.properties)
121
+ rewriteRefs(prop.schema, fixRef);
122
+ break;
123
+ case 'union':
124
+ for (const member of schema.members)
125
+ rewriteRefs(member, fixRef);
126
+ if (schema.discriminator) {
127
+ for (const entry of schema.discriminator.mapping)
128
+ entry.schemaName = fixRef(entry.schemaName);
129
+ }
130
+ break;
131
+ case 'intersection':
132
+ for (const member of schema.members)
133
+ rewriteRefs(member, fixRef);
134
+ break;
135
+ // scalar / literal / enum / null / unknown carry no schema references.
136
+ }
137
+ }
138
+ function rewriteOperationRefs(op, fixRef) {
139
+ for (const p of op.pathParams)
140
+ rewriteRefs(p.schema, fixRef);
141
+ for (const p of op.queryParams)
142
+ rewriteRefs(p.schema, fixRef);
143
+ for (const p of op.headerParams)
144
+ rewriteRefs(p.schema, fixRef);
145
+ if (op.requestBody)
146
+ rewriteRefs(op.requestBody.schema, fixRef);
147
+ for (const r of [...op.successResponses, ...op.errorResponses]) {
148
+ rewriteRefs(r.schema, fixRef);
149
+ if (r.itemSchema)
150
+ rewriteRefs(r.itemSchema, fixRef);
151
+ }
152
+ }
153
+ //# sourceMappingURL=sanitize-identifiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-identifiers.js","sourceRoot":"","sources":["../../src/intermediate-representation/sanitize-identifiers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type Config } from '@redocly/openapi-core';
2
+ import type { LoadResult } from './types.js';
3
+ export declare function loadSpec(ref: string, config?: Config): Promise<LoadResult>;
4
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EAEZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAWhF"}
package/lib/loader.js ADDED
@@ -0,0 +1,14 @@
1
+ import { bundle, createConfig, detectSpec, } from '@redocly/openapi-core';
2
+ export async function loadSpec(ref, config) {
3
+ const cfg = config ?? (await createConfig({}));
4
+ // We do NOT pass `dereference: true` — the IR builder needs `$ref` preserved so it can map
5
+ // response/parameter schemas back to named `components.schemas` entries.
6
+ // Validation (shape, OpenAPI version) is delegated to `bundle()`, which throws clear messages.
7
+ const result = await bundle({ ref, config: cfg });
8
+ const parsed = result.bundle.parsed;
9
+ return {
10
+ document: parsed,
11
+ version: detectSpec(parsed),
12
+ };
13
+ }
14
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,YAAY,EACZ,UAAU,GAGX,MAAM,uBAAuB,CAAC;AAI/B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,MAAe;IACzD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,2FAA2F;IAC3F,yEAAyE;IACzE,+FAA+F;IAC/F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO;QACL,QAAQ,EAAE,MAAmC;QAC7C,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { CustomGenerator } from './generators/types.js';
2
+ /**
3
+ * Identity helper for authoring a custom generator with full type inference and one validation
4
+ * choke-point. `export default defineGenerator({ name, run, … })`. Returns its argument unchanged.
5
+ *
6
+ * @experimental The plugin API may change between minor versions until stabilized.
7
+ */
8
+ export declare function defineGenerator(generator: CustomGenerator): CustomGenerator;
9
+ export type { CustomGenerator, GeneratedFile, Generator, GeneratorInput, GeneratorName, OutputMode, } from './generators/types.js';
10
+ export type { ArgsStyle, ErrorMode } from './emitters/operations.js';
11
+ export type { DateType } from './emitters/types.js';
12
+ export type { ApiModel, NamedSchemaModel, OperationModel, ParamModel, PropertyModel, RequestBodyModel, ResponseBodyModel, ScalarKind, SchemaMetadata, SchemaModel, ServiceModel, } from './intermediate-representation/model.js';
13
+ export { arrow, constArray, exportConstStatement, jsdoc, parseStatements, printNodes, printStatements, ts, } from './emitters/ts.js';
14
+ export { operationSignature } from './emitters/operation-signature.js';
15
+ export type { OperationSignature } from './emitters/operation-signature.js';
16
+ export { schemaToTypeNode } from './emitters/types.js';
17
+ export { pascalCase } from './emitters/support.js';
18
+ export { safeIdent } from './emitters/identifier.js';
19
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,eAAe,GAAG,eAAe,CAE3E;AAGD,YAAY,EACV,eAAe,EACf,aAAa,EACb,SAAS,EACT,cAAc,EACd,aAAa,EACb,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,YAAY,EACV,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,WAAW,EACX,YAAY,GACb,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EACL,KAAK,EACL,UAAU,EACV,oBAAoB,EACpB,KAAK,EACL,eAAe,EACf,UAAU,EACV,eAAe,EACf,EAAE,GACH,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC"}
package/lib/plugin.js ADDED
@@ -0,0 +1,41 @@
1
+ // The custom-generator authoring API — the EXPERIMENTAL plugin surface, re-exported from the
2
+ // package root (`@redocly/client-generator`).
3
+ //
4
+ // ⚠️ Experimental: this surface (the IR types and the codegen toolkit re-exported here) may change
5
+ // between minor versions until it is stabilized. Pin your version if you depend on it.
6
+ //
7
+ // A custom generator is `(GeneratorInput) => GeneratedFile[]` plus a `name`; select it in
8
+ // `generators` by name (inline via `customGenerators`) or by import specifier (path/package). It
9
+ // receives the same spec-agnostic IR (`model`) the built-in generators consume, and may use the same
10
+ // TypeScript-emitting toolkit re-exported below, so a plugin is a first-class peer of `sdk`/`zod`/…
11
+ // The generated client stays dependency-free: a plugin's output is its own file(s), and its runtime
12
+ // libraries are peers of the consumer's app, never of the client.
13
+ //
14
+ // // my-generator.ts
15
+ // import { defineGenerator, ts, printStatements } from '@redocly/client-generator';
16
+ // export default defineGenerator({
17
+ // name: 'route-map',
18
+ // requires: ['sdk'],
19
+ // run({ model, outputPath }) {
20
+ // const routes = model.services.flatMap((s) => s.operations)
21
+ // .map((op) => ` ${op.name}: '${op.method.toUpperCase()} ${op.path}',`).join('\n');
22
+ // return [{ path: outputPath.replace(/\.ts$/, '.routes.ts'),
23
+ // content: `export const routes = {\n${routes}\n} as const;\n` }];
24
+ // },
25
+ // });
26
+ /**
27
+ * Identity helper for authoring a custom generator with full type inference and one validation
28
+ * choke-point. `export default defineGenerator({ name, run, … })`. Returns its argument unchanged.
29
+ *
30
+ * @experimental The plugin API may change between minor versions until stabilized.
31
+ */
32
+ export function defineGenerator(generator) {
33
+ return generator;
34
+ }
35
+ // --- Codegen toolkit: build TypeScript the same way the built-in generators do -----------------
36
+ export { arrow, constArray, exportConstStatement, jsdoc, parseStatements, printNodes, printStatements, ts, } from './emitters/ts.js';
37
+ export { operationSignature } from './emitters/operation-signature.js';
38
+ export { schemaToTypeNode } from './emitters/types.js';
39
+ export { pascalCase } from './emitters/support.js';
40
+ export { safeIdent } from './emitters/identifier.js';
41
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,8CAA8C;AAC9C,EAAE;AACF,mGAAmG;AACnG,uFAAuF;AACvF,EAAE;AACF,0FAA0F;AAC1F,iGAAiG;AACjG,qGAAqG;AACrG,oGAAoG;AACpG,oGAAoG;AACpG,kEAAkE;AAClE,EAAE;AACF,uBAAuB;AACvB,sFAAsF;AACtF,qCAAqC;AACrC,yBAAyB;AACzB,yBAAyB;AACzB,mCAAmC;AACnC,mEAAmE;AACnE,6FAA6F;AAC7F,mEAAmE;AACnE,mFAAmF;AACnF,SAAS;AACT,QAAQ;AAIR;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,SAA0B;IACxD,OAAO,SAAS,CAAC;AACnB,CAAC;AA6BD,kGAAkG;AAClG,OAAO,EACL,KAAK,EACL,UAAU,EACV,oBAAoB,EACpB,KAAK,EACL,eAAe,EACf,UAAU,EACV,eAAe,EACf,EAAE,GACH,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ClientConfig, SecuritySpec } from './types.js';
2
+ /**
3
+ * Build the auth headers/query for one operation's `security` OR-alternatives from the
4
+ * instance credentials (`config.auth`) — capability module, wired into `createClient`.
5
+ * The first alternative whose schemes (an AND-set) are all configured is applied, so
6
+ * "bearer OR apiKey" works with either credential and never sends both. When none is
7
+ * fully configured, the first alternative's configured schemes are still sent (the
8
+ * server rejects the request, mirroring the previous behavior).
9
+ * Cookie-borne apiKeys fold into a single `Cookie` header joined with `; `.
10
+ */
11
+ export declare function resolveAuth(security: readonly (readonly SecuritySpec[])[], config: ClientConfig): Promise<{
12
+ headers: Record<string, string>;
13
+ query: Record<string, string>;
14
+ }>;
15
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/runtime/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC;AAqB5E;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,SAAS,CAAC,SAAS,YAAY,EAAE,CAAC,EAAE,EAC9C,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CA8B7E"}
@@ -0,0 +1,67 @@
1
+ /** Resolve a credential: a literal passes through; a function is awaited per request. */
2
+ async function resolveToken(provider) {
3
+ return typeof provider === 'function' ? await provider() : provider;
4
+ }
5
+ /** UTF-8-safe base64: bare `btoa` throws on non-Latin-1 credentials (RFC 7617 allows UTF-8). */
6
+ function encodeBase64(text) {
7
+ let binary = '';
8
+ for (const byte of new TextEncoder().encode(text))
9
+ binary += String.fromCharCode(byte);
10
+ return btoa(binary);
11
+ }
12
+ /** Whether a credential for this scheme is configured on the instance. */
13
+ function isConfigured(scheme, config) {
14
+ if (scheme.kind === 'apiKey')
15
+ return config.auth?.apiKey?.[scheme.scheme] !== undefined;
16
+ if (scheme.kind === 'bearer')
17
+ return config.auth?.bearer !== undefined;
18
+ return config.auth?.basic !== undefined;
19
+ }
20
+ /**
21
+ * Build the auth headers/query for one operation's `security` OR-alternatives from the
22
+ * instance credentials (`config.auth`) — capability module, wired into `createClient`.
23
+ * The first alternative whose schemes (an AND-set) are all configured is applied, so
24
+ * "bearer OR apiKey" works with either credential and never sends both. When none is
25
+ * fully configured, the first alternative's configured schemes are still sent (the
26
+ * server rejects the request, mirroring the previous behavior).
27
+ * Cookie-borne apiKeys fold into a single `Cookie` header joined with `; `.
28
+ */
29
+ export async function resolveAuth(security, config) {
30
+ const alternative = security.find((schemes) => schemes.every((scheme) => isConfigured(scheme, config))) ??
31
+ security[0] ??
32
+ [];
33
+ const headers = {};
34
+ const query = {};
35
+ const cookies = [];
36
+ for (const scheme of alternative) {
37
+ if (scheme.kind === 'apiKey') {
38
+ const provider = config.auth?.apiKey?.[scheme.scheme];
39
+ if (provider === undefined)
40
+ continue;
41
+ const value = await resolveToken(provider);
42
+ if (scheme.in === 'header')
43
+ headers[scheme.name] = value;
44
+ else if (scheme.in === 'query')
45
+ query[scheme.name] = value;
46
+ // Cookie values may contain reserved characters (`;`, `=`, space, …); percent-encode
47
+ // so the credential can't break the `Cookie` header syntax.
48
+ else
49
+ cookies.push(`${scheme.name}=${encodeURIComponent(value)}`);
50
+ }
51
+ else if (scheme.kind === 'bearer') {
52
+ const provider = config.auth?.bearer;
53
+ if (provider !== undefined)
54
+ headers.Authorization = `Bearer ${await resolveToken(provider)}`;
55
+ }
56
+ else {
57
+ const basic = config.auth?.basic;
58
+ if (basic !== undefined) {
59
+ headers.Authorization = `Basic ${encodeBase64(`${basic.username}:${basic.password}`)}`;
60
+ }
61
+ }
62
+ }
63
+ if (cookies.length > 0)
64
+ headers.Cookie = cookies.join('; ');
65
+ return { headers, query };
66
+ }
67
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/runtime/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { type SendCapabilities } from './send.js';
2
+ import type { Client, ClientConfig, OperationContext, OperationDescriptor, OpsShape, PaginationSpec, QueryValue, RequestOptions, SecuritySpec, ServerSentEvent, SseOptions } from './types.js';
3
+ /**
4
+ * The optional behaviors `createClientCore` can dispatch to but never statically
5
+ * imports. The package's public `createClient` wires the full set; the future
6
+ * inline-mode assembler wires only the capabilities a spec needs.
7
+ */
8
+ export type Capabilities = SendCapabilities & {
9
+ resolveAuth?: (security: readonly (readonly SecuritySpec[])[], config: ClientConfig) => Promise<{
10
+ headers: Record<string, string>;
11
+ query: Record<string, string>;
12
+ }>;
13
+ sse?: (config: ClientConfig, op: OperationContext, prepare: () => Promise<{
14
+ url: string;
15
+ init: SseOptions;
16
+ }>, dataKind: 'json' | 'text') => AsyncGenerator<ServerSentEvent<unknown>>;
17
+ paginate?: {
18
+ pages: (call: (args?: OperationArgs, init?: RequestOptions) => Promise<unknown>, spec: PaginationSpec, args?: OperationArgs, init?: RequestOptions) => AsyncGenerator<unknown>;
19
+ items: (call: (args?: OperationArgs, init?: RequestOptions) => Promise<unknown>, spec: PaginationSpec, args?: OperationArgs, init?: RequestOptions) => AsyncGenerator<unknown>;
20
+ };
21
+ };
22
+ /** The grouped args wire shape: path params by name plus the `params`/`body`/`headers` slots. */
23
+ export type OperationArgs = {
24
+ params?: Record<string, QueryValue>;
25
+ body?: unknown;
26
+ headers?: Record<string, unknown>;
27
+ } & Record<string, unknown>;
28
+ /**
29
+ * Build a typed instance client over operation descriptors: one real bound method per
30
+ * operation (attached by a construction-time loop — no Proxy), plus the core members
31
+ * (`configure`/`use`/`auth`), which are assigned AFTER the loop so they win any name
32
+ * collision with an operation. All behavior dispatches through the capability seam.
33
+ */
34
+ export declare function createClientCore<Ops extends OpsShape, Id extends string = string, Path extends string = string, Tag extends string = string>(operations: Record<string, OperationDescriptor>, initial?: ClientConfig<OperationContext<Id, Path, Tag>>, caps?: Capabilities): Client<Ops, OperationContext<Id, Path, Tag>>;
35
+ //# sourceMappingURL=create-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-client.d.ts","sourceRoot":"","sources":["../../src/runtime/create-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyC,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,KAAK,EAEV,MAAM,EACN,YAAY,EAEZ,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EACR,cAAc,EAEd,UAAU,EACV,cAAc,EACd,YAAY,EACZ,eAAe,EACf,UAAU,EAEX,MAAM,YAAY,CAAC;AAGpB;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG;IAC5C,WAAW,CAAC,EAAE,CACZ,QAAQ,EAAE,SAAS,CAAC,SAAS,YAAY,EAAE,CAAC,EAAE,EAC9C,MAAM,EAAE,YAAY,KACjB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IACjF,GAAG,CAAC,EAAE,CACJ,MAAM,EAAE,YAAY,EACpB,EAAE,EAAE,gBAAgB,EAGpB,OAAO,EAAE,MAAM,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC,EACzD,QAAQ,EAAE,MAAM,GAAG,MAAM,KACtB,cAAc,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,CACL,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,EACvE,IAAI,EAAE,cAAc,EACpB,IAAI,CAAC,EAAE,aAAa,EACpB,IAAI,CAAC,EAAE,cAAc,KAClB,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7B,KAAK,EAAE,CACL,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,EACvE,IAAI,EAAE,cAAc,EACpB,IAAI,CAAC,EAAE,aAAa,EACpB,IAAI,CAAC,EAAE,cAAc,KAClB,cAAc,CAAC,OAAO,CAAC,CAAC;KAC9B,CAAC;CACH,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAuK5B;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,SAAS,QAAQ,EACpB,EAAE,SAAS,MAAM,GAAG,MAAM,EAC1B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,GAAG,SAAS,MAAM,GAAG,MAAM,EAE3B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC/C,OAAO,GAAE,YAAY,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAM,EAC3D,IAAI,GAAE,YAAiB,GACtB,MAAM,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAoF9C"}
@@ -0,0 +1,215 @@
1
+ import { ApiError } from './errors.js';
2
+ import { parse, readError } from './parse.js';
3
+ import { middlewareChain, send, toHeaderRecord } from './send.js';
4
+ import { buildUrl, substitutePath } from './url.js';
5
+ /** The response reader implied by the descriptor (before any per-call `parseAs` override). */
6
+ function kindFor(op) {
7
+ if (op.responseKind === 'void' || op.responseKind === 'blob' || op.responseKind === 'text') {
8
+ return op.responseKind;
9
+ }
10
+ return 'auto';
11
+ }
12
+ /** Route the grouped args by the descriptor: path values, query object, body, extra headers. */
13
+ function splitArgs(op, args) {
14
+ const path = {};
15
+ for (const param of op.params ?? []) {
16
+ if (param.in === 'path')
17
+ path[param.name] = args[param.name];
18
+ }
19
+ return { path, query: args.params, body: args.body, headers: args.headers };
20
+ }
21
+ /**
22
+ * The query-serialization hints for the descriptor's query params. A spec is built only
23
+ * when the param deviates from the OpenAPI defaults (`form` + `explode: true`, encoded),
24
+ * and always fully resolved — so `explode: false` or `allowReserved` alone (no `style`)
25
+ * are honored, and an omitted `explode` keeps the exploded default.
26
+ */
27
+ function queryStyles(op) {
28
+ let styles;
29
+ for (const param of op.params ?? []) {
30
+ if (param.in !== 'query')
31
+ continue;
32
+ const deviates = (param.style !== undefined && param.style !== 'form') ||
33
+ param.explode === false ||
34
+ param.allowReserved === true;
35
+ if (!deviates)
36
+ continue;
37
+ styles ??= {};
38
+ styles[param.name] = {
39
+ style: param.style ?? 'form',
40
+ explode: param.explode ?? true,
41
+ allowReserved: param.allowReserved,
42
+ };
43
+ }
44
+ return styles;
45
+ }
46
+ /** Stringify caller-supplied extra headers, skipping empty entries. */
47
+ function stringHeaders(headers) {
48
+ const out = {};
49
+ for (const [key, value] of Object.entries(headers ?? {})) {
50
+ if (value !== undefined && value !== null)
51
+ out[key] = String(value);
52
+ }
53
+ return out;
54
+ }
55
+ /** Build the request pieces an attempt needs: the final URL and the merged per-call init. */
56
+ async function prepareRequest(config, op, args, init, caps) {
57
+ const { path, query, body, headers } = splitArgs(op, args);
58
+ const authed = op.security?.length && caps.resolveAuth
59
+ ? await caps.resolveAuth(op.security, config)
60
+ : { headers: {}, query: {} };
61
+ const fullQuery = { ...query, ...authed.query };
62
+ const url = buildUrl(config.serverUrl ?? '', substitutePath(op.path, path), Object.keys(fullQuery).length > 0 ? fullQuery : undefined, queryStyles(op));
63
+ const mergedInit = {
64
+ ...init,
65
+ method: op.method.toUpperCase(),
66
+ // Precedence, lowest → highest (later spreads win): injected auth → explicit
67
+ // header params → caller `init.headers` — the caller always overrides both.
68
+ headers: {
69
+ ...authed.headers,
70
+ ...stringHeaders(headers),
71
+ ...toHeaderRecord(init.headers),
72
+ },
73
+ };
74
+ return { url, init: mergedInit, body };
75
+ }
76
+ /** One non-SSE call: send, then branch on the configured error mode. */
77
+ async function execute(config, op, args, init, caps) {
78
+ const prepared = await prepareRequest(config, op, args, init, caps);
79
+ const opCtx = { id: op.id, path: op.path, tags: [...(op.tags ?? [])] };
80
+ const { parseAs, ...sendInit } = prepared.init;
81
+ const { response, context } = await send(config, opCtx, prepared.url, sendInit, prepared.body, op.body?.multipart === true, caps);
82
+ const readKind = parseAs ?? kindFor(op);
83
+ if (config.errorMode === 'result') {
84
+ if (!response.ok) {
85
+ return { data: undefined, error: await readError(response), response };
86
+ }
87
+ return { data: await parse(response, readKind), error: undefined, response };
88
+ }
89
+ if (!response.ok) {
90
+ let error = new ApiError(context.url, response.status, response.statusText, await readError(response));
91
+ // Thread the error through each middleware's onError in turn (each may replace it).
92
+ for (const mw of middlewareChain(config)) {
93
+ if (mw.onError)
94
+ error = await mw.onError(error, context);
95
+ }
96
+ throw error;
97
+ }
98
+ return parse(response, readKind);
99
+ }
100
+ /** The paginate capability, or a descriptive throw when a paginated op is iterated unwired. */
101
+ function paginateCapability(caps, op) {
102
+ if (!caps.paginate) {
103
+ throw new Error(`Pagination capability not wired: cannot iterate operation "${op.id}"`);
104
+ }
105
+ return caps.paginate;
106
+ }
107
+ /**
108
+ * The per-page call the iterators drive: the method itself in throw mode; in result
109
+ * mode a wrapper that unwraps the `{ data, error, response }` envelope — the page
110
+ * pointers are data-rooted — rethrowing a failed page as `ApiError` (iteration is
111
+ * error-mode-agnostic; the throw-mode-only `onError` middleware hook is not invoked).
112
+ */
113
+ function pageCall(method, config) {
114
+ if (config.errorMode !== 'result')
115
+ return method;
116
+ return async (args, init) => {
117
+ const envelope = (await method(args, init));
118
+ // Failure is `!response.ok` — NOT `data === undefined`: a successful bodyless page
119
+ // (204/void) also parses to undefined data, and a failed page's `error` can be
120
+ // undefined too (unreadable body). The pointers then miss on the undefined data
121
+ // and iteration stops cleanly, which is the correct semantics for an empty page.
122
+ if (!envelope.response.ok) {
123
+ const { response } = envelope;
124
+ throw new ApiError(response.url, response.status, response.statusText, envelope.error);
125
+ }
126
+ return envelope.data;
127
+ };
128
+ }
129
+ /**
130
+ * Build a typed instance client over operation descriptors: one real bound method per
131
+ * operation (attached by a construction-time loop — no Proxy), plus the core members
132
+ * (`configure`/`use`/`auth`), which are assigned AFTER the loop so they win any name
133
+ * collision with an operation. All behavior dispatches through the capability seam.
134
+ */
135
+ export function createClientCore(operations, initial = {}, caps = {}) {
136
+ // The literal-union narrowing is a compile-time DX contract only; internally the
137
+ // runtime works with the base (string-typed) context. One cast at this boundary —
138
+ // `ClientConfig<Narrow>` is not assignable to `ClientConfig` (middleware ctx
139
+ // params are contravariant).
140
+ const given = initial;
141
+ // Private mutable config; the middleware array is copied so `use()` never mutates the caller's.
142
+ const config = { ...given, middleware: [...(given.middleware ?? [])] };
143
+ const client = {};
144
+ for (const [name, op] of Object.entries(operations)) {
145
+ if (op.responseKind === 'sse') {
146
+ client[name] = (args = {}, init = {}) => {
147
+ if (!caps.sse) {
148
+ throw new Error(`SSE capability not wired: cannot stream operation "${op.id}"`);
149
+ }
150
+ const stream = caps.sse;
151
+ return (async function* () {
152
+ const opCtx = { id: op.id, path: op.path, tags: [...(op.tags ?? [])] };
153
+ // A thunk the stream re-runs on every (re)connect, so auth (which `prepareRequest`
154
+ // resolves) is refreshed per attempt rather than frozen at the first connect.
155
+ const prepare = async () => {
156
+ const prepared = await prepareRequest(config, op, args, init, caps);
157
+ return { url: prepared.url, init: prepared.init };
158
+ };
159
+ yield* stream(config, opCtx, prepare, op.sseDataKind ?? 'text');
160
+ })();
161
+ };
162
+ }
163
+ else {
164
+ const method = (args = {}, init = {}) => execute(config, op, args, init, caps);
165
+ const spec = op.pagination;
166
+ // Paginated ops keep their one-shot call and gain `.pages`/`.items`, dispatching
167
+ // through the capability seam (like SSE: absent capability throws descriptively).
168
+ // Iteration is error-mode-agnostic: the iterators' pointers are data-rooted, so on
169
+ // a result-mode client (`errorMode` is fixed at construction — `configure()`
170
+ // ignores it) each page's envelope is unwrapped before it reaches the capability.
171
+ // A failed page aborts iteration by throwing ApiError, even on result-mode
172
+ // clients; the `onError` middleware hook (throw-mode-only) is not invoked.
173
+ client[name] = spec
174
+ ? Object.assign(method, {
175
+ pages: (args, init) => paginateCapability(caps, op).pages(pageCall(method, config), spec, args, init),
176
+ items: (args, init) => paginateCapability(caps, op).items(pageCall(method, config), spec, args, init),
177
+ })
178
+ : method;
179
+ }
180
+ }
181
+ // Core members are assigned AFTER the operation loop — they win over colliding op names.
182
+ client.configure = (next) => {
183
+ // `errorMode` is fixed at generate time (it shapes the static types); flipping it at
184
+ // runtime would silently desync return shapes from `Client<Ops>`, so it is ignored.
185
+ const { errorMode: _fixed, auth, ...rest } = next;
186
+ Object.assign(config, rest);
187
+ // `auth` merges into existing credentials (like the `auth.*` setters) rather than
188
+ // replacing wholesale — so `configure({ auth: { bearer } })` keeps a previously set
189
+ // basic/apiKey. `apiKey` merges per scheme.
190
+ if (auth) {
191
+ config.auth = {
192
+ ...config.auth,
193
+ ...auth,
194
+ ...(auth.apiKey ? { apiKey: { ...config.auth?.apiKey, ...auth.apiKey } } : {}),
195
+ };
196
+ }
197
+ };
198
+ client.use = (...middleware) => {
199
+ // Reassign (don't push) so a caller-provided `middleware` array isn't mutated.
200
+ config.middleware = [...(config.middleware ?? []), ...middleware];
201
+ };
202
+ client.auth = {
203
+ bearer(token) {
204
+ config.auth = { ...config.auth, bearer: token };
205
+ },
206
+ basic(username, password) {
207
+ config.auth = { ...config.auth, basic: { username, password } };
208
+ },
209
+ apiKey(scheme, value) {
210
+ config.auth = { ...config.auth, apiKey: { ...config.auth?.apiKey, [scheme]: value } };
211
+ },
212
+ };
213
+ return client;
214
+ }
215
+ //# sourceMappingURL=create-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-client.js","sourceRoot":"","sources":["../../src/runtime/create-client.ts"],"names":[],"mappings":"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"}