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.
- package/.github/workflows/build.yml +6 -0
- package/README.md +2 -1
- package/index.js +2 -0
- package/package.json +9 -1
- package/recommended-vue.js +1 -0
- package/rules/align-comments.js +6 -3
- package/rules/constructor-variables.js +17 -2
- package/rules/header-check.js +8 -2
- package/rules/header-comments-check.js +14 -3
- package/rules/import-group-comment.js +13 -4
- package/rules/jsdoc-enforce-access.js +16 -10
- package/rules/no-extra-line-within-function.js +8 -5
- package/rules/no-short-parameters.js +1 -1
- package/rules/no-snake-case.js +0 -24
- package/rules/no-space-in-optional-arguments.js +5 -2
- package/rules/one-space-after-operator.js +59 -14
- package/rules/vue-header-check.js +4 -3
- package/rules/vue-no-regex-data.js +1 -2
- package/rules/vue-pinia-action-single-parameter.js +158 -0
- package/rules/vue-props-declaration-line-break.js +8 -3
- package/rules/vue-watch-handler.js +34 -1
- package/tests/fixtures/vue-header-check/missing-script-style/TestComponent.vue +19 -0
- package/tests/fixtures/vue-header-check/missing-template/TestComponent.vue +3 -0
- package/tests/fixtures/vue-header-check/valid/TestComponent.vue +27 -0
- package/tests/rule-tester.js +78 -0
- package/tests/rules/align-comments.test.js +25 -0
- package/tests/rules/align-consecutive-class-assignements.test.js +24 -0
- package/tests/rules/align-one-var.test.js +31 -0
- package/tests/rules/align-requires.test.js +27 -0
- package/tests/rules/arrow-block-newline.test.js +23 -0
- package/tests/rules/consecutive-line-comments.test.js +27 -0
- package/tests/rules/const.test.js +52 -0
- package/tests/rules/constructor-variables.test.js +52 -0
- package/tests/rules/enforce-optional.test.js +24 -0
- package/tests/rules/header-check.test.js +69 -0
- package/tests/rules/header-comments-check.test.js +90 -0
- package/tests/rules/import-group-comment.test.js +88 -0
- package/tests/rules/import-group-order.test.js +58 -0
- package/tests/rules/jsdoc-align-params.test.js +32 -0
- package/tests/rules/jsdoc-check-indentation.test.js +45 -0
- package/tests/rules/jsdoc-check-optional-params.test.js +40 -0
- package/tests/rules/jsdoc-description-length.test.js +60 -0
- package/tests/rules/jsdoc-description-multiline.test.js +34 -0
- package/tests/rules/jsdoc-enforce-access.test.js +66 -0
- package/tests/rules/jsdoc-enforce-classdesc.test.js +39 -0
- package/tests/rules/jsdoc-no-param-return.test.js +47 -0
- package/tests/rules/jsdoc-require-description-uppercase.test.js +52 -0
- package/tests/rules/methods-naming.test.js +70 -0
- package/tests/rules/methods-ordering.test.js +75 -0
- package/tests/rules/multiline-comment-end-backslash.test.js +52 -0
- package/tests/rules/newline-after-switch-case.test.js +75 -0
- package/tests/rules/no-async.test.js +57 -0
- package/tests/rules/no-extra-line-within-function.test.js +87 -0
- package/tests/rules/no-inline-function-in-ternary.test.js +59 -0
- package/tests/rules/no-short-parameters.test.js +62 -0
- package/tests/rules/no-snake-case.test.js +81 -0
- package/tests/rules/no-space-in-optional-arguments.test.js +40 -0
- package/tests/rules/no-useless-template-literals.test.js +36 -0
- package/tests/rules/no-var-in-blocks.test.js +40 -0
- package/tests/rules/one-space-after-operator.test.js +69 -0
- package/tests/rules/regex-in-constructor.test.js +40 -0
- package/tests/rules/ternary-parenthesis.test.js +34 -0
- package/tests/rules/two-lines-between-class-members.test.js +62 -0
- package/tests/rules/variable-names.test.js +60 -0
- package/tests/rules/vue-attribute-comma.test.js +43 -0
- package/tests/rules/vue-attribute-linebreak.test.js +54 -0
- package/tests/rules/vue-class-attribute-last.test.js +59 -0
- package/tests/rules/vue-class-shorthand-max-len.test.js +67 -0
- package/tests/rules/vue-computed-order.test.js +27 -0
- package/tests/rules/vue-data-comment.test.js +61 -0
- package/tests/rules/vue-define-component.test.js +45 -0
- package/tests/rules/vue-emits-order.test.js +27 -0
- package/tests/rules/vue-header-check.test.js +49 -0
- package/tests/rules/vue-html-indent.test.js +77 -0
- package/tests/rules/vue-html-quotes.test.js +71 -0
- package/tests/rules/vue-methods-separator.test.js +55 -0
- package/tests/rules/vue-name-prop.test.js +59 -0
- package/tests/rules/vue-no-component-class-shorthand.test.js +49 -0
- package/tests/rules/vue-no-mixed-class.test.js +56 -0
- package/tests/rules/vue-no-name-option.test.js +44 -0
- package/tests/rules/vue-no-regex-data.test.js +39 -0
- package/tests/rules/vue-pinia-action-single-parameter.test.js +234 -0
- package/tests/rules/vue-props-declaration-line-break.test.js +68 -0
- package/tests/rules/vue-props-declaration-multiline.test.js +40 -0
- package/tests/rules/vue-props-declaration-order.test.js +27 -0
- package/tests/rules/vue-ref-case.test.js +40 -0
- package/tests/rules/vue-watch-handler.test.js +89 -0
- package/tests/rules-coverage.test.js +19 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import rule from "../../rules/one-space-after-operator.js";
|
|
2
|
+
import createRuleTester from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createRuleTester();
|
|
5
|
+
|
|
6
|
+
ruleTester.run("one-space-after-operator", rule, {
|
|
7
|
+
valid: [
|
|
8
|
+
"let value = 1; value = 2;",
|
|
9
|
+
"let value = 1; value += 2;",
|
|
10
|
+
"const object = { key : value };",
|
|
11
|
+
"const object = { method() {} };",
|
|
12
|
+
{
|
|
13
|
+
code: "const object = { key: value };",
|
|
14
|
+
options: [
|
|
15
|
+
{
|
|
16
|
+
checkColon: false
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
|
|
22
|
+
invalid: [
|
|
23
|
+
{
|
|
24
|
+
code: "const value= 1;",
|
|
25
|
+
output: "const value = 1;",
|
|
26
|
+
errors: [
|
|
27
|
+
{
|
|
28
|
+
message: "There should be at least one space before and exactly one space after '='"
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
code: "let value = 1; value= 2;",
|
|
34
|
+
output: "let value = 1; value = 2;",
|
|
35
|
+
errors: [
|
|
36
|
+
{
|
|
37
|
+
message: "There should be at least one space before and exactly one space after '='"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
code: "let value = 1; value+=2;",
|
|
43
|
+
output: "let value = 1; value += 2;",
|
|
44
|
+
errors: [
|
|
45
|
+
{
|
|
46
|
+
message: "There should be at least one space before and exactly one space after '+='"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
code: "const value =1;",
|
|
52
|
+
output: "const value = 1;",
|
|
53
|
+
errors: [
|
|
54
|
+
{
|
|
55
|
+
message: "There should be at least one space before and exactly one space after '='"
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
code: "const object = { key: value };",
|
|
61
|
+
output: "const object = { key : value };",
|
|
62
|
+
errors: [
|
|
63
|
+
{
|
|
64
|
+
message: "There should be at least one space before and exactly one space after ':'"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import rule from "../../rules/regex-in-constructor.js";
|
|
2
|
+
import createRuleTester from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createRuleTester();
|
|
5
|
+
|
|
6
|
+
ruleTester.run("regex-in-constructor", rule, {
|
|
7
|
+
valid: [
|
|
8
|
+
"class Matcher { constructor() { this.pattern = /value/i; } }",
|
|
9
|
+
"function matches(value) { return /value/.test(value); }",
|
|
10
|
+
"class Matcher { matches(value) { return new RegExp(value).test(value); } }",
|
|
11
|
+
"class Matcher { pattern = /value/; }"
|
|
12
|
+
],
|
|
13
|
+
|
|
14
|
+
invalid: [
|
|
15
|
+
{
|
|
16
|
+
code: "class Matcher { matches(value) { return /value/i.test(value); } }",
|
|
17
|
+
errors: [
|
|
18
|
+
{
|
|
19
|
+
message: "Regular expressions should be defined in the constructor."
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
code: "class Matcher { static matches(value) { return /value/.test(value); } }",
|
|
25
|
+
errors: [
|
|
26
|
+
{
|
|
27
|
+
message: "Regular expressions should be defined in the constructor."
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
code: "class Matcher { matches(value) { return /first/.test(value) || /second/.test(value); } }",
|
|
33
|
+
errors: [
|
|
34
|
+
{
|
|
35
|
+
message: "Regular expressions should be defined in the constructor."
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import rule from "../../rules/ternary-parenthesis.js";
|
|
2
|
+
import createRuleTester from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createRuleTester();
|
|
5
|
+
|
|
6
|
+
ruleTester.run("ternary-parenthesis", rule, {
|
|
7
|
+
valid: [
|
|
8
|
+
"const result = ready ? first : second;",
|
|
9
|
+
"const result = !ready ? first : second;",
|
|
10
|
+
"const result = (count > 0) ? first : second;",
|
|
11
|
+
"const result = (ready && enabled) ? first : second;"
|
|
12
|
+
],
|
|
13
|
+
|
|
14
|
+
invalid: [
|
|
15
|
+
{
|
|
16
|
+
code: "const result = count > 0 ? first : second;",
|
|
17
|
+
output: "const result = (count > 0) ? first : second;",
|
|
18
|
+
errors: [
|
|
19
|
+
{
|
|
20
|
+
message: "The condition in ternary expressions with an operator should be wrapped in parentheses"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
code: "const result = ready && enabled ? first : second;",
|
|
26
|
+
output: "const result = (ready && enabled) ? first : second;",
|
|
27
|
+
errors: [
|
|
28
|
+
{
|
|
29
|
+
message: "The condition in ternary expressions with an operator should be wrapped in parentheses"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import rule from "../../rules/two-lines-between-class-members.js";
|
|
2
|
+
import createRuleTester from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createRuleTester();
|
|
5
|
+
|
|
6
|
+
ruleTester.run("two-lines-between-class-members", rule, {
|
|
7
|
+
valid: [
|
|
8
|
+
"class Worker { run() {} }",
|
|
9
|
+
`class Worker {
|
|
10
|
+
start() {}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
stop() {}
|
|
14
|
+
}`,
|
|
15
|
+
`class Worker {
|
|
16
|
+
active = true;
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
run() {}
|
|
20
|
+
}`
|
|
21
|
+
],
|
|
22
|
+
|
|
23
|
+
invalid: [
|
|
24
|
+
{
|
|
25
|
+
code: `class Worker {
|
|
26
|
+
start() {}
|
|
27
|
+
stop() {}
|
|
28
|
+
}`,
|
|
29
|
+
errors: [
|
|
30
|
+
{
|
|
31
|
+
message: "Expected exactly two line breaks between class methods."
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
code: `class Worker {
|
|
37
|
+
start() {}
|
|
38
|
+
|
|
39
|
+
stop() {}
|
|
40
|
+
}`,
|
|
41
|
+
errors: [
|
|
42
|
+
{
|
|
43
|
+
message: "Expected exactly two line breaks between class methods."
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
code: `class Worker {
|
|
49
|
+
start() {}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
stop() {}
|
|
54
|
+
}`,
|
|
55
|
+
errors: [
|
|
56
|
+
{
|
|
57
|
+
message: "Expected exactly two line breaks between class methods."
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import rule from "../../rules/variable-names.js";
|
|
2
|
+
import createRuleTester from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createRuleTester();
|
|
5
|
+
|
|
6
|
+
ruleTester.run("variable-names", rule, {
|
|
7
|
+
valid: [
|
|
8
|
+
"let topLevel = 1; var otherTopLevel = 2;",
|
|
9
|
+
"function calculate() { const result = 1; let _temporary = result; }",
|
|
10
|
+
"const calculate = () => { let { value } = object; let [first] = values; };",
|
|
11
|
+
{
|
|
12
|
+
code: "function calculate() { let result = 1; }",
|
|
13
|
+
options: [
|
|
14
|
+
{
|
|
15
|
+
variableExceptions: ["result"]
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
|
|
21
|
+
invalid: [
|
|
22
|
+
{
|
|
23
|
+
code: "function calculate() { let result = 1; }",
|
|
24
|
+
errors: [
|
|
25
|
+
{
|
|
26
|
+
message: "Local variables should start with \"_\" ({result})"
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
code: "const calculate = () => { var result; };",
|
|
32
|
+
errors: [
|
|
33
|
+
{
|
|
34
|
+
message: "Local variables should start with \"_\" ({result})"
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
code: "class Calculator { calculate() { let result = 1; } }",
|
|
40
|
+
errors: [
|
|
41
|
+
{
|
|
42
|
+
message: "Local variables should start with \"_\" ({result})"
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
code: "function calculate() { let allowed = 1; let rejected = 2; }",
|
|
48
|
+
options: [
|
|
49
|
+
{
|
|
50
|
+
variableExceptions: ["allowed"]
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
errors: [
|
|
54
|
+
{
|
|
55
|
+
message: "Local variables should start with \"_\" ({rejected})"
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import rule from "../../rules/vue-attribute-comma.js";
|
|
2
|
+
import { createVueRuleTester } from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createVueRuleTester();
|
|
5
|
+
const filename = "TestComponent.vue";
|
|
6
|
+
|
|
7
|
+
ruleTester.run("vue-attribute-comma", rule, {
|
|
8
|
+
valid: [
|
|
9
|
+
{
|
|
10
|
+
filename,
|
|
11
|
+
code: `<template>
|
|
12
|
+
<button type="button" :aria-label="label">Save, now</button>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<script setup>
|
|
16
|
+
const label = "Save";
|
|
17
|
+
</script>`
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
filename,
|
|
21
|
+
code: `<template>
|
|
22
|
+
<Widget disabled />
|
|
23
|
+
</template>`
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
|
|
27
|
+
invalid: [
|
|
28
|
+
{
|
|
29
|
+
filename,
|
|
30
|
+
code: `<template>
|
|
31
|
+
<button type="button", disabled>Save</button>
|
|
32
|
+
</template>`,
|
|
33
|
+
output: `<template>
|
|
34
|
+
<button type="button" disabled>Save</button>
|
|
35
|
+
</template>`,
|
|
36
|
+
errors: [
|
|
37
|
+
{
|
|
38
|
+
message: "Comma after attribute value is not allowed."
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import rule from "../../rules/vue-attribute-linebreak.js";
|
|
2
|
+
import { createVueRuleTester } from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createVueRuleTester();
|
|
5
|
+
const filename = "TestComponent.vue";
|
|
6
|
+
|
|
7
|
+
ruleTester.run("vue-attribute-linebreak", rule, {
|
|
8
|
+
valid: [
|
|
9
|
+
{
|
|
10
|
+
filename,
|
|
11
|
+
code: `<template>
|
|
12
|
+
<section>
|
|
13
|
+
<button
|
|
14
|
+
type="button"
|
|
15
|
+
disabled
|
|
16
|
+
>
|
|
17
|
+
Save
|
|
18
|
+
</button>
|
|
19
|
+
</section>
|
|
20
|
+
</template>`
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
|
|
24
|
+
invalid: [
|
|
25
|
+
{
|
|
26
|
+
filename,
|
|
27
|
+
code: `<template>
|
|
28
|
+
<button type="button">Save</button>
|
|
29
|
+
</template>`,
|
|
30
|
+
errors: [
|
|
31
|
+
{
|
|
32
|
+
message: "Expected a linebreak above this attribute."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
message: "Expected a linebreak below this attribute."
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
filename,
|
|
41
|
+
code: `<template>
|
|
42
|
+
<button type="button"
|
|
43
|
+
>
|
|
44
|
+
Save
|
|
45
|
+
</button>
|
|
46
|
+
</template>`,
|
|
47
|
+
errors: [
|
|
48
|
+
{
|
|
49
|
+
message: "Expected a linebreak above this attribute."
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import rule from "../../rules/vue-class-attribute-last.js";
|
|
2
|
+
import { createVueRuleTester } from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createVueRuleTester();
|
|
5
|
+
const filename = "TestComponent.vue";
|
|
6
|
+
|
|
7
|
+
ruleTester.run("vue-class-attribute-last", rule, {
|
|
8
|
+
valid: [
|
|
9
|
+
{
|
|
10
|
+
filename,
|
|
11
|
+
code: `<template>
|
|
12
|
+
<button
|
|
13
|
+
type="button"
|
|
14
|
+
:aria-label="label"
|
|
15
|
+
:class="{ active }"
|
|
16
|
+
class="button"
|
|
17
|
+
disabled
|
|
18
|
+
>
|
|
19
|
+
Save
|
|
20
|
+
</button>
|
|
21
|
+
</template>
|
|
22
|
+
|
|
23
|
+
<script setup>
|
|
24
|
+
const active = true;
|
|
25
|
+
const label = "Save";
|
|
26
|
+
</script>`
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
|
|
30
|
+
invalid: [
|
|
31
|
+
{
|
|
32
|
+
filename,
|
|
33
|
+
code: `<template>
|
|
34
|
+
<button class="button" type="button">Save</button>
|
|
35
|
+
</template>`,
|
|
36
|
+
errors: [
|
|
37
|
+
{
|
|
38
|
+
message: "Attribute \"type\" must be declared before the \"class\" attribute."
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
filename,
|
|
44
|
+
code: `<template>
|
|
45
|
+
<button :class="{ active }" :aria-label="label">Save</button>
|
|
46
|
+
</template>
|
|
47
|
+
|
|
48
|
+
<script setup>
|
|
49
|
+
const active = true;
|
|
50
|
+
const label = "Save";
|
|
51
|
+
</script>`,
|
|
52
|
+
errors: [
|
|
53
|
+
{
|
|
54
|
+
message: "Attribute \":aria-label\" must be declared before the \":class\" attribute."
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import rule from "../../rules/vue-class-shorthand-max-len.js";
|
|
2
|
+
import { createPugRuleTester } from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createPugRuleTester();
|
|
5
|
+
const filename = "TestComponent.vue";
|
|
6
|
+
|
|
7
|
+
ruleTester.run("vue-class-shorthand-max-len", rule, {
|
|
8
|
+
valid: [
|
|
9
|
+
{
|
|
10
|
+
filename,
|
|
11
|
+
options: [
|
|
12
|
+
{
|
|
13
|
+
max: 9
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
code: `<template lang="pug">
|
|
17
|
+
div.short
|
|
18
|
+
</template>`
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
filename,
|
|
22
|
+
options: [
|
|
23
|
+
{
|
|
24
|
+
max: 5
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
code: `<template lang="pug">
|
|
28
|
+
UserCard.very-long-class
|
|
29
|
+
user-card.very-long-class
|
|
30
|
+
</template>`
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
|
|
34
|
+
invalid: [
|
|
35
|
+
{
|
|
36
|
+
filename,
|
|
37
|
+
options: [
|
|
38
|
+
{
|
|
39
|
+
max: 8
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
code: `<template lang="pug">
|
|
43
|
+
div.short
|
|
44
|
+
</template>`,
|
|
45
|
+
errors: [
|
|
46
|
+
{
|
|
47
|
+
messageId: "tooLong",
|
|
48
|
+
data: {
|
|
49
|
+
length: 9,
|
|
50
|
+
max: 8
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
filename,
|
|
57
|
+
code: `<template lang="pug">
|
|
58
|
+
div.this-class-name-is-deliberately-long-to-exceed-the-default-maximum-length-without-options-and-report
|
|
59
|
+
</template>`,
|
|
60
|
+
errors: [
|
|
61
|
+
{
|
|
62
|
+
messageId: "tooLong"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import rule from "../../rules/vue-computed-order.js";
|
|
2
|
+
import createRuleTester from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createRuleTester();
|
|
5
|
+
|
|
6
|
+
ruleTester.run("vue-computed-order", rule, {
|
|
7
|
+
valid: [
|
|
8
|
+
{
|
|
9
|
+
code: "export default { computed: { alpha() {}, beta() {} } };"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
code: "const options = { computed: { beta() {}, alpha() {} } };"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
|
|
16
|
+
invalid: [
|
|
17
|
+
{
|
|
18
|
+
code: "export default { computed: { beta() {}, alpha() {} } };",
|
|
19
|
+
output: "export default { computed: { alpha() {}, beta() {} } };",
|
|
20
|
+
errors: [
|
|
21
|
+
{
|
|
22
|
+
message: "Computed properties should be in alphabetical order."
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import rule from "../../rules/vue-data-comment.js";
|
|
2
|
+
import createRuleTester from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createRuleTester();
|
|
5
|
+
|
|
6
|
+
ruleTester.run("vue-data-comment", rule, {
|
|
7
|
+
valid: [
|
|
8
|
+
{
|
|
9
|
+
code: `
|
|
10
|
+
export default {
|
|
11
|
+
data() {
|
|
12
|
+
return {
|
|
13
|
+
// --> STATE <--
|
|
14
|
+
ready: false
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
`
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
code: "export default { data() { return {}; } };"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
|
|
25
|
+
invalid: [
|
|
26
|
+
{
|
|
27
|
+
code: "export default { data() { return { ready: false }; } };",
|
|
28
|
+
errors: [
|
|
29
|
+
{
|
|
30
|
+
message:
|
|
31
|
+
"data() return object must start with a comment: " +
|
|
32
|
+
"'// --> STATE <--', '// --> DATA <--', " +
|
|
33
|
+
"'// --> ROUTE PARAMS <--', '// --> ROUTE QUERY <--', or " +
|
|
34
|
+
"'// --> COMPONENTS <--'."
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
code: `
|
|
40
|
+
export default {
|
|
41
|
+
data() {
|
|
42
|
+
return {
|
|
43
|
+
// --> DATA <--
|
|
44
|
+
value: 1,
|
|
45
|
+
// --> UNKNOWN <--
|
|
46
|
+
other: 2
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
`,
|
|
51
|
+
errors: [
|
|
52
|
+
{
|
|
53
|
+
message:
|
|
54
|
+
"Invalid comment. Must be '// --> STATE <--', " +
|
|
55
|
+
"'// --> DATA <--', '// --> ROUTE PARAMS <--', " +
|
|
56
|
+
"'// --> ROUTE QUERY <--', or '// --> COMPONENTS <--'."
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import rule from "../../rules/vue-define-component.js";
|
|
2
|
+
import createRuleTester from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createRuleTester();
|
|
5
|
+
|
|
6
|
+
ruleTester.run("vue-define-component", rule, {
|
|
7
|
+
valid: [
|
|
8
|
+
{
|
|
9
|
+
code: "export default { name: \"Utility\" };",
|
|
10
|
+
filename: "/project/utility.js"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
code: "export default defineComponent({});",
|
|
14
|
+
filename: "/project/Panel.vue"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
code: "export default { name: \"Index\" };",
|
|
18
|
+
filename: "/project/mixins/index.js"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
|
|
22
|
+
invalid: [
|
|
23
|
+
{
|
|
24
|
+
code: "import { ref } from \"vue\";\nexport default { setup() { return { ref }; } };",
|
|
25
|
+
filename: "/project/Panel.vue",
|
|
26
|
+
output:
|
|
27
|
+
"import { ref, defineComponent } from \"vue\";\n" +
|
|
28
|
+
"export default defineComponent({ setup() { return { ref }; } });",
|
|
29
|
+
errors: [
|
|
30
|
+
{
|
|
31
|
+
message: "Mixins and components must use the `defineComponent` wrapper."
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
code: "export default createOptions();",
|
|
37
|
+
filename: "/project/mixins/shared.js",
|
|
38
|
+
errors: [
|
|
39
|
+
{
|
|
40
|
+
message: "Mixins and components must use the `defineComponent` wrapper."
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import rule from "../../rules/vue-emits-order.js";
|
|
2
|
+
import createRuleTester from "../rule-tester.js";
|
|
3
|
+
|
|
4
|
+
const ruleTester = createRuleTester();
|
|
5
|
+
|
|
6
|
+
ruleTester.run("vue-emits-order", rule, {
|
|
7
|
+
valid: [
|
|
8
|
+
{
|
|
9
|
+
code: "export default { emits: [\"close\", \"open\"] };"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
code: "const options = { emits: [\"open\", \"close\"] };"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
|
|
16
|
+
invalid: [
|
|
17
|
+
{
|
|
18
|
+
code: "export default { emits: [\"open\", \"close\"] };",
|
|
19
|
+
output: "export default { emits: [\"close\", \"open\"] };",
|
|
20
|
+
errors: [
|
|
21
|
+
{
|
|
22
|
+
message: "Emits should be in alphabetical order."
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
});
|