Skip to content

Commit

Permalink
fix(reference): fix internal/external URL determ for OpenAPI 2.0
Browse files Browse the repository at this point in the history
Refs #3451
  • Loading branch information
char0n committed Nov 24, 2023
1 parent 3cc0791 commit 1eb3b78
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 78 deletions.
3 changes: 0 additions & 3 deletions packages/apidom-ns-openapi-2/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ export {
isLicenseElement,
isPathsElement,
isPathItemElement,
isPathItemElementExternal,
isOperationElement,
isExternalDocumentationElement,
isParameterElement,
Expand All @@ -46,9 +45,7 @@ export {
isHeaderElement,
isTagElement,
isReferenceElement,
isReferenceElementExternal,
isSchemaElement,
isJSONReferenceElementExternal,
isXmlElement,
isDefinitionsElement,
isParametersDefinitionsElement,
Expand Down
56 changes: 1 addition & 55 deletions packages/apidom-ns-openapi-2/src/predicates.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,4 @@
import {
createPredicate,
ElementPredicate,
isStringElement,
toValue,
} from '@swagger-api/apidom-core';
import {
isJSONReferenceElement,
JSONReferenceElement,
} from '@swagger-api/apidom-ns-json-schema-draft-4';
import { createPredicate } from '@swagger-api/apidom-core';

import SwaggerElement from './elements/Swagger';
import SwaggerVersionElement from './elements/SwaggerVersion';
Expand Down Expand Up @@ -107,21 +98,6 @@ export const isPathItemElement = createPredicate(
},
);

export const isPathItemElementExternal: ElementPredicate<PathItemElement> = (
element: unknown,
): element is PathItemElement => {
if (!isPathItemElement(element)) {
return false;
}
if (!isStringElement(element.$ref)) {
return false;
}

const value = toValue(element.$ref);

return typeof value === 'string' && value.length > 0 && !value.startsWith('#');
};

export const isOperationElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
return (element: unknown): element is OperationElement =>
Expand Down Expand Up @@ -232,21 +208,6 @@ export const isReferenceElement = createPredicate(
},
);

export const isReferenceElementExternal: ElementPredicate<ReferenceElement> = (
element: unknown,
): element is ReferenceElement => {
if (!isReferenceElement(element)) {
return false;
}
if (!isStringElement(element.$ref)) {
return false;
}

const value = toValue(element.$ref);

return typeof value === 'string' && value.length > 0 && !value.startsWith('#');
};

export const isSchemaElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
return (element: unknown): element is SchemaElement =>
Expand All @@ -257,21 +218,6 @@ export const isSchemaElement = createPredicate(
},
);

export const isJSONReferenceElementExternal: ElementPredicate<JSONReferenceElement> = (
element: unknown,
): element is PathItemElement => {
if (!isJSONReferenceElement(element)) {
return false;
}
if (!isStringElement(element.$ref)) {
return false;
}

const value = toValue(element.$ref);

return typeof value === 'string' && value.length > 0 && !value.startsWith('#');
};

export const isXmlElement = createPredicate(
({ hasBasicElementProps, isElementType, primitiveEq }) => {
return (element: unknown): element is XmlElement =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@ import {
ReferenceElement,
PathItemElement,
JSONReferenceElement,
isReferenceElementExternal,
isPathItemElementExternal,
isJSONReferenceElementExternal,
} from '@swagger-api/apidom-ns-openapi-2';

import { Reference as IReference } from '../../../types';
Expand Down Expand Up @@ -128,16 +125,16 @@ const OpenApi2DereferenceVisitor = stampit({
return false;
}

// ignore resolving external Reference Objects
if (!this.options.resolve.external && isReferenceElementExternal(referencingElement)) {
// skip traversing this schema but traverse all it's child schemas
return undefined;
}

const reference = await this.toReference(toValue(referencingElement.$ref));
const { uri: retrievalURI } = reference;
const $refBaseURI = url.resolve(retrievalURI, toValue(referencingElement.$ref));

// ignore resolving external Reference Objects
if (!this.options.resolve.external && url.stripHash(this.reference.uri) !== retrievalURI) {
// skip traversing this reference element but traverse all it's child elements
return undefined;
}

this.indirections.push(referencingElement);

const jsonPointer = uriToPointer($refBaseURI);
Expand Down Expand Up @@ -251,15 +248,16 @@ const OpenApi2DereferenceVisitor = stampit({
return false;
}

// ignore resolving external Path Item Elements
if (!this.options.resolve.external && isPathItemElementExternal(referencingElement)) {
return undefined;
}

const reference = await this.toReference(toValue(referencingElement.$ref));
const retrievalURI = reference.uri;
const $refBaseURI = url.resolve(retrievalURI, toValue(referencingElement.$ref));

// ignore resolving external Path Item Objects
if (!this.options.resolve.external && url.stripHash(this.reference.uri) !== retrievalURI) {
// skip traversing this Path Item element but traverse all it's child elements
return undefined;
}

this.indirections.push(referencingElement);

const jsonPointer = uriToPointer($refBaseURI);
Expand Down Expand Up @@ -370,16 +368,16 @@ const OpenApi2DereferenceVisitor = stampit({
return false;
}

// ignore resolving external Reference Objects
if (!this.options.resolve.external && isJSONReferenceElementExternal(referencingElement)) {
// skip traversing this schema but traverse all it's child schemas
return undefined;
}

const reference = await this.toReference(toValue(referencingElement.$ref));
const { uri: retrievalURI } = reference;
const $refBaseURI = url.resolve(retrievalURI, toValue(referencingElement.$ref));

// ignore resolving external JSONReference Objects
if (!this.options.resolve.external && url.stripHash(this.reference.uri) !== retrievalURI) {
// skip traversing this JSONReference element but traverse all it's child elements
return undefined;
}

this.indirections.push(referencingElement);

const jsonPointer = uriToPointer($refBaseURI);
Expand Down

0 comments on commit 1eb3b78

Please sign in to comment.