diff --git a/packages/apidom-ns-openapi-3-0/src/index.ts b/packages/apidom-ns-openapi-3-0/src/index.ts index 85c419ac1..23e0423da 100644 --- a/packages/apidom-ns-openapi-3-0/src/index.ts +++ b/packages/apidom-ns-openapi-3-0/src/index.ts @@ -44,6 +44,7 @@ export { isSchemaElement, isBooleanJsonSchemaElement, isSecurityRequirementElement, + isSecuritySchemeElement, isServerElement, isServerVariableElement, isMediaTypeElement, diff --git a/packages/apidom-ns-openapi-3-0/src/predicates.ts b/packages/apidom-ns-openapi-3-0/src/predicates.ts index 92f516fa9..66d15d8bd 100644 --- a/packages/apidom-ns-openapi-3-0/src/predicates.ts +++ b/packages/apidom-ns-openapi-3-0/src/predicates.ts @@ -22,6 +22,7 @@ import ResponseElement from './elements/Response'; import ResponsesElement from './elements/Responses'; import SchemaElement from './elements/Schema'; import SecurityRequirementElement from './elements/SecurityRequirement'; +import SecuritySchemeElement from './elements/SecurityScheme'; import ServerElement from './elements/Server'; import ServerVariableElement from './elements/ServerVariable'; import MediaTypeElement from './elements/MediaType'; @@ -246,6 +247,16 @@ export const isSecurityRequirementElement = createPredicate( }, ); +export const isSecuritySchemeElement = createPredicate( + ({ hasBasicElementProps, isElementType, primitiveEq }) => { + return (element: unknown): element is SecuritySchemeElement => + element instanceof SecuritySchemeElement || + (hasBasicElementProps(element) && + isElementType('securityScheme', element) && + primitiveEq('object', element)); + }, +); + export const isServerElement = createPredicate( ({ hasBasicElementProps, isElementType, primitiveEq }) => { return (element: unknown): element is ServerElement => diff --git a/packages/apidom-ns-openapi-3-0/test/predicates.ts b/packages/apidom-ns-openapi-3-0/test/predicates.ts index cd79f1cc7..c6ba2e381 100644 --- a/packages/apidom-ns-openapi-3-0/test/predicates.ts +++ b/packages/apidom-ns-openapi-3-0/test/predicates.ts @@ -11,6 +11,7 @@ import { isOpenApi3_0Element, isServerElement, isServerVariableElement, + isSecuritySchemeElement, isPathsElement, isPathItemElement, isOperationElement, @@ -23,6 +24,7 @@ import { ContactElement, ServerElement, ServerVariableElement, + SecuritySchemeElement, PathsElement, PathItemElement, OperationElement, @@ -515,6 +517,59 @@ describe('predicates', function () { }); }); + context('isSecuritySchemeElement', function () { + context('given SecuritySchemeElement instance value', function () { + specify('should return true', function () { + const element = new SecuritySchemeElement(); + + assert.isTrue(isSecuritySchemeElement(element)); + }); + }); + + context('given subtype instance value', function () { + specify('should return true', function () { + class SecuritySchemeSubElement extends SecuritySchemeElement {} + + assert.isTrue(isSecuritySchemeElement(new SecuritySchemeSubElement())); + }); + }); + + context('given non SecuritySchemeElement instance value', function () { + specify('should return false', function () { + assert.isFalse(isSecuritySchemeElement(1)); + assert.isFalse(isSecuritySchemeElement(null)); + assert.isFalse(isSecuritySchemeElement(undefined)); + assert.isFalse(isSecuritySchemeElement({})); + assert.isFalse(isSecuritySchemeElement([])); + assert.isFalse(isSecuritySchemeElement('string')); + }); + }); + + specify('should support duck-typing', function () { + const securitySchemeElementDuck = { + _storedElement: 'securityScheme', + _content: [], + primitive() { + return 'object'; + }, + get element() { + return this._storedElement; + }, + }; + + const securitySchemeElementSwan = { + _storedElement: undefined, + _content: undefined, + primitive() { + return 'swan'; + }, + }; + + assert.isTrue(isSecuritySchemeElement(securitySchemeElementDuck)); + assert.isFalse(isSecuritySchemeElement(securitySchemeElementSwan)); + }); + }); + context('isPathsElement', function () { context('given PathsElement instance value', function () { specify('should return true', function () {