- From: Haroen Viaene <notifications@github.com>
- Date: Mon, 27 Nov 2017 17:46:24 +0000 (UTC)
- To: whatwg/url <url@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/url/issues/354/347264401@github.com>
I've been thinking a bit, and I think it would make sense to go from broad (href), to more specific (hostname). That way every time you add a more specific key, it will override what you specified earlier. A naive implementation would be this: ```js const { URL, URLSearchParams } = require('url'); function createURL( { hash, host, hostname, href, origin, password, pathname, port, protocol, search, searchParams, username, } = {} ) { const defaultHref = href !== undefined ? href : protocol !== undefined && (host !== undefined || origin !== undefined || hostname !== undefined) ? `${protocol}//${host || origin || hostname}` : undefined; const url = new URL(defaultHref); // everything if (href !== undefined) { url.href = href; } // hostname : port if (host !== undefined) { url.host = host; } // protocol // hostname : port if (origin !== undefined) { url.origin = origin; } if (hostname !== undefined) { url.hostname = hostname; } // only visible in href if (password !== undefined) { url.password = password; } if (username !== undefined) { url.username = username; } if (port !== undefined) { url.port = port; } if (pathname !== undefined) { url.pathname = pathname; } // includes : if (protocol !== undefined) { url.protocol = protocol; } // includes # if (hash !== undefined) { url.hash = hash; } // let's say searchParams overrides search // includes ? if (search !== undefined) { url.search = search; } if (searchParams !== undefined) { // this overrides url.search = searchParams; } return url; } ``` You can then use it like this: ``` const url = createURL({ href: 'ftp://google.com', protocol: 'https:', origin: 'github.com', host: 'morespecific.com:20', hostname: 'mostspecific.fr', pathname: '/whatwg/url/search', hash: '#haha', port: 800, search: '?not-specific-enough', searchParams: new URLSearchParams({ utf8: '✓', q: 'test', type: undefined, cool: ['turbo', 'aaaa'], q: JSON.stringify({ overkill: 'true', cool: 'no', }), }), username: 'anon', password: 'hunter12', }); ``` This would return ```jsURL { href: 'https://anon:hunter12@mostspecific.fr:800/whatwg/url/search?utf8=%E2%9C%93&q=%7B%22overkill%22%3A%22true%22%2C%22cool%22%3A%22no%22%7D&type=undefined&cool=turbo%2Caaaa#haha', origin: 'https://mostspecific.fr:800', protocol: 'https:', username: 'anon', password: 'hunter12', host: 'mostspecific.fr:800', hostname: 'mostspecific.fr', port: '800', pathname: '/whatwg/url/search', search: '?utf8=%E2%9C%93&q=%7B%22overkill%22%3A%22true%22%2C%22cool%22%3A%22no%22%7D&type=undefined&cool=turbo%2Caaaa', searchParams: URLSearchParams { 'utf8' => '✓', 'q' => '{"overkill":"true","cool":"no"}', 'type' => 'undefined', 'cool' => 'turbo,aaaa' }, hash: '#haha' } ``` It will throw when none of the minimal `defaultHref` items are available. In order that is: 1. no href 2. no protocol and no host 2. no protocol and no origin 2. no protocol and no hostname This will (now) throw an error with `undefined` not being a correct URL, but that can be replaced with an error with what you entered. Am I on the right track? -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/whatwg/url/issues/354#issuecomment-347264401
Received on Monday, 27 November 2017 17:46:56 UTC