@toyz/loom 0.19.6 → 0.19.8

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/app.d.ts CHANGED
@@ -22,6 +22,7 @@ declare class LoomApp {
22
22
  private factories;
23
23
  private components;
24
24
  private _started;
25
+ private _visibilityCleanup;
25
26
  /** Subscribe to a typed event. Returns unsubscribe function. */
26
27
  on<T>(type: Constructor<T>, handler: Handler<T>): () => void;
27
28
  /** Emit a typed event to all listeners. */
@@ -65,6 +66,18 @@ declare class LoomApp {
65
66
  start(): Promise<void>;
66
67
  /** Tear down — call stop() on lifecycle-aware services (reverse order), then stop render loop */
67
68
  stop(): void;
69
+ /**
70
+ * Call suspend() on all lifecycle-aware services.
71
+ * Invoked automatically on `visibilitychange` (tab hidden), or manually.
72
+ */
73
+ suspend(): void;
74
+ /**
75
+ * Call resume() on all lifecycle-aware services.
76
+ * Invoked automatically on `visibilitychange` (tab visible), or manually.
77
+ */
78
+ resume(): void;
79
+ /** Wire document.visibilitychange to auto-call suspend/resume on services */
80
+ private _wireVisibility;
68
81
  /** Whether the app has been started */
69
82
  get started(): boolean;
70
83
  }
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAO,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAStC,cAAM,OAAO;IACX,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,QAAQ,CAAS;IAIzB,gEAAgE;IAChE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAE5D,2CAA2C;IAC3C,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAEzC,uCAAuC;IACvC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAIvD;;;;;;;;;OASG;IACH,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAC5B,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IA6BzC,+DAA+D;IAC/D,eAAe,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIhC,wDAAwD;IACxD,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,QAAQ,CAAA;KAAE,GAAG,IAAI;IAIvE,gEAAgE;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,GAAG,IAAI;IAW3D,6DAA6D;IAC7D,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAQzB,6EAA6E;IAC7E,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC;IAM9C,sEAAsE;IACtE,OAAO,CAAC,aAAa;IAWrB;;;;;;OAMG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD5B,iGAAiG;IACjG,IAAI,IAAI,IAAI;IAUZ,uCAAuC;IACvC,IAAI,OAAO,IAAI,OAAO,CAErB;CACF;AAED,qDAAqD;AACrD,eAAO,MAAM,GAAG,SAAgB,CAAC;AACjC,YAAY,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAO,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAStC,cAAM,OAAO;IACX,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,kBAAkB,CAA6B;IAIvD,gEAAgE;IAChE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAE5D,2CAA2C;IAC3C,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAEzC,uCAAuC;IACvC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAIvD;;;;;;;;;OASG;IACH,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAC5B,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IA6BzC,+DAA+D;IAC/D,eAAe,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIhC,wDAAwD;IACxD,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,QAAQ,CAAA;KAAE,GAAG,IAAI;IAIvE,gEAAgE;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,GAAG,IAAI;IAW3D,6DAA6D;IAC7D,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAQzB,6EAA6E;IAC7E,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC;IAM9C,sEAAsE;IACtE,OAAO,CAAC,aAAa;IAWrB;;;;;;OAMG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD5B,iGAAiG;IACjG,IAAI,IAAI,IAAI;IAeZ;;;OAGG;IACH,OAAO,IAAI,IAAI;IAOf;;;OAGG;IACH,MAAM,IAAI,IAAI;IAOd,6EAA6E;IAC7E,OAAO,CAAC,eAAe;IAUvB,uCAAuC;IACvC,IAAI,OAAO,IAAI,OAAO,CAErB;CACF;AAED,qDAAqD;AACrD,eAAO,MAAM,GAAG,SAAgB,CAAC;AACjC,YAAY,EAAE,OAAO,EAAE,CAAC"}
package/dist/app.js CHANGED
@@ -17,13 +17,14 @@ import { renderLoop } from "./render-loop";
17
17
  import { INJECT_PARAMS, ON_HANDLERS, SERVICE_NAME } from "./decorators/symbols";
18
18
  import { bus } from "./bus";
19
19
  import { LoomResult } from "./result";
20
- import { hasStart, hasStop } from "./lifecycle";
20
+ import { hasStart, hasStop, hasSuspend, hasResume } from "./lifecycle";
21
21
  class LoomApp {
22
22
  providers = new Map();
23
23
  services = [];
24
24
  factories = [];
25
25
  components = [];
26
26
  _started = false;
27
+ _visibilityCleanup = null;
27
28
  // ── Event bus (delegates to the module-level bus singleton) ──
28
29
  /** Subscribe to a typed event. Returns unsubscribe function. */
29
30
  on(type, handler) { return bus.on(type, handler); }
@@ -155,10 +156,17 @@ class LoomApp {
155
156
  customElements.define(tag, ctor);
156
157
  }
157
158
  }
159
+ // 5. Wire visibilitychange for suspend/resume lifecycle
160
+ this._wireVisibility();
158
161
  this._started = true;
159
162
  }
