diff --git a/src/index.ts b/src/index.ts index 3b08398..e2d6ce3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import { effect, Signal, signal } from "@preact/signals-core"; import { reconcile } from "./reconciler/index"; import { ShadowCache } from "./reconciler/utils"; -import type { CustomEvents, PropertyDescriptor, ShadowElement } from "./types"; +import type { PropertyDescriptor, ShadowElement } from "./types"; import { parentsCacheSymbol, active } from "./utils"; export type { ShadowElement, PropertyDescriptor } from "./types"; @@ -115,22 +115,6 @@ export function findParent( return result; } -export function dispatchEvent>( - target: T, - eventName: U, - customEventInit: CustomEventInit[U]>, -): Promise[] { - const previousEventPromises = active.eventPromises; - const eventPromises: Promise[] = []; - active.eventPromises = eventPromises; - const customEvent = new CustomEvent(eventName as string, customEventInit); - target.dispatchEvent(customEvent); - - active.eventPromises = previousEventPromises; - - return eventPromises; -} - export function prop(): () => PropertyDescriptor { return () => { const signalValue = signal() as Signal; diff --git a/src/utils.ts b/src/utils.ts index 96e12b4..a90b787 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,7 @@ import { batch, effect, untracked } from "@preact/signals-core"; import { ShadowCache } from "./reconciler/utils"; import type { + CustomEvents, ForbiddenHTMLProperties, PropertyDescriptor, PropertyDescriptorType, @@ -61,7 +62,13 @@ interface IComponent extends HTMLElement { export function WebComponent PropertyDescriptor } = {}>( props?: T, -): abstract new (props: PropType & BasePropsType) => PropType & IComponent { +): abstract new (props: PropType & BasePropsType) => PropType & + IComponent & { + fireEvent>>( + eventName: E, + customEventInit: CustomEventInit>[E]>, + ): Promise[]; + } { abstract class Component extends HTMLElement implements IComponent { constructor(_props: PropType & BasePropsType) { super(); @@ -130,6 +137,18 @@ export function WebComponent PropertyDescriptor } } + fireEvent(eventName: string, customEventInit: CustomEventInit) { + const previousEventPromises = active.eventPromises; + const eventPromises: Promise[] = []; + active.eventPromises = eventPromises; + const customEvent = new CustomEvent(eventName as string, customEventInit); + this.dispatchEvent(customEvent); + + active.eventPromises = previousEventPromises; + + return eventPromises; + } + addEventListener( eventName: string, listener: (event: Event) => unknown, diff --git a/test/async.test.tsx b/test/async.test.tsx index a92620b..5947974 100644 --- a/test/async.test.tsx +++ b/test/async.test.tsx @@ -1,12 +1,5 @@ import { expect } from "@esm-bundle/chai"; -import { - createComponent, - mount, - dispatchEvent, - WebComponent, - prop, - define, -} from "@plusnew/webcomponent"; +import { mount, WebComponent, prop, define } from "@plusnew/webcomponent"; import { signal } from "@preact/signals-core"; describe("webcomponent", () => { @@ -34,7 +27,7 @@ describe("webcomponent", () => { onclick={async () => { this.#loading.value = true; try { - await Promise.all(dispatchEvent(this, "foo", { detail: null })); + await Promise.all(this.fireEvent("foo", { detail: null })); } catch (_err) {} this.#loading.value = false; }} diff --git a/test/events.test.tsx b/test/events.test.tsx index c4f9035..3c1580a 100644 --- a/test/events.test.tsx +++ b/test/events.test.tsx @@ -1,12 +1,5 @@ import { expect } from "@esm-bundle/chai"; -import { - createComponent, - define, - dispatchEvent, - mount, - prop, - WebComponent, -} from "@plusnew/webcomponent"; +import { define, mount, prop, WebComponent } from "@plusnew/webcomponent"; import { signal } from "@preact/signals-core"; describe("webcomponent", () => { @@ -38,9 +31,11 @@ describe("webcomponent", () => { } @define("test-nested") - class NestedComponent extends WebComponent({ onfoo: prop<(evt: CustomEvent) => void>() }) { + class NestedComponent extends WebComponent({ + onfoo: prop<(evt: CustomEvent) => void>(), + }) { render(this: NestedComponent) { - return );