ensure.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. "use strict";
  2. var isArray = require("./array/is")
  3. , toShortString = require("./lib/to-short-string");
  4. var objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable;
  5. var assign = function (target, source) {
  6. for (var key in source) {
  7. if (objPropertyIsEnumerable.call(source, key)) target[key] = source[key];
  8. }
  9. };
  10. module.exports = function (validationDatum1/*, ...validationDatumN, options */) {
  11. var validationData = [validationDatum1];
  12. var globalOptions;
  13. if (arguments.length > 1) {
  14. var hasOptions = !isArray(arguments[arguments.length - 1]);
  15. if (hasOptions) globalOptions = arguments[arguments.length - 1];
  16. var lastDatumIndex = hasOptions ? arguments.length - 2 : arguments.length - 1;
  17. for (var i = 1; i <= lastDatumIndex; ++i) validationData.push(arguments[i]);
  18. }
  19. var result = [], errors;
  20. for (var j = 0; j < validationData.length; ++j) {
  21. var validationDatum = validationData[j];
  22. var options = { name: validationDatum[0] };
  23. if (globalOptions) assign(options, globalOptions);
  24. if (validationDatum[3]) assign(options, validationDatum[3]);
  25. var resultItem;
  26. if (typeof validationDatum[2] !== "function") {
  27. throw new TypeError(toShortString(validationDatum[2]) + " is not a function");
  28. }
  29. try {
  30. resultItem = validationDatum[2](validationDatum[1], options);
  31. } catch (error) {
  32. if (!errors) errors = [];
  33. errors.push(error);
  34. }
  35. if (errors) continue;
  36. result.push(resultItem);
  37. }
  38. if (!errors) return result;
  39. if (errors.length === 1) throw errors[0];
  40. var ErrorConstructor = (globalOptions && globalOptions.Error) || TypeError;
  41. var errorMessage = "Approached following errors:";
  42. for (var k = 0; k < errors.length; ++k) {
  43. errorMessage += "\n - " + errors[k].message.split("\n").join("\n ");
  44. }
  45. throw new ErrorConstructor(errorMessage);
  46. };