@appsemble/node-utils 0.20.13 → 0.20.14
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/AppsembleError.js +1 -5
- package/AppsembleError.js.map +1 -1
- package/AppsembleError.test.js +2 -4
- package/AppsembleError.test.js.map +1 -1
- package/AppsembleError.test.ts +1 -1
- package/README.md +4 -4
- package/basicAuth.js +1 -5
- package/basicAuth.js.map +1 -1
- package/basicAuth.test.js +2 -4
- package/basicAuth.test.js.map +1 -1
- package/basicAuth.test.ts +1 -1
- package/formData.js +5 -12
- package/formData.js.map +1 -1
- package/formData.test.js +9 -11
- package/formData.test.js.map +1 -1
- package/formData.test.ts +1 -1
- package/fs.d.ts +2 -1
- package/fs.js +35 -65
- package/fs.js.map +1 -1
- package/fs.test.js +32 -34
- package/fs.test.js.map +1 -1
- package/fs.test.ts +6 -6
- package/fs.ts +12 -9
- package/getWorkspaces.js +6 -13
- package/getWorkspaces.js.map +1 -1
- package/handleError.js +6 -10
- package/handleError.js.map +1 -1
- package/handleError.test.js +13 -15
- package/handleError.test.js.map +1 -1
- package/handleError.test.ts +7 -7
- package/handleError.ts +2 -2
- package/index.d.ts +11 -11
- package/index.js +11 -27
- package/index.js.map +1 -1
- package/index.ts +11 -11
- package/interceptors.js +17 -27
- package/interceptors.js.map +1 -1
- package/interceptors.test.js +30 -40
- package/interceptors.test.js.map +1 -1
- package/interceptors.test.ts +7 -13
- package/interceptors.ts +1 -1
- package/jest.config.js +3 -1
- package/jest.setup.js +4 -6
- package/jest.setup.js.map +1 -1
- package/jest.setup.ts +3 -3
- package/logger.js +27 -35
- package/logger.js.map +1 -1
- package/logger.test.js +15 -17
- package/logger.test.js.map +1 -1
- package/logger.test.ts +1 -1
- package/loggerMiddleware.js +18 -25
- package/loggerMiddleware.js.map +1 -1
- package/loggerMiddleware.test.js +42 -52
- package/loggerMiddleware.test.js.map +1 -1
- package/loggerMiddleware.test.ts +15 -21
- package/loggerMiddleware.ts +1 -1
- package/package.json +7 -8
- package/readFileOrString.js +5 -9
- package/readFileOrString.js.map +1 -1
- package/readFileOrString.test.js +4 -6
- package/readFileOrString.test.js.map +1 -1
- package/readFileOrString.test.ts +2 -2
- package/readFileOrString.ts +1 -1
- package/testFixtures.d.ts +5 -4
- package/testFixtures.js +13 -24
- package/testFixtures.js.map +1 -1
- package/testFixtures.ts +9 -9
- package/tsconfig.json +1 -1
- package/__mocks__/os.d.ts +0 -5
- package/__mocks__/os.js +0 -8
- package/__mocks__/os.js.map +0 -1
- package/__mocks__/os.ts +0 -10
package/interceptors.test.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { install, InstalledClock } from '@sinonjs/fake-timers';
|
|
2
1
|
import axios, { AxiosInstance } from 'axios';
|
|
3
2
|
import MockAdapter from 'axios-mock-adapter';
|
|
4
3
|
import { highlight } from 'cli-highlight';
|
|
5
4
|
import FormData from 'form-data';
|
|
6
5
|
|
|
7
|
-
import { configureAxios, formData, logger, requestLogger, responseLogger } from '.';
|
|
6
|
+
import { configureAxios, formData, logger, requestLogger, responseLogger } from './index.js';
|
|
8
7
|
|
|
9
8
|
function h(content: string): string {
|
|
10
9
|
return highlight(content, { language: 'http' });
|
|
@@ -12,16 +11,11 @@ function h(content: string): string {
|
|
|
12
11
|
|
|
13
12
|
let instance: AxiosInstance;
|
|
14
13
|
let mock: MockAdapter;
|
|
15
|
-
let clock: InstalledClock;
|
|
16
14
|
|
|
17
|
-
jest.mock('os');
|
|
15
|
+
import.meta.jest.mock('os');
|
|
18
16
|
|
|
19
17
|
beforeEach(() => {
|
|
20
|
-
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
afterEach(() => {
|
|
24
|
-
clock.uninstall();
|
|
18
|
+
import.meta.jest.useFakeTimers({ now: 0 });
|
|
25
19
|
});
|
|
26
20
|
|
|
27
21
|
describe('formData', () => {
|
|
@@ -65,7 +59,7 @@ describe('requestLogger', () => {
|
|
|
65
59
|
});
|
|
66
60
|
|
|
67
61
|
it('should log requests', async () => {
|
|
68
|
-
jest.spyOn(logger, 'verbose');
|
|
62
|
+
import.meta.jest.spyOn(logger, 'verbose');
|
|
69
63
|
await instance.get('/');
|
|
70
64
|
expect(logger.verbose).toHaveBeenCalledWith(`> 0 ${h('GET / HTTP/1.1')}`);
|
|
71
65
|
});
|
|
@@ -80,7 +74,7 @@ describe('responseLogger', () => {
|
|
|
80
74
|
});
|
|
81
75
|
|
|
82
76
|
it('should log responses', async () => {
|
|
83
|
-
jest.spyOn(logger, 'verbose');
|
|
77
|
+
import.meta.jest.spyOn(logger, 'verbose');
|
|
84
78
|
await instance.get('/');
|
|
85
79
|
expect(logger.verbose).toHaveBeenCalledWith(expect.any(String));
|
|
86
80
|
});
|
|
@@ -88,8 +82,8 @@ describe('responseLogger', () => {
|
|
|
88
82
|
|
|
89
83
|
describe('configureAxios', () => {
|
|
90
84
|
beforeEach(() => {
|
|
91
|
-
jest.spyOn(axios.interceptors.request, 'use').mockImplementation();
|
|
92
|
-
jest.spyOn(axios.interceptors.response, 'use').mockImplementation();
|
|
85
|
+
import.meta.jest.spyOn(axios.interceptors.request, 'use').mockImplementation();
|
|
86
|
+
import.meta.jest.spyOn(axios.interceptors.response, 'use').mockImplementation();
|
|
93
87
|
});
|
|
94
88
|
|
|
95
89
|
it('should set the correct user agent', () => {
|
package/interceptors.ts
CHANGED
|
@@ -4,7 +4,7 @@ import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
|
|
|
4
4
|
import { highlight } from 'cli-highlight';
|
|
5
5
|
import FormData from 'form-data';
|
|
6
6
|
|
|
7
|
-
import { logger } from './logger';
|
|
7
|
+
import { logger } from './logger.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* This is used to set a request id, so the request and response can be matched in the logs.
|
package/jest.config.js
CHANGED
package/jest.setup.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
1
|
// Importing a module here will break mocks for that module. Only add imports from `./src/*` here
|
|
4
2
|
// that are strictly necessary.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
(
|
|
8
|
-
|
|
3
|
+
import { setLogLevel } from './logger.js';
|
|
4
|
+
import { setFixtureBase } from './testFixtures.js';
|
|
5
|
+
setFixtureBase(import.meta);
|
|
6
|
+
setLogLevel(0);
|
|
9
7
|
//# sourceMappingURL=jest.setup.js.map
|
package/jest.setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jest.setup.js","sourceRoot":"","sources":["jest.setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jest.setup.js","sourceRoot":"","sources":["jest.setup.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,+BAA+B;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC5B,WAAW,CAAC,CAAC,CAAC,CAAC"}
|
package/jest.setup.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Importing a module here will break mocks for that module. Only add imports from `./src/*` here
|
|
2
2
|
// that are strictly necessary.
|
|
3
|
-
import { setLogLevel } from './logger';
|
|
4
|
-
import { setFixtureBase } from './testFixtures';
|
|
3
|
+
import { setLogLevel } from './logger.js';
|
|
4
|
+
import { setFixtureBase } from './testFixtures.js';
|
|
5
5
|
|
|
6
|
-
setFixtureBase(
|
|
6
|
+
setFixtureBase(import.meta);
|
|
7
7
|
setLogLevel(0);
|
package/logger.js
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const os_1 = require("os");
|
|
8
|
-
const util_1 = require("util");
|
|
9
|
-
const axios_1 = __importDefault(require("axios"));
|
|
10
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
-
const cli_highlight_1 = require("cli-highlight");
|
|
12
|
-
const winston_1 = __importDefault(require("winston"));
|
|
1
|
+
import { EOL } from 'os';
|
|
2
|
+
import { inspect } from 'util';
|
|
3
|
+
import axios from 'axios';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { highlight } from 'cli-highlight';
|
|
6
|
+
import winston from 'winston';
|
|
13
7
|
const levels = ['crit', 'error', 'warn', 'info', 'verbose', 'silly'];
|
|
14
8
|
const DEFAULT_LEVEL = levels.indexOf('info');
|
|
15
9
|
const padding = Math.max(...levels.map(({ length }) => length));
|
|
@@ -20,18 +14,18 @@ function httpErrorToString(error) {
|
|
|
20
14
|
var _a, _b, _c;
|
|
21
15
|
const { config, request, response } = error;
|
|
22
16
|
return [
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
`${config.method.toUpperCase()} ${
|
|
17
|
+
chalk.blue.bold('Request:'),
|
|
18
|
+
highlight([
|
|
19
|
+
`${config.method.toUpperCase()} ${axios.getUri(config)} HTTP/${(_b = (_a = request.res) === null || _a === void 0 ? void 0 : _a.httpVersion) !== null && _b !== void 0 ? _b : '1.1'}`,
|
|
26
20
|
...Object.entries(config.headers)
|
|
27
21
|
.map(([key, value]) => [headerCase(key), value])
|
|
28
22
|
.map(([key, value]) => `${key}: ${key === 'Authorization' ? 'xxxxxxxxxx' : value}`)
|
|
29
23
|
.sort(),
|
|
30
|
-
].join(
|
|
24
|
+
].join(EOL), { language: 'http', ignoreIllegals: true }),
|
|
31
25
|
'',
|
|
32
|
-
|
|
26
|
+
chalk.blue.bold('Response:'),
|
|
33
27
|
response
|
|
34
|
-
?
|
|
28
|
+
? highlight([
|
|
35
29
|
`HTTP/${(_c = request.res) === null || _c === void 0 ? void 0 : _c.httpVersion} ${response.status} ${response.statusText}`,
|
|
36
30
|
...Object.entries(response.headers)
|
|
37
31
|
.map(([key, value]) => `${headerCase(key)}: ${value}`)
|
|
@@ -40,13 +34,13 @@ function httpErrorToString(error) {
|
|
|
40
34
|
response.data instanceof Object
|
|
41
35
|
? JSON.stringify(response.data, null, 2)
|
|
42
36
|
: response.data,
|
|
43
|
-
].join(
|
|
44
|
-
:
|
|
45
|
-
].join(
|
|
37
|
+
].join(EOL), { language: 'http', ignoreIllegals: true })
|
|
38
|
+
: chalk.red.bold('No response from server'),
|
|
39
|
+
].join(EOL);
|
|
46
40
|
}
|
|
47
41
|
function toString(info) {
|
|
48
42
|
if (info instanceof Error) {
|
|
49
|
-
if (
|
|
43
|
+
if (axios.isAxiosError(info)) {
|
|
50
44
|
return httpErrorToString(info);
|
|
51
45
|
}
|
|
52
46
|
return info.stack;
|
|
@@ -54,34 +48,33 @@ function toString(info) {
|
|
|
54
48
|
if (typeof info.message === 'string') {
|
|
55
49
|
return info.message;
|
|
56
50
|
}
|
|
57
|
-
return
|
|
51
|
+
return inspect(info.message, { colors: true });
|
|
58
52
|
}
|
|
59
53
|
/**
|
|
60
54
|
* The default logger for NodeJS Appsemble projects.
|
|
61
55
|
*/
|
|
62
|
-
|
|
56
|
+
export const logger = winston.createLogger({
|
|
63
57
|
level: levels[DEFAULT_LEVEL],
|
|
64
58
|
levels: Object.fromEntries(levels.map((level, index) => [level, index])),
|
|
65
|
-
format:
|
|
59
|
+
format: winston.format.combine(winston.format((info) => ({
|
|
66
60
|
...info,
|
|
67
61
|
lines: toString(info)
|
|
68
62
|
.split(/\r?\n/)
|
|
69
63
|
.map((line) => `${''.padEnd(padding - info.level.length)}${line}`),
|
|
70
|
-
}))(),
|
|
71
|
-
transports: [new
|
|
64
|
+
}))(), winston.format.colorize(), winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.printf(({ level, lines, timestamp }) => lines.map((line) => `${timestamp} [${level}]: ${line}`).join(EOL))),
|
|
65
|
+
transports: [new winston.transports.Console()],
|
|
72
66
|
});
|
|
73
67
|
/**
|
|
74
68
|
* Set the logging level using a string or numeric value.
|
|
75
69
|
*
|
|
76
70
|
* @param level The logger level to set.
|
|
77
71
|
*/
|
|
78
|
-
function setLogLevel(level = DEFAULT_LEVEL) {
|
|
79
|
-
|
|
72
|
+
export function setLogLevel(level = DEFAULT_LEVEL) {
|
|
73
|
+
logger.level = Number.isNaN(Number(level))
|
|
80
74
|
? level
|
|
81
75
|
: levels[Math.min(Math.max(level, 0), levels.length - 1)];
|
|
82
|
-
|
|
76
|
+
logger.silly(`Logging level set to ${logger.level}`);
|
|
83
77
|
}
|
|
84
|
-
exports.setLogLevel = setLogLevel;
|
|
85
78
|
/**
|
|
86
79
|
* Configure logging using named quiet and verbose parameters.
|
|
87
80
|
*
|
|
@@ -89,14 +82,13 @@ exports.setLogLevel = setLogLevel;
|
|
|
89
82
|
*
|
|
90
83
|
* @param argv The processed command line arguments.
|
|
91
84
|
*/
|
|
92
|
-
function configureLogger({ quiet = 0, verbose = 0 }) {
|
|
85
|
+
export function configureLogger({ quiet = 0, verbose = 0 }) {
|
|
93
86
|
process.on('warning', (warning) => {
|
|
94
|
-
|
|
87
|
+
logger.warn(warning);
|
|
95
88
|
});
|
|
96
89
|
process.on('unhandledRejection', (error) => {
|
|
97
|
-
|
|
90
|
+
logger.error(error);
|
|
98
91
|
});
|
|
99
92
|
setLogLevel(DEFAULT_LEVEL + verbose - quiet);
|
|
100
93
|
}
|
|
101
|
-
exports.configureLogger = configureLogger;
|
|
102
94
|
//# sourceMappingURL=logger.js.map
|
package/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["logger.ts"],"names":[],"mappings":"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"}
|
package/logger.test.js
CHANGED
|
@@ -1,38 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const logger_1 = require("./logger");
|
|
1
|
+
import { configureLogger, logger, setLogLevel } from './logger.js';
|
|
4
2
|
describe('setLogLevel', () => {
|
|
5
3
|
afterEach(() => {
|
|
6
|
-
|
|
4
|
+
setLogLevel();
|
|
7
5
|
});
|
|
8
6
|
it('should set the level of the exported logger based on a string', () => {
|
|
9
|
-
|
|
10
|
-
expect(
|
|
7
|
+
setLogLevel('verbose');
|
|
8
|
+
expect(logger.level).toBe('verbose');
|
|
11
9
|
});
|
|
12
10
|
it('should set the level of the exported logger based on a number', () => {
|
|
13
|
-
|
|
14
|
-
expect(
|
|
11
|
+
setLogLevel(1);
|
|
12
|
+
expect(logger.level).toBe('error');
|
|
15
13
|
});
|
|
16
14
|
it('should set the level of the exported logger based on a numeric string', () => {
|
|
17
|
-
|
|
18
|
-
expect(
|
|
15
|
+
setLogLevel('2');
|
|
16
|
+
expect(logger.level).toBe('warn');
|
|
19
17
|
});
|
|
20
18
|
});
|
|
21
19
|
describe('configureLogger', () => {
|
|
22
20
|
afterEach(() => {
|
|
23
|
-
|
|
21
|
+
setLogLevel();
|
|
24
22
|
});
|
|
25
23
|
it('should configure a log level based on the quiet count of the argv', () => {
|
|
26
|
-
|
|
27
|
-
expect(
|
|
24
|
+
configureLogger({ quiet: 1 });
|
|
25
|
+
expect(logger.level).toBe('warn');
|
|
28
26
|
});
|
|
29
27
|
it('should configure a log level based on the verbose count of the argv', () => {
|
|
30
|
-
|
|
31
|
-
expect(
|
|
28
|
+
configureLogger({ verbose: 1 });
|
|
29
|
+
expect(logger.level).toBe('verbose');
|
|
32
30
|
});
|
|
33
31
|
it('should configure a log level based on the combined quiet and verbose count', () => {
|
|
34
|
-
|
|
35
|
-
expect(
|
|
32
|
+
configureLogger({ quiet: 1, verbose: 1 });
|
|
33
|
+
expect(logger.level).toBe('info');
|
|
36
34
|
});
|
|
37
35
|
});
|
|
38
36
|
//# sourceMappingURL=logger.test.js.map
|
package/logger.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["logger.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["logger.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEnE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,WAAW,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,WAAW,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/logger.test.ts
CHANGED
package/loggerMiddleware.js
CHANGED
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.loggerMiddleware = void 0;
|
|
7
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
-
const logger_1 = require("./logger");
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { logger } from './logger.js';
|
|
9
3
|
function rangeFormat(value, map) {
|
|
10
4
|
return Object.entries(map).find(([v]) => v === 'default' || value < Number(v))[1];
|
|
11
5
|
}
|
|
@@ -14,12 +8,12 @@ function rangeFormat(value, map) {
|
|
|
14
8
|
*
|
|
15
9
|
* @returns Koa middleware for logging requests using the Appsemble logger.
|
|
16
10
|
*/
|
|
17
|
-
function loggerMiddleware() {
|
|
11
|
+
export function loggerMiddleware() {
|
|
18
12
|
return (ctx, next) => {
|
|
19
13
|
const { href, res } = ctx;
|
|
20
14
|
const start = Date.now();
|
|
21
|
-
const method =
|
|
22
|
-
|
|
15
|
+
const method = chalk.bold(ctx.method);
|
|
16
|
+
logger.info(`${method} ${href} — ${chalk.white(ctx.ip)}`);
|
|
23
17
|
function logResponse() {
|
|
24
18
|
res.removeListener('finish', logResponse);
|
|
25
19
|
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
@@ -28,16 +22,16 @@ function loggerMiddleware() {
|
|
|
28
22
|
const s = `${status} ${message}`;
|
|
29
23
|
const duration = Date.now() - start;
|
|
30
24
|
const formatDuration = rangeFormat(duration, {
|
|
31
|
-
100:
|
|
32
|
-
1000:
|
|
33
|
-
default:
|
|
25
|
+
100: chalk.green,
|
|
26
|
+
1000: chalk.yellow,
|
|
27
|
+
default: chalk.red,
|
|
34
28
|
});
|
|
35
29
|
const formatStatus = rangeFormat(status, {
|
|
36
|
-
200:
|
|
37
|
-
300:
|
|
38
|
-
400:
|
|
39
|
-
500:
|
|
40
|
-
default:
|
|
30
|
+
200: chalk.red,
|
|
31
|
+
300: chalk.green,
|
|
32
|
+
400: chalk.cyan,
|
|
33
|
+
500: chalk.yellow,
|
|
34
|
+
default: chalk.red,
|
|
41
35
|
});
|
|
42
36
|
const level = rangeFormat(status, {
|
|
43
37
|
200: 'error',
|
|
@@ -45,23 +39,22 @@ function loggerMiddleware() {
|
|
|
45
39
|
500: 'warn',
|
|
46
40
|
default: 'error',
|
|
47
41
|
});
|
|
48
|
-
|
|
42
|
+
logger.log(level, `${method} ${href} ${formatStatus(location ? `${s} → ${location}` : s)} ${formatDuration(`${duration}ms`)}`);
|
|
49
43
|
}
|
|
50
44
|
function logCancel() {
|
|
51
45
|
res.removeListener('finish', logResponse);
|
|
52
46
|
res.removeListener('close', logCancel);
|
|
53
47
|
const duration = Date.now() - start;
|
|
54
48
|
const formatDuration = rangeFormat(duration, {
|
|
55
|
-
100:
|
|
56
|
-
1000:
|
|
57
|
-
default:
|
|
49
|
+
100: chalk.green,
|
|
50
|
+
1000: chalk.yellow,
|
|
51
|
+
default: chalk.red,
|
|
58
52
|
});
|
|
59
|
-
|
|
53
|
+
logger.warn(`${method} ${href} ${chalk.grey('Cancelled')} ${formatDuration(`${duration}ms`)}`);
|
|
60
54
|
}
|
|
61
55
|
res.once('finish', logResponse);
|
|
62
56
|
res.once('close', logCancel);
|
|
63
57
|
return next();
|
|
64
58
|
};
|
|
65
59
|
}
|
|
66
|
-
exports.loggerMiddleware = loggerMiddleware;
|
|
67
60
|
//# sourceMappingURL=loggerMiddleware.js.map
|
package/loggerMiddleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loggerMiddleware.js","sourceRoot":"","sources":["loggerMiddleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loggerMiddleware.js","sourceRoot":"","sources":["loggerMiddleware.ts"],"names":[],"mappings":"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"}
|
package/loggerMiddleware.test.js
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
const fake_timers_1 = require("@sinonjs/fake-timers");
|
|
7
|
-
const axios_test_instance_1 = require("axios-test-instance");
|
|
8
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
-
const koa_1 = __importDefault(require("koa"));
|
|
10
|
-
const logger_1 = require("./logger");
|
|
11
|
-
const loggerMiddleware_1 = require("./loggerMiddleware");
|
|
1
|
+
import { request, setTestApp } from 'axios-test-instance';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import Koa from 'koa';
|
|
4
|
+
import { logger } from './logger.js';
|
|
5
|
+
import { loggerMiddleware } from './loggerMiddleware.js';
|
|
12
6
|
class TestError extends Error {
|
|
13
7
|
constructor(message) {
|
|
14
8
|
super(message);
|
|
@@ -16,12 +10,11 @@ class TestError extends Error {
|
|
|
16
10
|
}
|
|
17
11
|
}
|
|
18
12
|
let app;
|
|
19
|
-
let clock;
|
|
20
13
|
beforeEach(async () => {
|
|
21
|
-
jest.spyOn(
|
|
22
|
-
jest.spyOn(
|
|
23
|
-
|
|
24
|
-
app = new
|
|
14
|
+
import.meta.jest.spyOn(logger, 'info').mockImplementation(() => logger);
|
|
15
|
+
import.meta.jest.spyOn(logger, 'log').mockImplementation(() => logger);
|
|
16
|
+
import.meta.jest.useFakeTimers({ now: 0 });
|
|
17
|
+
app = new Koa();
|
|
25
18
|
app.use(async (ctx, next) => {
|
|
26
19
|
Object.defineProperty(ctx.request, 'origin', {
|
|
27
20
|
value: 'https://example.com:1337',
|
|
@@ -36,95 +29,92 @@ beforeEach(async () => {
|
|
|
36
29
|
ctx.status = 400;
|
|
37
30
|
}
|
|
38
31
|
});
|
|
39
|
-
app.use(
|
|
32
|
+
app.use(loggerMiddleware());
|
|
40
33
|
app.silent = true;
|
|
41
|
-
|
|
42
|
-
await
|
|
43
|
-
});
|
|
44
|
-
afterEach(() => {
|
|
45
|
-
clock.uninstall();
|
|
34
|
+
request.defaults.maxRedirects = 0;
|
|
35
|
+
await setTestApp(app);
|
|
46
36
|
});
|
|
47
37
|
it('should log requests', async () => {
|
|
48
|
-
await
|
|
49
|
-
expect(
|
|
38
|
+
await request.get('/pizza');
|
|
39
|
+
expect(logger.info).toHaveBeenCalledWith(`${chalk.bold('GET')} https://example.com:1337/pizza — ${chalk.white('127.0.0.1')}`);
|
|
50
40
|
});
|
|
51
41
|
it('should log success responses as info', async () => {
|
|
52
42
|
app.use((ctx) => {
|
|
53
|
-
|
|
43
|
+
import.meta.jest.advanceTimersByTime(1);
|
|
54
44
|
ctx.status = 200;
|
|
55
45
|
});
|
|
56
|
-
await
|
|
57
|
-
expect(
|
|
46
|
+
await request.get('/fries');
|
|
47
|
+
expect(logger.log).toHaveBeenCalledWith('info', `${chalk.bold('GET')} https://example.com:1337/fries ${chalk.green('200 OK')} ${chalk.green('1ms')}`);
|
|
58
48
|
});
|
|
59
49
|
it('should log redirect responses as info', async () => {
|
|
60
50
|
app.use((ctx) => {
|
|
61
|
-
|
|
51
|
+
import.meta.jest.advanceTimersByTime(33);
|
|
62
52
|
ctx.redirect('/');
|
|
63
53
|
});
|
|
64
|
-
await
|
|
65
|
-
expect(
|
|
54
|
+
await request.get('/fries');
|
|
55
|
+
expect(logger.log).toHaveBeenCalledWith('info', `${chalk.bold('GET')} https://example.com:1337/fries ${chalk.cyan('302 Found → /')} ${chalk.green('33ms')}`);
|
|
66
56
|
});
|
|
67
57
|
it('should log bad responses as warn', async () => {
|
|
68
58
|
app.use((ctx) => {
|
|
69
|
-
|
|
59
|
+
import.meta.jest.advanceTimersByTime(3);
|
|
70
60
|
ctx.status = 400;
|
|
71
61
|
});
|
|
72
|
-
await
|
|
73
|
-
expect(
|
|
62
|
+
await request.get('/burrito');
|
|
63
|
+
expect(logger.log).toHaveBeenCalledWith('warn', `${chalk.bold('GET')} https://example.com:1337/burrito ${chalk.yellow('400 Bad Request')} ${chalk.green('3ms')}`);
|
|
74
64
|
});
|
|
75
65
|
it('should log error responses as error', async () => {
|
|
76
66
|
app.use((ctx) => {
|
|
77
|
-
|
|
67
|
+
import.meta.jest.advanceTimersByTime(53);
|
|
78
68
|
ctx.status = 503;
|
|
79
69
|
});
|
|
80
|
-
await
|
|
81
|
-
expect(
|
|
70
|
+
await request.get('/wrap');
|
|
71
|
+
expect(logger.log).toHaveBeenCalledWith('error', `${chalk.bold('GET')} https://example.com:1337/wrap ${chalk.red('503 Service Unavailable')} ${chalk.green('53ms')}`);
|
|
82
72
|
});
|
|
83
73
|
it('should log long request lengths yellow', async () => {
|
|
84
74
|
app.use((ctx) => {
|
|
85
|
-
|
|
75
|
+
import.meta.jest.advanceTimersByTime(400);
|
|
86
76
|
ctx.status = 200;
|
|
87
77
|
});
|
|
88
|
-
await
|
|
89
|
-
expect(
|
|
78
|
+
await request.get('/banana');
|
|
79
|
+
expect(logger.log).toHaveBeenCalledWith('info', `${chalk.bold('GET')} https://example.com:1337/banana ${chalk.green('200 OK')} ${chalk.yellow('400ms')}`);
|
|
90
80
|
});
|
|
91
81
|
it('should log extremely long request lengths red', async () => {
|
|
92
82
|
app.use((ctx) => {
|
|
93
|
-
|
|
83
|
+
import.meta.jest.advanceTimersByTime(1337);
|
|
94
84
|
ctx.status = 200;
|
|
95
85
|
});
|
|
96
|
-
await
|
|
97
|
-
expect(
|
|
86
|
+
await request.get('/pepperoni');
|
|
87
|
+
expect(logger.log).toHaveBeenCalledWith('info', `${chalk.bold('GET')} https://example.com:1337/pepperoni ${chalk.green('200 OK')} ${chalk.red('1337ms')}`);
|
|
98
88
|
});
|
|
99
89
|
it('should log errors as internal server errors and rethrow', async () => {
|
|
100
|
-
const spy = jest.fn();
|
|
90
|
+
const spy = import.meta.jest.fn();
|
|
101
91
|
const error = new Error('fail');
|
|
102
92
|
let context;
|
|
103
93
|
app.on('error', spy);
|
|
104
94
|
app.use((ctx) => {
|
|
105
|
-
|
|
95
|
+
import.meta.jest.advanceTimersByTime(86);
|
|
106
96
|
context = ctx;
|
|
107
97
|
throw error;
|
|
108
98
|
});
|
|
109
|
-
await
|
|
99
|
+
await request.get('/taco');
|
|
110
100
|
expect(spy).toHaveBeenCalledWith(error, context);
|
|
111
|
-
expect(
|
|
101
|
+
expect(logger.log).toHaveBeenCalledWith('error', `${chalk.bold('GET')} https://example.com:1337/taco ${chalk.red('500 Internal Server Error')} ${chalk.green('86ms')}`);
|
|
112
102
|
});
|
|
113
103
|
it('should append the response length if it is defined', async () => {
|
|
114
104
|
app.use((ctx) => {
|
|
115
|
-
|
|
105
|
+
import.meta.jest.advanceTimersByTime(1);
|
|
116
106
|
ctx.status = 200;
|
|
117
107
|
ctx.body = '{}';
|
|
118
108
|
});
|
|
119
|
-
await
|
|
120
|
-
expect(
|
|
109
|
+
await request.get('/fries');
|
|
110
|
+
expect(logger.log).toHaveBeenCalledWith('info', `${chalk.bold('GET')} https://example.com:1337/fries ${chalk.green('200 OK')} ${chalk.green('1ms')}`);
|
|
121
111
|
});
|
|
122
112
|
it('should log handled errors correctly', async () => {
|
|
123
113
|
app.use(() => {
|
|
124
|
-
|
|
114
|
+
import.meta.jest.advanceTimersByTime(15);
|
|
125
115
|
throw new TestError();
|
|
126
116
|
});
|
|
127
|
-
await
|
|
128
|
-
expect(
|
|
117
|
+
await request.get('potatoes');
|
|
118
|
+
expect(logger.log).toHaveBeenCalledWith('warn', `${chalk.bold('GET')} https://example.com:1337/potatoes ${chalk.yellow('400 Bad Request')} ${chalk.green('15ms')}`);
|
|
129
119
|
});
|
|
130
120
|
//# sourceMappingURL=loggerMiddleware.test.js.map
|