Skip to content

Commit c22027c

Browse files
authored
feat: add eventEmitter (#1693)
Adds an event emitter for hooking into method/property creation
1 parent 2a3ecff commit c22027c

File tree

8 files changed

+143
-21
lines changed

8 files changed

+143
-21
lines changed

eslint.config.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import jsdoc from "eslint-plugin-jsdoc";
22
import eslintjs from "@eslint/js";
3+
import globals from "globals";
34

45
const {configs: eslintConfigs} = eslintjs;
56

@@ -8,9 +9,9 @@ export default [
89
eslintConfigs["recommended"],
910
{
1011
languageOptions: {
11-
// if we ever use more globals than this, pull in the `globals` package
1212
globals: {
13-
console: false
13+
console: false,
14+
...globals.browser, // EventTarget, Event
1415
}
1516
},
1617
rules: {

lib/chai/utils/addMethod.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
import {addLengthGuard} from './addLengthGuard.js';
8+
import {PluginEvent, events} from './events.js';
89
import {flag} from './flag.js';
910
import {proxify} from './proxify.js';
1011
import {transferFlags} from './transferFlags.js';
@@ -63,4 +64,6 @@ export function addMethod(ctx, name, method) {
6364

6465
addLengthGuard(methodWrapper, name, false);
6566
ctx[name] = proxify(methodWrapper, name);
67+
68+
events.dispatchEvent(new PluginEvent('addMethod', name, method));
6669
}

lib/chai/utils/addProperty.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
import {Assertion} from '../assertion.js';
8+
import {PluginEvent, events} from './events.js';
89
import {flag} from './flag.js';
910
import {isProxyEnabled} from './isProxyEnabled.js';
1011
import {transferFlags} from './transferFlags.js';
@@ -67,4 +68,6 @@ export function addProperty(ctx, name, getter) {
6768
},
6869
configurable: true
6970
});
71+
72+
events.dispatchEvent(new PluginEvent('addProperty', name, getter));
7073
}

lib/chai/utils/events.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*!
2+
* Chai - events utility
3+
* Copyright(c) 2011-2016 Jake Luer <jake@alogicalparadox.com>
4+
* MIT Licensed
5+
*/
6+
7+
// Global EventTarget instance
8+
export const events = new EventTarget();
9+
10+
export class PluginEvent extends Event {
11+
constructor(type, name, fn) {
12+
super(type);
13+
this.name = String(name);
14+
this.fn = fn;
15+
}
16+
}

lib/chai/utils/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ export {isNaN} from './isNaN.js';
9696
// getOperator method
9797
export {getOperator} from './getOperator.js';
9898

99+
// events EventTarget
100+
export {events} from './events.js';
101+
99102
/**
100103
* Determines if an object is a `RegExp`
101104
* This is used since `instanceof` will not work in virtual contexts

package-lock.json

Lines changed: 64 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
"esbuild": "^0.25.9",
6262
"eslint": "^8.56.0",
6363
"eslint-plugin-jsdoc": "^48.0.4",
64+
"globals": "^16.3.0",
6465
"loupe": "^3.1.0",
6566
"mocha": "^10.2.0",
6667
"pathval": "^2.0.0",

test/utilities.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,4 +1503,54 @@ describe('utilities', function () {
15031503
});
15041504
});
15051505
});
1506+
1507+
describe('eventEmitter', function() {
1508+
var eventHandler = null;
1509+
1510+
beforeEach(function() {
1511+
if (eventHandler) {
1512+
chai.util.events.removeEventListener("addMethod", eventHandler);
1513+
chai.util.events.removeEventListener("addProperty", eventHandler);
1514+
}
1515+
eventHandler = null;
1516+
delete chai.Assertion.prototype.eqqqual;
1517+
delete chai.Assertion.prototype.tea;
1518+
});
1519+
1520+
it('emits addMethod', function () {
1521+
var calledTimes = 0;
1522+
1523+
chai.use(function(_chai, _utils) {
1524+
const eqqqual = function (str) {
1525+
var object = _utils.flag(this, 'object');
1526+
new _chai.Assertion(object).to.be.eql(str);
1527+
}
1528+
chai.util.events.addEventListener("addMethod", eventHandler = function({ name, fn }) {
1529+
if (name === 'eqqqual' && fn === eqqqual)
1530+
calledTimes++;
1531+
});
1532+
_chai.Assertion.addMethod('eqqqual', eqqqual);
1533+
});
1534+
1535+
expect(calledTimes).to.equal(1);
1536+
});
1537+
1538+
it('emits addProperty', function () {
1539+
var calledTimes = 0;
1540+
1541+
chai.use(function(_chai, _utils) {
1542+
const getter = function () {
1543+
return 'chai';
1544+
}
1545+
chai.util.events.addEventListener("addProperty", eventHandler = function({ name, fn }) {
1546+
if (name === 'tea' && fn === getter)
1547+
calledTimes++;
1548+
});
1549+
_chai.Assertion.addProperty('tea', getter);
1550+
1551+
});
1552+
1553+
expect(calledTimes).to.equal(1);
1554+
});
1555+
});
15061556
});

0 commit comments

Comments
 (0)