eslint-plugin-crisp 1.5.12 → 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 (89) 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 +16 -7
  5. package/recommended-ts.js +1 -1
  6. package/recommended-vue.js +3 -2
  7. package/rules/align-comments.js +6 -3
  8. package/rules/constructor-variables.js +17 -2
  9. package/rules/header-check.js +8 -2
  10. package/rules/header-comments-check.js +14 -3
  11. package/rules/import-group-comment.js +13 -4
  12. package/rules/jsdoc-enforce-access.js +16 -10
  13. package/rules/no-extra-line-within-function.js +8 -5
  14. package/rules/no-short-parameters.js +1 -1
  15. package/rules/no-snake-case.js +0 -24
  16. package/rules/no-space-in-optional-arguments.js +5 -2
  17. package/rules/one-space-after-operator.js +59 -14
  18. package/rules/vue-header-check.js +4 -3
  19. package/rules/vue-no-regex-data.js +1 -2
  20. package/rules/vue-pinia-action-single-parameter.js +158 -0
  21. package/rules/vue-props-declaration-line-break.js +8 -3
  22. package/rules/vue-watch-handler.js +34 -1
  23. package/tests/fixtures/vue-header-check/missing-script-style/TestComponent.vue +19 -0
  24. package/tests/fixtures/vue-header-check/missing-template/TestComponent.vue +3 -0
  25. package/tests/fixtures/vue-header-check/valid/TestComponent.vue +27 -0
  26. package/tests/rule-tester.js +78 -0
  27. package/tests/rules/align-comments.test.js +25 -0
  28. package/tests/rules/align-consecutive-class-assignements.test.js +24 -0
  29. package/tests/rules/align-one-var.test.js +31 -0
  30. package/tests/rules/align-requires.test.js +27 -0
  31. package/tests/rules/arrow-block-newline.test.js +23 -0
  32. package/tests/rules/consecutive-line-comments.test.js +27 -0
  33. package/tests/rules/const.test.js +52 -0
  34. package/tests/rules/constructor-variables.test.js +52 -0
  35. package/tests/rules/enforce-optional.test.js +24 -0
  36. package/tests/rules/header-check.test.js +69 -0
  37. package/tests/rules/header-comments-check.test.js +90 -0
  38. package/tests/rules/import-group-comment.test.js +88 -0
  39. package/tests/rules/import-group-order.test.js +58 -0
  40. package/tests/rules/jsdoc-align-params.test.js +32 -0
  41. package/tests/rules/jsdoc-check-indentation.test.js +45 -0
  42. package/tests/rules/jsdoc-check-optional-params.test.js +40 -0
  43. package/tests/rules/jsdoc-description-length.test.js +60 -0
  44. package/tests/rules/jsdoc-description-multiline.test.js +34 -0
  45. package/tests/rules/jsdoc-enforce-access.test.js +66 -0
  46. package/tests/rules/jsdoc-enforce-classdesc.test.js +39 -0
  47. package/tests/rules/jsdoc-no-param-return.test.js +47 -0
  48. package/tests/rules/jsdoc-require-description-uppercase.test.js +52 -0
  49. package/tests/rules/methods-naming.test.js +70 -0
  50. package/tests/rules/methods-ordering.test.js +75 -0
  51. package/tests/rules/multiline-comment-end-backslash.test.js +52 -0
  52. package/tests/rules/newline-after-switch-case.test.js +75 -0
  53. package/tests/rules/no-async.test.js +57 -0
  54. package/tests/rules/no-extra-line-within-function.test.js +87 -0
  55. package/tests/rules/no-inline-function-in-ternary.test.js +59 -0
  56. package/tests/rules/no-short-parameters.test.js +62 -0
  57. package/tests/rules/no-snake-case.test.js +81 -0
  58. package/tests/rules/no-space-in-optional-arguments.test.js +40 -0
  59. package/tests/rules/no-useless-template-literals.test.js +36 -0
  60. package/tests/rules/no-var-in-blocks.test.js +40 -0
  61. package/tests/rules/one-space-after-operator.test.js +69 -0
  62. package/tests/rules/regex-in-constructor.test.js +40 -0
  63. package/tests/rules/ternary-parenthesis.test.js +34 -0
  64. package/tests/rules/two-lines-between-class-members.test.js +62 -0
  65. package/tests/rules/variable-names.test.js +60 -0
  66. package/tests/rules/vue-attribute-comma.test.js +43 -0
  67. package/tests/rules/vue-attribute-linebreak.test.js +54 -0
  68. package/tests/rules/vue-class-attribute-last.test.js +59 -0
  69. package/tests/rules/vue-class-shorthand-max-len.test.js +67 -0
  70. package/tests/rules/vue-computed-order.test.js +27 -0
  71. package/tests/rules/vue-data-comment.test.js +61 -0
  72. package/tests/rules/vue-define-component.test.js +45 -0
  73. package/tests/rules/vue-emits-order.test.js +27 -0
  74. package/tests/rules/vue-header-check.test.js +49 -0
  75. package/tests/rules/vue-html-indent.test.js +77 -0
  76. package/tests/rules/vue-html-quotes.test.js +71 -0
  77. package/tests/rules/vue-methods-separator.test.js +55 -0
  78. package/tests/rules/vue-name-prop.test.js +59 -0
  79. package/tests/rules/vue-no-component-class-shorthand.test.js +49 -0
  80. package/tests/rules/vue-no-mixed-class.test.js +56 -0
  81. package/tests/rules/vue-no-name-option.test.js +44 -0
  82. package/tests/rules/vue-no-regex-data.test.js +39 -0
  83. package/tests/rules/vue-pinia-action-single-parameter.test.js +234 -0
  84. package/tests/rules/vue-props-declaration-line-break.test.js +68 -0
  85. package/tests/rules/vue-props-declaration-multiline.test.js +40 -0
  86. package/tests/rules/vue-props-declaration-order.test.js +27 -0
  87. package/tests/rules/vue-ref-case.test.js +40 -0
  88. package/tests/rules/vue-watch-handler.test.js +89 -0
  89. package/tests/rules-coverage.test.js +19 -0
