96 lines
4.0 KiB
JavaScript
96 lines
4.0 KiB
JavaScript
/**
|
|
* require the use of controllerAs in routes or states
|
|
*
|
|
* You should use Angular's controllerAs syntax when defining routes or states.
|
|
*
|
|
* @styleguideReference {johnpapa} `y031` controllerAs Controller Syntax
|
|
* @version 0.1.0
|
|
* @category bestPractice
|
|
* @sinceAngularVersion 1.x
|
|
*/
|
|
'use strict';
|
|
|
|
var utils = require('./utils/utils');
|
|
|
|
module.exports = {
|
|
meta: {
|
|
docs: {
|
|
url: 'https://github.com/Gillespie59/eslint-plugin-angular/blob/master/docs/rules/controller-as-route.md'
|
|
},
|
|
schema: []
|
|
},
|
|
create: function(context) {
|
|
return {
|
|
CallExpression: function(node) {
|
|
var routeObject = null;
|
|
var stateObject = null;
|
|
var hasControllerAs = false;
|
|
var controllerProp = null;
|
|
var stateName = null;
|
|
|
|
if (utils.isRouteDefinition(node)) {
|
|
// second argument in $routeProvider.when('route', {...})
|
|
routeObject = node.arguments[1];
|
|
|
|
if (routeObject.properties) {
|
|
routeObject.properties.forEach(function(prop) {
|
|
if (prop.key.name === 'controller') {
|
|
controllerProp = prop;
|
|
|
|
if (new RegExp('\\sas\\s').test(prop.value.value)) {
|
|
hasControllerAs = true;
|
|
}
|
|
}
|
|
|
|
if (prop.key.name === 'controllerAs') {
|
|
if (hasControllerAs) {
|
|
context.report(node, 'The controllerAs syntax is defined twice for the route "{{route}}"', {
|
|
route: node.arguments[0].value
|
|
});
|
|
}
|
|
|
|
hasControllerAs = true;
|
|
}
|
|
});
|
|
|
|
// if it's a route without a controller, we shouldn't warn about controllerAs
|
|
if (controllerProp && !hasControllerAs) {
|
|
context.report(node, 'Route "{{route}}" should use controllerAs syntax', {
|
|
route: node.arguments[0].value
|
|
});
|
|
}
|
|
}
|
|
} else if (utils.isUIRouterStateDefinition(node)) {
|
|
// state can be defined like .state({...}) or .state('name', {...})
|
|
var isObjectState = node.arguments.length === 1;
|
|
stateObject = isObjectState ? node.arguments[0] : node.arguments[1];
|
|
|
|
if (stateObject && stateObject.properties) {
|
|
stateObject.properties.forEach(function(prop) {
|
|
if (prop.key.name === 'controller') {
|
|
controllerProp = prop;
|
|
}
|
|
if (prop.key.name === 'controllerAs') {
|
|
hasControllerAs = true;
|
|
}
|
|
// grab the name from the object for when they aren't using .state('name',...)
|
|
if (prop.key.name === 'name') {
|
|
stateName = prop.value.value;
|
|
}
|
|
});
|
|
|
|
if (!hasControllerAs && controllerProp) {
|
|
// if the controller is a string, controllerAs can be set like 'controller as vm'
|
|
if (controllerProp.value.type !== 'Literal' || controllerProp.value.value.indexOf(' as ') < 0) {
|
|
context.report(node, 'State "{{state}}" should use controllerAs syntax', {
|
|
state: isObjectState ? stateName : node.arguments[0].value
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
};
|