CoffeeLint

Run
Configuration

Overview

CoffeeLint is a style checker that helps keep CoffeeScript code clean and consistent. CoffeeScript does a great job at insulating programmers from many of JavaScript's bad parts, but it won't help enforce a consistent style across a code base. CoffeeLint can help with that.
If you have an idea, a bug report or anything else to say, reach out on the issues page.

Installation

To install, make sure you have a working version of the latest stable version of Node and NPM (the Node Package Manager) and then run:
npm install -g @coffeelint/cli
Remove the -g if you do not want to install globally.

Getting Started

Usage

Once you have Coffeelint installed, to lint your scripts, run:
coffeelint application.coffee
To specify your own configuration file, do the following:
coffeelint -f coffeelint.json application.coffee
If any errors were found, a non-zero code will be returned.
To generate a configuration file, do
coffeelint --makeconfig > coffeelint.json
You can then configure the rules to your liking.
New in 1.0: CoffeeLint will automatically pick up config files. When linting a file (as opposed to stdin) it will walk up the directory tree looking for a coffeelint.json or a package.json that has a "coffeelintConfig" object. If neither of those are found or you're linting from stdin it will check your home for a coffeelint.json file.

Options

By default, CoffeeLint will help ensure you are writing idiomatic CoffeeScript, but every rule is optional and configurable so it can be tuned to fit your preferred coding style. To override any of CoffeeLint's default options, generate a configuration file and tweak it as needed. To enable an option, set its level to error, and to disable an option, set its level to ignore. If you set the level to warn, violations will be reported, but won't cause a non-zero exit code.
To disable a rule inline use the following:

          # coffeelint: disable=max_line_length
          foo = "some/huge/line/string/with/embed/#{values}.that/surpasses/the/max/column/width"
          # coffeelint: enable=max_line_length
        
You can also disable all checks for a single line by appending # noqa at the end of the line:
throw "I should be an Error not a string but YOLO" # noqa
Here's a rundown of CoffeeLint's rules:
Name Description
arrow_spacing

This rule checks to see that there is spacing before and after the arrow operator that declares a function. This rule is disabled by default.

Note that if arrow_spacing is enabled, and you pass an empty function as a parameter, arrow_spacing will accept either a space or no space in-between the arrow operator and the parenthesis

# Both of this will not trigger an error,
# even with arrow_spacing enabled.
x(-> 3)
x( -> 3)

# However, this will trigger an error
x((a,b)-> 3)

default level: ignore

braces_spacing This rule checks to see that there is the proper spacing inside curly braces. The spacing amount is specified by "spaces". The spacing amount for empty objects is specified by "empty_object_spaces". The spacing amount for objects containing a single item is specified by "mono_object_spaces".

# Spaces is 0
{a: b}     # Good
{a: b }    # Bad
{ a: b}    # Bad
{ a: b }   # Bad
# Spaces is 1
{a: b}     # Bad
{a: b }    # Bad
{ a: b}    # Bad
{ a: b }   # Good
{ a: b  }  # Bad
{  a: b }  # Bad
{  a: b  } # Bad
# Empty Object Spaces is 0
{}         # Good
{ }        # Bad
# Empty Object Spaces is 1
{}         # Bad
{ }        # Good
# Mono Object Spaces is 0
{a}        # Good
{ a }      # Bad
# Mono Object Spaces is 1
{a}        # Bad
{ a }      # Good
This rule is disabled by default.

default level: ignore

bracket_spacing This rule checks to see that there is the proper spacing inside square brackets. The spacing amount is specified by "spaces". The spacing amount for empty arrays is specified by "empty_array_spaces". The spacing amount for arrays containing a single item is specified by "mono_array_spaces". Specified characters will be ignored if listed in "exceptions".

# Spaces is 0
[a, b]     # Good
[a, b ]    # Bad
[ a, b]    # Bad
[ a, b ]   # Bad
# Except brackets
[ [a, b] ] # Good
[[ a, b ]] # Bad
# Spaces is 1
[a, b]     # Bad
[a, b ]    # Bad
[ a, b]    # Bad
[ a, b ]   # Good
[ a, b  ]  # Bad
[  a, b ]  # Bad
[  a, b  ] # Bad
# Except braces
[{ a: b }] # Good
[ {a: b} ] # Bad
# Empty Array Spaces is 0
[]         # Good
[ ]        # Bad
# Empty Array Spaces is 1
[]         # Bad
[ ]        # Good
# Mono Array Spaces is 0
[a]        # Good
[ a ]      # Bad
# Mono Array Spaces is 1
[a]        # Bad
[ a ]      # Good
This rule is disabled by default.

