lib/rules/dangerously-set-inner-html.js (47 lines of code) (raw):

'use strict'; module.exports = { meta: { docs: { category: 'Possible Errors', description: 'Ensure `dangerouslySetInnerHTML` is used on elements that permit flow content', recommended: true, }, messages: { invalidElementForSanitizeUserHTML: 'Do not use `dangerouslySetInnerHTML` on `<{{ element }}>` when using `sanitizeUserHTML()`, use a `<div>`.', }, fixable: null, schema: [], }, create: (context) => { return { JSXOpeningElement: (node) => { const { attributes, name } = node; const props = attributes.filter((attribute) => { if (!attribute.name || !attribute.name.name) { return false; } return attribute.name.name === 'dangerouslySetInnerHTML'; }); if (props.length !== 1) { return; } const prop = props[0]; if (!prop.value.expression || !prop.value.expression.callee) { return; } const { callee } = prop.value.expression; if (name.name !== 'div' && callee.name === 'sanitizeUserHTML') { context.report({ node, messageId: 'invalidElementForSanitizeUserHTML', data: { element: name.name, }, }); } }, }; }, };