Skip to content

Commit 58350fe

Browse files
authored
fix(reference): fix resolution of Schema Object field (#525)
Closes #524
1 parent ec0fe4a commit 58350fe

File tree

3 files changed

+15
-14
lines changed

3 files changed

+15
-14
lines changed

apidom/packages/apidom-reference/src/dereference/strategies/openapi-3-1/visitor.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -337,8 +337,7 @@ const OpenApi3_1DereferenceVisitor = stampit({
337337
}
338338

339339
// compute baseURI using rules around $id and $ref keywords
340-
const base$idURI = resolveInherited$id(referencingElement);
341-
const baseURI = this.toBaseURI(base$idURI);
340+
const baseURI = resolveInherited$id(this.reference.uri, referencingElement);
342341
const file = File({ uri: baseURI });
343342
const isUnknownURI = none((r: IResolver) => r.canRead(file), this.options.resolve.resolvers);
344343
const isExternal = this.reference.uri !== baseURI && !isUnknownURI;
@@ -352,7 +351,7 @@ const OpenApi3_1DereferenceVisitor = stampit({
352351
}
353352

354353
// compute Reference object
355-
const reference = isUnknownURI ? this.reference : await this.toReference(base$idURI);
354+
const reference = isUnknownURI ? this.reference : await this.toReference(baseURI);
356355

357356
this.indirections.push(referencingElement);
358357

apidom/packages/apidom-reference/src/resolve/strategies/openapi-3-1/util.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { reduceRight } from 'ramda';
1+
import { reduce } from 'ramda';
22
import { Element } from 'apidom';
33
import { SchemaElement } from 'apidom-ns-openapi-3-1';
44

@@ -8,19 +8,22 @@ import * as url from '../../../util/url';
88
* Folding of inherited$id list from right to left using
99
* URL resolving mechanism.
1010
*/
11-
export const resolveInherited$id = (schemaElement: SchemaElement) =>
12-
reduceRight(
13-
($id: string, acc: string): string => {
11+
export const resolveInherited$id = (baseURI: string, schemaElement: SchemaElement) => {
12+
const inherited$id = schemaElement.meta.get('inherited$id').toValue();
13+
14+
return reduce(
15+
(acc: string, $id: string): string => {
1416
const uriWithoutHash = url.stripHash($id);
1517
const sanitizedURI = url.isFileSystemPath(uriWithoutHash)
1618
? url.fromFileSystemPath(uriWithoutHash)
1719
: uriWithoutHash;
1820

19-
return url.resolve(sanitizedURI, acc);
21+
return url.resolve(acc, sanitizedURI);
2022
},
21-
schemaElement.$ref?.toValue(),
22-
schemaElement.meta.get('inherited$id').toValue(),
23+
baseURI,
24+
[...inherited$id, schemaElement.$ref?.toValue()],
2325
);
26+
};
2427

2528
/**
2629
* Cached version of SchemaElement.refract.

apidom/packages/apidom-reference/src/resolve/strategies/openapi-3-1/visitor.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,7 @@ const OpenApi3_1ResolveVisitor = stampit({
209209
}
210210

211211
// compute Reference object using rules around $id and $ref keywords
212-
const base$idURI = resolveInherited$id(schemaElement);
213-
const baseURI = this.toBaseURI(base$idURI);
212+
const baseURI = resolveInherited$id(this.reference.uri, schemaElement);
214213
const file = File({ uri: baseURI });
215214
const isUnknownURI = none((r: IResolver) => r.canRead(file), this.options.resolve.resolvers);
216215
const isExternal = this.reference.uri !== baseURI && !isUnknownURI;
@@ -224,7 +223,7 @@ const OpenApi3_1ResolveVisitor = stampit({
224223
}
225224

226225
if (!has(baseURI, this.crawlingMap)) {
227-
this.crawlingMap[baseURI] = isUnknownURI ? this.reference : this.toReference(base$idURI);
226+
this.crawlingMap[baseURI] = isUnknownURI ? this.reference : this.toReference(baseURI);
228227
}
229228
this.crawledElements.push(schemaElement);
230229

@@ -325,7 +324,7 @@ const OpenApi3_1ResolveVisitor = stampit({
325324

326325
async crawlSchemaElement(referencingElement: SchemaElement) {
327326
// compute Reference object using rules around $id and $ref keywords
328-
const base$idURI = resolveInherited$id(referencingElement);
327+
const base$idURI = resolveInherited$id(this.reference.uri, referencingElement);
329328
const baseURI = this.toBaseURI(base$idURI);
330329
const file = File({ uri: baseURI });
331330
const isUnknownURI = none((r: IResolver) => r.canRead(file), this.options.resolve.resolvers);

0 commit comments

Comments
 (0)