Skip to content

Commit e545faa

Browse files
authored
Merge pull request #233 from JaredCE/genericise-logging
Genericise logging
2 parents 07657a3 + 8454415 commit e545faa

File tree

7 files changed

+342
-79
lines changed

7 files changed

+342
-79
lines changed

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: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "serverless-openapi-documenter",
3-
"version": "0.0.107",
3+
"version": "0.0.108",
44
"description": "Generate OpenAPI v3 documentation and Postman Collections from your Serverless Config",
55
"main": "index.js",
66
"keywords": [
@@ -27,7 +27,8 @@
2727
"Api Gateway",
2828
"APIGateway",
2929
"AWSAPIGateway",
30-
"Serverless OpenAPI"
30+
"Serverless OpenAPI",
31+
"serverless openapi"
3132
],
3233
"scripts": {
3334
"test": "mocha --config './test/.mocharc.js'"

src/definitionGenerator.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ const SchemaHandler = require("./schemaHandler");
1515
const oWASP = require("./owasp");
1616

1717
class DefinitionGenerator {
18-
constructor(serverless, options = {}) {
18+
constructor(serverless, logger) {
19+
this.logger = logger;
20+
1921
this.version =
2022
serverless?.processedInput?.options?.openApiVersion || "3.0.0";
2123

@@ -70,6 +72,12 @@ class DefinitionGenerator {
7072
};
7173

7274
try {
75+
this.logger.verbose(
76+
`Trying to resolve Redocly rules from: ${path.resolve(
77+
"options",
78+
"redocly.json"
79+
)}`
80+
);
7381
this.REDOCLY_RULES = require(path.resolve("options", "redocly.json"));
7482
} catch (err) {
7583
this.REDOCLY_RULES = {
@@ -83,6 +91,12 @@ class DefinitionGenerator {
8391
}
8492

8593
try {
94+
this.logger.verbose(
95+
`Trying to resolve Ref-Parser options from: ${path.resolve(
96+
"options",
97+
"ref-parser.js"
98+
)}`
99+
);
86100
this.refParserOptions = require(path.resolve("options", "ref-parser.js"));
87101
} catch (err) {
88102
this.refParserOptions = {};

src/logger.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
"use strict";
2+
3+
class Logger {
4+
constructor(serverless, log) {
5+
this.serverless = serverless;
6+
this.logOutput = log;
7+
8+
this.logTypes = {
9+
NOTICE: "notice",
10+
DEBUG: "debug",
11+
ERROR: "error",
12+
WARNING: "warning",
13+
INFO: "info",
14+
VERBOSE: "verbose",
15+
SUCCESS: "success",
16+
};
17+
18+
this.defaultLog = this.logTypes.NOTICE;
19+
}
20+
21+
log(str, type = this.defaultLog) {
22+
switch (this.serverless.version[0]) {
23+
case "2":
24+
let colouredString = str;
25+
if (type === "error") {
26+
colouredString = chalk.bold.red(`✖ ${str}`);
27+
} else if (type === "success") {
28+
colouredString = chalk.bold.green(`✓ ${str}`);
29+
}
30+
31+
this.serverless.cli.log(colouredString);
32+
break;
33+
34+
case "4":
35+
case "3":
36+
this.logOutput[type](str);
37+
break;
38+
39+
default:
40+
process.stdout.write(str.join(" "));
41+
break;
42+
}
43+
}
44+
45+
debug(str) {
46+
this.log(str, this.logTypes.DEBUG);
47+
}
48+
49+
error(str) {
50+
this.log(str, this.logTypes.ERROR);
51+
}
52+
53+
info(str) {
54+
this.log(str, this.logTypes.INFO);
55+
}
56+
57+
notice(str) {
58+
this.log(str, this.logTypes.NOTICE);
59+
}
60+
61+
success(str) {
62+
this.log(str, this.logTypes.SUCCESS);
63+
}
64+
65+
verbose(str) {
66+
this.log(str, this.logTypes.VERBOSE);
67+
}
68+
69+
warning(str) {
70+
this.log(str, this.logTypes.WARNING);
71+
}
72+
}
73+
74+
module.exports = Logger;

src/openAPIGenerator.js

Lines changed: 33 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,15 @@ const yaml = require("js-yaml");
55
const chalk = require("chalk");
66

77
const DefinitionGenerator = require("./definitionGenerator");
8+
const Logger = require("./logger");
89
const PostmanGenerator = require("openapi-to-postmanv2");
910

1011
class OpenAPIGenerator {
1112
constructor(serverless, options, { log = {} } = {}) {
1213
this.logOutput = log;
1314
this.serverless = serverless;
1415
this.options = options;
15-
16-
this.logTypes = {
17-
NOTICE: "notice",
18-
DEBUG: "debug",
19-
ERROR: "error",
20-
WARNING: "warning",
21-
INFO: "info",
22-
VERBOSE: "verbose",
23-
SUCCESS: "success",
24-
};
25-
26-
this.defaultLog = this.logTypes.NOTICE;
16+
this.logger = new Logger(this.serverless, this.logOutput);
2717

2818
this.commands = {
2919
openapi: {
@@ -145,7 +135,9 @@ class OpenAPIGenerator {
145135
}
146136

147137
async generate() {
148-
this.log(chalk.bold.underline("OpenAPI v3 Description Generation"));
138+
this.logger.notice(
139+
chalk.bold.underline("OpenAPI v3 Description Generation")
140+
);
149141
this.processCliInput();
150142

151143
const validOpenAPI = await this.generationAndValidation().catch((err) => {
@@ -168,37 +160,31 @@ class OpenAPIGenerator {
168160
}
169161
try {
170162
fs.writeFileSync(this.config.file, output);
171-
this.log(
172-
"OpenAPI v3 Description Successfully Written",
173-
this.logTypes.SUCCESS
174-
);
163+
this.logger.success("OpenAPI v3 Description Successfully Written");
175164
} catch (err) {
176-
this.log(
177-
`ERROR: An error was thrown whilst writing the OpenAPI Description`,
178-
this.logTypes.ERROR
165+
this.logger.error(
166+
`ERROR: An error was thrown whilst writing the OpenAPI Description`
179167
);
180168
throw new this.serverless.classes.Error(err);
181169
}
182170
}
183171

184172
async generationAndValidation() {
185-
const generator = new DefinitionGenerator(this.serverless);
173+
const generator = new DefinitionGenerator(this.serverless, this.logger);
186174

187-
this.log(`Generating OpenAPI Description`, this.logTypes.NOTICE);
175+
this.logger.notice(`Generating OpenAPI Description`);
188176
await generator.parse().catch((err) => {
189-
this.log(
190-
`ERROR: An error was thrown generating the OpenAPI v3 Description`,
191-
this.logTypes.ERROR
177+
this.logger.error(
178+
`ERROR: An error was thrown generating the OpenAPI v3 Description`
192179
);
193180
throw new this.serverless.classes.Error(err);
194181
});
195182

196-
this.log(`Validating generated OpenAPI Description`, this.logTypes.NOTICE);
183+
this.logger.notice(`Validating generated OpenAPI Description`);
197184

198185
const validationResults = await generator.validate().catch((err) => {
199-
this.log(
200-
`ERROR: An error was thrown validating the OpenAPI v3 Description`,
201-
this.logTypes.ERROR
186+
this.logger.error(
187+
`ERROR: An error was thrown validating the OpenAPI v3 Description`
202188
);
203189

204190
throw new this.serverless.classes.Error(err);
@@ -219,42 +205,37 @@ class OpenAPIGenerator {
219205
if (shouldThrow) throw new this.serverless.classes.Error(message);
220206
}
221207

222-
this.log(
223-
"OpenAPI v3 Description Successfully Generated",
224-
this.logTypes.SUCCESS
225-
);
208+
this.logger.success("OpenAPI v3 Description Successfully Generated");
226209

227210
return generator.openAPI;
228211
}
229212

230213
createPostman(openAPI) {
231214
const postmanGeneration = (err, result) => {
232215
if (err) {
233-
this.log(
234-
`ERROR: An error was thrown when generating the postman collection`,
235-
this.logTypes.ERROR
216+
this.logger.error(
217+
`ERROR: An error was thrown when generating the postman collection`
236218
);
237219
throw new this.serverless.classes.Error(err);
238220
}
239221

240-
this.log(
241-
"postman collection v2 Documentation Successfully Generated",
242-
this.logTypes.SUCCESS
222+
this.logger.success(
223+
"postman collection v2 Documentation Successfully Generated"
243224
);
225+
244226
try {
245227
fs.writeFileSync(
246228
this.config.postmanCollection,
247229
JSON.stringify(result.output[0].data)
248230
);
249-
this.log(
250-
"postman collection v2 Documentation Successfully Written",
251-
this.logTypes.SUCCESS
231+
this.logger.success(
232+
"postman collection v2 Documentation Successfully Written"
252233
);
253234
} catch (err) {
254-
this.log(
255-
`ERROR: An error was thrown whilst writing the postman collection`,
256-
this.logTypes.ERROR
235+
this.logger.error(
236+
`ERROR: An error was thrown whilst writing the postman collection`
257237
);
238+
258239
throw new this.serverless.classes.Error(err);
259240
}
260241
};
@@ -295,7 +276,7 @@ class OpenAPIGenerator {
295276
this.serverless.processedInput.options.output ||
296277
(config.format === "yaml" ? "openapi.yml" : "openapi.json");
297278

298-
this.log(
279+
this.logger.notice(
299280
`${chalk.bold.green("[OPTIONS]")}
300281
openApiVersion: "${chalk.bold.green(String(config.openApiVersion))}"
301282
format: "${chalk.bold.green(config.format)}"
@@ -314,26 +295,18 @@ class OpenAPIGenerator {
314295

315296
validationErrorDetails(validationErrors) {
316297
if (validationErrors.length) {
317-
this.log(
298+
this.logger.error(
318299
`${chalk.bold.yellow(
319300
"[VALIDATION]"
320-
)} Validation errors found in OpenAPI Description: \n`,
321-
this.logTypes.ERROR
301+
)} Validation errors found in OpenAPI Description: \n`
322302
);
323303

324304
for (const error of validationErrors) {
325-
this.log(
326-
`${chalk.bold.red("Severity:")} ${error.severity}`,
327-
this.logTypes.ERROR
328-
);
329-
this.log(
330-
`${chalk.bold.yellow("Message:")} ${error.message}`,
331-
this.logTypes.ERROR
332-
);
305+
this.logger.error(`${chalk.bold.red("Severity:")} ${error.severity}`);
306+
this.logger.error(`${chalk.bold.yellow("Message:")} ${error.message}`);
333307
for (const location of error.location) {
334-
this.log(
335-
`${chalk.bold.yellow("found at location:")} ${location.pointer}`,
336-
this.logTypes.ERROR
308+
this.logger.error(
309+
`${chalk.bold.yellow("found at location:")} ${location.pointer}`
337310
);
338311
}
339312
}

0 commit comments

Comments
 (0)