tree-house
Version:
NodeJS utilities and handy helpers extending ExpressJS functionalities
227 lines (157 loc) • 6.08 kB
Markdown
# Treehouse
NodeJS utilities and handy helpers extending ExpressJS functionalities
[](https://badge.fury.io/js/tree-house)
[](https://david-dm.org/icapps/tree-house.svg)
[](https://travis-ci.com/icapps/tree-house)
[](https://coveralls.io/github/icapps/tree-house)
[](https://greenkeeper.io/)
## Installation
Install via npm
```shell
npm install tree-house
```
or via yarn
```shell
yarn add tree-house
```
## Usage
```javascript
const treehouse = require('tree-house')
```
```javascript
import * as treehouse from 'tree-house'
```
## Security
### setBasicSecurity(app, route, options)
Set some basic Express security using `cors` and `helmet`.
```javascript
const app = express();
treehouse.setBasicSecurity(app, '*', {
cors: {}, // cors options
helmet: {}, // helmet options
})
```
- [All available helmet options](https://github.com/helmetjs/helmet)
- [All available cors options](https://github.com/expressjs/cors)
### setBodyParser(app, route, options)
Set a body parser using the `body-parser` module
```javascript
const app = express();
treehouse.setBodyParser(app, '*', {
json: {}, // json options
raw: {}, // raw options
text: {}, // text options
urlEncoded: {}, // urlEncoded options
})
```
- [All available body parser options](https://github.com/expressjs/body-parser)
### getRateLimiter(options)
Get a rate limiter instance to prevent brute force attacks. This can be used as a middleware in Express.
At the moment there is support for a built in-memorystore or Redis. Both use the `express-rate-limit` module.
```javascript
const app = express();
// In memory store (development purposes)
const globalRateLimiter = treehouse.getRateLimiter({
max: 100, // limit each IP to 100 requests per windowMs
delayMs: 0 // disable delaying - full speed until the max limit is reached
windowMs: 60 * 60 * 1000, // 1 hour window
message:
"Too many accounts created from this IP, please try again after an hour"
});
app.use('/login', globalRateLimiter, ...);
// Using existing Redis client
treehouse.getRateLimiter({
redis: {
client: existingClient, // All Redis options or 'client' to use an existing client (see rate-limit-redis)
},
});
```
- [All available Express-rate-limit options](https://github.com/nfriedly/express-rate-limit)
- [All available Redis options](https://github.com/NodeRedis/node_redis)
## Responder
### handleAsyncFn((req, res, next(optional)) => { ... })
Express middleware that wraps and executes a given function with try/catch to avoid unhandled promises within Express.
```javascript
const app = express();
function getAllUsers(req, res) {
// res.send(users) -> return users...
// or
// if an unhandled error occurs this will be passed onto the Express error handler instead of raising an UnhandledPromiseRejectionError
}
app.use('/users', treehouse.handleAsyncFn(getAllUsers));
```
## Server
### startServer(app, options)
Start an http or https server using an express instance
```javascript
const app = express();
treehouse.startServer(app, {
port: 3000,
title: 'My app',
pre: preFn, // function to execute before starting server (optional)
post: postFn, // function to execute after starting server (optional) - will contain the http server as first argument
https: { // optional
port: 3001,
privateKey: 'assets/ssl.key',
certificate: 'assets/ssl.cert',
},
keepAliveTimeout: 60000, // optional
headersTimeout: 60000, // optional
})
```
## Swagger
### setSwagger(app, route, filePath, options)
Serve Swagger UI via the a provided Swagger yaml file OR folder with valid structure and yaml files.
### YAML file implementation
```javascript
const app = express();
await treehouse.setSwagger(app, '/documentation', 'documentation/swagger.yml', {
host: 'localhost:3000',
schemes: ['http'],
};
```
- [All available swagger-ui options](https://github.com/swagger-api/swagger-ui)
### Folder implementation with valid structure
Structure
```bash
.
├── validFolderName
| ├── index.yml # contains basic info + definition models
| └── routes
| ├── route1.yml
| └── randomName.yml
| ├── ... # more yml files
```
Example code
```javascript
const app = express();
treehouse.setSwagger(app, '/documentation', 'documentation/validFolderName', {
host: 'localhost:3000',
schemes: ['http'],
concatenate : true, // The property to enable folder functionality
};
```
- [All available swagger-ui options](https://github.com/swagger-api/swagger-ui)
## Validator
### validateSchema(schema, options)
Express middleware to validate a Joi schema using the `express-validation` module. This will throw an error as an instance of ExpressValidationError if the Joi validation fails.
```javascript
const schema = {
body: Joi.object({
name: Joi.string().required(),
})
};
app.post('/my-endpoint', treehouse.validateSchema(schema), ...);
```
- [All available express-validation options](https://github.com/AndrewKeig/express-validation)
## Tests
- You can run `npm run test` to run all tests
- You can run `npm run test:coverage` to run all tests with coverage report
## Bugs
When you find issues, please report them:
- web: [https://github.com/icapps/tree-house/issues](https://github.com/icapps/tree-house/issues)
Be sure to include all of the output from the npm command that didn't work as expected. The npm-debug.log file is also helpful to provide.
## Authors
See the list of [contributors](https://github.com/icapps/tree-house/contributors) who participated in this project.
## License
This project is licensed under the ISC License - see the [LICENSE.md](LICENSE.md) file for details