@@ -24,7 +24,7 @@ export class Log {
2424 constructor ( entity , token , isDebug = false ) {
2525 this . #entity = entity
2626 this . #token = token
27- this . #isDebug = isDebug || process . env . DEBUG === 'true'
27+ this . #isDebug = Boolean ( isDebug ) || process . env . DEBUG === 'true'
2828 this . #spinner = this . #isDebug ? null : ora ( )
2929
3030 if ( this . #isDebug) {
@@ -138,8 +138,9 @@ export class Log {
138138 if ( typeof value === 'object' ) {
139139 const clone = Array . isArray ( value ) ? [ ...value ] : { ...value }
140140
141- // Consolidate property checks into one loop for better performance
142- for ( const key in clone ) {
141+ // Use Object.keys() to iterate only own enumerable properties
142+ const keys = Array . isArray ( clone ) ? clone . keys ( ) : Object . keys ( clone )
143+ for ( const key of keys ) {
143144 // Special case for property named 'token'
144145 if ( key === 'token' && typeof clone [ key ] === 'string' ) {
145146 clone [ key ] = '***'
@@ -150,8 +151,12 @@ export class Log {
150151 if ( typeof clone [ key ] === 'string' && this . #token && clone [ key ] . includes ( this . #token) ) {
151152 clone [ key ] = clone [ key ] . replace ( new RegExp ( this . escapeRegExp ( this . #token) , 'g' ) , '***' )
152153 }
153- // Recursively process nested objects
154+ // Recursively process nested objects, but skip prototype-pollution
155+ // vectors to avoid writing into __proto__/constructor/prototype sinks
154156 else if ( typeof clone [ key ] === 'object' && clone [ key ] !== null ) {
157+ if ( key === '__proto__' || key === 'constructor' || key === 'prototype' ) {
158+ continue
159+ }
155160 clone [ key ] = this . maskSensitive ( clone [ key ] )
156161 }
157162 }
@@ -283,10 +288,10 @@ export class Log {
283288 */
284289 start ( text ) {
285290 const maskedText = this . maskSensitive ( text )
286- if ( this . #isDebug) {
287- this . logInDebugMode ( maskedText )
288- } else if ( this . #spinner) {
291+ if ( this . #spinner) {
289292 this . #spinner. start ( maskedText )
293+ } else if ( this . #logger) {
294+ this . logInDebugMode ( maskedText )
290295 }
291296 }
292297
@@ -305,16 +310,16 @@ export class Log {
305310 const maskedPrefixText = this . maskSensitive ( prefixText )
306311 const maskedSuffixText = this . maskSensitive ( suffixText )
307312
308- if ( this . #isDebug) {
309- const message = [ maskedPrefixText , symbol , maskedText , maskedSuffixText ] . join ( ' ' )
310- this . logInDebugMode ( message )
311- } else if ( this . #spinner) {
313+ if ( this . #spinner) {
312314 this . #spinner. stopAndPersist ( {
313315 symbol,
314316 text : maskedText ,
315317 suffixText : maskedSuffixText ,
316318 prefixText : maskedPrefixText ,
317319 } )
320+ } else if ( this . #logger) {
321+ const message = [ maskedPrefixText , symbol , maskedText , maskedSuffixText ] . join ( ' ' )
322+ this . logInDebugMode ( message )
318323 }
319324 }
320325
@@ -326,10 +331,10 @@ export class Log {
326331 */
327332 fail ( text ) {
328333 const maskedText = this . maskSensitive ( text )
329- if ( this . #isDebug) {
330- this . logInDebugMode ( maskedText , 'error' )
331- } else if ( this . #spinner) {
334+ if ( this . #spinner) {
332335 this . #spinner. fail ( maskedText )
336+ } else if ( this . #logger) {
337+ this . logInDebugMode ( maskedText , 'error' )
333338 }
334339 }
335340
@@ -340,10 +345,10 @@ export class Log {
340345 */
341346 set text ( newText ) {
342347 const maskedText = this . maskSensitive ( newText )
343- if ( this . #isDebug) {
344- this . logInDebugMode ( maskedText )
345- } else if ( this . #spinner) {
348+ if ( this . #spinner) {
346349 this . #spinner. text = maskedText
350+ } else if ( this . #logger) {
351+ this . logInDebugMode ( maskedText )
347352 }
348353 }
349354
0 commit comments