123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- // @flow
- import format from './format';
- import { modifierPhases } from '../enums';
- const INVALID_MODIFIER_ERROR =
- 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s';
- const MISSING_DEPENDENCY_ERROR =
- 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available';
- const VALID_PROPERTIES = [
- 'name',
- 'enabled',
- 'phase',
- 'fn',
- 'effect',
- 'requires',
- 'options',
- ];
- export default function validateModifiers(modifiers: Array<any>): void {
- modifiers.forEach((modifier) => {
- [...Object.keys(modifier), ...VALID_PROPERTIES]
- // IE11-compatible replacement for `new Set(iterable)`
- .filter((value, index, self) => self.indexOf(value) === index)
- .forEach((key) => {
- switch (key) {
- case 'name':
- if (typeof modifier.name !== 'string') {
- console.error(
- format(
- INVALID_MODIFIER_ERROR,
- String(modifier.name),
- '"name"',
- '"string"',
- `"${String(modifier.name)}"`
- )
- );
- }
- break;
- case 'enabled':
- if (typeof modifier.enabled !== 'boolean') {
- console.error(
- format(
- INVALID_MODIFIER_ERROR,
- modifier.name,
- '"enabled"',
- '"boolean"',
- `"${String(modifier.enabled)}"`
- )
- );
- }
- break;
- case 'phase':
- if (modifierPhases.indexOf(modifier.phase) < 0) {
- console.error(
- format(
- INVALID_MODIFIER_ERROR,
- modifier.name,
- '"phase"',
- `either ${modifierPhases.join(', ')}`,
- `"${String(modifier.phase)}"`
- )
- );
- }
- break;
- case 'fn':
- if (typeof modifier.fn !== 'function') {
- console.error(
- format(
- INVALID_MODIFIER_ERROR,
- modifier.name,
- '"fn"',
- '"function"',
- `"${String(modifier.fn)}"`
- )
- );
- }
- break;
- case 'effect':
- if (
- modifier.effect != null &&
- typeof modifier.effect !== 'function'
- ) {
- console.error(
- format(
- INVALID_MODIFIER_ERROR,
- modifier.name,
- '"effect"',
- '"function"',
- `"${String(modifier.fn)}"`
- )
- );
- }
- break;
- case 'requires':
- if (
- modifier.requires != null &&
- !Array.isArray(modifier.requires)
- ) {
- console.error(
- format(
- INVALID_MODIFIER_ERROR,
- modifier.name,
- '"requires"',
- '"array"',
- `"${String(modifier.requires)}"`
- )
- );
- }
- break;
- case 'requiresIfExists':
- if (!Array.isArray(modifier.requiresIfExists)) {
- console.error(
- format(
- INVALID_MODIFIER_ERROR,
- modifier.name,
- '"requiresIfExists"',
- '"array"',
- `"${String(modifier.requiresIfExists)}"`
- )
- );
- }
- break;
- case 'options':
- case 'data':
- break;
- default:
- console.error(
- `PopperJS: an invalid property has been provided to the "${
- modifier.name
- }" modifier, valid properties are ${VALID_PROPERTIES.map(
- (s) => `"${s}"`
- ).join(', ')}; but "${key}" was provided.`
- );
- }
- modifier.requires &&
- modifier.requires.forEach((requirement) => {
- if (modifiers.find((mod) => mod.name === requirement) == null) {
- console.error(
- format(
- MISSING_DEPENDENCY_ERROR,
- String(modifier.name),
- requirement,
- requirement
- )
- );
- }
- });
- });
- });
- }
|