@@ -105,8 +105,10 @@ function compileOneOfSchema(compiler: Compiler, schema: OpenAPIOneOfSchema) {
105105
106106 // Declare the variable to use as a result, then iterate over each schema
107107 const resultIdentifier = builders . identifier ( 'result' ) ;
108+ const errorIdentifier = builders . identifier ( 'error' ) ;
108109 nodes . push (
109110 builders . variableDeclaration ( 'let' , [ builders . variableDeclarator ( resultIdentifier ) ] ) ,
111+ builders . variableDeclaration ( 'let' , [ builders . variableDeclarator ( errorIdentifier ) ] ) ,
110112 ) ;
111113
112114 schema . oneOf . forEach ( ( subSchema , index ) => {
@@ -125,14 +127,50 @@ function compileOneOfSchema(compiler: Compiler, schema: OpenAPIOneOfSchema) {
125127
126128 nodes . push (
127129 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 ,
135134 ) ,
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+ ] ) ,
136174 builders . blockStatement ( [
137175 ...( index > 0
138176 ? [
@@ -165,7 +203,33 @@ function compileOneOfSchema(compiler: Compiler, schema: OpenAPIOneOfSchema) {
165203 resultIdentifier ,
166204 builders . identifier ( 'undefined' ) ,
167205 ) ,
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+ ] ) ,
169233 ) ,
170234 ) ;
171235
0 commit comments