Skip to content

Commit 019cd81

Browse files
committed
allow to pass params to decorator
1 parent 011263f commit 019cd81

File tree

9 files changed

+93
-98
lines changed

9 files changed

+93
-98
lines changed

Compiler.coffee

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
React = require 'react'
22
_ = require 'underscore'
33

4-
5-
defaultElementDelimeter = '_'
6-
defaultModifierDelimeter = '--'
4+
defaultConfig =
5+
elementDelimeter: '_'
6+
modifierDelimeter: '--'
7+
isStrict: true
78

89

910
class Compiler
1011
constructor: (config={}) ->
11-
@config = _.defaults config,
12-
isStrict: true
13-
elementDelimeter: defaultElementDelimeter
14-
modifierDelimeter: defaultModifierDelimeter
12+
@config = _.defaults(config, defaultConfig)
1513

1614
setDelimeters: (elementDelimeter, modifierDelimeter) ->
1715
@config =
@@ -84,4 +82,6 @@ class Compiler
8482
@config.isStrict = isStrict
8583

8684

87-
module.exports = new Compiler
85+
module.exports = Compiler
86+
module.exports.setDefaults = (config) ->
87+
_.extend(defaultConfig, config)

Decorator.coffee

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,27 @@
1-
compiler = require './Compiler.coffee'
1+
Compiler = require './Compiler.coffee'
22

33
getDisplayName = (WrappedComponent) ->
44
WrappedComponent.displayName or WrappedComponent.name or 'Component'
55

6-
module.exports = (WrappedComponent) ->
7-
class ClassNames extends WrappedComponent
8-
@displayName = "ClassNames(#{getDisplayName(WrappedComponent)})"
6+
module.exports = (config) ->
7+
decorator = (WrappedComponent) ->
8+
class ClassNames extends WrappedComponent
9+
@displayName = "ClassNames(#{getDisplayName(WrappedComponent)})"
910

10-
render: ->
11-
if WrappedComponent::render
12-
compiler.traverse(super())
13-
else if @_render
14-
compiler.traverse @_render()
15-
else if window.error
16-
console.error 'Warning: bluecore-classnames requires _render
17-
method to be defined'
11+
render: ->
12+
if WrappedComponent::render
13+
compiler.traverse(super())
14+
else if @_render
15+
compiler.traverse @_render()
16+
else if window.error
17+
console.error 'Warning: bluecore-classnames requires _render
18+
method to be defined'
19+
20+
return ClassNames
21+
22+
if typeof config is 'function'
23+
compiler = new Compiler()
24+
return decorator(config)
25+
else
26+
compiler = new Compiler(config)
27+
return decorator

