From 20a25a278373d2e7c19e3fc5b204cee7e42c4218 Mon Sep 17 00:00:00 2001 From: Nick Uraltsev Date: Sat, 21 Nov 2015 19:29:53 -0800 Subject: [PATCH] Add isAbsoluteURL helper --- lib/helpers/isAbsoluteURL.js | 14 ++++++++++++++ test/specs/helpers/isAbsoluteURL.spec.js | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 lib/helpers/isAbsoluteURL.js create mode 100644 test/specs/helpers/isAbsoluteURL.spec.js diff --git a/lib/helpers/isAbsoluteURL.js b/lib/helpers/isAbsoluteURL.js new file mode 100644 index 0000000..d33e992 --- /dev/null +++ b/lib/helpers/isAbsoluteURL.js @@ -0,0 +1,14 @@ +'use strict'; + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +module.exports = function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); +}; diff --git a/test/specs/helpers/isAbsoluteURL.spec.js b/test/specs/helpers/isAbsoluteURL.spec.js new file mode 100644 index 0000000..0af4139 --- /dev/null +++ b/test/specs/helpers/isAbsoluteURL.spec.js @@ -0,0 +1,23 @@ +var isAbsoluteURL = require('../../../lib/helpers/isAbsoluteURL'); + +describe('helpers::isAbsoluteURL', function () { + it('should return true if URL begins with valid scheme name', function () { + expect(isAbsoluteURL('https://api.github.com/users')).toBe(true); + expect(isAbsoluteURL('custom-scheme-v1.0://example.com/')).toBe(true); + expect(isAbsoluteURL('HTTP://example.com/')).toBe(true); + }); + + it('should return false if URL begins with invalid scheme name', function () { + expect(isAbsoluteURL('123://example.com/')).toBe(false); + expect(isAbsoluteURL('!valid://example.com/')).toBe(false); + }); + + it('should return true if URL is protocol-relative', function () { + expect(isAbsoluteURL('//example.com/')).toBe(true); + }); + + it('should return false if URL is relative', function () { + expect(isAbsoluteURL('/foo')).toBe(false); + expect(isAbsoluteURL('foo')).toBe(false); + }); +});