default level: ignore

camel_case_classes This rule mandates that all class names are UpperCamelCased. Camel casing class names is a generally accepted way of distinguishing constructor functions - which require the 'new' prefix to behave properly - from plain old functions.
# Good!
class BoaConstrictor

# Bad!
class boaConstrictor

This rule is enabled by default.

default level: error

coffeescript_error [no description provided]

default level: error

colon_assignment_spacing

This rule checks to see that there is spacing before and after the colon in a colon assignment (i.e., classes, objects). The spacing amount is specified by spacing.left and spacing.right, respectively. A zero value means no spacing required.


#
# If spacing.left and spacing.right is 1
#

# Doesn't throw an error
object = {spacing : true}
class Dog
  canBark : true

# Throws an error
object = {spacing: true}
class Cat
  canBark: false

default level: ignore

cyclomatic_complexity Examine the complexity of your function.

default level: ignore

duplicate_key Prevents defining duplicate keys in object literals and classes

default level: error

empty_constructor_needs_parens Requires constructors with no parameters to include the parens

default level: ignore

ensure_comprehensions This rule makes sure that parentheses are around comprehensions.

default level: warn

eol_last Checks that the file ends with a single newline

default level: ignore

indentation This rule imposes a standard number of spaces(tabs) to be used for indentation. Since whitespace is significant in CoffeeScript, it's critical that a project chooses a standard indentation format and stays consistent. Other roads lead to darkness.
 #
Enabling this option will prevent this ugly
# but otherwise valid CoffeeScript.
twoSpaces = () ->
  fourSpaces = () ->
      eightSpaces = () ->
            'this is valid CoffeeScript'


Two space indentation is enabled by default.

default level: error

line_endings This rule ensures your project uses only windows or unix line endings. This rule is disabled by default.

default level: ignore

max_line_length This rule imposes a maximum line length on your code. Python's style guide does a good job explaining why you might want to limit the length of your lines, though this is a matter of taste. Lines can be no longer than eighty characters by default.

default level: error

missing_fat_arrows Warns when you use `this` inside a function that wasn't defined with a fat arrow. This rule does not apply to methods defined in a class, since they have `this` bound to the class instance (or the class itself, for class methods). The option `is_strict` is available for checking bindings of class methods. It is impossible to statically determine whether a function using `this` will be bound with the correct `this` value due to language features like `Function.prototype.call` and `Function.prototype.bind`, so this rule may produce false positives.

default level: ignore

missing_parseint_radix This rule warns about using parseInt without a radix. From the MDN developers reference: Always specify this parameter to eliminate reader confusion and to guarantee predictable behavior.
  # You would expect this to result in 8, but
  # it might result in 0 (parsed as octal).
  parseInt '08'

  # To be safe, specify the radix argument:
  parseInt '08', 10
  

default level: warn

newlines_after_classes

Checks the number of blank lines between classes and other code.

Options: -
value
- The number of required blank lines after class definitions. Defaults to 3.

default level: ignore

no_backticks Backticks allow snippets of JavaScript to be embedded in CoffeeScript. While some folks consider backticks useful in a few niche circumstances, they should be avoided because so none of JavaScript's "bad parts", like with and eval, sneak into CoffeeScript. This rule is enabled by default.

default level: error

no_debugger This rule detects `debugger` and optionally `console` calls This rule is `warn` by default.

default level: warn

no_empty_functions Disallows declaring empty functions. The goal of this rule is that unintentional empty callbacks can be detected:
someFunctionWithCallback ->
doSomethingSignificant()

The problem is that the call to doSomethingSignificant will be made regardless of someFunctionWithCallback's execution. It can be because you did not indent the call to doSomethingSignificant properly. If you really meant that someFunctionWithCallback should call a callback that does nothing, you can write your code this way:
someFunctionWithCallback ->
    undefined
doSomethingSignificant()

default level: ignore

