From c7ec7ce0bba38861596aec75f4cff131b65cf824 Mon Sep 17 00:00:00 2001 From: Brahim Arkni Date: Sat, 24 Oct 2015 16:04:38 +0100 Subject: [PATCH] Util: added isURL method --- docs/util.md | 14 +++++++ gulpfile.babel.js | 2 + src/util.js | 18 ++++++++- test/util.test.js | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) diff --git a/docs/util.md b/docs/util.md index b7d26b4..1ead195 100644 --- a/docs/util.md +++ b/docs/util.md @@ -49,5 +49,19 @@ let resultFalse = isvalid('88075290') // resultFalse => false ``` +## isURL + +Checks for url + +#### Usage +```es6 +import {validate, util} from 'valid.js' + +let isvalid = validate(util.isURL) +let result = isvalid('https://github.com') +// result => true +let resultFalse = isvalid('http://.google.com') +// resultFalse => false +``` . diff --git a/gulpfile.babel.js b/gulpfile.babel.js index f70ec57..36d3b6f 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -20,10 +20,12 @@ gulp.task('browserify', () => { browserify({ entries: './src/validate.js', transform: [babelify, es6ify, deglobalify], + // Generate a UMD bundle for the supplied export name. // This bundle works with other module systems and sets the name // given as a window global if no module system is found. standalone: 'valid.js', + // Enable source maps that allow you to debug your files // separately. debug: true diff --git a/src/util.js b/src/util.js index b033ebe..4814875 100644 --- a/src/util.js +++ b/src/util.js @@ -56,6 +56,21 @@ function isEmail(email) { return string.regex(sValidEmail)(email) } +/** + * Check for URL + * + * Copyright (c) 2010-2013 Diego Perini (http://www.iport.it), MIT licensed + * https://gist.github.com/dperini/729294 + * see also https://mathiasbynens.be/demo/url-regex + * + * @params url + * @return boolean + */ +function isURL(url) { + const regex = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i + return string.regex(regex)(url) +} + /* * Checks for cep * @params cep @@ -71,5 +86,6 @@ function isCep(cep) { export const util = { isRequired: isRequired, isEmail: isEmail, - isCep: isCep + isCep: isCep, + isURL: isURL } diff --git a/test/util.test.js b/test/util.test.js index 3bf6f4e..4a0e7c5 100644 --- a/test/util.test.js +++ b/test/util.test.js @@ -167,4 +167,99 @@ describe('Functions Util', () => { expect(result('9999-999')).to.not.be.ok() }) }) + + describe('#isURL(value)', () => { + it('should match', () => { + let result = validate(util.isURL) + let fixtures = [ + 'http://foo.com/blah_blah', + 'http://foo.com/blah_blah/', + 'http://foo.com/blah_blah_(wikipedia)', + 'http://foo.com/blah_blah_(wikipedia)_(again)', + 'http://www.example.com/wpstyle/?p=364', + 'https://www.example.com/foo/?bar=baz&inga=42&quux', + 'http://✪df.ws/123', + 'http://userid:password@example.com:8080', + 'http://userid:password@example.com:8080/', + 'http://userid@example.com', + 'http://userid@example.com/', + 'http://userid@example.com:8080', + 'http://userid@example.com:8080/', + 'http://userid:password@example.com', + 'http://userid:password@example.com/', + 'http://142.42.1.1/', + 'http://142.42.1.1:8080/', + 'http://➡.ws/䨹', + 'http://⌘.ws', + 'http://⌘.ws/', + 'http://foo.com/blah_(wikipedia)#cite-1', + 'http://foo.com/blah_(wikipedia)_blah#cite-1', + 'http://foo.com/unicode_(✪)_in_parens', + 'http://foo.com/(something)?after=parens', + 'http://☺.damowmow.com/', + 'http://code.google.com/events/#&product=browser', + 'http://j.mp', + 'ftp://foo.bar/baz', + 'http://foo.bar/?q=Test%20URL-encoded%20stuff', + 'http://مثال.إختبار', + 'http://例子.测试', + 'http://उदाहरण.परीक्षा', + 'http://-.~_!$&\'()*+,;=:%40:80%2f::::::@example.com', + 'http://1337.net', + 'http://a.b-c.de', + 'http://www.foo.bar./', + 'http://223.255.255.254' + ] + + fixtures.forEach(el => { + expect(result(el)).to.be.ok() + }) + }) + + it('should not match', () => { + let result = validate(util.isURL) + let fixtures = [ + 'http://', + 'http://.', + 'http://..', + 'http://../', + 'http://?', + 'http://??', + 'http://??/', + 'http://#', + 'http://##', + 'http://##/', + 'http://foo.bar?q=Spaces should be encoded', + '//', + '//a', + '///a', + '///', + 'http:///a', + 'foo.com', + 'rdar://1234', + 'h://test', + 'http:// shouldfail.com', + ':// should fail', + 'http://foo.bar/foo(bar)baz quux', + 'ftps://foo.bar/', + 'http://-error-.invalid/', + 'http://-a.b.co', + 'http://a.b-.co', + 'http://0.0.0.0', + 'http://10.1.1.0', + 'http://10.1.1.255', + 'http://224.1.1.1', + 'http://1.1.1.1.1', + 'http://123.123.123', + 'http://3628126748', + 'http://.www.foo.bar/', + 'http://.www.foo.bar./', + 'http://10.1.1.1' + ] + + fixtures.forEach(el => { + expect(result(el)).to.not.be.ok() + }) + }) + }) })