/**
 * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 */ import type { CompareKeys , Config , Printer , Refs } from './types' ; const getKeysOfEnumerableProperties = ( object , compareKeys ) => { const keys = Object . keys ( object ) . sort ( compareKeys ) ; if ( Object . getOwnPropertySymbols ) { Object . getOwnPropertySymbols ( object ) . forEach ( ( symbol ) => { if ( Object . getOwnPropertyDescriptor ( object , symbol ) ! . enumerable ) { keys . push ( symbol ) ; } } ) ; } return keys as Array < string > ; } ; /**
 * Return entries (for example, of a map)
 * with spacing, indentation, and comma
 * without surrounding punctuation (for example, braces)
 */ export function printIteratorEntries ( iterator , config , indentation , depth , refs , printer , separator = ': ' ) { let result = '' ; let current = iterator . next ( ) ; if ( ! current . done ) { result += config . spacingOuter ; const indentationNext = indentation + config . indent ; while ( ! current . done ) { const name = printer ( current . value [ 0 ] , config , indentationNext , depth , refs ) ; const value = printer ( current . value [ 1 ] , config , indentationNext , depth , refs ) ; result += indentationNext + name + separator + value ; current = iterator . next ( ) ; if ( ! current . done ) { result += ',' + config . spacingInner ; } else if ( ! config . min ) { result += ',' ; } } result += config . spacingOuter + indentation ; } return result ; } /**
 * Return values (for example, of a set)
 * with spacing, indentation, and comma
 * without surrounding punctuation (braces or brackets)
 */ export function printIteratorValues ( iterator , config , indentation , depth , refs , printer ) { let result = '' ; let current = iterator . next ( ) ; if ( ! current . done ) { result += config . spacingOuter ; const indentationNext = indentation + config . indent ; while ( ! current . done ) { result += indentationNext + printer ( current . value , config , indentationNext , depth , refs ) ; current = iterator . next ( ) ; if ( ! current . done ) { result += ',' + config . spacingInner ; } else if ( ! config . min ) { result += ',' ; } } result += config . spacingOuter + indentation ; } return result ; } /**
 * Return items (for example, of an array)
 * with spacing, indentation, and comma
 * without surrounding punctuation (for example, brackets)
 **/ export function printListItems ( list , config , indentation , depth , refs , printer ) { let result = '' ; if ( list . length ) { result += config . spacingOuter ; const indentationNext = indentation + config . indent ; for ( let i = 0 ; i < list . length ; i ++ ) { result += indentationNext ; if ( i in list ) { result += printer ( list [ i ] , config , indentationNext , depth , refs ) ; } if ( i < list . length - 1 ) { result += ',' + config . spacingInner ; } else if ( ! config . min ) { result += ',' ; } } result += config . spacingOuter + indentation ; } return result ; } /**
 * Return properties of an object
 * with spacing, indentation, and comma
 * without surrounding punctuation (for example, braces)
 */ export function printObjectProperties ( val , config , indentation , depth , refs , printer ) { let result = '' ; const keys = getKeysOfEnumerableProperties ( val , config . compareKeys ) ; if ( keys . length ) { result += config . spacingOuter ; const indentationNext = indentation + config . indent ; for ( let i = 0 ; i < keys . length ; i ++ ) { const key = keys [ i ] ; const name = printer ( key , config , indentationNext , depth , refs ) ; const value = printer ( val [ key ] , config , indentationNext , depth , refs ) ; result += indentationNext + name + ': ' + value ; if ( i < keys . length - 1 ) { result += ',' + config . spacingInner ; } else if ( ! config . min ) { result += ',' ; } } result += config . spacingOuter + indentation ; } return result ; }