import { Next , ToString } from "./types" ; import { quoteKey } from "./quote" ; import { USED_METHOD_KEY } from "./function" ; import { arrayToString } from "./array" ; /**
 * Transform an object into a string.
 */ export const objectToString = ( value , space , next , key ) => { if ( typeof Buffer === "function" && Buffer . isBuffer ( value ) ) { return `Buffer.from(${ next ( value . toString ( "base64" ) ) }, 'base64')` ; } if ( typeof global === "object" && value === global ) { return globalToString ( value , space , next , key ) ; } const toString = OBJECT_TYPES [ Object . prototype . toString . call ( value ) ] ; return toString ? toString ( value , space , next , key ) : undefined ; } ; /**
 * Stringify an object of keys and values.
 */ const rawObjectToString = ( obj , indent , next , key ) => { const eol = indent ? "\n" : "" ; const space = indent ? " " : "" ; const values = Object . keys ( obj ) . reduce ( function ( values , key ) { const fn = obj [ key ] ; const result = next ( fn , key ) ; if ( result === undefined ) return values ; const value = result . split ( "\n" ) . join ( `\n${ indent }` ) ; if ( USED_METHOD_KEY . has ( fn ) ) { values . push ( `${ indent }${ value }` ) ; return values ; } values . push ( `${ indent }${ quoteKey ( key , next ) }:${ space }${ value }` ) ; return values ; } , [ ] as string [ ] ) . join ( `,${ eol }` ) ; if ( values === "" ) return "{}" ; return `{${ eol }${ values }${ eol }}` ; } ; /**
 * Stringify global variable access.
 */ const globalToString = ( value , space , next ) => { return `Function(${ next ( "return this" ) })()` ; } ; /**
 * Convert JavaScript objects into strings.
 */ const OBJECT_TYPES = { "[object Array]" : arrayToString , "[object Object]" : rawObjectToString , "[object Error]" : ( error , space , next ) => { return `new Error(${ next ( error . message ) })` ; } , "[object Date]" : ( date ) => { return `new Date(${ date . getTime ( ) })` ; } , "[object String]" : ( str , space , next ) => { return `new String(${ next ( str . toString ( ) ) })` ; } , "[object Number]" : ( num ) => { return `new Number(${ num })` ; } , "[object Boolean]" : ( bool ) => { return `new Boolean(${ bool })` ; } , "[object Set]" : ( set , space , next ) => { return `new Set(${ next ( Array . from ( set ) ) })` ; } , "[object Map]" : ( map , space , next ) => { return `new Map(${ next ( Array . from ( map ) ) })` ; } , "[object RegExp]" : String , "[object global]" : globalToString , "[object Window]" : globalToString , } ;