@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,243 lines (1,056 loc) • 51.9 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 injectable">
<div class="content-data">
<ol class="breadcrumb">
<li class="breadcrumb-item">Injectables</li>
<li class="breadcrumb-item" >OpenApiConfigService</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/open-api-config.service.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">Static</span>
<a href="#Config" >Config</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#defaultServerIndex" >defaultServerIndex</a>
</li>
<li>
<span class="modifier">Static</span>
<a href="#DefaultServerIndex" >DefaultServerIndex</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="#getBaseUrl" >getBaseUrl</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#getOperation" >getOperation</a>
</li>
<li>
<span class="modifier">Static</span>
<a href="#GetOperation" >GetOperation</a>
</li>
<li>
<span class="modifier">Public</span>
<a href="#insertServer" >insertServer</a>
</li>
<li>
<span class="modifier">Static</span>
<a href="#InsertServer" >InsertServer</a>
</li>
<li>
<span class="modifier">Static</span>
<span class="modifier">Async</span>
<a href="#Load" >Load</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>Accessors</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#serverIds" >serverIds</a>
</li>
<li>
<a href="#config" >config</a>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-constructor">
<h3 id="constructor">Constructor</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<code>constructor(config: OpenAPIV3.Document | null)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="34" class="link-to-prism">src/lib/open-api-config.service.ts:34</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div>
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>config</td>
<td>
<code>OpenAPIV3.Document | null</code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</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="getBaseUrl"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>getBaseUrl</b></span>
<a href="#getBaseUrl"><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>getBaseUrl(serverIndex: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank">number</a>, serverId?: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="208"
class="link-to-prism">src/lib/open-api-config.service.ts:208</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>serverIndex</td>
<td>
<code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank" >number</a></code>
</td>
<td>
No
</td>
<td>
<code>this.defaultServerIndex</code>
</td>
</tr>
<tr>
<td>serverId</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>
Yes
</td>
<td>
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank" >string</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="getOperation"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>getOperation</b></span>
<a href="#getOperation"><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>getOperation(operationId: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>)</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/open-api-config.service.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>
</tr>
</thead>
<tbody>
<tr>
<td>operationId</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>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="../interfaces/OperationObjectWithMetadata.html" target="_self" >OperationObjectWithMetadata</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="GetOperation"></a>
<span class="name">
<span class="modifier">Static</span>
<span ><b>GetOperation</b></span>
<a href="#GetOperation"><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>GetOperation(operationId: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="97"
class="link-to-prism">src/lib/open-api-config.service.ts:97</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>operationId</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>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="../interfaces/OperationObjectWithMetadata.html" target="_self" >OperationObjectWithMetadata</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="insertServer"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>insertServer</b></span>
<a href="#insertServer"><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>insertServer(serverConfig: OpenAPIV3.ServerObject, index: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank">number</a>, serverId?: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="247"
class="link-to-prism">src/lib/open-api-config.service.ts:247</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>serverConfig</td>
<td>
<code>OpenAPIV3.ServerObject</code>
</td>
<td>
No
</td>
<td>
</td>
</tr>
<tr>
<td>index</td>
<td>
<code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank" >number</a></code>
</td>
<td>
No
</td>
<td>
<code>this.defaultServerIndex</code>
</td>
</tr>
<tr>
<td>serverId</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>
Yes
</td>
<td>
</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="InsertServer"></a>
<span class="name">
<span class="modifier">Static</span>
<span ><b>InsertServer</b></span>
<a href="#InsertServer"><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>InsertServer(serverConfig: OpenAPIV3.ServerObject, index: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank">number</a>, serverId?: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>, config: OpenAPIV3.Document)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="227"
class="link-to-prism">src/lib/open-api-config.service.ts:227</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>serverConfig</td>
<td>
<code>OpenAPIV3.ServerObject</code>
</td>
<td>
No
</td>
<td>
</td>
</tr>
<tr>
<td>index</td>
<td>
<code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank" >number</a></code>
</td>
<td>
No
</td>
<td>
</td>
</tr>
<tr>
<td>serverId</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>
Yes
</td>
<td>
</td>
</tr>
<tr>
<td>config</td>
<td>
<code>OpenAPIV3.Document</code>
</td>
<td>
No
</td>
<td>
<code>this.Config!</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="Load"></a>
<span class="name">
<span class="modifier">Static</span>
<span class="modifier">Async</span>
<span ><b>Load</b></span>
<a href="#Load"><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>Load(openApiUrl: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank">string</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="66"
class="link-to-prism">src/lib/open-api-config.service.ts:66</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description"><p>Used to load the app open api config from a remote resource.</p>
<p>Promise.all([ OpenApiDataSourceLoader.Load() ])
.then(() => platformBrowserDynamic().bootstrapModule(AppModule))
.catch(err => console.error(err))</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>openApiUrl</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>
<td>
<code>'openapi.json'</code>
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code>Promise<void></code>
</div>
<div class="io-description">
</div>
</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="Config"></a>
<span class="name">
<span class="modifier">Static</span>
<span ><b>Config</b></span>
<a href="#Config"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code>OpenAPIV3.Document | null</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>null</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="19" class="link-to-prism">src/lib/open-api-config.service.ts:19</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="defaultServerIndex"></a>
<span class="name">
<span class="modifier">Public</span>
<span ><b>defaultServerIndex</b></span>
<a href="#defaultServerIndex"><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/number" target="_blank" >number</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>OpenApiConfigService.DefaultServerIndex</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="24" class="link-to-prism">src/lib/open-api-config.service.ts:24</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="DefaultServerIndex"></a>
<span class="name">
<span class="modifier">Static</span>
<span ><b>DefaultServerIndex</b></span>
<a href="#DefaultServerIndex"><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/number" target="_blank" >number</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>0</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="21" class="link-to-prism">src/lib/open-api-config.service.ts:21</a></div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-accessors">
<h3 id="accessors">
Accessors
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="serverIds"></a>
<span class="name"><b>serverIds</b><a href="#serverIds"><span class="icon ion-ios-link"></span></a></span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="accessor"><b>get</b><code>serverIds()</code></span>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="32" class="link-to-prism">src/lib/open-api-config.service.ts:32</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="config"></a>
<span class="name"><b>config</b><a href="#config"><span class="icon ion-ios-link"></span></a></span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="accessor"><b>get</b><code>config()</code></span>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="51" class="link-to-prism">src/lib/open-api-config.service.ts:51</a></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 {
Inject,
Injectable,
isDevMode,
Optional,
} from '@angular/core';
import {
OpenAPI,
OpenAPIV3,
} from 'openapi-types';
import { OperationObjectWithMetadata } from './open-api';
import { RXAP_OPEN_API_CONFIG } from './tokens';
import { AssertOpenApiV3 } from './utilities';
export type OperationMap = Map<string, OperationObjectWithMetadata>;
@Injectable({ providedIn: 'root' })
export class OpenApiConfigService {
public static Config: OpenAPIV3.Document | null = null;
public static DefaultServerIndex = 0;
private static _operations: OperationMap | null = null;
public defaultServerIndex: number = OpenApiConfigService.DefaultServerIndex;
private _operations: OperationMap | null = null;
private static serverConfigMap = new Map<string | undefined, OpenAPIV3.ServerObject[]>();
private get serverConfigMap(): Map<string | undefined, OpenAPIV3.ServerObject[]> {
return OpenApiConfigService.serverConfigMap;
}
get serverIds(): string[] {
return Object.keys(this.serverConfigMap);
}
constructor(
@Optional()
@Inject(RXAP_OPEN_API_CONFIG)
config: OpenAPIV3.Document | null = null,
) {
config = config ?? OpenApiConfigService.Config;
if (config) {
this._config = config;
this._operations = OpenApiConfigService.LoadOperations(config);
}
OpenApiConfigService.Config ??= config;
}
private _config: OpenAPIV3.Document | null = null;
public get config(): OpenAPIV3.Document {
if (!this._config) {
throw new Error('Could not load open api config');
}
return this._config;
}
/**
* Used to load the app open api config from a remote resource.
*
* Promise.all([ OpenApiDataSourceLoader.Load() ])
* .then(() => platformBrowserDynamic().bootstrapModule(AppModule))
* .catch(err => console.error(err))
*
*/
public static async Load(openApiUrl = 'openapi.json'): Promise<void> {
if (!openApiUrl) {
throw new Error('The open api url is not defined!');
}
let config: OpenAPIV3.Document | null = null;
try {
const response = await fetch(openApiUrl);
config = await response.json();
} catch (error: any) {
console.debug(
`Could not load the open api config from '${ openApiUrl }'!`,
error,
);
console.error(
`Could not load the open api config from '${ openApiUrl }'!`,
error.message,
);
}
if (config) {
const expandedConfig = await this.ExpandOpenApi(config);
AssertOpenApiV3(expandedConfig);
this.Config = expandedConfig;
} else {
this.Config = null;
}
}
public static GetOperation(operationId: string): OperationObjectWithMetadata {
if (!this.Config) {
throw new Error('Could not load open api config');
}
if (!this._operations) {
this._operations = this.LoadOperations(this.Config);
}
if (!this._operations!.has(operationId)) {
throw new Error(
`The operation '${ operationId }' is not defined in the openapi-json`,
);
}
return this._operations!.get(operationId)!;
}
private static LoadOperations(config: OpenAPIV3.Document): OperationMap {
const operations = new Map<string, OperationObjectWithMetadata>();
Object.entries(config.paths)
.filter(
(item): item is [ string, OpenAPIV3.PathItemObject ] =>
item[0] !== undefined,
)
.filter(
([ _, methods ]: [ string, OpenAPIV3.PathItemObject ]) =>
methods &&
Object.keys(methods).some((method) =>
[ 'get', 'put', 'post', 'delete', 'patch' ].includes(method),
),
)
.forEach(([ path, methods ]: [ string, OpenAPIV3.PathItemObject ]) =>
Object.entries(methods)
.filter(
(item): item is [ string, OpenAPIV3.OperationObject ] =>
item[0] !== undefined,
)
.forEach(
([ method, operation ]: [ string, OpenAPIV3.OperationObject ]) => {
if (!operation.operationId) {
throw new Error('The OpenApu OperationId is not defined');
}
if (operations!.has(operation.operationId)) {
throw new Error(
`The OpenApi Operation '${ operation.operationId }' is already defined.`,
);
}
operations!.set(operation.operationId, {
...operation,
path: path,
method: method.toUpperCase(),
});
},
),
);
return operations;
}
private static GetBaseUrl(
config: OpenAPIV3.Document,
serverIndex: number = this.DefaultServerIndex,
): string {
const server = config.servers ? config.servers[serverIndex] : null;
if (!server) {
console.debug(
`Could not extract the server config with the index '${ serverIndex }' from the open api config`,
config,
);
throw new Error(
`Could not extract the server config with the index '${ serverIndex }' from the open api config`,
);
}
return server.url;
}
/**
* Replaces all $ref with the concrete definition
*
* @param config
* @private
*/
private static ExpandOpenApi(
config: OpenAPI.Document,
): Promise<OpenAPI.Document> {
return Promise.resolve(config);
}
public getOperation(operationId: string): OperationObjectWithMetadata {
if (!this._operations) {
if (!this._config) {
throw new Error('The operations map is not loaded and the config object is not loaded');
}
this._operations = OpenApiConfigService.LoadOperations(this._config);
}
if (!this._operations.has(operationId)) {
console.error(
`The operation '${ operationId }' is not defined in the openapi-json`,
isDevMode() ? this.config : undefined,
);
throw new Error(
`The operation '${ operationId }' is not defined in the openapi-json`,
);
}
return this._operations.get(operationId)!;
}
public getBaseUrl(serverIndex: number = this.defaultServerIndex, serverId?: string): string {
let serverConfig: OpenAPIV3.ServerObject | undefined;
const servers = this._config?.servers ?? [];
if (!serverId && servers) {
serverConfig = servers[serverIndex];
}
if (this.serverConfigMap.has(serverId)) {
serverConfig = this.serverConfigMap.get(serverId)![serverIndex];
}
if (!serverConfig) {
console.error(
`Could not determine the base url with the index '${ serverIndex }' and the serverId '${ serverId }'`,
isDevMode() ? servers : undefined,
);
throw new Error(`Could not determine the base url with the index '${ serverIndex }' and the serverId '${ serverId }'`);
}
return serverConfig.url;
}
public static InsertServer(
serverConfig: OpenAPIV3.ServerObject,
index: number,
serverId?: string,
config: OpenAPIV3.Document = this.Config!,
): void {
if (!serverId && config) {
if (!config.servers) {
config.servers = [];
}
config.servers.splice(index, 1, serverConfig);
}
if (!this.serverConfigMap.has(serverId)) {
this.serverConfigMap.set(serverId, []);
}
const list = this.serverConfigMap.get(serverId)!;
list[index] = serverConfig;
this.serverConfigMap.set(serverId, list);
}
public insertServer(
serverConfig: OpenAPIV3.ServerObject,
index: number = this.defaultServerIndex,
serverId?: string,
): void {
OpenApiConfigService.InsertServer(serverConfig, index, serverId, this.config);
}
}
</code></pre>
</div>
</div>
</div><div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
<!-- END CONTENT -->
</div>
</div>
<label class="dark-mode-switch">
<input type="checkbox">
<span class="slider">
<svg class="slider-icon" viewBox="0 0 24 24" fill="none" height="20" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" width="20" xmlns="http://www.w3.org/2000/svg">
<path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"></path>
</svg>
</span>
</label>
<script>
var COMPODOC_CURRENT_PAGE_DEPTH = 1;