@bernierllc/event-emitter 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,132 @@
1
+ /*
2
+ Copyright (c) 2025 Bernier LLC
3
+
4
+ This file is licensed to the client under a limited-use license.
5
+ The client may use and modify this code *only within the scope of the project it was delivered for*.
6
+ Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
7
+ */
8
+
9
+ import { EventEmitter } from '../src';
10
+
11
+ describe('EventEmitter - Logger Integration', () => {
12
+ describe('with logger enabled', () => {
13
+ it('should log events when logEvents is true', async () => {
14
+ const emitter = new EventEmitter({ logEvents: true });
15
+
16
+ const handler = jest.fn();
17
+ emitter.on('test', handler);
18
+
19
+ await emitter.emit('test', { data: 'test' });
20
+
21
+ expect(handler).toHaveBeenCalledWith({ data: 'test' });
22
+ });
23
+
24
+ it('should log listener additions', () => {
25
+ const emitter = new EventEmitter({ logEvents: true });
26
+
27
+ const handler = jest.fn();
28
+ const subscription = emitter.on('user.created', handler);
29
+
30
+ expect(subscription).toBeDefined();
31
+ expect(subscription.eventType).toBe('user.created');
32
+ });
33
+
34
+ it('should log listener removals', () => {
35
+ const emitter = new EventEmitter({ logEvents: true });
36
+
37
+ const handler = jest.fn();
38
+ const subscription = emitter.on('test', handler);
39
+
40
+ emitter.off(subscription);
41
+ expect(emitter.listenerCount('test')).toBe(0);
42
+ });
43
+
44
+ it('should log removeAllListeners operations', () => {
45
+ const emitter = new EventEmitter({ logEvents: true });
46
+
47
+ emitter.on('test1', jest.fn());
48
+ emitter.on('test2', jest.fn());
49
+
50
+ emitter.removeAllListeners('test1');
51
+ expect(emitter.listenerCount('test1')).toBe(0);
52
+ expect(emitter.listenerCount('test2')).toBe(1);
53
+ });
54
+
55
+ it('should log removeAllListeners for all events', () => {
56
+ const emitter = new EventEmitter({ logEvents: true });
57
+
58
+ emitter.on('test1', jest.fn());
59
+ emitter.on('test2', jest.fn());
60
+
61
+ emitter.removeAllListeners();
62
+ expect(emitter.listenerCount('test1')).toBe(0);
63
+ expect(emitter.listenerCount('test2')).toBe(0);
64
+ });
65
+
66
+ it('should log handler errors when captureErrors is true', async () => {
67
+ const emitter = new EventEmitter({ logEvents: true, captureErrors: true });
68
+
69
+ const errorHandler = jest.fn(() => {
70
+ throw new Error('Test error');
71
+ });
72
+
73
+ emitter.on('test', errorHandler);
74
+ await emitter.emit('test', {});
75
+
76
+ expect(errorHandler).toHaveBeenCalled();
77
+ });
78
+ });
79
+
80
+ describe('without logger', () => {
81
+ it('should work without logger when logEvents is false', async () => {
82
+ const emitter = new EventEmitter({ logEvents: false });
83
+
84
+ const handler = jest.fn();
85
+ emitter.on('test', handler);
86
+
87
+ await emitter.emit('test', { data: 'test' });
88
+
89
+ expect(handler).toHaveBeenCalledWith({ data: 'test' });
90
+ });
91
+
92
+ it('should not attempt logging when logger unavailable', async () => {
93
+ // Logger is optional, so this should work fine
94
+ const emitter = new EventEmitter({ logEvents: true });
95
+
96
+ const handler = jest.fn();
97
+ emitter.on('test', handler);
98
+
99
+ await expect(emitter.emit('test', {})).resolves.toBeUndefined();
100
+ expect(handler).toHaveBeenCalled();
101
+ });
102
+ });
103
+
104
+ describe('error logging', () => {
105
+ it('should handle errors without logger when captureErrors is true', async () => {
106
+ const emitter = new EventEmitter({ captureErrors: true, logEvents: false });
107
+
108
+ const handler = jest.fn(() => {
109
+ throw new Error('Handler error');
110
+ });
111
+
112
+ emitter.on('test', handler);
113
+
114
+ // Should not throw despite error in handler
115
+ await expect(emitter.emit('test', {})).resolves.toBeUndefined();
116
+ });
117
+
118
+ it('should log errors with subscription ID when available', async () => {
119
+ const emitter = new EventEmitter({ logEvents: true, captureErrors: true });
120
+
121
+ const handler = jest.fn(() => {
122
+ throw new Error('Handler error with ID');
123
+ });
124
+
125
+ const subscription = emitter.on('test', handler);
126
+
127
+ await emitter.emit('test', {});
128
+
129
+ expect(subscription.id).toBeDefined();
130
+ });
131
+ });
132
+ });
@@ -0,0 +1,151 @@
1
+ /*
2
+ Copyright (c) 2025 Bernier LLC
3
+
4
+ This file is licensed to the client under a limited-use license.
5
+ The client may use and modify this code *only within the scope of the project it was delivered for*.
6
+ Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
7
+ */
8
+
9
+ import { EventEmitter } from '../src';
10
+
11
+ describe('EventEmitter - Wildcard Listeners', () => {
12
+ let emitter: EventEmitter;
13
+
14
+ beforeEach(() => {
15
+ emitter = new EventEmitter();
16
+ });
17
+
18
+ describe('wildcard subscription', () => {
19
+ it('should add wildcard listener', () => {
20
+ const handler = jest.fn();
21
+ const subscription = emitter.on('*', handler);
22
+
23
+ expect(subscription.eventType).toBe('*');
24
+ expect(emitter.listenerCount('*')).toBe(1);
25
+ });
26
+
27
+ it('should call wildcard listener for any event', async () => {
28
+ const wildcardHandler = jest.fn();
29
+ emitter.on('*', wildcardHandler);
30
+
31
+ await emitter.emit('event1', { data: 'test1' });
32
+ await emitter.emit('event2', { data: 'test2' });
33
+ await emitter.emit('event3', { data: 'test3' });
34
+
35
+ expect(wildcardHandler).toHaveBeenCalledTimes(3);
36
+ expect(wildcardHandler).toHaveBeenCalledWith({ data: 'test1' });
37
+ expect(wildcardHandler).toHaveBeenCalledWith({ data: 'test2' });
38
+ expect(wildcardHandler).toHaveBeenCalledWith({ data: 'test3' });
39
+ });
40
+
41
+ it('should call both wildcard and specific listeners', async () => {
42
+ const wildcardHandler = jest.fn();
43
+ const specificHandler = jest.fn();
44
+
45
+ emitter.on('*', wildcardHandler);
46
+ emitter.on('test', specificHandler);
47
+
48
+ await emitter.emit('test', { data: 'test' });
49
+
50
+ expect(wildcardHandler).toHaveBeenCalledTimes(1);
51
+ expect(specificHandler).toHaveBeenCalledTimes(1);
52
+ });
53
+
54
+ it('should handle multiple wildcard listeners', async () => {
55
+ const handler1 = jest.fn();
56
+ const handler2 = jest.fn();
57
+ const handler3 = jest.fn();
58
+
59
+ emitter.on('*', handler1);
60
+ emitter.on('*', handler2);
61
+ emitter.on('*', handler3);
62
+
63
+ await emitter.emit('test', { data: 'test' });
64
+
65
+ expect(handler1).toHaveBeenCalledTimes(1);
66
+ expect(handler2).toHaveBeenCalledTimes(1);
67
+ expect(handler3).toHaveBeenCalledTimes(1);
68
+ });
69
+
70
+ it('should remove wildcard listener', () => {
71
+ const handler = jest.fn();
72
+ const subscription = emitter.on('*', handler);
73
+
74
+ expect(emitter.listenerCount('*')).toBe(1);
75
+
76
+ emitter.off(subscription);
77
+ expect(emitter.listenerCount('*')).toBe(0);
78
+ });
79
+
80
+ it('should support wildcard once listeners', async () => {
81
+ const handler = jest.fn();
82
+ emitter.once('*', handler);
83
+
84
+ await emitter.emit('event1', { data: 'test1' });
85
+ await emitter.emit('event2', { data: 'test2' });
86
+
87
+ expect(handler).toHaveBeenCalledTimes(1);
88
+ expect(handler).toHaveBeenCalledWith({ data: 'test1' });
89
+ });
90
+
91
+ it('should remove all wildcard listeners', () => {
92
+ emitter.on('*', jest.fn());
93
+ emitter.on('*', jest.fn());
94
+
95
+ expect(emitter.listenerCount('*')).toBe(2);
96
+
97
+ emitter.removeAllListeners('*');
98
+ expect(emitter.listenerCount('*')).toBe(0);
99
+ });
100
+
101
+ it('should remove wildcard listeners when removing all', () => {
102
+ emitter.on('*', jest.fn());
103
+ emitter.on('test', jest.fn());
104
+
105
+ emitter.removeAllListeners();
106
+
107
+ expect(emitter.listenerCount('*')).toBe(0);
108
+ expect(emitter.listenerCount('test')).toBe(0);
109
+ });
110
+ });
111
+
112
+ describe('wildcard listener edge cases', () => {
113
+ it('should handle wildcard with no other listeners', async () => {
114
+ const handler = jest.fn();
115
+ emitter.on('*', handler);
116
+
117
+ await emitter.emit('test', { data: 'test' });
118
+
119
+ expect(handler).toHaveBeenCalledTimes(1);
120
+ });
121
+
122
+ it('should not affect specific listeners when removing wildcard', async () => {
123
+ const wildcardHandler = jest.fn();
124
+ const specificHandler = jest.fn();
125
+
126
+ const wildcardSub = emitter.on('*', wildcardHandler);
127
+ emitter.on('test', specificHandler);
128
+
129
+ emitter.off(wildcardSub);
130
+
131
+ await emitter.emit('test', { data: 'test' });
132
+
133
+ expect(wildcardHandler).not.toHaveBeenCalled();
134
+ expect(specificHandler).toHaveBeenCalledTimes(1);
135
+ });
136
+
137
+ it('should handle mixed wildcard and specific once listeners', async () => {
138
+ const wildcardHandler = jest.fn();
139
+ const specificHandler = jest.fn();
140
+
141
+ emitter.once('*', wildcardHandler);
142
+ emitter.once('test', specificHandler);
143
+
144
+ await emitter.emit('test', { data: 'test' });
145
+ await emitter.emit('test', { data: 'test2' });
146
+
147
+ expect(wildcardHandler).toHaveBeenCalledTimes(1);
148
+ expect(specificHandler).toHaveBeenCalledTimes(1);
149
+ });
150
+ });
151
+ });
@@ -0,0 +1,77 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <coverage generated="1762580726733" clover="3.2.0">
3
+ <project timestamp="1762580726733" name="All files">
4
+ <metrics statements="65" coveredstatements="65" conditionals="44" coveredconditionals="44" methods="11" coveredmethods="11" elements="120" coveredelements="120" complexity="0" loc="65" ncloc="65" packages="1" files="2" classes="2"/>
5
+ <file name="event-emitter.ts" path="/Users/mattbernier/projects/tools/packages/core/event-emitter/src/event-emitter.ts">
6
+ <metrics statements="62" coveredstatements="62" conditionals="44" coveredconditionals="44" methods="10" coveredmethods="10"/>
7
+ <line num="14" count="5" type="stmt"/>
8
+ <line num="21" count="96" type="stmt"/>
9
+ <line num="22" count="96" type="stmt"/>
10
+ <line num="23" count="96" type="stmt"/>
11
+ <line num="30" count="96" type="stmt"/>
12
+ <line num="32" count="96" type="stmt"/>
13
+ <line num="33" count="96" type="stmt"/>
14
+ <line num="44" count="212" type="cond" truecount="1" falsecount="0"/>
15
+ <line num="45" count="3" type="stmt"/>
16
+ <line num="46" count="3" type="cond" truecount="1" falsecount="0"/>
17
+ <line num="47" count="1" type="stmt"/>
18
+ <line num="51" count="211" type="stmt"/>
19
+ <line num="56" count="2" type="stmt"/>
20
+ <line num="59" count="211" type="cond" truecount="2" falsecount="0"/>
21
+ <line num="60" count="17" type="stmt"/>
22
+ <line num="62" count="194" type="cond" truecount="1" falsecount="0"/>
23
+ <line num="63" count="69" type="stmt"/>
24
+ <line num="65" count="194" type="stmt"/>
25
+ <line num="68" count="211" type="cond" truecount="3" falsecount="0"/>
26
+ <line num="69" count="10" type="stmt"/>
27
+ <line num="72" count="211" type="stmt"/>
28
+ <line num="79" count="9" type="stmt"/>
29
+ <line num="80" count="9" type="stmt"/>
30
+ <line num="81" count="9" type="stmt"/>
31
+ <line num="88" count="19" type="cond" truecount="2" falsecount="0"/>
32
+ <line num="89" count="4" type="stmt"/>
33
+ <line num="91" count="15" type="stmt"/>
34
+ <line num="92" count="15" type="cond" truecount="1" falsecount="0"/>
35
+ <line num="93" count="14" type="stmt"/>
36
+ <line num="95" count="14" type="cond" truecount="1" falsecount="0"/>
37
+ <line num="96" count="12" type="stmt"/>
38
+ <line num="101" count="19" type="cond" truecount="3" falsecount="0"/>
39
+ <line num="102" count="1" type="stmt"/>
40
+ <line num="113" count="56" type="cond" truecount="3" falsecount="0"/>
41
+ <line num="114" count="4" type="stmt"/>
42
+ <line num="118" count="56" type="cond" truecount="2" falsecount="0"/>
43
+ <line num="121" count="56" type="stmt"/>
44
+ <line num="124" count="56" type="stmt"/>
45
+ <line num="125" count="75" type="stmt"/>
46
+ <line num="126" count="75" type="stmt"/>
47
+ <line num="128" count="27" type="cond" truecount="2" falsecount="0"/>
48
+ <line num="129" count="23" type="cond" truecount="1" falsecount="0"/>
49
+ <line num="130" count="23" type="stmt"/>
50
+ <line num="137" count="4" type="stmt"/>
51
+ <line num="141" count="75" type="cond" truecount="1" falsecount="0"/>
52
+ <line num="142" count="8" type="stmt"/>
53
+ <line num="147" count="56" type="stmt"/>
54
+ <line num="154" count="6" type="cond" truecount="2" falsecount="0"/>
55
+ <line num="155" count="3" type="cond" truecount="2" falsecount="0"/>
56
+ <line num="156" count="1" type="stmt"/>
57
+ <line num="158" count="2" type="stmt"/>
58
+ <line num="161" count="3" type="stmt"/>
59
+ <line num="162" count="3" type="stmt"/>
60
+ <line num="165" count="6" type="cond" truecount="3" falsecount="0"/>
61
+ <line num="166" count="2" type="cond" truecount="2" falsecount="0"/>
62
+ <line num="174" count="47" type="cond" truecount="1" falsecount="0"/>
63
+ <line num="175" count="6" type="stmt"/>
64
+ <line num="177" count="41" type="cond" truecount="2" falsecount="0"/>
65
+ <line num="184" count="3" type="stmt"/>
66
+ <line num="185" count="3" type="cond" truecount="1" falsecount="0"/>
67
+ <line num="186" count="1" type="stmt"/>
68
+ <line num="188" count="3" type="stmt"/>
69
+ </file>
70
+ <file name="factory.ts" path="/Users/mattbernier/projects/tools/packages/core/event-emitter/src/factory.ts">
71
+ <metrics statements="3" coveredstatements="3" conditionals="0" coveredconditionals="0" methods="1" coveredmethods="1"/>
72
+ <line num="9" count="5" type="stmt"/>
73
+ <line num="15" count="5" type="stmt"/>
74
+ <line num="16" count="2" type="stmt"/>
75
+ </file>
76
+ </project>
77
+ </coverage>
@@ -0,0 +1,3 @@
1
+ {"/Users/mattbernier/projects/tools/packages/core/event-emitter/src/event-emitter.ts": {"path":"/Users/mattbernier/projects/tools/packages/core/event-emitter/src/event-emitter.ts","statementMap":{"0":{"start":{"line":21,"column":4},"end":{"line":21,"column":31}},"1":{"start":{"line":22,"column":4},"end":{"line":22,"column":39}},"2":{"start":{"line":23,"column":4},"end":{"line":27,"column":6}},"3":{"start":{"line":30,"column":4},"end":{"line":36,"column":5}},"4":{"start":{"line":32,"column":31},"end":{"line":32,"column":60}},"5":{"start":{"line":33,"column":6},"end":{"line":33,"column":53}},"6":{"start":{"line":44,"column":4},"end":{"line":49,"column":5}},"7":{"start":{"line":45,"column":27},"end":{"line":45,"column":56}},"8":{"start":{"line":46,"column":6},"end":{"line":48,"column":7}},"9":{"start":{"line":47,"column":8},"end":{"line":47,"column":110}},"10":{"start":{"line":51,"column":44},"end":{"line":57,"column":6}},"11":{"start":{"line":56,"column":25},"end":{"line":56,"column":47}},"12":{"start":{"line":59,"column":4},"end":{"line":66,"column":5}},"13":{"start":{"line":60,"column":6},"end":{"line":60,"column":47}},"14":{"start":{"line":62,"column":6},"end":{"line":64,"column":7}},"15":{"start":{"line":63,"column":8},"end":{"line":63,"column":49}},"16":{"start":{"line":65,"column":6},"end":{"line":65,"column":55}},"17":{"start":{"line":68,"column":4},"end":{"line":70,"column":5}},"18":{"start":{"line":69,"column":6},"end":{"line":69,"column":96}},"19":{"start":{"line":72,"column":4},"end":{"line":72,"column":24}},"20":{"start":{"line":79,"column":25},"end":{"line":79,"column":52}},"21":{"start":{"line":80,"column":4},"end":{"line":80,"column":29}},"22":{"start":{"line":81,"column":4},"end":{"line":81,"column":24}},"23":{"start":{"line":88,"column":4},"end":{"line":99,"column":5}},"24":{"start":{"line":89,"column":6},"end":{"line":89,"column":50}},"25":{"start":{"line":91,"column":24},"end":{"line":91,"column":66}},"26":{"start":{"line":92,"column":6},"end":{"line":98,"column":7}},"27":{"start":{"line":93,"column":8},"end":{"line":93,"column":39}},"28":{"start":{"line":95,"column":8},"end":{"line":97,"column":9}},"29":{"start":{"line":96,"column":10},"end":{"line":96,"column":56}},"30":{"start":{"line":101,"column":4},"end":{"line":106,"column":5}},"31":{"start":{"line":102,"column":6},"end":{"line":105,"column":9}},"32":{"start":{"line":113,"column":4},"end":{"line":115,"column":5}},"33":{"start":{"line":114,"column":6},"end":{"line":114,"column":62}},"34":{"start":{"line":118,"column":30},"end":{"line":118,"column":72}},"35":{"start":{"line":121,"column":25},"end":{"line":121,"column":74}},"36":{"start":{"line":124,"column":21},"end":{"line":145,"column":6}},"37":{"start":{"line":125,"column":6},"end":{"line":144,"column":7}},"38":{"start":{"line":126,"column":8},"end":{"line":126,"column":41}},"39":{"start":{"line":128,"column":8},"end":{"line":138,"column":9}},"40":{"start":{"line":129,"column":10},"end":{"line":135,"column":11}},"41":{"start":{"line":130,"column":12},"end":{"line":134,"column":15}},"42":{"start":{"line":137,"column":10},"end":{"line":137,"column":22}},"43":{"start":{"line":141,"column":8},"end":{"line":143,"column":9}},"44":{"start":{"line":142,"column":10},"end":{"line":142,"column":33}},"45":{"start":{"line":147,"column":4},"end":{"line":147,"column":32}},"46":{"start":{"line":154,"column":4},"end":{"line":163,"column":5}},"47":{"start":{"line":155,"column":6},"end":{"line":159,"column":7}},"48":{"start":{"line":156,"column":8},"end":{"line":156,"column":39}},"49":{"start":{"line":158,"column":8},"end":{"line":158,"column":41}},"50":{"start":{"line":161,"column":6},"end":{"line":161,"column":29}},"51":{"start":{"line":162,"column":6},"end":{"line":162,"column":37}},"52":{"start":{"line":165,"column":4},"end":{"line":167,"column":5}},"53":{"start":{"line":166,"column":6},"end":{"line":166,"column":80}},"54":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"55":{"start":{"line":175,"column":6},"end":{"line":175,"column":41}},"56":{"start":{"line":177,"column":4},"end":{"line":177,"column":52}},"57":{"start":{"line":184,"column":18},"end":{"line":184,"column":51}},"58":{"start":{"line":185,"column":4},"end":{"line":187,"column":5}},"59":{"start":{"line":186,"column":6},"end":{"line":186,"column":22}},"60":{"start":{"line":188,"column":4},"end":{"line":188,"column":17}},"61":{"start":{"line":14,"column":0},"end":{"line":14,"column":13}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":20,"column":2},"end":{"line":20,"column":14}},"loc":{"start":{"line":20,"column":47},"end":{"line":37,"column":3}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":2},"end":{"line":42,"column":4}},"loc":{"start":{"line":42,"column":57},"end":{"line":73,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":56,"column":19},"end":{"line":56,"column":22}},"loc":{"start":{"line":56,"column":25},"end":{"line":56,"column":47}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":78,"column":2},"end":{"line":78,"column":6}},"loc":{"start":{"line":78,"column":59},"end":{"line":82,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":87,"column":2},"end":{"line":87,"column":5}},"loc":{"start":{"line":87,"column":37},"end":{"line":107,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":112,"column":2},"end":{"line":112,"column":7}},"loc":{"start":{"line":112,"column":48},"end":{"line":148,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":124,"column":38},"end":{"line":124,"column":43}},"loc":{"start":{"line":124,"column":61},"end":{"line":145,"column":5}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":153,"column":2},"end":{"line":153,"column":20}},"loc":{"start":{"line":153,"column":39},"end":{"line":168,"column":3}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":173,"column":2},"end":{"line":173,"column":15}},"loc":{"start":{"line":173,"column":33},"end":{"line":178,"column":3}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":183,"column":2},"end":{"line":183,"column":12}},"loc":{"start":{"line":183,"column":12},"end":{"line":189,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":14},"end":{"line":20,"column":47}},"type":"default-arg","locations":[{"start":{"line":20,"column":45},"end":{"line":20,"column":47}}]},"1":{"loc":{"start":{"line":24,"column":20},"end":{"line":24,"column":45}},"type":"binary-expr","locations":[{"start":{"line":24,"column":20},"end":{"line":24,"column":40}},{"start":{"line":24,"column":44},"end":{"line":24,"column":45}}]},"2":{"loc":{"start":{"line":25,"column":17},"end":{"line":25,"column":43}},"type":"binary-expr","locations":[{"start":{"line":25,"column":17},"end":{"line":25,"column":34}},{"start":{"line":25,"column":38},"end":{"line":25,"column":43}}]},"3":{"loc":{"start":{"line":44,"column":4},"end":{"line":49,"column":5}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":49,"column":5}}]},"4":{"loc":{"start":{"line":46,"column":6},"end":{"line":48,"column":7}},"type":"if","locations":[{"start":{"line":46,"column":6},"end":{"line":48,"column":7}}]},"5":{"loc":{"start":{"line":59,"column":4},"end":{"line":66,"column":5}},"type":"if","locations":[{"start":{"line":59,"column":4},"end":{"line":66,"column":5}},{"start":{"line":61,"column":11},"end":{"line":66,"column":5}}]},"6":{"loc":{"start":{"line":62,"column":6},"end":{"line":64,"column":7}},"type":"if","locations":[{"start":{"line":62,"column":6},"end":{"line":64,"column":7}}]},"7":{"loc":{"start":{"line":68,"column":4},"end":{"line":70,"column":5}},"type":"if","locations":[{"start":{"line":68,"column":4},"end":{"line":70,"column":5}}]},"8":{"loc":{"start":{"line":68,"column":8},"end":{"line":68,"column":45}},"type":"binary-expr","locations":[{"start":{"line":68,"column":8},"end":{"line":68,"column":30}},{"start":{"line":68,"column":34},"end":{"line":68,"column":45}}]},"9":{"loc":{"start":{"line":88,"column":4},"end":{"line":99,"column":5}},"type":"if","locations":[{"start":{"line":88,"column":4},"end":{"line":99,"column":5}},{"start":{"line":90,"column":11},"end":{"line":99,"column":5}}]},"10":{"loc":{"start":{"line":92,"column":6},"end":{"line":98,"column":7}},"type":"if","locations":[{"start":{"line":92,"column":6},"end":{"line":98,"column":7}}]},"11":{"loc":{"start":{"line":95,"column":8},"end":{"line":97,"column":9}},"type":"if","locations":[{"start":{"line":95,"column":8},"end":{"line":97,"column":9}}]},"12":{"loc":{"start":{"line":101,"column":4},"end":{"line":106,"column":5}},"type":"if","locations":[{"start":{"line":101,"column":4},"end":{"line":106,"column":5}}]},"13":{"loc":{"start":{"line":101,"column":8},"end":{"line":101,"column":45}},"type":"binary-expr","locations":[{"start":{"line":101,"column":8},"end":{"line":101,"column":30}},{"start":{"line":101,"column":34},"end":{"line":101,"column":45}}]},"14":{"loc":{"start":{"line":113,"column":4},"end":{"line":115,"column":5}},"type":"if","locations":[{"start":{"line":113,"column":4},"end":{"line":115,"column":5}}]},"15":{"loc":{"start":{"line":113,"column":8},"end":{"line":113,"column":45}},"type":"binary-expr","locations":[{"start":{"line":113,"column":8},"end":{"line":113,"column":30}},{"start":{"line":113,"column":34},"end":{"line":113,"column":45}}]},"16":{"loc":{"start":{"line":118,"column":30},"end":{"line":118,"column":72}},"type":"binary-expr","locations":[{"start":{"line":118,"column":30},"end":{"line":118,"column":59}},{"start":{"line":118,"column":63},"end":{"line":118,"column":72}}]},"17":{"loc":{"start":{"line":128,"column":8},"end":{"line":138,"column":9}},"type":"if","locations":[{"start":{"line":128,"column":8},"end":{"line":138,"column":9}},{"start":{"line":136,"column":15},"end":{"line":138,"column":9}}]},"18":{"loc":{"start":{"line":129,"column":10},"end":{"line":135,"column":11}},"type":"if","locations":[{"start":{"line":129,"column":10},"end":{"line":135,"column":11}}]},"19":{"loc":{"start":{"line":133,"column":21},"end":{"line":133,"column":75}},"type":"cond-expr","locations":[{"start":{"line":133,"column":46},"end":{"line":133,"column":59}},{"start":{"line":133,"column":62},"end":{"line":133,"column":75}}]},"20":{"loc":{"start":{"line":141,"column":8},"end":{"line":143,"column":9}},"type":"if","locations":[{"start":{"line":141,"column":8},"end":{"line":143,"column":9}}]},"21":{"loc":{"start":{"line":154,"column":4},"end":{"line":163,"column":5}},"type":"if","locations":[{"start":{"line":154,"column":4},"end":{"line":163,"column":5}},{"start":{"line":160,"column":11},"end":{"line":163,"column":5}}]},"22":{"loc":{"start":{"line":155,"column":6},"end":{"line":159,"column":7}},"type":"if","locations":[{"start":{"line":155,"column":6},"end":{"line":159,"column":7}},{"start":{"line":157,"column":13},"end":{"line":159,"column":7}}]},"23":{"loc":{"start":{"line":165,"column":4},"end":{"line":167,"column":5}},"type":"if","locations":[{"start":{"line":165,"column":4},"end":{"line":167,"column":5}}]},"24":{"loc":{"start":{"line":165,"column":8},"end":{"line":165,"column":45}},"type":"binary-expr","locations":[{"start":{"line":165,"column":8},"end":{"line":165,"column":30}},{"start":{"line":165,"column":34},"end":{"line":165,"column":45}}]},"25":{"loc":{"start":{"line":166,"column":58},"end":{"line":166,"column":76}},"type":"binary-expr","locations":[{"start":{"line":166,"column":58},"end":{"line":166,"column":67}},{"start":{"line":166,"column":71},"end":{"line":166,"column":76}}]},"26":{"loc":{"start":{"line":174,"column":4},"end":{"line":176,"column":5}},"type":"if","locations":[{"start":{"line":174,"column":4},"end":{"line":176,"column":5}}]},"27":{"loc":{"start":{"line":177,"column":11},"end":{"line":177,"column":51}},"type":"binary-expr","locations":[{"start":{"line":177,"column":11},"end":{"line":177,"column":46}},{"start":{"line":177,"column":50},"end":{"line":177,"column":51}}]},"28":{"loc":{"start":{"line":185,"column":4},"end":{"line":187,"column":5}},"type":"if","locations":[{"start":{"line":185,"column":4},"end":{"line":187,"column":5}}]}},"s":{"0":96,"1":96,"2":96,"3":96,"4":96,"5":96,"6":212,"7":3,"8":3,"9":1,"10":211,"11":2,"12":211,"13":17,"14":194,"15":69,"16":194,"17":211,"18":10,"19":211,"20":9,"21":9,"22":9,"23":19,"24":4,"25":15,"26":15,"27":14,"28":14,"29":12,"30":19,"31":1,"32":56,"33":4,"34":56,"35":56,"36":56,"37":75,"38":75,"39":27,"40":23,"41":23,"42":4,"43":75,"44":8,"45":56,"46":6,"47":3,"48":1,"49":2,"50":3,"51":3,"52":6,"53":2,"54":47,"55":6,"56":41,"57":3,"58":3,"59":1,"60":3,"61":5},"f":{"0":96,"1":212,"2":2,"3":9,"4":19,"5":56,"6":75,"7":6,"8":47,"9":3},"b":{"0":[66],"1":[96,93],"2":[96,87],"3":[3],"4":[1],"5":[17,194],"6":[69],"7":[10],"8":[211,10],"9":[4,15],"10":[14],"11":[12],"12":[1],"13":[19,1],"14":[4],"15":[56,4],"16":[56,13],"17":[23,4],"18":[23],"19":[20,3],"20":[8],"21":[3,3],"22":[1,2],"23":[2],"24":[6,2],"25":[2,1],"26":[6],"27":[41,21],"28":[1]}}
2
+ ,"/Users/mattbernier/projects/tools/packages/core/event-emitter/src/factory.ts": {"path":"/Users/mattbernier/projects/tools/packages/core/event-emitter/src/factory.ts","statementMap":{"0":{"start":{"line":15,"column":0},"end":{"line":15,"column":16}},"1":{"start":{"line":9,"column":0},"end":{"line":9,"column":47}},"2":{"start":{"line":16,"column":2},"end":{"line":16,"column":35}}},"fnMap":{"0":{"name":"createEventEmitter","decl":{"start":{"line":15,"column":16},"end":{"line":15,"column":34}},"loc":{"start":{"line":15,"column":64},"end":{"line":17,"column":1}}}},"branchMap":{},"s":{"0":5,"1":5,"2":2},"f":{"0":2},"b":{}}
3
+ }
@@ -0,0 +1,224 @@
1
+ body, html {
2
+ margin:0; padding: 0;
3
+ height: 100%;
4
+ }
5
+ body {
6
+ font-family: Helvetica Neue, Helvetica, Arial;
7
+ font-size: 14px;
8
+ color:#333;
9
+ }
10
+ .small { font-size: 12px; }
11
+ *, *:after, *:before {
12
+ -webkit-box-sizing:border-box;
13
+ -moz-box-sizing:border-box;
14
+ box-sizing:border-box;
15
+ }
16
+ h1 { font-size: 20px; margin: 0;}
17
+ h2 { font-size: 14px; }
18
+ pre {
19
+ font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
20
+ margin: 0;
21
+ padding: 0;
22
+ -moz-tab-size: 2;
23
+ -o-tab-size: 2;
24
+ tab-size: 2;
25
+ }
26
+ a { color:#0074D9; text-decoration:none; }
27
+ a:hover { text-decoration:underline; }
28
+ .strong { font-weight: bold; }
29
+ .space-top1 { padding: 10px 0 0 0; }
30
+ .pad2y { padding: 20px 0; }
31
+ .pad1y { padding: 10px 0; }
32
+ .pad2x { padding: 0 20px; }
33
+ .pad2 { padding: 20px; }
34
+ .pad1 { padding: 10px; }
35
+ .space-left2 { padding-left:55px; }
36
+ .space-right2 { padding-right:20px; }
37
+ .center { text-align:center; }
38
+ .clearfix { display:block; }
39
+ .clearfix:after {
40
+ content:'';
41
+ display:block;
42
+ height:0;
43
+ clear:both;
44
+ visibility:hidden;
45
+ }
46
+ .fl { float: left; }
47
+ @media only screen and (max-width:640px) {
48
+ .col3 { width:100%; max-width:100%; }
49
+ .hide-mobile { display:none!important; }
50
+ }
51
+
52
+ .quiet {
53
+ color: #7f7f7f;
54
+ color: rgba(0,0,0,0.5);
55
+ }
56
+ .quiet a { opacity: 0.7; }
57
+
58
+ .fraction {
59
+ font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
60
+ font-size: 10px;
61
+ color: #555;
62
+ background: #E8E8E8;
63
+ padding: 4px 5px;
64
+ border-radius: 3px;
65
+ vertical-align: middle;
66
+ }
67
+
68
+ div.path a:link, div.path a:visited { color: #333; }
69
+ table.coverage {
70
+ border-collapse: collapse;
71
+ margin: 10px 0 0 0;
72
+ padding: 0;
73
+ }
74
+
75
+ table.coverage td {
76
+ margin: 0;
77
+ padding: 0;
78
+ vertical-align: top;
79
+ }
80
+ table.coverage td.line-count {
81
+ text-align: right;
82
+ padding: 0 5px 0 20px;
83
+ }
84
+ table.coverage td.line-coverage {
85
+ text-align: right;
86
+ padding-right: 10px;
87
+ min-width:20px;
88
+ }
89
+
90
+ table.coverage td span.cline-any {
91
+ display: inline-block;
92
+ padding: 0 5px;
93
+ width: 100%;
94
+ }
95
+ .missing-if-branch {
96
+ display: inline-block;
97
+ margin-right: 5px;
98
+ border-radius: 3px;
99
+ position: relative;
100
+ padding: 0 4px;
101
+ background: #333;
102
+ color: yellow;
103
+ }
104
+
105
+ .skip-if-branch {
106
+ display: none;
107
+ margin-right: 10px;
108
+ position: relative;
109
+ padding: 0 4px;
110
+ background: #ccc;
111
+ color: white;
112
+ }
113
+ .missing-if-branch .typ, .skip-if-branch .typ {
114
+ color: inherit !important;
115
+ }
116
+ .coverage-summary {
117
+ border-collapse: collapse;
118
+ width: 100%;
119
+ }
120
+ .coverage-summary tr { border-bottom: 1px solid #bbb; }
121
+ .keyline-all { border: 1px solid #ddd; }
122
+ .coverage-summary td, .coverage-summary th { padding: 10px; }
123
+ .coverage-summary tbody { border: 1px solid #bbb; }
124
+ .coverage-summary td { border-right: 1px solid #bbb; }
125
+ .coverage-summary td:last-child { border-right: none; }
126
+ .coverage-summary th {
127
+ text-align: left;
128
+ font-weight: normal;
129
+ white-space: nowrap;
130
+ }
131
+ .coverage-summary th.file { border-right: none !important; }
132
+ .coverage-summary th.pct { }
133
+ .coverage-summary th.pic,
134
+ .coverage-summary th.abs,
135
+ .coverage-summary td.pct,
136
+ .coverage-summary td.abs { text-align: right; }
137
+ .coverage-summary td.file { white-space: nowrap; }
138
+ .coverage-summary td.pic { min-width: 120px !important; }
139
+ .coverage-summary tfoot td { }
140
+
141
+ .coverage-summary .sorter {
142
+ height: 10px;
143
+ width: 7px;
144
+ display: inline-block;
145
+ margin-left: 0.5em;
146
+ background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
147
+ }
148
+ .coverage-summary .sorted .sorter {
149
+ background-position: 0 -20px;
150
+ }
151
+ .coverage-summary .sorted-desc .sorter {
152
+ background-position: 0 -10px;
153
+ }
154
+ .status-line { height: 10px; }
155
+ /* yellow */
156
+ .cbranch-no { background: yellow !important; color: #111; }
157
+ /* dark red */
158
+ .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
159
+ .low .chart { border:1px solid #C21F39 }
160
+ .highlighted,
161
+ .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
162
+ background: #C21F39 !important;
163
+ }
164
+ /* medium red */
165
+ .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
166
+ /* light red */
167
+ .low, .cline-no { background:#FCE1E5 }
168
+ /* light green */
169
+ .high, .cline-yes { background:rgb(230,245,208) }
170
+ /* medium green */
171
+ .cstat-yes { background:rgb(161,215,106) }
172
+ /* dark green */
173
+ .status-line.high, .high .cover-fill { background:rgb(77,146,33) }
174
+ .high .chart { border:1px solid rgb(77,146,33) }
175
+ /* dark yellow (gold) */
176
+ .status-line.medium, .medium .cover-fill { background: #f9cd0b; }
177
+ .medium .chart { border:1px solid #f9cd0b; }
178
+ /* light yellow */
179
+ .medium { background: #fff4c2; }
180
+
181
+ .cstat-skip { background: #ddd; color: #111; }
182
+ .fstat-skip { background: #ddd; color: #111 !important; }
183
+ .cbranch-skip { background: #ddd !important; color: #111; }
184
+
185
+ span.cline-neutral { background: #eaeaea; }
186
+
187
+ .coverage-summary td.empty {
188
+ opacity: .5;
189
+ padding-top: 4px;
190
+ padding-bottom: 4px;
191
+ line-height: 1;
192
+ color: #888;
193
+ }
194
+
195
+ .cover-fill, .cover-empty {
196
+ display:inline-block;
197
+ height: 12px;
198
+ }
199
+ .chart {
200
+ line-height: 0;
201
+ }
202
+ .cover-empty {
203
+ background: white;
204
+ }
205
+ .cover-full {
206
+ border-right: none !important;
207
+ }
208
+ pre.prettyprint {
209
+ border: none !important;
210
+ padding: 0 !important;
211
+ margin: 0 !important;
212
+ }
213
+ .com { color: #999 !important; }
214
+ .ignore-none { color: #999; font-weight: normal; }
215
+
216
+ .wrapper {
217
+ min-height: 100%;
218
+ height: auto !important;
219
+ height: 100%;
220
+ margin: 0 auto -48px;
221
+ }
222
+ .footer, .push {
223
+ height: 48px;
224
+ }