@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,344 @@
1
+ // Emits Zod schemas from the IR. Each named schema becomes an
2
+ // `export const <Name>Schema = z.<…>;` built with `ts.factory`, mirroring the
3
+ // type emitter (`types.ts`) but targeting runtime validators instead of types.
4
+ // Operations with a JSON request or response body additionally land in the
5
+ // `operationSchemas` map, which powers the `zodValidation` client middleware.
6
+ //
7
+ // Only the refinement methods stable across zod 3.23 and 4 are emitted
8
+ // (`.min/.max/.int/.gt/.lt/.regex`); format helpers (`.email/.uuid/.url`) diverge
9
+ // between major versions and are deferred. Refs become `z.lazy(() => …Schema)`,
10
+ // which sidesteps declaration ordering and recursion uniformly.
11
+ import { allOperations, } from '../intermediate-representation/model.js';
12
+ import { safeIdent } from './identifier.js';
13
+ import { isSseOp } from './sse.js';
14
+ import { pascalCase } from './support.js';
15
+ import { jsdoc, literalExpression, printStatements, ts } from './ts.js';
16
+ const { factory } = ts;
17
+ /** `<Name>Schema` — the const identifier a named schema is bound to. */
18
+ function schemaConstName(name) {
19
+ return `${pascalCase(name)}Schema`;
20
+ }
21
+ /** `z` member access: `z.<method>`. */
22
+ function zMember(method) {
23
+ return factory.createPropertyAccessExpression(factory.createIdentifier('z'), method);
24
+ }
25
+ /** `z.<method>(...args)`. */
26
+ function zCall(method, args = []) {
27
+ return factory.createCallExpression(zMember(method), undefined, args);
28
+ }
29
+ /** `<expr>.<method>(...args)` — chains a refinement onto a base expression. */
30
+ function chain(expr, method, args = []) {
31
+ return factory.createCallExpression(factory.createPropertyAccessExpression(expr, method), undefined, args);
32
+ }
33
+ const NO_SCHEMAS = new Map();
34
+ /** Map an IR schema to the Zod expression that validates it. */
35
+ export function schemaToZodExpression(schema, byName = NO_SCHEMAS) {
36
+ return withRefinements(baseExpression(schema, byName), schema);
37
+ }
38
+ function baseExpression(schema, byName) {
39
+ switch (schema.kind) {
40
+ case 'scalar':
41
+ return scalarExpression(schema.scalar, schema.metadata);
42
+ case 'object':
43
+ return objectExpression(schema.properties, byName);
44
+ case 'array':
45
+ return zCall('array', [schemaToZodExpression(schema.items, byName)]);
46
+ case 'record':
47
+ return zCall('record', [zCall('string'), schemaToZodExpression(schema.value, byName)]);
48
+ case 'ref':
49
+ return lazyRef(schema.name);
50
+ case 'literal':
51
+ return zCall('literal', [literalExpression(schema.value)]);
52
+ case 'enum':
53
+ return enumExpression(schema.values);
54
+ case 'union':
55
+ return unionExpression(schema.members, byName);
56
+ case 'intersection':
57
+ return intersectionExpression(schema.members, byName);
58
+ case 'null':
59
+ return zCall('null');
60
+ case 'unknown':
61
+ return zCall('unknown');
62
+ case 'omit':
63
+ return omitExpression(schema.base, schema.keys, byName);
64
+ }
65
+ }
66
+ function scalarExpression(scalar, metadata) {
67
+ switch (scalar) {
68
+ case 'string':
69
+ // `format: binary` is typed as `Blob` (see types.ts); validate it as one so the zod
70
+ // schema agrees with the generated type instead of expecting a string.
71
+ if (metadata?.format === 'binary') {
72
+ return zCall('instanceof', [factory.createIdentifier('Blob')]);
73
+ }
74
+ return zCall('string');
75
+ case 'integer':
76
+ return chain(zCall('number'), 'int');
77
+ case 'number':
78
+ return zCall('number');
79
+ case 'boolean':
80
+ return zCall('boolean');
81
+ }
82
+ }
83
+ /** `z.object({ <key>: <expr>(.optional() when !required), … })`. */
84
+ function objectExpression(properties, byName) {
85
+ const props = properties.map((p) => {
86
+ const value = p.required
87
+ ? schemaToZodExpression(p.schema, byName)
88
+ : chain(schemaToZodExpression(p.schema, byName), 'optional');
89
+ const safe = safeIdent(p.name);
90
+ const key = safe === p.name ? factory.createIdentifier(p.name) : factory.createStringLiteral(p.name);
91
+ return factory.createPropertyAssignment(key, value);
92
+ });
93
+ return zCall('object', [factory.createObjectLiteralExpression(props, props.length > 0)]);
94
+ }
95
+ /** `z.lazy(() => <Name>Schema)` — defers reference resolution to call time. */
96
+ function lazyRef(name) {
97
+ const arrow = factory.createArrowFunction(undefined, undefined, [], undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), factory.createIdentifier(schemaConstName(name)));
98
+ return zCall('lazy', [arrow]);
99
+ }
100
+ /** All-string values → `z.enum([…])`; otherwise → a union of literals. */
101
+ function enumExpression(values) {
102
+ if (values.every((v) => typeof v === 'string')) {
103
+ return zCall('enum', [
104
+ factory.createArrayLiteralExpression(values.map((v) => factory.createStringLiteral(v)), false),
105
+ ]);
106
+ }
107
+ return zCall('union', [
108
+ factory.createArrayLiteralExpression(values.map((v) => zCall('literal', [literalExpression(v)])), false),
109
+ ]);
110
+ }
111
+ /** `z.union([…])`; a single member collapses to that member's expression. */
112
+ function unionExpression(members, byName) {
113
+ const exprs = members.map((member) => schemaToZodExpression(member, byName));
114
+ if (exprs.length === 1)
115
+ return exprs[0];
116
+ return zCall('union', [factory.createArrayLiteralExpression(exprs, false)]);
117
+ }
118
+ /** `a.and(b).and(c)` — left-folds `.and` over the members. */
119
+ function intersectionExpression(members, byName) {
120
+ const exprs = members.map((member) => schemaToZodExpression(member, byName));
121
+ return exprs.reduce((acc, next) => chain(acc, 'and', [next]));
122
+ }
123
+ /**
124
+ * `<Base>Schema.omit({ k1: true, … })` when the base is a plain object schema.
125
+ * `.omit` exists only on `ZodObject` — for any other base (an `allOf` intersection,
126
+ * a union, …) the omission is distributed into the base's object members instead.
127
+ */
128
+ function omitExpression(base, keys, byName) {
129
+ const target = byName.get(base);
130
+ if (target && target.kind !== 'object') {
131
+ return schemaToZodExpression(applyOmit(target, keys, byName, new Set([base])), byName);
132
+ }
133
+ const mask = factory.createObjectLiteralExpression(keys.map((k) => {
134
+ const safe = safeIdent(k);
135
+ const key = safe === k ? factory.createIdentifier(k) : factory.createStringLiteral(k);
136
+ return factory.createPropertyAssignment(key, factory.createTrue());
137
+ }), false);
138
+ return chain(factory.createIdentifier(schemaConstName(base)), 'omit', [mask]);
139
+ }
140
+ /**
141
+ * Remove `keys` from a schema that is not a plain object: objects drop the properties,
142
+ * union/intersection members recurse, and a ref to an object becomes `<Ref>Schema.omit`
143
+ * with only the keys that exist on it (zod's mask rejects unknown keys at the type
144
+ * level). Cycles and non-object leaves return unchanged — there is nothing to omit.
145
+ */
146
+ function applyOmit(schema, keys, byName, seen) {
147
+ switch (schema.kind) {
148
+ case 'object':
149
+ return { ...schema, properties: schema.properties.filter((p) => !keys.includes(p.name)) };
150
+ case 'union':
151
+ case 'intersection':
152
+ return {
153
+ ...schema,
154
+ members: schema.members.map((member) => applyOmit(member, keys, byName, seen)),
155
+ };
156
+ case 'ref': {
157
+ if (seen.has(schema.name))
158
+ return schema;
159
+ const target = byName.get(schema.name);
160
+ if (!target)
161
+ return schema;
162
+ if (target.kind === 'object') {
163
+ const present = keys.filter((key) => target.properties.some((property) => property.name === key));
164
+ return present.length > 0 ? { kind: 'omit', base: schema.name, keys: present } : schema;
165
+ }
166
+ return applyOmit(target, keys, byName, new Set([...seen, schema.name]));
167
+ }
168
+ default:
169
+ return schema;
170
+ }
171
+ }
172
+ /**
173
+ * Chain the stable-subset metadata refinements onto `expr`. Order: numeric/length
174
+ * bounds, then `.regex` (the `.int()` for integers is already on the base).
175
+ * `.optional()` is NOT applied here — optionality is a property-level concern
176
+ * handled in `objectExpression`, so a top-level schema is never spuriously optional.
177
+ */
178
+ function withRefinements(expr, schema) {
179
+ const m = schema.metadata;
180
+ if (!m)
181
+ return expr;
182
+ let out = expr;
183
+ if (schema.kind === 'scalar' && schema.scalar === 'string') {
184
+ if (m.minLength !== undefined)
185
+ out = chain(out, 'min', [literalExpression(m.minLength)]);
186
+ if (m.maxLength !== undefined)
187
+ out = chain(out, 'max', [literalExpression(m.maxLength)]);
188
+ if (m.pattern !== undefined)
189
+ out = chain(out, 'regex', [regexExpression(m.pattern)]);
190
+ }
191
+ if (schema.kind === 'scalar' && (schema.scalar === 'number' || schema.scalar === 'integer')) {
192
+ out = numericRefinements(out, m);
193
+ }
194
+ if (schema.kind === 'array') {
195
+ if (m.minItems !== undefined)
196
+ out = chain(out, 'min', [literalExpression(m.minItems)]);
197
+ if (m.maxItems !== undefined)
198
+ out = chain(out, 'max', [literalExpression(m.maxItems)]);
199
+ }
200
+ return out;
201
+ }
202
+ function numericRefinements(expr, m) {
203
+ let out = expr;
204
+ if (m.minimum !== undefined)
205
+ out = chain(out, 'min', [literalExpression(m.minimum)]);
206
+ if (m.maximum !== undefined)
207
+ out = chain(out, 'max', [literalExpression(m.maximum)]);
208
+ if (m.exclusiveMinimum !== undefined)
209
+ out = chain(out, 'gt', [literalExpression(m.exclusiveMinimum)]);
210
+ if (m.exclusiveMaximum !== undefined)
211
+ out = chain(out, 'lt', [literalExpression(m.exclusiveMaximum)]);
212
+ return out;
213
+ }
214
+ /** `new RegExp("<pattern>")` — robust across printers regardless of pattern content. */
215
+ function regexExpression(pattern) {
216
+ return factory.createNewExpression(factory.createIdentifier('RegExp'), undefined, [
217
+ factory.createStringLiteral(pattern),
218
+ ]);
219
+ }
220
+ /** `export const <Name>Schema = <expr>;` for one named schema. */
221
+ function schemaConstStatement(named, byName) {
222
+ return factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([
223
+ factory.createVariableDeclaration(schemaConstName(named.name), undefined, undefined, schemaToZodExpression(named.schema, byName)),
224
+ ], ts.NodeFlags.Const));
225
+ }
226
+ /** `import { z } from 'zod';` */
227
+ function zodImport() {
228
+ return factory.createImportDeclaration(undefined, factory.createImportClause(false, undefined, factory.createNamedImports([
229
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('z')),
230
+ ])), factory.createStringLiteral('zod'));
231
+ }
232
+ function operationSchemaEntries(model, byName) {
233
+ const entries = [];
234
+ for (const op of allOperations(model.services)) {
235
+ if (isSseOp(op))
236
+ continue;
237
+ const requestBody = op.requestBody;
238
+ const request = requestBody && requestBody.contentType.toLowerCase().includes('json')
239
+ ? schemaToZodExpression(requestBody.schema, byName)
240
+ : undefined;
241
+ const jsonResponse = op.successResponses.find((response) => response.contentType.toLowerCase().includes('json'));
242
+ const response = jsonResponse ? schemaToZodExpression(jsonResponse.schema, byName) : undefined;
243
+ if (!request && !response)
244
+ continue;
245
+ entries.push({ name: op.name, request, response });
246
+ }
247
+ return entries;
248
+ }
249
+ function operationSchemasStatement(entries) {
250
+ const zodTypeNode = () => factory.createTypeReferenceNode(factory.createQualifiedName(factory.createIdentifier('z'), 'ZodType'));
251
+ // The explicit `z.ZodType` annotation keeps the declaration-emit size proportional to
252
+ // the operation count: the inferred type would serialize every schema's zod generics
253
+ // and overflow tsc's limit (TS7056) on large APIs under `declaration: true`.
254
+ const typeMembers = entries.map((entry) => factory.createPropertySignature(undefined, entry.name, undefined, factory.createTypeLiteralNode([
255
+ entry.request
256
+ ? factory.createPropertySignature(undefined, 'request', undefined, zodTypeNode())
257
+ : undefined,
258
+ entry.response
259
+ ? factory.createPropertySignature(undefined, 'response', undefined, zodTypeNode())
260
+ : undefined,
261
+ ].filter((member) => member !== undefined))));
262
+ const valueEntries = entries.map((entry) => factory.createPropertyAssignment(entry.name, factory.createObjectLiteralExpression([
263
+ entry.request ? factory.createPropertyAssignment('request', entry.request) : undefined,
264
+ entry.response ? factory.createPropertyAssignment('response', entry.response) : undefined,
265
+ ].filter((property) => property !== undefined), false)));
266
+ return jsdoc(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([
267
+ factory.createVariableDeclaration('operationSchemas', undefined, factory.createTypeLiteralNode(typeMembers), factory.createObjectLiteralExpression(valueEntries, true)),
268
+ ], ts.NodeFlags.Const)), 'Request/response validators by operationId — powers `zodValidation`, or import one directly.');
269
+ }
270
+ // The validation middleware, spliced verbatim after the schemas (matches the printer's
271
+ // double-quote/4-space style). Structurally compatible with the client's `Middleware`
272
+ // without importing it, so the zod module keeps its single `zod` dependency.
273
+ const VALIDATION_SUPPORT = `/** \`request\`/\`response\` validators for one operation (an absent side is not validated). */
274
+ export type OperationSchemaSet = { request?: z.ZodType; response?: z.ZodType };
275
+
276
+ const schemaIndex: Partial<Record<string, OperationSchemaSet>> = operationSchemas;
277
+
278
+ /** A request or response payload failed validation. Always thrown, even on result-mode clients. */
279
+ export class ZodValidationError extends Error {
280
+ constructor(
281
+ readonly operationId: string,
282
+ readonly direction: "request" | "response",
283
+ readonly issues: z.ZodError["issues"]
284
+ ) {
285
+ const detail = issues
286
+ .map((issue) => \`\${issue.path.join(".") || "(root)"}: \${issue.message}\`)
287
+ .join("; ");
288
+ super(\`\${direction === "request" ? "Request" : "Response"} validation failed for operation "\${operationId}": \${detail}\`);
289
+ this.name = "ZodValidationError";
290
+ }
291
+ }
292
+
293
+ /**
294
+ * Schema-validation middleware for the generated client: \`use(zodValidation())\`.
295
+ * Request bodies are validated before any network call; successful JSON responses are
296
+ * validated against the operation's response schema. Payloads are never mutated, and
297
+ * operations without a schema pass through untouched. A failure throws
298
+ * \`ZodValidationError\` — always, even on result-mode clients.
299
+ */
300
+ export function zodValidation(options: { request?: boolean; response?: boolean } = {}) {
301
+ const { request = true, response = true } = options;
302
+ return {
303
+ onRequest(context: { body?: unknown; operation: { id: string } }): void {
304
+ if (!request || context.body === undefined) return;
305
+ const schema = schemaIndex[context.operation.id]?.request;
306
+ if (!schema) return;
307
+ const result = schema.safeParse(context.body);
308
+ if (!result.success) {
309
+ throw new ZodValidationError(context.operation.id, "request", result.error.issues);
310
+ }
311
+ },
312
+ async onResponse(incoming: Response, context: { operation: { id: string } }): Promise<void> {
313
+ if (!response || !incoming.ok) return;
314
+ const schema = schemaIndex[context.operation.id]?.response;
315
+ if (!schema) return;
316
+ const contentType = (incoming.headers.get("content-type") ?? "").toLowerCase();
317
+ if (!contentType.includes("json")) return;
318
+ const result = schema.safeParse(await incoming.clone().json());
319
+ if (!result.success) {
320
+ throw new ZodValidationError(context.operation.id, "response", result.error.issues);
321
+ }
322
+ },
323
+ };
324
+ }`;
325
+ /**
326
+ * Render the full zod module source: the component schemas, then — when any operation
327
+ * has a JSON body — the `operationSchemas` map and the `zodValidation` middleware.
328
+ * `''` when there is nothing to emit.
329
+ */
330
+ export function renderZodModule(model) {
331
+ const byName = new Map(model.schemas.map((named) => [named.name, named.schema]));
332
+ const entries = operationSchemaEntries(model, byName);
333
+ if (model.schemas.length === 0 && entries.length === 0)
334
+ return '';
335
+ const statements = [
336
+ zodImport(),
337
+ ...model.schemas.map((named) => schemaConstStatement(named, byName)),
338
+ ];
339
+ if (entries.length === 0)
340
+ return printStatements(statements);
341
+ statements.push(operationSchemasStatement(entries));
342
+ return `${printStatements(statements)}\n${VALIDATION_SUPPORT}\n`;
343
+ }
344
+ //# sourceMappingURL=zod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.js","sourceRoot":"","sources":["../../src/emitters/zod.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare class NotSupportedError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B"}
package/lib/errors.js ADDED
@@ -0,0 +1,7 @@
1
+ export class NotSupportedError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'NotSupportedError';
5
+ }
6
+ }
7
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Derive the directory and base name (stem, without `.ts`) from the `--output`
3
+ * anchor path. Generators build sibling-file paths from these.
4
+ */
5
+ export declare function anchor(outputPath: string): {
6
+ dir: string;
7
+ stem: string;
8
+ };
9
+ //# sourceMappingURL=anchor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../src/generators/anchor.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAGxE"}
@@ -0,0 +1,10 @@
1
+ import { parse } from 'node:path';
2
+ /**
3
+ * Derive the directory and base name (stem, without `.ts`) from the `--output`
4
+ * anchor path. Generators build sibling-file paths from these.
5
+ */
6
+ export function anchor(outputPath) {
7
+ const { dir, name } = parse(outputPath);
8
+ return { dir, stem: name };
9
+ }
10
+ //# sourceMappingURL=anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.js","sourceRoot":"","sources":["../../src/generators/anchor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,UAAkB;IACvC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { EmitOptions } from '../emitters/emit-options.js';
2
+ import type { GeneratorDescriptor } from './types.js';
3
+ export type { CustomGenerator, Generator, GeneratorDescriptor, GeneratorInput, GeneratorName, } from './types.js';
4
+ /**
5
+ * A fresh registry of the built-in generators keyed by name. The plugin resolver seeds from this
6
+ * and adds custom generators to the copy, so mutating the result never affects the built-in table.
7
+ */
8
+ export declare function builtinGenerators(): Map<string, GeneratorDescriptor>;
9
+ /**
10
+ * Validate a generator selection against every selected generator's declared
11
+ * contract, throwing the first violation with an actionable message. Runs before
12
+ * any file is produced so an incompatible combination never reaches the printer.
13
+ */
14
+ export declare function validateGenerators(names: string[], emit: EmitOptions, registry?: Map<string, GeneratorDescriptor>): void;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAO/D,OAAO,KAAK,EAAE,mBAAmB,EAAiB,MAAM,YAAY,CAAC;AAGrE,YAAY,EACV,eAAe,EACf,SAAS,EACT,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAkBpB;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE,WAAW,EACjB,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAuB,GAC/D,IAAI,CAkCN"}
@@ -0,0 +1,62 @@
1
+ import { NotSupportedError } from '../errors.js';
2
+ import { mockGenerator } from './mock.js';
3
+ import { sdkGenerator } from './sdk.js';
4
+ import { swrGenerator } from './swr.js';
5
+ import { tanstackQueryGenerator } from './tanstack-query.js';
6
+ import { transformersGenerator } from './transformers.js';
7
+ import { zodGenerator } from './zod.js';
8
+ const GENERATORS = {
9
+ // sdk is the base client; zod emits a standalone schema module importing nothing from it.
10
+ sdk: { run: sdkGenerator },
11
+ zod: { run: zodGenerator },
12
+ // transformers import the schema *types* from the sdk entry module (so sdk must run) and
13
+ // assign `Date` values to those fields, which only type-checks when the sdk types dates as `Date`.
14
+ transformers: { run: transformersGenerator, requires: ['sdk'], dateTypes: ['Date'] },
15
+ // tanstack-query wraps the sdk's exported, throw-mode operation functions — present in
16
+ // both runtime distributions, so no runtime restriction.
17
+ 'tanstack-query': { run: tanstackQueryGenerator, requires: ['sdk'], errorModes: ['throw'] },
18
+ // swr wraps the sdk's exported, throw-mode operation functions as SWR hooks.
19
+ swr: { run: swrGenerator, requires: ['sdk'], errorModes: ['throw'] },
20
+ // mock emits a standalone MSW handlers/factories module referencing the sdk's types.
21
+ mock: { run: mockGenerator, requires: ['sdk'] },
22
+ };
23
+ /**
24
+ * A fresh registry of the built-in generators keyed by name. The plugin resolver seeds from this
25
+ * and adds custom generators to the copy, so mutating the result never affects the built-in table.
26
+ */
27
+ export function builtinGenerators() {
28
+ return new Map(Object.entries(GENERATORS));
29
+ }
30
+ /**
31
+ * Validate a generator selection against every selected generator's declared
32
+ * contract, throwing the first violation with an actionable message. Runs before
33
+ * any file is produced so an incompatible combination never reaches the printer.
34
+ */
35
+ export function validateGenerators(names, emit, registry = builtinGenerators()) {
36
+ const selected = new Set(names);
37
+ const errorMode = emit.errorMode ?? 'throw';
38
+ const dateType = emit.dateType ?? 'string';
39
+ const runtime = emit.runtime ?? 'inline';
40
+ for (const name of names) {
41
+ const descriptor = registry.get(name);
42
+ if (!descriptor) {
43
+ throw new NotSupportedError(`Unknown generator: ${name}`);
44
+ }
45
+ for (const required of descriptor.requires ?? []) {
46
+ if (!selected.has(required)) {
47
+ const fixed = [...new Set([required, ...names])].map((g) => `--generator ${g}`).join(' ');
48
+ throw new NotSupportedError(`The "${name}" generator requires the "${required}" generator. Add it, e.g. ${fixed}.`);
49
+ }
50
+ }
51
+ if (descriptor.errorModes && !descriptor.errorModes.includes(errorMode)) {
52
+ throw new NotSupportedError(`The "${name}" generator does not support --error-mode "${errorMode}" (supported: ${descriptor.errorModes.join(', ')}).`);
53
+ }
54
+ if (descriptor.dateTypes && !descriptor.dateTypes.includes(dateType)) {
55
+ throw new NotSupportedError(`The "${name}" generator requires --date-type ${descriptor.dateTypes.join(' or ')} (got "${dateType}") so the runtime values match the generated types.`);
56
+ }
57
+ if (descriptor.runtimes && !descriptor.runtimes.includes(runtime)) {
58
+ throw new NotSupportedError(`The "${name}" generator does not support runtime "${runtime}" (supported: ${descriptor.runtimes.join(', ')}).`);
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAUxC,MAAM,UAAU,GAA+C;IAC7D,0FAA0F;IAC1F,GAAG,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE;IAC1B,GAAG,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE;IAC1B,yFAAyF;IACzF,mGAAmG;IACnG,YAAY,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE;IACpF,uFAAuF;IACvF,yDAAyD;IACzD,gBAAgB,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;IAC3F,6EAA6E;IAC7E,GAAG,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;IACpE,qFAAqF;IACrF,IAAI,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;CAChD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAe,EACf,IAAiB,EACjB,WAA6C,iBAAiB,EAAE;IAEhE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1F,MAAM,IAAI,iBAAiB,CACzB,QAAQ,IAAI,6BAA6B,QAAQ,6BAA6B,KAAK,GAAG,CACvF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,iBAAiB,CACzB,QAAQ,IAAI,8CAA8C,SAAS,iBAAiB,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACzH,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,iBAAiB,CACzB,QAAQ,IAAI,oCAAoC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,QAAQ,qDAAqD,CACzJ,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,iBAAiB,CACzB,QAAQ,IAAI,yCAAyC,OAAO,iBAAiB,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAChH,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Generator } from './types.js';
2
+ /**
3
+ * The mock generator: a standalone `<stem>.mocks.ts` module of MSW handlers and
4
+ * data factories baked from the spec. Imports `msw` (the consumer's dev-dep); the
5
+ * sdk client stays dependency-free. Output-mode-agnostic in v1 — one module beside
6
+ * the client. Emits nothing when there are no operations.
7
+ */
8
+ export declare const mockGenerator: Generator;
9
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/generators/mock.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,SAU3B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { join } from 'node:path';
2
+ import { HEADER } from '../emitters/emit-options.js';
3
+ import { renderMockModule } from '../emitters/mock.js';
4
+ import { anchor } from './anchor.js';
5
+ /**
6
+ * The mock generator: a standalone `<stem>.mocks.ts` module of MSW handlers and
7
+ * data factories baked from the spec. Imports `msw` (the consumer's dev-dep); the
8
+ * sdk client stays dependency-free. Output-mode-agnostic in v1 — one module beside
9
+ * the client. Emits nothing when there are no operations.
10
+ */
11
+ export const mockGenerator = ({ model, outputPath, emit }) => {
12
+ const { dir, stem } = anchor(outputPath);
13
+ const content = renderMockModule(model, {
14
+ sdkModule: `./${stem}.js`,
15
+ dateType: emit.dateType,
16
+ mockData: emit.mockData,
17
+ mockSeed: emit.mockSeed,
18
+ });
19
+ if (content === '')
20
+ return [];
21
+ return [{ path: join(dir, `${stem}.mocks.ts`), content: `${HEADER}\n\n${content}` }];
22
+ };
23
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/generators/mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAc,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE;IACtE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE;QACtC,SAAS,EAAE,KAAK,IAAI,KAAK;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAC;IACH,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,OAAO,EAAE,EAAE,CAAC,CAAC;AACvF,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { CustomGenerator, GeneratorDescriptor } from './types.js';
2
+ export type ResolvedGenerators = {
3
+ /** Generator names to run, in selection order. */
4
+ selected: string[];
5
+ /** Every available generator (built-ins + registered customs) keyed by name. */
6
+ registry: Map<string, GeneratorDescriptor>;
7
+ };
8
+ export type ResolveOptions = {
9
+ /** Inline custom generators (via the programmatic `generateClient` API) registered before resolution. */
10
+ customGenerators?: CustomGenerator[];
11
+ /** Directory relative-path specifiers resolve against (the config's location). Defaults to cwd. */
12
+ configDir?: string;
13
+ };
14
+ /**
15
+ * Build the run list + registry for a `generators` selection. Each entry is, in order of preference,
16
+ * a built-in name, an already-registered custom name, or an import specifier (path or package).
17
+ */
18
+ export declare function resolveGenerators(entries: string[], options?: ResolveOptions): Promise<ResolvedGenerators>;
19
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/generators/resolve.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kDAAkD;IAClD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gFAAgF;IAChF,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,yGAAyG;IACzG,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,mGAAmG;IACnG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAe7B"}