Skip to content
This repository was archived by the owner on Jan 12, 2023. It is now read-only.

Commit 0e3224a

Browse files
committed
typescript, tests and lint
1 parent 3634893 commit 0e3224a

16 files changed

+2709
-91
lines changed

.npmignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
tsconfig.json
2+
src

dist/index.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import * as winston from 'winston';
2+
export declare const loggerFactory: ({ config }: import("./logger-factory-generator").IFactoryInterface) => winston.Logger;

dist/index.js

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
const winston = require("winston");
4+
const winston_sentry_raven_transport_1 = require("winston-sentry-raven-transport");
5+
const logger_factory_generator_1 = require("./logger-factory-generator");
6+
exports.loggerFactory = logger_factory_generator_1.loggerFactoryGenerator({
7+
winston,
8+
consoleTransportClass: winston.transports.Console,
9+
sentryTransportClass: winston_sentry_raven_transport_1.default,
10+
});

dist/logger-factory-generator.d.ts

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Logger } from 'winston';
2+
declare interface IConfig {
3+
sentry: {
4+
enabled: boolean;
5+
dsn?: string;
6+
level?: string;
7+
};
8+
}
9+
export interface IFactoryInterface {
10+
config: IConfig;
11+
}
12+
declare type LoggerFactoryType = ({ config }: IFactoryInterface) => Logger;
13+
export declare const loggerFactoryGenerator: ({ winston, consoleTransportClass, sentryTransportClass }: {
14+
winston: any;
15+
consoleTransportClass: any;
16+
sentryTransportClass: any;
17+
}) => LoggerFactoryType;
18+
export {};

dist/logger-factory-generator.js

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
const moment = require("moment");
4+
function prepareErrorToLog(error, messages = []) {
5+
if (messages.length) {
6+
error.message = `${error.message} :: ${messages.join(',')}`;
7+
}
8+
return error;
9+
}
10+
exports.loggerFactoryGenerator = ({ winston, consoleTransportClass, sentryTransportClass }) => {
11+
return ({ config }) => {
12+
const transports = [];
13+
transports.push(new consoleTransportClass({
14+
level: config.sentry.level,
15+
}));
16+
if (config.sentry.enabled) {
17+
transports.push(new sentryTransportClass({
18+
dsn: config.sentry.dsn,
19+
level: 'error',
20+
}));
21+
}
22+
const logger = winston.createLogger({
23+
format: winston.format.printf(error => `${moment.utc().format('YYYY-MM-DD HH:mm Z')} [${error.level}]: ${error.message}`),
24+
transports,
25+
exitOnError: false,
26+
});
27+
const errorFn = logger.error;
28+
logger.error = (...args) => {
29+
if (!args || !args.length)
30+
return;
31+
let error;
32+
const messages = [];
33+
let object = {};
34+
args.forEach((arg) => {
35+
if (arg instanceof Error) {
36+
error = arg;
37+
}
38+
else if (typeof arg === 'string') {
39+
messages.push(arg);
40+
}
41+
else if (typeof arg === 'object') {
42+
object = Object.assign({}, object, arg);
43+
}
44+
});
45+
if (error) {
46+
return errorFn(prepareErrorToLog(error, messages), Object.assign({}, object, { stack: error.stack }));
47+
}
48+
else {
49+
return errorFn.apply(logger, args);
50+
}
51+
};
52+
return logger;
53+
};
54+
};
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export {};

dist/logger-factory-generator.test.js

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
const chai_1 = require("chai");
4+
const winston = require("winston");
5+
const logger_factory_generator_1 = require("./logger-factory-generator");
6+
const TransportStream = require("winston-transport");
7+
let lastSentryLog;
8+
class FakeSentryTransport extends TransportStream {
9+
log(info) {
10+
lastSentryLog = info;
11+
}
12+
}
13+
let lastConsoleLog;
14+
class FakeConsoleTransport extends TransportStream {
15+
log(info) {
16+
lastConsoleLog = info;
17+
}
18+
}
19+
let logger;
20+
const symbolMessage = Symbol.for('message');
21+
const symbolLevel = Symbol.for('level');
22+
describe('gupy-logger', () => {
23+
beforeEach(() => {
24+
lastConsoleLog = null;
25+
lastSentryLog = null;
26+
const loggerFactory = logger_factory_generator_1.loggerFactoryGenerator({
27+
winston,
28+
consoleTransportClass: FakeConsoleTransport,
29+
sentryTransportClass: FakeSentryTransport
30+
});
31+
logger = loggerFactory({
32+
config: { sentry: { enabled: true, dsn: 'any', level: 'info' } }
33+
});
34+
});
35+
it('should log debug nowhere', () => {
36+
logger.debug('any info');
37+
chai_1.expect(lastSentryLog).to.equal(null);
38+
chai_1.expect(lastConsoleLog).to.deep.equal(null);
39+
chai_1.expect(lastSentryLog).to.deep.equal(null);
40+
});
41+
it('should log info only at console', () => {
42+
logger.info('any info');
43+
chai_1.expect(lastSentryLog).to.equal(null);
44+
chai_1.expect(lastConsoleLog).to.deep.equal({
45+
level: 'info',
46+
message: 'any info'
47+
});
48+
chai_1.expect(lastConsoleLog[symbolMessage]).to.match(/\d{4}-\d{2}-\d{2} \d{2}:\d{2} \+\d{2}:\d{2} \[info]: any info/);
49+
chai_1.expect(lastConsoleLog[symbolLevel]).to.equal('info');
50+
});
51+
it('should log warn only at console', () => {
52+
logger.warn('any warn');
53+
chai_1.expect(lastSentryLog).to.equal(null);
54+
chai_1.expect(lastConsoleLog).to.deep.equal({
55+
level: 'warn',
56+
message: 'any warn'
57+
});
58+
chai_1.expect(lastConsoleLog[symbolMessage]).to.match(/\d{4}-\d{2}-\d{2} \d{2}:\d{2} \+\d{2}:\d{2} \[warn]: any warn/);
59+
chai_1.expect(lastConsoleLog[symbolLevel]).to.equal('warn');
60+
});
61+
it('should log error at sentry and console', () => {
62+
logger.error('any error');
63+
chai_1.expect(lastSentryLog).to.deep.equal({
64+
level: 'error',
65+
message: 'any error'
66+
});
67+
chai_1.expect(lastSentryLog[symbolMessage]).to.match(/\d{4}-\d{2}-\d{2} \d{2}:\d{2} \+\d{2}:\d{2} \[error]: any error/);
68+
chai_1.expect(lastSentryLog[symbolLevel]).to.equal('error');
69+
chai_1.expect(lastConsoleLog).to.be.deep.equal({
70+
level: 'error',
71+
message: 'any error'
72+
});
73+
chai_1.expect(lastConsoleLog[symbolMessage]).to.match(/\d{4}-\d{2}-\d{2} \d{2}:\d{2} \+\d{2}:\d{2} \[error]: any error/);
74+
chai_1.expect(lastConsoleLog[symbolLevel]).to.equal('error');
75+
});
76+
});

index.js

-58
This file was deleted.

lib/index.d.ts

-11
This file was deleted.

0 commit comments

Comments
 (0)