Code coverage report for src/util/SymbolShim.ts

Statements: 94.59% (35 / 37)      Branches: 90.48% (19 / 21)      Functions: 100% (5 / 5)      Lines: 93.75% (30 / 32)      Ignored: none     

All files » src/util/ » SymbolShim.ts
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 47 48 49 50 51 52 53 54 55 561   1 6 6 6 6     1 6 3       6     1 7     1 9 7 5 2   1 1   1 1 12 12 1 1                 1 6 5 5             1
import {root} from './root';
 
export function polyfillSymbol(root) {
  const Symbol = ensureSymbol(root);
  ensureIterator(Symbol, root);
  ensureObservable(Symbol);
  return Symbol;
}
 
export function ensureSymbol(root) {
  if (!root.Symbol) {
    root.Symbol = {
      for: symbolForPolyfill
    };
  }
  return root.Symbol;
}
 
export function symbolForPolyfill(key) {
  return '@@' + key;
}
 
export function ensureIterator(Symbol, root) {
  if (!Symbol.iterator) {
    if (typeof Symbol.for === 'function') {
      Symbol.iterator = Symbol.for('iterator');
    } else if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {
      // Bug for mozilla version
      Symbol.iterator = '@@iterator';
    } else Eif (root.Map) {
      // es6-shim specific logic
      let keys = Object.getOwnPropertyNames(root.Map.prototype);
      for (let i = 0; i < keys.length; ++i) {
        let key = keys[i];
        if (key !== 'entries' && key !== 'size' && root.Map.prototype[key] === root.Map.prototype['entries']) {
          Symbol.iterator = key;
          break;
        }
      }
    } else {
      Symbol.iterator = '@@iterator';
    }
  }
}
 
export function ensureObservable(Symbol) {
  if (!Symbol.observable) {
    Eif (typeof Symbol.for === 'function') {
      Symbol.observable = Symbol.for('observable');
    } else {
      Symbol.observable = '@@observable';
    }
  }
}
 
export const SymbolShim = polyfillSymbol(root);