@repobit/dex-store-elements 1.7.3 → 2.0.1

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 (227) hide show
  1. package/CHANGELOG.md +6 -906
  2. package/README.md +308 -283
  3. package/dist/src/actions/action.adapter.d.ts +36 -0
  4. package/dist/src/actions/action.adapter.js +183 -0
  5. package/dist/src/actions/action.adapter.js.map +1 -0
  6. package/dist/src/actions/action.attributes.d.ts +15 -0
  7. package/dist/src/actions/action.attributes.js +137 -0
  8. package/dist/src/actions/action.attributes.js.map +1 -0
  9. package/dist/src/actions/action.registry.d.ts +4 -0
  10. package/dist/src/actions/action.registry.js +119 -0
  11. package/dist/src/actions/action.registry.js.map +1 -0
  12. package/dist/src/actions/index.d.ts +3 -2
  13. package/dist/src/actions/index.js +3 -80
  14. package/dist/src/actions/index.js.map +1 -1
  15. package/dist/src/compute/compute.expand.d.ts +70 -0
  16. package/dist/src/compute/compute.expand.js +319 -0
  17. package/dist/src/compute/compute.expand.js.map +1 -0
  18. package/dist/src/compute/compute.scan.d.ts +54 -0
  19. package/dist/src/compute/compute.scan.js +160 -0
  20. package/dist/src/compute/compute.scan.js.map +1 -0
  21. package/dist/src/compute/option-resolver.d.ts +31 -0
  22. package/dist/src/compute/option-resolver.js +147 -0
  23. package/dist/src/compute/option-resolver.js.map +1 -0
  24. package/dist/src/contexts/context.compute.d.ts +12 -0
  25. package/dist/src/contexts/context.compute.js +4 -0
  26. package/dist/src/contexts/context.compute.js.map +1 -0
  27. package/dist/src/contexts/context.scope.d.ts +139 -0
  28. package/dist/src/contexts/context.scope.js +48 -0
  29. package/dist/src/contexts/context.scope.js.map +1 -0
  30. package/dist/src/controllers/controller.action-resolve.d.ts +110 -0
  31. package/dist/src/controllers/controller.action-resolve.js +203 -0
  32. package/dist/src/controllers/controller.action-resolve.js.map +1 -0
  33. package/dist/src/controllers/controller.action-topology.d.ts +59 -0
  34. package/dist/src/controllers/controller.action-topology.js +130 -0
  35. package/dist/src/controllers/controller.action-topology.js.map +1 -0
  36. package/dist/src/controllers/controller.compute.d.ts +72 -0
  37. package/dist/src/controllers/controller.compute.js +110 -0
  38. package/dist/src/controllers/controller.compute.js.map +1 -0
  39. package/dist/src/controllers/controller.resolve.d.ts +78 -0
  40. package/dist/src/controllers/controller.resolve.js +205 -0
  41. package/dist/src/controllers/controller.resolve.js.map +1 -0
  42. package/dist/src/core/action-topology.d.ts +62 -0
  43. package/dist/src/core/action-topology.js +67 -0
  44. package/dist/src/core/action-topology.js.map +1 -0
  45. package/dist/src/core/actions.d.ts +64 -0
  46. package/dist/src/core/actions.js +47 -0
  47. package/dist/src/core/actions.js.map +1 -0
  48. package/dist/src/core/node.element.d.ts +179 -0
  49. package/dist/src/core/node.element.js +573 -0
  50. package/dist/src/core/node.element.js.map +1 -0
  51. package/dist/src/core/node.scope.d.ts +374 -0
  52. package/dist/src/core/node.scope.js +558 -0
  53. package/dist/src/core/node.scope.js.map +1 -0
  54. package/dist/src/core/option-update.d.ts +11 -0
  55. package/dist/src/core/option-update.js +59 -0
  56. package/dist/src/core/option-update.js.map +1 -0
  57. package/dist/src/dsl/compilers/array/compiler.js +13 -14
  58. package/dist/src/dsl/compilers/array/compiler.js.map +1 -1
  59. package/dist/src/dsl/compilers/boolean/compiler.d.ts +1 -1
  60. package/dist/src/dsl/compilers/boolean/compiler.js +14 -27
  61. package/dist/src/dsl/compilers/boolean/compiler.js.map +1 -1
  62. package/dist/src/dsl/compilers/enum/compiler.js +7 -10
  63. package/dist/src/dsl/compilers/enum/compiler.js.map +1 -1
  64. package/dist/src/dsl/compilers/index.d.ts +1 -1
  65. package/dist/src/dsl/compilers/index.js +5 -5
  66. package/dist/src/dsl/compilers/index.js.map +1 -1
  67. package/dist/src/dsl/utilty.d.ts +0 -4
  68. package/dist/src/dsl/utilty.js +3 -30
  69. package/dist/src/dsl/utilty.js.map +1 -1
  70. package/dist/src/eta/batch.d.ts +123 -0
  71. package/dist/src/eta/batch.js +162 -0
  72. package/dist/src/eta/batch.js.map +1 -0
  73. package/dist/src/eta/batcher.d.ts +184 -0
  74. package/dist/src/eta/batcher.js +335 -0
  75. package/dist/src/eta/batcher.js.map +1 -0
  76. package/dist/src/eta/cache.d.ts +36 -0
  77. package/dist/src/eta/cache.js +56 -0
  78. package/dist/src/eta/cache.js.map +1 -0
  79. package/dist/src/eta/controller.d.ts +608 -0
  80. package/dist/src/eta/controller.js +1036 -0
  81. package/dist/src/eta/controller.js.map +1 -0
  82. package/dist/src/eta/factory.d.ts +74 -0
  83. package/dist/src/eta/factory.js +121 -0
  84. package/dist/src/eta/factory.js.map +1 -0
  85. package/dist/src/eta/idle.d.ts +39 -0
  86. package/dist/src/eta/idle.js +52 -0
  87. package/dist/src/eta/idle.js.map +1 -0
  88. package/dist/src/eta/index.d.ts +52 -0
  89. package/dist/src/eta/index.js +13 -0
  90. package/dist/src/eta/index.js.map +1 -0
  91. package/dist/src/eta/observer.d.ts +263 -0
  92. package/dist/src/eta/observer.js +263 -0
  93. package/dist/src/eta/observer.js.map +1 -0
  94. package/dist/src/eta/operations.d.ts +41 -0
  95. package/dist/src/eta/operations.js +59 -0
  96. package/dist/src/eta/operations.js.map +1 -0
  97. package/dist/src/eta/source-registry.d.ts +198 -0
  98. package/dist/src/eta/source-registry.js +267 -0
  99. package/dist/src/eta/source-registry.js.map +1 -0
  100. package/dist/src/eta/template-index.d.ts +285 -0
  101. package/dist/src/eta/template-index.js +642 -0
  102. package/dist/src/eta/template-index.js.map +1 -0
  103. package/dist/src/eta/types.d.ts +529 -0
  104. package/dist/src/eta/types.js +2 -0
  105. package/dist/src/eta/types.js.map +1 -0
  106. package/dist/src/index.d.ts +21 -9
  107. package/dist/src/index.js +22 -11
  108. package/dist/src/index.js.map +1 -1
  109. package/dist/src/nodes/node.context.d.ts +5 -3
  110. package/dist/src/nodes/node.context.js +48 -3
  111. package/dist/src/nodes/node.context.js.map +1 -1
  112. package/dist/src/nodes/node.option.d.ts +11 -31
  113. package/dist/src/nodes/node.option.js +158 -222
  114. package/dist/src/nodes/node.option.js.map +1 -1
  115. package/dist/src/nodes/node.product.d.ts +7 -11
  116. package/dist/src/nodes/node.product.js +85 -64
  117. package/dist/src/nodes/node.product.js.map +1 -1
  118. package/dist/src/renders/attributes/buyLink.d.ts +2 -2
  119. package/dist/src/renders/attributes/buyLink.js +14 -11
  120. package/dist/src/renders/attributes/buyLink.js.map +1 -1
  121. package/dist/src/renders/attributes/devices.d.ts +2 -2
  122. package/dist/src/renders/attributes/devices.js +9 -19
  123. package/dist/src/renders/attributes/devices.js.map +1 -1
  124. package/dist/src/renders/attributes/discount.d.ts +2 -2
  125. package/dist/src/renders/attributes/discount.js +56 -44
  126. package/dist/src/renders/attributes/discount.js.map +1 -1
  127. package/dist/src/renders/attributes/hide.d.ts +2 -2
  128. package/dist/src/renders/attributes/hide.js +49 -14
  129. package/dist/src/renders/attributes/hide.js.map +1 -1
  130. package/dist/src/renders/attributes/index.d.ts +3 -3
  131. package/dist/src/renders/attributes/index.js +2 -4
  132. package/dist/src/renders/attributes/index.js.map +1 -1
  133. package/dist/src/renders/attributes/price.d.ts +2 -2
  134. package/dist/src/renders/attributes/price.js +30 -44
  135. package/dist/src/renders/attributes/price.js.map +1 -1
  136. package/dist/src/renders/attributes/subscription.d.ts +2 -2
  137. package/dist/src/renders/attributes/subscription.js +14 -20
  138. package/dist/src/renders/attributes/subscription.js.map +1 -1
  139. package/dist/src/renders/attributes/utilty.d.ts +2 -0
  140. package/dist/src/renders/attributes/utilty.js +17 -4
  141. package/dist/src/renders/attributes/utilty.js.map +1 -1
  142. package/dist/src/renders/context.d.ts +122 -10
  143. package/dist/src/renders/context.js +140 -80
  144. package/dist/src/renders/context.js.map +1 -1
  145. package/dist/src/renders/format.js +2 -2
  146. package/dist/src/renders/format.js.map +1 -1
  147. package/dist/src/renders/index.d.ts +6 -2
  148. package/dist/src/renders/index.js +67 -29
  149. package/dist/src/renders/index.js.map +1 -1
  150. package/dist/src/renders/observe.d.ts +1 -4
  151. package/dist/src/renders/observe.js +10 -24
  152. package/dist/src/renders/observe.js.map +1 -1
  153. package/dist/src/renders/render.wrapper.d.ts +37 -0
  154. package/dist/src/renders/render.wrapper.js +147 -0
  155. package/dist/src/renders/render.wrapper.js.map +1 -0
  156. package/dist/src/templating/eta.js +1 -4
  157. package/dist/src/templating/eta.js.map +1 -1
  158. package/package.json +4 -5
  159. package/dist/src/actions/action.button.d.ts +0 -2
  160. package/dist/src/actions/action.button.js +0 -8
  161. package/dist/src/actions/action.button.js.map +0 -1
  162. package/dist/src/actions/action.input.d.ts +0 -2
  163. package/dist/src/actions/action.input.js +0 -43
  164. package/dist/src/actions/action.input.js.map +0 -1
  165. package/dist/src/actions/action.select.d.ts +0 -2
  166. package/dist/src/actions/action.select.js +0 -14
  167. package/dist/src/actions/action.select.js.map +0 -1
  168. package/dist/src/actions/utilty.d.ts +0 -16
  169. package/dist/src/actions/utilty.js +0 -149
  170. package/dist/src/actions/utilty.js.map +0 -1
  171. package/dist/src/contexts/context.datalayer.d.ts +0 -9
  172. package/dist/src/contexts/context.datalayer.js +0 -3
  173. package/dist/src/contexts/context.datalayer.js.map +0 -1
  174. package/dist/src/contexts/context.derived.d.ts +0 -12
  175. package/dist/src/contexts/context.derived.js +0 -3
  176. package/dist/src/contexts/context.derived.js.map +0 -1
  177. package/dist/src/contexts/context.option.d.ts +0 -5
  178. package/dist/src/contexts/context.option.js +0 -3
  179. package/dist/src/contexts/context.option.js.map +0 -1
  180. package/dist/src/contexts/context.product.d.ts +0 -5
  181. package/dist/src/contexts/context.product.js +0 -3
  182. package/dist/src/contexts/context.product.js.map +0 -1
  183. package/dist/src/contexts/context.state.d.ts +0 -28
  184. package/dist/src/contexts/context.state.js +0 -3
  185. package/dist/src/contexts/context.state.js.map +0 -1
  186. package/dist/src/contexts/context.store.d.ts +0 -5
  187. package/dist/src/contexts/context.store.js +0 -3
  188. package/dist/src/contexts/context.store.js.map +0 -1
  189. package/dist/src/controllers/collect-controller.d.ts +0 -39
  190. package/dist/src/controllers/collect-controller.js +0 -161
  191. package/dist/src/controllers/collect-controller.js.map +0 -1
  192. package/dist/src/controllers/compute-controller.d.ts +0 -55
  193. package/dist/src/controllers/compute-controller.js +0 -350
  194. package/dist/src/controllers/compute-controller.js.map +0 -1
  195. package/dist/src/controllers/eta-renderer/eta-dom-renderer.d.ts +0 -25
  196. package/dist/src/controllers/eta-renderer/eta-dom-renderer.js +0 -192
  197. package/dist/src/controllers/eta-renderer/eta-dom-renderer.js.map +0 -1
  198. package/dist/src/controllers/eta-renderer/eta-mutation-observer.d.ts +0 -28
  199. package/dist/src/controllers/eta-renderer/eta-mutation-observer.js +0 -206
  200. package/dist/src/controllers/eta-renderer/eta-mutation-observer.js.map +0 -1
  201. package/dist/src/controllers/eta-renderer/eta-renderer.d.ts +0 -21
  202. package/dist/src/controllers/eta-renderer/eta-renderer.js +0 -77
  203. package/dist/src/controllers/eta-renderer/eta-renderer.js.map +0 -1
  204. package/dist/src/controllers/eta-renderer/eta-template-cache.d.ts +0 -24
  205. package/dist/src/controllers/eta-renderer/eta-template-cache.js +0 -61
  206. package/dist/src/controllers/eta-renderer/eta-template-cache.js.map +0 -1
  207. package/dist/src/controllers/eta-renderer/eta-types.d.ts +0 -11
  208. package/dist/src/controllers/eta-renderer/eta-types.js +0 -1
  209. package/dist/src/controllers/eta-renderer/eta-types.js.map +0 -1
  210. package/dist/src/controllers/eta-renderer/index.d.ts +0 -2
  211. package/dist/src/controllers/eta-renderer/index.js +0 -2
  212. package/dist/src/controllers/eta-renderer/index.js.map +0 -1
  213. package/dist/src/controllers/event-pipeline-controller.d.ts +0 -28
  214. package/dist/src/controllers/event-pipeline-controller.js +0 -72
  215. package/dist/src/controllers/event-pipeline-controller.js.map +0 -1
  216. package/dist/src/events/events.d.ts +0 -75
  217. package/dist/src/events/events.js +0 -78
  218. package/dist/src/events/events.js.map +0 -1
  219. package/dist/src/nodes/node.root.d.ts +0 -16
  220. package/dist/src/nodes/node.root.js +0 -49
  221. package/dist/src/nodes/node.root.js.map +0 -1
  222. package/dist/src/nodes/node.state.d.ts +0 -88
  223. package/dist/src/nodes/node.state.js +0 -330
  224. package/dist/src/nodes/node.state.js.map +0 -1
  225. package/dist/src/renders/utility.d.ts +0 -32
  226. package/dist/src/renders/utility.js +0 -191
  227. package/dist/src/renders/utility.js.map +0 -1