no_empty_param_list This rule prohibits empty parameter lists in function definitions.
# The empty parameter list in here is unnecessary:
myFunction = () ->

# We might favor this instead:
myFunction = ->

Empty parameter lists are permitted by default.

default level: ignore

no_implicit_braces This rule prohibits implicit braces when declaring object literals. Implicit braces can make code more difficult to understand, especially when used in combination with optional parenthesis.
# Do you find this code ambiguous? Is it a
# function call with three arguments or four?
myFunction a, b, 1:2, 3:4

# While the same code written in a more
# explicit manner has no ambiguity.
myFunction(a, b, {1:2, 3:4})

Implicit braces are permitted by default, since their use is idiomatic CoffeeScript.

default level: ignore

no_implicit_parens This rule prohibits implicit parens on function calls.
# Some folks don't like this style of coding.
myFunction a, b, c

# And would rather it always be written like this:
myFunction(a, b, c)

Implicit parens are permitted by default, since their use is idiomatic CoffeeScript.

default level: ignore

no_interpolation_in_single_quotes This rule prohibits string interpolation in a single quoted string.
# String interpolation in single quotes is not allowed:
foo = '#{bar}'

# Double quotes is OK of course
foo = "#{bar}"

String interpolation in single quoted strings is permitted by default.

default level: ignore

no_nested_string_interpolation This rule warns about nested string interpolation, as it tends to make code harder to read and understand.
# Good!
str = "Book by #{firstName.toUpperCase()} #{lastName.toUpperCase()}"

# Bad!
str = "Book by #{"#{firstName} #{lastName}".toUpperCase()}"

default level: warn

no_plusplus This rule forbids the increment and decrement arithmetic operators. Some people believe the ++ and -- to be cryptic and the cause of bugs due to misunderstandings of their precedence rules. This rule is disabled by default.

default level: ignore

no_private_function_fat_arrows Warns when you use the fat arrow for a private function inside a class definition scope. It is not necessary and it does not do anything.

default level: warn

no_spaces This rule forbids spaces in indentation. It is disabled by default.

default level: ignore

no_stand_alone_at This rule checks that no stand alone @ are in use, they are discouraged. Further information in CoffeeScript issue #1601

default level: ignore

no_tabs This rule forbids tabs in indentation. Enough said. It is enabled by default.

default level: error

no_this This rule prohibits 'this'. Use '@' instead.

default level: ignore

no_throwing_strings This rule forbids throwing string literals or interpolations. While JavaScript (and CoffeeScript by extension) allow any expression to be thrown, it is best to only throw Error objects, because they contain valuable debugging information like the stack trace. Because of JavaScript's dynamic nature, CoffeeLint cannot ensure you are always throwing instances of Error. It will only catch the simple but real case of throwing literal strings.
# CoffeeLint will catch this:
throw "i made a boo boo"

# ... but not this:
throw getSomeString()

This rule is enabled by default.

default level: error

no_trailing_semicolons This rule prohibits trailing semicolons, since they are needless cruft in CoffeeScript.
# This semicolon is meaningful.
x = '1234'; console.log(x)

# This semicolon is redundant.
alert('end of line');

Trailing semicolons are forbidden by default.

default level: error

no_trailing_whitespace This rule forbids trailing whitespace in your code, since it is needless cruft. It is enabled by default.

default level: error

no_unnecessary_double_quotes This rule prohibits double quotes unless string interpolation is used or the string contains single quotes.
# Double quotes are discouraged:
foo = "bar"

# Unless string interpolation is used:
foo = "#{bar}baz"

# Or they prevent cumbersome escaping:
foo = "I'm just following the 'rules'"

Double quotes are permitted by default.

default level: ignore

no_unnecessary_fat_arrows Disallows defining functions with fat arrows when `this` is not used within the function.

default level: warn

non_empty_constructor_needs_parens Requires constructors with parameters to include the parens

default level: ignore

object_shorthand

Use property value shorthand in objects, when explicit braces are used.

test = "value"

# Good
{test}
test: test

# Bad
{test: test}

default level: ignore

prefer_english_operator This rule prohibits &&, ||, ==, != and !. Use and, or, is, isnt, and not instead. !! for converting to a boolean is ignored.

default level: ignore

prefer_fat_arrows_in_methods Warns when you do not use a fat arrow for functions defined inside method bodies. This assures that `this` is always bound to the method's object inside the code block of a method.

