UNPKG

eslint-plugin-ember

Version:
70 lines (56 loc) 1.95 kB
'use strict'; const types = require('../utils/types'); const ember = require('../utils/ember'); const snakeCase = require('snake-case'); //------------------------------------------------------------------------------ // Routing - Snake case in dynamic segments of routes //------------------------------------------------------------------------------ module.exports = { meta: { docs: { description: 'Enforces usage of snake_cased dynamic segments in routes', category: 'Possible Errors', recommended: true, url: 'https://github.com/ember-cli/eslint-plugin-ember/tree/master/docs/rules/routes-segments-snake-case.md', }, fixable: null, // or "code" or "whitespace" }, create(context) { const message = 'Use snake case in dynamic segments of routes'; const routeSegmentRegex = /:([a-zA-Z0-9-_]+)/g; const report = function(node) { context.report(node, message); }; const isSegment = function(property) { return property.key.name === 'path' && routeSegmentRegex.test(property.value.value); }; const getSegmentNames = function(property) { if (!isSegment(property)) { return []; } return property.value.value.match(routeSegmentRegex).map(segment => segment.slice(1)); }; const isNotSnakeCase = function(name) { return snakeCase(name) !== name; }; return { CallExpression(node) { if (!ember.isRoute(node)) { return; } const routeOptions = types.isObjectExpression(node.arguments[1]) ? node.arguments[1] : false; if (routeOptions) { routeOptions.properties.forEach(property => { const segmentNames = getSegmentNames(property); if (segmentNames.length && segmentNames.filter(isNotSnakeCase).length) { report(property.value); } }); } }, }; }, };