This repository will give access to new rules for the ESLint tool. You should use it only if you are developing an AngularJS application.
Since the 0.0.4 release, some rules defined in John Papa's Guideline have been implemented. In the description below, you will have a link to the corresponding part of the guideline, in order to have more information.
- Usage with shareable config
- Usage without shareable config
- Defaults
- Rules
- Need your help
- How to create a new rule
- Default ESLint configuration file
- Who uses it?
- Team
Usage with shareable config
Users may use the shareable eslint-config-angular to quickly setup eslint-plugin-angular. It also marks Angular as a global variable and defines required ESLint rules to use this plugin.
-
Install
eslint
as a dev-dependency:npm install --save-dev eslint
-
Install
eslint-plugin-angular
as a dev-dependency:npm install --save-dev eslint-plugin-angular
-
Install
eslint-config-angular
as a dev-dependency:npm install --save-dev eslint-config-angular
-
Use the shareable config by adding it to your
.eslintrc
:extends: angular
-
Install
eslint
as a dev-dependency:npm install --save-dev eslint
-
Install
eslint-plugin-angular
as a dev-dependency:npm install --save-dev eslint-plugin-angular
-
Enable the plugin by adding it to your
.eslintrc
:plugins: - angular
-
You can also configure these rules in your
.eslintrc
. All rules defined in this plugin have to be prefixed by 'angular/'plugins: - angular rules: - angular/controller_name: 0
{
"plugins": [
"angular/angular"
],
"rules": {
"angular/angularelement": 1,
"angular/controller-as": 2,
"angular/controller-as-route": 2,
"angular/controller-as-vm": [2, "vm"],
"angular/controller-name": [2, "/[A-Z].*Controller$/"],
"angular/deferred": 0,
"angular/definedundefined": 2,
"angular/di": [2, "function"],
"angular/di-order": [0, true],
"angular/directive-name": 0,
"angular/directive-restrict": [0, {"restrict": "AE", "explicit": "never"}],
"angular/component-limit": [0, 1],
"angular/document-service": 2,
"angular/empty-controller": 0,
"angular/file-name": 0,
"angular/filter-name": 0,
"angular/foreach": 0,
"angular/function-type": 0,
"angular/interval-service": 2,
"angular/json-functions": 2,
"angular/log": 2,
"angular/module-dependency-order": [0, {"grouped": true, "prefix": null}],
"angular/module-getter": 2,
"angular/module-name": 0,
"angular/module-setter": 2,
"angular/no-angular-mock": 0,
"angular/no-controller": 0,
"angular/no-cookiestore": 2,
"angular/no-digest": 2,
"angular/no-http-callback": 2,
"angular/no-inline-template": [0, {"allowSimple": true}],
"angular/no-jquery-angularelement": 2,
"angular/no-private-call": 2,
"angular/no-service-method": 2,
"angular/no-services": [2, ["$http", "$resource", "Restangular"]],
"angular/on-watch": 2,
"angular/one-dependency-per-line": 0,
"angular/rest-service": 0,
"angular/service-name": 2,
"angular/timeout-service": 2,
"angular/typecheck-array": 2,
"angular/typecheck-date": 2,
"angular/typecheck-function": 2,
"angular/typecheck-number": 2,
"angular/typecheck-object": 2,
"angular/typecheck-regexp": 2,
"angular/typecheck-string": 2,
"angular/watchers-execution": [0, "$digest"],
"angular/window-service": 2
}
}
- angularelement - use
angular.element
instead of$
orjQuery
- component-limit - limit the number of angular components per file
- controller-as - disallow assignments to
$scope
in controllers - controller-as-route - require the use of controllerAs in routes or states
- controller-as-vm - require and specify a capture variable for
this
in controllers - controller-name - require and specify a prefix for all controller names
- deferred - use
$q(function(resolve, reject){})
instead of$q.deferred
- definedundefined - use
angular.isDefined
andangular.isUndefined
instead of other undefined checks - di - require a consistent DI syntax
- di-order - require DI parameters to be sorted alphabetically
- di-unused - disallow unused DI parameters
- directive-name - require and specify a prefix for all directive names
- directive-restrict - disallow any other directive restrict than 'A' or 'E'
- document-service - use
$document
instead ofdocument
- empty-controller - disallow empty controllers
- file-name - require and specify a consistent component name pattern
- filter-name - require and specify a prefix for all filter names
- foreach - use
angular.forEach
instead of nativeArray.prototype.forEach
- function-type - require and specify a consistent function style for components ('named' or 'anonymous')
- interval-service - use
$interval
instead ofsetInterval
- json-functions - use
angular.fromJson
and 'angular.toJson' instead ofJSON.parse
andJSON.stringify
- log - use the
$log
service instead of theconsole
methods - module-dependency-order - require a consistent order of module dependencies
- module-getter - disallow to reference modules with variables and require to use the getter syntax instead
angular.module('myModule')
- module-name - require and specify a prefix for all module names
- module-setter - disallow to assign modules to variables (linked to module-getter
- no-angular-mock - require to use
angular.mock
methods directly - no-controller - disallow use of controllers (according to the component first pattern)
- no-cookiestore - use
$cookies
instead of$cookieStore
- no-digest - DEPRECATED! use
$apply()
instead of$digest()
(replaced by watchers-execution) - no-http-callback - disallow the
$http
methodssuccess()
anderror()
- no-inline-template - disallow the use of inline templates
- no-jquery-angularelement - disallow to wrap
angular.element
objects withjQuery
or$
- no-private-call - disallow use of internal angular properties prefixed with $$
- no-services - disallow DI of specified services for other angular components (
$http
for controllers, filters and directives) - no-service-method - use
factory()
instead ofservice()
- on-watch - require
$on
and$watch
deregistration callbacks to be saved in a variable - one-dependency-per-line - require all DI parameters to be located in their own line
- rest-service - disallow different rest service and specify one of '$http', '$resource', 'Restangular'
- service-name - require and specify a prefix for all service names
- timeout-service - use
$timeout
instead ofsetTimeout
- typecheck-array - use
angular.isArray
instead oftypeof
comparisons - typecheck-date - use
angular.isDate
instead oftypeof
comparisons - typecheck-function - use
angular.isFunction
instead oftypeof
comparisons - typecheck-number - use
angular.isNumber
instead oftypeof
comparisons - typecheck-object - use
angular.isObject
instead oftypeof
comparisons - typecheck-regexp - DEPRECATED! use
angular.isRegexp
instead of other comparisons (no native angular method) - typecheck-string - use
angular.isString
instead oftypeof
comparisons - watchers-execution - require and specify consistent use
$scope.digest()
or$scope.apply()
- window-service - use
$window
instead ofwindow
It is an opensource project. Any help will be very useful. You can :
- Create issue
- Send Pull Request
- Write Documentation
- Add new Features
- Add new Rules
- Improve the quality
- Reply to issues
All development happens on the development
branch. This means all pull requests should be made to the development
branch.
If it is time to release, @Gillespie59 will bump the version in package.json
, create a Git tag and merge the development
branch into master
. @Gillespie59 will then publish the new release to the npm registry.
We appreciate contributions and the following notes will help you before you open a Pull Request.
Have a look at the existing issues. There may exist similar issues with useful information.
rules/<your-rule>.js
- JavaScript file with the new rule
- The filename
<your-rule>
is exactly the usage name in eslint configsangular/<your-rule>
- Have a look at the
angularRule
wrapper and theutils
(both inrules/utils/
) - they probably make things easier for you - Add a documentation comment to generate a markdown documentation with the
gulp docs
task
test/<your-rule>.js
- Write some tests and execute them with
gulp test
- Have a look at the coverage reports
coverage/lcov-report/index.html
- Write some tests and execute them with
examples/<your-rule>.js
- Add some examples for the documentation
- Run the
gulp docs
task to test the examples and update the markdown documentation
docs/<your-rule>.js
- Generated by the
gulp docs
task
- Generated by the
index.js
- Add your rule
rulesConfiguration.addRule('<your-rule>', [0, {someConfig: 'someValue'])
- Add your rule
- Check that the
gulp
task is working - Commit generated changes in
README.md
anddocs/<your-rule>.js
- Open your PR to the
development
branch NOTmaster
We can use a property, defined in the ESLint configuration file, in order to know which version is used : Angular 1 or Angular 2. based on this property, you can create rules for each version.
plugins:
- angular
rules:
angular/controller-name:
- 2
- '/[A-Z].*Controller$/'
globals:
angular: true
settings:
angular: 2
And in your rule, you can access to this property thanks to the context
object :
//If Angular 2 is used, we disabled the rule
if(context.settings.angular === 2){
return {};
}
return {
'CallExpression': function(node) {
}
};
Here is the basic configuration for the rules defined in the ESLint plugin, in order to be compatible with the guideline provided by @johnpapa :
{
"rules": {
"no-use-before-define": 0
}
}
Emmanuel DEMEY |