Blame view
node_modules/eslint-plugin-react/lib/rules/jsx-sort-props.js
2.65 KB
c39994410
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
/** * @fileoverview Enforce props alphabetical sorting * @author Ilya Volodin, Yannick Croissant */ 'use strict'; // ------------------------------------------------------------------------------ // Rule Definition // ------------------------------------------------------------------------------ function isCallbackPropName(propName) { return /^on[A-Z]/.test(propName); } module.exports = function(context) { var configuration = context.options[0] || {}; var ignoreCase = configuration.ignoreCase || false; var callbacksLast = configuration.callbacksLast || false; var shorthandFirst = configuration.shorthandFirst || false; return { JSXOpeningElement: function(node) { node.attributes.reduce(function(memo, decl, idx, attrs) { if (decl.type === 'JSXSpreadAttribute') { return attrs[idx + 1]; } var previousPropName = memo.name.name; var currentPropName = decl.name.name; var previousValue = memo.value; var currentValue = decl.value; var previousIsCallback = isCallbackPropName(previousPropName); var currentIsCallback = isCallbackPropName(currentPropName); if (ignoreCase) { previousPropName = previousPropName.toLowerCase(); currentPropName = currentPropName.toLowerCase(); } if (callbacksLast) { if (!previousIsCallback && currentIsCallback) { // Entering the callback prop section return decl; } if (previousIsCallback && !currentIsCallback) { // Encountered a non-callback prop after a callback prop context.report(memo, 'Callbacks must be listed after all other props'); return memo; } } if (shorthandFirst) { if (currentValue && !previousValue) { return decl; } if (!currentValue && previousValue) { context.report(memo, 'Shorthand props must be listed before all other props'); return memo; } } if (currentPropName < previousPropName) { context.report(decl, 'Props should be sorted alphabetically'); return memo; } return decl; }, node.attributes[0]); } }; }; module.exports.schema = [{ type: 'object', properties: { // Whether callbacks (prefixed with "on") should be listed at the very end, // after all other props. callbacksLast: { type: 'boolean' }, // Whether shorthand properties (without a value) should be listed first shorthandFirst: { type: 'boolean' }, ignoreCase: { type: 'boolean' } }, additionalProperties: false }]; |