JSCS — JavaScript Code Style. Twitter | Mailing List
jscs is a code style checker. You can configure jscs for your project in detail using over 60 validation rules, including presets from popular style guides like jQuery.
This is a documentation for the development version, please refer to the https://www.npmjs.org/package/jscs instead
- Presets
- Friendly Packages
- Extensions
- Installation
- CLI
- Options
- Error Suppression
- Versioning & Semver
- Rules
- Plugins
- Removed Rules
- Browser Usage
- How to Contribute
- Airbnb - https://github.com/airbnb/javascript
- Crockford - http://javascript.crockford.com/code.html
- Google - https://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml
- Grunt - http://gruntjs.com/contributing#syntax
- jQuery - https://contribute.jquery.org/style-guide/js/
- MDCS - https://github.com/mrdoob/three.js/wiki/Mr.doob's-Code-Style%E2%84%A2
- Wikimedia - https://www.mediawiki.org/wiki/Manual:Coding_conventions/JavaScript
- Yandex - https://github.com/yandex/codestyle/blob/master/javascript.md
- Atom plugin: https://atom.io/packages/linter-jscs
- Brackets Extension: https://github.com/globexdesigns/brackets-jscs
- Grunt task: https://github.com/jscs-dev/grunt-jscs/
- Gulp task: https://github.com/jscs-dev/gulp-jscs/
- SublimeText 3 Plugin: https://github.com/SublimeLinter/SublimeLinter-jscs/
- Syntastic VIM Plugin: https://github.com/scrooloose/syntastic/.../syntax_checkers/javascript/jscs.vim/
- Web Essentials for Visual Studio 2013: https://github.com/madskristensen/WebEssentials2013/
- IntelliJ IDEA, RubyMine, WebStorm, PhpStorm, PyCharm plugin: https://github.com/idok/jscs-plugin
- A team city reporter: https://github.com/wurmr/jscs-teamcity-reporter
- JSdoc rules extension: https://github.com/jscs-dev/jscs-jsdoc
jscs can be installed using npm:
npm install jscs -g
To run jscs, you can use the following command from the project root:
jscs path[ path[...]]
You can also pipe input into jscs:
cat myfile.js | jscs
Allows to define path to the config file.
jscs path[ path[...]] --config=./.config.json
If there is no --config option specified, jscs it will consequentially search for jscsConfig option in package.json file then for .jscsrc (which is a just JSON with comments) and .jscs.json files in the current working directory then in nearest ancestor until it hits the system root.
If defined will use predefined rules for specific code style.
jscs path[ path[...]] --preset=jquery
jscs itself provides six reporters: checkstyle, console, inline, junit and text.
jscs path[ path[...]] --reporter=console
But you also can specify your own reporter, since this flag accepts relative or absolute paths too.
jscs path[ path[...]] --reporter=./some-dir/my-reporter.js
Attempts to parse your code as ES6 using the harmony version of the esprima parser. Please note that this is currently experimental, and will improve over time.
Attempts to parse your code with a custom Esprima version.
jscs path[ path[...]] --esprima=esprima-fb
The path to a module that determines whether or not an error should be reported.
jscs path[ path[...]] --error-filter=path/to/my/module.js
Clean output without colors.
Set the maximum number of errors to report
Outputs usage information.
Prepends the name of the offending rule to all error messages.
Outputs version of jscs.
Paths to load plugins. See the wiki page for more details about the Plugin API
Values: Array of NPM package names or paths
"plugins": ["jscs-plugin", "./lib/project-jscs-plugin"]Path to load additional rules
Type: Array
Values: Array of file matching patterns
"additionalRules": ["project-rules/*.js"]Extends defined rules with preset rules.
Type: String
Values: "airbnb", "crockford", "google", "jquery", "mdcs", "wikimedia", "yandex"
"preset": "jquery"If you want specifically disable preset rule assign it to null, like so:
{
"preset": "jquery",
"requireCurlyBraces": null
}Disables style checking for specified paths.
Type: Array
Values: Array of file matching patterns
"excludeFiles": ["node_modules/**"]Changes the set of file extensions that will be processed.
Type: Array or String or "*"
Values: A single file extension or an Array of file extensions, beginning with a .. The matching is case insensitive. If "*" is provided, all files regardless of extension will match.
"fileExtensions": [".js", ".jsx"]"fileExtensions": [".js"]Set the maximum number of errors to report
Type: Number
Default: Infinity
"maxErrors": 10Attempts to parse your code as ES6 using the harmony version of the esprima parser.
Type: Boolean
Value: true
"esnext": trueA filter function that determines whether or not to report an error. This will be called for every found error.
Type: String
"errorFilter": "path/to/my/filter.js"See how to define an error filter.
You can disable and reenable rules inline with two special comments: // jscs:disable and // jscs:enable. Spacing in these comments is fairly lenient. All of the following are equivalent:
/* jscs: enable */
// jscs: enableYou can use them to disable rules in several ways.
Simply using // jscs:disable or // jscs:enable will disable all rules.
var a = b;
// jscs:disable
var c = d; // all errors on this line will be ignored
// jscs:enable
var e = f; // all errors on this line will be reportedIncluding a comma separated list of rules to modify after // jscs:disable or // jscs:enable will modify only those rules.
// jscs:disable requireCurlyBraces
if (x) y(); // all errors from requireCurlyBraces on this line will be ignored
// jscs:enable requireCurlyBraces
if (z) a(); // all errors, including from requireCurlyBraces, on this line will be reportedYou can enable all rules after disabling a specific rule, and that rule becomes reenabled as well.
// jscs:disable requireCurlyBraces
if (x) y(); // all errors from requireCurlyBraces on this line will be ignored
// jscs:enable
if (z) a(); // all errors, even from requireCurlyBraces, will be reportedYou can disable multiple rules at once and progressively reenable them.
// jscs:disable requireCurlyBraces, requireDotNotation
if (x['a']) y(); // all errors from requireCurlyBraces OR requireDotNotation on this line will be ignored
// jscs:enable requireCurlyBraces
if (z['a']) a(); // all errors from requireDotNotation, but not requireCurlyBraces, will be ignored
// jscs:enable requireDotNotation
if (z['a']) a(); // all errors will be reportedWe recommend installing JSCS via NPM using ^, or ~ if you want more stable releases.
Semver (http://semver.org/) dictates that breaking changes be major version bumps. In the context of a linting tool, a bug fix that causes more errors to be reported can be interpreted as a breaking change. However, that would require major version bumps to occur more often than can be desirable. Therefore, as a compromise, we will only release bug fixes that cause more errors to be reported in minor versions.
Below you fill find our versioning strategy, and what you can expect to come out of a new JSCS release.
- Patch release:
- A bug fix in a rule that causes JSCS to report less errors.
- Docs, refactoring and other "invisible" changes for user;
- Minor release:
- Any preset changes.
- A bug fix in a rule that causes JSCS to report more errors.
- New rules or new options for existing rules that don't change existing behavior.
- Modifying rules so they report less errors, and don't cause build failures.
- Major release:
- Purposefully modifying existing rules so that they report more errors or change the meaning of a rule.
- Any architectural changes that could cause builds to fail.
Requires curly braces after statements.
Type: Array or Boolean
Values: Array of quoted keywords or true to require curly braces after the following keywords:
JSHint: curly
"requireCurlyBraces": [
"if",
"else",
"for",
"while",
"do",
"try",
"catch",
"case",
"default"
]if (x) {
x++;
}if (x) x++;Requires space before keyword.
Type: Array or Boolean
Values: Array of quoted keywords or true to require all possible keywords to have a preceding space.
"requireSpaceBeforeKeywords": [
"else",
"while",
"catch"
]} else {
x++;
}}else {
x++;
}Requires space after keyword.
Type: Array or Boolean
Values: Array of quoted keywords or true to require all of the keywords below to have a space afterward.
"requireSpaceAfterKeywords": [
"do",
"for",
"if",
"else",
"switch",
"case",
"try",
"catch",
"void",
"while",
"with",
"return",
"typeof",
"function"
]return true;if(x) {
x++;
}Disallows space after keyword.
Type: Array or Boolean
Values: Array of quoted keywords or true to disallow spaces after all possible keywords.
"disallowSpaceAfterKeywords": [
"if",
"else",
"for",
"while",
"do",
"switch",
"try",
"catch"
]if(x > y) {
y++;
}Disallows space before keyword.
Type: Array or Boolean
Values: Array of quoted keywords or true to disallow spaces before all possible keywords.
"disallowSpaceBeforeKeywords": [
"else",
"catch"
]}else {
y--;
}} else {
y--;
}Requires space before block statements (for loops, control structures).
Type: Boolean
Values: true
"requireSpaceBeforeBlockStatements": trueif (cond) {
foo();
}
for (var e in elements) {
bar(e);
}
while (cond) {
foo();
}if (cond){
foo();
}
for (var e in elements){
bar(e);
}
while (cond){
foo();
}Disallows space before block statements (for loops, control structures).
Type: Boolean
Values: true
"disallowSpaceBeforeBlockStatements": trueif (cond){
foo();
}
for (var e in elements){
bar(e);
}
while (cond){
foo();
}if (cond) {
foo();
}
for (var e in elements) {
bar(e);
}
while (cond) {
foo();
}Requires parentheses around immediately invoked function expressions.
Type: Boolean
Values: true
JSHint: immed
"requireParenthesesAroundIIFE": truevar a = (function(){ return 1; })();
var b = (function(){ return 2; }());
var c = (function(){ return 3; }).call(this, arg1);
var d = (function(){ return 3; }.call(this, arg1));
var e = (function(){ return d; }).apply(this, args);
var f = (function(){ return d; }.apply(this, args));var a = function(){ return 1; }();
var c = function(){ return 3; }.call(this, arg1);
var d = function(){ return d; }.apply(this, args);Requires space before and/or after ? or : in conditional expressions.
Type: Object or Boolean
Values: "afterTest", "beforeConsequent", "afterConsequent", "beforeAlternate" as child properties, or true to set all properties to true. Child properties must be set to true.
"requireSpacesInConditionalExpression": {
"afterTest": true,
"beforeConsequent": true,
"afterConsequent": true,
"beforeAlternate": true
}var a = b ? c : d;
var a= b ? c : d;var a = b? c : d;
var a = b ?c : d;
var a = b ? c: d;
var a = b ? c :d;Disallows space before and/or after ? or : in conditional expressions.
Type: Object or Boolean
Values: "afterTest", "beforeConsequent", "afterConsequent", "beforeAlternate" as child properties, or true to set all properties to true. Child properties must be set to true. These token names correspond to:
var a = b ? c : d;
^ ^ ^ ^
| | | |
| | | â””- beforeAlternate
| | â””--- afterConsequent
| â””-------- beforeConsequent
â””---------- afterTest
"disallowSpacesInConditionalExpression": {
"afterTest": true,
"beforeConsequent": true,
"afterConsequent": true,
"beforeAlternate": true
}var a = b?c:d;
var a= b?c:d;var a = b ?c:d;
var a = b? c:d;
var a = b?c :d;
var a = b?c: d;Requires space before () or {} in function expressions (both named and anonymous).
Type: Object
Values: "beforeOpeningRoundBrace" and "beforeOpeningCurlyBrace" as child properties. Child properties must be set to true.
"requireSpacesInFunctionExpression": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
}var x = function () {};
var x = function a () {};var x = function() {};
var x = function a(){};Disallows space before () or {} in function expressions (both named and anonymous).
Type: Object
Values: "beforeOpeningRoundBrace" and "beforeOpeningCurlyBrace" as child properties. Child properties must be set to true.
"disallowSpacesInFunctionExpression": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
}var x = function(){};
var x = function a(){};var x = function () {};
var x = function a (){};Requires space before () or {} in anonymous function expressions.
Type: Object
Values: "beforeOpeningRoundBrace" and "beforeOpeningCurlyBrace" as child properties. Child properties must be set to true.
"requireSpacesInAnonymousFunctionExpression": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
}var foo = function () {};
var Foo = {
foo: function () {};
}
array.map(function () {});var foo = function() {};
var Foo = {
foo: function (){};
}
array.map(function(){});Disallows space before () or {} in anonymous function expressions.
Type: Object
Values: "beforeOpeningRoundBrace" and "beforeOpeningCurlyBrace" as child properties. Child properties must be set to true.
"disallowSpacesInAnonymousFunctionExpression": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
}var foo = function(){};
var Foo = {
foo: function(){};
}
array.map(function(){});var foo = function () {};
var Foo = {
foo: function (){};
}
array.map(function() {});Requires space before () or {} in named function expressions.
Type: Object
Values: "beforeOpeningRoundBrace" and "beforeOpeningCurlyBrace" as child properties. Child properties must be set to true.
"requireSpacesInNamedFunctionExpression": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
}var x = function a () {};var x = function a() {};
var x = function a(){};Disallows space before () or {} in named function expressions.
Type: Object
Values: "beforeOpeningRoundBrace" and "beforeOpeningCurlyBrace" as child properties. Child properties must be set to true.
"disallowSpacesInNamedFunctionExpression": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
}var x = function a(){};var x = function a () {};
var x = function a (){};Requires space before () or {} in function declarations.
Type: Object
Values: "beforeOpeningRoundBrace" and "beforeOpeningCurlyBrace" as child properties. Child properties must be set to true.
"requireSpacesInFunctionDeclaration": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
}function a () {}function a() {}
function a (){}Disallows space before () or {} in function declarations.
Type: Object
Values: "beforeOpeningRoundBrace" and "beforeOpeningCurlyBrace" as child properties. Child properties must be set to true.
"disallowSpacesInFunctionDeclaration": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
}function a(){}function a () {}
function a (){}Requires space before () or {} in function declarations and expressions.
Type: Object
Values: "beforeOpeningRoundBrace" and "beforeOpeningCurlyBrace" as child properties. Child properties must be set to true.
"requireSpacesInFunction": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
}function a () {}
var x = function a () {};function a() {}
function a (){}
var x = function a() {};
var x = function a () {};Disallows space before () or {} in function declarations and expressions.
Type: Object
Values: "beforeOpeningRoundBrace" and "beforeOpeningCurlyBrace" as child properties. Child properties must be set to true.
"disallowSpacesInFunction": {
"beforeOpeningRoundBrace": true,
"beforeOpeningCurlyBrace": true
}function a(){}
var x = function a(){};function a () {}
function a (){}
var x = function a () {};
var x = function a (){};Requires space before () in call expressions.
Type: Boolean
Values: true
"requireSpacesInCallExpression": truevar x = foobar ();var x = foobar();Disallows space before () in call expressions.
Type: Boolean
Values: true
"disallowSpacesInCallExpression": truevar x = foobar();var x = foobar ();Disallows multiple var declaration (except for-loop).
Type: Boolean or String
Values:
truedisallows multiple variable declarations except within a for loop'strict'disallows all multiple variable declarations'exceptUndefined'allows declarations where all variables are not defined
"disallowMultipleVarDecl": truevar x = 1;
var y = 2;
for (var i = 0, j = arr.length; i < j; i++) {}var x = 1;
var y = 2;var a, b;
var x = 1;
var y = 2;
for (var i = 0, j = arr.length; i < j; i++) {}var x = 1,
y = 2;
var x, y = 2, z;Requires multiple var declaration.
Type: Boolean or String
Values: true or "onevar"
if requireMultipleVarDecl defined as a true value, it will report only consecutive vars, if, on the other hand,
value equals to "onevar" string, requireMultipleVarDecl will allow only one var per function scope.
JSHint: onevar
"requireMultipleVarDecl": truevar x = 1,
y = 2;var x = 1;
var y = 2;Requires blocks to begin and end with a newline
Type: Boolean or Integer
Values: true validates all non-empty blocks, Integer specifies a minimum number of statements in the block before validating.
"requireBlocksOnNewline": trueif (true) {
doSomething();
}
var abc = function() {};if (true) {doSomething();}if (true) {
doSomething();
doSomethingElse();
}
if (true) { doSomething(); }
var abc = function() {};if (true) { doSomething(); doSomethingElse(); }Requires blocks to begin and end with 2 newlines
Type: Boolean or Integer
Values: true validates all non-empty blocks, Integer specifies a minimum number of statements in the block before validating.
"requirePaddingNewlinesInBlocks": trueif (true) {
doSomething();
}
var abc = function() {};if (true) {doSomething();}
if (true) {
doSomething();
}if (true) {
doSomething();
doSomethingElse();
}
if (true) {
doSomething();
}
if (true) { doSomething(); }
var abc = function() {};if (true) { doSomething(); doSomethingElse(); }
if (true) {
doSomething();
doSomethingElse();
}Disallows blocks from beginning and ending with 2 newlines.
Type: Boolean
Values: true validates all non-empty blocks.
"disallowPaddingNewlinesInBlocks": trueif (true) {
doSomething();
}
if (true) {doSomething();}
var abc = function() {};if (true) {
doSomething();
}Requires newline inside curly braces of all objects.
Type: Boolean
Values: true
"requirePaddingNewLinesInObjects": truevar x = {
a: 1
};
foo({
a: {
b: 1
}
});var x = { a: 1 };
foo({a:{b:1}});Disallows newline inside curly braces of all objects.
Type: Boolean
Values: true
"disallowPaddingNewLinesInObjects": truevar x = { a: 1 };
foo({a: {b: 1}});var x = {
a: 1
};
foo({
a: {
b: 1
}
});Requires an empty line above the specified keywords unless the keyword is the first expression in a block.
Type: Array or Boolean
Values: Array of quoted types or true to require padding new lines before all of the keywords below.
"requirePaddingNewlinesBeforeKeywords": [
"do",
"for",
"if",
"else",
"switch",
"case",
"try",
"catch",
"void",
"while",
"with",
"return",
"typeof",
"function"
]function(a) {
if (!a) {
return false;
}
for (var i = 0; i < b; i++) {
if (!a[i]) {
return false;
}
}
return true;
}function(a) {
if (!a) {
return false;
}
for (var i = 0; i < b; i++) {
if (!a[i]) {
return false;
}
}
return true;
}Disallow an empty line above the specified keywords.
Type: Array or Boolean
Values: Array of quoted types or true to disallow padding new lines after all of the keywords below.
"requirePaddingNewlinesBeforeKeywords": [
"do",
"for",
"if",
"else",
"switch",
"case",
"try",
"catch",
"void",
"while",
"with",
"return",
"typeof",
"function"
]function(a) {
if (!a) {
return false;
}
for (var i = 0; i < b; i++) {
if (!a[i]) {
return false;
}
}
return true;
}function(a) {
if (!a) {
return false;
}
for (var i = 0; i < b; i++) {
if (!a[i]) {
return false;
}
}
return true;
}Disallows empty blocks (except for catch blocks).
Type: Boolean
Values: true
JSHint: noempty
"disallowEmptyBlocks": trueif ( a == b ) { c = d; }
try { a = b; } catch( e ){}if ( a == b ) { } else { c = d; }Disallows space after opening object curly brace and before closing.
Type: Boolean or String
Values: "all" or true for strict mode, "nested" ignores closing brackets in a row.
"disallowSpacesInsideObjectBrackets": "all"var x = {a: {b: 1}};var x = { a: {b: 1} };var x = { a: { b: 1 } };Disallows space after opening array square bracket and before closing.
Type: Boolean or String
Values: "all" or true for strict mode, "nested" ignores closing brackets in a row.
"disallowSpacesInsideArrayBrackets": "all"var x = [[1]];var x = [ [1] ];var x = [ [ 1 ] ];Disallows space after opening round bracket and before closing.
Type: Object or Boolean
Values: true or Object with either "only" with array of tokens or "all" with true value
"disallowSpacesInsideParentheses": truevar x = (1 + 2) * 3;"disallowSpacesInsideParentheses": { "only": [ "{", "}" ] }var x = ( 1 + 2 );
var x = foo({});var x = foo( {} );Requires space after opening object curly brace and before closing.
Type: String
Values: "all" for strict mode, "allButNested" ignores closing brackets in a row.
"requireSpacesInsideObjectBrackets": "all"var x = { a: { b: 1 } };var x = { a: { b: 1 }};var x = {a: 1};Requires space after opening array square bracket and before closing.
Type: String
Values: "all" for strict mode, "allButNested" ignores closing brackets in a row.
"requireSpacesInsideArrayBrackets": "all"var x = [ 1 ];var x = [[ 1 ], [ 2 ]];var x = [1];Requires space after opening round bracket and before closing.
Type: Object or String
Values: "all" for strict mode, "allButNested" (deprecated use "except": ['(', ')']) ignores nested brackets in a row, you could also specify token exceptions.
"requireSpacesInsideParentheses": {
"all": true,
"except": [ "{", "}" ]
}var x = Math.pow( ( 1 + 2 ), ( 3 + 4 ) );var x = Math.pow(( 1 + 2 ), ( 3 + 4 ));var x = Math.pow( foo({ test: 1 }) );var x = Math.pow(1 + 2, 3 + 4);Disallows quoted keys in object if possible.
Type: String or Boolean
Values:
truefor strict mode"allButReserved"allows ES3+ reserved words to remain quoted which is helpful when using this option with JSHint'ses3flag.
"disallowQuotedKeysInObjects": truevar x = { a: { default: 1 } };var x = {a: 1, 'default': 2};var x = {'a': 1};Disallows identifiers that start or end in _. Some popular identifiers are automatically listed as exceptions:
__proto__(javascript)_(underscore.js)__filename(node.js global)__dirname(node.js global)super_(node.js, used byutil.inherits)
Type: Boolean or Object
Values:
trueObject:allExcept: array of quoted identifiers
JSHint: nomen
"disallowDanglingUnderscores": { allExcept: ["_exception"] }var x = 1;
var o = obj.__proto__;
var y = _.extend;
var z = __dirname;
var w = __filename;
var x_y = 1;
var v = _exception;var _x = 1;
var x_ = 1;
var x_y_ = 1;Disallows space after object keys.
Type: Boolean
Values: true
"disallowSpaceAfterObjectKeys": truevar x = {a: 1};var x = {a : 1};Requires space after object keys.
Type: Boolean
Values: true
"requireSpaceAfterObjectKeys": truevar x = {a : 1};var x = {a: 1};Disallows space after object keys.
Type: Boolean
Values: true
"disallowSpaceBeforeObjectValues": truevar x = {a:1};var x = {a: 1};Requires space after object keys.
Type: Boolean
Values: true
"requireSpaceBeforeObjectValues": truevar x = {a: 1};var x = {a:1};Disallows commas as last token on a line in lists.
Type: Boolean
Values: true
JSHint: laxcomma
"disallowCommaBeforeLineBreak": truevar x = {
one: 1
, two: 2
};
var y = { three: 3, four: 4};var x = {
one: 1,
two: 2
};Requires commas as last token on a line in lists.
Type: Boolean
Values: true
JSHint: laxcomma
"requireCommaBeforeLineBreak": truevar x = {
one: 1,
two: 2
};
var y = { three: 3, four: 4};var x = {
one: 1
, two: 2
};Requires proper alignment in object literals.
Type: String
Values:
"all"for strict mode,"ignoreFunction"ignores objects if one of the property values is a function expression,"ignoreLineBreak"ignores objects if there are line breaks between properties
"requireAlignedObjectValues": "all"var x = {
a : 1,
bcd : 2,
ef : 'str'
};var x = {
a : 1,
bcd : 2,
ef : 'str'
};Requires operators to appear before line breaks and not after.
Type: Array or Boolean
Values: Array of quoted operators or true to require all possible binary operators to appear before line breaks
JSHint: laxbreak
"requireOperatorBeforeLineBreak": [
"?",
"=",
"+",
"-",
"/",
"*",
"==",
"===",
"!=",
"!==",
">",
">=",
"<",
"<="
]x = y ? 1 : 2;
x = y ?
1 : 2;x = y
? 1 : 2;Requires sticking unary operators to the right.
Type: Array or Boolean
Values: Array of quoted operators or true to disallow space after prefix for all unary operators
"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"]x = !y; y = ++z;x = ! y; y = ++ z;Disallows sticking unary operators to the right.
Type: Array or Boolean
Values: Array of quoted operators or true to require space after prefix for all unary operators
"requireSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"]x = ! y; y = ++ z;x = !y; y = ++z;Requires sticking unary operators to the left.
Type: Array or Boolean
Values: Array of quoted operators or true to disallow space before postfix for all unary operators (i.e. increment/decrement operators)
"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"]x = y++; y = z--;x = y ++; y = z --;Disallows sticking unary operators to the left.
Type: Array or Boolean
Values: Array of quoted operators or true to require space before postfix for all unary operators (i.e. increment/decrement operators)
"requireSpaceBeforePostfixUnaryOperators": ["++", "--"]x = y ++; y = z --;x = y++; y = z--;Requires sticking binary operators to the left.
Type: Array or Boolean
Values: Array of quoted operators or true to disallow space before all possible binary operators
"disallowSpaceBeforeBinaryOperators": [
"=",
",",
"+",
"-",
"/",
"*",
"==",
"===",
"!=",
"!=="
// etc
]x+ y;x + y;Disallows sticking binary operators to the left.
Type: Array or Boolean
Values: Array of quoted operators or true to require space before all possible binary operators
without comma operator, since it's rarely used with this rule
"requireSpaceBeforeBinaryOperators": [
"=",
",",
"+",
"-",
"/",
"*",
"==",
"===",
"!=",
"!=="
// etc
]x !== y;x!== y;Requires sticking binary operators to the right.
Type: Array or Boolean
Values: Array of quoted operators or true to disallow space after all possible binary operators
"disallowSpaceAfterBinaryOperators": [
"=",
",",
"+",
"-",
"/",
"*",
"==",
"===",
"!=",
"!=="
// etc
]x +y;x+ y;Disallows sticking binary operators to the right.
Type: Array or Boolean
Values: Array of quoted operators or true to require space after all possible binary operators
"requireSpaceAfterBinaryOperators": [
"=",
",",
"+",
"-",
"/",
"*",
"==",
"===",
"!=",
"!=="
// etc
]x + y;x +y;Disallows implicit type conversion.
Type: Array
Values: Array of quoted types
"disallowImplicitTypeConversion": ["numeric", "boolean", "binary", "string"]x = Boolean(y);
x = Number(y);
x = String(y);
x = s.indexOf('.') !== -1;x = !!y;
x = +y;
x = '' + y;
x = ~s.indexOf('.');Requires identifiers to be camelCased or UPPERCASE_WITH_UNDERSCORES
Type: Boolean or String
Values: true or "ignoreProperties"
JSHint: camelcase
"requireCamelCaseOrUpperCaseIdentifiers": truevar camelCase = 0;
var CamelCase = 1;
var _camelCase = 2;
var camelCase_ = 3;
var UPPER_CASE = 4;var lower_case = 1;
var Mixed_case = 2;
var mixed_Case = 3;var camelCase = 0;
var CamelCase = 1;
var _camelCase = 2;
var camelCase_ = 3;
var UPPER_CASE = 4;
var obj.snake_case = 5;
var camelCase = { snake_case: 6 };var lower_case = 1;
var Mixed_case = 2;
var mixed_Case = 3;
var snake_case = { snake_case: 6 };Disallows usage of specified keywords.
Type: Array
Values: Array of quoted keywords
"disallowKeywords": ["with"]with (x) {
prop++;
}Disallows strings that span multiple lines without using concatenation.
Type: Boolean
Values: true
JSHint: multistr
"disallowMultipleLineStrings": truevar x = "multi" +
"line";
var y = "single line";var x = "multi \
line";Disallows multiple blank lines in a row.
Type: Boolean
Values: true
"disallowMultipleLineBreaks": truevar x = 1;
x++;var x = 1;
x++;Requires lines to not contain both spaces and tabs consecutively, or spaces after tabs only for alignment if "smart"
Type: Boolean or String
Values: true or "smart"
JSHint: smarttabs
"disallowMixedSpacesAndTabs": true\tvar foo = "blah blah";
\s\s\s\svar foo = "blah blah";
\t/**
\t\s*
\t\s*/ //a single space to align the star in a multi-line comment is allowed\t\svar foo = "blah blah";
\s\tsvar foo = "blah blah";\tvar foo = "blah blah";
\t\svar foo = "blah blah";
\s\s\s\svar foo = "blah blah";
\t/**
\t\s*
\t\s*/ //a single space to align the star in a multi-line comment is allowed\s\tsvar foo = "blah blah";Requires putting certain operators on the next line rather than on the current line before a line break.
Type: Array or Boolean
Values: Array of operators to apply to or true
"disallowOperatorBeforeLineBreak": ["+", "."]$el.on( 'click', fn )
.appendTo( 'body' );
var x = 4 + 5
+ 12 + 13;$el.on( 'click', fn ).
appendTo( 'body' );
var x = 4 + 5 +
12 + 13;Requires all lines to end on a non-whitespace character
Type: Boolean
Values: true
JSHint: trailing
"disallowTrailingWhitespace": truevar foo = "blah blah";var foo = "blah blah"; //<-- whitespace character hereDisallows an extra comma following the final element of an array or object literal.
Type: Boolean
Values: true
JSHint: es3
"disallowTrailingComma": truevar foo = [1, 2, 3];
var bar = {a: "a", b: "b"}var foo = [1, 2, 3, ];
var bar = {a: "a", b: "b", }Requires an extra comma following the final element of an array or object literal.
Type: Boolean or Object
Values:
true: validates all arrays and objectsObject:ignoreSingleValue: allows single property objects and single element arrays to not require a trailing commaignoreSingleLine: allows objects and arrays on a single line to not require a trailing comma
"requireTrailingComma": truevar foo = [1, 2, 3,];
var bar = {a: "a", b: "b",}var car = [1];
var dar = {a: "a"};var car = [1, 2, 3];
var dar = {a: "a", b: "b"};var foo = [1, 2, 3];
var bar = {a: "a", b: "b"}Disallows placing keywords on a new line.
Type: Array
Values: Array of quoted keywords
"disallowKeywordsOnNewLine": ["else"]if (x < 0) {
x++;
} else {
x--;
}if (x < 0) {
x++;
}
else {
x--;
}Requires placing keywords on a new line.
Type: Array
Values: Array of quoted keywords
"requireKeywordsOnNewLine": ["else"]if (x < 0) {
x++;
}
else {
x--;
}if (x < 0) {
x++;
} else {
x--;
}Requires placing line feed after assigning a variable.
Type: Boolean
Values: true
"requireLineBreakAfterVariableAssignment": truevar abc = 8;
var foo = 5;
var a, b, c,
foo = 7,
bar = 8;
var a,
foo = 7,
a, b, c,
bar = 8;var abc = 8; var foo = 5;
var a, b, c,
foo = 7, bar = 8;Requires placing line feed at file end.
Type: Boolean
Values: true
"requireLineFeedAtFileEnd": trueRequires all lines to be at most the number of characters specified
Type: Integer or Object
Values:
Integer: lines should be at most the number of characters specifiedObject:value: (required) lines should be at most the number of characters specifiedtabSize: (default:1) considered the tab character as number of specified spacesallowComments: (default:false) allows comments to break the ruleallowUrlComments: (default:false) allows comments with long urls to break the ruleallowRegex: (default:false) allows regular expression literals to break the rule
JSHint: maxlen
"maximumLineLength": 40var aLineOf40Chars = 123456789012345678;var aLineOf41Chars = 1234567890123456789;Requires constructors to be capitalized (except for this)
Type: Boolean
Values: true
JSHint: newcap
"requireCapitalizedConstructors": truevar a = new B();
var c = new this();var d = new e();Requires member expressions to use dot notation when possible
Type: Boolean
Values: true
JSHint: sub
"requireDotNotation": truevar a = b[c];
var a = b.c;
var a = b[c.d];
var a = b[1];
var a = b['while']; //reserved wordvar a = b['c'];Requires the variable to be the right hand operator when doing a boolean comparison
Type: Boolean
Values: true
"requireYodaConditions": trueif (1 == a) {
return
}if (a == 1) {
return
}Requires the variable to be the left hand operator when doing a boolean comparison
Type: Boolean
Values: true
"disallowYodaConditions": trueif (a == 1) {
return
}if (1 == a) {
return
}Requires that a line comment (//) be followed by a space.
Type: Boolean or Object or String
Values:
true"allowSlash"(deprecated use"except": ["/"]) allows///formatObject:allExcept: array of allowed strings before space//(here)
"requireSpaceAfterLineComment": { "allExcept": ["#", "="] }// A comment
/*A comment*/
//# sourceURL=filename.js
//= require something//A commentRequires that a line comment (//) not be followed by a space.
Type: Boolean
Values: true
"disallowSpaceAfterLineComment": true//A comment
/* A comment*/// A commentRequires that a function expression be named.
Type: Boolean
Values: true
"disallowAnonymousFunctions": truevar a = function foo(){
};
$('#foo').click(function bar(){
};)var a = function(){
};
$('#foo').click(function(){
};)Requires that a function expression be anonymous.
Type: Boolean
Values: true
"requireAnonymousFunctions": truevar a = function(){
};
$('#foo').click(function(){
})var a = function foo(){
};
$('#foo').click(function bar(){
});Disallows function declarations.
Type: Boolean
Values: true
"disallowFunctionDeclarations": truevar expressed = function() {
};
var expressed = function deeply() {
};
$('#foo').click(function bar() {
};)function stated() {
}Requires function declarations by disallowing assignment of functions expressions to variables. Function expressions are allowed in all other contexts, including when passed as function arguments or immediately invoked.
Assignment of function expressions to object members is also permitted, since these can't be declared.
Type: Boolean
Values: true
"requireFunctionDeclarations": truefunction declared() {
};
(function iife() {
void 0;
})();
var obj = {
a: function () {}
};
obj.b = function () { };
$('#foo').click(function bar() {
};)var expressed = function() {
};
var expressed = function deeply() {
};Disallows newline before opening curly brace of all block statements.
Type: Boolean
Values: true
"disallowNewlineBeforeBlockStatements": truefunction good(){
var obj = {
val: true
};
return {
data: obj
};
}
if (cond){
foo();
}
for (var e in elements){
bar(e);
}
while (cond){
foo();
}function bad()
{
var obj =
{
val: true
};
return {
data: obj
};
}
if (cond)
{
foo();
}
for (var e in elements)
{
bar(e);
}
while (cond)
{
foo();
}Requires newline before opening curly brace of all block statements.
Type: Boolean
Values: true
"requireNewlineBeforeBlockStatements": truefunction good()
{
var obj =
{
val: true
};
return {
data: obj
};
}
if (cond)
{
foo();
}
for (var e in elements)
{
bar(e);
}
while (cond)
{
foo();
}function bad(){
var obj = {
val: true
};
return {
data: obj
};
}
if (cond){
foo();
}
for (var e in elements){
bar(e);
}
while (cond){
foo();
}Option to check line break characters
Type: String
Values: "CR", "LF", "CRLF"
"validateLineBreaks": "LF"var x = 1;<LF>
x++;var x = 1;<CRLF>
x++;Requires all quote marks to be either the supplied value, or consistent if true
Type: String or Object
Values:
"\"": all strings require double quotes"'": all strings require single quotestrue: all strings require the quote mark first encountered in the source codeObject:escape: allow the "other" quote mark to be used, but only to avoid having to escapemark: the same effect as the non-object values
JSHint: quotmark
"validateQuoteMarks": "\"""validateQuoteMarks": { "mark": "\"", "escape": true }var x = "x";
var y = '"x"';var x = "x";
var y = 'x';var x = "x";var x = 'x';var x = "x", y = 'y';Validates indentation for switch statements and block statements
Type: Integer or String
Values: A positive integer or "\t"
JSHint: indent
"validateIndentation": "\t"if (a) {
b=c;
function(d) {
e=f;
}
}if (a) {
b=c;
function(d) {
e=f;
}
}if (a) {
b=c;
function(d) {
e=f;
}
}if (a) {
b=c;
function(d) {
e=f;
}
}Enable validation of separators between function parameters. Will ignore newlines.
Type: String
Values:
",": function parameters are immediately followed by a comma", ": function parameters are immediately followed by a comma and then a space" ,": function parameters are immediately followed by a space and then a comma" , ": function parameters are immediately followed by a space, a comma, and then a space
"validateParameterSeparator": ", "function a(b, c) {}function a(b , c) {}Ensure there are no spaces after argument separators in call expressions.
Type: Boolean
Value: true
"disallowSpaceBetweenArguments": truea(b,c);a(b, c);Ensure there are spaces after argument separators in call expressions.
Type: Boolean
Value: true
"requireSpaceBetweenArguments": truea(b, c);a(b,c);Requires the first alphabetical character of a comment to be uppercase, unless it is part of a multi-line textblock.
Type: Boolean
Value: true
"requireCapitalizedComments": true
Valid:
// Valid
//Valid
/*
Valid
*/
/**
* Valid
*/
// A textblock is a set of lines
// that starts with a capitalized letter
// and has one or more non-capitalized lines
// afterwards
// A textblock may also have multiple lines.
// Those lines can be uppercase as well to support
// sentense breaks in textblocks
// 123 or any non-alphabetical starting character
// @are also valid anywhere
Invalid:
// invalid
//invalid
/** invalid */
/**
* invalid
*/
Requires the first alphabetical character of a comment to be lowercase.
Type: String
Value: true
"disallowCapitalizedComments": true
Valid:
// valid
//valid
/*
valid
*/
/**
* valid
*/
// 123 or any non-alphabetical starting character
Invalid:
// Invalid
//Invalid
/** Invalid */
/**
* Invalid
*/
Disallows lines from ending in a semicolon.
Type: Boolean
Value: true
"disallowSemicolons": truevar a = 1
;[b].forEach(c)var a = 1;
[b].forEach(c);Please use the JSCS-JSDoc plugin instead.
Option to check var that = this expressions
Type: Array or String
Values: String value used for context local declaration
"safeContextKeyword": ["that"]var that = this;var _this = this;Use the following rules instead:
- requireSpaceBeforeBinaryOperators
- requireSpaceBeforePostfixUnaryOperators
- requireSpacesInConditionalExpression
Use the following rules instead:
- requireSpaceAfterBinaryOperators
- requireSpaceAfterPrefixUnaryOperators
- requireSpacesInConditionalExpression
Use the following rules instead:
- disallowSpaceBeforeBinaryOperators
- disallowSpaceBeforePostfixUnaryOperators
- disallowSpacesInConditionalExpression
Use the following rules instead:
- disallowSpaceAfterBinaryOperators
- disallowSpaceAfterPrefixUnaryOperators
- disallowSpacesInConditionalExpression
The npm package contains a file named jscs-browser.js (since version 1.5.7), which is a browser compatible version of jscs.
If you'd like to generate this file yourself, run npm run browserify after cloning this repo.
Use jscs-browser.js on your page as follows:
<script src="jscs-browser.js"></script>
<script>
var checker = new JscsStringChecker();
checker.registerDefaultRules();
checker.configure({disallowMultipleVarDecl: true});
var errors = checker.checkString('var x, y = 1;');
errors.getErrorList().forEach(function(error) {
console.log(errors.explainError(error));
});
</script>