npm package: @nicolasparada/web-framework
Description: HTTP Web Framework
Author: Nicolás Parada
Latest version: 0.8.2

# @nicolasparada/web-framework ![npm version](https://badge.fury.io/js/%40nicolasparada%2Fweb-framework.svg) ![dependencies](https://david-dm.org/nicolasparada/web-framework.svg)

Minimalistic Node.js HTTP Web Framework.

```js
const framework = require('@nicolasparada/web-framework')

const app = framework()

const getNameMiddleware = (req, next) => next(req.params.name)
const hello = name => `Hello, ${name}!`

app.get('/hello/:name', getNameMiddleware, hello)

app.listen(80, '127.0.0.1', () => {
  console.log('Server running at http://localhost/hello/world 🚀')
})
```

This framework sets trivials headers for you, so you can simply return any value, but if you want to respond with a custom status code or headers, make sure to return a object with a `statusCode` number and a `headers` plain object. `body` can take any value.
```js
app.get('/advanced', () => ({
  statusCode: 418,
  headers: {
    foo: 'bar'
  }
}))
```

You should have your tipical routing capabilities: get, post, put, patch, delete and options. It uses the [`path-to-regexp`](https://www.npmjs.com/package/path-to-regexp) engine to parse the pattern (same as express or react-router).

`match` allows you to catch various HTTP verbs.
```js
app.match(['PATCH', 'PUT'], '/pattern', updateHandler)
```
`any` catches all HTTP verbs.

`requestHandler` is useful if you want to use your own server. Just attach it to the `request` event.
```js
const fs = require('fs')
const https = require('https')
const framework = require('@nicolasparada/web-framework')

const app = framework()

const options = {
  key: fs.readFileSync('key.pem'),
  cert: fs.readFileSync('cert.pem')
}

const server = https.createServer(options)
server.on('request', app.handleRequest)
server.listen(443, '127.0.0.1', () => {
  console.log('Server running at 🔒 https://localhost/ 🚀')
})
```

`listen` returns `http.Server`.

You can register global middlewares passing them to the framework constructor.
```js
const delay = ms => new Promise(resolve => {
  setTimeout(resolve, ms)
})

const delayMiddleware = async (req, next) => {
  const ms = parseInt(req.query.delay, 10)
  await delay(ms)
  return next(req)
}

const app = framework([delayMiddleware])
```

**Tip!** You can add middlewares later in the pipeline thanks to async/await.
```js
const afterMiddleware = async (req, next) => {
  const res = await next(req)
  // Do something here
  return res
}
```

## Middlewares
* [@nicolasparada/bodyparser-middleware](https://www.npmjs.com/package/@nicolasparada/bodyparser-middleware) ![npm version](https://badge.fury.io/js/%40nicolasparada%2Fbodyparser-middleware.svg) ![dependencies](https://david-dm.org/nicolasparada/bodyparser-middleware.svg)
* [@nicolasparada/jwt-middleware](https://www.npmjs.com/package/@nicolasparada/jwt-middleware) ![npm version](https://badge.fury.io/js/%40nicolasparada%2Fjwt-middleware.svg)
* [@nicolasparada/cors-middleware](https://www.npmjs.com/package/@nicolasparada/cors-middleware) ![npm version](https://badge.fury.io/js/%40nicolasparada%2Fcors-middleware.svg)
* [@nicolasparada/graphql-middleware](https://www.npmjs.com/package/@nicolasparada/graphql-middleware) ![npm version](https://badge.fury.io/js/%40nicolasparada%2Fgraphql-middleware.svg) ![dependencies](https://david-dm.org/nicolasparada/graphql-middleware.svg)
* [@nicolasparada/graphiql-middleware](https://www.npmjs.com/package/@nicolasparada/graphiql-middleware) ![npm version](https://badge.fury.io/js/%40nicolasparada%2Fgraphiql-middleware.svg) ![dependencies](https://david-dm.org/nicolasparada/graphiql-middleware.svg)
 * _Static file serving soon..._