@repobit/dex-store-elements 1.7.3 → 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.
- package/CHANGELOG.md +5 -913
- package/README.md +9 -7
- package/dist/src/actions/action.adapter.d.ts +36 -0
- package/dist/src/actions/action.adapter.js +183 -0
- package/dist/src/actions/action.adapter.js.map +1 -0
- package/dist/src/actions/action.attributes.d.ts +15 -0
- package/dist/src/actions/action.attributes.js +137 -0
- package/dist/src/actions/action.attributes.js.map +1 -0
- package/dist/src/actions/action.registry.d.ts +4 -0
- package/dist/src/actions/action.registry.js +119 -0
- package/dist/src/actions/action.registry.js.map +1 -0
- package/dist/src/actions/index.d.ts +3 -2
- package/dist/src/actions/index.js +3 -80
- package/dist/src/actions/index.js.map +1 -1
- package/dist/src/compute/compute.expand.d.ts +70 -0
- package/dist/src/compute/compute.expand.js +319 -0
- package/dist/src/compute/compute.expand.js.map +1 -0
- package/dist/src/compute/compute.scan.d.ts +54 -0
- package/dist/src/compute/compute.scan.js +160 -0
- package/dist/src/compute/compute.scan.js.map +1 -0
- package/dist/src/compute/option-resolver.d.ts +31 -0
- package/dist/src/compute/option-resolver.js +147 -0
- package/dist/src/compute/option-resolver.js.map +1 -0
- package/dist/src/contexts/context.compute.d.ts +12 -0
- package/dist/src/contexts/context.compute.js +4 -0
- package/dist/src/contexts/context.compute.js.map +1 -0
- package/dist/src/contexts/context.scope.d.ts +139 -0
- package/dist/src/contexts/context.scope.js +48 -0
- package/dist/src/contexts/context.scope.js.map +1 -0
- package/dist/src/controllers/controller.action-resolve.d.ts +110 -0
- package/dist/src/controllers/controller.action-resolve.js +203 -0
- package/dist/src/controllers/controller.action-resolve.js.map +1 -0
- package/dist/src/controllers/controller.action-topology.d.ts +59 -0
- package/dist/src/controllers/controller.action-topology.js +130 -0
- package/dist/src/controllers/controller.action-topology.js.map +1 -0
- package/dist/src/controllers/controller.compute.d.ts +72 -0
- package/dist/src/controllers/controller.compute.js +110 -0
- package/dist/src/controllers/controller.compute.js.map +1 -0
- package/dist/src/controllers/controller.resolve.d.ts +78 -0
- package/dist/src/controllers/controller.resolve.js +205 -0
- package/dist/src/controllers/controller.resolve.js.map +1 -0
- package/dist/src/core/action-topology.d.ts +62 -0
- package/dist/src/core/action-topology.js +67 -0
- package/dist/src/core/action-topology.js.map +1 -0
- package/dist/src/core/actions.d.ts +64 -0
- package/dist/src/core/actions.js +47 -0
- package/dist/src/core/actions.js.map +1 -0
- package/dist/src/core/node.element.d.ts +179 -0
- package/dist/src/core/node.element.js +573 -0
- package/dist/src/core/node.element.js.map +1 -0
- package/dist/src/core/node.scope.d.ts +374 -0
- package/dist/src/core/node.scope.js +558 -0
- package/dist/src/core/node.scope.js.map +1 -0
- package/dist/src/core/option-update.d.ts +11 -0
- package/dist/src/core/option-update.js +59 -0
- package/dist/src/core/option-update.js.map +1 -0
- package/dist/src/dsl/compilers/array/compiler.js +13 -14
- package/dist/src/dsl/compilers/array/compiler.js.map +1 -1
- package/dist/src/dsl/compilers/boolean/compiler.d.ts +1 -1
- package/dist/src/dsl/compilers/boolean/compiler.js +14 -27
- package/dist/src/dsl/compilers/boolean/compiler.js.map +1 -1
- package/dist/src/dsl/compilers/enum/compiler.js +7 -10
- package/dist/src/dsl/compilers/enum/compiler.js.map +1 -1
- package/dist/src/dsl/compilers/index.d.ts +1 -1
- package/dist/src/dsl/compilers/index.js +5 -5
- package/dist/src/dsl/compilers/index.js.map +1 -1
- package/dist/src/dsl/utilty.d.ts +0 -4
- package/dist/src/dsl/utilty.js +3 -30
- package/dist/src/dsl/utilty.js.map +1 -1
- package/dist/src/eta/batch.d.ts +123 -0
- package/dist/src/eta/batch.js +162 -0
- package/dist/src/eta/batch.js.map +1 -0
- package/dist/src/eta/batcher.d.ts +184 -0
- package/dist/src/eta/batcher.js +335 -0
- package/dist/src/eta/batcher.js.map +1 -0
- package/dist/src/eta/cache.d.ts +36 -0
- package/dist/src/eta/cache.js +56 -0
- package/dist/src/eta/cache.js.map +1 -0
- package/dist/src/eta/controller.d.ts +608 -0
- package/dist/src/eta/controller.js +1036 -0
- package/dist/src/eta/controller.js.map +1 -0
- package/dist/src/eta/factory.d.ts +74 -0
- package/dist/src/eta/factory.js +121 -0
- package/dist/src/eta/factory.js.map +1 -0
- package/dist/src/eta/idle.d.ts +39 -0
- package/dist/src/eta/idle.js +52 -0
- package/dist/src/eta/idle.js.map +1 -0
- package/dist/src/eta/index.d.ts +52 -0
- package/dist/src/eta/index.js +13 -0
- package/dist/src/eta/index.js.map +1 -0
- package/dist/src/eta/observer.d.ts +263 -0
- package/dist/src/eta/observer.js +263 -0
- package/dist/src/eta/observer.js.map +1 -0
- package/dist/src/eta/operations.d.ts +41 -0
- package/dist/src/eta/operations.js +59 -0
- package/dist/src/eta/operations.js.map +1 -0
- package/dist/src/eta/source-registry.d.ts +198 -0
- package/dist/src/eta/source-registry.js +267 -0
- package/dist/src/eta/source-registry.js.map +1 -0
- package/dist/src/eta/template-index.d.ts +285 -0
- package/dist/src/eta/template-index.js +642 -0
- package/dist/src/eta/template-index.js.map +1 -0
- package/dist/src/eta/types.d.ts +529 -0
- package/dist/src/eta/types.js +2 -0
- package/dist/src/eta/types.js.map +1 -0
- package/dist/src/index.d.ts +21 -9
- package/dist/src/index.js +22 -11
- package/dist/src/index.js.map +1 -1
- package/dist/src/nodes/node.context.d.ts +5 -3
- package/dist/src/nodes/node.context.js +48 -3
- package/dist/src/nodes/node.context.js.map +1 -1
- package/dist/src/nodes/node.option.d.ts +11 -31
- package/dist/src/nodes/node.option.js +158 -222
- package/dist/src/nodes/node.option.js.map +1 -1
- package/dist/src/nodes/node.product.d.ts +7 -11
- package/dist/src/nodes/node.product.js +85 -64
- package/dist/src/nodes/node.product.js.map +1 -1
- package/dist/src/renders/attributes/buyLink.d.ts +2 -2
- package/dist/src/renders/attributes/buyLink.js +14 -11
- package/dist/src/renders/attributes/buyLink.js.map +1 -1
- package/dist/src/renders/attributes/devices.d.ts +2 -2
- package/dist/src/renders/attributes/devices.js +9 -19
- package/dist/src/renders/attributes/devices.js.map +1 -1
- package/dist/src/renders/attributes/discount.d.ts +2 -2
- package/dist/src/renders/attributes/discount.js +56 -44
- package/dist/src/renders/attributes/discount.js.map +1 -1
- package/dist/src/renders/attributes/hide.d.ts +2 -2
- package/dist/src/renders/attributes/hide.js +49 -14
- package/dist/src/renders/attributes/hide.js.map +1 -1
- package/dist/src/renders/attributes/index.d.ts +3 -3
- package/dist/src/renders/attributes/index.js +2 -4
- package/dist/src/renders/attributes/index.js.map +1 -1
- package/dist/src/renders/attributes/price.d.ts +2 -2
- package/dist/src/renders/attributes/price.js +30 -44
- package/dist/src/renders/attributes/price.js.map +1 -1
- package/dist/src/renders/attributes/subscription.d.ts +2 -2
- package/dist/src/renders/attributes/subscription.js +14 -20
- package/dist/src/renders/attributes/subscription.js.map +1 -1
- package/dist/src/renders/attributes/utilty.d.ts +2 -0
- package/dist/src/renders/attributes/utilty.js +17 -4
- package/dist/src/renders/attributes/utilty.js.map +1 -1
- package/dist/src/renders/context.d.ts +122 -10
- package/dist/src/renders/context.js +140 -80
- package/dist/src/renders/context.js.map +1 -1
- package/dist/src/renders/format.js +2 -2
- package/dist/src/renders/format.js.map +1 -1
- package/dist/src/renders/index.d.ts +6 -2
- package/dist/src/renders/index.js +67 -29
- package/dist/src/renders/index.js.map +1 -1
- package/dist/src/renders/observe.d.ts +1 -4
- package/dist/src/renders/observe.js +10 -24
- package/dist/src/renders/observe.js.map +1 -1
- package/dist/src/renders/render.wrapper.d.ts +37 -0
- package/dist/src/renders/render.wrapper.js +147 -0
- package/dist/src/renders/render.wrapper.js.map +1 -0
- package/dist/src/templating/eta.js +1 -4
- package/dist/src/templating/eta.js.map +1 -1
- package/package.json +4 -5
- package/dist/src/actions/action.button.d.ts +0 -2
- package/dist/src/actions/action.button.js +0 -8
- package/dist/src/actions/action.button.js.map +0 -1
- package/dist/src/actions/action.input.d.ts +0 -2
- package/dist/src/actions/action.input.js +0 -43
- package/dist/src/actions/action.input.js.map +0 -1
- package/dist/src/actions/action.select.d.ts +0 -2
- package/dist/src/actions/action.select.js +0 -14
- package/dist/src/actions/action.select.js.map +0 -1
- package/dist/src/actions/utilty.d.ts +0 -16
- package/dist/src/actions/utilty.js +0 -149
- package/dist/src/actions/utilty.js.map +0 -1
- package/dist/src/contexts/context.datalayer.d.ts +0 -9
- package/dist/src/contexts/context.datalayer.js +0 -3
- package/dist/src/contexts/context.datalayer.js.map +0 -1
- package/dist/src/contexts/context.derived.d.ts +0 -12
- package/dist/src/contexts/context.derived.js +0 -3
- package/dist/src/contexts/context.derived.js.map +0 -1
- package/dist/src/contexts/context.option.d.ts +0 -5
- package/dist/src/contexts/context.option.js +0 -3
- package/dist/src/contexts/context.option.js.map +0 -1
- package/dist/src/contexts/context.product.d.ts +0 -5
- package/dist/src/contexts/context.product.js +0 -3
- package/dist/src/contexts/context.product.js.map +0 -1
- package/dist/src/contexts/context.state.d.ts +0 -28
- package/dist/src/contexts/context.state.js +0 -3
- package/dist/src/contexts/context.state.js.map +0 -1
- package/dist/src/contexts/context.store.d.ts +0 -5
- package/dist/src/contexts/context.store.js +0 -3
- package/dist/src/contexts/context.store.js.map +0 -1
- package/dist/src/controllers/collect-controller.d.ts +0 -39
- package/dist/src/controllers/collect-controller.js +0 -161
- package/dist/src/controllers/collect-controller.js.map +0 -1
- package/dist/src/controllers/compute-controller.d.ts +0 -55
- package/dist/src/controllers/compute-controller.js +0 -350
- package/dist/src/controllers/compute-controller.js.map +0 -1
- package/dist/src/controllers/eta-renderer/eta-dom-renderer.d.ts +0 -25
- package/dist/src/controllers/eta-renderer/eta-dom-renderer.js +0 -192
- package/dist/src/controllers/eta-renderer/eta-dom-renderer.js.map +0 -1
- package/dist/src/controllers/eta-renderer/eta-mutation-observer.d.ts +0 -28
- package/dist/src/controllers/eta-renderer/eta-mutation-observer.js +0 -206
- package/dist/src/controllers/eta-renderer/eta-mutation-observer.js.map +0 -1
- package/dist/src/controllers/eta-renderer/eta-renderer.d.ts +0 -21
- package/dist/src/controllers/eta-renderer/eta-renderer.js +0 -77
- package/dist/src/controllers/eta-renderer/eta-renderer.js.map +0 -1
- package/dist/src/controllers/eta-renderer/eta-template-cache.d.ts +0 -24
- package/dist/src/controllers/eta-renderer/eta-template-cache.js +0 -61
- package/dist/src/controllers/eta-renderer/eta-template-cache.js.map +0 -1
- package/dist/src/controllers/eta-renderer/eta-types.d.ts +0 -11
- package/dist/src/controllers/eta-renderer/eta-types.js +0 -1
- package/dist/src/controllers/eta-renderer/eta-types.js.map +0 -1
- package/dist/src/controllers/eta-renderer/index.d.ts +0 -2
- package/dist/src/controllers/eta-renderer/index.js +0 -2
- package/dist/src/controllers/eta-renderer/index.js.map +0 -1
- package/dist/src/controllers/event-pipeline-controller.d.ts +0 -28
- package/dist/src/controllers/event-pipeline-controller.js +0 -72
- package/dist/src/controllers/event-pipeline-controller.js.map +0 -1
- package/dist/src/events/events.d.ts +0 -75
- package/dist/src/events/events.js +0 -78
- package/dist/src/events/events.js.map +0 -1
- package/dist/src/nodes/node.root.d.ts +0 -16
- package/dist/src/nodes/node.root.js +0 -49
- package/dist/src/nodes/node.root.js.map +0 -1
- package/dist/src/nodes/node.state.d.ts +0 -88
- package/dist/src/nodes/node.state.js +0 -330
- package/dist/src/nodes/node.state.js.map +0 -1
- package/dist/src/renders/utility.d.ts +0 -32
- package/dist/src/renders/utility.js +0 -191
- 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":";;;;;;AAAA,OAAO,EAAE,cAAc,EAAsB,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,YAAY,EAAoB,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAoB,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAgC,kBAAkB,EAAmC,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrJ,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAM7C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG;QAC7B,IAAI,OAAO,EAAE,MAAM,CAAC;QACpB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC1C,OAAO,GAAG,GAAG,CAAC;YACd,MAAM,GAAG,GAAG,CAAC;QACf,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAwC,CAAC;IAC5E,CAAC,CAAA;AACH,CAAC;AAED,MAAM,OAAO,SAAU,SAAQ,UAAU;IAAzC;;QAEE,gBAAW,GAAG,IAAI,CAAC;QAEnB,cAAS,GAAG,KAAK,CAAC;QAIlB,cAAS,GAAoB,MAAM,CAAC,UAAU,CAAC,CAAC;QAEhD,iEAAiE;QACjE,2DAA2D;QAC3D,2DAA2D;QAE3D,qBAAgB,GAAG,EAAE,CAAC;QAEtB,wBAAmB,GAAG,GAAG,CAAC;QAE1B,mEAAmE;QACnE,sEAAsE;QAEtE,uBAAkB,GAAG,KAAK,CAAC;QAE3B;;;WAGG;QACH,aAAQ,GAAY,IAAI,GAAG,EAAE,CAAC;QAE9B;;WAEG;QACH,aAAQ,GAAY,IAAI,GAAG,EAAE,CAAC;QAE9B;;;WAGG;QACH,kBAAa,GAAgB,IAAI,GAAG,EAAE,CAAC;QAEvC;;WAEG;QACH,oBAAe,GAAY,IAAI,GAAG,EAAE,CAAC;QAErC;;WAEG;QACH,0BAAqB,GAAY,IAAI,GAAG,EAAE,CAAC;QA4B3C;;WAEG;QAGH,UAAK,GAAqB;YACxB,KAAK,EAAE;gBACL,GAAG,EAAE;oBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;oBAC9B,GAAG,EAAI,EAAE;iBACV;gBACD,GAAG,EAAE;oBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;oBAC9B,GAAG,EAAI,EAAE;iBACV;gBACD,OAAO,EAAE;oBACP,GAAG,EAAE;wBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;wBAC9B,GAAG,EAAI,EAAE;qBACV;oBACD,GAAG,EAAE;wBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;wBAC9B,GAAG,EAAI,EAAE;qBACV;iBACF;aACF;YACD,eAAe,EAAE;gBACf,GAAG,EAAE;oBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;oBAC9B,GAAG,EAAI,EAAE;iBACV;gBACD,GAAG,EAAE;oBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;oBAC9B,GAAG,EAAI,EAAE;iBACV;gBACD,OAAO,EAAE;oBACP,GAAG,EAAE;wBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;wBAC9B,GAAG,EAAI,EAAE;qBACV;oBACD,GAAG,EAAE;wBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;wBAC9B,GAAG,EAAI,EAAE;qBACV;iBACF;aACF;YACD,QAAQ,EAAE;gBACR,GAAG,EAAE;oBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;oBAC9B,GAAG,EAAI,EAAE;iBACV;gBACD,GAAG,EAAE;oBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;oBAC9B,GAAG,EAAI,EAAE;iBACV;gBACD,OAAO,EAAE;oBACP,GAAG,EAAE;wBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;wBAC9B,GAAG,EAAI,EAAE;qBACV;oBACD,GAAG,EAAE;wBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;wBAC9B,GAAG,EAAI,EAAE;qBACV;iBACF;gBACD,UAAU,EAAE;oBACV,GAAG,EAAE;wBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;wBAC9B,GAAG,EAAI,EAAE;qBACV;oBACD,GAAG,EAAE;wBACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;wBAC9B,GAAG,EAAI,EAAE;qBACV;oBACD,OAAO,EAAE;wBACP,GAAG,EAAE;4BACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;4BAC9B,GAAG,EAAI,EAAE;yBACV;wBACD,GAAG,EAAE;4BACH,KAAK,EAAE,MAAM,CAAC,gBAAgB;4BAC9B,GAAG,EAAI,EAAE;yBACV;qBACF;iBACF;aACF;SACF,CAAC;QAUM,aAAQ,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,YAAO,GAAG,IAAI,uBAAuB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACtG,aAAQ,GAAG,IAAI,iBAAiB,CACtC,IAAI,EACJ,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAC3B,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EACzB,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAC3B,CAAC;QACM,SAAI,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAsJ/C,CAAC;IAtKC;;;OAGG;IACH,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7B,CAAC;IAYD,sDAAsD;IACtD,uBAAuB,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;IAEnD,8DAA8D;IAC9D,yBAAyB;QACvB,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACxC,CAAC;IAED,UAAU;QACR,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,kBAAkB,CAAC,EAAW;QAC5B,IAAI,EAAE,YAAY,SAAS;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;QACrB,OAAO,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,YAAY,CAAC;IAC3F,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;IACvG,CAAC;IAED,MAAM;QACJ,0EAA0E;QAC1E,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,CAChB,IAAI,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAChE,CAAC;QACF,KAAK,CAAC,MAAM,EAAE,CAAC;IACjB,CAAC;IAED,oBAAoB;QAClB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;QACxG,KAAK,CAAC,oBAAoB,EAAE,CAAC;IAC/B,CAAC;IAES,YAAY,CAAC,CAAY;QACjC,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,uCAAuC;QACvC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrB,CAAC;IAES,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;QACrC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAES,mBAAmB,CAAC,CAAa;QACzC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxB,CAAC;IAES,oBAAoB,CAAC,CAAa;QAC1C,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS;YAC7B,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;gBAC/B,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAiB;QAC5C,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IAES,aAAa;QACrB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,aAAa,CAChB,IAAI,kBAAkB,CAAC;YACrB,IAAI,EAAK,IAAI,CAAC,SAAS;YACvB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAwC;SAChE,CAAC,CACH,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,iBAAiB;QAC/B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,iBAAiB,EAAE,CAAA;QAC9C,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QACnC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QAChC,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QACnC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAC7B,gEAAgE;QAChE,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,6BAA6B,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;IAES,6BAA6B,CAAC,GAAc;QACpD,OAAO,GAAG,YAAY,WAAW;eAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;eACxD,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAES,cAAc,CAAC,GAAc;QACrC,OAAO,GAAG,YAAY,WAAW;eAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;eACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAES,eAAe,CAAC,GAAc;QACtC,OAAO,GAAG,YAAY,WAAW;eAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;eACvB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAES,aAAa,CAAC,GAAc;QACpC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC;IAC9E,CAAC;IAES,aAAa,CAAC,GAAc;QACpC,OAAO,GAAG,YAAY,kBAAkB,CAAA;IAC1C,CAAC;IAES,gBAAgB,CAAC,CAAY;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;QACnC,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC;IAEO,aAAa;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;QAC9B,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,GAAG,CACZ,GAAG;aACA,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAClB,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA,eAAe,CAAC;IAC7B,CAAC;CACF;AAxUC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;8CACT;AAEnB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;4CACnC;AAElB;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;+CACnB;AAEtB;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;4CACU;AAMhD;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDACtC;AAEtB;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDACtC;AAK1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC;qDACpC;AAkC3B;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAG,CAAC;IACpD,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;yCACL;AAM1B;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;+CACN;AAKzB;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrD,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;2CACM;AAIrC;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;yCACZ;AAInB;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;4CACT;AAOtB;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;wCAkF7B","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
|