Skip to content

Use Grunt and Tiny Validator tv4 to validate files against json-schema draft v4

License

Notifications You must be signed in to change notification settings

timbeadle/grunt-tv4

Repository files navigation

grunt-tv4

npm version Downloads/month Build Status XO code style Code Climate DepShield Badge Known Vulnerabilities

Use grunt and Tiny Validator tv4 to validate values against json-schema draft v4

Getting Started

This plugin requires Grunt >=1.5.0

If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:

$ npm install grunt-tv4 --save-dev

Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:

grunt.loadNpmTasks('grunt-tv4');

The "tv4" task

Notes

API change

As of version v0.2.0 the API was changed to follow the Grunt options- and file-selection conventions. The old pattern (which abused the destination-specifier) is no longer supported. The readme for the previous API can be found here.

The root schema must now to be specified as options.root.

Example

Basic usage

Validate from .json files:

grunt.initConfig({
	tv4: {
		options: {
		    root: grunt.file.readJSON('schema/main.json')
		},
		myTarget: {
			src: ['data/*.json']
		}
	}
})

Valdiate values:

grunt.initConfig({
	tv4: {
		myTarget: {
			options: {
				root: {
					type: 'object',
					properties: { ... }
				}
			},
			values: [
				{ ... },
				{ ... }
			]
		}
	}
})

Advanced usage

grunt.initConfig({
	tv4: {
		options: {
			// specify the main schema, one of:
            // - path to json
            // - http-url
            // - schema object
            // - callback that returns one of the above
			root: grunt.file.readJSON('schema/main.json'),

			// show multiple errors per file (off by default)
			multi: true,

			// create a new tv4 instance for every target (off by default)
			fresh: true,

			// add schemas in bulk (each required to have an 'id' property) (can be a callback)
			add: [
				 grunt.file.readJSON('schema/apple.json'),
				 grunt.file.readJSON('schema/pear.json')
			],

			// set schemas by URI (can be a callback)
			schemas: {
				'http://example.com/schema/apple': grunt.file.readJSON('schema/apple.json'),
				'http://example.com/schema/pear': grunt.file.readJSON('schema/pear.json')
			},

			// map of custom formats passed to tv4.addFormat()
			formats: {
				date: function (data, schema) {
					if (typeof data !== 'string' || !dateRegex.test(data)) {
						return 'value must be string of the form: YYYY-MM-DD';
					}
					return null;
				}
			},

			// passed to tv4.validate()
			checkRecursive: false,
			// passed to tv4.validate()
			banUnknownProperties: false,
			// passed tv4.language()
			language: 'de',
			// passed tv4.addLanguage()
			languages: {
				'de': { ... }
			}
		},
		// load json from disk
		myFiles: {
			src: ['data/*.json', 'data/fruit/**/*.json']
		},

		myValues: {
			// validate values
			values: [
				grunt.file.readJSON('data/apple.json'),
				grunt.file.readJSON('data/pear.json')
			],
		},

		myValueMap: {
			// alternately pass as object and the keys will be used as labels in the reports
			values: {
				'apple': grunt.file.readJSON('data/apple.json'),
				'pear': grunt.file.readJSON('data/pear.json')
			},
		},

		myCallback: {
			// alternately pass a function() to return a collection of values (array or object)
			values: function() {
				return {
					'apple': grunt.file.readJSON('data/apple.json'),
					'pear': grunt.file.readJSON('data/pear.json')
				}
			}
		}
	}
})

History

Contributing

In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.