function convertFieldMapToKeyRange(filter, keyPaths) {
  let isOtherFormOfFilter =
      !(filter instanceof Object) ||
      (filter instanceof Function) ||
      (filter instanceof Array) ||
      (filter instanceof Date) ||
      (filter instanceof IDBKeyRange)
  if (isOtherFormOfFilter) {
    return null
  }

  if (!(keyPaths instanceof Array)) {
    keyPaths = [keyPaths]
  }

  let fieldPaths = getFieldPaths(filter)
  if (!fieldPaths) {
    return null
  }

  let isKeyFilter =
      (fieldPaths.length === keyPaths.length) &&
      fieldPaths.every(path => keyPaths.indexOf(path) > -1)
  if (!isKeyFilter) {
    return null
  }

  if (keyPaths.length === 1) {
    return IDBKeyRange.only(getFieldValue(filter, keyPaths[0]))
  }

  return new IDBKeyRange.only(keyPaths.map((keyPath) => {
    getFieldValue(filter, keyPath)
  }))
}
function convertFieldMapToKeyRange(filter, keyPaths) {
  let isOtherFormOfFilter =
      !(filter instanceof Object) ||
      (filter instanceof Function) ||
      (filter instanceof Array) ||
      (filter instanceof Date) ||
      (filter instanceof IDBKeyRange)
  if (isOtherFormOfFilter) {
    return null
  }

  if (!(keyPaths instanceof Array)) {
    keyPaths = [keyPaths]
  }

  let fieldPaths = getFieldPaths(filter)
  if (!fieldPaths) {
    return null
  }

  let isKeyFilter =
      (fieldPaths.length === keyPaths.length) &&
      fieldPaths.every(path => keyPaths.indexOf(path) > -1)
  if (!isKeyFilter) {
    return null
  }

  if (keyPaths.length === 1) {
    return IDBKeyRange.only(getFieldValue(filter, keyPaths[0]))
  }

  return new IDBKeyRange.only(keyPaths.map((keyPath) => {
    getFieldValue(filter, keyPath)
  }))
}
function convertFieldMapToKeyRange ( filter , keyPaths ) { let isOtherFormOfFilter = ! ( filter instanceof Object ) || ( filter instanceof Function ) || ( filter instanceof Array ) || ( filter instanceof Date ) || ( filter instanceof IDBKeyRange ) if ( isOtherFormOfFilter ) { return null } if ( ! ( keyPaths instanceof Array ) ) { keyPaths = [ keyPaths ] } let fieldPaths = getFieldPaths ( filter ) if ( ! fieldPaths ) { return null } let isKeyFilter = ( fieldPaths . length === keyPaths . length ) && fieldPaths . every ( path => keyPaths . indexOf ( path ) > - 1 ) if ( ! isKeyFilter ) { return null } if ( keyPaths . length === 1 ) { return IDBKeyRange . only ( getFieldValue ( filter , keyPaths [ 0 ] ) ) } return new IDBKeyRange . only ( keyPaths . map ( ( keyPath ) => { getFieldValue ( filter , keyPath ) } ) ) }
Attempts to convert the provided filter to a single {@codelink IDBKeyRange}
instance.

The conversion is only possible if the filter is a field map filter, field
paths in the object match the provided key paths exactly, and the filter
does not have a field set to an {@codelink IDBKeyRange} instance.

@param {?(undefined|number|string|Date|Array|IDBKeyRange|Object<string, (number|string|Date|Array|IDBKeyRange)>|function(*, (number|string|Date|Array), (number|string|Date|Array)): boolean)} filter
The filter to convert.
@param {(string|string[])} keyPaths The field paths representing the key in
this storage.
@return {?IDBKeyRange} The filter represented as a single
{@linkcode IDBKeyRange} instance, or {@code null} if the conversion
is not possible.
Attempts to convert the provided filter to a single { @codelink IDBKeyRange } instance .