@rxap/open-api
Version:
This package provides tools for working with OpenAPI specifications in Angular applications. It includes services for configuring and loading OpenAPI definitions, validating requests and responses against schemas, and handling errors. It also offers utili
1,230 lines (1,008 loc) • 63 kB
HTML
<!doctype html>
<html class="no-js" lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>angular-open-api</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="../images/favicon.ico">
<link rel="stylesheet" href="../styles/style.css">
<link rel="stylesheet" href="../styles/dark.css">
</head>
<body>
<script>
// Blocking script to avoid flickering dark mode
// Dark mode toggle button
var useDark = window.matchMedia('(prefers-color-scheme: dark)');
var darkModeState = useDark.matches;
var $darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input');
var $darkModeToggles = document.querySelectorAll('.dark-mode-switch');
var darkModeStateLocal = localStorage.getItem('compodoc_darkmode-state');
function checkToggle(check) {
for (var i = 0; i < $darkModeToggleSwitchers.length; i++) {
$darkModeToggleSwitchers[i].checked = check;
}
}
function toggleDarkMode(state) {
if (window.localStorage) {
localStorage.setItem('compodoc_darkmode-state', state);
}
checkToggle(state);
const hasClass = document.body.classList.contains('dark');
if (state) {
for (var i = 0; i < $darkModeToggles.length; i++) {
$darkModeToggles[i].classList.add('dark');
}
if (!hasClass) {
document.body.classList.add('dark');
}
} else {
for (var i = 0; i < $darkModeToggles.length; i++) {
$darkModeToggles[i].classList.remove('dark');
}
if (hasClass) {
document.body.classList.remove('dark');
}
}
}
useDark.addEventListener('change', function (evt) {
toggleDarkMode(evt.matches);
});
if (darkModeStateLocal) {
darkModeState = darkModeStateLocal === 'true';
}
toggleDarkMode(darkModeState);
</script>
<div class="navbar navbar-default navbar-fixed-top d-md-none p-0">
<div class="d-flex">
<a href="../" class="navbar-brand">angular-open-api</a>
<button type="button" class="btn btn-default btn-menu ion-ios-menu" id="btn-menu"></button>
</div>
</div>
<div class="xs-menu menu" id="mobile-menu">
<div id="book-search-input" role="search"><input type="text" placeholder="Type to search"></div> <compodoc-menu></compodoc-menu>
</div>
<div class="container-fluid main">
<div class="row main">
<div class="d-none d-md-block menu">
<compodoc-menu mode="normal"></compodoc-menu>
</div>
<!-- START CONTENT -->
<div class="content class">
<div class="content-data">
<ol class="breadcrumb">
<li class="breadcrumb-item">Classes</li>
<li class="breadcrumb-item" >SchemaValidationMixin</li>
</ol>
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<a href="#info"
class="nav-link"
class="nav-link active"
role="tab" id="info-tab" data-bs-toggle="tab" data-link="info">Info</a>
</li>
<li class="nav-item">
<a href="#source"
class="nav-link"
role="tab" id="source-tab" data-bs-toggle="tab" data-link="source">Source</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade active in" id="info">
<p class="comment">
<h3>File</h3>
</p>
<p class="comment">
<code>src/lib/schema-validation.mixin.ts</code>
</p>
<section data-compodoc="block-index">
<h3 id="index">Index</h3>
<table class="table table-sm table-bordered index-table">
<tbody>
<tr>
<td class="col-md-4">
<h6><b>Properties</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier">Protected</span>
<span class="modifier">Optional</span>
<a href="#disableSchemaValidation" >disableSchemaValidation</a>
</li>
<li>
<span class="modifier">Static</span>
<a href="#STRICT" >STRICT</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>Methods</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier">Public</span>
<a href="#buildHttpHeaders" >buildHttpHeaders</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#buildHttpOptions" >buildHttpOptions</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#buildHttpParams" >buildHttpParams</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#buildHttpPathParams" >buildHttpPathParams</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#validateParameters" >validateParameters</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#validateRequestBody" >validateRequestBody</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#validateResponse" >validateResponse</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#validationError" >validationError</a>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-properties">
<h3 id="inputs">
Properties
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="disableSchemaValidation"></a>
<span class="name">
<span class="modifier">Protected</span>
<span class="modifier">Optional</span>
<span ><b>disableSchemaValidation</b></span>
<a href="#disableSchemaValidation"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/boolean" target="_blank" >boolean</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="35" class="link-to-prism">src/lib/schema-validation.mixin.ts:35</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="STRICT"></a>
<span class="name">
<span class="modifier">Static</span>
<span ><b>STRICT</b></span>
<a href="#STRICT"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>false</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="33" class="link-to-prism">src/lib/schema-validation.mixin.ts:33</a></div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-methods">
<h3 id="methods">
Methods
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="buildHttpHeaders"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>buildHttpHeaders</b></span>
<a href="#buildHttpHeaders"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>buildHttpHeaders(operationParameters: OpenAPIV3.ParameterObject[], parameters?: Parameters)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="293"
class="link-to-prism">src/lib/schema-validation.mixin.ts:293</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>operationParameters</td>
<td>
<code>OpenAPIV3.ParameterObject[]</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>parameters</td>
<td>
<code>Parameters</code>
</td>
<td>
Yes
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code>HttpHeaders</code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="buildHttpOptions"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>buildHttpOptions</b></span>
<a href="#buildHttpOptions"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>buildHttpOptions(operation: <a href="../interfaces/OperationObjectWithMetadata.html" target="_self">OperationObjectWithMetadata</a>, parameters?: Parameters, requestBody?: RequestBody, ignoreUndefined)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="367"
class="link-to-prism">src/lib/schema-validation.mixin.ts:367</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description"><p>Converts open api parameters into the corresponding http options to
create a http request. The transformation is guided by the openapi definition</p>
</div>
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
<td>Default value</td>
</tr>
</thead>
<tbody>
<tr>
<td>operation</td>
<td>
<code><a href="../interfaces/OperationObjectWithMetadata.html" target="_self" >OperationObjectWithMetadata</a></code>
</td>
<td>
No
</td>
<td>
</td>
</tr>
<tr>
<td>parameters</td>
<td>
<code>Parameters</code>
</td>
<td>
Yes
</td>
<td>
</td>
</tr>
<tr>
<td>requestBody</td>
<td>
<code>RequestBody</code>
</td>
<td>
Yes
</td>
<td>
</td>
</tr>
<tr>
<td>ignoreUndefined</td>
<td>
</td>
<td>
No
</td>
<td>
<code>true</code>
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code>HttpRemoteMethodParameter</code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="buildHttpParams"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>buildHttpParams</b></span>
<a href="#buildHttpParams"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>buildHttpParams(operationParameters: OpenAPIV3.ParameterObject[], parameters?: Parameters, ignoreUndefined)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="244"
class="link-to-prism">src/lib/schema-validation.mixin.ts:244</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
<td>Default value</td>
</tr>
</thead>
<tbody>
<tr>
<td>operationParameters</td>
<td>
<code>OpenAPIV3.ParameterObject[]</code>
</td>
<td>
No
</td>
<td>
</td>
</tr>
<tr>
<td>parameters</td>
<td>
<code>Parameters</code>
</td>
<td>
Yes
</td>
<td>
</td>
</tr>
<tr>
<td>ignoreUndefined</td>
<td>
</td>
<td>
No
</td>
<td>
<code>true</code>
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code>HttpParams</code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="buildHttpPathParams"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>buildHttpPathParams</b></span>
<a href="#buildHttpPathParams"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>buildHttpPathParams(operationParameters: OpenAPIV3.ParameterObject[], parameters?: Parameters)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="333"
class="link-to-prism">src/lib/schema-validation.mixin.ts:333</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>operationParameters</td>
<td>
<code>OpenAPIV3.ParameterObject[]</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>parameters</td>
<td>
<code>Parameters</code>
</td>
<td>
Yes
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code>Record<string, string></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="validateParameters"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>validateParameters</b></span>
<a href="#validateParameters"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>validateParameters(operation: <a href="../interfaces/OperationObjectWithMetadata.html" target="_self">OperationObjectWithMetadata</a>, parameters?: Parameters, strict)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="45"
class="link-to-prism">src/lib/schema-validation.mixin.ts:45</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description"><p>Validates the parameters against the schema specified in the operation object</p>
</div>
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
<td>Default value</td>
</tr>
</thead>
<tbody>
<tr>
<td>operation</td>
<td>
<code><a href="../interfaces/OperationObjectWithMetadata.html" target="_self" >OperationObjectWithMetadata</a></code>
</td>
<td>
No
</td>
<td>
</td>
</tr>
<tr>
<td>parameters</td>
<td>
<code>Parameters</code>
</td>
<td>
Yes
</td>
<td>
</td>
</tr>
<tr>
<td>strict</td>
<td>
</td>
<td>
No
</td>
<td>
<code>false</code>
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="validateRequestBody"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>validateRequestBody</b></span>
<a href="#validateRequestBody"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>validateRequestBody(operation: <a href="../interfaces/OperationObjectWithMetadata.html" target="_self">OperationObjectWithMetadata</a>, body?: RequestBody, strict)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="189"
class="link-to-prism">src/lib/schema-validation.mixin.ts:189</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
<td>Default value</td>
</tr>
</thead>
<tbody>
<tr>
<td>operation</td>
<td>
<code><a href="../interfaces/OperationObjectWithMetadata.html" target="_self" >OperationObjectWithMetadata</a></code>
</td>
<td>
No
</td>
<td>
</td>
</tr>
<tr>
<td>body</td>
<td>
<code>RequestBody</code>
</td>
<td>
Yes
</td>
<td>
</td>
</tr>
<tr>
<td>strict</td>
<td>
</td>
<td>
No
</td>
<td>
<code>false</code>
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="validateResponse"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>validateResponse</b></span>
<a href="#validateResponse"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>validateResponse(operation: <a href="../interfaces/OperationObjectWithMetadata.html" target="_self">OperationObjectWithMetadata</a>, response: <a href="../interfaces/SchemaValidationResponse.html" target="_self">SchemaValidationResponse<Response></a>, strict)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="122"
class="link-to-prism">src/lib/schema-validation.mixin.ts:122</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description"><p>Validates the http response against the schema specified in the operation object</p>
</div>
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
<td>Default value</td>
</tr>
</thead>
<tbody>
<tr>
<td>operation</td>
<td>
<code><a href="../interfaces/OperationObjectWithMetadata.html" target="_self" >OperationObjectWithMetadata</a></code>
</td>
<td>
No
</td>
<td>
</td>
</tr>
<tr>
<td>response</td>
<td>
<code><a href="../interfaces/SchemaValidationResponse.html" target="_self" >SchemaValidationResponse<Response></a></code>
</td>
<td>
No
</td>
<td>
</td>
</tr>
<tr>
<td>strict</td>
<td>
</td>
<td>
No
</td>
<td>
<code>false</code>
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="validationError"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>validationError</b></span>
<a href="#validationError"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>validationError(message: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>, strict: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/boolean" target="_blank">boolean</a>, schema?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject, value?: <a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank">any</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="222"
class="link-to-prism">src/lib/schema-validation.mixin.ts:222</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>message</td>
<td>
<code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank" >string</a></code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>strict</td>
<td>
<code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/boolean" target="_blank" >boolean</a></code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>schema</td>
<td>
<code>OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject</code>
</td>
<td>
Yes
</td>
</tr>
<tr>
<td>value</td>
<td>
<code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</td>
<td>
Yes
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
</section>
</div>
<div class="tab-pane fade tab-source-code" id="source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import {
HttpHeaders,
HttpParams,
} from '@angular/common/http';
import { isDevMode } from '@angular/core';
import { HttpRemoteMethodParameter } from '@rxap/remote-method/http';
import {
assertsObject,
coerceArray,
isPromiseLike,
IsRecord,
} from '@rxap/utilities';
import Ajv from 'ajv';
import { OpenAPIV3 } from 'openapi-types';
import { RxapOpenApiError } from './error';
import { OperationObjectWithMetadata } from './open-api';
import {
IsReferenceObject,
NotContainsReferenceObjects,
} from './utilities';
export interface SchemaValidationResponse<Data> {
headers: HttpHeaders;
status: number;
body?: Data | null;
data?: Data;
}
export class SchemaValidationMixin<Response = any, Parameters extends Record<string, any> | void = any, RequestBody = any> {
public static STRICT = false;
protected disableSchemaValidation?: boolean;
/**
* Validates the parameters against the schema specified in the operation object
*
* @param operation
* @param parameters
* @param strict
* @protected
*/
public validateParameters(operation: OperationObjectWithMetadata, parameters?: Parameters, strict = false): void {
const operationParameters = coerceArray(operation.parameters);
if (!NotContainsReferenceObjects<OpenAPIV3.ParameterObject>(operationParameters)) {
throw new RxapOpenApiError('The operation parameters contains ReferenceObject!');
}
if (parameters === undefined) {
// TODO : find concept to definition witch parameter should not be checked if required
// header parameters are never required if changes the semantic release manager breaks
const requiredParameters = operationParameters.filter(parameter => parameter.required &&
parameter.in !==
'header');
if (requiredParameters.length) {
if (isDevMode()) {
console.debug('Some operation parameters are required!', requiredParameters.map(p => p.name));
}
this.validationError('Some operation parameters are required!', strict);
}
} else if (IsRecord(parameters)) {
for (const parameter of operationParameters) {
if (parameter.required) {
// header parameters are never required if changes the semantic release manager breaks
if (parameter.in !== 'header') {
if (!parameters.hasOwnProperty(parameter.name)) {
this.validationError(`The operation parameter '${ parameter.name }' is required!`, strict);
}
}
}
if (parameter.schema) {
if (parameters.hasOwnProperty(parameter.name)) {
const value = parameters[parameter.name];
if (!this.validate(parameter.schema, value)) {
this.validationError(
`The parameter '${ parameter.name }' is not valid against the schema!`,
strict,
parameter.schema,
value,
);
}
}
}
}
} else {
if (operationParameters.length === 0 || operationParameters.every(op => !op.required)) {
if (isDevMode()) {
console.warn(
`The operation ${ operation.operationId } does not expect any parameters. But a parameter is provided.`,
parameters,
);
}
} else {
throw new Error('The parameters object is not a record');
}
}
}
/**
* Validates the http response against the schema specified in the operation object
*
* @param operation
* @param response
* @param strict
* @protected
*/
public validateResponse(
operation: OperationObjectWithMetadata,
response: SchemaValidationResponse<Response>,
strict = false,
): void {
// region only validate the response if the content type is undefined or application/json
const contentType = response.headers.get('Content-Type');
if (contentType && contentType !== 'application/json') {
if (isDevMode()) {
console.warn('Response validation is only supported for content type application/json');
}
return;
}
// endregion
if (operation.responses) {
const status = response.status;
// region extract the response object based on the response status
let responseObject: OpenAPIV3.ResponseObject | OpenAPIV3.ReferenceObject | undefined;
if (operation.responses[status]) {
responseObject = operation.responses[status];
} else {
// use the default response object if no matching was found.
responseObject = operation.responses['default'];
}
// endregion
if (responseObject) {
if (IsReferenceObject(responseObject)) {
throw new RxapOpenApiError('Found