So, for the check I would go for something like that:
```js
ok: (rule) => {
  let url, contentType;
 // if it's an object (not null), `isObject` takes care of that, and is not
// an Array, than we get the `url` and `contentType` props out of it
  if (isObject(rule) && !isArray(rule) {
    ({url, contentType}) = rule;
    // `url` is mandatory except if we specified contentType.
   // In that case we consider "*" as default
    url = !url && contentType ? "*" : url;
  }
  else {
    // if it's not an object, we fall back to the regular value check
    url = rule;   
  }

  let isValidURL = url && [].concat(url).every(isRegExpOrString);
  let isValidContentType = contentType && [].concat(contentType).every(isContentType);

  // `url` is mandatory so has to be valid. That's no true for `contentType`
  return isValidURL && (contentType ? isValidContentType : true)
}
```

It can be probably optimized, and it could be that I missed something too, but that is more or less the approach I suggested.