From fd5989dab9ba61b0c99095a984eb8aff22bb02b4 Mon Sep 17 00:00:00 2001 From: JLarky Date: Sat, 2 Mar 2024 00:15:22 -0700 Subject: [PATCH] jsr --- jsr/jsr.json | 5 +++++ jsr/mod.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 jsr/jsr.json create mode 100644 jsr/mod.ts diff --git a/jsr/jsr.json b/jsr/jsr.json new file mode 100644 index 0000000..046e40d --- /dev/null +++ b/jsr/jsr.json @@ -0,0 +1,5 @@ +{ + "name": "@jlarky/rad-event-listener", + "version": "0.2.4", + "exports": "./mod.ts" +} diff --git a/jsr/mod.ts b/jsr/mod.ts new file mode 100644 index 0000000..411510a --- /dev/null +++ b/jsr/mod.ts @@ -0,0 +1,46 @@ +export function radEventListener< + MyElement extends { addEventListener: any; removeEventListener: any }, + // get the possible events by using the `MyElement.on${someEvent}` properties + Event extends { + [K in keyof MyElement]-?: K extends `on${infer E}` ? E : never; + }[keyof MyElement] +>( + element: MyElement, + // recreate the args for addEventListener + ...args: [ + type: Event, + // grab the correct types off the function + listener: MyElement extends Record< + `on${Event}`, + null | ((...args: infer Args) => infer Return) + > + ? // overwrite the type of this to make sure that it is always `MyElement` + (this: MyElement, ...args: Args) => Return + : never, + options?: boolean | AddEventListenerOptions + ] +): () => void { + element.addEventListener(...args); + return () => { + element.removeEventListener(...args); + }; +} + +export { radEventListener as on }; + +export function rad< + MyElement extends { addEventListener?: any; removeEventListener?: any } +>( + element: MyElement, + gen: (rad: MyElement["addEventListener"]) => void +): () => void { + let cleanup: undefined | (() => void); + gen((listener: any, options: any) => { + element.addEventListener(listener, options); + cleanup = () => element.removeEventListener(listener, options); + }); + if (!cleanup) { + throw new Error("you forgot to add event listener"); + } + return cleanup; +}