@@ -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 /**
0 commit comments