@spearwolf/shadow-objects 0.31.0 → 0.33.0

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.
Files changed (82) hide show
  1. package/CHANGELOG.md +69 -1
  2. package/README.md +49 -13
  3. package/bundle.js +9 -9
  4. package/package.json +3 -3
  5. package/src/elements/ShaeEntElement.d.ts +4 -4
  6. package/src/elements/ShaeEntElement.d.ts.map +1 -1
  7. package/src/elements/ShaeEntElement.js +4 -5
  8. package/src/elements/ShaeEntElement.js.map +2 -2
  9. package/src/elements/ShaePropElement.d.ts +5 -5
  10. package/src/elements/ShaePropElement.d.ts.map +1 -1
  11. package/src/elements/ShaePropElement.js +2 -2
  12. package/src/elements/ShaePropElement.js.map +2 -2
  13. package/src/elements/ShaeWorkerElement.d.ts.map +1 -1
  14. package/src/elements/ShaeWorkerElement.js +31 -6
  15. package/src/elements/ShaeWorkerElement.js.map +2 -2
  16. package/src/in-the-dark/Kernel.d.ts +5 -0
  17. package/src/in-the-dark/Kernel.d.ts.map +1 -1
  18. package/src/in-the-dark/Kernel.js +49 -24
  19. package/src/in-the-dark/Kernel.js.map +2 -2
  20. package/src/in-the-dark/Registry.d.ts +1 -1
  21. package/src/in-the-dark/Registry.d.ts.map +1 -1
  22. package/src/in-the-dark/Registry.js +24 -20
  23. package/src/in-the-dark/Registry.js.map +2 -2
  24. package/src/in-the-dark/ShadowObject.d.ts +1 -1
  25. package/src/in-the-dark/ShadowObject.d.ts.map +1 -1
  26. package/src/in-the-dark/ShadowObject.js +2 -2
  27. package/src/in-the-dark/ShadowObject.js.map +2 -2
  28. package/src/in-the-dark/SignalsPath.d.ts.map +1 -1
  29. package/src/in-the-dark/SignalsPath.js.map +2 -2
  30. package/src/in-the-dark/importModule.js +3 -3
  31. package/src/in-the-dark/importModule.js.map +2 -2
  32. package/src/types.d.ts +4 -4
  33. package/src/types.d.ts.map +1 -1
  34. package/src/utils/ConsoleLogger.d.ts.map +1 -1
  35. package/src/utils/ConsoleLogger.js +3 -2
  36. package/src/utils/ConsoleLogger.js.map +2 -2
  37. package/src/utils/FrameLoop.d.ts +1 -1
  38. package/src/utils/FrameLoop.d.ts.map +1 -1
  39. package/src/utils/FrameLoop.js +0 -2
  40. package/src/utils/FrameLoop.js.map +2 -2
  41. package/src/utils/attr-utils.d.ts.map +1 -1
  42. package/src/utils/attr-utils.js +1 -1
  43. package/src/utils/attr-utils.js.map +2 -2
  44. package/src/utils/generateUUID.d.ts +1 -1
  45. package/src/utils/generateUUID.d.ts.map +1 -1
  46. package/src/utils/props-utils.d.ts +1 -1
  47. package/src/utils/props-utils.d.ts.map +1 -1
  48. package/src/utils/waitForMessageOfType.d.ts +5 -1
  49. package/src/utils/waitForMessageOfType.d.ts.map +1 -1
  50. package/src/utils/waitForMessageOfType.js +12 -2
  51. package/src/utils/waitForMessageOfType.js.map +2 -2
  52. package/src/view/ComponentChanges.d.ts +4 -1
  53. package/src/view/ComponentChanges.d.ts.map +1 -1
  54. package/src/view/ComponentChanges.js +20 -6
  55. package/src/view/ComponentChanges.js.map +2 -2
  56. package/src/view/ComponentContext.d.ts +43 -1
  57. package/src/view/ComponentContext.d.ts.map +1 -1
  58. package/src/view/ComponentContext.js +123 -47
  59. package/src/view/ComponentContext.js.map +2 -2
  60. package/src/view/ComponentMemory.js +3 -1
  61. package/src/view/ComponentMemory.js.map +2 -2
  62. package/src/view/IShadowObjectEnvProxy.d.ts +6 -0
  63. package/src/view/IShadowObjectEnvProxy.d.ts.map +1 -1
  64. package/src/view/LocalShadowObjectEnv.d.ts +1 -1
  65. package/src/view/LocalShadowObjectEnv.d.ts.map +1 -1
  66. package/src/view/LocalShadowObjectEnv.js +11 -6
  67. package/src/view/LocalShadowObjectEnv.js.map +2 -2
  68. package/src/view/RemoteWorkerEnv.d.ts +42 -0
  69. package/src/view/RemoteWorkerEnv.d.ts.map +1 -1
  70. package/src/view/RemoteWorkerEnv.js +130 -18
  71. package/src/view/RemoteWorkerEnv.js.map +2 -2
  72. package/src/view/ShadowEnv.d.ts +25 -1
  73. package/src/view/ShadowEnv.d.ts.map +1 -1
  74. package/src/view/ShadowEnv.js +103 -29
  75. package/src/view/ShadowEnv.js.map +2 -2
  76. package/src/view/ViewComponent.d.ts +22 -1
  77. package/src/view/ViewComponent.d.ts.map +1 -1
  78. package/src/view/ViewComponent.js +66 -22
  79. package/src/view/ViewComponent.js.map +2 -2
  80. package/src/worker/MessageRouter.d.ts.map +1 -1
  81. package/src/worker/MessageRouter.js +7 -5
  82. package/src/worker/MessageRouter.js.map +2 -2
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@spearwolf/shadow-objects",
3
3
  "description": "a reactive entity-component framework that feels at home in the shadows",
4
4
  "homepage": "https://github.com/spearwolf/shadow-objects/",
5
- "version": "0.31.0",
5
+ "version": "0.33.0",
6
6
  "author": {
7
7
  "name": "Wolfger Schramm",
8
8
  "email": "wolfger@spearwolf.de",
@@ -69,7 +69,7 @@
69
69
  "src/shae-worker.js"
70
70
  ],
71
71
  "dependencies": {
72
- "@spearwolf/eventize": "^4.3.1",
73
- "@spearwolf/signalize": "^0.28.0"
72
+ "@spearwolf/eventize": "^5.0.0",
73
+ "@spearwolf/signalize": "^0.30.0"
74
74
  }
75
75
  }
