Skip to content

Form class for node.js with validation (synchronous and asynchronous), post-processing, and support for handlebars templates.

License

Notifications You must be signed in to change notification settings

bleskomat/form-node

Repository files navigation

form-node

Build Status

Form class for node.js with validation (synchronous and asynchronous), post-processing, and support for handlebars templates.

Installation

Add to your application via npm:

npm install @bleskomat/form

Usage

To use with express-handlebars:

const bodyParser = require('body-parser');
const express = require('express');
const Form = require('@bleskomat/form');
const Handlebars = require('express-handlebars');
const path = require('path');
const { ValidationError } = Form;

const app = express();

const hbs = Handlebars.create({
	extname: '.html',
	helpers: Form.handlebars.helpers,
	partialsDir: [
		path.join(__dirname, 'views', 'partials'),
		Form.handlebars.partialsDir,
	],
});

app.engine('.html', hbs.engine);
app.set('view engine', '.html');
app.set('views', path.join(__dirname, 'views'));
app.enable('view cache');

// Parse application/x-www-form-urlencoded:
app.use(bodyParser.urlencoded({ extended: false }));

const form = new Form({
	title: 'Form partial example',
	action: '/form',
	groups: [
		{
			name: 'login',
			inputs: [
				{
					name: 'username',
					label: 'Username',
					required: true,
					validate: function(value, data) {
						// `value` contains the value submitted for this field.
						// `data` is an object which contains all form data.
						// Perform custom validations for this field here.
						// Throw an error here to fail the validation.
						// Optionally return an instance of Promise to perform asynchronous validation.
					},
					process: function(value) {
						// `value` contains the value submitted for this field.
						// Perform custom processing for this field's value.
						return value;
					},
				},
				{
					name: 'password',
					label: 'Password',
					required: true,
				},
			],
		},
	],
});

app.get('/form', function(req, res, next) {
	res.render('form', {
		form: form.serialize(),
	});
});

app.post('/form', function(req, res, next) {
	// `req.body` is provided by the `bodyParser` middleware.
	form.validate(req.body).then(values => {
		// Validation successful.
		// `values` is an object which contains processed form data.
	}).catch(error => {
		if (error instanceof ValidationError) {
			res.status(400);
		} else {
			error = new Error('An unexpected error has occurred');
			res.status(500);
		}
		res.render('form', {
			form: form.serialize({
				errors: [ error.message ],
			}),
		});
	});
});

Tests

Run automated tests as follows:

npm test

Changelog

See CHANGELOG.md

License

This software is MIT licensed:

A short, permissive software license. Basically, you can do whatever you want as long as you include the original copyright and license notice in any copy of the software/source. There are many variations of this license in use.

About

Form class for node.js with validation (synchronous and asynchronous), post-processing, and support for handlebars templates.

Resources

License

Stars

Watchers

Forks

Packages

No packages published