if.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const codegen_1 = require("../../compile/codegen");
  4. const util_1 = require("../../compile/util");
  5. const validate_1 = require("../../compile/validate");
  6. const error = {
  7. message: ({ params }) => codegen_1.str `should match "${params.ifClause}" schema`,
  8. params: ({ params }) => codegen_1._ `{failingKeyword: ${params.ifClause}}`,
  9. };
  10. const def = {
  11. keyword: "if",
  12. schemaType: ["object", "boolean"],
  13. trackErrors: true,
  14. error,
  15. code(cxt) {
  16. const { gen, parentSchema, it } = cxt;
  17. if (parentSchema.then === undefined && parentSchema.else === undefined) {
  18. validate_1.checkStrictMode(it, '"if" without "then" and "else" is ignored');
  19. }
  20. const hasThen = hasSchema(it, "then");
  21. const hasElse = hasSchema(it, "else");
  22. if (!hasThen && !hasElse)
  23. return;
  24. const valid = gen.let("valid", true);
  25. const schValid = gen.name("_valid");
  26. validateIf();
  27. cxt.reset();
  28. if (hasThen && hasElse) {
  29. const ifClause = gen.let("ifClause");
  30. cxt.setParams({ ifClause });
  31. gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause));
  32. }
  33. else if (hasThen) {
  34. gen.if(schValid, validateClause("then"));
  35. }
  36. else {
  37. gen.if(codegen_1.not(schValid), validateClause("else"));
  38. }
  39. cxt.pass(valid, () => cxt.error(true));
  40. function validateIf() {
  41. const schCxt = cxt.subschema({
  42. keyword: "if",
  43. compositeRule: true,
  44. createErrors: false,
  45. allErrors: false,
  46. }, schValid);
  47. cxt.mergeEvaluated(schCxt);
  48. }
  49. function validateClause(keyword, ifClause) {
  50. return () => {
  51. const schCxt = cxt.subschema({ keyword }, schValid);
  52. gen.assign(valid, schValid);
  53. cxt.mergeValidEvaluated(schCxt, valid);
  54. if (ifClause)
  55. gen.assign(ifClause, codegen_1._ `${keyword}`);
  56. else
  57. cxt.setParams({ ifClause: keyword });
  58. };
  59. }
  60. },
  61. };
  62. function hasSchema(it, keyword) {
  63. const schema = it.schema[keyword];
  64. return schema !== undefined && !util_1.alwaysValidSchema(it, schema);
  65. }
  66. exports.default = def;
  67. //# sourceMappingURL=if.js.map