--- /dev/null
+/* @flow */
+"use strict";
+
+const parse = require("url").parse;
+
+/**
+ * Get unit from value node
+ *
+ * Returns `null` if the unit is not found.
+ */
+module.exports = function(urlString /*: string*/) /*: ?string*/ {
+ const url = parse(urlString);
+ const protocol = url.protocol;
+ 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;
+};