eslint-plugin-crisp 1.5.13 → 1.6.0

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.
Files changed (88) hide show
  1. package/.github/workflows/build.yml +6 -0
  2. package/README.md +2 -1
  3. package/index.js +2 -0
  4. package/package.json +9 -1
  5. package/recommended-vue.js +1 -0
  6. package/rules/align-comments.js +6 -3
  7. package/rules/constructor-variables.js +17 -2
  8. package/rules/header-check.js +8 -2
  9. package/rules/header-comments-check.js +14 -3
  10. package/rules/import-group-comment.js +13 -4
  11. package/rules/jsdoc-enforce-access.js +16 -10
  12. package/rules/no-extra-line-within-function.js +8 -5
  13. package/rules/no-short-parameters.js +1 -1
  14. package/rules/no-snake-case.js +0 -24
  15. package/rules/no-space-in-optional-arguments.js +5 -2
  16. package/rules/one-space-after-operator.js +59 -14
  17. package/rules/vue-header-check.js +4 -3
  18. package/rules/vue-no-regex-data.js +1 -2
  19. package/rules/vue-pinia-action-single-parameter.js +158 -0
  20. package/rules/vue-props-declaration-line-break.js +8 -3
  21. package/rules/vue-watch-handler.js +34 -1
  22. package/tests/fixtures/vue-header-check/missing-script-style/TestComponent.vue +19 -0
  23. package/tests/fixtures/vue-header-check/missing-template/TestComponent.vue +3 -0
  24. package/tests/fixtures/vue-header-check/valid/TestComponent.vue +27 -0
  25. package/tests/rule-tester.js +78 -0
  26. package/tests/rules/align-comments.test.js +25 -0
  27. package/tests/rules/align-consecutive-class-assignements.test.js +24 -0
  28. package/tests/rules/align-one-var.test.js +31 -0
  29. package/tests/rules/align-requires.test.js +27 -0
  30. package/tests/rules/arrow-block-newline.test.js +23 -0
  31. package/tests/rules/consecutive-line-comments.test.js +27 -0
  32. package/tests/rules/const.test.js +52 -0
  33. package/tests/rules/constructor-variables.test.js +52 -0
  34. package/tests/rules/enforce-optional.test.js +24 -0
  35. package/tests/rules/header-check.test.js +69 -0
  36. package/tests/rules/header-comments-check.test.js +90 -0
  37. package/tests/rules/import-group-comment.test.js +88 -0
  38. package/tests/rules/import-group-order.test.js +58 -0
  39. package/tests/rules/jsdoc-align-params.test.js +32 -0
  40. package/tests/rules/jsdoc-check-indentation.test.js +45 -0
  41. package/tests/rules/jsdoc-check-optional-params.test.js +40 -0
  42. package/tests/rules/jsdoc-description-length.test.js +60 -0
  43. package/tests/rules/jsdoc-description-multiline.test.js +34 -0
  44. package/tests/rules/jsdoc-enforce-access.test.js +66 -0
  45. package/tests/rules/jsdoc-enforce-classdesc.test.js +39 -0
  46. package/tests/rules/jsdoc-no-param-return.test.js +47 -0
  47. package/tests/rules/jsdoc-require-description-uppercase.test.js +52 -0
  48. package/tests/rules/methods-naming.test.js +70 -0
  49. package/tests/rules/methods-ordering.test.js +75 -0
  50. package/tests/rules/multiline-comment-end-backslash.test.js +52 -0
  51. package/tests/rules/newline-after-switch-case.test.js +75 -0
  52. package/tests/rules/no-async.test.js +57 -0
  53. package/tests/rules/no-extra-line-within-function.test.js +87 -0
  54. package/tests/rules/no-inline-function-in-ternary.test.js +59 -0
  55. package/tests/rules/no-short-parameters.test.js +62 -0
  56. package/tests/rules/no-snake-case.test.js +81 -0
  57. package/tests/rules/no-space-in-optional-arguments.test.js +40 -0
  58. package/tests/rules/no-useless-template-literals.test.js +36 -0
  59. package/tests/rules/no-var-in-blocks.test.js +40 -0
  60. package/tests/rules/one-space-after-operator.test.js +69 -0
  61. package/tests/rules/regex-in-constructor.test.js +40 -0
  62. package/tests/rules/ternary-parenthesis.test.js +34 -0
  63. package/tests/rules/two-lines-between-class-members.test.js +62 -0
  64. package/tests/rules/variable-names.test.js +60 -0
  65. package/tests/rules/vue-attribute-comma.test.js +43 -0
  66. package/tests/rules/vue-attribute-linebreak.test.js +54 -0
  67. package/tests/rules/vue-class-attribute-last.test.js +59 -0
  68. package/tests/rules/vue-class-shorthand-max-len.test.js +67 -0
  69. package/tests/rules/vue-computed-order.test.js +27 -0
  70. package/tests/rules/vue-data-comment.test.js +61 -0
  71. package/tests/rules/vue-define-component.test.js +45 -0
  72. package/tests/rules/vue-emits-order.test.js +27 -0
  73. package/tests/rules/vue-header-check.test.js +49 -0
  74. package/tests/rules/vue-html-indent.test.js +77 -0
  75. package/tests/rules/vue-html-quotes.test.js +71 -0
  76. package/tests/rules/vue-methods-separator.test.js +55 -0
  77. package/tests/rules/vue-name-prop.test.js +59 -0
  78. package/tests/rules/vue-no-component-class-shorthand.test.js +49 -0
  79. package/tests/rules/vue-no-mixed-class.test.js +56 -0
  80. package/tests/rules/vue-no-name-option.test.js +44 -0
  81. package/tests/rules/vue-no-regex-data.test.js +39 -0
  82. package/tests/rules/vue-pinia-action-single-parameter.test.js +234 -0
  83. package/tests/rules/vue-props-declaration-line-break.test.js +68 -0
  84. package/tests/rules/vue-props-declaration-multiline.test.js +40 -0
  85. package/tests/rules/vue-props-declaration-order.test.js +27 -0
  86. package/tests/rules/vue-ref-case.test.js +40 -0
  87. package/tests/rules/vue-watch-handler.test.js +89 -0
  88. package/tests/rules-coverage.test.js +19 -0
