UNPKG

eslint-plugin-lit

Version:
77 lines (76 loc) 3.5 kB
"use strict"; /** * @fileoverview Detects usages of legacy binding syntax * @author James Garbutt <https://github.com/43081j> */ const template_analyzer_1 = require("../template-analyzer"); //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ 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 = template_analyzer_1.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 } }); } } } }); } } }; } }; module.exports = rule;