Skip to content

Commit

Permalink
feat(logger): split files and add test
Browse files Browse the repository at this point in the history
  • Loading branch information
yjl9903 committed Aug 12, 2023
1 parent 49fbc4c commit d921c36
Show file tree
Hide file tree
Showing 9 changed files with 158 additions and 61 deletions.
6 changes: 5 additions & 1 deletion packages/logger/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,12 @@
"test:ci": "vitest --run",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@breadc/color": "workspace:*",
"std-env": "^3.3.3"
},
"devDependencies": {
"@types/node": "^18.17.5",
"vitest": "0.33.0"
}
}
}
31 changes: 28 additions & 3 deletions packages/logger/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,41 @@
import { hasTTY, isDebug, isTest, isCI } from 'std-env';

import { BasicReporter } from './reporters/basic';
import { FancyReporter } from './reporters/fancy';

import { LogLevels } from './level';
import { BreadcLogger, LoggerOptions } from './logger';

export * from './types';
export * from './logger';
export * from './reporters';

export const Logger = (
options: Partial<LoggerOptions> & { fancy?: boolean } = {}
) => {
const level = getDefaultLogLevel();
const isFancy =
options.fancy === true || (options.fancy === undefined && hasTTY);

export const Logger = (options: Partial<LoggerOptions> = {}) => {
return new BreadcLogger({
reporter: [FancyReporter()],
level: 0,
reporter: [
isFancy && !(isCI || isTest) ? FancyReporter() : BasicReporter()
],
level,
format: {},
stdout: process?.stdout,
stderr: process?.stderr,
plugins: [],
...options
});
};

function getDefaultLogLevel() {
if (isDebug) {
return LogLevels.debug;
} else if (isTest) {
return LogLevels.warn;
} else {
return LogLevels.info;
}
}
46 changes: 46 additions & 0 deletions packages/logger/src/level.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
export type LogLevel = 0 | 1 | 2 | 3 | 4 | 5 | (number & {});

export const LogLevels: Record<LogType, number> = {
silent: Number.NEGATIVE_INFINITY,

fatal: 0,
error: 0,

warn: 1,

log: 2,
info: 3,

success: 3,
fail: 3,
ready: 3,
start: 3,
box: 3,

debug: 4,

trace: 5,

verbose: Number.POSITIVE_INFINITY
};

export type LogType =
// 0
| 'silent'
| 'fatal'
| 'error'
// 1
| 'warn'
// 2
| 'log'
// 3
| 'info'
| 'success'
| 'fail'
| 'ready'
| 'start'
| 'box'
// Verbose
| 'debug'
| 'trace'
| 'verbose';
28 changes: 21 additions & 7 deletions packages/logger/src/logger.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import type { LogLevel, Reporter, FormatOptions } from './types';
import type { Reporter, FormatOptions, InputLogObject } from './types';

import { LogLevel } from './level';

export interface LoggerPlugin {}

Expand Down Expand Up @@ -27,17 +29,29 @@ export class BreadcLogger {
}

// --- Log ---
private _log(message: string) {
private print(defaults: InputLogObject, message: string, args: any[]) {
const date = new Date();
for (const reporter of this.options.reporter) {
reporter.print({ message });
reporter.print({
...defaults,
level: 0,
type: 'info',
date,
message,
args
});
}
}

public log(message: string) {
this._log(message);
public log(message: string, ...args: any[]) {
this.print({}, message, args);
}

public info(message: string) {
this._log(message);
public info(message: string, ...args: any[]) {
this.print({}, message, args);
}
}

export type LogFn = (message: string, ...args: any[]) => void;

export type BreadcLoggerInstance = BreadcLogger & {};
3 changes: 3 additions & 0 deletions packages/logger/src/reporters/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './mock';
export * from './basic';
export * from './fancy';
12 changes: 12 additions & 0 deletions packages/logger/src/reporters/mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import type { LogObject, Reporter } from '../types';

export const MockReporter = (
history: LogObject[] = []
): Reporter & { history: LogObject[] } => {
return {
history,
print(obj) {
history.push(obj);
}
};
};
59 changes: 12 additions & 47 deletions packages/logger/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,58 +1,23 @@
export type LogLevel = 0 | 1 | 2 | 3 | 4 | 5 | (number & {});
import { LogLevel, LogType } from './level';

export const LogLevels: Record<LogType, number> = {
silent: Number.NEGATIVE_INFINITY,

fatal: 0,
error: 0,

warn: 1,

log: 2,
info: 3,

success: 3,
fail: 3,
ready: 3,
start: 3,
box: 3,

debug: 4,

trace: 5,

verbose: Number.POSITIVE_INFINITY
};

export type LogType =
// 0
| 'silent'
| 'fatal'
| 'error'
// 1
| 'warn'
// 2
| 'log'
// 3
| 'info'
| 'success'
| 'fail'
| 'ready'
| 'start'
| 'box'
// Verbose
| 'debug'
| 'trace'
| 'verbose';

export interface LogObject {
export interface InputLogObject {
level?: LogLevel;
type?: LogType;
tag?: string;
date?: Date;

message?: string;
args?: any[];
}

export interface LogObject extends InputLogObject {
level: LogLevel;
type: LogType;
date: Date;
}

export type InputLogItem = string | number | InputLogObject;

export interface Reporter {
print: (log: LogObject) => void;
}
Expand Down
29 changes: 27 additions & 2 deletions packages/logger/test/logger.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,32 @@
import { describe, expect, it } from 'vitest';

describe('Logger', () => {
import { Logger, MockReporter } from '../src';

describe('Basic Logger', () => {
it('should work', () => {
expect(1 + 1).toBe(2);
const reporter = MockReporter();
const logger = Logger({ reporter: [reporter] });

logger.log('Hello');
logger.log('World');
expect(reporter.history.map((obj) => ({ ...obj, date: undefined })))
.toMatchInlineSnapshot(`
[
{
"args": [],
"date": undefined,
"level": 0,
"message": "Hello",
"type": "info",
},
{
"args": [],
"date": undefined,
"level": 0,
"message": "World",
"type": "info",
},
]
`);
});
});
5 changes: 4 additions & 1 deletion pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit d921c36

Please sign in to comment.