@unito/integration-sdk 0.1.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 (142) hide show
  1. package/.eslintrc.cjs +27 -0
  2. package/.nvmrc +1 -0
  3. package/.prettierignore +2 -0
  4. package/.prettierrc +7 -0
  5. package/LICENSE +3 -0
  6. package/README.md +16 -0
  7. package/dist/src/api/index.d.ts +2 -0
  8. package/dist/src/api/index.d.ts.map +1 -0
  9. package/dist/src/api/index.js +2 -0
  10. package/dist/src/api/index.js.map +1 -0
  11. package/dist/src/app/errors/HTTPError.d.ts +5 -0
  12. package/dist/src/app/errors/HTTPError.d.ts.map +1 -0
  13. package/dist/src/app/errors/HTTPError.js +8 -0
  14. package/dist/src/app/errors/HTTPError.js.map +1 -0
  15. package/dist/src/app/errors/HTTPNotFoundError.d.ts +5 -0
  16. package/dist/src/app/errors/HTTPNotFoundError.d.ts.map +1 -0
  17. package/dist/src/app/errors/HTTPNotFoundError.js +7 -0
  18. package/dist/src/app/errors/HTTPNotFoundError.js.map +1 -0
  19. package/dist/src/app/errors/HTTPUnprocessableEntityError.d.ts +5 -0
  20. package/dist/src/app/errors/HTTPUnprocessableEntityError.d.ts.map +1 -0
  21. package/dist/src/app/errors/HTTPUnprocessableEntityError.js +7 -0
  22. package/dist/src/app/errors/HTTPUnprocessableEntityError.js.map +1 -0
  23. package/dist/src/app/errors/index.d.ts +4 -0
  24. package/dist/src/app/errors/index.d.ts.map +1 -0
  25. package/dist/src/app/errors/index.js +4 -0
  26. package/dist/src/app/errors/index.js.map +1 -0
  27. package/dist/src/app/index.d.ts +6 -0
  28. package/dist/src/app/index.d.ts.map +1 -0
  29. package/dist/src/app/index.js +80 -0
  30. package/dist/src/app/index.js.map +1 -0
  31. package/dist/src/app/integration.d.ts +5 -0
  32. package/dist/src/app/integration.d.ts.map +1 -0
  33. package/dist/src/app/integration.js +86 -0
  34. package/dist/src/app/integration.js.map +1 -0
  35. package/dist/src/app/itemNode.d.ts +8 -0
  36. package/dist/src/app/itemNode.d.ts.map +1 -0
  37. package/dist/src/app/itemNode.js +13 -0
  38. package/dist/src/app/itemNode.js.map +1 -0
  39. package/dist/src/app/middlewares/withCorrelationId.d.ts +11 -0
  40. package/dist/src/app/middlewares/withCorrelationId.d.ts.map +1 -0
  41. package/dist/src/app/middlewares/withCorrelationId.js +8 -0
  42. package/dist/src/app/middlewares/withCorrelationId.js.map +1 -0
  43. package/dist/src/app/middlewares/withLogger.d.ts +12 -0
  44. package/dist/src/app/middlewares/withLogger.d.ts.map +1 -0
  45. package/dist/src/app/middlewares/withLogger.js +18 -0
  46. package/dist/src/app/middlewares/withLogger.js.map +1 -0
  47. package/dist/src/errors.d.ts +15 -0
  48. package/dist/src/errors.js +39 -0
  49. package/dist/src/handler.d.ts +67 -0
  50. package/dist/src/handler.js +224 -0
  51. package/dist/src/httpErrors.d.ts +22 -0
  52. package/dist/src/httpErrors.js +37 -0
  53. package/dist/src/index.d.ts +6 -0
  54. package/dist/src/index.d.ts.map +1 -0
  55. package/dist/src/index.js +6 -0
  56. package/dist/src/index.js.map +1 -0
  57. package/dist/src/integration.d.ts +9 -0
  58. package/dist/src/integration.js +108 -0
  59. package/dist/src/middlewares/correlationId.d.ts +10 -0
  60. package/dist/src/middlewares/correlationId.js +6 -0
  61. package/dist/src/middlewares/credentials.d.ts +11 -0
  62. package/dist/src/middlewares/credentials.js +17 -0
  63. package/dist/src/middlewares/errors.d.ts +3 -0
  64. package/dist/src/middlewares/errors.js +22 -0
  65. package/dist/src/middlewares/filters.d.ts +16 -0
  66. package/dist/src/middlewares/filters.js +25 -0
  67. package/dist/src/middlewares/finish.d.ts +11 -0
  68. package/dist/src/middlewares/finish.js +10 -0
  69. package/dist/src/middlewares/logger.d.ts +12 -0
  70. package/dist/src/middlewares/logger.js +18 -0
  71. package/dist/src/middlewares/notFound.d.ts +3 -0
  72. package/dist/src/middlewares/notFound.js +8 -0
  73. package/dist/src/middlewares/selects.d.ts +10 -0
  74. package/dist/src/middlewares/selects.js +11 -0
  75. package/dist/src/resources/cache.d.ts +4 -0
  76. package/dist/src/resources/cache.d.ts.map +1 -0
  77. package/dist/src/resources/cache.js +25 -0
  78. package/dist/src/resources/cache.js.map +1 -0
  79. package/dist/src/resources/context.d.ts +78 -0
  80. package/dist/src/resources/context.js +2 -0
  81. package/dist/src/resources/logger.d.ts +14 -0
  82. package/dist/src/resources/logger.d.ts.map +1 -0
  83. package/dist/src/resources/logger.js +46 -0
  84. package/dist/src/resources/logger.js.map +1 -0
  85. package/dist/src/resources/provider.d.ts +36 -0
  86. package/dist/src/resources/provider.js +76 -0
  87. package/dist/test/errors.test.d.ts +1 -0
  88. package/dist/test/errors.test.js +16 -0
  89. package/dist/test/handler.test.d.ts +1 -0
  90. package/dist/test/handler.test.js +146 -0
  91. package/dist/test/middlewares/correlationId.test.d.ts +1 -0
  92. package/dist/test/middlewares/correlationId.test.js +19 -0
  93. package/dist/test/middlewares/credentials.test.d.ts +1 -0
  94. package/dist/test/middlewares/credentials.test.js +37 -0
  95. package/dist/test/middlewares/errors.test.d.ts +1 -0
  96. package/dist/test/middlewares/errors.test.js +64 -0
  97. package/dist/test/middlewares/filters.test.d.ts +1 -0
  98. package/dist/test/middlewares/filters.test.js +26 -0
  99. package/dist/test/middlewares/finish.test.d.ts +1 -0
  100. package/dist/test/middlewares/finish.test.js +68 -0
  101. package/dist/test/middlewares/logger.test.d.ts +1 -0
  102. package/dist/test/middlewares/logger.test.js +41 -0
  103. package/dist/test/middlewares/notFound.test.d.ts +1 -0
  104. package/dist/test/middlewares/notFound.test.js +27 -0
  105. package/dist/test/middlewares/selects.test.d.ts +1 -0
  106. package/dist/test/middlewares/selects.test.js +21 -0
  107. package/dist/test/resources/cache.test.d.ts +1 -0
  108. package/dist/test/resources/cache.test.js +25 -0
  109. package/dist/test/resources/logger.test.d.ts +1 -0
  110. package/dist/test/resources/logger.test.js +67 -0
  111. package/dist/tsconfig.tsbuildinfo +1 -0
  112. package/package.json +59 -0
  113. package/src/errors.ts +34 -0
  114. package/src/handler.ts +404 -0
  115. package/src/httpErrors.ts +44 -0
  116. package/src/index.ts +10 -0
  117. package/src/integration.ts +129 -0
  118. package/src/middlewares/correlationId.ts +19 -0
  119. package/src/middlewares/credentials.ts +35 -0
  120. package/src/middlewares/errors.ts +30 -0
  121. package/src/middlewares/filters.ts +51 -0
  122. package/src/middlewares/finish.ts +24 -0
  123. package/src/middlewares/logger.ts +36 -0
  124. package/src/middlewares/notFound.ts +13 -0
  125. package/src/middlewares/selects.ts +31 -0
  126. package/src/resources/cache.ts +34 -0
  127. package/src/resources/context.ts +113 -0
  128. package/src/resources/logger.ts +57 -0
  129. package/src/resources/provider.ts +120 -0
  130. package/test/errors.test.ts +17 -0
  131. package/test/handler.test.ts +178 -0
  132. package/test/middlewares/correlationId.test.ts +26 -0
  133. package/test/middlewares/credentials.test.ts +52 -0
  134. package/test/middlewares/errors.test.ts +78 -0
  135. package/test/middlewares/filters.test.ts +39 -0
  136. package/test/middlewares/finish.test.ts +81 -0
  137. package/test/middlewares/logger.test.ts +57 -0
  138. package/test/middlewares/notFound.test.ts +32 -0
  139. package/test/middlewares/selects.test.ts +34 -0
  140. package/test/resources/cache.test.ts +31 -0
  141. package/test/resources/logger.test.ts +80 -0
  142. package/tsconfig.json +29 -0
