Skip to content
This repository has been archived by the owner on Jul 2, 2021. It is now read-only.
/ cherry Public archive

A light framework to quickly create a web server

License

Notifications You must be signed in to change notification settings

Lund-Org/cherry

Repository files navigation

🍒 Cherry

Build Status Maintainability Test Coverage

Cherry is a lightweight framework to quickly generate a web server

🔌 Installation

Use the package manager npm to install Cherry.

npm install @lund-org/cherry

🔧 Usage

Checkout the example in the example folder.

For the development : To use the https mode, you need to generate the ssl keys, you can use this command in the config folder :

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/C=FR/ST=./L=./O=./OU=./CN=."

Warning : It doesn't work on Windows, you will only get the key.pem with this command. Let's find the way to do it on stackoverflow 😂


Hooks

Example here

You can hook some events and retrieve informations. It is useful to add some code at specific moment of the workflow.

Hook Name Data sent
beforeStartServer { cherry: <Cherry>, server: <CherryHTTPSServer or CherryHTTPServer> }
afterStartServer { cherry: <Cherry>, server: <CherryHTTPSServer or CherryHTTPServer> }
beforeStopServer { cherry: <Cherry>, server: <CherryHTTPSServer or CherryHTTPServer> }
afterStopServer { cherry: <Cherry>, server: <CherryHTTPSServer or CherryHTTPServer> }
beforeStartOrm { cherry: <Cherry>, orm: <The ORM plugin instance> }
afterStartOrm { cherry: <Cherry>, orm: <The ORM plugin instance> }
beforeStopOrm { cherry: <Cherry>, orm: <The ORM plugin instance> }
afterStopOrm { cherry: <Cherry>, orm: <The ORM plugin instance> }
beforeProcess { request: <CherryIncomingMessage>, response: <CherryServerResponse>, middlewares: <Array<Function>> }
afterProcess { request: <CherryIncomingMessage>, response: <CherryServerResponse>, processResult: <The return value of the callback> }

Route types

Example here and here

There is 2 types of route, the public folders to retrieve raw resources and the configured routes.

⚠️ The public routes are always resolved at first

Public routes
Route Name Description Options
PUBLIC_ROUTE_PUBLIC_FOLDER The folder where we will find a resource.

It's an entrypoint, it means that if you request a route /my/route.html, if you have it as a configured route and the same path available in your public folder, it will retrieve the file in the public folder and then quit
path : The absolute path of the folder
priority (optionnal) : The priority of check
Configured routes
Route Name Description Options
ROUTE_CONTEXT A wrapper of routes which allows to avoid to set the same thing for a bunch of routes.

For example, if you have an admin, you will have a middleware to check the authentication and the rights of the user. To not set it to every routes, you can put in on the ROUTE_CONTEXT and it will apply to subsequent routes
type : The type of route, here ROUTE_CONTEXT
collection : The array of subroutes
name (optionnal) : The name of the route which will be added before the name of the subroutes
method (optionnal) : The default HTTP method of the subroute, can be overriding
path (optionnal) : The leading path which will be added before the path of the subroutes
middlewares (optionnal) : The middlewares to execute for each subroutes
rules (optionnal) : The rules for route parameters if there is some in the path
ROUTE A configured route which will execute your code when requested type : The type of route, here ROUTE
path : The path of the route
callback : The method to execute when the route is requested
name (optionnal) : The name of the route. It can be useful to detect it in a hook
method (optionnal) : The HTTP method of the route, it overrides the value set in the context (if present)
middlewares (optionnal) : The middlewares to execute before accessing to the callback
rules (optionnal) : The rules for route parameters if there is some in the path

📜 To do list

📂 Resources

View engine plugin

ORM plugin

💻 Applications using Cherry (as a real example)

  • Livedeck-server : This project is the core of the livedeck project. It's the central point between the web/smartphone client and the software client. Like a bridge but with a database.

✏️ Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

📖 License

MIT