Skip to content

Commit 188d643

Browse files
authored
fix: generate multi classes with modifiers (#43)
1 parent ce1f3be commit 188d643

File tree

3 files changed

+52
-49
lines changed

3 files changed

+52
-49
lines changed

README.md

+11-11
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,19 @@ b()
3333
//=> 'block'
3434

3535
b({ mod1: true, mod2: false })
36-
//=> 'block--mod1'
36+
//=> 'block block--mod1'
3737

3838
b({ mod1: true, mod2: false, mod3: true })
39-
//=> 'block--mod1 block--mod3'
39+
//=> 'block block--mod1 block--mod3'
4040

4141
b('element')
4242
//=> 'block__element'
4343

4444
b('element', { mod1: true, mod2: false })
45-
//=> 'block__element--mod1'
45+
//=> 'block__element block__element--mod1'
4646

4747
b('element', { mod1: true, mod2: false, mod3: true })
48-
//=> 'block__element--mod1 block__element--mod3'
48+
//=> 'block__element block__element--mod1 block__element--mod3'
4949
```
5050

5151
### `elementDelimiter = '__'`
@@ -63,10 +63,10 @@ b('element')
6363
const b = block('block', { modifierDelimiter: '-' })
6464

6565
b({ mod: true })
66-
//=> 'block-mod'
66+
//=> block 'block-mod'
6767

6868
b('element', { mod: true })
69-
//=> 'block__element-mod'
69+
//=> 'block__element block__element-mod'
7070
```
7171

7272
### `namespace = ''`
@@ -78,7 +78,7 @@ b()
7878
//=> 'ns-block'
7979

8080
b('element', { mod1: true, mod2: true })
81-
//=> 'ns-block__element--mod1 ns-block__element--mod2'
81+
//=> 'ns-block__element ns-block__element--mod1 ns-block__element--mod2'
8282
```
8383

8484
### `namespaceDelimiter = '-'`
@@ -90,7 +90,7 @@ b()
9090
//=> 'ns---block'
9191

9292
b('element', { mod1: true, mod2: true })
93-
//=> 'ns---block__element--mod1 ns---block__element--mod2'
93+
//=> 'ns---block__element ns---block__element--mod1 ns---block__element--mod2'
9494
```
9595

9696
When `namespace` is not given, `namespaceDelimiter` will be ignored.
@@ -102,7 +102,7 @@ b()
102102
//=> 'block'
103103

104104
b('element', { mod1: true, mod2: true })
105-
//=> 'block__element--mod1 block__element--mod2'
105+
//=> 'block__element block__element--mod1 block__element--mod2'
106106
```
107107

108108
### `prefix = ''`
@@ -116,7 +116,7 @@ b()
116116
//=> 'pre---block'
117117

118118
b('element', { mod1: true, mod2: true })
119-
//=> 'pre---block__element--mod1 pre---block__element--mod2'
119+
//=> 'pre---block__element pre---block__element--mod1 pre---block__element--mod2'
120120
```
121121

122122
### `setup()`
@@ -136,7 +136,7 @@ setup({
136136
const b = block('block')
137137

138138
b('element', { mod: true })
139-
//=> 'ns---block_element-mod'
139+
//=> 'ns---block_element ns---block_element-mod'
140140
```
141141

142142
## Change Log

index.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ export default function bem(
7373

7474
return Object.keys(mods)
7575
.filter((mod) => (mods as Modifiers)[mod])
76-
.map((mod) => `${base}${modifierDelimiter}${mod}`)
77-
.join(' ')
76+
.reduce((result, mod) => `${result} ${base}${modifierDelimiter}${mod}`, base)
7877
}
7978
}

test.ts

+40-36
Original file line numberDiff line numberDiff line change
@@ -6,83 +6,83 @@ const testCases = [
66
tested: () => block('block'),
77
expectations: [
88
'block',
9-
'block--mod1',
10-
'block--mod1 block--mod2',
9+
'block block--mod1',
10+
'block block--mod1 block--mod2',
1111
'block__element',
12-
'block__element--mod1',
13-
'block__element--mod1 block__element--mod2',
12+
'block__element block__element--mod1',
13+
'block__element block__element--mod1 block__element--mod2',
1414
],
1515
},
1616
{
1717
description: '`elementDelimiter` option',
1818
tested: () => block('block', { elementDelimiter: '_' }),
1919
expectations: [
2020
'block',
21-
'block--mod1',
22-
'block--mod1 block--mod2',
21+
'block block--mod1',
22+
'block block--mod1 block--mod2',
2323
'block_element',
24-
'block_element--mod1',
25-
'block_element--mod1 block_element--mod2',
24+
'block_element block_element--mod1',
25+
'block_element block_element--mod1 block_element--mod2',
2626
],
2727
},
2828
{
2929
description: '`modifierDelimiter` option',
3030
tested: () => block('block', { modifierDelimiter: '-' }),
3131
expectations: [
3232
'block',
33-
'block-mod1',
34-
'block-mod1 block-mod2',
33+
'block block-mod1',
34+
'block block-mod1 block-mod2',
3535
'block__element',
36-
'block__element-mod1',
37-
'block__element-mod1 block__element-mod2',
36+
'block__element block__element-mod1',
37+
'block__element block__element-mod1 block__element-mod2',
3838
],
3939
},
4040
{
4141
description: '`namespace` option',
4242
tested: () => block('block', { namespace: 'ns' }),
4343
expectations: [
4444
'ns-block',
45-
'ns-block--mod1',
46-
'ns-block--mod1 ns-block--mod2',
45+
'ns-block ns-block--mod1',
46+
'ns-block ns-block--mod1 ns-block--mod2',
4747
'ns-block__element',
48-
'ns-block__element--mod1',
49-
'ns-block__element--mod1 ns-block__element--mod2',
48+
'ns-block__element ns-block__element--mod1',
49+
'ns-block__element ns-block__element--mod1 ns-block__element--mod2',
5050
],
5151
},
5252
{
5353
description: '`namespaceDelimiter` option',
5454
tested: () => block('block', { namespace: 'ns', namespaceDelimiter: '---' }),
5555
expectations: [
5656
'ns---block',
57-
'ns---block--mod1',
58-
'ns---block--mod1 ns---block--mod2',
57+
'ns---block ns---block--mod1',
58+
'ns---block ns---block--mod1 ns---block--mod2',
5959
'ns---block__element',
60-
'ns---block__element--mod1',
61-
'ns---block__element--mod1 ns---block__element--mod2',
60+
'ns---block__element ns---block__element--mod1',
61+
'ns---block__element ns---block__element--mod1 ns---block__element--mod2',
6262
],
6363
},
6464
{
6565
description: '`namespaceDelimiter` option without `namespace` option',
6666
tested: () => block('block', { namespaceDelimiter: '---' }),
6767
expectations: [
6868
'block',
69-
'block--mod1',
70-
'block--mod1 block--mod2',
69+
'block block--mod1',
70+
'block block--mod1 block--mod2',
7171
'block__element',
72-
'block__element--mod1',
73-
'block__element--mod1 block__element--mod2',
72+
'block__element block__element--mod1',
73+
'block__element block__element--mod1 block__element--mod2',
7474
],
7575
},
7676
{
7777
description: '`prefix` option',
7878
tested: () => block('block', { prefix: 'pre---' }),
7979
expectations: [
8080
'pre---block',
81-
'pre---block--mod1',
82-
'pre---block--mod1 pre---block--mod2',
81+
'pre---block pre---block--mod1',
82+
'pre---block pre---block--mod1 pre---block--mod2',
8383
'pre---block__element',
84-
'pre---block__element--mod1',
85-
'pre---block__element--mod1 pre---block__element--mod2',
84+
'pre---block__element pre---block__element--mod1',
85+
'pre---block__element pre---block__element--mod1 pre---block__element--mod2',
8686
],
8787
},
8888
{
@@ -93,17 +93,16 @@ const testCases = [
9393
modifierDelimiter: '-',
9494
namespace: 'ns',
9595
namespaceDelimiter: '---',
96-
// prefix: 'pre---',
9796
})
9897
return block('block')
9998
},
10099
expectations: [
101100
'ns---block',
102-
'ns---block-mod1',
103-
'ns---block-mod1 ns---block-mod2',
101+
'ns---block ns---block-mod1',
102+
'ns---block ns---block-mod1 ns---block-mod2',
104103
'ns---block_element',
105-
'ns---block_element-mod1',
106-
'ns---block_element-mod1 ns---block_element-mod2',
104+
'ns---block_element ns---block_element-mod1',
105+
'ns---block_element ns---block_element-mod1 ns---block_element-mod2',
107106
],
108107
},
109108
]
@@ -114,6 +113,8 @@ testCases.forEach(({ description, tested, expectations }) => {
114113

115114
it('returns block', () => {
116115
expect(b()).toBe(expectations[0])
116+
expect(b({ mod1: false })).toBe(expectations[0])
117+
expect(b({ mod1: false, mod2: false })).toBe(expectations[0])
117118
})
118119

119120
it('returns block with modifier', () => {
@@ -161,16 +162,19 @@ describe('`setup()` additional case', () => {
161162
namespace: 'n',
162163
namespaceDelimiter: '=',
163164
})
164-
expect(b('element', { mod: true })).toBe('n=block:element/mod')
165+
expect(b('element', { mod: true }))
166+
.toBe('n=block:element n=block:element/mod')
165167
})
166168

167169
it('has no effect when empty options are passed', () => {
168170
setup({})
169-
expect(block('block')('element', { mod: true })).toBe('ns---block_element-mod')
171+
expect(block('block')('element', { mod: true }))
172+
.toBe('ns---block_element ns---block_element-mod')
170173
})
171174

172175
it('`prefix` option [deprecated]', () => {
173176
setup({ prefix: 'pre:', namespace: '' })
174-
expect(block('block')('element', { mod: true })).toBe('pre:block_element-mod')
177+
expect(block('block')('element', { mod: true }))
178+
.toBe('pre:block_element pre:block_element-mod')
175179
})
176180
})

0 commit comments

Comments
 (0)