lib/rules/rules.js
function join(first, second) {
  if (!first || !second) {
    return first + second;
  }

  var firstIndex = first.indexOf('?');
  var secondIndex = second.indexOf('?');
  var firstQuery = '';
  var secondQuery = '';

  if (firstIndex != -1) {
    firstQuery = first.substring(firstIndex);
    first = first.substring(0, firstIndex);
  }

  if (secondIndex != -1) {
    secondQuery = second.substring(secondIndex);
    second = second.substring(0, secondIndex);
  }

  var query = firstQuery && secondQuery ? firstQuery + secondQuery.substring(1) : (firstQuery || secondQuery);
  if (second) {
    var lastIndex = first.length - 1;
    var startWithSep = isPathSeparator(second[0]);
    if (isPathSeparator(first[lastIndex])) {
      first = startWithSep ? first.substring(0, lastIndex) + second : first + second;
    } else {
      first = first + (startWithSep ? '' : '/') + second;
    }
  }

  return WEB_PROTOCOL_RE.test(first) ? formatUrl(first + query) : first + query;
}
function join(first, second) {
  if (!first || !second) {
    return first + second;
  }

  var firstIndex = first.indexOf('?');
  var secondIndex = second.indexOf('?');
  var firstQuery = '';
  var secondQuery = '';

  if (firstIndex != -1) {
    firstQuery = first.substring(firstIndex);
    first = first.substring(0, firstIndex);
  }

  if (secondIndex != -1) {
    secondQuery = second.substring(secondIndex);
    second = second.substring(0, secondIndex);
  }

  var query = firstQuery && secondQuery ? firstQuery + secondQuery.substring(1) : (firstQuery || secondQuery);
  if (second) {
    var lastIndex = first.length - 1;
    var startWithSep = isPathSeparator(second[0]);
    if (isPathSeparator(first[lastIndex])) {
      first = startWithSep ? first.substring(0, lastIndex) + second : first + second;
    } else {
      first = first + (startWithSep ? '' : '/') + second;
    }
  }

  return WEB_PROTOCOL_RE.test(first) ? formatUrl(first + query) : first + query;
}
function join ( first , second ) { if ( ! first || ! second ) { return first + second ; } var firstIndex = first . indexOf ( '?' ) ; var secondIndex = second . indexOf ( '?' ) ; var firstQuery = '' ; var secondQuery = '' ; if ( firstIndex != - 1 ) { firstQuery = first . substring ( firstIndex ) ; first = first . substring ( 0 , firstIndex ) ; } if ( secondIndex != - 1 ) { secondQuery = second . substring ( secondIndex ) ; second = second . substring ( 0 , secondIndex ) ; } var query = firstQuery && secondQuery ? firstQuery + secondQuery . substring ( 1 ) : ( firstQuery || secondQuery ) ; if ( second ) { var lastIndex = first . length - 1 ; var startWithSep = isPathSeparator ( second [ 0 ] ) ; if ( isPathSeparator ( first [ lastIndex ] ) ) { first = startWithSep ? first . substring ( 0 , lastIndex ) + second : first + second ; } else { first = first + ( startWithSep ? '' : '/' ) + second ; } } return WEB_PROTOCOL_RE . test ( first ) ? formatUrl ( first + query ) : first + query ; }
first: xxxx, xxxx?, xxx?xxxx
second: ?xxx, xxx?xxxx
@param first
@param second
@returns
first : xxxx xxxx? xxx?xxxx second : ?xxx xxx?xxxx