Build strong and efficient REST web services.
Why write code when you have an OpenAPI definition?
Whook eats your documentation and provide you with a performant router that take care of running the right code for the right operation.
By using the OpenAPI standard and the dependency injection pattern, Whook provides a convenient, highly modular and easily testable back end framework.
Work in progress
I'd like to end up with a quick start guide looking like that:
# Initialize the project
mkdir simple_server && cd simple_server;
npm init whook simple_server;
npm install;
# Check install with a dry run of the server
DRY_RUN=1 npm run start
But atm, I only need it for my projects so leaving this as is in the meanwhile. If you're still motivated to use it, you should be prepared to face issues. That said, I'll help as much as I can if you have any question.
This projects aims to make creating well documented and highly customizable REST APIs a breeze.
By relying on the OpenAPI format to declare a new endpoint, this project forces documentation before code. It also is highly customizable since based on the dependency injection with inversion of control pattern allowing you to override or wrap its main constituents.
The Whook route handling flow is very simple.
First, we have a HTTPServer that handles requests an serve responses
(the httpServer
service).
Then, the httpTransaction
transform the NodeJS requests into raw
serializable ones (raw objects with no methods nor internal states).
Then the router (httpRouter
) deal with that request to test which
handler need to be run by comparing the method/path couple with the
OpenAPI operations declarations.
Once found, it simply runs the right handler with the OpenAPI parameters value filled from the serializable request. The handler simply have to return a serializable response object in turn.
If any error occurs within this process, than the errorHandler
is responsible for providing the now lacking response object
based on the error it catches.
And that's it, you have your REST API. We have no middleware concept here. Instead, every handler is a simple function taking an object and returning another one. It makes those objects very easily composable (in a functional programming sense).
You may add global wrappers to change every handlers input/output on the fly or add a local wrapper specifically to one of a few handlers.
Clone this project repository and run:
npm i
The repository is based on LernaJS that allows to host several NPM packages in a single repository. That said, to keep it simple it only proxies the packages commands.