errors.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0;
  4. const codegen_1 = require("./codegen");
  5. const names_1 = require("./names");
  6. exports.keywordError = {
  7. message: ({ keyword }) => codegen_1.str `should pass "${keyword}" keyword validation`,
  8. };
  9. exports.keyword$DataError = {
  10. message: ({ keyword, schemaType }) => schemaType
  11. ? codegen_1.str `"${keyword}" keyword must be ${schemaType} ($data)`
  12. : codegen_1.str `"${keyword}" keyword is invalid ($data)`,
  13. };
  14. function reportError(cxt, error = exports.keywordError, overrideAllErrors) {
  15. const { it } = cxt;
  16. const { gen, compositeRule, allErrors } = it;
  17. const errObj = errorObjectCode(cxt, error);
  18. if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : (compositeRule || allErrors)) {
  19. addError(gen, errObj);
  20. }
  21. else {
  22. returnErrors(it, codegen_1._ `[${errObj}]`);
  23. }
  24. }
  25. exports.reportError = reportError;
  26. function reportExtraError(cxt, error = exports.keywordError) {
  27. const { it } = cxt;
  28. const { gen, compositeRule, allErrors } = it;
  29. const errObj = errorObjectCode(cxt, error);
  30. addError(gen, errObj);
  31. if (!(compositeRule || allErrors)) {
  32. returnErrors(it, names_1.default.vErrors);
  33. }
  34. }
  35. exports.reportExtraError = reportExtraError;
  36. function resetErrorsCount(gen, errsCount) {
  37. gen.assign(names_1.default.errors, errsCount);
  38. gen.if(codegen_1._ `${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign(codegen_1._ `${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null)));
  39. }
  40. exports.resetErrorsCount = resetErrorsCount;
  41. function extendErrors({ gen, keyword, schemaValue, data, errsCount, it, }) {
  42. /* istanbul ignore if */
  43. if (errsCount === undefined)
  44. throw new Error("ajv implementation error");
  45. const err = gen.name("err");
  46. gen.forRange("i", errsCount, names_1.default.errors, (i) => {
  47. gen.const(err, codegen_1._ `${names_1.default.vErrors}[${i}]`);
  48. gen.if(codegen_1._ `${err}.dataPath === undefined`, () => gen.assign(codegen_1._ `${err}.dataPath`, codegen_1.strConcat(names_1.default.dataPath, it.errorPath)));
  49. gen.assign(codegen_1._ `${err}.schemaPath`, codegen_1.str `${it.errSchemaPath}/${keyword}`);
  50. if (it.opts.verbose) {
  51. gen.assign(codegen_1._ `${err}.schema`, schemaValue);
  52. gen.assign(codegen_1._ `${err}.data`, data);
  53. }
  54. });
  55. }
  56. exports.extendErrors = extendErrors;
  57. function addError(gen, errObj) {
  58. const err = gen.const("err", errObj);
  59. gen.if(codegen_1._ `${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, codegen_1._ `[${err}]`), codegen_1._ `${names_1.default.vErrors}.push(${err})`);
  60. gen.code(codegen_1._ `${names_1.default.errors}++`);
  61. }
  62. function returnErrors(it, errs) {
  63. const { gen, validateName, schemaEnv } = it;
  64. if (schemaEnv.$async) {
  65. gen.throw(codegen_1._ `new ${it.ValidationError}(${errs})`);
  66. }
  67. else {
  68. gen.assign(codegen_1._ `${validateName}.errors`, errs);
  69. gen.return(false);
  70. }
  71. }
  72. const E = {
  73. keyword: new codegen_1.Name("keyword"),
  74. schemaPath: new codegen_1.Name("schemaPath"),
  75. params: new codegen_1.Name("params"),
  76. propertyName: new codegen_1.Name("propertyName"),
  77. message: new codegen_1.Name("message"),
  78. schema: new codegen_1.Name("schema"),
  79. parentSchema: new codegen_1.Name("parentSchema"),
  80. // JTD error properties
  81. instancePath: new codegen_1.Name("instancePath"),
  82. };
  83. function errorObjectCode(cxt, error) {
  84. const { createErrors, opts } = cxt.it;
  85. if (createErrors === false)
  86. return codegen_1._ `{}`;
  87. return (opts.jtd && !opts.ajvErrors ? jtdErrorObject : ajvErrorObject)(cxt, error);
  88. }
  89. function jtdErrorObject(cxt, { message }) {
  90. const { gen, keyword, it } = cxt;
  91. const { errorPath, errSchemaPath, opts } = it;
  92. const keyValues = [
  93. [E.instancePath, codegen_1.strConcat(names_1.default.dataPath, errorPath)],
  94. [E.schemaPath, codegen_1.str `${errSchemaPath}/${keyword}`],
  95. ];
  96. if (opts.messages) {
  97. keyValues.push([E.message, typeof message == "function" ? message(cxt) : message]);
  98. }
  99. return gen.object(...keyValues);
  100. }
  101. function ajvErrorObject(cxt, error) {
  102. const { gen, keyword, data, schemaValue, it } = cxt;
  103. const { topSchemaRef, schemaPath, errorPath, errSchemaPath, propertyName, opts } = it;
  104. const { params, message } = error;
  105. const keyValues = [
  106. [E.keyword, keyword],
  107. [names_1.default.dataPath, codegen_1.strConcat(names_1.default.dataPath, errorPath)],
  108. [E.schemaPath, codegen_1.str `${errSchemaPath}/${keyword}`],
  109. [E.params, typeof params == "function" ? params(cxt) : params || codegen_1._ `{}`],
  110. ];
  111. if (propertyName)
  112. keyValues.push([E.propertyName, propertyName]);
  113. if (opts.messages) {
  114. keyValues.push([E.message, typeof message == "function" ? message(cxt) : message]);
  115. }
  116. if (opts.verbose) {
  117. keyValues.push([E.schema, schemaValue], [E.parentSchema, codegen_1._ `${topSchemaRef}${schemaPath}`], [names_1.default.data, data]);
  118. }
  119. return gen.object(...keyValues);
  120. }
  121. //# sourceMappingURL=errors.js.map