jsx-uses-vars.js 1.5 KB

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