Skip to content

Commit

Permalink
Upgrade chalk, remove has-ansi and strip-ansi (#1370)
Browse files Browse the repository at this point in the history
Requires #1369 (for ansi packages)
  • Loading branch information
RobinTail authored Dec 11, 2023
1 parent 1aaa26a commit dbbae56
Show file tree
Hide file tree
Showing 5 changed files with 178 additions and 118 deletions.
8 changes: 3 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"build:swagger": "yarn tsnode example/generate-open-api-schema.ts",
"build:client": "yarn tsnode example/generate-client.ts && yarn prettier example/example.client.ts --write",
"build:license": "yarn tsnode tools/license.ts",
"build:logo": "yarn tsnode tools/startup-logo.ts",
"build:logo": "yarn esm tools/startup-logo.mts",
"test": "yarn test:types && yarn test:unit && yarn test:badge",
"test:int": "yarn --cwd tests/integration && vitest run tests/integration",
"test:952": "yarn --cwd tests/issue952 && yarn --cwd tests/issue952 test",
Expand All @@ -39,6 +39,7 @@
"mdfix": "prettier *.md --write",
"cleanup": "rm -rf tests/**/node_modules coverage tests/**/coverage",
"tsnode": "node -r @swc-node/register",
"esm": "node --loader @swc-node/register/esm",
"precommit": "yarn lint && yarn test && yarn build && git add example/example.* LICENSE coverage.svg",
"prepublishOnly": "yarn lint && yarn test && yarn build",
"postversion": "git push && git push --tags",
Expand Down Expand Up @@ -131,15 +132,14 @@
"@types/cors": "^2.8.14",
"@types/express": "^4.17.17",
"@types/express-fileupload": "^1.4.4",
"@types/has-ansi": "^5.0.0",
"@types/http-errors": "^2.0.2",
"@types/node": "^20.8.4",
"@types/ramda": "^0.29.3",
"@types/triple-beam": "^1.3.2",
"@typescript-eslint/eslint-plugin": "^6.6.0",
"@typescript-eslint/parser": "^6.6.0",
"@vitest/coverage-istanbul": "^1.0.4",
"chalk": "^4.1.2",
"chalk": "^5.3.0",
"compression": "^1.7.4",
"cors": "^2.8.5",
"eslint": "^8.48.0",
Expand All @@ -152,13 +152,11 @@
"express": "^4.18.2",
"express-fileupload": "^1.4.3",
"form-data": "^4.0.0",
"has-ansi": "^4.0.1",
"http-errors": "^2.0.0",
"husky": "^8.0.3",
"make-coverage-badge": "^1.2.0",
"mockdate": "^3.0.5",
"prettier": "3.1.1",
"strip-ansi": "^6.0.1",
"tsd": "^0.29.0",
"tsup": "^8.0.0",
"typescript": "^5.2.2",
Expand Down
148 changes: 148 additions & 0 deletions tests/unit/__snapshots__/logger.spec.ts.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html

exports[`Logger > createWinstonLogger() > Should create debug logger 1`] = `
[
[
{
"level": "debug",
"message": "testing debug message",
"timestamp": "2022-01-01T00:00:00.000Z",
"withColorful": "output",
Symbol(level): "debug",
Symbol(splat): [
{
"withColorful": "output",
},
],
Symbol(message): "2022-01-01T00:00:00.000Z debug: testing debug message { withColorful: 'output' }",
},
[Function],
],
]
`;

exports[`Logger > createWinstonLogger() > Should create warn logger 1`] = `
[
[
{
"level": "warn",
"message": "testing warn message",
"timestamp": "2022-01-01T00:00:00.000Z",
"withMeta": true,
Symbol(level): "warn",
Symbol(splat): [
{
"withMeta": true,
},
],
Symbol(message): "2022-01-01T00:00:00.000Z warn: testing warn message {"withMeta":true}",
},
[Function],
],
]
`;

exports[`Logger > createWinstonLogger() > Should handle empty message 1`] = `
[
[
{
"level": "error",
"message": {
"someData": "test",
},
"timestamp": "2022-01-01T00:00:00.000Z",
Symbol(level): "error",
Symbol(message): "2022-01-01T00:00:00.000Z error: [No message] { someData: 'test' }",
},
[Function],
],
]
`;

exports[`Logger > createWinstonLogger() > Should handle empty object meta 0 1`] = `
[
[
{
"level": "error",
"message": "Payload",
"timestamp": "2022-01-01T00:00:00.000Z",
Symbol(level): "error",
Symbol(splat): [
{},
],
Symbol(message): "2022-01-01T00:00:00.000Z error: Payload {}",
},
[Function],
],
]
`;

exports[`Logger > createWinstonLogger() > Should handle empty object meta 1 1`] = `
[
[
{
"level": "error",
"message": "Payload",
"timestamp": "2022-01-01T00:00:00.000Z",
Symbol(level): "error",
Symbol(splat): [
{},
],
Symbol(message): "2022-01-01T00:00:00.000Z error: Payload {}",
},
[Function],
],
]
`;

exports[`Logger > createWinstonLogger() > Should handle non-object meta 0 1`] = `
[
[
{
"level": "error",
"message": "Code",
"timestamp": "2022-01-01T00:00:00.000Z",
Symbol(level): "error",
Symbol(splat): [
8090,
],
Symbol(message): "2022-01-01T00:00:00.000Z error: Code 8090",
},
[Function],
],
]
`;

exports[`Logger > createWinstonLogger() > Should handle non-object meta 1 1`] = `
[
[
{
"level": "error",
"message": "Code",
"timestamp": "2022-01-01T00:00:00.000Z",
Symbol(level): "error",
Symbol(splat): [
8090,
],
Symbol(message): "2022-01-01T00:00:00.000Z error: Code 8090",
},
[Function],
],
]
`;

exports[`Logger > createWinstonLogger() > Should manage profiling 1`] = `
[
[
{
"durationMs": 554,
"level": "info",
"message": "long-test",
"timestamp": "2022-01-01T00:00:00.554Z",
Symbol(level): "info",
Symbol(message): "2022-01-01T00:00:00.554Z info: long-test duration: 554ms",
},
[Function],
],
]
`;
122 changes: 26 additions & 96 deletions tests/unit/logger.spec.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { LEVEL, MESSAGE, SPLAT } from "triple-beam";
import MockDate from "mockdate";
import stripAnsi from "strip-ansi";
import hasAnsi from "has-ansi";
import { createLogger, isSimplifiedWinstonConfig } from "../../src/logger";
import {
SimplifiedWinstonConfig,
createLogger,
isSimplifiedWinstonConfig,
} from "../../src/logger";
import winston from "winston";
import { afterAll, beforeEach, describe, expect, test, vi } from "vitest";

Expand All @@ -15,22 +16,17 @@ describe("Logger", () => {
MockDate.reset();
});

const dropColorInObjectProps = <T extends Record<string | symbol, any>>(
obj: T,
) => {
return Reflect.ownKeys(obj).reduce(
(acc, key) => ({
...acc,
[key]: typeof obj[key] === "string" ? stripAnsi(obj[key]) : obj[key],
}),
{} as typeof obj,
);
const makeLogger = (props: SimplifiedWinstonConfig) => {
const logger = createLogger({ winston, ...props });
const logSpy = vi
.spyOn(logger.transports[0], "log")
.mockImplementation(({}, next) => next());
return { logger, logSpy };
};

describe("createWinstonLogger()", () => {
test("Should create silent logger", () => {
const logger = createLogger({ winston, level: "silent" });
const transform = vi.spyOn(logger.transports[0].format!, "transform");
const { logger, logSpy } = makeLogger({ level: "silent" });
expect(logger.silent).toBeTruthy();
expect(logger.isErrorEnabled()).toBeTruthy();
expect(logger.isWarnEnabled()).toBeTruthy();
Expand All @@ -39,134 +35,68 @@ describe("Logger", () => {
expect(logger.isDebugEnabled()).toBeFalsy();
expect(logger.isSillyEnabled()).toBeFalsy();
logger.error("test");
expect(transform).toHaveBeenCalledTimes(0);
expect(logSpy).toHaveBeenCalledTimes(0);
});

test("Should create warn logger", () => {
const logger = createLogger({ winston, level: "warn" });
const transform = vi.spyOn(logger.transports[0].format!, "transform");
const { logger, logSpy } = makeLogger({ level: "warn" });
expect(logger.isErrorEnabled()).toBeTruthy();
expect(logger.isWarnEnabled()).toBeTruthy();
expect(logger.isInfoEnabled()).toBeFalsy();
expect(logger.isVerboseEnabled()).toBeFalsy();
expect(logger.isDebugEnabled()).toBeFalsy();
expect(logger.isSillyEnabled()).toBeFalsy();
logger.warn("testing warn message", { withMeta: true });
expect(transform).toHaveBeenCalled();
const params = transform.mock.calls[0][0];
expect(params).toEqual({
level: "warn",
[LEVEL]: "warn",
timestamp: "2022-01-01T00:00:00.000Z",
[SPLAT]: [{ withMeta: true }],
withMeta: true,
message: "testing warn message",
[MESSAGE]:
'2022-01-01T00:00:00.000Z warn: testing warn message {"withMeta":true}',
});
expect(hasAnsi(params.level)).toBeFalsy();
expect(logSpy.mock.calls).toMatchSnapshot();
});

test("Should create debug logger", () => {
const logger = createLogger({ winston, level: "debug", color: true });
const transform = vi.spyOn(logger.transports[0].format!, "transform");
const { logger, logSpy } = makeLogger({ level: "debug", color: true });
expect(logger.isErrorEnabled()).toBeTruthy();
expect(logger.isWarnEnabled()).toBeTruthy();
expect(logger.isInfoEnabled()).toBeTruthy();
expect(logger.isVerboseEnabled()).toBeTruthy();
expect(logger.isDebugEnabled()).toBeTruthy();
expect(logger.isSillyEnabled()).toBeFalsy();
logger.debug("testing debug message", { withColorful: "output" });
expect(transform).toHaveBeenCalled();
const params = transform.mock.calls[0][0];
expect(dropColorInObjectProps(params)).toEqual({
level: "debug",
[LEVEL]: "debug",
timestamp: "2022-01-01T00:00:00.000Z",
[SPLAT]: [{ withColorful: "output" }],
withColorful: "output",
message: "testing debug message",
[MESSAGE]: `2022-01-01T00:00:00.000Z debug: testing debug message { withColorful: 'output' }`,
});
expect(hasAnsi(params.level)).toBeTruthy();
expect(logSpy.mock.calls).toMatchSnapshot();
});

test("Should manage profiling", () => {
const logger = createLogger({ winston, level: "debug", color: true });
const transform = vi.spyOn(logger.transports[0].format!, "transform");
const { logger, logSpy } = makeLogger({ level: "debug", color: true });
logger.profile("long-test");
MockDate.set("2022-01-01T00:00:00.554Z");
logger.profile("long-test");
expect(transform).toHaveBeenCalled();
const params = transform.mock.calls[0][0];
expect(dropColorInObjectProps(params)).toEqual({
durationMs: 554,
level: "info",
[LEVEL]: "info",
timestamp: "2022-01-01T00:00:00.554Z",
message: "long-test",
[MESSAGE]: `2022-01-01T00:00:00.554Z info: long-test duration: 554ms`,
});
expect(hasAnsi(params.level)).toBeTruthy();
expect(logSpy.mock.calls).toMatchSnapshot();
});

test("Should handle empty message", () => {
const logger = createLogger({ winston, level: "debug", color: true });
const transform = vi.spyOn(logger.transports[0].format!, "transform");
const { logger, logSpy } = makeLogger({ level: "debug", color: true });
expect(logger.isErrorEnabled()).toBeTruthy();
expect(logger.isWarnEnabled()).toBeTruthy();
expect(logger.isInfoEnabled()).toBeTruthy();
expect(logger.isVerboseEnabled()).toBeTruthy();
expect(logger.isDebugEnabled()).toBeTruthy();
expect(logger.isSillyEnabled()).toBeFalsy();
logger.error({ someData: "test" });
expect(transform).toHaveBeenCalled();
const params = transform.mock.calls[0][0];
expect(dropColorInObjectProps(params)).toEqual({
level: "error",
[LEVEL]: "error",
timestamp: "2022-01-01T00:00:00.000Z",
message: { someData: "test" },
[MESSAGE]: `2022-01-01T00:00:00.000Z error: [No message] { someData: 'test' }`,
});
expect(hasAnsi(params.level)).toBeTruthy();
expect(logSpy.mock.calls).toMatchSnapshot();
});

test.each(["debug", "warn"] as const)(
"Should handle non-object meta %#",
(level) => {
const logger = createLogger({ winston, level, color: true });
const transform = vi.spyOn(logger.transports[0].format!, "transform");
const { logger, logSpy } = makeLogger({ level, color: true });
logger.error("Code", 8090);
expect(transform).toHaveBeenCalled();
const params = transform.mock.calls[0][0];
expect(dropColorInObjectProps(params)).toEqual({
level: "error",
[LEVEL]: "error",
timestamp: "2022-01-01T00:00:00.000Z",
[SPLAT]: [8090],
message: "Code",
[MESSAGE]: `2022-01-01T00:00:00.000Z error: Code 8090`,
});
expect(logSpy.mock.calls).toMatchSnapshot();
},
);

test.each(["debug", "warn"] as const)(
"Should handle empty object meta",
"Should handle empty object meta %#",
(level) => {
const logger = createLogger({ winston, level, color: true });
const transform = vi.spyOn(logger.transports[0].format!, "transform");
const { logger, logSpy } = makeLogger({ level, color: true });
logger.error("Payload", {});
expect(transform).toHaveBeenCalled();
const params = transform.mock.calls[0][0];
expect(dropColorInObjectProps(params)).toEqual({
level: "error",
[LEVEL]: "error",
timestamp: "2022-01-01T00:00:00.000Z",
[SPLAT]: [{}],
message: "Payload",
[MESSAGE]: `2022-01-01T00:00:00.000Z error: Payload {}`,
});
expect(logSpy.mock.calls).toMatchSnapshot();
},
);
});
Expand Down
1 change: 1 addition & 0 deletions tools/startup-logo.ts → tools/startup-logo.mts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/** @todo rename to .ts if/when moved to ESM first */
import chalk from "chalk";
import { format } from "pretty-format";
import { writeFileSync } from "node:fs";
Expand Down
Loading

0 comments on commit dbbae56

Please sign in to comment.