Skip to content

Commit 650bbca

Browse files
authored
extend enforce-css-module-identifier-casing to support destructured imports (#265)
1 parent 83f29f3 commit 650bbca

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

src/rules/__tests__/enforce-css-module-identifier-casing.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ ruleTester.run('enforce-css-module-identifier-casing', rule, {
1919
'import classes from "a.module.css"; function Foo() { return <Box className={`${classes.Foo}`}/> }',
2020
'import classes from "a.module.css"; function Foo() { return <Box className={`${classes["Foo"]}`}/> }',
2121
'import classes from "a.module.css"; let x = "Foo"; function Foo() { return <Box className={`${classes[x]}`}/> }',
22+
'import {Foo} from "a.module.css"; function Bar() { return <Box className={Foo}/> }',
2223
],
2324
invalid: [
2425
{
@@ -30,6 +31,15 @@ ruleTester.run('enforce-css-module-identifier-casing', rule, {
3031
},
3132
],
3233
},
34+
{
35+
code: 'import {foo} from "a.module.css"; function Bar() { return <Box className={foo}/> }',
36+
errors: [
37+
{
38+
messageId: 'pascal',
39+
data: {name: 'foo'},
40+
},
41+
],
42+
},
3343
{
3444
code: 'import classes from "a.module.css"; function Foo() { return <Box className={clsx(classes.foo)}/> }',
3545
errors: [

src/rules/enforce-css-module-identifier-casing.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@ module.exports = {
2424
create(context) {
2525
const casing = context.options[0]?.casing || 'pascal'
2626
return {
27+
['JSXAttribute[name.name="className"] JSXExpressionContainer>Identifier']: function (node) {
28+
if (!identifierIsCSSModuleBinding(node, context)) return
29+
if (!casingMatches(node.name || '', casing)) {
30+
context.report({
31+
node,
32+
messageId: casing,
33+
data: {name: node.name},
34+
})
35+
}
36+
},
2737
['JSXAttribute[name.name="className"] JSXExpressionContainer MemberExpression[object.type="Identifier"]']:
2838
function (node) {
2939
if (!identifierIsCSSModuleBinding(node.object, context)) return
@@ -44,8 +54,8 @@ module.exports = {
4454
})
4555
}
4656
} else if (node.computed) {
47-
const ref = context
48-
.getScope()
57+
const ref = context.sourceCode
58+
.getScope(node)
4959
.references.find(reference => reference.identifier.name === node.property.name)
5060
const def = ref.resolved?.defs?.[0]
5161
if (def?.node?.init?.type === 'Literal') {

src/utils/css-modules.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ function importBindingIsFromCSSModuleImport(node) {
44

55
function identifierIsCSSModuleBinding(node, context) {
66
if (node.type !== 'Identifier') return false
7-
const ref = context.getScope().references.find(reference => reference.identifier.name === node.name)
8-
if (ref.resolved?.defs?.some(importBindingIsFromCSSModuleImport)) {
7+
const ref = context.sourceCode.getScope(node).references.find(reference => reference.identifier.name === node.name)
8+
if (ref && ref.resolved?.defs?.some(importBindingIsFromCSSModuleImport)) {
99
return true
1010
}
1111
return false

0 commit comments

Comments
 (0)