@verdaccio/logger 6.0.0-6-next.25 → 6.0.0-6-next.26
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/.babelrc +1 -1
- package/CHANGELOG.md +6 -0
- package/build/index.d.ts +3 -1
- package/build/index.js +13 -24
- package/build/index.js.map +1 -1
- package/jest.config.js +1 -1
- package/package.json +3 -6
- package/src/index.ts +15 -1
- package/tsconfig.build.json +1 -1
- package/tsconfig.json +4 -1
- package/build/logger.d.ts +0 -18
- package/build/logger.js +0 -142
- package/build/logger.js.map +0 -1
- package/src/logger.ts +0 -161
- package/test/createLogger.spec.ts +0 -20
- package/test/logger.spec.ts +0 -115
package/.babelrc
CHANGED
package/CHANGELOG.md
CHANGED
package/build/index.d.ts
CHANGED
package/build/index.js
CHANGED
|
@@ -3,29 +3,18 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
exports.logger = void 0;
|
|
7
|
+
exports.setup = setup;
|
|
8
|
+
var _pino = _interopRequireDefault(require("pino"));
|
|
9
|
+
var _loggerCommons = require("@verdaccio/logger-commons");
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
function setup(options) {
|
|
12
|
+
if (typeof logger !== 'undefined') {
|
|
13
|
+
return logger;
|
|
10
14
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
Object.defineProperty(exports, "prepareSetup", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
get: function () {
|
|
21
|
-
return _logger.prepareSetup;
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
Object.defineProperty(exports, "setup", {
|
|
25
|
-
enumerable: true,
|
|
26
|
-
get: function () {
|
|
27
|
-
return _logger.setup;
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
var _logger = require("./logger");
|
|
15
|
+
exports.logger = logger = (0, _loggerCommons.prepareSetup)(options, _pino.default);
|
|
16
|
+
return logger;
|
|
17
|
+
}
|
|
18
|
+
let logger;
|
|
19
|
+
exports.logger = logger;
|
|
31
20
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"index.js","names":["setup","options","logger","prepareSetup","pino"],"sources":["../src/index.ts"],"sourcesContent":["import pino from 'pino';\n\nimport { prepareSetup } from '@verdaccio/logger-commons';\nimport { Logger, LoggerConfigItem } from '@verdaccio/types';\n\nexport function setup(options: LoggerConfigItem) {\n if (typeof logger !== 'undefined') {\n return logger;\n }\n\n logger = prepareSetup(options, pino);\n return logger;\n}\n\nexport let logger: Logger;\n"],"mappings":";;;;;;;AAAA;AAEA;AAAyD;AAGlD,SAASA,KAAK,CAACC,OAAyB,EAAE;EAC/C,IAAI,OAAOC,MAAM,KAAK,WAAW,EAAE;IACjC,OAAOA,MAAM;EACf;EAEA,iBAAAA,MAAM,GAAG,IAAAC,2BAAY,EAACF,OAAO,EAAEG,aAAI,CAAC;EACpC,OAAOF,MAAM;AACf;AAEO,IAAIA,MAAc;AAAC"}
|
package/jest.config.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdaccio/logger",
|
|
3
|
-
"version": "6.0.0-6-next.
|
|
3
|
+
"version": "6.0.0-6-next.26",
|
|
4
4
|
"description": "logger",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"types": "./build/index.d.ts",
|
|
@@ -29,10 +29,7 @@
|
|
|
29
29
|
"node": ">=12"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@verdaccio/
|
|
33
|
-
"@verdaccio/logger-prettify": "6.0.0-6-next.8",
|
|
34
|
-
"debug": "4.3.4",
|
|
35
|
-
"colorette": "2.0.19",
|
|
32
|
+
"@verdaccio/logger-commons": "6.0.0-6-next.26",
|
|
36
33
|
"pino": "8.8.0"
|
|
37
34
|
},
|
|
38
35
|
"devDependencies": {
|
|
@@ -44,7 +41,7 @@
|
|
|
44
41
|
},
|
|
45
42
|
"scripts": {
|
|
46
43
|
"clean": "rimraf ./build",
|
|
47
|
-
"test": "
|
|
44
|
+
"test": "echo 1",
|
|
48
45
|
"type-check": "tsc --noEmit -p tsconfig.build.json",
|
|
49
46
|
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
|
|
50
47
|
"build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps",
|
package/src/index.ts
CHANGED
|
@@ -1 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
|
|
3
|
+
import { prepareSetup } from '@verdaccio/logger-commons';
|
|
4
|
+
import { Logger, LoggerConfigItem } from '@verdaccio/types';
|
|
5
|
+
|
|
6
|
+
export function setup(options: LoggerConfigItem) {
|
|
7
|
+
if (typeof logger !== 'undefined') {
|
|
8
|
+
return logger;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
logger = prepareSetup(options, pino);
|
|
12
|
+
return logger;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export let logger: Logger;
|
package/tsconfig.build.json
CHANGED
package/tsconfig.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"extends": "
|
|
2
|
+
"extends": "../../../tsconfig.reference.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"rootDir": "./src",
|
|
5
5
|
"outDir": "./build"
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
"references": [
|
|
9
9
|
{
|
|
10
10
|
"path": "../logger-prettify"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"path": "../logger-commons"
|
|
11
14
|
}
|
|
12
15
|
]
|
|
13
16
|
}
|
package/build/logger.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { Logger, LoggerConfigItem, LoggerFormat } from '@verdaccio/types';
|
|
3
|
-
export type LogPlugin = {
|
|
4
|
-
dest: string;
|
|
5
|
-
options?: any[];
|
|
6
|
-
};
|
|
7
|
-
type LoggerOptions = {
|
|
8
|
-
level?: string;
|
|
9
|
-
path?: string;
|
|
10
|
-
colors?: boolean;
|
|
11
|
-
sync?: boolean;
|
|
12
|
-
};
|
|
13
|
-
export declare function createLogger(options?: LoggerOptions, destination?: NodeJS.WritableStream, format?: LoggerFormat): any;
|
|
14
|
-
export type LoggerConfig = LoggerConfigItem;
|
|
15
|
-
export declare function prepareSetup(options?: LoggerConfigItem): Logger;
|
|
16
|
-
export declare let logger: Logger;
|
|
17
|
-
export declare function setup(options: LoggerConfigItem): Logger;
|
|
18
|
-
export {};
|
package/build/logger.js
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.createLogger = createLogger;
|
|
7
|
-
exports.logger = void 0;
|
|
8
|
-
exports.prepareSetup = prepareSetup;
|
|
9
|
-
exports.setup = setup;
|
|
10
|
-
var _colorette = require("colorette");
|
|
11
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
12
|
-
var _pino = _interopRequireDefault(require("pino"));
|
|
13
|
-
var _loggerPrettify = require("@verdaccio/logger-prettify");
|
|
14
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
// <reference types="node" />
|
|
16
|
-
|
|
17
|
-
const debug = (0, _debug.default)('verdaccio:logger');
|
|
18
|
-
function isProd() {
|
|
19
|
-
return process.env.NODE_ENV === 'production';
|
|
20
|
-
}
|
|
21
|
-
function hasColors(colors) {
|
|
22
|
-
if (colors) {
|
|
23
|
-
return _colorette.isColorSupported;
|
|
24
|
-
}
|
|
25
|
-
return typeof colors === 'undefined' ? true : colors;
|
|
26
|
-
}
|
|
27
|
-
const DEFAULT_LOG_FORMAT = isProd() ? 'json' : 'pretty';
|
|
28
|
-
function createLogger(options = {
|
|
29
|
-
level: 'http'
|
|
30
|
-
},
|
|
31
|
-
// eslint-disable-next-line no-undef
|
|
32
|
-
// @ts-ignore
|
|
33
|
-
destination = _pino.default.destination(1), format = DEFAULT_LOG_FORMAT) {
|
|
34
|
-
debug('setup logger');
|
|
35
|
-
let pinoConfig = {
|
|
36
|
-
customLevels: {
|
|
37
|
-
http: 25
|
|
38
|
-
},
|
|
39
|
-
level: options.level,
|
|
40
|
-
serializers: {
|
|
41
|
-
err: _pino.default.stdSerializers.err,
|
|
42
|
-
req: _pino.default.stdSerializers.req,
|
|
43
|
-
res: _pino.default.stdSerializers.res
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
debug('has prettifier? %o', !isProd());
|
|
47
|
-
// pretty logs are not allowed in production for performance reasons
|
|
48
|
-
if (['pretty-timestamped', 'pretty'].includes(format) && isProd() === false) {
|
|
49
|
-
pinoConfig = Object.assign({}, pinoConfig, {
|
|
50
|
-
transport: {
|
|
51
|
-
target: '@verdaccio/logger-prettify',
|
|
52
|
-
options: {
|
|
53
|
-
// string or 1 (file descriptor for process.stdout)
|
|
54
|
-
destination: options.path || 1,
|
|
55
|
-
colors: hasColors(options.colors),
|
|
56
|
-
prettyStamp: format === 'pretty-timestamped'
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
} else {
|
|
61
|
-
pinoConfig = {
|
|
62
|
-
...pinoConfig,
|
|
63
|
-
// more info
|
|
64
|
-
// https://github.com/pinojs/pino/blob/v7.1.0/docs/api.md#hooks-object
|
|
65
|
-
// TODO: improve typings here
|
|
66
|
-
// @ts-ignore
|
|
67
|
-
hooks: {
|
|
68
|
-
logMethod(inputArgs, method) {
|
|
69
|
-
const [templateObject, message, ...otherArgs] = inputArgs;
|
|
70
|
-
const templateVars = !!templateObject && typeof templateObject === 'object' ? Object.getOwnPropertyNames(templateObject) : [];
|
|
71
|
-
if (!message || !templateVars.length) return method.apply(this, inputArgs);
|
|
72
|
-
const hydratedMessage = (0, _loggerPrettify.fillInMsgTemplate)(message, templateObject, false);
|
|
73
|
-
return method.apply(this, [templateObject, hydratedMessage, ...otherArgs]);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
const logger = (0, _pino.default)(pinoConfig, destination);
|
|
79
|
-
|
|
80
|
-
/* eslint-disable */
|
|
81
|
-
/* istanbul ignore next */
|
|
82
|
-
if (process.env.DEBUG) {
|
|
83
|
-
logger.on('level-change', (lvl, val, prevLvl, prevVal) => {
|
|
84
|
-
debug('%s (%d) was changed to %s (%d)', lvl, val, prevLvl, prevVal);
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
return logger;
|
|
88
|
-
}
|
|
89
|
-
const DEFAULT_LOGGER_CONF = {
|
|
90
|
-
type: 'stdout',
|
|
91
|
-
format: 'pretty',
|
|
92
|
-
level: 'http'
|
|
93
|
-
};
|
|
94
|
-
function prepareSetup(options = DEFAULT_LOGGER_CONF) {
|
|
95
|
-
var _loggerConfig;
|
|
96
|
-
let logger;
|
|
97
|
-
let loggerConfig = options;
|
|
98
|
-
if (!((_loggerConfig = loggerConfig) !== null && _loggerConfig !== void 0 && _loggerConfig.level)) {
|
|
99
|
-
loggerConfig = Object.assign({}, {
|
|
100
|
-
level: 'http'
|
|
101
|
-
}, loggerConfig);
|
|
102
|
-
}
|
|
103
|
-
const pinoConfig = {
|
|
104
|
-
level: loggerConfig.level
|
|
105
|
-
};
|
|
106
|
-
if (loggerConfig.type === 'file') {
|
|
107
|
-
debug('logging file enabled');
|
|
108
|
-
const destination = _pino.default.destination(loggerConfig.path);
|
|
109
|
-
/* eslint-disable */
|
|
110
|
-
/* istanbul ignore next */
|
|
111
|
-
process.on('SIGUSR2', () => destination.reopen());
|
|
112
|
-
// @ts-ignore
|
|
113
|
-
logger = createLogger({
|
|
114
|
-
level: loggerConfig.level,
|
|
115
|
-
path: loggerConfig.path,
|
|
116
|
-
colors: loggerConfig.colors
|
|
117
|
-
},
|
|
118
|
-
// @ts-ignore
|
|
119
|
-
destination, loggerConfig.format);
|
|
120
|
-
return logger;
|
|
121
|
-
} else {
|
|
122
|
-
debug('logging stdout enabled');
|
|
123
|
-
// @ts-ignore
|
|
124
|
-
logger = createLogger({
|
|
125
|
-
level: loggerConfig.level,
|
|
126
|
-
colors: loggerConfig.colors
|
|
127
|
-
},
|
|
128
|
-
// @ts-ignore
|
|
129
|
-
_pino.default.destination(1), loggerConfig.format);
|
|
130
|
-
return logger;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
let logger;
|
|
134
|
-
exports.logger = logger;
|
|
135
|
-
function setup(options) {
|
|
136
|
-
if (typeof logger !== 'undefined') {
|
|
137
|
-
return logger;
|
|
138
|
-
}
|
|
139
|
-
exports.logger = logger = prepareSetup(options);
|
|
140
|
-
return logger;
|
|
141
|
-
}
|
|
142
|
-
//# sourceMappingURL=logger.js.map
|
package/build/logger.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","names":["debug","buildDebug","isProd","process","env","NODE_ENV","hasColors","colors","isColorSupported","DEFAULT_LOG_FORMAT","createLogger","options","level","destination","pino","format","pinoConfig","customLevels","http","serializers","err","stdSerializers","req","res","includes","Object","assign","transport","target","path","prettyStamp","hooks","logMethod","inputArgs","method","templateObject","message","otherArgs","templateVars","getOwnPropertyNames","length","apply","hydratedMessage","fillInMsgTemplate","logger","DEBUG","on","lvl","val","prevLvl","prevVal","DEFAULT_LOGGER_CONF","type","prepareSetup","loggerConfig","reopen","setup"],"sources":["../src/logger.ts"],"sourcesContent":["// <reference types=\"node\" />\nimport { isColorSupported } from 'colorette';\nimport buildDebug from 'debug';\nimport pino from 'pino';\n\nimport { fillInMsgTemplate } from '@verdaccio/logger-prettify';\nimport { Logger, LoggerConfigItem, LoggerFormat } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:logger');\n\nfunction isProd() {\n return process.env.NODE_ENV === 'production';\n}\n\nfunction hasColors(colors: boolean | undefined) {\n if (colors) {\n return isColorSupported;\n }\n return typeof colors === 'undefined' ? true : colors;\n}\n\nconst DEFAULT_LOG_FORMAT = isProd() ? 'json' : 'pretty';\n\nexport type LogPlugin = {\n dest: string;\n options?: any[];\n};\n\ntype LoggerOptions = { level?: string; path?: string; colors?: boolean; sync?: boolean };\n\nexport function createLogger(\n options: LoggerOptions = { level: 'http' },\n // eslint-disable-next-line no-undef\n // @ts-ignore\n destination: NodeJS.WritableStream = pino.destination(1),\n format: LoggerFormat = DEFAULT_LOG_FORMAT\n): any {\n debug('setup logger');\n let pinoConfig = {\n customLevels: {\n http: 25,\n },\n level: options.level,\n serializers: {\n err: pino.stdSerializers.err,\n req: pino.stdSerializers.req,\n res: pino.stdSerializers.res,\n },\n };\n\n debug('has prettifier? %o', !isProd());\n // pretty logs are not allowed in production for performance reasons\n if (['pretty-timestamped', 'pretty'].includes(format) && isProd() === false) {\n pinoConfig = Object.assign({}, pinoConfig, {\n transport: {\n target: '@verdaccio/logger-prettify',\n options: {\n // string or 1 (file descriptor for process.stdout)\n destination: options.path || 1,\n colors: hasColors(options.colors),\n prettyStamp: format === 'pretty-timestamped',\n },\n },\n });\n } else {\n pinoConfig = {\n ...pinoConfig,\n // more info\n // https://github.com/pinojs/pino/blob/v7.1.0/docs/api.md#hooks-object\n // TODO: improve typings here\n // @ts-ignore\n hooks: {\n logMethod(\n inputArgs: [any, any, ...any[]],\n method: {\n apply: (arg0: { logMethod: (inputArgs: any, method: any) => any }, arg1: any[]) => any;\n }\n ) {\n const [templateObject, message, ...otherArgs] = inputArgs;\n const templateVars =\n !!templateObject && typeof templateObject === 'object'\n ? Object.getOwnPropertyNames(templateObject)\n : [];\n if (!message || !templateVars.length) return method.apply(this, inputArgs);\n const hydratedMessage = fillInMsgTemplate(message, templateObject, false);\n return method.apply(this, [templateObject, hydratedMessage, ...otherArgs]);\n },\n },\n };\n }\n const logger = pino(pinoConfig, destination);\n\n /* eslint-disable */\n /* istanbul ignore next */\n if (process.env.DEBUG) {\n logger.on('level-change', (lvl, val, prevLvl, prevVal) => {\n debug('%s (%d) was changed to %s (%d)', lvl, val, prevLvl, prevVal);\n });\n }\n\n return logger;\n}\n\nconst DEFAULT_LOGGER_CONF: LoggerConfigItem = {\n type: 'stdout',\n format: 'pretty',\n level: 'http',\n};\n\nexport type LoggerConfig = LoggerConfigItem;\n\nexport function prepareSetup(options: LoggerConfigItem = DEFAULT_LOGGER_CONF) {\n let logger: Logger;\n let loggerConfig = options;\n if (!loggerConfig?.level) {\n loggerConfig = Object.assign(\n {},\n {\n level: 'http',\n },\n loggerConfig\n );\n }\n const pinoConfig = { level: loggerConfig.level };\n if (loggerConfig.type === 'file') {\n debug('logging file enabled');\n const destination = pino.destination(loggerConfig.path);\n /* eslint-disable */\n /* istanbul ignore next */\n process.on('SIGUSR2', () => destination.reopen());\n // @ts-ignore\n logger = createLogger(\n { level: loggerConfig.level, path: loggerConfig.path, colors: loggerConfig.colors },\n // @ts-ignore\n destination,\n loggerConfig.format\n );\n return logger;\n } else {\n debug('logging stdout enabled');\n // @ts-ignore\n logger = createLogger(\n { level: loggerConfig.level, colors: loggerConfig.colors },\n // @ts-ignore\n pino.destination(1),\n loggerConfig.format\n );\n return logger;\n }\n}\n\nexport let logger: Logger;\n\nexport function setup(options: LoggerConfigItem) {\n if (typeof logger !== 'undefined') {\n return logger;\n }\n\n logger = prepareSetup(options);\n return logger;\n}\n"],"mappings":"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"}
|
package/src/logger.ts
DELETED
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
// <reference types="node" />
|
|
2
|
-
import { isColorSupported } from 'colorette';
|
|
3
|
-
import buildDebug from 'debug';
|
|
4
|
-
import pino from 'pino';
|
|
5
|
-
|
|
6
|
-
import { fillInMsgTemplate } from '@verdaccio/logger-prettify';
|
|
7
|
-
import { Logger, LoggerConfigItem, LoggerFormat } from '@verdaccio/types';
|
|
8
|
-
|
|
9
|
-
const debug = buildDebug('verdaccio:logger');
|
|
10
|
-
|
|
11
|
-
function isProd() {
|
|
12
|
-
return process.env.NODE_ENV === 'production';
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function hasColors(colors: boolean | undefined) {
|
|
16
|
-
if (colors) {
|
|
17
|
-
return isColorSupported;
|
|
18
|
-
}
|
|
19
|
-
return typeof colors === 'undefined' ? true : colors;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const DEFAULT_LOG_FORMAT = isProd() ? 'json' : 'pretty';
|
|
23
|
-
|
|
24
|
-
export type LogPlugin = {
|
|
25
|
-
dest: string;
|
|
26
|
-
options?: any[];
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
type LoggerOptions = { level?: string; path?: string; colors?: boolean; sync?: boolean };
|
|
30
|
-
|
|
31
|
-
export function createLogger(
|
|
32
|
-
options: LoggerOptions = { level: 'http' },
|
|
33
|
-
// eslint-disable-next-line no-undef
|
|
34
|
-
// @ts-ignore
|
|
35
|
-
destination: NodeJS.WritableStream = pino.destination(1),
|
|
36
|
-
format: LoggerFormat = DEFAULT_LOG_FORMAT
|
|
37
|
-
): any {
|
|
38
|
-
debug('setup logger');
|
|
39
|
-
let pinoConfig = {
|
|
40
|
-
customLevels: {
|
|
41
|
-
http: 25,
|
|
42
|
-
},
|
|
43
|
-
level: options.level,
|
|
44
|
-
serializers: {
|
|
45
|
-
err: pino.stdSerializers.err,
|
|
46
|
-
req: pino.stdSerializers.req,
|
|
47
|
-
res: pino.stdSerializers.res,
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
debug('has prettifier? %o', !isProd());
|
|
52
|
-
// pretty logs are not allowed in production for performance reasons
|
|
53
|
-
if (['pretty-timestamped', 'pretty'].includes(format) && isProd() === false) {
|
|
54
|
-
pinoConfig = Object.assign({}, pinoConfig, {
|
|
55
|
-
transport: {
|
|
56
|
-
target: '@verdaccio/logger-prettify',
|
|
57
|
-
options: {
|
|
58
|
-
// string or 1 (file descriptor for process.stdout)
|
|
59
|
-
destination: options.path || 1,
|
|
60
|
-
colors: hasColors(options.colors),
|
|
61
|
-
prettyStamp: format === 'pretty-timestamped',
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
} else {
|
|
66
|
-
pinoConfig = {
|
|
67
|
-
...pinoConfig,
|
|
68
|
-
// more info
|
|
69
|
-
// https://github.com/pinojs/pino/blob/v7.1.0/docs/api.md#hooks-object
|
|
70
|
-
// TODO: improve typings here
|
|
71
|
-
// @ts-ignore
|
|
72
|
-
hooks: {
|
|
73
|
-
logMethod(
|
|
74
|
-
inputArgs: [any, any, ...any[]],
|
|
75
|
-
method: {
|
|
76
|
-
apply: (arg0: { logMethod: (inputArgs: any, method: any) => any }, arg1: any[]) => any;
|
|
77
|
-
}
|
|
78
|
-
) {
|
|
79
|
-
const [templateObject, message, ...otherArgs] = inputArgs;
|
|
80
|
-
const templateVars =
|
|
81
|
-
!!templateObject && typeof templateObject === 'object'
|
|
82
|
-
? Object.getOwnPropertyNames(templateObject)
|
|
83
|
-
: [];
|
|
84
|
-
if (!message || !templateVars.length) return method.apply(this, inputArgs);
|
|
85
|
-
const hydratedMessage = fillInMsgTemplate(message, templateObject, false);
|
|
86
|
-
return method.apply(this, [templateObject, hydratedMessage, ...otherArgs]);
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
const logger = pino(pinoConfig, destination);
|
|
92
|
-
|
|
93
|
-
/* eslint-disable */
|
|
94
|
-
/* istanbul ignore next */
|
|
95
|
-
if (process.env.DEBUG) {
|
|
96
|
-
logger.on('level-change', (lvl, val, prevLvl, prevVal) => {
|
|
97
|
-
debug('%s (%d) was changed to %s (%d)', lvl, val, prevLvl, prevVal);
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return logger;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const DEFAULT_LOGGER_CONF: LoggerConfigItem = {
|
|
105
|
-
type: 'stdout',
|
|
106
|
-
format: 'pretty',
|
|
107
|
-
level: 'http',
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
export type LoggerConfig = LoggerConfigItem;
|
|
111
|
-
|
|
112
|
-
export function prepareSetup(options: LoggerConfigItem = DEFAULT_LOGGER_CONF) {
|
|
113
|
-
let logger: Logger;
|
|
114
|
-
let loggerConfig = options;
|
|
115
|
-
if (!loggerConfig?.level) {
|
|
116
|
-
loggerConfig = Object.assign(
|
|
117
|
-
{},
|
|
118
|
-
{
|
|
119
|
-
level: 'http',
|
|
120
|
-
},
|
|
121
|
-
loggerConfig
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
const pinoConfig = { level: loggerConfig.level };
|
|
125
|
-
if (loggerConfig.type === 'file') {
|
|
126
|
-
debug('logging file enabled');
|
|
127
|
-
const destination = pino.destination(loggerConfig.path);
|
|
128
|
-
/* eslint-disable */
|
|
129
|
-
/* istanbul ignore next */
|
|
130
|
-
process.on('SIGUSR2', () => destination.reopen());
|
|
131
|
-
// @ts-ignore
|
|
132
|
-
logger = createLogger(
|
|
133
|
-
{ level: loggerConfig.level, path: loggerConfig.path, colors: loggerConfig.colors },
|
|
134
|
-
// @ts-ignore
|
|
135
|
-
destination,
|
|
136
|
-
loggerConfig.format
|
|
137
|
-
);
|
|
138
|
-
return logger;
|
|
139
|
-
} else {
|
|
140
|
-
debug('logging stdout enabled');
|
|
141
|
-
// @ts-ignore
|
|
142
|
-
logger = createLogger(
|
|
143
|
-
{ level: loggerConfig.level, colors: loggerConfig.colors },
|
|
144
|
-
// @ts-ignore
|
|
145
|
-
pino.destination(1),
|
|
146
|
-
loggerConfig.format
|
|
147
|
-
);
|
|
148
|
-
return logger;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export let logger: Logger;
|
|
153
|
-
|
|
154
|
-
export function setup(options: LoggerConfigItem) {
|
|
155
|
-
if (typeof logger !== 'undefined') {
|
|
156
|
-
return logger;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
logger = prepareSetup(options);
|
|
160
|
-
return logger;
|
|
161
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Writable } from 'stream';
|
|
2
|
-
|
|
3
|
-
import { createLogger } from '../src';
|
|
4
|
-
|
|
5
|
-
describe('logger test', () => {
|
|
6
|
-
describe('json format', () => {
|
|
7
|
-
test('should write json to a stream', () => {
|
|
8
|
-
const stream = new Writable({
|
|
9
|
-
write(chunk, encoding, callback) {
|
|
10
|
-
expect(JSON.parse(chunk.toString())).toEqual(
|
|
11
|
-
expect.objectContaining({ level: 30, msg: 'test' })
|
|
12
|
-
);
|
|
13
|
-
callback();
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
const logger = createLogger({ level: 'http' }, stream, 'json');
|
|
17
|
-
logger.info('test');
|
|
18
|
-
});
|
|
19
|
-
});
|
|
20
|
-
});
|
package/test/logger.spec.ts
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { readFile } from 'fs/promises';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { setTimeout } from 'timers/promises';
|
|
4
|
-
|
|
5
|
-
import { fileUtils } from '@verdaccio/core';
|
|
6
|
-
|
|
7
|
-
import { prepareSetup } from '../src';
|
|
8
|
-
|
|
9
|
-
async function readLogFile(path: string) {
|
|
10
|
-
await setTimeout(1000, 'resolved');
|
|
11
|
-
return readFile(path, 'utf8');
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
async function createLogFile() {
|
|
15
|
-
const folder = await fileUtils.createTempFolder('logger-1');
|
|
16
|
-
const file = join(folder, 'logger.log');
|
|
17
|
-
return file;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const defaultOptions = {
|
|
21
|
-
format: 'json',
|
|
22
|
-
level: 'http',
|
|
23
|
-
colors: false,
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
describe('logger test', () => {
|
|
27
|
-
describe('basic', () => {
|
|
28
|
-
test('should include default level', async () => {
|
|
29
|
-
const file = await createLogFile();
|
|
30
|
-
const logger = prepareSetup({ type: 'file', path: file, colors: false });
|
|
31
|
-
logger.info({ packageName: 'test' }, `testing @{packageName}`);
|
|
32
|
-
// Note: this should not be logged
|
|
33
|
-
logger.debug(`this should not be logged`);
|
|
34
|
-
// Note: this should not be logged
|
|
35
|
-
logger.trace(`this should not be logged`);
|
|
36
|
-
logger.error(`this should logged`);
|
|
37
|
-
const content = await readLogFile(file);
|
|
38
|
-
expect(content).toBe('info --- testing test \nerror--- this should logged \n');
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
test('should include all logging level', async () => {
|
|
42
|
-
const file = await createLogFile();
|
|
43
|
-
const logger = prepareSetup({ type: 'file', level: 'trace', path: file, colors: false });
|
|
44
|
-
logger.info({ packageName: 'test' }, `testing @{packageName}`);
|
|
45
|
-
logger.debug(`this should not be logged`);
|
|
46
|
-
logger.trace(`this should not be logged`);
|
|
47
|
-
logger.error(`this should logged`);
|
|
48
|
-
const content = await readLogFile(file);
|
|
49
|
-
expect(content).toBe(
|
|
50
|
-
'info --- testing test \ndebug--- this should not be logged \ntrace--- this should not be logged \nerror--- this should logged \n'
|
|
51
|
-
);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe('json format', () => {
|
|
56
|
-
test('should log into a file with json format', async () => {
|
|
57
|
-
const file = await createLogFile();
|
|
58
|
-
const logger = prepareSetup({
|
|
59
|
-
...defaultOptions,
|
|
60
|
-
format: 'json',
|
|
61
|
-
type: 'file',
|
|
62
|
-
path: file,
|
|
63
|
-
level: 'info',
|
|
64
|
-
});
|
|
65
|
-
logger.info(
|
|
66
|
-
{ packageName: 'test' },
|
|
67
|
-
`publishing or updating a new version for @{packageName}`
|
|
68
|
-
);
|
|
69
|
-
const content = await readLogFile(file);
|
|
70
|
-
expect(JSON.parse(content)).toEqual(
|
|
71
|
-
expect.objectContaining({
|
|
72
|
-
level: 30,
|
|
73
|
-
msg: 'publishing or updating a new version for test',
|
|
74
|
-
})
|
|
75
|
-
);
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe('pretty format', () => {
|
|
80
|
-
test('should log into a file with pretty', async () => {
|
|
81
|
-
const file = await createLogFile();
|
|
82
|
-
const logger = prepareSetup({
|
|
83
|
-
format: 'pretty',
|
|
84
|
-
type: 'file',
|
|
85
|
-
path: file,
|
|
86
|
-
level: 'trace',
|
|
87
|
-
colors: false,
|
|
88
|
-
});
|
|
89
|
-
logger.info(
|
|
90
|
-
{ packageName: 'test' },
|
|
91
|
-
`publishing or updating a new version for @{packageName}`
|
|
92
|
-
);
|
|
93
|
-
const content = await readLogFile(file);
|
|
94
|
-
expect(content).toEqual('info --- publishing or updating a new version for test \n');
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
test('should log into a file with pretty-timestamped', async () => {
|
|
98
|
-
const file = await createLogFile();
|
|
99
|
-
const logger = prepareSetup({
|
|
100
|
-
format: 'pretty-timestamped',
|
|
101
|
-
type: 'file',
|
|
102
|
-
path: file,
|
|
103
|
-
level: 'trace',
|
|
104
|
-
colors: false,
|
|
105
|
-
});
|
|
106
|
-
logger.info(
|
|
107
|
-
{ packageName: 'test' },
|
|
108
|
-
`publishing or updating a new version for @{packageName}`
|
|
109
|
-
);
|
|
110
|
-
const content = await readLogFile(file);
|
|
111
|
-
// TODO: we might want mock time for testing
|
|
112
|
-
expect(content).toMatch('info --- publishing or updating a new version for test \n');
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
});
|