Skip to content

Commit a3f40ce

Browse files
committed
refactor: rename internal types
1 parent 68e1f32 commit a3f40ce

File tree

4 files changed

+83
-29
lines changed

4 files changed

+83
-29
lines changed

listener.ts

+32-17
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ import {
88
toHandler,
99
toKey,
1010
} from "./utils.ts";
11-
import {
12-
_EventListener,
13-
ComparableEventListener,
11+
import type {
12+
ComparableEventListenerLike,
13+
DetailEventListener,
1414
EventListener,
15+
EventListenerLike,
1516
EventListenerRegistry,
1617
EventListeners,
17-
WithListener,
1818
} from "./types.ts";
1919
import { groupBy, insert, isNull } from "./deps.ts";
2020

@@ -25,7 +25,7 @@ import { groupBy, insert, isNull } from "./deps.ts";
2525
*/
2626
export function addAnEventListener(
2727
target: Readonly<EventTarget>,
28-
listener: Readonly<_EventListener & WithListener>,
28+
listener: Readonly<DetailEventListener>,
2929
registry: EventListenerRegistry,
3030
): void {
3131
const { type, signal, callback } = listener;
@@ -65,17 +65,16 @@ export function addAnEventListener(
6565
*/
6666
export function removeAnEventListener(
6767
target: Readonly<EventTarget>,
68-
listener: Readonly<ComparableEventListener>,
68+
listener: Readonly<ComparableEventListenerLike>,
6969
registry: EventListenerRegistry,
7070
): void {
7171
// 1. If eventTarget is a ServiceWorkerGlobalScope object and its service worker’s set of event types to handle contains listener’s type, then report a warning to the console that this might not give the expected results. [SERVICE-WORKERS]
7272

7373
const eventListenerList = registry.get(target);
74-
if (eventListenerList) {
75-
const key = toKey(listener);
7674

75+
if (eventListenerList) {
7776
// 2. Set listener’s removed to true and remove listener from eventTarget’s event listener list.
78-
eventListenerList.delete(key);
77+
eventListenerList.delete(toKey(listener));
7978
}
8079
}
8180

@@ -163,21 +162,31 @@ function handleAddition<R>(
163162
if (!callback) return target.apply(thisArg, argArray);
164163

165164
const { once, ...rest } = flatOptionsMore(options);
166-
const eventListener = new _EventListener({ type, callback, once, ...rest });
167-
const listener = once
165+
const overrodeCallback = once
168166
? new Proxy(toHandler(callback), { apply: handleApply })
169-
: callback;
167+
: undefined;
168+
const listener: DetailEventListener = {
169+
type,
170+
callback,
171+
once,
172+
...rest,
173+
overrodeCallback,
174+
};
170175

171-
addAnEventListener(thisArg, { ...eventListener, listener }, registry);
176+
addAnEventListener(thisArg, listener, registry);
172177

173-
return target.apply(thisArg, [type, listener, options]);
178+
return target.apply(thisArg, [
179+
type,
180+
listener.overrodeCallback ?? listener.callback,
181+
options,
182+
]);
174183

175184
function handleApply(
176185
target: globalThis.EventListener,
177186
thisArg: EventTarget,
178187
argArray: [Event],
179188
): void | Promise<void> {
180-
removeAnEventListener(thisArg, eventListener, registry);
189+
removeAnEventListener(thisArg, listener, registry);
181190

182191
return target.apply(thisArg, argArray);
183192
}
@@ -204,13 +213,16 @@ function handleRemoval(
204213

205214
if (!listenerMap.has(key)) return target.apply(thisArg, argArray);
206215

207-
const { listener } = listenerMap.get(key)!;
216+
const eventListener = listenerMap.get(key)!;
217+
208218
listenerMap.delete(key);
209219

220+
const listener = eventListener.overrodeCallback ?? eventListener.callback;
221+
210222
return target.apply(thisArg, [type, listener, options]);
211223
}
212224

213-
function _listener2Listener(listener: _EventListener): EventListener {
225+
function _listener2Listener(listener: EventListenerLike): EventListener {
214226
const { type, capture: useCapture, passive, once } = listener;
215227

216228
return {
@@ -222,6 +234,9 @@ function _listener2Listener(listener: _EventListener): EventListener {
222234
};
223235
}
224236

237+
/** Setup event listener monitoring.
238+
* Performs a side effect and changes the prototype of `EventTarget`.
239+
*/
225240
export function updateEventListener(): GetEventListeners {
226241
const registry = new WeakMap();
227242
const context = createContext(registry);

types.ts

+40-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,52 @@
11
// Copyright © 2023 Tomoki Miyauchi. All rights reserved. MIT license.
22
// This module is browser compatible.
33

4-
export interface EventListener extends NormalizedAddEventListenerOptions {
4+
export interface EventListener {
55
type: string;
66
listener: EventListenerOrEventListenerObject;
7+
useCapture: boolean;
8+
passive: boolean;
9+
once: boolean;
710
}
811

9-
export interface NormalizedAddEventListenerOptions
10-
extends Required<Omit<AddEventListenerOptions, "signal" | "capture">> {
11-
useCapture: boolean;
12+
export interface ComparableEventListenerLike {
13+
type: string;
14+
callback: EventListenerOrEventListenerObject;
15+
16+
/**
17+
* @default false
18+
*/
19+
capture: boolean;
20+
}
21+
22+
export interface EventListenerLike extends ComparableEventListenerLike {
23+
/**
24+
* @default null
25+
*/
26+
passive: boolean | null;
27+
28+
/**
29+
* @default false
30+
*/
31+
once: boolean;
32+
33+
/**
34+
* @default null
35+
*/
36+
signal: AbortSignal | null;
1237
}
1338

1439
export interface EventListeners {
1540
[k: string]: EventListener[];
1641
}
42+
43+
export interface DetailEventListener extends EventListenerLike {
44+
/** The overrode callback.
45+
* If it exists, use it as an event listener instead of {@linkcode EventListenerLike.callback}.
46+
*/
47+
overrodeCallback?: globalThis.EventListener;
48+
}
49+
50+
export type EventListenerRegistry = WeakMap<object, EventListenerMap>;
51+
52+
export type EventListenerMap = Map<object, DetailEventListener>;

utils.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
// Copyright © 2023 Tomoki Miyauchi. All rights reserved. MIT license.
22
// This module is browser compatible.
33

4-
import { _EventListener, ComparableEventListener } from "./types.ts";
54
import { compositeKey, isBoolean, isFunction, isObject } from "./deps.ts";
5+
import type {
6+
ComparableEventListenerLike,
7+
EventListenerLike,
8+
} from "./types.ts";
69

710
/** To flatten {@linkcode options}.
811
* @see https://dom.spec.whatwg.org/#concept-flatten-options
@@ -14,7 +17,7 @@ export function flatOptions(options?: boolean | EventListenerOptions): boolean {
1417
}
1518

1619
export type NormalizedOptions = Pick<
17-
_EventListener,
20+
EventListenerLike,
1821
keyof AddEventListenerOptions
1922
>;
2023

@@ -87,6 +90,6 @@ export function toHandler(
8790
}
8891

8992
/** Return {@linkcode listener} representation key. */
90-
export function toKey(listener: ComparableEventListener): object {
93+
export function toKey(listener: ComparableEventListenerLike): object {
9194
return compositeKey(listener.callback, listener.type, listener.capture);
9295
}

utils_test.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
Document,
2222
DOMParser,
2323
} from "https://deno.land/x/[email protected]/deno-dom-wasm.ts";
24-
import { ComparableEventListener } from "./types.ts";
24+
import { ComparableEventListenerLike } from "./types.ts";
2525

2626
describe("flatOptions", () => {
2727
it("should return boolean", () => {
@@ -216,8 +216,8 @@ describe("toKey", () => {
216216
};
217217

218218
const table: [
219-
left: ComparableEventListener,
220-
right: ComparableEventListener,
219+
left: ComparableEventListenerLike,
220+
right: ComparableEventListenerLike,
221221
][] = [
222222
[{ callback, type: "click", capture: false }, {
223223
callback,
@@ -248,8 +248,8 @@ describe("toKey", () => {
248248
};
249249

250250
const table: [
251-
left: ComparableEventListener,
252-
right: ComparableEventListener,
251+
left: ComparableEventListenerLike,
252+
right: ComparableEventListenerLike,
253253
][] = [
254254
[{ callback, type: "click", capture: false }, {
255255
callback,

0 commit comments

Comments
 (0)