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,49 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ import rule from "../../rules/vue-header-check.js";
6
+ import { createVueRuleTester } from "../rule-tester.js";
7
+
8
+ const ruleTester = createVueRuleTester();
9
+ const fixturesDirectory = path.resolve(
10
+ path.dirname(fileURLToPath(import.meta.url)),
11
+ "../fixtures/vue-header-check"
12
+ );
13
+
14
+ function fixture(directory) {
15
+ const filename = path.join(fixturesDirectory, directory, "TestComponent.vue");
16
+
17
+ return {
18
+ filename,
19
+ code: fs.readFileSync(filename, "utf8")
20
+ };
21
+ }
22
+
23
+ ruleTester.run("vue-header-check", rule, {
24
+ valid: [
25
+ fixture("valid")
26
+ ],
27
+
28
+ invalid: [
29
+ {
30
+ ...fixture("missing-template"),
31
+ errors: [
32
+ {
33
+ message: "The '<template>' section must be preceded by the 'TEMPLATE' header comment."
34
+ }
35
+ ]
36
+ },
37
+ {
38
+ ...fixture("missing-script-style"),
39
+ errors: [
40
+ {
41
+ message: "The '<script>' section must be preceded by the 'SCRIPT' header comment."
42
+ },
43
+ {
44
+ message: "The '<style>' section must be preceded by the 'STYLE' header comment."
45
+ }
46
+ ]
47
+ }
48
+ ]
49
+ });
@@ -0,0 +1,77 @@
1
+ import rule from "../../rules/vue-html-indent.js";
2
+ import { createVueRuleTester } from "../rule-tester.js";
3
+
4
+ const ruleTester = createVueRuleTester();
5
+ const filename = "TestComponent.vue";
6
+
7
+ ruleTester.run("vue-html-indent", rule, {
8
+ valid: [
9
+ {
10
+ filename,
11
+ code: `<template>
12
+ <button
13
+ type="button"
14
+ >
15
+ Save
16
+ </button>
17
+ </template>`
18
+ },
19
+ {
20
+ filename,
21
+ code: `<template>
22
+ <span>Ready</span>
23
+ </template>`
24
+ }
25
+ ],
26
+
27
+ invalid: [
28
+ {
29
+ filename,
30
+ code: `<template>
31
+ <button
32
+ type="button"
33
+ >
34
+ Save
35
+ </button>
36
+ </template>`,
37
+ output: `<template>
38
+ <button
39
+ type="button"
40
+ >
41
+ Save
42
+ </button>
43
+ </template>`,
44
+ errors: [
45
+ {
46
+ message: "Expected attribute indentation of 4 spaces but found 6"
47
+ }
48
+ ]
49
+ },
50
+ {
51
+ filename,
52
+ code: `<template>
53
+ <span>Ready</span>
54
+ </template>`,
55
+ errors: [
56
+ {
57
+ message: "Expected element indentation of 2 or 4 spaces but found 3"
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ filename,
63
+ code: `<template>
64
+ <button
65
+ type="button"
66
+ >
67
+ Save
68
+ </button>
69
+ </template>`,
70
+ errors: [
71
+ {
72
+ message: "Expected closing tag indentation of 2 spaces but found 4"
73
+ }
74
+ ]
75
+ }
76
+ ]
77
+ });
@@ -0,0 +1,71 @@
1
+ import rule from "../../rules/vue-html-quotes.js";
2
+ import { createVueRuleTester } from "../rule-tester.js";
3
+
4
+ const ruleTester = createVueRuleTester();
5
+ const filename = "TestComponent.vue";
6
+
7
+ ruleTester.run("vue-html-quotes", rule, {
8
+ valid: [
9
+ {
10
+ filename,
11
+ code: `<template>
12
+ <button title="Save" :aria-label="label">Save</button>
13
+ </template>
14
+
15
+ <script setup>
16
+ const label = "Save";
17
+ </script>`
18
+ },
19
+ {
20
+ filename,
21
+ options: ["single"],
22
+ code: `<template>
23
+ <button title='Save'>Save</button>
24
+ </template>`
25
+ },
26
+ {
27
+ filename,
28
+ options: [
29
+ "single",
30
+ {
31
+ avoidEscape: true
32
+ }
33
+ ],
34
+ code: `<template>
35
+ <p title="It's ready">Ready</p>
36
+ </template>`
37
+ }
38
+ ],
39
+
40
+ invalid: [
41
+ {
42
+ filename,
43
+ code: `<template>
44
+ <button title='Save'>Save</button>
45
+ </template>`,
46
+ errors: [
47
+ {
48
+ messageId: "expected",
49
+ data: {
50
+ kind: "double quotes"
51
+ }
52
+ }
53
+ ]
54
+ },
55
+ {
56
+ filename,
57
+ options: ["single"],
58
+ code: `<template>
59
+ <button title="Save">Save</button>
60
+ </template>`,
61
+ errors: [
62
+ {
63
+ messageId: "expected",
64
+ data: {
65
+ kind: "single quotes"
66
+ }
67
+ }
68
+ ]
69
+ }
70
+ ]
71
+ });
@@ -0,0 +1,55 @@
1
+ import rule from "../../rules/vue-methods-separator.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("vue-methods-separator", rule, {
7
+ valid: [
8
+ {
9
+ code: "export default { methods: {} };"
10
+ },
11
+ {
12
+ code: `
13
+ export default {
14
+ methods: {
15
+ // --> ACTIONS <--
16
+ save() {}
17
+ }
18
+ };
19
+ `
20
+ }
21
+ ],
22
+
23
+ invalid: [
24
+ {
25
+ code: "export default { methods: { save() {} } };",
26
+ errors: [
27
+ {
28
+ message:
29
+ "Methods block must contain at least one separator comment: " +
30
+ "'// --> ACTIONS <--', '// --> HELPERS <--', " +
31
+ "or '// --> EVENT LISTENERS <--'."
32
+ }
33
+ ]
34
+ },
35
+ {
36
+ code: `
37
+ export default {
38
+ methods: {
39
+ // --> HELPERS <--
40
+ help() {},
41
+ // --> OTHER <--
42
+ run() {}
43
+ }
44
+ };
45
+ `,
46
+ errors: [
47
+ {
48
+ message:
49
+ "Invalid separator comment. Must be '// --> ACTIONS <--', " +
50
+ "'// --> HELPERS <--', or '// --> EVENT LISTENERS <--'."
51
+ }
52
+ ]
53
+ }
54
+ ]
55
+ });
@@ -0,0 +1,59 @@
1
+ import rule from "../../rules/vue-name-prop.js";
2
+ import { createVueRuleTester } from "../rule-tester.js";
3
+
4
+ const ruleTester = createVueRuleTester();
5
+ const filename = "TestComponent.vue";
6
+
7
+ ruleTester.run("vue-name-prop", rule, {
8
+ valid: [
9
+ {
10
+ filename,
11
+ code: `<template>
12
+ <field-input name="user_name" />
13
+ <field-select :name="fieldName" />
14
+ <custom-input name="UserName" />
15
+ </template>
16
+
17
+ <script setup>
18
+ const fieldName = "user_name";
19
+ </script>`
20
+ }
21
+ ],
22
+
23
+ invalid: [
24
+ {
25
+ filename,
26
+ code: `<template>
27
+ <field-input name="UserName" />
28
+ </template>`,
29
+ output: `<template>
30
+ <field-input name="user_name" />
31
+ </template>`,
32
+ errors: [
33
+ {
34
+ messageId: "invalidFormName",
35
+ data: {
36
+ nameValue: "UserName"
37
+ }
38
+ }
39
+ ]
40
+ },
41
+ {
42
+ filename,
43
+ code: `<template>
44
+ <field-select name="billing-address" />
45
+ </template>`,
46
+ output: `<template>
47
+ <field-select name="billing_address" />
48
+ </template>`,
49
+ errors: [
50
+ {
51
+ messageId: "invalidFormName",
52
+ data: {
53
+ nameValue: "billing-address"
54
+ }
55
+ }
56
+ ]
57
+ }
58
+ ]
59
+ });
@@ -0,0 +1,49 @@
1
+ import rule from "../../rules/vue-no-component-class-shorthand.js";
2
+ import { createPugRuleTester } from "../rule-tester.js";
3
+
4
+ const ruleTester = createPugRuleTester();
5
+ const filename = "TestComponent.vue";
6
+
7
+ ruleTester.run("vue-no-component-class-shorthand", rule, {
8
+ valid: [
9
+ {
10
+ filename,
11
+ code: `<template lang="pug">
12
+ div.panel
13
+ UserCard(class="panel")
14
+ user-card(class="panel")
15
+ </template>`
16
+ }
17
+ ],
18
+
19
+ invalid: [
20
+ {
21
+ filename,
22
+ code: `<template lang="pug">
23
+ UserCard.panel
24
+ </template>`,
25
+ errors: [
26
+ {
27
+ messageId: "useClassAttribute",
28
+ data: {
29
+ name: "UserCard"
30
+ }
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ filename,
36
+ code: `<template lang="pug">
37
+ user-card.panel
38
+ </template>`,
39
+ errors: [
40
+ {
41
+ messageId: "useClassAttribute",
42
+ data: {
43
+ name: "user-card"
44
+ }
45
+ }
46
+ ]
47
+ }
48
+ ]
49
+ });
@@ -0,0 +1,56 @@
1
+ import rule from "../../rules/vue-no-mixed-class.js";
2
+ import { createVueRuleTester } from "../rule-tester.js";
3
+
4
+ const ruleTester = createVueRuleTester();
5
+ const filename = "TestComponent.vue";
6
+
7
+ ruleTester.run("vue-no-mixed-class", rule, {
8
+ valid: [
9
+ {
10
+ filename,
11
+ code: `<template>
12
+ <section class="panel">Static</section>
13
+ <section :class="{ active }">Bound</section>
14
+ <section class="panel" :id="sectionId">Other binding</section>
15
+ </template>
16
+
17
+ <script setup>
18
+ const active = true;
19
+ const sectionId = "details";
20
+ </script>`
21
+ }
22
+ ],
23
+
24
+ invalid: [
25
+ {
26
+ filename,
27
+ code: `<template>
28
+ <section class="panel" :class="{ active }">Mixed</section>
29
+ </template>
30
+
31
+ <script setup>
32
+ const active = true;
33
+ </script>`,
34
+ errors: [
35
+ {
36
+ message: "Cannot use both \"class\" and \":class\" on the same element, merge them into \":class\"."
37
+ }
38
+ ]
39
+ },
40
+ {
41
+ filename,
42
+ code: `<template>
43
+ <section class="panel" v-bind:class="classes">Mixed</section>
44
+ </template>
45
+
46
+ <script setup>
47
+ const classes = ["active"];
48
+ </script>`,
49
+ errors: [
50
+ {
51
+ message: "Cannot use both \"class\" and \":class\" on the same element, merge them into \":class\"."
52
+ }
53
+ ]
54
+ }
55
+ ]
56
+ });
@@ -0,0 +1,44 @@
1
+ import rule from "../../rules/vue-no-name-option.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("vue-no-name-option", rule, {
7
+ valid: [
8
+ {
9
+ code: "export default defineComponent({ name: \"Utility\" });",
10
+ filename: "/project/utility.js"
11
+ },
12
+ {
13
+ code: "export default defineComponent({ props: {} });",
14
+ filename: "/project/Panel.vue"
15
+ },
16
+ {
17
+ code: "export default { name: \"Legacy\" };",
18
+ filename: "/project/Legacy.vue"
19
+ }
20
+ ],
21
+
22
+ invalid: [
23
+ {
24
+ code: "export default defineComponent({ name: \"Panel\", props: {} });",
25
+ filename: "/project/Panel.vue",
26
+ output: "export default defineComponent({ props: {} });",
27
+ errors: [
28
+ {
29
+ message: "Vue single-file components must rely on their inferred filename."
30
+ }
31
+ ]
32
+ },
33
+ {
34
+ code: "export default Vue.defineComponent({ props: {}, \"name\": \"Panel\" });",
35
+ filename: "/project/Panel.vue",
36
+ output: "export default Vue.defineComponent({ props: {} });",
37
+ errors: [
38
+ {
39
+ message: "Vue single-file components must rely on their inferred filename."
40
+ }
41
+ ]
42
+ }
43
+ ]
44
+ });
@@ -0,0 +1,39 @@
1
+ import rule from "../../rules/vue-no-regex-data.js";
2
+ import createRuleTester from "../rule-tester.js";
3
+
4
+ const ruleTester = createRuleTester();
5
+
6
+ ruleTester.run("vue-no-regex-data", rule, {
7
+ valid: [
8
+ {
9
+ code: "const pattern = /ok/; export default { data() { return { pattern }; } };"
10
+ },
11
+ {
12
+ code: "export default { data() { return { value: \"text\" }; } };"
13
+ }
14
+ ],
15
+
16
+ invalid: [
17
+ {
18
+ code: "export default { data() { return { pattern: /ok/i }; } };",
19
+ errors: [
20
+ {
21
+ message: "Do not use regex in Vue data object. Please move it outside, as a constant."
22
+ }
23
+ ]
24
+ },
25
+ {
26
+ code:
27
+ "export default { data() { return { first: new RegExp(\"a\"), " +
28
+ "second: /b/ }; } };",
29
+ errors: [
30
+ {
31
+ message: "Do not use regex in Vue data object. Please move it outside, as a constant."
32
+ },
33
+ {
34
+ message: "Do not use regex in Vue data object. Please move it outside, as a constant."
35
+ }
36
+ ]
37
+ }
38
+ ]
39
+ });