Skip to content

Commit 8c30e0b

Browse files
committed
Use getJSXOpeningElementName utility
1 parent bdc64e8 commit 8c30e0b

File tree

4 files changed

+29
-13
lines changed

4 files changed

+29
-13
lines changed

src/rules/__tests__/no-system-props.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,16 @@ ruleTester.run('no-system-props', rule, {
166166
data: {propNames: 'width', componentName: 'Foo'}
167167
}
168168
]
169+
},
170+
{
171+
code: `import {Button} from '@primer/react'; <Button.Counter width={200} />`,
172+
output: `import {Button} from '@primer/react'; <Button.Counter sx={{width: 200}} />`,
173+
errors: [
174+
{
175+
messageId: 'noSystemProps',
176+
data: {propNames: 'width', componentName: 'Button.Counter'}
177+
}
178+
]
169179
}
170180
]
171181
})

src/rules/direct-slot-children.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const {isPrimerComponent} = require('../utils/is-primer-component')
2+
const {getJSXOpeningElementName} = require('../utils/get-jsx-opening-element-name')
23
const {last} = require('lodash')
34

45
const slotParentToChildMap = {
@@ -84,12 +85,3 @@ module.exports = {
8485
}
8586
}
8687
}
87-
88-
// Convert JSXOpeningElement name to string
89-
function getJSXOpeningElementName(jsxNode) {
90-
if (jsxNode.name.type === 'JSXIdentifier') {
91-
return jsxNode.name.name
92-
} else if (jsxNode.name.type === 'JSXMemberExpression') {
93-
return `${jsxNode.name.object.name}.${jsxNode.name.property.name}`
94-
}
95-
}

src/rules/no-system-props.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const {isPrimerComponent} = require('../utils/is-primer-component')
2+
const {getJSXOpeningElementName} = require('../utils/get-jsx-opening-element-name')
23
const {pick} = require('@styled-system/props')
34
const {some, last} = require('lodash')
45

@@ -65,7 +66,10 @@ module.exports = {
6566
return {
6667
JSXOpeningElement(jsxNode) {
6768
if (!skipImportCheck && !isPrimerComponent(jsxNode.name, context.getScope(jsxNode))) return
68-
if (excludedComponents.has(jsxNode.name.name)) return
69+
70+
const componentName = getJSXOpeningElementName(jsxNode)
71+
72+
if (excludedComponents.has(componentName)) return
6973

7074
// Create an object mapping from prop name to the AST node for that attribute
7175
const propsByNameObject = jsxNode.attributes.reduce((object, attribute) => {
@@ -80,8 +84,8 @@ module.exports = {
8084
// Create an array of system prop attribute nodes
8185
let systemProps = Object.values(pick(propsByNameObject))
8286

83-
const excludedProps = excludedComponentProps.has(jsxNode.name.name)
84-
? new Set([...alwaysExcludedProps, ...excludedComponentProps.get(jsxNode.name.name)])
87+
const excludedProps = excludedComponentProps.has(componentName)
88+
? new Set([...alwaysExcludedProps, ...excludedComponentProps.get(componentName)])
8589
: alwaysExcludedProps
8690

8791
// Filter out our exceptional props
@@ -94,7 +98,7 @@ module.exports = {
9498
node: jsxNode,
9599
messageId: 'noSystemProps',
96100
data: {
97-
componentName: jsxNode.name.name,
101+
componentName,
98102
propNames: systemProps.map(a => a.name.name).join(', ')
99103
},
100104
fix(fixer) {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/** Convert JSXOpeningElement name to string */
2+
function getJSXOpeningElementName(jsxNode) {
3+
if (jsxNode.name.type === 'JSXIdentifier') {
4+
return jsxNode.name.name
5+
} else if (jsxNode.name.type === 'JSXMemberExpression') {
6+
return `${jsxNode.name.object.name}.${jsxNode.name.property.name}`
7+
}
8+
}
9+
10+
exports.getJSXOpeningElementName = getJSXOpeningElementName

0 commit comments

Comments
 (0)