eslint-plugin-lit
Version:
lit-html support for ESLint
75 lines (74 loc) • 3.45 kB
JavaScript
/**
* @fileoverview Detects usages of legacy binding syntax
* @author James Garbutt <https://github.com/43081j>
*/
import { TemplateAnalyzer } from '../template-analyzer.js';
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
export const rule = {
meta: {
docs: {
description: 'Detects usages of legacy binding syntax',
recommended: false,
url: 'https://github.com/43081j/eslint-plugin-lit/blob/master/docs/rules/no-legacy-template-syntax.md'
},
schema: [],
messages: {
unsupported: 'Legacy lit-extended syntax is unsupported, did you mean to use ' +
'"{{replacement}}"?'
}
},
create(context) {
const source = context.getSourceCode();
const legacyEventPattern = /^on-./;
//----------------------------------------------------------------------
// Helpers
//----------------------------------------------------------------------
//----------------------------------------------------------------------
// Public
//----------------------------------------------------------------------
return {
TaggedTemplateExpression: (node) => {
if (node.type === 'TaggedTemplateExpression' &&
node.tag.type === 'Identifier' &&
node.tag.name === 'html') {
const analyzer = TemplateAnalyzer.create(node);
analyzer.traverse({
enterElement: (element) => {
// eslint-disable-next-line guard-for-in
for (const attr in element.attribs) {
const loc = analyzer.getLocationForAttribute(element, attr, source);
if (!loc) {
continue;
}
const lastChar = attr.slice(-1);
if (legacyEventPattern.test(attr)) {
const replacement = `@${attr.substr(3)}=`;
context.report({
loc: loc,
messageId: 'unsupported',
data: {
replacement: replacement
}
});
}
else if (lastChar === '?' || lastChar === '$') {
const prefix = lastChar === '?' ? '?' : '';
const replacement = `${prefix}${attr.slice(0, -1)}=`;
context.report({
loc: loc,
messageId: 'unsupported',
data: {
replacement: replacement
}
});
}
}
}
});
}
}
};
}
};