@coffeelint/cli
Version:
Lint your CoffeeScript
71 lines (60 loc) • 2.04 kB
JavaScript
(function() {
var CamelCaseClasses, regexes;
regexes = {
camelCase: /^[A-Z_][a-zA-Z\d]*$/
};
module.exports = CamelCaseClasses = (function() {
class CamelCaseClasses {
lintToken(token, tokenApi) {
var className, offset, ref, ref1, ref2;
// TODO: you can do some crazy shit in CoffeeScript, like
// class func().ClassName. Don't allow that.
// Don't try to lint the names of anonymous classes.
if ((token.newLine != null) || ((ref = tokenApi.peek()[0]) === 'INDENT' || ref === 'EXTENDS')) {
return null;
}
// It's common to assign a class to a global namespace, e.g.
// exports.MyClassName, so loop through the next tokens until
// we find the real identifier.
className = null;
offset = 1;
while (!className) {
if (((ref1 = tokenApi.peek(offset + 1)) != null ? ref1[0] : void 0) === '.') {
offset += 2;
} else if (((ref2 = tokenApi.peek(offset)) != null ? ref2[0] : void 0) === '@') {
offset += 1;
} else {
className = tokenApi.peek(offset)[1];
}
}
// Now check for the error.
if (!regexes.camelCase.test(className)) {
return {
token,
context: `class name: ${className}`
};
}
}
};
CamelCaseClasses.prototype.rule = {
type: 'style',
name: 'camel_case_classes',
level: 'error',
message: 'Class name should be UpperCamelCased',
description: `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.
<pre>
<code># Good!
class BoaConstrictor
# Bad!
class boaConstrictor
</code>
</pre>
This rule is enabled by default.`
};
CamelCaseClasses.prototype.tokens = ['CLASS'];
return CamelCaseClasses;
}).call(this);
}).call(this);