160
163
  /** Tear down — call stop() on lifecycle-aware services (reverse order), then stop render loop */
161
164
  stop() {
165
+ // Remove visibilitychange listener
166
+ if (this._visibilityCleanup) {
167
+ this._visibilityCleanup();
168
+ this._visibilityCleanup = null;
169
+ }
162
170
  // LoomLifecycle — call stop() in reverse registration order
163
171
  for (const Svc of [...this.services].reverse()) {
164
172
  const instance = this.providers.get(Svc);
@@ -168,6 +176,41 @@ class LoomApp {
168
176
  renderLoop.stop();
169
177
  this._started = false;
170
178
  }
179
+ /**
180
+ * Call suspend() on all lifecycle-aware services.
181
+ * Invoked automatically on `visibilitychange` (tab hidden), or manually.
182
+ */
183
+ suspend() {
184
+ for (const Svc of this.services) {
185
+ const instance = this.providers.get(Svc);
186
+ if (instance && hasSuspend(instance))
187
+ instance.suspend();
188
+ }
189
+ }
190
+ /**
191
+ * Call resume() on all lifecycle-aware services.
192
+ * Invoked automatically on `visibilitychange` (tab visible), or manually.
193
+ */
194
+ resume() {
195
+ for (const Svc of this.services) {
196
+ const instance = this.providers.get(Svc);
197
+ if (instance && hasResume(instance))
198
+ instance.resume();
199
+ }
200
+ }
201
+ /** Wire document.visibilitychange to auto-call suspend/resume on services */
202
+ _wireVisibility() {
203
+ if (typeof document === "undefined")
204
+ return; // SSR guard
205
+ const handler = () => {
206
+ if (document.hidden)
207
+ this.suspend();
208
+ else
209
+ this.resume();
210
+ };
211
+ document.addEventListener("visibilitychange", handler);
212
+ this._visibilityCleanup = () => document.removeEventListener("visibilitychange", handler);
213
+ }
171
214
  /** Whether the app has been started */
172
215
  get started() {
173
216
  return this._started;
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -2,39 +2,38 @@
2
2
  * Loom — LoomLifecycle interface
3
3
  *
4
4
  * Opt-in service lifecycle contract. Services that implement this interface
5
- * will have their `start()` and/or `stop()` methods called automatically
6
- * by `app.start()` and `app.stop()`.
5
+ * will have their methods called automatically by the app:
6
+ *
7
+ * - `start()` / `stop()` — called by `app.start()` / `app.stop()`
8
+ * - `suspend()` / `resume()` — called on `visibilitychange` (tab hidden / visible)
7
9
  *
8
10
  * ```ts
9
11
  * @service("ws")
10
- * class WebSocketService implements LoomLifecycle<"start" | "stop"> {
11
- * start() { this.ws.connect(); }
12
- * stop() { this.ws.disconnect(); }
12
+ * class WebSocketService implements LoomLifecycle<"start" | "stop" | "suspend" | "resume"> {
13
+ * start() { this.ws.connect(); }
14
+ * stop() { this.ws.disconnect(); }
15
+ * suspend() { this.ws.pauseHeartbeat(); } // tab hidden
16
+ * resume() { this.ws.reconnect(); } // tab visible
13
17
  * }
14
- *
15
- * // No manual call needed in main.ts — app.start() handles it.
16
18
  * ```
17
19
  *
18
20
  * The generic parameter enforces which hooks the service declares.
19
21
  * Hooks not in T become `never` — calling them is a compile-time error.
20
- *
21
- * ```ts
22
- * class AnalyticsService implements LoomLifecycle<"start"> {
23
- * start() { this.track("app_boot"); }
24
- * // stop() is `never` — calling it won't compile
25
- * }
26
- * ```
27
22
  */
28
- export type LifecycleHook = "start" | "stop";
23
+ export type LifecycleHook = "start" | "stop" | "suspend" | "resume";
29
24
  /**
30
25
  * Service lifecycle interface.
31
26
  *
32
- * @template T - The lifecycle hooks this service supports ("start" | "stop" or either alone).
27
+ * @template T - The lifecycle hooks this service supports.
33
28
  */
34
29
  export type LoomLifecycle<T extends LifecycleHook> = ("start" extends T ? {
35
30
  start(): void | Promise<void>;
36
31
  } : {}) & ("stop" extends T ? {
37
32
  stop(): void | Promise<void>;
33
+ } : {}) & ("suspend" extends T ? {
34
+ suspend(): void | Promise<void>;
35
+ } : {}) & ("resume" extends T ? {
36
+ resume(): void | Promise<void>;
38
37
  } : {});
39
38
  /** Type guard — returns true if the value has a callable `start` method */
40
39
  export declare function hasStart(v: unknown): v is {
@@ -44,4 +43,12 @@ export declare function hasStart(v: unknown): v is {
44
43
  export declare function hasStop(v: unknown): v is {
45
44
  stop: () => void | Promise<void>;
46
45
  };
46
+ /** Type guard — returns true if the value has a callable `suspend` method */
47
+ export declare function hasSuspend(v: unknown): v is {
48
+ suspend: () => void | Promise<void>;
49
+ };
50
+ /** Type guard — returns true if the value has a callable `resume` method */
51
+ export declare function hasResume(v: unknown): v is {
52
+ resume: () => void | Promise<void>;
53
+ };
47
54
  //# sourceMappingURL=lifecycle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7C;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,aAAa,IAC/C,CAAC,OAAO,SAAS,CAAC,GAAG;IAAE,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,EAAE,CAAC,GAC5D,CAAC,MAAM,SAAU,CAAC,GAAG;IAAE,IAAI,IAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,EAAE,CAAC,CAAC;AAE/D,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,KAAK,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAE/E;AAED,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAE7E"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEpE;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,aAAa,IAC/C,CAAC,OAAO,SAAW,CAAC,GAAG;IAAE,KAAK,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,EAAE,CAAC,GAChE,CAAC,MAAM,SAAY,CAAC,GAAG;IAAE,IAAI,IAAO,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,EAAE,CAAC,GAChE,CAAC,SAAS,SAAS,CAAC,GAAG;IAAE,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,EAAE,CAAC,GAChE,CAAC,QAAQ,SAAU,CAAC,GAAG;IAAE,MAAM,IAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,EAAE,CAAC,CAAC;AAEnE,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,KAAK,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAE/E;AAED,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAE7E;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAEnF;AAED,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAEjF"}
package/dist/lifecycle.js CHANGED
@@ -2,28 +2,23 @@
2
2
  * Loom — LoomLifecycle interface
3
3
  *
4
4
  * Opt-in service lifecycle contract. Services that implement this interface
5
- * will have their `start()` and/or `stop()` methods called automatically
6
- * by `app.start()` and `app.stop()`.
5
+ * will have their methods called automatically by the app:
6
+ *
7
+ * - `start()` / `stop()` — called by `app.start()` / `app.stop()`
8
+ * - `suspend()` / `resume()` — called on `visibilitychange` (tab hidden / visible)
7
9
  *
8
10
  * ```ts
9
11
  * @service("ws")
10
- * class WebSocketService implements LoomLifecycle<"start" | "stop"> {
11
- * start() { this.ws.connect(); }
12
- * stop() { this.ws.disconnect(); }
12
+ * class WebSocketService implements LoomLifecycle<"start" | "stop" | "suspend" | "resume"> {
13
+ * start() { this.ws.connect(); }
14
+ * stop() { this.ws.disconnect(); }
15
+ * suspend() { this.ws.pauseHeartbeat(); } // tab hidden
16
+ * resume() { this.ws.reconnect(); } // tab visible
13
17
  * }
14
- *
15
- * // No manual call needed in main.ts — app.start() handles it.
16
18
  * ```
17
19
  *
18
20
  * The generic parameter enforces which hooks the service declares.
19
21
  * Hooks not in T become `never` — calling them is a compile-time error.
20
- *
21
- * ```ts
22
- * class AnalyticsService implements LoomLifecycle<"start"> {
23
- * start() { this.track("app_boot"); }
24
- * // stop() is `never` — calling it won't compile
25
- * }
26
- * ```
27
22
  */
28
23
  /** Type guard — returns true if the value has a callable `start` method */
29
24
  export function hasStart(v) {
@@ -33,4 +28,12 @@ export function hasStart(v) {
33
28
  export function hasStop(v) {
34
29
  return typeof v?.stop === "function";
35
30
  }
31
+ /** Type guard — returns true if the value has a callable `suspend` method */
32
+ export function hasSuspend(v) {
33
+ return typeof v?.suspend === "function";
34
+ }
35
+ /** Type guard — returns true if the value has a callable `resume` method */
36
+ export function hasResume(v) {
37
+ return typeof v?.resume === "function";
38
+ }
36
39
  //# sourceMappingURL=lifecycle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAaH,2EAA2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAQ,CAAS,EAAE,KAAK,KAAK,UAAU,CAAC;AACjD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,OAAO,CAAC,CAAU;IAChC,OAAO,OAAQ,CAAS,EAAE,IAAI,KAAK,UAAU,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAeH,2EAA2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAQ,CAAS,EAAE,KAAK,KAAK,UAAU,CAAC;AACjD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,OAAO,CAAC,CAAU;IAChC,OAAO,OAAQ,CAAS,EAAE,IAAI,KAAK,UAAU,CAAC;AAChD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,OAAO,OAAQ,CAAS,EAAE,OAAO,KAAK,UAAU,CAAC;AACnD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CAAC,CAAU;IAClC,OAAO,OAAQ,CAAS,EAAE,MAAM,KAAK,UAAU,CAAC;AAClD,CAAC"}
@@ -14,4 +14,5 @@ export type { RouterOptions, RouteInfo, RouteTarget } from "./router";
14
14
  export { LoomOutlet } from "./outlet";
15
15
  export { LoomLink } from "./link";
16
16
  export { onRouteEnter, onRouteLeave } from "./route-lifecycle";
17
+ export { subdomain, domain, tld } from "./url";
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGhE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpF,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGlD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGlC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGhE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpF,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGlD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGlC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC"}
@@ -20,4 +20,6 @@ export { LoomOutlet } from "./outlet";
20
20
  export { LoomLink } from "./link";
21
21
  // Route lifecycle
22
22
  export { onRouteEnter, onRouteLeave } from "./route-lifecycle";
23
+ // URL part decorators
24
+ export { subdomain, domain, tld } from "./url";
23
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO;AACP,OAAO,EAAmB,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEhE,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,yBAAyB;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAElD,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/E,4EAA4E;AAC5E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,iBAAiB;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO;AACP,OAAO,EAAmB,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEhE,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,yBAAyB;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAElD,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/E,4EAA4E;AAC5E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,iBAAiB;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE/D,sBAAsB;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Loom Router — URL part decorators (TC39 Stage 3)
3
+ *
4
+ * @subdomain — auto-accessor initialised to the subdomain of the current hostname
5
+ * @domain — auto-accessor initialised to the domain label
6
+ * @tld — auto-accessor initialised to the effective TLD (handles .co.uk etc.)
7
+ *
8
+ * These are "set-and-forget" decorators: the value is derived once at
9
+ * construction time from `window.location.hostname` and never changes.
10
+ * No reactive backing, no connect hooks — just override `init()`.
11
+ *
12
+ * ```ts
13
+ * @subdomain accessor tenant = ""; // "tenant.app.co.uk" → "tenant"
14
+ * @domain accessor host = ""; // "tenant.app.co.uk" → "app"
15
+ * @tld accessor ext = ""; // "tenant.app.co.uk" → "co.uk"
16
+ * ```
17
+ */
18
+ interface ParsedHostname {
19
+ subdomain: string;
20
+ domain: string;
21
+ tld: string;
22
+ }
23
+ /** @internal — exported for unit tests only */
24
+ export declare function parseHostname(hostname?: string): ParsedHostname;
25
+ /**
26
+ * Auto-accessor initialised to the subdomain of `window.location.hostname`.
27
+ *
28
+ * ```ts
29
+ * @subdomain accessor tenant = "";
30
+ * // tenant.app.com → "tenant"
31
+ * // a.b.app.com → "a.b"
32
+ * // app.com → ""
33
+ * ```
34
+ */
35
+ export declare const subdomain: <This extends object>(_target: ClassAccessorDecoratorTarget<This, string>, _context: ClassAccessorDecoratorContext<This, string>) => ClassAccessorDecoratorResult<This, string>;
36
+ type DomainMode = "full";
37
+ type DomainDecorator = <This extends object>(target: ClassAccessorDecoratorTarget<This, string>, context: ClassAccessorDecoratorContext<This, string>) => ClassAccessorDecoratorResult<This, string>;
38
+ /**
39
+ * Auto-accessor initialised to the domain label of `window.location.hostname`.
40
+ *
41
+ * Bare form — returns just the domain label:
42
+ * ```ts
43
+ * @domain accessor host = "";
44
+ * // tenant.app.com → "app"
45
+ * // app.com → "app"
46
+ * // localhost → "localhost"
47
+ * ```
48
+ *
49
+ * Factory form `"full"` — returns `domain.tld`:
50
+ * ```ts
51
+ * @domain("full") accessor host = "";
52
+ * // tenant.app.com → "app.com"
53
+ * // a.b.app.co.uk → "app.co.uk"
54
+ * // localhost → "localhost" (no TLD → just the label)
55
+ * ```
56
+ */
57
+ export declare function domain(mode: DomainMode): DomainDecorator;
58
+ export declare function domain<This extends object>(target: ClassAccessorDecoratorTarget<This, string>, context: ClassAccessorDecoratorContext<This, string>): ClassAccessorDecoratorResult<This, string>;
59
+ /**
60
+ * Auto-accessor initialised to the TLD (last hostname label(s)).
61
+ *
62
+ * ```ts
63
+ * @tld accessor ext = "";
64
+ * // tenant.app.com → "com"
65
+ * // app.co.uk → "co.uk"
66
+ * // localhost → ""
67
+ * ```
68
+ */
69
+ export declare const tld: <This extends object>(_target: ClassAccessorDecoratorTarget<This, string>, _context: ClassAccessorDecoratorContext<This, string>) => ClassAccessorDecoratorResult<This, string>;
70
+ export {};
71
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/router/url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAuCH,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAK,MAAM,CAAC;IAClB,GAAG,EAAQ,MAAM,CAAC;CACnB;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,CAsB/D;AA8BD;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,GAnCH,IAAI,SAAS,MAAM,WACzB,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,YACzC,6BAA6B,CAAC,IAAI,EAAE,MAAM,CAAC,KACpD,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAgCD,CAAC;AAI9C,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,KAAK,eAAe,GAAG,CAAC,IAAI,SAAS,MAAM,EACzC,MAAM,EAAE,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,EAClD,OAAO,EAAE,6BAA6B,CAAC,IAAI,EAAE,MAAM,CAAC,KACjD,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAuBhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAAC;AAC1D,wBAAgB,MAAM,CAAC,IAAI,SAAS,MAAM,EACxC,MAAM,EAAE,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,EAClD,OAAO,EAAE,6BAA6B,CAAC,IAAI,EAAE,MAAM,CAAC,GACnD,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAa9C;;;;;;;;;GASG;AACH,eAAO,MAAM,GAAG,GAjHG,IAAI,SAAS,MAAM,WACzB,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,YACzC,6BAA6B,CAAC,IAAI,EAAE,MAAM,CAAC,KACpD,4BAA4B,CAAC,IAAI,EAAE,MAAM,CA8Gb,CAAC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Loom Router — URL part decorators (TC39 Stage 3)
3
+ *
4
+ * @subdomain — auto-accessor initialised to the subdomain of the current hostname
5
+ * @domain — auto-accessor initialised to the domain label
6
+ * @tld — auto-accessor initialised to the effective TLD (handles .co.uk etc.)
7
+ *
8
+ * These are "set-and-forget" decorators: the value is derived once at
9
+ * construction time from `window.location.hostname` and never changes.
10
+ * No reactive backing, no connect hooks — just override `init()`.
11
+ *
12
+ * ```ts
13
+ * @subdomain accessor tenant = ""; // "tenant.app.co.uk" → "tenant"
14
+ * @domain accessor host = ""; // "tenant.app.co.uk" → "app"
15
+ * @tld accessor ext = ""; // "tenant.app.co.uk" → "co.uk"
16
+ * ```
17
+ */
18
+ // ── Known 2-part TLDs ─────────────────────────────────────────────────────────
19
+ // Covers the most common compound TLDs without shipping the full PSL (~100 kb).
20
+ // Source: IANA + real-world frequency. Add entries as needed.
21
+ const TWO_PART_TLDS = new Set([
22
+ // UK
23
+ "co.uk", "org.uk", "me.uk", "net.uk", "ltd.uk", "plc.uk", "gov.uk", "sch.uk", "ac.uk", "mod.uk",
24
+ // Australia
25
+ "com.au", "net.au", "org.au", "edu.au", "gov.au", "id.au", "asn.au",
26
+ // New Zealand
27
+ "co.nz", "net.nz", "org.nz", "govt.nz", "school.nz", "ac.nz",
28
+ // Japan
29
+ "co.jp", "ne.jp", "or.jp", "ed.jp", "ac.jp", "go.jp", "ad.jp",
30
+ // Brazil
31
+ "com.br", "net.br", "org.br", "gov.br", "edu.br", "ind.br",
32
+ // India
33
+ "co.in", "net.in", "org.in", "gen.in", "firm.in", "gov.in",
34
+ // South Africa
35
+ "co.za", "net.za", "org.za", "gov.za", "edu.za",
36
+ // South Korea
37
+ "co.kr", "or.kr", "go.kr", "ne.kr", "ac.kr",
38
+ // China
39
+ "com.cn", "net.cn", "org.cn", "gov.cn", "edu.cn", "ac.cn",
40
+ // Hong Kong
41
+ "com.hk", "net.hk", "org.hk", "edu.hk", "gov.hk",
42
+ // Singapore
43
+ "com.sg", "net.sg", "org.sg", "edu.sg", "gov.sg",
44
+ // Malaysia
45
+ "com.my", "net.my", "org.my", "edu.my", "gov.my",
46
+ // Others
47
+ "co.id", "co.th", "com.ph", "com.ar", "net.ar", "com.mx", "com.co",
48
+ "co.ie", "com.cy", "com.pk", "net.pk", "com.sg", "co.tt", "co.ke",
49
+ "com.ng", "com.eg", "com.tr", "com.tw", "com.vn", "com.ua",
50
+ ]);
51
+ /** @internal — exported for unit tests only */
52
+ export function parseHostname(hostname) {
53
+ const host = hostname ?? (typeof window !== "undefined" ? window.location.hostname : "");
54
+ const parts = host.split(".");
55
+ if (parts.length === 1) {
56
+ return { subdomain: "", domain: parts[0], tld: "" };
57
+ }
58
+ if (parts.length === 2) {
59
+ return { subdomain: "", domain: parts[0], tld: parts[1] };
60
+ }
61
+ // Check if the last two labels form a known compound TLD (e.g. "co.uk")
62
+ const lastTwo = `${parts[parts.length - 2]}.${parts[parts.length - 1]}`;
63
+ const tldLen = TWO_PART_TLDS.has(lastTwo) ? 2 : 1;
64
+ return {
65
+ tld: parts.slice(-tldLen).join("."),
66
+ domain: parts[parts.length - tldLen - 1],
67
+ subdomain: parts.slice(0, -tldLen - 1).join("."),
68
+ };
69
+ }
70
+ // ── Factory & helpers ────────────────────────────────────────────────────────
71
+ function urlPart(part) {
72
+ return function (_target, _context) {
73
+ // Per-instance WeakMap — same lazy-init pattern as @store.
74
+ // hostname is read on the FIRST property access and cached; subsequent
75
+ // reads and any set() calls use the cache directly.
76
+ const storage = new WeakMap();
77
+ return {
78
+ get() {
79
+ if (!storage.has(this)) {
80
+ storage.set(this, parseHostname()[part]);
81
+ }
82
+ return storage.get(this);
83
+ },
84
+ set(value) {
85
+ storage.set(this, value);
86
+ },
87
+ };
88
+ };
89
+ }
90
+ // ── Public decorators ─────────────────────────────────────────────────────────
91
+ /**
92
+ * Auto-accessor initialised to the subdomain of `window.location.hostname`.
93
+ *
94
+ * ```ts
95
+ * @subdomain accessor tenant = "";
96
+ * // tenant.app.com → "tenant"
97
+ * // a.b.app.com → "a.b"
98
+ * // app.com → ""
99
+ * ```
100
+ */
101
+ export const subdomain = urlPart("subdomain");
102
+ function makeDomainDecorator(full) {
103
+ const storage = new WeakMap();
104
+ return function (_target, _context) {
105
+ return {
106
+ get() {
107
+ if (!storage.has(this)) {
108
+ const { domain: d, tld: t } = parseHostname();
109
+ storage.set(this, full && t ? `${d}.${t}` : d);
110
+ }
111
+ return storage.get(this);
112
+ },
113
+ set(value) {
114
+ storage.set(this, value);
115
+ },
116
+ };
117
+ };
118
+ }
119
+ export function domain(targetOrMode, context) {
120
+ if (typeof targetOrMode === "string") {
121
+ // @domain("full") — factory form
122
+ return makeDomainDecorator(true);
123
+ }
124
+ // bare @domain
125
+ return makeDomainDecorator(false)(targetOrMode, context);
126
+ }
127
+ /**
128
+ * Auto-accessor initialised to the TLD (last hostname label(s)).
129
+ *
130
+ * ```ts
131
+ * @tld accessor ext = "";
132
+ * // tenant.app.com → "com"
133
+ * // app.co.uk → "co.uk"
134
+ * // localhost → ""
135
+ * ```
136
+ */
137
+ export const tld = urlPart("tld");
138
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/router/url.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toyz/loom",
3
- "version": "0.19.6",
3
+ "version": "0.19.8",
4
4
  "type": "module",
5
5
  "description": "Decorator-driven web component framework with reactive state, DOM morphing, DI, and JSX",
6
6
  "license": "MIT",