README.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class MyComponent extends React.Component
1414
super(props);
1515
this.state = {hovered: true};
1616
}
17-
17+
1818
render() {
1919
return (
2020
<div className={cx('base')}>
@@ -52,13 +52,13 @@ class MyComponent extends ClassNames React.Component
5252
constructor: (props) ->
5353
super props
5454
@state = hovered: true
55-
55+
5656
_render: ->
5757
div className: cx('base'),
5858
div className: cx('inner'),
5959
div className: cx('first', ['active'])
6060
div className: cx('second', hovered: @state.hovered)
61-
61+
6262
module.exports = MyComponent
6363

6464
```
@@ -82,17 +82,21 @@ modifiers: ?<[String] || Object>, where object key is modifier name
8282
cx(element: <String>, modifiers: ?<Array, Object>)
8383
```
8484

85-
Also you can set delimeters:
85+
Also you can set default values for compiler:
8686

8787
```js
88-
import {compiler} from 'bluecore-classnames';
89-
compiler.setDelimeters('__', '_');
88+
import {Compiler} from 'bluecore-classnames';
89+
Compiler.setDefaults({
90+
isStrict: false,
91+
elementDelimeter: '-',
92+
modifierDelimeter: '__'
93+
});
9094
```
9195

9296
If decorator found `className`s with `<string>` type it treats them as usual classNames.
9397
```js
94-
import {compiler} from 'bluecore-classnames';
95-
compiler.setStrict(false);
98+
import {Compiler} from 'bluecore-classnames';
99+
Compiler.setDefaults({isStrict: false});
96100
```
97101
will make compiler to treat string classNames as element,
98102
so code below will work too:

__tests__/ClassNames-test.coffee

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
jest.autoMockOff()
22

3+
jest = jest
4+
5+
{describe, it, expect} = global
6+
7+
{createFactory, createElement} = require 'react'
38
{findDOMNode} = require 'react-dom'
49
{renderIntoDocument} = require 'react-addons-test-utils'
510
_ = require 'underscore'
611

7-
compiler = require '../Compiler.coffee'
8-
StrictTestComponent = require '../examples/StrictTestComponent.coffee'
9-
TestComponent = require '../examples/TestComponent.coffee'
10-
DecoratedComponent = require '../examples/DecoratedTestComponent.coffee'
12+
Compiler = require '../Compiler.coffee'
13+
Decorator = require '../Decorator.coffee'
14+
{
15+
StrictTestComponent,
16+
ChildStrictTestComponent
17+
} = require '../examples/StrictTestComponent.coffee'
18+
{
19+
TestComponent,
20+
ChildTestComponent
21+
} = require '../examples/TestComponent.coffee'
1122

1223
classTree =
1324
className: 'my-base-class'
@@ -36,6 +47,8 @@ classTree =
3647
strictComponent = null
3748
component = null
3849

50+
render = (Component, child) ->
51+
return findDOMNode(renderIntoDocument(createFactory(Component)({}, child)))
3952

4053
checkClasses = (element, classConfig, parentClass) ->
4154
expect(element).toBeTruthy()
@@ -74,21 +87,32 @@ checkClasses = (element, classConfig, parentClass) ->
7487

7588
describe 'ClassNames', ->
7689
it 'should render strict component into DOM', ->
77-
strictComponent = findDOMNode renderIntoDocument StrictTestComponent()
90+
strictComponent = render(
91+
Decorator(StrictTestComponent),
92+
createElement(Decorator(ChildStrictTestComponent)))
7893
expect(strictComponent).toBeTruthy()
7994

8095
it 'should build classes', ->
8196
checkClasses strictComponent, classTree, ''
8297

8398
it 'should render component into DOM', ->
84-
compiler.setStrict false
85-
component = findDOMNode renderIntoDocument TestComponent()
99+
Compiler.setDefaults(isStrict: false)
100+
component = render(
101+
Decorator(TestComponent),
102+
createElement(Decorator(ChildTestComponent)))
86103
expect(component).toBeTruthy()
87104

88105
it 'should build classes in forgiving mode', ->
89106
checkClasses component, classTree, ''
90107

91-
it 'should render decorated class properly', ->
92-
component = findDOMNode renderIntoDocument DecoratedComponent()
93-
expect(component).toBeDefined()
94-
checkClasses(component, classTree, '')
108+
it 'should wrap component with config', ->
109+
Compiler.setDefaults(isStrict: true)
110+
111+
component = render(
112+
Decorator(isStrict: false)(TestComponent),
113+
createElement(Decorator(isStrict: false)(ChildTestComponent))
114+
)
115+
expect(component).toBeTruthy()
116+
117+
it 'should render wrapped component properly', ->
118+
checkClasses component, classTree, ''

examples/DecoratedTestComponent.coffee

Lines changed: 0 additions & 39 deletions
This file was deleted.

examples/StrictTestComponent.coffee

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,18 @@ React = require 'react'
33

44
{div} = React.DOM
55

6-
ClassNamesDecorator = require '../Decorator.coffee'
76
cx = require '../ClassNames.coffee'
87

98

10-
class ChildStrictTestComponent extends ClassNamesDecorator Component
11-
_render: ->
9+
class ChildStrictTestComponent extends Component
10+
render: ->
1211
div className: cx('base-inner'),
1312
div className: cx('inner'),
1413
'Inner'
1514

16-
ChildStrictTestComponent = React.createFactory ChildStrictTestComponent
1715

18-
19-
class StrictTestComponent extends ClassNamesDecorator Component
20-
_render: ->
16+
class StrictTestComponent extends Component
17+
render: ->
2118
div
2219
className:
2320
className: 'my-base-class'
@@ -31,9 +28,10 @@ class StrictTestComponent extends ClassNamesDecorator Component
3128
active: true
3229
hovered: false
3330
),
34-
ChildStrictTestComponent {}
31+
@props.children
3532
div className: cx('footer'),
3633
'Footer'
3734

3835

39-
module.exports = React.createFactory StrictTestComponent
36+
module.exports.StrictTestComponent = StrictTestComponent
37+
module.exports.ChildStrictTestComponent = ChildStrictTestComponent

examples/TestComponent.coffee

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,18 @@ React = require 'react'
33

44
{div} = React.DOM
55

6-
ClassNamesDecorator = require '../Decorator.coffee'
76
cx = require '../ClassNames.coffee'
87

98

10-
class ChildTestComponent extends ClassNamesDecorator Component
11-
_render: ->
9+
class ChildTestComponent extends Component
10+
render: ->
1211
div className: 'base-inner',
1312
div className: 'inner',
1413
'Inner'
1514

16-
ChildTestComponent = React.createFactory ChildTestComponent
1715

18-
19-
class TestComponent extends ClassNamesDecorator Component
20-
_render: ->
16+
class TestComponent extends Component
17+
render: ->
2118
div
2219
className:
2320
className: 'my-base-class'
@@ -31,9 +28,10 @@ class TestComponent extends ClassNamesDecorator Component
3128
active: true
3229
hovered: false
3330
),
34-
ChildTestComponent {}
31+
@props.children
3532
div className: 'footer',
3633
'Footer'
3734

3835

39-
module.exports = React.createFactory TestComponent
36+
module.exports.TestComponent = TestComponent
37+
module.exports.ChildTestComponent = ChildTestComponent

index.coffee

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
module.exports =
22
cx: require './ClassNames.coffee'
33
ClassNames: require './Decorator.coffee'
4-
compiler: require './Compiler.coffee'
4+
Compiler: require './Compiler.coffee'

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bluecore-classnames",
3-
"version": "0.1.5",
3+
"version": "0.2.0",
44
"description": "Automatic class builder for React components",
55
"keywords": [
66
"react",

0 commit comments

Comments
 (0)