From 59d53d65f07688f1ae2f0701df3d1068aadf625f Mon Sep 17 00:00:00 2001 From: Or Rosenblatt Date: Sat, 3 Feb 2018 08:29:38 -0500 Subject: [PATCH] Add `.parseUrl()` method (#104) --- index.js | 7 +++++++ readme.md | 14 ++++++++++++++ test/parse-url.js | 17 +++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 test/parse-url.js diff --git a/index.js b/index.js index 0517260e..379d5feb 100644 --- a/index.js +++ b/index.js @@ -212,3 +212,10 @@ exports.stringify = function (obj, opts) { return x.length > 0; }).join('&') : ''; }; + +exports.parseUrl = function (str, opts) { + return { + url: str.split('?')[0] || '', + query: this.parse(this.extract(str), opts) + }; +}; diff --git a/readme.md b/readme.md index 4e0d2db2..824d6a02 100644 --- a/readme.md +++ b/readme.md @@ -163,6 +163,20 @@ If omitted, keys are sorted using `Array#sort`, which means, converting them to Extract a query string from a URL that can be passed into `.parse()`. +### .parseUrl(*string*, *[options]*) + +Extract the URL and the query string as an object. + +The `options` are the same as for `.parse()`. + +Returns an object with a `url` and `query` property. + +```js +queryString.parseUrl('http://foo.bar?foo=bar') +//=> {url: 'http://foo.bar', query: {foo: 'bar'}} +``` + + ## Nesting This module intentionally doesn't support nesting as it's not spec'd and varies between implementations, which causes a lot of [edge cases](https://github.com/visionmedia/node-querystring/issues). diff --git a/test/parse-url.js b/test/parse-url.js new file mode 100644 index 00000000..39a163be --- /dev/null +++ b/test/parse-url.js @@ -0,0 +1,17 @@ +import test from 'ava'; +import fn from '../'; + +test('should handle strings with query string', t => { + t.deepEqual(fn.parseUrl('http://foo.bar?foo=bar'), {url: 'http://foo.bar', query: {foo: 'bar'}}); + t.deepEqual(fn.parseUrl('http://foo.bar?foo=bar&foo=baz'), {url: 'http://foo.bar', query: {foo: ['bar', 'baz']}}); +}); + +test('should handle strings not containing query string', t => { + t.deepEqual(fn.parseUrl('http://foo.bar/'), {url: 'http://foo.bar/', query: {}}); + t.deepEqual(fn.parseUrl(''), {url: '', query: {}}); +}); + +test('should throw for invalid values', t => { + t.throws(fn.parseUrl.bind(fn, null), TypeError); + t.throws(fn.parseUrl.bind(fn, undefined), TypeError); +});