@toyz/loom 0.19.2 → 0.19.3

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.
package/dist/bus.d.ts CHANGED
@@ -3,6 +3,13 @@
3
3
  *
4
4
  * Events are classes. The class constructor IS the channel key.
5
5
  * No string registry, full type inference.
6
+ *
7
+ * Features:
8
+ * - on() — persistent subscription
9
+ * - once() — fire-and-forget (auto-unsubs after first fire)
10
+ * - waitFor() — promise-based (resolves on next event, optional timeout)
11
+ * - emit() — dispatches to handlers + walks prototype chain (inheritance)
12
+ * respects event.cancelled to stop propagation
6
13
  */
7
14
  import type { LoomEvent } from "./event";
8
15
  export type Constructor<T = any> = new (...args: any[]) => T;
@@ -11,7 +18,20 @@ export declare class EventBus {
11
18
  private listeners;
12
19
  /** Subscribe to a typed event. Returns unsubscribe function. */
13
20
  on<T>(type: Constructor<T>, handler: Handler<T>): () => void;
14
- /** Emit a typed event — dispatches to all handlers of that class */
21
+ /** Subscribe for a single event — auto-unsubscribes after first fire. */
22
+ once<T>(type: Constructor<T>, handler: Handler<T>): () => void;
23
+ /**
24
+ * Wait for the next event of the given type. Returns a promise.
25
+ * Optional timeout in ms — rejects if exceeded.
26
+ */
27
+ waitFor<T>(type: Constructor<T>, opts?: {
28
+ timeout?: number;
29
+ }): Promise<T>;
30
+ /**
31
+ * Emit a typed event — dispatches to all handlers of that class,
32
+ * then walks the prototype chain to dispatch to parent event handlers.
33
+ * Respects event.cancelled — stops both handler iteration and parent walk.
34
+ */
15
35
  emit<T extends LoomEvent>(event: T): void;
16
36
  /** Remove a specific handler */
17
37
  off<T>(type: Constructor<T>, handler: Handler<T>): void;
package/dist/bus.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAC7D,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAE3C,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAA6C;IAE9D,gEAAgE;IAChE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAO5D,oEAAoE;IACpE,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAKzC,gCAAgC;IAChC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAIvD,kDAAkD;IAClD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAIpC,2BAA2B;IAC3B,KAAK,IAAI,IAAI;CAGd;AAED,8EAA8E;AAC9E,eAAO,IAAI,GAAG,UAAiB,CAAC;AAEhC,+CAA+C;AAC/C,wBAAgB,MAAM,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAExC"}
1
+ {"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAC7D,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAE3C,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAA6C;IAE9D,gEAAgE;IAChE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAO5D,yEAAyE;IACzE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAK9D;;;OAGG;IACH,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAgBzE;;;;OAIG;IACH,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAczC,gCAAgC;IAChC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAIvD,kDAAkD;IAClD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAIpC,2BAA2B;IAC3B,KAAK,IAAI,IAAI;CAGd;AAED,8EAA8E;AAC9E,eAAO,IAAI,GAAG,UAAiB,CAAC;AAEhC,+CAA+C;AAC/C,wBAAgB,MAAM,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAExC"}
package/dist/bus.js CHANGED
@@ -3,6 +3,13 @@
3
3
  *
4
4
  * Events are classes. The class constructor IS the channel key.
5
5
  * No string registry, full type inference.
6
+ *
7
+ * Features:
8
+ * - on() — persistent subscription
9
+ * - once() — fire-and-forget (auto-unsubs after first fire)
10
+ * - waitFor() — promise-based (resolves on next event, optional timeout)
11
+ * - emit() — dispatches to handlers + walks prototype chain (inheritance)
12
+ * respects event.cancelled to stop propagation
6
13
  */
7
14
  export class EventBus {
8
15
  listeners = new Map();
@@ -14,10 +21,49 @@ export class EventBus {
14
21
  set.add(handler);
15
22
  return () => set.delete(handler);
16
23
  }
17
- /** Emit a typed event — dispatches to all handlers of that class */
24
+ /** Subscribe for a single event — auto-unsubscribes after first fire. */
25
+ once(type, handler) {
26
+ const unsub = this.on(type, (data) => { unsub(); handler(data); });
27
+ return unsub;
28
+ }
29
+ /**
30
+ * Wait for the next event of the given type. Returns a promise.
31
+ * Optional timeout in ms — rejects if exceeded.
32
+ */
33
+ waitFor(type, opts) {
34
+ return new Promise((resolve, reject) => {
35
+ let timer;
36
+ const unsub = this.once(type, (data) => {
37
+ if (timer)
38
+ clearTimeout(timer);
39
+ resolve(data);
40
+ });
41
+ if (opts?.timeout) {
42
+ timer = setTimeout(() => {
43
+ unsub();
44
+ reject(new Error(`waitFor(${type.name}) timed out after ${opts.timeout}ms`));
45
+ }, opts.timeout);
46
+ }
47
+ });
48
+ }
49
+ /**
50
+ * Emit a typed event — dispatches to all handlers of that class,
51
+ * then walks the prototype chain to dispatch to parent event handlers.
52
+ * Respects event.cancelled — stops both handler iteration and parent walk.
53
+ */
18
54
  emit(event) {
19
- const ctor = event.constructor;
20
- this.listeners.get(ctor)?.forEach((h) => h(event));
55
+ let ctor = event.constructor;
56
+ while (ctor && ctor !== Object) {
57
+ const handlers = this.listeners.get(ctor);
58
+ if (handlers) {
59
+ for (const h of handlers) {
60
+ h(event);
61
+ if (event.cancelled)
62
+ return;
63
+ }
64
+ }
65
+ ctor = Object.getPrototypeOf(ctor.prototype)?.constructor ?? null;
66
+ }
21
67
  }
22
68
  /** Remove a specific handler */
23
69
  off(type, handler) {
package/dist/bus.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,OAAO,QAAQ;IACX,SAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;IAE9D,gEAAgE;IAChE,EAAE,CAAI,IAAoB,EAAE,OAAmB;QAC7C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QACtC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjB,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,oEAAoE;IACpE,IAAI,CAAsB,KAAQ;QAChC,MAAM,IAAI,GAAI,KAAgB,CAAC,WAA0B,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,gCAAgC;IAChC,GAAG,CAAI,IAAoB,EAAE,OAAmB;QAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,kDAAkD;IAClD,KAAK,CAAI,IAAoB;QAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,2BAA2B;IAC3B,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF;AAED,8EAA8E;AAC9E,MAAM,CAAC,IAAI,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;AAEhC,+CAA+C;AAC/C,MAAM,UAAU,MAAM,CAAC,CAAW;IAChC,GAAG,GAAG,CAAC,CAAC;AACV,CAAC"}
1
+ {"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"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"}
@@ -49,4 +49,18 @@ export declare function on(resolver: (el: any) => EventTarget, event: string): (
49
49
  * ```
50
50
  */
51
51
  export declare function emit<T extends LoomEvent>(_type?: Constructor<T>, factory?: (val: unknown) => T): (value: Function | ClassAccessorDecoratorTarget<any, any>, context: ClassMethodDecoratorContext | ClassAccessorDecoratorContext) => void | ((this: unknown, ...args: unknown[]) => unknown);
52
+ /**
53
+ * Fire-and-forget variant of \@on. Auto-unsubscribes after first fire.
54
+ *
55
+ * Bus event: `\@on.once(AuthComplete)`
56
+ * DOM event: `\@on.once(window, "load")` — uses `{ once: true }`
57
+ */
58
+ declare function onOnce<T extends LoomEvent>(type: Constructor<T>): (method: Function, context: ClassMethodDecoratorContext) => void;
59
+ declare function onOnce(target: EventTarget, event: string): (method: Function, context: ClassMethodDecoratorContext) => void;
60
+ declare function onOnce(resolver: (el: any) => EventTarget, event: string): (method: Function, context: ClassMethodDecoratorContext) => void;
61
+ /** @internal — type declaration for on.once */
62
+ export declare namespace on {
63
+ const once: typeof onOnce;
64
+ }
65
+ export {};
52
66
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/decorators/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAO,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AAChI,wBAAgB,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AACzH,wBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AAiCxI;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,SAAS,EACtC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EACtB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,IAwBrB,OAAO,QAAQ,GAAG,4BAA4B,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,2BAA2B,GAAG,6BAA6B,oBApB7G,OAAO,WAAW,OAAO,EAAE,cA0BrD"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/decorators/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAO,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AAChI,wBAAgB,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AACzH,wBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AAiCxI;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,SAAS,EACtC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EACtB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,IAwBrB,OAAO,QAAQ,GAAG,4BAA4B,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,2BAA2B,GAAG,6BAA6B,oBApB7G,OAAO,WAAW,OAAO,EAAE,cA0BrD;AAID;;;;;GAKG;AACH,iBAAS,MAAM,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AAC7H,iBAAS,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AACtH,iBAAS,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AA0BrI,+CAA+C;AAE/C,MAAM,CAAC,OAAO,WAAW,EAAE,CAAC;IACnB,MAAM,IAAI,EAAE,OAAO,MAAM,CAAC;CAClC"}
@@ -85,4 +85,29 @@ export function emit(_type, factory) {
85
85
  return accessorDecorator(value, context);
86
86
  };
87
87
  }
88
+ function onOnce(typeOrTarget, event) {
89
+ return (method, context) => {
90
+ context.addInitializer(function () {
91
+ if (!this[CONNECT_HOOKS.key])
92
+ this[CONNECT_HOOKS.key] = [];
93
+ this[CONNECT_HOOKS.key].push((el) => {
94
+ if (event !== undefined) {
95
+ // DOM event — use { once: true } for native auto-removal
96
+ const target = typeof typeOrTarget === "function" && !typeOrTarget.prototype
97
+ ? typeOrTarget(el)
98
+ : typeOrTarget;
99
+ const fn = (e) => method.call(el, e);
100
+ target.addEventListener(event, fn, { once: true });
101
+ return () => target.removeEventListener(event, fn);
102
+ }
103
+ else {
104
+ // Bus event — use bus.once() for auto-unsubscribe
105
+ return bus.once(typeOrTarget, (e) => method.call(el, e));
106
+ }
107
+ });
108
+ });
109
+ };
110
+ }
111
+ // Attach @on.once via namespace merging
112
+ on.once = onOnce;
88
113
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/decorators/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/decorators/events.ts"],"names":[],"mappings":"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"}
package/dist/event.d.ts CHANGED
@@ -13,6 +13,10 @@ import type { Constructor } from "./bus";
13
13
  export declare abstract class LoomEvent {
14
14
  /** Auto-stamped on creation */
15
15
  readonly timestamp: number;
16
+ /** Set to true by cancel() — stops subsequent handlers and parent propagation */
17
+ cancelled: boolean;
18
+ /** Stop dispatching to remaining handlers and parent event types */
19
+ cancel(): void;
16
20
  /** Construct and emit this event through the global bus */
17
21
  static dispatch<T extends LoomEvent>(this: new (...args: unknown[]) => T, ...args: ConstructorParameters<typeof this>): void;
18
22
  /** Shallow clone with optional overrides */
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAGzC,8BAAsB,SAAS;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,SAAc;IAEhC,2DAA2D;IAC3D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,SAAS,EACjC,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EACnC,GAAG,IAAI,EAAE,qBAAqB,CAAC,OAAO,IAAI,CAAC,GAC1C,IAAI;IAIP,4CAA4C;IAC5C,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAQtC,8CAA8C;IAC9C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,SAAS,EAC3B,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EACpB,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,CAAC;IAIb,iDAAiD;IACjD,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQjC,4BAA4B;IAC5B,QAAQ,IAAI,MAAM;CAGnB"}
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAGzC,8BAAsB,SAAS;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,SAAc;IAEhC,iFAAiF;IACjF,SAAS,UAAS;IAElB,oEAAoE;IACpE,MAAM,IAAI,IAAI;IAEd,2DAA2D;IAC3D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,SAAS,EACjC,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EACnC,GAAG,IAAI,EAAE,qBAAqB,CAAC,OAAO,IAAI,CAAC,GAC1C,IAAI;IAIP,4CAA4C;IAC5C,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAQtC,8CAA8C;IAC9C,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,SAAS,EAC3B,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EACpB,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,CAAC;IAIb,iDAAiD;IACjD,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQjC,4BAA4B;IAC5B,QAAQ,IAAI,MAAM;CAGnB"}
package/dist/event.js CHANGED
@@ -13,6 +13,10 @@ import { bus } from "./bus";
13
13
  export class LoomEvent {
14
14
  /** Auto-stamped on creation */
15
15
  timestamp = Date.now();
16
+ /** Set to true by cancel() — stops subsequent handlers and parent propagation */
17
+ cancelled = false;
18
+ /** Stop dispatching to remaining handlers and parent event types */
19
+ cancel() { this.cancelled = true; }
16
20
  /** Construct and emit this event through the global bus */
17
21
  static dispatch(...args) {
18
22
  bus.emit(new this(...args));
package/dist/event.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,MAAM,OAAgB,SAAS;IAC7B,+BAA+B;IACtB,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEhC,2DAA2D;IAC3D,MAAM,CAAC,QAAQ,CAEb,GAAG,IAAwC;QAE3C,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,SAAyB;QAC7B,OAAO,MAAM,CAAC,MAAM,CAClB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAC1C,IAAI,EACJ,SAAS,CACV,CAAC;IACJ,CAAC;IAED,8CAA8C;IAC9C,MAAM,CAAC,EAAE,CAEP,KAAc;QAEd,OAAO,KAAK,YAAY,IAAI,CAAC;IAC/B,CAAC;IAED,iDAAiD;IACjD,MAAM;QACJ,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,GAAG,CAAC,GAAI,IAA2C,CAAC,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,4BAA4B;IAC5B,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;IACtE,CAAC;CACF"}
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,MAAM,OAAgB,SAAS;IAC7B,+BAA+B;IACtB,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEhC,iFAAiF;IACjF,SAAS,GAAG,KAAK,CAAC;IAElB,oEAAoE;IACpE,MAAM,KAAW,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC;IAEzC,2DAA2D;IAC3D,MAAM,CAAC,QAAQ,CAEb,GAAG,IAAwC;QAE3C,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,SAAyB;QAC7B,OAAO,MAAM,CAAC,MAAM,CAClB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAC1C,IAAI,EACJ,SAAS,CACV,CAAC;IACJ,CAAC;IAED,8CAA8C;IAC9C,MAAM,CAAC,EAAE,CAEP,KAAc;QAEd,OAAO,KAAK,YAAY,IAAI,CAAC;IAC/B,CAAC;IAED,iDAAiD;IACjD,MAAM;QACJ,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,GAAG,CAAC,GAAI,IAA2C,CAAC,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,4BAA4B;IAC5B,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;IACtE,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toyz/loom",
3
- "version": "0.19.2",
3
+ "version": "0.19.3",
4
4
  "type": "module",
5
5
  "description": "Decorator-driven web component framework with reactive state, DOM morphing, DI, and JSX",
6
6
  "license": "MIT",