@@ -0,0 +1,26 @@
1
+ import express from 'express';
2
+ import assert from 'node:assert/strict';
3
+ import { describe, it } from 'node:test';
4
+ import middleware from '../../src/middlewares/correlationId.js';
5
+
6
+ describe('correlationId middleware', () => {
7
+ it('uses header', () => {
8
+ const request = { header: (_key: string) => '123' } as express.Request;
9
+ const response = { locals: {} } as express.Response;
10
+
11
+ middleware(request, response, () => {});
12
+
13
+ assert.deepEqual(response.locals, {
14
+ correlationId: '123',
15
+ });
16
+ });
17
+
18
+ it('fallback', () => {
19
+ const request = { header: (_key: string) => undefined } as express.Request;
20
+ const response = { locals: {} } as express.Response;
21
+
22
+ middleware(request, response, () => {});
23
+
24
+ assert(response.locals.correlationId);
25
+ });
26
+ });
@@ -0,0 +1,52 @@
1
+ import express from 'express';
2
+ import assert from 'node:assert/strict';
3
+ import { describe, it } from 'node:test';
4
+ import middleware from '../../src/middlewares/credentials.js';
5
+ import { BadRequestError } from '../../src/httpErrors.js';
6
+
7
+ describe('credentials middleware', () => {
8
+ it('generates', async () => {
9
+ const credentials = Buffer.from(
10
+ JSON.stringify({
11
+ accessToken: 'abc',
12
+ }),
13
+ ).toString('base64');
14
+
15
+ const request = { header: (_key: string) => credentials } as express.Request;
16
+ const response = { locals: {} } as express.Response;
17
+
18
+ middleware(request, response, () => {});
19
+
20
+ assert.deepEqual(response.locals, {
21
+ credentials: {
22
+ accessToken: 'abc',
23
+ },
24
+ });
25
+ });
26
+
27
+ it('malformed header', async () => {
28
+ const request = { header: (_key: string) => 'nope' } as express.Request;
29
+ const response = { locals: {} } as express.Response;
30
+
31
+ assert.throws(() => middleware(request, response, () => {}), BadRequestError);
32
+ });
33
+
34
+ it('variables', async () => {
35
+ const credentials = Buffer.from(
36
+ JSON.stringify({
37
+ apiKey: 'abc',
38
+ }),
39
+ ).toString('base64');
40
+
41
+ const request = { header: (_key: string) => credentials } as express.Request;
42
+ const response = { locals: {} } as express.Response;
43
+
44
+ middleware(request, response, () => {});
45
+
46
+ assert.deepEqual(response.locals, {
47
+ credentials: {
48
+ apiKey: 'abc',
49
+ },
50
+ });
51
+ });
52
+ });
@@ -0,0 +1,78 @@
1
+ import express from 'express';
2
+ import assert from 'node:assert/strict';
3
+ import { describe, it } from 'node:test';
4
+ import middleware from '../../src/middlewares/errors.js';
5
+ import { HttpError } from '../../src/httpErrors.js';
6
+
7
+ describe('errors middleware', () => {
8
+ it('headers sent, do nothing', () => {
9
+ let actualStatus: number | undefined;
10
+ let actualJson: Record<string, unknown> | undefined;
11
+
12
+ const response = {
13
+ headersSent: true,
14
+ status: (code: number) => {
15
+ actualStatus = code;
16
+
17
+ return {
18
+ json: (json: Record<string, unknown>) => {
19
+ actualJson = json;
20
+ },
21
+ };
22
+ },
23
+ locals: { logger: { error: () => undefined } },
24
+ } as unknown as express.Response;
25
+
26
+ middleware(new Error(), {} as express.Request, response, () => {});
27
+
28
+ assert.strictEqual(actualStatus, undefined);
29
+ assert.strictEqual(actualJson, undefined);
30
+ });
31
+
32
+ it('handles httpError', () => {
33
+ let actualStatus: number | undefined;
34
+ let actualJson: Record<string, unknown> | undefined;
35
+
36
+ const response = {
37
+ headersSent: false,
38
+ status: (code: number) => {
39
+ actualStatus = code;
40
+
41
+ return {
42
+ json: (json: Record<string, unknown>) => {
43
+ actualJson = json;
44
+ },
45
+ };
46
+ },
47
+ locals: { logger: { error: () => undefined } },
48
+ } as unknown as express.Response;
49
+ middleware(new HttpError('httpError', 429), {} as express.Request, response, () => {});
50
+
51
+ assert.strictEqual(actualStatus, 429);
52
+ assert.strictEqual(actualJson, 'httpError');
53
+ });
54
+
55
+ it('handles other error', () => {
56
+ let actualStatus: number | undefined;
57
+ let actualJson: Record<string, unknown> | undefined;
58
+
59
+ const response = {
60
+ headersSent: false,
61
+ status: (code: number) => {
62
+ actualStatus = code;
63
+
64
+ return {
65
+ json: (json: Record<string, unknown>) => {
66
+ actualJson = json;
67
+ },
68
+ };
69
+ },
70
+ locals: { logger: { error: () => undefined } },
71
+ } as unknown as express.Response;
72
+ middleware(new Error('error'), {} as express.Request, response, () => {});
73
+
74
+ assert.strictEqual(actualStatus, 500);
75
+ assert.strictEqual(actualJson?.code, '500');
76
+ assert.deepEqual(actualJson?.originalError, { code: 'Error', message: 'error' });
77
+ });
78
+ });
@@ -0,0 +1,39 @@
1
+ import { OperatorType } from '@unito/integration-api';
2
+ import express from 'express';
3
+ import assert from 'node:assert/strict';
4
+ import { describe, it } from 'node:test';
5
+ import middleware from '../../src/middlewares/filters.js';
6
+
7
+ describe('filters middleware', () => {
8
+ it('data', () => {
9
+ const request = { query: { filter: 'status=active|pending,createdAt>2022-01-01,email!!' } } as express.Request<
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ any,
12
+ object,
13
+ object,
14
+ { filter: string }
15
+ >;
16
+ const response = { locals: {} } as express.Response;
17
+
18
+ middleware(request, response, () => {});
19
+
20
+ assert.deepEqual(response.locals, {
21
+ filters: [
22
+ { field: 'status', operator: OperatorType.EQUAL, values: ['active', 'pending'] },
23
+ { field: 'createdAt', operator: OperatorType.GREATER_THAN, values: ['2022-01-01'] },
24
+ { field: 'email', operator: OperatorType.IS_NOT_NULL, values: [] },
25
+ ],
26
+ });
27
+ });
28
+
29
+ it('no data', () => {
30
+ const request = { query: {} } as express.Request;
31
+ const response = { locals: {} } as express.Response;
32
+
33
+ middleware(request, response, () => {});
34
+
35
+ assert.deepEqual(response.locals, {
36
+ filters: [],
37
+ });
38
+ });
39
+ });
@@ -0,0 +1,81 @@
1
+ import express from 'express';
2
+ import assert from 'node:assert/strict';
3
+ import { describe, it } from 'node:test';
4
+ import middleware from '../../src/middlewares/finish.js';
5
+
6
+ describe('finish middleware', () => {
7
+ it('logs info', () => {
8
+ let expected = '';
9
+ let eventHandler: () => void = () => {};
10
+
11
+ const request = { originalUrl: '/' } as express.Request;
12
+ const response = {
13
+ on: (_event, func: () => void) => {
14
+ eventHandler = func;
15
+ },
16
+ locals: {
17
+ logger: {
18
+ info: (_message: string) => {
19
+ expected = 'works!';
20
+ },
21
+ },
22
+ },
23
+ statusCode: 200,
24
+ } as express.Response;
25
+
26
+ middleware(request, response, () => {});
27
+ eventHandler();
28
+
29
+ assert.equal(expected, 'works!');
30
+ });
31
+
32
+ it('logs error', () => {
33
+ let expected = '';
34
+ let eventHandler: () => void = () => {};
35
+
36
+ const request = { originalUrl: '/' } as express.Request;
37
+ const response = {
38
+ on: (_event, func: () => void) => {
39
+ eventHandler = func;
40
+ },
41
+ locals: {
42
+ logger: {
43
+ error: (_message: string) => {
44
+ expected = 'works!';
45
+ },
46
+ },
47
+ },
48
+ statusCode: 500,
49
+ } as express.Response;
50
+
51
+ middleware(request, response, () => {});
52
+ eventHandler();
53
+
54
+ assert.equal(expected, 'works!');
55
+ });
56
+
57
+ it('health', () => {
58
+ let expected = '';
59
+ let eventHandler: () => void = () => {};
60
+
61
+ const request = { originalUrl: '/health' } as express.Request;
62
+ const response = {
63
+ on: (_event, func: () => void) => {
64
+ eventHandler = func;
65
+ },
66
+ locals: {
67
+ logger: {
68
+ info: (_message: string) => {
69
+ expected = 'ohoh!';
70
+ },
71
+ },
72
+ },
73
+ statusCode: 200,
74
+ } as express.Response;
75
+
76
+ middleware(request, response, () => {});
77
+ eventHandler();
78
+
79
+ assert.equal(expected, '');
80
+ });
81
+ });
@@ -0,0 +1,57 @@
1
+ import express from 'express';
2
+ import assert from 'node:assert/strict';
3
+ import { describe, it } from 'node:test';
4
+ import middleware from '../../src/middlewares/logger.js';
5
+
6
+ describe('logger middleware', () => {
7
+ it('initializes', () => {
8
+ const request = { header: (_key: string) => undefined } as express.Request;
9
+ const response = { locals: {} } as express.Response;
10
+
11
+ middleware(request, response, () => {});
12
+
13
+ assert.deepEqual(response.locals.logger.getMetadata(), {
14
+ correlation_id: undefined,
15
+ });
16
+ });
17
+
18
+ it('correlation id', () => {
19
+ const request = { header: (_key: string) => undefined } as express.Request;
20
+ const response = { locals: { correlationId: '123' } } as express.Response;
21
+
22
+ middleware(request, response, () => {});
23
+
24
+ assert.deepEqual(response.locals.logger.getMetadata(), {
25
+ correlation_id: '123',
26
+ });
27
+ });
28
+
29
+ it('additional context', () => {
30
+ const additional = Buffer.from(
31
+ JSON.stringify({
32
+ foo: 'bar',
33
+ }),
34
+ ).toString('base64');
35
+
36
+ const request = { header: (_key: string) => additional } as express.Request;
37
+ const response = { locals: { correlationId: '123' } } as express.Response;
38
+
39
+ middleware(request, response, () => {});
40
+
41
+ assert.deepEqual(response.locals.logger.getMetadata(), {
42
+ correlation_id: '123',
43
+ foo: 'bar',
44
+ });
45
+ });
46
+
47
+ it('malformed additional context', () => {
48
+ const request = { header: (_key: string) => 'nope' } as express.Request;
49
+ const response = { locals: { correlationId: '123' } } as express.Response;
50
+
51
+ middleware(request, response, () => {});
52
+
53
+ assert.deepEqual(response.locals.logger.getMetadata(), {
54
+ correlation_id: '123',
55
+ });
56
+ });
57
+ });
@@ -0,0 +1,32 @@
1
+ import express from 'express';
2
+ import assert from 'node:assert/strict';
3
+ import { describe, it } from 'node:test';
4
+ import middleware from '../../src/middlewares/notFound.js';
5
+
6
+ describe('notFound middleware', () => {
7
+ it('respond with error without calling next', () => {
8
+ let actualStatus: number | undefined;
9
+ let actualJson: Record<string, unknown> | undefined;
10
+
11
+ const response = {
12
+ headersSent: false,
13
+ status: (code: number) => {
14
+ actualStatus = code;
15
+
16
+ return {
17
+ json: (json: Record<string, unknown>) => {
18
+ actualJson = json;
19
+ },
20
+ };
21
+ },
22
+ locals: { logger: { error: () => undefined } },
23
+ } as unknown as express.Response;
24
+ middleware({ path: 'unknownPath' } as express.Request, response, () => {
25
+ throw new Error('next should not be called');
26
+ });
27
+
28
+ assert.strictEqual(actualStatus, 404);
29
+ assert.strictEqual(actualJson?.code, '404');
30
+ assert.deepEqual(actualJson?.message, 'Path unknownPath not found.');
31
+ });
32
+ });
@@ -0,0 +1,34 @@
1
+ import express from 'express';
2
+ import assert from 'node:assert/strict';
3
+ import { describe, it } from 'node:test';
4
+ import middleware from '../../src/middlewares/selects.js';
5
+
6
+ describe('selects middleware', () => {
7
+ it('data', () => {
8
+ const request = { query: { select: 'foo,bar.spam,baz' } } as express.Request<
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ any,
11
+ object,
12
+ object,
13
+ { select: string }
14
+ >;
15
+ const response = { locals: {} } as express.Response;
16
+
17
+ middleware(request, response, () => {});
18
+
19
+ assert.deepEqual(response.locals, {
20
+ selects: ['foo', 'bar.spam', 'baz'],
21
+ });
22
+ });
23
+
24
+ it('no data', () => {
25
+ const request = { query: {} } as express.Request;
26
+ const response = { locals: {} } as express.Response;
27
+
28
+ middleware(request, response, () => {});
29
+
30
+ assert.deepEqual(response.locals, {
31
+ selects: [],
32
+ });
33
+ });
34
+ });
@@ -0,0 +1,31 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import { LocalCache } from 'cachette';
4
+ import { generateCacheKey, initializeCache } from '../../src/resources/cache.js';
5
+
6
+ describe('Cache', () => {
7
+ describe('initializeCache', () => {
8
+ it('no redis url returns LocalCache', () => {
9
+ const cache = initializeCache();
10
+
11
+ assert.equal(cache instanceof LocalCache, true);
12
+
13
+ cache.quit();
14
+ });
15
+
16
+ it('redis url returns (tries) WriteThroughCache', () => {
17
+ process.env.REDIS_URL = 'fakeredis'; //'redis://localhost:6379';
18
+ assert.throws(() => initializeCache(), Error, 'Invalid redis url fakereis.');
19
+ });
20
+ });
21
+
22
+ describe('generateCacheKey', () => {
23
+ it('hashes string and returns hex value', () => {
24
+ const value = 'test';
25
+ const hash = generateCacheKey(value);
26
+
27
+ assert.equal(typeof hash, 'string');
28
+ assert.equal(hash.length, 64);
29
+ });
30
+ });
31
+ });
@@ -0,0 +1,80 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import Logger from '../../src/resources/logger.js';
4
+
5
+ describe('Logger', () => {
6
+ it('metadata', () => {
7
+ let metadata: Record<string, unknown> = { correlation_id: 'test' };
8
+ const logger = new Logger(metadata);
9
+
10
+ // Changing initial object should not affect the logger
11
+ metadata.correlation_id = 'changed';
12
+ assert.deepEqual(logger.getMetadata(), { correlation_id: 'test' });
13
+
14
+ // Changing returned metadata object should not affect the logger
15
+ metadata = logger.getMetadata();
16
+ metadata.correlation_id = 'changed';
17
+ assert.deepEqual(logger.getMetadata(), { correlation_id: 'test' });
18
+
19
+ // Can overwrite existing metadata
20
+ logger.setMetadata('correlation_id', 'changed');
21
+ assert.deepEqual(logger.getMetadata(), { correlation_id: 'changed' });
22
+
23
+ // Can merge metadata
24
+ logger.decorate({ other: 'metadata' });
25
+ assert.deepEqual(logger.getMetadata(), { correlation_id: 'changed', other: 'metadata' });
26
+
27
+ // Can overwrite existing metadata
28
+ logger.decorate({ other: 'overwrite' });
29
+ assert.deepEqual(logger.getMetadata(), { correlation_id: 'changed', other: 'overwrite' });
30
+
31
+ // Can clear metadata
32
+ logger.clearMetadata();
33
+ assert.deepEqual(logger.getMetadata(), {});
34
+ });
35
+
36
+ it('respect logging levels', testContext => {
37
+ const metadata = { correlation_id: '123456789' };
38
+ const logger = new Logger(metadata);
39
+
40
+ const logSpy = testContext.mock.method(global.console, 'log', () => {});
41
+ assert.strictEqual(logSpy.mock.calls.length, 0);
42
+ logger.log('test');
43
+ assert.strictEqual(logSpy.mock.calls.length, 1);
44
+ assert.deepEqual(logSpy.mock.calls[0]?.arguments, [
45
+ JSON.stringify({ message: 'test', correlation_id: '123456789' }),
46
+ ]);
47
+
48
+ const errorSpy = testContext.mock.method(global.console, 'error', () => {});
49
+ assert.strictEqual(errorSpy.mock.calls.length, 0);
50
+ logger.error('test');
51
+ assert.strictEqual(errorSpy.mock.calls.length, 1);
52
+ assert.deepEqual(errorSpy.mock.calls[0]?.arguments, [
53
+ JSON.stringify({ message: 'test', correlation_id: '123456789' }),
54
+ ]);
55
+
56
+ const warnSpy = testContext.mock.method(global.console, 'warn', () => {});
57
+ assert.strictEqual(warnSpy.mock.calls.length, 0);
58
+ logger.warn('test');
59
+ assert.strictEqual(warnSpy.mock.calls.length, 1);
60
+ assert.deepEqual(warnSpy.mock.calls[0]?.arguments, [
61
+ JSON.stringify({ message: 'test', correlation_id: '123456789' }),
62
+ ]);
63
+
64
+ const infoSpy = testContext.mock.method(global.console, 'info', () => {});
65
+ assert.strictEqual(infoSpy.mock.calls.length, 0);
66
+ logger.info('test');
67
+ assert.strictEqual(infoSpy.mock.calls.length, 1);
68
+ assert.deepEqual(infoSpy.mock.calls[0]?.arguments, [
69
+ JSON.stringify({ message: 'test', correlation_id: '123456789' }),
70
+ ]);
71
+
72
+ const debugSpy = testContext.mock.method(global.console, 'debug', () => {});
73
+ assert.strictEqual(debugSpy.mock.calls.length, 0);
74
+ logger.debug('test');
75
+ assert.strictEqual(debugSpy.mock.calls.length, 1);
76
+ assert.deepEqual(debugSpy.mock.calls[0]?.arguments, [
77
+ JSON.stringify({ message: 'test', correlation_id: '123456789' }),
78
+ ]);
79
+ });
80
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "NodeNext",
4
+ "target": "esnext",
5
+ "moduleResolution": "NodeNext",
6
+ "allowJs": true,
7
+ "allowUnreachableCode": false,
8
+ "allowUnusedLabels": false,
9
+ "baseUrl": "./",
10
+ "checkJs": true,
11
+ "declaration": true,
12
+ "exactOptionalPropertyTypes": true,
13
+ "esModuleInterop": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "isolatedModules": true,
16
+ "noFallthroughCasesInSwitch": true,
17
+ "noImplicitAny": true,
18
+ "noImplicitOverride": true,
19
+ "noImplicitReturns": true,
20
+ "noUncheckedIndexedAccess": true,
21
+ "noUnusedLocals": true,
22
+ "noUnusedParameters": true,
23
+ "outDir": "./dist",
24
+ "skipLibCheck": true,
25
+ "strict": true
26
+ },
27
+ "include": ["src/**/*", "test/**/*"],
28
+ "exclude": ["node_modules"]
29
+ }