Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

71 rader
1.5 KiB

  1. /**
  2. * @fileoverview Enforce no duplicate props
  3. * @author Markus Ånöstam
  4. */
  5. 'use strict';
  6. const has = require('has');
  7. const docsUrl = require('../util/docsUrl');
  8. // ------------------------------------------------------------------------------
  9. // Rule Definition
  10. // ------------------------------------------------------------------------------
  11. module.exports = {
  12. meta: {
  13. docs: {
  14. description: 'Enforce no duplicate props',
  15. category: 'Possible Errors',
  16. recommended: true,
  17. url: docsUrl('jsx-no-duplicate-props')
  18. },
  19. schema: [{
  20. type: 'object',
  21. properties: {
  22. ignoreCase: {
  23. type: 'boolean'
  24. }
  25. },
  26. additionalProperties: false
  27. }]
  28. },
  29. create: function (context) {
  30. const configuration = context.options[0] || {};
  31. const ignoreCase = configuration.ignoreCase || false;
  32. return {
  33. JSXOpeningElement: function (node) {
  34. const props = {};
  35. node.attributes.forEach(decl => {
  36. if (decl.type === 'JSXSpreadAttribute') {
  37. return;
  38. }
  39. let name = decl.name.name;
  40. if (typeof name !== 'string') {
  41. return;
  42. }
  43. if (ignoreCase) {
  44. name = name.toLowerCase();
  45. }
  46. if (has(props, name)) {
  47. context.report({
  48. node: decl,
  49. message: 'No duplicate props allowed'
  50. });
  51. } else {
  52. props[name] = 1;
  53. }
  54. });
  55. }
  56. };
  57. }
  58. };