From ef2f901636f5084f38e200910dec13884fba2976 Mon Sep 17 00:00:00 2001 From: simplymichael Date: Wed, 19 Jun 2024 20:48:41 +0100 Subject: [PATCH] refactor: rename logger factory to log factory; refactor framework bootstrap file --- src/framework/bootstrap/index.js | 7 +++++ .../factory/{logger => log}/.gitignore | 0 .../factory/{logger => log}/index.js | 5 +++- .../logger.spec.js => log/log.spec.js} | 26 +++++++++---------- src/index.spec.js | 2 +- 5 files changed, 25 insertions(+), 15 deletions(-) rename src/framework/factory/{logger => log}/.gitignore (100%) rename src/framework/factory/{logger => log}/index.js (95%) rename src/framework/factory/{logger/logger.spec.js => log/log.spec.js} (90%) diff --git a/src/framework/bootstrap/index.js b/src/framework/bootstrap/index.js index 7ab88da..2eff884 100644 --- a/src/framework/bootstrap/index.js +++ b/src/framework/bootstrap/index.js @@ -1,3 +1,6 @@ +const debug = require("../lib/debug"); + + module.exports = function setupServices(config, providers) { for(let i = 0; i < providers.length; i++) { const Provider = providers[i]; @@ -19,10 +22,14 @@ module.exports = function setupServices(config, providers) { ); } + debug(`Registering provider '${className}'`); + /* * Bind the dependencies of the service(s) that the provider provides * to the service container. */ provider.register(); + + debug(`Provider '${className}' registration complete.`); } }; diff --git a/src/framework/factory/logger/.gitignore b/src/framework/factory/log/.gitignore similarity index 100% rename from src/framework/factory/logger/.gitignore rename to src/framework/factory/log/.gitignore diff --git a/src/framework/factory/logger/index.js b/src/framework/factory/log/index.js similarity index 95% rename from src/framework/factory/logger/index.js rename to src/framework/factory/log/index.js index 3d1332e..9c6fc8a 100644 --- a/src/framework/factory/logger/index.js +++ b/src/framework/factory/log/index.js @@ -2,7 +2,7 @@ const winston = require("winston"); require("winston-daily-rotate-file"); -module.exports = class LoggerFactory { +module.exports = class LogFactory { /** * @param {Object} options * @param {String} [options.label] @@ -82,6 +82,8 @@ module.exports = class LoggerFactory { } } + const logLevels = levels || winston.config.npm.levels; + const levelKeys = Object.keys(logLevels); const formats = winston.format.combine( winston.format.label({ label, message: true }), winston.format.errors({ stack: true }), @@ -98,6 +100,7 @@ module.exports = class LoggerFactory { transports, exceptionHandlers, rejectionHandlers, + level: levelKeys[levelKeys.length - 1], // Make all the levels available to the client. defaultMeta: { service: label ?? "FrameworkLogger" }, exitOnError: false, }); diff --git a/src/framework/factory/logger/logger.spec.js b/src/framework/factory/log/log.spec.js similarity index 90% rename from src/framework/factory/logger/logger.spec.js rename to src/framework/factory/log/log.spec.js index 28f4f12..ce45435 100644 --- a/src/framework/factory/logger/logger.spec.js +++ b/src/framework/factory/log/log.spec.js @@ -9,7 +9,7 @@ const util = require("node:util"); const sinon = require("sinon"); const winston = require("winston"); const { chai } = require("../../lib/test-helper"); -const LoggerFactory = require("."); +const LogFactory = require("."); const thisDir = path.resolve(__dirname, ".").replace(/\\/g, "/"); @@ -62,14 +62,14 @@ module.exports = { describe(".createLogger(options)", function() { it("should return a logger object", function() { - const logger = LoggerFactory.createLogger(); + const logger = LogFactory.createLogger(); expect(logger).to.be.an("object"); expect(logger).to.have.property("log").to.be.a("function"); }); it("should use the 'console' as the default transport", function() { - const logger = LoggerFactory.createLogger(); + const logger = LogFactory.createLogger(); const { sinonSpy, restore } = spyOnConsoleOutput(); // Call the logger.log, which internally calls console._stdout.write @@ -85,7 +85,7 @@ module.exports = { }); it("should use the label 'FrameworkLogger' as the default 'label' for the logger", function() { - const logger = LoggerFactory.createLogger(); + const logger = LogFactory.createLogger(); const { sinonSpy, restore } = spyOnConsoleOutput(); // Call the logger.log, which internally calls console._stdout.write @@ -102,7 +102,7 @@ module.exports = { it("should let the user specify a custom 'label' for the logger", function() { const label = "LogService"; - const logger = LoggerFactory.createLogger({ label }); + const logger = LogFactory.createLogger({ label }); const { sinonSpy, restore } = spyOnConsoleOutput(); // Call the logger.log, which internally calls console._stdout.write @@ -118,7 +118,7 @@ module.exports = { }); it("should use npm log levels as the default log priority protocol", function() { - const logger = LoggerFactory.createLogger(); + const logger = LogFactory.createLogger(); const logLevels = ["error", "warn", "info", "http", "verbose", "debug", "silly"]; for(const level of logLevels) { @@ -132,7 +132,7 @@ module.exports = { warning: 4, notice: 5, info: 6, debug: 7 }; - const logger = LoggerFactory.createLogger({ levels: syslogLevels }); + const logger = LogFactory.createLogger({ levels: syslogLevels }); const logLevels = Object.keys(syslogLevels); for(const level of logLevels) { @@ -141,7 +141,7 @@ module.exports = { }); it("should let the user disable console logging", function() { - let logger = LoggerFactory.createLogger({ disableConsoleLogs: true }); + let logger = LogFactory.createLogger({ disableConsoleLogs: true }); const { sinonSpy, restore } = spyOnConsoleOutput("stderr"); // Call the logger.log, which internally calls console._stdout.write @@ -163,18 +163,18 @@ module.exports = { fs.rmSync(scopedLogDir, { recursive: true, force: true }); - LoggerFactory.createLogger(); + LogFactory.createLogger(); expect(fs.existsSync(scopedLogDir)).to.be.false; - LoggerFactory.createLogger({ logToFile: true, logDir: scopedLogDir }); + LogFactory.createLogger({ logToFile: true, logDir: scopedLogDir }); expect(fs.existsSync(scopedLogDir)).to.be.true; }); it("should throw if the 'logToFile' option is set to true with no 'logDir' option specified", function() { const thrower = () => { - LoggerFactory.createLogger({ logToFile: true }); + LogFactory.createLogger({ logToFile: true }); }; expect(thrower).to.throw("The 'logToFile' option requires a 'logDir' options to be specified"); @@ -188,7 +188,7 @@ module.exports = { expect(fs.existsSync(filepath)).to.equal(false); - LoggerFactory.createLogger({ + LogFactory.createLogger({ transports: [new winston.transports.File({ filename: filepath })] }); @@ -202,7 +202,7 @@ module.exports = { /*it("should let the user specify if they want to log uncaught exceptions", function(done) { this.timeout(5000); - const logger = LoggerFactory.createLogger({ logExceptions: true }); + const logger = LogFactory.createLogger({ logExceptions: true }); const { sinonSpy, restore } = spyOnConsoleOutput("stdout"); process.on("uncaughtException", function() { diff --git a/src/index.spec.js b/src/index.spec.js index 0c9bba7..9b33e31 100644 --- a/src/index.spec.js +++ b/src/index.spec.js @@ -4,7 +4,7 @@ const request = require("supertest"); const { create } = require("./framework/application"); const { StatusCodes, StatusTexts } = require("./framework/component/http"); -const { chai } = require("./framework/lib/test-helper"); +const { chai } = require("./lib/test-helper"); module.exports = { routes() {