| 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) |
| } |
| } |
| } |
| } |
| } |
| } |