enum.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const codegen_1 = require("../../compile/codegen");
  4. const equal = require("fast-deep-equal");
  5. const error = {
  6. message: "should be equal to one of the allowed values",
  7. params: ({ schemaCode }) => codegen_1._ `{allowedValues: ${schemaCode}}`,
  8. };
  9. const def = {
  10. keyword: "enum",
  11. schemaType: "array",
  12. $data: true,
  13. error,
  14. code(cxt) {
  15. const { gen, data, $data, schema, schemaCode, it } = cxt;
  16. if (!$data && schema.length === 0)
  17. throw new Error("enum must have non-empty array");
  18. const useLoop = schema.length >= it.opts.loopEnum;
  19. const eql = cxt.gen.scopeValue("func", {
  20. ref: equal,
  21. code: codegen_1._ `require("ajv/dist/compile/equal")`,
  22. });
  23. let valid;
  24. if (useLoop || $data) {
  25. valid = gen.let("valid");
  26. cxt.block$data(valid, loopEnum);
  27. }
  28. else {
  29. /* istanbul ignore if */
  30. if (!Array.isArray(schema))
  31. throw new Error("ajv implementation error");
  32. const vSchema = gen.const("vSchema", schemaCode);
  33. valid = codegen_1.or(...schema.map((_x, i) => equalCode(vSchema, i)));
  34. }
  35. cxt.pass(valid);
  36. function loopEnum() {
  37. gen.assign(valid, false);
  38. gen.forOf("v", schemaCode, (v) => gen.if(codegen_1._ `${eql}(${data}, ${v})`, () => gen.assign(valid, true).break()));
  39. }
  40. function equalCode(vSchema, i) {
  41. const sch = schema[i];
  42. return sch && typeof sch === "object"
  43. ? codegen_1._ `${eql}(${data}, ${vSchema}[${i}])`
  44. : codegen_1._ `${data} === ${sch}`;
  45. }
  46. },
  47. };
  48. exports.default = def;
  49. //# sourceMappingURL=enum.js.map