@unito/integration-sdk 1.0.27 → 1.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.
- package/dist/src/errors.js +4 -1
- package/dist/src/helpers.d.ts +2 -2
- package/dist/src/helpers.js +2 -2
- package/dist/src/httpErrors.d.ts +6 -0
- package/dist/src/httpErrors.js +8 -0
- package/dist/src/index.cjs +221 -209
- package/dist/src/integration.js +8 -8
- package/dist/src/middlewares/correlationId.d.ts +2 -2
- package/dist/src/middlewares/correlationId.js +3 -3
- package/dist/src/middlewares/credentials.d.ts +2 -2
- package/dist/src/middlewares/credentials.js +3 -3
- package/dist/src/middlewares/errors.d.ts +2 -2
- package/dist/src/middlewares/errors.js +3 -3
- package/dist/src/middlewares/filters.d.ts +2 -2
- package/dist/src/middlewares/filters.js +4 -4
- package/dist/src/middlewares/finish.d.ts +2 -2
- package/dist/src/middlewares/finish.js +3 -3
- package/dist/src/middlewares/logger.d.ts +2 -2
- package/dist/src/middlewares/logger.js +3 -3
- package/dist/src/middlewares/notFound.d.ts +2 -2
- package/dist/src/middlewares/notFound.js +3 -3
- package/dist/src/middlewares/secrets.d.ts +2 -2
- package/dist/src/middlewares/secrets.js +3 -3
- package/dist/src/middlewares/selects.d.ts +2 -2
- package/dist/src/middlewares/selects.js +3 -3
- package/dist/src/middlewares/signal.d.ts +2 -2
- package/dist/src/middlewares/signal.js +3 -3
- package/dist/src/middlewares/{requestStartTime.d.ts → start.d.ts} +2 -2
- package/dist/src/middlewares/{requestStartTime.js → start.js} +3 -3
- package/dist/test/errors.test.js +1 -1
- package/dist/test/middlewares/correlationId.test.js +3 -3
- package/dist/test/middlewares/credentials.test.js +4 -4
- package/dist/test/middlewares/errors.test.js +4 -4
- package/dist/test/middlewares/filters.test.js +20 -12
- package/dist/test/middlewares/finish.test.js +4 -4
- package/dist/test/middlewares/logger.test.js +5 -5
- package/dist/test/middlewares/notFound.test.js +2 -2
- package/dist/test/middlewares/secrets.test.js +3 -3
- package/dist/test/middlewares/selects.test.js +3 -3
- package/dist/test/middlewares/signal.test.js +3 -3
- package/dist/test/middlewares/start.test.d.ts +1 -0
- package/dist/test/middlewares/start.test.js +11 -0
- package/package.json +1 -1
- package/src/errors.ts +3 -1
- package/src/helpers.ts +2 -2
- package/src/httpErrors.ts +9 -0
- package/src/integration.ts +8 -8
- package/src/middlewares/correlationId.ts +3 -3
- package/src/middlewares/credentials.ts +3 -3
- package/src/middlewares/errors.ts +3 -3
- package/src/middlewares/filters.ts +4 -4
- package/src/middlewares/finish.ts +3 -3
- package/src/middlewares/logger.ts +3 -3
- package/src/middlewares/notFound.ts +3 -3
- package/src/middlewares/secrets.ts +3 -3
- package/src/middlewares/selects.ts +3 -3
- package/src/middlewares/signal.ts +3 -3
- package/src/middlewares/{requestStartTime.ts → start.ts} +3 -3
- package/test/errors.test.ts +1 -1
- package/test/middlewares/correlationId.test.ts +3 -3
- package/test/middlewares/credentials.test.ts +4 -4
- package/test/middlewares/errors.test.ts +4 -4
- package/test/middlewares/filters.test.ts +31 -12
- package/test/middlewares/finish.test.ts +4 -4
- package/test/middlewares/logger.test.ts +5 -5
- package/test/middlewares/notFound.test.ts +2 -2
- package/test/middlewares/secrets.test.ts +3 -3
- package/test/middlewares/selects.test.ts +3 -3
- package/test/middlewares/signal.test.ts +3 -3
- package/test/middlewares/start.test.ts +14 -0
|
@@ -14,7 +14,7 @@ export type Credentials = { accessToken?: string; [keys: string]: unknown };
|
|
|
14
14
|
|
|
15
15
|
const CREDENTIALS_HEADER = 'X-Unito-Credentials';
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
function extractCredentials(req: Request, res: Response, next: NextFunction) {
|
|
18
18
|
const credentialsHeader = req.header(CREDENTIALS_HEADER);
|
|
19
19
|
|
|
20
20
|
if (credentialsHeader) {
|
|
@@ -30,6 +30,6 @@ const middleware = (req: Request, res: Response, next: NextFunction) => {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
next();
|
|
33
|
-
}
|
|
33
|
+
}
|
|
34
34
|
|
|
35
|
-
export default
|
|
35
|
+
export default extractCredentials;
|
|
@@ -12,7 +12,7 @@ declare global {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
function onError(err: Error, _req: Request, res: Response, next: NextFunction) {
|
|
16
16
|
if (res.headersSent) {
|
|
17
17
|
return next(err);
|
|
18
18
|
}
|
|
@@ -50,6 +50,6 @@ const middleware = (err: Error, _req: Request, res: Response, next: NextFunction
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
res.status(Number(error.code)).json(error);
|
|
53
|
-
}
|
|
53
|
+
}
|
|
54
54
|
|
|
55
|
-
export default
|
|
55
|
+
export default onError;
|
|
@@ -32,9 +32,9 @@ export type Filter = {
|
|
|
32
32
|
// a subset of the symbol of another operator.
|
|
33
33
|
//
|
|
34
34
|
// For example, the symbol "=" (EQUAL) is a subset of the symbol "!=" (NOT_EQUAL).
|
|
35
|
-
const ORDERED_OPERATORS = Object.values(OperatorType).sort((o1, o2) =>
|
|
35
|
+
const ORDERED_OPERATORS = Object.values(OperatorType).sort((o1, o2) => o2.length - o1.length);
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
function extractFilters(req: Request, res: Response, next: NextFunction) {
|
|
38
38
|
const rawFilters = req.query.filter;
|
|
39
39
|
|
|
40
40
|
res.locals.filters = [];
|
|
@@ -55,6 +55,6 @@ const middleware = (req: Request, res: Response, next: NextFunction) => {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
next();
|
|
58
|
-
}
|
|
58
|
+
}
|
|
59
59
|
|
|
60
|
-
export default
|
|
60
|
+
export default extractFilters;
|
|
@@ -13,7 +13,7 @@ declare global {
|
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
function onFinish(req: Request, res: Response, next: NextFunction) {
|
|
17
17
|
if (req.originalUrl !== '/health') {
|
|
18
18
|
res.on('finish', function () {
|
|
19
19
|
const error = res.locals.error;
|
|
@@ -49,6 +49,6 @@ const middleware = (req: Request, res: Response, next: NextFunction) => {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
next();
|
|
52
|
-
}
|
|
52
|
+
}
|
|
53
53
|
|
|
54
|
-
export default
|
|
54
|
+
export default onFinish;
|
|
@@ -13,7 +13,7 @@ declare global {
|
|
|
13
13
|
|
|
14
14
|
const ADDITIONAL_CONTEXT_HEADER = 'X-Unito-Additional-Logging-Context';
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
function injectLogger(req: Request, res: Response, next: NextFunction) {
|
|
17
17
|
const logger = new Logger({ correlation_id: res.locals.correlationId });
|
|
18
18
|
|
|
19
19
|
res.locals.logger = logger;
|
|
@@ -31,6 +31,6 @@ const middleware = (req: Request, res: Response, next: NextFunction) => {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
next();
|
|
34
|
-
}
|
|
34
|
+
}
|
|
35
35
|
|
|
36
|
-
export default
|
|
36
|
+
export default injectLogger;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Request, Response, NextFunction } from 'express';
|
|
2
2
|
import { Error as APIError } from '@unito/integration-api';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
function notFound(req: Request, res: Response, _next: NextFunction) {
|
|
5
5
|
const error: APIError = {
|
|
6
6
|
code: '404',
|
|
7
7
|
message: `Path ${req.path} not found.`,
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
res.status(404).json(error);
|
|
11
|
-
}
|
|
11
|
+
}
|
|
12
12
|
|
|
13
|
-
export default
|
|
13
|
+
export default notFound;
|
|
@@ -19,7 +19,7 @@ export type Secrets = { [keys: string]: unknown };
|
|
|
19
19
|
|
|
20
20
|
const SECRETS_HEADER = 'X-Unito-Secrets';
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
function extractSecrets(req: Request, res: Response, next: NextFunction) {
|
|
23
23
|
const secretsHeader = req.header(SECRETS_HEADER);
|
|
24
24
|
|
|
25
25
|
if (secretsHeader) {
|
|
@@ -35,6 +35,6 @@ const middleware = (req: Request, res: Response, next: NextFunction) => {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
next();
|
|
38
|
-
}
|
|
38
|
+
}
|
|
39
39
|
|
|
40
|
-
export default
|
|
40
|
+
export default extractSecrets;
|
|
@@ -16,7 +16,7 @@ declare global {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
function extractSelects(req: Request, res: Response, next: NextFunction) {
|
|
20
20
|
const rawSelect = req.query.select;
|
|
21
21
|
|
|
22
22
|
if (typeof rawSelect === 'string') {
|
|
@@ -26,6 +26,6 @@ const middleware = (req: Request, res: Response, next: NextFunction) => {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
next();
|
|
29
|
-
}
|
|
29
|
+
}
|
|
30
30
|
|
|
31
|
-
export default
|
|
31
|
+
export default extractSelects;
|
|
@@ -17,7 +17,7 @@ declare global {
|
|
|
17
17
|
|
|
18
18
|
const OPERATION_DEADLINE_HEADER = 'X-Unito-Operation-Deadline';
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
function extractOperationDeadline(req: Request, res: Response, next: NextFunction) {
|
|
21
21
|
const operationDeadlineHeader = Number(req.header(OPERATION_DEADLINE_HEADER));
|
|
22
22
|
|
|
23
23
|
if (operationDeadlineHeader) {
|
|
@@ -36,6 +36,6 @@ const middleware = (req: Request, res: Response, next: NextFunction) => {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
next();
|
|
39
|
-
}
|
|
39
|
+
}
|
|
40
40
|
|
|
41
|
-
export default
|
|
41
|
+
export default extractOperationDeadline;
|
|
@@ -9,10 +9,10 @@ declare global {
|
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
function start(_: Request, res: Response, next: NextFunction) {
|
|
13
13
|
res.locals.requestStartTime = process.hrtime.bigint();
|
|
14
14
|
|
|
15
15
|
next();
|
|
16
|
-
}
|
|
16
|
+
}
|
|
17
17
|
|
|
18
|
-
export default
|
|
18
|
+
export default start;
|
package/test/errors.test.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as httpErrors from '../src/httpErrors.js';
|
|
|
6
6
|
describe('handleErrorResponse', () => {
|
|
7
7
|
it('returns correct httpError given status code', () => {
|
|
8
8
|
assert.ok(errors.buildHttpError(401, 'unauthorized') instanceof httpErrors.UnauthorizedError);
|
|
9
|
-
assert.ok(errors.buildHttpError(403, 'forbidden') instanceof httpErrors.
|
|
9
|
+
assert.ok(errors.buildHttpError(403, 'forbidden') instanceof httpErrors.ForbiddenError);
|
|
10
10
|
assert.ok(errors.buildHttpError(404, 'not found') instanceof httpErrors.NotFoundError);
|
|
11
11
|
assert.ok(errors.buildHttpError(408, 'timeout') instanceof httpErrors.TimeoutError);
|
|
12
12
|
assert.ok(errors.buildHttpError(410, 'resource gone') instanceof httpErrors.ResourceGoneError);
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import extractCorrelationId from '../../src/middlewares/correlationId.js';
|
|
5
5
|
|
|
6
6
|
describe('correlationId middleware', () => {
|
|
7
7
|
it('uses header', () => {
|
|
8
8
|
const request = { header: (_key: string) => '123' } as express.Request;
|
|
9
9
|
const response = { locals: {} } as express.Response;
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
extractCorrelationId(request, response, () => {});
|
|
12
12
|
|
|
13
13
|
assert.deepEqual(response.locals, {
|
|
14
14
|
correlationId: '123',
|
|
@@ -19,7 +19,7 @@ describe('correlationId middleware', () => {
|
|
|
19
19
|
const request = { header: (_key: string) => undefined } as express.Request;
|
|
20
20
|
const response = { locals: {} } as express.Response;
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
extractCorrelationId(request, response, () => {});
|
|
23
23
|
|
|
24
24
|
assert(response.locals.correlationId);
|
|
25
25
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import extractCredentials from '../../src/middlewares/credentials.js';
|
|
5
5
|
import { BadRequestError } from '../../src/httpErrors.js';
|
|
6
6
|
|
|
7
7
|
describe('credentials middleware', () => {
|
|
@@ -15,7 +15,7 @@ describe('credentials middleware', () => {
|
|
|
15
15
|
const request = { header: (_key: string) => credentials } as express.Request;
|
|
16
16
|
const response = { locals: {} } as express.Response;
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
extractCredentials(request, response, () => {});
|
|
19
19
|
|
|
20
20
|
assert.deepEqual(response.locals, {
|
|
21
21
|
credentials: {
|
|
@@ -28,7 +28,7 @@ describe('credentials middleware', () => {
|
|
|
28
28
|
const request = { header: (_key: string) => 'nope' } as express.Request;
|
|
29
29
|
const response = { locals: {} } as express.Response;
|
|
30
30
|
|
|
31
|
-
assert.throws(() =>
|
|
31
|
+
assert.throws(() => extractCredentials(request, response, () => {}), BadRequestError);
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
it('variables', async () => {
|
|
@@ -41,7 +41,7 @@ describe('credentials middleware', () => {
|
|
|
41
41
|
const request = { header: (_key: string) => credentials } as express.Request;
|
|
42
42
|
const response = { locals: {} } as express.Response;
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
extractCredentials(request, response, () => {});
|
|
45
45
|
|
|
46
46
|
assert.deepEqual(response.locals, {
|
|
47
47
|
credentials: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import onError from '../../src/middlewares/errors.js';
|
|
5
5
|
import { HttpError } from '../../src/httpErrors.js';
|
|
6
6
|
|
|
7
7
|
describe('errors middleware', () => {
|
|
@@ -23,7 +23,7 @@ describe('errors middleware', () => {
|
|
|
23
23
|
locals: { logger: { error: () => undefined } },
|
|
24
24
|
} as unknown as express.Response;
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
onError(new Error(), {} as express.Request, response, () => {});
|
|
27
27
|
|
|
28
28
|
assert.strictEqual(actualStatus, undefined);
|
|
29
29
|
assert.strictEqual(actualJson, undefined);
|
|
@@ -46,7 +46,7 @@ describe('errors middleware', () => {
|
|
|
46
46
|
},
|
|
47
47
|
locals: { logger: { error: () => undefined } },
|
|
48
48
|
} as unknown as express.Response;
|
|
49
|
-
|
|
49
|
+
onError(new HttpError('httpError', 429), {} as express.Request, response, () => {});
|
|
50
50
|
|
|
51
51
|
assert.strictEqual(actualStatus, 429);
|
|
52
52
|
assert.deepEqual(actualJson, { code: '429', message: 'httpError' });
|
|
@@ -69,7 +69,7 @@ describe('errors middleware', () => {
|
|
|
69
69
|
},
|
|
70
70
|
locals: { logger: { error: () => undefined } },
|
|
71
71
|
} as unknown as express.Response;
|
|
72
|
-
|
|
72
|
+
onError(new Error('error'), {} as express.Request, response, () => {});
|
|
73
73
|
|
|
74
74
|
assert.strictEqual(actualStatus, 500);
|
|
75
75
|
assert.strictEqual(actualJson?.code, '500');
|
|
@@ -2,32 +2,51 @@ import { OperatorType } from '@unito/integration-api';
|
|
|
2
2
|
import express from 'express';
|
|
3
3
|
import assert from 'node:assert/strict';
|
|
4
4
|
import { describe, it } from 'node:test';
|
|
5
|
-
import
|
|
5
|
+
import extractFilters from '../../src/middlewares/filters.js';
|
|
6
6
|
|
|
7
7
|
describe('filters middleware', () => {
|
|
8
|
-
it('
|
|
9
|
-
|
|
8
|
+
it('properly parse operators', () => {
|
|
9
|
+
Object.values(OperatorType).forEach(operator => {
|
|
10
|
+
const request = {
|
|
11
|
+
query: { filter: `aKey${operator}value` },
|
|
12
|
+
} as express.Request<
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
any,
|
|
15
|
+
object,
|
|
16
|
+
object,
|
|
17
|
+
{ filter: string }
|
|
18
|
+
>;
|
|
19
|
+
|
|
20
|
+
const response = { locals: {} } as express.Response;
|
|
21
|
+
|
|
22
|
+
extractFilters(request, response, () => {});
|
|
23
|
+
|
|
24
|
+
assert.deepEqual(response.locals, {
|
|
25
|
+
filters: [{ field: 'aKey', operator, values: ['value'] }],
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const request = {
|
|
30
|
+
query: { filter: `aKey!!` },
|
|
31
|
+
} as express.Request<
|
|
10
32
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
33
|
any,
|
|
12
34
|
object,
|
|
13
35
|
object,
|
|
14
36
|
{ filter: string }
|
|
15
37
|
>;
|
|
38
|
+
|
|
16
39
|
const response = { locals: {} } as express.Response;
|
|
17
40
|
|
|
18
|
-
|
|
41
|
+
extractFilters(request, response, () => {});
|
|
19
42
|
|
|
20
43
|
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
|
-
],
|
|
44
|
+
filters: [{ field: 'aKey', operator: OperatorType.IS_NULL, values: [] }],
|
|
26
45
|
});
|
|
27
46
|
});
|
|
28
47
|
|
|
29
48
|
it('decodes URI components', () => {
|
|
30
|
-
const request = { query: { filter: 'status=foo%2Cbar
|
|
49
|
+
const request = { query: { filter: 'status=foo%2Cbar%21%21%2C%3Fbaz%3D!%3Equx' } } as express.Request<
|
|
31
50
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
51
|
any,
|
|
33
52
|
object,
|
|
@@ -36,7 +55,7 @@ describe('filters middleware', () => {
|
|
|
36
55
|
>;
|
|
37
56
|
const response = { locals: {} } as express.Response;
|
|
38
57
|
|
|
39
|
-
|
|
58
|
+
extractFilters(request, response, () => {});
|
|
40
59
|
|
|
41
60
|
assert.deepEqual(response.locals, {
|
|
42
61
|
filters: [{ field: 'status', operator: OperatorType.EQUAL, values: ['foo,bar!!,?baz=!>qux'] }],
|
|
@@ -47,7 +66,7 @@ describe('filters middleware', () => {
|
|
|
47
66
|
const request = { query: {} } as express.Request;
|
|
48
67
|
const response = { locals: {} } as express.Response;
|
|
49
68
|
|
|
50
|
-
|
|
69
|
+
extractFilters(request, response, () => {});
|
|
51
70
|
|
|
52
71
|
assert.deepEqual(response.locals, {
|
|
53
72
|
filters: [],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import onFinish from '../../src/middlewares/finish.js';
|
|
5
5
|
|
|
6
6
|
describe('finish middleware', () => {
|
|
7
7
|
it('logs info', () => {
|
|
@@ -24,7 +24,7 @@ describe('finish middleware', () => {
|
|
|
24
24
|
statusCode: 200,
|
|
25
25
|
} as express.Response;
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
onFinish(request, response, () => {});
|
|
28
28
|
eventHandler();
|
|
29
29
|
|
|
30
30
|
assert.equal(expected, 'works!');
|
|
@@ -50,7 +50,7 @@ describe('finish middleware', () => {
|
|
|
50
50
|
statusCode: 500,
|
|
51
51
|
} as express.Response;
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
onFinish(request, response, () => {});
|
|
54
54
|
eventHandler();
|
|
55
55
|
|
|
56
56
|
assert.equal(expected, 'works!');
|
|
@@ -76,7 +76,7 @@ describe('finish middleware', () => {
|
|
|
76
76
|
statusCode: 200,
|
|
77
77
|
} as express.Response;
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
onFinish(request, response, () => {});
|
|
80
80
|
eventHandler();
|
|
81
81
|
|
|
82
82
|
assert.equal(expected, '');
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import injectLogger from '../../src/middlewares/logger.js';
|
|
5
5
|
|
|
6
6
|
describe('logger middleware', () => {
|
|
7
7
|
it('initializes', () => {
|
|
8
8
|
const request = { header: (_key: string) => undefined } as express.Request;
|
|
9
9
|
const response = { locals: {} } as express.Response;
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
injectLogger(request, response, () => {});
|
|
12
12
|
|
|
13
13
|
assert.deepEqual(response.locals.logger.getMetadata(), {
|
|
14
14
|
correlation_id: undefined,
|
|
@@ -19,7 +19,7 @@ describe('logger middleware', () => {
|
|
|
19
19
|
const request = { header: (_key: string) => undefined } as express.Request;
|
|
20
20
|
const response = { locals: { correlationId: '123' } } as express.Response;
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
injectLogger(request, response, () => {});
|
|
23
23
|
|
|
24
24
|
assert.deepEqual(response.locals.logger.getMetadata(), {
|
|
25
25
|
correlation_id: '123',
|
|
@@ -34,7 +34,7 @@ describe('logger middleware', () => {
|
|
|
34
34
|
const request = { header: (_key: string) => additional } as express.Request;
|
|
35
35
|
const response = { locals: { correlationId: '123' } } as express.Response;
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
injectLogger(request, response, () => {});
|
|
38
38
|
|
|
39
39
|
assert.deepEqual(response.locals.logger.getMetadata(), {
|
|
40
40
|
correlation_id: '123',
|
|
@@ -46,7 +46,7 @@ describe('logger middleware', () => {
|
|
|
46
46
|
const request = { header: (_key: string) => 'nope' } as express.Request;
|
|
47
47
|
const response = { locals: { correlationId: '123' } } as express.Response;
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
injectLogger(request, response, () => {});
|
|
50
50
|
|
|
51
51
|
assert.deepEqual(response.locals.logger.getMetadata(), {
|
|
52
52
|
correlation_id: '123',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import notFound from '../../src/middlewares/notFound.js';
|
|
5
5
|
|
|
6
6
|
describe('notFound middleware', () => {
|
|
7
7
|
it('respond with error without calling next', () => {
|
|
@@ -21,7 +21,7 @@ describe('notFound middleware', () => {
|
|
|
21
21
|
},
|
|
22
22
|
locals: { logger: { error: () => undefined } },
|
|
23
23
|
} as unknown as express.Response;
|
|
24
|
-
|
|
24
|
+
notFound({ path: 'unknownPath' } as express.Request, response, () => {
|
|
25
25
|
throw new Error('next should not be called');
|
|
26
26
|
});
|
|
27
27
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import extractSecrets from '../../src/middlewares/secrets.js';
|
|
5
5
|
import { BadRequestError } from '../../src/httpErrors.js';
|
|
6
6
|
|
|
7
7
|
describe('secrets middleware', () => {
|
|
@@ -15,7 +15,7 @@ describe('secrets middleware', () => {
|
|
|
15
15
|
const request = { header: (_key: string) => secrets } as express.Request;
|
|
16
16
|
const response = { locals: {} } as express.Response;
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
extractSecrets(request, response, () => {});
|
|
19
19
|
|
|
20
20
|
assert.deepEqual(response.locals, {
|
|
21
21
|
secrets: {
|
|
@@ -28,7 +28,7 @@ describe('secrets middleware', () => {
|
|
|
28
28
|
const request = { header: (_key: string) => 'nope' } as express.Request;
|
|
29
29
|
const response = { locals: {} } as express.Response;
|
|
30
30
|
|
|
31
|
-
assert.throws(() =>
|
|
31
|
+
assert.throws(() => extractSecrets(request, response, () => {}), BadRequestError);
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
it('undefined', () => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import extractSelects from '../../src/middlewares/selects.js';
|
|
5
5
|
|
|
6
6
|
describe('selects middleware', () => {
|
|
7
7
|
it('data', () => {
|
|
@@ -14,7 +14,7 @@ describe('selects middleware', () => {
|
|
|
14
14
|
>;
|
|
15
15
|
const response = { locals: {} } as express.Response;
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
extractSelects(request, response, () => {});
|
|
18
18
|
|
|
19
19
|
assert.deepEqual(response.locals, {
|
|
20
20
|
selects: ['foo', 'bar.spam', 'baz'],
|
|
@@ -25,7 +25,7 @@ describe('selects middleware', () => {
|
|
|
25
25
|
const request = { query: {} } as express.Request;
|
|
26
26
|
const response = { locals: {} } as express.Response;
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
extractSelects(request, response, () => {});
|
|
29
29
|
|
|
30
30
|
assert.deepEqual(response.locals, {
|
|
31
31
|
selects: [],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import extractOperationDeadline from '../../src/middlewares/signal.js';
|
|
5
5
|
|
|
6
6
|
describe('signal middleware', () => {
|
|
7
7
|
it('uses header', () => {
|
|
@@ -10,7 +10,7 @@ describe('signal middleware', () => {
|
|
|
10
10
|
const request = { header: (_key: string) => deadline } as unknown as express.Request;
|
|
11
11
|
const response = { locals: {} } as express.Response;
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
extractOperationDeadline(request, response, () => {});
|
|
14
14
|
|
|
15
15
|
assert.ok(response.locals.signal instanceof AbortSignal);
|
|
16
16
|
assert.equal(response.locals.signal.aborted, false);
|
|
@@ -20,7 +20,7 @@ describe('signal middleware', () => {
|
|
|
20
20
|
const request = { header: (_key: string) => undefined } as unknown as express.Request;
|
|
21
21
|
const response = { locals: {} } as express.Response;
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
extractOperationDeadline(request, response, () => {});
|
|
24
24
|
|
|
25
25
|
assert.ok(response.locals.signal instanceof AbortSignal);
|
|
26
26
|
assert.equal(response.locals.signal.aborted, false);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { describe, it } from 'node:test';
|
|
4
|
+
import start from '../../src/middlewares/start.js';
|
|
5
|
+
|
|
6
|
+
describe('start middleware', () => {
|
|
7
|
+
it('adds request start time to locals', () => {
|
|
8
|
+
const request = {} as express.Request;
|
|
9
|
+
const response = { locals: {} } as express.Response;
|
|
10
|
+
|
|
11
|
+
start(request, response, () => {});
|
|
12
|
+
assert.ok(response.locals.requestStartTime);
|
|
13
|
+
});
|
|
14
|
+
});
|