@sohcah/openapi-generator 0.2.1 → 0.3.0

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 (36) hide show
  1. package/dist/{chunk-DYFKRlHt.js → chunk-BcJDCUAU.mjs} +24 -15
  2. package/dist/cli.d.mts +1 -0
  3. package/dist/{cli.js → cli.mjs} +8 -9
  4. package/dist/cli.mjs.map +1 -0
  5. package/dist/{config.d.ts → config.d.mts} +3 -3
  6. package/dist/config.d.mts.map +1 -0
  7. package/dist/{config.js → config.mjs} +1 -1
  8. package/dist/config.mjs.map +1 -0
  9. package/dist/generators/{index.d.ts → index.d.mts} +4 -4
  10. package/dist/generators/index.d.mts.map +1 -0
  11. package/dist/generators/index.mjs +739 -0
  12. package/dist/generators/index.mjs.map +1 -0
  13. package/dist/{helpers-CqzmoMek.js → helpers-BwQQbllq.mjs} +1944 -1901
  14. package/dist/helpers-BwQQbllq.mjs.map +1 -0
  15. package/dist/{index-DY2v-Q37.d.ts → index-D4xeswCF.d.mts} +5 -5
  16. package/dist/index-D4xeswCF.d.mts.map +1 -0
  17. package/dist/index.d.mts +3 -0
  18. package/dist/index.mjs +4 -0
  19. package/dist/{src-DhXSDR6J.js → src-9VHrwwX3.mjs} +1316 -1439
  20. package/dist/src-9VHrwwX3.mjs.map +1 -0
  21. package/dist/{types-DMB5w9Tt.d.ts → types-C83IhMq9.d.mts} +5 -4
  22. package/dist/types-C83IhMq9.d.mts.map +1 -0
  23. package/package.json +29 -29
  24. package/dist/cli.d.ts +0 -2
  25. package/dist/cli.js.map +0 -1
  26. package/dist/config.d.ts.map +0 -1
  27. package/dist/config.js.map +0 -1
  28. package/dist/generators/index.d.ts.map +0 -1
  29. package/dist/generators/index.js +0 -722
  30. package/dist/generators/index.js.map +0 -1
  31. package/dist/helpers-CqzmoMek.js.map +0 -1
  32. package/dist/index-DY2v-Q37.d.ts.map +0 -1
  33. package/dist/index.d.ts +0 -3
  34. package/dist/index.js +0 -4
  35. package/dist/src-DhXSDR6J.js.map +0 -1
  36. package/dist/types-DMB5w9Tt.d.ts.map +0 -1
