no-namespace.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /**
  2. * @fileoverview Enforce that namespaces are not used in React elements
  3. * @author Yacine Hmito
  4. */
  5. 'use strict';
  6. const elementType = require('jsx-ast-utils/elementType');
  7. const docsUrl = require('../util/docsUrl');
  8. const isCreateElement = require('../util/isCreateElement');
  9. const report = require('../util/report');
  10. // ------------------------------------------------------------------------------
  11. // Rule Definition
  12. // ------------------------------------------------------------------------------
  13. const messages = {
  14. noNamespace: 'React component {{name}} must not be in a namespace, as React does not support them',
  15. };
  16. module.exports = {
  17. meta: {
  18. docs: {
  19. description: 'Enforce that namespaces are not used in React elements',
  20. category: 'Possible Errors',
  21. recommended: false,
  22. url: docsUrl('no-namespace'),
  23. },
  24. messages,
  25. schema: [],
  26. },
  27. create(context) {
  28. return {
  29. CallExpression(node) {
  30. if (isCreateElement(node, context) && node.arguments.length > 0 && node.arguments[0].type === 'Literal') {
  31. const name = node.arguments[0].value;
  32. if (typeof name !== 'string' || name.indexOf(':') === -1) return undefined;
  33. report(context, messages.noNamespace, 'noNamespace', {
  34. node,
  35. data: {
  36. name,
  37. },
  38. });
  39. }
  40. },
  41. JSXOpeningElement(node) {
  42. const name = elementType(node);
  43. if (typeof name !== 'string' || name.indexOf(':') === -1) return undefined;
  44. report(context, messages.noNamespace, 'noNamespace', {
  45. node,
  46. data: {
  47. name,
  48. },
  49. });
  50. },
  51. };
  52. },
  53. };