async function sanitize(uri, options) {
    options = extend({}, this.options, options);
    const fileAccess = this.fileAccess,
      result = {
        href: null
      };
    let isFile, loadFile, base;
    const isAllowed = allowed_re.test(uri.replace(whitespace_re, ''));
    if (uri == null || typeof uri !== 'string' || !isAllowed) {
      error('Sanitize failure, invalid URI: ' + $(uri));
    }
    const hasProtocol = protocol_re.test(uri);

    // if relative url (no protocol/host), prepend baseURL
    if ((base = options.baseURL) && !hasProtocol) {
      // Ensure that there is a slash between the baseURL (e.g. hostname) and url
      if (!uri.startsWith('/') && !base.endsWith('/')) {
        uri = '/' + uri;
      }
      uri = base + uri;
    }

    // should we load from file system?
    loadFile = (isFile = uri.startsWith(fileProtocol)) || options.mode === 'file' || options.mode !== 'http' && !hasProtocol && fileAccess;
    if (isFile) {
      // strip file protocol
      uri = uri.slice(fileProtocol.length);
    } else if (uri.startsWith('//')) {
      if (options.defaultProtocol === 'file') {
        // if is file, strip protocol and set loadFile flag
        uri = uri.slice(2);
        loadFile = true;
      } else {
        // if relative protocol (starts with '//'), prepend default protocol
        uri = (options.defaultProtocol || 'http') + ':' + uri;
      }
    }

    // set non-enumerable mode flag to indicate local file load
    Object.defineProperty(result, 'localFile', {
      value: !!loadFile
    });

    // set uri
    result.href = uri;

    // set default result target, if specified
    if (options.target) {
      result.target = options.target + '';
    }

    // set default result rel, if specified (#1542)
    if (options.rel) {
      result.rel = options.rel + '';
    }

    // provide control over cross-origin image handling (#2238)
    // https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image
    if (options.context === 'image' && options.crossOrigin) {
      result.crossOrigin = options.crossOrigin + '';
    }

    // return
    return result;
  }
URI sanitizer function.
@param {string} uri - The uri (url or filename) to check.
@param {object} options - An options hash.
@return {Promise} - A promise that resolves to an object containing
 sanitized uri data, or rejects it the input uri is deemed invalid.
 The properties of the resolved object are assumed to be
 valid attributes for an HTML 'a' tag. The sanitized uri *must* be
 provided by the 'href' property of the returned object.