@@ -5,9 +5,9 @@ export declare class ShaeEntElement extends ShaeElement {
5
5
  #private;
6
6
  static observedAttributes: string[];
7
7
  readonly isShaeEntElement = true;
8
- readonly componentContext$: import("@spearwolf/signalize").Signal<ComponentContext>;
9
- readonly viewComponent$: import("@spearwolf/signalize").Signal<ViewComponent>;
10
- readonly token$: import("@spearwolf/signalize").Signal<string>;
8
+ readonly componentContext$: import("@spearwolf/signalize").Signal<ComponentContext | undefined>;
9
+ readonly viewComponent$: import("@spearwolf/signalize").Signal<ViewComponent | undefined>;
10
+ readonly token$: import("@spearwolf/signalize").Signal<string | undefined>;
11
11
  readonly forwardCustomEvents$: import("@spearwolf/signalize").Signal<boolean | Set<string>>;
12
12
  get componentContext(): ComponentContext | undefined;
13
13
  get viewComponent(): ViewComponent | undefined;
@@ -17,7 +17,7 @@ export declare class ShaeEntElement extends ShaeElement {
17
17
  entParentNode?: ShaeEntElement;
18
18
  constructor();
19
19
  findShadowRootHost(): HTMLElement | undefined;
20
- protected getParentNodeForObserver(): ParentNode;
20
+ protected getParentNodeForObserver(): Node | undefined;
21
21
  connectedCallback(): void;
22
22
  onParentChanged(_newParent: Node | undefined, _oldParent: Node): void;
23
23
  attributeChangedCallback(name: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"ShaeEntElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaeEntElement.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,cAAe,SAAQ,WAAW;;IAC7C,OAAgB,kBAAkB,WAA+E;IAEjH,QAAQ,CAAC,gBAAgB,QAAQ;IAEjC,QAAQ,CAAC,iBAAiB,0DAAgD;IAC1E,QAAQ,CAAC,cAAc,uDAA6C;IACpE,QAAQ,CAAC,MAAM,gDAAsC;IACrD,QAAQ,CAAC,oBAAoB,+DAA8C;IAE3E,IAAI,gBAAgB,IAAI,gBAAgB,GAAG,SAAS,CAEnD;IAED,IAAI,aAAa,IAAI,aAAa,GAAG,SAAS,CAE7C;IAED,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAElC;IAED,aAAa,CAAC,EAAE,cAAc,CAAC;;IAkJ/B,kBAAkB,IAAI,WAAW,GAAG,SAAS;IAmB7C,SAAS,CAAC,wBAAwB;IAMlC,iBAAiB;IAmDjB,eAAe,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,EAAE,UAAU,EAAE,IAAI;IAUrD,wBAAwB,CAAC,IAAI,EAAE,MAAM;IAS9C,oBAAoB;CAgJrB"}
1
+ {"version":3,"file":"ShaeEntElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaeEntElement.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,cAAe,SAAQ,WAAW;;IAC7C,OAAgB,kBAAkB,WAA+E;IAEjH,QAAQ,CAAC,gBAAgB,QAAQ;IAEjC,QAAQ,CAAC,iBAAiB,sEAAgD;IAC1E,QAAQ,CAAC,cAAc,mEAA6C;IACpE,QAAQ,CAAC,MAAM,4DAAsC;IACrD,QAAQ,CAAC,oBAAoB,+DAA8C;IAE3E,IAAI,gBAAgB,IAAI,gBAAgB,GAAG,SAAS,CAEnD;IAED,IAAI,aAAa,IAAI,aAAa,GAAG,SAAS,CAE7C;IAED,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAElC;IAED,aAAa,CAAC,EAAE,cAAc,CAAC;;IAoJ/B,kBAAkB,IAAI,WAAW,GAAG,SAAS;IAmB7C,SAAS,CAAC,wBAAwB,IAAI,IAAI,GAAG,SAAS;IAOtD,iBAAiB;IAmDjB,eAAe,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,EAAE,UAAU,EAAE,IAAI;IAUrD,wBAAwB,CAAC,IAAI,EAAE,MAAM;IAS9C,oBAAoB;CAgJrB"}
@@ -1,5 +1,6 @@
1
1
  import { on } from "@spearwolf/eventize";
2
2
  import { beQuiet, createEffect, createSignal } from "@spearwolf/signalize";
3
+ import { VoidToken } from "../constants.js";
3
4
  import { ComponentContext } from "../view/ComponentContext.js";
4
5
  import { ShadowEnv } from "../view/ShadowEnv.js";
5
6
  import { ViewComponent } from "../view/ViewComponent.js";
@@ -155,7 +156,7 @@ class ShaeEntElement extends ShaeElement {
155
156
  if (vc) {
156
157
  vc.context = context;
157
158
  } else if (context) {
158
- vc = new ViewComponent(token, { context });
159
+ vc = new ViewComponent(token ?? VoidToken, { context });
159
160
  this.viewComponent$.set(vc);
160
161
  }
161
162
  this.syncShadowObjects();
@@ -188,9 +189,7 @@ class ShaeEntElement extends ShaeElement {
188
189
  return this.#shadowRootHost;
189
190
  }
190
191
  getParentNodeForObserver() {
191
- const parent = this.parentNode;
192
- if (parent) return parent;
193
- return parent.host ?? parent;
192
+ return this.parentNode ?? this.getRootNode()?.host ?? void 0;
194
193
  }
195
194
  connectedCallback() {
196
195
  this.#shadowRootHostNeedsUpdate = true;
@@ -300,7 +299,7 @@ class ShaeEntElement extends ShaeElement {
300
299
  this.#unsubscribeFromParent = () => e.destroy();
301
300
  } else {
302
301
  const vc = this.viewComponent;
303
- if (vc.parent) {
302
+ if (vc?.parent) {
304
303
  vc.parent = void 0;
305
304
  this.syncShadowObjects();
306
305
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/elements/ShaeEntElement.ts"],
4
- "sourcesContent": ["import {on} from '@spearwolf/eventize';\nimport {beQuiet, createEffect, createSignal} from '@spearwolf/signalize';\nimport {ComponentContext} from '../view/ComponentContext.js';\nimport {ShadowEnv} from '../view/ShadowEnv.js';\nimport {ViewComponent} from '../view/ViewComponent.js';\nimport {ATTR_FORWARD_CUSTOM_EVENTS, ATTR_TOKEN, RequestEntParentEventName, ReRequestEntParentEventName} from './constants.js';\nimport {ShaeElement} from './ShaeElement.js';\n\nexport class ShaeEntElement extends ShaeElement {\n static override observedAttributes = [...ShaeElement.observedAttributes, ATTR_TOKEN, ATTR_FORWARD_CUSTOM_EVENTS];\n\n readonly isShaeEntElement = true;\n\n readonly componentContext$ = createSignal<ComponentContext | undefined>();\n readonly viewComponent$ = createSignal<ViewComponent | undefined>();\n readonly token$ = createSignal<string | undefined>();\n readonly forwardCustomEvents$ = createSignal<Set<string> | boolean>(false);\n\n get componentContext(): ComponentContext | undefined {\n return this.componentContext$.value;\n }\n\n get viewComponent(): ViewComponent | undefined {\n return this.viewComponent$.value;\n }\n\n get uuid(): string | undefined {\n return this.viewComponent?.uuid;\n }\n\n get token(): string | undefined {\n return this.token$.value;\n }\n\n set token(token: string | undefined) {\n this.token$.set(token);\n }\n\n entParentNode?: ShaeEntElement;\n\n #parentObserver?: MutationObserver;\n\n constructor() {\n super();\n\n this.ns$.onChange((ns) => {\n this.componentContext$.set(ComponentContext.get(ns));\n if (this.isConnected) {\n this.#dispatchRequestParent();\n }\n });\n\n this.#updateTokenValue();\n\n this.token$.onChange((token) => {\n if (token == null) {\n this.removeAttribute(ATTR_TOKEN);\n } else if (this.getAttribute(ATTR_TOKEN) !== token) {\n this.setAttribute(ATTR_TOKEN, token);\n }\n });\n\n this.#updateForwardCustomEventsValue();\n\n this.forwardCustomEvents$.onChange((val) => {\n if (!val) {\n this.removeAttribute(ATTR_FORWARD_CUSTOM_EVENTS);\n } else if (val === true) {\n if (!this.hasAttribute(ATTR_FORWARD_CUSTOM_EVENTS)) {\n this.setAttribute(ATTR_FORWARD_CUSTOM_EVENTS, '');\n }\n } else {\n const str = Array.from(val).join(',');\n if (this.getAttribute(ATTR_FORWARD_CUSTOM_EVENTS) !== str) {\n this.setAttribute(ATTR_FORWARD_CUSTOM_EVENTS, str);\n }\n }\n });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const unsubcribe = on(vc, ComponentContext.ReRequestParentRoots, () => this.#reReuestParentRoot());\n const oldNs = vc.context?.ns;\n return () => {\n unsubcribe();\n vc.destroy();\n if (oldNs && oldNs !== this.ns) {\n ShadowEnv.get(oldNs)?.sync();\n } else {\n this.syncShadowObjects();\n }\n };\n }\n });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (!vc) return;\n\n // Make sure we are patching the instance method, not the prototype\n const originalDispatchEvent = Object.hasOwn(vc, 'dispatchEvent')\n ? Object.getPrototypeOf(vc).dispatchEvent\n : vc.dispatchEvent;\n\n const filter = this.forwardCustomEvents$.get();\n if (!filter) return;\n\n const allowedTypes = filter instanceof Set ? filter : undefined;\n\n const newDispatch = (type: string, data: unknown, traverseChildren: boolean) => {\n originalDispatchEvent.call(vc, type, data, traverseChildren);\n\n if (type === ComponentContext.ReRequestParentRoots) return;\n\n if (allowedTypes && !allowedTypes.has(type)) return;\n\n this.dispatchEvent(\n new CustomEvent(type, {\n bubbles: true,\n composed: true,\n detail: data,\n }),\n );\n };\n\n // We use defineProperty to ensure it is writable and configurable\n Object.defineProperty(vc, 'dispatchEvent', {\n value: newDispatch,\n writable: true,\n configurable: true,\n });\n\n return () => {\n if (Object.hasOwn(vc, 'dispatchEvent') && vc.dispatchEvent === newDispatch) {\n delete vc.dispatchEvent;\n }\n };\n });\n\n this.token$.onChange((token) => {\n const vc = this.viewComponent$.value;\n if (vc) {\n vc.token = token;\n this.syncShadowObjects();\n }\n });\n\n this.style.display = 'contents';\n }\n\n #unsubscribeViewComponentEffect?: () => void;\n\n #setupViewComponentEffect() {\n this.#unsubscribeViewComponentEffect?.();\n\n const unsubscribeComponentContext = this.componentContext$.onChange((context) => {\n const token = this.token$.value;\n\n let vc = this.viewComponent$.value;\n\n if (vc) {\n vc.context = context;\n } else if (context) {\n vc = new ViewComponent(token, {context});\n this.viewComponent$.set(vc);\n }\n\n this.syncShadowObjects();\n });\n\n this.#unsubscribeViewComponentEffect = () => {\n unsubscribeComponentContext();\n };\n }\n\n #destroyViewComponentEffect() {\n this.#unsubscribeViewComponentEffect?.();\n this.#unsubscribeViewComponentEffect = undefined;\n }\n\n #shadowRootHost?: HTMLElement;\n #shadowRootHostNeedsUpdate = true;\n\n findShadowRootHost(): HTMLElement | undefined {\n if (this.#shadowRootHostNeedsUpdate) {\n this.#shadowRootHostNeedsUpdate = false;\n\n let current: HTMLElement = this;\n while (current) {\n if (current.parentElement == null) {\n const root = current.parentNode as ShadowRoot;\n if (root) {\n this.#shadowRootHost = root.host as HTMLElement;\n }\n break;\n }\n current = current.parentElement;\n }\n }\n return this.#shadowRootHost;\n }\n\n protected getParentNodeForObserver() {\n const parent = this.parentNode;\n if (parent) return parent;\n return (parent as ShadowRoot).host ?? parent;\n }\n\n connectedCallback() {\n this.#shadowRootHostNeedsUpdate = true;\n\n this.addEventListener('slotchange', this.#onSlotChange, {capture: false, passive: false});\n this.addEventListener(RequestEntParentEventName, this.#onRequestParent, {capture: false, passive: false});\n\n this.#setupViewComponentEffect();\n\n // --- token ---\n beQuiet(() => this.#updateTokenValue());\n\n // --- forward-custom-events ---\n beQuiet(() => this.#updateForwardCustomEventsValue());\n\n // --- componentContext | viewComponent ---\n if (this.componentContext == null) {\n this.componentContext$.set(ComponentContext.get(this.ns));\n }\n\n // --- viewComponent.parent ---\n this.#dispatchRequestParent();\n\n // --- parents ---\n this.componentContext?.dispatchReRequestParentRoots();\n this.#createParentObserver();\n\n // --- sync! ---\n this.syncShadowObjects();\n }\n\n #createParentObserver() {\n this.#destroyParentObserver();\n const parent = this.getParentNodeForObserver();\n if (parent) {\n this.#parentObserver = new MutationObserver((mutations, _observer) => {\n for (const {target, removedNodes} of mutations) {\n if (target === parent) {\n for (const node of removedNodes) {\n if (node === this) {\n this.#destroyParentObserver();\n this.onParentChanged(this.getParentNodeForObserver(), parent);\n break;\n }\n }\n }\n }\n });\n this.#parentObserver.observe(parent, {childList: true, subtree: false, attributes: false});\n }\n }\n\n onParentChanged(_newParent: Node | undefined, _oldParent: Node) {\n this.#setParent(undefined);\n this.#dispatchRequestParent();\n }\n\n #destroyParentObserver() {\n this.#parentObserver?.disconnect();\n this.#parentObserver = undefined;\n }\n\n override attributeChangedCallback(name: string) {\n super.attributeChangedCallback(name);\n if (name === ATTR_TOKEN) {\n this.#updateTokenValue();\n } else if (name === ATTR_FORWARD_CUSTOM_EVENTS) {\n this.#updateForwardCustomEventsValue();\n }\n }\n\n disconnectedCallback() {\n this.#shadowRootHostNeedsUpdate = true;\n\n this.#destroyParentObserver();\n\n this.removeEventListener('slotchange', this.#onSlotChange, {capture: false});\n this.removeEventListener(RequestEntParentEventName, this.#onRequestParent, {capture: false});\n\n this.#setParent(undefined);\n\n this.componentContext$.set(undefined);\n\n this.syncShadowObjects();\n\n this.#destroyViewComponentEffect();\n }\n\n #reReuestParentRoot() {\n if (this.isConnected) {\n this.#setParent(undefined);\n this.#dispatchRequestParent();\n }\n }\n\n #dispatchRequestParent() {\n // https://pm.dartus.fr/blog/a-complete-guide-on-shadow-dom-and-event-propagation/\n this.dispatchEvent(\n new CustomEvent(RequestEntParentEventName, {\n bubbles: true,\n composed: true,\n detail: {requester: this},\n }),\n );\n }\n\n #unsubscribeFromParent?: () => void;\n\n #setParent(parent?: ShaeEntElement) {\n if (this.entParentNode === parent) return;\n\n if (this.entParentNode) {\n this.entParentNode.removeEventListener(ReRequestEntParentEventName, this.#onReRequestParent, {capture: false});\n }\n\n this.entParentNode = parent;\n\n if (this.entParentNode) {\n this.entParentNode.addEventListener(ReRequestEntParentEventName, this.#onReRequestParent, {\n capture: false,\n passive: false,\n });\n }\n\n this.#unsubscribeFromParent?.();\n this.#unsubscribeFromParent = undefined;\n\n if (parent) {\n const e = createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const parentVC = parent.viewComponent$.get();\n vc.parent = parentVC && parentVC.context === vc.context ? parentVC : undefined;\n if (vc.parent == null) {\n queueMicrotask(() => {\n this.#dispatchRequestParent();\n });\n }\n this.syncShadowObjects();\n }\n });\n this.#unsubscribeFromParent = () => e.destroy();\n } else {\n const vc = this.viewComponent;\n if (vc.parent) {\n vc.parent = undefined;\n this.syncShadowObjects();\n }\n }\n }\n\n #onSlotChange = () => {\n const shadowRootHost = this.findShadowRootHost();\n if (shadowRootHost == null) return;\n this.dispatchEvent(\n new CustomEvent(ReRequestEntParentEventName, {\n bubbles: true,\n composed: true,\n detail: {requester: this, shadowRootHost},\n }),\n );\n };\n\n #onReRequestParent = (event: CustomEvent) => {\n const requester = event.detail?.requester as ShaeEntElement | undefined;\n\n if (requester === this) return;\n if (!requester?.isShaeEntElement) return;\n if (requester.ns !== this.ns) return;\n\n const shadowRootHost = event.detail?.shadowRootHost as HTMLElement | undefined;\n\n if (shadowRootHost) {\n this.#dispatchRequestParent();\n }\n };\n\n #onRequestParent = (event: CustomEvent) => {\n const requester = event.detail?.requester as ShaeEntElement | undefined;\n\n if (requester === this) return;\n if (!requester?.isShaeEntElement) return;\n if (requester.ns !== this.ns) return;\n\n event.stopPropagation();\n\n requester.#setParent(this);\n };\n\n #updateTokenValue() {\n if (this.hasAttribute(ATTR_TOKEN)) {\n const token = this.getAttribute(ATTR_TOKEN)?.trim() || undefined;\n this.token$.set(token);\n }\n }\n\n #updateForwardCustomEventsValue() {\n if (this.hasAttribute(ATTR_FORWARD_CUSTOM_EVENTS)) {\n const val = this.getAttribute(ATTR_FORWARD_CUSTOM_EVENTS);\n if (!val || val.trim().length === 0) {\n this.forwardCustomEvents$.set(true);\n } else {\n this.forwardCustomEvents$.set(\n new Set(\n val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0),\n ),\n );\n }\n } else {\n this.forwardCustomEvents$.set(false);\n }\n }\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {on} from '@spearwolf/eventize';\nimport {beQuiet, createEffect, createSignal} from '@spearwolf/signalize';\nimport {VoidToken} from '../constants.js';\nimport {ComponentContext} from '../view/ComponentContext.js';\nimport {ShadowEnv} from '../view/ShadowEnv.js';\nimport {ViewComponent} from '../view/ViewComponent.js';\nimport {ATTR_FORWARD_CUSTOM_EVENTS, ATTR_TOKEN, RequestEntParentEventName, ReRequestEntParentEventName} from './constants.js';\nimport {ShaeElement} from './ShaeElement.js';\n\nexport class ShaeEntElement extends ShaeElement {\n static override observedAttributes = [...ShaeElement.observedAttributes, ATTR_TOKEN, ATTR_FORWARD_CUSTOM_EVENTS];\n\n readonly isShaeEntElement = true;\n\n readonly componentContext$ = createSignal<ComponentContext | undefined>();\n readonly viewComponent$ = createSignal<ViewComponent | undefined>();\n readonly token$ = createSignal<string | undefined>();\n readonly forwardCustomEvents$ = createSignal<Set<string> | boolean>(false);\n\n get componentContext(): ComponentContext | undefined {\n return this.componentContext$.value;\n }\n\n get viewComponent(): ViewComponent | undefined {\n return this.viewComponent$.value;\n }\n\n get uuid(): string | undefined {\n return this.viewComponent?.uuid;\n }\n\n get token(): string | undefined {\n return this.token$.value;\n }\n\n set token(token: string | undefined) {\n this.token$.set(token);\n }\n\n entParentNode?: ShaeEntElement;\n\n #parentObserver?: MutationObserver;\n\n constructor() {\n super();\n\n this.ns$.onChange((ns) => {\n this.componentContext$.set(ComponentContext.get(ns));\n if (this.isConnected) {\n this.#dispatchRequestParent();\n }\n });\n\n this.#updateTokenValue();\n\n this.token$.onChange((token) => {\n if (token == null) {\n this.removeAttribute(ATTR_TOKEN);\n } else if (this.getAttribute(ATTR_TOKEN) !== token) {\n this.setAttribute(ATTR_TOKEN, token);\n }\n });\n\n this.#updateForwardCustomEventsValue();\n\n this.forwardCustomEvents$.onChange((val) => {\n if (!val) {\n this.removeAttribute(ATTR_FORWARD_CUSTOM_EVENTS);\n } else if (val === true) {\n if (!this.hasAttribute(ATTR_FORWARD_CUSTOM_EVENTS)) {\n this.setAttribute(ATTR_FORWARD_CUSTOM_EVENTS, '');\n }\n } else {\n const str = Array.from(val).join(',');\n if (this.getAttribute(ATTR_FORWARD_CUSTOM_EVENTS) !== str) {\n this.setAttribute(ATTR_FORWARD_CUSTOM_EVENTS, str);\n }\n }\n });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const unsubcribe = on(vc, ComponentContext.ReRequestParentRoots, () => this.#reReuestParentRoot());\n const oldNs = vc.context?.ns;\n return () => {\n unsubcribe();\n vc.destroy();\n if (oldNs && oldNs !== this.ns) {\n ShadowEnv.get(oldNs)?.sync();\n } else {\n this.syncShadowObjects();\n }\n };\n }\n });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (!vc) return;\n\n // Make sure we are patching the instance method, not the prototype\n const originalDispatchEvent = Object.hasOwn(vc, 'dispatchEvent')\n ? Object.getPrototypeOf(vc).dispatchEvent\n : vc.dispatchEvent;\n\n const filter = this.forwardCustomEvents$.get();\n if (!filter) return;\n\n const allowedTypes = filter instanceof Set ? filter : undefined;\n\n const newDispatch = (type: string, data: unknown, traverseChildren: boolean) => {\n originalDispatchEvent.call(vc, type, data, traverseChildren);\n\n if (type === ComponentContext.ReRequestParentRoots) return;\n\n if (allowedTypes && !allowedTypes.has(type)) return;\n\n this.dispatchEvent(\n new CustomEvent(type, {\n bubbles: true,\n composed: true,\n detail: data,\n }),\n );\n };\n\n // We use defineProperty to ensure it is writable and configurable\n Object.defineProperty(vc, 'dispatchEvent', {\n value: newDispatch,\n writable: true,\n configurable: true,\n });\n\n return () => {\n if (Object.hasOwn(vc, 'dispatchEvent') && vc.dispatchEvent === newDispatch) {\n // the property lives on the instance (defineProperty above), the method it shadows lives on\n // the prototype: deleting the own property restores the original, it does not remove the method\n delete (vc as {dispatchEvent?: ViewComponent['dispatchEvent']}).dispatchEvent;\n }\n };\n });\n\n this.token$.onChange((token) => {\n const vc = this.viewComponent$.value;\n if (vc) {\n vc.token = token;\n this.syncShadowObjects();\n }\n });\n\n this.style.display = 'contents';\n }\n\n #unsubscribeViewComponentEffect?: () => void;\n\n #setupViewComponentEffect() {\n this.#unsubscribeViewComponentEffect?.();\n\n const unsubscribeComponentContext = this.componentContext$.onChange((context) => {\n const token = this.token$.value;\n\n let vc = this.viewComponent$.value;\n\n if (vc) {\n vc.context = context;\n } else if (context) {\n vc = new ViewComponent(token ?? VoidToken, {context});\n this.viewComponent$.set(vc);\n }\n\n this.syncShadowObjects();\n });\n\n this.#unsubscribeViewComponentEffect = () => {\n unsubscribeComponentContext();\n };\n }\n\n #destroyViewComponentEffect() {\n this.#unsubscribeViewComponentEffect?.();\n this.#unsubscribeViewComponentEffect = undefined;\n }\n\n #shadowRootHost?: HTMLElement;\n #shadowRootHostNeedsUpdate = true;\n\n findShadowRootHost(): HTMLElement | undefined {\n if (this.#shadowRootHostNeedsUpdate) {\n this.#shadowRootHostNeedsUpdate = false;\n\n let current: HTMLElement = this;\n while (current) {\n if (current.parentElement == null) {\n const root = current.parentNode as ShadowRoot;\n if (root) {\n this.#shadowRootHost = root.host as HTMLElement;\n }\n break;\n }\n current = current.parentElement;\n }\n }\n return this.#shadowRootHost;\n }\n\n protected getParentNodeForObserver(): Node | undefined {\n // a node still sitting in a tree answers from the first term, and for one placed directly\n // under a shadow root that term is the shadow root itself. Once it has no parent left it is\n // its own root, so the host lookup comes up empty too and the answer is: no parent\n return this.parentNode ?? (this.getRootNode() as ShadowRoot)?.host ?? undefined;\n }\n\n connectedCallback() {\n this.#shadowRootHostNeedsUpdate = true;\n\n this.addEventListener('slotchange', this.#onSlotChange, {capture: false, passive: false});\n this.addEventListener(RequestEntParentEventName, this.#onRequestParent, {capture: false, passive: false});\n\n this.#setupViewComponentEffect();\n\n // --- token ---\n beQuiet(() => this.#updateTokenValue());\n\n // --- forward-custom-events ---\n beQuiet(() => this.#updateForwardCustomEventsValue());\n\n // --- componentContext | viewComponent ---\n if (this.componentContext == null) {\n this.componentContext$.set(ComponentContext.get(this.ns));\n }\n\n // --- viewComponent.parent ---\n this.#dispatchRequestParent();\n\n // --- parents ---\n this.componentContext?.dispatchReRequestParentRoots();\n this.#createParentObserver();\n\n // --- sync! ---\n this.syncShadowObjects();\n }\n\n #createParentObserver() {\n this.#destroyParentObserver();\n const parent = this.getParentNodeForObserver();\n if (parent) {\n this.#parentObserver = new MutationObserver((mutations, _observer) => {\n for (const {target, removedNodes} of mutations) {\n if (target === parent) {\n for (const node of removedNodes) {\n if (node === this) {\n this.#destroyParentObserver();\n this.onParentChanged(this.getParentNodeForObserver(), parent);\n break;\n }\n }\n }\n }\n });\n this.#parentObserver.observe(parent, {childList: true, subtree: false, attributes: false});\n }\n }\n\n onParentChanged(_newParent: Node | undefined, _oldParent: Node) {\n this.#setParent(undefined);\n this.#dispatchRequestParent();\n }\n\n #destroyParentObserver() {\n this.#parentObserver?.disconnect();\n this.#parentObserver = undefined;\n }\n\n override attributeChangedCallback(name: string) {\n super.attributeChangedCallback(name);\n if (name === ATTR_TOKEN) {\n this.#updateTokenValue();\n } else if (name === ATTR_FORWARD_CUSTOM_EVENTS) {\n this.#updateForwardCustomEventsValue();\n }\n }\n\n disconnectedCallback() {\n this.#shadowRootHostNeedsUpdate = true;\n\n this.#destroyParentObserver();\n\n this.removeEventListener('slotchange', this.#onSlotChange, {capture: false});\n this.removeEventListener(RequestEntParentEventName, this.#onRequestParent, {capture: false});\n\n this.#setParent(undefined);\n\n this.componentContext$.set(undefined);\n\n this.syncShadowObjects();\n\n this.#destroyViewComponentEffect();\n }\n\n #reReuestParentRoot() {\n if (this.isConnected) {\n this.#setParent(undefined);\n this.#dispatchRequestParent();\n }\n }\n\n #dispatchRequestParent() {\n // https://pm.dartus.fr/blog/a-complete-guide-on-shadow-dom-and-event-propagation/\n this.dispatchEvent(\n new CustomEvent(RequestEntParentEventName, {\n bubbles: true,\n composed: true,\n detail: {requester: this},\n }),\n );\n }\n\n #unsubscribeFromParent?: () => void;\n\n #setParent(parent?: ShaeEntElement) {\n if (this.entParentNode === parent) return;\n\n if (this.entParentNode) {\n this.entParentNode.removeEventListener(ReRequestEntParentEventName, this.#onReRequestParent, {capture: false});\n }\n\n this.entParentNode = parent;\n\n if (this.entParentNode) {\n this.entParentNode.addEventListener(ReRequestEntParentEventName, this.#onReRequestParent, {\n capture: false,\n passive: false,\n });\n }\n\n this.#unsubscribeFromParent?.();\n this.#unsubscribeFromParent = undefined;\n\n if (parent) {\n const e = createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const parentVC = parent.viewComponent$.get();\n vc.parent = parentVC && parentVC.context === vc.context ? parentVC : undefined;\n if (vc.parent == null) {\n queueMicrotask(() => {\n this.#dispatchRequestParent();\n });\n }\n this.syncShadowObjects();\n }\n });\n this.#unsubscribeFromParent = () => e.destroy();\n } else {\n const vc = this.viewComponent;\n if (vc?.parent) {\n vc.parent = undefined;\n this.syncShadowObjects();\n }\n }\n }\n\n #onSlotChange = () => {\n const shadowRootHost = this.findShadowRootHost();\n if (shadowRootHost == null) return;\n this.dispatchEvent(\n new CustomEvent(ReRequestEntParentEventName, {\n bubbles: true,\n composed: true,\n detail: {requester: this, shadowRootHost},\n }),\n );\n };\n\n #onReRequestParent = (event: CustomEvent) => {\n const requester = event.detail?.requester as ShaeEntElement | undefined;\n\n if (requester === this) return;\n if (!requester?.isShaeEntElement) return;\n if (requester.ns !== this.ns) return;\n\n const shadowRootHost = event.detail?.shadowRootHost as HTMLElement | undefined;\n\n if (shadowRootHost) {\n this.#dispatchRequestParent();\n }\n };\n\n #onRequestParent = (event: CustomEvent) => {\n const requester = event.detail?.requester as ShaeEntElement | undefined;\n\n if (requester === this) return;\n if (!requester?.isShaeEntElement) return;\n if (requester.ns !== this.ns) return;\n\n event.stopPropagation();\n\n requester.#setParent(this);\n };\n\n #updateTokenValue() {\n if (this.hasAttribute(ATTR_TOKEN)) {\n const token = this.getAttribute(ATTR_TOKEN)?.trim() || undefined;\n this.token$.set(token);\n }\n }\n\n #updateForwardCustomEventsValue() {\n if (this.hasAttribute(ATTR_FORWARD_CUSTOM_EVENTS)) {\n const val = this.getAttribute(ATTR_FORWARD_CUSTOM_EVENTS);\n if (!val || val.trim().length === 0) {\n this.forwardCustomEvents$.set(true);\n } else {\n this.forwardCustomEvents$.set(\n new Set(\n val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0),\n ),\n );\n }\n } else {\n this.forwardCustomEvents$.set(false);\n }\n }\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -4,13 +4,13 @@ import type { ShaeEntElement } from './ShaeEntElement.js';
4
4
  export declare class ShaePropElement extends HTMLElement {
5
5
  #private;
6
6
  static observedAttributes: string[];
7
- readonly isShaeEntElement = true;
8
- protected readonly entNode$: import("@spearwolf/signalize").Signal<ShaeEntElement>;
9
- protected readonly viewComponent$: import("@spearwolf/signalize").Signal<ViewComponent>;
10
- protected readonly name$: import("@spearwolf/signalize").Signal<string>;
7
+ readonly isShaePropElement = true;
8
+ protected readonly entNode$: import("@spearwolf/signalize").Signal<ShaeEntElement | undefined>;
9
+ protected readonly viewComponent$: import("@spearwolf/signalize").Signal<ViewComponent | undefined>;
10
+ protected readonly name$: import("@spearwolf/signalize").Signal<string | undefined>;
11
11
  protected readonly valueIn$: import("@spearwolf/signalize").Signal<unknown>;
12
12
  protected readonly valueOut$: import("@spearwolf/signalize").Signal<unknown>;
13
- protected readonly type$: import("@spearwolf/signalize").Signal<string>;
13
+ protected readonly type$: import("@spearwolf/signalize").Signal<string | undefined>;
14
14
  protected readonly shouldTrim$: import("@spearwolf/signalize").Signal<boolean>;
15
15
  protected readonly logger: ConsoleLogger;
16
16
  get name(): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"ShaePropElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaePropElement.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AAExD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAE5D,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AA0DxD,qBAAa,eAAgB,SAAQ,WAAW;;IAC9C,MAAM,CAAC,kBAAkB,WAAoD;IAE7E,QAAQ,CAAC,gBAAgB,QAAQ;IAEjC,SAAS,CAAC,QAAQ,CAAC,QAAQ,wDAA8C;IACzE,SAAS,CAAC,QAAQ,CAAC,cAAc,uDAA6C;IAE9E,SAAS,CAAC,QAAQ,CAAC,KAAK,gDAAsC;IAC9D,SAAS,CAAC,QAAQ,CAAC,QAAQ,iDAAkB;IAC7C,SAAS,CAAC,QAAQ,CAAC,SAAS,iDAAkB;IAC9C,SAAS,CAAC,QAAQ,CAAC,KAAK,gDAAsC;IAC9D,SAAS,CAAC,QAAQ,CAAC,WAAW,iDAAsB;IAEpD,SAAS,CAAC,QAAQ,CAAC,MAAM,gBAAwC;IAEjE,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,EAErB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,OAAO,IAAI,cAAc,GAAG,SAAS,CAExC;IAED,IAAI,OAAO,CAAC,EAAE,EAAE,cAAc,GAAG,SAAS,EAEzC;IAED,IAAI,aAAa,IAAI,aAAa,GAAG,SAAS,CAE7C;;IAwND,iBAAiB;IAUjB,wBAAwB,CAAC,IAAI,EAAE,MAAM;IAoBrC,oBAAoB;CAwCrB"}
1
+ {"version":3,"file":"ShaePropElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaePropElement.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AAExD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAE5D,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AA0DxD,qBAAa,eAAgB,SAAQ,WAAW;;IAC9C,MAAM,CAAC,kBAAkB,WAAoD;IAE7E,QAAQ,CAAC,iBAAiB,QAAQ;IAElC,SAAS,CAAC,QAAQ,CAAC,QAAQ,oEAA8C;IACzE,SAAS,CAAC,QAAQ,CAAC,cAAc,mEAA6C;IAE9E,SAAS,CAAC,QAAQ,CAAC,KAAK,4DAAsC;IAC9D,SAAS,CAAC,QAAQ,CAAC,QAAQ,iDAAkB;IAC7C,SAAS,CAAC,QAAQ,CAAC,SAAS,iDAAkB;IAC9C,SAAS,CAAC,QAAQ,CAAC,KAAK,4DAAsC;IAC9D,SAAS,CAAC,QAAQ,CAAC,WAAW,iDAAsB;IAEpD,SAAS,CAAC,QAAQ,CAAC,MAAM,gBAAwC;IAEjE,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,EAErB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,OAAO,IAAI,cAAc,GAAG,SAAS,CAExC;IAED,IAAI,OAAO,CAAC,EAAE,EAAE,cAAc,GAAG,SAAS,EAEzC;IAED,IAAI,aAAa,IAAI,aAAa,GAAG,SAAS,CAE7C;;IAwND,iBAAiB;IAUjB,wBAAwB,CAAC,IAAI,EAAE,MAAM;IAoBrC,oBAAoB;CAwCrB"}
@@ -60,7 +60,7 @@ const TYPES = /* @__PURE__ */ new Set([
60
60
  class ShaePropElement extends HTMLElement {
61
61
  constructor() {
62
62
  super();
63
- this.isShaeEntElement = true;
63
+ this.isShaePropElement = true;
64
64
  this.entNode$ = createSignal();
65
65
  this.viewComponent$ = createSignal();
66
66
  this.name$ = createSignal();
@@ -184,7 +184,7 @@ class ShaePropElement extends HTMLElement {
184
184
  break;
185
185
  case "int[]":
186
186
  case "integer[]":
187
- value = value.split(/\s+/).map((v) => parseInt(v));
187
+ value = value.split(/\s+/).map((v) => parseInt(v, 10));
188
188
  break;
189
189
  case "hex[]":
190
190
  case "hexadecimal[]":
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/elements/ShaePropElement.ts"],
4
- "sourcesContent": ["import {batch, createEffect, createSignal, link} from '@spearwolf/signalize';\nimport {readBooleanAttribute} from '../utils/attr-utils.js';\nimport {ConsoleLogger} from '../utils/ConsoleLogger.js';\nimport {TRUTHY_VALUES} from '../utils/constants.js';\nimport type {ViewComponent} from '../view/ViewComponent.js';\nimport {ATTR_NAME, ATTR_NO_TRIM, ATTR_TYPE, ATTR_VALUE} from './constants.js';\nimport type {ShaeEntElement} from './ShaeEntElement.js';\n\nconst findEntNode = (start: HTMLElement): ShaeEntElement | undefined => {\n let el: HTMLElement | null = start.parentElement;\n while (el) {\n if ((el as ShaeEntElement).isShaeEntElement) {\n return el as ShaeEntElement;\n }\n el = el.parentElement;\n }\n return undefined;\n};\n\nconst TYPES = new Set([\n 'string',\n 'text',\n 'number',\n 'bigint',\n 'float',\n 'int',\n 'integer',\n 'hex',\n 'hexadecimal',\n 'oct',\n 'octal',\n 'bin',\n 'binary',\n 'bool',\n 'boolean',\n '[]',\n 'text[]',\n 'string[]',\n 'number[]',\n 'float[]',\n 'int[]',\n 'integer[]',\n 'hex[]',\n 'hexadecimal[]',\n 'oct[]',\n 'octal[]',\n 'bin[]',\n 'binary[]',\n 'bool[]',\n 'boolean[]',\n 'int8array',\n 'uint8array',\n 'uint8clampedarray',\n 'int16array',\n 'uint16array',\n 'int32array',\n 'uint32array',\n 'float32array',\n 'float64array',\n 'bigint64array',\n 'biguint64array',\n 'json',\n]);\n\nexport class ShaePropElement extends HTMLElement {\n static observedAttributes = [ATTR_NAME, ATTR_VALUE, ATTR_TYPE, ATTR_NO_TRIM];\n\n readonly isShaeEntElement = true;\n\n protected readonly entNode$ = createSignal<ShaeEntElement | undefined>();\n protected readonly viewComponent$ = createSignal<ViewComponent | undefined>();\n\n protected readonly name$ = createSignal<string | undefined>();\n protected readonly valueIn$ = createSignal();\n protected readonly valueOut$ = createSignal();\n protected readonly type$ = createSignal<string | undefined>();\n protected readonly shouldTrim$ = createSignal(true);\n\n protected readonly logger = new ConsoleLogger('ShaePropElement');\n\n get name(): string | undefined {\n return this.name$.value;\n }\n\n get value(): unknown {\n return this.valueOut$.value;\n }\n\n set value(val: unknown) {\n this.valueIn$.set(val);\n }\n\n get shouldTrim(): boolean {\n return this.shouldTrim$.value;\n }\n\n get entNode(): ShaeEntElement | undefined {\n return this.entNode$.value;\n }\n\n set entNode(el: ShaeEntElement | undefined) {\n this.entNode$.set(el);\n }\n\n get viewComponent(): ViewComponent | undefined {\n return this.viewComponent$.value;\n }\n\n constructor() {\n super();\n\n this.entNode$.onChange((entNode) => {\n if (entNode) {\n const con = link(entNode.viewComponent$, this.viewComponent$);\n return () => {\n con.destroy();\n };\n } else {\n this.viewComponent$.set(undefined);\n }\n });\n\n // this.viewComponent$.onChange((vc) => {\n // if (vc) {\n // console.log(`[shae-prop:\"${this.name}\"] view-component changed to`, vc?.uuid, {\n // viewComponent: vc,\n // shaeProp: this,\n // });\n // } else {\n // console.log(`[shae-prop:\"${this.name}\"] lost connection to view-component :/`, {\n // shaeProp: this,\n // });\n // }\n // });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const name = this.name$.get();\n if (name) {\n const value = this.valueOut$.get();\n\n if (this.logger.isDebug) {\n this.logger.debug(`[${this.name}] view-component set-property`, name, value, vc.uuid, {\n viewComponent: vc,\n shaeProp: this,\n });\n }\n\n vc.setProperty(name, value);\n\n if (this.isConnected) {\n this.entNode?.syncShadowObjects();\n }\n }\n }\n });\n\n createEffect(() => {\n const type = this.type$.get();\n const shouldTrim = this.shouldTrim$.get();\n let value = this.valueIn$.get();\n\n if (shouldTrim && typeof value === 'string') {\n value = value.trim();\n }\n\n value = value || undefined;\n\n if (value != null && typeof value === 'string' && type) {\n switch (type) {\n case 'string':\n case 'text':\n break;\n\n case 'number':\n value = Number(value);\n break;\n\n case 'bigint':\n value = BigInt(value);\n break;\n\n case 'float':\n value = parseFloat(value);\n break;\n\n case 'int':\n case 'integer':\n value = parseInt(value, 10);\n break;\n\n case 'hex':\n case 'hexadecimal':\n value = parseInt(value, 16);\n break;\n\n case 'oct':\n case 'octal':\n value = parseInt(value, 8);\n break;\n\n case 'bin':\n case 'binary':\n value = parseInt(value, 2);\n break;\n\n case 'bool':\n case 'boolean':\n value = TRUTHY_VALUES.has(value.toLowerCase());\n break;\n\n case '[]':\n case 'text[]':\n case 'string[]':\n value = value.split(/\\W+/);\n break;\n\n case 'number[]':\n value = value.split(/\\s+/).map((v) => Number(v));\n break;\n\n case 'float[]':\n value = value.split(/\\s+/).map((v) => parseFloat(v));\n break;\n\n case 'int[]':\n case 'integer[]':\n value = value.split(/\\s+/).map((v) => parseInt(v));\n break;\n\n case 'hex[]':\n case 'hexadecimal[]':\n value = value.split(/\\W+/).map((v) => parseInt(v, 16));\n break;\n\n case 'oct[]':\n case 'octal[]':\n value = value.split(/\\W+/).map((v) => parseInt(v, 8));\n break;\n\n case 'bin[]':\n case 'binary[]':\n value = value.split(/\\W+/).map((v) => parseInt(v, 2));\n break;\n\n case 'bool[]':\n case 'boolean[]':\n value = value.split(/\\W+/).map((v) => TRUTHY_VALUES.has(v.toLowerCase()));\n break;\n\n case 'int8array':\n value = new Int8Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint8array':\n value = new Uint8Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint8clampedarray':\n value = new Uint8ClampedArray(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'int16array':\n value = new Int16Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint16array':\n value = new Uint16Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'int32array':\n value = new Int32Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint32array':\n value = new Uint32Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'float32array':\n value = new Float32Array(value.split(/\\s+/).map((v) => Number(v)));\n break;\n\n case 'float64array':\n value = new Float64Array(value.split(/\\s+/).map((v) => Number(v)));\n break;\n\n case 'bigint64array':\n value = new BigInt64Array(value.split(/\\W+/).map((v) => BigInt(v)));\n break;\n\n case 'biguint64array':\n value = new BigUint64Array(value.split(/\\W+/).map((v) => BigInt(v)));\n break;\n\n case 'json':\n value = JSON.parse(value);\n break;\n\n default:\n if (this.logger.isWarn) {\n this.logger.warn(`[${this.name}] unknown type \"${type}\"`, {\n value,\n shaeProp: this,\n });\n }\n }\n }\n\n this.valueOut$.set(value);\n });\n\n batch(() => {\n this.#readNameAttribute();\n this.#readValueAttribute();\n this.#readTypeAttribute();\n this.#readNoTrimAttribute();\n });\n\n this.style.display = 'contents';\n }\n\n connectedCallback() {\n batch(() => {\n this.#findEntNode();\n this.#readNameAttribute();\n this.#readValueAttribute();\n this.#readTypeAttribute();\n this.#readNoTrimAttribute();\n });\n }\n\n attributeChangedCallback(name: string) {\n switch (name) {\n case ATTR_NAME:\n this.#readNameAttribute();\n break;\n\n case ATTR_VALUE:\n this.#readValueAttribute();\n break;\n\n case ATTR_TYPE:\n this.#readTypeAttribute();\n break;\n\n case ATTR_NO_TRIM:\n this.#readNoTrimAttribute();\n break;\n }\n }\n\n disconnectedCallback() {\n this.#disconnectFromEntNode();\n }\n\n #findEntNode = () => {\n this.entNode$.set(findEntNode(this));\n };\n\n #disconnectFromEntNode = () => {\n queueMicrotask(() => {\n if (!this.isConnected) {\n this.entNode$.set(undefined);\n }\n });\n };\n\n #readNameAttribute = () => {\n this.name$.set(this.getAttribute(ATTR_NAME)?.trim() ?? undefined);\n };\n\n #readValueAttribute = () => {\n this.valueIn$.set(this.getAttribute(ATTR_VALUE));\n };\n\n #readTypeAttribute = () => {\n let type = this.getAttribute(ATTR_TYPE)?.trim().toLowerCase();\n if (type && !TYPES.has(type)) {\n if (this.logger.isWarn) {\n this.logger.warn(`[${this.name}] unknown type \"${type}\"`, {\n shaeProp: this,\n });\n }\n type = undefined;\n }\n this.type$.set(type);\n };\n\n #readNoTrimAttribute = () => {\n this.shouldTrim$.set(!readBooleanAttribute(this, ATTR_NO_TRIM));\n };\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {batch, createEffect, createSignal, link} from '@spearwolf/signalize';\nimport {readBooleanAttribute} from '../utils/attr-utils.js';\nimport {ConsoleLogger} from '../utils/ConsoleLogger.js';\nimport {TRUTHY_VALUES} from '../utils/constants.js';\nimport type {ViewComponent} from '../view/ViewComponent.js';\nimport {ATTR_NAME, ATTR_NO_TRIM, ATTR_TYPE, ATTR_VALUE} from './constants.js';\nimport type {ShaeEntElement} from './ShaeEntElement.js';\n\nconst findEntNode = (start: HTMLElement): ShaeEntElement | undefined => {\n let el: HTMLElement | null = start.parentElement;\n while (el) {\n if ((el as ShaeEntElement).isShaeEntElement) {\n return el as ShaeEntElement;\n }\n el = el.parentElement;\n }\n return undefined;\n};\n\nconst TYPES = new Set([\n 'string',\n 'text',\n 'number',\n 'bigint',\n 'float',\n 'int',\n 'integer',\n 'hex',\n 'hexadecimal',\n 'oct',\n 'octal',\n 'bin',\n 'binary',\n 'bool',\n 'boolean',\n '[]',\n 'text[]',\n 'string[]',\n 'number[]',\n 'float[]',\n 'int[]',\n 'integer[]',\n 'hex[]',\n 'hexadecimal[]',\n 'oct[]',\n 'octal[]',\n 'bin[]',\n 'binary[]',\n 'bool[]',\n 'boolean[]',\n 'int8array',\n 'uint8array',\n 'uint8clampedarray',\n 'int16array',\n 'uint16array',\n 'int32array',\n 'uint32array',\n 'float32array',\n 'float64array',\n 'bigint64array',\n 'biguint64array',\n 'json',\n]);\n\nexport class ShaePropElement extends HTMLElement {\n static observedAttributes = [ATTR_NAME, ATTR_VALUE, ATTR_TYPE, ATTR_NO_TRIM];\n\n readonly isShaePropElement = true;\n\n protected readonly entNode$ = createSignal<ShaeEntElement | undefined>();\n protected readonly viewComponent$ = createSignal<ViewComponent | undefined>();\n\n protected readonly name$ = createSignal<string | undefined>();\n protected readonly valueIn$ = createSignal();\n protected readonly valueOut$ = createSignal();\n protected readonly type$ = createSignal<string | undefined>();\n protected readonly shouldTrim$ = createSignal(true);\n\n protected readonly logger = new ConsoleLogger('ShaePropElement');\n\n get name(): string | undefined {\n return this.name$.value;\n }\n\n get value(): unknown {\n return this.valueOut$.value;\n }\n\n set value(val: unknown) {\n this.valueIn$.set(val);\n }\n\n get shouldTrim(): boolean {\n return this.shouldTrim$.value;\n }\n\n get entNode(): ShaeEntElement | undefined {\n return this.entNode$.value;\n }\n\n set entNode(el: ShaeEntElement | undefined) {\n this.entNode$.set(el);\n }\n\n get viewComponent(): ViewComponent | undefined {\n return this.viewComponent$.value;\n }\n\n constructor() {\n super();\n\n this.entNode$.onChange((entNode) => {\n if (entNode) {\n const con = link(entNode.viewComponent$, this.viewComponent$);\n return () => {\n con.destroy();\n };\n } else {\n this.viewComponent$.set(undefined);\n }\n });\n\n // this.viewComponent$.onChange((vc) => {\n // if (vc) {\n // console.log(`[shae-prop:\"${this.name}\"] view-component changed to`, vc?.uuid, {\n // viewComponent: vc,\n // shaeProp: this,\n // });\n // } else {\n // console.log(`[shae-prop:\"${this.name}\"] lost connection to view-component :/`, {\n // shaeProp: this,\n // });\n // }\n // });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const name = this.name$.get();\n if (name) {\n const value = this.valueOut$.get();\n\n if (this.logger.isDebug) {\n this.logger.debug(`[${this.name}] view-component set-property`, name, value, vc.uuid, {\n viewComponent: vc,\n shaeProp: this,\n });\n }\n\n vc.setProperty(name, value);\n\n if (this.isConnected) {\n this.entNode?.syncShadowObjects();\n }\n }\n }\n });\n\n createEffect(() => {\n const type = this.type$.get();\n const shouldTrim = this.shouldTrim$.get();\n let value = this.valueIn$.get();\n\n if (shouldTrim && typeof value === 'string') {\n value = value.trim();\n }\n\n value = value || undefined;\n\n if (value != null && typeof value === 'string' && type) {\n switch (type) {\n case 'string':\n case 'text':\n break;\n\n case 'number':\n value = Number(value);\n break;\n\n case 'bigint':\n value = BigInt(value);\n break;\n\n case 'float':\n value = parseFloat(value);\n break;\n\n case 'int':\n case 'integer':\n value = parseInt(value, 10);\n break;\n\n case 'hex':\n case 'hexadecimal':\n value = parseInt(value, 16);\n break;\n\n case 'oct':\n case 'octal':\n value = parseInt(value, 8);\n break;\n\n case 'bin':\n case 'binary':\n value = parseInt(value, 2);\n break;\n\n case 'bool':\n case 'boolean':\n value = TRUTHY_VALUES.has(value.toLowerCase());\n break;\n\n case '[]':\n case 'text[]':\n case 'string[]':\n value = value.split(/\\W+/);\n break;\n\n case 'number[]':\n value = value.split(/\\s+/).map((v) => Number(v));\n break;\n\n case 'float[]':\n value = value.split(/\\s+/).map((v) => parseFloat(v));\n break;\n\n case 'int[]':\n case 'integer[]':\n value = value.split(/\\s+/).map((v) => parseInt(v, 10));\n break;\n\n case 'hex[]':\n case 'hexadecimal[]':\n value = value.split(/\\W+/).map((v) => parseInt(v, 16));\n break;\n\n case 'oct[]':\n case 'octal[]':\n value = value.split(/\\W+/).map((v) => parseInt(v, 8));\n break;\n\n case 'bin[]':\n case 'binary[]':\n value = value.split(/\\W+/).map((v) => parseInt(v, 2));\n break;\n\n case 'bool[]':\n case 'boolean[]':\n value = value.split(/\\W+/).map((v) => TRUTHY_VALUES.has(v.toLowerCase()));\n break;\n\n case 'int8array':\n value = new Int8Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint8array':\n value = new Uint8Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint8clampedarray':\n value = new Uint8ClampedArray(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'int16array':\n value = new Int16Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint16array':\n value = new Uint16Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'int32array':\n value = new Int32Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint32array':\n value = new Uint32Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'float32array':\n value = new Float32Array(value.split(/\\s+/).map((v) => Number(v)));\n break;\n\n case 'float64array':\n value = new Float64Array(value.split(/\\s+/).map((v) => Number(v)));\n break;\n\n case 'bigint64array':\n value = new BigInt64Array(value.split(/\\W+/).map((v) => BigInt(v)));\n break;\n\n case 'biguint64array':\n value = new BigUint64Array(value.split(/\\W+/).map((v) => BigInt(v)));\n break;\n\n case 'json':\n value = JSON.parse(value);\n break;\n\n default:\n if (this.logger.isWarn) {\n this.logger.warn(`[${this.name}] unknown type \"${type}\"`, {\n value,\n shaeProp: this,\n });\n }\n }\n }\n\n this.valueOut$.set(value);\n });\n\n batch(() => {\n this.#readNameAttribute();\n this.#readValueAttribute();\n this.#readTypeAttribute();\n this.#readNoTrimAttribute();\n });\n\n this.style.display = 'contents';\n }\n\n connectedCallback() {\n batch(() => {\n this.#findEntNode();\n this.#readNameAttribute();\n this.#readValueAttribute();\n this.#readTypeAttribute();\n this.#readNoTrimAttribute();\n });\n }\n\n attributeChangedCallback(name: string) {\n switch (name) {\n case ATTR_NAME:\n this.#readNameAttribute();\n break;\n\n case ATTR_VALUE:\n this.#readValueAttribute();\n break;\n\n case ATTR_TYPE:\n this.#readTypeAttribute();\n break;\n\n case ATTR_NO_TRIM:\n this.#readNoTrimAttribute();\n break;\n }\n }\n\n disconnectedCallback() {\n this.#disconnectFromEntNode();\n }\n\n #findEntNode = () => {\n this.entNode$.set(findEntNode(this));\n };\n\n #disconnectFromEntNode = () => {\n queueMicrotask(() => {\n if (!this.isConnected) {\n this.entNode$.set(undefined);\n }\n });\n };\n\n #readNameAttribute = () => {\n this.name$.set(this.getAttribute(ATTR_NAME)?.trim() ?? undefined);\n };\n\n #readValueAttribute = () => {\n this.valueIn$.set(this.getAttribute(ATTR_VALUE));\n };\n\n #readTypeAttribute = () => {\n let type = this.getAttribute(ATTR_TYPE)?.trim().toLowerCase();\n if (type && !TYPES.has(type)) {\n if (this.logger.isWarn) {\n this.logger.warn(`[${this.name}] unknown type \"${type}\"`, {\n shaeProp: this,\n });\n }\n type = undefined;\n }\n this.type$.set(type);\n };\n\n #readNoTrimAttribute = () => {\n this.shouldTrim$.set(!readBooleanAttribute(this, ATTR_NO_TRIM));\n };\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ShaeWorkerElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaeWorkerElement.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAIhD,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,iBAAkB,SAAQ,WAAW;;IA2GhD;;OAEG;IACH,CAAC,SAAS,CAAC,OAAO,CAAC;IA7GnB,OAAgB,kBAAkB,WAMhC;IAEF,MAAM,CAAC,eAAe,SAAW;IAEjC,QAAQ,CAAC,mBAAmB,QAAQ;IAEpC,QAAQ,CAAC,SAAS,YAAmB;IAErC,QAAQ,CAAC,MAAM,gBAA0C;IAEzD,SAAS,UAAQ;IAEjB,YAAY,iDAAuB;IACnC,SAAS,gDAAmD;IAC5D,IAAI,gDAAoB;;IAkExB,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,IAAI,QAAQ,IAIM,GAAG,CAFpB;IAED,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAKpB;IAED,IAAI,SAAS,IAAI,SAAS,CAGzB;IASK,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAYjE,iBAAiB;IAYjB,oBAAoB;IAKX,wBAAwB,CAAC,IAAI,EAAE,MAAM;IA0B9C,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC;IAkB3B,OAAO;CA2ER"}
1
+ {"version":3,"file":"ShaeWorkerElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaeWorkerElement.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAIhD,OAAO,EAAC,SAAS,EAA0B,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,iBAAkB,SAAQ,WAAW;;IAgIhD;;OAEG;IACH,CAAC,SAAS,CAAC,OAAO,CAAC;IAlInB,OAAgB,kBAAkB,WAMhC;IAEF,MAAM,CAAC,eAAe,SAAW;IAEjC,QAAQ,CAAC,mBAAmB,QAAQ;IAEpC,QAAQ,CAAC,SAAS,YAAmB;IAErC,QAAQ,CAAC,MAAM,gBAA0C;IAEzD,SAAS,UAAQ;IAEjB,YAAY,iDAAuB;IACnC,SAAS,gDAAmD;IAC5D,IAAI,gDAAoB;;IAuFxB,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,IAAI,QAAQ,IAIM,GAAG,CAFpB;IAED,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAKpB;IAED,IAAI,SAAS,IAAI,SAAS,CAGzB;IASK,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmBjE,iBAAiB;IAajB,oBAAoB;IAKX,wBAAwB,CAAC,IAAI,EAAE,MAAM;IA0B9C,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC;IAkB3B,OAAO;CA2ER"}
@@ -6,7 +6,7 @@ import { FrameLoop } from "../utils/FrameLoop.js";
6
6
  import { ComponentContext } from "../view/ComponentContext.js";
7
7
  import { LocalShadowObjectEnv } from "../view/LocalShadowObjectEnv.js";
8
8
  import { RemoteWorkerEnv } from "../view/RemoteWorkerEnv.js";
9
- import { ShadowEnv } from "../view/ShadowEnv.js";
9
+ import { ShadowEnv, ShadowEnvDestroyedError } from "../view/ShadowEnv.js";
10
10
  import { ATTR_AUTO_SYNC, ATTR_LOCAL, ATTR_NO_AUTOSTART, ATTR_NO_STRUCTURED_CLONE, ATTR_SRC } from "./constants.js";
11
11
  import { ShaeElement } from "./ShaeElement.js";
12
12
  class ShaeWorkerElement extends ShaeElement {
@@ -21,6 +21,17 @@ class ShaeWorkerElement extends ShaeElement {
21
21
  this.src$ = createSignal("");
22
22
  this.#shouldDestroy = false;
23
23
  this.#started = false;
24
+ /**
25
+ * Both {@link ShaeWorkerElement.start} and {@link ShaeWorkerElement.importScript} await
26
+ * {@link ShadowEnv.ready}, which rejects once the environment is destroyed — the normal
27
+ * outcome for an element that connects and disconnects within the same task. Nothing in the
28
+ * element waits on those promises, so the rejection has to end here instead of surfacing as
29
+ * an unhandled rejection in the browser or as a hard failure in a test runner.
30
+ */
31
+ this.#onUnobservedRejection = (error) => {
32
+ if (error instanceof ShadowEnvDestroyedError) return;
33
+ this.logger.error("shadowEnv failed", error);
34
+ };
24
35
  this.ns$.onChange((ns) => {
25
36
  this.shadowEnv.view = ComponentContext.get(ns);
26
37
  });
@@ -41,6 +52,14 @@ class ShaeWorkerElement extends ShaeElement {
41
52
  })
42
53
  );
43
54
  });
55
+ on(this.shadowEnv, ShadowEnv.ProxyFailed, (reason) => {
56
+ this.dispatchEvent(
57
+ new CustomEvent(ShadowEnv.ProxyFailed.toLowerCase(), {
58
+ bubbles: false,
59
+ detail: { shadowEnv: this.shadowEnv, reason }
60
+ })
61
+ );
62
+ });
44
63
  this.autoSync$.onChange((sVal) => {
45
64
  const hasAttr = this.hasAttribute(ATTR_AUTO_SYNC);
46
65
  const attrVal = hasAttr ? this.getAttribute(ATTR_AUTO_SYNC) : void 0;
@@ -78,12 +97,13 @@ class ShaeWorkerElement extends ShaeElement {
78
97
  () => {
79
98
  const src = this.src$.get();
80
99
  if (src) {
81
- this.importScript(src);
100
+ this.importScript(src).catch(this.#onUnobservedRejection);
82
101
  }
83
102
  },
84
103
  { autorun: false }
85
104
  );
86
105
  }
106
+ #onUnobservedRejection;
87
107
  get shouldAutostart() {
88
108
  return this.autostart && !readBooleanAttribute(this, ATTR_NO_AUTOSTART);
89
109
  }
@@ -114,18 +134,23 @@ class ShaeWorkerElement extends ShaeElement {
114
134
  if (this.logger.isInfo) {
115
135
  this.logger.info("shadowEnv importScript:", src, { shadowEnv });
116
136
  }
117
- await shadowEnv.envProxy.importScript(src);
137
+ const envProxy = shadowEnv.envProxy;
138
+ if (envProxy == null) {
139
+ throw new ShadowEnvDestroyedError();
140
+ }
141
+ await envProxy.importScript(src);
118
142
  return this;
119
143
  }
120
144
  connectedCallback() {
121
145
  batch(() => {
122
- if (this.hasAttribute(ATTR_AUTO_SYNC)) {
123
- this.autoSync$.set(this.getAttribute(ATTR_AUTO_SYNC));
146
+ const autoSync = this.getAttribute(ATTR_AUTO_SYNC);
147
+ if (autoSync != null) {
148
+ this.autoSync$.set(autoSync);
124
149
  }
125
150
  this.isConnected$.set(true);
126
151
  });
127
152
  if (this.shouldAutostart) {
128
- this.start();
153
+ this.start().catch(this.#onUnobservedRejection);
129
154
  }
130
155
  }
131
156
  disconnectedCallback() {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/elements/ShaeWorkerElement.ts"],
4
- "sourcesContent": ["import {on} from '@spearwolf/eventize';\nimport {batch, createEffect, createSignal, destroySignal, Effect} from '@spearwolf/signalize';\nimport {readBooleanAttribute} from '../utils/attr-utils.js';\nimport {ConsoleLogger} from '../utils/ConsoleLogger.js';\nimport {FrameLoop} from '../utils/FrameLoop.js';\nimport {ComponentContext} from '../view/ComponentContext.js';\nimport {LocalShadowObjectEnv} from '../view/LocalShadowObjectEnv.js';\nimport {RemoteWorkerEnv} from '../view/RemoteWorkerEnv.js';\nimport {ShadowEnv} from '../view/ShadowEnv.js';\nimport {ATTR_AUTO_SYNC, ATTR_LOCAL, ATTR_NO_AUTOSTART, ATTR_NO_STRUCTURED_CLONE, ATTR_SRC} from './constants.js';\nimport {ShaeElement} from './ShaeElement.js';\n\nexport class ShaeWorkerElement extends ShaeElement {\n static override observedAttributes = [\n ...ShaeElement.observedAttributes,\n ATTR_LOCAL,\n ATTR_SRC,\n ATTR_NO_STRUCTURED_CLONE,\n ATTR_AUTO_SYNC,\n ];\n\n static DefaultAutoSync = 'frame';\n\n readonly isShaeWorkerElement = true;\n\n readonly shadowEnv = new ShadowEnv();\n\n readonly logger = new ConsoleLogger('ShaeWorkerElement');\n\n autostart = true;\n\n isConnected$ = createSignal(false);\n autoSync$ = createSignal(ShaeWorkerElement.DefaultAutoSync);\n src$ = createSignal('');\n\n #shouldDestroy = false;\n #started = false;\n\n #frameLoop?: FrameLoop;\n #autoSync?: Effect;\n #importScript?: Effect;\n\n constructor() {\n super();\n\n this.ns$.onChange((ns) => {\n this.shadowEnv.view = ComponentContext.get(ns);\n });\n\n on(this.shadowEnv, ShadowEnv.ContextCreated, () => {\n this.#importScript?.run();\n this.dispatchEvent(\n new CustomEvent(ShadowEnv.ContextCreated.toLowerCase(), {\n bubbles: false,\n detail: {shadowEnv: this.shadowEnv},\n }),\n );\n });\n\n on(this.shadowEnv, ShadowEnv.ContextLost, () => {\n this.dispatchEvent(\n new CustomEvent(ShadowEnv.ContextLost.toLowerCase(), {\n bubbles: false,\n detail: {shadowEnv: this.shadowEnv},\n }),\n );\n });\n\n this.autoSync$.onChange((sVal) => {\n const hasAttr = this.hasAttribute(ATTR_AUTO_SYNC);\n const attrVal = hasAttr ? this.getAttribute(ATTR_AUTO_SYNC) : undefined;\n\n if (sVal === ShaeWorkerElement.DefaultAutoSync) {\n if (hasAttr && attrVal !== sVal) {\n this.setAttribute(ATTR_AUTO_SYNC, sVal);\n }\n } else if (attrVal !== sVal) {\n this.setAttribute(ATTR_AUTO_SYNC, sVal);\n }\n });\n\n this.#createAutoSyncEffect();\n this.#createImportScriptEffect();\n\n this.style.display = 'contents';\n }\n\n #createImportScriptEffect() {\n this.#importScript = createEffect(\n () => {\n const src = this.src$.get();\n if (src) {\n this.importScript(src);\n }\n },\n {autorun: false},\n );\n }\n\n get shouldAutostart(): boolean {\n return this.autostart && !readBooleanAttribute(this, ATTR_NO_AUTOSTART);\n }\n\n get autoSync() {\n return this.autoSync$.value;\n }\n\n set autoSync(val: any) {\n if (typeof val !== 'string') {\n val = val ? ShaeWorkerElement.DefaultAutoSync : 'no';\n }\n this.autoSync$.set(`${val}`.trim().toLowerCase());\n }\n\n get frameLoop(): FrameLoop {\n this.#frameLoop ??= new FrameLoop();\n return this.#frameLoop;\n }\n\n /**\n * The frameLoop (if activated) calls this method on every frame\n */\n [FrameLoop.OnFrame]() {\n this.syncShadowObjects();\n }\n\n async importScript(src: URL | string): Promise<ShaeWorkerElement> {\n if (!src) {\n throw new Error('src is blank');\n }\n const shadowEnv = await this.shadowEnv.ready();\n if (this.logger.isInfo) {\n this.logger.info('shadowEnv importScript:', src, {shadowEnv});\n }\n await shadowEnv.envProxy.importScript(src);\n return this;\n }\n\n connectedCallback() {\n batch(() => {\n if (this.hasAttribute(ATTR_AUTO_SYNC)) {\n this.autoSync$.set(this.getAttribute(ATTR_AUTO_SYNC));\n }\n this.isConnected$.set(true);\n });\n if (this.shouldAutostart) {\n this.start();\n }\n }\n\n disconnectedCallback() {\n this.isConnected$.set(false);\n this.#deferDestroy();\n }\n\n override attributeChangedCallback(name: string) {\n super.attributeChangedCallback(name);\n\n if (name === ATTR_LOCAL) {\n if (this.shadowEnv.envProxy != null) {\n throw new Error('Changing the \"local\" attribute after the shadowEnv has been created is not supported.');\n }\n }\n\n if (name === ATTR_NO_STRUCTURED_CLONE) {\n this.#disableStructuredClone();\n }\n\n if (name === ATTR_AUTO_SYNC) {\n this.autoSync = this.hasAttribute(ATTR_AUTO_SYNC) ? this.getAttribute(ATTR_AUTO_SYNC) : true;\n }\n\n if (name === ATTR_SRC) {\n const src = (this.getAttribute(ATTR_SRC) || '').trim();\n this.src$.set(src);\n if (this.shadowEnv.isReady) {\n this.#importScript?.run();\n }\n }\n }\n\n start(): Promise<ShadowEnv> {\n if (!this.#started) {\n this.#shouldDestroy = false;\n\n this.shadowEnv.view ??= ComponentContext.get(this.ns);\n\n if (this.shadowEnv.envProxy == null) {\n const envProxy = readBooleanAttribute(this, ATTR_LOCAL) ? new LocalShadowObjectEnv() : new RemoteWorkerEnv();\n this.shadowEnv.envProxy = envProxy;\n this.#disableStructuredClone();\n }\n\n this.#started = true;\n }\n\n return this.shadowEnv.ready();\n }\n\n destroy() {\n this.#autoSync?.destroy();\n this.#importScript?.destroy();\n destroySignal(this.isConnected$, this.autoSync$, this.src$);\n this.shadowEnv.envProxy = undefined;\n this.shadowEnv.destroy();\n }\n\n #deferDestroy() {\n // NOTE The destruction is halted until the next microtask\u2014but a reconnect (adding the element back to the DOM before the next microtask)\n // cannot stop this process, and that's okay. Once destroyed, it's destroyed forever.\n if (!this.#shouldDestroy) {\n this.#shouldDestroy = true;\n queueMicrotask(() => {\n if (this.#shouldDestroy) {\n this.destroy();\n }\n });\n }\n }\n\n #createAutoSyncEffect() {\n this.#autoSync = createEffect(() => {\n if (this.isConnected$.get()) {\n const autoSync = (this.autoSync$.get() || ShaeWorkerElement.DefaultAutoSync).trim().toLowerCase();\n let delay;\n\n if (['true', 'yes', 'on', 'frame', 'auto-sync'].includes(autoSync)) {\n if (this.logger.isDebug) {\n this.logger.debug('auto-sync', autoSync, this);\n }\n this.frameLoop.start(this);\n return () => {\n this.frameLoop.stop(this);\n };\n } else if (autoSync.toLowerCase().endsWith('fps')) {\n const fps = parseInt(autoSync, 10);\n if (fps > 0) {\n delay = Math.floor(1000 / fps);\n } else if (this.logger.isWarn) {\n this.logger.warn(`invalid auto-sync value: ${autoSync}`);\n }\n } else {\n delay = parseInt(autoSync, 10);\n if (isNaN(delay)) {\n delay = undefined;\n if (!['false', 'no', 'off'].includes(autoSync)) {\n this.logger.error(`invalid auto-sync value: ${autoSync}`);\n }\n }\n }\n\n if (delay !== undefined && delay > 0) {\n if (this.logger.isDebug) {\n this.logger.debug('auto-sync interval (ms)', delay, this);\n }\n const id = setInterval(() => {\n this.syncShadowObjects();\n }, delay);\n return () => {\n clearInterval(id);\n };\n } else if (this.logger.isDebug) {\n this.logger.debug('auto-sync off', this);\n }\n }\n }, [this.autoSync$, this.isConnected$]);\n }\n\n #disableStructuredClone() {\n const env = this.shadowEnv.envProxy as LocalShadowObjectEnv;\n if (env?.isLocalEnv) {\n env.disableStructuredClone = this.hasAttribute(ATTR_NO_STRUCTURED_CLONE);\n }\n }\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {on} from '@spearwolf/eventize';\nimport {batch, createEffect, createSignal, destroySignal, Effect} from '@spearwolf/signalize';\nimport {readBooleanAttribute} from '../utils/attr-utils.js';\nimport {ConsoleLogger} from '../utils/ConsoleLogger.js';\nimport {FrameLoop} from '../utils/FrameLoop.js';\nimport {ComponentContext} from '../view/ComponentContext.js';\nimport {LocalShadowObjectEnv} from '../view/LocalShadowObjectEnv.js';\nimport {RemoteWorkerEnv} from '../view/RemoteWorkerEnv.js';\nimport {ShadowEnv, ShadowEnvDestroyedError} from '../view/ShadowEnv.js';\nimport {ATTR_AUTO_SYNC, ATTR_LOCAL, ATTR_NO_AUTOSTART, ATTR_NO_STRUCTURED_CLONE, ATTR_SRC} from './constants.js';\nimport {ShaeElement} from './ShaeElement.js';\n\nexport class ShaeWorkerElement extends ShaeElement {\n static override observedAttributes = [\n ...ShaeElement.observedAttributes,\n ATTR_LOCAL,\n ATTR_SRC,\n ATTR_NO_STRUCTURED_CLONE,\n ATTR_AUTO_SYNC,\n ];\n\n static DefaultAutoSync = 'frame';\n\n readonly isShaeWorkerElement = true;\n\n readonly shadowEnv = new ShadowEnv();\n\n readonly logger = new ConsoleLogger('ShaeWorkerElement');\n\n autostart = true;\n\n isConnected$ = createSignal(false);\n autoSync$ = createSignal(ShaeWorkerElement.DefaultAutoSync);\n src$ = createSignal('');\n\n #shouldDestroy = false;\n #started = false;\n\n #frameLoop?: FrameLoop;\n #autoSync?: Effect;\n #importScript?: Effect;\n\n constructor() {\n super();\n\n this.ns$.onChange((ns) => {\n this.shadowEnv.view = ComponentContext.get(ns);\n });\n\n on(this.shadowEnv, ShadowEnv.ContextCreated, () => {\n this.#importScript?.run();\n this.dispatchEvent(\n new CustomEvent(ShadowEnv.ContextCreated.toLowerCase(), {\n bubbles: false,\n detail: {shadowEnv: this.shadowEnv},\n }),\n );\n });\n\n on(this.shadowEnv, ShadowEnv.ContextLost, () => {\n this.dispatchEvent(\n new CustomEvent(ShadowEnv.ContextLost.toLowerCase(), {\n bubbles: false,\n detail: {shadowEnv: this.shadowEnv},\n }),\n );\n });\n\n on(this.shadowEnv, ShadowEnv.ProxyFailed, (reason: unknown) => {\n this.dispatchEvent(\n new CustomEvent(ShadowEnv.ProxyFailed.toLowerCase(), {\n bubbles: false,\n detail: {shadowEnv: this.shadowEnv, reason},\n }),\n );\n });\n\n this.autoSync$.onChange((sVal) => {\n const hasAttr = this.hasAttribute(ATTR_AUTO_SYNC);\n const attrVal = hasAttr ? this.getAttribute(ATTR_AUTO_SYNC) : undefined;\n\n if (sVal === ShaeWorkerElement.DefaultAutoSync) {\n if (hasAttr && attrVal !== sVal) {\n this.setAttribute(ATTR_AUTO_SYNC, sVal);\n }\n } else if (attrVal !== sVal) {\n this.setAttribute(ATTR_AUTO_SYNC, sVal);\n }\n });\n\n this.#createAutoSyncEffect();\n this.#createImportScriptEffect();\n\n this.style.display = 'contents';\n }\n\n #createImportScriptEffect() {\n this.#importScript = createEffect(\n () => {\n const src = this.src$.get();\n if (src) {\n this.importScript(src).catch(this.#onUnobservedRejection);\n }\n },\n {autorun: false},\n );\n }\n\n /**\n * Both {@link ShaeWorkerElement.start} and {@link ShaeWorkerElement.importScript} await\n * {@link ShadowEnv.ready}, which rejects once the environment is destroyed \u2014 the normal\n * outcome for an element that connects and disconnects within the same task. Nothing in the\n * element waits on those promises, so the rejection has to end here instead of surfacing as\n * an unhandled rejection in the browser or as a hard failure in a test runner.\n */\n #onUnobservedRejection = (error: unknown) => {\n if (error instanceof ShadowEnvDestroyedError) return;\n this.logger.error('shadowEnv failed', error);\n };\n\n get shouldAutostart(): boolean {\n return this.autostart && !readBooleanAttribute(this, ATTR_NO_AUTOSTART);\n }\n\n get autoSync() {\n return this.autoSync$.value;\n }\n\n set autoSync(val: any) {\n if (typeof val !== 'string') {\n val = val ? ShaeWorkerElement.DefaultAutoSync : 'no';\n }\n this.autoSync$.set(`${val}`.trim().toLowerCase());\n }\n\n get frameLoop(): FrameLoop {\n this.#frameLoop ??= new FrameLoop();\n return this.#frameLoop;\n }\n\n /**\n * The frameLoop (if activated) calls this method on every frame\n */\n [FrameLoop.OnFrame]() {\n this.syncShadowObjects();\n }\n\n async importScript(src: URL | string): Promise<ShaeWorkerElement> {\n if (!src) {\n throw new Error('src is blank');\n }\n const shadowEnv = await this.shadowEnv.ready();\n if (this.logger.isInfo) {\n this.logger.info('shadowEnv importScript:', src, {shadowEnv});\n }\n // ready() only vouches for the proxy at the moment it resolves; a teardown can slip in\n // between that microtask and this line\n const envProxy = shadowEnv.envProxy;\n if (envProxy == null) {\n throw new ShadowEnvDestroyedError();\n }\n\n await envProxy.importScript(src);\n return this;\n }\n\n connectedCallback() {\n batch(() => {\n const autoSync = this.getAttribute(ATTR_AUTO_SYNC);\n if (autoSync != null) {\n this.autoSync$.set(autoSync);\n }\n this.isConnected$.set(true);\n });\n if (this.shouldAutostart) {\n this.start().catch(this.#onUnobservedRejection);\n }\n }\n\n disconnectedCallback() {\n this.isConnected$.set(false);\n this.#deferDestroy();\n }\n\n override attributeChangedCallback(name: string) {\n super.attributeChangedCallback(name);\n\n if (name === ATTR_LOCAL) {\n if (this.shadowEnv.envProxy != null) {\n throw new Error('Changing the \"local\" attribute after the shadowEnv has been created is not supported.');\n }\n }\n\n if (name === ATTR_NO_STRUCTURED_CLONE) {\n this.#disableStructuredClone();\n }\n\n if (name === ATTR_AUTO_SYNC) {\n this.autoSync = this.hasAttribute(ATTR_AUTO_SYNC) ? this.getAttribute(ATTR_AUTO_SYNC) : true;\n }\n\n if (name === ATTR_SRC) {\n const src = (this.getAttribute(ATTR_SRC) || '').trim();\n this.src$.set(src);\n if (this.shadowEnv.isReady) {\n this.#importScript?.run();\n }\n }\n }\n\n start(): Promise<ShadowEnv> {\n if (!this.#started) {\n this.#shouldDestroy = false;\n\n this.shadowEnv.view ??= ComponentContext.get(this.ns);\n\n if (this.shadowEnv.envProxy == null) {\n const envProxy = readBooleanAttribute(this, ATTR_LOCAL) ? new LocalShadowObjectEnv() : new RemoteWorkerEnv();\n this.shadowEnv.envProxy = envProxy;\n this.#disableStructuredClone();\n }\n\n this.#started = true;\n }\n\n return this.shadowEnv.ready();\n }\n\n destroy() {\n this.#autoSync?.destroy();\n this.#importScript?.destroy();\n destroySignal(this.isConnected$, this.autoSync$, this.src$);\n this.shadowEnv.envProxy = undefined;\n this.shadowEnv.destroy();\n }\n\n #deferDestroy() {\n // NOTE The destruction is halted until the next microtask\u2014but a reconnect (adding the element back to the DOM before the next microtask)\n // cannot stop this process, and that's okay. Once destroyed, it's destroyed forever.\n if (!this.#shouldDestroy) {\n this.#shouldDestroy = true;\n queueMicrotask(() => {\n if (this.#shouldDestroy) {\n this.destroy();\n }\n });\n }\n }\n\n #createAutoSyncEffect() {\n this.#autoSync = createEffect(() => {\n if (this.isConnected$.get()) {\n const autoSync = (this.autoSync$.get() || ShaeWorkerElement.DefaultAutoSync).trim().toLowerCase();\n let delay;\n\n if (['true', 'yes', 'on', 'frame', 'auto-sync'].includes(autoSync)) {\n if (this.logger.isDebug) {\n this.logger.debug('auto-sync', autoSync, this);\n }\n this.frameLoop.start(this);\n return () => {\n this.frameLoop.stop(this);\n };\n } else if (autoSync.toLowerCase().endsWith('fps')) {\n const fps = parseInt(autoSync, 10);\n if (fps > 0) {\n delay = Math.floor(1000 / fps);\n } else if (this.logger.isWarn) {\n this.logger.warn(`invalid auto-sync value: ${autoSync}`);\n }\n } else {\n delay = parseInt(autoSync, 10);\n if (isNaN(delay)) {\n delay = undefined;\n if (!['false', 'no', 'off'].includes(autoSync)) {\n this.logger.error(`invalid auto-sync value: ${autoSync}`);\n }\n }\n }\n\n if (delay !== undefined && delay > 0) {\n if (this.logger.isDebug) {\n this.logger.debug('auto-sync interval (ms)', delay, this);\n }\n const id = setInterval(() => {\n this.syncShadowObjects();\n }, delay);\n return () => {\n clearInterval(id);\n };\n } else if (this.logger.isDebug) {\n this.logger.debug('auto-sync off', this);\n }\n }\n }, [this.autoSync$, this.isConnected$]);\n }\n\n #disableStructuredClone() {\n const env = this.shadowEnv.envProxy as LocalShadowObjectEnv;\n if (env?.isLocalEnv) {\n env.disableStructuredClone = this.hasAttribute(ATTR_NO_STRUCTURED_CLONE);\n }\n }\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -41,6 +41,11 @@ export declare class Kernel {
41
41
  private parse;
42
42
  createEntity(uuid: string, token: string, parentUuid?: string, order?: number, properties?: [string, unknown][], autoDestructionOnParentRemoval?: boolean): void;
43
43
  destroyEntity(uuid: string): void;
44
+ /**
45
+ * @param order the new order, or `undefined` to keep the current one. A set-parent change
46
+ * only carries an order when it actually changed, so an absent order must not be read as
47
+ * a reset to `0` — that would silently drop the order the view side still holds.
48
+ */
44
49
  setParent(uuid: string, parentUuid?: string, order?: number): void;
45
50
  updateOrder(uuid: string, order: number): void;
46
51
  dispatchEventsToEntity(uuid: string, events: IComponentEvent[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"Kernel.d.ts","sourceRoot":"","sources":["../../../src/in-the-dark/Kernel.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAEV,eAAe,EAIf,gBAAgB,EAEhB,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AACvC,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAQD,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAgBD;;;;;;GAMG;AACH,qBAAa,MAAM;;IACjB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,QAAQ,CAAC,MAAM,gBAA+B;gBAWlC,QAAQ,CAAC,EAAE,QAAQ;IAK/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQ/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,qBAAqB,CAAC,OAAO,UAAQ,GAAG,MAAM,EAAE;IAiChD,cAAc,IAAI,eAAe,EAAE;IAInC,OAAO,CAAC,kBAAkB;IAY1B,eAAe,IAAI,IAAI;IAcvB,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAW3B,OAAO,CAAC,KAAK;IA2Cb,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,SAAI,EACT,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAChC,8BAA8B,UAAQ,GACrC,IAAI;IA0BP,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA4BjC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,IAAI;IAgC7D,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9C,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI;IAIrE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI;IAKrE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAY9C,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAMxD;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAqC3B,OAAO,CAAC,qBAAqB;IAiY7B,OAAO,CAAC,mBAAmB;IAQ3B,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAQnD,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,mBAAmB;IAU3B,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW;IAS3D,OAAO,IAAI,IAAI;CAUhB"}
1
+ {"version":3,"file":"Kernel.d.ts","sourceRoot":"","sources":["../../../src/in-the-dark/Kernel.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAEV,eAAe,EAIf,gBAAgB,EAEhB,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AACvC,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAQD,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAgBD;;;;;;GAMG;AACH,qBAAa,MAAM;;IACjB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,QAAQ,CAAC,MAAM,gBAA+B;gBAWlC,QAAQ,CAAC,EAAE,QAAQ;IAK/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAmB/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,qBAAqB,CAAC,OAAO,UAAQ,GAAG,MAAM,EAAE;IAkChD,cAAc,IAAI,eAAe,EAAE;IAMnC,OAAO,CAAC,kBAAkB;IAc1B,eAAe,IAAI,IAAI;IAmBvB,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAW3B,OAAO,CAAC,KAAK;IA2Cb,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,SAAI,EACT,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAChC,8BAA8B,UAAQ,GACrC,IAAI;IA0BP,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA6BjC;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAkClE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9C,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI;IAIrE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI;IAKrE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAW9C,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAMxD;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAqC3B,OAAO,CAAC,qBAAqB;IAmY7B,OAAO,CAAC,mBAAmB;IAM3B,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE;IASnD,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,mBAAmB;IAU3B,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW;IAS3D,OAAO,IAAI,IAAI;CAUhB"}