validateModifiers.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import format from "./format.js";
  2. import { modifierPhases } from "../enums.js";
  3. var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s';
  4. var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available';
  5. var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options'];
  6. export default function validateModifiers(modifiers) {
  7. modifiers.forEach(function (modifier) {
  8. [].concat(Object.keys(modifier), VALID_PROPERTIES) // IE11-compatible replacement for `new Set(iterable)`
  9. .filter(function (value, index, self) {
  10. return self.indexOf(value) === index;
  11. }).forEach(function (key) {
  12. switch (key) {
  13. case 'name':
  14. if (typeof modifier.name !== 'string') {
  15. console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', "\"" + String(modifier.name) + "\""));
  16. }
  17. break;
  18. case 'enabled':
  19. if (typeof modifier.enabled !== 'boolean') {
  20. console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\""));
  21. }
  22. break;
  23. case 'phase':
  24. if (modifierPhases.indexOf(modifier.phase) < 0) {
  25. console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(', '), "\"" + String(modifier.phase) + "\""));
  26. }
  27. break;
  28. case 'fn':
  29. if (typeof modifier.fn !== 'function') {
  30. console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', "\"" + String(modifier.fn) + "\""));
  31. }
  32. break;
  33. case 'effect':
  34. if (modifier.effect != null && typeof modifier.effect !== 'function') {
  35. console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\""));
  36. }
  37. break;
  38. case 'requires':
  39. if (modifier.requires != null && !Array.isArray(modifier.requires)) {
  40. console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\""));
  41. }
  42. break;
  43. case 'requiresIfExists':
  44. if (!Array.isArray(modifier.requiresIfExists)) {
  45. console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', "\"" + String(modifier.requiresIfExists) + "\""));
  46. }
  47. break;
  48. case 'options':
  49. case 'data':
  50. break;
  51. default:
  52. console.error("PopperJS: an invalid property has been provided to the \"" + modifier.name + "\" modifier, valid properties are " + VALID_PROPERTIES.map(function (s) {
  53. return "\"" + s + "\"";
  54. }).join(', ') + "; but \"" + key + "\" was provided.");
  55. }
  56. modifier.requires && modifier.requires.forEach(function (requirement) {
  57. if (modifiers.find(function (mod) {
  58. return mod.name === requirement;
  59. }) == null) {
  60. console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement));
  61. }
  62. });
  63. });
  64. });
  65. }