@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 +67 -0
- package/dist/index.d.mts +68 -0
- package/dist/index.mjs +764 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +54 -0
package/README.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
[](https://badge.fury.io/js/orval)
|
|
2
|
+
[](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
|
package/dist/index.d.mts
ADDED
|
@@ -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":";;;AA8BA,MAAM,sBAA6C,CACjD;CACE,SAAS,CACP;EACE,SAAS;EACT,MAAM;EACN,wBAAwB;EACxB,iBAAiB;EACjB,QAAQ;EACR,OAAO;EACR,CACF;CACD,YAAY;CACb,CACF;AAED,MAAa,8BAA8B;AAE3C,MAAM,sBAAsB,IAAI,IAAI;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAa,0BAA0B,IAAI,IAAI;CAC7C;CACA;CACA;CACA;CACA;CACD,CAAC;AAQF,MAAM,qBAAqB,WAAoD;CAC7E,MAAM,kBAAkB,OAAO;AAE/B,KAAI,MAAM,QAAQ,gBAAgB,EAAE;EAClC,MAAM,eAAe,gBAClB,QAAQ,MAAmB,SAAS,EAAE,CAAC,CACvC,QAAQ,MAAM,MAAM,UAAU,oBAAoB,IAAI,EAAE,CAAC,CACzD,KAAK,MAAO,MAAM,YAAY,WAAW,EAAG;AAE/C,MAAI,aAAa,SAAS,EACxB,QAAO,EAAE,WAAW,cAAc;EAGpC,MAAM,OAAO,aAAa;AAE1B,MAAI,SAAS,WAAW,iBAAiB,OACvC,QAAO;AAGT,SAAO;;CAGT,MAAM,OAAO,SAAS,gBAAgB,GAAG,kBAAkB,KAAA;AAE3D,KAAI,OAAO,SAAS,WAAW,iBAAiB,OAC9C,QAAO;AAGT,SAAQ,MAAR;EACE,KAAK,UACH,QAAO;EAET,QACE,QAAO,QAAQ;;;AAUrB,MAAM,iBAAiB,IAAI,IAAI;CAAC;CAAU;CAAU;CAAQ,CAAC;AAE7D,MAAM,4BACJ,WACwB;AACxB,KAAI,OAAO,cAAc,SAAS,OAAO,WAAW,EAAE;EACpD,MAAM,qBAA0D,EAAE;AAElE,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,WAAW,EAAE;AAC5D,OAAI,SAAS,MAAM,IAAI,cAAc,SAAS,MAAM,SAClD;AAEF,sBAAmB,OAAO;;AAG5B,SAAO;GACL,GAAI;GACJ,YAAY;GACb;;AAEH,KAAI,OAAO,SAAS,SAAS,OAAO,MAAM,IAAI,gBAAgB,OAAO,MACnE,QAAO;EACL,GAAI;EACJ,OAAO,yBAAyB,OAAO,MAA6B;EACrE;AAEH,QAAO;;AAKT,MAAa,4CACX,QACA,SACA,MACA,QACA,UAKqC;AACrC,KAAI,CAAC,OAAQ,QAAO;EAAE,WAAW,EAAE;EAAE,QAAQ,EAAE;EAAE;CAEjD,MAAM,SAAmB,EAAE;CAC3B,MAAM,oBAAoB,OAAO,qBAAqB,EAAE;CACxD,MAAM,gBAAgB,SAAS,kBAAkB,MAAM,GACnD,kBAAkB,QAAQ,IAC1B;CAEJ,MAAM,qBAAqB,gBACvB,OAAO,cAAc,cAAc,CAAC,GACpC;AAEJ,mBAAkB,QAAQ;CAE1B,MAAM,YAAiC,EAAE;CACzC,MAAM,OAAO,kBAAkB,OAAO;CACtC,MAAM,WAAW,OAAO,YAAY;CACpC,MAAM,aAAa,OAAO,YAAY,KAAA;CACtC,MAAM,WAEH,cAAc,UAAU,OAAO,YAC/B,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,KAAK,SAAS,OAAO;CAC7D,MAAM,MAAM,OAAO,WAAW,OAAO,aAAa,OAAO;CACzD,MAAM,MAAM,OAAO,WAAW,OAAO,aAAa,OAAO;CAEzD,MAAM,kBACJ,sBAAsB,SAAS,OAAO,mBAAmB,KAAA;CAC3D,MAAM,kBACJ,sBAAsB,SAAS,OAAO,mBAAmB,KAAA;CAE3D,MAAM,eACJ,UAAU,gBAAgB,IAAI,kBAAkB,MAAM;CACxD,MAAM,eACJ,UAAU,gBAAgB,IAAI,kBAAkB,MAAM;CAExD,MAAM,aAAa,OAAO;CAC1B,MAAM,UAAU,OAAO,WAAW,KAAA;CAClC,MAAM,kBAAkB,CAAC,CAAC,OAAO,QAAQ,SAAS;CAElD,IAAI,sBAAsB;AAC1B,KAAI,OAAO,SAAS,OAAO,SAAS,OAAO,OAAO;EAChD,MAAM,YAAY,OAAO,QAAQ,UAAU,OAAO,QAAQ,UAAU;EAOpE,MAAM,eALW,OAAO,SAAS,OAAO,SAAS,OAAO,OAK5B,KAAK,QAAQ,UACvC,yCACE,QACA,SACA,GAAG,MAAM,KAAK,GAAG,OAAO,cAAc,QAAQ,EAAE,CAAC,IACjD,QACA;GACE,UAAU;GACV;GACD,CACF,CACF;AAED,OAAK,OAAO,SAAS,OAAO,SAAS,OAAO,UAAU,OAAO,YAAY;GACvE,MAAM,6BAA6B;IACjC,YAAY,OAAO;IACnB,UAAU,OAAO;IACjB,sBAAsB,OAAO;IAC7B,MAAM,OAAO;IACd;GAED,MAAM,kBAAkB,YAAY,SAAS;GAC7C,MAAM,iCACJ,yCACE,4BACA,SACA,GAAG,MAAM,KAAK,GAAG,OAAO,cAAc,gBAAgB,CAAC,IACvD,QACA;IACE,UAAU;IACV;IACD,CACF;AAEH,OAAI,OAAO,SAAS,OAAO,MACzB,WAAU,KAAK,CACb,SACA,CACE;IAAE,WAAW,CAAC,CAAC,WAAW,YAAY,CAAC;IAAE,QAAQ,EAAE;IAAE,EACrD,+BACD,CACF,CAAC;QACG;AACL,gBAAY,KAAK,+BAA+B;AAChD,cAAU,KAAK,CAAC,WAAW,YAAY,CAAC;;QAG1C,WAAU,KAAK,CAAC,WAAW,YAAY,CAAC;AAE1C,wBAAsB;;CAGxB,IAAI;AACJ,KAAI,OAAO,YAAY,KAAA,GAAW;AAChC,mBAAiB,GAAG,KAAK,SAAS;EAClC,IAAI;AAOJ,MAJE,OAAO,SAAS,aACf,OAAO,WAAW,UAAU,OAAO,WAAW,gBAC/C,QAAQ,OAAO,SAAS,SAGxB,gBAAe,aAAa,OAAO,OAAO,QAAQ,CAAC;WAC1C,SAAS,OAAO,QAAQ,EAAE;GACnC,MAAM,UAAU,OAAO,QAAQ,OAAO,QAAQ,CAC3C,KAAK,CAAC,KAAK,WAAW;IACrB,MAAM,UAAU,KAAK,UAAU,IAAI;AACnC,QAAI,SAAS,MAAM,CACjB,QAAO,GAAG,QAAQ,KAAK,OAAO,MAAM,CAAC;AAEvC,QAAI,MAAM,QAAQ,MAAM,CAItB,QAAO,GAAG,QAAQ,KAHC,MAAM,KAAK,SAC5B,SAAS,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC,cAAc,GAAG,OACpD,CACiC,KAAK,KAAK,CAAC;AAE/C,QACE,UAAU,QACV,UAAU,KAAA,KACV,SAAS,MAAM,IACf,UAAU,MAAM,CAEhB,QAAO,GAAG,QAAQ,IAAI;KAExB,CACD,QAAQ,UAA2B,UAAU,KAAA,EAAU,CACvD,KAAK,KAAK;AACb,kBAAe,QAAQ,WAAW,IAAI,OAAO,KAAK,QAAQ;SACrD;GACL,MAAM,iBAAiB,UAAU,OAAO,QAAQ;AAChD,kBACE,mBAAmB,KAAA,IACf,SACA,eAAe,WAAW,KAAK,IAAI;AASzC,OANE,MAAM,QAAQ,OAAO,QAAQ,IAC7B,SAAS,WACT,OAAO,SACP,UAAU,OAAO,SACjB,OAAO,QAAQ,SAAS,GAEA;AACxB,qBAAiB;AACjB,mBAAe,KAAA;;;AAGnB,MAAI,aACF,QAAO,KAAK,gBAAgB,eAAe,KAAK,aAAa,GAAG;;AAIpE,KAAI,SAAS,KAAK,IAAI,eAAe,MAAM;EACzC,MAAM,QAAQ,KAAK;AACnB,YAAU,KAAK,CACb,SACA,MAAM,KAAK,MACT,yCACE;GACE,GAAI;GACJ,MAAM;GACP,EACD,SACA,MACA,QACA;GACE,UAAU;GACV;GACD,CACF,CACF,CACF,CAAC;AAEF,MAAI,CAAC,YAAY,SACf,WAAU,KAAK,CAAC,WAAW,KAAA,EAAU,CAAC;WAC7B,SACT,WAAU,KAAK,CAAC,YAAY,KAAA,EAAU,CAAC;WAC9B,CAAC,SACV,WAAU,KAAK,CAAC,YAAY,KAAA,EAAU,CAAC;AAGzC,SAAO;GAAE;GAAW;GAAQ;;AAG9B,KAAI,CAAC,oBACH,SAAQ,MAAR;EACE,KAAK;AACH,OAAI,iBAAiB,QAAQ;IAC3B,MAAM,WAAW;IACjB,MAAM,cAAc,MAAM,QAAQ,SAAS,YAAY,GAClD,SAAS,cAIV,EAAE;AAEN,QAAI,YAAY,SAAS,EACvB,WAAU,KAAK,CACb,SACA,YAAY,KAAK,MAAM,QACrB,yCACE,YAAY,MAAM,QAAQ,EAC1B,SACA,MAAM,GAAG,KAAK,GAAG,IAAI,OAAO,EAC5B,QACA;KACE,UAAU;KACV;KACD,CACF,CACF,CACF,CAAC;;AAGN;EAEF,KAAK;AACH,aAAU,KAAK,CACb,SACA,yCACE,OAAO,OACP,SACA,MAAM,GAAG,KAAK,OAAO,EACrB,QACA;IACE,UAAU;IACV;IACD,CACF,CACF,CAAC;AACF;EAEF,KAAK;AACH,OAAI,OAAO,KACT;AAGF,OACE,QAAQ,OAAO,SAAS,aACvB,OAAO,WAAW,UAAU,OAAO,WAAW,cAC/C;AACA,cAAU,KAAK,CAAC,QAAQ,KAAA,EAAU,CAAC;AACnC;;AAGF,OAAI,OAAO,WAAW,UAAU;AAC9B,cAAU,KAAK,CAAC,cAAc,OAAO,CAAC;AACtC;;AAGF,OACE,OAAO,qBAAqB,8BAC5B,CAAC,OAAO,iBACR;AACA,cAAU,KAAK,CAAC,cAAc,OAAO,CAAC;AACtC;;AAGF,OAAI,WAAW,OACb,WAAU,KAAK,CAAC,WAAW,KAAK,UAAU,OAAO,OAAO,MAAM,CAAC,CAAC,CAAC;OAEjE,WAAU,KAAK,CAAC,MAAgB,KAAA,EAAU,CAAC;AAG7C,OAAI,OAAO,WAAW,QAAQ;AAC5B,cAAU,KAAK,CAAC,cAAc,KAAA,EAAU,CAAC;AACzC;;AAGF,OAAI,OAAO,WAAW,aAAa;AACjC,cAAU,KAAK,CAAC,kBAAkB,KAAA,EAAU,CAAC;AAC7C;;AAGF,OAAI,OAAO,WAAW,SAAS;AAC7B,cAAU,KAAK,CAAC,SAAS,KAAA,EAAU,CAAC;AACpC;;AAGF,OAAI,OAAO,WAAW,OAAO;AAC3B,cAAU,KAAK,CAAC,OAAO,KAAA,EAAU,CAAC;AAClC;;AAGF,OAAI,OAAO,WAAW,QAAQ;AAC5B,cAAU,KAAK,CAAC,QAAQ,KAAA,EAAU,CAAC;AACnC;;AAGF;EAEF,SAAS;GACP,MAAM,gBAAgB,CAAC,CAAC,OAAO;GAC/B,MAAM,aAAa,OAAO,cAAc,EAAE;GAC1C,MAAM,uBAAuB,OAAO,KAAK,WAAW,CAAC,SAAS;GAC9D,MAAM,gCACJ,CAAC,CAAC,OAAO,wBACT,CAAC,UAAU,OAAO,qBAAqB;GAEzC,MAAM,uBACJ,SAAS,YACT,CAAC,wBACD,OAAO,yBAAyB,KAAA,KAChC,CAAC;AAEH,OAAI,iBAAiB,sBAAsB;AACzC,cAAU,KAAK,CACb,SAAS,iBAAiB,UAC1B,OAAO,KAAK,WAAW,CACpB,KAAK,SAAS,GACZ,MACC,OAAO,oBAAoB,QAC3B,yCACE,WAAW,MACX,SACA,MAAM,GAAG,KAAK,GAAG,MAAM,EACvB,QACA;KACE,UAAU,OAAO,UAAU,SAAS,IAAI;KACxC;KACD,CACF,EACJ,EAAE,CACF,QAAQ,KAAK,UAAU;KAAE,GAAG;KAAK,GAAG;KAAM,GAAG,EAAE,CAAC,CACpD,CAAC;AAEF;;AAGF,OAAI,sBAAsB;AACxB,cAAU,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;AACnC;;AAGF,OAAI,OAAO,sBAAsB;AAC/B,cAAU,KAAK,CACb,wBACA,yCACE,UAAU,OAAO,qBAAqB,GAClC,EAAE,GACD,OAAO,sBACZ,SACA,MACA,QACA;KACE,UAAU;KACV;KACD,CACF,CACF,CAAC;AAEF;;AAGF,OAAI,OAAO,KACT;AAGF,aAAU,KAAK,CAAC,MAAM,KAAA,EAAU,CAAC;AAEjC;;;AAKN,KAAI,CAAC,mBAAmB,SAAS,KAAK,IAAI,eAAe,IAAI,KAAK,EAAE;EAClE,MAAM,wBAAwB,oBAAoB,KAAA;EAClD,MAAM,wBAAwB,oBAAoB,KAAA;AAElD,MAAI,yBAAyB,iBAAiB,KAAA,GAAW;AACvD,UAAO,KACL,gBAAgB,KAAK,cAAc,mBAAmB,KAAK,aAAa,GACzE;AACD,aAAU,KAAK,CAAC,MAAM,GAAG,KAAK,cAAc,qBAAqB,CAAC;aACzD,QAAQ,KAAA,EACjB,KAAI,QAAQ,EACV,WAAU,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;OAC5B;AACL,UAAO,KAAK,gBAAgB,KAAK,KAAK,mBAAmB,KAAK,IAAI,GAAG;AACrE,aAAU,KAAK,CAAC,OAAO,GAAG,KAAK,KAAK,qBAAqB,CAAC;;AAI9D,MAAI,yBAAyB,iBAAiB,KAAA,GAAW;AACvD,UAAO,KACL,gBAAgB,KAAK,cAAc,mBAAmB,KAAK,aAAa,GACzE;AACD,aAAU,KAAK,CAAC,MAAM,GAAG,KAAK,cAAc,qBAAqB,CAAC;aACzD,QAAQ,KAAA,GAAW;AAC5B,UAAO,KAAK,gBAAgB,KAAK,KAAK,mBAAmB,KAAK,IAAI,GAAG;AACrE,aAAU,KAAK,CAAC,OAAO,GAAG,KAAK,KAAK,qBAAqB,CAAC;;AAG5D,MAAI,eAAe,KAAA,GAAW;AAC5B,UAAO,KACL,gBAAgB,KAAK,YAAY,mBAAmB,KAAK,WAAW,UAAU,CAAC,GAChF;AACD,aAAU,KAAK,CAAC,cAAc,GAAG,KAAK,YAAY,qBAAqB,CAAC;;AAE1E,MACE,iBAAiB,KAAA,KACjB,QAAQ,KAAA,KACR,iBAAiB,KAAA,KACjB,eAAe,KAAA,KACf,QAAQ,KAAA,EAER,QAAO,KAAK,KAAK;;AAIrB,KAAI,WAAW,CAAC,mBAAmB,SAAS,UAAU;EACpD,MAAM,mBAAmB,QAAQ,WAAW,IAAI;EAChD,MAAM,iBAAiB,QAAQ,SAAS,IAAI;EAE5C,MAAM,SAAS,eAAe,eAC5B,QAAQ,MAAM,mBAAmB,IAAI,GAAG,iBAAiB,KAAK,KAAA,EAAU,CACzE,CAAC;AAEF,SAAO,KACL,gBAAgB,KAAK,QAAQ,mBAAmB,KAAK,OAAO,KAC7D;AACD,YAAU,KAAK,CAAC,SAAS,GAAG,KAAK,QAAQ,qBAAqB,CAAC;;AAGjE,KAAI,OAAO,QAAQ,SAAS,SAAS;EACnC,MAAM,mBAAmB,OAAO,OAAO,KAAK;AAE5C,MAAI,iBAAiB,OAAO,UAAU,SAAS,MAAM,CAAC,CACpD,WAAU,KAAK,CACb,QACA,IAAI,iBAAiB,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GACtE,CAAC;MAEF,WAAU,KAAK,CACb,SACA,iBAAiB,KAAK,WAAW;GAC/B,WAAW,CACT,CAAC,WAAW,SAAS,MAAM,GAAG,IAAI,OAAO,MAAM,CAAC,KAAK,MAAM,CAC5D;GACD,QAAQ,EAAE;GACX,EAAE,CACJ,CAAC;;AAIN,KAAI,CAAC,YAAY,SACf,WAAU,KAAK,CAAC,WAAW,KAAA,EAAU,CAAC;UAC7B,SACT,WAAU,KAAK,CAAC,YAAY,KAAA,EAAU,CAAC;UAC9B,CAAC,YAAY,CAAC,WACvB,WAAU,KAAK,CAAC,YAAY,KAAA,EAAU,CAAC;AAGzC,KAAI,WACF,WAAU,KAAK,CAAC,WAAW,eAAe,CAAC;AAG7C,KAAI,OAAO,YACT,WAAU,KAAK,CAAC,YAAY,IAAI,eAAe,OAAO,YAAY,CAAC,GAAG,CAAC;AAGzE,QAAO;EAAE;EAAW,QAAQ,OAAO,OAAO;EAAE;;;;;;AAO9C,MAAM,eAAe,IAAI,IAAI;CAC3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,UAAU,IAAI,IAAI;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;AAMF,MAAM,gBACJ,IACA,KACA,aACW;AACX,SAAQ,IAAR;EACE,KAAK;AACH,OAAI,aAAa,SAAU,QAAO,eAAe,IAAI;AACrD,OAAI,aAAa,QAAS,QAAO,cAAc,IAAI;AACnD,UAAO,0BAA0B,IAAI;EAEvC,KAAK;AACH,OAAI,aAAa,SAAU,QAAO,eAAe,IAAI;AACrD,OAAI,aAAa,QAAS,QAAO,cAAc,IAAI;AACnD,UAAO,uBAAuB,IAAI;EAEpC,KAAK,KACH,QAAO,iBAAiB,IAAI;EAE9B,KAAK,KACH,QAAO,cAAc,IAAI;EAE3B,KAAK,aACH,QAAO,gBAAgB,IAAI;EAE7B,KAAK,QACH,QAAO,aAAa,IAAI;EAE1B,KAAK,QACH,QAAO,OAAO,GAAG;EAEnB,KAAK,OACH,QAAO;EAET,KAAK,MACH,QAAO,OAAO,GAAG;EAEnB,KAAK,aACH,QAAO,OAAO,GAAG;EAEnB,KAAK,iBACH,QAAO,OAAO,GAAG;EAEnB,QACE,QAAO;;;AAKb,MAAM,qBACJ,cAC8C;AAC9C,MAAK,MAAM,CAAC,OAAO,WAAW;AAC5B,MAAI,OAAO,SAAU,QAAO;AAC5B,MAAI,OAAO,YAAY,OAAO,UAAW,QAAO;AAChD,MAAI,OAAO,QAAS,QAAO;;AAE7B,QAAO;;;;;AAgBT,MAAa,yCACX,OACA,SACA,QACA,cACuC;AACvC,KAAI,MAAM,UAAU,WAAW,EAC7B,QAAO;EAAE,QAAQ;EAAI,QAAQ;EAAI;CAGnC,IAAI,SAAS;CAEb,MAAM,qBAAqB,UAAkB;AAC3C,MAAI,CAAC,MAAO;AACZ,MACE,OAAO,SAAS,KAChB,CAAC,OAAO,SAAS,KAAK,IACtB,CAAC,MAAM,WAAW,KAAK,CAEvB,WAAU;AAEZ,YAAU;;CAGZ,MAAM,gBACJ,YACA,qBACW;EACX,MAAM,EAAE,cAAc;AACtB,MAAI,UAAU,WAAW,EAAG,QAAO;AAEnC,oBAAkB,WAAW,OAAO,KAAK,KAAK,CAAC;EAE/C,MAAM,WAAW,kBAAkB,UAAU;EAC7C,IAAI,OAAO;EACX,MAAM,UAAoB,EAAE;EAC5B,MAAM,WAGA,EAAE;AAER,OAAK,MAAM,CAAC,IAAI,QAAQ,WAAW;AACjC,OAAI,aAAa,IAAI,GAAG,IAAI,CAAC,MAAM;AACjC,WAAO,kBAAkB,IAAI,IAAI;AACjC;;AAEF,OAAI,QAAQ,IAAI,GAAG,EAAE;AACnB,YAAQ,KAAK,aAAa,IAAI,UAAU,IAAI,EAAE,SAAS,CAAC;AACxD;;AAEF,OACE,OAAO,cACP,OAAO,aACP,OAAO,cACP,OAAO,aACP,OAAO,YACP;AACA,aAAS,KAAK,CAAC,IAAI,IAAI,CAAC;AACxB;;;AAKJ,MAAI,CAAC,KAAM,QAAO;EAElB,IAAI,MAAM,QAAQ,SAAS,IAAI,GAAG,KAAK,QAAQ,QAAQ,KAAK,KAAK,CAAC,KAAK;EAEvE,IAAI,aAAa;EACjB,IAAI;EACJ,IAAI,aAAa;EACjB,IAAI,aAAa;EACjB,IAAI,YAAY;EAChB,IAAI;AAEJ,OAAK,MAAM,CAAC,IAAI,QAAQ,SACtB,SAAQ,IAAR;GACE,KAAK;AACH,iBAAa;AACb,mBAAe;AAEf;GAEF,KAAK;AACH,iBAAa;AAEb;GAEF,KAAK;AACH,iBAAa;AAEb;GAEF,KAAK;AACH,gBAAY;AAEZ;GAEF,KAAK;AACH,kBAAc;AAEd;;AAMN,MAAI,cAAc,UAChB,OAAM,YAAY,IAAI;AAGxB,MAAI;OACE,WACF,OAAM,kBAAkB,IAAI,qBAAqB,aAAuB;YAC/D,cAAc,UACvB,OAAM,cAAc,IAAI;aAGtB,UACF,OAAM,iBAAiB,IAAI;WAClB,WACT,OAAM,iBAAiB,IAAI;AAI/B,MAAI,gBAAgB,KAAA,EAClB,OAAM,GAAG,IAAI,8BAA8B,YAAsB;AAGnE,SAAO;;CAGT,MAAM,aAAa,UAA2B;AAC5C,MAAI,UAAU,KAAA,EAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,SAAS,MAAM,CAAE,QAAO;AAC5B,MAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,SAAS,UAAU,KAAK,CAAC,CAAC,KAAK,KAAK;AAExD,MAAI,SAAS,MAAM,CAAE,QAAO,UAAU,MAAM,IAAI;AAChD,MAAI,SAAS,MAAM,IAAI,UAAU,MAAM,CAAE,QAAO,GAAG;AACnD,SAAO;;CAGT,MAAM,qBAAqB,IAAY,QAAyB;AAC9D,UAAQ,IAAR;GACE,KAAK,SACH,QAAO;GAET,KAAK;GACL,KAAK,UACH,QAAO;GAET,KAAK,UACH,QAAO;GAET,KAAK,OACH,QAAO;GAET,KAAK,UACH,QAAO;GAET,KAAK,MACH,QAAO;GAET,KAAK,OACH,QAAO;GAET,KAAK,UACH,QAAO,aAAa,IAAc;GAEpC,KAAK,OAEH,QAAO,aAAc,IAAe,WAAW,YAAY,GAAG,CAAC;GAEjE,KAAK,aACH,QAAO,gBAAgB,IAAc;GAEvC,KAAK,eACH,QAAO;GAET,KAAK,QAKH,QAAO,WAJO,aACZ,KACA,MACD,CACuB;GAE1B,KAAK,QAIH,QAAO,WAHQ,IACZ,KAAK,MAAM,aAAa,GAAG,MAAM,CAAC,CAClC,KAAK,KAAK,CACW;GAE1B,KAAK;GACL,KAAK;GACL,KAAK,eAAe;IAMlB,MAAM,SAAS,eAJC,OAAO,QADT,IACuB,CAAC,KAAK,CAAC,KAAK,SAAS;KACxD,MAAM,QAAQ,aAAa,KAAK,KAAK;AACrC,YAAO,KAAK,KAAK,UAAU,IAAI,CAAC,IAAI;MACpC,CACoC,KAAK,MAAM,CAAC;AAClD,QAAI,OAAO,cACT,QAAO,YAAY,OAAO;AAE5B,WAAO;;GAET,KAAK,uBAKH,QAAO,oCAJO,aACZ,KACA,MACD,CACgD;GAEnD,KAAK;GACL,KAAK,SAAS;IACZ,MAAM,OAAO;AACb,QAAI,KAAK,WAAW,EAClB,QAAO,aAAa,KAAK,IAAI,MAAM;AAGrC,WAAO,WADO,KAAK,KAAK,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,KAAK,KAAK,CACxC;;GAE1B,KAAK,SAAS;IACZ,MAAM,OAAO;AACb,QAAI,KAAK,WAAW,EAClB,QAAO,aAAa,KAAK,IAAI,MAAM;AAGrC,WAAO,KACJ,KAAK,MAAM,aAAa,GAAG,MAAM,CAAC,CAClC,QAAQ,KAAK,QAAQ,YAAY,IAAI,IAAI,IAAI,GAAG;;GAErD,QACE,QAAO;;;AAKb,mBAAkB,MAAM,OAAO,KAAK,KAAK,CAAC;CAE1C,IAAI,SAAS,aAAa,OAAO,MAAM;AAEvC,KAAI,UACF,UAAS,GAAG,OAAO,iBAAiB,UAAU;AAGhD,KAAI,OAAO,SAAS,UAAU,CAC5B,UAAS,OAAO,WAAW,WAAW,WAAW;AAQnD,QAAO;EAAE;EAAQ;EAAQ;;AAG3B,MAAM,qBAAqB,OAAgB,YAAkC;AAC3E,KAAI,SAAS,MAAM,CACjB,QAAO,YACL,OACA,QACD;UACQ,MAAM,QAAQ,MAAM,CAC7B,QAAO,MAAM,KAAK,SAAS,kBAAkB,MAAM,QAAQ,CAAC;KAE5D,QAAO;;AAIX,SAAS,oBACP,MACA,SACiC;AACjC,KAAI;AACF,SAAO,WAAW,EAAE,MAAM,EAA4B,QAAQ,CAC3D;UACI,OAAO;AACd,aACE,0CAA0C,KAAK,KAC/C,iBAAiB,QAAQ,MAAM,UAAU,MAC1C;AACD;;;AAIJ,MAAa,eACX,QACA,YACwB;CACxB,MAAM,UAAU,UAAU,SAAS,OAAO,OAAO,KAAA;AACjD,KAAI,WAAW,QAAQ,SAAS,SAAS,QAAQ,CAC/C,QAAO,EAAE;CAGX,MAAM,eAA4B;EAChC,GAAG;EACH,GAAI,UACA,EAAE,SAAS,CAAC,GAAI,QAAQ,WAAW,EAAE,EAAG,QAAQ,EAAE,GAClD,KAAA;EACL;CAED,MAAM,iBACJ,UAAU,gBACC;EACL,MAAM,mBAAmB,oBAAoB,OAAO,MAAM,QAAQ;AAClE,MAAI,CAAC,oBAAoB,CAAC,SAAS,iBAAiB,CAClD;EAEF,MAAM,oBAAoB,OAAO,YAC/B,OAAO,QAAQ,OAAkC,CAAC,QAC/C,CAAC,SAAS,QAAQ,OACpB,CACF;AACD,SAAO;GACL,GAAI;GACJ,GAAG;GACJ;KACC,GACJ;AAEN,KAAI,CAAC,eACH,QAAO,EAAE;CAGX,MAAM,kBAAkB;AAExB,QAAO,OAAO,QAAQ,eAAe,CAAC,QACnC,KAAK,CAAC,KAAK,WAAW;AACrB,MAAI,QAAQ,gBAAgB,SAAS,MAAM,CACzC,KAAI,OAAO,OAAO,QAAQ,MAAM,CAAC,QAE9B,OAAO,CAAC,SAAS,gBAAgB;AAClC,SAAM,WAAW,YACf,YACA,gBACD;AACD,UAAO;KACN,EAAE,CAAC;WACG,QAAQ,aAAa,QAAQ,aAAa,QAAQ,WAC3D,KAAI,OAAO;MAEX,KAAI,OAAO,kBAAkB,OAAO,gBAAgB;AAEtD,SAAO;IAET,EAAE,CACH;;AAGH,MAAa,gCACX,QACA,SACA,MACA,QACA,aACqC;CACrC,MAAM,oBACJ,EAAE;AAEJ,KAAI,OAAO,WACT,MAAK,MAAM,OAAO,OAAO,KAAK,OAAO,WAAW,EAAE;EAChD,MAAM,aAAa,OAAO,WAAW;EACrC,MAAM,qBAAqB,aACvB,YACE,YACA,QACD,GACD,KAAA;EAEJ,MAAM,WAAW,qBACb,yBACE,oBACA,WAAW,MAAM,YAClB,GACD,KAAA;AAEJ,MAAI,UAAU;GACZ,MAAM,aAAa,OAAO,UAAU,SAAS,IAAI;GACjD,MAAM,gBAAqC,CACzC,aAAa,WACT,CAAC,cAAc,OAAO,GACtB,CAAC,gBAAgB,KAAA,EAAU,CAChC;AACD,OAAI,CAAC,WACH,eAAc,KAAK,CAAC,YAAY,KAAA,EAAU,CAAC;AAE7C,qBAAkB,OAAO;IAAE,WAAW;IAAe,QAAQ,EAAE;IAAE;;;AAKvE,QAAO,yCACL,QACA,SACA,MACA,QACA;EACE,UAAU;EACV,mBACE,OAAO,KAAK,kBAAkB,CAAC,SAAS,IACpC,oBACA,KAAA;EACP,CACF;;AAGH,MAAM,wBAAwB,EAC5B,MACA,SACA,MACA,QACA,UACA,gBAgBG;AACH,KAAI,CAAC,QAAQ,CAAC,SACZ,QAAO;EAAE,OAAO;GAAE,WAAW,EAAE;GAAE,QAAQ,EAAE;GAAE;EAAE,SAAS;EAAO;CAGjE,MAAM,cAAc,WAAW,MAAM,QAAQ,CAAC;CAI9C,MAAM,YAAY,YAAY,UAAU;CACxC,MAAM,gBAAgB,YAAY,UAAU;CAC5C,MAAM,CAAC,aAAa,aAAa,YAC5B,CAAC,oBAAoB,UAAU,GAChC,gBACG,CAAC,uBAAuB,cAAc,GACvC,CAAC,KAAA,GAAW,KAAA,EAAU;CAE5B,MAAM,SAAS,WAAW;AAC1B,KAAI,CAAC,OACH,QAAO;EAAE,OAAO;GAAE,WAAW,EAAE;GAAE,QAAQ,EAAE;GAAE;EAAE,SAAS;EAAO;CAGjE,MAAM,WAAW,UAAU;CAC3B,MAAM,qBAAqB,YAAY,QAAQ,QAAQ;AAEvD,KAAI,mBAAmB,OAAO;EAC5B,MAAM,MACJ,mBAAmB,WACnB,mBAAmB,aACnB,mBAAmB;EACrB,MAAM,MACJ,mBAAmB,WACnB,mBAAmB,aACnB,mBAAmB;AAErB,SAAO;GACL,OAAO,yCACL,cAAc,SACV,yBACE,mBAAmB,MACpB,GACA,mBAAmB,OACxB,SACA,MACA,QACA,EAAE,UAAU,MAAM,CACnB;GACD,SAAS;GACT,OAAO;IACL,GAAI,QAAQ,KAAA,IAAY,EAAE,GAAG,EAAE,KAAK;IACpC,GAAI,QAAQ,KAAA,IAAY,EAAE,GAAG,EAAE,KAAK;IACrC;GACF;;CAGH,MAAM,kBACJ,cAAc,SACV,yBAAyB,mBAAmB,GAC5C;AAIN,QAAO;EACL,OAHiB,gBAAgB,wBAI7B,6BACE,iBACA,SACA,MACA,QACA,SACD,GACD,yCACE,iBACA,SACA,MACA,QACA,EAAE,UAAU,MAAM,CACnB;EACL,SAAS;EACV;;AAGH,MAAM,qBACJ,cAGG;AACH,KAAI,CAAC,UAAW;AAChB,QAAO,UAAU,UAAU,UAAU,UAAU,UAAU;;AAK3D,MAAa,mBAAmB,EAC9B,MACA,SACA,eACA,QACA,eAuBG;AACH,KAAI,CAAC,KACH,QAAO;EACL,SAAS;GAAE,WAAW,EAAE;GAAE,QAAQ,EAAE;GAAE;EACtC,aAAa;GAAE,WAAW,EAAE;GAAE,QAAQ,EAAE;GAAE;EAC1C,QAAQ;GAAE,WAAW,EAAE;GAAE,QAAQ,EAAE;GAAE;EACtC;CAQH,MAAM,OAAO,KAAK,QAAQ,KAAK,QAAQ;EACrC,MAAM,EAAE,QAAQ,cACd,WAAW,KAAK,QAAQ;AAE1B,MAAI,CAAC,UAAU,OAAQ,QAAO;AAC9B,MAAI,CAAC,UAAU,MAAM,CAAC,UAAU,KAAM,QAAO;EAE7C,MAAM,iBAAiB,YAAY,UAAU,QAAQ,QAAQ;AAC7D,iBAAe,cAAc,UAAU;EAEvC,MAAM,YAAY;GAChB,MAAM,OAAO;GACb,OAAO,OAAO;GACd,QAAQ,OAAO;GAChB;EACD,MAAM,cAAc;GAClB,MAAM,SAAS;GACf,OAAO,SAAS;GAChB,QAAQ,SAAS;GAClB;AAED,MACE,UAAU,OAAO,UACjB,UAAU,OAAO,WACjB,UAAU,OAAO,SAEjB,QAAO;EAGT,MAAM,aAAa,yCACjB,gBACA,SACA,MAAM,GAAG,cAAc,GAAG,UAAU,GAAG,GAAG,UAAU,OAAO,EAC3D,UAAU,UAAU,KACpB,EAAE,UAAU,UAAU,UAAU,CACjC;AAED,MAAI,UAAU,OAAO,YAAY,YAAY,OAC3C,QAAO;GACL,GAAG;GACH,SAAS;IAAE,GAAG,IAAI;KAAU,UAAU,OAAO;IAAY;GAC1D;AAEH,MAAI,UAAU,OAAO,WAAW,YAAY,MAC1C,QAAO;GACL,GAAG;GACH,aAAa;IAAE,GAAG,IAAI;KAAc,UAAU,OAAO;IAAY;GAClE;AAEH,MAAI,UAAU,OAAO,UAAU,YAAY,KACzC,QAAO;GACL,GAAG;GACH,QAAQ;IAAE,GAAG,IAAI;KAAS,UAAU,OAAO;IAAY;GACxD;AAEH,SAAO;IAzDL;EAAE,SAAS,EAAE;EAAE,aAAa,EAAE;EAAE,QAAQ,EAAE;EAAE,CA0Dd;CAElC,MAAM,YACJ,OACA,aACqC;AACrC,MAAI,OAAO,KAAK,MAAM,CAAC,WAAW,EAChC,QAAO;GAAE,WAAW,EAAE;GAAE,QAAQ,EAAE;GAAE;AAEtC,SAAO;GACL,WAAW,CAAC,CAAC,WAAW,iBAAiB,UAAU,MAAM,CAAC;GAC1D,QAAQ,EAAE;GACX;;AAGH,QAAO;EACL,SAAS,SAAS,KAAK,SAAS,OAAO,OAAO;EAC9C,aAAa,SAAS,KAAK,aAAa,OAAO,MAAM;EACrD,QAAQ,SAAS,KAAK,QAAQ,OAAO,MAAM;EAC5C;;AAGH,MAAM,uBACJ,EAAE,eAAe,MAAM,YACvB,EAAE,WAAW,cACV;CACH,MAAM,OAAO,QAAQ,KAAK,QAAQ;AAElC,KAAI,QAAQ,KAAA,EACV,OAAM,IAAI,MAAM,gBAAgB,UAAU,MAAM,QAAQ,cAAc;CAGxE,MAAM,aAAa,CACjB,GAAI,KAAK,cAAc,EAAE,EACzB,GAAI,KAAK,OAAO,cAAc,EAAE,CACjC;CACD,MAAM,gBAAgB,SAAS;CAE/B,MAAM,mBAAmB,gBAAgB;EACvC,MAAM;EACN;EACA;EACA,QAAQ,cAAc;EACtB,UAAU,cAAc;EACzB,CAAC;CAEF,MAAM,cAAc,KAAK,OAAO;CAChC,MAAM,aAAa,qBAAqB;EACtC,MAAM;EACN;EACA,MAAM,MAAM,GAAG,cAAc,OAAO;EACpC,QAAQ,cAAc,OAAO;EAC7B,UAAU,cAAc,SAAS;EACjC,WAAW;EACZ,CAAC;CAEF,MAAM,YACJ,cAAc,yBACV,OAAO,QAAQ,KAAK,OAAO,aAAa,EAAE,CAAC,GAC3C,CAAC,CAAC,IAAI,kBAAkB,KAAK,OAAO,UAAU,CAAC,CAAC;CAEtD,MAAM,kBAAkB,UAAU,KAAK,CAAC,MAAM,cAC5C,qBAAqB;EACnB,MAAM;EACN;EACA,MAAM,MAAM,GAAG,cAAc,GAAG,KAAK,WAAW;EAChD,QAAQ,cAAc,OAAO;EAC7B,UAAU,cAAc,SAAS;EACjC,WAAW;EACZ,CAAC,CACH;CAED,MAAM,sBAAsB,OAAO,cAAc;CACjD,MAAM,kBAAkB,cAAc;CACtC,MAAM,SAAS,SAAkB,kBAAkB,OAAO,KAAA;CAE1D,MAAM,cAAc,sCAClB,iBAAiB,QACjB,SACA,cAAc,OAAO,OACrB,MAAM,GAAG,oBAAoB,QAAQ,CACtC;CACD,MAAM,mBAAmB,sCACvB,iBAAiB,aACjB,SACA,cAAc,OAAO,OACrB,MAAM,GAAG,oBAAoB,aAAa,CAC3C;CACD,MAAM,eAAe,sCACnB,iBAAiB,SACjB,SACA,cAAc,OAAO,QACrB,MAAM,GAAG,oBAAoB,QAAQ,CACtC;CACD,MAAM,YAAY,sCAChB,WAAW,OACX,SACA,cAAc,OAAO,MACrB,MAAM,GAAG,oBAAoB,MAAM,CACpC;CACD,MAAM,iBAAiB,gBAAgB,KAAK,gBAAgB,QAC1D,sCACE,eAAe,OACf,SACA,cAAc,OAAO,UACrB,MAAM,OAAO,GAAG,cAAc,GAAG,UAAU,KAAK,GAAG,WAAW,CAAC,CAChE,CACF;AAED,KACE,CAAC,YAAY,UACb,CAAC,iBAAiB,UAClB,CAAC,aAAa,UACd,CAAC,UAAU,UACX,CAAC,eAAe,MAAM,MAAM,EAAE,OAAO,CAErC,QAAO;EAAE,gBAAgB;EAAI,UAAU,EAAE;EAAE;AAG7C,QAAO;EACL,gBAAgB;GACd,GAAI,YAAY,SAAS,CAAC,YAAY,OAAO,GAAG,EAAE;GAClD,GAAI,YAAY,SACZ,CAAC,gBAAgB,oBAAoB,WAAW,YAAY,SAAS,GACrE,EAAE;GACN,GAAI,iBAAiB,SAAS,CAAC,iBAAiB,OAAO,GAAG,EAAE;GAC5D,GAAI,iBAAiB,SACjB,CACE,gBAAgB,oBAAoB,gBAAgB,iBAAiB,SACtE,GACD,EAAE;GACN,GAAI,aAAa,SAAS,CAAC,aAAa,OAAO,GAAG,EAAE;GACpD,GAAI,aAAa,SACb,CAAC,gBAAgB,oBAAoB,WAAW,aAAa,SAAS,GACtE,EAAE;GACN,GAAI,UAAU,SAAS,CAAC,UAAU,OAAO,GAAG,EAAE;GAC9C,GAAI,UAAU,SACV,CACE,WAAW,UACP,gBAAgB,oBAAoB,aAAa,UAAU,OAAO;eACnE,oBAAoB,iBAAiB,oBAAoB,WACtD,WAAW,OAAO,MACd,oBAAoB,WAAW,MAAM,IAAI,MACzC,KAEJ,WAAW,OAAO,MACd,oBAAoB,WAAW,MAAM,IAAI,MACzC,OAEN,gBAAgB,oBAAoB,SAAS,UAAU,SAC5D,GACD,EAAE;GACN,GAAG,eAAe,SAAS,eAAe,UAAU;IAClD,MAAM,oBAAoB,OACxB,GAAG,cAAc,GAAG,UAAU,OAAO,GAAG,WACzC;AACD,WAAO,CACL,GAAI,cAAc,SAAS,CAAC,cAAc,OAAO,GAAG,EAAE,EACtD,GAAI,cAAc,SACd,CACE,gBAAgB,OAAO,UACnB,gBAAgB,kBAAkB,SAAS,cAAc,OAAO;eACrE,kBAAkB,aAAa,kBAAkB,OAC1C,gBAAgB,OAAO,OAAO,MAC1B,oBAAoB,gBAAgB,OAAO,MAAM,IAAI,MACrD,KAEJ,gBAAgB,OAAO,OAAO,MAC1B,oBAAoB,gBAAgB,OAAO,MAAM,IAAI,MACrD,OAEN,gBAAgB,kBAAkB,KAAK,cAAc,SAC1D,GACD,EAAE,CACP;KACD;GACH,CAAC,KAAK,OAAO;EACd,UAAU,EAAE;EACb;;AAGH,MAAa,kBAAiC,aAAa,YAAY;CACrE,MAAM,EAAE,gBAAgB,aAAa,oBACnC,aACA,QACD;AAED,QAAO;EACL,gBAAgB,iBAAiB,GAAG,eAAe,QAAQ;EAC3D,SAAS,EAAE;EACX;EACD;;AAGH,MAAM,sBAA+C;CACnD,QAAQ;CACR,cAAc;CACf;AAED,MAAa,sBAAsB"}
|
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
|
+
}
|