/
reporter.js
84 lines (75 loc) · 2.28 KB
/
reporter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import {
spacingFixers,
} from '../../utilities';
const hasLineBreak = (direction, colon, context) => {
const sourceCode = context.getSourceCode();
if (direction === 'before') {
return colon.loc.start.line !== sourceCode.getTokenBefore(colon).loc.end.line;
} else {
return sourceCode.getTokenAfter(colon).loc.start.line !== colon.loc.end.line;
}
};
const getSpaces = (direction, colon, context) => {
const sourceCode = context.getSourceCode();
if (direction === 'before') {
return colon.range[0] - sourceCode.getTokenBefore(colon).range[1];
} else {
return sourceCode.getTokenAfter(colon).range[0] - colon.range[1];
}
};
export default (direction, context, {always, allowLineBreak}) => {
return ({colon, node, name = '', type = 'type annotation'}) => {
let lineBreak;
let spaces;
// Support optional names
// type X = { [string]: a }
// type X = string => string
if (!colon || colon.value !== ':') {
return;
}
const data = {
direction,
name,
type,
};
if (hasLineBreak(direction, colon, context)) {
if (allowLineBreak) {
spaces = 1;
} else {
lineBreak = true;
spaces = getSpaces(direction, colon, context);
}
} else {
spaces = getSpaces(direction, colon, context);
}
if (always && lineBreak) {
context.report({
data,
fix: spacingFixers.replaceWithSpace(direction, colon, spaces),
message: 'There must not be a line break {{direction}} {{name}}{{type}} colon.',
node,
});
} else if (always && spaces > 1) {
context.report({
data,
fix: spacingFixers.stripSpaces(direction, colon, spaces - 1),
message: 'There must be 1 space {{direction}} {{name}}{{type}} colon.',
node,
});
} else if (always && spaces === 0) {
context.report({
data,
fix: spacingFixers.addSpace(direction, colon),
message: 'There must be a space {{direction}} {{name}}{{type}} colon.',
node,
});
} else if (!always && spaces > 0) {
context.report({
data,
fix: spacingFixers.stripSpaces(direction, colon, spaces),
message: 'There must be no space {{direction}} {{name}}{{type}} colon.',
node,
});
}
};
};