default level: ignore

prefer_logical_operator This rule prohibits is, isnt, not, and, or, yes, on, no, off. Use ==, !=, !, &&, ||, true, false instead.

default level: ignore

space_operators This rule enforces that operators have space around them. Optionally, you can set `default_parameters` to `false` to require no space around `=` when used to define default paramaters.

default level: ignore

spacing_after_comma This rule checks to make sure you have a space after commas. Consecutive commas are allowed when skipping array elements if "ignore_elision" is true.

# ignore_elision: true
[,, c,, e, f] = [1, 2, 3, 4, 5, 6]

default level: ignore

transform_messes_up_line_numbers This rule detects when changes are made by transform function, and warns that line numbers are probably incorrect.

default level: warn

API

If you'd like to run CoffeeScript in the browser or any other Javascript runtime, include coffee-script.js and coffeelint.js and you're off to the races. Then you can call CoffeeLint directly with the following API:

coffeelint.lint(source, configuration)

Lints the CoffeeScript source with the given configuration and returns an array of lint errors and warnings. If the array is empty, all is well. Compile time errors will be thrown. An error is a Javascript object with the following properties:

          {
            rule :      'Name of the violated rule',
            lineNumber: 'Number of the line that caused the violation',
            level:      'The severity level of the violated rule',
            message:    'Information about the violated rule',
            context:    'Optional details about why the rule was violated'
          }
        

coffeelint.registerRule(RuleConstructor)

Registers a custom rule that may be run by CoffeeLint. If the rule is ignored by default it will still require overriding it's level just like the default rules. They have actually all be re-implemented as pluggable rules that come bundled in CoffeeLint.

Loading Custom Rules

Not every possible rule will be included in the CoffeeLint project. Maybe it's very specific to your project, or it's not specific to CoffeeScript.
By convention rule authors add the keyword coffeelintrule to their npm package.json so custom rules can be found easily. Click here to list all currently available custom rules on npm.
For example, maybe you want to get a warning if you don't have a newline at the end of your files. We'll imagine you globally installed the package "coffeelint-newline-eof".

          {
            // This name MUST match the default configuration of the rule being loaded.
            "newline_at_eof": {
              // NodeJS module to load. It can also be a path to the rule (useful for devleopment)
              "module": "coffeelint-newline-at-eof",
              // Maybe the rule author set it to error by default and you only want a warning.
              "level": "warn"
            }
          }
        
Now every time you run CoffeeLint it will load that rule and override it's default level to "warn".

Building Custom Rules

CoffeeLint has three types of linters that run. In no particular order they are.
  • LineLinter: processes one line at a time, usually with regular expressions
  • TokenLinter: processes the token stream generated by CoffeeScript.
  • ASTLinter: Processes the Abstract Syntax Tree. AST rules are only called with the root node and it is up to the rule to recurse the tree.
Rules may be loaded using --rules /path/to/rules/ or coffeelint.registerRule(RuleConstructor) when outside of the CLI.
Rules do not have to be written in CoffeeScript. A new instance of each rule is constructed for each file, so the RuleConstructor must be a constructor function that generates a new clean instance of your rule when the new operator is used.
Your rule instance must have a .rule attribute with it's default configuration. "name", "level" "message", and "description" are all required. "level" must be one of 'ignore', 'warn', or 'error'. Once you have a valid rule configuration CoffeeLint requires you to implement one function depending on which type of linter your rule needs.

            lintLine(line, lineApi)
            lintToken(token, tokenApi)
            lintAST(ast, astApi)
          
The second parameter of each is an object with helper functions. It's best to just check the source or look at how other plugins are using those.
If your function returns true it will generate an error. If you need to override how the error is generated, maybe providing a context attribute, you can return an object that will get mixed into the generated error. The No_PlusPlus rule is a simple example of this.
The core rules have been rewritten as stand alone rules both to prove the system and provide examples of how to write rules. To get started no_plusplus is a Token rule, no_tabs is a Line rule, and cyclomatic_complexity is an AST rule.
The --rules option will load every .js or .coffee file it finds and assume they export the RuleConstructor. Since the browser doesn't have a standard export system it's up to you to determine how you'll load your plugin and register it with coffeelint.registerRule

