|
"use strict"; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
const utils_1 = require("../utils"); |
|
const ast_utils_1 = require("../utils/ast-utils"); |
|
const compat_1 = require("../utils/compat"); |
|
exports.default = (0, utils_1.createRule)('no-dupe-on-directives', { |
|
meta: { |
|
docs: { |
|
description: 'disallow duplicate `on:` directives', |
|
category: 'Possible Errors', |
|
recommended: false |
|
}, |
|
schema: [], |
|
messages: { |
|
duplication: 'This `on:{{type}}` directive is the same and duplicate directives in L{{lineNo}}.' |
|
}, |
|
type: 'problem' |
|
}, |
|
create(context) { |
|
const sourceCode = (0, compat_1.getSourceCode)(context); |
|
const directiveDataMap = new Map(); |
|
return { |
|
SvelteDirective(node) { |
|
if (node.kind !== 'EventHandler') |
|
return; |
|
const directiveDataList = directiveDataMap.get(node.key.name.name); |
|
if (!directiveDataList) { |
|
directiveDataMap.set(node.key.name.name, [ |
|
{ |
|
expression: node.expression, |
|
nodes: [node] |
|
} |
|
]); |
|
return; |
|
} |
|
const directiveData = directiveDataList.find((data) => { |
|
if (!data.expression || !node.expression) { |
|
return data.expression === node.expression; |
|
} |
|
return (0, ast_utils_1.equalTokens)(data.expression, node.expression, sourceCode); |
|
}); |
|
if (!directiveData) { |
|
directiveDataList.push({ |
|
expression: node.expression, |
|
nodes: [node] |
|
}); |
|
return; |
|
} |
|
directiveData.nodes.push(node); |
|
}, |
|
'SvelteStartTag:exit'() { |
|
for (const [type, directiveDataList] of directiveDataMap) { |
|
for (const { nodes } of directiveDataList) { |
|
if (nodes.length < 2) { |
|
continue; |
|
} |
|
for (const node of nodes) { |
|
context.report({ |
|
node, |
|
messageId: 'duplication', |
|
data: { |
|
type, |
|
lineNo: String((nodes[0] !== node ? nodes[0] : nodes[1]).loc.start.line) |
|
} |
|
}); |
|
} |
|
} |
|
} |
|
directiveDataMap.clear(); |
|
} |
|
}; |
|
} |
|
}); |
|
|