- Cleanup references

This commit is contained in:
Ferdi Koomen 2019-11-17 21:08:10 +01:00
parent ea703d27dc
commit 433de4437e
29 changed files with 89 additions and 75 deletions

View File

@ -13,6 +13,7 @@ export interface Model {
imports: string[];
extends: string[];
enum: Enum[];
enums: Model[];
properties: Model[];
validation?: Validation;
}

View File

@ -1,6 +1,5 @@
import { OpenApiExternalDocs } from './OpenApiExternalDocs';
import { OpenApiParameter } from './OpenApiParameter';
import { OpenApiReference } from './OpenApiReference';
import { OpenApiResponses } from './OpenApiResponses';
import { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement';
@ -15,7 +14,7 @@ export interface OpenApiOperation {
operationId?: string;
consumes?: string[];
produces?: string[];
parameters?: (OpenApiParameter & OpenApiReference)[];
parameters?: OpenApiParameter[];
responses: OpenApiResponses;
schemes: ('http' | 'https' | 'ws' | 'wss')[];
deprecated?: boolean;

View File

@ -1,16 +1,15 @@
import { OpenApiItems } from './OpenApiItems';
import { OpenApiSchema } from './OpenApiSchema';
import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#parameterObject
*/
export interface OpenApiParameter {
export interface OpenApiParameter extends OpenApiReference {
name: string;
in: 'path' | 'query' | 'header' | 'formData' | 'body';
description?: string;
required?: boolean;
schema?: OpenApiSchema & OpenApiReference;
schema?: OpenApiSchema;
type?: string;
format?: 'int32' | 'int64' | 'float' | 'double' | 'string' | 'boolean' | 'byte' | 'binary' | 'date' | 'date-time' | 'password';
allowEmptyValue?: boolean;

View File

@ -5,7 +5,7 @@ import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#pathItemObject
*/
export interface OpenApiPath {
export interface OpenApiPath extends OpenApiReference {
get?: OpenApiOperation;
put?: OpenApiOperation;
post?: OpenApiOperation;
@ -13,5 +13,5 @@ export interface OpenApiPath {
options?: OpenApiOperation;
head?: OpenApiOperation;
patch?: OpenApiOperation;
parameters?: (OpenApiParameter & OpenApiReference)[];
parameters?: OpenApiParameter[];
}

View File

@ -7,7 +7,7 @@ import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#responseObject
*/
export interface OpenApiResponse {
export interface OpenApiResponse extends OpenApiReference {
description: string;
schema?: OpenApiSchema & OpenApiReference;
headers?: Dictionary<OpenApiHeader>;

View File

@ -1,11 +1,10 @@
import { OpenApiReference } from './OpenApiReference';
import { OpenApiResponse } from './OpenApiResponse';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#responsesObject
*/
export interface OpenApiResponses {
[httpcode: string]: OpenApiResponse & OpenApiReference;
[httpcode: string]: OpenApiResponse;
default?: OpenApiResponse & OpenApiReference;
default?: OpenApiResponse;
}

View File

@ -1,13 +1,12 @@
import { Dictionary } from '../../../utils/types';
import { OpenApiExternalDocs } from './OpenApiExternalDocs';
import { OpenApiReference } from './OpenApiReference';
import { OpenApiXml } from './OpenApiXml';
import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#schemaObject
*/
export interface OpenApiSchema {
$ref?: string;
export interface OpenApiSchema extends OpenApiReference {
format?: 'int32' | 'int64' | 'float' | 'double' | 'string' | 'boolean' | 'byte' | 'binary' | 'date' | 'date-time' | 'password';
title?: string;
description?: string;
@ -28,10 +27,10 @@ export interface OpenApiSchema {
required?: string[];
enum?: (string | number)[];
type?: string;
items?: OpenApiSchema & OpenApiReference;
allOf?: (OpenApiSchema & OpenApiReference)[];
properties?: Dictionary<OpenApiSchema & OpenApiReference>;
additionalProperties?: boolean | (OpenApiSchema & OpenApiReference);
items?: OpenApiSchema;
allOf?: OpenApiSchema[];
properties?: Dictionary<OpenApiSchema>;
additionalProperties?: boolean | OpenApiSchema;
discriminator?: string;
readOnly?: boolean;
xml?: OpenApiXml;

View File

@ -1,6 +1,6 @@
import { EOL } from 'os';
export function getComment(comment: string | undefined): string | undefined {
export function getComment(comment?: string): string | undefined {
if (comment) {
return comment
.split(/(\r\n|\n|\r)+/g)

View File

@ -20,6 +20,7 @@ export function getModel(openApi: OpenApi, definition: OpenApiSchema, name: stri
imports: [],
extends: [],
enum: [],
enums: [],
properties: [],
};

View File

@ -3,10 +3,9 @@ import { OpenApiSchema } from '../interfaces/OpenApiSchema';
import { getComment } from './getComment';
import { getType } from './getType';
import { Model } from '../../../client/interfaces/Model';
import { OpenApiReference } from '../interfaces/OpenApiReference';
import { getModel } from './getModel';
export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema & OpenApiReference): Model[] {
export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema): Model[] {
const result: Model[] = [];
for (const propertyName in definition.properties) {
if (definition.properties.hasOwnProperty(propertyName)) {
@ -20,12 +19,13 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema &
type: prop.type,
base: prop.base,
template: prop.template,
description: getComment(definition.description),
description: getComment(property.description),
readOnly: propertyReadOnly,
required: propertyRequired,
imports: prop.imports,
extends: [],
enum: [],
enums: [],
properties: [],
validation: {
type: 'property',
@ -40,12 +40,13 @@ export function getModelProperties(openApi: OpenApi, definition: OpenApiSchema &
type: prop.type,
base: prop.base,
template: prop.template,
description: property.description,
description: getComment(property.description),
readOnly: propertyReadOnly,
required: propertyRequired,
imports: prop.imports,
extends: prop.extends,
enum: prop.enum,
enums: prop.enums,
properties: prop.properties,
validation: {
type: 'property',

View File

@ -1,5 +1,4 @@
import { OpenApiParameter } from '../interfaces/OpenApiParameter';
import { OpenApiReference } from '../interfaces/OpenApiReference';
import { OpenApi } from '../interfaces/OpenApi';
import { getRef } from './getRef';
import { OperationParameters } from '../../../client/interfaces/OperationParameters';
@ -10,7 +9,7 @@ function sortByRequired(a: OperationParameter, b: OperationParameter): number {
return a.required && !b.required ? -1 : !a.required && b.required ? 1 : 0;
}
export function getOperationParameters(openApi: OpenApi, parameters: (OpenApiParameter & OpenApiReference)[]): OperationParameters {
export function getOperationParameters(openApi: OpenApi, parameters: OpenApiParameter[]): OperationParameters {
const result: OperationParameters = {
imports: [],
parameters: [],

View File

@ -1,5 +1,4 @@
import { OpenApiSchema } from '../interfaces/OpenApiSchema';
import { OpenApiReference } from '../interfaces/OpenApiReference';
import { OpenApi } from '../interfaces/OpenApi';
import { PrimaryType } from './constants';
@ -10,7 +9,7 @@ export interface SchemaReference {
imports: string[];
}
export function getSchemaReference(openApi: OpenApi, schema: OpenApiSchema & OpenApiReference): SchemaReference {
export function getSchemaReference(openApi: OpenApi, schema: OpenApiSchema): SchemaReference {
const result: SchemaReference = {
type: PrimaryType.OBJECT,
base: PrimaryType.OBJECT,

View File

@ -8,7 +8,7 @@ import { PrimaryType } from './constants';
* @param value String value like "integer" or "Link[Model]".
* @param template Optional template class from parent (needed to process generics)
*/
export function getType(value: string | undefined, template?: string): Type {
export function getType(value?: string, template?: string): Type {
const result: Type = {
type: PrimaryType.OBJECT,
base: PrimaryType.OBJECT,

View File

@ -1,8 +1,9 @@
import { OpenApiPath } from './OpenApiPath';
import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#callbackObject
*/
export interface OpenApiCallback {
export interface OpenApiCallback extends OpenApiReference {
[key: string]: OpenApiPath;
}

View File

@ -4,7 +4,6 @@ import { OpenApiExample } from './OpenApiExample';
import { OpenApiHeader } from './OpenApiHeader';
import { OpenApiLink } from './OpenApiLink';
import { OpenApiParameter } from './OpenApiParameter';
import { OpenApiReference } from './OpenApiReference';
import { OpenApiRequestBody } from './OpenApiRequestBody';
import { OpenApiResponses } from './OpenApiResponses';
import { OpenApiSchema } from './OpenApiSchema';
@ -14,13 +13,13 @@ import { OpenApiSecurityScheme } from './OpenApiSecurityScheme';
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject
*/
export interface OpenApiComponents {
schemas?: Dictionary<OpenApiSchema & OpenApiReference>;
responses?: Dictionary<OpenApiResponses & OpenApiReference>;
parameters?: Dictionary<OpenApiParameter & OpenApiReference>;
examples?: Dictionary<OpenApiExample & OpenApiReference>;
requestBodies?: Dictionary<OpenApiRequestBody & OpenApiReference>;
headers?: Dictionary<OpenApiHeader & OpenApiReference>;
securitySchemes: Dictionary<OpenApiSecurityScheme & OpenApiReference>;
links?: Dictionary<OpenApiLink & OpenApiReference>;
callbacks?: Dictionary<OpenApiCallback & OpenApiReference>;
schemas?: Dictionary<OpenApiSchema>;
responses?: Dictionary<OpenApiResponses>;
parameters?: Dictionary<OpenApiParameter>;
examples?: Dictionary<OpenApiExample>;
requestBodies?: Dictionary<OpenApiRequestBody>;
headers?: Dictionary<OpenApiHeader>;
securitySchemes: Dictionary<OpenApiSecurityScheme>;
links?: Dictionary<OpenApiLink>;
callbacks?: Dictionary<OpenApiCallback>;
}

View File

@ -1,13 +1,12 @@
import { Dictionary } from '../../../utils/types';
import { OpenApiHeader } from './OpenApiHeader';
import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#encodingObject
*/
export interface OpenApiEncoding {
contentType?: string;
headers?: Dictionary<OpenApiHeader & OpenApiReference>;
headers?: Dictionary<OpenApiHeader>;
style?: string;
explode?: boolean;
allowReserved?: boolean;

View File

@ -1,7 +1,9 @@
import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#exampleObject
*/
export interface OpenApiExample {
export interface OpenApiExample extends OpenApiReference {
summary?: string;
description?: string;
value?: any;

View File

@ -6,7 +6,7 @@ import { OpenApiSchema } from './OpenApiSchema';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#headerObject
*/
export interface OpenApiHeader {
export interface OpenApiHeader extends OpenApiReference {
description?: string;
required?: boolean;
deprecated?: boolean;
@ -14,7 +14,7 @@ export interface OpenApiHeader {
style?: string;
explode?: boolean;
allowReserved?: boolean;
schema?: OpenApiSchema & OpenApiReference;
schema?: OpenApiSchema;
example?: any;
examples?: Dictionary<OpenApiExample & OpenApiReference>;
examples?: Dictionary<OpenApiExample>;
}

View File

@ -1,10 +1,11 @@
import { Dictionary } from '../../../utils/types';
import { OpenApiServer } from './OpenApiServer';
import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#linkObject
*/
export interface OpenApiLink {
export interface OpenApiLink extends OpenApiReference {
operationRef?: string;
operationId?: string;
parameters?: Dictionary<any>;

View File

@ -7,9 +7,9 @@ import { OpenApiSchema } from './OpenApiSchema';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#mediaTypeObject
*/
export interface OpenApiMediaType {
schema?: OpenApiSchema & OpenApiReference;
export interface OpenApiMediaType extends OpenApiReference {
schema?: OpenApiSchema;
example?: any;
examples?: Dictionary<OpenApiExample & OpenApiReference>;
examples?: Dictionary<OpenApiExample>;
encoding?: Dictionary<OpenApiEncoding>;
}

View File

@ -2,7 +2,6 @@ import { Dictionary } from '../../../utils/types';
import { OpenApiCallback } from './OpenApiCallback';
import { OpenApiExternalDocs } from './OpenApiExternalDocs';
import { OpenApiParameter } from './OpenApiParameter';
import { OpenApiReference } from './OpenApiReference';
import { OpenApiRequestBody } from './OpenApiRequestBody';
import { OpenApiResponses } from './OpenApiResponses';
import { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement';
@ -17,10 +16,10 @@ export interface OpenApiOperation {
description?: string;
externalDocs?: OpenApiExternalDocs;
operationId?: string;
parameters?: (OpenApiParameter & OpenApiReference)[];
requestBody?: OpenApiRequestBody & OpenApiReference;
parameters?: OpenApiParameter[];
requestBody?: OpenApiRequestBody;
responses: OpenApiResponses;
callbacks?: Dictionary<OpenApiCallback & OpenApiReference>;
callbacks?: Dictionary<OpenApiCallback>;
deprecated?: boolean;
security?: OpenApiSecurityRequirement[];
servers?: OpenApiServer[];

View File

@ -6,7 +6,7 @@ import { OpenApiSchema } from './OpenApiSchema';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject
*/
export interface OpenApiParameter {
export interface OpenApiParameter extends OpenApiReference {
name: string;
in: 'path' | 'query' | 'header' | 'cookie';
description?: string;
@ -16,7 +16,7 @@ export interface OpenApiParameter {
style?: string;
explode?: boolean;
allowReserved?: boolean;
schema?: OpenApiSchema & OpenApiReference;
schema?: OpenApiSchema;
example?: any;
examples?: Dictionary<OpenApiExample & OpenApiReference>;
examples?: Dictionary<OpenApiExample>;
}

View File

@ -1,6 +1,5 @@
import { OpenApiOperation } from './OpenApiOperation';
import { OpenApiParameter } from './OpenApiParameter';
import { OpenApiReference } from './OpenApiReference';
import { OpenApiServer } from './OpenApiServer';
/**
@ -18,5 +17,5 @@ export interface OpenApiPath {
patch?: OpenApiOperation;
trace?: OpenApiOperation;
servers?: OpenApiServer[];
parameters?: (OpenApiParameter & OpenApiReference)[];
parameters?: OpenApiParameter[];
}

View File

@ -5,8 +5,8 @@ import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#requestBodyObject
*/
export interface OpenApiRequestBody {
export interface OpenApiRequestBody extends OpenApiReference {
description?: string;
content: Dictionary<OpenApiMediaType & OpenApiReference>;
content: Dictionary<OpenApiMediaType>;
required?: boolean;
}

View File

@ -7,9 +7,9 @@ import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject
*/
export interface OpenApiResponse {
export interface OpenApiResponse extends OpenApiReference {
description: string;
headers?: Dictionary<OpenApiHeader & OpenApiReference>;
headers?: Dictionary<OpenApiHeader>;
content?: Dictionary<OpenApiMediaType>;
links?: Dictionary<OpenApiLink & OpenApiReference>;
links?: Dictionary<OpenApiLink>;
}

View File

@ -4,8 +4,8 @@ import { OpenApiResponse } from './OpenApiResponse';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responsesObject
*/
export interface OpenApiResponses {
[httpcode: string]: OpenApiResponse & OpenApiReference;
export interface OpenApiResponses extends OpenApiReference {
[httpcode: string]: OpenApiResponse;
default: OpenApiResponse & OpenApiReference;
default: OpenApiResponse;
}

View File

@ -7,7 +7,7 @@ import { OpenApiXml } from './OpenApiXml';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject
*/
export interface OpenApiSchema {
export interface OpenApiSchema extends OpenApiReference {
title?: string;
multipleOf?: number;
maximum?: number;
@ -25,13 +25,13 @@ export interface OpenApiSchema {
required?: string[];
enum?: string[];
type?: string;
allOf?: (OpenApiSchema & OpenApiReference)[];
oneOf?: (OpenApiSchema & OpenApiReference)[];
anyOf?: (OpenApiSchema & OpenApiReference)[];
not?: (OpenApiSchema & OpenApiReference)[];
items?: OpenApiSchema & OpenApiReference;
properties?: Dictionary<OpenApiSchema & OpenApiReference>;
additionalProperties?: boolean | (OpenApiSchema & OpenApiReference);
allOf?: OpenApiSchema[];
oneOf?: OpenApiSchema[];
anyOf?: OpenApiSchema[];
not?: OpenApiSchema[];
items?: OpenApiSchema;
properties?: Dictionary<OpenApiSchema>;
additionalProperties?: boolean | OpenApiSchema;
description?: string;
format?: 'int32' | 'int64' | 'float' | 'double' | 'string' | 'boolean' | 'byte' | 'binary' | 'date' | 'date-time' | 'password';
default?: any;

View File

@ -1,9 +1,10 @@
import { OpenApiOAuthFlows } from './OpenApiOAuthFlows';
import { OpenApiReference } from './OpenApiReference';
/**
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#securitySchemeObject
*/
export interface OpenApiSecurityScheme {
export interface OpenApiSecurityScheme extends OpenApiReference {
type: 'apiKey' | 'http' | 'oauth2' | 'openIdConnect';
description?: string;
name?: string;

View File

@ -16,6 +16,22 @@ export function exportModel(model: Model): any {
return nameA.localeCompare(nameB);
}),
properties: model.properties
.map(property => exportModel(property))
.filter(property => property.enum.length)
.filter((property, index, arr) => {
return arr.findIndex(item => item.name === property.name) === index;
})
.sort((a, b) => {
const nameA = a.name.toLowerCase();
const nameB = b.name.toLowerCase();
return nameA.localeCompare(nameB);
}),
enums: model.properties
.map(property => exportModel(property))
.filter(property => !property.enum.length)
.filter((property, index, arr) => {
return arr.findIndex(item => item.name === property.name) === index;
})
.filter((property, index, arr) => {
return arr.findIndex(item => item.name === property.name) === index;
})