@@ -1,88 +0,0 @@
1
- import { derivedContextType } from "../contexts/context.derived.js";
2
- import { stateContextType } from "../contexts/context.state.js";
3
- import { storeContextType } from "../contexts/context.store.js";
4
- import { ActionEvent, CollectAction, CollectOption, CollectUpdateByDelta, EventType, UpdateByDeltaEvent } from "../events/events.js";
5
- import { ProductOption } from "@repobit/dex-store";
6
- import { LitElement } from "lit";
7
- type Options = Map<symbol | string, Promise<ProductOption[]>>;
8
- type Actions = Map<symbol | string, NonNullable<CollectAction["action"]>>;
9
- type DeltaUpdate = Map<symbol | string, NonNullable<CollectUpdateByDelta["update"]>>;
10
- export declare class StateNode extends LitElement {
11
- autoForward: boolean;
12
- noCollect: boolean;
13
- ignoreEvents?: string;
14
- storeName: symbol | string;
15
- etaMutationDelay: number;
16
- etaMutationDelayMax: number;
17
- ignoreEventsParent: boolean;
18
- /**
19
- * all options as seens by this node
20
- * options + partialOptions
21
- */
22
- _options: Options;
23
- /**
24
- * all actions as seens by this node
25
- */
26
- _actions: Actions;
27
- /**
28
- * all delta updates as seens by this node
29
- * changes that affect only devices and subscription
30
- */
31
- _deltaUpdates: DeltaUpdate;
32
- /**
33
- * all product changes as seens by this node
34
- */
35
- _partialOptions: Actions;
36
- /**
37
- * all product changes as seens by this node
38
- */
39
- _partialBundleOptions: Actions;
40
- /**
41
- * Consumes store provided by root node
42
- */
43
- _store?: storeContextType;
44
- /**
45
- * Raw event pushed from parent (if any)
46
- */
47
- _eventParent?: EventType;
48
- _derived?: derivedContextType | null;
49
- _event?: EventType;
50
- _eventDom?: EventType;
51
- /**
52
- * Local state
53
- */
54
- state: stateContextType;
55
- /**
56
- * all options computed by this node
57
- * options * actions
58
- */
59
- get computedOptions(): ProductOption[] | undefined;
60
- private _compute;
61
- private _events;
62
- private _collect;
63
- private _eta;
64
- shouldRunEtaStateRender(): boolean;
65
- shouldObserveEtaMutations(): boolean;
66
- getEtaArgs(): unknown[];
67
- buildEtaContext(): Promise<object | undefined>;
68
- isStateNodeElement(el: Element): boolean;
69
- connectedCallback(): void;
70
- remove(): void;
71
- disconnectedCallback(): void;
72
- protected _eventChange(e: EventType): void;
73
- protected _forwardEvent(e?: EventType | undefined): void;
74
- protected _receiveParentEvent(e?: EventType): void;
75
- protected _pushEventToChildren(e?: EventType): void;
76
- collectOption({ name, options }: CollectOption): void;
77
- protected _notifyParent(): void;
78
- protected getUpdateComplete(): Promise<boolean>;
79
- protected isDeviceAndSubscriptionChange(evt: EventType): evt is ActionEvent;
80
- protected isBundleToogle(evt: EventType): evt is ActionEvent;
81
- protected isProductChange(evt: EventType): evt is ActionEvent;
82
- protected isActionEvent(evt: EventType): evt is ActionEvent;
83
- protected isDeltaUpdate(evt: EventType): evt is UpdateByDeltaEvent;
84
- protected _isIgnoredSource(e: EventType): boolean;
85
- private _getIgnoreSet;
86
- render(): import("lit-html").TemplateResult<1>;
87
- }
88
- export {};
@@ -1,330 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { derivedContext } from "../contexts/context.derived.js";
8
- import { stateContext } from "../contexts/context.state.js";
9
- import { storeContext } from "../contexts/context.store.js";
10
- import { CollectController } from "../controllers/collect-controller.js";
11
- import { ComputeController } from "../controllers/compute-controller.js";
12
- import { EtaRenderController } from "../controllers/eta-renderer/index.js";
13
- import { EventPipelineController } from "../controllers/event-pipeline-controller.js";
14
- import { ActionEvent, CollectOptionEvent, UpdateByDeltaEvent } from "../events/events.js";
15
- import { toDSLContext } from "../renders/context.js";
16
- import { consume, provide } from "@lit/context";
17
- import { html, LitElement } from "lit";
18
- import { property } from "lit/decorators.js";
19
- if (!window.Promise.withResolvers) {
20
- window.Promise.withResolvers = function () {
21
- let resolve, reject;
22
- const promise = new Promise((res, rej) => {
23
- resolve = res;
24
- reject = rej;
25
- });
26
- return { resolve, reject, promise };
27
- };
28
- }
29
- export class StateNode extends LitElement {
30
- constructor() {
31
- super(...arguments);
32
- this.autoForward = true;
33
- this.noCollect = false;
34
- this.storeName = Symbol("bd-state");
35
- // Configurable delay for mutation-triggered Eta coalescing (ms).
36
- // - Use 0 for next-tick behavior (runs ASAP, more visits)
37
- // - Use a higher value (e.g., 50–150) to batch SPA bursts
38
- this.etaMutationDelay = 10;
39
- this.etaMutationDelayMax = 100;
40
- // If true, ignore events coming from parent context; only react to
41
- // events originating inside this subtree (DOM-bubbled via listeners).
42
- this.ignoreEventsParent = false;
43
- /**
44
- * all options as seens by this node
45
- * options + partialOptions
46
- */
47
- this._options = new Map();
48
- /**
49
- * all actions as seens by this node
50
- */
51
- this._actions = new Map();
52
- /**
53
- * all delta updates as seens by this node
54
- * changes that affect only devices and subscription
55
- */
56
- this._deltaUpdates = new Map();
57
- /**
58
- * all product changes as seens by this node
59
- */
60
- this._partialOptions = new Map();
61
- /**
62
- * all product changes as seens by this node
63
- */
64
- this._partialBundleOptions = new Map();
65
- /**
66
- * Local state
67
- */
68
- this.state = {
69
- price: {
70
- min: {
71
- value: Number.MAX_SAFE_INTEGER,
72
- fmt: ""
73
- },
74
- max: {
75
- value: Number.MIN_SAFE_INTEGER,
76
- fmt: ""
77
- },
78
- monthly: {
79
- min: {
80
- value: Number.MAX_SAFE_INTEGER,
81
- fmt: ""
82
- },
83
- max: {
84
- value: Number.MIN_SAFE_INTEGER,
85
- fmt: ""
86
- }
87
- }
88
- },
89
- discountedPrice: {
90
- min: {
91
- value: Number.MAX_SAFE_INTEGER,
92
- fmt: ""
93
- },
94
- max: {
95
- value: Number.MIN_SAFE_INTEGER,
96
- fmt: ""
97
- },
98
- monthly: {
99
- min: {
100
- value: Number.MAX_SAFE_INTEGER,
101
- fmt: ""
102
- },
103
- max: {
104
- value: Number.MIN_SAFE_INTEGER,
105
- fmt: ""
106
- }
107
- }
108
- },
109
- discount: {
110
- min: {
111
- value: Number.MAX_SAFE_INTEGER,
112
- fmt: ""
113
- },
114
- max: {
115
- value: Number.MIN_SAFE_INTEGER,
116
- fmt: ""
117
- },
118
- monthly: {
119
- min: {
120
- value: Number.MAX_SAFE_INTEGER,
121
- fmt: ""
122
- },
123
- max: {
124
- value: Number.MIN_SAFE_INTEGER,
125
- fmt: ""
126
- }
127
- },
128
- percentage: {
129
- min: {
130
- value: Number.MAX_SAFE_INTEGER,
131
- fmt: ""
132
- },
133
- max: {
134
- value: Number.MIN_SAFE_INTEGER,
135
- fmt: ""
136
- },
137
- monthly: {
138
- min: {
139
- value: Number.MAX_SAFE_INTEGER,
140
- fmt: ""
141
- },
142
- max: {
143
- value: Number.MIN_SAFE_INTEGER,
144
- fmt: ""
145
- }
146
- }
147
- }
148
- }
149
- };
150
- this._compute = new ComputeController(this);
151
- this._events = new EventPipelineController(this, (e) => this._forwardEvent(e), () => this._notifyParent());
152
- this._collect = new CollectController(this, () => this._compute.abort(), () => this._compute.run(), () => this._notifyParent());
153
- this._eta = new EtaRenderController(this);
154
- }
155
- /**
156
- * all options computed by this node
157
- * options * actions
158
- */
159
- get computedOptions() {
160
- return this._compute.value;
161
- }
162
- // Allow subclasses to disable Eta rendering entirely.
163
- shouldRunEtaStateRender() { return true; }
164
- // Allow subclasses to opt out of mutation-triggered Eta runs.
165
- shouldObserveEtaMutations() {
166
- return this.shouldRunEtaStateRender();
167
- }
168
- getEtaArgs() {
169
- return [this.state, this._derived];
170
- }
171
- async buildEtaContext() {
172
- return await toDSLContext({ state: this.state, derived: this._derived });
173
- }
174
- isStateNodeElement(el) {
175
- if (el instanceof StateNode)
176
- return true;
177
- const t = el.tagName;
178
- return t === 'BD-STATE' || t === 'BD-PRODUCT' || t === 'BD-OPTION' || t === 'BD-CONTEXT';
179
- }
180
- connectedCallback() {
181
- super.connectedCallback();
182
- [ActionEvent, UpdateByDeltaEvent].forEach(e => this.addEventListener(e.eventName, this._eventChange));
183
- }
184
- remove() {
185
- // Announce removal to parent before DOM detaches, so it can unregister us
186
- this._collect.announceRemoval();
187
- this.dispatchEvent(new CollectOptionEvent({ name: this.storeName, options: null }));
188
- super.remove();
189
- }
190
- disconnectedCallback() {
191
- [ActionEvent, UpdateByDeltaEvent].forEach(e => this.removeEventListener(e.eventName, this._eventChange));
192
- super.disconnectedCallback();
193
- }
194
- _eventChange(e) {
195
- e.stopPropagation();
196
- // ignore if source matches ignore list
197
- if (this._isIgnoredSource(e)) {
198
- return;
199
- }
200
- this._eventDom = e;
201
- }
202
- _forwardEvent(e = this._event) {
203
- this._pushEventToChildren(e);
204
- }
205
- _receiveParentEvent(e) {
206
- if (this.ignoreEventsParent) {
207
- this._eventParent = undefined;
208
- return;
209
- }
210
- this._eventParent = e;
211
- }
212
- _pushEventToChildren(e) {
213
- if (!e)
214
- return;
215
- const children = this._collect.getContextualChildren();
216
- for (const child of children) {
217
- if (child === this)
218
- continue;
219
- if (child instanceof StateNode) {
220
- child._receiveParentEvent(e);
221
- }
222
- }
223
- }
224
- collectOption({ name, options }) {
225
- this._collect.collectOption({ name, options });
226
- }
227
- _notifyParent() {
228
- if (this.noCollect)
229
- return;
230
- this.dispatchEvent(new CollectOptionEvent({
231
- name: this.storeName,
232
- options: this._compute.taskComplete
233
- }));
234
- }
235
- async getUpdateComplete() {
236
- const result = await super.getUpdateComplete();
237
- await this._compute.taskComplete;
238
- await this._events.forwardComplete;
239
- await this._events.syncComplete;
240
- await this._collect.toggleComplete;
241
- await this._eta.taskComplete;
242
- // Ensure any debounced/mutation-triggered Eta runs have settled
243
- await this._eta.waitForIdle();
244
- await this._collect.waitForChildrenUpdateComplete();
245
- return result;
246
- }
247
- isDeviceAndSubscriptionChange(evt) {
248
- return evt instanceof ActionEvent
249
- && Boolean(evt.detail?.devices || evt.detail?.subscription)
250
- && !evt.detail.bundle;
251
- }
252
- isBundleToogle(evt) {
253
- return evt instanceof ActionEvent
254
- && Boolean(evt.detail?.id)
255
- && Boolean(evt.detail.bundle);
256
- }
257
- isProductChange(evt) {
258
- return evt instanceof ActionEvent
259
- && Boolean(evt.detail?.id)
260
- && !evt.detail.bundle;
261
- }
262
- isActionEvent(evt) {
263
- return this.isProductChange(evt) || this.isDeviceAndSubscriptionChange(evt);
264
- }
265
- isDeltaUpdate(evt) {
266
- return evt instanceof UpdateByDeltaEvent;
267
- }
268
- _isIgnoredSource(e) {
269
- const set = this._getIgnoreSet();
270
- if (set.size === 0)
271
- return false;
272
- const id = e.detail?.storeId || "";
273
- return set.has(id);
274
- }
275
- _getIgnoreSet() {
276
- const raw = this.ignoreEvents;
277
- if (!raw)
278
- return new Set();
279
- return new Set(raw
280
- .split(',')
281
- .map(s => s.trim())
282
- .filter(Boolean));
283
- }
284
- render() {
285
- return html `<slot></slot>`;
286
- }
287
- }
288
- __decorate([
289
- property({ type: Boolean })
290
- ], StateNode.prototype, "autoForward", void 0);
291
- __decorate([
292
- property({ type: Boolean, attribute: 'no-collect' })
293
- ], StateNode.prototype, "noCollect", void 0);
294
- __decorate([
295
- property({ attribute: 'ignore-events' })
296
- ], StateNode.prototype, "ignoreEvents", void 0);
297
- __decorate([
298
- property({ attribute: 'store-name' })
299
- ], StateNode.prototype, "storeName", void 0);
300
- __decorate([
301
- property({ attribute: 'eta-mutation-delay', type: Number })
302
- ], StateNode.prototype, "etaMutationDelay", void 0);
303
- __decorate([
304
- property({ attribute: 'eta-mutation-delay-max', type: Number })
305
- ], StateNode.prototype, "etaMutationDelayMax", void 0);
306
- __decorate([
307
- property({ type: Boolean, attribute: 'ignore-events-parent' })
308
- ], StateNode.prototype, "ignoreEventsParent", void 0);
309
- __decorate([
310
- consume({ context: storeContext, subscribe: true }),
311
- property({ attribute: false })
312
- ], StateNode.prototype, "_store", void 0);
313
- __decorate([
314
- property({ attribute: false })
315
- ], StateNode.prototype, "_eventParent", void 0);
316
- __decorate([
317
- consume({ context: derivedContext, subscribe: true }),
318
- property({ attribute: false })
319
- ], StateNode.prototype, "_derived", void 0);
320
- __decorate([
321
- property({ attribute: false })
322
- ], StateNode.prototype, "_event", void 0);
323
- __decorate([
324
- property({ attribute: false })
325
- ], StateNode.prototype, "_eventDom", void 0);
326
- __decorate([
327
- provide({ context: stateContext }),
328
- property({ attribute: false })
329
- ], StateNode.prototype, "state", void 0);
330
- //# sourceMappingURL=node.state.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.state.js","sourceRoot":"","sources":["../../../src/nodes/node.state.ts"],"names":[],"mappings":"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","sourcesContent":["import { derivedContext, derivedContextType } from \"@/contexts/context.derived\";\nimport { stateContext, stateContextType } from \"@/contexts/context.state\";\nimport { storeContext, storeContextType } from \"@/contexts/context.store\";\nimport { CollectController } from \"@/controllers/collect-controller\";\nimport { ComputeController } from \"@/controllers/compute-controller\";\nimport { EtaRenderController } from \"@/controllers/eta-renderer\";\nimport { EventPipelineController } from \"@/controllers/event-pipeline-controller\";\nimport { ActionEvent, CollectAction, CollectOption, CollectOptionEvent, CollectUpdateByDelta, EventType, UpdateByDeltaEvent } from \"@/events/events\";\nimport { toDSLContext } from \"@/renders/context\";\nimport { consume, provide } from \"@lit/context\";\nimport { ProductOption } from \"@repobit/dex-store\";\nimport { html, LitElement } from \"lit\";\nimport { property } from \"lit/decorators.js\";\n\ntype Options = Map<symbol | string, Promise<ProductOption[]>>;\ntype Actions = Map<symbol | string, NonNullable<CollectAction[\"action\"]>>;\ntype DeltaUpdate = Map<symbol | string, NonNullable<CollectUpdateByDelta[\"update\"]>>;\n\nif (!window.Promise.withResolvers) {\n window.Promise.withResolvers = function<T>() {\n let resolve, reject;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { resolve, reject, promise } as unknown as PromiseWithResolvers<T>;\n }\n}\n\nexport class StateNode extends LitElement {\n @property({ type: Boolean })\n autoForward = true;\n @property({ type: Boolean, attribute: 'no-collect' })\n noCollect = false;\n @property({ attribute: 'ignore-events' })\n ignoreEvents?: string;\n @property({ attribute: 'store-name' })\n storeName: symbol | string = Symbol(\"bd-state\");\n\n // Configurable delay for mutation-triggered Eta coalescing (ms).\n // - Use 0 for next-tick behavior (runs ASAP, more visits)\n // - Use a higher value (e.g., 50–150) to batch SPA bursts\n @property({ attribute: 'eta-mutation-delay', type: Number })\n etaMutationDelay = 10;\n @property({ attribute: 'eta-mutation-delay-max', type: Number })\n etaMutationDelayMax = 100;\n\n // If true, ignore events coming from parent context; only react to\n // events originating inside this subtree (DOM-bubbled via listeners).\n @property({ type: Boolean, attribute: 'ignore-events-parent' })\n ignoreEventsParent = false;\n\n /**\n * all options as seens by this node\n * options + partialOptions\n */\n _options: Options = new Map();\n\n /**\n * all actions as seens by this node\n */\n _actions: Actions = new Map();\n\n /**\n * all delta updates as seens by this node\n * changes that affect only devices and subscription\n */\n _deltaUpdates: DeltaUpdate = new Map();\n\n /**\n * all product changes as seens by this node\n */\n _partialOptions: Actions = new Map();\n\n /**\n * all product changes as seens by this node\n */\n _partialBundleOptions: Actions = new Map();\n\n /**\n * Consumes store provided by root node\n */\n @consume({ context: storeContext, subscribe: true })\n @property({ attribute: false })\n _store?: storeContextType;\n\n /**\n * Raw event pushed from parent (if any)\n */\n @property({ attribute: false })\n _eventParent?: EventType;\n\n // User-defined derived context for Eta/DSL\n @consume({ context: derivedContext, subscribe: true })\n @property({ attribute: false })\n _derived?: derivedContextType | null;\n\n // Effective event used by this node (merged from DOM and/or parent)\n @property({ attribute: false })\n _event?: EventType;\n\n // Last DOM-bubbled event captured at this node\n @property({ attribute: false })\n _eventDom?: EventType;\n\n /**\n * Local state\n */\n @provide({ context: stateContext })\n @property({ attribute: false })\n state: stateContextType = {\n price: {\n min: {\n value: Number.MAX_SAFE_INTEGER,\n fmt : \"\"\n },\n max: {\n value: Number.MIN_SAFE_INTEGER,\n fmt : \"\"\n },\n monthly: {\n min: {\n value: Number.MAX_SAFE_INTEGER,\n fmt : \"\"\n },\n max: {\n value: Number.MIN_SAFE_INTEGER,\n fmt : \"\"\n }\n }\n },\n discountedPrice: {\n min: {\n value: Number.MAX_SAFE_INTEGER,\n fmt : \"\"\n },\n max: {\n value: Number.MIN_SAFE_INTEGER,\n fmt : \"\"\n },\n monthly: {\n min: {\n value: Number.MAX_SAFE_INTEGER,\n fmt : \"\"\n },\n max: {\n value: Number.MIN_SAFE_INTEGER,\n fmt : \"\"\n }\n }\n },\n discount: {\n min: {\n value: Number.MAX_SAFE_INTEGER,\n fmt : \"\"\n },\n max: {\n value: Number.MIN_SAFE_INTEGER,\n fmt : \"\"\n },\n monthly: {\n min: {\n value: Number.MAX_SAFE_INTEGER,\n fmt : \"\"\n },\n max: {\n value: Number.MIN_SAFE_INTEGER,\n fmt : \"\"\n }\n },\n percentage: {\n min: {\n value: Number.MAX_SAFE_INTEGER,\n fmt : \"\"\n },\n max: {\n value: Number.MIN_SAFE_INTEGER,\n fmt : \"\"\n },\n monthly: {\n min: {\n value: Number.MAX_SAFE_INTEGER,\n fmt : \"\"\n },\n max: {\n value: Number.MIN_SAFE_INTEGER,\n fmt : \"\"\n }\n }\n }\n }\n };\n\n /**\n * all options computed by this node\n * options * actions\n */\n get computedOptions() {\n return this._compute.value;\n }\n\n private _compute = new ComputeController(this);\n private _events = new EventPipelineController(this, (e) => this._forwardEvent(e), () => this._notifyParent());\n private _collect = new CollectController(\n this,\n () => this._compute.abort(),\n () => this._compute.run(),\n () => this._notifyParent()\n );\n private _eta = new EtaRenderController(this);\n\n // Allow subclasses to disable Eta rendering entirely.\n shouldRunEtaStateRender(): boolean { return true; }\n\n // Allow subclasses to opt out of mutation-triggered Eta runs.\n shouldObserveEtaMutations(): boolean {\n return this.shouldRunEtaStateRender();\n }\n\n getEtaArgs(): unknown[] {\n return [this.state, this._derived];\n }\n\n async buildEtaContext(): Promise<object | undefined> {\n return await toDSLContext({ state: this.state, derived: this._derived });\n }\n\n isStateNodeElement(el: Element): boolean {\n if (el instanceof StateNode) return true;\n const t = el.tagName;\n return t === 'BD-STATE' || t === 'BD-PRODUCT' || t === 'BD-OPTION' || t === 'BD-CONTEXT';\n }\n\n connectedCallback() {\n super.connectedCallback();\n [ActionEvent, UpdateByDeltaEvent].forEach(e => this.addEventListener(e.eventName, this._eventChange))\n }\n\n remove(): void {\n // Announce removal to parent before DOM detaches, so it can unregister us\n this._collect.announceRemoval();\n this.dispatchEvent(\n new CollectOptionEvent({ name: this.storeName, options: null })\n );\n super.remove();\n }\n\n disconnectedCallback() {\n [ActionEvent, UpdateByDeltaEvent].forEach(e => this.removeEventListener(e.eventName, this._eventChange))\n super.disconnectedCallback();\n }\n\n protected _eventChange(e: EventType) {\n e.stopPropagation();\n // ignore if source matches ignore list\n if (this._isIgnoredSource(e)) {\n return;\n }\n this._eventDom = e;\n }\n\n protected _forwardEvent(e = this._event ) {\n this._pushEventToChildren(e);\n }\n\n protected _receiveParentEvent(e?: EventType) {\n if (this.ignoreEventsParent) {\n this._eventParent = undefined;\n return;\n }\n this._eventParent = e;\n }\n\n protected _pushEventToChildren(e?: EventType) {\n if (!e) return;\n const children = this._collect.getContextualChildren();\n for (const child of children) {\n if (child === this) continue;\n if (child instanceof StateNode) {\n child._receiveParentEvent(e);\n }\n }\n }\n\n collectOption({ name, options }: CollectOption) {\n this._collect.collectOption({ name, options });\n }\n\n protected _notifyParent() {\n if (this.noCollect) return;\n this.dispatchEvent(\n new CollectOptionEvent({\n name : this.storeName,\n options: this._compute.taskComplete as Promise<ProductOption[]>\n })\n );\n }\n\n protected async getUpdateComplete() {\n const result = await super.getUpdateComplete()\n await this._compute.taskComplete;\n await this._events.forwardComplete;\n await this._events.syncComplete;\n await this._collect.toggleComplete;\n await this._eta.taskComplete;\n // Ensure any debounced/mutation-triggered Eta runs have settled\n await this._eta.waitForIdle();\n await this._collect.waitForChildrenUpdateComplete();\n return result;\n }\n\n protected isDeviceAndSubscriptionChange(evt: EventType): evt is ActionEvent {\n return evt instanceof ActionEvent\n && Boolean(evt.detail?.devices || evt.detail?.subscription)\n && !evt.detail.bundle;\n }\n\n protected isBundleToogle(evt: EventType): evt is ActionEvent {\n return evt instanceof ActionEvent\n && Boolean(evt.detail?.id)\n && Boolean(evt.detail.bundle);\n }\n\n protected isProductChange(evt: EventType): evt is ActionEvent {\n return evt instanceof ActionEvent\n && Boolean(evt.detail?.id)\n && !evt.detail.bundle;\n }\n\n protected isActionEvent(evt: EventType): evt is ActionEvent {\n return this.isProductChange(evt) || this.isDeviceAndSubscriptionChange(evt);\n }\n\n protected isDeltaUpdate(evt: EventType): evt is UpdateByDeltaEvent {\n return evt instanceof UpdateByDeltaEvent\n }\n\n protected _isIgnoredSource(e: EventType): boolean {\n const set = this._getIgnoreSet();\n if (set.size === 0) return false;\n\n const id = e.detail?.storeId || \"\";\n return set.has(id);\n }\n\n private _getIgnoreSet(): Set<string> {\n const raw = this.ignoreEvents;\n if (!raw) return new Set();\n return new Set(\n raw\n .split(',')\n .map(s => s.trim())\n .filter(Boolean)\n );\n }\n\n render() {\n return html`<slot></slot>`;\n }\n}\n"]}
@@ -1,32 +0,0 @@
1
- import { Context, ContextType } from '@lit/context';
2
- type AnyContext = Context<unknown, unknown>;
3
- type CtxVal<C extends AnyContext> = ContextType<C>;
4
- type ContextMap = Record<string, AnyContext>;
5
- type ContextValues<M extends ContextMap> = {
6
- [K in keyof M]: CtxVal<M[K]>;
7
- };
8
- type BindContext<M extends ContextMap> = {
9
- el: HTMLElement;
10
- contexts: M;
11
- logic: (values: ContextValues<M>) => void | Promise<void>;
12
- observedAttrs: string[];
13
- requireAll?: boolean;
14
- };
15
- export type RenderNode = HTMLElement & {
16
- updateComplete?: Promise<void>;
17
- };
18
- export declare const DATA_RENDER_NODE = "[data-store-render]";
19
- export declare const DATA_HIDE_NODE = "[data-store-hide]";
20
- export declare const attachContext: <C extends AnyContext>(el: HTMLElement, context: C, onValue: (value: ContextType<C>) => void, { subscribe }?: {
21
- subscribe?: boolean;
22
- }) => () => void | undefined;
23
- export declare const observeAttributes: (el: HTMLElement, onChange: () => void, filter?: string[]) => () => void;
24
- /**
25
- * Subscribes to all contexts in `contexts`, coalesces updates in a microtask,
26
- * and calls `logic` with the latest values once ALL are present.
27
- * Returns a single disposer.
28
- */
29
- export declare function bindContext<M extends ContextMap>({ el, contexts, logic, observedAttrs, requireAll }: BindContext<M>): () => void;
30
- export declare const handleRenderNode: (el: RenderNode) => void;
31
- export declare const cleanupRenderNode: (el: RenderNode) => void;
32
- export {};
@@ -1,191 +0,0 @@
1
- import { derivedContext } from '../contexts/context.derived.js';
2
- import { optionContext } from '../contexts/context.option.js';
3
- import { productContext } from '../contexts/context.product.js';
4
- import { stateContext } from '../contexts/context.state.js';
5
- // Legacy per-context renders remain available until full migration is complete
6
- import { CollectChildEvent, CollectChildRemovedEvent } from '../events/events.js';
7
- import { renderAttributes } from '../renders/attributes/index.js';
8
- import { OBS_ATTRS_OPTION_PLUS_STATE } from '../renders/observe.js';
9
- import { ContextEvent } from '@lit/context';
10
- export const DATA_RENDER_NODE = "[data-store-render]";
11
- export const DATA_HIDE_NODE = "[data-store-hide]";
12
- // Track initialized render nodes to avoid duplicate bindings
13
- const RENDER_BOUND = new WeakSet();
14
- const RENDER_DISPOSE = new WeakMap();
15
- const RENDER_RESOLVE = new WeakMap();
16
- const RENDER_ORIGINAL_REMOVE = new WeakMap();
17
- export const attachContext = (el, context, onValue, { subscribe = true } = {}) => {
18
- let dispose;
19
- el.dispatchEvent(new ContextEvent(context, el, (value, d) => {
20
- onValue(value);
21
- dispose = d; // may be provided when subscribe === true
22
- }, subscribe));
23
- // call this later to unsubscribe (if provider gave you a disposer)
24
- return () => dispose?.();
25
- };
26
- export const observeAttributes = (el, onChange, filter) => {
27
- const mo = new MutationObserver((mutations) => {
28
- if (mutations.length === 0)
29
- return;
30
- onChange();
31
- });
32
- mo.observe(el, {
33
- attributes: true,
34
- attributeFilter: filter // e.g. ['user-id','subscribe']
35
- });
36
- // return disposer
37
- return () => mo.disconnect();
38
- };
39
- /**
40
- * Subscribes to all contexts in `contexts`, coalesces updates in a microtask,
41
- * and calls `logic` with the latest values once ALL are present.
42
- * Returns a single disposer.
43
- */
44
- export function bindContext({ el, contexts, logic, observedAttrs = [], requireAll = true }) {
45
- const keys = Object.keys(contexts);
46
- const latest = {};
47
- const seen = new Set();
48
- let scheduled = false; // a microtask has been queued
49
- let running = false; // logic is currently executing
50
- let needsRun = false; // something changed; run again after current finishes
51
- let disposed = false;
52
- const haveAll = () => seen.size === keys.length;
53
- const haveAny = () => seen.size > 0;
54
- const pump = async () => {
55
- scheduled = false;
56
- if (disposed)
57
- return;
58
- // If we're already running, just mark that we need another pass.
59
- if (running) {
60
- needsRun = true;
61
- return;
62
- }
63
- // Run when required contexts are present at least once.
64
- if (requireAll ? !haveAll() : !haveAny())
65
- return;
66
- running = true;
67
- try {
68
- do {
69
- needsRun = false;
70
- // Snapshot so each run sees a stable view even if `latest` changes while awaiting.
71
- const snapshot = {};
72
- for (const k of keys)
73
- snapshot[k] = latest[k];
74
- await Promise.resolve(logic(snapshot));
75
- } while (needsRun && !disposed); // drain one more time if updates queued while running
76
- }
77
- catch (err) {
78
- // Keep the queue alive even if user logic throws.
79
- console.error(err);
80
- }
81
- finally {
82
- running = false;
83
- if (needsRun && !disposed) {
84
- scheduled = true;
85
- queueMicrotask(pump);
86
- }
87
- }
88
- };
89
- const scheduleRun = () => {
90
- if (disposed)
91
- return;
92
- needsRun = true;
93
- if (!scheduled) {
94
- scheduled = true;
95
- queueMicrotask(pump);
96
- }
97
- };
98
- // subscribe to each requested context
99
- const disposers = keys.map((k) => attachContext(el, contexts[k], (value) => {
100
- latest[k] = value;
101
- seen.add(k);
102
- scheduleRun();
103
- }));
104
- // optional: observe attributes once for the whole group
105
- const stopAttrs = observedAttrs.length > 0
106
- ? observeAttributes(el, scheduleRun, observedAttrs)
107
- : () => { };
108
- // single disposer
109
- return () => {
110
- disposed = true;
111
- stopAttrs();
112
- seen.clear();
113
- for (const d of disposers)
114
- d();
115
- };
116
- }
117
- const addLogic = (el, rendered) => {
118
- // Single binder aggregates both contexts and renders when either changes
119
- return bindContext({
120
- el,
121
- contexts: { optionContext, stateContext, productContext, derivedContext },
122
- logic: async ({ optionContext, stateContext, productContext, derivedContext }) => {
123
- const opt = await optionContext;
124
- await renderAttributes(el, {
125
- option: opt,
126
- state: stateContext,
127
- product: productContext,
128
- derived: derivedContext
129
- });
130
- rendered();
131
- },
132
- observedAttrs: [...OBS_ATTRS_OPTION_PLUS_STATE]
133
- });
134
- };
135
- const teardownRenderNode = (el) => {
136
- const hadState = RENDER_BOUND.has(el)
137
- || RENDER_DISPOSE.has(el)
138
- || RENDER_RESOLVE.has(el)
139
- || RENDER_ORIGINAL_REMOVE.has(el);
140
- if (!hadState)
141
- return;
142
- const dispose = RENDER_DISPOSE.get(el);
143
- try {
144
- dispose?.();
145
- }
146
- catch { /* ignore */ }
147
- // Resolve any outstanding updateComplete so parents don't hang
148
- const resolve = RENDER_RESOLVE.get(el);
149
- try {
150
- resolve?.();
151
- }
152
- catch { /* ignore */ }
153
- const originalRemove = RENDER_ORIGINAL_REMOVE.get(el);
154
- if (originalRemove) {
155
- el.remove = originalRemove;
156
- }
157
- try {
158
- el.dispatchEvent(new CollectChildRemovedEvent({ child: el }));
159
- }
160
- catch { /* ignore */ }
161
- RENDER_DISPOSE.delete(el);
162
- RENDER_BOUND.delete(el);
163
- RENDER_RESOLVE.delete(el);
164
- RENDER_ORIGINAL_REMOVE.delete(el);
165
- };
166
- export const handleRenderNode = (el) => {
167
- // Idempotent: don't re-bind the same node
168
- if (RENDER_BOUND.has(el))
169
- return;
170
- RENDER_BOUND.add(el);
171
- const { promise, resolve } = Promise.withResolvers();
172
- el.updateComplete = promise;
173
- const dispose = addLogic(el, resolve);
174
- RENDER_DISPOSE.set(el, dispose);
175
- RENDER_RESOLVE.set(el, resolve);
176
- // Register as contextual child so nearest StateNode parents can await it
177
- try {
178
- el.dispatchEvent(new CollectChildEvent({ child: el }));
179
- }
180
- catch { /* ignore */ }
181
- const originalRemove = el.remove;
182
- RENDER_ORIGINAL_REMOVE.set(el, originalRemove);
183
- el.remove = () => {
184
- teardownRenderNode(el);
185
- originalRemove.call(el);
186
- };
187
- };
188
- export const cleanupRenderNode = (el) => {
189
- teardownRenderNode(el);
190
- };
191
- //# sourceMappingURL=utility.js.map