From bedc70ba82b15e5115c292aa913c20fba43c8c09 Mon Sep 17 00:00:00 2001 From: Szymon Marczak <36894700+szmarczak@users.noreply.github.com> Date: Sun, 2 Sep 2018 14:10:41 +0200 Subject: [PATCH 1/8] Remove useless RegExp dot escape in `[]` --- index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/index.js b/index.js index ce70108..2d6a8bb 100644 --- a/index.js +++ b/index.js @@ -99,8 +99,7 @@ module.exports = (urlString, opts) => { urlObj.hostname = urlObj.hostname.replace(/\.$/, ''); // Remove `www.` - // eslint-disable-next-line no-useless-escape - if (opts.stripWWW && /^www\.([a-z\-\d]{2,63})\.([a-z\.]{2,5})$/.test(urlObj.hostname)) { + if (opts.stripWWW && /^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(urlObj.hostname)) { // Each label should be max 63 at length (min: 2). // The extension should be max 5 at length (min: 2). // Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names From 8fbf9110d023c7b6e04f12a185a150b02b6f2120 Mon Sep 17 00:00:00 2001 From: Mathieu M-Gosselin Date: Tue, 30 Oct 2018 13:32:46 -0400 Subject: [PATCH 2/8] Fix readme examples for `forceHttp` and `forceHttps` (#73) --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index d051aaf..b45b31f 100644 --- a/readme.md +++ b/readme.md @@ -70,7 +70,7 @@ Normalizes `https:` URLs to `http:`. normalizeUrl('https://sindresorhus.com:80/'); //=> 'https://sindresorhus.com' -normalizeUrl('https://sindresorhus.com:80/', {normalizeHttps: true}); +normalizeUrl('https://sindresorhus.com:80/', {forceHttp: true}); //=> 'http://sindresorhus.com' ``` @@ -85,7 +85,7 @@ Normalizes `http:` URLs to `https:`. normalizeUrl('https://sindresorhus.com:80/'); //=> 'https://sindresorhus.com' -normalizeUrl('http://sindresorhus.com:80/', {normalizeHttp: true}); +normalizeUrl('http://sindresorhus.com:80/', {forceHttps: true}); //=> 'https://sindresorhus.com' ``` From 211322b339ce38918ce1a587c1a5f4b8cbf5fdbd Mon Sep 17 00:00:00 2001 From: Mathieu M-Gosselin Date: Mon, 5 Nov 2018 21:49:23 -0800 Subject: [PATCH 3/8] Make `stripHash` option `false` by default and add `stripAuth` and `stripProtocol` options (#74) --- index.js | 14 +++++++++++++- readme.md | 36 +++++++++++++++++++++++++++++++++--- test.js | 30 ++++++++++++++++++++++++++++-- 3 files changed, 74 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index 2d6a8bb..45cf8b1 100644 --- a/index.js +++ b/index.js @@ -12,7 +12,8 @@ module.exports = (urlString, opts) => { normalizeProtocol: true, forceHttp: false, forceHttps: false, - stripHash: true, + stripAuth: true, + stripHash: false, stripWWW: true, removeQueryParameters: [/^utm_\w+/i], removeTrailingSlash: true, @@ -57,6 +58,12 @@ module.exports = (urlString, opts) => { urlObj.protocol = 'https:'; } + // Remove auth + if (opts.stripAuth) { + urlObj.username = ''; + urlObj.password = ''; + } + // Remove hash if (opts.stripHash) { urlObj.hash = ''; @@ -134,5 +141,10 @@ module.exports = (urlString, opts) => { urlString = urlString.replace(/^http:\/\//, '//'); } + // Remove http/https + if (opts.stripProtocol) { + urlString = urlString.replace(/^(?:https?:)?\/\//, ''); + } + return urlString; }; diff --git a/readme.md b/readme.md index b45b31f..0bae32a 100644 --- a/readme.md +++ b/readme.md @@ -91,19 +91,49 @@ normalizeUrl('http://sindresorhus.com:80/', {forceHttps: true}); This option can't be used with the `forceHttp` option at the same time. -##### stripHash +##### stripAuth Type: `boolean`
Default: `true` +Strip the [authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) part of a URL. + +```js +normalizeUrl('user:password@sindresorhus.com/about.html'); +//=> 'http://sindresorhus.com/about.html' + +normalizeUrl('user:password@sindresorhus.com/about.html', {stripAuth: false}); +//=> 'http://user:password@sindresorhus.com/about.html' +``` + +##### stripHash + +Type: `boolean`
+Default: `false` + Removes hash from the URL. ```js normalizeUrl('sindresorhus.com/about.html#contact'); +//=> 'http://sindresorhus.com/about.html#contact' + +normalizeUrl('sindresorhus.com/about.html#contact', {stripHash: true}); //=> 'http://sindresorhus.com/about.html' +``` -normalizeUrl('sindresorhus.com/about.html#contact', {stripHash: false}); -//=> 'http://sindresorhus.com/about.html#contact' +##### stripProtocol + +Type: `boolean`
+Default: `false` + +Removes HTTP(S) protocol from an URL `http://sindresorhus.com` → `sindresorhus.com`. + +```js +normalizeUrl('https://sindresorhus.com/about.html'); +//=> 'https://sindresorhus.com/about.html' + +normalizeUrl('sindresorhus.com/about.html', {stripProtocol: true}); +//=> 'sindresorhus.com/about.html' ``` ##### stripWWW diff --git a/test.js b/test.js index 510ec27..9a246fe 100644 --- a/test.js +++ b/test.js @@ -32,14 +32,20 @@ test('main', t => { t.is(m('http://sindresorhus.com////foo////bar'), 'http://sindresorhus.com/foo/bar'); t.is(m('//sindresorhus.com/', {normalizeProtocol: false}), '//sindresorhus.com'); t.is(m('//sindresorhus.com:80/', {normalizeProtocol: false}), '//sindresorhus.com'); - t.is(m('http://sindresorhus.com/foo#bar'), 'http://sindresorhus.com/foo'); - t.is(m('http://sindresorhus.com/foo#bar', {stripHash: false}), 'http://sindresorhus.com/foo#bar'); + t.is(m('http://sindresorhus.com/foo#bar'), 'http://sindresorhus.com/foo#bar'); + t.is(m('http://sindresorhus.com/foo#bar', {stripHash: true}), 'http://sindresorhus.com/foo'); t.is(m('http://sindresorhus.com/foo/bar/../baz'), 'http://sindresorhus.com/foo/baz'); t.is(m('http://sindresorhus.com/foo/bar/./baz'), 'http://sindresorhus.com/foo/bar/baz'); t.is(m('sindre://www.sorhus.com'), 'sindre://sorhus.com'); t.is(m('sindre://www.sorhus.com/'), 'sindre://sorhus.com'); t.is(m('sindre://www.sorhus.com/foo/bar'), 'sindre://sorhus.com/foo/bar'); t.is(m('https://i.vimeocdn.com/filter/overlay?src0=https://i.vimeocdn.com/video/598160082_1280x720.jpg&src1=https://f.vimeocdn.com/images_v6/share/play_icon_overlay.png'), 'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F598160082_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png'); + t.is(m('http://user:password@www.sindresorhus.com'), 'http://sindresorhus.com'); + t.is(m('https://user:password@www.sindresorhus.com'), 'https://sindresorhus.com'); + t.is(m('https://user:password@www.sindresorhus.com/@user'), 'https://sindresorhus.com/@user'); + t.is(m('user:password@sindresorhus.com'), 'http://sindresorhus.com'); + t.is(m('http://user:password@www.êxample.com'), 'http://xn--xample-hva.com'); + t.is(m('sindre://user:password@www.sorhus.com'), 'sindre://sorhus.com'); }); test('backwards compatibility', t => { @@ -48,6 +54,26 @@ test('backwards compatibility', t => { t.is(m('http://sindresorhus.com', {normalizeHttp: true}), 'https://sindresorhus.com'); }); +test('stripAuth option', t => { + const opts = {stripAuth: false}; + t.is(m('http://user:password@www.sindresorhus.com', opts), 'http://user:password@sindresorhus.com'); + t.is(m('https://user:password@www.sindresorhus.com', opts), 'https://user:password@sindresorhus.com'); + t.is(m('https://user:password@www.sindresorhus.com/@user', opts), 'https://user:password@sindresorhus.com/@user'); + t.is(m('user:password@sindresorhus.com', opts), 'http://user:password@sindresorhus.com'); + t.is(m('http://user:password@www.êxample.com', opts), 'http://user:password@xn--xample-hva.com'); + t.is(m('sindre://user:password@www.sorhus.com', opts), 'sindre://user:password@sorhus.com'); +}); + +test('stripProtocol option', t => { + const opts = {stripProtocol: true}; + t.is(m('http://www.sindresorhus.com', opts), 'sindresorhus.com'); + t.is(m('http://sindresorhus.com', opts), 'sindresorhus.com'); + t.is(m('https://www.sindresorhus.com', opts), 'sindresorhus.com'); + t.is(m('//www.sindresorhus.com', opts), 'sindresorhus.com'); + t.is(m('sindre://user:password@www.sorhus.com', opts), 'sindre://sorhus.com'); + t.is(m('sindre://www.sorhus.com', opts), 'sindre://sorhus.com'); +}); + test('stripWWW option', t => { const opts = {stripWWW: false}; t.is(m('http://www.sindresorhus.com', opts), 'http://www.sindresorhus.com'); From f0f3e8119a4f9659ba42951c465cc6806b61a6b4 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 6 Nov 2018 12:52:42 +0700 Subject: [PATCH 4/8] `stripAuth` => `stripAuthentication` --- index.js | 4 ++-- readme.md | 10 +++++----- test.js | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 45cf8b1..db427b4 100644 --- a/index.js +++ b/index.js @@ -12,7 +12,7 @@ module.exports = (urlString, opts) => { normalizeProtocol: true, forceHttp: false, forceHttps: false, - stripAuth: true, + stripAuthentication: true, stripHash: false, stripWWW: true, removeQueryParameters: [/^utm_\w+/i], @@ -59,7 +59,7 @@ module.exports = (urlString, opts) => { } // Remove auth - if (opts.stripAuth) { + if (opts.stripAuthentication) { urlObj.username = ''; urlObj.password = ''; } diff --git a/readme.md b/readme.md index 0bae32a..184aa36 100644 --- a/readme.md +++ b/readme.md @@ -91,7 +91,7 @@ normalizeUrl('http://sindresorhus.com:80/', {forceHttps: true}); This option can't be used with the `forceHttp` option at the same time. -##### stripAuth +##### stripAuthentication Type: `boolean`
Default: `true` @@ -99,11 +99,11 @@ Default: `true` Strip the [authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) part of a URL. ```js -normalizeUrl('user:password@sindresorhus.com/about.html'); -//=> 'http://sindresorhus.com/about.html' +normalizeUrl('user:password@sindresorhus.com'); +//=> 'https://sindresorhus.com' -normalizeUrl('user:password@sindresorhus.com/about.html', {stripAuth: false}); -//=> 'http://user:password@sindresorhus.com/about.html' +normalizeUrl('user:password@sindresorhus.com', {stripAuthentication: false}); +//=> 'https://user:password@sindresorhus.com' ``` ##### stripHash diff --git a/test.js b/test.js index 9a246fe..6d320e0 100644 --- a/test.js +++ b/test.js @@ -54,8 +54,8 @@ test('backwards compatibility', t => { t.is(m('http://sindresorhus.com', {normalizeHttp: true}), 'https://sindresorhus.com'); }); -test('stripAuth option', t => { - const opts = {stripAuth: false}; +test('stripAuthentication option', t => { + const opts = {stripAuthentication: false}; t.is(m('http://user:password@www.sindresorhus.com', opts), 'http://user:password@sindresorhus.com'); t.is(m('https://user:password@www.sindresorhus.com', opts), 'https://user:password@sindresorhus.com'); t.is(m('https://user:password@www.sindresorhus.com/@user', opts), 'https://user:password@sindresorhus.com/@user'); From b853763328f276b7677e58f66b09cc3951d6a23e Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 6 Nov 2018 12:59:19 +0700 Subject: [PATCH 5/8] Meta tweaks --- .gitignore | 1 + index.js | 52 +++++----- package.json | 6 +- readme.md | 16 ++-- test.js | 265 +++++++++++++++++++++++++-------------------------- 5 files changed, 169 insertions(+), 171 deletions(-) diff --git a/.gitignore b/.gitignore index 239ecff..748ccb6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules yarn.lock +.nyc_output diff --git a/index.js b/index.js index db427b4..856528b 100644 --- a/index.js +++ b/index.js @@ -6,8 +6,8 @@ const testParameter = (name, filters) => { return filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name); }; -module.exports = (urlString, opts) => { - opts = Object.assign({ +module.exports = (urlString, options) => { + options = Object.assign({ defaultProtocol: 'http:', normalizeProtocol: true, forceHttp: false, @@ -19,19 +19,19 @@ module.exports = (urlString, opts) => { removeTrailingSlash: true, removeDirectoryIndex: false, sortQueryParameters: true - }, opts); + }, options); // Backwards compatibility - if (Reflect.has(opts, 'normalizeHttps')) { - opts.forceHttp = opts.normalizeHttps; + if (Reflect.has(options, 'normalizeHttps')) { + options.forceHttp = options.normalizeHttps; } - if (Reflect.has(opts, 'normalizeHttp')) { - opts.forceHttps = opts.normalizeHttp; + if (Reflect.has(options, 'normalizeHttp')) { + options.forceHttps = options.normalizeHttp; } - if (Reflect.has(opts, 'stripFragment')) { - opts.stripHash = opts.stripFragment; + if (Reflect.has(options, 'stripFragment')) { + options.stripHash = options.stripFragment; } urlString = urlString.trim(); @@ -41,31 +41,31 @@ module.exports = (urlString, opts) => { // Prepend protocol if (!isRelativeUrl) { - urlString = urlString.replace(/^(?!(?:\w+:)?\/\/)|^\/\//, opts.defaultProtocol); + urlString = urlString.replace(/^(?!(?:\w+:)?\/\/)|^\/\//, options.defaultProtocol); } const urlObj = new URLParser(urlString); - if (opts.forceHttp && opts.forceHttps) { + if (options.forceHttp && options.forceHttps) { throw new Error('The `forceHttp` and `forceHttps` options cannot be used together'); } - if (opts.forceHttp && urlObj.protocol === 'https:') { + if (options.forceHttp && urlObj.protocol === 'https:') { urlObj.protocol = 'http:'; } - if (opts.forceHttps && urlObj.protocol === 'http:') { + if (options.forceHttps && urlObj.protocol === 'http:') { urlObj.protocol = 'https:'; } // Remove auth - if (opts.stripAuthentication) { + if (options.stripAuthentication) { urlObj.username = ''; urlObj.password = ''; } // Remove hash - if (opts.stripHash) { + if (options.stripHash) { urlObj.hash = ''; } @@ -87,15 +87,15 @@ module.exports = (urlString, opts) => { } // Remove directory index - if (opts.removeDirectoryIndex === true) { - opts.removeDirectoryIndex = [/^index\.[a-z]+$/]; + if (options.removeDirectoryIndex === true) { + options.removeDirectoryIndex = [/^index\.[a-z]+$/]; } - if (Array.isArray(opts.removeDirectoryIndex) && opts.removeDirectoryIndex.length > 0) { + if (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) { let pathComponents = urlObj.pathname.split('/'); const lastComponent = pathComponents[pathComponents.length - 1]; - if (testParameter(lastComponent, opts.removeDirectoryIndex)) { + if (testParameter(lastComponent, options.removeDirectoryIndex)) { pathComponents = pathComponents.slice(0, pathComponents.length - 1); urlObj.pathname = pathComponents.slice(1).join('/') + '/'; } @@ -106,7 +106,7 @@ module.exports = (urlString, opts) => { urlObj.hostname = urlObj.hostname.replace(/\.$/, ''); // Remove `www.` - if (opts.stripWWW && /^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(urlObj.hostname)) { + if (options.stripWWW && /^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(urlObj.hostname)) { // Each label should be max 63 at length (min: 2). // The extension should be max 5 at length (min: 2). // Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names @@ -115,16 +115,16 @@ module.exports = (urlString, opts) => { } // Remove query unwanted parameters - if (Array.isArray(opts.removeQueryParameters)) { + if (Array.isArray(options.removeQueryParameters)) { for (const key of [...urlObj.searchParams.keys()]) { - if (testParameter(key, opts.removeQueryParameters)) { + if (testParameter(key, options.removeQueryParameters)) { urlObj.searchParams.delete(key); } } } // Sort query parameters - if (opts.sortQueryParameters) { + if (options.sortQueryParameters) { urlObj.searchParams.sort(); } @@ -132,17 +132,17 @@ module.exports = (urlString, opts) => { urlString = urlObj.toString(); // Remove ending `/` - if (opts.removeTrailingSlash || urlObj.pathname === '/') { + if (options.removeTrailingSlash || urlObj.pathname === '/') { urlString = urlString.replace(/\/$/, ''); } // Restore relative protocol, if applicable - if (hasRelativeProtocol && !opts.normalizeProtocol) { + if (hasRelativeProtocol && !options.normalizeProtocol) { urlString = urlString.replace(/^http:\/\//, '//'); } // Remove http/https - if (opts.stripProtocol) { + if (options.stripProtocol) { urlString = urlString.replace(/^(?:https?:)?\/\//, ''); } diff --git a/package.json b/package.json index 0bbfb04..6c1bce9 100644 --- a/package.json +++ b/package.json @@ -34,9 +34,9 @@ "canonical" ], "devDependencies": { - "ava": "*", + "ava": "^0.25.0", "coveralls": "^3.0.0", - "nyc": "^12.0.2", - "xo": "*" + "nyc": "^13.1.0", + "xo": "^0.23.0" } } diff --git a/readme.md b/readme.md index 184aa36..f40153e 100644 --- a/readme.md +++ b/readme.md @@ -129,11 +129,11 @@ Default: `false` Removes HTTP(S) protocol from an URL `http://sindresorhus.com` → `sindresorhus.com`. ```js -normalizeUrl('https://sindresorhus.com/about.html'); -//=> 'https://sindresorhus.com/about.html' +normalizeUrl('https://sindresorhus.com'); +//=> 'https://sindresorhus.com' -normalizeUrl('sindresorhus.com/about.html', {stripProtocol: true}); -//=> 'sindresorhus.com/about.html' +normalizeUrl('sindresorhus.com', {stripProtocol: true}); +//=> 'sindresorhus.com' ``` ##### stripWWW @@ -144,11 +144,11 @@ Default: `true` Removes `www.` from the URL. ```js -normalizeUrl('http://www.sindresorhus.com/about.html#contact'); -//=> 'http://sindresorhus.com/about.html#contact' +normalizeUrl('http://www.sindresorhus.com'); +//=> 'http://sindresorhus.com' -normalizeUrl('http://www.sindresorhus.com/about.html#contact', {stripWWW: false}); -//=> 'http://www.sindresorhus.com/about.html#contact' +normalizeUrl('http://www.sindresorhus.com', {stripWWW: false}); +//=> 'http://www.sindresorhus.com' ``` ##### removeQueryParameters diff --git a/test.js b/test.js index 6d320e0..bddf1b3 100644 --- a/test.js +++ b/test.js @@ -1,202 +1,199 @@ import test from 'ava'; -import m from '.'; +import normalizeUrl from '.'; test('main', t => { - t.is(m('sindresorhus.com'), 'http://sindresorhus.com'); - t.is(m('sindresorhus.com '), 'http://sindresorhus.com'); - t.is(m('sindresorhus.com.'), 'http://sindresorhus.com'); - t.is(m('sindresorhus.com', {defaultProtocol: 'https:'}), 'https://sindresorhus.com'); - t.is(m('HTTP://sindresorhus.com'), 'http://sindresorhus.com'); - t.is(m('//sindresorhus.com'), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com'), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com:80'), 'http://sindresorhus.com'); - t.is(m('https://sindresorhus.com:443'), 'https://sindresorhus.com'); - t.is(m('ftp://sindresorhus.com:21'), 'ftp://sindresorhus.com'); - t.is(m('http://www.sindresorhus.com'), 'http://sindresorhus.com'); - t.is(m('www.com'), 'http://www.com'); - t.is(m('http://www.www.sindresorhus.com'), 'http://www.www.sindresorhus.com'); - t.is(m('www.sindresorhus.com'), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com/foo/'), 'http://sindresorhus.com/foo'); - t.is(m('sindresorhus.com/?foo=bar baz'), 'http://sindresorhus.com/?foo=bar+baz'); - t.is(m('https://foo.com/https://bar.com'), 'https://foo.com/https://bar.com'); - t.is(m('https://foo.com/https://bar.com/foo//bar'), 'https://foo.com/https://bar.com/foo/bar'); - t.is(m('https://foo.com/http://bar.com'), 'https://foo.com/http://bar.com'); - t.is(m('https://foo.com/http://bar.com/foo//bar'), 'https://foo.com/http://bar.com/foo/bar'); - t.is(m('http://sindresorhus.com/%7Efoo/'), 'http://sindresorhus.com/~foo', 'decode URI octets'); - t.is(m('http://sindresorhus.com/?'), 'http://sindresorhus.com'); - t.is(m('êxample.com'), 'http://xn--xample-hva.com'); - t.is(m('http://sindresorhus.com/?b=bar&a=foo'), 'http://sindresorhus.com/?a=foo&b=bar'); - t.is(m('http://sindresorhus.com/?foo=bar*|<>:"'), 'http://sindresorhus.com/?foo=bar*%7C%3C%3E%3A%22'); - t.is(m('http://sindresorhus.com:5000'), 'http://sindresorhus.com:5000'); - t.is(m('http://sindresorhus.com////foo/bar'), 'http://sindresorhus.com/foo/bar'); - t.is(m('http://sindresorhus.com////foo////bar'), 'http://sindresorhus.com/foo/bar'); - t.is(m('//sindresorhus.com/', {normalizeProtocol: false}), '//sindresorhus.com'); - t.is(m('//sindresorhus.com:80/', {normalizeProtocol: false}), '//sindresorhus.com'); - t.is(m('http://sindresorhus.com/foo#bar'), 'http://sindresorhus.com/foo#bar'); - t.is(m('http://sindresorhus.com/foo#bar', {stripHash: true}), 'http://sindresorhus.com/foo'); - t.is(m('http://sindresorhus.com/foo/bar/../baz'), 'http://sindresorhus.com/foo/baz'); - t.is(m('http://sindresorhus.com/foo/bar/./baz'), 'http://sindresorhus.com/foo/bar/baz'); - t.is(m('sindre://www.sorhus.com'), 'sindre://sorhus.com'); - t.is(m('sindre://www.sorhus.com/'), 'sindre://sorhus.com'); - t.is(m('sindre://www.sorhus.com/foo/bar'), 'sindre://sorhus.com/foo/bar'); - t.is(m('https://i.vimeocdn.com/filter/overlay?src0=https://i.vimeocdn.com/video/598160082_1280x720.jpg&src1=https://f.vimeocdn.com/images_v6/share/play_icon_overlay.png'), 'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F598160082_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png'); - t.is(m('http://user:password@www.sindresorhus.com'), 'http://sindresorhus.com'); - t.is(m('https://user:password@www.sindresorhus.com'), 'https://sindresorhus.com'); - t.is(m('https://user:password@www.sindresorhus.com/@user'), 'https://sindresorhus.com/@user'); - t.is(m('user:password@sindresorhus.com'), 'http://sindresorhus.com'); - t.is(m('http://user:password@www.êxample.com'), 'http://xn--xample-hva.com'); - t.is(m('sindre://user:password@www.sorhus.com'), 'sindre://sorhus.com'); + t.is(normalizeUrl('sindresorhus.com'), 'http://sindresorhus.com'); + t.is(normalizeUrl('sindresorhus.com '), 'http://sindresorhus.com'); + t.is(normalizeUrl('sindresorhus.com.'), 'http://sindresorhus.com'); + t.is(normalizeUrl('sindresorhus.com', {defaultProtocol: 'https:'}), 'https://sindresorhus.com'); + t.is(normalizeUrl('HTTP://sindresorhus.com'), 'http://sindresorhus.com'); + t.is(normalizeUrl('//sindresorhus.com'), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com'), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com:80'), 'http://sindresorhus.com'); + t.is(normalizeUrl('https://sindresorhus.com:443'), 'https://sindresorhus.com'); + t.is(normalizeUrl('ftp://sindresorhus.com:21'), 'ftp://sindresorhus.com'); + t.is(normalizeUrl('http://www.sindresorhus.com'), 'http://sindresorhus.com'); + t.is(normalizeUrl('www.com'), 'http://www.com'); + t.is(normalizeUrl('http://www.www.sindresorhus.com'), 'http://www.www.sindresorhus.com'); + t.is(normalizeUrl('www.sindresorhus.com'), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/foo/'), 'http://sindresorhus.com/foo'); + t.is(normalizeUrl('sindresorhus.com/?foo=bar baz'), 'http://sindresorhus.com/?foo=bar+baz'); + t.is(normalizeUrl('https://foo.com/https://bar.com'), 'https://foo.com/https://bar.com'); + t.is(normalizeUrl('https://foo.com/https://bar.com/foo//bar'), 'https://foo.com/https://bar.com/foo/bar'); + t.is(normalizeUrl('https://foo.com/http://bar.com'), 'https://foo.com/http://bar.com'); + t.is(normalizeUrl('https://foo.com/http://bar.com/foo//bar'), 'https://foo.com/http://bar.com/foo/bar'); + t.is(normalizeUrl('http://sindresorhus.com/%7Efoo/'), 'http://sindresorhus.com/~foo', 'decode URI octets'); + t.is(normalizeUrl('http://sindresorhus.com/?'), 'http://sindresorhus.com'); + t.is(normalizeUrl('êxample.com'), 'http://xn--xample-hva.com'); + t.is(normalizeUrl('http://sindresorhus.com/?b=bar&a=foo'), 'http://sindresorhus.com/?a=foo&b=bar'); + t.is(normalizeUrl('http://sindresorhus.com/?foo=bar*|<>:"'), 'http://sindresorhus.com/?foo=bar*%7C%3C%3E%3A%22'); + t.is(normalizeUrl('http://sindresorhus.com:5000'), 'http://sindresorhus.com:5000'); + t.is(normalizeUrl('http://sindresorhus.com////foo/bar'), 'http://sindresorhus.com/foo/bar'); + t.is(normalizeUrl('http://sindresorhus.com////foo////bar'), 'http://sindresorhus.com/foo/bar'); + t.is(normalizeUrl('//sindresorhus.com/', {normalizeProtocol: false}), '//sindresorhus.com'); + t.is(normalizeUrl('//sindresorhus.com:80/', {normalizeProtocol: false}), '//sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/foo#bar'), 'http://sindresorhus.com/foo#bar'); + t.is(normalizeUrl('http://sindresorhus.com/foo#bar', {stripHash: true}), 'http://sindresorhus.com/foo'); + t.is(normalizeUrl('http://sindresorhus.com/foo/bar/../baz'), 'http://sindresorhus.com/foo/baz'); + t.is(normalizeUrl('http://sindresorhus.com/foo/bar/./baz'), 'http://sindresorhus.com/foo/bar/baz'); + t.is(normalizeUrl('sindre://www.sorhus.com'), 'sindre://sorhus.com'); + t.is(normalizeUrl('sindre://www.sorhus.com/'), 'sindre://sorhus.com'); + t.is(normalizeUrl('sindre://www.sorhus.com/foo/bar'), 'sindre://sorhus.com/foo/bar'); + t.is(normalizeUrl('https://i.vimeocdn.com/filter/overlay?src0=https://i.vimeocdn.com/video/598160082_1280x720.jpg&src1=https://f.vimeocdn.com/images_v6/share/play_icon_overlay.png'), 'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F598160082_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png'); + t.is(normalizeUrl('http://user:password@www.sindresorhus.com'), 'http://sindresorhus.com'); + t.is(normalizeUrl('https://user:password@www.sindresorhus.com'), 'https://sindresorhus.com'); + t.is(normalizeUrl('https://user:password@www.sindresorhus.com/@user'), 'https://sindresorhus.com/@user'); + t.is(normalizeUrl('user:password@sindresorhus.com'), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://user:password@www.êxample.com'), 'http://xn--xample-hva.com'); + t.is(normalizeUrl('sindre://user:password@www.sorhus.com'), 'sindre://sorhus.com'); }); test('backwards compatibility', t => { - t.is(m('http://sindresorhus.com/foo#bar', {stripFragment: false}), 'http://sindresorhus.com/foo#bar'); - t.is(m('https://sindresorhus.com', {normalizeHttps: true}), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com', {normalizeHttp: true}), 'https://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/foo#bar', {stripFragment: false}), 'http://sindresorhus.com/foo#bar'); + t.is(normalizeUrl('https://sindresorhus.com', {normalizeHttps: true}), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com', {normalizeHttp: true}), 'https://sindresorhus.com'); }); test('stripAuthentication option', t => { - const opts = {stripAuthentication: false}; - t.is(m('http://user:password@www.sindresorhus.com', opts), 'http://user:password@sindresorhus.com'); - t.is(m('https://user:password@www.sindresorhus.com', opts), 'https://user:password@sindresorhus.com'); - t.is(m('https://user:password@www.sindresorhus.com/@user', opts), 'https://user:password@sindresorhus.com/@user'); - t.is(m('user:password@sindresorhus.com', opts), 'http://user:password@sindresorhus.com'); - t.is(m('http://user:password@www.êxample.com', opts), 'http://user:password@xn--xample-hva.com'); - t.is(m('sindre://user:password@www.sorhus.com', opts), 'sindre://user:password@sorhus.com'); + const options = {stripAuthentication: false}; + t.is(normalizeUrl('http://user:password@www.sindresorhus.com', options), 'http://user:password@sindresorhus.com'); + t.is(normalizeUrl('https://user:password@www.sindresorhus.com', options), 'https://user:password@sindresorhus.com'); + t.is(normalizeUrl('https://user:password@www.sindresorhus.com/@user', options), 'https://user:password@sindresorhus.com/@user'); + t.is(normalizeUrl('user:password@sindresorhus.com', options), 'http://user:password@sindresorhus.com'); + t.is(normalizeUrl('http://user:password@www.êxample.com', options), 'http://user:password@xn--xample-hva.com'); + t.is(normalizeUrl('sindre://user:password@www.sorhus.com', options), 'sindre://user:password@sorhus.com'); }); test('stripProtocol option', t => { - const opts = {stripProtocol: true}; - t.is(m('http://www.sindresorhus.com', opts), 'sindresorhus.com'); - t.is(m('http://sindresorhus.com', opts), 'sindresorhus.com'); - t.is(m('https://www.sindresorhus.com', opts), 'sindresorhus.com'); - t.is(m('//www.sindresorhus.com', opts), 'sindresorhus.com'); - t.is(m('sindre://user:password@www.sorhus.com', opts), 'sindre://sorhus.com'); - t.is(m('sindre://www.sorhus.com', opts), 'sindre://sorhus.com'); + const options = {stripProtocol: true}; + t.is(normalizeUrl('http://www.sindresorhus.com', options), 'sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com', options), 'sindresorhus.com'); + t.is(normalizeUrl('https://www.sindresorhus.com', options), 'sindresorhus.com'); + t.is(normalizeUrl('//www.sindresorhus.com', options), 'sindresorhus.com'); + t.is(normalizeUrl('sindre://user:password@www.sorhus.com', options), 'sindre://sorhus.com'); + t.is(normalizeUrl('sindre://www.sorhus.com', options), 'sindre://sorhus.com'); }); test('stripWWW option', t => { - const opts = {stripWWW: false}; - t.is(m('http://www.sindresorhus.com', opts), 'http://www.sindresorhus.com'); - t.is(m('www.sindresorhus.com', opts), 'http://www.sindresorhus.com'); - t.is(m('http://www.êxample.com', opts), 'http://www.xn--xample-hva.com'); - t.is(m('sindre://www.sorhus.com', opts), 'sindre://www.sorhus.com'); + const options = {stripWWW: false}; + t.is(normalizeUrl('http://www.sindresorhus.com', options), 'http://www.sindresorhus.com'); + t.is(normalizeUrl('www.sindresorhus.com', options), 'http://www.sindresorhus.com'); + t.is(normalizeUrl('http://www.êxample.com', options), 'http://www.xn--xample-hva.com'); + t.is(normalizeUrl('sindre://www.sorhus.com', options), 'sindre://www.sorhus.com'); }); test('removeQueryParameters option', t => { - const opts = { + const options = { stripWWW: false, removeQueryParameters: [/^utm_\w+/i, 'ref'] }; - t.is(m('www.sindresorhus.com?foo=bar&utm_medium=test'), 'http://sindresorhus.com/?foo=bar'); - t.is(m('http://www.sindresorhus.com', opts), 'http://www.sindresorhus.com'); - t.is(m('www.sindresorhus.com?foo=bar', opts), 'http://www.sindresorhus.com/?foo=bar'); - t.is(m('www.sindresorhus.com?foo=bar&utm_medium=test&ref=test_ref', opts), 'http://www.sindresorhus.com/?foo=bar'); + t.is(normalizeUrl('www.sindresorhus.com?foo=bar&utm_medium=test'), 'http://sindresorhus.com/?foo=bar'); + t.is(normalizeUrl('http://www.sindresorhus.com', options), 'http://www.sindresorhus.com'); + t.is(normalizeUrl('www.sindresorhus.com?foo=bar', options), 'http://www.sindresorhus.com/?foo=bar'); + t.is(normalizeUrl('www.sindresorhus.com?foo=bar&utm_medium=test&ref=test_ref', options), 'http://www.sindresorhus.com/?foo=bar'); }); test('forceHttp option', t => { - const opts = {forceHttp: true}; - - t.is(m('https://sindresorhus.com'), 'https://sindresorhus.com'); - t.is(m('http://sindresorhus.com', opts), 'http://sindresorhus.com'); - t.is(m('https://www.sindresorhus.com', opts), 'http://sindresorhus.com'); - t.is(m('//sindresorhus.com', opts), 'http://sindresorhus.com'); + const options = {forceHttp: true}; + t.is(normalizeUrl('https://sindresorhus.com'), 'https://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com', options), 'http://sindresorhus.com'); + t.is(normalizeUrl('https://www.sindresorhus.com', options), 'http://sindresorhus.com'); + t.is(normalizeUrl('//sindresorhus.com', options), 'http://sindresorhus.com'); }); test('forceHttp option with forceHttps', t => { t.throws(() => { - m('https://www.sindresorhus.com', {forceHttp: true, forceHttps: true}); + normalizeUrl('https://www.sindresorhus.com', {forceHttp: true, forceHttps: true}); }, 'The `forceHttp` and `forceHttps` options cannot be used together'); }); test('forceHttps option', t => { - const opts = {forceHttps: true}; - - t.is(m('https://sindresorhus.com'), 'https://sindresorhus.com'); - t.is(m('http://sindresorhus.com', opts), 'https://sindresorhus.com'); - t.is(m('https://www.sindresorhus.com', opts), 'https://sindresorhus.com'); - t.is(m('//sindresorhus.com', opts), 'https://sindresorhus.com'); + const options = {forceHttps: true}; + t.is(normalizeUrl('https://sindresorhus.com'), 'https://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com', options), 'https://sindresorhus.com'); + t.is(normalizeUrl('https://www.sindresorhus.com', options), 'https://sindresorhus.com'); + t.is(normalizeUrl('//sindresorhus.com', options), 'https://sindresorhus.com'); }); test('removeTrailingSlash option', t => { - const opts = {removeTrailingSlash: false}; - t.is(m('http://sindresorhus.com/'), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com/', opts), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com/redirect/'), 'http://sindresorhus.com/redirect'); - t.is(m('http://sindresorhus.com/redirect/', opts), 'http://sindresorhus.com/redirect/'); + const options = {removeTrailingSlash: false}; + t.is(normalizeUrl('http://sindresorhus.com/'), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/', options), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/redirect/'), 'http://sindresorhus.com/redirect'); + t.is(normalizeUrl('http://sindresorhus.com/redirect/', options), 'http://sindresorhus.com/redirect/'); }); test('removeDirectoryIndex option', t => { - const opts1 = {removeDirectoryIndex: ['index.html', 'index.php']}; - t.is(m('http://sindresorhus.com/index.html'), 'http://sindresorhus.com/index.html'); - t.is(m('http://sindresorhus.com/index.html', opts1), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com/index.htm', opts1), 'http://sindresorhus.com/index.htm'); - t.is(m('http://sindresorhus.com/index.php', opts1), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com/path/index.html'), 'http://sindresorhus.com/path/index.html'); - t.is(m('http://sindresorhus.com/path/index.html', opts1), 'http://sindresorhus.com/path'); - t.is(m('http://sindresorhus.com/path/index.htm', opts1), 'http://sindresorhus.com/path/index.htm'); - t.is(m('http://sindresorhus.com/path/index.php', opts1), 'http://sindresorhus.com/path'); - t.is(m('http://sindresorhus.com/foo/bar/index.html', opts1), 'http://sindresorhus.com/foo/bar'); - - const opts2 = {removeDirectoryIndex: [/^index\.[a-z]+$/, 'remove.html']}; - t.is(m('http://sindresorhus.com/index.html'), 'http://sindresorhus.com/index.html'); - t.is(m('http://sindresorhus.com/index.html', opts2), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com/index/index.html', opts2), 'http://sindresorhus.com/index'); - t.is(m('http://sindresorhus.com/remove.html', opts2), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com/default.htm', opts2), 'http://sindresorhus.com/default.htm'); - t.is(m('http://sindresorhus.com/index.php', opts2), 'http://sindresorhus.com'); - - const opts3 = {removeDirectoryIndex: true}; - t.is(m('http://sindresorhus.com/index.html'), 'http://sindresorhus.com/index.html'); - t.is(m('http://sindresorhus.com/index.html', opts3), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com/index.htm', opts3), 'http://sindresorhus.com'); - t.is(m('http://sindresorhus.com/index.php', opts3), 'http://sindresorhus.com'); + const options1 = {removeDirectoryIndex: ['index.html', 'index.php']}; + t.is(normalizeUrl('http://sindresorhus.com/index.html'), 'http://sindresorhus.com/index.html'); + t.is(normalizeUrl('http://sindresorhus.com/index.html', options1), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/index.htm', options1), 'http://sindresorhus.com/index.htm'); + t.is(normalizeUrl('http://sindresorhus.com/index.php', options1), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/path/index.html'), 'http://sindresorhus.com/path/index.html'); + t.is(normalizeUrl('http://sindresorhus.com/path/index.html', options1), 'http://sindresorhus.com/path'); + t.is(normalizeUrl('http://sindresorhus.com/path/index.htm', options1), 'http://sindresorhus.com/path/index.htm'); + t.is(normalizeUrl('http://sindresorhus.com/path/index.php', options1), 'http://sindresorhus.com/path'); + t.is(normalizeUrl('http://sindresorhus.com/foo/bar/index.html', options1), 'http://sindresorhus.com/foo/bar'); + + const options2 = {removeDirectoryIndex: [/^index\.[a-z]+$/, 'remove.html']}; + t.is(normalizeUrl('http://sindresorhus.com/index.html'), 'http://sindresorhus.com/index.html'); + t.is(normalizeUrl('http://sindresorhus.com/index.html', options2), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/index/index.html', options2), 'http://sindresorhus.com/index'); + t.is(normalizeUrl('http://sindresorhus.com/remove.html', options2), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/default.htm', options2), 'http://sindresorhus.com/default.htm'); + t.is(normalizeUrl('http://sindresorhus.com/index.php', options2), 'http://sindresorhus.com'); + + const options3 = {removeDirectoryIndex: true}; + t.is(normalizeUrl('http://sindresorhus.com/index.html'), 'http://sindresorhus.com/index.html'); + t.is(normalizeUrl('http://sindresorhus.com/index.html', options3), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/index.htm', options3), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/index.php', options3), 'http://sindresorhus.com'); }); test('removeTrailingSlash and removeDirectoryIndex options)', t => { - const opts1 = { + const options1 = { removeTrailingSlash: true, removeDirectoryIndex: true }; - t.is(m('http://sindresorhus.com/path/', opts1), 'http://sindresorhus.com/path'); - t.is(m('http://sindresorhus.com/path/index.html', opts1), 'http://sindresorhus.com/path'); + t.is(normalizeUrl('http://sindresorhus.com/path/', options1), 'http://sindresorhus.com/path'); + t.is(normalizeUrl('http://sindresorhus.com/path/index.html', options1), 'http://sindresorhus.com/path'); - const opts2 = { + const options2 = { removeTrailingSlash: false, removeDirectoryIndex: true }; - t.is(m('http://sindresorhus.com/path/', opts2), 'http://sindresorhus.com/path/'); - t.is(m('http://sindresorhus.com/path/index.html', opts2), 'http://sindresorhus.com/path/'); + t.is(normalizeUrl('http://sindresorhus.com/path/', options2), 'http://sindresorhus.com/path/'); + t.is(normalizeUrl('http://sindresorhus.com/path/index.html', options2), 'http://sindresorhus.com/path/'); }); test('sortQueryParameters option', t => { - let opts = { + const options1 = { sortQueryParameters: true }; - t.is(m('http://sindresorhus.com/?a=Z&b=Y&c=X&d=W', opts), 'http://sindresorhus.com/?a=Z&b=Y&c=X&d=W'); - t.is(m('http://sindresorhus.com/?b=Y&c=X&a=Z&d=W', opts), 'http://sindresorhus.com/?a=Z&b=Y&c=X&d=W'); - t.is(m('http://sindresorhus.com/?a=Z&d=W&b=Y&c=X', opts), 'http://sindresorhus.com/?a=Z&b=Y&c=X&d=W'); - t.is(m('http://sindresorhus.com/', opts), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/?a=Z&b=Y&c=X&d=W', options1), 'http://sindresorhus.com/?a=Z&b=Y&c=X&d=W'); + t.is(normalizeUrl('http://sindresorhus.com/?b=Y&c=X&a=Z&d=W', options1), 'http://sindresorhus.com/?a=Z&b=Y&c=X&d=W'); + t.is(normalizeUrl('http://sindresorhus.com/?a=Z&d=W&b=Y&c=X', options1), 'http://sindresorhus.com/?a=Z&b=Y&c=X&d=W'); + t.is(normalizeUrl('http://sindresorhus.com/', options1), 'http://sindresorhus.com'); - opts = { + const options2 = { sortQueryParameters: false }; - - t.is(m('http://sindresorhus.com/?a=Z&b=Y&c=X&d=W', opts), 'http://sindresorhus.com/?a=Z&b=Y&c=X&d=W'); - t.is(m('http://sindresorhus.com/?b=Y&c=X&a=Z&d=W', opts), 'http://sindresorhus.com/?b=Y&c=X&a=Z&d=W'); - t.is(m('http://sindresorhus.com/?a=Z&d=W&b=Y&c=X', opts), 'http://sindresorhus.com/?a=Z&d=W&b=Y&c=X'); - t.is(m('http://sindresorhus.com/', opts), 'http://sindresorhus.com'); + t.is(normalizeUrl('http://sindresorhus.com/?a=Z&b=Y&c=X&d=W', options2), 'http://sindresorhus.com/?a=Z&b=Y&c=X&d=W'); + t.is(normalizeUrl('http://sindresorhus.com/?b=Y&c=X&a=Z&d=W', options2), 'http://sindresorhus.com/?b=Y&c=X&a=Z&d=W'); + t.is(normalizeUrl('http://sindresorhus.com/?a=Z&d=W&b=Y&c=X', options2), 'http://sindresorhus.com/?a=Z&d=W&b=Y&c=X'); + t.is(normalizeUrl('http://sindresorhus.com/', options2), 'http://sindresorhus.com'); }); test('invalid urls', t => { t.throws(() => { - m('http://'); + normalizeUrl('http://'); }, 'Invalid URL: http://'); t.throws(() => { - m('/'); + normalizeUrl('/'); }, 'Invalid URL: /'); t.throws(() => { - m('/relative/path/'); + normalizeUrl('/relative/path/'); }, 'Invalid URL: /relative/path/'); }); From f0667958dd4c19ccee3a4ee73e3d858735eaa0bf Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 6 Nov 2018 13:02:01 +0700 Subject: [PATCH 6/8] Hard-deprecate some deprecated options --- index.js | 8 ++++---- test.js | 6 ------ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index 856528b..97beb30 100644 --- a/index.js +++ b/index.js @@ -21,17 +21,17 @@ module.exports = (urlString, options) => { sortQueryParameters: true }, options); - // Backwards compatibility + // TODO: Remove this at some point in the future if (Reflect.has(options, 'normalizeHttps')) { - options.forceHttp = options.normalizeHttps; + throw new Error('options.normalizeHttps is renamed to options.forceHttp'); } if (Reflect.has(options, 'normalizeHttp')) { - options.forceHttps = options.normalizeHttp; + throw new Error('options.normalizeHttp is renamed to options.forceHttps'); } if (Reflect.has(options, 'stripFragment')) { - options.stripHash = options.stripFragment; + throw new Error('options.stripFragment is renamed to options.stripHash'); } urlString = urlString.trim(); diff --git a/test.js b/test.js index bddf1b3..9333d35 100644 --- a/test.js +++ b/test.js @@ -48,12 +48,6 @@ test('main', t => { t.is(normalizeUrl('sindre://user:password@www.sorhus.com'), 'sindre://sorhus.com'); }); -test('backwards compatibility', t => { - t.is(normalizeUrl('http://sindresorhus.com/foo#bar', {stripFragment: false}), 'http://sindresorhus.com/foo#bar'); - t.is(normalizeUrl('https://sindresorhus.com', {normalizeHttps: true}), 'http://sindresorhus.com'); - t.is(normalizeUrl('http://sindresorhus.com', {normalizeHttp: true}), 'https://sindresorhus.com'); -}); - test('stripAuthentication option', t => { const options = {stripAuthentication: false}; t.is(normalizeUrl('http://user:password@www.sindresorhus.com', options), 'http://user:password@sindresorhus.com'); From ee7e2c5efc59c31e5831ef8d4c1a1ec0694cfaac Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 6 Nov 2018 13:04:37 +0700 Subject: [PATCH 7/8] Require Node.js 8 --- .travis.yml | 1 - index.js | 7 ++++--- package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c89aee6..5e3bcf3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,5 @@ language: node_js node_js: - '10' - '8' - - '6' after_success: - './node_modules/.bin/nyc report --reporter=text-lcov | ./node_modules/.bin/coveralls' diff --git a/index.js b/index.js index 97beb30..7e9e294 100644 --- a/index.js +++ b/index.js @@ -7,7 +7,7 @@ const testParameter = (name, filters) => { }; module.exports = (urlString, options) => { - options = Object.assign({ + options = { defaultProtocol: 'http:', normalizeProtocol: true, forceHttp: false, @@ -18,8 +18,9 @@ module.exports = (urlString, options) => { removeQueryParameters: [/^utm_\w+/i], removeTrailingSlash: true, removeDirectoryIndex: false, - sortQueryParameters: true - }, options); + sortQueryParameters: true, + ...options + }; // TODO: Remove this at some point in the future if (Reflect.has(options, 'normalizeHttps')) { diff --git a/package.json b/package.json index 6c1bce9..1876bda 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "sindresorhus.com" }, "engines": { - "node": ">=6" + "node": ">=8" }, "scripts": { "test": "xo && nyc ava" From e02a3aaa149ddf34ba4076adc0885c26718b7a37 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 6 Nov 2018 13:05:50 +0700 Subject: [PATCH 8/8] 4.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1876bda..6c48e23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "normalize-url", - "version": "3.3.0", + "version": "4.0.0", "description": "Normalize a URL", "license": "MIT", "repository": "sindresorhus/normalize-url",