Plugins

Some nice folks have coded up some cool CoffeeLint plugins for editors and build systems. Check them out:

About

CoffeeLint is open sourced under the MIT License. If you want to hack on the code, report a bug or suggest a new feature, head on over to the repo.
Thanks to CoffeeScript's developers for a great language (and a re-usable Lexer). Thanks to the creators of JSLint, JSHint, Pylint, lint and my mother for inspiration.

Change Log

5.2.11 (2022-11-07)

Bug Fixes

  • deps: bump yargs from 17.6.0 to 17.6.2 (#222) (f7c7e60)

5.2.10 (2022-09-30)

Bug Fixes

5.2.9 (2022-05-16)

Bug Fixes

  • deps: bump glob from 8.0.1 to 8.0.3 (#209) (b51dafc)
  • deps: bump yargs from 17.4.1 to 17.5.1 (#208) (5fd34f4)

5.2.8 (2022-04-25)

Bug Fixes

  • deps: bump coffeescript from 2.6.1 to 2.7.0 (#206) (9f0316c)

5.2.7 (2022-04-19)

Bug Fixes

5.2.6 (2022-04-11)

Bug Fixes

  • deps: bump yargs from 17.4.0 to 17.4.1 (#204) (ed7815e)

5.2.5 (2022-03-21)

Bug Fixes

  • deps: bump yargs from 17.3.1 to 17.4.0 (#200) (ab15421)

5.2.4 (2022-01-27)

Bug Fixes

  • deps: bump resolve from 1.21.0 to 1.22.0 (#191) (91e4186)

5.2.3 (2022-01-04)

Bug Fixes

  • deps: bump resolve from 1.20.0 to 1.21.0 (#189) (466ac4b)
  • deps: update all deps (c63d425)

5.2.2 (2021-12-20)

Bug Fixes

  • deps: bump ignore from 5.1.9 to 5.2.0 (#187) (c2f8625)

5.2.1 (2021-12-01)

Bug Fixes

  • deps: bump yargs from 17.2.1 to 17.3.0 (#185) (32f2cfd)

5.2.0 (2021-11-07)

Features

5.1.1 (2021-11-05)

Bug Fixes

  • deps: bump ignore from 5.1.8 to 5.1.9 (#176) (fbdb8c9)

5.1.0 (2021-11-01)

Features

  • Allow ".coffeelintrc.json" config file (#173) (970fcd4)

5.0.5 (2021-10-18)

Bug Fixes

  • deps: bump coffeescript from 2.6.0 to 2.6.1 (#166) (66c5e32)

5.0.4 (2021-09-23)

Bug Fixes

  • deps: bump glob from 7.1.7 to 7.2.0 (#162) (e77d072)
  • deps: bump yargs from 17.1.1 to 17.2.0 (#163) (6be6c16)

5.0.3 (2021-09-20)

Bug Fixes

  • deps: bump coffeescript from 2.5.1 to 2.6.0 (#154) (254351c)

5.0.2 (2021-08-16)

Bug Fixes

  • deps: bump yargs from 17.1.0 to 17.1.1 (#146) (d7f9085)

5.0.1 (2021-05-07)

Bug Fixes

5.0.0 (2021-05-04)

Bug Fixes

BREAKING CHANGES

  • drop support for node v10

4.1.5 (2021-05-03)

Bug Fixes

  • deps: bump yargs from 16.2.0 to 17.0.0 (#132) (62369be)

4.1.4 (2021-03-23)

Bug Fixes

4.1.3 (2021-02-12)

Bug Fixes

  • deps: bump resolve from 1.19.0 to 1.20.0 (#118) (90fb2a1)

4.1.2 (2020-11-11)

Bug Fixes

  • deps: bump resolve from 1.18.1 to 1.19.0 (#98) (e602414)

4.1.1 (2020-10-16)

Bug Fixes

  • deps: bump yargs from 16.0.3 to 16.1.0 (#94) (6a21feb)

4.1.0 (2020-09-23)

Features

4.0.0 (2020-09-10)

Bug Fixes

BREAKING CHANGES

  • Drop support for Node v8

3.2.10 (2020-07-15)

Bug Fixes

  • deps: update dependency strip-json-comments to ^3.1.1 (c0e112e)

3.2.9 (2020-07-11)

Bug Fixes

  • deps: update dependency yargs to ^15.4.1 (fe70faf)

3.2.8 (2020-07-03)

Bug Fixes

  • deps: update dependency yargs to ^15.4.0 (d252233)

3.2.7 (2020-06-11)

Bug Fixes

  • deps: update dependency ignore to ^5.1.8 (#68) (dc316a4)
  • Improve max_line_length rule with comment behavior (#67) (aa7930a)
  • deps: update dependency ignore to ^5.1.8 (2a6b1d0)

3.2.6 (2020-05-23)

Bug Fixes

  • deps: update dependency ignore to ^5.1.6 (#63) (a06e76e)

3.2.5 (2020-05-22)

Bug Fixes

  • deps: update dependency ignore to ^5.1.5 (#62) (ac86e49)

3.2.4 (2020-04-23)

Bug Fixes

  • deps: update dependency resolve to ^1.17.0 (#60) (e42b0d1)

3.2.3 (2020-04-17)

Bug Fixes

  • deps: update dependency resolve to ^1.16.1 (#58) (a3c5915)

3.2.2 (2020-04-17)

Bug Fixes

  • deps: update dependency resolve to ^1.16.0 (#56) (f16af4d)

3.2.1 (2020-04-17)

Bug Fixes

  • deps: use semantic-release (9c90153)

3.2.0 (2020-04-10)

Add prefer_fat_arrows_in_methods rule.

  • Fix last line comment trailing semicolon #55
  • Add prefer_fat_arrows_in_methods rule #15

3.1.3 (2020-04-08)

Fix newlines_after_classes when there are blank lines before last line in class.

  • Fix newlines_after_classes #52
  • Remove relics from coffeescript <= v1.10.0 #53

3.1.2 (2020-04-05)

Update coffeescript dependency to v2.5.1.

  • Update coffeescript dependency. #50

3.1.1 (2020-03-22)

Update commandline dependency to maintained dependency.

  • Replace optimist with yargs. #46

1.16.2 (2020-02-06)

First 1.x release under new npm package; to use: npm install -g @coffeelint/cli@old

  • Don’t unnecessarily print “context:” at the end of some error messages #42

3.1.0 (2020-02-06)

Added a few rules and rules options. More bug fixes and internal updates to make developing easier. We got through the backlog of pull requests. Now on to the issues...

  • Add prefer_logical_operator rule. #13
  • Add missing_parseint_radix rule. #17
  • Add bracket_spacing rule. #26
  • space_operators: add default_parameters option. #16
  • colon_assignment_spacing: add min_left and min_right option. #22
  • spacing_after_comma: add ignore_elision option. #34
  • braces_spacing: add mono_object_spaces option. #17
  • Properly double quote fields in csv reporter. #14
  • Stop printing empty context in checkstyle reporter. #12
  • no_tabs rejects tabs at the end of the line. #20
  • Prevent endless loop if lineNumber is negative. #10
  • Update dependency resolve to v1.15.1

3.0.2 (2020-01-22)

small fixes

  • Bugfix for error message when a config file cannot be found. #38
  • Update dependency resolve to v1.15.0
  • Update documentation

3.0.1 (2020-01-22)

CoffeeLint has a new webpage at https://coffeelint.github.io

  • Update dependencies and clean up documentation

3.0.0 (2020-01-14)

CoffeeLint has a new home at https://github.com/coffeelint/coffeelint and a new npm package @coffeelint/cli.

  • Bugfix for error message when an unknown level is used. #4
  • Bugfix for error duplicate_key when keys are wrapped in quotes. #6
  • Add no_spaces rule to disallow spaces for indentation. #7
  • Several enhancements, including CJSX fixes. #8
  • Add rule name to default reporter. #11

1.15.0 (2015-11-18)

This version updates the enable/disable directives. In addition to the existing # coffeelint: disable=rule_name you can also use # coffeelint: disable-line=rule_name. The rule name is still optional in both cases, and you can enable the rules using the same syntax.

You can also use # noqa as a shortcut for # coffeelint: disable-line

  • See #552 for more details.

1.14.1 (2015-11-18)

Most of the changes are more for linting the development files of coffeelint. The minor version increase is due to the change in cyclomatic_complexity, which now ignores nested functions. I foresee this change affecting very few people but probably still needs a minor version increase.

  • cyclomatic_complexity rule has been changed to ignore nested functions
  • 1.4.1: inlined rules not previously specified in JSON config now properly return a message

1.13.0 (2015-10-07)

The v1.12.x versions are considered buggy and you should upgrade to v1.13.x if you experience problems

These releases were largely for bugfixes!

  • Bugfix for no_implicit_braces causing errors in classes and other edge cases
  • Bugfix for ensure_comprehensions where it failed if a nested loop had an equal sign
  • Bugfix for braces_spacing failing over generated curly braces
  • Several changes to indentation See bffa25 for the full list of changes. However between the release of v1.12.0 and v1.13.0, a regression was caused by fixing one of the indentation requests and as a result the change was reverted. The revert will most likely not affect too many users
  • Bugfix for newlines_after_classes, also fixed regressions caused between v1.12.0 and v1.13.0. If you have v1.12.x and are experiencing problems, please upgrade. Also note nested classes are now ignored completely
  • no_this is now compatible with no_stand_alone_at and will make checks against singular this
  • Bugfix for missing_fat_arrows, declaring a class prototype (via '::' operator) no longer fail if they don't use a fat arrow
  • Bugfix for eol_last, it now fails if there are multiple newlines at the end of a file (thanks charlierudolph)-
  • Bugfix for arrow_spacing, now ignores arrow spacing in empty functions (thanks sgentle)

1.11.0 (2015-08-19)

  • New config option { "extends": "coffeelint-config-myconfig" } based on eslint's shareable configs
  • New rule no_nested_string_interpolation
  • New rule no_private_function_fat_arrows
  • New CLI option --ext to specify alternate file extensions to check
  • Bugfixes including tracking nested string interpolation which eleminates some misleading warnings

1.10.0 (2015-05-31)

  • New option --trimconfig. shows the minimal config to implement your customizations.

  • New rule eol_last

  • New rule no_this (prefer @ instead)

  • New option in no_debugger to flag console calls

  • Many small bug fixes

1.9.6 (2015-05-05)

  • Fix no_interpolation_in_single_quotes to only handle single quotes #400
  • Avoid non-standard String.prototype.trimRight #401
  • Strip comments from config file before parsing #407
  • missing_fat_arrows: fix constructor checking in strict mode #409
  • Use configfilter to expand module names

1.9.4 (2015-04-06)

  • missing_fat_arrows: added strict-mode option, defaults to false
  • Add "empty_object_spaces" to braces_spacing

1.9.3 (2015-03-29)

  • Add fat arrow to arrow_spacing
  • Fix an exception when package.json can't be parsed.

1.9.1 (2015-02-22)

  • Small change to make CoffeeLint compatible with atom.io

1.9.0 (2015-02-20)

  • Updated to CoffeeScript 1.9.1 thanks to swang
  • Fix no_implicit_braces error in class declarations
  • New rule braces_padding

1.8.1 (2014-12-20)

  • New rule ensure_comprehensions (warn by default)
  • Added options to transform code before processing it. (JSX support) or to use a different flavor of CoffeeScript.
  • New rule transform_messes_up_line_numbers. This simply tells you if a transform you're using changes the total number of lines in the file.

1.7.1 (2014-12-15)

  • Fix for spacing_after_comma so that newlines count as space after commas

1.7.0 (2014-12-12)

  • New rule spacing_after_comma
  • Indentation improvements
  • Fix Block RegExp triggering in no_unnecessary_double_quotes

1.6.0 (2014-08-30)

  • New rule prefer_english_operator
  • New behavior .coffeelintignore works just like a .gitignore
  • Exposed ErrorReporter to 3rd parties so reporters can be used outside our CLI implementation. See #330 for details
  • Linting from STDIN will look for config files.
  • -f option can specify a package.json that contains coffeelintConfig
  • Depricated --no-color in favor of new --color=<always/never/auto> option
  • Fixed an indentation bug when you have a blank line in the middle of a chained call.

1.5.5 (2014-08-12)

  • #317 Change $HOME search priority to account for non-default windows users.
  • #320 Remove support for chaining calls using a dot at the end of a line.
  • Removed extra messages that broke XML output.

1.5.3 (2014-08-08)

  • Indentation improvements for chained calls. See #285
  • Fixed some missing cases for space_operators
  • Fix for a last-line edge case in no_implicit_parens
  • Fixed trailing semicolons in multi-line strings with multiple embedded tokens

1.5.2 (2014-06-07)

  • #280 Fix for fat-arrow false positives. It was producing errors when the class is defined inside a function (AMD style)
  • MANY indentation fixes. See #282.

1.5.0 (2014-05-28)

  • New: --cache and coffeelint.setCache(obj)
  • Rule module loading is not limited to running from the commandline. See #279
  • Fix for #173: Empty functions surrounded by parens don't require spacing.
  • Fix for #271: trailing semicolons multiline strings are ignored
  • Fix for #214: no_unnecessary_fat_arrows doesn't trigger if the function contains super.

1.4.0 (2014-05-16)

  • Similar to grunt-cli, the coffeelint command will now load the project-specific version of coffeelint if there is one there.
  • 3rd party rules don't have to be globally installed any more.
  • Added --reporter option that also supports 3rd party reporters. coffeelint-stylish is the first one available.
  • Documentation for new users and 3rd party developers.

1.3.0 (2014-04-17)

  • New rule no_empty_functions
  • Improved documentation on how to contribute in README.md
  • Rules using the AST work with a minified version of CoffeeScript
  • Fixed line length check to account for windows line endings

1.2.0 (2014-03-07)

  • New rule no_debugger
  • New rule no_interpolation_in_single_quotes
  • New rule no_unnecessary_double_quotes
  • Strict mode for no_implicit_parens. Turning it off allows implicit parens when they span multiple lines.

1.1.0 (2014-02-22)

  • CoffeeScript 1.7 support
  • Dropped support for CoffeeScript 1.6. (Use ~1.0.0 if you still need it)

1.0.0 (2013-11-21)

  • CoffeeLint will detect config files by default.
  • New rule colon_assignment_spacing
  • New rule no_unnecessary_fat_arrows
  • New rule missing_fat_arrows
  • Added an option to no_trailing_whitespace to forbid trailing space on empty lines
  • Added an option to no_implicit_braces to allow unambiguous implicit braces
  • Fixed --makeconfig
  • New option: --checkstyle
  • Fixed invalid XML produced by --jslint
  • Removed the need for the -r flag. It remains for backward compatibility but doesn't do anything now

0.6.0 (2013-10-10)

  • New internal structure to support custom rules.
  • Dropped support for NodeJS 0.6.

0.5.7 (2013-08-10)

0.5.6 (2013-06-07)

0.5.4 (2012-11-06)

  • Support for default configuration file using environment variable COFFEELINT_CONFIG.

0.5.3 (2012-11-06)

  • Added no_stand_alone_at rule.
  • Fixed correctly reporting line numbers of compilation errors after line 10.
  • Fixed incomplete results output.

0.5.2 (2012-09-18)

  • Added --nocolor option.
  • My main man ruddzw fixed issue #58, in which the -q option was suppressing information even when it was off.
  • Fixed broken jslint option.
  • The no_trailing_semicolons rule now works on Windows files.

0.5.1 (2012-09-15)

  • Show CoffeeScript syntax errors in the same manner as lint errors.
  • Brad Dunbar added the -q command line option, which only prints errors.

0.5.0 (2012-09-08)

  • Lint code from stdin with the --stdin option, thanks to sjz.
  • Added the no_implicit_parens rule.
  • Leandro Ostera added the --jslint reporter, to allow CoffeeLint to integrate with the Jenkin's violations plugin.
  • Implicit braces are always allowed in in class defiinitions, thanks to Omar Khan.
  • CoffeeLint now requires CoffeeScript 1.3.3

0.4.0 (2012-04-06)

  • Added fancy coloured output and proper CSV output.
  • Directories can be recursively linted.
  • Added the line endings rule.
  • Rewrote the command line tool in CoffeeScript.

0.3.0 (2012-03-13)

  • Added the no_backticks rule.
  • Colorized the command line output.
  • Added validation for the rule names.
  • Allowed windows line endings, thanks to szinsli.

0.2.0 (2012-01-26)

  • Added warnings, which will be reported, but won't fail the command line tool.

0.1.0 (2012-01-22)

  • Initial CoffeeLint release.
Fork me on GitHub