You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					148 lines
				
				6.1 KiB
			
		
		
			
		
	
	
					148 lines
				
				6.1 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								# url-parse
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](http://unshift.io)[](https://www.npmjs.com/package/url-parse)[](https://github.com/unshiftio/url-parse/actions?query=workflow%3ACI+branch%3Amaster)[](https://david-dm.org/unshiftio/url-parse)[](https://coveralls.io/r/unshiftio/url-parse?branch=master)[](https://webchat.freenode.net/?channels=unshift)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](https://saucelabs.com/u/url-parse)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The `url-parse` method exposes two different API interfaces. The
							 | 
						||
| 
								 | 
							
								[`url`](https://nodejs.org/api/url.html) interface that you know from Node.js
							 | 
						||
| 
								 | 
							
								and the new [`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL/URL)
							 | 
						||
| 
								 | 
							
								interface that is available in the latest browsers.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In version `0.1` we moved from a DOM based parsing solution, using the `<a>`
							 | 
						||
| 
								 | 
							
								element, to a full Regular Expression solution. The main reason for this was
							 | 
						||
| 
								 | 
							
								to make the URL parser available in different JavaScript environments as you
							 | 
						||
| 
								 | 
							
								don't always have access to the DOM. An example of such environment is the
							 | 
						||
| 
								 | 
							
								[`Worker`](https://developer.mozilla.org/en/docs/Web/API/Worker) interface.
							 | 
						||
| 
								 | 
							
								The RegExp based solution didn't work well as it required a lot of lookups
							 | 
						||
| 
								 | 
							
								causing major problems in FireFox. In version `1.0.0` we ditched the RegExp
							 | 
						||
| 
								 | 
							
								based solution in favor of a pure string parsing solution which chops up the
							 | 
						||
| 
								 | 
							
								URL into smaller pieces. This module still has a really small footprint as it
							 | 
						||
| 
								 | 
							
								has been designed to be used on the client side.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In addition to URL parsing we also expose the bundled `querystringify` module.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Installation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This module is designed to be used using either browserify or Node.js it's
							 | 
						||
| 
								 | 
							
								released in the public npm registry and can be installed using:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								npm install url-parse
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								All examples assume that this library is bootstrapped using:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Url = require('url-parse');
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To parse an URL simply call the `URL` method with the URL that needs to be
							 | 
						||
| 
								 | 
							
								transformed into an object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var url = new Url('https://github.com/foo/bar');
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The `new` keyword is optional but it will save you an extra function invocation.
							 | 
						||
| 
								 | 
							
								The constructor takes the following arguments:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `url` (`String`): A string representing an absolute or relative URL.
							 | 
						||
| 
								 | 
							
								- `baseURL` (`Object` | `String`): An object or string representing
							 | 
						||
| 
								 | 
							
								  the base URL to use in case `url` is a relative URL. This argument is
							 | 
						||
| 
								 | 
							
								  optional and defaults to [`location`](https://developer.mozilla.org/en-US/docs/Web/API/Location)
							 | 
						||
| 
								 | 
							
								  in the browser.
							 | 
						||
| 
								 | 
							
								- `parser` (`Boolean` | `Function`): This argument is optional and specifies
							 | 
						||
| 
								 | 
							
								  how to parse the query string. By default it is `false` so the query string
							 | 
						||
| 
								 | 
							
								  is not parsed. If you pass `true` the query string is parsed using the
							 | 
						||
| 
								 | 
							
								  embedded `querystringify` module. If you pass a function the query string
							 | 
						||
| 
								 | 
							
								  will be parsed using this function.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								As said above we also support the Node.js interface so you can also use the
							 | 
						||
| 
								 | 
							
								library in this way:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var parse = require('url-parse')
							 | 
						||
| 
								 | 
							
								  , url = parse('https://github.com/foo/bar', true);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The returned `url` instance contains the following properties:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `protocol`: The protocol scheme of the URL (e.g. `http:`).
							 | 
						||
| 
								 | 
							
								- `slashes`: A boolean which indicates whether the `protocol` is followed by two
							 | 
						||
| 
								 | 
							
								  forward slashes (`//`).
							 | 
						||
| 
								 | 
							
								- `auth`: Authentication information portion (e.g. `username:password`).
							 | 
						||
| 
								 | 
							
								- `username`: Username of basic authentication.
							 | 
						||
| 
								 | 
							
								- `password`: Password of basic authentication.
							 | 
						||
| 
								 | 
							
								- `host`: Host name with port number.
							 | 
						||
| 
								 | 
							
								- `hostname`: Host name without port number.
							 | 
						||
| 
								 | 
							
								- `port`: Optional port number.
							 | 
						||
| 
								 | 
							
								- `pathname`: URL path.
							 | 
						||
| 
								 | 
							
								- `query`: Parsed object containing query string, unless parsing is set to false.
							 | 
						||
| 
								 | 
							
								- `hash`: The "fragment" portion of the URL including the pound-sign (`#`).
							 | 
						||
| 
								 | 
							
								- `href`: The full URL.
							 | 
						||
| 
								 | 
							
								- `origin`: The origin of the URL.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Note that when `url-parse` is used in a browser environment, it will default to
							 | 
						||
| 
								 | 
							
								using the browser's current window location as the base URL when parsing all
							 | 
						||
| 
								 | 
							
								inputs. To parse an input independently of the browser's current URL (e.g. for
							 | 
						||
| 
								 | 
							
								functionality parity with the library in a Node environment), pass an empty
							 | 
						||
| 
								 | 
							
								location object as the second parameter:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var parse = require('url-parse');
							 | 
						||
| 
								 | 
							
								parse('hostname', {});
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Url.set(key, value)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A simple helper function to change parts of the URL and propagating it through
							 | 
						||
| 
								 | 
							
								all properties. When you set a new `host` you want the same value to be applied
							 | 
						||
| 
								 | 
							
								to `port` if has a different port number, `hostname` so it has a correct name
							 | 
						||
| 
								 | 
							
								again and `href` so you have a complete URL.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var parsed = parse('http://google.com/parse-things');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								parsed.set('hostname', 'yahoo.com');
							 | 
						||
| 
								 | 
							
								console.log(parsed.href); // http://yahoo.com/parse-things
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It's aware of default ports so you cannot set a port 80 on an URL which has
							 | 
						||
| 
								 | 
							
								`http` as protocol.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Url.toString()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The returned `url` object comes with a custom `toString` method which will
							 | 
						||
| 
								 | 
							
								generate a full URL again when called. The method accepts an extra function
							 | 
						||
| 
								 | 
							
								which will stringify the query string for you. If you don't supply a function we
							 | 
						||
| 
								 | 
							
								will use our default method.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var location = url.toString(); // http://example.com/whatever/?qs=32
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You would rarely need to use this method as the full URL is also available as
							 | 
						||
| 
								 | 
							
								`href` property. If you are using the `URL.set` method to make changes, this
							 | 
						||
| 
								 | 
							
								will automatically update.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Testing
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The testing of this module is done in 3 different ways:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1. We have unit tests that run under Node.js. You can run these tests with the
							 | 
						||
| 
								 | 
							
								  `npm test` command.
							 | 
						||
| 
								 | 
							
								2. Code coverage can be run manually using `npm run coverage`.
							 | 
						||
| 
								 | 
							
								3. For browser testing we use Sauce Labs and `zuul`. You can run browser tests
							 | 
						||
| 
								 | 
							
								  using the `npm run test-browser` command.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## License
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[MIT](LICENSE)
							 |