-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(ns-openapi-3-1): add security normalization refractor plugin (#2368
) Refs #2362
- Loading branch information
Showing
11 changed files
with
1,063 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
65 changes: 65 additions & 0 deletions
65
packages/apidom-ns-openapi-3-1/src/refractor/plugins/normalize-security-requirements.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
import { isArrayElement, ArrayElement } from '@swagger-api/apidom-core'; | ||
import { OperationSecurityElement } from '@swagger-api/apidom-ns-openapi-3-0'; | ||
|
||
import OpenApi3_1Element from '../../elements/OpenApi3-1'; | ||
import OperationElement from '../../elements/Operation'; | ||
import { isComponentsElement } from '../../predicates'; | ||
|
||
/** | ||
* Override of Security Requirement Objects. | ||
* | ||
* OpenAPI 3.1 specification excerpt that defines the override behavior: | ||
* | ||
* Operation.security definition overrides any declared top-level security. | ||
* To remove a top-level security declaration, an empty array can be used. | ||
* When a list of Security Requirement Objects is defined on the OpenAPI Object or Operation Object, | ||
* only one of the Security Requirement Objects in the list needs to be satisfied to authorize the request. | ||
*/ | ||
|
||
/* eslint-disable no-param-reassign */ | ||
const plugin = () => () => { | ||
let topLevelSecurity: ArrayElement | undefined; | ||
|
||
return { | ||
visitor: { | ||
OpenApi3_1Element: { | ||
enter(openapiElement: OpenApi3_1Element) { | ||
if (isArrayElement(openapiElement.security)) { | ||
topLevelSecurity = openapiElement.security; | ||
return undefined; | ||
} | ||
return false; | ||
}, | ||
leave() { | ||
topLevelSecurity = undefined; | ||
}, | ||
}, | ||
OperationElement: { | ||
leave( | ||
operationElement: OperationElement, | ||
key: any, | ||
parent: any, | ||
path: any, | ||
ancestors: any[], | ||
) { | ||
// skip visiting this Operation | ||
if (ancestors.some(isComponentsElement)) { | ||
return false; | ||
} | ||
|
||
const missingOperationLevelSecurity = typeof operationElement.security === 'undefined'; | ||
const hasTopLevelSecurity = typeof topLevelSecurity !== 'undefined'; | ||
|
||
if (missingOperationLevelSecurity && hasTopLevelSecurity) { | ||
operationElement.security = new OperationSecurityElement(topLevelSecurity?.content); | ||
} | ||
|
||
return undefined; | ||
}, | ||
}, | ||
}, | ||
}; | ||
}; | ||
/* eslint-enable */ | ||
|
||
export default plugin; |
215 changes: 215 additions & 0 deletions
215
...t/refractor/plugins/normalize-security-requirements/callbacks/__snapshots__/index.ts.snap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,215 @@ | ||
// Jest Snapshot v1, https://goo.gl/fbAQLP | ||
|
||
exports[`refractor plugins normalize-security-requirements given OpenAPI.security fixed field is defined and Operation.security contains single Security Requirement should not inherit Security Requirements from OpenAPI.security field 1`] = ` | ||
(OpenApi3_1Element | ||
(MemberElement | ||
(StringElement) | ||
(OpenapiElement)) | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(SecurityRequirementElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(StringElement) | ||
(StringElement)))))) | ||
(MemberElement | ||
(StringElement) | ||
(PathsElement | ||
(MemberElement | ||
(StringElement) | ||
(PathItemElement | ||
(MemberElement | ||
(StringElement) | ||
(OperationElement | ||
(MemberElement | ||
(StringElement) | ||
(ObjectElement | ||
(MemberElement | ||
(StringElement) | ||
(CallbackElement | ||
(MemberElement | ||
(StringElement) | ||
(PathItemElement | ||
(MemberElement | ||
(StringElement) | ||
(OperationElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(SecurityRequirementElement))))))))))) | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(SecurityRequirementElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(StringElement) | ||
(StringElement))))))))))))) | ||
`; | ||
|
||
exports[`refractor plugins normalize-security-requirements given OpenAPI.security fixed field is defined and Operation.security is defined as empty list should not inherit Security Requirements from OpenAPI.security field 1`] = ` | ||
(OpenApi3_1Element | ||
(MemberElement | ||
(StringElement) | ||
(OpenapiElement)) | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(SecurityRequirementElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(StringElement) | ||
(StringElement)))))) | ||
(MemberElement | ||
(StringElement) | ||
(PathsElement | ||
(MemberElement | ||
(StringElement) | ||
(PathItemElement | ||
(MemberElement | ||
(StringElement) | ||
(OperationElement | ||
(MemberElement | ||
(StringElement) | ||
(ObjectElement | ||
(MemberElement | ||
(StringElement) | ||
(CallbackElement | ||
(MemberElement | ||
(StringElement) | ||
(PathItemElement | ||
(MemberElement | ||
(StringElement) | ||
(OperationElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement)))))))))) | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(SecurityRequirementElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(StringElement) | ||
(StringElement))))))))))))) | ||
`; | ||
|
||
exports[`refractor plugins normalize-security-requirements given OpenAPI.security fixed field is defined and Operation.security is not defined should inherit Security Requirements from OpenAPI.security field 1`] = ` | ||
(OpenApi3_1Element | ||
(MemberElement | ||
(StringElement) | ||
(OpenapiElement)) | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(SecurityRequirementElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(StringElement) | ||
(StringElement)))))) | ||
(MemberElement | ||
(StringElement) | ||
(PathsElement | ||
(MemberElement | ||
(StringElement) | ||
(PathItemElement | ||
(MemberElement | ||
(StringElement) | ||
(OperationElement | ||
(MemberElement | ||
(StringElement) | ||
(ObjectElement | ||
(MemberElement | ||
(StringElement) | ||
(CallbackElement | ||
(MemberElement | ||
(StringElement) | ||
(PathItemElement | ||
(MemberElement | ||
(StringElement) | ||
(OperationElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(SecurityRequirementElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(StringElement) | ||
(StringElement)))))))))))))) | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(SecurityRequirementElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(StringElement) | ||
(StringElement))))))))))))) | ||
`; | ||
|
||
exports[`refractor plugins normalize-security-requirements given OpenAPI.security fixed field is not defined and Operation.security is defined should do nothing 1`] = ` | ||
(OpenApi3_1Element | ||
(MemberElement | ||
(StringElement) | ||
(OpenapiElement)) | ||
(MemberElement | ||
(StringElement) | ||
(PathsElement | ||
(MemberElement | ||
(StringElement) | ||
(PathItemElement | ||
(MemberElement | ||
(StringElement) | ||
(OperationElement | ||
(MemberElement | ||
(StringElement) | ||
(ObjectElement | ||
(MemberElement | ||
(StringElement) | ||
(CallbackElement | ||
(MemberElement | ||
(StringElement) | ||
(PathItemElement | ||
(MemberElement | ||
(StringElement) | ||
(OperationElement | ||
(MemberElement | ||
(StringElement) | ||
(ArrayElement | ||
(SecurityRequirementElement)))))))))))))))))) | ||
`; | ||
|
||
exports[`refractor plugins normalize-security-requirements given OpenAPI.security fixed field is not defined and Operation.security is not defined should do nothing 1`] = ` | ||
(OpenApi3_1Element | ||
(MemberElement | ||
(StringElement) | ||
(OpenapiElement)) | ||
(MemberElement | ||
(StringElement) | ||
(PathsElement | ||
(MemberElement | ||
(StringElement) | ||
(PathItemElement | ||
(MemberElement | ||
(StringElement) | ||
(OperationElement | ||
(MemberElement | ||
(StringElement) | ||
(ObjectElement | ||
(MemberElement | ||
(StringElement) | ||
(CallbackElement | ||
(MemberElement | ||
(StringElement) | ||
(PathItemElement | ||
(MemberElement | ||
(StringElement) | ||
(OperationElement))))))))))))))) | ||
`; |
Oops, something went wrong.