code: function hyphenReplace ($0,
    from, fM, fm, fp, fpr, fb,
    to, tM, tm, tp, tpr, tb) {
    if (isX(fM)) {
      from = '';
    } else if (isX(fm)) {
      from = '>=' + fM + '.0.0';
    } else if (isX(fp)) {
      from = '>=' + fM + '.' + fm + '.0';
    } else {
      from = '>=' + from;
    }
  
    if (isX(tM)) {
      to = '';
    } else if (isX(tm)) {
      to = '<' + (+tM + 1) + '.0.0';
    } else if (isX(tp)) {
      to = '<' + tM + '.' + (+tm + 1) + '.0';
    } else if (tpr) {
      to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
    } else {
      to = '<=' + to;
    }
  
    return (from + ' ' + to).trim()
  }
docs: This function is passed to string.replace(re[HYPHENRANGE]) M, m, patch, prerelease, build 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do 1.2 - 3.4 => >=1.2.0 <3.5.0