All files / src/utils parseSrcset.js

95.45% Statements 21/22
85.71% Branches 18/21
100% Functions 1/1
100% Lines 20/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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    6x 5x   5x   5x 15x   15x 5x     15x   15x 5x     10x   10x   2x   8x 8x 8x 3x 5x 5x         5x    
// @flow
export default function parseSrcset(srcset: string) {
  const sSources = srcset.match(/\s*(?:[\S]*)(?:\s+(?:-?(?:\d+(?:\.(?:\d+)?)?|\.\d+)[a-zA-Z]))?(?:\s*,)?/g);
  Iif (!Array.isArray(sSources)) throw new Error(`💩 srcset is invalid ${JSON.stringify(sSources, null, 2)}`);
 
  const sources = [];
 
  for (let i = 0; i < sSources.length; i += 1) {
    let sSource = sSources[i].trim();
 
    if (sSource.substr(-1) === ',') {
      sSource = sSource.substr(0, sSource.length - 1).trim();
    }
 
    const parts = sSource.split(/\s+/, 2);
 
    if (parts.length === 0 || (parts.length === 1 && !parts[0]) || (parts.length === 2 && !parts[0] && !parts[1])) {
      continue; // eslint-disable-line no-continue
    }
 
    const url = parts[0];
 
    if (parts.length === 1 || (parts.length === 2 && !parts[1])) {
      // If no "w" or "x" specified, we assume it's "1x".
      sources.push({ url, width: undefined, dpr: 1 });
    } else {
      const spec = parts[1].toLowerCase();
      const lastChar = spec.substring(spec.length - 1);
      if (lastChar === 'w') {
        sources.push({ url, width: parseFloat(spec), dpr: undefined });
      } else Eif (lastChar === 'x') {
        sources.push({ url, width: undefined, dpr: parseFloat(spec) });
      }
    }
  }
 
  return sources;
}