|
"use strict"; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
const shared_1 = require("../shared"); |
|
const utils_1 = require("../utils"); |
|
const compat_1 = require("../utils/compat"); |
|
|
|
|
|
|
|
const COMMENT_DIRECTIVE_B = /^\s*(eslint-(?:en|dis)able)(?:\s+|$)/; |
|
const COMMENT_DIRECTIVE_L = /^\s*(eslint-disable(?:-next)?-line)(?:\s+|$)/; |
|
|
|
const ALL_RULES = () => true; |
|
|
|
|
|
|
|
|
|
|
|
function stripDirectiveComment(value) { |
|
return value.split(/\s-{2,}\s/u)[0]; |
|
} |
|
exports.default = (0, utils_1.createRule)('comment-directive', { |
|
meta: { |
|
docs: { |
|
description: 'support comment-directives in HTML template', |
|
category: 'System', |
|
recommended: 'base' |
|
}, |
|
schema: [ |
|
{ |
|
type: 'object', |
|
properties: { |
|
reportUnusedDisableDirectives: { |
|
type: 'boolean' |
|
} |
|
}, |
|
additionalProperties: false |
|
} |
|
], |
|
messages: { |
|
unused: 'Unused {{kind}} directive (no problems were reported).', |
|
unusedRule: "Unused {{kind}} directive (no problems were reported from '{{rule}}').", |
|
unusedEnable: 'Unused {{kind}} directive (reporting is not suppressed).', |
|
unusedEnableRule: "Unused {{kind}} directive (reporting from '{{rule}}' is not suppressed)." |
|
}, |
|
type: 'problem' |
|
}, |
|
create(context) { |
|
const shared = (0, shared_1.getShared)((0, compat_1.getFilename)(context)); |
|
if (!shared) |
|
return {}; |
|
const options = context.options[0] || {}; |
|
const reportUnusedDisableDirectives = Boolean(options.reportUnusedDisableDirectives); |
|
const directives = shared.newCommentDirectives({ |
|
ruleId: 'svelte/comment-directive', |
|
reportUnusedDisableDirectives |
|
}); |
|
const sourceCode = (0, compat_1.getSourceCode)(context); |
|
|
|
|
|
|
|
function parse(pattern, comment) { |
|
const text = stripDirectiveComment(comment.value); |
|
const match = pattern.exec(text); |
|
if (match == null) { |
|
return null; |
|
} |
|
const type = match[1]; |
|
const rules = []; |
|
const rulesRe = /([^\s,]+)[\s,]*/g; |
|
let startIndex = match[0].length; |
|
rulesRe.lastIndex = startIndex; |
|
let res; |
|
while ((res = rulesRe.exec(text))) { |
|
const ruleId = res[1].trim(); |
|
const commentStart = comment.range[0] + 4; |
|
const start = sourceCode.getLocFromIndex(commentStart + startIndex); |
|
const end = sourceCode.getLocFromIndex(commentStart + startIndex + ruleId.length); |
|
rules.push({ |
|
ruleId, |
|
loc: { |
|
start, |
|
end |
|
} |
|
}); |
|
startIndex = rulesRe.lastIndex; |
|
} |
|
return { type, rules }; |
|
} |
|
|
|
|
|
|
|
|
|
function processBlock(directives, comment) { |
|
const parsed = parse(COMMENT_DIRECTIVE_B, comment); |
|
if (parsed != null) { |
|
if (parsed.type === 'eslint-disable') { |
|
if (parsed.rules.length) { |
|
for (const rule of parsed.rules) { |
|
if (reportUnusedDisableDirectives) { |
|
context.report({ |
|
loc: rule.loc, |
|
messageId: 'unusedRule', |
|
data: { rule: rule.ruleId, kind: parsed.type } |
|
}); |
|
} |
|
directives.disableBlock(comment.loc.end, rule.ruleId, { |
|
loc: rule.loc.start |
|
}); |
|
} |
|
} |
|
else { |
|
if (reportUnusedDisableDirectives) { |
|
context.report({ |
|
loc: comment.loc, |
|
messageId: 'unused', |
|
data: { kind: parsed.type } |
|
}); |
|
} |
|
directives.disableBlock(comment.loc.end, ALL_RULES, { |
|
loc: comment.loc.start |
|
}); |
|
} |
|
} |
|
else if (parsed.rules.length) { |
|
for (const rule of parsed.rules) { |
|
if (reportUnusedDisableDirectives) { |
|
context.report({ |
|
loc: rule.loc, |
|
messageId: 'unusedEnableRule', |
|
data: { rule: rule.ruleId, kind: parsed.type } |
|
}); |
|
} |
|
directives.enableBlock(comment.loc.start, rule.ruleId, { |
|
loc: rule.loc.start |
|
}); |
|
} |
|
} |
|
else { |
|
if (reportUnusedDisableDirectives) { |
|
context.report({ |
|
loc: comment.loc, |
|
messageId: 'unusedEnable', |
|
data: { kind: parsed.type } |
|
}); |
|
} |
|
directives.enableBlock(comment.loc.start, ALL_RULES, { |
|
loc: comment.loc.start |
|
}); |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
function processLine(directives, comment) { |
|
const parsed = parse(COMMENT_DIRECTIVE_L, comment); |
|
if (parsed != null && comment.loc.start.line === comment.loc.end.line) { |
|
const line = comment.loc.start.line + (parsed.type === 'eslint-disable-line' ? 0 : 1); |
|
if (parsed.rules.length) { |
|
for (const rule of parsed.rules) { |
|
if (reportUnusedDisableDirectives) { |
|
context.report({ |
|
loc: rule.loc, |
|
messageId: 'unusedRule', |
|
data: { rule: rule.ruleId, kind: parsed.type } |
|
}); |
|
} |
|
directives.disableLine(line, rule.ruleId, { |
|
loc: rule.loc.start |
|
}); |
|
} |
|
} |
|
else { |
|
if (reportUnusedDisableDirectives) { |
|
context.report({ |
|
loc: comment.loc, |
|
messageId: 'unused', |
|
data: { kind: parsed.type } |
|
}); |
|
} |
|
directives.disableLine(line, ALL_RULES, { |
|
loc: comment.loc.start |
|
}); |
|
} |
|
} |
|
} |
|
return { |
|
SvelteHTMLComment(node) { |
|
processBlock(directives, node); |
|
processLine(directives, node); |
|
}, |
|
SvelteScriptElement(node) { |
|
directives.enableBlock(node.startTag.loc.end, ALL_RULES, { |
|
loc: node.loc.start |
|
}); |
|
} |
|
}; |
|
} |
|
}); |
|
|