@expressive/mvc 0.71.0 → 0.73.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.
@@ -0,0 +1,62 @@
1
+ import { State } from "./state.js";
2
+
3
+ //#region src/context.d.ts
4
+ declare namespace Context {
5
+ type Multiple<T extends State> = {
6
+ [key: string | number]: State.Type<T> | T;
7
+ };
8
+ type Accept<T extends State = State> = T | State.Type<T> | Multiple<T>;
9
+ type Expect<T extends State = State> = (state: T) => (() => void) | void;
10
+ }
11
+ interface Context {
12
+ [key: symbol]: State | Context.Expect | null | undefined;
13
+ }
14
+ declare class Context {
15
+ /**
16
+ * Get the context for a specified State. If a callback is provided, it will be run when
17
+ * the context becomes available.
18
+ */
19
+ static get<T extends State>(on: State, callback: (got: Context) => void): void;
20
+ /**
21
+ * Get the context for a specified State. Returns undefined if none are found.
22
+ */
23
+ static get<T extends State>(on: State): Context | undefined;
24
+ id: string;
25
+ protected inputs: Record<string | number, State | State.Extends>;
26
+ protected cleanup: Set<() => void>;
27
+ constructor(inputs?: Context.Accept);
28
+ /** Find specified type registered to a parent context. Throws if none are found. */
29
+ get<T extends State>(Type: State.Extends<T>, require: true): T;
30
+ /** Find specified type registered to a parent context. Returns undefined if none are found. */
31
+ get<T extends State>(Type: State.Extends<T>, require?: boolean): T | undefined;
32
+ /** Run callback when a specified type is registered in context downstream. */
33
+ get<T extends State>(Type: State.Extends<T>, callback: (state: T) => void): () => void;
34
+ /**
35
+ * Adds a State to this context.
36
+ */
37
+ protected add<T extends State>(input: T | State.Type<T>, implicit?: boolean): T;
38
+ /**
39
+ * Register one or more States to this context.
40
+ *
41
+ * Context will add or remove States as needed to keep with provided input.
42
+ *
43
+ * @param inputs State, State class, or map of States / State classes to register.
44
+ * @param forEach Optional callback to run for each State registered.
45
+ */
46
+ use<T extends State>(inputs: Context.Accept<T>, forEach?: Context.Expect<T>): void;
47
+ /**
48
+ * Create a child context, optionally registering one or more States to it.
49
+ *
50
+ * @param inputs State, State class, or map of States / State classes to register.
51
+ */
52
+ push(inputs?: Context.Accept): this;
53
+ /**
54
+ * Remove all States from this context.
55
+ *
56
+ * Will also run any cleanup callbacks registered when States were added.
57
+ */
58
+ pop(): void;
59
+ }
60
+ //#endregion
61
+ export { Context };
62
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5kLnRzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0LmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuL3N0YXRlJztcbmRlY2xhcmUgbmFtZXNwYWNlIENvbnRleHQge1xuICAgIHR5cGUgTXVsdGlwbGU8VCBleHRlbmRzIFN0YXRlPiA9IHtcbiAgICAgICAgW2tleTogc3RyaW5nIHwgbnVtYmVyXTogU3RhdGUuVHlwZTxUPiB8IFQ7XG4gICAgfTtcbiAgICB0eXBlIEFjY2VwdDxUIGV4dGVuZHMgU3RhdGUgPSBTdGF0ZT4gPSBUIHwgU3RhdGUuVHlwZTxUPiB8IE11bHRpcGxlPFQ+O1xuICAgIHR5cGUgRXhwZWN0PFQgZXh0ZW5kcyBTdGF0ZSA9IFN0YXRlPiA9IChzdGF0ZTogVCkgPT4gKCgpID0+IHZvaWQpIHwgdm9pZDtcbn1cbmludGVyZmFjZSBDb250ZXh0IHtcbiAgICBba2V5OiBzeW1ib2xdOiBTdGF0ZSB8IENvbnRleHQuRXhwZWN0IHwgbnVsbCB8IHVuZGVmaW5lZDtcbn1cbmRlY2xhcmUgY2xhc3MgQ29udGV4dCB7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb250ZXh0IGZvciBhIHNwZWNpZmllZCBTdGF0ZS4gSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBydW4gd2hlblxuICAgICAqIHRoZSBjb250ZXh0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQ8VCBleHRlbmRzIFN0YXRlPihvbjogU3RhdGUsIGNhbGxiYWNrOiAoZ290OiBDb250ZXh0KSA9PiB2b2lkKTogdm9pZDtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNvbnRleHQgZm9yIGEgc3BlY2lmaWVkIFN0YXRlLiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub25lIGFyZSBmb3VuZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBTdGF0ZT4ob246IFN0YXRlKTogQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgICBpZDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBpbnB1dHM6IFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIFN0YXRlIHwgU3RhdGUuRXh0ZW5kcz47XG4gICAgcHJvdGVjdGVkIGNsZWFudXA6IFNldDwoKSA9PiB2b2lkPjtcbiAgICBjb25zdHJ1Y3RvcihpbnB1dHM/OiBDb250ZXh0LkFjY2VwdCk7XG4gICAgLyoqIEZpbmQgc3BlY2lmaWVkIHR5cGUgcmVnaXN0ZXJlZCB0byBhIHBhcmVudCBjb250ZXh0LiBUaHJvd3MgaWYgbm9uZSBhcmUgZm91bmQuICovXG4gICAgZ2V0PFQgZXh0ZW5kcyBTdGF0ZT4oVHlwZTogU3RhdGUuRXh0ZW5kczxUPiwgcmVxdWlyZTogdHJ1ZSk6IFQ7XG4gICAgLyoqIEZpbmQgc3BlY2lmaWVkIHR5cGUgcmVnaXN0ZXJlZCB0byBhIHBhcmVudCBjb250ZXh0LiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub25lIGFyZSBmb3VuZC4gKi9cbiAgICBnZXQ8VCBleHRlbmRzIFN0YXRlPihUeXBlOiBTdGF0ZS5FeHRlbmRzPFQ+LCByZXF1aXJlPzogYm9vbGVhbik6IFQgfCB1bmRlZmluZWQ7XG4gICAgLyoqIFJ1biBjYWxsYmFjayB3aGVuIGEgc3BlY2lmaWVkIHR5cGUgaXMgcmVnaXN0ZXJlZCBpbiBjb250ZXh0IGRvd25zdHJlYW0uICovXG4gICAgZ2V0PFQgZXh0ZW5kcyBTdGF0ZT4oVHlwZTogU3RhdGUuRXh0ZW5kczxUPiwgY2FsbGJhY2s6IChzdGF0ZTogVCkgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQWRkcyBhIFN0YXRlIHRvIHRoaXMgY29udGV4dC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkPFQgZXh0ZW5kcyBTdGF0ZT4oaW5wdXQ6IFQgfCBTdGF0ZS5UeXBlPFQ+LCBpbXBsaWNpdD86IGJvb2xlYW4pOiBUO1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIG9uZSBvciBtb3JlIFN0YXRlcyB0byB0aGlzIGNvbnRleHQuXG4gICAgICpcbiAgICAgKiBDb250ZXh0IHdpbGwgYWRkIG9yIHJlbW92ZSBTdGF0ZXMgYXMgbmVlZGVkIHRvIGtlZXAgd2l0aCBwcm92aWRlZCBpbnB1dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbnB1dHMgU3RhdGUsIFN0YXRlIGNsYXNzLCBvciBtYXAgb2YgU3RhdGVzIC8gU3RhdGUgY2xhc3NlcyB0byByZWdpc3Rlci5cbiAgICAgKiBAcGFyYW0gZm9yRWFjaCBPcHRpb25hbCBjYWxsYmFjayB0byBydW4gZm9yIGVhY2ggU3RhdGUgcmVnaXN0ZXJlZC5cbiAgICAgKi9cbiAgICB1c2U8VCBleHRlbmRzIFN0YXRlPihpbnB1dHM6IENvbnRleHQuQWNjZXB0PFQ+LCBmb3JFYWNoPzogQ29udGV4dC5FeHBlY3Q8VD4pOiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNoaWxkIGNvbnRleHQsIG9wdGlvbmFsbHkgcmVnaXN0ZXJpbmcgb25lIG9yIG1vcmUgU3RhdGVzIHRvIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGlucHV0cyBTdGF0ZSwgU3RhdGUgY2xhc3MsIG9yIG1hcCBvZiBTdGF0ZXMgLyBTdGF0ZSBjbGFzc2VzIHRvIHJlZ2lzdGVyLlxuICAgICAqL1xuICAgIHB1c2goaW5wdXRzPzogQ29udGV4dC5BY2NlcHQpOiB0aGlzO1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgU3RhdGVzIGZyb20gdGhpcyBjb250ZXh0LlxuICAgICAqXG4gICAgICogV2lsbCBhbHNvIHJ1biBhbnkgY2xlYW51cCBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aGVuIFN0YXRlcyB3ZXJlIGFkZGVkLlxuICAgICAqL1xuICAgIHBvcCgpOiB2b2lkO1xufVxuZXhwb3J0IHsgQ29udGV4dCB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFDQSxJQUFBLFVBQVE7Q0FBQTtFQUFVLE1BQUE7RUFBQTtFQUFRO0VBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQzFCLElBQUksVUFBSztDQUFBO09BQVcsQ0FBQSxPQUFRLFFBQVMsT0FBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ3JDLElBQUksVUFBVTtDQUFBO0VBQUEsTUFBUztFQUFBO0VBQVE7RUFBTztFQUFTO0VBQUU7RUFBQTtFQUFBO0VBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQSxRQUFBO0VBQUE7RUFBQTtFQUFBLE1BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBLFFBQUE7RUFBQTtFQUFBLFFBQUE7RUFBQSxRQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBIn0=
@@ -1,149 +1,158 @@
1
- import { addListener } from "./control";
2
- import { event, Model, PARENT, uid } from "./model";
1
+ import { addListener, event } from "./observable.js";
2
+ import { PARENT, State, uid } from "./state.js";
3
+
4
+ //#region src/context.ts
3
5
  const LOOKUP = /* @__PURE__ */ new WeakMap();
