required.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const code_1 = require("../code");
  4. const codegen_1 = require("../../compile/codegen");
  5. const error = {
  6. message: ({ params: { missingProperty } }) => codegen_1.str `should have required property '${missingProperty}'`,
  7. params: ({ params: { missingProperty } }) => codegen_1._ `{missingProperty: ${missingProperty}}`,
  8. };
  9. const def = {
  10. keyword: "required",
  11. type: "object",
  12. schemaType: "array",
  13. $data: true,
  14. error,
  15. code(cxt) {
  16. const { gen, schema, schemaCode, data, $data, it } = cxt;
  17. const { opts } = it;
  18. if (!$data && schema.length === 0)
  19. return;
  20. const useLoop = schema.length >= opts.loopRequired;
  21. if (it.allErrors)
  22. allErrorsMode();
  23. else
  24. exitOnErrorMode();
  25. function allErrorsMode() {
  26. if (useLoop || $data) {
  27. cxt.block$data(codegen_1.nil, loopAllRequired);
  28. }
  29. else {
  30. for (const prop of schema) {
  31. code_1.checkReportMissingProp(cxt, prop);
  32. }
  33. }
  34. }
  35. function exitOnErrorMode() {
  36. const missing = gen.let("missing");
  37. if (useLoop || $data) {
  38. const valid = gen.let("valid", true);
  39. cxt.block$data(valid, () => loopUntilMissing(missing, valid));
  40. cxt.ok(valid);
  41. }
  42. else {
  43. gen.if(code_1.checkMissingProp(cxt, schema, missing));
  44. code_1.reportMissingProp(cxt, missing);
  45. gen.else();
  46. }
  47. }
  48. function loopAllRequired() {
  49. gen.forOf("prop", schemaCode, (prop) => {
  50. cxt.setParams({ missingProperty: prop });
  51. gen.if(code_1.noPropertyInData(data, prop, opts.ownProperties), () => cxt.error());
  52. });
  53. }
  54. function loopUntilMissing(missing, valid) {
  55. cxt.setParams({ missingProperty: missing });
  56. gen.forOf(missing, schemaCode, () => {
  57. gen.assign(valid, code_1.propertyInData(data, missing, opts.ownProperties));
  58. gen.if(codegen_1.not(valid), () => {
  59. cxt.error();
  60. gen.break();
  61. });
  62. }, codegen_1.nil);
  63. }
  64. },
  65. };
  66. exports.default = def;
  67. //# sourceMappingURL=required.js.map