Skip to content

Commit 586441d

Browse files
author
David Lipowicz
committed
Added new rule: jsx-prop-sorting-rule
Fixes #8
1 parent 74cb863 commit 586441d

File tree

3 files changed

+83
-0
lines changed

3 files changed

+83
-0
lines changed

src/rules/jsxPropSortingRule.ts

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* @license
3+
* Copyright 2016 Palantir Technologies, Inc.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
import * as ts from "typescript";
19+
import * as Lint from "tslint/lib/lint";
20+
21+
export class Rule extends Lint.Rules.AbstractRule {
22+
public static FAILURE_STRING = "Prop names are not alphabetized";
23+
24+
public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
25+
const walker = new JsxPropSortingWalker(sourceFile, this.getOptions());
26+
return this.applyWithWalker(walker);
27+
}
28+
}
29+
30+
class JsxPropSortingWalker extends Lint.RuleWalker {
31+
protected visitInterfaceDeclaration(node: ts.InterfaceDeclaration) {
32+
let prevChildName = "";
33+
let currChildName = "";
34+
ts.forEachChild(node, child => {
35+
if (child.kind === ts.SyntaxKind.PropertySignature) {
36+
currChildName = child.getText();
37+
if (currChildName.localeCompare(prevChildName) > 0) {
38+
prevChildName = currChildName;
39+
} else {
40+
this.addFailure(this.createFailure(child.getStart(), child.getWidth(), Rule.FAILURE_STRING));
41+
}
42+
}
43+
});
44+
45+
super.visitInterfaceDeclaration(node);
46+
}
47+
}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
export interface Props {
2+
/**
3+
* With comment.
4+
*/
5+
aProp?: boolean;
6+
7+
/**
8+
* Another comment.
9+
*/
10+
propTwo?: boolean;
11+
}
12+
13+
export interface Props {
14+
aProp?: boolean;
15+
propTwo: boolean;
16+
thirdProp?: string;
17+
}
18+
19+
export interface Props {
20+
propTwo?: boolean;
21+
aProp?: boolean;
22+
~~~~~~~~~~~~~~~~ [Prop names are not alphabetized]
23+
}
24+
25+
export interface Props {
26+
propTwo?: boolean;
27+
tProp: string;
28+
aProp?: boolean;
29+
~~~~~~~~~~~~~~~~ [Prop names are not alphabetized]
30+
zProp: number;
31+
}
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"rules": {
3+
"jsx-prop-sorting": true
4+
}
5+
}

0 commit comments

Comments
 (0)