eslint-plugin-crisp 1.0.65 → 1.0.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-crisp",
3
- "version": "1.0.65",
3
+ "version": "1.0.67",
4
4
  "description": "Custom ESLint Rules for Crisp",
5
5
  "author": "Crisp IM SAS",
6
6
  "main": "index.js",
@@ -144,6 +144,7 @@ module.exports = {
144
144
  "crisp/methods-naming": "error",
145
145
  "crisp/methods-ordering": "error",
146
146
  "crisp/multiline-comment-end-backslash": "error",
147
+ "crisp/newline-after-switch-case": "error",
147
148
  "crisp/no-async": "error",
148
149
  "crisp/no-var-in-blocks": "error",
149
150
  "crisp/no-useless-template-literals": "error",
package/recommended.js CHANGED
@@ -148,6 +148,7 @@ module.exports = {
148
148
  "crisp/methods-naming": "error",
149
149
  "crisp/methods-ordering": "error",
150
150
  "crisp/multiline-comment-end-backslash": "error",
151
+ "crisp/newline-after-switch-case": "error",
151
152
  "crisp/no-async": "error",
152
153
  "crisp/no-var-in-blocks": "error",
153
154
  "crisp/no-space-in-optional-arguments": "error",
@@ -141,6 +141,7 @@ module.exports = {
141
141
  context.report({
142
142
  node: jsdocComment,
143
143
  message: 'JSDoc alignment issue',
144
+
144
145
  fix(fixer) {
145
146
  return fixer.replaceText(jsdocComment, formattedJSDoc);
146
147
  },
@@ -0,0 +1,94 @@
1
+ function getTokensWithNewlineBetween(sourceCode, startNode, endNode) {
2
+ const endLine = endNode.loc.start.line;
3
+
4
+ let next = startNode;
5
+ let previous = startNode;
6
+
7
+ do {
8
+ previous = next;
9
+ next = sourceCode.getTokenOrCommentAfter(next);
10
+
11
+ if (next.loc.start.line > previous.loc.end.line + 1) {
12
+ return [previous, next];
13
+ }
14
+ } while (next.loc.start.line < endLine);
15
+
16
+ return null;
17
+ }
18
+
19
+ module.exports = {
20
+ meta: {
21
+ fixable: "whitespace",
22
+ schema: [] // no options
23
+ },
24
+
25
+ create: function newlineBetweenSwitchCase(context) {
26
+ let currentCodePath = null;
27
+ const sourceCode = context.getSourceCode();
28
+
29
+ return {
30
+ onCodePathStart(codePath) {
31
+ currentCodePath = codePath;
32
+ },
33
+
34
+ onCodePathEnd() {
35
+ currentCodePath = currentCodePath.upper;
36
+ },
37
+
38
+ "SwitchCase:exit": (node) => {
39
+ let lastNode = node.parent.cases[node.parent.cases.length - 1]
40
+
41
+ // Last case?
42
+ if (lastNode === node) {
43
+ // Ignore it
44
+ return;
45
+ }
46
+
47
+ let isFallthrough = false;
48
+
49
+ if (
50
+ node.consequent.length === 0 ||
51
+ currentCodePath.currentSegments.some((segment) => {
52
+ return segment.reachable;
53
+ })
54
+ ) {
55
+ isFallthrough = true;
56
+ }
57
+
58
+ const nextToken = sourceCode.getTokenAfter(node);
59
+
60
+ const tokensWithBlankLinesBetween = getTokensWithNewlineBetween(
61
+ sourceCode,
62
+ node,
63
+ nextToken
64
+ );
65
+ const hasBlankLinesBetween = Boolean(tokensWithBlankLinesBetween);
66
+ const isNewlineRequired = isFallthrough ? false : true;
67
+
68
+ if (hasBlankLinesBetween && !isNewlineRequired) {
69
+ context.report({
70
+ node,
71
+ message: "Extraneous newlines between switch cases.",
72
+
73
+ fix(fixer) {
74
+ const [previous, next] = tokensWithBlankLinesBetween;
75
+ return fixer.replaceTextRange(
76
+ [previous.range[1], next.range[0] - next.loc.start.column],
77
+ "\n"
78
+ );
79
+ }
80
+ });
81
+ } else if (!hasBlankLinesBetween && isNewlineRequired) {
82
+ context.report({
83
+ node,
84
+ message: "Newline required between switch cases.",
85
+
86
+ fix(fixer) {
87
+ return fixer.insertTextAfter(node, "\n");
88
+ }
89
+ });
90
+ }
91
+ },
92
+ };
93
+ },
94
+ };
@@ -32,6 +32,7 @@ module.exports = {
32
32
  context.report({
33
33
  node: operatorToken,
34
34
  message: `There should be at least one space before and exactly one space after '${operatorName}'`,
35
+
35
36
  fix(fixer) {
36
37
  return fixer.replaceTextRange(
37
38
  [sourceCode.getTokenBefore(operatorToken).range[1], sourceCode.getTokenAfter(operatorToken).range[0]],
@@ -21,6 +21,7 @@ module.exports = {
21
21
  context.report({
22
22
  node,
23
23
  message: "The condition in ternary expressions with an operator should be wrapped in parentheses",
24
+
24
25
  fix(fixer) {
25
26
  const conditionText = sourceCode.getText(node.test);
26
27
  return [
@@ -27,6 +27,7 @@ module.exports = {
27
27
  context.report({
28
28
  node: nextProperty,
29
29
  message: "Computed properties should be in alphabetical order.",
30
+
30
31
  fix(fixer) {
31
32
  const sourceCode = context.getSourceCode();
32
33
  const propertyText = sourceCode.getText(property);
@@ -21,6 +21,7 @@ module.exports = {
21
21
  context.report({
22
22
  node: nextElement,
23
23
  message: "Emits should be in alphabetical order.",
24
+
24
25
  fix(fixer) {
25
26
  const sourceCode = context.getSourceCode();
26
27
  const elementText = sourceCode.getText(element);
@@ -31,7 +31,7 @@ module.exports = {
31
31
  // Check each tag individually
32
32
  vueTags.forEach((tag, index) => {
33
33
  const tagRegExp = new RegExp(`<${tag}`);
34
- const headerRegExp = new RegExp(`<!--\\s*\\*{70,73}\\s*\\n\\s*${headers[index]}\\s*\\n\\s*\\*{70,73}\\s*-->\\s*\\n\\s*<${tag}`);
34
+ const headerRegExp = new RegExp(`\\n\\n<!--\\s*\\*{70,73}\\s*\\n\\s{5}${headers[index]}\\s*\\n\\s*\\*{70,73}\\s*-->\\s*\\n\\n<${tag}`);
35
35
 
36
36
  // If the tag exists without the corresponding header, report an error
37
37
  if (tagRegExp.test(fileContent) && !headerRegExp.test(fileContent)) {
@@ -21,6 +21,7 @@ module.exports = {
21
21
  context.report({
22
22
  node: nextProperty,
23
23
  message: "Props should be in alphabetical order.",
24
+
24
25
  fix(fixer) {
25
26
  const sourceCode = context.getSourceCode();
26
27
  const propertyText = sourceCode.getText(property);