Travis
npm Version
Coveralls?? we need to get istanbul running with testem.
npm big badge
Coming from a strongly typed language I wanted to learn and know the typing in javascript. So I wrote the code to interpret it and made it available. I also never liked that the typeof operator led to string compare.
Finally I liked how you could just write an object inline in javascript and I saw that the best way to convey the signature of the object.
This is my first released node module param-signatures.
I put together my first node module with tests and uploaded it but it did not draw any use.
When I investigated changing it into a js library for the web it looked like a complete rewrite so I started a new repository.
In the browser a global jsigs is loaded. In node you require('jsigs'); and then use it.
jsigs.CODES = {
BOOLEAN: 0,
NUMBER: 1,
STRING: 2,
FUNCTION: 3,
OBJECT: 4,
UNDEFINED: 5,
NULL: 6,
DATE: 7,
ARRAY: 8
},
jsigs.getTypeCode = function(value) {}
jsigs.isTypeCode = function(value, typeCode) {}
jsigs.typeCodeToString = function(typeCode) {}
jsigs.validateFunction = function(value, parameterCount) {}
jsigs.validateArray = function(array, typeCode) {}
jsigs.validate = function(object, signature) {}
jsigs.mergeAndReturn = function(object, defaults) {}
jsigs.validateListData = function(list, childSig) {}
jsigs.interateIfValid= function(list, childSig, callback) {}
An enum or lookup of all the int values that represent the basic types in Javascript. This is because an int compare is one of the fastest hardware operation.
jsigs.CODES = {
BOOLEAN: 0,
NUMBER: 1,
STRING: 2,
FUNCTION: 3,
OBJECT: 4,
UNDEFINED: 5,
NULL: 6,
DATE: 7,
ARRAY: 8
}
Returns a typecode that will match one of the code in jsig.CODES.
// Usage
var options = {};
var typeCode = jsigs.getTypeCode(options);
if (typeCode === jsigs.CODES.OBJECT) {
doWork(options);
}
Returns a boolean if the typecode provided matches the value.
// Usage
var options = {};
if (jsigs.isTypeCode(options, jsigs.CODES.OBJECT)) {
doWork(options);
}
Converts an integer typecode into a string.
// Usage
function exposedApiCall(options) {
var typeCode = jsigs.getTypeCode(options);
if (typeCode !== jsgigs.CODES.OBJECT) {
throw new Error('I need an ' + jsigs.typeCodeToString(jsigs.CODES.OBJECT) + ' and you passed me a ' + jsigs.typeCodeToString(typeCode));
}
}
Returns a boolean if the value passed is a function and if the parameter counts match.
// Usage
function specialFunction(parameters) {
if (parameters.onComplete && jsigs.validateFunction(parameters.onComplete, 2)) {
var result = doWork();
parameters.onComplete(0, result);
}
}
Returns a boolean (True if successful; False otherwise) if the value passsed in is a list and all its members are the typeCode parameter passed in.
// Usage
function doSomethingCrazy(parameters) {
if (jsigs.validateArray(parameters,jsigs.CODES.STRING)) {
processStrings(parameters);
}
}
Throws an exception if the object passed does not match the signature object passed.
// Usage
function doWorkWithComplexOptions(params, options) {
// this throws if options does not have these 3 members with their types.
jsigs.validate(options, {
log: false,
nesting: 10,
context: 'A string'
});
if (options.log) {
console.log('Options passed', options);
}
}
Returns the original object if the signature matches or merges in the defaults provided in the signature.
function doWork(parameters, options) {
var defaults = {
verbose: false,
onComplete: function(e) {}
};
var finalOpts = jsgis.mergeAndReturn(options, defaults);
// finalOpts will have the orignal value for verbose passed in
// and the default empty callback function
if (finalOpts.verbose) {
console.log('options to use', finalOpts);
}
finalOpts.onComplete(10);
}
doWork({ one:1, two:2, three: 3}, {
verbose: true,
});
Returns a boolean indicating if all the data in the array matches the child signature passed.
// Usage
var array = [
{ important: true, value: 3.14, name: 'Little PI' },
{ important: true, value: 2.718, name: 'Euler\'s Number' },
{ important: true, value: 299792458, name: 'Speed of Light' },
{ important: false, value: 115, name: 'Days until my birthday' },
];
var childSig = {
important: false, // boolean
value: 10, // NUMBER
name: 'A name' //STRING
}
if (jsigs.validateList(array, childSig)) {
array.forEach(function((item) {
console.log(item.name);
console.log('Important? ' + item.important);
console.log('Times 2', item.value * 2);
});
}
Loops over the child items if they all obey the same signature.
// Usage
var array = [
{ important: true, value: 3.14, name: 'Little PI' },
{ important: true, value: 2.718, name: 'Euler\'s Number' },
{ important: true, value: 299792458, name: 'Speed of Light' },
{ important: false, value: 115, name: 'Days until my birthday' },
];
var childSig = {
important: false, // boolean
value: 10, // NUMBER
name: 'A name' //STRING
}
jsigs.iterateIfValid(array, childSig, function(item) {
console.log(item.name);
console.log('Important? ' + item.important);
console.log('Times 2', item.value * 2);
});
I used the following packages...
- jasmine for node testing.
- Testem for browser testing...(I never got karma off the ground).
- Handlebars for merging javascript source files.
- Cmder for command line execution.
- Atom for code editing.
I program on a Windows 10 box so if you find a bug specific to platform I will try to enlist you.
- Minimize with version jsigs.1.0.0.min.js
[ ] - COMPLEX should use a common derive mechanism to test.
-
Get testem runnign with istanbul linky issue linky
-
Try to get node coverage and combine them. linky
New plan integrate typecodes and expose the functions on jsigs and use internally.
Need to analyze all of jsigs and see if there is anything else to break out.