webframe

Webframe is a small and dependency free web application framework.

Usage

Install:

npm install --save webframe

Use:

var webframe = require("webframe"); var app = new webframe.App();

Or from the command line:

npm install -g webframe webframe [directory]

The file example.js contains an example of a small web application.

Why a new web framework?

A new installation of express is 2.3 megabytes. You end up with 42 dependencies in your node_modules directory. The Koa framework is 2.5 megabytes, with 36 dependencies. This isn't bad for a big web application, but I write a lot of tiny web applications where megabytes of dependencies just feels wrong. As a result, I have in the past often just used the http module directly. This framework is a nice middle ground; it provides some of the utility of big web frameworks, but without adding a ton of extra dependencies to the application.

Documentation

Creates a new instance, with an optional options argument.

Options:

server : Your own HTTP (like the one created by http.createHttpServer).

: Your own HTTP (like the one created by http.createHttpServer). listen : Whether to call the listen method on the server. Defaults to true.

: Whether to call the method on the server. Defaults to true. port : The port to listen on. Defaults to the PORT environment variable, or 8080.

: The port to listen on. Defaults to the PORT environment variable, or 8080. host : The host to listen on. Defaults to the HOSTNAME environment variable, or "127.0.0.1". For the server to be accessible to the outside world, listen on "0.0.0.0".

: The host to listen on. Defaults to the HOSTNAME environment variable, or "127.0.0.1". For the server to be accessible to the outside world, listen on "0.0.0.0". client_utils : Whether to add some utility functions to /webframe.js. Defaults to false.

: Whether to add some utility functions to /webframe.js. Defaults to false. res404 : The string to return for a 404 error. "{{pathname}}" will be replaced with the pathname.

: The string to return for a 404 error. "{{pathname}}" will be replaced with the pathname. res403 : The string to return for a 403 error. "{{pathname}}" will be replaced with the pathname.

var app = new webframe.App({ client_utils: true });

app.route(method, path [, middleware], func)

Add a route.

method : What HTTP method the route should be available at. Valid options: "GET", "POST", "PUT", "DELETE", or "ALL".

: What HTTP method the route should be available at. Valid options: "GET", "POST", "PUT", "DELETE", or "ALL". path : The path. If it starts with a "^", it will be interpreted as a regular expression (with new RegExp(path) ), and the route will be ran on all matching paths. Routes without a pattern are prioritized over those with a pattern.

: The path. If it starts with a "^", it will be interpreted as a regular expression (with ), and the route will be ran on all matching paths. Routes without a pattern are prioritized over those with a pattern. middleware : Optional. An array of middleware functions which will be ran before the route's function.

: Optional. An array of middleware functions which will be ran before the route's function. func : function(request, response). The function which handles the request.

Utility functions which just call app.route() with a predefined method value.

E.g app.get("/foo", handler) is the same as app.route("GET", "/foo", handler) .

Logging functions. They all print a message. app.panic also exits, and is intended for errors so bad you have to crash.

In the future, it will be possible to control the logging level.

Middleware

webframe.middleware contains middleware for the route functions.

webframe.middleware.cookies : Adds request.cookies , parsed COOKIE header.

: Adds , parsed COOKIE header. webframe.middleware.params : Adds request.params , parsed URL parameters.

: Adds , parsed URL parameters. webframe.middleware.payload : Adds request.payload , a string (max 50 kilobytes) of the request payload.

In the future, there will be middleware for form data over POST too.

Modifications to the request and response objects

req.urlobj : The result of url.parse(req.url) .

: The result of . res.json(object) : A utility function to respond with JSON.

Serve static files.

app.get("^.*", webframe.static("web")) will serve all the files in the web directory, so /index.html will serve web/index.html .

will serve all the files in the directory, so will serve . app.get("^/static/.*", webframe.static("web", "/static")) will serve all files in the web directory under /static , so /static/script.js will serve web/script.js .

Transformations - app.transform(extension, mime, func)

Webframe has a way to transform files of one file type to an other, for example transforming typescript into javascript, or sass into CSS.

extension : The file extension to transform.

: The file extension to transform. mime : The result mime type.

: The result mime type. func : function(path, writeStream). The transform function. writeStream.headersSent : Whether headers have been sent or not. writeStream.status : The status code. Default: 200 (or 500 for errors) writeStream.headers : An object containing the headers to be sent. Default: { "content-type": <mime> } writeStream.write : function(data). Write response data. writeStream.end : function([data]). End the request, optionally with response data. writeStream.error : function(err). Log an error, respond with status code 500 (or the content of writeStream.status if it's not 200).

: function(path, writeStream). The transform function.

Example (assumes you have the node-sass module installed):

var sass = require("node-sass"); app.transform(".sass", "text/css", (path, writeStream) => { try { var str = fs.readFileSync(path, "utf8"); } catch (err) { writeStream.status = 404; return writeStream.error(err); } try { var result = sass.renderSync({ data: str }); writeStream.end(result.css); } catch (err) { writeStream.error(err); } });