@@ -105,8 +105,10 @@ function compileOneOfSchema(compiler: Compiler, schema: OpenAPIOneOfSchema) {
105
105
106
106
// Declare the variable to use as a result, then iterate over each schema
107
107
const resultIdentifier = builders . identifier ( 'result' ) ;
108
+ const errorIdentifier = builders . identifier ( 'error' ) ;
108
109
nodes . push (
109
110
builders . variableDeclaration ( 'let' , [ builders . variableDeclarator ( resultIdentifier ) ] ) ,
111
+ builders . variableDeclaration ( 'let' , [ builders . variableDeclarator ( errorIdentifier ) ] ) ,
110
112
) ;
111
113
112
114
schema . oneOf . forEach ( ( subSchema , index ) => {
@@ -125,14 +127,50 @@ function compileOneOfSchema(compiler: Compiler, schema: OpenAPIOneOfSchema) {
125
127
126
128
nodes . push (
127
129
builders . ifStatement (
128
- builders . unaryExpression (
129
- '!' ,
130
- builders . binaryExpression (
131
- 'instanceof' ,
132
- altIdentifier ,
133
- ValidationErrorIdentifier ,
134
- ) ,
130
+ builders . binaryExpression (
131
+ 'instanceof' ,
132
+ altIdentifier ,
133
+ ValidationErrorIdentifier ,
135
134
) ,
135
+ builders . blockStatement ( [
136
+ // Repalce the error if the new error is more specific (longer path)
137
+ builders . ifStatement (
138
+ builders . logicalExpression (
139
+ '||' ,
140
+ builders . binaryExpression (
141
+ '===' ,
142
+ errorIdentifier ,
143
+ builders . identifier ( 'undefined' ) ,
144
+ ) ,
145
+ builders . binaryExpression (
146
+ '<' ,
147
+ builders . memberExpression (
148
+ builders . memberExpression (
149
+ errorIdentifier ,
150
+ builders . identifier ( 'path' ) ,
151
+ ) ,
152
+ builders . identifier ( 'length' ) ,
153
+ ) ,
154
+ builders . memberExpression (
155
+ builders . memberExpression (
156
+ altIdentifier ,
157
+ builders . identifier ( 'path' ) ,
158
+ ) ,
159
+ builders . identifier ( 'length' ) ,
160
+ ) ,
161
+ ) ,
162
+ ) ,
163
+ builders . blockStatement ( [
164
+ builders . expressionStatement (
165
+ builders . assignmentExpression (
166
+ '=' ,
167
+ errorIdentifier ,
168
+ altIdentifier ,
169
+ ) ,
170
+ ) ,
171
+ ] ) ,
172
+ ) ,
173
+ ] ) ,
136
174
builders . blockStatement ( [
137
175
...( index > 0
138
176
? [
@@ -165,7 +203,33 @@ function compileOneOfSchema(compiler: Compiler, schema: OpenAPIOneOfSchema) {
165
203
resultIdentifier ,
166
204
builders . identifier ( 'undefined' ) ,
167
205
) ,
168
- builders . blockStatement ( [ builders . returnStatement ( error ( 'expected to match one' ) ) ] ) ,
206
+ builders . blockStatement ( [
207
+ // If the path is longer than one level deep, then we return the error from the evaluation
208
+ // other we say that we expected to only match one of the schemas
209
+ builders . ifStatement (
210
+ builders . logicalExpression (
211
+ '&&' ,
212
+ errorIdentifier ,
213
+ builders . binaryExpression (
214
+ '>' ,
215
+ builders . memberExpression (
216
+ builders . memberExpression (
217
+ errorIdentifier ,
218
+ builders . identifier ( 'path' ) ,
219
+ ) ,
220
+ builders . identifier ( 'length' ) ,
221
+ ) ,
222
+ builders . binaryExpression (
223
+ '+' ,
224
+ builders . memberExpression ( path , builders . identifier ( 'length' ) ) ,
225
+ builders . literal ( 1 ) ,
226
+ ) ,
227
+ ) ,
228
+ ) ,
229
+ builders . blockStatement ( [ builders . returnStatement ( errorIdentifier ) ] ) ,
230
+ builders . returnStatement ( error ( 'expected to match one' ) ) ,
231
+ ) ,
232
+ ] ) ,
169
233
) ,
170
234
) ;
171
235
0 commit comments