Enable use of protocols (such as file:, buffer:, or method:) in configuration files.
npm install shortstopshortstop
=========

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.
``javascript
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":
// "ssl" {
// "pfx":
// "key":
// }
// }
});
`
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 signature function (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 signature function (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 signature function (err, result).
`javascript
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":
// "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.
`javascript
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"
// }
});
});
``