4
6
  const KEYS = /* @__PURE__ */ new Map();
5
7
  function key(T, upstream) {
6
- let K = KEYS.get(T);
7
- if (!K)
8
- KEYS.set(T, K = Symbol(
9
- typeof T == "symbol" ? "get " + T.description : String(T)
10
- ));
11
- return upstream ? key(K) : K;
8
+ let K = KEYS.get(T);
9
+ if (!K) {
10
+ K = Symbol(typeof T == "symbol" ? "get " + T.description : String(T));
11
+ KEYS.set(T, K);
12
+ }
13
+ return upstream ? key(K) : K;
12
14
  }
13
15
  function keys(from, upstream) {
14
- const keys2 = /* @__PURE__ */ new Set();
15
- do {
16
- keys2.add(key(from, upstream));
17
- } while ((from = Object.getPrototypeOf(from)) !== Model);
18
- return keys2;
16
+ const keys = /* @__PURE__ */ new Set();
17
+ do {
18
+ keys.add(key(from, upstream));
19
+ from = Object.getPrototypeOf(from);
20
+ } while (from !== State);
21
+ return keys;
19
22
  }
20
- class Context {
21
- constructor(inputs) {
22
- this.layer = /* @__PURE__ */ new Map();
23
- this.cleanup = /* @__PURE__ */ new Set();
24
- if (inputs)
25
- this.include(inputs);
26
- }
27
- static get({ is }, callback) {
28
- const waiting = LOOKUP.get(is);
29
- if (waiting instanceof Context) {
30
- if (callback)
31
- callback(waiting);
32
- return waiting;
33
- }
34
- if (callback)
35
- if (waiting)
36
- waiting.push(callback);
37
- else
38
- LOOKUP.set(is, [callback]);
39
- }
40
- /** Run callback when a specified type is registered to a **child** context. */
41
- has(Type, callback) {
42
- Object.defineProperty(this, key(Type, true), { value: callback, configurable: true });
43
- }
44
- get(Type, require2) {
45
- const result = this[key(Type)];
46
- if (result === null)
47
- throw new Error(`Did find ${Type} in context, but multiple were defined.`);
48
- if (result)
49
- return result;
50
- if (require2)
51
- throw new Error(`Could not find ${Type} in context.`);
52
- }
53
- push(inputs) {
54
- const next = Object.create(this);
55
- this.cleanup = /* @__PURE__ */ new Set([() => next.pop(), ...this.cleanup]);
56
- next.layer = /* @__PURE__ */ new Map();
57
- next.cleanup = /* @__PURE__ */ new Set();
58
- if (inputs)
59
- next.include(inputs);
60
- return next;
61
- }
62
- pop() {
63
- for (const key2 of Object.getOwnPropertySymbols(this))
64
- delete this[key2];
65
- this.cleanup.forEach((cb) => cb());
66
- this.cleanup.clear();
67
- this.layer.clear();
68
- }
69
- include(inputs, forEach) {
70
- const init = /* @__PURE__ */ new Map();
71
- if (typeof inputs == "function" || inputs instanceof Model)
72
- inputs = { [forEach ? 0 : this.layer.size]: inputs };
73
- for (const [K, V] of Object.entries(inputs)) {
74
- if (Model.is(V) || V instanceof Model) {
75
- const exists = this.layer.get(K);
76
- if (!exists) {
77
- const instance = this.add(V);
78
- this.layer.set(K, V);
79
- init.set(instance, true);
80
- } else if (exists !== V) {
81
- this.pop();
82
- this.id = uid();
83
- this.include(inputs);
84
- }
85
- continue;
86
- }
87
- throw new Error(
88
- `Context may only include instance or class \`extends Model\` but got ${K == "0" || K == String(V) ? V : `${V} (as '${K}')`}.`
89
- );
90
- }
91
- for (const [model, explicit] of init) {
92
- model.set();
93
- if (explicit && forEach)
94
- forEach(model);
95
- for (const [_key, value] of model)
96
- if (PARENT.get(value) === model) {
97
- this.add(value, true);
98
- init.set(value, false);
99
- }
100
- }
101
- }
102
- add(input, implicit) {
103
- const cleanup = /* @__PURE__ */ new Set();
104
- let T;
105
- let I;
106
- if (typeof input == "function") {
107
- T = input;
108
- I = new input();
109
- } else {
110
- T = input.constructor;
111
- I = input;
112
- }
113
- keys(T, true).forEach((K) => {
114
- const expects = this[K];
115
- if (!expects)
116
- return;
117
- addListener(I, (event2) => {
118
- if (event2 === true) {
119
- const callback = expects(I);
120
- if (callback)
121
- cleanup.add(callback);
122
- }
123
- return null;
124
- });
125
- });
126
- keys(T).forEach((K) => {
127
- const value = this.hasOwnProperty(K) ? null : I;
128
- if (value || this[K] !== I && !implicit)
129
- Object.defineProperty(this, K, {
130
- configurable: true,
131
- value
132
- });
133
- });
134
- this.cleanup.add(() => {
135
- cleanup.forEach((cb) => cb());
136
- if (I !== input)
137
- event(I, null);
138
- });
139
- const waiting = LOOKUP.get(I);
140
- if (waiting instanceof Array)
141
- waiting.forEach((cb) => cb(this));
142
- LOOKUP.set(I, this);
143
- return I;
144
- }
145
- }
146
- export {
147
- Context
23
+ var Context = class Context {
24
+ static get({ is }, callback) {
25
+ const context = LOOKUP.get(is);
26
+ if (context instanceof Context) {
27
+ if (callback) callback(context);
28
+ return context;
29
+ }
30
+ if (callback) if (context) context.push(callback);
31
+ else LOOKUP.set(is, [callback]);
32
+ }
33
+ constructor(inputs) {
34
+ this.id = uid();
35
+ this.inputs = {};
36
+ this.cleanup = /* @__PURE__ */ new Set();
37
+ if (inputs) this.use(inputs);
38
+ }
39
+ get(Type, arg2) {
40
+ if (typeof arg2 == "function") {
41
+ const k = key(Type, true);
42
+ Object.defineProperty(this, k, {
43
+ value: arg2,
44
+ configurable: true
45
+ });
46
+ return () => {
47
+ delete this[k];
48
+ };
49
+ }
50
+ const result = this[key(Type)];
51
+ if (result === null) throw new Error(`Did find ${Type} in context, but multiple were defined.`);
52
+ if (result) return result;
53
+ if (arg2) throw new Error(`Could not find ${Type} in context.`);
54
+ }
55
+ /**
56
+ * Adds a State to this context.
57
+ */
58
+ add(input, implicit) {
59
+ const cleanup = /* @__PURE__ */ new Set();
60
+ let T;
61
+ let I;
62
+ if (typeof input == "function") {
63
+ T = input;
64
+ I = new input();
65
+ } else {
66
+ T = input.constructor;
67
+ I = input;
68
+ }
69
+ keys(T, true).forEach((K) => {
70
+ const expects = this[K];
71
+ if (expects) addListener(I, (event) => {
72
+ if (event === true) {
73
+ const cb = expects(I);
74
+ if (cb) cleanup.add(cb);
75
+ }
76
+ return null;
77
+ });
78
+ });
79
+ keys(T).forEach((K) => {
80
+ const value = this.hasOwnProperty(K) ? null : I;
81
+ if (value || this[K] !== I && !implicit) Object.defineProperty(this, K, {
82
+ configurable: true,
83
+ value
84
+ });
85
+ });
86
+ this.cleanup.add(() => {
87
+ cleanup.forEach((cb) => cb());
88
+ if (I !== input) event(I, null);
89
+ });
90
+ const waiting = LOOKUP.get(I);
91
+ if (waiting instanceof Array) waiting.forEach((cb) => cb(this));
92
+ LOOKUP.set(I, this);
93
+ return I;
94
+ }
95
+ /**
96
+ * Register one or more States to this context.
97
+ *
98
+ * Context will add or remove States as needed to keep with provided input.
99
+ *
100
+ * @param inputs State, State class, or map of States / State classes to register.
101
+ * @param forEach Optional callback to run for each State registered.
102
+ */
103
+ use(inputs, forEach) {
104
+ const init = /* @__PURE__ */ new Map();
105
+ if (typeof inputs == "function" || inputs instanceof State) inputs = { [0]: inputs };
106
+ for (const [K, V] of Object.entries(inputs)) {
107
+ if (!(State.is(V) || V instanceof State)) throw new Error(`Context may only include instance or class \`extends State\` but got ${K == "0" || K == String(V) ? V : `${V} (as '${K}')`}.`);
108
+ const exists = this.inputs[K];
109
+ if (!exists) init.set(this.add(V), true);
110
+ else if (exists !== V) {
111
+ this.pop();
112
+ this.use(inputs);
113
+ this.id = uid();
114
+ return;
115
+ }
116
+ }
117
+ for (const [state, explicit] of init) {
118
+ state.set();
119
+ if (explicit && forEach) forEach(state);
120
+ for (const [_key, value] of state) if (PARENT.get(value) === state) {
121
+ this.add(value, true);
122
+ init.set(value, false);
123
+ }
124
+ }
125
+ this.inputs = inputs;
126
+ }
127
+ /**
128
+ * Create a child context, optionally registering one or more States to it.
129
+ *
130
+ * @param inputs State, State class, or map of States / State classes to register.
131
+ */
132
+ push(inputs) {
133
+ const next = Object.create(this);
134
+ this.cleanup = new Set([() => next.pop(), ...this.cleanup]);
135
+ next.inputs = {};
136
+ next.cleanup = /* @__PURE__ */ new Set();
137
+ if (inputs) next.use(inputs);
138
+ return next;
139
+ }
140
+ /**
141
+ * Remove all States from this context.
142
+ *
143
+ * Will also run any cleanup callbacks registered when States were added.
144
+ */
145
+ pop() {
146
+ for (const key of Object.getOwnPropertySymbols(this)) delete this[key];
147
+ this.cleanup.forEach((cb) => cb());
148
+ this.cleanup.clear();
149
+ this.inputs = {};
150
+ }
148
151
  };
149
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnRleHQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGFkZExpc3RlbmVyIH0gZnJvbSAnLi9jb250cm9sJztcbmltcG9ydCB7IGV2ZW50LCBNb2RlbCwgUEFSRU5ULCB1aWQgfSBmcm9tICcuL21vZGVsJztcblxuY29uc3QgTE9PS1VQID0gbmV3IFdlYWtNYXA8TW9kZWwsIENvbnRleHQgfCAoKGdvdDogQ29udGV4dCkgPT4gdm9pZClbXT4oKTtcbmNvbnN0IEtFWVMgPSBuZXcgTWFwPHN5bWJvbCB8IE1vZGVsLlR5cGUsIHN5bWJvbD4oKTtcblxuZnVuY3Rpb24ga2V5KFQ6IE1vZGVsLlR5cGUgfCBzeW1ib2wsIHVwc3RyZWFtPzogYm9vbGVhbik6IHN5bWJvbCB7XG4gIGxldCBLID0gS0VZUy5nZXQoVCk7XG5cbiAgaWYoIUspXG4gICAgS0VZUy5zZXQoVCwgSyA9IFN5bWJvbChcbiAgICAgIHR5cGVvZiBUID09IFwic3ltYm9sXCIgPyBcImdldCBcIiArIFQuZGVzY3JpcHRpb24gOiBTdHJpbmcoVClcbiAgICApKTtcbiAgXG4gIHJldHVybiB1cHN0cmVhbSA/IGtleShLKSA6IEs7XG59XG5cbmZ1bmN0aW9uIGtleXMoZnJvbTogTW9kZWwuVHlwZSwgdXBzdHJlYW0/OiBib29sZWFuKXtcbiAgY29uc3Qga2V5cyA9IG5ldyBTZXQ8c3ltYm9sPigpO1xuXG4gIGRvIHtcbiAgICBrZXlzLmFkZChrZXkoZnJvbSwgdXBzdHJlYW0pKTtcbiAgfVxuICB3aGlsZSgoZnJvbSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihmcm9tKSkgIT09IE1vZGVsKTtcblxuICByZXR1cm4ga2V5cztcbn1cblxuZGVjbGFyZSBuYW1lc3BhY2UgQ29udGV4dCB7XG4gIHR5cGUgTXVsdGlwbGU8VCBleHRlbmRzIE1vZGVsPiA9IHtcbiAgICBba2V5OiBzdHJpbmcgfCBudW1iZXJdOiBNb2RlbC5Jbml0PFQ+IHwgVDtcbiAgfTtcblxuICB0eXBlIEFjY2VwdDxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPSBUIHwgTW9kZWwuSW5pdDxUPiB8IE11bHRpcGxlPFQ+O1xuXG4gIHR5cGUgRXhwZWN0PFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9IChtb2RlbDogVCkgPT4gKCgpID0+IHZvaWQpIHwgdm9pZDtcbn1cblxuaW50ZXJmYWNlIENvbnRleHQge1xuICBba2V5OiBzeW1ib2xdOiBNb2RlbCB8IENvbnRleHQuRXhwZWN0IHwgbnVsbCB8IHVuZGVmaW5lZDtcbn1cblxuY2xhc3MgQ29udGV4dCB7XG4gIHN0YXRpYyBnZXQ8VCBleHRlbmRzIE1vZGVsPihvbjogTW9kZWwsIGNhbGxiYWNrOiAoKGdvdDogQ29udGV4dCkgPT4gdm9pZCkpOiB2b2lkO1xuICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBNb2RlbD4ob246IE1vZGVsKTogQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgc3RhdGljIGdldCh7IGlzIH06IE1vZGVsLCBjYWxsYmFjaz86IChnb3Q6IENvbnRleHQpID0+IHZvaWQpe1xuICAgIGNvbnN0IHdhaXRpbmcgPSBMT09LVVAuZ2V0KGlzKTtcblxuICAgIGlmKHdhaXRpbmcgaW5zdGFuY2VvZiBDb250ZXh0KXtcbiAgICAgIGlmKGNhbGxiYWNrKVxuICAgICAgICBjYWxsYmFjayh3YWl0aW5nKTtcblxuICAgICAgcmV0dXJuIHdhaXRpbmc7XG4gICAgfVxuXG4gICAgaWYoY2FsbGJhY2spXG4gICAgICBpZih3YWl0aW5nKSBcbiAgICAgICAgd2FpdGluZy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgXG4gICAgICAgIExPT0tVUC5zZXQoaXMsIFtjYWxsYmFja10pO1xuICB9XG5cbiAgcHVibGljIGlkITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBsYXllciA9IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBNb2RlbCB8IE1vZGVsLlR5cGU+KCk7XG4gIHByb3RlY3RlZCBjbGVhbnVwID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0cz86IENvbnRleHQuQWNjZXB0KXtcbiAgICBpZihpbnB1dHMpXG4gICAgICB0aGlzLmluY2x1ZGUoaW5wdXRzKTtcbiAgfVxuXG4gIC8qKiBSdW4gY2FsbGJhY2sgd2hlbiBhIHNwZWNpZmllZCB0eXBlIGlzIHJlZ2lzdGVyZWQgdG8gYSAqKmNoaWxkKiogY29udGV4dC4gKi9cbiAgcHVibGljIGhhczxUIGV4dGVuZHMgTW9kZWw+KFR5cGU6IE1vZGVsLlR5cGU8VD4sIGNhbGxiYWNrOiAobW9kZWw6IFQpID0+IHZvaWQpe1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXkoVHlwZSwgdHJ1ZSksIHsgdmFsdWU6IGNhbGxiYWNrLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cblxuICAvKiogRmluZCBzcGVjaWZpZWQgdHlwZSByZWdpc3RlcmVkIHRvIGEgcGFyZW50IGNvbnRleHQuIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vbmUgYXJlIGZvdW5kLiAqL1xuICBwdWJsaWMgZ2V0PFQgZXh0ZW5kcyBNb2RlbD4oVHlwZTogTW9kZWwuVHlwZTxUPiwgcmVxdWlyZTogdHJ1ZSk6IFQ7XG4gIHB1YmxpYyBnZXQ8VCBleHRlbmRzIE1vZGVsPihUeXBlOiBNb2RlbC5UeXBlPFQ+LCByZXF1aXJlPzogYm9vbGVhbik6IFQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBnZXQ8VCBleHRlbmRzIE1vZGVsPihUeXBlOiBNb2RlbC5UeXBlPFQ+LCByZXF1aXJlPzogYm9vbGVhbil7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpc1trZXkoVHlwZSldO1xuXG4gICAgaWYocmVzdWx0ID09PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgZmluZCAke1R5cGV9IGluIGNvbnRleHQsIGJ1dCBtdWx0aXBsZSB3ZXJlIGRlZmluZWQuYCk7XG5cbiAgICBpZihyZXN1bHQpXG4gICAgICByZXR1cm4gcmVzdWx0IGFzIFQ7XG5cbiAgICBpZihyZXF1aXJlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCAke1R5cGV9IGluIGNvbnRleHQuYCk7XG4gIH1cblxuICBwdWJsaWMgcHVzaChpbnB1dHM/OiBDb250ZXh0LkFjY2VwdCl7XG4gICAgY29uc3QgbmV4dCA9IE9iamVjdC5jcmVhdGUodGhpcykgYXMgdGhpcztcblxuICAgIHRoaXMuY2xlYW51cCA9IG5ldyBTZXQoWygpID0+IG5leHQucG9wKCksIC4uLnRoaXMuY2xlYW51cF0pO1xuXG4gICAgbmV4dC5sYXllciA9IG5ldyBNYXAoKTtcbiAgICBuZXh0LmNsZWFudXAgPSBuZXcgU2V0KCk7XG5cbiAgICBpZihpbnB1dHMpXG4gICAgICBuZXh0LmluY2x1ZGUoaW5wdXRzKTtcblxuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgcHVibGljIHBvcCgpe1xuICAgIGZvcihjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0aGlzKSlcbiAgICAgIGRlbGV0ZSAodGhpcyBhcyBhbnkpW2tleV07XG5cbiAgICB0aGlzLmNsZWFudXAuZm9yRWFjaChjYiA9PiBjYigpKTtcbiAgICB0aGlzLmNsZWFudXAuY2xlYXIoKTtcbiAgICB0aGlzLmxheWVyLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgaW5jbHVkZTxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIGlucHV0czogQ29udGV4dC5BY2NlcHQ8VD4sXG4gICAgZm9yRWFjaD86IENvbnRleHQuRXhwZWN0PFQ+XG4gICl7XG4gICAgY29uc3QgaW5pdCA9IG5ldyBNYXA8TW9kZWwsIGJvb2xlYW4+KCk7XG5cbiAgICBpZih0eXBlb2YgaW5wdXRzID09IFwiZnVuY3Rpb25cIiB8fCBpbnB1dHMgaW5zdGFuY2VvZiBNb2RlbClcbiAgICAgIGlucHV0cyA9IHsgW2ZvckVhY2ggPyAwIDogdGhpcy5sYXllci5zaXplXTogaW5wdXRzIH07XG4gICAgXG4gICAgZm9yKGNvbnN0IFtLLCBWXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dHMpKXtcbiAgICAgIGlmKE1vZGVsLmlzKFYpIHx8IFYgaW5zdGFuY2VvZiBNb2RlbCl7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMubGF5ZXIuZ2V0KEspO1xuICBcbiAgICAgICAgaWYoIWV4aXN0cyl7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmFkZChWKTtcbiAgXG4gICAgICAgICAgdGhpcy5sYXllci5zZXQoSywgVik7XG4gICAgICAgICAgaW5pdC5zZXQoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbnRleHQgbXVzdCBmb3JjZS1yZXNldCBiZWNhdXNlIGlucHV0cyBhcmUgbm8gbG9uZ2VyIHNhZmUuXG4gICAgICAgIGVsc2UgaWYoZXhpc3RzICE9PSBWKXsgICAgXG4gICAgICAgICAgdGhpcy5wb3AoKTtcbiAgICAgICAgICB0aGlzLmlkID0gdWlkKCk7XG4gICAgICAgICAgdGhpcy5pbmNsdWRlKGlucHV0cyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ29udGV4dCBtYXkgb25seSBpbmNsdWRlIGluc3RhbmNlIG9yIGNsYXNzIFxcYGV4dGVuZHMgTW9kZWxcXGAgYnV0IGdvdCAke1xuICAgICAgICAgIEsgPT0gJzAnIHx8IEsgPT0gU3RyaW5nKFYpID8gViA6IGAke1Z9IChhcyAnJHtLfScpYFxuICAgICAgICB9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yKGNvbnN0IFttb2RlbCwgZXhwbGljaXRdIG9mIGluaXQpe1xuICAgICAgbW9kZWwuc2V0KCk7XG5cbiAgICAgIGlmKGV4cGxpY2l0ICYmIGZvckVhY2gpXG4gICAgICAgIGZvckVhY2gobW9kZWwgYXMgVCk7XG5cbiAgICAgIGZvcihjb25zdCBbX2tleSwgdmFsdWVdIG9mIG1vZGVsKVxuICAgICAgICBpZihQQVJFTlQuZ2V0KHZhbHVlIGFzIE1vZGVsKSA9PT0gbW9kZWwpe1xuICAgICAgICAgIHRoaXMuYWRkKHZhbHVlIGFzIE1vZGVsLCB0cnVlKTtcbiAgICAgICAgICBpbml0LnNldCh2YWx1ZSBhcyBNb2RlbCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFkZDxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIGlucHV0OiBUIHwgTW9kZWwuSW5pdDxUPixcbiAgICBpbXBsaWNpdD86IGJvb2xlYW4pe1xuXG4gICAgY29uc3QgY2xlYW51cCA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcbiAgICBsZXQgVDogTW9kZWwuVHlwZTxUPjtcbiAgICBsZXQgSTogVDtcblxuICAgIGlmKHR5cGVvZiBpbnB1dCA9PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgVCA9IGlucHV0O1xuICAgICAgSSA9IG5ldyBpbnB1dCgpIGFzIFQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgVCA9IGlucHV0LmNvbnN0cnVjdG9yIGFzIE1vZGVsLlR5cGU8VD47XG4gICAgICBJID0gaW5wdXQ7XG4gICAgfVxuXG4gICAga2V5cyhULCB0cnVlKS5mb3JFYWNoKEsgPT4ge1xuICAgICAgY29uc3QgZXhwZWN0cyA9IHRoaXNbS10gYXMgQ29udGV4dC5FeHBlY3QgfCB1bmRlZmluZWQ7XG4gIFxuICAgICAgaWYoIWV4cGVjdHMpXG4gICAgICAgIHJldHVybjtcbiAgXG4gICAgICBhZGRMaXN0ZW5lcihJLCBldmVudCA9PiB7XG4gICAgICAgIGlmKGV2ZW50ID09PSB0cnVlKXtcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGV4cGVjdHMoSSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICBpZihjYWxsYmFjaylcbiAgICAgICAgICAgIGNsZWFudXAuYWRkKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSkgIFxuICAgIH0pO1xuXG4gICAga2V5cyhUKS5mb3JFYWNoKEsgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmhhc093blByb3BlcnR5KEspID8gbnVsbCA6IEk7XG5cbiAgICAgIGlmKHZhbHVlIHx8IHRoaXNbS10gIT09IEkgJiYgIWltcGxpY2l0KVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgSywge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2xlYW51cC5hZGQoKCkgPT4ge1xuICAgICAgY2xlYW51cC5mb3JFYWNoKGNiID0+IGNiKCkpO1xuXG4gICAgICBpZihJICE9PSBpbnB1dClcbiAgICAgICAgZXZlbnQoSSwgbnVsbCk7XG4gICAgfSlcblxuICAgIGNvbnN0IHdhaXRpbmcgPSBMT09LVVAuZ2V0KEkpO1xuICBcbiAgICBpZih3YWl0aW5nIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICB3YWl0aW5nLmZvckVhY2goY2IgPT4gY2IodGhpcykpO1xuXG4gICAgTE9PS1VQLnNldChJLCB0aGlzKTtcblxuICAgIHJldHVybiBJO1xuICB9XG59XG5cbmV4cG9ydCB7IENvbnRleHQgfSJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsT0FBTyxPQUFPLFFBQVEsV0FBVztBQUUxQyxNQUFNLFNBQVMsb0JBQUksUUFBcUQ7QUFDeEUsTUFBTSxPQUFPLG9CQUFJLElBQWlDO0FBRWxELFNBQVMsSUFBSSxHQUF3QixVQUE0QjtBQUMvRCxNQUFJLElBQUksS0FBSyxJQUFJLENBQUM7QUFFbEIsTUFBRyxDQUFDO0FBQ0YsU0FBSyxJQUFJLEdBQUcsSUFBSTtBQUFBLE1BQ2QsT0FBTyxLQUFLLFdBQVcsU0FBUyxFQUFFLGNBQWMsT0FBTyxDQUFDO0FBQUEsSUFDMUQsQ0FBQztBQUVILFNBQU8sV0FBVyxJQUFJLENBQUMsSUFBSTtBQUM3QjtBQUVBLFNBQVMsS0FBSyxNQUFrQixVQUFtQjtBQUNqRCxRQUFNQSxRQUFPLG9CQUFJLElB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LE9BQU8sUUFBUSxLQUFLLE1BQUs7QUFDbEMsWUFBTSxJQUFJO0FBRVYsVUFBRyxZQUFZO0FBQ2IsZ0JBQVEsS0FBVTtBQUVwQixpQkFBVSxDQUFDLE1BQU0sS0FBSyxLQUFLO0FBQ3pCLFlBQUcsT0FBTyxJQUFJLEtBQWMsTUFBTSxPQUFNO0FBQ3RDLGVBQUssSUFBSSxPQUFnQixJQUFJO0FBQzdCLGVBQUssSUFBSSxPQUFnQixLQUFLO0FBQUEsUUFDaEM7QUFBQSxJQUNKO0FBQUEsRUFDRjtBQUFBLEVBRVUsSUFDUixPQUNBLFVBQW1CO0FBRW5CLFVBQU0sVUFBVSxvQkFBSSxJQUFnQjtBQUNwQyxRQUFJO0FBQ0osUUFBSTtBQUVKLFFBQUcsT0FBTyxTQUFTLFlBQVc7QUFDNUIsVUFBSTtBQUNKLFVBQUksSUFBSSxNQUFNO0FBQUEsSUFDaEIsT0FDSztBQUNILFVBQUksTUFBTTtBQUNWLFVBQUk7QUFBQSxJQUNOO0FBRUEsU0FBSyxHQUFHLElBQUksRUFBRSxRQUFRLE9BQUs7QUFDekIsWUFBTSxVQUFVLEtBQUssQ0FBQztBQUV0QixVQUFHLENBQUM7QUFDRjtBQUVGLGtCQUFZLEdBQUcsQ0FBQUMsV0FBUztBQUN0QixZQUFHQSxXQUFVLE1BQUs7QUFDaEIsZ0JBQU0sV0FBVyxRQUFRLENBQUM7QUFFMUIsY0FBRztBQUNELG9CQUFRLElBQUksUUFBUTtBQUFBLFFBQ3hCO0FBRUEsZUFBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUVELFNBQUssQ0FBQyxFQUFFLFFBQVEsT0FBSztBQUNuQixZQUFNLFFBQVEsS0FBSyxlQUFlLENBQUMsSUFBSSxPQUFPO0FBRTlDLFVBQUcsU0FBUyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7QUFDNUIsZUFBTyxlQUFlLE1BQU0sR0FBRztBQUFBLFVBQzdCLGNBQWM7QUFBQSxVQUNkO0FBQUEsUUFDRixDQUFDO0FBQUEsSUFDTCxDQUFDO0FBRUQsU0FBSyxRQUFRLElBQUksTUFBTTtBQUNyQixjQUFRLFFBQVEsUUFBTSxHQUFHLENBQUM7QUFFMUIsVUFBRyxNQUFNO0FBQ1AsY0FBTSxHQUFHLElBQUk7QUFBQSxJQUNqQixDQUFDO0FBRUQsVUFBTSxVQUFVLE9BQU8sSUFBSSxDQUFDO0FBRTVCLFFBQUcsbUJBQW1CO0FBQ3BCLGNBQVEsUUFBUSxRQUFNLEdBQUcsSUFBSSxDQUFDO0FBRWhDLFdBQU8sSUFBSSxHQUFHLElBQUk7QUFFbEIsV0FBTztBQUFBLEVBQ1Q7QUFDRjsiLAogICJuYW1lcyI6IFsia2V5cyIsICJyZXF1aXJlIiwgImtleSIsICJldmVudCJdCn0K
152
+ Object.defineProperty(Context.prototype, "toString", { value() {
153
+ return `Context-${this.id}`;
154
+ } });
155
+
156
+ //#endregion
157
+ export { Context };
158
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udGV4dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZGRMaXN0ZW5lciB9IGZyb20gJy4vb2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBldmVudCwgU3RhdGUsIFBBUkVOVCwgdWlkIH0gZnJvbSAnLi9zdGF0ZSc7XG5cbmNvbnN0IExPT0tVUCA9IG5ldyBXZWFrTWFwPFN0YXRlLCBDb250ZXh0IHwgKChnb3Q6IENvbnRleHQpID0+IHZvaWQpW10+KCk7XG5jb25zdCBLRVlTID0gbmV3IE1hcDxzeW1ib2wgfCBTdGF0ZS5FeHRlbmRzLCBzeW1ib2w+KCk7XG5cbmZ1bmN0aW9uIGtleShUOiBTdGF0ZS5FeHRlbmRzIHwgc3ltYm9sLCB1cHN0cmVhbT86IGJvb2xlYW4pOiBzeW1ib2wge1xuICBsZXQgSyA9IEtFWVMuZ2V0KFQpO1xuXG4gIGlmICghSykge1xuICAgIEsgPSBTeW1ib2wodHlwZW9mIFQgPT0gJ3N5bWJvbCcgPyAnZ2V0ICcgKyBULmRlc2NyaXB0aW9uIDogU3RyaW5nKFQpKTtcbiAgICBLRVlTLnNldChULCBLKTtcbiAgfVxuXG4gIHJldHVybiB1cHN0cmVhbSA/IGtleShLKSA6IEs7XG59XG5cbmZ1bmN0aW9uIGtleXMoZnJvbTogU3RhdGUuRXh0ZW5kcywgdXBzdHJlYW0/OiBib29sZWFuKSB7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN5bWJvbD4oKTtcblxuICBkbyB7XG4gICAga2V5cy5hZGQoa2V5KGZyb20sIHVwc3RyZWFtKSk7XG4gICAgZnJvbSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihmcm9tKTtcbiAgfSB3aGlsZSAoZnJvbSAhPT0gU3RhdGUpO1xuXG4gIHJldHVybiBrZXlzO1xufVxuXG5kZWNsYXJlIG5hbWVzcGFjZSBDb250ZXh0IHtcbiAgdHlwZSBNdWx0aXBsZTxUIGV4dGVuZHMgU3RhdGU+ID0ge1xuICAgIFtrZXk6IHN0cmluZyB8IG51bWJlcl06IFN0YXRlLlR5cGU8VD4gfCBUO1xuICB9O1xuXG4gIHR5cGUgQWNjZXB0PFQgZXh0ZW5kcyBTdGF0ZSA9IFN0YXRlPiA9IFQgfCBTdGF0ZS5UeXBlPFQ+IHwgTXVsdGlwbGU8VD47XG5cbiAgdHlwZSBFeHBlY3Q8VCBleHRlbmRzIFN0YXRlID0gU3RhdGU+ID0gKHN0YXRlOiBUKSA9PiAoKCkgPT4gdm9pZCkgfCB2b2lkO1xufVxuXG5pbnRlcmZhY2UgQ29udGV4dCB7XG4gIFtrZXk6IHN5bWJvbF06IFN0YXRlIHwgQ29udGV4dC5FeHBlY3QgfCBudWxsIHwgdW5kZWZpbmVkO1xufVxuXG5jbGFzcyBDb250ZXh0IHtcbiAgLyoqXG4gICAqIEdldCB0aGUgY29udGV4dCBmb3IgYSBzcGVjaWZpZWQgU3RhdGUuIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgcnVuIHdoZW5cbiAgICogdGhlIGNvbnRleHQgYmVjb21lcyBhdmFpbGFibGUuXG4gICAqL1xuICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBTdGF0ZT4oXG4gICAgb246IFN0YXRlLFxuICAgIGNhbGxiYWNrOiAoZ290OiBDb250ZXh0KSA9PiB2b2lkXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29udGV4dCBmb3IgYSBzcGVjaWZpZWQgU3RhdGUuIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vbmUgYXJlIGZvdW5kLlxuICAgKi9cbiAgc3RhdGljIGdldDxUIGV4dGVuZHMgU3RhdGU+KG9uOiBTdGF0ZSk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cbiAgc3RhdGljIGdldCh7IGlzIH06IFN0YXRlLCBjYWxsYmFjaz86IChnb3Q6IENvbnRleHQpID0+IHZvaWQpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gTE9PS1VQLmdldChpcyk7XG5cbiAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHQpIHtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soY29udGV4dCk7XG4gICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2spXG4gICAgICBpZiAoY29udGV4dCkgY29udGV4dC5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgTE9PS1VQLnNldChpcywgW2NhbGxiYWNrXSk7XG4gIH1cblxuICBwdWJsaWMgaWQgPSB1aWQoKTtcblxuICBwcm90ZWN0ZWQgaW5wdXRzID0ge30gYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgU3RhdGUgfCBTdGF0ZS5FeHRlbmRzPjtcbiAgcHJvdGVjdGVkIGNsZWFudXAgPSBuZXcgU2V0PCgpID0+IHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoaW5wdXRzPzogQ29udGV4dC5BY2NlcHQpIHtcbiAgICBpZiAoaW5wdXRzKSB0aGlzLnVzZShpbnB1dHMpO1xuICB9XG5cbiAgLyoqIEZpbmQgc3BlY2lmaWVkIHR5cGUgcmVnaXN0ZXJlZCB0byBhIHBhcmVudCBjb250ZXh0LiBUaHJvd3MgaWYgbm9uZSBhcmUgZm91bmQuICovXG4gIHB1YmxpYyBnZXQ8VCBleHRlbmRzIFN0YXRlPihUeXBlOiBTdGF0ZS5FeHRlbmRzPFQ+LCByZXF1aXJlOiB0cnVlKTogVDtcblxuICAvKiogRmluZCBzcGVjaWZpZWQgdHlwZSByZWdpc3RlcmVkIHRvIGEgcGFyZW50IGNvbnRleHQuIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vbmUgYXJlIGZvdW5kLiAqL1xuICBwdWJsaWMgZ2V0PFQgZXh0ZW5kcyBTdGF0ZT4oXG4gICAgVHlwZTogU3RhdGUuRXh0ZW5kczxUPixcbiAgICByZXF1aXJlPzogYm9vbGVhblxuICApOiBUIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBSdW4gY2FsbGJhY2sgd2hlbiBhIHNwZWNpZmllZCB0eXBlIGlzIHJlZ2lzdGVyZWQgaW4gY29udGV4dCBkb3duc3RyZWFtLiAqL1xuICBwdWJsaWMgZ2V0PFQgZXh0ZW5kcyBTdGF0ZT4oXG4gICAgVHlwZTogU3RhdGUuRXh0ZW5kczxUPixcbiAgICBjYWxsYmFjazogKHN0YXRlOiBUKSA9PiB2b2lkXG4gICk6ICgpID0+IHZvaWQ7XG5cbiAgcHVibGljIGdldDxUIGV4dGVuZHMgU3RhdGU+KFxuICAgIFR5cGU6IFN0YXRlLkV4dGVuZHM8VD4sXG4gICAgYXJnMj86IGJvb2xlYW4gfCAoKHN0YXRlOiBUKSA9PiB2b2lkKVxuICApIHtcbiAgICBpZiAodHlwZW9mIGFyZzIgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgayA9IGtleShUeXBlLCB0cnVlKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrLCB7XG4gICAgICAgIHZhbHVlOiBhcmcyLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZGVsZXRlIHRoaXNba107XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNba2V5KFR5cGUpXTtcblxuICAgIGlmIChyZXN1bHQgPT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEaWQgZmluZCAke1R5cGV9IGluIGNvbnRleHQsIGJ1dCBtdWx0aXBsZSB3ZXJlIGRlZmluZWQuYFxuICAgICAgKTtcblxuICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQgYXMgVDtcblxuICAgIGlmIChhcmcyKSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kICR7VHlwZX0gaW4gY29udGV4dC5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgU3RhdGUgdG8gdGhpcyBjb250ZXh0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGFkZDxUIGV4dGVuZHMgU3RhdGU+KGlucHV0OiBUIHwgU3RhdGUuVHlwZTxUPiwgaW1wbGljaXQ/OiBib29sZWFuKSB7XG4gICAgY29uc3QgY2xlYW51cCA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcbiAgICBsZXQgVDogU3RhdGUuRXh0ZW5kczxUPjtcbiAgICBsZXQgSTogVDtcblxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgVCA9IGlucHV0O1xuICAgICAgSSA9IG5ldyBpbnB1dCgpIGFzIFQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIFQgPSBpbnB1dC5jb25zdHJ1Y3RvciBhcyBTdGF0ZS5FeHRlbmRzPFQ+O1xuICAgICAgSSA9IGlucHV0O1xuICAgIH1cblxuICAgIGtleXMoVCwgdHJ1ZSkuZm9yRWFjaCgoSykgPT4ge1xuICAgICAgY29uc3QgZXhwZWN0cyA9IHRoaXNbS10gYXMgQ29udGV4dC5FeHBlY3QgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChleHBlY3RzKVxuICAgICAgICBhZGRMaXN0ZW5lcihJLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNiID0gZXhwZWN0cyhJKTtcbiAgICAgICAgICAgIGlmIChjYikgY2xlYW51cC5hZGQoY2IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGtleXMoVCkuZm9yRWFjaCgoSykgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmhhc093blByb3BlcnR5KEspID8gbnVsbCA6IEk7XG5cbiAgICAgIGlmICh2YWx1ZSB8fCAodGhpc1tLXSAhPT0gSSAmJiAhaW1wbGljaXQpKVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgSywge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2xlYW51cC5hZGQoKCkgPT4ge1xuICAgICAgY2xlYW51cC5mb3JFYWNoKChjYikgPT4gY2IoKSk7XG4gICAgICBpZiAoSSAhPT0gaW5wdXQpIGV2ZW50KEksIG51bGwpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgd2FpdGluZyA9IExPT0tVUC5nZXQoSSk7XG5cbiAgICBpZiAod2FpdGluZyBpbnN0YW5jZW9mIEFycmF5KSB3YWl0aW5nLmZvckVhY2goKGNiKSA9PiBjYih0aGlzKSk7XG5cbiAgICBMT09LVVAuc2V0KEksIHRoaXMpO1xuXG4gICAgcmV0dXJuIEk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgb25lIG9yIG1vcmUgU3RhdGVzIHRvIHRoaXMgY29udGV4dC5cbiAgICpcbiAgICogQ29udGV4dCB3aWxsIGFkZCBvciByZW1vdmUgU3RhdGVzIGFzIG5lZWRlZCB0byBrZWVwIHdpdGggcHJvdmlkZWQgaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgU3RhdGUsIFN0YXRlIGNsYXNzLCBvciBtYXAgb2YgU3RhdGVzIC8gU3RhdGUgY2xhc3NlcyB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIGZvckVhY2ggT3B0aW9uYWwgY2FsbGJhY2sgdG8gcnVuIGZvciBlYWNoIFN0YXRlIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwdWJsaWMgdXNlPFQgZXh0ZW5kcyBTdGF0ZT4oXG4gICAgaW5wdXRzOiBDb250ZXh0LkFjY2VwdDxUPixcbiAgICBmb3JFYWNoPzogQ29udGV4dC5FeHBlY3Q8VD5cbiAgKSB7XG4gICAgY29uc3QgaW5pdCA9IG5ldyBNYXA8U3RhdGUsIGJvb2xlYW4+KCk7XG5cbiAgICBpZiAodHlwZW9mIGlucHV0cyA9PSAnZnVuY3Rpb24nIHx8IGlucHV0cyBpbnN0YW5jZW9mIFN0YXRlKVxuICAgICAgaW5wdXRzID0geyBbMF06IGlucHV0cyB9O1xuXG4gICAgZm9yIChjb25zdCBbSywgVl0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXRzKSkge1xuICAgICAgaWYgKCEoU3RhdGUuaXMoVikgfHwgViBpbnN0YW5jZW9mIFN0YXRlKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb250ZXh0IG1heSBvbmx5IGluY2x1ZGUgaW5zdGFuY2Ugb3IgY2xhc3MgXFxgZXh0ZW5kcyBTdGF0ZVxcYCBidXQgZ290ICR7XG4gICAgICAgICAgICBLID09ICcwJyB8fCBLID09IFN0cmluZyhWKSA/IFYgOiBgJHtWfSAoYXMgJyR7S30nKWBcbiAgICAgICAgICB9LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3QgZXhpc3RzID0gdGhpcy5pbnB1dHNbS107XG5cbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIGluaXQuc2V0KHRoaXMuYWRkKFYpLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIC8vIENvbnRleHQgbXVzdCBmb3JjZS1yZXNldCBiZWNhdXNlIGlucHV0cyBhcmUgbm8gbG9uZ2VyIHNhZmUsXG4gICAgICAvLyBob3dldmVyIHByb2JhYmx5IHNob3VsZCBkbyB0aGF0IG9uIGEgcGVyLXN0YXRlIGJhc2lzLlxuICAgICAgZWxzZSBpZiAoZXhpc3RzICE9PSBWKSB7XG4gICAgICAgIHRoaXMucG9wKCk7XG4gICAgICAgIHRoaXMudXNlKGlucHV0cyk7XG4gICAgICAgIHRoaXMuaWQgPSB1aWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N0YXRlLCBleHBsaWNpdF0gb2YgaW5pdCkge1xuICAgICAgc3RhdGUuc2V0KCk7XG5cbiAgICAgIGlmIChleHBsaWNpdCAmJiBmb3JFYWNoKSBmb3JFYWNoKHN0YXRlIGFzIFQpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtfa2V5LCB2YWx1ZV0gb2Ygc3RhdGUpXG4gICAgICAgIGlmIChQQVJFTlQuZ2V0KHZhbHVlIGFzIFN0YXRlKSA9PT0gc3RhdGUpIHtcbiAgICAgICAgICB0aGlzLmFkZCh2YWx1ZSBhcyBTdGF0ZSwgdHJ1ZSk7XG4gICAgICAgICAgaW5pdC5zZXQodmFsdWUgYXMgU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaW5wdXRzID0gaW5wdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNoaWxkIGNvbnRleHQsIG9wdGlvbmFsbHkgcmVnaXN0ZXJpbmcgb25lIG9yIG1vcmUgU3RhdGVzIHRvIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzIFN0YXRlLCBTdGF0ZSBjbGFzcywgb3IgbWFwIG9mIFN0YXRlcyAvIFN0YXRlIGNsYXNzZXMgdG8gcmVnaXN0ZXIuXG4gICAqL1xuICBwdWJsaWMgcHVzaChpbnB1dHM/OiBDb250ZXh0LkFjY2VwdCkge1xuICAgIGNvbnN0IG5leHQgPSBPYmplY3QuY3JlYXRlKHRoaXMpIGFzIHRoaXM7XG5cbiAgICB0aGlzLmNsZWFudXAgPSBuZXcgU2V0KFsoKSA9PiBuZXh0LnBvcCgpLCAuLi50aGlzLmNsZWFudXBdKTtcblxuICAgIG5leHQuaW5wdXRzID0ge307XG4gICAgbmV4dC5jbGVhbnVwID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKGlucHV0cykgbmV4dC51c2UoaW5wdXRzKTtcblxuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgU3RhdGVzIGZyb20gdGhpcyBjb250ZXh0LlxuICAgKlxuICAgKiBXaWxsIGFsc28gcnVuIGFueSBjbGVhbnVwIGNhbGxiYWNrcyByZWdpc3RlcmVkIHdoZW4gU3RhdGVzIHdlcmUgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgcG9wKCkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGhpcykpIGRlbGV0ZSB0aGlzW2tleV07XG5cbiAgICB0aGlzLmNsZWFudXAuZm9yRWFjaCgoY2IpID0+IGNiKCkpO1xuICAgIHRoaXMuY2xlYW51cC5jbGVhcigpO1xuICAgIHRoaXMuaW5wdXRzID0ge307XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnRleHQucHJvdG90eXBlLCAndG9TdHJpbmcnLCB7XG4gIHZhbHVlKCkge1xuICAgIHJldHVybiBgQ29udGV4dC0ke3RoaXMuaWR9YDtcbiAgfVxufSk7XG5cbmV4cG9ydCB7IENvbnRleHQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUdB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
@@ -0,0 +1,8 @@
1
+ import { Observable, addListener, event, watch } from "./observable.js";
2
+ import { METHOD, State } from "./state.js";
3
+ import { Context } from "./context.js";
4
+ import { Instruction, use } from "./instruction/use.js";
5
+ import { get } from "./instruction/get.js";
6
+ import { set } from "./instruction/set.js";
7
+ import { ref } from "./instruction/ref.js";
8
+ export { Context, type Instruction, METHOD, Observable, State, addListener, State as default, event, get, ref, set, use, watch };
package/dist/esm/index.js CHANGED
@@ -1,24 +1,9 @@
1
- import { get } from "./instruction/get";
2
- import { ref } from "./instruction/ref";
3
- import { set } from "./instruction/set";
4
- import { use } from "./instruction/use";
5
- import { has } from "./instruction/has";
6
- import { Model, Model as Model2, METHOD } from "./model";
7
- import { createEffect, addListener, event, Observable } from "./control";
8
- import { Context } from "./context";
9
- export {
10
- Context,
11
- METHOD,
12
- Model,
13
- Observable,
14
- addListener,
15
- createEffect,
16
- Model2 as default,
17
- event,
18
- get,
19
- has,
20
- ref,
21
- set,
22
- use
23
- };
24
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBnZXQgfSBmcm9tICcuL2luc3RydWN0aW9uL2dldCc7XG5leHBvcnQgeyByZWYgfSBmcm9tICcuL2luc3RydWN0aW9uL3JlZic7XG5leHBvcnQgeyBzZXQgfSBmcm9tICcuL2luc3RydWN0aW9uL3NldCc7XG5leHBvcnQgeyB1c2UgfSBmcm9tICcuL2luc3RydWN0aW9uL3VzZSc7XG5leHBvcnQgeyBoYXMgfSBmcm9tICcuL2luc3RydWN0aW9uL2hhcyc7XG5cbmV4cG9ydCB7IE1vZGVsLCBNb2RlbCBhcyBkZWZhdWx0LCBNRVRIT0QgfSBmcm9tICcuL21vZGVsJztcbmV4cG9ydCB7IGNyZWF0ZUVmZmVjdCwgYWRkTGlzdGVuZXIsIGV2ZW50LCBPYnNlcnZhYmxlIH0gZnJvbSAnLi9jb250cm9sJztcbmV4cG9ydCB7IENvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnOyJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsV0FBVztBQUNwQixTQUFTLFdBQVc7QUFDcEIsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsV0FBVztBQUNwQixTQUFTLFdBQVc7QUFFcEIsU0FBUyxPQUFnQixTQUFUQSxRQUFrQixjQUFjO0FBQ2hELFNBQVMsY0FBYyxhQUFhLE9BQU8sa0JBQWtCO0FBQzdELFNBQVMsZUFBZTsiLAogICJuYW1lcyI6IFsiTW9kZWwiXQp9Cg==
1
+ import { Observable, addListener, event, watch } from "./observable.js";
2
+ import { METHOD, State } from "./state.js";
3
+ import { Context } from "./context.js";
4
+ import { use } from "./instruction/use.js";
5
+ import { get } from "./instruction/get.js";
6
+ import { set } from "./instruction/set.js";
7
+ import { ref } from "./instruction/ref.js";
8
+
9
+ export { Context, METHOD, Observable, State, addListener, State as default, event, get, ref, set, use, watch };
@@ -0,0 +1,36 @@
1
+ import { State } from "../state.js";
2
+
3
+ //#region src/instruction/get.d.ts
4
+ declare namespace get {
5
+ type Callback<T = any> = (state: T, subject: State) => void | boolean | (() => void);
6
+ }
7
+ /**
8
+ * Fetches upstream State from context with optional lifecycle callback.
9
+ * Callback runs on mount and can return cleanup function for unmount.
10
+ *
11
+ * @param Type - Type of State to fetch.
12
+ * @param callback - Optional lifecycle callback, receives (state, subject). Can return cleanup function.
13
+ */
14
+ declare function get<T extends State>(Type: State.Extends<T>, callback?: get.Callback<T>): T;
15
+ /**
16
+ * Fetches and assigns the controller which spawned this host.
17
+ * When parent assigns an instance via `use()` directive, it
18
+ * will be made available to child upon this request.
19
+ *
20
+ * @param Type - Type of controller compatible with this class.
21
+ * @param required - If false, property may be undefined. Otherwise will throw suspense.
22
+ */
23
+ declare function get<T extends State>(Type: State.Extends<T>, required: false): T | undefined;
24
+ /**
25
+ * Collects downstream States, this will accumulate all instances of specified type for which this is an ancestor.
26
+ * Returns a frozen array that updates as States are added or removed.
27
+ * Callback runs on each State registration and can return cleanup or false to prevent registration.
28
+ *
29
+ * @param Type - Type of State to collect.
30
+ * @param downstream - Must be true to enable downstream mode.
31
+ * @param callback - Optional lifecycle callback, receives (state, subject). May return false to prevent registration.
32
+ */
33
+ declare function get<T extends State>(Type: State.Extends<T>, downstream: true, callback?: get.Callback<T>): readonly T[];
34
+ //#endregion
35
+ export { get };
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmQudHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2luc3RydWN0aW9uL2dldC5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YXRlIH0gZnJvbSAnLi4vc3RhdGUnO1xuZGVjbGFyZSBuYW1lc3BhY2UgZ2V0IHtcbiAgICB0eXBlIENhbGxiYWNrPFQgPSBhbnk+ID0gKHN0YXRlOiBULCBzdWJqZWN0OiBTdGF0ZSkgPT4gdm9pZCB8IGJvb2xlYW4gfCAoKCkgPT4gdm9pZCk7XG59XG4vKipcbiAqIEZldGNoZXMgdXBzdHJlYW0gU3RhdGUgZnJvbSBjb250ZXh0IHdpdGggb3B0aW9uYWwgbGlmZWN5Y2xlIGNhbGxiYWNrLlxuICogQ2FsbGJhY2sgcnVucyBvbiBtb3VudCBhbmQgY2FuIHJldHVybiBjbGVhbnVwIGZ1bmN0aW9uIGZvciB1bm1vdW50LlxuICpcbiAqIEBwYXJhbSBUeXBlIC0gVHlwZSBvZiBTdGF0ZSB0byBmZXRjaC5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIE9wdGlvbmFsIGxpZmVjeWNsZSBjYWxsYmFjaywgcmVjZWl2ZXMgKHN0YXRlLCBzdWJqZWN0KS4gQ2FuIHJldHVybiBjbGVhbnVwIGZ1bmN0aW9uLlxuICovXG5kZWNsYXJlIGZ1bmN0aW9uIGdldDxUIGV4dGVuZHMgU3RhdGU+KFR5cGU6IFN0YXRlLkV4dGVuZHM8VD4sIGNhbGxiYWNrPzogZ2V0LkNhbGxiYWNrPFQ+KTogVDtcbi8qKlxuICogRmV0Y2hlcyBhbmQgYXNzaWducyB0aGUgY29udHJvbGxlciB3aGljaCBzcGF3bmVkIHRoaXMgaG9zdC5cbiAqIFdoZW4gcGFyZW50IGFzc2lnbnMgYW4gaW5zdGFuY2UgdmlhIGB1c2UoKWAgZGlyZWN0aXZlLCBpdFxuICogd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSB0byBjaGlsZCB1cG9uIHRoaXMgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gVHlwZSAtIFR5cGUgb2YgY29udHJvbGxlciBjb21wYXRpYmxlIHdpdGggdGhpcyBjbGFzcy5cbiAqIEBwYXJhbSByZXF1aXJlZCAtIElmIGZhbHNlLCBwcm9wZXJ0eSBtYXkgYmUgdW5kZWZpbmVkLiBPdGhlcndpc2Ugd2lsbCB0aHJvdyBzdXNwZW5zZS5cbiAqL1xuZGVjbGFyZSBmdW5jdGlvbiBnZXQ8VCBleHRlbmRzIFN0YXRlPihUeXBlOiBTdGF0ZS5FeHRlbmRzPFQ+LCByZXF1aXJlZDogZmFsc2UpOiBUIHwgdW5kZWZpbmVkO1xuLyoqXG4gKiBDb2xsZWN0cyBkb3duc3RyZWFtIFN0YXRlcywgdGhpcyB3aWxsIGFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBvZiBzcGVjaWZpZWQgdHlwZSBmb3Igd2hpY2ggdGhpcyBpcyBhbiBhbmNlc3Rvci5cbiAqIFJldHVybnMgYSBmcm96ZW4gYXJyYXkgdGhhdCB1cGRhdGVzIGFzIFN0YXRlcyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC5cbiAqIENhbGxiYWNrIHJ1bnMgb24gZWFjaCBTdGF0ZSByZWdpc3RyYXRpb24gYW5kIGNhbiByZXR1cm4gY2xlYW51cCBvciBmYWxzZSB0byBwcmV2ZW50IHJlZ2lzdHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gVHlwZSAtIFR5cGUgb2YgU3RhdGUgdG8gY29sbGVjdC5cbiAqIEBwYXJhbSBkb3duc3RyZWFtIC0gTXVzdCBiZSB0cnVlIHRvIGVuYWJsZSBkb3duc3RyZWFtIG1vZGUuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBPcHRpb25hbCBsaWZlY3ljbGUgY2FsbGJhY2ssIHJlY2VpdmVzIChzdGF0ZSwgc3ViamVjdCkuIE1heSByZXR1cm4gZmFsc2UgdG8gcHJldmVudCByZWdpc3RyYXRpb24uXG4gKi9cbmRlY2xhcmUgZnVuY3Rpb24gZ2V0PFQgZXh0ZW5kcyBTdGF0ZT4oVHlwZTogU3RhdGUuRXh0ZW5kczxUPiwgZG93bnN0cmVhbTogdHJ1ZSwgY2FsbGJhY2s/OiBnZXQuQ2FsbGJhY2s8VD4pOiByZWFkb25seSBUW107XG5leHBvcnQgeyBnZXQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBQSxNQUFRO0NBQUE7RUFBQSxNQUFVLENBQUcsR0FBQyxNQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ3RCLElBQUksTUFBSztDQUFBO0VBQUEsTUFBVztFQUFDO0VBQU87RUFBRSxNQUFPO0VBQUc7RUFBUyxJQUFBO0VBQWM7RUFBRTtDQUFDO0VBQUE7RUFBQTtFQUFVO0VBQUk7RUFBRztFQUFLO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDeEYsSUFBQSxNQUFBO0NBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQTtFQUFBLE1BQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNBLElBQUUsTUFBQTtDQUFBO0VBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQSxJQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQSJ9