Skip to content

Commit 7438822

Browse files
authored
Merge pull request #58 from cssinjs/feature/fix-classname
Fix #50, escape Components name
2 parents 4a6abbb + a91b11a commit 7438822

4 files changed

Lines changed: 36 additions & 3 deletions

File tree

src/tests/__snapshots__/functional.spec.jsx.snap

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3+
exports[`functional tests Compose React Components should escape name 1`] = `
4+
".\\\\(Comp\\\\.name\\\\)-1-id {
5+
color: red;
6+
}"
7+
`;
8+
39
exports[`functional tests Compose React Components should pass props 1`] = `
410
<Component>
511
<StyledElement

src/tests/functional.spec.jsx

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import Observable from 'zen-observable'
44
import Enzyme, {mount} from 'enzyme'
55
import Adapter from 'enzyme-adapter-react-16'
66

7+
import escapeClassName from '../utils/escapeClassName'
8+
79
import {
810
getCss,
911
removeWhitespace
@@ -25,8 +27,8 @@ const mockNameGenerators = () => {
2527
const generateTagName = require('../utils/generateTagName').default
2628
const createGenerateClassName = require('jss/lib/utils/createGenerateClassName').default
2729

28-
// $FlowIgnore
29-
generateTagName.mockImplementation((tagName: string) => `${tagName}-${++styledCounter}`)
30+
// $FlowIgnore there is now mockImplementation in declaration
31+
generateTagName.mockImplementation((tagName: string) => `${escapeClassName(tagName)}-${++styledCounter}`)
3032
createGenerateClassName.mockImplementation(() => rule => `${rule.key}-id`)
3133
}
3234

@@ -188,6 +190,26 @@ describe('functional tests', () => {
188190
assertSheet(styled.sheet)
189191
})
190192

193+
it('should escape name', () => {
194+
const Comp = ({className}: {className: string}) => (
195+
<div className={className}>Container</div>
196+
)
197+
198+
Comp.displayName = '(Comp.name)'
199+
200+
const Container = styled(Comp)({
201+
color: 'red',
202+
})
203+
204+
const wrapper = mount(<Container />)
205+
const {sheet} = styled
206+
207+
expect(sheet.rules.index[0].selectorText).toBe('.\\(Comp\\.name\\)-1-id')
208+
assertSheet(sheet)
209+
210+
wrapper.unmount()
211+
})
212+
191213
it('should use .name', () => {
192214
const StyledTest = styled(props => <h1 {...props}>test</h1>)({
193215
padding: 10,

src/utils/escapeClassName.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const re = /([.()])/g
2+
3+
export default (className: string) => className.replace(re, '\\$&')

src/utils/generateTagName.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import escapeClassName from './escapeClassName'
2+
13
let tagNameCounter = 0
24

3-
export default (tagName: string) => `${tagName}-${++tagNameCounter}`
5+
export default (tagName: string) => `${escapeClassName(tagName)}-${++tagNameCounter}`

0 commit comments

Comments
 (0)