@@ -1,722 +0,0 @@
1
- import { __toESM } from "../chunk-DYFKRlHt.js";
2
- import { DocumentContext, NotImplementedError, ensureImport, ensureNamespaceImport, getKey, helpers_exports, notImplementedStatement, require_lib } from "../helpers-CqzmoMek.js";
3
- import { Context, Effect } from "effect";
4
- import escapeRegex from "regex-escape";
5
-
6
- //#region src/generators/requestFormats/json.ts
7
- var import_lib$8 = /* @__PURE__ */ __toESM(require_lib(), 1);
8
- const generateJsonRequestCodec = Effect.fn(function* (options, schema, decoded) {
9
- return options.transformer({
10
- encoded: options.schema.string,
11
- decoded,
12
- decode: notImplementedStatement,
13
- encode: import_lib$8.callExpression(import_lib$8.memberExpression(import_lib$8.identifier("JSON"), import_lib$8.identifier("stringify")), [import_lib$8.identifier("from")])
14
- });
15
- });
16
-
17
- //#endregion
18
- //#region src/generators/requestFormats/formData.ts
19
- var import_lib$7 = /* @__PURE__ */ __toESM(require_lib(), 1);
20
- const maybeStringify = Effect.fn(function* (expression, schema) {
21
- const resolved = yield* resolveSchema(schema);
22
- if (resolved.type === "object" || resolved.type === "array") return import_lib$7.callExpression(import_lib$7.memberExpression(import_lib$7.identifier("JSON"), import_lib$7.identifier("stringify")), [expression]);
23
- if (resolved.type === "string") return expression;
24
- return import_lib$7.callExpression(import_lib$7.identifier("String"), [expression]);
25
- });
26
- const generateFormDataRequestCodec = Effect.fn(function* (options, schema, decoded) {
27
- const encode = import_lib$7.blockStatement([import_lib$7.variableDeclaration("const", [import_lib$7.variableDeclarator(import_lib$7.identifier("formData"), import_lib$7.newExpression(import_lib$7.identifier("FormData"), []))])]);
28
- const properties = schema.properties ?? {};
29
- for (const [propertyKey, rawProperty] of Object.entries(properties)) {
30
- const property = yield* resolveSchema(rawProperty);
31
- const propertyExpression = import_lib$7.memberExpression(import_lib$7.identifier("from"), import_lib$7.stringLiteral(propertyKey), true);
32
- if (property.type === "array") {
33
- encode.body.push(import_lib$7.forOfStatement(import_lib$7.variableDeclaration("const", [import_lib$7.variableDeclarator(import_lib$7.identifier("propertyValue"))]), propertyExpression, import_lib$7.blockStatement([import_lib$7.expressionStatement(import_lib$7.callExpression(import_lib$7.memberExpression(import_lib$7.identifier("formData"), import_lib$7.identifier("append")), [import_lib$7.stringLiteral(propertyKey), yield* maybeStringify(import_lib$7.identifier("propertyValue"), property.items)]))])));
34
- continue;
35
- }
36
- encode.body.push(import_lib$7.expressionStatement(import_lib$7.callExpression(import_lib$7.memberExpression(import_lib$7.identifier("formData"), import_lib$7.identifier("append")), [import_lib$7.stringLiteral(propertyKey), yield* maybeStringify(propertyExpression, property)])));
37
- }
38
- encode.body.push(import_lib$7.returnStatement(import_lib$7.identifier("formData")));
39
- return options.transformer({
40
- encoded: import_lib$7.callExpression(options.schema.instanceOf, [import_lib$7.identifier("FormData")]),
41
- decoded,
42
- decode: notImplementedStatement,
43
- encode
44
- });
45
- });
46
-
47
- //#endregion
48
- //#region src/generators/generatePathExpression.ts
49
- var import_lib$6 = /* @__PURE__ */ __toESM(require_lib(), 1);
50
- function generatePathExpression(path, pathParameters, queryParameter) {
51
- let modifiedPath = path;
52
- if (queryParameter) modifiedPath += "?";
53
- const split = modifiedPath.split(new RegExp(`\\{(${Object.keys(pathParameters).map((i) => escapeRegex(i)).join("|")})\\}`, "g"));
54
- const quasis = [];
55
- const expressions = [];
56
- for (const [i, part] of split.entries()) if (i % 2 === 0) quasis.push(import_lib$6.templateElement({
57
- raw: part,
58
- cooked: part
59
- }, false));
60
- else {
61
- const paramExpression = pathParameters[part];
62
- if (!paramExpression) throw new Error(`Path parameter ${part} not found`);
63
- expressions.push(paramExpression);
64
- }
65
- if (queryParameter) {
66
- expressions.push(queryParameter);
67
- quasis.push(import_lib$6.templateElement({
68
- raw: "",
69
- cooked: ""
70
- }, false));
71
- }
72
- return import_lib$6.templateLiteral(quasis, expressions);
73
- }
74
-
75
- //#endregion
76
- //#region src/generators/responseFormats/json.ts
77
- var import_lib$5 = /* @__PURE__ */ __toESM(require_lib(), 1);
78
- const generateJsonResponseCodec = Effect.fn(function* (options, schema, decoded) {
79
- return options.transformer({
80
- encoded: import_lib$5.callExpression(options.schema.instanceOf, [import_lib$5.identifier("Response")]),
81
- decoded,
82
- decode: import_lib$5.blockStatement([import_lib$5.tryStatement(import_lib$5.blockStatement([import_lib$5.returnStatement(import_lib$5.tsAsExpression(import_lib$5.awaitExpression(import_lib$5.callExpression(import_lib$5.memberExpression(import_lib$5.identifier("from"), import_lib$5.identifier("json")), [])), import_lib$5.tsAnyKeyword()))]), import_lib$5.catchClause(Object.assign(import_lib$5.identifier("error"), { typeAnnotation: import_lib$5.tsTypeAnnotation(import_lib$5.tsUnknownKeyword()) }), options.transformerCatch(import_lib$5.identifier("error"))))]),
83
- decodeAsync: true,
84
- encode: notImplementedStatement
85
- });
86
- });
87
-
88
- //#endregion
89
- //#region src/generators/responseFormats/blob.ts
90
- var import_lib$4 = /* @__PURE__ */ __toESM(require_lib(), 1);
91
- const generateBlobResponseCodec = Effect.fn(function* (options) {
92
- return options.transformer({
93
- encoded: import_lib$4.callExpression(options.schema.instanceOf, [import_lib$4.identifier("Response")]),
94
- decoded: import_lib$4.callExpression(options.schema.instanceOf, [import_lib$4.identifier("Blob")]),
95
- decode: import_lib$4.blockStatement([import_lib$4.tryStatement(import_lib$4.blockStatement([import_lib$4.returnStatement(import_lib$4.tsAsExpression(import_lib$4.awaitExpression(import_lib$4.callExpression(import_lib$4.memberExpression(import_lib$4.identifier("from"), import_lib$4.identifier("blob")), [])), import_lib$4.tsAnyKeyword()))]), import_lib$4.catchClause(Object.assign(import_lib$4.identifier("error"), { typeAnnotation: import_lib$4.tsTypeAnnotation(import_lib$4.tsUnknownKeyword()) }), options.transformerCatch(import_lib$4.identifier("error"))))]),
96
- decodeAsync: true,
97
- encode: notImplementedStatement
98
- });
99
- });
100
-
101
- //#endregion
102
- //#region src/generators/schema.ts
103
- var import_lib$3 = /* @__PURE__ */ __toESM(require_lib(), 1);
104
- const equivalentType = (type) => ({
105
- typeDecoded: type,
106
- typeEncoded: type
107
- });
108
- const resolveSchema = Effect.fn(function* (schema) {
109
- const ctx = yield* DocumentContext;
110
- let resolvedSchema = schema;
111
- for (let i = 0; i < 10; i++) {
112
- if (!("$ref" in resolvedSchema)) return resolvedSchema;
113
- const ref = resolvedSchema.$ref;
114
- if (!ref.startsWith("#/components/schemas/")) return yield* new NotImplementedError({ message: `$ref ${ref}` });
115
- const schemaName = ref.slice(21);
116
- const nextSchema = ctx.document.components?.schemas?.[schemaName];
117
- if (!nextSchema) return yield* new NotImplementedError({ message: `Missing $ref ${ref}` });
118
- resolvedSchema = nextSchema;
119
- }
120
- return yield* new NotImplementedError({ message: `Too many $ref in schema` });
121
- });
122
- const stringLiteralOrIdentifier = (value) => {
123
- if (value.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) return import_lib$3.identifier(value);
124
- return import_lib$3.stringLiteral(value);
125
- };
126
- const memberExpressionWithStringProperty = (object, property) => {
127
- if (property.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) return import_lib$3.memberExpression(object, import_lib$3.identifier(property));
128
- return import_lib$3.memberExpression(object, import_lib$3.stringLiteral(property), true);
129
- };
130
- function createSchemaGenerator(options) {
131
- const ensureStandardParametersSchema = Effect.fn(function* () {
132
- const ctx = yield* DocumentContext;
133
- if (!ctx.schemas.has("ParametersSchema")) ctx.schemas.set("ParametersSchema", [import_lib$3.exportNamedDeclaration(import_lib$3.variableDeclaration("const", [import_lib$3.variableDeclarator(import_lib$3.identifier("ParametersSchema"), import_lib$3.callExpression(options.schema.object, [import_lib$3.objectExpression([
134
- import_lib$3.objectProperty(import_lib$3.identifier("path"), options.schema.string),
135
- import_lib$3.objectProperty(import_lib$3.identifier("headers"), options.modifiers.optional(import_lib$3.callExpression(options.schema.instanceOf, [import_lib$3.identifier("Headers")]))),
136
- import_lib$3.objectProperty(import_lib$3.identifier("body"), options.modifiers.optional(options.schema.union([
137
- options.schema.string,
138
- import_lib$3.callExpression(options.schema.instanceOf, [import_lib$3.identifier("Blob")]),
139
- import_lib$3.callExpression(options.schema.instanceOf, [import_lib$3.identifier("FormData")]),
140
- import_lib$3.callExpression(options.schema.instanceOf, [import_lib$3.identifier("URLSearchParams")])
141
- ])))
142
- ])]))]))]);
143
- return import_lib$3.identifier("ParametersSchema");
144
- });
145
- const getBaseEffectSchema = Effect.fn(function* (schema) {
146
- const ctx = yield* DocumentContext;
147
- const typeMeta = {};
148
- if ("$ref" in schema) {
149
- const ref = schema.$ref;
150
- if (!ref.startsWith("#/components/schemas/")) return yield* new NotImplementedError({ message: `$ref ${ref}` });
151
- const schemaName = ref.slice(21);
152
- const schemaKey = yield* getKey(schemaName);
153
- const resolvedSchema = ctx.document.components?.schemas?.[schemaName];
154
- if (!resolvedSchema) return yield* new NotImplementedError({ message: `Missing $ref ${ref}` });
155
- if (ctx.processingSchemas.has(schemaName)) {
156
- const fn = import_lib$3.arrowFunctionExpression([], import_lib$3.identifier(schemaKey.upper));
157
- if (ctx.processingSchemaTypes.has(schemaName)) return {
158
- expression: import_lib$3.nullLiteral(),
159
- typeDecoded: import_lib$3.tsTypeReference(options.types.typeDecoded, import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTypeQuery(import_lib$3.identifier(schemaKey.upper))])),
160
- typeEncoded: import_lib$3.tsTypeReference(options.types.typeEncoded, import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTypeQuery(import_lib$3.identifier(schemaKey.upper))])),
161
- typeMeta
162
- };
163
- ctx.processingSchemaTypes.add(schemaName);
164
- const typeSchema = yield* ensureSchema(resolvedSchema);
165
- fn.returnType = import_lib$3.tsTypeAnnotation(import_lib$3.tsTypeReference(options.types.schema, import_lib$3.tsTypeParameterInstantiation([typeSchema.typeDecoded, typeSchema.typeEncoded])));
166
- ctx.processingSchemaTypes.delete(schemaName);
167
- return {
168
- expression: options.modifiers.lazy(fn),
169
- typeDecoded: import_lib$3.tsTypeReference(options.types.typeDecoded, import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTypeQuery(import_lib$3.identifier(schemaKey.upper))])),
170
- typeEncoded: import_lib$3.tsTypeReference(options.types.typeEncoded, import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTypeQuery(import_lib$3.identifier(schemaKey.upper))])),
171
- typeMeta
172
- };
173
- }
174
- if (!ctx.schemas.has(schemaName)) {
175
- ctx.processingSchemas.add(schemaName);
176
- const schemaExpression = yield* ensureSchema(resolvedSchema);
177
- const schemaKeyIdentifier = import_lib$3.identifier(schemaKey.upper);
178
- if (options.experimental_includeTypes) schemaKeyIdentifier.typeAnnotation = import_lib$3.tsTypeAnnotation(import_lib$3.tsTypeReference(options.types.schema, import_lib$3.tsTypeParameterInstantiation([schemaExpression.typeDecoded, schemaExpression.typeEncoded])));
179
- ctx.schemas.set(schemaName, [import_lib$3.exportNamedDeclaration(import_lib$3.variableDeclaration("const", [import_lib$3.variableDeclarator(schemaKeyIdentifier, schemaExpression.expression)])), import_lib$3.exportNamedDeclaration(import_lib$3.tsTypeAliasDeclaration(import_lib$3.identifier(schemaKey.upper), null, import_lib$3.tsTypeReference(options.types.typeDecoded, import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTypeQuery(import_lib$3.identifier(schemaKey.upper))]))))]);
180
- ctx.schemaTypeMeta.set(schemaName, schemaExpression.typeMeta);
181
- ctx.processingSchemas.delete(schemaName);
182
- }
183
- return {
184
- expression: import_lib$3.identifier(schemaKey.upper),
185
- typeDecoded: import_lib$3.tsTypeReference(options.types.typeDecoded, import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTypeQuery(import_lib$3.identifier(schemaKey.upper))])),
186
- typeEncoded: import_lib$3.tsTypeReference(options.types.typeEncoded, import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTypeQuery(import_lib$3.identifier(schemaKey.upper))])),
187
- typeMeta: ctx.schemaTypeMeta.get(schemaName)
188
- };
189
- }
190
- if (schema.deprecated) if (options.deprecationHandling === "optional") typeMeta.optional = true;
191
- else return {
192
- expression: options.modifiers.optional(options.schema.unknown),
193
- ...equivalentType(import_lib$3.tsUnionType([import_lib$3.tsUnknownKeyword(), import_lib$3.tsUndefinedKeyword()])),
194
- typeMeta
195
- };
196
- const customResult = options.custom?.(schema);
197
- if (customResult) {
198
- const identifier = yield* ensureImport(customResult.name, customResult.from);
199
- const returnType = import_lib$3.tsTypeReference(import_lib$3.identifier("ReturnType"), import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTypeQuery(identifier)]));
200
- return {
201
- expression: import_lib$3.callExpression(identifier, []),
202
- typeDecoded: import_lib$3.tsTypeReference(options.types.typeDecoded, import_lib$3.tsTypeParameterInstantiation([returnType])),
203
- typeEncoded: import_lib$3.tsTypeReference(options.types.typeEncoded, import_lib$3.tsTypeParameterInstantiation([returnType])),
204
- typeMeta
205
- };
206
- }
207
- if (schema.allOf) {
208
- const results = yield* Effect.forEach((schema$1) => ensureSchema(schema$1))(schema.allOf);
209
- let result;
210
- if (results.length === 1) result = results[0];
211
- else result = {
212
- expression: options.schema[results.every((i) => i.typeMeta.isObject) ? "objectExtend" : "intersection"](results.map((result$1) => result$1.expression)),
213
- typeDecoded: import_lib$3.tsIntersectionType(results.map((result$1) => result$1.typeDecoded)),
214
- typeEncoded: import_lib$3.tsIntersectionType(results.map((result$1) => result$1.typeEncoded)),
215
- typeMeta
216
- };
217
- if ("nullable" in schema && schema.nullable) {
218
- result.expression = options.modifiers.nullable(result.expression);
219
- result.typeDecoded = import_lib$3.tsUnionType([result.typeDecoded, import_lib$3.tsNullKeyword()]);
220
- result.typeEncoded = import_lib$3.tsUnionType([result.typeEncoded, import_lib$3.tsNullKeyword()]);
221
- }
222
- return result;
223
- }
224
- if (schema.enum) {
225
- const unsupportedEnumValue = schema.enum.find((i) => typeof i !== "string" && typeof i !== "number" && typeof i !== "boolean" && i !== null);
226
- if (unsupportedEnumValue !== void 0) return yield* new NotImplementedError({ message: `Unsupported 'enum' value: ${JSON.stringify(unsupportedEnumValue)}` });
227
- const getLiteral = (value) => {
228
- if (typeof value === "number") return import_lib$3.numericLiteral(value);
229
- if (typeof value === "boolean") return import_lib$3.booleanLiteral(value);
230
- return import_lib$3.stringLiteral(value);
231
- };
232
- return {
233
- expression: options.schema.enum(schema.enum.map((e) => e === null ? import_lib$3.nullLiteral() : getLiteral(e))),
234
- ...equivalentType(import_lib$3.tsUnionType(schema.enum.map((e) => e === null ? import_lib$3.tsNullKeyword() : import_lib$3.tsLiteralType(getLiteral(e))))),
235
- typeMeta
236
- };
237
- }
238
- switch (schema.type) {
239
- case "boolean": return {
240
- expression: options.schema.boolean,
241
- ...equivalentType(import_lib$3.tsBooleanKeyword()),
242
- typeMeta
243
- };
244
- case "string": {
245
- if (schema.format === "binary") return {
246
- expression: import_lib$3.callExpression(options.schema.instanceOf, [import_lib$3.identifier("Blob")]),
247
- ...equivalentType(import_lib$3.tsTypeReference(import_lib$3.identifier("Blob"))),
248
- typeMeta
249
- };
250
- let expression = {
251
- expression: options.schema.string,
252
- ...equivalentType(import_lib$3.tsStringKeyword()),
253
- typeMeta
254
- };
255
- if (schema.pattern) expression.expression = options.modifiers.regex(expression.expression, schema.pattern);
256
- return expression;
257
- }
258
- case "number": return {
259
- expression: options.schema.number,
260
- ...equivalentType(import_lib$3.tsNumberKeyword()),
261
- typeMeta
262
- };
263
- case "integer": return {
264
- expression: options.schema.integer,
265
- ...equivalentType(import_lib$3.tsNumberKeyword()),
266
- typeMeta
267
- };
268
- case "object": {
269
- typeMeta.isObject = true;
270
- const object = import_lib$3.objectExpression([]);
271
- const objectTypeDecoded = import_lib$3.tsTypeLiteral([]);
272
- const objectTypeEncoded = import_lib$3.tsTypeLiteral([]);
273
- for (const [propertyKey, property] of Object.entries(schema.properties ?? {})) {
274
- let propertySchema = yield* ensureSchema(property);
275
- const decodedMember = import_lib$3.tsPropertySignature(import_lib$3.identifier(propertyKey), import_lib$3.tsTypeAnnotation(propertySchema.typeDecoded));
276
- const encodedMember = import_lib$3.tsPropertySignature(import_lib$3.identifier(propertyKey), import_lib$3.tsTypeAnnotation(propertySchema.typeEncoded));
277
- decodedMember.readonly = !!propertySchema.typeMeta?.readonly;
278
- encodedMember.readonly = !!propertySchema.typeMeta?.readonly;
279
- if (propertySchema.typeMeta?.optional || !schema.required?.includes(propertyKey)) {
280
- propertySchema.expression = options.modifiers.optional(propertySchema.expression);
281
- decodedMember.optional = true;
282
- encodedMember.optional = true;
283
- }
284
- const objectProperty = import_lib$3.objectProperty(stringLiteralOrIdentifier(propertyKey), propertySchema.expression);
285
- if (property.description) import_lib$3.addComment(objectProperty, "leading", `* ${property.description}`);
286
- object.properties.push(objectProperty);
287
- objectTypeDecoded.members.push(decodedMember);
288
- objectTypeEncoded.members.push(encodedMember);
289
- }
290
- return {
291
- expression: import_lib$3.callExpression(options.schema.object, [object]),
292
- typeDecoded: objectTypeDecoded,
293
- typeEncoded: objectTypeEncoded,
294
- typeMeta
295
- };
296
- }
297
- case "array": {
298
- const itemsSchema = yield* ensureSchema(schema.items);
299
- let expression = import_lib$3.callExpression(options.schema.array, [itemsSchema.expression]);
300
- let typeDecoded = import_lib$3.tsArrayType(itemsSchema.typeDecoded);
301
- let typeEncoded = import_lib$3.tsArrayType(itemsSchema.typeEncoded);
302
- if (options.supportsImmutability) if (itemsSchema.typeMeta?.readonly) {
303
- expression = options.modifiers.immutable(expression);
304
- typeDecoded = import_lib$3.tsTypeOperator(typeDecoded, "readonly");
305
- typeEncoded = import_lib$3.tsTypeOperator(typeEncoded, "readonly");
306
- } else expression = options.modifiers.mutable(expression);
307
- return {
308
- expression,
309
- typeDecoded,
310
- typeEncoded,
311
- typeMeta
312
- };
313
- }
314
- case "null":
315
- typeMeta.isNull = true;
316
- return {
317
- expression: options.schema.null,
318
- ...equivalentType(import_lib$3.tsNullKeyword()),
319
- typeMeta
320
- };
321
- case void 0: return {
322
- expression: options.schema.unknown,
323
- ...equivalentType(import_lib$3.tsUnknownKeyword()),
324
- typeMeta
325
- };
326
- default:
327
- console.info(schema);
328
- return yield* new NotImplementedError({ message: `type ${schema.type}` });
329
- }
330
- });
331
- const applyModifiers = Effect.fn(function* (expression, schema) {
332
- if ("$ref" in schema) return expression;
333
- const modified = { ...expression };
334
- if (options.supportsImmutability) if (schema.readOnly) {
335
- modified.expression = options.modifiers.immutable(modified.expression);
336
- modified.typeMeta ??= {};
337
- modified.typeMeta.readonly = true;
338
- } else modified.expression = options.modifiers.mutable(modified.expression);
339
- return modified;
340
- });
341
- const ensureSchema = Effect.fn(function* (schema) {
342
- let schemas = [schema].flatMap((schema$1) => {
343
- if ("$ref" in schema$1) return [schema$1];
344
- if (schema$1.oneOf) return schema$1.oneOf;
345
- return [schema$1];
346
- }).flatMap((schema$1) => {
347
- if (typeof schema$1 === "boolean") return [];
348
- if ("$ref" in schema$1) return [schema$1];
349
- if (Array.isArray(schema$1.type)) return schema$1.type.map((type) => ({
350
- ...schema$1,
351
- type
352
- }));
353
- return [schema$1];
354
- });
355
- let expressions = [];
356
- for (const schema$1 of schemas) expressions.push(yield* applyModifiers(yield* getBaseEffectSchema(schema$1), schema$1));
357
- let isNullable = false;
358
- if (expressions.some((e) => e.typeMeta?.isNull)) {
359
- isNullable = true;
360
- expressions = expressions.filter((e) => !e.typeMeta?.isNull);
361
- }
362
- let result;
363
- if (expressions.length === 1) result = expressions[0];
364
- else result = {
365
- expression: options.schema.union(expressions.map((e) => e.expression)),
366
- typeDecoded: import_lib$3.tsUnionType(expressions.map((e) => e.typeDecoded)),
367
- typeEncoded: import_lib$3.tsUnionType(expressions.map((e) => e.typeEncoded)),
368
- typeMeta: {}
369
- };
370
- if (isNullable) {
371
- result.expression = options.modifiers.nullable(result.expression);
372
- result.typeDecoded = import_lib$3.tsUnionType([result.typeDecoded, import_lib$3.tsNullKeyword()]);
373
- result.typeEncoded = import_lib$3.tsUnionType([result.typeEncoded, import_lib$3.tsNullKeyword()]);
374
- }
375
- return result;
376
- });
377
- const ensureParametersSchema = Effect.fn(function* (operationKey, method, path) {
378
- const ctx = yield* DocumentContext;
379
- const identifier = import_lib$3.identifier(`${operationKey.upper}_Parameters`);
380
- const object = import_lib$3.objectExpression([]);
381
- const queryArray = import_lib$3.arrayExpression([]);
382
- const pathParameters = {};
383
- const headerArray = import_lib$3.arrayExpression([]);
384
- let hasBody = false;
385
- for (let parameter of method.parameters ?? []) {
386
- if ("$ref" in parameter) {
387
- const newParameter = ctx.document.components?.parameters?.[parameter.$ref.slice(24)];
388
- if (newParameter) parameter = newParameter;
389
- else return yield* new NotImplementedError({ message: "Unresolved $ref in parameter" });
390
- if ("$ref" in parameter) return yield* new NotImplementedError({ message: "$ref in parameter" });
391
- }
392
- if (!parameter.schema) return yield* new NotImplementedError({ message: "parameter without schema" });
393
- let expression = (yield* ensureSchema(parameter.schema)).expression;
394
- if (!parameter.required) expression = options.modifiers.optional(expression);
395
- const objectProperty = import_lib$3.objectProperty(stringLiteralOrIdentifier(parameter.name), expression);
396
- if (parameter.description) import_lib$3.addComment(objectProperty, "leading", `* ${parameter.description}`);
397
- object.properties.push(objectProperty);
398
- if (parameter.in === "query") {
399
- const param = memberExpressionWithStringProperty(import_lib$3.identifier("from"), parameter.name);
400
- if ("type" in parameter.schema && parameter.schema.type === "array") queryArray.elements.push(import_lib$3.spreadElement(import_lib$3.logicalExpression("??", Object.assign(import_lib$3.optionalCallExpression(import_lib$3.optionalMemberExpression(param, import_lib$3.identifier("map"), false, true), [import_lib$3.arrowFunctionExpression([import_lib$3.identifier("value")], import_lib$3.arrayExpression([import_lib$3.stringLiteral(parameter.name), import_lib$3.callExpression(import_lib$3.identifier("String"), [import_lib$3.identifier("value")])]))], false), { typeParameters: import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTupleType([import_lib$3.tsStringKeyword(), import_lib$3.tsStringKeyword()])]) }), import_lib$3.arrayExpression([]))));
401
- else queryArray.elements.push(import_lib$3.arrayExpression([import_lib$3.stringLiteral(parameter.name), import_lib$3.callExpression(import_lib$3.identifier("String"), [param])]));
402
- } else if (parameter.in === "path") pathParameters[parameter.name] = memberExpressionWithStringProperty(import_lib$3.identifier("from"), parameter.name);
403
- else if (parameter.in === "header") headerArray.elements.push(import_lib$3.arrayExpression([import_lib$3.stringLiteral(parameter.name), import_lib$3.callExpression(import_lib$3.identifier("String"), [memberExpressionWithStringProperty(import_lib$3.identifier("from"), parameter.name)])]));
404
- else return yield* new NotImplementedError({ message: `parameter in ${parameter.in}` });
405
- }
406
- const body = yield* requestBodySchema(operationKey, method);
407
- if (body) {
408
- hasBody = true;
409
- object.properties.push(import_lib$3.objectProperty(import_lib$3.identifier("data"), body.data));
410
- headerArray.elements.push(...body.headers);
411
- }
412
- const decodedSchema = import_lib$3.callExpression(options.schema.object, [object]);
413
- const transform = options.transformer({
414
- encoded: yield* ensureStandardParametersSchema(),
415
- decoded: decodedSchema,
416
- decode: import_lib$3.blockStatement([import_lib$3.throwStatement(import_lib$3.newExpression(import_lib$3.identifier("Error"), [import_lib$3.stringLiteral("Not implemented")]))]),
417
- encode: import_lib$3.objectExpression([
418
- import_lib$3.objectProperty(import_lib$3.identifier("path"), generatePathExpression(path, pathParameters, queryArray.elements.length ? import_lib$3.newExpression(import_lib$3.identifier("URLSearchParams"), [queryArray]) : null)),
419
- ...headerArray.elements.length ? [import_lib$3.objectProperty(import_lib$3.identifier("headers"), import_lib$3.newExpression(import_lib$3.identifier("Headers"), [headerArray]))] : [],
420
- ...hasBody ? [import_lib$3.objectProperty(import_lib$3.identifier("body"), import_lib$3.memberExpression(import_lib$3.identifier("from"), import_lib$3.identifier("data")))] : []
421
- ])
422
- });
423
- ctx.schemas.set(identifier.name, [import_lib$3.exportNamedDeclaration(import_lib$3.variableDeclaration("const", [import_lib$3.variableDeclarator(identifier, transform)]))]);
424
- return {
425
- expression: identifier,
426
- typeReference: import_lib$3.tsTypeReference(options.types.typeDecoded, import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTypeQuery(identifier)]))
427
- };
428
- });
429
- const requestBodySchema = Effect.fn(function* (operationKey, method) {
430
- if (!method.requestBody) return null;
431
- if ("$ref" in method.requestBody) return yield* new NotImplementedError({ message: "$ref in requestBody" });
432
- let hasBody = false;
433
- for (const contentType in method.requestBody.content) {
434
- hasBody = true;
435
- const schema = method.requestBody.content[contentType]?.schema;
436
- if (contentType === "application/json") {
437
- if (!schema) continue;
438
- return {
439
- headers: [import_lib$3.arrayExpression([import_lib$3.stringLiteral("Content-Type"), import_lib$3.stringLiteral("application/json")])],
440
- data: yield* generateJsonRequestCodec(options, yield* resolveSchema(schema), (yield* ensureSchema(schema)).expression)
441
- };
442
- } else if (contentType === "multipart/form-data") {
443
- if (!schema) continue;
444
- return {
445
- headers: [],
446
- data: yield* generateFormDataRequestCodec(options, yield* resolveSchema(schema), (yield* ensureSchema(schema)).expression)
447
- };
448
- } else {
449
- if (schema && ("$ref" in schema || schema.type !== "string" && schema.format !== "binary")) continue;
450
- return {
451
- headers: [import_lib$3.arrayExpression([import_lib$3.stringLiteral("Content-Type"), import_lib$3.stringLiteral(contentType)])],
452
- data: import_lib$3.callExpression(options.schema.instanceOf, [import_lib$3.identifier("Blob")])
453
- };
454
- }
455
- }
456
- if (!hasBody) return null;
457
- return yield* new NotImplementedError({ message: `No supported requestBody type (${Object.keys(method.requestBody.content).join(", ")}) in ${operationKey.upper}` });
458
- });
459
- const responseSchema = Effect.fn(function* (content) {
460
- if (content) {
461
- for (const [format, formatContent] of Object.entries(content)) if (format === "application/json") {
462
- if (!formatContent.schema) continue;
463
- const schema = formatContent.schema;
464
- const decodedSchema = (yield* ensureSchema(schema)).expression;
465
- return yield* generateJsonResponseCodec(options, yield* resolveSchema(schema), decodedSchema);
466
- }
467
- }
468
- return yield* generateBlobResponseCodec(options);
469
- });
470
- const ensureResponseSchema = Effect.fn(function* (operationKey, method) {
471
- const ctx = yield* DocumentContext;
472
- let transform;
473
- if (!method.responses?.["200"]) transform = yield* responseSchema(void 0);
474
- else {
475
- let response;
476
- if ("$ref" in method.responses["200"]) {
477
- const ref = method.responses["200"].$ref;
478
- if (!ref.startsWith("#/components/responses/")) return yield* new NotImplementedError({ message: `$ref ${ref} in response in ${operationKey.upper}` });
479
- const responseName = ref.slice(23);
480
- const newResponse = ctx.document.components?.responses?.[responseName];
481
- if (!newResponse) return yield* new NotImplementedError({ message: `Missing $ref ${ref} in response in ${operationKey.upper}` });
482
- if ("$ref" in newResponse) return yield* new NotImplementedError({ message: `$ref in $ref in response in ${operationKey.upper}` });
483
- response = newResponse;
484
- } else response = method.responses["200"];
485
- transform = yield* responseSchema(response.content);
486
- }
487
- const identifier = import_lib$3.identifier(`${operationKey.upper}_Response`);
488
- ctx.schemas.set(identifier.name, [import_lib$3.exportNamedDeclaration(import_lib$3.variableDeclaration("const", [import_lib$3.variableDeclarator(identifier, transform)]))]);
489
- return {
490
- expression: identifier,
491
- typeReference: import_lib$3.tsTypeReference(options.types.typeDecoded, import_lib$3.tsTypeParameterInstantiation([import_lib$3.tsTypeQuery(identifier)]))
492
- };
493
- });
494
- const processSchema = Effect.fn(function* (schema) {
495
- if (options.includeSchemas ?? true) yield* ensureSchema(schema);
496
- });
497
- const processOperation = Effect.fn(function* (operationKey, path, _method, operation) {
498
- if (options.includeOperations) {
499
- yield* ensureParametersSchema(operationKey, operation, path);
500
- yield* ensureResponseSchema(operationKey, operation);
501
- }
502
- });
503
- const decodeResponse = Effect.fn(function* (schema, response) {
504
- return options.methods.decode(schema, response);
505
- });
506
- const encodeParameters = Effect.fn(function* (schema, response) {
507
- return options.methods.encode(schema, response);
508
- });
509
- return {
510
- processSchema,
511
- processOperation,
512
- ensureParametersSchema,
513
- ensureResponseSchema,
514
- decodeResponse,
515
- encodeParameters,
516
- get schemaType() {
517
- return options.types.schema;
518
- }
519
- };
520
- }
521
-
522
- //#endregion
523
- //#region src/generators/effect.ts
524
- var import_lib$2 = /* @__PURE__ */ __toESM(require_lib(), 1);
525
- const createEffectSchemaGenerator = (options) => ({
526
- ...createSchemaGenerator({
527
- ...options,
528
- modifiers: {
529
- lazy: (expression) => import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("suspend")), [expression]),
530
- optional: (expression) => import_lib$2.callExpression(import_lib$2.memberExpression(expression, import_lib$2.identifier("pipe")), [import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("optional"))]),
531
- regex: (expression, pattern) => import_lib$2.callExpression(import_lib$2.memberExpression(expression, import_lib$2.identifier("pipe")), [import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("pattern")), [import_lib$2.regExpLiteral(pattern)])]),
532
- immutable: (expression) => expression,
533
- mutable: (expression) => import_lib$2.callExpression(import_lib$2.memberExpression(expression, import_lib$2.identifier("pipe")), [import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("mutable"))]),
534
- nullable: (expression) => import_lib$2.callExpression(import_lib$2.memberExpression(expression, import_lib$2.identifier("pipe")), [import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("NullOr"))])
535
- },
536
- types: {
537
- schema: import_lib$2.tsQualifiedName(import_lib$2.identifier("Schema"), import_lib$2.identifier("Schema")),
538
- typeDecoded: import_lib$2.tsQualifiedName(import_lib$2.tsQualifiedName(import_lib$2.identifier("Schema"), import_lib$2.identifier("Schema")), import_lib$2.identifier("Type")),
539
- typeEncoded: import_lib$2.tsQualifiedName(import_lib$2.tsQualifiedName(import_lib$2.identifier("Schema"), import_lib$2.identifier("Schema")), import_lib$2.identifier("Encoded"))
540
- },
541
- schema: {
542
- record: (key, value) => import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("Record")), [import_lib$2.objectExpression([import_lib$2.objectProperty(import_lib$2.identifier("key"), key), import_lib$2.objectProperty(import_lib$2.identifier("value"), value)])]),
543
- union: (expressions) => import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("Union")), expressions),
544
- intersection: (expressions) => expressions.reduce((a, b) => import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("extend")), [a, b])),
545
- objectExtend: (expressions) => expressions.reduce((a, b) => import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("extend")), [a, b])),
546
- enum: (expressions) => import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("Literal")), expressions),
547
- instanceOf: import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("instanceOf")),
548
- boolean: import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("Boolean")),
549
- string: import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("String")),
550
- number: import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("Number")),
551
- integer: import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("Number")), import_lib$2.identifier("pipe")), [import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("int")), [])]),
552
- array: import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("Array")),
553
- object: import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("Struct")),
554
- null: import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("Null")),
555
- unknown: import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("Unknown"))
556
- },
557
- transformer: ({ encoded, decoded, decode, decodeAsync, encode, encodeAsync }) => {
558
- let decodeFn;
559
- let encodeFn;
560
- if (decodeAsync || encodeAsync) {
561
- decodeFn = import_lib$2.arrowFunctionExpression([import_lib$2.identifier("from"), import_lib$2.identifier("ctx")], import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Effect"), import_lib$2.identifier("promise")), [import_lib$2.arrowFunctionExpression([], decode, true)]));
562
- encodeFn = import_lib$2.arrowFunctionExpression([import_lib$2.identifier("from"), import_lib$2.identifier("ctx")], import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Effect"), import_lib$2.identifier("promise")), [import_lib$2.arrowFunctionExpression([], encode, true)]));
563
- } else {
564
- decodeFn = import_lib$2.arrowFunctionExpression([import_lib$2.identifier("from"), import_lib$2.identifier("ctx")], decode);
565
- encodeFn = import_lib$2.arrowFunctionExpression([import_lib$2.identifier("from"), import_lib$2.identifier("ctx")], encode);
566
- }
567
- return import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier(decodeAsync || encodeAsync ? "transformOrFail" : "transform")), [
568
- encoded,
569
- decoded,
570
- import_lib$2.objectExpression([
571
- import_lib$2.objectProperty(import_lib$2.identifier("strict"), import_lib$2.booleanLiteral(true)),
572
- import_lib$2.objectProperty(import_lib$2.identifier("decode"), decodeFn),
573
- import_lib$2.objectProperty(import_lib$2.identifier("encode"), encodeFn)
574
- ])
575
- ]);
576
- },
577
- transformerCatch: (expression) => import_lib$2.blockStatement([import_lib$2.throwStatement(expression)]),
578
- methods: {
579
- encode: (schema, value) => import_lib$2.callExpression(import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("encodePromise")), [schema]), [value]),
580
- decode: (schema, value) => import_lib$2.callExpression(import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("decodePromise")), [schema]), [value]),
581
- parse: (schema, value) => import_lib$2.callExpression(import_lib$2.callExpression(import_lib$2.memberExpression(import_lib$2.identifier("Schema"), import_lib$2.identifier("decodeUnknownPromise")), [schema]), [value])
582
- },
583
- supportsImmutability: true
584
- }),
585
- initialize: Effect.fn(function* () {
586
- yield* ensureNamespaceImport("Schema", "effect/Schema");
587
- yield* ensureImport("Effect", "effect");
588
- })
589
- });
590
-
591
- //#endregion
592
- //#region src/generators/zod.ts
593
- var import_lib$1 = /* @__PURE__ */ __toESM(require_lib(), 1);
594
- const z = import_lib$1.identifier("z");
595
- function getObjectShape(expression) {
596
- if (expression.type === "CallExpression" && expression.callee.type === "MemberExpression" && expression.callee.object.type === "Identifier" && expression.callee.object.name === "z" && expression.callee.property.type === "Identifier" && expression.callee.property.name === "object" && expression.arguments.length === 1 && expression.arguments[0]?.type === "ObjectExpression") return expression.arguments[0];
597
- return import_lib$1.memberExpression(expression, import_lib$1.identifier("shape"));
598
- }
599
- const createZodSchemaGenerator = ({ mini = false,...options }) => {
600
- const maybeExtension = (expression, extension, args) => mini ? import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier(extension)), [expression, ...args]) : import_lib$1.callExpression(import_lib$1.memberExpression(expression, import_lib$1.identifier(extension)), args);
601
- return {
602
- ...createSchemaGenerator({
603
- ...options,
604
- modifiers: {
605
- lazy: (expression) => import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("lazy")), [expression]),
606
- optional: (expression) => maybeExtension(expression, "optional", []),
607
- regex: (expression, pattern) => maybeExtension(expression, "regex", [import_lib$1.regExpLiteral(pattern)]),
608
- immutable: (expression) => expression,
609
- mutable: (expression) => expression,
610
- nullable: (expression) => maybeExtension(expression, "nullable", [])
611
- },
612
- types: {
613
- schema: import_lib$1.tsQualifiedName(z, import_lib$1.identifier(mini ? "ZodMiniType" : "Schema")),
614
- typeDecoded: import_lib$1.tsQualifiedName(z, import_lib$1.identifier("output")),
615
- typeEncoded: import_lib$1.tsQualifiedName(z, import_lib$1.identifier("input"))
616
- },
617
- schema: {
618
- record: (key, value) => import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("record")), [key, value]),
619
- union: (expressions) => import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("union")), [import_lib$1.arrayExpression(expressions)]),
620
- intersection: (expressions) => expressions.reduce((a, b) => import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("intersection")), [a, b])),
621
- objectExtend: (expressions) => expressions.reduce((a, b) => import_lib$1.callExpression(import_lib$1.memberExpression(mini ? z : a, import_lib$1.identifier("extend")), [...mini ? [a] : [], getObjectShape(b)])),
622
- enum: (expressions) => import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("enum")), [import_lib$1.arrayExpression(expressions)]),
623
- instanceOf: import_lib$1.memberExpression(z, import_lib$1.identifier("instanceof")),
624
- boolean: import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("boolean")), []),
625
- string: import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("string")), []),
626
- number: import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("number")), []),
627
- integer: import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("int")), []),
628
- array: import_lib$1.memberExpression(z, import_lib$1.identifier("array")),
629
- object: import_lib$1.memberExpression(z, import_lib$1.identifier("object")),
630
- null: import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("null")), []),
631
- unknown: import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("unknown")), [])
632
- },
633
- transformer: ({ encoded, decoded, decode, decodeAsync, encode, encodeAsync }) => import_lib$1.callExpression(import_lib$1.memberExpression(z, import_lib$1.identifier("codec")), [
634
- encoded,
635
- decoded,
636
- import_lib$1.objectExpression([import_lib$1.objectProperty(import_lib$1.identifier("decode"), import_lib$1.arrowFunctionExpression([import_lib$1.identifier("from"), import_lib$1.identifier("ctx")], decode, decodeAsync)), import_lib$1.objectProperty(import_lib$1.identifier("encode"), import_lib$1.arrowFunctionExpression([import_lib$1.identifier("from"), import_lib$1.identifier("ctx")], encode, encodeAsync))])
637
- ]),
638
- transformerCatch: (expression) => import_lib$1.blockStatement([import_lib$1.expressionStatement(import_lib$1.callExpression(import_lib$1.memberExpression(import_lib$1.memberExpression(import_lib$1.identifier("ctx"), import_lib$1.identifier("issues")), import_lib$1.identifier("push")), [import_lib$1.objectExpression([
639
- import_lib$1.objectProperty(import_lib$1.identifier("code"), import_lib$1.stringLiteral("custom")),
640
- import_lib$1.objectProperty(import_lib$1.identifier("input"), import_lib$1.identifier("from")),
641
- import_lib$1.objectProperty(import_lib$1.identifier("message"), import_lib$1.memberExpression(import_lib$1.tsAsExpression(expression, import_lib$1.tsTypeReference(import_lib$1.identifier("Error"))), import_lib$1.identifier("message")))
642
- ])])), import_lib$1.returnStatement(import_lib$1.memberExpression(import_lib$1.identifier("z"), import_lib$1.identifier("NEVER")))]),
643
- methods: {
644
- encode: (schema, value) => import_lib$1.callExpression(import_lib$1.memberExpression(import_lib$1.identifier("z"), import_lib$1.identifier("encodeAsync")), [schema, value]),
645
- decode: (schema, value) => import_lib$1.callExpression(import_lib$1.memberExpression(import_lib$1.identifier("z"), import_lib$1.identifier("decodeAsync")), [schema, value]),
646
- parse: (schema, value) => import_lib$1.callExpression(import_lib$1.memberExpression(import_lib$1.identifier("z"), import_lib$1.identifier("parseAsync")), [schema, value])
647
- },
648
- supportsImmutability: false
649
- }),
650
- initialize: Effect.fn(function* () {
651
- yield* ensureImport("z", mini ? "zod/mini" : "zod");
652
- })
653
- };
654
- };
655
-
656
- //#endregion
657
- //#region src/generators/client.ts
658
- var import_lib = /* @__PURE__ */ __toESM(require_lib(), 1);
659
- function createReactQueryClientGenerator(options) {
660
- const ensureApi = Effect.fn(function* () {
661
- const ctx = yield* DocumentContext;
662
- if (!ctx.schemas.has("Api")) {
663
- const fetch = import_lib.identifier("fetch");
664
- const fetchPath = import_lib.identifier("path");
665
- fetchPath.typeAnnotation = import_lib.tsTypeAnnotation(import_lib.tsStringKeyword());
666
- const fetchOptions = import_lib.identifier("options");
667
- fetchOptions.typeAnnotation = import_lib.tsTypeAnnotation(import_lib.tsTypeLiteral([
668
- import_lib.tsPropertySignature(import_lib.identifier("method"), import_lib.tsTypeAnnotation(import_lib.tsStringKeyword())),
669
- Object.assign(import_lib.tsPropertySignature(import_lib.identifier("headers"), import_lib.tsTypeAnnotation(import_lib.tsTypeReference(import_lib.identifier("Headers")))), { optional: true }),
670
- Object.assign(import_lib.tsPropertySignature(import_lib.identifier("body"), import_lib.tsTypeAnnotation(import_lib.tsUnionType([
671
- import_lib.tsTypeReference(import_lib.identifier("string")),
672
- import_lib.tsTypeReference(import_lib.identifier("Blob")),
673
- import_lib.tsTypeReference(import_lib.identifier("FormData")),
674
- import_lib.tsTypeReference(import_lib.identifier("URLSearchParams"))
675
- ]))), { optional: true })
676
- ]));
677
- fetch.typeAnnotation = import_lib.tsTypeAnnotation(import_lib.tsFunctionType(null, [fetchPath, fetchOptions], import_lib.tsTypeAnnotation(import_lib.tsTypeReference(import_lib.identifier("Promise"), import_lib.tsTypeParameterInstantiation([import_lib.tsTypeReference(import_lib.identifier("Response"))])))));
678
- ctx.schemas.set("Api", [import_lib.exportNamedDeclaration(import_lib.classDeclaration(import_lib.identifier("Api"), null, import_lib.classBody([import_lib.classPrivateProperty(import_lib.privateName(fetch)), import_lib.classMethod("constructor", import_lib.identifier("constructor"), [fetch], import_lib.blockStatement([import_lib.expressionStatement(import_lib.assignmentExpression("=", import_lib.memberExpression(import_lib.thisExpression(), import_lib.privateName(fetch)), fetch))]))])))]);
679
- }
680
- return ctx.schemas.get("Api")[0].declaration.body;
681
- });
682
- return {
683
- initialize: Effect.fn(function* () {
684
- yield* ensureApi();
685
- if (options.schema.initialize) yield* options.schema.initialize();
686
- }),
687
- processOperation: Effect.fn(function* (operationKey, path, method, operation) {
688
- const parametersSchema = yield* options.schema.ensureParametersSchema(operationKey, operation, path);
689
- const responseSchema = yield* options.schema.ensureResponseSchema(operationKey, operation);
690
- const parameters = import_lib.identifier("parameters");
691
- parameters.typeAnnotation = import_lib.tsTypeAnnotation(parametersSchema.typeReference);
692
- const parametersWithSkipToken = import_lib.identifier("parameters");
693
- parametersWithSkipToken.typeAnnotation = import_lib.tsTypeAnnotation(import_lib.tsUnionType([parametersSchema.typeReference, import_lib.tsTypeReference(yield* ensureImport("SkipToken", "@tanstack/react-query", true))]));
694
- const isMutation = method !== "get" && method !== "head" && method !== "options" && !operation.tags?.some((i) => i.toLowerCase() === "query");
695
- const fetchCall = import_lib.awaitExpression(import_lib.callExpression(import_lib.memberExpression(import_lib.thisExpression(), import_lib.privateName(import_lib.identifier("fetch"))), [import_lib.memberExpression(import_lib.identifier("params"), import_lib.identifier("path")), import_lib.objectExpression([
696
- import_lib.objectProperty(import_lib.identifier("method"), import_lib.stringLiteral(method.toUpperCase())),
697
- import_lib.objectProperty(import_lib.identifier("headers"), import_lib.memberExpression(import_lib.identifier("params"), import_lib.identifier("headers"))),
698
- import_lib.objectProperty(import_lib.identifier("body"), import_lib.memberExpression(import_lib.identifier("params"), import_lib.identifier("body")))
699
- ])]));
700
- const doMethod = import_lib.classMethod("method", import_lib.identifier(operationKey.lower), [parameters], import_lib.blockStatement([
701
- import_lib.variableDeclaration("const", [import_lib.variableDeclarator(import_lib.identifier("params"), import_lib.awaitExpression(yield* options.schema.encodeParameters(parametersSchema.expression, import_lib.identifier("parameters"))))]),
702
- import_lib.variableDeclaration("const", [import_lib.variableDeclarator(import_lib.identifier("response"), fetchCall)]),
703
- import_lib.returnStatement(import_lib.awaitExpression(yield* options.schema.decodeResponse(responseSchema.expression, import_lib.identifier("response"))))
704
- ]), false, false, false, true);
705
- const queryMethod = import_lib.classMethod("method", import_lib.identifier(operationKey.lower + (isMutation ? "Mutation" : "Query")), isMutation ? [] : [parametersWithSkipToken], import_lib.blockStatement([import_lib.returnStatement(import_lib.callExpression(yield* ensureImport(isMutation ? "mutationOptions" : "queryOptions", "@tanstack/react-query"), [import_lib.objectExpression([...isMutation ? [] : [import_lib.objectProperty(import_lib.identifier("queryKey"), import_lib.tsAsExpression(import_lib.arrayExpression([import_lib.stringLiteral(operationKey.upper), parametersWithSkipToken]), import_lib.tsTypeReference(yield* ensureImport("QueryKey", "@tanstack/react-query", true))))], isMutation ? import_lib.objectProperty(import_lib.identifier("mutationFn"), import_lib.arrowFunctionExpression([parameters], import_lib.callExpression(import_lib.memberExpression(import_lib.thisExpression(), import_lib.identifier(operationKey.lower)), [parameters]), true)) : import_lib.objectProperty(import_lib.identifier("queryFn"), import_lib.conditionalExpression(import_lib.binaryExpression("===", parametersWithSkipToken, yield* ensureImport("skipToken", "@tanstack/react-query")), yield* ensureImport("skipToken", "@tanstack/react-query"), import_lib.arrowFunctionExpression([], import_lib.callExpression(import_lib.memberExpression(import_lib.thisExpression(), import_lib.identifier(operationKey.lower)), [parametersWithSkipToken]), true)))])]))]));
706
- const commentLines = [];
707
- if (operation.summary) commentLines.push(`### ${operation.summary}`);
708
- if (operation.description) commentLines.push(`${operation.description}`);
709
- if (commentLines.length) {
710
- import_lib.addComment(queryMethod, "leading", `*\n${commentLines.join("\n")}\n*`);
711
- import_lib.addComment(doMethod, "leading", `*\n${commentLines.join("\n")}\n*`);
712
- }
713
- const api = yield* ensureApi();
714
- api.body.push(doMethod);
715
- api.body.push(queryMethod);
716
- })
717
- };
718
- }
719
-
720
- //#endregion
721
- export { createEffectSchemaGenerator, createReactQueryClientGenerator, createSchemaGenerator, createZodSchemaGenerator, helpers_exports as generatorHelpers };
722
- //# sourceMappingURL=index.js.map