186 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			186 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, '__esModule', { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.printIteratorEntries = printIteratorEntries; | ||
|  | exports.printIteratorValues = printIteratorValues; | ||
|  | exports.printListItems = printListItems; | ||
|  | exports.printObjectProperties = printObjectProperties; | ||
|  | 
 | ||
|  | /** | ||
|  |  * 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. | ||
|  |  * | ||
|  |  */ | ||
|  | const getKeysOfEnumerableProperties = object => { | ||
|  |   const keys = Object.keys(object).sort(); | ||
|  | 
 | ||
|  |   if (Object.getOwnPropertySymbols) { | ||
|  |     Object.getOwnPropertySymbols(object).forEach(symbol => { | ||
|  |       if (Object.getOwnPropertyDescriptor(object, symbol).enumerable) { | ||
|  |         keys.push(symbol); | ||
|  |       } | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   return keys; | ||
|  | }; | ||
|  | /** | ||
|  |  * Return entries (for example, of a map) | ||
|  |  * with spacing, indentation, and comma | ||
|  |  * without surrounding punctuation (for example, braces) | ||
|  |  */ | ||
|  | 
 | ||
|  | function printIteratorEntries( // Flow 0.51.0: property `@@iterator` of $Iterator not found in Object
 | ||
|  |   // To allow simplistic getRecordIterator in immutable.js
 | ||
|  |   iterator, | ||
|  |   config, | ||
|  |   indentation, | ||
|  |   depth, | ||
|  |   refs, | ||
|  |   printer, // Too bad, so sad that separator for ECMAScript Map has been ' => '
 | ||
|  |   // What a distracting diff if you change a data structure to/from
 | ||
|  |   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) | ||
|  |  */ | ||
|  | 
 | ||
|  | 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) | ||
|  |  **/ | ||
|  | 
 | ||
|  | 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 + | ||
|  |         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) | ||
|  |  */ | ||
|  | 
 | ||
|  | function printObjectProperties(val, config, indentation, depth, refs, printer) { | ||
|  |   let result = ''; | ||
|  |   const keys = getKeysOfEnumerableProperties(val); | ||
|  | 
 | ||
|  |   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; | ||
|  | } |