function create(scheme, credentials, domain, port, path, query, fragment) {
  var uri = new URI(
      encodeIfExists2(scheme, URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_),
      encodeIfExists2(
          credentials, URI_DISALLOWED_IN_SCHEME_OR_CREDENTIALS_),
      encodeIfExists(domain),
      port > 0 ? port.toString() : null,
      encodeIfExists2(path, URI_DISALLOWED_IN_PATH_),
      null,
      encodeIfExists(fragment));
  if (query) {
    if ('string' === typeof query) {
      uri.setRawQuery(query.replace(/[^?&=0-9A-Za-z_\-~.%]/g, encodeOne));
    } else {
      uri.setAllParameters(query);
    }
  }
  return uri;
}
creates a uri from the given parts.

@param scheme {string} an unencoded scheme such as "http" or null
@param credentials {string} unencoded user credentials or null
@param domain {string} an unencoded domain name or null
@param port {number} a port number in [1, 32768].
   -1 indicates no port, as does null.
@param path {string} an unencoded path
@param query {Array.<string>|string|null} a list of unencoded cgi
  parameters where even values are keys and odds the corresponding values
  or an unencoded query.
@param fragment {string} an unencoded fragment without the "#" or null.
@return {URI}