tslint-react
Advanced tools
Comparing version 2.1.1 to 2.2.0
{ | ||
"name": "tslint-react", | ||
"version": "2.1.1", | ||
"version": "2.2.0", | ||
"description": "Lint rules related to React & JSX for TSLint", | ||
@@ -5,0 +5,0 @@ "main": "tslint-react.json", |
@@ -49,2 +49,3 @@ [![NPM version](https://badge.fury.io/js/tslint-react.svg)](https://www.npmjs.com/package/tslint-react) | ||
- Rule options: `["always", "never"]` | ||
- _Includes automatic code fix_ | ||
- `jsx-no-lambda` | ||
@@ -51,0 +52,0 @@ - Creating new anonymous functions (with either the `function` syntax or ES2015 arrow syntax) inside the `render` call stack works against _pure component rendering_. When doing an equality check between two lambdas, React will always consider them unequal values and force the component to re-render more often than necessary. |
@@ -47,5 +47,6 @@ /** | ||
} | ||
function isSpaceBetweenTokens(first, second) { | ||
var text = first.parent.getText().slice(first.end - first.parent.getStart(), second.getStart() - second.parent.getStart()); | ||
return /\s/.test(text.replace(/\/\*.*?\*\//g, "")); | ||
function getTotalCharCount(comments) { | ||
return comments | ||
.map(function (comment) { return comment.end - comment.pos; }) | ||
.reduce(function (l, r) { return l + r; }, 0); | ||
} | ||
@@ -118,9 +119,17 @@ var Rule = (function (_super) { | ||
if (this.hasOption(OPTION_ALWAYS)) { | ||
if (!isSpaceBetweenTokens(firstToken, secondToken)) { | ||
var deleteFix = this.getDeleteFixForSpaceBetweenTokens(firstToken, secondToken); | ||
if (deleteFix === undefined) { | ||
var fix = new Lint.Fix(Rule.metadata.ruleName, [ | ||
this.appendText(secondToken.getFullStart(), " "), | ||
]); | ||
var failureString = Rule.FAILURE_NO_BEGINNING_SPACE(firstToken.getText()); | ||
this.addFailure(this.createFailure(nodeStart, 1, failureString)); | ||
this.addFailure(this.createFailure(nodeStart, 1, failureString, fix)); | ||
} | ||
if (!isSpaceBetweenTokens(secondToLastToken, lastToken)) { | ||
deleteFix = this.getDeleteFixForSpaceBetweenTokens(secondToLastToken, lastToken); | ||
if (deleteFix === undefined) { | ||
var fix = new Lint.Fix(Rule.metadata.ruleName, [ | ||
this.appendText(lastToken.getStart(), " "), | ||
]); | ||
var failureString = Rule.FAILURE_NO_ENDING_SPACE(lastToken.getText()); | ||
this.addFailure(this.createFailure(nodeStart + nodeWidth - 1, 1, failureString)); | ||
this.addFailure(this.createFailure(nodeStart + nodeWidth - 1, 1, failureString, fix)); | ||
} | ||
@@ -132,11 +141,18 @@ } | ||
if (!isExpressionMultiline(firstAndSecondTokensCombinedText)) { | ||
if (isSpaceBetweenTokens(firstToken, secondToken)) { | ||
var fix = this.getDeleteFixForSpaceBetweenTokens(firstToken, secondToken); | ||
if (fix !== undefined) { | ||
var failureString = Rule.FAILURE_FORBIDDEN_SPACES_BEGINNING(firstToken.getText()); | ||
this.addFailure(this.createFailure(nodeStart, 1, failureString)); | ||
this.addFailure(this.createFailure(nodeStart, 1, failureString, fix)); | ||
} | ||
} | ||
if (!isExpressionMultiline(lastAndSecondToLastCombinedText)) { | ||
if (isSpaceBetweenTokens(secondToLastToken, lastToken)) { | ||
var fix = this.getDeleteFixForSpaceBetweenTokens(secondToLastToken, lastToken); | ||
if (fix !== undefined) { | ||
var failureString = Rule.FAILURE_FORBIDDEN_SPACES_END(lastToken.getText()); | ||
this.addFailure(this.createFailure(nodeStart + nodeWidth - 1, 1, failureString)); | ||
// degenerate case when firstToken is the same as the secondToLastToken as we would | ||
// have already queued up a fix in the previous branch, do not apply fix | ||
var failure = firstToken === secondToLastToken ? | ||
this.createFailure(nodeStart + nodeWidth - 1, 1, failureString) : | ||
this.createFailure(nodeStart + nodeWidth - 1, 1, failureString, fix); | ||
this.addFailure(failure); | ||
} | ||
@@ -146,4 +162,28 @@ } | ||
}; | ||
JsxCurlySpacingWalker.prototype.getDeleteFixForSpaceBetweenTokens = function (firstNode, secondNode) { | ||
if (firstNode.parent !== secondNode.parent) { | ||
throw Error("Expected identical parents for both nodes"); | ||
} | ||
var parent = firstNode.parent; | ||
var parentStart = parent.getStart(); | ||
var secondNodeStart = secondNode.getFullStart(); | ||
var firstNodeEnd = firstNode.getStart() + firstNode.getWidth(); | ||
var secondNodeRelativeStart = secondNodeStart - parentStart; | ||
var firstNodeRelativeEnd = firstNodeEnd - parentStart; | ||
var parentText = parent.getText(); | ||
var trailingComments = ts.getTrailingCommentRanges(parentText, firstNodeRelativeEnd) || []; | ||
var leadingComments = ts.getLeadingCommentRanges(parentText, secondNodeRelativeStart) || []; | ||
var comments = trailingComments.concat(leadingComments); | ||
if (secondNode.getStart() - firstNode.getStart() - firstNode.getWidth() > getTotalCharCount(comments)) { | ||
var replacements = comments.map(function (comment) { return parentText.slice(comment.pos, comment.end); }).join(""); | ||
return new Lint.Fix(Rule.metadata.ruleName, [ | ||
this.createReplacement(secondNodeStart, secondNode.getStart() - secondNodeStart, replacements), | ||
]); | ||
} | ||
else { | ||
return undefined; | ||
} | ||
}; | ||
return JsxCurlySpacingWalker; | ||
}(Lint.RuleWalker)); | ||
var _a; |
42421
866
96