Description
What rule do you want to change?
jsx-no-literals
How do you think the change should be implemented?
I would like to see an option to add specific JSXElements to an allow list in jsx-no-literals
. These elements would be allowed to have literals as children. I am unsure if this should also apply the other options that this rule provides such as allowing literals in props.
The new option could be named allowedElements
and accept an array of allowed JSX intrinsic element names as well as named JSX element. If the named element is imported, it should use the imported name (so Button
not MyButton
in the case of import { Button as MyButton } from './Button';
. If the import is a default import, it should match against the name given in the import (so MyButton
in the case of import MyButton from './Button';
.
I am unsure of the best way to handle namespaced elements as I could see it going either way. Maybe check each portion of the namespaced name as well as the whole thing.
Example
/* eslint react/jsx-no-literals: ["error", { "allowedElements": ["div"] }] */
<span>This should error</span>
<div>This should pass</div>
Additional Info
Currently, we use jsx-no-literals
to prevent JSXText
from appearing as the child of an element and instead require developers to pass their copy in via a translation function. This is similar to one of the examples in the jsx-no-literals
docs. However, we use react-i18next
which has a <Trans>
component which will automatically pull all JSXText
as valid translatable copy. We don't encourage our devs to use this method as it currently violates jsx-no-literals
but would like to make this method less "hacky" when it is needed.
/* eslint react/jsx-no-literals: ["error", { "allowedElements": ["Trans"] }] */
<div>This should error</div>
<Trans>This should <a href="#">pass</a></Trans>
Participation
- I am willing to submit a pull request to implement this change.