pragma.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /**
  2. * @fileoverview Utility functions for React pragma configuration
  3. * @author Yannick Croissant
  4. */
  5. 'use strict';
  6. const getSourceCode = require('./eslint').getSourceCode;
  7. const JSX_ANNOTATION_REGEX = /@jsx\s+([^\s]+)/;
  8. // Does not check for reserved keywords or unicode characters
  9. const JS_IDENTIFIER_REGEX = /^[_$a-zA-Z][_$a-zA-Z0-9]*$/;
  10. /**
  11. * @param {Context} context
  12. * @returns {string}
  13. */
  14. function getCreateClassFromContext(context) {
  15. let pragma = 'createReactClass';
  16. // .eslintrc shared settings (https://eslint.org/docs/user-guide/configuring#adding-shared-settings)
  17. if (context.settings.react && context.settings.react.createClass) {
  18. pragma = context.settings.react.createClass;
  19. }
  20. if (!JS_IDENTIFIER_REGEX.test(pragma)) {
  21. throw new Error(`createClass pragma ${pragma} is not a valid function name`);
  22. }
  23. return pragma;
  24. }
  25. /**
  26. * @param {Context} context
  27. * @returns {string}
  28. */
  29. function getFragmentFromContext(context) {
  30. let pragma = 'Fragment';
  31. // .eslintrc shared settings (https://eslint.org/docs/user-guide/configuring#adding-shared-settings)
  32. if (context.settings.react && context.settings.react.fragment) {
  33. pragma = context.settings.react.fragment;
  34. }
  35. if (!JS_IDENTIFIER_REGEX.test(pragma)) {
  36. throw new Error(`Fragment pragma ${pragma} is not a valid identifier`);
  37. }
  38. return pragma;
  39. }
  40. /**
  41. * @param {Context} context
  42. * @returns {string}
  43. */
  44. function getFromContext(context) {
  45. let pragma = 'React';
  46. const sourceCode = getSourceCode(context);
  47. const pragmaNode = sourceCode.getAllComments().find((node) => JSX_ANNOTATION_REGEX.test(node.value));
  48. if (pragmaNode) {
  49. const matches = JSX_ANNOTATION_REGEX.exec(pragmaNode.value);
  50. pragma = matches[1].split('.')[0];
  51. // .eslintrc shared settings (https://eslint.org/docs/user-guide/configuring#adding-shared-settings)
  52. } else if (context.settings.react && context.settings.react.pragma) {
  53. pragma = context.settings.react.pragma;
  54. }
  55. if (!JS_IDENTIFIER_REGEX.test(pragma)) {
  56. console.warn(`React pragma ${pragma} is not a valid identifier`);
  57. return 'React';
  58. }
  59. return pragma;
  60. }
  61. module.exports = {
  62. getCreateClassFromContext,
  63. getFragmentFromContext,
  64. getFromContext,
  65. };