@@ -0,0 +1,75 @@
1
+ import rule from "../../rules/methods-ordering.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("methods-ordering", rule, {
7
+ valid: [
8
+ {
9
+ code: `class Service {
10
+ /** @public */
11
+ start() {}
12
+
13
+ /** @protected */
14
+ _refresh() {}
15
+
16
+ /** @private */
17
+ __reset() {}
18
+ }`
19
+ },
20
+ {
21
+ code: `class Service {
22
+ /** @private */
23
+ __first() {}
24
+
25
+ // --> NEXT SECTION <--
26
+ /** @public */
27
+ second() {}
28
+ }`
29
+ },
30
+ {
31
+ code: `class Service {
32
+ /** @private */
33
+ __before() {}
34
+
35
+ constructor() {}
36
+
37
+ /** @public */
38
+ after() {}
39
+
40
+ undocumented() {}
41
+ }`
42
+ }
43
+ ],
44
+
45
+ invalid: [
46
+ {
47
+ code: `class Service {
48
+ /** @protected */
49
+ _refresh() {}
50
+
51
+ /** @public */
52
+ start() {}
53
+ }`,
54
+ errors: [
55
+ {
56
+ message: "Public methods should be defined before protected or private methods."
57
+ }
58
+ ]
59
+ },
60
+ {
61
+ code: `class Service {
62
+ /** @private */
63
+ __reset() {}
64
+
65
+ /** @protected */
66
+ _refresh() {}
67
+ }`,
68
+ errors: [
69
+ {
70
+ message: "Protected methods should be defined before private methods."
71
+ }
72
+ ]
73
+ }
74
+ ]
75
+ });
@@ -0,0 +1,52 @@
1
+ import rule from "../../rules/multiline-comment-end-backslash.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+ const message = "Multiline comments should end with a backslash '\\', unless they are JSDoc comments.";
6
+
7
+ ruleTester.run("multiline-comment-end-backslash", rule, {
8
+ valid: [
9
+ {
10
+ code: "// A standalone comment\nconst value = 1;"
11
+ },
12
+ {
13
+ code: "// First line \\\n// continuation\nconst value = 1;"
14
+ },
15
+ {
16
+ code: "/**\n * JSDoc is exempt.\n */\nfunction run() {}"
17
+ },
18
+ {
19
+ code: "/* First line\n * continuation \\*/\nconst value = 1;"
20
+ }
21
+ ],
22
+
23
+ invalid: [
24
+ {
25
+ code: "// First line\n// continuation\nconst value = 1;",
26
+ errors: [
27
+ {
28
+ message
29
+ }
30
+ ]
31
+ },
32
+ {
33
+ code: "/* First line\n * continuation */\nconst value = 1;",
34
+ errors: [
35
+ {
36
+ message
37
+ }
38
+ ]
39
+ },
40
+ {
41
+ code: "// First\n// continuation\n// Second\n// continuation",
42
+ errors: [
43
+ {
44
+ message
45
+ },
46
+ {
47
+ message
48
+ }
49
+ ]
50
+ }
51
+ ]
52
+ });
@@ -0,0 +1,75 @@
1
+ import rule from "../../rules/newline-after-switch-case.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("newline-after-switch-case", rule, {
7
+ valid: [
8
+ {
9
+ code: `switch (value) {
10
+ case 1:
11
+ run();
12
+ break;
13
+
14
+ case 2:
15
+ stop();
16
+ }`
17
+ },
18
+ {
19
+ code: `switch (value) {
20
+ case 1:
21
+ case 2:
22
+ run();
23
+ }`
24
+ },
25
+ {
26
+ code: `switch (value) {
27
+ default:
28
+ run();
29
+ }`
30
+ }
31
+ ],
32
+
33
+ invalid: [
34
+ {
35
+ code: `switch (value) {
36
+ case 1:
37
+ run();
38
+ break;
39
+ case 2:
40
+ stop();
41
+ }`,
42
+ output: `switch (value) {
43
+ case 1:
44
+ run();
45
+ break;
46
+
47
+ case 2:
48
+ stop();
49
+ }`,
50
+ errors: [
51
+ {
52
+ message: "Newline required between switch cases."
53
+ }
54
+ ]
55
+ },
56
+ {
57
+ code: `switch (value) {
58
+ case 1:
59
+
60
+ case 2:
61
+ run();
62
+ }`,
63
+ output: `switch (value) {
64
+ case 1:
65
+ case 2:
66
+ run();
67
+ }`,
68
+ errors: [
69
+ {
70
+ message: "Extraneous newlines between switch cases."
71
+ }
72
+ ]
73
+ }
74
+ ]
75
+ });
@@ -0,0 +1,57 @@
1
+ import rule from "../../rules/no-async.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+ const message = "async/await is not allowed, use Promises instead.";
6
+
7
+ ruleTester.run("no-async", rule, {
8
+ valid: [
9
+ {
10
+ code: "function load() { return Promise.resolve(); }"
11
+ },
12
+ {
13
+ code: "const load = () => Promise.resolve();"
14
+ },
15
+ {
16
+ code: "class Service { load() { return Promise.resolve(); } }"
17
+ }
18
+ ],
19
+
20
+ invalid: [
21
+ {
22
+ code: "async function load() {}",
23
+ errors: [
24
+ {
25
+ message
26
+ }
27
+ ]
28
+ },
29
+ {
30
+ code: "const load = async () => {};",
31
+ errors: [
32
+ {
33
+ message
34
+ }
35
+ ]
36
+ },
37
+ {
38
+ code: "const load = async function() {};",
39
+ errors: [
40
+ {
41
+ message
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ code: "class Service { async load() {} }",
47
+ errors: [
48
+ {
49
+ message
50
+ },
51
+ {
52
+ message
53
+ }
54
+ ]
55
+ }
56
+ ]
57
+ });
@@ -0,0 +1,87 @@
1
+ import rule from "../../rules/no-extra-line-within-function.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+ const message = "Expected at most one line break between declarations within a function.";
6
+
7
+ ruleTester.run("no-extra-line-within-function", rule, {
8
+ valid: [
9
+ {
10
+ code: `function run() {
11
+ const first = 1;
12
+
13
+ const second = 2;
14
+ }`
15
+ },
16
+ {
17
+ code: `const run = function() {
18
+ first();
19
+ second();
20
+ };`
21
+ },
22
+ {
23
+ code: "const run = () => value;"
24
+ },
25
+ {
26
+ code: "const first = 1;\n\n\nconst second = 2;"
27
+ }
28
+ ],
29
+
30
+ invalid: [
31
+ {
32
+ code: `function run() {
33
+ const first = 1;
34
+
35
+
36
+ const second = 2;
37
+ }`,
38
+ output: `function run() {
39
+ const first = 1;
40
+
41
+ const second = 2;
42
+ }`,
43
+ errors: [
44
+ {
45
+ message
46
+ }
47
+ ]
48
+ },
49
+ {
50
+ code: `const run = function() {
51
+ first();
52
+
53
+
54
+ second();
55
+ };`,
56
+ output: `const run = function() {
57
+ first();
58
+
59
+ second();
60
+ };`,
61
+ errors: [
62
+ {
63
+ message
64
+ }
65
+ ]
66
+ },
67
+ {
68
+ code: `const run = () => {
69
+ first();
70
+
71
+
72
+
73
+ second();
74
+ };`,
75
+ output: `const run = () => {
76
+ first();
77
+
78
+ second();
79
+ };`,
80
+ errors: [
81
+ {
82
+ message
83
+ }
84
+ ]
85
+ }
86
+ ]
87
+ });
@@ -0,0 +1,59 @@
1
+ import rule from "../../rules/no-inline-function-in-ternary.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("no-inline-function-in-ternary", rule, {
7
+ valid: [
8
+ {
9
+ code: "const callback = enabled ? onEnabled : onDisabled;"
10
+ },
11
+ {
12
+ code: "const result = predicate(() => true) ? yes : no;"
13
+ },
14
+ {
15
+ code: "const callback = () => enabled ? yes : no;"
16
+ },
17
+ {
18
+ code: "items.map((item) => item.value);"
19
+ }
20
+ ],
21
+
22
+ invalid: [
23
+ {
24
+ code: "const callback = enabled ? () => run() : fallback;",
25
+ errors: [
26
+ {
27
+ messageId: "inlineFunction"
28
+ }
29
+ ]
30
+ },
31
+ {
32
+ code: "const callback = enabled ? fallback : function() { run(); };",
33
+ errors: [
34
+ {
35
+ messageId: "inlineFunction"
36
+ }
37
+ ]
38
+ },
39
+ {
40
+ code: "const callback = enabled ? wrap(() => run()) : fallback;",
41
+ errors: [
42
+ {
43
+ messageId: "inlineFunction"
44
+ }
45
+ ]
46
+ },
47
+ {
48
+ code: "const callback = enabled ? () => run() : function() { stop(); };",
49
+ errors: [
50
+ {
51
+ messageId: "inlineFunction"
52
+ },
53
+ {
54
+ messageId: "inlineFunction"
55
+ }
56
+ ]
57
+ }
58
+ ]
59
+ });
@@ -0,0 +1,62 @@
1
+ import rule from "../../rules/no-short-parameters.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("no-short-parameters", rule, {
7
+ valid: [
8
+ "function map(value, index) {}",
9
+ "const map = ({ x }, [y]) => x + y;",
10
+ {
11
+ code: "const map = (x, i) => x + i;",
12
+ options: [
13
+ {
14
+ exceptions: ["x", "i"]
15
+ }
16
+ ]
17
+ }
18
+ ],
19
+
20
+ invalid: [
21
+ {
22
+ code: "function map(x) {}",
23
+ errors: [
24
+ {
25
+ message: "Parameter name 'x' is too short."
26
+ }
27
+ ]
28
+ },
29
+ {
30
+ code: "const map = function(a, value) {};",
31
+ errors: [
32
+ {
33
+ message: "Parameter name 'a' is too short."
34
+ }
35
+ ]
36
+ },
37
+ {
38
+ code: "class Mapper { map(x, y) {} }",
39
+ errors: [
40
+ {
41
+ message: "Parameter name 'x' is too short."
42
+ },
43
+ {
44
+ message: "Parameter name 'y' is too short."
45
+ }
46
+ ]
47
+ },
48
+ {
49
+ code: "const map = (x, y) => x + y;",
50
+ options: [
51
+ {
52
+ exceptions: ["x"]
53
+ }
54
+ ],
55
+ errors: [
56
+ {
57
+ message: "Parameter name 'y' is too short."
58
+ }
59
+ ]
60
+ }
61
+ ]
62
+ });
@@ -0,0 +1,81 @@
1
+ import rule from "../../rules/no-snake-case.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("no-snake-case", rule, {
7
+ valid: [
8
+ "const MAX_RETRIES = 3;",
9
+ "const _MAX_RETRIES = 3;",
10
+ "let camelCase = 1;",
11
+ "function doWork(inputValue) {}",
12
+ "const object = { doWork(inputValue) {} };"
13
+ ],
14
+
15
+ invalid: [
16
+ {
17
+ code: "let retry_count = 1;",
18
+ errors: [
19
+ {
20
+ message: "Variable 'retry_count' should not use snake_case. Use camelCase instead."
21
+ }
22
+ ]
23
+ },
24
+ {
25
+ code: "const retry_count = 1;",
26
+ errors: [
27
+ {
28
+ message: "Variable 'retry_count' should not use snake_case. Use camelCase instead."
29
+ }
30
+ ]
31
+ },
32
+ {
33
+ code: "function do_work(inputValue) {}",
34
+ errors: [
35
+ {
36
+ message: "Function 'do_work' should not use snake_case. Use camelCase instead."
37
+ }
38
+ ]
39
+ },
40
+ {
41
+ code: "const callback = (input_value) => input_value;",
42
+ errors: [
43
+ {
44
+ message: "Parameter 'input_value' should not use snake_case. Use camelCase instead."
45
+ }
46
+ ]
47
+ },
48
+ {
49
+ code: "class Worker { do_work(inputValue) {} }",
50
+ errors: [
51
+ {
52
+ message: "Method 'do_work' should not use snake_case. Use camelCase instead."
53
+ }
54
+ ]
55
+ },
56
+ {
57
+ code: "const worker = { do_work(inputValue) {} };",
58
+ errors: [
59
+ {
60
+ message: "Method 'do_work' should not use snake_case. Use camelCase instead."
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ code: "class Worker { run(input_value) {} }",
66
+ errors: [
67
+ {
68
+ message: "Parameter 'input_value' should not use snake_case. Use camelCase instead."
69
+ }
70
+ ]
71
+ },
72
+ {
73
+ code: "const worker = { run(input_value) {} };",
74
+ errors: [
75
+ {
76
+ message: "Parameter 'input_value' should not use snake_case. Use camelCase instead."
77
+ }
78
+ ]
79
+ }
80
+ ]
81
+ });
@@ -0,0 +1,40 @@
1
+ import rule from "../../rules/no-space-in-optional-arguments.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("no-space-in-optional-arguments", rule, {
7
+ valid: [
8
+ "function greet(name=\"World\") {}",
9
+ "const greet = (name=\"World\") => name;",
10
+ "const object = { greet(name=\"World\") {} };",
11
+ "function required(name) {}"
12
+ ],
13
+
14
+ invalid: [
15
+ {
16
+ code: "function greet(name =\"World\") {}",
17
+ errors: [
18
+ {
19
+ message: "There should be no space before or after = in optional parameters"
20
+ }
21
+ ]
22
+ },
23
+ {
24
+ code: "const greet = (name= \"World\") => name;",
25
+ errors: [
26
+ {
27
+ message: "There should be no space before or after = in optional parameters"
28
+ }
29
+ ]
30
+ },
31
+ {
32
+ code: "class Greeter { greet(name = \"World\") {} }",
33
+ errors: [
34
+ {
35
+ message: "There should be no space before or after = in optional parameters"
36
+ }
37
+ ]
38
+ }
39
+ ]
40
+ });
@@ -0,0 +1,36 @@
1
+ import rule from "../../rules/no-useless-template-literals.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("no-useless-template-literals", rule, {
7
+ valid: [
8
+ "const greeting = `Hello, ${name}`;",
9
+ "const greeting = `Hello, ` + name;",
10
+ "const greeting = name + `!`;",
11
+ "const greeting = \"Hello\";"
12
+ ],
13
+
14
+ invalid: [
15
+ {
16
+ code: "const greeting = `Hello`;",
17
+ errors: [
18
+ {
19
+ message: "Unnecessary use of template literals. Use regular strings instead."
20
+ }
21
+ ]
22
+ },
23
+ {
24
+ code: "call(`plain text`);",
25
+ errors: [
26
+ {
27
+ message: "Unnecessary use of template literals. Use regular strings instead."
28
+ }
29
+ ]
30
+ },
31
+ {
32
+ code: "const values = [`first`, `second`];",
33
+ errors: 2
34
+ }
35
+ ]
36
+ });
@@ -0,0 +1,40 @@
1
+ import rule from "../../rules/no-var-in-blocks.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("no-var-in-blocks", rule, {
7
+ valid: [
8
+ "var topLevel = 1;",
9
+ "function load() { var dependency = require(\"dependency\"); }",
10
+ "const load = () => { var member = require(\"dependency\").member; };",
11
+ "function calculate() { let result = 1; const other = 2; }"
12
+ ],
13
+
14
+ invalid: [
15
+ {
16
+ code: "function calculate() { var result = 1; }",
17
+ errors: [
18
+ {
19
+ message: "Unexpected 'var' declaration inside function, method, or class block."
20
+ }
21
+ ]
22
+ },
23
+ {
24
+ code: "const calculate = function() { var result; };",
25
+ errors: [
26
+ {
27
+ message: "Unexpected 'var' declaration inside function, method, or class block."
28
+ }
29
+ ]
30
+ },
31
+ {
32
+ code: "class Calculator { calculate() { var result = 1; } }",
33
+ errors: [
34
+ {
35
+ message: "Unexpected 'var' declaration inside function, method, or class block."
36
+ }
37
+ ]
38
+ }
39
+ ]
40
+ });