Skip to content

Commit

Permalink
added following
Browse files Browse the repository at this point in the history
  * added Readme for the added configQs
  • Loading branch information
VariableVasasMT committed Apr 29, 2019
1 parent 6a421d0 commit ead3ed2
Showing 1 changed file with 60 additions and 57 deletions.
117 changes: 60 additions & 57 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,63 +1,60 @@
[![Build Status][travis-image]][travis-url] [![Coverage][coveralls-image]][coveralls-url]

node-url-assembler
==================
# node-url-assembler

> Assemble urls from route-like templates (/path/:param)
> Assemble urls from route-like templates (/path/:param)
Chainable utility to assemble URLs from templates

Installation
------------
## Installation

npm install --save url-assembler

Usage
-----
## Usage

#### Basic

```javascript
UrlAssembler()
.template('/users/:user')
.param('user', 8)
.param('include', 'address')
.template("/users/:user")
.param("user", 8)
.param("include", "address")
.query({
some: 'thing',
some: "thing",
other: 1234
})
.toString() // => "/users/8?include=address&some=thing&other=1234
.toString(); // => "/users/8?include=address&some=thing&other=1234
```

#### With base URL

Since you more often than not need a hostname and a protocol to go with this

```javascript
UrlAssembler('http://my.domain.com:9000')
.template('/groups/:group/users/:user')
UrlAssembler("http://my.domain.com:9000")
.template("/groups/:group/users/:user")
.param({
group: 'admin',
user: 'floby'
group: "admin",
user: "floby"
})
.toString() // => "http://my.domain.9000/groups/admin/users/floby"
.toString(); // => "http://my.domain.9000/groups/admin/users/floby"
```

#### Incremental assembling

You can also incrementally build your URL.

```javascript
UrlAssembler('https://api.site.com/')
.prefix('/v2')
.segment('/users/:user')
.segment('/projects/:project')
.segment('/summary')
UrlAssembler("https://api.site.com/")
.prefix("/v2")
.segment("/users/:user")
.segment("/projects/:project")
.segment("/summary")
.param({
user: 'floby',
project: 'node-url-assembler'
user: "floby",
project: "node-url-assembler"
})
.toString() // => 'https://api.site.com/v2/users/floby/projects/node-url-assembler/summary'
.toString(); // => 'https://api.site.com/v2/users/floby/projects/node-url-assembler/summary'
```

#### making requests
Expand All @@ -66,105 +63,112 @@ If `url-assembler` finds the [`request`](npmjs.com/package/request) module. Then
is available on every instance which can be used to make requests.

```javascript
var google = UrlAssembler('https://google.com').query('q', 'url assembler');
var google = UrlAssembler("https://google.com").query("q", "url assembler");

google.request.get() // => makes a GET request to google
google.request.get(); // => makes a GET request to google

// you can still pass any other option to request
google.request.get({json: true})
google.request.get({ json: true });
```

Design
------
## Design

Every method (except `toString()`) returns a new instance of `UrlAssembler`. You can
consider that `UrlAssembler` instances are immutable.

Because of this, you can use a single instance as a preconfigured url to reuse throughout your codebase.

```javascript
var api = UrlAssembler('http://api.site.com');
var api = UrlAssembler("http://api.site.com");

var userResource = api.segment('/users/:user');
var userResource = api.segment("/users/:user");

var userV1 = userResource.prefix('/v1');
var userV2 = userResource.prefix('/v2');
var userV1 = userResource.prefix("/v1");
var userV2 = userResource.prefix("/v2");

var userFeedResource = userV2.segment('/feed');
var userFeedResource = userV2.segment("/feed");

var authenticated = api.query('auth_token', '123457890');
var authenticated = api.query("auth_token", "123457890");

var adminResource = authenticated.segment('/admin');
var adminResource = authenticated.segment("/admin");
```

In addition, an instance of `UrlAssembler` is a valid object to pass
to `url.format()` or any function accepting this kind of object as
parameter.


