59 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "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;
 |