Skip to content

Commit 5ed3bd4

Browse files
committed
simplify class sink when emitting strings
1 parent 9f9ac60 commit 5ed3bd4

File tree

3 files changed

+75
-52
lines changed

3 files changed

+75
-52
lines changed

src/parser/sink-map.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { Sink } from "../types/sink";
44
import { AppendHTMLSink } from "../sinks/append-html-sink";
55
import { BlurSink } from "../sinks/blur-sink";
66
import { CheckedSink } from "../sinks/checked-sink";
7-
import { ClassName, ClassObjectSink, ToggleClass } from "../sinks/class-sink";
7+
import { ClassObjectSink } from "../sinks/class-sink";
88
import { ClosedSink } from "../sinks/closed-sink";
99
import { DatasetSink, DatasetObjectSink } from "../sinks/dataset-sink";
1010
import { DisabledSink } from "../sinks/disabled-sink";

src/sinks/class-sink.test.ts

Lines changed: 73 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,64 +3,89 @@ import { ClassObjectSink, ToggleClassSink } from './class-sink';
33

44
describe('Class Sink', () => {
55

6-
describe('Given a class object', () => {
7-
8-
it('sets classes for truthy attributes on sink', () => {
9-
const el = MockElement();
10-
const sink = ClassObjectSink(<HTMLElement>el);
11-
12-
sink({
13-
class1: true,
14-
class2: 1,
15-
class3: 'yes!',
16-
});
17-
expect(el.className).toContain('class1');
18-
expect(el.className).toContain('class2');
19-
expect(el.className).toContain('class3');
20-
});
21-
22-
it('clears classes for falsy attributes on sink', () => {
23-
const el = MockElement({ className: 'class1 class2 class3' });
24-
const sink = ClassObjectSink(<HTMLElement>el);
25-
expect(el.className).toContain('class1');
26-
expect(el.className).toContain('class2');
27-
expect(el.className).toContain('class3');
28-
29-
sink({
30-
class1: false,
31-
class2: 0,
32-
class3: '',
33-
});
34-
expect(el.className).not.toContain('class1');
35-
expect(el.className).not.toContain('class2');
36-
expect(el.className).not.toContain('class3');
37-
});
38-
39-
});
6+
describe('Given a class string', () => {
7+
8+
it('sets className on sink', () => {
9+
const el = MockElement({ className: 'class1 class2 class3' });
10+
const sink = ClassObjectSink(<HTMLElement>el);
11+
12+
sink('class1');
13+
expect(el.className).toEqual('class1');
14+
});
15+
16+
it('clears classes for empty strings on sink', () => {
17+
const el = MockElement({ className: 'class1 class2 class3' });
18+
const sink = ClassObjectSink(<HTMLElement>el);
19+
20+
sink({
21+
class1: false,
22+
class2: 0,
23+
class3: '',
24+
});
25+
expect(el.className).toEqual('');
26+
});
27+
28+
});
29+
30+
31+
describe('Given a class object', () => {
32+
33+
it('sets classes for truthy attributes on sink', () => {
34+
const el = MockElement();
35+
const sink = ClassObjectSink(<HTMLElement>el);
36+
37+
sink({
38+
class1: true,
39+
class2: 1,
40+
class3: 'yes!',
41+
});
42+
expect(el.className).toContain('class1');
43+
expect(el.className).toContain('class2');
44+
expect(el.className).toContain('class3');
45+
});
46+
47+
it('clears classes for falsy attributes on sink', () => {
48+
const el = MockElement({ className: 'class1 class2 class3' });
49+
const sink = ClassObjectSink(<HTMLElement>el);
50+
expect(el.className).toContain('class1');
51+
expect(el.className).toContain('class2');
52+
expect(el.className).toContain('class3');
53+
54+
sink({
55+
class1: false,
56+
class2: 0,
57+
class3: '',
58+
});
59+
expect(el.className).not.toContain('class1');
60+
expect(el.className).not.toContain('class2');
61+
expect(el.className).not.toContain('class3');
62+
});
63+
64+
});
4065

4166
});
4267

4368
describe('Class Toggle Sink', () => {
4469

45-
describe('Given a class object', () => {
70+
describe('Given a class object', () => {
4671

47-
it('sets classes for truthy value on sink', () => {
48-
const el = MockElement();
49-
const sink = ToggleClassSink('class1')(<HTMLElement>el);
72+
it('sets classes for truthy value on sink', () => {
73+
const el = MockElement();
74+
const sink = ToggleClassSink('class1')(<HTMLElement>el);
5075

51-
sink(true);
52-
expect(el.className).toContain('class1');
53-
});
76+
sink(true);
77+
expect(el.className).toContain('class1');
78+
});
5479

55-
it('clears classes for falsy values on sink', () => {
56-
const el = MockElement({ className: 'class1' });
57-
const sink = ToggleClassSink('class1')(<HTMLElement>el);
80+
it('clears classes for falsy values on sink', () => {
81+
const el = MockElement({ className: 'class1' });
82+
const sink = ToggleClassSink('class1')(<HTMLElement>el);
5883

59-
sink(false);
60-
expect(el.className).not.toContain('class1');
61-
});
84+
sink(false);
85+
expect(el.className).not.toContain('class1');
86+
});
6287

63-
});
88+
});
6489

6590
});
6691

src/sinks/class-sink.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ export const ClassObjectSink: Sink<Element> = (node: Element) => {
3131

3232
return (name: ClassName | ClassRecord | ((ClassName | ClassRecord)[])) => {
3333
typeof name == 'string'
34-
? name.includes(' ')
35-
? set(name)
36-
: add(name)
34+
? set(name)
3735
// FIXME: is it safe to assume it's an object, at this point?
3836
: (<(ClassName | ClassRecord)[]>[]).concat(name).forEach(obj => Object.entries(obj)
3937
// TODO: support 3-state with toggle

0 commit comments

Comments
 (0)