Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

68 wiersze
1.8 KiB

  1. /**
  2. * @fileoverview Disallow multiple spaces between inline JSX props
  3. * @author Adrian Moennich
  4. */
  5. 'use strict';
  6. const docsUrl = require('../util/docsUrl');
  7. // ------------------------------------------------------------------------------
  8. // Rule Definition
  9. // ------------------------------------------------------------------------------
  10. module.exports = {
  11. meta: {
  12. docs: {
  13. description: 'Disallow multiple spaces between inline JSX props',
  14. category: 'Stylistic Issues',
  15. recommended: false,
  16. url: docsUrl('jsx-props-no-multi-spaces')
  17. },
  18. fixable: 'code',
  19. schema: []
  20. },
  21. create: function (context) {
  22. const sourceCode = context.getSourceCode();
  23. function getPropName(propNode) {
  24. switch (propNode.type) {
  25. case 'JSXSpreadAttribute':
  26. return sourceCode.getText(propNode.argument);
  27. case 'JSXIdentifier':
  28. return propNode.name;
  29. case 'JSXMemberExpression':
  30. return `${getPropName(propNode.object)}.${propNode.property.name}`;
  31. default:
  32. return propNode.name.name;
  33. }
  34. }
  35. function checkSpacing(prev, node) {
  36. if (prev.loc.end.line !== node.loc.end.line) {
  37. return;
  38. }
  39. const between = sourceCode.text.slice(prev.range[1], node.range[0]);
  40. if (between !== ' ') {
  41. context.report({
  42. node: node,
  43. message: `Expected only one space between "${getPropName(prev)}" and "${getPropName(node)}"`,
  44. fix: function(fixer) {
  45. return fixer.replaceTextRange([prev.range[1], node.range[0]], ' ');
  46. }
  47. });
  48. }
  49. }
  50. return {
  51. JSXOpeningElement: function (node) {
  52. node.attributes.reduce((prev, prop) => {
  53. checkSpacing(prev, prop);
  54. return prop;
  55. }, node.name);
  56. }
  57. };
  58. }
  59. };