optioner
Version:
Process and validate options for your module.
105 lines (68 loc) • 2.68 kB
Markdown
> Process and validate options for your module.
[![npm version][npm-badge]][npm-url]
[![Build Status][travis-badge]][travis-url]
[![Gitter][gitter-badge]][gitter-url]
Specify a deeply-merged set of [hapijs joi][joi] rules and defaults to
process options provided to your module.
Users of your module can quickly debug issues as they get immediate
feedback on configuration issues, and you can provide a user friendly
set of defaults.
This provides essentially the same behavior as
[](https://lodash.com/docs#defaultsDeep), but also
gives you validation, and more intelligent array handling (per element
control).
You can use [joi] rules directly, or literal values, which are
translated into rules of the form: `Joi.<type>().default(<value>)`
where _type_ is the type of the value.
## Quick Example
```js
var Optioner = require('optioner')
var check = Optioner({beatles: 4}).check
// prints { beatles: 4, stones: 5 }
console.log(check({stones: 5}))
var optioner = Optioner({
color: 'red',
size: Joi.number().integer().max(5).min(1).default(3),
range: [100, 200]
})
var promise = optioner({size: 2})
// prints: { color: 'red', size: 2, range: [ 100, 200 ] }
promise
.then(console.log)
// prints: { color: 'red', size: 2, range: [ 100, 200 ] }
console.log(promise.value)
optioner({}, function (err, out) {
// prints: { color: 'red', size: 3, range: [ 100, 200 ] }
console.log(out)
})
optioner({range: [50]}, function (err, out) {
// prints: { range: [ 50, 200 ], color: 'red', size: 3 }
console.log(out)
})
optioner({size: 6}, function (err, out) {
// prints: child "size" fails because ["size" must be less than or equal to 5
console.log(err)
})
```
`Optioner({ ... spec ... }, { ... options ... }})`
* _allow_unknown_: `true|false`, default `true`; allow unknown properties
* _must_match_literals_: `true|false`, default `false`; force exact matches of literal values
* NOTE: requires `@hapi/joi` >= 16, as: https://github.com/hapijs/joi/issues/2037
[@rjrodger](https://twitter.com/rjrodger)
[![Gitter][gitter-badge]][gitter-url]
Copyright (c) 2016, Richard Rodger and other contributors.
Licensed under [MIT][].
[]: ./LICENSE
[]: https://badge.fury.io/js/optioner.svg
[]: https://badge.fury.io/js/optioner
[]: https://travis-ci.org/rjrodger/optioner.svg
[]: https://travis-ci.org/rjrodger/optioner
[]: https://badges.gitter.im/Join%20Chat.svg
[]: https://gitter.im/rjrodger/seneca
[]: https://github.com/rjrodger/optioner/issues
[]: https://github.com/hapijs/joi