index.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { isAddress, toHex } from '../utils/address.js';
  2. import { isNotNullOrUndefined, isInteger, isString, isObject, isValidURL, isHex, isBoolean } from '../utils/validations.js';
  3. export class Validator {
  4. invalid(param) {
  5. return param.msg || `Invalid ${param.name}${param.type === 'address' ? ' address' : ''} provided`;
  6. }
  7. notPositive(param) {
  8. return `${param.name} must be a positive integer`;
  9. }
  10. notEqual(param) {
  11. return param.msg || `${param.names?.[0]} can not be equal to ${param.names?.[1]}`;
  12. }
  13. notValid(params) {
  14. const normalized = {};
  15. let no = false;
  16. for (const param of params) {
  17. const { name, names, value, type, gt, lt, gte, lte, optional } = param;
  18. if (optional && (!isNotNullOrUndefined(value) || (type !== 'boolean' && value === false)))
  19. continue;
  20. normalized[name] = param.value;
  21. switch (type) {
  22. case 'address':
  23. if (!isAddress(value)) {
  24. no = true;
  25. }
  26. else {
  27. normalized[name] = toHex(value);
  28. }
  29. break;
  30. case 'integer':
  31. if (!isInteger(value) ||
  32. (typeof gt === 'number' && value <= gt) ||
  33. (typeof lt === 'number' && value >= lt) ||
  34. (typeof gte === 'number' && value < gte) ||
  35. (typeof lte === 'number' && value > lte)) {
  36. no = true;
  37. }
  38. break;
  39. case 'positive-integer':
  40. if (!isInteger(value) || value <= 0) {
  41. throw new Error(this.notPositive(param));
  42. }
  43. break;
  44. case 'tokenId':
  45. if (!isString(value) || !value.length) {
  46. no = true;
  47. }
  48. break;
  49. case 'notEmptyObject':
  50. if (!isObject(value) || !Object.keys(value).length) {
  51. no = true;
  52. }
  53. break;
  54. case 'notEqual':
  55. if (names && normalized[names[0]] === normalized[names[1]]) {
  56. throw new Error(this.notEqual(param));
  57. }
  58. break;
  59. case 'resource':
  60. if (!['BANDWIDTH', 'ENERGY'].includes(value)) {
  61. no = true;
  62. }
  63. break;
  64. case 'url':
  65. if (!isValidURL(value)) {
  66. no = true;
  67. }
  68. break;
  69. case 'hex':
  70. if (!isHex(value)) {
  71. no = true;
  72. }
  73. break;
  74. case 'array':
  75. if (!Array.isArray(value)) {
  76. no = true;
  77. }
  78. break;
  79. case 'not-empty-string':
  80. if (!isString(value) || !value.length) {
  81. no = true;
  82. }
  83. break;
  84. case 'boolean':
  85. if (!isBoolean(value)) {
  86. no = true;
  87. }
  88. break;
  89. case 'string':
  90. if (!isString(value) ||
  91. (typeof gt === 'number' && value.length <= gt) ||
  92. (typeof lt === 'number' && value.length >= lt) ||
  93. (typeof gte === 'number' && value.length < gte) ||
  94. (typeof lte === 'number' && value.length > lte)) {
  95. no = true;
  96. }
  97. break;
  98. }
  99. if (no) {
  100. throw new Error(this.invalid(param));
  101. }
  102. }
  103. return false;
  104. }
  105. }
  106. //# sourceMappingURL=index.js.map