@@ -0,0 +1,52 @@
1
+ import rule from "../../rules/jsdoc-require-description-uppercase.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("jsdoc-require-description-uppercase", rule, {
7
+ valid: [
8
+ "/**\n * Starts with an uppercase character.\n */\nfunction example() {}",
9
+ "/**\n * # heading ignored\n * Description below the heading.\n */\nfunction example() {}",
10
+ "/**\n * | column | value |\n * | --- | --- |\n */\nconst table = true;",
11
+ "/**\n * @param {string} value Uppercase parameter description.\n * @returns {boolean} Uppercase return description.\n * @throws {Error} Uppercase error description.\n */\nfunction example(value) { return Boolean(value); }"
12
+ ],
13
+
14
+ invalid: [
15
+ {
16
+ code: "/**\n * lowercase description.\n */\nfunction example() {}",
17
+ output: "/**\n * Lowercase description.\n */\nfunction example() {}",
18
+ errors: [
19
+ {
20
+ message: "Sentences should start with an uppercase character."
21
+ }
22
+ ]
23
+ },
24
+ {
25
+ code: "/**\n * @param {string} value lowercase parameter description.\n */\nfunction example(value) {}",
26
+ output: "/**\n * @param {string} value Lowercase parameter description.\n */\nfunction example(value) {}",
27
+ errors: [
28
+ {
29
+ message: "Sentences should start with an uppercase character."
30
+ }
31
+ ]
32
+ },
33
+ {
34
+ code: "/**\n * @returns {boolean} lowercase return description.\n */\nfunction example() { return true; }",
35
+ output: "/**\n * @returns {boolean} Lowercase return description.\n */\nfunction example() { return true; }",
36
+ errors: [
37
+ {
38
+ message: "Sentences should start with an uppercase character."
39
+ }
40
+ ]
41
+ },
42
+ {
43
+ code: "/**\n * @classdesc lowercase class description.\n */\nclass Example {}",
44
+ output: "/**\n * @classdesc Lowercase class description.\n */\nclass Example {}",
45
+ errors: [
46
+ {
47
+ message: "Sentences should start with an uppercase character."
48
+ }
49
+ ]
50
+ }
51
+ ]
52
+ });
@@ -0,0 +1,70 @@
1
+ import rule from "../../rules/methods-naming.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("methods-naming", 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
+ undocumented() {}
23
+
24
+ /** A method without a visibility tag. */
25
+ documented() {}
26
+ }`
27
+ },
28
+ {
29
+ code: `class Service {
30
+ /** @private */
31
+ ["computed"]() {}
32
+ }`
33
+ }
34
+ ],
35
+
36
+ invalid: [
37
+ {
38
+ code: "class Service {\n /** @public */\n __reset() {}\n}",
39
+ errors: [
40
+ {
41
+ message: "Methods starting with '__' should not be marked with '@public'."
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ code: "class Service {\n /** @public */\n _refresh() {}\n}",
47
+ errors: [
48
+ {
49
+ message: "Methods starting with '_' should not be marked with '@public'."
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ code: "class Service {\n /** @private */\n reset() {}\n}",
55
+ errors: [
56
+ {
57
+ message: "Methods not starting with '__' should not be marked with '@private'."
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ code: "class Service {\n /** @protected */\n refresh() {}\n}",
63
+ errors: [
64
+ {
65
+ message: "Methods not starting with '_' should not be marked with '@protected'."
66
+ }
67
+ ]
68
+ }
69
+ ]
70
+ });
@@ -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
+ });