@orval/effect 8.14.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.
package/README.md ADDED
@@ -0,0 +1,67 @@
1
+ [![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)
2
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
3
+
4
+ # @orval/effect
5
+
6
+ Generates [Effect Schema](https://effect.website/docs/schema/introduction/) validators from OpenAPI specifications.
7
+
8
+ ## Install
9
+
10
+ ```sh
11
+ npm install -D @orval/effect
12
+ npm install effect
13
+ ```
14
+
15
+ `effect` is a peer dependency (`>=3.10`). `@orval/effect` does not bundle it.
16
+
17
+ ## Usage
18
+
19
+ Set `client: 'effect'` in your `orval.config`:
20
+
21
+ ```ts
22
+ import { defineConfig } from 'orval';
23
+
24
+ export default defineConfig({
25
+ petstore: {
26
+ input: { target: './petstore.yaml' },
27
+ output: {
28
+ client: 'effect',
29
+ target: './src/api/schemas',
30
+ mode: 'single',
31
+ },
32
+ },
33
+ });
34
+ ```
35
+
36
+ ## Generated output
37
+
38
+ ```ts
39
+ import { Schema as S } from 'effect';
40
+
41
+ export const ListPetsQueryParams = S.Struct({
42
+ limit: S.optional(S.String).annotations({
43
+ description: 'How many items to return at one time (max 100)',
44
+ }),
45
+ });
46
+ ```
47
+
48
+ See the [Effect guide](https://orval.dev/guides/effect) and the [`swr-with-effect` sample](https://github.com/orval-labs/orval/tree/master/samples/swr-with-effect) for more.
49
+
50
+ ## Why Effect alongside Zod?
51
+
52
+ `@orval/effect` mirrors `@orval/zod`'s output shape, but Effect Schemas bring capabilities Zod can't:
53
+
54
+ - **Encoded vs decoded type duality** — `Schema.Type<S>` (runtime) and `Schema.Encoded<S>` (wire) are distinct; `Schema.encode` round-trips back to the wire shape.
55
+ - **Branded types as a generator option** — `override.effect.useBrandedTypes: true` turns named schemas into Effect brands for nominal-typed IDs without hand-writing `.brand<...>()`.
56
+ - **First-class annotations** — OpenAPI `description`, `title`, `examples` flow into `S.annotations(...)` and stay queryable at the AST level.
57
+ - **AST, not method chains** — schemas are introspectable artifacts, composable structurally by downstream tooling.
58
+ - **Effect runtime integration** — decoded results pipe straight into Effect's typed-error / retry / concurrency primitives.
59
+
60
+ ## Configuration
61
+
62
+ Options are read from `override.effect.*`:
63
+
64
+ - `strict` — fail on extra fields in object schemas
65
+ - `generate` — fine-grained control over which schemas (params/body/response) are emitted
66
+ - `useBrandedTypes` — map named schemas to branded types
67
+ - `generateEachHttpStatus` — emit a schema per response status code
@@ -0,0 +1,68 @@
1
+ import { ClientBuilder, ClientGeneratorsBuilder, ContextSpec, GeneratorDependency, OpenApiParameterObject, OpenApiReferenceObject, OpenApiSchemaObject } from "@orval/core";
2
+
3
+ //#region src/index.d.ts
4
+ declare const getEffectDependencies: () => GeneratorDependency[];
5
+ declare const predefinedEffectFormats: Set<string>;
6
+ interface EffectValidationSchemaDefinition {
7
+ functions: [string, unknown][];
8
+ consts: string[];
9
+ }
10
+ declare const generateEffectValidationSchemaDefinition: (schema: OpenApiSchemaObject | undefined, context: ContextSpec, name: string, strict: boolean, rules?: {
11
+ required?: boolean;
12
+ propertyOverrides?: Record<string, EffectValidationSchemaDefinition>;
13
+ constNameRegistry?: Record<string, number>;
14
+ }) => EffectValidationSchemaDefinition;
15
+ interface ParseEffectOptions {
16
+ /**
17
+ * When emitting inside a Struct property, wrap optionals/defaults with
18
+ * `S.optional` / `S.optionalWith` so they describe an optional field
19
+ * rather than `T | undefined`.
20
+ */
21
+ asStructProperty?: boolean;
22
+ brandName?: string;
23
+ }
24
+ /**
25
+ * Parse the intermediate definition into Effect Schema source code.
26
+ */
27
+ declare const parseEffectValidationSchemaDefinition: (input: EffectValidationSchemaDefinition, context: ContextSpec, strict: boolean, brandName?: string) => {
28
+ effect: string;
29
+ consts: string;
30
+ };
31
+ declare const dereference: (schema: OpenApiSchemaObject | OpenApiReferenceObject, context: ContextSpec) => OpenApiSchemaObject;
32
+ declare const generateFormDataEffectSchema: (schema: OpenApiSchemaObject, context: ContextSpec, name: string, strict: boolean, encoding?: Record<string, {
33
+ contentType?: string;
34
+ }>) => EffectValidationSchemaDefinition;
35
+ declare const parseParameters: ({
36
+ data,
37
+ context,
38
+ operationName,
39
+ strict,
40
+ generate
41
+ }: {
42
+ data: (OpenApiParameterObject | OpenApiReferenceObject)[] | undefined;
43
+ context: ContextSpec;
44
+ operationName: string;
45
+ strict: {
46
+ param: boolean;
47
+ query: boolean;
48
+ header: boolean;
49
+ body: boolean;
50
+ response: boolean;
51
+ };
52
+ generate: {
53
+ param: boolean;
54
+ query: boolean;
55
+ header: boolean;
56
+ body: boolean;
57
+ response: boolean;
58
+ };
59
+ }) => {
60
+ headers: EffectValidationSchemaDefinition;
61
+ queryParams: EffectValidationSchemaDefinition;
62
+ params: EffectValidationSchemaDefinition;
63
+ };
64
+ declare const generateEffect: ClientBuilder;
65
+ declare const builder: () => () => ClientGeneratorsBuilder;
66
+ //#endregion
67
+ export { EffectValidationSchemaDefinition, ParseEffectOptions, builder, builder as default, dereference, generateEffect, generateEffectValidationSchemaDefinition, generateFormDataEffectSchema, getEffectDependencies, parseEffectValidationSchemaDefinition, parseParameters, predefinedEffectFormats };
68
+ //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs ADDED
@@ -0,0 +1,764 @@
1
+ import { camel, escape, getFormDataFieldFileType, getNumberWord, isBoolean, isNumber, isObject, isString, jsStringEscape, logVerbose, pascal, resolveRef, stringify } from "@orval/core";
2
+ import { unique } from "remeda";
3
+ //#region src/index.ts
4
+ const EFFECT_DEPENDENCIES = [{
5
+ exports: [{
6
+ default: false,
7
+ name: "Schema",
8
+ syntheticDefaultImport: false,
9
+ namespaceImport: false,
10
+ values: true,
11
+ alias: "S"
12
+ }],
13
+ dependency: "effect"
14
+ }];
15
+ const getEffectDependencies = () => EFFECT_DEPENDENCIES;
16
+ const possibleSchemaTypes = new Set([
17
+ "integer",
18
+ "number",
19
+ "string",
20
+ "boolean",
21
+ "object",
22
+ "null",
23
+ "array"
24
+ ]);
25
+ const predefinedEffectFormats = new Set([
26
+ "date",
27
+ "date-time",
28
+ "email",
29
+ "uri",
30
+ "uuid"
31
+ ]);
32
+ const resolveEffectType = (schema) => {
33
+ const schemaTypeValue = schema.type;
34
+ if (Array.isArray(schemaTypeValue)) {
35
+ const nonNullTypes = schemaTypeValue.filter((t) => isString(t)).filter((t) => t !== "null" && possibleSchemaTypes.has(t)).map((t) => t === "integer" ? "number" : t);
36
+ if (nonNullTypes.length > 1) return { multiType: nonNullTypes };
37
+ const type = nonNullTypes[0];
38
+ if (type === "array" && "prefixItems" in schema) return "tuple";
39
+ return type;
40
+ }
41
+ const type = isString(schemaTypeValue) ? schemaTypeValue : void 0;
42
+ if (schema.type === "array" && "prefixItems" in schema) return "tuple";
43
+ switch (type) {
44
+ case "integer": return "number";
45
+ default: return type ?? "unknown";
46
+ }
47
+ };
48
+ const minAndMaxTypes = new Set([
49
+ "number",
50
+ "string",
51
+ "array"
52
+ ]);
53
+ const removeReadOnlyProperties = (schema) => {
54
+ if (schema.properties && isObject(schema.properties)) {
55
+ const filteredProperties = {};
56
+ for (const [key, value] of Object.entries(schema.properties)) {
57
+ if (isObject(value) && "readOnly" in value && value.readOnly) continue;
58
+ filteredProperties[key] = value;
59
+ }
60
+ return {
61
+ ...schema,
62
+ properties: filteredProperties
63
+ };
64
+ }
65
+ if (schema.items && isObject(schema.items) && "properties" in schema.items) return {
66
+ ...schema,
67
+ items: removeReadOnlyProperties(schema.items)
68
+ };
69
+ return schema;
70
+ };
71
+ const generateEffectValidationSchemaDefinition = (schema, context, name, strict, rules) => {
72
+ if (!schema) return {
73
+ functions: [],
74
+ consts: []
75
+ };
76
+ const consts = [];
77
+ const constNameRegistry = rules?.constNameRegistry ?? {};
78
+ const constsCounter = isNumber(constNameRegistry[name]) ? constNameRegistry[name] + 1 : 0;
79
+ const constsCounterValue = constsCounter ? pascal(getNumberWord(constsCounter)) : "";
80
+ constNameRegistry[name] = constsCounter;
81
+ const functions = [];
82
+ const type = resolveEffectType(schema);
83
+ const required = rules?.required ?? false;
84
+ const hasDefault = schema.default !== void 0;
85
+ const nullable = "nullable" in schema && schema.nullable || Array.isArray(schema.type) && schema.type.includes("null");
86
+ const min = schema.minimum ?? schema.minLength ?? schema.minItems;
87
+ const max = schema.maximum ?? schema.maxLength ?? schema.maxItems;
88
+ const exclusiveMinRaw = "exclusiveMinimum" in schema ? schema.exclusiveMinimum : void 0;
89
+ const exclusiveMaxRaw = "exclusiveMaximum" in schema ? schema.exclusiveMaximum : void 0;
90
+ const exclusiveMin = isBoolean(exclusiveMinRaw) && exclusiveMinRaw ? min : exclusiveMinRaw;
91
+ const exclusiveMax = isBoolean(exclusiveMaxRaw) && exclusiveMaxRaw ? max : exclusiveMaxRaw;
92
+ const multipleOf = schema.multipleOf;
93
+ const matches = schema.pattern ?? void 0;
94
+ const hasNonArrayEnum = !!schema.enum && type !== "array";
95
+ let skipSwitchStatement = false;
96
+ if (schema.allOf || schema.oneOf || schema.anyOf) {
97
+ const separator = schema.allOf ? "allOf" : schema.oneOf ? "oneOf" : "anyOf";
98
+ const baseSchemas = (schema.allOf ?? schema.oneOf ?? schema.anyOf).map((schema, index) => generateEffectValidationSchemaDefinition(schema, context, `${camel(name)}${pascal(getNumberWord(index + 1))}`, strict, {
99
+ required: true,
100
+ constNameRegistry
101
+ }));
102
+ if ((schema.allOf || schema.oneOf || schema.anyOf) && schema.properties) {
103
+ const additionalPropertiesSchema = {
104
+ properties: schema.properties,
105
+ required: schema.required,
106
+ additionalProperties: schema.additionalProperties,
107
+ type: schema.type
108
+ };
109
+ const additionalIndex = baseSchemas.length + 1;
110
+ const additionalPropertiesDefinition = generateEffectValidationSchemaDefinition(additionalPropertiesSchema, context, `${camel(name)}${pascal(getNumberWord(additionalIndex))}`, strict, {
111
+ required: true,
112
+ constNameRegistry
113
+ });
114
+ if (schema.oneOf || schema.anyOf) functions.push(["allOf", [{
115
+ functions: [[separator, baseSchemas]],
116
+ consts: []
117
+ }, additionalPropertiesDefinition]]);
118
+ else {
119
+ baseSchemas.push(additionalPropertiesDefinition);
120
+ functions.push([separator, baseSchemas]);
121
+ }
122
+ } else functions.push([separator, baseSchemas]);
123
+ skipSwitchStatement = true;
124
+ }
125
+ let defaultVarName;
126
+ if (schema.default !== void 0) {
127
+ defaultVarName = `${name}Default${constsCounterValue}`;
128
+ let defaultValue;
129
+ if (schema.type === "string" && (schema.format === "date" || schema.format === "date-time") && context.output.override.useDates) defaultValue = `new Date("${escape(schema.default)}")`;
130
+ else if (isObject(schema.default)) {
131
+ const entries = Object.entries(schema.default).map(([key, value]) => {
132
+ const safeKey = JSON.stringify(key);
133
+ if (isString(value)) return `${safeKey}: "${escape(value)}" as const`;
134
+ if (Array.isArray(value)) return `${safeKey}: [${value.map((item) => isString(item) ? `"${escape(item)}" as const` : `${item}`).join(", ")}]`;
135
+ if (value === null || value === void 0 || isNumber(value) || isBoolean(value)) return `${safeKey}: ${value}`;
136
+ }).filter((entry) => entry !== void 0).join(", ");
137
+ defaultValue = entries.length === 0 ? `{}` : `{ ${entries} }`;
138
+ } else {
139
+ const rawStringified = stringify(schema.default);
140
+ defaultValue = rawStringified === void 0 ? "null" : rawStringified.replaceAll("'", "`");
141
+ if (Array.isArray(schema.default) && type === "array" && schema.items && "enum" in schema.items && schema.default.length > 0) {
142
+ defaultVarName = defaultValue;
143
+ defaultValue = void 0;
144
+ }
145
+ }
146
+ if (defaultValue) consts.push(`export const ${defaultVarName} = ${defaultValue};`);
147
+ }
148
+ if (isObject(type) && "multiType" in type) {
149
+ const types = type.multiType;
150
+ functions.push(["oneOf", types.map((t) => generateEffectValidationSchemaDefinition({
151
+ ...schema,
152
+ type: t
153
+ }, context, name, strict, {
154
+ required: true,
155
+ constNameRegistry
156
+ }))]);
157
+ if (!required && nullable) functions.push(["nullish", void 0]);
158
+ else if (nullable) functions.push(["nullable", void 0]);
159
+ else if (!required) functions.push(["optional", void 0]);
160
+ return {
161
+ functions,
162
+ consts
163
+ };
164
+ }
165
+ if (!skipSwitchStatement) switch (type) {
166
+ case "tuple":
167
+ if ("prefixItems" in schema) {
168
+ const schema31 = schema;
169
+ const prefixItems = Array.isArray(schema31.prefixItems) ? schema31.prefixItems : [];
170
+ if (prefixItems.length > 0) functions.push(["tuple", prefixItems.map((item, idx) => generateEffectValidationSchemaDefinition(dereference(item, context), context, camel(`${name}-${idx}-item`), strict, {
171
+ required: true,
172
+ constNameRegistry
173
+ }))]);
174
+ }
175
+ break;
176
+ case "array":
177
+ functions.push(["array", generateEffectValidationSchemaDefinition(schema.items, context, camel(`${name}-item`), strict, {
178
+ required: true,
179
+ constNameRegistry
180
+ })]);
181
+ break;
182
+ case "string":
183
+ if (schema.enum) break;
184
+ if (context.output.override.useDates && (schema.format === "date" || schema.format === "date-time")) {
185
+ functions.push(["date", void 0]);
186
+ break;
187
+ }
188
+ if (schema.format === "binary") {
189
+ functions.push(["instanceof", "File"]);
190
+ break;
191
+ }
192
+ if (schema.contentMediaType === "application/octet-stream" && !schema.contentEncoding) {
193
+ functions.push(["instanceof", "File"]);
194
+ break;
195
+ }
196
+ if ("const" in schema) functions.push(["literal", JSON.stringify(String(schema.const))]);
197
+ else functions.push([type, void 0]);
198
+ if (schema.format === "date") {
199
+ functions.push(["dateFormat", void 0]);
200
+ break;
201
+ }
202
+ if (schema.format === "date-time") {
203
+ functions.push(["dateTimeFormat", void 0]);
204
+ break;
205
+ }
206
+ if (schema.format === "email") {
207
+ functions.push(["email", void 0]);
208
+ break;
209
+ }
210
+ if (schema.format === "uri") {
211
+ functions.push(["url", void 0]);
212
+ break;
213
+ }
214
+ if (schema.format === "uuid") {
215
+ functions.push(["uuid", void 0]);
216
+ break;
217
+ }
218
+ break;
219
+ default: {
220
+ const hasProperties = !!schema.properties;
221
+ const properties = schema.properties ?? {};
222
+ const hasDefinedProperties = Object.keys(properties).length > 0;
223
+ const hasAdditionalPropertiesSchema = !!schema.additionalProperties && !isBoolean(schema.additionalProperties);
224
+ const shouldUseLooseObject = type === "object" && !hasDefinedProperties && schema.additionalProperties === void 0 && !hasAdditionalPropertiesSchema;
225
+ if (hasProperties && hasDefinedProperties) {
226
+ functions.push([strict ? "strictObject" : "object", Object.keys(properties).map((key) => ({ [key]: rules?.propertyOverrides?.[key] ?? generateEffectValidationSchemaDefinition(properties[key], context, camel(`${name}-${key}`), strict, {
227
+ required: schema.required?.includes(key),
228
+ constNameRegistry
229
+ }) })).reduce((acc, curr) => ({
230
+ ...acc,
231
+ ...curr
232
+ }), {})]);
233
+ break;
234
+ }
235
+ if (shouldUseLooseObject) {
236
+ functions.push(["looseObject", {}]);
237
+ break;
238
+ }
239
+ if (schema.additionalProperties) {
240
+ functions.push(["additionalProperties", generateEffectValidationSchemaDefinition(isBoolean(schema.additionalProperties) ? {} : schema.additionalProperties, context, name, strict, {
241
+ required: true,
242
+ constNameRegistry
243
+ })]);
244
+ break;
245
+ }
246
+ if (schema.enum) break;
247
+ functions.push([type, void 0]);
248
+ break;
249
+ }
250
+ }
251
+ if (!hasNonArrayEnum && isString(type) && minAndMaxTypes.has(type)) {
252
+ const shouldUseExclusiveMin = exclusiveMinRaw !== void 0;
253
+ const shouldUseExclusiveMax = exclusiveMaxRaw !== void 0;
254
+ if (shouldUseExclusiveMin && exclusiveMin !== void 0) {
255
+ consts.push(`export const ${name}ExclusiveMin${constsCounterValue} = ${exclusiveMin};`);
256
+ functions.push(["gt", `${name}ExclusiveMin${constsCounterValue}`]);
257
+ } else if (min !== void 0) if (min === 1) functions.push(["min", `${min}`]);
258
+ else {
259
+ consts.push(`export const ${name}Min${constsCounterValue} = ${min};`);
260
+ functions.push(["min", `${name}Min${constsCounterValue}`]);
261
+ }
262
+ if (shouldUseExclusiveMax && exclusiveMax !== void 0) {
263
+ consts.push(`export const ${name}ExclusiveMax${constsCounterValue} = ${exclusiveMax};`);
264
+ functions.push(["lt", `${name}ExclusiveMax${constsCounterValue}`]);
265
+ } else if (max !== void 0) {
266
+ consts.push(`export const ${name}Max${constsCounterValue} = ${max};`);
267
+ functions.push(["max", `${name}Max${constsCounterValue}`]);
268
+ }
269
+ if (multipleOf !== void 0) {
270
+ consts.push(`export const ${name}MultipleOf${constsCounterValue} = ${multipleOf.toString()};`);
271
+ functions.push(["multipleOf", `${name}MultipleOf${constsCounterValue}`]);
272
+ }
273
+ if (exclusiveMin !== void 0 || min !== void 0 || exclusiveMax !== void 0 || multipleOf !== void 0 || max !== void 0) consts.push(`\n`);
274
+ }
275
+ if (matches && !hasNonArrayEnum && type === "string") {
276
+ const isStartWithSlash = matches.startsWith("/");
277
+ const isEndWithSlash = matches.endsWith("/");
278
+ const regexp = `new RegExp('${jsStringEscape(matches.slice(isStartWithSlash ? 1 : 0, isEndWithSlash ? -1 : void 0))}')`;
279
+ consts.push(`export const ${name}RegExp${constsCounterValue} = ${regexp};\n`);
280
+ functions.push(["regex", `${name}RegExp${constsCounterValue}`]);
281
+ }
282
+ if (schema.enum && type !== "array") {
283
+ const uniqueEnumValues = unique(schema.enum);
284
+ if (uniqueEnumValues.every((value) => isString(value))) functions.push(["enum", `[${uniqueEnumValues.map((value) => `'${escape(value)}'`).join(", ")}]`]);
285
+ else functions.push(["oneOf", uniqueEnumValues.map((value) => ({
286
+ functions: [["literal", isString(value) ? `'${escape(value)}'` : value]],
287
+ consts: []
288
+ }))]);
289
+ }
290
+ if (!required && nullable) functions.push(["nullish", void 0]);
291
+ else if (nullable) functions.push(["nullable", void 0]);
292
+ else if (!required && !hasDefault) functions.push(["optional", void 0]);
293
+ if (hasDefault) functions.push(["default", defaultVarName]);
294
+ if (schema.description) functions.push(["describe", `'${jsStringEscape(schema.description)}'`]);
295
+ return {
296
+ functions,
297
+ consts: unique(consts)
298
+ };
299
+ };
300
+ /**
301
+ * Categorize a function name so the parser can decide how to render it
302
+ * (constructor base, pipe filter, or schema wrapper).
303
+ */
304
+ const CONSTRUCTORS = new Set([
305
+ "string",
306
+ "number",
307
+ "integer",
308
+ "boolean",
309
+ "null",
310
+ "unknown",
311
+ "any",
312
+ "array",
313
+ "tuple",
314
+ "object",
315
+ "strictObject",
316
+ "looseObject",
317
+ "additionalProperties",
318
+ "literal",
319
+ "enum",
320
+ "oneOf",
321
+ "anyOf",
322
+ "allOf",
323
+ "instanceof",
324
+ "fileOrString",
325
+ "date"
326
+ ]);
327
+ const FILTERS = new Set([
328
+ "min",
329
+ "max",
330
+ "gt",
331
+ "lt",
332
+ "multipleOf",
333
+ "regex",
334
+ "email",
335
+ "uuid",
336
+ "url",
337
+ "dateFormat",
338
+ "dateTimeFormat"
339
+ ]);
340
+ /**
341
+ * Renders a single filter for a `.pipe(...)` group, choosing the right
342
+ * Effect Schema function based on the base type (string/number/array).
343
+ */
344
+ const renderFilter = (fn, arg, baseType) => {
345
+ switch (fn) {
346
+ case "min":
347
+ if (baseType === "string") return `S.minLength(${arg})`;
348
+ if (baseType === "array") return `S.minItems(${arg})`;
349
+ return `S.greaterThanOrEqualTo(${arg})`;
350
+ case "max":
351
+ if (baseType === "string") return `S.maxLength(${arg})`;
352
+ if (baseType === "array") return `S.maxItems(${arg})`;
353
+ return `S.lessThanOrEqualTo(${arg})`;
354
+ case "gt": return `S.greaterThan(${arg})`;
355
+ case "lt": return `S.lessThan(${arg})`;
356
+ case "multipleOf": return `S.multipleOf(${arg})`;
357
+ case "regex": return `S.pattern(${arg})`;
358
+ case "email": return String.raw`S.pattern(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)`;
359
+ case "uuid": return `S.pattern(/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/)`;
360
+ case "url": return String.raw`S.pattern(/^https?:\/\/.+/)`;
361
+ case "dateFormat": return String.raw`S.pattern(/^\d{4}-\d{2}-\d{2}$/)`;
362
+ case "dateTimeFormat": return String.raw`S.pattern(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:?\d{2})?$/)`;
363
+ default: return "";
364
+ }
365
+ };
366
+ const determineBaseType = (functions) => {
367
+ for (const [fn] of functions) {
368
+ if (fn === "string") return "string";
369
+ if (fn === "number" || fn === "integer") return "number";
370
+ if (fn === "array") return "array";
371
+ }
372
+ return "unknown";
373
+ };
374
+ /**
375
+ * Parse the intermediate definition into Effect Schema source code.
376
+ */
377
+ const parseEffectValidationSchemaDefinition = (input, context, strict, brandName) => {
378
+ if (input.functions.length === 0) return {
379
+ effect: "",
380
+ consts: ""
381
+ };
382
+ let consts = "";
383
+ const appendConstsChunk = (chunk) => {
384
+ if (!chunk) return;
385
+ if (consts.length > 0 && !consts.endsWith("\n") && !chunk.startsWith("\n")) consts += "\n";
386
+ consts += chunk;
387
+ };
388
+ const renderSchema = (definition, isStructProperty) => {
389
+ const { functions } = definition;
390
+ if (functions.length === 0) return "S.Unknown";
391
+ appendConstsChunk(definition.consts.join("\n"));
392
+ const baseType = determineBaseType(functions);
393
+ let base = "";
394
+ const filters = [];
395
+ const wrappers = [];
396
+ for (const [fn, arg] of functions) {
397
+ if (CONSTRUCTORS.has(fn) && !base) {
398
+ base = renderConstructor(fn, arg);
399
+ continue;
400
+ }
401
+ if (FILTERS.has(fn)) {
402
+ filters.push(renderFilter(fn, formatArg(arg), baseType));
403
+ continue;
404
+ }
405
+ if (fn === "nullable" || fn === "nullish" || fn === "optional" || fn === "default" || fn === "describe") {
406
+ wrappers.push([fn, arg]);
407
+ continue;
408
+ }
409
+ }
410
+ if (!base) base = "S.Unknown";
411
+ let out = filters.length > 0 ? `${base}.pipe(${filters.join(", ")})` : base;
412
+ let hasDefault = false;
413
+ let defaultValue;
414
+ let isOptional = false;
415
+ let isNullable = false;
416
+ let isNullish = false;
417
+ let description;
418
+ for (const [fn, arg] of wrappers) switch (fn) {
419
+ case "default":
420
+ hasDefault = true;
421
+ defaultValue = arg;
422
+ break;
423
+ case "optional":
424
+ isOptional = true;
425
+ break;
426
+ case "nullable":
427
+ isNullable = true;
428
+ break;
429
+ case "nullish":
430
+ isNullish = true;
431
+ break;
432
+ case "describe":
433
+ description = arg;
434
+ break;
435
+ }
436
+ if (isNullable || isNullish) out = `S.NullOr(${out})`;
437
+ if (isStructProperty) {
438
+ if (hasDefault) out = `S.optionalWith(${out}, { default: () => ${defaultValue} })`;
439
+ else if (isOptional || isNullish) out = `S.optional(${out})`;
440
+ } else if (isNullish) out = `S.UndefinedOr(${out})`;
441
+ else if (isOptional) out = `S.UndefinedOr(${out})`;
442
+ if (description !== void 0) out = `${out}.annotations({ description: ${description} })`;
443
+ return out;
444
+ };
445
+ const formatArg = (value) => {
446
+ if (value === void 0) return "";
447
+ if (value === null) return "null";
448
+ if (isString(value)) return value;
449
+ if (Array.isArray(value)) return value.map((item) => formatArg(item)).join(", ");
450
+ if (isObject(value)) return stringify(value) ?? "";
451
+ if (isNumber(value) || isBoolean(value)) return `${value}`;
452
+ return "";
453
+ };
454
+ const renderConstructor = (fn, arg) => {
455
+ switch (fn) {
456
+ case "string": return "S.String";
457
+ case "number":
458
+ case "integer": return "S.Number";
459
+ case "boolean": return "S.Boolean";
460
+ case "null": return "S.Null";
461
+ case "unknown": return "S.Unknown";
462
+ case "any": return "S.Any";
463
+ case "date": return "S.DateFromString";
464
+ case "literal": return `S.Literal(${arg})`;
465
+ case "enum": return `S.Literal(${arg.replaceAll(/^\[|\]$/g, "")})`;
466
+ case "instanceof": return `S.instanceOf(${arg})`;
467
+ case "fileOrString": return "S.Union(S.instanceOf(File), S.String)";
468
+ case "array": return `S.Array(${renderSchema(arg, false)})`;
469
+ case "tuple": return `S.Tuple(${arg.map((d) => renderSchema(d, false)).join(", ")})`;
470
+ case "object":
471
+ case "strictObject":
472
+ case "looseObject": {
473
+ const struct = `S.Struct({\n${Object.entries(arg).map(([key, def]) => {
474
+ const value = renderSchema(def, true);
475
+ return ` ${JSON.stringify(key)}: ${value}`;
476
+ }).join(",\n")}\n})`;
477
+ if (fn === "looseObject") return `S.extend(${struct}, S.Record({ key: S.String, value: S.Unknown }))`;
478
+ return struct;
479
+ }
480
+ case "additionalProperties": return `S.Record({ key: S.String, value: ${renderSchema(arg, false)} })`;
481
+ case "oneOf":
482
+ case "anyOf": {
483
+ const args = arg;
484
+ if (args.length === 1) return renderSchema(args[0], false);
485
+ return `S.Union(${args.map((d) => renderSchema(d, false)).join(", ")})`;
486
+ }
487
+ case "allOf": {
488
+ const args = arg;
489
+ if (args.length === 1) return renderSchema(args[0], false);
490
+ return args.map((d) => renderSchema(d, false)).reduce((acc, cur) => `S.extend(${acc}, ${cur})`);
491
+ }
492
+ default: return "S.Unknown";
493
+ }
494
+ };
495
+ appendConstsChunk(input.consts.join("\n"));
496
+ let effect = renderSchema(input, false);
497
+ if (brandName) effect = `${effect}.pipe(S.brand("${brandName}"))`;
498
+ if (consts.includes(",export")) consts = consts.replaceAll(",export", "\nexport");
499
+ return {
500
+ effect,
501
+ consts
502
+ };
503
+ };
504
+ const dereferenceScalar = (value, context) => {
505
+ if (isObject(value)) return dereference(value, context);
506
+ else if (Array.isArray(value)) return value.map((item) => dereferenceScalar(item, context));
507
+ else return value;
508
+ };
509
+ function tryResolveRefSchema($ref, context) {
510
+ try {
511
+ return resolveRef({ $ref }, context).schema;
512
+ } catch (error) {
513
+ logVerbose(`[orval/effect] Failed to resolve $ref "${$ref}":`, error instanceof Error ? error.message : error);
514
+ return;
515
+ }
516
+ }
517
+ const dereference = (schema, context) => {
518
+ const refName = "$ref" in schema ? schema.$ref : void 0;
519
+ if (refName && context.parents?.includes(refName)) return {};
520
+ const childContext = {
521
+ ...context,
522
+ ...refName ? { parents: [...context.parents ?? [], refName] } : void 0
523
+ };
524
+ const resolvedSchema = "$ref" in schema ? (() => {
525
+ const referencedSchema = tryResolveRefSchema(schema.$ref, context);
526
+ if (!referencedSchema || !isObject(referencedSchema)) return;
527
+ const siblingProperties = Object.fromEntries(Object.entries(schema).filter(([key]) => key !== "$ref"));
528
+ return {
529
+ ...referencedSchema,
530
+ ...siblingProperties
531
+ };
532
+ })() : schema;
533
+ if (!resolvedSchema) return {};
534
+ const resolvedContext = childContext;
535
+ return Object.entries(resolvedSchema).reduce((acc, [key, value]) => {
536
+ if (key === "properties" && isObject(value)) acc[key] = Object.entries(value).reduce((props, [propKey, propSchema]) => {
537
+ props[propKey] = dereference(propSchema, resolvedContext);
538
+ return props;
539
+ }, {});
540
+ else if (key === "default" || key === "example" || key === "examples") acc[key] = value;
541
+ else acc[key] = dereferenceScalar(value, resolvedContext);
542
+ return acc;
543
+ }, {});
544
+ };
545
+ const generateFormDataEffectSchema = (schema, context, name, strict, encoding) => {
546
+ const propertyOverrides = {};
547
+ if (schema.properties) for (const key of Object.keys(schema.properties)) {
548
+ const propSchema = schema.properties[key];
549
+ const resolvedPropSchema = propSchema ? dereference(propSchema, context) : void 0;
550
+ const fileType = resolvedPropSchema ? getFormDataFieldFileType(resolvedPropSchema, encoding?.[key]?.contentType) : void 0;
551
+ if (fileType) {
552
+ const isRequired = schema.required?.includes(key);
553
+ const fileFunctions = [fileType === "binary" ? ["instanceof", "File"] : ["fileOrString", void 0]];
554
+ if (!isRequired) fileFunctions.push(["optional", void 0]);
555
+ propertyOverrides[key] = {
556
+ functions: fileFunctions,
557
+ consts: []
558
+ };
559
+ }
560
+ }
561
+ return generateEffectValidationSchemaDefinition(schema, context, name, strict, {
562
+ required: true,
563
+ propertyOverrides: Object.keys(propertyOverrides).length > 0 ? propertyOverrides : void 0
564
+ });
565
+ };
566
+ const parseBodyAndResponse = ({ data, context, name, strict, generate, parseType }) => {
567
+ if (!data || !generate) return {
568
+ input: {
569
+ functions: [],
570
+ consts: []
571
+ },
572
+ isArray: false
573
+ };
574
+ const resolvedRef = resolveRef(data, context).schema;
575
+ const jsonMedia = resolvedRef.content?.["application/json"];
576
+ const formDataMedia = resolvedRef.content?.["multipart/form-data"];
577
+ const [contentType, mediaType] = jsonMedia ? ["application/json", jsonMedia] : formDataMedia ? ["multipart/form-data", formDataMedia] : [void 0, void 0];
578
+ const schema = mediaType?.schema;
579
+ if (!schema) return {
580
+ input: {
581
+ functions: [],
582
+ consts: []
583
+ },
584
+ isArray: false
585
+ };
586
+ const encoding = mediaType.encoding;
587
+ const resolvedJsonSchema = dereference(schema, context);
588
+ if (resolvedJsonSchema.items) {
589
+ const min = resolvedJsonSchema.minimum ?? resolvedJsonSchema.minLength ?? resolvedJsonSchema.minItems;
590
+ const max = resolvedJsonSchema.maximum ?? resolvedJsonSchema.maxLength ?? resolvedJsonSchema.maxItems;
591
+ return {
592
+ input: generateEffectValidationSchemaDefinition(parseType === "body" ? removeReadOnlyProperties(resolvedJsonSchema.items) : resolvedJsonSchema.items, context, name, strict, { required: true }),
593
+ isArray: true,
594
+ rules: {
595
+ ...min === void 0 ? {} : { min },
596
+ ...max === void 0 ? {} : { max }
597
+ }
598
+ };
599
+ }
600
+ const effectiveSchema = parseType === "body" ? removeReadOnlyProperties(resolvedJsonSchema) : resolvedJsonSchema;
601
+ return {
602
+ input: contentType === "multipart/form-data" ? generateFormDataEffectSchema(effectiveSchema, context, name, strict, encoding) : generateEffectValidationSchemaDefinition(effectiveSchema, context, name, strict, { required: true }),
603
+ isArray: false
604
+ };
605
+ };
606
+ const getSingleResponse = (responses) => {
607
+ if (!responses) return;
608
+ return responses["200"] ?? responses["2XX"] ?? responses["2xx"];
609
+ };
610
+ const parseParameters = ({ data, context, operationName, strict, generate }) => {
611
+ if (!data) return {
612
+ headers: {
613
+ functions: [],
614
+ consts: []
615
+ },
616
+ queryParams: {
617
+ functions: [],
618
+ consts: []
619
+ },
620
+ params: {
621
+ functions: [],
622
+ consts: []
623
+ }
624
+ };
625
+ const defs = data.reduce((acc, val) => {
626
+ const { schema: parameter } = resolveRef(val, context);
627
+ if (!parameter.schema) return acc;
628
+ if (!parameter.in || !parameter.name) return acc;
629
+ const resolvedSchema = dereference(parameter.schema, context);
630
+ resolvedSchema.description = parameter.description;
631
+ const mapStrict = {
632
+ path: strict.param,
633
+ query: strict.query,
634
+ header: strict.header
635
+ };
636
+ const mapGenerate = {
637
+ path: generate.param,
638
+ query: generate.query,
639
+ header: generate.header
640
+ };
641
+ if (parameter.in !== "path" && parameter.in !== "query" && parameter.in !== "header") return acc;
642
+ const definition = generateEffectValidationSchemaDefinition(resolvedSchema, context, camel(`${operationName}-${parameter.in}-${parameter.name}`), mapStrict[parameter.in], { required: parameter.required });
643
+ if (parameter.in === "header" && mapGenerate.header) return {
644
+ ...acc,
645
+ headers: {
646
+ ...acc.headers,
647
+ [parameter.name]: definition
648
+ }
649
+ };
650
+ if (parameter.in === "query" && mapGenerate.query) return {
651
+ ...acc,
652
+ queryParams: {
653
+ ...acc.queryParams,
654
+ [parameter.name]: definition
655
+ }
656
+ };
657
+ if (parameter.in === "path" && mapGenerate.path) return {
658
+ ...acc,
659
+ params: {
660
+ ...acc.params,
661
+ [parameter.name]: definition
662
+ }
663
+ };
664
+ return acc;
665
+ }, {
666
+ headers: {},
667
+ queryParams: {},
668
+ params: {}
669
+ });
670
+ const toStruct = (props, isStrict) => {
671
+ if (Object.keys(props).length === 0) return {
672
+ functions: [],
673
+ consts: []
674
+ };
675
+ return {
676
+ functions: [[isStrict ? "strictObject" : "object", props]],
677
+ consts: []
678
+ };
679
+ };
680
+ return {
681
+ headers: toStruct(defs.headers, strict.header),
682
+ queryParams: toStruct(defs.queryParams, strict.query),
683
+ params: toStruct(defs.params, strict.param)
684
+ };
685
+ };
686
+ const generateEffectRoute = ({ operationName, verb, override }, { pathRoute, context }) => {
687
+ const spec = context.spec.paths?.[pathRoute];
688
+ if (spec == void 0) throw new Error(`No such path ${pathRoute} in ${context.projectName}`);
689
+ const parameters = [...spec.parameters ?? [], ...spec[verb]?.parameters ?? []];
690
+ const effectOptions = override.effect;
691
+ const parsedParameters = parseParameters({
692
+ data: parameters,
693
+ context,
694
+ operationName,
695
+ strict: effectOptions.strict,
696
+ generate: effectOptions.generate
697
+ });
698
+ const requestBody = spec[verb]?.requestBody;
699
+ const parsedBody = parseBodyAndResponse({
700
+ data: requestBody,
701
+ context,
702
+ name: camel(`${operationName}-body`),
703
+ strict: effectOptions.strict.body,
704
+ generate: effectOptions.generate.body,
705
+ parseType: "body"
706
+ });
707
+ const responses = effectOptions.generateEachHttpStatus ? Object.entries(spec[verb]?.responses ?? {}) : [["", getSingleResponse(spec[verb]?.responses)]];
708
+ const parsedResponses = responses.map(([code, response]) => parseBodyAndResponse({
709
+ data: response,
710
+ context,
711
+ name: camel(`${operationName}-${code}-response`),
712
+ strict: effectOptions.strict.response,
713
+ generate: effectOptions.generate.response,
714
+ parseType: "response"
715
+ }));
716
+ const pascalOperationName = pascal(operationName);
717
+ const useBrandedTypes = effectOptions.useBrandedTypes;
718
+ const brand = (name) => useBrandedTypes ? name : void 0;
719
+ const inputParams = parseEffectValidationSchemaDefinition(parsedParameters.params, context, effectOptions.strict.param, brand(`${pascalOperationName}Params`));
720
+ const inputQueryParams = parseEffectValidationSchemaDefinition(parsedParameters.queryParams, context, effectOptions.strict.query, brand(`${pascalOperationName}QueryParams`));
721
+ const inputHeaders = parseEffectValidationSchemaDefinition(parsedParameters.headers, context, effectOptions.strict.header, brand(`${pascalOperationName}Header`));
722
+ const inputBody = parseEffectValidationSchemaDefinition(parsedBody.input, context, effectOptions.strict.body, brand(`${pascalOperationName}Body`));
723
+ const inputResponses = parsedResponses.map((parsedResponse, idx) => parseEffectValidationSchemaDefinition(parsedResponse.input, context, effectOptions.strict.response, brand(pascal(`${operationName}-${responses[idx][0]}-response`))));
724
+ if (!inputParams.effect && !inputQueryParams.effect && !inputHeaders.effect && !inputBody.effect && !inputResponses.some((r) => r.effect)) return {
725
+ implementation: "",
726
+ mutators: []
727
+ };
728
+ return {
729
+ implementation: [
730
+ ...inputParams.consts ? [inputParams.consts] : [],
731
+ ...inputParams.effect ? [`export const ${pascalOperationName}Params = ${inputParams.effect}`] : [],
732
+ ...inputQueryParams.consts ? [inputQueryParams.consts] : [],
733
+ ...inputQueryParams.effect ? [`export const ${pascalOperationName}QueryParams = ${inputQueryParams.effect}`] : [],
734
+ ...inputHeaders.consts ? [inputHeaders.consts] : [],
735
+ ...inputHeaders.effect ? [`export const ${pascalOperationName}Header = ${inputHeaders.effect}`] : [],
736
+ ...inputBody.consts ? [inputBody.consts] : [],
737
+ ...inputBody.effect ? [parsedBody.isArray ? `export const ${pascalOperationName}BodyItem = ${inputBody.effect}
738
+ export const ${pascalOperationName}Body = S.Array(${pascalOperationName}BodyItem)${parsedBody.rules?.min ? `.pipe(S.minItems(${parsedBody.rules.min}))` : ""}${parsedBody.rules?.max ? `.pipe(S.maxItems(${parsedBody.rules.max}))` : ""}` : `export const ${pascalOperationName}Body = ${inputBody.effect}`] : [],
739
+ ...inputResponses.flatMap((inputResponse, index) => {
740
+ const operationResponse = pascal(`${operationName}-${responses[index][0]}-response`);
741
+ return [...inputResponse.consts ? [inputResponse.consts] : [], ...inputResponse.effect ? [parsedResponses[index].isArray ? `export const ${operationResponse}Item = ${inputResponse.effect}
742
+ export const ${operationResponse} = S.Array(${operationResponse}Item)${parsedResponses[index].rules?.min ? `.pipe(S.minItems(${parsedResponses[index].rules.min}))` : ""}${parsedResponses[index].rules?.max ? `.pipe(S.maxItems(${parsedResponses[index].rules.max}))` : ""}` : `export const ${operationResponse} = ${inputResponse.effect}`] : []];
743
+ })
744
+ ].join("\n\n"),
745
+ mutators: []
746
+ };
747
+ };
748
+ const generateEffect = (verbOptions, options) => {
749
+ const { implementation, mutators } = generateEffectRoute(verbOptions, options);
750
+ return {
751
+ implementation: implementation ? `${implementation}\n\n` : "",
752
+ imports: [],
753
+ mutators
754
+ };
755
+ };
756
+ const effectClientBuilder = {
757
+ client: generateEffect,
758
+ dependencies: getEffectDependencies
759
+ };
760
+ const builder = () => () => effectClientBuilder;
761
+ //#endregion
762
+ export { builder, builder as default, dereference, generateEffect, generateEffectValidationSchemaDefinition, generateFormDataEffectSchema, getEffectDependencies, parseEffectValidationSchemaDefinition, parseParameters, predefinedEffectFormats };
763
+
764
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable unicorn/no-array-reduce */\n\nimport {\n camel,\n type ClientBuilder,\n type ClientGeneratorsBuilder,\n type ContextSpec,\n escape,\n type GeneratorDependency,\n type GeneratorOptions,\n type GeneratorVerbOptions,\n getFormDataFieldFileType,\n getNumberWord,\n isBoolean,\n isNumber,\n isObject,\n isString,\n jsStringEscape,\n logVerbose,\n type OpenApiParameterObject,\n type OpenApiReferenceObject,\n type OpenApiRequestBodyObject,\n type OpenApiResponseObject,\n type OpenApiSchemaObject,\n pascal,\n resolveRef,\n stringify,\n} from '@orval/core';\nimport { unique } from 'remeda';\n\nconst EFFECT_DEPENDENCIES: GeneratorDependency[] = [\n {\n exports: [\n {\n default: false,\n name: 'Schema',\n syntheticDefaultImport: false,\n namespaceImport: false,\n values: true,\n alias: 'S',\n },\n ],\n dependency: 'effect',\n },\n];\n\nexport const getEffectDependencies = () => EFFECT_DEPENDENCIES;\n\nconst possibleSchemaTypes = new Set([\n 'integer',\n 'number',\n 'string',\n 'boolean',\n 'object',\n 'null',\n 'array',\n]);\n\nexport const predefinedEffectFormats = new Set([\n 'date',\n 'date-time',\n 'email',\n 'uri',\n 'uuid',\n]);\n\ntype ResolvedEffectType =\n | string\n | {\n multiType: string[];\n };\n\nconst resolveEffectType = (schema: OpenApiSchemaObject): ResolvedEffectType => {\n const schemaTypeValue = schema.type as unknown;\n\n if (Array.isArray(schemaTypeValue)) {\n const nonNullTypes = schemaTypeValue\n .filter((t): t is string => isString(t))\n .filter((t) => t !== 'null' && possibleSchemaTypes.has(t))\n .map((t) => (t === 'integer' ? 'number' : t));\n\n if (nonNullTypes.length > 1) {\n return { multiType: nonNullTypes };\n }\n\n const type = nonNullTypes[0];\n\n if (type === 'array' && 'prefixItems' in schema) {\n return 'tuple';\n }\n\n return type;\n }\n\n const type = isString(schemaTypeValue) ? schemaTypeValue : undefined;\n\n if (schema.type === 'array' && 'prefixItems' in schema) {\n return 'tuple';\n }\n\n switch (type) {\n case 'integer': {\n return 'number';\n }\n default: {\n return type ?? 'unknown';\n }\n }\n};\n\nexport interface EffectValidationSchemaDefinition {\n functions: [string, unknown][];\n consts: string[];\n}\n\nconst minAndMaxTypes = new Set(['number', 'string', 'array']);\n\nconst removeReadOnlyProperties = (\n schema: OpenApiSchemaObject,\n): OpenApiSchemaObject => {\n if (schema.properties && isObject(schema.properties)) {\n const filteredProperties: Record<string, OpenApiSchemaObject> = {};\n\n for (const [key, value] of Object.entries(schema.properties)) {\n if (isObject(value) && 'readOnly' in value && value.readOnly) {\n continue;\n }\n filteredProperties[key] = value as OpenApiSchemaObject;\n }\n\n return {\n ...(schema as Record<string, unknown>),\n properties: filteredProperties,\n };\n }\n if (schema.items && isObject(schema.items) && 'properties' in schema.items) {\n return {\n ...(schema as Record<string, unknown>),\n items: removeReadOnlyProperties(schema.items as OpenApiSchemaObject),\n };\n }\n return schema;\n};\n\n/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nexport const generateEffectValidationSchemaDefinition = (\n schema: OpenApiSchemaObject | undefined,\n context: ContextSpec,\n name: string,\n strict: boolean,\n rules?: {\n required?: boolean;\n propertyOverrides?: Record<string, EffectValidationSchemaDefinition>;\n constNameRegistry?: Record<string, number>;\n },\n): EffectValidationSchemaDefinition => {\n if (!schema) return { functions: [], consts: [] };\n\n const consts: string[] = [];\n const constNameRegistry = rules?.constNameRegistry ?? {};\n const constsCounter = isNumber(constNameRegistry[name])\n ? constNameRegistry[name] + 1\n : 0;\n\n const constsCounterValue = constsCounter\n ? pascal(getNumberWord(constsCounter))\n : '';\n\n constNameRegistry[name] = constsCounter;\n\n const functions: [string, unknown][] = [];\n const type = resolveEffectType(schema);\n const required = rules?.required ?? false;\n const hasDefault = schema.default !== undefined;\n const nullable =\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n ('nullable' in schema && schema.nullable) ||\n (Array.isArray(schema.type) && schema.type.includes('null'));\n const min = schema.minimum ?? schema.minLength ?? schema.minItems;\n const max = schema.maximum ?? schema.maxLength ?? schema.maxItems;\n\n const exclusiveMinRaw =\n 'exclusiveMinimum' in schema ? schema.exclusiveMinimum : undefined;\n const exclusiveMaxRaw =\n 'exclusiveMaximum' in schema ? schema.exclusiveMaximum : undefined;\n\n const exclusiveMin =\n isBoolean(exclusiveMinRaw) && exclusiveMinRaw ? min : exclusiveMinRaw;\n const exclusiveMax =\n isBoolean(exclusiveMaxRaw) && exclusiveMaxRaw ? max : exclusiveMaxRaw;\n\n const multipleOf = schema.multipleOf;\n const matches = schema.pattern ?? undefined;\n const hasNonArrayEnum = !!schema.enum && type !== 'array';\n\n let skipSwitchStatement = false;\n if (schema.allOf || schema.oneOf || schema.anyOf) {\n const separator = schema.allOf ? 'allOf' : schema.oneOf ? 'oneOf' : 'anyOf';\n\n const schemas = (schema.allOf ?? schema.oneOf ?? schema.anyOf) as (\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n )[];\n\n const baseSchemas = schemas.map((schema, index) =>\n generateEffectValidationSchemaDefinition(\n schema as OpenApiSchemaObject,\n context,\n `${camel(name)}${pascal(getNumberWord(index + 1))}`,\n strict,\n {\n required: true,\n constNameRegistry,\n },\n ),\n );\n\n if ((schema.allOf || schema.oneOf || schema.anyOf) && schema.properties) {\n const additionalPropertiesSchema = {\n properties: schema.properties,\n required: schema.required,\n additionalProperties: schema.additionalProperties,\n type: schema.type,\n } as OpenApiSchemaObject;\n\n const additionalIndex = baseSchemas.length + 1;\n const additionalPropertiesDefinition =\n generateEffectValidationSchemaDefinition(\n additionalPropertiesSchema,\n context,\n `${camel(name)}${pascal(getNumberWord(additionalIndex))}`,\n strict,\n {\n required: true,\n constNameRegistry,\n },\n );\n\n if (schema.oneOf || schema.anyOf) {\n functions.push([\n 'allOf',\n [\n { functions: [[separator, baseSchemas]], consts: [] },\n additionalPropertiesDefinition,\n ],\n ]);\n } else {\n baseSchemas.push(additionalPropertiesDefinition);\n functions.push([separator, baseSchemas]);\n }\n } else {\n functions.push([separator, baseSchemas]);\n }\n skipSwitchStatement = true;\n }\n\n let defaultVarName: string | undefined;\n if (schema.default !== undefined) {\n defaultVarName = `${name}Default${constsCounterValue}`;\n let defaultValue: string | undefined;\n\n const isDateType =\n schema.type === 'string' &&\n (schema.format === 'date' || schema.format === 'date-time') &&\n context.output.override.useDates;\n\n if (isDateType) {\n defaultValue = `new Date(\"${escape(schema.default)}\")`;\n } else if (isObject(schema.default)) {\n const entries = Object.entries(schema.default)\n .map(([key, value]) => {\n const safeKey = JSON.stringify(key);\n if (isString(value)) {\n return `${safeKey}: \"${escape(value)}\" as const`;\n }\n if (Array.isArray(value)) {\n const arrayItems = value.map((item) =>\n isString(item) ? `\"${escape(item)}\" as const` : `${item}`,\n );\n return `${safeKey}: [${arrayItems.join(', ')}]`;\n }\n if (\n value === null ||\n value === undefined ||\n isNumber(value) ||\n isBoolean(value)\n )\n return `${safeKey}: ${value}`;\n return;\n })\n .filter((entry): entry is string => entry !== undefined)\n .join(', ');\n defaultValue = entries.length === 0 ? `{}` : `{ ${entries} }`;\n } else {\n const rawStringified = stringify(schema.default);\n defaultValue =\n rawStringified === undefined\n ? 'null'\n : rawStringified.replaceAll(\"'\", '`');\n\n const isArrayWithEnumItems =\n Array.isArray(schema.default) &&\n type === 'array' &&\n schema.items &&\n 'enum' in schema.items &&\n schema.default.length > 0;\n\n if (isArrayWithEnumItems) {\n defaultVarName = defaultValue;\n defaultValue = undefined;\n }\n }\n if (defaultValue) {\n consts.push(`export const ${defaultVarName} = ${defaultValue};`);\n }\n }\n\n if (isObject(type) && 'multiType' in type) {\n const types = type.multiType;\n functions.push([\n 'oneOf',\n types.map((t) =>\n generateEffectValidationSchemaDefinition(\n {\n ...(schema as Record<string, unknown>),\n type: t,\n } as OpenApiSchemaObject,\n context,\n name,\n strict,\n {\n required: true,\n constNameRegistry,\n },\n ),\n ),\n ]);\n\n if (!required && nullable) {\n functions.push(['nullish', undefined]);\n } else if (nullable) {\n functions.push(['nullable', undefined]);\n } else if (!required) {\n functions.push(['optional', undefined]);\n }\n\n return { functions, consts };\n }\n\n if (!skipSwitchStatement) {\n switch (type) {\n case 'tuple': {\n if ('prefixItems' in schema) {\n const schema31 = schema as OpenApiSchemaObject;\n const prefixItems = Array.isArray(schema31.prefixItems)\n ? (schema31.prefixItems as (\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n )[])\n : [];\n\n if (prefixItems.length > 0) {\n functions.push([\n 'tuple',\n prefixItems.map((item, idx) =>\n generateEffectValidationSchemaDefinition(\n dereference(item, context),\n context,\n camel(`${name}-${idx}-item`),\n strict,\n {\n required: true,\n constNameRegistry,\n },\n ),\n ),\n ]);\n }\n }\n break;\n }\n case 'array': {\n functions.push([\n 'array',\n generateEffectValidationSchemaDefinition(\n schema.items as OpenApiSchemaObject | undefined,\n context,\n camel(`${name}-item`),\n strict,\n {\n required: true,\n constNameRegistry,\n },\n ),\n ]);\n break;\n }\n case 'string': {\n if (schema.enum) {\n break;\n }\n\n if (\n context.output.override.useDates &&\n (schema.format === 'date' || schema.format === 'date-time')\n ) {\n functions.push(['date', undefined]);\n break;\n }\n\n if (schema.format === 'binary') {\n functions.push(['instanceof', 'File']);\n break;\n }\n\n if (\n schema.contentMediaType === 'application/octet-stream' &&\n !schema.contentEncoding\n ) {\n functions.push(['instanceof', 'File']);\n break;\n }\n\n if ('const' in schema) {\n functions.push(['literal', JSON.stringify(String(schema.const))]);\n } else {\n functions.push([type as string, undefined]);\n }\n\n if (schema.format === 'date') {\n functions.push(['dateFormat', undefined]);\n break;\n }\n\n if (schema.format === 'date-time') {\n functions.push(['dateTimeFormat', undefined]);\n break;\n }\n\n if (schema.format === 'email') {\n functions.push(['email', undefined]);\n break;\n }\n\n if (schema.format === 'uri') {\n functions.push(['url', undefined]);\n break;\n }\n\n if (schema.format === 'uuid') {\n functions.push(['uuid', undefined]);\n break;\n }\n\n break;\n }\n default: {\n const hasProperties = !!schema.properties;\n const properties = schema.properties ?? {};\n const hasDefinedProperties = Object.keys(properties).length > 0;\n const hasAdditionalPropertiesSchema =\n !!schema.additionalProperties &&\n !isBoolean(schema.additionalProperties);\n\n const shouldUseLooseObject =\n type === 'object' &&\n !hasDefinedProperties &&\n schema.additionalProperties === undefined &&\n !hasAdditionalPropertiesSchema;\n\n if (hasProperties && hasDefinedProperties) {\n functions.push([\n strict ? 'strictObject' : 'object',\n Object.keys(properties)\n .map((key) => ({\n [key]:\n rules?.propertyOverrides?.[key] ??\n generateEffectValidationSchemaDefinition(\n properties[key] as OpenApiSchemaObject | undefined,\n context,\n camel(`${name}-${key}`),\n strict,\n {\n required: schema.required?.includes(key),\n constNameRegistry,\n },\n ),\n }))\n .reduce((acc, curr) => ({ ...acc, ...curr }), {}),\n ]);\n\n break;\n }\n\n if (shouldUseLooseObject) {\n functions.push(['looseObject', {}]);\n break;\n }\n\n if (schema.additionalProperties) {\n functions.push([\n 'additionalProperties',\n generateEffectValidationSchemaDefinition(\n isBoolean(schema.additionalProperties)\n ? {}\n : (schema.additionalProperties as OpenApiSchemaObject),\n context,\n name,\n strict,\n {\n required: true,\n constNameRegistry,\n },\n ),\n ]);\n\n break;\n }\n\n if (schema.enum) {\n break;\n }\n\n functions.push([type, undefined]);\n\n break;\n }\n }\n }\n\n if (!hasNonArrayEnum && isString(type) && minAndMaxTypes.has(type)) {\n const shouldUseExclusiveMin = exclusiveMinRaw !== undefined;\n const shouldUseExclusiveMax = exclusiveMaxRaw !== undefined;\n\n if (shouldUseExclusiveMin && exclusiveMin !== undefined) {\n consts.push(\n `export const ${name}ExclusiveMin${constsCounterValue} = ${exclusiveMin};`,\n );\n functions.push(['gt', `${name}ExclusiveMin${constsCounterValue}`]);\n } else if (min !== undefined) {\n if (min === 1) {\n functions.push(['min', `${min}`]);\n } else {\n consts.push(`export const ${name}Min${constsCounterValue} = ${min};`);\n functions.push(['min', `${name}Min${constsCounterValue}`]);\n }\n }\n\n if (shouldUseExclusiveMax && exclusiveMax !== undefined) {\n consts.push(\n `export const ${name}ExclusiveMax${constsCounterValue} = ${exclusiveMax};`,\n );\n functions.push(['lt', `${name}ExclusiveMax${constsCounterValue}`]);\n } else if (max !== undefined) {\n consts.push(`export const ${name}Max${constsCounterValue} = ${max};`);\n functions.push(['max', `${name}Max${constsCounterValue}`]);\n }\n\n if (multipleOf !== undefined) {\n consts.push(\n `export const ${name}MultipleOf${constsCounterValue} = ${multipleOf.toString()};`,\n );\n functions.push(['multipleOf', `${name}MultipleOf${constsCounterValue}`]);\n }\n if (\n exclusiveMin !== undefined ||\n min !== undefined ||\n exclusiveMax !== undefined ||\n multipleOf !== undefined ||\n max !== undefined\n ) {\n consts.push(`\\n`);\n }\n }\n\n if (matches && !hasNonArrayEnum && type === 'string') {\n const isStartWithSlash = matches.startsWith('/');\n const isEndWithSlash = matches.endsWith('/');\n\n const regexp = `new RegExp('${jsStringEscape(\n matches.slice(isStartWithSlash ? 1 : 0, isEndWithSlash ? -1 : undefined),\n )}')`;\n\n consts.push(\n `export const ${name}RegExp${constsCounterValue} = ${regexp};\\n`,\n );\n functions.push(['regex', `${name}RegExp${constsCounterValue}`]);\n }\n\n if (schema.enum && type !== 'array') {\n const uniqueEnumValues = unique(schema.enum);\n\n if (uniqueEnumValues.every((value) => isString(value))) {\n functions.push([\n 'enum',\n `[${uniqueEnumValues.map((value) => `'${escape(value)}'`).join(', ')}]`,\n ]);\n } else {\n functions.push([\n 'oneOf',\n uniqueEnumValues.map((value) => ({\n functions: [\n ['literal', isString(value) ? `'${escape(value)}'` : value],\n ],\n consts: [],\n })),\n ]);\n }\n }\n\n if (!required && nullable) {\n functions.push(['nullish', undefined]);\n } else if (nullable) {\n functions.push(['nullable', undefined]);\n } else if (!required && !hasDefault) {\n functions.push(['optional', undefined]);\n }\n\n if (hasDefault) {\n functions.push(['default', defaultVarName]);\n }\n\n if (schema.description) {\n functions.push(['describe', `'${jsStringEscape(schema.description)}'`]);\n }\n\n return { functions, consts: unique(consts) };\n};\n\n/**\n * Categorize a function name so the parser can decide how to render it\n * (constructor base, pipe filter, or schema wrapper).\n */\nconst CONSTRUCTORS = new Set([\n 'string',\n 'number',\n 'integer',\n 'boolean',\n 'null',\n 'unknown',\n 'any',\n 'array',\n 'tuple',\n 'object',\n 'strictObject',\n 'looseObject',\n 'additionalProperties',\n 'literal',\n 'enum',\n 'oneOf',\n 'anyOf',\n 'allOf',\n 'instanceof',\n 'fileOrString',\n 'date',\n]);\n\nconst FILTERS = new Set([\n 'min',\n 'max',\n 'gt',\n 'lt',\n 'multipleOf',\n 'regex',\n 'email',\n 'uuid',\n 'url',\n 'dateFormat',\n 'dateTimeFormat',\n]);\n\n/**\n * Renders a single filter for a `.pipe(...)` group, choosing the right\n * Effect Schema function based on the base type (string/number/array).\n */\nconst renderFilter = (\n fn: string,\n arg: string,\n baseType: 'string' | 'number' | 'array' | 'unknown',\n): string => {\n switch (fn) {\n case 'min': {\n if (baseType === 'string') return `S.minLength(${arg})`;\n if (baseType === 'array') return `S.minItems(${arg})`;\n return `S.greaterThanOrEqualTo(${arg})`;\n }\n case 'max': {\n if (baseType === 'string') return `S.maxLength(${arg})`;\n if (baseType === 'array') return `S.maxItems(${arg})`;\n return `S.lessThanOrEqualTo(${arg})`;\n }\n case 'gt': {\n return `S.greaterThan(${arg})`;\n }\n case 'lt': {\n return `S.lessThan(${arg})`;\n }\n case 'multipleOf': {\n return `S.multipleOf(${arg})`;\n }\n case 'regex': {\n return `S.pattern(${arg})`;\n }\n case 'email': {\n return String.raw`S.pattern(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)`;\n }\n case 'uuid': {\n return `S.pattern(/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/)`;\n }\n case 'url': {\n return String.raw`S.pattern(/^https?:\\/\\/.+/)`;\n }\n case 'dateFormat': {\n return String.raw`S.pattern(/^\\d{4}-\\d{2}-\\d{2}$/)`;\n }\n case 'dateTimeFormat': {\n return String.raw`S.pattern(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:?\\d{2})?$/)`;\n }\n default: {\n return '';\n }\n }\n};\n\nconst determineBaseType = (\n functions: [string, unknown][],\n): 'string' | 'number' | 'array' | 'unknown' => {\n for (const [fn] of functions) {\n if (fn === 'string') return 'string';\n if (fn === 'number' || fn === 'integer') return 'number';\n if (fn === 'array') return 'array';\n }\n return 'unknown';\n};\n\nexport interface ParseEffectOptions {\n /**\n * When emitting inside a Struct property, wrap optionals/defaults with\n * `S.optional` / `S.optionalWith` so they describe an optional field\n * rather than `T | undefined`.\n */\n asStructProperty?: boolean;\n brandName?: string;\n}\n\n/**\n * Parse the intermediate definition into Effect Schema source code.\n */\nexport const parseEffectValidationSchemaDefinition = (\n input: EffectValidationSchemaDefinition,\n context: ContextSpec,\n strict: boolean,\n brandName?: string,\n): { effect: string; consts: string } => {\n if (input.functions.length === 0) {\n return { effect: '', consts: '' };\n }\n\n let consts = '';\n\n const appendConstsChunk = (chunk: string) => {\n if (!chunk) return;\n if (\n consts.length > 0 &&\n !consts.endsWith('\\n') &&\n !chunk.startsWith('\\n')\n ) {\n consts += '\\n';\n }\n consts += chunk;\n };\n\n const renderSchema = (\n definition: EffectValidationSchemaDefinition,\n isStructProperty: boolean,\n ): string => {\n const { functions } = definition;\n if (functions.length === 0) return 'S.Unknown';\n\n appendConstsChunk(definition.consts.join('\\n'));\n\n const baseType = determineBaseType(functions);\n let base = '';\n const filters: string[] = [];\n const wrappers: [\n 'nullable' | 'nullish' | 'optional' | 'default' | 'describe',\n unknown,\n ][] = [];\n\n for (const [fn, arg] of functions) {\n if (CONSTRUCTORS.has(fn) && !base) {\n base = renderConstructor(fn, arg);\n continue;\n }\n if (FILTERS.has(fn)) {\n filters.push(renderFilter(fn, formatArg(arg), baseType));\n continue;\n }\n if (\n fn === 'nullable' ||\n fn === 'nullish' ||\n fn === 'optional' ||\n fn === 'default' ||\n fn === 'describe'\n ) {\n wrappers.push([fn, arg]);\n continue;\n }\n // Unknown function — emit as a comment-free no-op (skip).\n }\n\n if (!base) base = 'S.Unknown';\n\n let out = filters.length > 0 ? `${base}.pipe(${filters.join(', ')})` : base;\n\n let hasDefault = false;\n let defaultValue: unknown;\n let isOptional = false;\n let isNullable = false;\n let isNullish = false;\n let description: unknown;\n\n for (const [fn, arg] of wrappers) {\n switch (fn) {\n case 'default': {\n hasDefault = true;\n defaultValue = arg;\n\n break;\n }\n case 'optional': {\n isOptional = true;\n\n break;\n }\n case 'nullable': {\n isNullable = true;\n\n break;\n }\n case 'nullish': {\n isNullish = true;\n\n break;\n }\n case 'describe': {\n description = arg;\n\n break;\n }\n // No default\n }\n }\n\n if (isNullable || isNullish) {\n out = `S.NullOr(${out})`;\n }\n\n if (isStructProperty) {\n if (hasDefault) {\n out = `S.optionalWith(${out}, { default: () => ${defaultValue as string} })`;\n } else if (isOptional || isNullish) {\n out = `S.optional(${out})`;\n }\n } else {\n if (isNullish) {\n out = `S.UndefinedOr(${out})`;\n } else if (isOptional) {\n out = `S.UndefinedOr(${out})`;\n }\n }\n\n if (description !== undefined) {\n out = `${out}.annotations({ description: ${description as string} })`;\n }\n\n return out;\n };\n\n const formatArg = (value: unknown): string => {\n if (value === undefined) return '';\n if (value === null) return 'null';\n if (isString(value)) return value;\n if (Array.isArray(value)) {\n return value.map((item) => formatArg(item)).join(', ');\n }\n if (isObject(value)) return stringify(value) ?? '';\n if (isNumber(value) || isBoolean(value)) return `${value}`;\n return '';\n };\n\n const renderConstructor = (fn: string, arg: unknown): string => {\n switch (fn) {\n case 'string': {\n return 'S.String';\n }\n case 'number':\n case 'integer': {\n return 'S.Number';\n }\n case 'boolean': {\n return 'S.Boolean';\n }\n case 'null': {\n return 'S.Null';\n }\n case 'unknown': {\n return 'S.Unknown';\n }\n case 'any': {\n return 'S.Any';\n }\n case 'date': {\n return 'S.DateFromString';\n }\n case 'literal': {\n return `S.Literal(${arg as string})`;\n }\n case 'enum': {\n // arg is \"[ 'a', 'b' ]\" — strip brackets to spread as Literal args\n return `S.Literal(${(arg as string).replaceAll(/^\\[|\\]$/g, '')})`;\n }\n case 'instanceof': {\n return `S.instanceOf(${arg as string})`;\n }\n case 'fileOrString': {\n return 'S.Union(S.instanceOf(File), S.String)';\n }\n case 'array': {\n const inner = renderSchema(\n arg as EffectValidationSchemaDefinition,\n false,\n );\n return `S.Array(${inner})`;\n }\n case 'tuple': {\n const items = (arg as EffectValidationSchemaDefinition[])\n .map((d) => renderSchema(d, false))\n .join(', ');\n return `S.Tuple(${items})`;\n }\n case 'object':\n case 'strictObject':\n case 'looseObject': {\n const props = arg as Record<string, EffectValidationSchemaDefinition>;\n const entries = Object.entries(props).map(([key, def]) => {\n const value = renderSchema(def, true);\n return ` ${JSON.stringify(key)}: ${value}`;\n });\n const struct = `S.Struct({\\n${entries.join(',\\n')}\\n})`;\n if (fn === 'looseObject') {\n return `S.extend(${struct}, S.Record({ key: S.String, value: S.Unknown }))`;\n }\n return struct;\n }\n case 'additionalProperties': {\n const inner = renderSchema(\n arg as EffectValidationSchemaDefinition,\n false,\n );\n return `S.Record({ key: S.String, value: ${inner} })`;\n }\n case 'oneOf':\n case 'anyOf': {\n const args = arg as EffectValidationSchemaDefinition[];\n if (args.length === 1) {\n return renderSchema(args[0], false);\n }\n const items = args.map((d) => renderSchema(d, false)).join(', ');\n return `S.Union(${items})`;\n }\n case 'allOf': {\n const args = arg as EffectValidationSchemaDefinition[];\n if (args.length === 1) {\n return renderSchema(args[0], false);\n }\n // S.extend takes pairs; chain via reduce.\n return args\n .map((d) => renderSchema(d, false))\n .reduce((acc, cur) => `S.extend(${acc}, ${cur})`);\n }\n default: {\n return 'S.Unknown';\n }\n }\n };\n\n appendConstsChunk(input.consts.join('\\n'));\n\n let effect = renderSchema(input, false);\n\n if (brandName) {\n effect = `${effect}.pipe(S.brand(\"${brandName}\"))`;\n }\n\n if (consts.includes(',export')) {\n consts = consts.replaceAll(',export', '\\nexport');\n }\n\n // Silence the unused-strict warning — strict is consumed inside the tree\n // generator and threaded through here for future use.\n void strict;\n void context;\n\n return { effect, consts };\n};\n\nconst dereferenceScalar = (value: unknown, context: ContextSpec): unknown => {\n if (isObject(value)) {\n return dereference(\n value as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n );\n } else if (Array.isArray(value)) {\n return value.map((item) => dereferenceScalar(item, context));\n } else {\n return value;\n }\n};\n\nfunction tryResolveRefSchema(\n $ref: string,\n context: ContextSpec,\n): OpenApiSchemaObject | undefined {\n try {\n return resolveRef({ $ref } as OpenApiReferenceObject, context)\n .schema as OpenApiSchemaObject;\n } catch (error) {\n logVerbose(\n `[orval/effect] Failed to resolve $ref \"${$ref}\":`,\n error instanceof Error ? error.message : error,\n );\n return;\n }\n}\n\nexport const dereference = (\n schema: OpenApiSchemaObject | OpenApiReferenceObject,\n context: ContextSpec,\n): OpenApiSchemaObject => {\n const refName = '$ref' in schema ? schema.$ref : undefined;\n if (refName && context.parents?.includes(refName)) {\n return {};\n }\n\n const childContext: ContextSpec = {\n ...context,\n ...(refName\n ? { parents: [...(context.parents ?? []), refName] }\n : undefined),\n };\n\n const resolvedSchema: OpenApiSchemaObject | undefined =\n '$ref' in schema\n ? (() => {\n const referencedSchema = tryResolveRefSchema(schema.$ref, context);\n if (!referencedSchema || !isObject(referencedSchema)) {\n return;\n }\n const siblingProperties = Object.fromEntries(\n Object.entries(schema as Record<string, unknown>).filter(\n ([key]) => key !== '$ref',\n ),\n );\n return {\n ...(referencedSchema as Record<string, unknown>),\n ...siblingProperties,\n } as OpenApiSchemaObject;\n })()\n : schema;\n\n if (!resolvedSchema) {\n return {};\n }\n\n const resolvedContext = childContext;\n\n return Object.entries(resolvedSchema).reduce<Record<string, unknown>>(\n (acc, [key, value]) => {\n if (key === 'properties' && isObject(value)) {\n acc[key] = Object.entries(value).reduce<\n Record<string, OpenApiSchemaObject>\n >((props, [propKey, propSchema]) => {\n props[propKey] = dereference(\n propSchema as OpenApiSchemaObject | OpenApiReferenceObject,\n resolvedContext,\n );\n return props;\n }, {});\n } else if (key === 'default' || key === 'example' || key === 'examples') {\n acc[key] = value;\n } else {\n acc[key] = dereferenceScalar(value, resolvedContext);\n }\n return acc;\n },\n {},\n ) as OpenApiSchemaObject;\n};\n\nexport const generateFormDataEffectSchema = (\n schema: OpenApiSchemaObject,\n context: ContextSpec,\n name: string,\n strict: boolean,\n encoding?: Record<string, { contentType?: string }>,\n): EffectValidationSchemaDefinition => {\n const propertyOverrides: Record<string, EffectValidationSchemaDefinition> =\n {};\n\n if (schema.properties) {\n for (const key of Object.keys(schema.properties)) {\n const propSchema = schema.properties[key];\n const resolvedPropSchema = propSchema\n ? dereference(\n propSchema as OpenApiSchemaObject | OpenApiReferenceObject,\n context,\n )\n : undefined;\n\n const fileType = resolvedPropSchema\n ? getFormDataFieldFileType(\n resolvedPropSchema,\n encoding?.[key]?.contentType,\n )\n : undefined;\n\n if (fileType) {\n const isRequired = schema.required?.includes(key);\n const fileFunctions: [string, unknown][] = [\n fileType === 'binary'\n ? ['instanceof', 'File']\n : ['fileOrString', undefined],\n ];\n if (!isRequired) {\n fileFunctions.push(['optional', undefined]);\n }\n propertyOverrides[key] = { functions: fileFunctions, consts: [] };\n }\n }\n }\n\n return generateEffectValidationSchemaDefinition(\n schema,\n context,\n name,\n strict,\n {\n required: true,\n propertyOverrides:\n Object.keys(propertyOverrides).length > 0\n ? propertyOverrides\n : undefined,\n },\n );\n};\n\nconst parseBodyAndResponse = ({\n data,\n context,\n name,\n strict,\n generate,\n parseType,\n}: {\n data:\n | OpenApiResponseObject\n | OpenApiRequestBodyObject\n | OpenApiReferenceObject\n | undefined;\n context: ContextSpec;\n name: string;\n strict: boolean;\n generate: boolean;\n parseType: 'body' | 'response';\n}): {\n input: EffectValidationSchemaDefinition;\n isArray: boolean;\n rules?: { min?: number; max?: number };\n} => {\n if (!data || !generate) {\n return { input: { functions: [], consts: [] }, isArray: false };\n }\n\n const resolvedRef = resolveRef(data, context).schema as\n | OpenApiResponseObject\n | OpenApiRequestBodyObject;\n\n const jsonMedia = resolvedRef.content?.['application/json'];\n const formDataMedia = resolvedRef.content?.['multipart/form-data'];\n const [contentType, mediaType] = jsonMedia\n ? (['application/json', jsonMedia] as const)\n : formDataMedia\n ? (['multipart/form-data', formDataMedia] as const)\n : [undefined, undefined];\n\n const schema = mediaType?.schema;\n if (!schema) {\n return { input: { functions: [], consts: [] }, isArray: false };\n }\n\n const encoding = mediaType.encoding;\n const resolvedJsonSchema = dereference(schema, context);\n\n if (resolvedJsonSchema.items) {\n const min =\n resolvedJsonSchema.minimum ??\n resolvedJsonSchema.minLength ??\n resolvedJsonSchema.minItems;\n const max =\n resolvedJsonSchema.maximum ??\n resolvedJsonSchema.maxLength ??\n resolvedJsonSchema.maxItems;\n\n return {\n input: generateEffectValidationSchemaDefinition(\n parseType === 'body'\n ? removeReadOnlyProperties(\n resolvedJsonSchema.items as OpenApiSchemaObject,\n )\n : (resolvedJsonSchema.items as OpenApiSchemaObject),\n context,\n name,\n strict,\n { required: true },\n ),\n isArray: true,\n rules: {\n ...(min === undefined ? {} : { min }),\n ...(max === undefined ? {} : { max }),\n },\n };\n }\n\n const effectiveSchema =\n parseType === 'body'\n ? removeReadOnlyProperties(resolvedJsonSchema)\n : resolvedJsonSchema;\n\n const isFormData = contentType === 'multipart/form-data';\n\n return {\n input: isFormData\n ? generateFormDataEffectSchema(\n effectiveSchema,\n context,\n name,\n strict,\n encoding,\n )\n : generateEffectValidationSchemaDefinition(\n effectiveSchema,\n context,\n name,\n strict,\n { required: true },\n ),\n isArray: false,\n };\n};\n\nconst getSingleResponse = (\n responses:\n | Record<string, OpenApiResponseObject | OpenApiReferenceObject | undefined>\n | undefined,\n) => {\n if (!responses) return;\n return responses['200'] ?? responses['2XX'] ?? responses['2xx'];\n};\n\n/* eslint-enable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nexport const parseParameters = ({\n data,\n context,\n operationName,\n strict,\n generate,\n}: {\n data: (OpenApiParameterObject | OpenApiReferenceObject)[] | undefined;\n context: ContextSpec;\n operationName: string;\n strict: {\n param: boolean;\n query: boolean;\n header: boolean;\n body: boolean;\n response: boolean;\n };\n generate: {\n param: boolean;\n query: boolean;\n header: boolean;\n body: boolean;\n response: boolean;\n };\n}): {\n headers: EffectValidationSchemaDefinition;\n queryParams: EffectValidationSchemaDefinition;\n params: EffectValidationSchemaDefinition;\n} => {\n if (!data) {\n return {\n headers: { functions: [], consts: [] },\n queryParams: { functions: [], consts: [] },\n params: { functions: [], consts: [] },\n };\n }\n\n const initialDefinitionsByParameters: Record<\n 'headers' | 'queryParams' | 'params',\n Record<string, EffectValidationSchemaDefinition>\n > = { headers: {}, queryParams: {}, params: {} };\n\n const defs = data.reduce((acc, val) => {\n const { schema: parameter }: { schema: OpenApiParameterObject } =\n resolveRef(val, context);\n\n if (!parameter.schema) return acc;\n if (!parameter.in || !parameter.name) return acc;\n\n const resolvedSchema = dereference(parameter.schema, context);\n resolvedSchema.description = parameter.description;\n\n const mapStrict = {\n path: strict.param,\n query: strict.query,\n header: strict.header,\n };\n const mapGenerate = {\n path: generate.param,\n query: generate.query,\n header: generate.header,\n };\n\n if (\n parameter.in !== 'path' &&\n parameter.in !== 'query' &&\n parameter.in !== 'header'\n ) {\n return acc;\n }\n\n const definition = generateEffectValidationSchemaDefinition(\n resolvedSchema,\n context,\n camel(`${operationName}-${parameter.in}-${parameter.name}`),\n mapStrict[parameter.in],\n { required: parameter.required },\n );\n\n if (parameter.in === 'header' && mapGenerate.header) {\n return {\n ...acc,\n headers: { ...acc.headers, [parameter.name]: definition },\n };\n }\n if (parameter.in === 'query' && mapGenerate.query) {\n return {\n ...acc,\n queryParams: { ...acc.queryParams, [parameter.name]: definition },\n };\n }\n if (parameter.in === 'path' && mapGenerate.path) {\n return {\n ...acc,\n params: { ...acc.params, [parameter.name]: definition },\n };\n }\n return acc;\n }, initialDefinitionsByParameters);\n\n const toStruct = (\n props: Record<string, EffectValidationSchemaDefinition>,\n isStrict: boolean,\n ): EffectValidationSchemaDefinition => {\n if (Object.keys(props).length === 0) {\n return { functions: [], consts: [] };\n }\n return {\n functions: [[isStrict ? 'strictObject' : 'object', props]],\n consts: [],\n };\n };\n\n return {\n headers: toStruct(defs.headers, strict.header),\n queryParams: toStruct(defs.queryParams, strict.query),\n params: toStruct(defs.params, strict.param),\n };\n};\n\nconst generateEffectRoute = (\n { operationName, verb, override }: GeneratorVerbOptions,\n { pathRoute, context }: GeneratorOptions,\n) => {\n const spec = context.spec.paths?.[pathRoute];\n\n if (spec == undefined) {\n throw new Error(`No such path ${pathRoute} in ${context.projectName}`);\n }\n\n const parameters = [\n ...(spec.parameters ?? []),\n ...(spec[verb]?.parameters ?? []),\n ];\n const effectOptions = override.effect;\n\n const parsedParameters = parseParameters({\n data: parameters,\n context,\n operationName,\n strict: effectOptions.strict,\n generate: effectOptions.generate,\n });\n\n const requestBody = spec[verb]?.requestBody;\n const parsedBody = parseBodyAndResponse({\n data: requestBody,\n context,\n name: camel(`${operationName}-body`),\n strict: effectOptions.strict.body,\n generate: effectOptions.generate.body,\n parseType: 'body',\n });\n\n const responses = (\n effectOptions.generateEachHttpStatus\n ? Object.entries(spec[verb]?.responses ?? {})\n : [['', getSingleResponse(spec[verb]?.responses)]]\n ) as [string, OpenApiResponseObject | OpenApiReferenceObject][];\n const parsedResponses = responses.map(([code, response]) =>\n parseBodyAndResponse({\n data: response,\n context,\n name: camel(`${operationName}-${code}-response`),\n strict: effectOptions.strict.response,\n generate: effectOptions.generate.response,\n parseType: 'response',\n }),\n );\n\n const pascalOperationName = pascal(operationName);\n const useBrandedTypes = effectOptions.useBrandedTypes;\n const brand = (name: string) => (useBrandedTypes ? name : undefined);\n\n const inputParams = parseEffectValidationSchemaDefinition(\n parsedParameters.params,\n context,\n effectOptions.strict.param,\n brand(`${pascalOperationName}Params`),\n );\n const inputQueryParams = parseEffectValidationSchemaDefinition(\n parsedParameters.queryParams,\n context,\n effectOptions.strict.query,\n brand(`${pascalOperationName}QueryParams`),\n );\n const inputHeaders = parseEffectValidationSchemaDefinition(\n parsedParameters.headers,\n context,\n effectOptions.strict.header,\n brand(`${pascalOperationName}Header`),\n );\n const inputBody = parseEffectValidationSchemaDefinition(\n parsedBody.input,\n context,\n effectOptions.strict.body,\n brand(`${pascalOperationName}Body`),\n );\n const inputResponses = parsedResponses.map((parsedResponse, idx) =>\n parseEffectValidationSchemaDefinition(\n parsedResponse.input,\n context,\n effectOptions.strict.response,\n brand(pascal(`${operationName}-${responses[idx][0]}-response`)),\n ),\n );\n\n if (\n !inputParams.effect &&\n !inputQueryParams.effect &&\n !inputHeaders.effect &&\n !inputBody.effect &&\n !inputResponses.some((r) => r.effect)\n ) {\n return { implementation: '', mutators: [] };\n }\n\n return {\n implementation: [\n ...(inputParams.consts ? [inputParams.consts] : []),\n ...(inputParams.effect\n ? [`export const ${pascalOperationName}Params = ${inputParams.effect}`]\n : []),\n ...(inputQueryParams.consts ? [inputQueryParams.consts] : []),\n ...(inputQueryParams.effect\n ? [\n `export const ${pascalOperationName}QueryParams = ${inputQueryParams.effect}`,\n ]\n : []),\n ...(inputHeaders.consts ? [inputHeaders.consts] : []),\n ...(inputHeaders.effect\n ? [`export const ${pascalOperationName}Header = ${inputHeaders.effect}`]\n : []),\n ...(inputBody.consts ? [inputBody.consts] : []),\n ...(inputBody.effect\n ? [\n parsedBody.isArray\n ? `export const ${pascalOperationName}BodyItem = ${inputBody.effect}\nexport const ${pascalOperationName}Body = S.Array(${pascalOperationName}BodyItem)${\n parsedBody.rules?.min\n ? `.pipe(S.minItems(${parsedBody.rules.min}))`\n : ''\n }${\n parsedBody.rules?.max\n ? `.pipe(S.maxItems(${parsedBody.rules.max}))`\n : ''\n }`\n : `export const ${pascalOperationName}Body = ${inputBody.effect}`,\n ]\n : []),\n ...inputResponses.flatMap((inputResponse, index) => {\n const operationResponse = pascal(\n `${operationName}-${responses[index][0]}-response`,\n );\n return [\n ...(inputResponse.consts ? [inputResponse.consts] : []),\n ...(inputResponse.effect\n ? [\n parsedResponses[index].isArray\n ? `export const ${operationResponse}Item = ${inputResponse.effect}\nexport const ${operationResponse} = S.Array(${operationResponse}Item)${\n parsedResponses[index].rules?.min\n ? `.pipe(S.minItems(${parsedResponses[index].rules.min}))`\n : ''\n }${\n parsedResponses[index].rules?.max\n ? `.pipe(S.maxItems(${parsedResponses[index].rules.max}))`\n : ''\n }`\n : `export const ${operationResponse} = ${inputResponse.effect}`,\n ]\n : []),\n ];\n }),\n ].join('\\n\\n'),\n mutators: [],\n };\n};\n\nexport const generateEffect: ClientBuilder = (verbOptions, options) => {\n const { implementation, mutators } = generateEffectRoute(\n verbOptions,\n options,\n );\n\n return {\n implementation: implementation ? `${implementation}\\n\\n` : '',\n imports: [],\n mutators,\n };\n};\n\nconst effectClientBuilder: ClientGeneratorsBuilder = {\n client: generateEffect,\n dependencies: getEffectDependencies,\n};\n\nexport const builder = () => () => effectClientBuilder;\n\nexport default builder;\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@orval/effect",
3
+ "version": "8.14.0",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/orval-labs/orval.git",
8
+ "directory": "packages/effect"
9
+ },
10
+ "homepage": "https://orval.dev/docs/guides/effect",
11
+ "bugs": {
12
+ "url": "https://github.com/orval-labs/orval/issues"
13
+ },
14
+ "type": "module",
15
+ "types": "./dist/index.d.mts",
16
+ "exports": {
17
+ ".": {
18
+ "development": "./src/index.ts",
19
+ "default": "./dist/index.mjs"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "!dist/**/*.d.ts.map",
26
+ "!dist/**/*.d.mts.map"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsdown --config-loader unrun",
30
+ "dev": "tsdown --config-loader unrun --watch src",
31
+ "lint": "eslint .",
32
+ "test": "vitest",
33
+ "typecheck": "tsc --noEmit",
34
+ "clean": "rimraf .turbo dist",
35
+ "nuke": "rimraf .turbo dist node_modules"
36
+ },
37
+ "dependencies": {
38
+ "@orval/core": "8.14.0",
39
+ "remeda": "^2.33.6"
40
+ },
41
+ "devDependencies": {
42
+ "eslint": "10.1.0",
43
+ "rimraf": "6.1.2",
44
+ "tsdown": "0.21.9",
45
+ "typescript": "5.9.3",
46
+ "vitest": "4.0.18"
47
+ },
48
+ "publishConfig": {
49
+ "exports": {
50
+ ".": "./dist/index.mjs",
51
+ "./package.json": "./package.json"
52
+ }
53
+ }
54
+ }