@repobit/dex-store-elements 1.7.2 → 2.0.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 (227) hide show
  1. package/CHANGELOG.md +5 -905
  2. package/README.md +9 -7
  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,39 +0,0 @@
1
- import type { CollectAction, CollectOption, CollectUpdateByDelta } from "../events/events.js";
2
- import { ReactiveController, ReactiveControllerHost } from "lit";
3
- type CollectHost = ReactiveControllerHost & {
4
- storeName: symbol | string;
5
- noCollect: boolean;
6
- _options: Map<symbol | string, Promise<unknown[]>>;
7
- _actions: Map<symbol | string, NonNullable<CollectAction["action"]>>;
8
- _partialOptions: Map<symbol | string, NonNullable<CollectAction["action"]>>;
9
- _partialBundleOptions: Map<symbol | string, NonNullable<CollectAction["action"]>>;
10
- _deltaUpdates: Map<symbol | string, NonNullable<CollectUpdateByDelta["update"]>>;
11
- dispatchEvent(evt: Event): boolean;
12
- } & EventTarget;
13
- export declare class CollectController implements ReactiveController {
14
- private host;
15
- private _computeAbort;
16
- private _computeRun;
17
- private _notifyParent;
18
- private _contextualChildren;
19
- private _prevCollect?;
20
- private _toggleTask;
21
- constructor(host: CollectHost, computeAbort: () => void, computeRun: () => void, notifyParent: () => void);
22
- hostConnected(): void;
23
- hostDisconnected(): void;
24
- get toggleComplete(): Promise<void>;
25
- collectOption(detail: CollectOption): void;
26
- announceRemoval(): void;
27
- waitForChildrenUpdateComplete(): Promise<void>;
28
- getContextualChildren(): HTMLElement[];
29
- private _collectOptionEvent;
30
- private _collectActionEvent;
31
- private _collectUpdateByDeltaEvent;
32
- private _onCollectChild;
33
- private _onCollectChildRemoved;
34
- private _announceAsContextualChild;
35
- private _announceContextualChildRemoved;
36
- hostUpdate(): void;
37
- hostUpdated(): void;
38
- }
39
- export {};
@@ -1,161 +0,0 @@
1
- import { CollectActionEvent, CollectChildEvent, CollectChildRemovedEvent, CollectOptionEvent, CollectUpdateByDeltaEvent } from "../events/events.js";
2
- import { Task } from "@lit/task";
3
- export class CollectController {
4
- constructor(host, computeAbort, computeRun, notifyParent) {
5
- this._contextualChildren = new Set();
6
- this._collectOptionEvent = (e) => {
7
- if (e.target === this.host)
8
- return;
9
- e.stopPropagation();
10
- this.collectOption(e.detail);
11
- };
12
- this._collectActionEvent = (e) => {
13
- if (e.target === this.host)
14
- return;
15
- e.stopPropagation();
16
- const { name, action } = e.detail;
17
- if (action === null) {
18
- this.host._actions.delete(name);
19
- this.host._partialOptions.delete(name);
20
- this.host._partialBundleOptions.delete(name);
21
- }
22
- else if (!action.id && (action.devices || action.subscription)) {
23
- this.host._actions.set(name, action);
24
- }
25
- else {
26
- if (action.bundle) {
27
- this.host._partialBundleOptions.set(name, action);
28
- }
29
- else {
30
- this.host._partialOptions.set(name, action);
31
- }
32
- }
33
- this._computeAbort();
34
- this._computeRun();
35
- this._notifyParent();
36
- };
37
- this._collectUpdateByDeltaEvent = (e) => {
38
- if (e.target === this.host)
39
- return;
40
- const { name, update } = e.detail;
41
- if (update === null) {
42
- this.host._deltaUpdates.delete(name);
43
- }
44
- else {
45
- this.host._deltaUpdates.set(name, update);
46
- }
47
- this._computeAbort();
48
- this._computeRun();
49
- this._notifyParent();
50
- };
51
- this._onCollectChild = (e) => {
52
- if (e.target === this.host)
53
- return;
54
- e.stopPropagation();
55
- const { child } = e.detail;
56
- const hostEl = this.host;
57
- if (child && child !== hostEl) {
58
- this._contextualChildren.add(child);
59
- }
60
- };
61
- this._onCollectChildRemoved = (e) => {
62
- if (e.target === this.host)
63
- return;
64
- e.stopPropagation();
65
- const { child } = e.detail;
66
- const hostEl = this.host;
67
- if (child && child !== hostEl) {
68
- this._contextualChildren.delete(child);
69
- }
70
- };
71
- this.host = host;
72
- this._computeAbort = computeAbort;
73
- this._computeRun = computeRun;
74
- this._notifyParent = notifyParent;
75
- host.addController(this);
76
- this._toggleTask = new Task(host, {
77
- task: async ([noCollect]) => {
78
- const prev = this._prevCollect;
79
- this._prevCollect = !noCollect;
80
- if (prev === undefined) {
81
- if (!noCollect)
82
- this._notifyParent();
83
- return;
84
- }
85
- const currentCollect = !noCollect;
86
- if (currentCollect && !prev) {
87
- this._notifyParent();
88
- }
89
- else if (!currentCollect && prev) {
90
- this.host.dispatchEvent(new CollectOptionEvent({ name: this.host.storeName, options: null }));
91
- }
92
- },
93
- args: () => [this.host.noCollect]
94
- });
95
- }
96
- hostConnected() {
97
- this.host.addEventListener(CollectChildEvent.eventName, this._onCollectChild);
98
- this.host.addEventListener(CollectChildRemovedEvent.eventName, this._onCollectChildRemoved);
99
- this.host.addEventListener(CollectActionEvent.eventName, this._collectActionEvent);
100
- this.host.addEventListener(CollectUpdateByDeltaEvent.eventName, this._collectUpdateByDeltaEvent);
101
- this.host.addEventListener(CollectOptionEvent.eventName, this._collectOptionEvent);
102
- this._announceAsContextualChild();
103
- }
104
- hostDisconnected() {
105
- this.host.removeEventListener(CollectChildEvent.eventName, this._onCollectChild);
106
- this.host.removeEventListener(CollectChildRemovedEvent.eventName, this._onCollectChildRemoved);
107
- this.host.removeEventListener(CollectActionEvent.eventName, this._collectActionEvent);
108
- this.host.removeEventListener(CollectUpdateByDeltaEvent.eventName, this._collectUpdateByDeltaEvent);
109
- this.host.removeEventListener(CollectOptionEvent.eventName, this._collectOptionEvent);
110
- this.host._options.clear();
111
- this.host._actions.clear();
112
- this.host._partialOptions.clear();
113
- this.host._partialBundleOptions.clear();
114
- this.host._deltaUpdates.clear();
115
- this._contextualChildren.clear();
116
- }
117
- get toggleComplete() {
118
- return this._toggleTask.taskComplete;
119
- }
120
- collectOption(detail) {
121
- if (detail.options === null) {
122
- this.host._options.delete(detail.name);
123
- }
124
- else {
125
- this.host._options.set(detail.name, detail.options);
126
- }
127
- this._computeAbort();
128
- this._computeRun();
129
- this._notifyParent();
130
- }
131
- announceRemoval() {
132
- this._announceContextualChildRemoved();
133
- }
134
- async waitForChildrenUpdateComplete() {
135
- try {
136
- const children = Array.from(this._contextualChildren);
137
- const waits = children
138
- .map((c) => c.updateComplete)
139
- .filter((p) => !!p);
140
- if (waits.length > 0)
141
- await Promise.allSettled(waits);
142
- }
143
- catch { /* ignore */ }
144
- }
145
- getContextualChildren() {
146
- return Array.from(this._contextualChildren);
147
- }
148
- _announceAsContextualChild() {
149
- this.host.dispatchEvent(new CollectChildEvent({ child: this.host }));
150
- }
151
- _announceContextualChildRemoved() {
152
- this.host.dispatchEvent(new CollectChildRemovedEvent({ child: this.host }));
153
- }
154
- hostUpdate() {
155
- // no-op
156
- }
157
- hostUpdated() {
158
- // no-op
159
- }
160
- }
161
- //# sourceMappingURL=collect-controller.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"collect-controller.js","sourceRoot":"","sources":["../../../src/controllers/collect-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CollectAction, CollectOption, CollectUpdateByDelta } from \"@/events/events\";\nimport { CollectActionEvent, CollectChildEvent, CollectChildRemovedEvent, CollectOptionEvent, CollectUpdateByDeltaEvent } from \"@/events/events\";\nimport { Task } from \"@lit/task\";\nimport { ReactiveController, ReactiveControllerHost } from \"lit\";\n\ntype CollectHost = ReactiveControllerHost & {\n storeName : symbol | string;\n noCollect : boolean;\n _options : Map<symbol | string, Promise<unknown[]>>;\n _actions : Map<symbol | string, NonNullable<CollectAction[\"action\"]>>;\n _partialOptions : Map<symbol | string, NonNullable<CollectAction[\"action\"]>>;\n _partialBundleOptions: Map<symbol | string, NonNullable<CollectAction[\"action\"]>>;\n _deltaUpdates : Map<symbol | string, NonNullable<CollectUpdateByDelta[\"update\"]>>;\n dispatchEvent(evt: Event): boolean;\n} & EventTarget;\n\nexport class CollectController implements ReactiveController {\n private host : CollectHost;\n private _computeAbort: () => void;\n private _computeRun : () => void;\n private _notifyParent: () => void;\n private _contextualChildren = new Set<HTMLElement>();\n private _prevCollect?: boolean;\n private _toggleTask : Task<unknown[], void>;\n\n constructor(host: CollectHost, computeAbort: () => void, computeRun: () => void, notifyParent: () => void) {\n this.host = host;\n this._computeAbort = computeAbort;\n this._computeRun = computeRun;\n this._notifyParent = notifyParent;\n host.addController(this);\n\n this._toggleTask = new Task(host, {\n task: async ([noCollect]) => {\n const prev = this._prevCollect;\n this._prevCollect = !noCollect;\n if (prev === undefined) {\n if (!noCollect) this._notifyParent();\n return;\n }\n const currentCollect = !noCollect;\n if (currentCollect && !prev) {\n this._notifyParent();\n } else if (!currentCollect && prev) {\n this.host.dispatchEvent(new CollectOptionEvent({ name: this.host.storeName, options: null }));\n }\n },\n args: () => [this.host.noCollect]\n });\n }\n\n hostConnected() {\n this.host.addEventListener(CollectChildEvent.eventName, this._onCollectChild as EventListener);\n this.host.addEventListener(CollectChildRemovedEvent.eventName, this._onCollectChildRemoved as EventListener);\n this.host.addEventListener(CollectActionEvent.eventName, this._collectActionEvent as EventListener);\n this.host.addEventListener(CollectUpdateByDeltaEvent.eventName, this._collectUpdateByDeltaEvent as EventListener);\n this.host.addEventListener(CollectOptionEvent.eventName, this._collectOptionEvent as EventListener);\n\n this._announceAsContextualChild();\n }\n\n hostDisconnected() {\n this.host.removeEventListener(CollectChildEvent.eventName, this._onCollectChild as EventListener);\n this.host.removeEventListener(CollectChildRemovedEvent.eventName, this._onCollectChildRemoved as EventListener);\n this.host.removeEventListener(CollectActionEvent.eventName, this._collectActionEvent as EventListener);\n this.host.removeEventListener(CollectUpdateByDeltaEvent.eventName, this._collectUpdateByDeltaEvent as EventListener);\n this.host.removeEventListener(CollectOptionEvent.eventName, this._collectOptionEvent as EventListener);\n\n this.host._options.clear();\n this.host._actions.clear();\n this.host._partialOptions.clear();\n this.host._partialBundleOptions.clear();\n this.host._deltaUpdates.clear();\n this._contextualChildren.clear();\n }\n\n get toggleComplete() {\n return this._toggleTask.taskComplete;\n }\n\n collectOption(detail: CollectOption) {\n if (detail.options === null) {\n this.host._options.delete(detail.name);\n } else {\n this.host._options.set(detail.name, detail.options as Promise<unknown[]>);\n }\n\n this._computeAbort();\n this._computeRun();\n this._notifyParent();\n }\n\n announceRemoval() {\n this._announceContextualChildRemoved();\n }\n\n async waitForChildrenUpdateComplete() {\n try {\n const children = Array.from(this._contextualChildren);\n const waits = children\n .map((c) => (c as unknown as { updateComplete?: Promise<void> }).updateComplete)\n .filter((p): p is Promise<void> => !!p);\n if (waits.length > 0) await Promise.allSettled(waits);\n } catch { /* ignore */ }\n }\n\n getContextualChildren(): HTMLElement[] {\n return Array.from(this._contextualChildren);\n }\n\n private _collectOptionEvent = (e: CollectOptionEvent) => {\n if (e.target === this.host) return;\n e.stopPropagation();\n this.collectOption(e.detail);\n };\n\n private _collectActionEvent = (e: CollectActionEvent) => {\n if (e.target === this.host) return;\n e.stopPropagation();\n const { name, action } = e.detail;\n\n if (action === null) {\n this.host._actions.delete(name);\n this.host._partialOptions.delete(name);\n this.host._partialBundleOptions.delete(name);\n } else if (!action.id && (action.devices || action.subscription)) {\n this.host._actions.set(name, action);\n } else {\n if (action.bundle) {\n this.host._partialBundleOptions.set(name, action);\n } else {\n this.host._partialOptions.set(name, action);\n }\n }\n\n this._computeAbort();\n this._computeRun();\n this._notifyParent();\n };\n\n private _collectUpdateByDeltaEvent = (e: CollectUpdateByDeltaEvent) => {\n if (e.target === this.host) return;\n\n const { name, update } = e.detail;\n if (update === null) {\n this.host._deltaUpdates.delete(name);\n } else {\n this.host._deltaUpdates.set(name, update);\n }\n\n this._computeAbort();\n this._computeRun();\n this._notifyParent();\n };\n\n private _onCollectChild = (e: CollectChildEvent) => {\n if (e.target === this.host) return;\n e.stopPropagation();\n const { child } = e.detail;\n const hostEl = this.host as unknown as HTMLElement;\n if (child && child !== hostEl) {\n this._contextualChildren.add(child);\n }\n };\n\n private _onCollectChildRemoved = (e: CollectChildRemovedEvent) => {\n if (e.target === this.host) return;\n e.stopPropagation();\n const { child } = e.detail;\n const hostEl = this.host as unknown as HTMLElement;\n if (child && child !== hostEl) {\n this._contextualChildren.delete(child);\n }\n };\n\n private _announceAsContextualChild() {\n this.host.dispatchEvent(new CollectChildEvent({ child: this.host as unknown as HTMLElement }));\n }\n\n private _announceContextualChildRemoved() {\n this.host.dispatchEvent(new CollectChildRemovedEvent({ child: this.host as unknown as HTMLElement }));\n }\n\n hostUpdate() {\n // no-op\n }\n\n hostUpdated() {\n // no-op\n }\n}\n"]}
@@ -1,55 +0,0 @@
1
- import { stateContextType } from "../contexts/context.state.js";
2
- import { storeContextType } from "../contexts/context.store.js";
3
- import { CollectAction, CollectUpdateByDelta } from "../events/events.js";
4
- import { ProductOption } from "@repobit/dex-store";
5
- import { ReactiveController, ReactiveControllerHost } from "lit";
6
- type Options = Map<symbol | string, Promise<ProductOption[]>>;
7
- type Actions = Map<symbol | string, NonNullable<CollectAction["action"]>>;
8
- type DeltaUpdate = Map<symbol | string, NonNullable<CollectUpdateByDelta["update"]>>;
9
- type ComputeHost = ReactiveControllerHost & {
10
- storeName: symbol | string;
11
- _store?: storeContextType;
12
- _options: Options;
13
- _actions: Actions;
14
- _deltaUpdates: DeltaUpdate;
15
- _partialOptions: Actions;
16
- _partialBundleOptions: Actions;
17
- state: stateContextType;
18
- };
19
- export declare class ComputeController implements ReactiveController {
20
- private host;
21
- private _computeTask;
22
- constructor(host: ComputeHost);
23
- get value(): ProductOption[] | undefined;
24
- get taskComplete(): Promise<ProductOption[] | undefined>;
25
- run(): void;
26
- abort(): void;
27
- hostConnected(): void;
28
- hostDisconnected(): void;
29
- hostUpdate(): void;
30
- hostUpdated(): void;
31
- private _isAbortError;
32
- private _computeState;
33
- private _seedOptions;
34
- private _expandFixedPoint;
35
- private _applyBundleCombinations;
36
- private _getOptionKey;
37
- private _applyPartials;
38
- private _applyActions;
39
- private _applyDeltaUpdates;
40
- private _applyAbsoluteDelta;
41
- private _applySteppedDelta;
42
- private _getDimensionValues;
43
- private _getAbsoluteBounds;
44
- /**
45
- * Returns the next delta value for this action, or null when expansion is done.
46
- */
47
- private _computeDelta;
48
- private _computeContext;
49
- private _updateMinMax;
50
- private _createInitialState;
51
- private _getOptionByDimension;
52
- private _getOption;
53
- private _applyBundles;
54
- }
55
- export {};
@@ -1,350 +0,0 @@
1
- import { Task } from "@lit/task";
2
- export class ComputeController {
3
- constructor(host) {
4
- this.host = host;
5
- host.addController(this);
6
- this._computeTask = new Task(host, {
7
- task: async (_, { signal }) => {
8
- const isActive = () => {
9
- if (signal.aborted) {
10
- throw new DOMException("Task aborted", `AbortError ${this.host.storeName.toString()}`);
11
- }
12
- };
13
- try {
14
- const computed = await this._computeState(isActive);
15
- await this._computeContext(computed, isActive);
16
- return computed;
17
- }
18
- catch (error) {
19
- if (this._isAbortError(error)) {
20
- return [];
21
- }
22
- console.error(error);
23
- return [];
24
- }
25
- },
26
- args: () => [this.host._store]
27
- });
28
- }
29
- get value() {
30
- return this._computeTask.value;
31
- }
32
- get taskComplete() {
33
- return this._computeTask.taskComplete;
34
- }
35
- run() {
36
- this._computeTask.run();
37
- }
38
- abort() {
39
- this._computeTask.abort();
40
- }
41
- hostConnected() {
42
- // no-op
43
- }
44
- hostDisconnected() {
45
- // no-op
46
- }
47
- hostUpdate() {
48
- // no-op
49
- }
50
- hostUpdated() {
51
- // no-op
52
- }
53
- _isAbortError(error) {
54
- return error instanceof DOMException && error.name.includes("AbortError");
55
- }
56
- async _computeState(isActive) {
57
- const computed = new Map();
58
- const queue = [];
59
- const enqueue = (option) => {
60
- if (!option)
61
- return;
62
- const key = this._getOptionKey(option);
63
- if (computed.has(key))
64
- return;
65
- computed.set(key, option);
66
- queue.push(option);
67
- };
68
- await this._seedOptions(enqueue, isActive);
69
- await this._expandFixedPoint(queue, enqueue, isActive);
70
- await this._applyBundleCombinations(computed, enqueue, isActive);
71
- return [...computed.values()];
72
- }
73
- async _seedOptions(enqueue, isActive) {
74
- for (const optionsPromise of this.host._options.values()) {
75
- isActive();
76
- const options = await optionsPromise;
77
- for (const option of options) {
78
- isActive();
79
- enqueue(option);
80
- const partials = await this._applyPartials(option, isActive);
81
- for (const partial of partials) {
82
- enqueue(partial);
83
- }
84
- }
85
- }
86
- }
87
- async _expandFixedPoint(queue, enqueue, isActive) {
88
- while (queue.length > 0) {
89
- isActive();
90
- const current = queue.shift();
91
- const actionResults = await this._applyActions(current, isActive);
92
- for (const option of actionResults) {
93
- enqueue(option);
94
- }
95
- const deltaResults = await this._applyDeltaUpdates(current, isActive);
96
- for (const option of deltaResults) {
97
- enqueue(option);
98
- }
99
- }
100
- }
101
- async _applyBundleCombinations(computed, enqueue, isActive) {
102
- const bundles = [...this.host._partialBundleOptions.values()];
103
- for (const option of [...computed.values()]) {
104
- isActive();
105
- const bundleResults = await this._applyBundles(option, bundles);
106
- for (const bundled of bundleResults) {
107
- enqueue(bundled);
108
- }
109
- }
110
- }
111
- _getOptionKey(option) {
112
- const product = option.getProduct();
113
- const bundle = option.getBundle()
114
- .map(({ option: bundled }) => this._getOptionKey(bundled))
115
- .sort()
116
- .join("|");
117
- return [
118
- product.getId(),
119
- product.getCampaign() || "",
120
- option.getDevices(),
121
- option.getSubscription(),
122
- bundle
123
- ].join("::");
124
- }
125
- async _applyPartials(baseOpt, isActive) {
126
- const results = [];
127
- for (const partial of this.host._partialOptions.values()) {
128
- isActive();
129
- if (!partial.id) {
130
- continue;
131
- }
132
- const newProduct = await baseOpt.switchProduct({ id: partial.id, campaign: partial.campaign });
133
- const newOpt = await newProduct?.getOption({
134
- devices: partial.devices ?? baseOpt.getDevices(),
135
- subscription: partial.subscription ?? baseOpt.getSubscription()
136
- });
137
- if (newOpt)
138
- results.push(newOpt);
139
- }
140
- return results;
141
- }
142
- async _applyActions(baseOpt, isActive) {
143
- const results = [];
144
- for (const action of this.host._actions.values()) {
145
- isActive();
146
- const targetDevices = action.devices ?? baseOpt.getDevices();
147
- const targetSubscription = action.subscription ?? baseOpt.getSubscription();
148
- // Skip no-op actions that don't change anything
149
- if (targetDevices === baseOpt.getDevices() && targetSubscription === baseOpt.getSubscription()) {
150
- continue;
151
- }
152
- const newOpt = await baseOpt.getOption({
153
- devices: targetDevices,
154
- subscription: targetSubscription
155
- });
156
- if (newOpt)
157
- results.push(newOpt);
158
- }
159
- return results;
160
- }
161
- async _applyDeltaUpdates(baseOpt, isActive) {
162
- const results = [];
163
- for (const action of this.host._deltaUpdates.values()) {
164
- isActive();
165
- const updates = action.useAsValue
166
- ? await this._applyAbsoluteDelta(baseOpt, action, isActive)
167
- : await this._applySteppedDelta(baseOpt, action, isActive);
168
- for (const option of updates) {
169
- results.push(option);
170
- }
171
- }
172
- return results;
173
- }
174
- async _applyAbsoluteDelta(baseOpt, action, isActive) {
175
- const values = this._getDimensionValues(baseOpt, action.type);
176
- const results = [];
177
- const bounds = this._getAbsoluteBounds(action, action.delta);
178
- for (const value of values) {
179
- isActive();
180
- if (value < bounds.min || value > bounds.max)
181
- continue;
182
- const option = await this._getOptionByDimension(baseOpt, action.type, value);
183
- if (option)
184
- results.push(option);
185
- }
186
- return results;
187
- }
188
- async _applySteppedDelta(baseOpt, action, isActive) {
189
- const results = [];
190
- const values = this._getDimensionValues(baseOpt, action.type);
191
- let current = action.type === "devices"
192
- ? baseOpt.getDevices()
193
- : baseOpt.getSubscription();
194
- while (true) {
195
- isActive();
196
- const next = this._computeDelta(values, current, action);
197
- if (next === null)
198
- break;
199
- current = next;
200
- const option = await this._getOptionByDimension(baseOpt, action.type, current);
201
- if (option) {
202
- results.push(option);
203
- }
204
- }
205
- return results;
206
- }
207
- _getDimensionValues(option, type) {
208
- const product = option.getProduct();
209
- return type === "devices"
210
- ? product.getDevices().values
211
- : product.getSubscriptions().values;
212
- }
213
- _getAbsoluteBounds(action, fallback) {
214
- const fallbackValue = typeof fallback === "number" && !Number.isNaN(fallback)
215
- ? fallback
216
- : Number.MIN_SAFE_INTEGER;
217
- const min = action.min ?? fallbackValue;
218
- const max = action.max ?? fallbackValue;
219
- return min <= max ? { min, max } : { min: max, max: min };
220
- }
221
- /**
222
- * Returns the next delta value for this action, or null when expansion is done.
223
- */
224
- _computeDelta(values, current, action) {
225
- const min = action.min ?? Number.MIN_SAFE_INTEGER;
226
- const max = action.max ?? Number.MAX_SAFE_INTEGER;
227
- const lower = Math.min(min, max);
228
- const upper = Math.max(min, max);
229
- if (action.delta === "next" || action.delta === "prev") {
230
- const idx = values.findIndex(v => v === current);
231
- const step = action.delta === "next" ? 1 : -1;
232
- const candidate = values.at(idx + step);
233
- if (candidate === undefined)
234
- return null;
235
- if (candidate < lower || candidate > upper)
236
- return null;
237
- return candidate === current ? null : candidate;
238
- }
239
- if (Number.isNaN(action.delta) || action.delta === 0) {
240
- return null;
241
- }
242
- const candidate = current + action.delta;
243
- if (candidate < lower || candidate > upper)
244
- return null;
245
- return candidate === current ? null : candidate;
246
- }
247
- async _computeContext(options, isActive) {
248
- const nextState = this._createInitialState();
249
- for (const option of options) {
250
- isActive();
251
- this._updateMinMax(nextState.price, option.getPrice({ currency: false }), option.getPrice());
252
- this._updateMinMax(nextState.price.monthly, option.getPrice({ monthly: true, currency: false }), option.getPrice({ monthly: true }));
253
- this._updateMinMax(nextState.discountedPrice, option.getDiscountedPrice({ currency: false }), option.getDiscountedPrice());
254
- this._updateMinMax(nextState.discountedPrice.monthly, option.getDiscountedPrice({ monthly: true, currency: false }), option.getDiscountedPrice({ monthly: true }));
255
- this._updateMinMax(nextState.discount, option.getDiscount({ symbol: false }), option.getDiscount());
256
- this._updateMinMax(nextState.discount.monthly, option.getDiscount({ monthly: true, symbol: false }), option.getDiscount({ monthly: true }));
257
- this._updateMinMax(nextState.discount.percentage, option.getDiscount({ percentage: true, symbol: false }), option.getDiscount({ percentage: true }));
258
- this._updateMinMax(nextState.discount.percentage.monthly, option.getDiscount({ monthly: true, percentage: true, symbol: false }), option.getDiscount({ monthly: true, percentage: true }));
259
- }
260
- this.host.state = nextState;
261
- }
262
- _updateMinMax(range, value, formatted) {
263
- if (value < range.min.value) {
264
- range.min.value = value;
265
- range.min.fmt = formatted;
266
- }
267
- if (value > range.max.value) {
268
- range.max.value = value;
269
- range.max.fmt = formatted;
270
- }
271
- }
272
- _createInitialState() {
273
- const createRange = () => ({
274
- min: { value: Number.MAX_SAFE_INTEGER, fmt: "" },
275
- max: { value: Number.MIN_SAFE_INTEGER, fmt: "" }
276
- });
277
- return {
278
- price: {
279
- ...createRange(),
280
- monthly: createRange()
281
- },
282
- discountedPrice: {
283
- ...createRange(),
284
- monthly: createRange()
285
- },
286
- discount: {
287
- ...createRange(),
288
- monthly: createRange(),
289
- percentage: {
290
- ...createRange(),
291
- monthly: createRange()
292
- }
293
- }
294
- };
295
- }
296
- async _getOptionByDimension(baseOpt, type, value) {
297
- const devices = type === "devices" ? value : baseOpt.getDevices();
298
- const subscription = type === "subscription" ? value : baseOpt.getSubscription();
299
- return baseOpt.getOption({ devices, subscription });
300
- }
301
- async _getOption({ id, campaign, devices, subscription }, bundle = []) {
302
- if (id && devices !== undefined && subscription !== undefined) {
303
- const product = await this.host._store?.getProduct({ id, campaign });
304
- return await product?.getOption({ devices, subscription, bundle });
305
- }
306
- return null;
307
- }
308
- async _applyBundles(baseOpt, bundles) {
309
- if (bundles.length === 0) {
310
- return [];
311
- }
312
- const result = [];
313
- const recurse = async (prefix, start) => {
314
- for (let i = start; i < bundles.length; i++) {
315
- const action = bundles[i];
316
- const bundleOption = await this._getOption({
317
- id: action.id,
318
- campaign: action.campaign,
319
- devices: action.devices ?? baseOpt.getDevices(),
320
- subscription: action.subscription ?? baseOpt.getSubscription()
321
- });
322
- if (!bundleOption) {
323
- continue;
324
- }
325
- const next = prefix.concat({
326
- devicesFixed: action.devices !== undefined,
327
- subscriptionFixed: action.subscription !== undefined,
328
- option: bundleOption
329
- });
330
- result.push(next);
331
- await recurse(next, i + 1);
332
- }
333
- };
334
- const bundleOption = async (option, bundlesToApply = []) => {
335
- for (const bundle of bundlesToApply) {
336
- const newOpt = await option.toogleBundle(bundle);
337
- if (newOpt) {
338
- option = newOpt;
339
- }
340
- else {
341
- return null;
342
- }
343
- }
344
- return option;
345
- };
346
- await recurse([], 0);
347
- return Promise.all(result.map(bundlesToApply => bundleOption(baseOpt, bundlesToApply)));
348
- }
349
- }
350
- //# sourceMappingURL=compute-controller.js.map