import flattenReference from '../../utils/flattenReference'; import list from '../utils/list'; import { Validator } from '../index'; import { Node } from '../../interfaces'; const validBuiltins = new Set(['set', 'fire', 'destroy']); export default function validateEventHandlerCallee( validator: Validator, attribute: Node ) { const { callee, start, type } = attribute.expression; if (type !== 'CallExpression') { validator.error(`Expected a call expression`, start); } const { name } = flattenReference(callee); if (name === 'this' || name === 'event') return; if ( (callee.type === 'Identifier' && validBuiltins.has(callee.name)) || validator.methods.has(callee.name) ) return; const validCallees = ['this.*', 'event.*'].concat( Array.from(validBuiltins), Array.from(validator.methods.keys()) ); let message = `'${validator.source.slice( callee.start, callee.end )}' is an invalid callee (should be one of ${list(validCallees)})`; if (callee.type === 'Identifier' && validator.helpers.has(callee.name)) { message += `. '${callee.name}' exists on 'helpers', did you put it in the wrong place?`; } validator.warn(message, start); }