@toyz/loom 0.19.3 → 0.19.4

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
@@ -16,6 +16,11 @@ export type Constructor<T = any> = new (...args: any[]) => T;
16
16
  export type Handler<T> = (data: T) => void;
17
17
  export declare class EventBus {
18
18
  private listeners;
19
+ /**
20
+ * Frame-scoped dedup cache — cleared after the current synchronous flush drains.
21
+ * Only populated when an event returns a non-undefined dedupeKey.
22
+ */
23
+ private _seen;
19
24
  /** Subscribe to a typed event. Returns unsubscribe function. */
20
25
  on<T>(type: Constructor<T>, handler: Handler<T>): () => void;
21
26
  /** Subscribe for a single event — auto-unsubscribes after first fire. */
@@ -31,6 +36,9 @@ export declare class EventBus {
31
36
  * Emit a typed event — dispatches to all handlers of that class,
32
37
  * then walks the prototype chain to dispatch to parent event handlers.
33
38
  * Respects event.cancelled — stops both handler iteration and parent walk.
39
+ *
40
+ * Frame-scoped dedup: if event.dedupeKey is non-undefined, only the first
41
+ * emission with that key per synchronous flush reaches handlers.
34
42
  */
35
43
  emit<T extends LoomEvent>(event: T): void;
36
44
  /** Remove a specific handler */
package/dist/bus.d.ts.map CHANGED
@@ -1 +1 @@
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"}
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;;;OAGG;IACH,OAAO,CAAC,KAAK,CAA4B;IAEzC,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;;;;;;;OAOG;IACH,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IA0BzC,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
@@ -13,6 +13,11 @@
13
13
  */
14
14
  export class EventBus {
15
15
  listeners = new Map();
16
+ /**
17
+ * Frame-scoped dedup cache — cleared after the current synchronous flush drains.
18
+ * Only populated when an event returns a non-undefined dedupeKey.
19
+ */
20
+ _seen = null;
16
21
  /** Subscribe to a typed event. Returns unsubscribe function. */
17
22
  on(type, handler) {
18
23
  if (!this.listeners.has(type))
@@ -50,8 +55,23 @@ export class EventBus {
50
55
  * Emit a typed event — dispatches to all handlers of that class,
51
56
  * then walks the prototype chain to dispatch to parent event handlers.
52
57
  * Respects event.cancelled — stops both handler iteration and parent walk.
58
+ *
59
+ * Frame-scoped dedup: if event.dedupeKey is non-undefined, only the first
60
+ * emission with that key per synchronous flush reaches handlers.
53
61
  */
54
62
  emit(event) {
63
+ // Frame-scoped dedup — opt-in via dedupeKey on the event
64
+ const key = event.dedupeKey;
65
+ if (key !== undefined) {
66
+ if (!this._seen) {
67
+ this._seen = new Set();
68
+ // Clear after the current synchronous flush drains
69
+ queueMicrotask(() => { this._seen = null; });
70
+ }
71
+ if (this._seen.has(key))
72
+ return;
73
+ this._seen.add(key);
74
+ }
55
75
  let ctor = event.constructor;
56
76
  while (ctor && ctor !== Object) {
57
77
  const handlers = this.listeners.get(ctor);
package/dist/bus.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"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"}
package/dist/event.d.ts CHANGED
@@ -17,8 +17,25 @@ export declare abstract class LoomEvent {
17
17
  cancelled: boolean;
18
18
  /** Stop dispatching to remaining handlers and parent event types */
19
19
  cancel(): void;
20
+ /**
21
+ * Optional dedup key — override in a subclass to enable frame-scoped deduplication.
22
+ * If two events with the same dedupeKey are emitted in the same synchronous flush,
23
+ * only the first reaches handlers. Cleared after the current microtask drains.
24
+ *
25
+ * ```ts
26
+ * class ThemeChanged extends LoomEvent {
27
+ * constructor(public theme: string) { super(); }
28
+ * override get dedupeKey() { return `theme:${this.theme}`; }
29
+ * }
30
+ * ```
31
+ *
32
+ * Return `undefined` (default) to disable dedup for this event.
33
+ */
34
+ get dedupeKey(): string | undefined;
20
35
  /** Construct and emit this event through the global bus */
21
36
  static dispatch<T extends LoomEvent>(this: new (...args: unknown[]) => T, ...args: ConstructorParameters<typeof this>): void;
37
+ /** Construct this event without emitting — useful for building, inspecting, or cloning before dispatch */
38
+ static create<T extends LoomEvent>(this: new (...args: unknown[]) => T, ...args: ConstructorParameters<typeof this>): T;
22
39
  /** Shallow clone with optional overrides */
23
40
  clone(overrides?: Partial<this>): this;
24
41
  /** Type guard — `if (SomeEvent.is(event))` */
@@ -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,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"}
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;;;;;;;;;;;;;OAaG;IACH,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAAsB;IAEzD,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,0GAA0G;IAC1G,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,SAAS,EAC/B,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EACnC,GAAG,IAAI,EAAE,qBAAqB,CAAC,OAAO,IAAI,CAAC,GAC1C,CAAC;IAIJ,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
@@ -17,10 +17,29 @@ export class LoomEvent {
17
17
  cancelled = false;
18
18
  /** Stop dispatching to remaining handlers and parent event types */
19
19
  cancel() { this.cancelled = true; }
20
+ /**
21
+ * Optional dedup key — override in a subclass to enable frame-scoped deduplication.
22
+ * If two events with the same dedupeKey are emitted in the same synchronous flush,
23
+ * only the first reaches handlers. Cleared after the current microtask drains.
24
+ *
25
+ * ```ts
26
+ * class ThemeChanged extends LoomEvent {
27
+ * constructor(public theme: string) { super(); }
28
+ * override get dedupeKey() { return `theme:${this.theme}`; }
29
+ * }
30
+ * ```
31
+ *
32
+ * Return `undefined` (default) to disable dedup for this event.
33
+ */
34
+ get dedupeKey() { return undefined; }
20
35
  /** Construct and emit this event through the global bus */
21
36
  static dispatch(...args) {
22
37
  bus.emit(new this(...args));
23
38
  }
39
+ /** Construct this event without emitting — useful for building, inspecting, or cloning before dispatch */
40
+ static create(...args) {
41
+ return new this(...args);
42
+ }
24
43
  /** Shallow clone with optional overrides */
25
44
  clone(overrides) {
26
45
  return Object.assign(Object.create(Object.getPrototypeOf(this)), this, overrides);
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,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"}
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;;;;;;;;;;;;;OAaG;IACH,IAAI,SAAS,KAAyB,OAAO,SAAS,CAAC,CAAC,CAAC;IAEzD,2DAA2D;IAC3D,MAAM,CAAC,QAAQ,CAEb,GAAG,IAAwC;QAE3C,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,0GAA0G;IAC1G,MAAM,CAAC,MAAM,CAEX,GAAG,IAAwC;QAE3C,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3B,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.3",
3
+ "version": "0.19.4",
4
4
  "type": "module",
5
5
  "description": "Decorator-driven web component framework with reactive state, DOM morphing, DI, and JSX",
6
6
  "license": "MIT",