fnArgs.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. var startWith = require('./startWith');
  2. var last = require('./last');
  3. var lowerCase = require('./lowerCase');
  4. var isObj = require('./isObj');
  5. var type = require('./type');
  6. exports = function(types, args) {
  7. var argsLen = args.length;
  8. var typesLen = types.length;
  9. var minLen = typesLen;
  10. var maxLen = typesLen;
  11. for (var i = 0; i < typesLen; i++) {
  12. var _type = types[i].split('|');
  13. if (startWith(_type[0], '?')) {
  14. _type[0] = _type[0].slice(1);
  15. if (minLen === typesLen) {
  16. minLen = i;
  17. }
  18. }
  19. if (i === typesLen - 1 && startWith(_type[0], '...')) {
  20. maxLen = Infinity;
  21. _type[0] = _type[0].slice(3);
  22. if (minLen === typesLen) {
  23. minLen = i;
  24. }
  25. }
  26. types[i] = _type;
  27. }
  28. if (argsLen < minLen) {
  29. throw Error(
  30. 'Expected at least '
  31. .concat(minLen, ' args but got ')
  32. .concat(argsLen)
  33. );
  34. } else if (argsLen > maxLen) {
  35. throw Error(
  36. 'Expected at most '.concat(maxLen, ' args but got ').concat(argsLen)
  37. );
  38. }
  39. for (var _i = 0; _i < argsLen; _i++) {
  40. var arg = args[_i];
  41. if (_i >= typesLen) {
  42. validateArg(arg, last(types), _i);
  43. } else {
  44. validateArg(arg, types[_i], _i);
  45. }
  46. }
  47. };
  48. function validateArg(value, types, num) {
  49. var isValid = false;
  50. for (var i = 0, len = types.length; i < len; i++) {
  51. var t = lowerCase(types[i]);
  52. if (
  53. t === 'any' ||
  54. (t === 'object' && isObj(value)) ||
  55. type(value) === t
  56. ) {
  57. isValid = true;
  58. break;
  59. }
  60. }
  61. if (!isValid) {
  62. throw TypeError(
  63. 'Argument '.concat(num, ' should be type ').concat(types.join('|'))
  64. );
  65. }
  66. }
  67. module.exports = exports;