code: 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;
  }
docs: 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}