API Reference
-------------
## API Reference

###### `new UrlAssembler([baseUrl])`

- `baseUrl`: will be used for protocol, hostname, port and other base url kind of stuff.
- **returns** an instance of a URL assembler.

###### `new UrlAssembler(urlAssembler)`

- `urlAssembler`: an existing instance of `UrlAssembler`
- this constructor is used for chaining internally. You should be aware of it if you extend `UrlAssembler`
- **returns** a new instance of a URL assembler, copying the previous one

###### `.template(template)`
- `template` a *string* with dynamic part noted as `:myparam` . For example `'/hello/:param/world'`

- `template` a _string_ with dynamic part noted as `:myparam` . For example `'/hello/:param/world'`
- **returns** a new instance of `UrlAssembler` with this template configured

###### `.prefix(subPath)`
- `subPath` : this *string* will be added at the beginning of the path part of the URL

- `subPath` : this _string_ will be added at the beginning of the path part of the URL
- if called several times, the `subPath` will be added after the previous prefix but before the rest of the path
- **returns** a new instance of `UrlAssembler`

###### `.segment(subPathTemplate)`
- `subPathTemplate` is a *string* of a segment to add to the path of the URL. It can have a templatized parameter eg. `'/user/:user'`

- `subPathTemplate` is a _string_ of a segment to add to the path of the URL. It can have a templatized parameter eg. `'/user/:user'`
- if called several times, the segment will be added at the end of the URL.
- **returns** a new instance of `UrlAssembler`

###### `.param(key, value[, strict])`
- `key`: a *string* of the dynamic part to replace
- `value`: a *string* to replace the dynamic part with

- `key`: a _string_ of the dynamic part to replace
- `value`: a _string_ to replace the dynamic part with
- **returns** a new instance of `UrlAssembler` with the parameter `key` replaced with `value`.
If `strict` is falsy, the key will be added as query parameter.
If `strict` is falsy, the key will be added as query parameter.

###### `.param(params[, strict])`
- `params`: a *hash* of key/value to give to the method above

- `params`: a _hash_ of key/value to give to the method above
- `strict` a flag passed to the method above
- **returns** a new instance of `UrlAssembler` with all the parameters from the `params` replaced

###### `.query(key, value)`

- `key`: the name of the parameter to configure
- `value`: the value of the parameter to configure
- **returns** a new instance of `UrlAssembler` with the `key=value` pair added as
query parameter with the [`qs`](https://www.npmjs.com/package/qs) module.
query parameter with the [`qs`](https://www.npmjs.com/package/qs) module.

###### `.query(params)`

- shortcut for the previous method with a hash of key/value.

###### `.configQs(params)`

- add config supported by qs.stringify https://www.npmjs.com/package/qs version ^6.5.1

###### `.toString()`, `.valueOf()`, `toJSON()`
- **returns** a *string* of the current state of the `UrlAssembler` instance. Path parameters not yet replaced will appear as `:param_name`.

Test
----
- **returns** a _string_ of the current state of the `UrlAssembler` instance. Path parameters not yet replaced will appear as `:param_name`.

## Test

Tests are written with [mocha][mocha-url] and covered with [istanbul][istanbul-url]
You can run the tests with `npm test`.

Contributing
------------
## Contributing

Anyone is welcome to submit issues and pull requests


License
-------
## License

[MIT](http://opensource.org/licenses/MIT)

Expand All @@ -176,7 +180,6 @@ The above copyright notice and this permission notice shall be included in all c

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


[travis-image]: http://img.shields.io/travis/Floby/node-url-assembler/master.svg?style=flat
[travis-url]: https://travis-ci.org/Floby/node-url-assembler
[coveralls-image]: http://img.shields.io/coveralls/Floby/node-url-assembler/master.svg?style=flat
Expand Down

0 comments on commit ead3ed2

Please sign in to comment.