Skip to content

Commit a77de03

Browse files
authored
Merge pull request #268 from JaredCE/minor-documentation-fixes
Minor documentation fixes
2 parents 310c7a1 + 018c678 commit a77de03

5 files changed

Lines changed: 531 additions & 221 deletions

File tree

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "serverless-openapi-documenter",
3-
"version": "0.0.121",
3+
"version": "0.0.122",
44
"description": "Generate OpenAPI v3 documentation and Postman Collections from your Serverless Config",
55
"main": "index.js",
66
"keywords": [

src/definitionGenerator.js

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,12 @@ class DefinitionGenerator {
167167

168168
if (documentation.contact) {
169169
const contactObj = {};
170-
contactObj.name = documentation.contact.name || "";
170+
171+
if (documentation.contact.name) contactObj.name = documentation.contact.name;
171172

172173
if (documentation.contact.url) contactObj.url = documentation.contact.url;
173174

174-
contactObj.email = documentation.contact.email || "";
175+
if (documentation.contact.email) contactObj.email = documentation.contact.email;
175176

176177
const extendedSpec = this.extendSpecification(documentation.contact);
177178

@@ -591,7 +592,9 @@ class DefinitionGenerator {
591592
obj.headers = corsHeaders;
592593
addHeaders(owaspHeaders);
593594
} else {
594-
obj.headers = owaspHeaders;
595+
if (Object.keys(owaspHeaders).length) {
596+
obj.headers = owaspHeaders;
597+
}
595598
}
596599
}
597600

@@ -677,10 +680,13 @@ class DefinitionGenerator {
677680

678681
async createRequestBody(requestBodyDetails) {
679682
const obj = {
680-
description: requestBodyDetails.description,
681683
required: requestBodyDetails.required || false,
682684
};
683685

686+
if (requestBodyDetails.description) {
687+
obj.description = requestBodyDetails.description;
688+
}
689+
684690
obj.content = await this.createMediaTypeObject(
685691
requestBodyDetails.models
686692
).catch((err) => {
@@ -692,56 +698,60 @@ class DefinitionGenerator {
692698

693699
async createMediaTypeObject(models, type) {
694700
const mediaTypeObj = {};
695-
696701
for (const mediaTypeDocumentation of this.schemaHandler.models) {
697702
if (models === undefined || models === null) {
698703
throw new Error(
699704
`${this.currentFunctionName} is missing a Response Model for statusCode ${this.currentStatusCode}`
700705
);
701706
}
702707

703-
if (Object.values(models).includes(mediaTypeDocumentation.name)) {
704-
let contentKey = "";
705-
for (const [key, value] of Object.entries(models)) {
706-
if (value === mediaTypeDocumentation.name) contentKey = key;
708+
for (const modelContentType in models) {
709+
let contentKey
710+
711+
if (models[modelContentType] === mediaTypeDocumentation.name) {
712+
contentKey = modelContentType;
707713
}
708-
const obj = {};
709714

710-
let schema;
711-
if (mediaTypeDocumentation?.content) {
712-
if (mediaTypeDocumentation.content[contentKey]?.example)
713-
obj.example = mediaTypeDocumentation.content[contentKey].example;
715+
if (contentKey) {
714716

715-
if (mediaTypeDocumentation.content[contentKey]?.examples)
716-
obj.examples = this.createExamples(
717-
mediaTypeDocumentation.content[contentKey].examples
718-
);
717+
const obj = {};
718+
let schema;
719+
if (mediaTypeDocumentation.content) {
720+
if (mediaTypeDocumentation.content[contentKey]?.example) {
721+
obj.example = mediaTypeDocumentation.content[contentKey]?.example;
722+
}
719723

720-
schema = mediaTypeDocumentation.content[contentKey].schema;
721-
} else if (
722-
mediaTypeDocumentation?.contentType &&
723-
mediaTypeDocumentation.schema
724-
) {
725-
if (mediaTypeDocumentation?.example)
726-
obj.example = mediaTypeDocumentation.example;
724+
if (mediaTypeDocumentation.content[contentKey]?.examples) {
725+
obj.examples = this.createExamples(
726+
mediaTypeDocumentation.content[contentKey].examples
727+
);
728+
}
727729

728-
if (mediaTypeDocumentation?.examples)
729-
obj.examples = this.createExamples(mediaTypeDocumentation.examples);
730+
schema = (mediaTypeDocumentation.schema) ? mediaTypeDocumentation.schema : mediaTypeDocumentation.schemas[contentKey];
731+
} else if (mediaTypeDocumentation?.contentType && mediaTypeDocumentation.schema) {
732+
if (mediaTypeDocumentation.example) {
733+
obj.example = mediaTypeDocumentation.example;
734+
}
730735

731-
schema = mediaTypeDocumentation.schema;
732-
}
736+
if (mediaTypeDocumentation.examples) {
737+
obj.example = mediaTypeDocumentation.examples;
738+
}
733739

734-
const schemaRef = await this.schemaHandler
735-
.createSchema(mediaTypeDocumentation.name)
736-
.catch((err) => {
737-
throw err;
738-
});
740+
schema = mediaTypeDocumentation.schema;
741+
}
739742

740-
obj.schema = {
741-
$ref: schemaRef,
742-
};
743+
const schemaRef = await this.schemaHandler
744+
.createSchema(mediaTypeDocumentation.name)
745+
.catch((err) => {
746+
throw err;
747+
});
743748

744-
Object.assign(mediaTypeObj, { [contentKey]: obj });
749+
obj.schema = {
750+
$ref: schemaRef,
751+
};
752+
753+
Object.assign(mediaTypeObj, { [contentKey]: obj });
754+
}
745755
}
746756
}
747757

@@ -861,7 +871,7 @@ class DefinitionGenerator {
861871
if (
862872
this.openAPI.components[type][name] &&
863873
isEqual(schemaObj[name], this.openAPI.components[type][name]) ===
864-
false
874+
false
865875
) {
866876
delete schemaObj[name];
867877
newName = `${name}-${uuid()}`;

src/schemaHandler.js

Lines changed: 58 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,21 @@ class SchemaHandler {
4242
return model;
4343
}
4444

45-
const contentType = Object.keys(model.content)[0];
46-
model.contentType = contentType;
47-
model.schema = model.content[contentType].schema;
45+
if (Object.keys(model.content).length === 1) {
46+
const contentType = Object.keys(model.content)[0];
47+
model.contentType = contentType;
48+
model.contentTypes = [contentType];
49+
model.schema = model.content[contentType].schema;
50+
} else {
51+
model.contentType = null;
52+
model.contentTypes = Object.keys(model.content);
53+
model.schema = null;
54+
model.schemas = {};
55+
for (const key in model.content) {
56+
Object.assign(model.schemas, {[key]: {schema: model.content[key].schema}});
57+
}
58+
// model.schema = model.content[contentType].schema;
59+
}
4860

4961
return model;
5062
};
@@ -69,43 +81,53 @@ class SchemaHandler {
6981
async addModelsToOpenAPI() {
7082
for (const model of this.models) {
7183
const modelName = model.name;
72-
const modelSchema = model.schema;
84+
const schemas = []
85+
if (model.schema){
86+
// const modelSchema = model.schema;
87+
schemas.push(model.schema)
88+
} else {
89+
for (const key in model.schemas) {
90+
schemas.push(model.schemas[key].schema);
91+
}
92+
}
7393

74-
const convertedSchemas = await this.__dereferenceAndConvert(
75-
modelSchema,
76-
modelName,
77-
model
78-
).catch((err) => {
79-
if (err instanceof Error) throw err;
80-
else return err;
81-
});
94+
for (const modelSchema of schemas) {
95+
const convertedSchemas = await this.__dereferenceAndConvert(
96+
modelSchema,
97+
modelName,
98+
model
99+
).catch((err) => {
100+
if (err instanceof Error) throw err;
101+
else return err;
102+
});
103+
104+
if (
105+
typeof convertedSchemas.schemas === "object" &&
106+
!Array.isArray(convertedSchemas.schemas) &&
107+
convertedSchemas.schemas !== null
108+
) {
109+
for (const [schemaName, schemaValue] of Object.entries(
110+
convertedSchemas.schemas
111+
)) {
112+
if (schemaName === modelName) {
113+
this.modelReferences[
114+
schemaName
115+
] = `#/components/schemas/${modelName}`;
116+
}
82117

83-
if (
84-
typeof convertedSchemas.schemas === "object" &&
85-
!Array.isArray(convertedSchemas.schemas) &&
86-
convertedSchemas.schemas !== null
87-
) {
88-
for (const [schemaName, schemaValue] of Object.entries(
89-
convertedSchemas.schemas
90-
)) {
91-
if (schemaName === modelName) {
92-
this.modelReferences[
93-
schemaName
94-
] = `#/components/schemas/${modelName}`;
118+
this.__addToComponents("schemas", schemaValue, schemaName);
95119
}
96-
97-
this.__addToComponents("schemas", schemaValue, schemaName);
120+
} else {
121+
throw new Error(
122+
`There was an error converting the ${
123+
model.name
124+
} schema. Model received looks like: \n\n${JSON.stringify(
125+
model
126+
)}. The convereted schema looks like \n\n${JSON.stringify(
127+
convertedSchemas
128+
)}`
129+
);
98130
}
99-
} else {
100-
throw new Error(
101-
`There was an error converting the ${
102-
model.name
103-
} schema. Model received looks like: \n\n${JSON.stringify(
104-
model
105-
)}. The convereted schema looks like \n\n${JSON.stringify(
106-
convertedSchemas
107-
)}`
108-
);
109131
}
110132
}
111133
}

0 commit comments

Comments
 (0)