11"use strict" ;
22Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
33const jsonTypes = new Set ( [ String , Number , Boolean , Date ] ) ;
4- function toObject ( obj ) {
5- const result = { } ;
6- for ( const key in obj ) {
7- /*istanbul ignore else*/
8- if ( { } . hasOwnProperty . call ( obj , key ) )
9- result [ key ] = obj [ key ] ;
10- }
11- return result ;
12- }
4+ /**
5+ * Converts a byte to a 2-digit hexadecimal string
6+ * @param n The byte value
7+ * @return `n` with a possible leading 0
8+ */
9+ exports . hexByte = ( n ) => ( n < 16 ? '0' : '' ) + n . toString ( 16 ) ;
1310/**
1411 * A simple replacement for `util.inspect()`.
15- * Makes little effort at readability,
16- * and cannot handle circular values.
12+ * Makes little effort at readability.
1713 * Useful for generating more detailed
1814 * error messages, and so that the client-side
1915 * code doesn't need to pack `util` as a dependency.
2016 * @param obj The value to inspect
2117 * @return A string expressing the given value
2218 */
2319function inspect ( obj ) {
24- return inspectWithSeen ( obj , new Map ) ;
20+ return inspectWithSeen ( obj , new Set ) ;
2521}
2622exports . inspect = inspect ;
2723function inspectWithSeen ( obj , seen ) {
@@ -32,84 +28,69 @@ function inspectWithSeen(obj, seen) {
3228 if ( obj instanceof ArrayBuffer ) {
3329 const castBuffer = new Uint8Array ( obj ) ;
3430 let result = '[' ;
35- for ( const b of castBuffer ) {
36- if ( result !== '[' )
31+ for ( let i = 0 ; i < castBuffer . length ; i ++ ) {
32+ if ( i )
3733 result += ', ' ;
38- result += '0x' + ( b < 16 ? '0' : '' ) + b . toString ( 16 ) ;
34+ result += '0x' + exports . hexByte ( castBuffer [ i ] ) ;
3935 }
4036 return result + ']' ;
4137 }
4238 //tslint:disable-next-line:strict-type-predicates
4339 if ( typeof Buffer !== 'undefined' && obj instanceof Buffer ) {
4440 let result = '<Buffer' ;
4541 for ( const b of obj )
46- result += ' ' + ( b < 16 ? '0' : '' ) + b . toString ( 16 ) ;
42+ result += ' ' + exports . hexByte ( b ) ;
4743 return result + '>' ;
4844 }
4945 if ( obj instanceof Function ) {
5046 return 'Function ' + obj . name ;
5147 }
5248 //obj might have circular references
53- if ( seen . get ( obj ) )
49+ if ( seen . has ( obj ) )
5450 return '[Circular]' ;
55- else
56- seen . set ( obj , 1 ) ;
51+ seen . add ( obj ) ;
52+ let firstElement = true ;
5753 if ( obj instanceof Set ) {
5854 let result = 'Set {' ;
59- const iterator = obj . values ( ) ;
60- let value = iterator . next ( ) ;
61- while ( ! value . done ) {
62- result += inspectWithSeen ( value . value , seen ) ;
63- value = iterator . next ( ) ;
64- if ( ! value . done )
55+ for ( const value of obj ) {
56+ if ( firstElement )
57+ firstElement = false ;
58+ else
6559 result += ', ' ;
60+ result += inspectWithSeen ( value , seen ) ;
6661 }
67- seen . set ( obj , seen . get ( obj ) - 1 ) ;
62+ seen . delete ( obj ) ;
6863 return result + '}' ;
6964 }
7065 if ( obj instanceof Map ) {
7166 let result = 'Map {' ;
72- const iterator = obj . entries ( ) ;
73- let value = iterator . next ( ) ;
74- while ( ! value . done ) {
75- result += inspectWithSeen ( value . value [ 0 ] , seen ) ;
76- result += ' => ' ;
77- result += inspectWithSeen ( value . value [ 1 ] , seen ) ;
78- value = iterator . next ( ) ;
79- if ( ! value . done )
67+ for ( const [ key , value ] of obj ) {
68+ if ( firstElement )
69+ firstElement = false ;
70+ else
8071 result += ', ' ;
72+ result += inspectWithSeen ( key , seen ) + ' => ' + inspectWithSeen ( value , seen ) ;
8173 }
82- seen . set ( obj , seen . get ( obj ) - 1 ) ;
74+ seen . delete ( obj ) ;
8375 return result + '}' ;
8476 }
8577 if ( obj instanceof Array ) {
86- let result = '[' ;
87- const iterator = obj [ Symbol . iterator ] ( ) ;
88- let value = iterator . next ( ) ;
89- while ( ! value . done ) {
90- result += inspectWithSeen ( value . value , seen ) ;
91- value = iterator . next ( ) ;
92- if ( ! value . done )
93- result += ', ' ;
94- }
95- seen . set ( obj , seen . get ( obj ) - 1 ) ;
96- return result + ']' ;
78+ const result = `[${ obj . map ( item => inspectWithSeen ( item , seen ) ) . join ( ', ' ) } ]` ;
79+ seen . delete ( obj ) ;
80+ return result ;
9781 }
98- if ( obj . constructor === Object ) { //as opposed to a subclass of Object
99- let result = '{' ;
100- for ( const key in obj ) {
101- /*istanbul ignore else*/
102- if ( { } . hasOwnProperty . call ( obj , key ) ) {
103- if ( result !== '{' )
104- result += ', ' ;
105- result += key + ': ' + inspectWithSeen ( obj [ key ] , seen ) ;
106- }
82+ const { name } = obj . constructor ;
83+ let objectResult = `${ name && name !== 'Object' ? name + ' ' : '' } {` ;
84+ for ( const key in obj ) {
85+ /*istanbul ignore else*/
86+ if ( { } . hasOwnProperty . call ( obj , key ) ) {
87+ if ( firstElement )
88+ firstElement = false ;
89+ else
90+ objectResult += ', ' ;
91+ objectResult += key + ': ' + inspectWithSeen ( obj [ key ] , seen ) ;
10792 }
108- seen . set ( obj , seen . get ( obj ) - 1 ) ;
109- return result + '}' ;
11093 }
111- const { name } = obj . constructor ;
112- const genericResult = ( name ? name + ' ' : '' ) + inspectWithSeen ( toObject ( obj ) , seen ) ;
113- seen . set ( obj , seen . get ( obj ) - 1 ) ;
114- return genericResult ;
94+ seen . delete ( obj ) ;
95+ return objectResult + '}' ;
11596}
0 commit comments