| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | 'use strict';// Built-in typesvar types = [  'object',  'number',  'string',  'symbol',  'boolean',  'date',  'function', // Weird to expose this];function normalize(coercer, value) {  if (typeof value === 'function') {    if (coercer === 'function') {      return value;    }    value = value.apply(this, slice(arguments, 2));  }  return coerce(this, coercer, value);}function coerce(ctx, coercer, value) {  // Handle built-in types  if (typeof coercer === 'string') {    if (coerce[coercer]) {      return coerce[coercer].call(ctx, value);    }    return typeOf(coercer, value);  }  // Handle custom coercer  if (typeof coercer === 'function') {    return coercer.call(ctx, value);  }  // Array of coercers, try in order until one returns a non-null value  var result;  coercer.some(function(coercer) {    result = coerce(ctx, coercer, value);    return result != null;  });  return result;}coerce.string = function(value) {  if (value != null &&    typeof value === 'object' &&    typeof value.toString === 'function') {    value = value.toString();  }  return typeOf('string', primitive(value));};coerce.number = function(value) {  return typeOf('number', primitive(value));};coerce.boolean = function(value) {  return typeOf('boolean', primitive(value));};coerce.date = function(value) {  value = primitive(value);  if (typeof value === 'number' && !isNaN(value) && isFinite(value)) {    return new Date(value);  }};function typeOf(type, value) {  if (typeof value === type) {    return value;  }}function primitive(value) {  if (value != null &&    typeof value === 'object' &&    typeof value.valueOf === 'function') {    value = value.valueOf();  }  return value;}function slice(value, from) {  return Array.prototype.slice.call(value, from);}// Add methods for each typetypes.forEach(function(type) {  // Make it an array for easier concat  var typeArg = [type];  normalize[type] = function() {    var args = slice(arguments);    return normalize.apply(this, typeArg.concat(args));  };});module.exports = normalize;
 |