| 'use strict'; |
| |
| const { URL } = require('url'); |
| |
| /** |
| * Get unit from value node |
| * |
| * Returns `null` if the unit is not found. |
| * |
| * @param {string} urlString |
| */ |
| module.exports = function (urlString) { |
| let protocol = null; |
| |
| try { |
| protocol = new URL(urlString).protocol; |
| } catch { |
| return null; |
| } |
| |
| if (protocol === null || typeof protocol === 'undefined') { |
| return null; |
| } |
| |
| const scheme = protocol.slice(0, -1); // strip trailing `:` |
| |
| // The URL spec does not require a scheme to be followed by `//`, but checking |
| // for it allows this rule to differentiate <scheme>:<hostname> urls from |
| // <hostname>:<port> urls. `data:` scheme urls are an exception to this rule. |
| const slashIndex = protocol.length; |
| const expectedSlashes = urlString.slice(slashIndex, slashIndex + 2); |
| const isSchemeLessUrl = expectedSlashes !== '//' && scheme !== 'data'; |
| |
| if (isSchemeLessUrl) { |
| return null; |
| } |
| |
| return scheme; |
| }; |