|
@@ -0,0 +1,58 @@
|
|
|
+"use strict";
|
|
|
+const hasToStringTag = require("has-to-string-tag-x");
|
|
|
+const isObject = require("is-object");
|
|
|
+
|
|
|
+const toString = Object.prototype.toString;
|
|
|
+const urlClass = "[object URL]";
|
|
|
+
|
|
|
+const hash = "hash";
|
|
|
+const host = "host";
|
|
|
+const hostname = "hostname";
|
|
|
+const href = "href";
|
|
|
+const password = "password";
|
|
|
+const pathname = "pathname";
|
|
|
+const port = "port";
|
|
|
+const protocol = "protocol";
|
|
|
+const search = "search";
|
|
|
+const username = "username";
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+const isURL = (url, supportIncomplete/*=false*/) =>
|
|
|
+{
|
|
|
+ if (!isObject(url)) return false;
|
|
|
+
|
|
|
+ // Native implementation in older browsers
|
|
|
+ if (!hasToStringTag && toString.call(url) === urlClass) return true;
|
|
|
+
|
|
|
+ if (!(href in url)) return false;
|
|
|
+ if (!(protocol in url)) return false;
|
|
|
+ if (!(username in url)) return false;
|
|
|
+ if (!(password in url)) return false;
|
|
|
+ if (!(hostname in url)) return false;
|
|
|
+ if (!(port in url)) return false;
|
|
|
+ if (!(host in url)) return false;
|
|
|
+ if (!(pathname in url)) return false;
|
|
|
+ if (!(search in url)) return false;
|
|
|
+ if (!(hash in url)) return false;
|
|
|
+
|
|
|
+ if (supportIncomplete !== true)
|
|
|
+ {
|
|
|
+ if (!isObject(url.searchParams)) return false;
|
|
|
+
|
|
|
+ // TODO :: write a separate isURLSearchParams ?
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+isURL.lenient = url =>
|
|
|
+{
|
|
|
+ return isURL(url, true);
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+module.exports = isURL;
|