247 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			247 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, '__esModule', { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = exports.test = exports.serialize = void 0; | ||
|  | 
 | ||
|  | var _collections = require('../collections'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * 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. | ||
|  |  */ | ||
|  | // SENTINEL constants are from https://github.com/facebook/immutable-js
 | ||
|  | const IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@'; | ||
|  | const IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@'; | ||
|  | const IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; | ||
|  | const IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@'; | ||
|  | const IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; | ||
|  | const IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@'; // immutable v4
 | ||
|  | 
 | ||
|  | const IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@'; | ||
|  | const IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@'; | ||
|  | const IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@'; | ||
|  | 
 | ||
|  | const getImmutableName = name => 'Immutable.' + name; | ||
|  | 
 | ||
|  | const printAsLeaf = name => '[' + name + ']'; | ||
|  | 
 | ||
|  | const SPACE = ' '; | ||
|  | const LAZY = '…'; // Seq is lazy if it calls a method like filter
 | ||
|  | 
 | ||
|  | const printImmutableEntries = ( | ||
|  |   val, | ||
|  |   config, | ||
|  |   indentation, | ||
|  |   depth, | ||
|  |   refs, | ||
|  |   printer, | ||
|  |   type | ||
|  | ) => | ||
|  |   ++depth > config.maxDepth | ||
|  |     ? printAsLeaf(getImmutableName(type)) | ||
|  |     : getImmutableName(type) + | ||
|  |       SPACE + | ||
|  |       '{' + | ||
|  |       (0, _collections.printIteratorEntries)( | ||
|  |         val.entries(), | ||
|  |         config, | ||
|  |         indentation, | ||
|  |         depth, | ||
|  |         refs, | ||
|  |         printer | ||
|  |       ) + | ||
|  |       '}'; // Record has an entries method because it is a collection in immutable v3.
 | ||
|  | // Return an iterator for Immutable Record from version v3 or v4.
 | ||
|  | 
 | ||
|  | const getRecordEntries = val => { | ||
|  |   let i = 0; | ||
|  |   return { | ||
|  |     next() { | ||
|  |       if (i < val._keys.length) { | ||
|  |         const key = val._keys[i++]; | ||
|  |         return { | ||
|  |           done: false, | ||
|  |           value: [key, val.get(key)] | ||
|  |         }; | ||
|  |       } | ||
|  | 
 | ||
|  |       return { | ||
|  |         done: true | ||
|  |       }; | ||
|  |     } | ||
|  |   }; | ||
|  | }; | ||
|  | 
 | ||
|  | const printImmutableRecord = ( | ||
|  |   val, | ||
|  |   config, | ||
|  |   indentation, | ||
|  |   depth, | ||
|  |   refs, | ||
|  |   printer | ||
|  | ) => { | ||
|  |   // _name property is defined only for an Immutable Record instance
 | ||
|  |   // which was constructed with a second optional descriptive name arg
 | ||
|  |   const name = getImmutableName(val._name || 'Record'); | ||
|  |   return ++depth > config.maxDepth | ||
|  |     ? printAsLeaf(name) | ||
|  |     : name + | ||
|  |         SPACE + | ||
|  |         '{' + | ||
|  |         (0, _collections.printIteratorEntries)( | ||
|  |           getRecordEntries(val), | ||
|  |           config, | ||
|  |           indentation, | ||
|  |           depth, | ||
|  |           refs, | ||
|  |           printer | ||
|  |         ) + | ||
|  |         '}'; | ||
|  | }; | ||
|  | 
 | ||
|  | const printImmutableSeq = (val, config, indentation, depth, refs, printer) => { | ||
|  |   const name = getImmutableName('Seq'); | ||
|  | 
 | ||
|  |   if (++depth > config.maxDepth) { | ||
|  |     return printAsLeaf(name); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (val[IS_KEYED_SENTINEL]) { | ||
|  |     return ( | ||
|  |       name + | ||
|  |       SPACE + | ||
|  |       '{' + // from Immutable collection of entries or from ECMAScript object
 | ||
|  |       (val._iter || val._object | ||
|  |         ? (0, _collections.printIteratorEntries)( | ||
|  |             val.entries(), | ||
|  |             config, | ||
|  |             indentation, | ||
|  |             depth, | ||
|  |             refs, | ||
|  |             printer | ||
|  |           ) | ||
|  |         : LAZY) + | ||
|  |       '}' | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   return ( | ||
|  |     name + | ||
|  |     SPACE + | ||
|  |     '[' + | ||
|  |     (val._iter || // from Immutable collection of values
 | ||
|  |     val._array || // from ECMAScript array
 | ||
|  |     val._collection || // from ECMAScript collection in immutable v4
 | ||
|  |     val._iterable // from ECMAScript collection in immutable v3
 | ||
|  |       ? (0, _collections.printIteratorValues)( | ||
|  |           val.values(), | ||
|  |           config, | ||
|  |           indentation, | ||
|  |           depth, | ||
|  |           refs, | ||
|  |           printer | ||
|  |         ) | ||
|  |       : LAZY) + | ||
|  |     ']' | ||
|  |   ); | ||
|  | }; | ||
|  | 
 | ||
|  | const printImmutableValues = ( | ||
|  |   val, | ||
|  |   config, | ||
|  |   indentation, | ||
|  |   depth, | ||
|  |   refs, | ||
|  |   printer, | ||
|  |   type | ||
|  | ) => | ||
|  |   ++depth > config.maxDepth | ||
|  |     ? printAsLeaf(getImmutableName(type)) | ||
|  |     : getImmutableName(type) + | ||
|  |       SPACE + | ||
|  |       '[' + | ||
|  |       (0, _collections.printIteratorValues)( | ||
|  |         val.values(), | ||
|  |         config, | ||
|  |         indentation, | ||
|  |         depth, | ||
|  |         refs, | ||
|  |         printer | ||
|  |       ) + | ||
|  |       ']'; | ||
|  | 
 | ||
|  | const serialize = (val, config, indentation, depth, refs, printer) => { | ||
|  |   if (val[IS_MAP_SENTINEL]) { | ||
|  |     return printImmutableEntries( | ||
|  |       val, | ||
|  |       config, | ||
|  |       indentation, | ||
|  |       depth, | ||
|  |       refs, | ||
|  |       printer, | ||
|  |       val[IS_ORDERED_SENTINEL] ? 'OrderedMap' : 'Map' | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (val[IS_LIST_SENTINEL]) { | ||
|  |     return printImmutableValues( | ||
|  |       val, | ||
|  |       config, | ||
|  |       indentation, | ||
|  |       depth, | ||
|  |       refs, | ||
|  |       printer, | ||
|  |       'List' | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (val[IS_SET_SENTINEL]) { | ||
|  |     return printImmutableValues( | ||
|  |       val, | ||
|  |       config, | ||
|  |       indentation, | ||
|  |       depth, | ||
|  |       refs, | ||
|  |       printer, | ||
|  |       val[IS_ORDERED_SENTINEL] ? 'OrderedSet' : 'Set' | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (val[IS_STACK_SENTINEL]) { | ||
|  |     return printImmutableValues( | ||
|  |       val, | ||
|  |       config, | ||
|  |       indentation, | ||
|  |       depth, | ||
|  |       refs, | ||
|  |       printer, | ||
|  |       'Stack' | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (val[IS_SEQ_SENTINEL]) { | ||
|  |     return printImmutableSeq(val, config, indentation, depth, refs, printer); | ||
|  |   } // For compatibility with immutable v3 and v4, let record be the default.
 | ||
|  | 
 | ||
|  |   return printImmutableRecord(val, config, indentation, depth, refs, printer); | ||
|  | }; // Explicitly comparing sentinel properties to true avoids false positive
 | ||
|  | // when mock identity-obj-proxy returns the key as the value for any key.
 | ||
|  | 
 | ||
|  | exports.serialize = serialize; | ||
|  | 
 | ||
|  | const test = val => | ||
|  |   val && | ||
|  |   (val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true); | ||
|  | 
 | ||
|  | exports.test = test; | ||
|  | const plugin = { | ||
|  |   serialize, | ||
|  |   test | ||
|  | }; | ||
|  | var _default = plugin; | ||
|  | exports.default = _default; |