diff --git a/.changeset/warm-trains-live.md b/.changeset/warm-trains-live.md new file mode 100644 index 0000000..c546222 --- /dev/null +++ b/.changeset/warm-trains-live.md @@ -0,0 +1,5 @@ +--- +"loglayer": minor +--- + +Add consola support diff --git a/README.md b/README.md index 1ff6dce..18aad04 100755 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](http://www.typescriptlang.org/) Standardize the way you write logs with the `loglayer` abstraction using your existing logging library -(`bunyan` / `winston` / `pino` / `roarr` / `log4js-node` / `electron-log` / `signale` / etc). +(`bunyan` / `winston` / `pino` / `roarr` / `log4js-node` / `electron-log` / `signale` / `consola` / etc). Spend less time from having to *define* your logs and spend more writing them. @@ -53,14 +53,15 @@ logLayer - [Installation](#installation) - [Example installations](#example-installations) - - [`console`](#console) - - [`pino`](#pino) - [`bunyan`](#bunyan) - - [`winston`](#winston) - - [`roarr`](#roarr) + - [`consola`](#consola) + - [`console`](#console) - [`electron-log`](#electron-log) - [`log4js-node`](#log4js-node) + - [`pino`](#pino) + - [`roarr`](#roarr) - [`signale`](#signale) + - [`winston`](#winston) - [Example integration](#example-integration) - [API](#api) - [Constructor](#constructor) @@ -291,6 +292,26 @@ const s = log.getLoggerInstance() s.success('Operation successful'); ``` +### `consola` + +[consola docs](https://github.com/unjs/consola) + +- The default log level is `3` which excludes `debug` and `trace`. Set to `5` for both. + +```typescript +import { LogLayer, LoggerType } from 'loglayer' +import { type ConsolaInstance, createConsola } from "consola"; + +const log = new LogLayer({ + logger: { + instance: createConsola({ + level: 5 + }), + type: LoggerType.CONSOLA, + }, +}) +``` + ## Example integration Using `express` and `pino`: diff --git a/livetests/consola.ts b/livetests/consola.ts new file mode 100644 index 0000000..388dfc7 --- /dev/null +++ b/livetests/consola.ts @@ -0,0 +1,16 @@ +import { createConsola } from "consola"; +import { LogLayer, LoggerType } from "../src"; +import { testMethods } from "./utils"; + +const consola = createConsola({ + level: 5, +}); + +const log = new LogLayer({ + logger: { + instance: consola, + type: LoggerType.CONSOLA, + }, +}); + +testMethods(log); diff --git a/package-lock.json b/package-lock.json index 0fb96e5..04567e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "@types/roarr": "^2.14.3", "@types/signale": "^1.4.7", "bunyan": "^1.8.15", + "consola": "^3.2.3", "express": "^4.19.2", "husky": "^8.0.0", "lint-staged": "^15.2.2", @@ -3969,6 +3970,15 @@ "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", "dev": true }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -13880,6 +13890,12 @@ "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", "dev": true }, + "consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", diff --git a/package.json b/package.json index 5b5e36b..3bd3936 100755 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "livetest:winston": "ts-node-dev livetests/winston.ts", "livetest:log4js-node": "ts-node-dev livetests/log4js-node.ts", "livetest:signale": "ts-node-dev livetests/signale.ts", + "livetest:consola": "ts-node-dev livetests/consola.ts", "prepare": "husky install", "release": "changeset publish", "test": "vitest run", @@ -70,7 +71,8 @@ "abstraction", "pino", "electron", - "signale" + "signale", + "consola" ], "devDependencies": { "@biomejs/biome": "^1.6.4", @@ -83,6 +85,7 @@ "@types/roarr": "^2.14.3", "@types/signale": "^1.4.7", "bunyan": "^1.8.15", + "consola": "^3.2.3", "express": "^4.19.2", "husky": "^8.0.0", "lint-staged": "^15.2.2", diff --git a/src/LogLayer.ts b/src/LogLayer.ts index 546161c..5431510 100644 --- a/src/LogLayer.ts +++ b/src/LogLayer.ts @@ -453,6 +453,7 @@ export class LogLayer; + +describe("structured logger with consola", () => { + beforeAll(() => { + // consola.wrapAll(); + + log = new LogLayer({ + logger: { + instance: consola, + type: LoggerType.CONSOLA, + }, + }); + }); + + beforeEach(() => { + // Re-mock consola before each test call to remove + // calls from before + consola.mockTypes(() => vitest.fn()); + }); + + it("should log a message", () => { + log.info("this is a test message"); + // @ts-ignore + const consolaMessages = consola.info.mock.calls.map((c) => c[0]); + expect(consolaMessages).toContain("this is a test message"); + }); + + it("should log a message with a prefix", () => { + log.withPrefix("[testing]").info("this is a test message"); + // @ts-ignore + const consolaMessages = consola.info.mock.calls.map((c) => c[0]); + expect(consolaMessages).toContain("[testing] this is a test message"); + }); + + it("should include context", () => { + log.withContext({ + sample: "data", + }); + + log.info("this is a test message"); + // @ts-ignore + const msg = consola.info.mock.calls[0][0]; + expect(msg).toContain("this is a test message"); + // @ts-ignore + const data = consola.info.mock.calls[0][1]; + expect(data).toMatchObject({ + sample: "data", + }); + }); + + it("should include metadata", () => { + log.withContext({ + test: "context", + }); + + log + .withMetadata({ + meta: "data", + }) + .info("this is a test message"); + + // @ts-ignore + const msg = consola.info.mock.calls[0][0]; + expect(msg).toContain("this is a test message"); + // @ts-ignore + const data = consola.info.mock.calls[0][1]; + expect(data).toMatchObject({ + sample: "data", + test: "context", + }); + }); + + it("should include an error", () => { + log.withContext({ + test: "context", + }); + + log.withError(new Error("err")).info("this is a test message"); + // @ts-ignore + const msg = consola.info.mock.calls[0][0]; + expect(msg).toContain("this is a test message"); + // @ts-ignore + const data = consola.info.mock.calls[0][1]; + expect(data).toMatchObject({ + test: "context", + }); + expect(data.err).toBeDefined(); + }); +}); diff --git a/src/types/common.types.ts b/src/types/common.types.ts index 81cb2b8..1fb95b5 100644 --- a/src/types/common.types.ts +++ b/src/types/common.types.ts @@ -19,6 +19,7 @@ export enum LoggerType { BUNYAN = "bunyan", LOG4JS_NODE = "log4js-node", SIGNALE = "signale", + CONSOLA = "consola", CONSOLE = "console", }