Skip to content

Commit 57f29b2

Browse files
committed
review fix
1 parent a9371b1 commit 57f29b2

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

lib/logger.js

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ class LogConsumer {
8383
const { level = 'info' } = options;
8484
validateOneOf(level, 'options.level', LEVEL_NAMES);
8585
this.#levelValue = LEVELS[level];
86+
87+
// Setup level-specific enabled properties for typo safety
88+
// Allows consumer.info.enabled instead of consumer.enabled('info')
89+
const levelValue = this.#levelValue;
90+
for (let i = 0; i < LEVEL_NAMES.length; i++) {
91+
const lvl = LEVEL_NAMES[i];
92+
this[lvl] = { __proto__: null, enabled: LEVELS[lvl] >= levelValue };
93+
}
8694
}
8795

8896
/**
@@ -249,8 +257,9 @@ class Logger {
249257
validateObject(bindings, 'options.bindings');
250258
validateObject(serializers, 'options.serializers');
251259

252-
// Validate serializers are functions
253-
for (const key in serializers) {
260+
// Validate serializers are functions (use ObjectKeys to avoid prototype chain)
261+
const serializerKeys = ObjectKeys(serializers);
262+
for (const key of serializerKeys) {
254263
validateFunction(serializers[key], `options.serializers.${key}`);
255264
}
256265

@@ -263,8 +272,8 @@ class Logger {
263272
// Add default err serializer (can be overridden)
264273
this.#serializers.err = stdSerializers.err;
265274

266-
// Add custom serializers
267-
for (const key in serializers) {
275+
// Add custom serializers (use serializerKeys from validation above)
276+
for (const key of serializerKeys) {
268277
this.#serializers[key] = serializers[key];
269278
}
270279

@@ -416,25 +425,28 @@ class Logger {
416425
}
417426

418427
/**
419-
* Serialize a single value using serialize symbol or field serializer
428+
* Serialize a single value using serialize symbol and/or field serializer
429+
* Uses stacked behavior: first apply [serialize](), then field serializer
420430
* @param {*} value - Value to serialize
421431
* @param {string} key - Field key for field-specific serializer lookup
422432
* @returns {*} Serialized value
423433
* @private
424434
*/
425435
#serializeValue(value, key) {
426-
// Check for serialize symbol first
427-
if (value !== null && typeof value === 'object' &&
428-
typeof value[serialize] === 'function') {
429-
return value[serialize]();
436+
let result = value;
437+
438+
// Step 1: Apply [serialize](), if present
439+
if (result !== null && typeof result === 'object' &&
440+
typeof result[serialize] === 'function') {
441+
result = result[serialize]();
430442
}
431443

432-
// Apply field-specific serializer if exists
444+
// Step 2: Apply field-specific serializer, if present
433445
if (this.#serializers[key]) {
434-
return this.#serializers[key](value);
446+
result = this.#serializers[key](result);
435447
}
436448

437-
return value;
449+
return result;
438450
}
439451

440452
/**

test/parallel/test-logger-serializers.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ describe('Logger serializers', () => {
233233
assert.strictEqual(log.user.password, undefined);
234234
});
235235

236-
it('should prefer serialize symbol over field serializer', () => {
236+
it('should apply both serialize symbol and field serializer (stacked)', () => {
237237
const stream = new TestStream();
238238
const consumer = new JSONConsumer({ stream, level: 'info' });
239239
consumer.attach();
@@ -252,8 +252,8 @@ describe('Logger serializers', () => {
252252
const logger = new Logger({
253253
level: 'info',
254254
serializers: {
255-
// This should be ignored when object has serialize symbol
256-
conn: (c) => ({ host: c.host, fromSerializer: true }),
255+
// This runs AFTER serialize symbol, receives the serialized result
256+
conn: (c) => ({ ...c, fromSerializer: true }),
257257
},
258258
});
259259

@@ -263,8 +263,8 @@ describe('Logger serializers', () => {
263263

264264
const log = stream.logs[0];
265265
assert.strictEqual(log.conn.host, 'localhost');
266-
assert.strictEqual(log.conn.type, 'db');
267-
assert.strictEqual(log.conn.fromSerializer, undefined);
266+
assert.strictEqual(log.conn.type, 'db'); // From [serialize]()
267+
assert.strictEqual(log.conn.fromSerializer, true); // From field serializer
268268
assert.strictEqual(log.conn.password, undefined);
269269
});
270270

0 commit comments

Comments
 (0)