You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							211 lines
						
					
					
						
							5.3 KiB
						
					
					
				
			
		
		
	
	
							211 lines
						
					
					
						
							5.3 KiB
						
					
					
				// Copyright (c) 2012, Mark Cavage. All rights reserved. | 
						|
// Copyright 2015 Joyent, Inc. | 
						|
 | 
						|
var assert = require('assert'); | 
						|
var Stream = require('stream').Stream; | 
						|
var util = require('util'); | 
						|
 | 
						|
 | 
						|
///--- Globals | 
						|
 | 
						|
/* JSSTYLED */ | 
						|
var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; | 
						|
 | 
						|
 | 
						|
///--- Internal | 
						|
 | 
						|
function _capitalize(str) { | 
						|
    return (str.charAt(0).toUpperCase() + str.slice(1)); | 
						|
} | 
						|
 | 
						|
function _toss(name, expected, oper, arg, actual) { | 
						|
    throw new assert.AssertionError({ | 
						|
        message: util.format('%s (%s) is required', name, expected), | 
						|
        actual: (actual === undefined) ? typeof (arg) : actual(arg), | 
						|
        expected: expected, | 
						|
        operator: oper || '===', | 
						|
        stackStartFunction: _toss.caller | 
						|
    }); | 
						|
} | 
						|
 | 
						|
function _getClass(arg) { | 
						|
    return (Object.prototype.toString.call(arg).slice(8, -1)); | 
						|
} | 
						|
 | 
						|
function noop() { | 
						|
    // Why even bother with asserts? | 
						|
} | 
						|
 | 
						|
 | 
						|
///--- Exports | 
						|
 | 
						|
var types = { | 
						|
    bool: { | 
						|
        check: function (arg) { return typeof (arg) === 'boolean'; } | 
						|
    }, | 
						|
    func: { | 
						|
        check: function (arg) { return typeof (arg) === 'function'; } | 
						|
    }, | 
						|
    string: { | 
						|
        check: function (arg) { return typeof (arg) === 'string'; } | 
						|
    }, | 
						|
    object: { | 
						|
        check: function (arg) { | 
						|
            return typeof (arg) === 'object' && arg !== null; | 
						|
        } | 
						|
    }, | 
						|
    number: { | 
						|
        check: function (arg) { | 
						|
            return typeof (arg) === 'number' && !isNaN(arg); | 
						|
        } | 
						|
    }, | 
						|
    finite: { | 
						|
        check: function (arg) { | 
						|
            return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg); | 
						|
        } | 
						|
    }, | 
						|
    buffer: { | 
						|
        check: function (arg) { return Buffer.isBuffer(arg); }, | 
						|
        operator: 'Buffer.isBuffer' | 
						|
    }, | 
						|
    array: { | 
						|
        check: function (arg) { return Array.isArray(arg); }, | 
						|
        operator: 'Array.isArray' | 
						|
    }, | 
						|
    stream: { | 
						|
        check: function (arg) { return arg instanceof Stream; }, | 
						|
        operator: 'instanceof', | 
						|
        actual: _getClass | 
						|
    }, | 
						|
    date: { | 
						|
        check: function (arg) { return arg instanceof Date; }, | 
						|
        operator: 'instanceof', | 
						|
        actual: _getClass | 
						|
    }, | 
						|
    regexp: { | 
						|
        check: function (arg) { return arg instanceof RegExp; }, | 
						|
        operator: 'instanceof', | 
						|
        actual: _getClass | 
						|
    }, | 
						|
    uuid: { | 
						|
        check: function (arg) { | 
						|
            return typeof (arg) === 'string' && UUID_REGEXP.test(arg); | 
						|
        }, | 
						|
        operator: 'isUUID' | 
						|
    } | 
						|
}; | 
						|
 | 
						|
