additionalItems.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const codegen_1 = require("../../compile/codegen");
  4. const subschema_1 = require("../../compile/subschema");
  5. const util_1 = require("../../compile/util");
  6. const validate_1 = require("../../compile/validate");
  7. const error = {
  8. message: ({ params: { len } }) => codegen_1.str `should NOT have more than ${len} items`,
  9. params: ({ params: { len } }) => codegen_1._ `{limit: ${len}}`,
  10. };
  11. const def = {
  12. keyword: "additionalItems",
  13. type: "array",
  14. schemaType: ["boolean", "object"],
  15. before: "uniqueItems",
  16. error,
  17. code(cxt) {
  18. const { gen, schema, parentSchema, data, it } = cxt;
  19. const { items } = parentSchema;
  20. if (!Array.isArray(items)) {
  21. validate_1.checkStrictMode(it, '"additionalItems" is ignored when "items" is not an array of schemas');
  22. return;
  23. }
  24. it.items = true;
  25. const len = gen.const("len", codegen_1._ `${data}.length`);
  26. if (schema === false) {
  27. cxt.setParams({ len: items.length });
  28. cxt.pass(codegen_1._ `${len} <= ${items.length}`);
  29. }
  30. else if (typeof schema == "object" && !util_1.alwaysValidSchema(it, schema)) {
  31. const valid = gen.var("valid", codegen_1._ `${len} <= ${items.length}`); // TODO var
  32. gen.if(codegen_1.not(valid), () => validateItems(valid));
  33. cxt.ok(valid);
  34. }
  35. function validateItems(valid) {
  36. gen.forRange("i", items.length, len, (i) => {
  37. cxt.subschema({ keyword: "additionalItems", dataProp: i, dataPropType: subschema_1.Type.Num }, valid);
  38. if (!it.allErrors)
  39. gen.if(codegen_1.not(valid), () => gen.break());
  40. });
  41. }
  42. },
  43. };
  44. exports.default = def;
  45. //# sourceMappingURL=additionalItems.js.map