Sometimes JSON just isn't enough for configuration needs. Occasionally it would be nice to use arbitrary types as values, but JSON is necessarily a subset of all available JS types. shortstop enables the use of protocols and handlers to enable identification and special handling of json values.
var fs = require('fs'); var shortstop = require('shortstop'); function buffer(value) { return new Buffer(value); } var resolver, json; resolver = shortstop.create(); resolver.use('buffer', buffer); resolver.use('file', fs.readFile); json = { "secret": "buffer:SGVsbG8sIHdvcmxkIQ==", "ssl": { "pfx": "file:foo/bar", "key": "file:foo/baz.key", } }; resolver.resolve(json, function (err, data) { console.log(data); // { // "secret": <Buffer ... >, // "ssl" { // "pfx": <Buffer ... >, // "key": <Buffer ... > // } // } });parent(Object, optional) - An optional shortstop resolver. Returns a resolver instance.
protocol(String) - The protocol used to identify a property to be processed, e.g. "file"handler(Function) - The implementation of the given protocol with signaturefunction (value, [callback])
This method returns a function when invoked will remove the handler from the stack for this protocol.
data(Object) - The object, containing protocols in values, to be processed.callback(Function) - The callback invoked when the processing is complete with signaturefunction (err, result).
path(String) - The path to a file which is, or exports, JSON or a javascript object.callback(Function) - The callback invoked when the processing is complete with signaturefunction (err, result).
Multiple handlers can be registered for a given protocol. They will be executed in the order registered and the output of one handler will be the input of the next handler in the chain.
var fs = require('fs'), var path = require('path'), var shortstop = require('shortstop'); function resolve(value) { if (path.resolve(value) === value) { // Is absolute path already return value; } return path.join(process.cwd(), value); } var resolver, json; resolver = shortstop.create(); resolver.use('path', resolve); resolver.use('file', resolve); resolver.use('file', fs.readFile); json = { "key": "file:foo/baz.key", "certs": "path:certs/myapp" }; resolver.resolve(json, function (err, data) { console.log(data); // { // "key": <Buffer ... >, // "certs": "/path/to/my/certs/myapp" // } });When registered, handlers return an unregister function you can call when you no longer want a handler in the chain.
var path = require('path'); var shortstop = require('shortstop'); function resolve(value) { if (path.resolve(value) === value) { // Is absolute path already return value; } return path.join(process.cwd(), value); } var resolver, unuse, json; resolver = shortstop.create(); unuse = resolver.use('path', resolve); json = { "key": "path:foo/baz.key" }; resolver.resolve(json, function (err, data) { console.log(data); // { // "key": "/path/to/my/foo/baz.key" // } unuse(); resolver.resolve(json, function (err, data) { console.log(data); // { // "key": "path:foo/baz.key" // } }); });