all files / src/ tag.js

100% Statements 38/38
100% Branches 18/18
100% Functions 5/5
100% Lines 18/18
7 statements, 6 branches Ignored     
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46                                         19×     160× 160× 144×   16×   14×     49× 49×   49×    
import * as gen from './generators';
 
const TYPE_POSITION_IN_TAG = 8;
 
const tagMap = {
  '[object Null]': gen.LEAF,
  '[object Undefined]': gen.LEAF,
  '[object Boolean]': gen.LEAF,
  '[object Number]': gen.LEAF,
  '[object String]': gen.LEAF, // strings are excluded although they are iterable
  '[object Symbol]': gen.LEAF,
  '[object Date]': gen.LEAF,
  '[object RegExp]': gen.LEAF,
  '[object Function]': gen.LEAF,
  '[object GeneratorFunction]': gen.LEAF,
  '[object Promise]': gen.LEAF,
  '[object Array]': gen.arrayIterator,
  '[object Set]': gen.genericIterator,
  '[object Map]': gen.mapIterator,
  '[object UserDefinedIterable]': gen.genericIterator,
  '[object NonIterableObject]': gen.objectIterator
};
 
export function getTypeFromTag(tag) {
  return tag.slice(TYPE_POSITION_IN_TAG, tag.length - 1);
}
 
export function getTag(element) {
  const stringTag = Object.prototype.toString.call(element);
  if (stringTag in tagMap) {
    return stringTag;
  }
  if (typeof element[Symbol.iterator] === 'function') {
    return '[object UserDefinedIterable]';
  }
  return '[object NonIterableObject]';
}
 
export function getTagMap(config) {
  const myTagMap = Object.create(tagMap);
  if (!config.iterateOverObject) {
    myTagMap['[object NonIterableObject]'] = gen.LEAF;
  }
  return myTagMap;
}