Skip to content

Commit f2f5235

Browse files
authored
Add checkVueTemplate to simplify create rule for Vue SFC (#1362)
1 parent 9199611 commit f2f5235

File tree

4 files changed

+55
-22
lines changed

4 files changed

+55
-22
lines changed

index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
const createDeprecatedRules = require('./rules/utils/create-deprecated-rules.js');
3-
const {loadRules} = require('./rules/utils/load-rule.js');
3+
const {loadRules} = require('./rules/utils/rule.js');
44

55
const deprecatedRules = createDeprecatedRules({
66
// {ruleId: ReplacementRuleId | ReplacementRuleId[]}, if no replacement, use `{ruleId: []}`

rules/explicit-length-check.js

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22
const {isParenthesized, getStaticValue} = require('eslint-utils');
3+
const {checkVueTemplate} = require('./utils/rule.js');
34
const isLiteralValue = require('./utils/is-literal-value.js');
45
const isLogicalExpression = require('./utils/is-logical-expression.js');
56
const {isBooleanNode, getBooleanAncestor} = require('./utils/boolean.js');
@@ -141,11 +142,10 @@ function create(context) {
141142
];
142143
}
143144

144-
// TODO[@fisker]: Make `return problem` work for `vue-eslint-parser`
145-
context.report(problem);
145+
return problem;
146146
}
147147

148-
const listeners = {
148+
return {
149149
[lengthSelector](lengthNode) {
150150
if (lengthNode.object.type === 'ThisExpression') {
151151
return;
@@ -183,13 +183,6 @@ function create(context) {
183183
}
184184
}
185185
};
186-
187-
// `vue-eslint-parser`
188-
if (context.parserServices && context.parserServices.defineTemplateBodyVisitor) {
189-
return context.parserServices.defineTemplateBodyVisitor(listeners, listeners);
190-
}
191-
192-
return listeners;
193186
}
194187

195188
const schema = [
@@ -205,7 +198,7 @@ const schema = [
205198
];
206199

207200
module.exports = {
208-
create,
201+
create: checkVueTemplate(create),
209202
meta: {
210203
type: 'problem',
211204
docs: {

rules/utils/load-rule.js renamed to rules/utils/rule.js

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const getDocumentationUrl = require('./get-documentation-url.js');
55

66
const isIterable = object => typeof object[Symbol.iterator] === 'function';
77

8-
function reportProblems(listener, context) {
8+
function reportListenerProblems(listener, context) {
99
// Listener arguments can be `codePath, node` or `node`
1010
return function (...listenerArguments) {
1111
let problems = listener(...listenerArguments);
@@ -27,15 +27,51 @@ function reportProblems(listener, context) {
2727
};
2828
}
2929

30-
function wrapCreateFunction(create) {
31-
return function (context) {
30+
// `checkVueTemplate` function will wrap `create` function, there is no need to wrap twice
31+
const wrappedFunctions = new Set();
32+
function reportProblems(create) {
33+
if (wrappedFunctions.has(create)) {
34+
return create;
35+
}
36+
37+
const wrapped = context => Object.fromEntries(
38+
Object.entries(create(context))
39+
.map(([selector, listener]) => [selector, reportListenerProblems(listener, context)])
40+
);
41+
42+
wrappedFunctions.add(wrapped);
43+
44+
return wrapped;
45+
}
46+
47+
function checkVueTemplate(create, options) {
48+
const {
49+
visitScriptBlock
50+
} = {
51+
visitScriptBlock: true,
52+
...options
53+
};
54+
55+
create = reportProblems(create);
56+
57+
const wrapped = context => {
3258
const listeners = create(context);
3359

34-
return Object.fromEntries(
35-
Object.entries(listeners)
36-
.map(([selector, listener]) => [selector, reportProblems(listener, context)])
37-
);
60+
// `vue-eslint-parser`
61+
if (
62+
context.parserServices &&
63+
context.parserServices.defineTemplateBodyVisitor
64+
) {
65+
return visitScriptBlock ?
66+
context.parserServices.defineTemplateBodyVisitor(listeners, listeners) :
67+
context.parserServices.defineTemplateBodyVisitor(listeners);
68+
}
69+
70+
return listeners;
3871
};
72+
73+
wrappedFunctions.add(wrapped);
74+
return wrapped;
3975
}
4076

4177
function loadRule(ruleId) {
@@ -52,7 +88,7 @@ function loadRule(ruleId) {
5288
url: getDocumentationUrl(ruleId)
5389
}
5490
},
55-
create: wrapCreateFunction(rule.create)
91+
create: reportProblems(rule.create)
5692
};
5793
}
5894

@@ -67,4 +103,8 @@ function loadRules() {
67103
);
68104
}
69105

70-
module.exports = {loadRule, loadRules};
106+
module.exports = {
107+
loadRule,
108+
loadRules,
109+
checkVueTemplate
110+
};

test/utils/test.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import url from 'node:url';
33
import {createRequire} from 'node:module';
44
import test from 'ava';
55
import avaRuleTester from 'eslint-ava-rule-tester';
6-
import {loadRule} from '../../rules/utils/load-rule.js';
6+
import {loadRule} from '../../rules/utils/rule.js';
77
import snapshotRuleTester from './snapshot-rule-tester.mjs';
88
import defaultParserOptions from './default-parser-options.mjs';
99

0 commit comments

Comments
 (0)