module.exports = { meta: { docs: {}, schema: [] }, create(context) { const allJsClassNameRegexp = /\bjs-[_a-zA-Z0-9-]*/g const validJsClassNameRegexp = /^js(-[a-z0-9]+)+$/g const endWithJsClassNameRegexp = /\bjs-[_a-zA-Z0-9-]*$/g function checkStringFormat(node, str) { const matches = str.match(allJsClassNameRegexp) || [] for (const match of matches) { if (!match.match(validJsClassNameRegexp)) { context.report(node, 'js- class names should be lowercase and only contain dashes.') } } } function checkStringEndsWithJSClassName(node, str) { if (str.match(endWithJsClassNameRegexp)) { context.report(node, 'js- class names should be statically defined.') } } return { Literal(node) { if (typeof node.value === 'string') { checkStringFormat(node, node.value) if ( node.parent && node.parent.type === 'BinaryExpression' && node.parent.operator === '+' && node.parent.left.value ) { checkStringEndsWithJSClassName(node.parent.left, node.parent.left.value) } } }, TemplateLiteral(node) { for (const quasi of node.quasis) { checkStringFormat(quasi, quasi.value.raw) if (quasi.tail === false) { checkStringEndsWithJSClassName(quasi, quasi.value.raw) } } } } } }