```
       d8888                   d8b  .d888
      d88888                   Y8P d88P"
     d88P888                       888
    d88P 888 88888b.  88888b.  888 888888 888  888
   d88P  888 888 "88b 888 "88b 888 888    888  888
  d88P   888 888  888 888  888 888 888    888  888
 d8888888888 888 d88P 888 d88P 888 888    Y88b 888
d88P     888 88888P"  88888P"  888 888     "Y88888
             888      888                      888
             888      888                 Y8b d88P
             888      888                  "Y88P"
```

[![MIT license](https://img.shields.io/badge/License-MIT-blue.svg)](https://lbesson.mit-license.org/)
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
![NPM latest version](https://img.shields.io/npm/v/@mantris/appify.svg?style=flat&colorB=green)
![Package minziped size](https://img.shields.io/bundlephobia/minzip/%40mantris%2Fappify.svg?style=flat&colorB=yellowgreen)
![NPM total downloads](https://img.shields.io/npm/dt/@mantris/appify.svg?style=flat&colorB=yellow)
![NPM monthly downloads](https://img.shields.io/npm/dm/@mantris/appify.svg?style=flat&colorB=orange)
![NPM weekly downloads](https://img.shields.io/npm/dw/@mantris/appify.svg?style=flat&colorB=red)

Appify is a very opinionated Node.js API boilerplate as module shipped with out of the box integration with Sentry and DeepTrace.


## Install

```sh
npm i @mantris/appify
```


## Usage

```js
// app.js

const appify = require('@mantris/appify')
const connect = require('some-db-lib')

module.exports = appify(async (api, config, environment) => {
  const db = await connect(config.db)

  api.get('/users/:id', (req, res) => {
    res
      .set({ 'x-environment': environment })
      .json(db.users.find(req.params.id))
  })
})
```

```js
// config.js

const { env } = require('@mantris/appify')

module.exports = (environment) => ({
  db: {
    dbname: `mydb-${environment}`,
    dbhost: env.get('DB_HOST', 'mongo://localhost:27107')
  }
})
```

```sh
appify --debug --pretty-errors --config config.js app.js
```


## Environment variables

| Setting                                   | Vars                                              | Type      | Default value                                                     |
| :---------------------------------------- | :-----------------------------------------------: | :-------: | :---------------------------------------------------------------: |
| Your app's version/release                | `GIT_RELEASE`                                     | `string`  | `null`                                                            |
| Release commit                            | `GIT_COMMIT`                                      | `string`  | `null`                                                            |
| DeepTrace's DSN                           | `APPIFY_DEEPTRACE_DSN` or `DEEPTRACE_DSN`         | `string`  | `null`                                                            |
| DeepTrace's agent timeout                 | `APPIFY_DEEPTRACE_TIMEOUT` or `DEEPTRACE_TIMEOUT` | `number`  | 3000                                                              |
| Morgan request logger format              | `APPIFY_MORGAN_FORMAT`                            | `string`  | :method :url :status :: :response-time ms :: :res[deeptrace-id]   |
| Sentry's DSN                              | `APPIFY_SENTRY_DSN` or `SENTRY_DSN`               | `string`  | `null`                                                            |
| HTTP Server binding socket                | `APPIFY_SERVER_BINDING_SOCKET`                    | `string`  | `undefined`                                                       |
| HTTP Server binding IP                    | `APPIFY_SERVER_BINDING_IP`                        | `string`  | 0.0.0.0                                                           |
| HTTP Server binding port                  | `APPIFY_SERVER_BINDING_PORT`                      | `number`  | 3000                                                              |
| Use HTTP `X-Forwarded-For` IP as user IP  | `APPIFY_SERVER_SPDY_X_FORWARDED_FOR`              | `boolean` | `true`                                                            |
| Send HTTP data as plain text              | `APPIFY_SERVER_SPDY_PLAIN`                        | `boolean` | `true`                                                            |
| Enable SSL                                | `APPIFY_SERVER_SPDY_SSL`                          | `boolean` | `false`                                                           |
| Path to SSL key                           | `APPIFY_SERVER_SSL_KEY`                           | `string`  | `undefined`                                                       |
| Path to SSL cert                          | `APPIFY_SERVER_SSL_CERT`                          | `string`  | `undefined`                                                       |
