Skip to content

Commit c0bb930

Browse files
authored
feat: support multiple namespaces (#169)
1 parent da7d631 commit c0bb930

File tree

3 files changed

+46
-8
lines changed

3 files changed

+46
-8
lines changed

README.md

+16-6
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ b("element", { mod1: true, mod2: false, mod3: true });
5757

5858
## Options
5959

60-
| Name | Type | Default |
61-
| ------------------------------------------- | -------- | ------- |
62-
| [`elementDelimiter`](#elementdelimiter) | `string` | `"__"` |
63-
| [`modifierDelimiter`](#modifierdelimiter) | `string` | `"--"` |
64-
| [`namespace`](#namespace) | `string` | `""` |
65-
| [`namespaceDelimiter`](#namespacedelimiter) | `string` | `"-"` |
60+
| Name | Type | Default |
61+
| ------------------------------------------- | -------------------- | ------- |
62+
| [`elementDelimiter`](#elementdelimiter) | `string` | `"__"` |
63+
| [`modifierDelimiter`](#modifierdelimiter) | `string` | `"--"` |
64+
| [`namespace`](#namespace) | `string`, `string[]` | `""` |
65+
| [`namespaceDelimiter`](#namespacedelimiter) | `string` | `"-"` |
6666

6767
### `elementDelimiter`
6868

@@ -97,6 +97,16 @@ b("element", { mod1: true, mod2: true });
9797
//=> "ns-block__element ns-block__element--mod1 ns-block__element--mod2"
9898
```
9999

100+
```ts
101+
const b = block("block", { namespace: ["ns1", "ns2"] });
102+
103+
b();
104+
//=> "ns1-ns2-block"
105+
106+
b("element", { mod1: true, mod2: true });
107+
//=> "ns1-ns2-block__element ns1-ns2-block__element--mod1 ns1-ns2-block__element--mod2"
108+
```
109+
100110
### `namespaceDelimiter`
101111

102112
```ts

index.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,12 @@ export default function bem(block: string, options: PartialOptions = {}) {
4444
...options,
4545
};
4646

47-
const nsDelim = namespace ? namespaceDelimiter : "";
48-
const baseBlock = `${namespace}${nsDelim}${block}`;
47+
const namespaces = ([] as string[])
48+
.concat(namespace)
49+
.filter(Boolean) // compact
50+
.reduce((joined, ns) => joined + `${ns}${namespaceDelimiter}`, "");
51+
52+
const baseBlock = `${namespaces}${block}`;
4953

5054
return function bemBlock(elementOrModifiers?: string | Modifiers, modifiers?: Modifiers) {
5155
let base = baseBlock;

test.ts

+24
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,30 @@ const testCases = [
5050
"ns-block__element ns-block__element--mod1 ns-block__element--mod2",
5151
],
5252
},
53+
{
54+
description: "`namespace` option (array)",
55+
tested: () => block("block", { namespace: ["ns1", "ns2"] }),
56+
expectations: [
57+
"ns1-ns2-block",
58+
"ns1-ns2-block ns1-ns2-block--mod1",
59+
"ns1-ns2-block ns1-ns2-block--mod1 ns1-ns2-block--mod2",
60+
"ns1-ns2-block__element",
61+
"ns1-ns2-block__element ns1-ns2-block__element--mod1",
62+
"ns1-ns2-block__element ns1-ns2-block__element--mod1 ns1-ns2-block__element--mod2",
63+
],
64+
},
65+
{
66+
description: "`namespace` option (empty array)",
67+
tested: () => block("block", { namespace: [] }),
68+
expectations: [
69+
"block",
70+
"block block--mod1",
71+
"block block--mod1 block--mod2",
72+
"block__element",
73+
"block__element block__element--mod1",
74+
"block__element block__element--mod1 block__element--mod2",
75+
],
76+
},
5377
{
5478
description: "`namespaceDelimiter` option",
5579
tested: () => block("block", { namespace: "ns", namespaceDelimiter: "---" }),

0 commit comments

Comments
 (0)