jsx-uses-vars.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /**
  2. * @fileoverview Prevent variables used in JSX to be marked as unused
  3. * @author Yannick Croissant
  4. */
  5. 'use strict';
  6. const docsUrl = require('../util/docsUrl');
  7. const markVariableAsUsed = require('../util/eslint').markVariableAsUsed;
  8. // ------------------------------------------------------------------------------
  9. // Rule Definition
  10. // ------------------------------------------------------------------------------
  11. const isTagNameRe = /^[a-z]/;
  12. const isTagName = (name) => isTagNameRe.test(name);
  13. /** @type {import('eslint').Rule.RuleModule} */
  14. module.exports = {
  15. // eslint-disable-next-line eslint-plugin/prefer-message-ids -- https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/issues/292
  16. meta: {
  17. docs: {
  18. description: 'Disallow variables used in JSX to be incorrectly marked as unused',
  19. category: 'Best Practices',
  20. recommended: true,
  21. url: docsUrl('jsx-uses-vars'),
  22. },
  23. schema: [],
  24. },
  25. create(context) {
  26. return {
  27. JSXOpeningElement(node) {
  28. let name;
  29. if (node.name.namespace) {
  30. // <Foo:Bar>
  31. return;
  32. }
  33. if (node.name.name) {
  34. // <Foo>
  35. name = node.name.name;
  36. // Exclude lowercase tag names like <div>
  37. if (isTagName(name)) {
  38. return;
  39. }
  40. } else if (node.name.object) {
  41. // <Foo...Bar>
  42. let parent = node.name.object;
  43. while (parent.object) {
  44. parent = parent.object;
  45. }
  46. name = parent.name;
  47. } else {
  48. return;
  49. }
  50. markVariableAsUsed(name, node, context);
  51. },
  52. };
  53. },
  54. };