function _setExports(ndebug) { | 
						|
    var keys = Object.keys(types); | 
						|
    var out; | 
						|
 | 
						|
    /* re-export standard assert */ | 
						|
    if (process.env.NODE_NDEBUG) { | 
						|
        out = noop; | 
						|
    } else { | 
						|
        out = function (arg, msg) { | 
						|
            if (!arg) { | 
						|
                _toss(msg, 'true', arg); | 
						|
            } | 
						|
        }; | 
						|
    } | 
						|
 | 
						|
    /* standard checks */ | 
						|
    keys.forEach(function (k) { | 
						|
        if (ndebug) { | 
						|
            out[k] = noop; | 
						|
            return; | 
						|
        } | 
						|
        var type = types[k]; | 
						|
        out[k] = function (arg, msg) { | 
						|
            if (!type.check(arg)) { | 
						|
                _toss(msg, k, type.operator, arg, type.actual); | 
						|
            } | 
						|
        }; | 
						|
    }); | 
						|
 | 
						|
    /* optional checks */ | 
						|
    keys.forEach(function (k) { | 
						|
        var name = 'optional' + _capitalize(k); | 
						|
        if (ndebug) { | 
						|
            out[name] = noop; | 
						|
            return; | 
						|
        } | 
						|
        var type = types[k]; | 
						|
        out[name] = function (arg, msg) { | 
						|
            if (arg === undefined || arg === null) { | 
						|
                return; | 
						|
            } | 
						|
            if (!type.check(arg)) { | 
						|
                _toss(msg, k, type.operator, arg, type.actual); | 
						|
            } | 
						|
        }; | 
						|
    }); | 
						|
 | 
						|
    /* arrayOf checks */ | 
						|
    keys.forEach(function (k) { | 
						|
        var name = 'arrayOf' + _capitalize(k); | 
						|
        if (ndebug) { | 
						|
            out[name] = noop; | 
						|
            return; | 
						|
        } | 
						|
        var type = types[k]; | 
						|
        var expected = '[' + k + ']'; | 
						|
        out[name] = function (arg, msg) { | 
						|
            if (!Array.isArray(arg)) { | 
						|
                _toss(msg, expected, type.operator, arg, type.actual); | 
						|
            } | 
						|
            var i; | 
						|
            for (i = 0; i < arg.length; i++) { | 
						|
                if (!type.check(arg[i])) { | 
						|
                    _toss(msg, expected, type.operator, arg, type.actual); | 
						|
                } | 
						|
            } | 
						|
        }; | 
						|
    }); | 
						|
 | 
						|
    /* optionalArrayOf checks */ | 
						|
    keys.forEach(function (k) { | 
						|
        var name = 'optionalArrayOf' + _capitalize(k); | 
						|
        if (ndebug) { | 
						|
            out[name] = noop; | 
						|
            return; | 
						|
        } | 
						|
        var type = types[k]; | 
						|
        var expected = '[' + k + ']'; | 
						|
        out[name] = function (arg, msg) { | 
						|
            if (arg === undefined || arg === null) { | 
						|
                return; | 
						|
            } | 
						|
            if (!Array.isArray(arg)) { | 
						|
                _toss(msg, expected, type.operator, arg, type.actual); | 
						|
            } | 
						|
            var i; | 
						|
            for (i = 0; i < arg.length; i++) { | 
						|
                if (!type.check(arg[i])) { | 
						|
                    _toss(msg, expected, type.operator, arg, type.actual); | 
						|
                } | 
						|
            } | 
						|
        }; | 
						|
    }); | 
						|
 | 
						|
    /* re-export built-in assertions */ | 
						|
    Object.keys(assert).forEach(function (k) { | 
						|
        if (k === 'AssertionError') { | 
						|
            out[k] = assert[k]; | 
						|
            return; | 
						|
        } | 
						|
        if (ndebug) { | 
						|
            out[k] = noop; | 
						|
            return; | 
						|
        } | 
						|
        out[k] = assert[k]; | 
						|
    }); | 
						|
 | 
						|
    /* export ourselves (for unit tests _only_) */ | 
						|
    out._setExports = _setExports; | 
						|
 | 
						|
    return out; | 
						|
} | 
						|
 | 
						|
module.exports = _setExports(process.env.NODE_NDEBUG);
 | 
						|
 |