@nest-yalc-2/logger 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +9 -0
  3. package/package.json +29 -0
  4. package/src/__tests__/logger-console.service.spec.ts +136 -0
  5. package/src/__tests__/logger-nest.service.spec.ts +39 -0
  6. package/src/__tests__/logger-pino.service.spec.ts +149 -0
  7. package/src/__tests__/logger.factory.spec.ts +69 -0
  8. package/src/__tests__/logger.helper.spec.ts +54 -0
  9. package/src/__tests__/logger.service.spec.ts +78 -0
  10. package/src/__tests__/tsconfig.json +3 -0
  11. package/src/__tests__/typeorm-logger.spec.ts +111 -0
  12. package/src/index.d.ts +10 -0
  13. package/src/index.js +27 -0
  14. package/src/index.js.map +1 -0
  15. package/src/index.ts +10 -0
  16. package/src/logger-abstract.service.d.ts +65 -0
  17. package/src/logger-abstract.service.js +91 -0
  18. package/src/logger-abstract.service.js.map +1 -0
  19. package/src/logger-abstract.service.ts +210 -0
  20. package/src/logger-console.service.d.ts +5 -0
  21. package/src/logger-console.service.js +23 -0
  22. package/src/logger-console.service.js.map +1 -0
  23. package/src/logger-console.service.ts +80 -0
  24. package/src/logger-nest.service.d.ts +35 -0
  25. package/src/logger-nest.service.js +59 -0
  26. package/src/logger-nest.service.js.map +1 -0
  27. package/src/logger-nest.service.ts +151 -0
  28. package/src/logger-pino.service.d.ts +10 -0
  29. package/src/logger-pino.service.js +89 -0
  30. package/src/logger-pino.service.js.map +1 -0
  31. package/src/logger-pino.service.ts +161 -0
  32. package/src/logger.enum.d.ts +17 -0
  33. package/src/logger.enum.js +35 -0
  34. package/src/logger.enum.js.map +1 -0
  35. package/src/logger.enum.ts +32 -0
  36. package/src/logger.event.d.ts +11 -0
  37. package/src/logger.event.js +16 -0
  38. package/src/logger.event.js.map +1 -0
  39. package/src/logger.event.ts +11 -0
  40. package/src/logger.factory.d.ts +3 -0
  41. package/src/logger.factory.js +66 -0
  42. package/src/logger.factory.js.map +1 -0
  43. package/src/logger.factory.ts +70 -0
  44. package/src/logger.helper.d.ts +4 -0
  45. package/src/logger.helper.js +36 -0
  46. package/src/logger.helper.js.map +1 -0
  47. package/src/logger.helper.ts +40 -0
  48. package/src/logger.service.d.ts +3 -0
  49. package/src/logger.service.js +25 -0
  50. package/src/logger.service.js.map +1 -0
  51. package/src/logger.service.ts +41 -0
  52. package/src/typeorm-logger.d.ts +13 -0
  53. package/src/typeorm-logger.js +82 -0
  54. package/src/typeorm-logger.js.map +1 -0
  55. package/src/typeorm-logger.ts +125 -0
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@nest-yalc-2/logger",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "./src/index.js",
6
+ "exports": {
7
+ "./": "./src/"
8
+ },
9
+ "author": "",
10
+ "license": "AGPL-3.0-or-later",
11
+ "types": "./src/index.d.ts",
12
+ "files": [
13
+ "src"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/Nek97/nestjs-yalc.git"
18
+ },
19
+ "bugs": {
20
+ "url": "https://github.com/Nek97/nestjs-yalc/issues"
21
+ },
22
+ "homepage": "https://github.com/Nek97/nestjs-yalc#readme",
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "dependencies": {
27
+ "tslib": "^2.8.1"
28
+ }
29
+ }
@@ -0,0 +1,136 @@
1
+ import {
2
+ expect,
3
+ jest,
4
+ describe,
5
+ it,
6
+ beforeEach,
7
+ beforeAll,
8
+ afterAll,
9
+ afterEach,
10
+ } from '@jest/globals';
11
+ import { type ConsoleLogger as TConsoleLogger } from '../logger-console.service.js';
12
+
13
+ /**
14
+ * Not sure why this is needed, but it is. Jest has reference errors when try to import the logger-console.service.js file
15
+ * probably still caused by the ESM
16
+ */
17
+ jest.unstable_mockModule('@nest-yalc-2/logger/logger.factory.js', async () => {
18
+ return {
19
+ AppLoggerFactory: jest.fn(),
20
+ };
21
+ });
22
+
23
+ import { ConsoleLogger } from '../logger-console.service.js';
24
+ import { LOG_LEVEL_ALL } from '../logger.enum.js';
25
+
26
+ const logOptions = {
27
+ context: 'test',
28
+ data: { pass: 'data' },
29
+ masks: ['pass'],
30
+ };
31
+
32
+ describe('Console logger service test', () => {
33
+ let logger: TConsoleLogger;
34
+
35
+ beforeEach(async () => {
36
+ logger = new ConsoleLogger('test', LOG_LEVEL_ALL);
37
+ });
38
+
39
+ it('Test undefined levels', async () => {
40
+ const methodLog = jest.spyOn(console, 'log');
41
+ const methodError = jest.spyOn(console, 'error');
42
+ const methodWarn = jest.spyOn(console, 'warn');
43
+ logger = new ConsoleLogger('test', undefined);
44
+ logger.log('test');
45
+ logger.error('test');
46
+ logger.warn('test');
47
+
48
+ expect(methodLog).not.toHaveBeenCalled();
49
+ expect(methodError).not.toHaveBeenCalled();
50
+ expect(methodWarn).not.toHaveBeenCalled();
51
+ });
52
+
53
+ it('Test log', async () => {
54
+ const method = jest.spyOn(console, 'log');
55
+ logger.log('test');
56
+
57
+ expect(method).toHaveBeenCalled();
58
+ });
59
+
60
+ it('Test log with options', async () => {
61
+ const method = jest.spyOn(console, 'log');
62
+ logger.log('test', logOptions);
63
+
64
+ expect(method).toHaveBeenCalled();
65
+ });
66
+
67
+ it('Test error', async () => {
68
+ const method = jest.spyOn(console, 'error');
69
+ logger.error('error', 'trace', { data: 'test' });
70
+
71
+ expect(method).toHaveBeenCalled();
72
+ expect(method).toHaveBeenCalledWith('[test]', 'error', 'trace', {
73
+ message: 'test',
74
+ });
75
+ });
76
+
77
+ it('Test error with options', async () => {
78
+ const method = jest.spyOn(console, 'error');
79
+ logger.error('test', undefined, logOptions);
80
+
81
+ expect(method).toHaveBeenCalled();
82
+ });
83
+
84
+ it('Test warn', async () => {
85
+ const method = jest.spyOn(console, 'warn');
86
+ logger.warn('warn');
87
+
88
+ expect(method).toHaveBeenCalled();
89
+ });
90
+
91
+ it('Test warn with options', async () => {
92
+ const method = jest.spyOn(console, 'warn');
93
+ logger.warn('test', logOptions);
94
+
95
+ expect(method).toHaveBeenCalled();
96
+ });
97
+
98
+ it('Test debug', async () => {
99
+ const method = jest.spyOn(console, 'debug');
100
+ logger.debug?.('debug');
101
+
102
+ expect(method).toHaveBeenCalled();
103
+ });
104
+
105
+ it('Test debug with options', async () => {
106
+ const method = jest.spyOn(console, 'debug');
107
+ logger.debug?.('test', logOptions);
108
+
109
+ expect(method).toHaveBeenCalled();
110
+ });
111
+
112
+ it('Test verbose', async () => {
113
+ const method = jest.spyOn(console, 'info');
114
+ logger.verbose?.('verbose');
115
+
116
+ expect(method).toHaveBeenCalled();
117
+ });
118
+
119
+ it('Test verbose with options', async () => {
120
+ const method = jest.spyOn(console, 'info');
121
+ logger.verbose?.('test', logOptions);
122
+
123
+ expect(method).toHaveBeenCalled();
124
+ });
125
+
126
+ it('setLogLevels should validate levels and emit events', async () => {
127
+ const emitter = { emit: jest.fn() } as any;
128
+ logger.setLogLevels(LOG_LEVEL_ALL);
129
+ logger.error('boom', 'trace', { eventEmitter: emitter, useFallbackEvent: true });
130
+ expect(emitter.emit).toHaveBeenCalled();
131
+ emitter.emit.mockClear();
132
+ logger.error('skip', 'trace', { eventEmitter: emitter, event: false as any });
133
+ expect(emitter.emit).not.toHaveBeenCalled();
134
+ expect(() => logger.setLogLevels(['invalid' as any])).toThrow();
135
+ });
136
+ });
@@ -0,0 +1,39 @@
1
+ import { expect, describe, it } from '@jest/globals';
2
+ import { ImprovedNestLogger } from '../index.js';
3
+
4
+ describe('Nest logger service test', () => {
5
+ it('Test log', async () => {
6
+ const logger = new ImprovedNestLogger('test', {});
7
+ logger.log('test');
8
+ });
9
+
10
+ it('Test log with string options', async () => {
11
+ const logger = new ImprovedNestLogger('test', {});
12
+ logger.log('test', 'string options');
13
+ });
14
+
15
+ it('Test log with masked data', async () => {
16
+ const logger = new ImprovedNestLogger('test', {});
17
+ logger.log('test', { masks: ['pass'], data: { pass: 'data' } });
18
+ });
19
+
20
+ it('Test error', async () => {
21
+ const logger = new ImprovedNestLogger('test', {});
22
+ logger.error('error', 'trace');
23
+ });
24
+
25
+ it('Test warn', async () => {
26
+ const logger = new ImprovedNestLogger('test', {});
27
+ logger.warn('warn');
28
+ });
29
+
30
+ it('Test debug', async () => {
31
+ const logger = new ImprovedNestLogger('test', {});
32
+ logger.debug?.('debug');
33
+ });
34
+
35
+ it('Test verbose', async () => {
36
+ const logger = new ImprovedNestLogger('test', {});
37
+ logger.verbose?.('verbose');
38
+ });
39
+ });
@@ -0,0 +1,149 @@
1
+ import {
2
+ expect,
3
+ jest,
4
+ describe,
5
+ it,
6
+ beforeEach,
7
+ afterEach,
8
+ } from '@jest/globals';
9
+
10
+ import { Logger } from 'pino';
11
+ import { PinoLogger, FLUSH_INTERVAL, flush } from '../index.js';
12
+ import { LOG_LEVEL_ALL } from '../logger.enum.js';
13
+
14
+ const logOptions = {
15
+ context: 'test',
16
+ data: { pass: 'data' },
17
+ masks: ['pass'],
18
+ };
19
+
20
+ describe('Pino logger service test', () => {
21
+ let pino: Logger;
22
+ const container: { logger?: PinoLogger } = {
23
+ logger: new PinoLogger('test', LOG_LEVEL_ALL),
24
+ };
25
+
26
+ beforeEach(async () => {
27
+ container.logger = new PinoLogger('test', LOG_LEVEL_ALL);
28
+ pino = container.logger?.getLogger();
29
+ });
30
+
31
+ afterEach(() => {
32
+ jest.useRealTimers();
33
+ });
34
+
35
+ it('Test log', async () => {
36
+ const method = jest.spyOn(pino, 'info');
37
+ container.logger?.log('test');
38
+
39
+ expect(method).toHaveBeenCalled();
40
+ });
41
+
42
+ it('Test log with options', async () => {
43
+ const method = jest.spyOn(pino, 'info');
44
+ container.logger?.log('info', logOptions);
45
+
46
+ expect(method).toHaveBeenCalled();
47
+ });
48
+
49
+ it('Test error', async () => {
50
+ const method = jest.spyOn(pino, 'error');
51
+ container.logger?.error('error', 'trace');
52
+
53
+ expect(method).toHaveBeenCalled();
54
+ // expect(method).toHaveBeenCalledWith({ context: 'test' }, 'error trace');
55
+ });
56
+
57
+ it('Test error with options', async () => {
58
+ const method = jest.spyOn(pino, 'error');
59
+ container.logger?.error('error', undefined, logOptions);
60
+
61
+ expect(method).toHaveBeenCalled();
62
+ });
63
+
64
+ it('Test warn', async () => {
65
+ const method = jest.spyOn(pino, 'warn');
66
+ container.logger?.warn('warn');
67
+
68
+ expect(method).toHaveBeenCalled();
69
+ });
70
+
71
+ it('Test warn with options', async () => {
72
+ const method = jest.spyOn(pino, 'warn');
73
+ container.logger?.warn('warn', logOptions);
74
+
75
+ expect(method).toHaveBeenCalled();
76
+ });
77
+
78
+ it('Test debug', async () => {
79
+ const method = jest.spyOn(pino, 'debug');
80
+ container.logger?.debug?.('debug');
81
+
82
+ expect(method).toHaveBeenCalled();
83
+ });
84
+
85
+ it('Test debug with options', async () => {
86
+ const method = jest.spyOn(pino, 'debug');
87
+ container.logger?.debug?.('debug', logOptions);
88
+
89
+ expect(method).toHaveBeenCalled();
90
+ });
91
+
92
+ it('Test verbose with options', async () => {
93
+ const method = jest.spyOn(pino, 'trace');
94
+ container.logger?.verbose?.('verbose', logOptions);
95
+
96
+ expect(method).toHaveBeenCalled();
97
+ });
98
+
99
+ it('Test verbose & flush', async () => {
100
+ jest.useFakeTimers();
101
+
102
+ jest.mock('process', () => ({
103
+ on: jest.fn((fn) => {
104
+ fn();
105
+ }),
106
+ }));
107
+
108
+ const _logger = new PinoLogger('test', LOG_LEVEL_ALL);
109
+
110
+ const method = jest.spyOn(pino, 'trace');
111
+ _logger.verbose?.('verbose');
112
+
113
+ // Fast-forward until all timers have been executed
114
+ jest.advanceTimersByTime(FLUSH_INTERVAL + 1000);
115
+
116
+ expect(method).toHaveBeenCalled();
117
+ });
118
+
119
+ it('Test on application shutdown', async () => {
120
+ const method = jest.spyOn(pino, 'info');
121
+ container.logger?.log('test');
122
+ await container.logger?.onApplicationShutdown();
123
+ expect(method).toHaveBeenCalledWith({ context: 'test' }, 'test');
124
+ });
125
+
126
+ it('Test flush when logger has been destroyed', async () => {
127
+ const method = jest.spyOn(pino, 'flush');
128
+ method.mockImplementation((callback: any) => {
129
+ callback();
130
+ });
131
+
132
+ delete container.logger;
133
+ await flush();
134
+ expect(container.logger).toBeUndefined();
135
+ expect(method).toHaveBeenCalled();
136
+ });
137
+
138
+ it('Test flush with error', async () => {
139
+ const method = jest.spyOn(pino, 'flush');
140
+ method.mockImplementation((callback: any) => {
141
+ callback(new Error('test'));
142
+ });
143
+
144
+ expect(
145
+ async () => await container.logger?.onApplicationShutdown(),
146
+ ).rejects.toThrow();
147
+ expect(method).toHaveBeenCalled();
148
+ });
149
+ });
@@ -0,0 +1,69 @@
1
+ import {
2
+ expect,
3
+ jest,
4
+ describe,
5
+ it,
6
+ beforeEach,
7
+ beforeAll,
8
+ afterAll,
9
+ afterEach,
10
+ } from '@jest/globals';
11
+
12
+ class NestLogger {
13
+ setLogLevels: jest.Mock<any>;
14
+ static overrideLogger = jest.fn();
15
+ }
16
+
17
+ jest.mock('@nestjs/common', () => ({
18
+ ...(jest.requireActual('@nestjs/common') as any),
19
+ Logger: NestLogger,
20
+ }));
21
+
22
+ import { LogLevelEnum, LoggerTypeEnum } from '../logger.enum.js';
23
+ import { AppLoggerFactory } from '../logger.factory.js';
24
+ import { PinoLogger } from '../logger-pino.service.js';
25
+
26
+ describe('AppLoggerFactory', () => {
27
+ // let mockConfigService;
28
+ let logger;
29
+
30
+ it('No configuration test', async () => {
31
+ logger = AppLoggerFactory(
32
+ 'test',
33
+ [LogLevelEnum.DEBUG],
34
+ LoggerTypeEnum.CONSOLE,
35
+ );
36
+ expect(logger).toBeDefined();
37
+
38
+ logger = AppLoggerFactory(
39
+ 'test',
40
+ [LogLevelEnum.DEBUG],
41
+ LoggerTypeEnum.PINO,
42
+ );
43
+ expect(logger).toBeDefined();
44
+ expect(logger instanceof PinoLogger).toBeTruthy();
45
+
46
+ logger = AppLoggerFactory(
47
+ 'test',
48
+ [LogLevelEnum.DEBUG],
49
+ LoggerTypeEnum.NEST,
50
+ );
51
+ expect(logger).toBeDefined();
52
+
53
+ logger = AppLoggerFactory('test', [LogLevelEnum.DEBUG]);
54
+ expect(logger).toBeDefined();
55
+
56
+ logger = AppLoggerFactory('test', []);
57
+ expect(logger).toBeDefined();
58
+ });
59
+
60
+ it('No configuration test', async () => {
61
+ logger = AppLoggerFactory('test');
62
+ expect(logger).toBeDefined();
63
+
64
+ NestLogger.prototype.setLogLevels = jest.fn();
65
+
66
+ logger = AppLoggerFactory('test', [LogLevelEnum.DEBUG]);
67
+ expect(logger).toBeDefined();
68
+ });
69
+ });
@@ -0,0 +1,54 @@
1
+ import { describe, expect, it } from '@jest/globals';
2
+
3
+ import * as loggerHelper from '../logger.helper.js';
4
+
5
+ const testObject = {
6
+ password: '123',
7
+ foo: 'bar',
8
+ bar: 'foo',
9
+ };
10
+
11
+ describe('test logger helper', () => {
12
+ it('should test the maskDataInObject', () => {
13
+ const subject = loggerHelper.maskDataInObject(testObject);
14
+ expect(subject).toEqual({
15
+ ...testObject,
16
+ });
17
+ });
18
+
19
+ it('should attach trace when data is empty', () => {
20
+ const subject = loggerHelper.maskDataInObject(undefined, undefined, 'trace');
21
+ expect(subject).toEqual({ trace: 'trace' });
22
+ });
23
+
24
+ it('should test the maskDataInObject with password masking', () => {
25
+ const subject = loggerHelper.maskDataInObject(testObject, ['password']);
26
+ expect(subject).toEqual({
27
+ ...testObject,
28
+ password: '[REDACTED]',
29
+ });
30
+ });
31
+
32
+ it('should read logger levels from env', () => {
33
+ process.env.NEST_LOGGER_LEVELS_API = 'error,log';
34
+ process.env.NEST_LOGGER_LEVELS = 'debug';
35
+
36
+ expect(loggerHelper.getEnvLoggerLevelsByContext('api')).toEqual([
37
+ 'error',
38
+ 'log',
39
+ ]);
40
+ expect(loggerHelper.getEnvLoggerLevels('api', ['warn'])).toEqual([
41
+ 'error',
42
+ 'log',
43
+ ]);
44
+
45
+ delete process.env.NEST_LOGGER_LEVELS_API;
46
+ expect(loggerHelper.getEnvLoggerLevels('missing', ['warn'])).toEqual([
47
+ 'debug',
48
+ ]);
49
+ });
50
+
51
+ it('should wrap string data into object', () => {
52
+ expect(loggerHelper.maskDataInObject('message')).toEqual({ message: 'message' });
53
+ });
54
+ });
@@ -0,0 +1,78 @@
1
+ import { jest, describe, beforeEach, it, expect } from '@jest/globals';
2
+ import { Test } from '@nestjs/testing';
3
+ import { LoggerServiceFactory } from '../logger.service.js';
4
+ import {
5
+ AppConfigService,
6
+ getAppConfigToken,
7
+ } from '@nest-yalc-2/app/app-config.service.js';
8
+ import { EventEmitter2 } from '@nestjs/event-emitter';
9
+
10
+ describe('LoggerServiceFactory', () => {
11
+ let configService: AppConfigService;
12
+
13
+ beforeEach(async () => {
14
+ const moduleRef = await Test.createTestingModule({
15
+ providers: [
16
+ {
17
+ provide: AppConfigService,
18
+ useValue: {
19
+ values: jest.fn().mockReturnValue({
20
+ loggerType: 'console',
21
+ logContextLevels: {
22
+ TestContext: ['debug', 'error'],
23
+ },
24
+ logLevels: ['warn', 'log'],
25
+ }),
26
+ },
27
+ },
28
+ ],
29
+ }).compile();
30
+
31
+ configService = moduleRef.get<AppConfigService>(AppConfigService);
32
+ });
33
+
34
+ it('should create logger service', () => {
35
+ const loggerService = LoggerServiceFactory(
36
+ 'TestContext',
37
+ 'TestProvide',
38
+ 'TestContext',
39
+ );
40
+ expect(loggerService).toBeDefined();
41
+ expect(loggerService.provide).toBe('TestProvide');
42
+ expect(loggerService.inject).toEqual([
43
+ getAppConfigToken('TestContext'),
44
+ EventEmitter2,
45
+ ]);
46
+
47
+ const logger = loggerService.useFactory(configService);
48
+ expect(logger).toBeDefined();
49
+ });
50
+
51
+ it('should create logger service with default log levels', () => {
52
+ jest.spyOn(configService, 'values').mockReturnValue({
53
+ loggerType: 'console',
54
+ logLevels: ['warn', 'log'],
55
+ });
56
+
57
+ const loggerService = LoggerServiceFactory(
58
+ 'TestContext',
59
+ 'TestProvide',
60
+ 'TestContext',
61
+ );
62
+ const logger = loggerService.useFactory(configService);
63
+ expect(logger).toBeDefined();
64
+ });
65
+
66
+ it('should create logger service with event disabled', () => {
67
+ jest.spyOn(configService, 'values').mockReturnValue({
68
+ loggerType: 'console',
69
+ logLevels: ['warn', 'log'],
70
+ });
71
+
72
+ const loggerService = LoggerServiceFactory('TestProvide', 'TestContext', {
73
+ event: false,
74
+ });
75
+ const logger = loggerService.useFactory(configService);
76
+ expect(logger).toBeDefined();
77
+ });
78
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "../../../tsconfig.test.json"
3
+ }
@@ -0,0 +1,111 @@
1
+ import {
2
+ expect,
3
+ jest,
4
+ describe,
5
+ it,
6
+ beforeEach,
7
+ beforeAll,
8
+ afterAll,
9
+ afterEach,
10
+ } from '@jest/globals';
11
+
12
+ // class NestLogger {}
13
+
14
+ // jest.mock('@nestjs/common', () => ({
15
+ // ...(jest.requireActual('@nestjs/common') as any),
16
+ // Logger: NestLogger,
17
+ // }));
18
+
19
+ // import { LogLevelEnum, LoggerTypeEnum } from '../logger.enum.js';
20
+ // import { AppLoggerFactory } from '../logger.factory.js';
21
+ // import { DeepMocked } from '@golevelup/ts-jest';
22
+ import { createMock } from '@golevelup/ts-jest';
23
+ import { LoggerService } from '@nestjs/common';
24
+ import { EventEmitter2 } from '@nestjs/event-emitter';
25
+ import { TypeORMLogger } from '../typeorm-logger.js';
26
+
27
+ describe('TypeORMLogger with a valid logger', () => {
28
+ const mockedLoggerService = createMock<LoggerService>();
29
+ const mockedEventEmitter2 = createMock<EventEmitter2>();
30
+ let testLogger: TypeORMLogger;
31
+
32
+ beforeAll(() => {
33
+ process.env.TYPEORM_LOGGING = 'true';
34
+ testLogger = new TypeORMLogger(mockedLoggerService, mockedEventEmitter2);
35
+ });
36
+
37
+ afterAll(() => {
38
+ delete process.env.TYPEORM_LOGGING;
39
+ });
40
+
41
+ it('logQuery ', async () => {
42
+ const spiedLoggerServiceFn = jest.spyOn(mockedLoggerService, 'debug');
43
+ testLogger.logQuery('aQuery');
44
+ expect(spiedLoggerServiceFn).toHaveBeenCalledTimes(1);
45
+ });
46
+
47
+ it('logQueryError ', async () => {
48
+ const spiedLoggerServiceFn = jest.spyOn(mockedLoggerService, 'error');
49
+ testLogger.logQueryError('error', 'aQuery');
50
+ expect(spiedLoggerServiceFn).toHaveBeenCalledTimes(1);
51
+ });
52
+
53
+ it('logQuerySlow ', async () => {
54
+ const spiedLoggerServiceFn = jest.spyOn(mockedLoggerService, 'warn');
55
+ testLogger.logQuerySlow(10000, 'aQuery');
56
+ expect(spiedLoggerServiceFn).toHaveBeenCalledTimes(1);
57
+ });
58
+
59
+ it('logSchemaBuild ', async () => {
60
+ const spiedLoggerServiceFn = jest.spyOn(mockedLoggerService, 'debug');
61
+ testLogger.logSchemaBuild('aQuery');
62
+ expect(spiedLoggerServiceFn).toHaveBeenCalledTimes(2);
63
+ });
64
+
65
+ it('logMigration ', async () => {
66
+ const spiedLoggerServiceFn = jest.spyOn(mockedLoggerService, 'debug');
67
+ testLogger.logMigration('aQuery');
68
+ expect(spiedLoggerServiceFn).toHaveBeenCalledTimes(3);
69
+ });
70
+
71
+ it('log ', async () => {
72
+ const spiedLoggerServiceLog = jest.spyOn(mockedLoggerService, 'log');
73
+ testLogger.log('log', 'aQuery');
74
+ expect(spiedLoggerServiceLog).toHaveBeenCalledTimes(1);
75
+
76
+ const spiedLoggerServiceInfo = jest.spyOn(mockedLoggerService, 'verbose');
77
+ testLogger.log('info', 'aQuery');
78
+ expect(spiedLoggerServiceInfo).toHaveBeenCalledTimes(1);
79
+
80
+ const spiedLoggerServiceWarn = jest.spyOn(mockedLoggerService, 'warn');
81
+ testLogger.log('warn', 'aQuery');
82
+ expect(spiedLoggerServiceWarn).toHaveBeenCalledTimes(2);
83
+ });
84
+ });
85
+
86
+ describe('TypeORMLogger with a invalid logger', () => {
87
+ const mockedLoggerService = createMock<LoggerService>();
88
+ const mockedEventEmitter2 = createMock<EventEmitter2>();
89
+ mockedLoggerService.debug = undefined;
90
+ mockedLoggerService.error = undefined;
91
+ mockedLoggerService.warn = undefined;
92
+ mockedLoggerService.log = undefined;
93
+ mockedLoggerService.verbose = undefined;
94
+ const testLogger = new TypeORMLogger(
95
+ mockedLoggerService,
96
+ mockedEventEmitter2,
97
+ );
98
+
99
+ it('All che level should ignore a missing logger function ', async () => {
100
+ expect(() => testLogger.logQuery('aQuery')).not.toThrow();
101
+ expect(() =>
102
+ testLogger.logQueryError('error', 'aQuery'),
103
+ ).not.toThrow();
104
+ expect(() => testLogger.logQuerySlow(10000, 'aQuery')).not.toThrow();
105
+ expect(() => testLogger.logSchemaBuild('aQuery')).not.toThrow();
106
+ expect(() => testLogger.logMigration('aQuery')).not.toThrow();
107
+ expect(() => testLogger.log('log', 'aQuery')).not.toThrow();
108
+ expect(() => testLogger.log('info', 'aQuery')).not.toThrow();
109
+ expect(() => testLogger.log('warn', 'aQuery')).not.toThrow();
110
+ });
111
+ });
package/src/index.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export * from './logger.enum.js';
2
+ export * from './logger.event.js';
3
+ export * from './logger.factory.js';
4
+ export * from './typeorm-logger.js';
5
+ export * from './logger.helper.js';
6
+ export * from './logger-abstract.service.js';
7
+ export * from './logger-nest.service.js';
8
+ export * from './logger-console.service.js';
9
+ export * from './logger.service.js';
10
+ export * from './logger-pino.service.js';