@actdim/dynstruct 0.9.0 → 0.9.7

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.
@@ -1,198 +1,183 @@
1
- var I = Object.defineProperty;
2
- var L = (n, e, o) => e in n ? I(n, e, { enumerable: !0, configurable: !0, writable: !0, value: o }) : n[e] = o;
3
- var P = (n, e, o) => L(n, typeof e != "symbol" ? e + "" : e, o);
4
- import { jsx as G, Fragment as N } from "react/jsx-runtime";
5
- import { useLayoutEffect as S, useEffect as D } from "react";
6
- import { observer as F } from "mobx-react-lite";
7
- import { observable as j, runInAction as A } from "mobx";
8
- import { useLazyRef as M } from "../reactHooks.es.js";
9
- const w = {
1
+ import { jsx as O, Fragment as B } from "react/jsx-runtime";
2
+ import { useLayoutEffect as G, useEffect as w } from "react";
3
+ import { observer as j } from "mobx-react-lite";
4
+ import { observable as $, runInAction as E } from "mobx";
5
+ import { useLazyRef as R } from "../reactHooks.es.js";
6
+ const P = {
10
7
  $isBinding: Symbol("$isBinding")
11
8
  };
12
- var E;
13
- E = w.$isBinding;
14
- class R {
15
- constructor(e, o, r, d) {
16
- // getter
17
- P(this, "get");
18
- // setter
19
- P(this, "set");
20
- P(this, "converter");
21
- P(this, "validator");
22
- P(this, "readOnly");
23
- P(this, E);
24
- this.get = e, this.set = o, this.converter = r, this.validator = d, this.readOnly = !!o, this[w.$isBinding] = !0;
9
+ class k {
10
+ // getter
11
+ get;
12
+ // setter
13
+ set;
14
+ converter;
15
+ validator;
16
+ readOnly;
17
+ constructor(t, o, i, d) {
18
+ this.get = t, this.set = o, this.converter = i, this.validator = d, this.readOnly = !!o, this[P.$isBinding] = !0;
25
19
  }
20
+ [P.$isBinding];
26
21
  }
27
- function V(n) {
28
- return n[w.$isBinding] === !0;
22
+ function I(e) {
23
+ return e[P.$isBinding] === !0;
29
24
  }
30
- function X(n, e, o, r) {
31
- return new R(n, e, o, r);
25
+ function H(e, t, o, i) {
26
+ return new k(e, t, o, i);
32
27
  }
33
- function Y(n, e) {
34
- return new R(
35
- () => n[e],
28
+ function x(e, t) {
29
+ return new k(
30
+ () => e[t],
36
31
  (o) => {
37
- n[e] = o;
32
+ e[t] = o;
38
33
  }
39
34
  );
40
35
  }
41
- const _ = "onGet", z = "onChanging", H = "onChange";
42
- function x(n, e, o) {
43
- const r = o.onPropChanging, d = o.onPropChange;
44
- return new Proxy(n, {
45
- get(g, s, f) {
46
- var c;
47
- const y = (c = o[s]) == null ? void 0 : c.onGet;
48
- if (y)
49
- return y();
50
- const v = e.get(String(s));
51
- return v ? v.get() : Reflect.get(g, s, f);
36
+ const L = "onGet", N = "onChanging", S = "onChange";
37
+ function D(e, t, o) {
38
+ const i = o.onPropChanging, d = o.onPropChange;
39
+ return new Proxy(e, {
40
+ get(g, c, u) {
41
+ const C = o[c]?.onGet;
42
+ if (C)
43
+ return C();
44
+ const y = t.get(String(c));
45
+ return y ? y.get() : Reflect.get(g, c, u);
52
46
  },
53
- set(g, s, f, y) {
54
- var k, t;
55
- const v = g[s], c = (k = o[s]) == null ? void 0 : k.onChanging;
56
- if (c && !c(v, f) || r && !r(s, v, f))
47
+ set(g, c, u, C) {
48
+ const y = g[c], v = o[c]?.onChanging;
49
+ if (v && !v(y, u) || i && !i(c, y, u))
57
50
  return !0;
58
- const O = A(() => Reflect.set(g, s, f, y)), b = e.get(s);
59
- b != null && b.set && b.set(f);
60
- const $ = (t = o[s]) == null ? void 0 : t.onChange;
61
- return $ && $(f), d && d(s, f), O;
51
+ const a = E(() => Reflect.set(g, c, u, C)), n = t.get(c);
52
+ n?.set && n.set(u);
53
+ const r = o[c]?.onChange;
54
+ return r && r(u), d && d(c, u), a;
62
55
  }
63
56
  });
64
57
  }
65
- function B(n) {
66
- return n.replace(/^./, n[0].toUpperCase());
58
+ function b(e) {
59
+ return e.replace(/^./, e[0].toUpperCase());
67
60
  }
68
- function T(n, e) {
69
- var b, $, k;
70
- const o = n.msgBus, r = n.view, d = F((t) => typeof r == "function" ? r(t) : /* @__PURE__ */ G(N, { children: t.children }));
61
+ function F(e, t) {
62
+ const o = e.msgBus, i = e.view, d = j((n) => typeof i == "function" ? i(n) : /* @__PURE__ */ O(B, { children: n.children }));
71
63
  let g = {
72
- ...n.props,
73
- ...n.methods,
64
+ ...e.props,
65
+ ...e.methods,
74
66
  // view: component.view,
75
67
  // View: ViewerFC,
76
68
  View: d,
77
69
  msgBus: o
78
70
  };
79
- if (n.children)
80
- for (const [t, i] of Object.entries(n.children))
81
- if (typeof i == "function") {
82
- const l = (h) => {
83
- const u = i(h);
84
- return /* @__PURE__ */ G(u.View, {});
71
+ if (e.children)
72
+ for (const [n, r] of Object.entries(e.children))
73
+ if (typeof r == "function") {
74
+ const s = (h) => {
75
+ const f = r(h);
76
+ return /* @__PURE__ */ O(f.View, {});
85
77
  };
86
- Reflect.set(g, B(t), l);
78
+ Reflect.set(g, b(n), s);
87
79
  } else
88
- Reflect.set(g, t, i);
89
- if (n.msgBroker) {
90
- const t = n.msgBroker.provide;
91
- if (t)
92
- for (const [l, h] of Object.entries(t))
93
- for (const [u, C] of Object.entries(h))
80
+ Reflect.set(g, n, r);
81
+ if (e.msgBroker) {
82
+ const n = e.msgBroker.provide;
83
+ if (n)
84
+ for (const [s, h] of Object.entries(n))
85
+ for (const [f, l] of Object.entries(h))
94
86
  o.provide({
95
- ...C,
96
- channel: l,
97
- group: u
87
+ ...l,
88
+ channel: s,
89
+ group: f
98
90
  });
99
- const i = n.msgBroker.subscribe;
100
- if (i)
101
- for (const [l, h] of Object.entries(i))
102
- for (const [u, C] of Object.entries(h))
91
+ const r = e.msgBroker.subscribe;
92
+ if (r)
93
+ for (const [s, h] of Object.entries(r))
94
+ for (const [f, l] of Object.entries(h))
103
95
  o.on({
104
- ...C,
105
- channel: l,
106
- group: u
96
+ ...l,
97
+ channel: s,
98
+ group: f
107
99
  });
108
100
  }
109
- const s = /* @__PURE__ */ new Map();
110
- for (const [t, i] of Object.entries(e))
111
- V(i) ? s.set(t, i) : Reflect.set(g, t, i);
112
- const f = {};
113
- if (n.props)
114
- for (const t of Object.keys(n.props))
115
- f[t] = j.ref;
116
- if (n.methods)
117
- for (const t of Object.keys(n.methods))
118
- f[t] = !1;
119
- f.View = !1, f.msgBus = !1;
120
- const y = {
121
- onPropChanging: e != null && e.onPropChanging || (b = n.events) != null && b.onPropChanging ? (t, i, l) => {
122
- var C;
123
- let h = !0, u = e.onPropChanging;
124
- return u && (h = u(String(t), i, l)), h && (u = (C = n.events) == null ? void 0 : C.onPropChanging, u && (h = u(String(t), i, l))), h;
101
+ const c = /* @__PURE__ */ new Map();
102
+ for (const [n, r] of Object.entries(t))
103
+ I(r) ? c.set(n, r) : Reflect.set(g, n, r);
104
+ const u = {};
105
+ if (e.props)
106
+ for (const n of Object.keys(e.props))
107
+ u[n] = $.ref;
108
+ if (e.methods)
109
+ for (const n of Object.keys(e.methods))
110
+ u[n] = !1;
111
+ u.View = !1, u.msgBus = !1;
112
+ const C = {
113
+ onPropChanging: t?.onPropChanging || e.events?.onPropChanging ? (n, r, s) => {
114
+ let h = !0, f = t.onPropChanging;
115
+ return f && (h = f(String(n), r, s)), h && (f = e.events?.onPropChanging, f && (h = f(String(n), r, s))), h;
125
116
  } : void 0,
126
- onPropChange: e != null && e.onPropChange || ($ = n.events) != null && $.onPropChange ? (t, i) => {
127
- var l, h, u;
128
- (l = e.onPropChange) == null || l.call(e, String(t), i), (u = (h = n.events).onPropChange) == null || u.call(h, String(t), i);
117
+ onPropChange: t?.onPropChange || e.events?.onPropChange ? (n, r) => {
118
+ t.onPropChange?.(String(n), r), e.events.onPropChange?.(String(n), r);
129
119
  } : void 0
130
120
  };
131
- function v(t) {
132
- const i = `${_}${B(t)}`;
133
- return e[i] || n.events[i];
121
+ function y(n) {
122
+ const r = `${L}${b(n)}`;
123
+ return t[r] || e.events[r];
134
124
  }
135
- function c(t) {
136
- const i = `${z}${B(t)}`;
137
- return (l, h) => {
138
- let u = !0, C = e[i];
139
- return C && (u = C(l, h)), u && (C = n.events[i], C && (u = C(l, h))), u;
140
- };
125
+ function v(n) {
126
+ const r = `${N}${b(n)}`;
127
+ return ((s, h) => {
128
+ let f = !0, l = t[r];
129
+ return l && (f = l(s, h)), f && (l = e.events[r], l && (f = l(s, h))), f;
130
+ });
141
131
  }
142
- function O(t) {
143
- const i = `${H}${B(t)}`;
144
- return (l) => {
145
- var h, u, C;
146
- (h = e[i]) == null || h.call(e, l), (C = (u = n.events)[i]) == null || C.call(u, l);
147
- };
132
+ function a(n) {
133
+ const r = `${S}${b(n)}`;
134
+ return ((s) => {
135
+ t[r]?.(s), e.events[r]?.(s);
136
+ });
148
137
  }
149
- if (n.props)
150
- for (const t of Object.keys(n.props))
151
- y[t] = {
152
- onGet: v(t),
153
- onChanging: c(t),
154
- onChange: O(t)
138
+ if (e.props)
139
+ for (const n of Object.keys(e.props))
140
+ C[n] = {
141
+ onGet: y(n),
142
+ onChanging: v(n),
143
+ onChange: a(n)
155
144
  };
156
- return g = j(g, f), g = x(g, s, y), (k = n.events) != null && k.onInit && n.events.onInit(g), e != null && e.onInit && e.onInit(g), g;
145
+ return g = $(g, u), g = D(g, c, C), e.events?.onInit && e.events.onInit(g), t?.onInit && t.onInit(g), g;
157
146
  }
158
- function Z(n, e) {
159
- const o = M(() => T(n, e)), r = o.current;
160
- return S(() => {
161
- var d, g, s, f, y, v;
147
+ function T(e, t) {
148
+ const o = R(() => F(e, t)), i = o.current;
149
+ return G(() => {
162
150
  try {
163
- (g = (d = n.events) == null ? void 0 : d.onLayout) == null || g.call(d, r), (s = e == null ? void 0 : e.onLayout) == null || s.call(e, r);
164
- } catch (c) {
165
- (y = (f = n.events) == null ? void 0 : f.onError) == null || y.call(f, r, c), (v = e == null ? void 0 : e.onError) == null || v.call(e, r, c);
151
+ e.events?.onLayout?.(i), t?.onLayout?.(i);
152
+ } catch (d) {
153
+ e.events?.onError?.(i, d), t?.onError?.(i, d);
166
154
  }
167
155
  return () => {
168
- var c, O, b;
169
- (O = (c = n.events) == null ? void 0 : c.onLayoutDestroy) == null || O.call(c, r), (b = e == null ? void 0 : e.onLayoutDestroy) == null || b.call(e, r), o.current = null;
156
+ e.events?.onLayoutDestroy?.(i), t?.onLayoutDestroy?.(i), o.current = null;
170
157
  };
171
- }, []), D(() => {
172
- var d, g, s, f, y, v;
158
+ }, []), w(() => {
173
159
  try {
174
- (g = (d = n.events) == null ? void 0 : d.onReady) == null || g.call(d, r), (s = e == null ? void 0 : e.onReady) == null || s.call(e, r);
175
- } catch (c) {
176
- (y = (f = n.events) == null ? void 0 : f.onError) == null || y.call(f, r, c), (v = e == null ? void 0 : e.onError) == null || v.call(e, r, c);
160
+ e.events?.onReady?.(i), t?.onReady?.(i);
161
+ } catch (d) {
162
+ e.events?.onError?.(i, d), t?.onError?.(i, d);
177
163
  }
178
164
  return () => {
179
- var c, O, b;
180
- (O = (c = n.events) == null ? void 0 : c.onDestroy) == null || O.call(c, r), (b = e == null ? void 0 : e.onDestroy) == null || b.call(e, r);
165
+ e.events?.onDestroy?.(i), t?.onDestroy?.(i);
181
166
  };
182
167
  }, []), o.current;
183
168
  }
184
- function m(n) {
169
+ function U(e) {
185
170
  return (o) => {
186
- const r = n(o);
187
- return /* @__PURE__ */ G(r.View, { ...o });
171
+ const i = e(o);
172
+ return /* @__PURE__ */ O(i.View, { ...o });
188
173
  };
189
174
  }
190
175
  export {
191
- X as bind,
192
- Y as bindProp,
193
- m as getFC,
194
- V as isBinding,
195
- w as symbols,
196
- Z as useComponent
176
+ H as bind,
177
+ x as bindProp,
178
+ U as getFC,
179
+ I as isBinding,
180
+ P as symbols,
181
+ T as useComponent
197
182
  };
198
183
  //# sourceMappingURL=componentModel.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"componentModel.es.js","sources":["../../src/componentModel/componentModel.tsx"],"sourcesContent":["import {\r\n AllHTMLAttributes,\r\n PropsWithChildren,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n FC,\r\n ReactNode,\r\n CSSProperties\r\n} from \"react\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { $CG_IN, $CG_OUT, MsgBus, MsgBusProviderParams, MsgBusStruct, MsgBusSubscriberParams } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { MaybePromise, SafeKey, Skip } from \"@actdim/utico/typeCore\";\r\nimport { observer } from \"mobx-react-lite\";\r\nimport { observable, observe, runInAction } from \"mobx\";\r\nimport { useLazyRef } from \"@/reactHooks\";\r\n\r\nexport type MsgBusChannelGroupProviderParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN // keyof TStruct[TChannel]\r\n> = Skip<MsgBusProviderParams<TStruct, TChannel, TGroup>, \"channel\" | \"group\">;\r\n\r\nexport type MsgBusChannelGroupSubscriberParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN // keyof TStruct[TChannel]\r\n> = Skip<MsgBusSubscriberParams<TStruct, TChannel, TGroup>, \"channel\" | \"group\">;\r\n\r\n// MsgBusScope\r\nexport type MsgBusBrokerScope<\r\n TStruct extends MsgBusStruct /*= MsgBusStruct*/,\r\n TKeysToProvide extends keyof TStruct = keyof TStruct,\r\n TKeysToSubscribe extends keyof TStruct = keyof TStruct,\r\n TKeysToPublish extends keyof TStruct = keyof TStruct\r\n> = {\r\n provide?: TKeysToProvide;\r\n // consume\r\n subscribe?: TKeysToSubscribe;\r\n // produce\r\n publish?: TKeysToPublish;\r\n};\r\n\r\nexport type ComponentPropStruct = Record<string, any>;\r\n// export type ComponentPropStruct = {\r\n// [prop: string]: any;\r\n// };\r\n\r\nexport type ComponentMethodStruct = Record<string, Function>;\r\n// export type ComponentMethodStruct = {\r\n// [action: string]: Function;\r\n// };\r\n\r\n// export type ComponentRefStruct = Record<string, ComponentStruct<TMsgBusStruct, T>>;\r\nexport type ComponentRefStruct = {\r\n [name: string]: ComponentStruct | ((params: any) => ComponentStruct);\r\n};\r\n\r\nexport type ComponentStructBase<\r\n TMsgBusStruct extends MsgBusStruct = MsgBusStruct,\r\n TPropStruct extends ComponentPropStruct = ComponentPropStruct,\r\n TMsgScope extends MsgBusBrokerScope<TMsgBusStruct> = MsgBusBrokerScope<TMsgBusStruct>\r\n> = {\r\n props?: TPropStruct;\r\n methods?: ComponentMethodStruct;\r\n children?: ComponentRefStruct;\r\n msgScope?: TMsgScope;\r\n};\r\n\r\n// ComponentShape\r\nexport type ComponentStruct<\r\n TMsgBusStruct extends MsgBusStruct = MsgBusStruct,\r\n T extends ComponentStructBase<TMsgBusStruct> = ComponentStructBase<TMsgBusStruct>\r\n> = T & {\r\n msgBus: TMsgBusStruct;\r\n};\r\n\r\nexport type MsgBusBroker<TStructToProvide extends MsgBusStruct = MsgBusStruct, TStructToSubscribe extends MsgBusStruct = MsgBusStruct> = {\r\n // providers\r\n provide?: {\r\n [TChannel in keyof TStructToProvide]: {\r\n [TGroup in keyof Skip<TStructToProvide[TChannel], typeof $CG_OUT>]?: MsgBusChannelGroupProviderParams<\r\n TStructToProvide,\r\n TChannel,\r\n TGroup\r\n >;\r\n };\r\n };\r\n // subscribers\r\n subscribe?: {\r\n [TChannel in keyof TStructToSubscribe]: {\r\n [TGroup in keyof TStructToSubscribe[TChannel]]?: MsgBusChannelGroupSubscriberParams<TStructToSubscribe, TChannel, TGroup>;\r\n };\r\n };\r\n};\r\n\r\ntype ValueConverter<TTo, TFrom> = {\r\n // ConvertFrom\r\n convert(value: TFrom): TTo;\r\n // ConvertTo\r\n convertBack(value: TTo): TFrom;\r\n};\r\n\r\ntype ValidationResult = {\r\n valid: boolean;\r\n message: string;\r\n};\r\n\r\ntype Validator<T> = {\r\n options: {\r\n blur: boolean;\r\n };\r\n validate: (value: T) => MaybePromise<ValidationResult>;\r\n};\r\n\r\nexport const symbols = {\r\n $isBinding: Symbol(\"$isBinding\")\r\n};\r\n\r\nexport interface IBinding<T = any, TFrom = any> {\r\n // getter\r\n readonly get: () => T;\r\n // setter\r\n readonly set: (value: T) => void;\r\n readonly converter: ValueConverter<T, TFrom>;\r\n readonly validator: Validator<T>;\r\n readonly readOnly: boolean;\r\n [symbols.$isBinding]: boolean;\r\n}\r\n\r\nclass Binding<T = any, TFrom = any> implements IBinding<any, any> {\r\n // getter\r\n readonly get: () => T;\r\n // setter\r\n readonly set: (value: T) => void;\r\n readonly converter: ValueConverter<T, TFrom>;\r\n readonly validator: Validator<T>;\r\n readonly readOnly: boolean;\r\n constructor(get: () => T, set?: (value: T) => void, converter?: ValueConverter<T, TFrom>, validator?: Validator<T>) {\r\n this.get = get;\r\n this.set = set;\r\n this.converter = converter;\r\n this.validator = validator;\r\n this.readOnly = !!set;\r\n this[symbols.$isBinding] = true;\r\n }\r\n [symbols.$isBinding]: boolean;\r\n}\r\n\r\nexport function isBinding(obj: any): obj is IBinding {\r\n return obj[symbols.$isBinding] === true;\r\n}\r\n\r\nexport function bind<T, TFrom = any>(\r\n get: () => T,\r\n set?: (value: T) => void,\r\n converter?: ValueConverter<T, TFrom>,\r\n validator?: Validator<T>\r\n) {\r\n return new Binding(get, set, converter, validator);\r\n}\r\n\r\nexport function bindProp<T extends object, P extends keyof T>(obj: T, prop: P) {\r\n return new Binding(\r\n () => obj[prop],\r\n (value: T[P]) => {\r\n obj[prop] = value;\r\n }\r\n );\r\n}\r\n\r\nexport type ComponentPropSource<T> = T | Binding<T>;\r\n\r\nexport type ComponentPropParams<TPropStruct extends ComponentPropStruct> = {\r\n [P in keyof TPropStruct]?: ComponentPropSource<TPropStruct[P]>;\r\n};\r\n\r\n// const $ON_PROP_CHANGING = \"onPropChanging\";\r\n// const $ON_PROP_CHANGE = \"onPropChange\";\r\n\r\nconst $ON_GET = \"onGet\";\r\n// const $ON_BEFORE_SET = \"onBeforeSet\";\r\nconst $ON_CHANGING = \"onChanging\";\r\nconst $ON_CHANGE = \"onChange\";\r\n// const $ON_SET = \"onSet\";\r\n\r\ntype PropValueChangingHandler<TProp = PropKey> = (prop: TProp, oldValue: any, newValue: any) => boolean;\r\ntype PropValueChangeHandler<TProp = PropKey> = (prop: TProp, value: any) => void;\r\n\r\n// BeforeValueSetHandler\r\ntype ValueChangingHandler<T = any> = (oldValue: T, newValue: T) => boolean;\r\n// ValueSetHandler\r\ntype ValueChangeHandler<T = any> = (value: T) => void;\r\n\r\ntype ComponentEvents<TStruct extends ComponentStruct = ComponentStruct> = {\r\n onPropChanging?: PropValueChangingHandler<keyof TStruct[\"props\"]>;\r\n onPropChange?: PropValueChangeHandler<keyof TStruct[\"props\"]>;\r\n onInit?: (model: ComponentModel<TStruct>) => void;\r\n onLayout?: (model: ComponentModel<TStruct>) => void;\r\n onReady?: (model: ComponentModel<TStruct>) => void;\r\n onLayoutDestroy?: (model: ComponentModel<TStruct>) => void; // onLayoutCleanup\r\n onDestroy?: (model: ComponentModel<TStruct>) => void; // onDispose/onCleanup\r\n onError?: (model: ComponentModel<TStruct>, error: any) => void;\r\n} & {\r\n [P in keyof TStruct[\"props\"] as `${typeof $ON_GET}${Capitalize<P & string>}`]?: () => TStruct[\"props\"][P];\r\n} & {\r\n [P in keyof TStruct[\"props\"] as `${typeof $ON_CHANGING}${Capitalize<P & string>}`]?: ValueChangingHandler<TStruct[\"props\"]>;\r\n} & {\r\n [P in keyof TStruct[\"props\"] as `${typeof $ON_CHANGE}${Capitalize<P & string>}`]?: ValueChangeHandler<TStruct[\"props\"]>;\r\n};\r\n\r\n// AllHTMLAttributes<JSX.Element>\r\n\r\n// type ComponentViewerProps = {\r\n// render?: boolean;\r\n// view?: () => ReactNode;\r\n// } & PropsWithChildren;\r\n\r\ntype ComponentViewProps = {\r\n render?: boolean;\r\n} & PropsWithChildren;\r\n\r\ntype ComponentViewFn = (props?: ComponentViewProps) => ReactNode; // JSX.Element\r\n\r\ntype PublicKeys<T> = {\r\n [K in keyof T]: K extends `_${string}` ? never : K;\r\n}[keyof T];\r\n\r\nexport type Component<TStruct extends ComponentStruct> = {\r\n props?: TStruct[\"props\"];\r\n methods?: TStruct[\"methods\"];\r\n children?: ComponentChildren<TStruct[\"children\"]>;\r\n events?: ComponentEvents<TStruct>;\r\n // msgs?\r\n msgBroker?: MsgBusBroker<\r\n Pick<TStruct[\"msgBus\"], SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"provide\"]>>,\r\n Pick<TStruct[\"msgBus\"], SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"subscribe\"]>>\r\n >;\r\n msgBus?: MsgBus<\r\n // TStruct[\"msgBus\"]\r\n Pick<\r\n TStruct[\"msgBus\"],\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"provide\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"subscribe\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"publish\"]>\r\n >\r\n >;\r\n view?: ComponentViewFn;\r\n};\r\n\r\ntype ComponentChildren<TRefStruct extends ComponentRefStruct> = {\r\n [P in keyof TRefStruct]: TRefStruct[P] extends (params: infer TParams) => infer T\r\n ? T extends ComponentStruct\r\n ? (params: TParams) => ComponentModel<T>\r\n : never\r\n : TRefStruct[P] extends ComponentStruct\r\n ? ComponentModel<TRefStruct[P]>\r\n : never;\r\n};\r\n\r\ntype ComponentModelChildren<TRefStruct extends ComponentRefStruct> = {\r\n [P in keyof TRefStruct as TRefStruct[P] extends Function ? `${Capitalize<P & string>}` : P]: TRefStruct[P] extends (\r\n params: infer TParams\r\n ) => infer T\r\n ? T extends ComponentStruct\r\n ? FC<ComponentParams<T> & TParams>\r\n : never\r\n : TRefStruct[P] extends ComponentStruct\r\n ? ComponentModel<TRefStruct[P]>\r\n : never;\r\n};\r\n\r\nexport type ComponentModelBase<TStruct extends ComponentStruct = ComponentStruct> = {\r\n readonly msgBus?: MsgBus<\r\n // TStruct[\"msgBus\"]\r\n Pick<\r\n TStruct[\"msgBus\"],\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"provide\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"subscribe\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"publish\"]>\r\n >\r\n >;\r\n\r\n readonly View: ComponentViewFn;\r\n};\r\n\r\nexport type ComponentModel<TStruct extends ComponentStruct = ComponentStruct> = TStruct[\"props\"] &\r\n TStruct[\"methods\"] &\r\n ComponentModelChildren<TStruct[\"children\"]> &\r\n ComponentModelBase<TStruct>;\r\n\r\n// style: CSSProperties;\r\n\r\ntype PropEventHandlers = {\r\n onGet?: () => any;\r\n onChanging?: (oldValue: any, newValue: any) => boolean;\r\n onChange?: (value: any) => void;\r\n};\r\n\r\ntype PropKey = string | symbol;\r\ntype ProxyEventHandlers = {\r\n onPropChanging?: PropValueChangingHandler<PropKey>;\r\n onPropChange?: PropValueChangeHandler<PropKey>;\r\n} & Record<PropKey, PropEventHandlers>;\r\n\r\n// ComponentConfig\r\nexport type ComponentParams<TStruct extends ComponentStruct = ComponentStruct> = ComponentPropParams<TStruct[\"props\"]> &\r\n ComponentEvents<TStruct>; // & PropsWithChildren\r\n\r\nconst blankView = () => null;\r\n\r\nfunction createProxy(state: any, bindings: Map<PropKey, IBinding>, proxyEventHandlers: ProxyEventHandlers) {\r\n const onPropChanging = proxyEventHandlers.onPropChanging;\r\n const onPropChange = proxyEventHandlers.onPropChange;\r\n return new Proxy(state, {\r\n get(obj, prop, receiver) {\r\n const onGet = proxyEventHandlers[prop]?.onGet;\r\n if (onGet) {\r\n return onGet();\r\n }\r\n const binding = bindings.get(String(prop));\r\n if (binding) {\r\n return binding.get();\r\n }\r\n return Reflect.get(obj, prop, receiver);\r\n },\r\n set(obj, prop, value, receiver) {\r\n const oldValue = obj[prop];\r\n\r\n const onChanging = proxyEventHandlers[prop]?.onChanging;\r\n if (onChanging) {\r\n const shouldChange = onChanging(oldValue, value);\r\n if (!shouldChange) {\r\n return true;\r\n }\r\n }\r\n\r\n if (onPropChanging) {\r\n const shouldChange = onPropChanging(prop, oldValue, value);\r\n if (!shouldChange) {\r\n return true;\r\n }\r\n }\r\n\r\n const result = runInAction(() => {\r\n return Reflect.set(obj, prop, value, receiver);\r\n });\r\n\r\n const binding = bindings.get(prop);\r\n\r\n if (binding?.set) {\r\n binding.set(value);\r\n }\r\n\r\n const onChange = proxyEventHandlers[prop]?.onChange;\r\n if (onChange) {\r\n onChange(value);\r\n }\r\n\r\n if (onPropChange) {\r\n onPropChange(prop, value);\r\n }\r\n\r\n return result;\r\n }\r\n });\r\n}\r\n\r\nfunction capitalize(name: string) {\r\n return name.replace(/^./, name[0].toUpperCase());\r\n}\r\n\r\nfunction asyncToGeneratorFlow(asyncFn: (...args: any[]) => Promise<any>) {\r\n return function* (...args: any[]) {\r\n const result = yield asyncFn(...args);\r\n return result;\r\n };\r\n}\r\n\r\n// const ViewerFC = observer((props: ComponentViewerProps) => {\r\n// if (typeof props.view === \"function\") {\r\n// return props.view();\r\n// }\r\n// return <>{props.children}</>;\r\n// });\r\n\r\nfunction createModel<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n params: ComponentParams<TStruct>\r\n): ComponentModel<TStruct> {\r\n const msgBus = component.msgBus;\r\n const view = component.view;\r\n\r\n const ViewFC = observer((props: ComponentViewProps) => {\r\n if (typeof view === \"function\") {\r\n return view(props);\r\n }\r\n return <>{props.children}</>;\r\n });\r\n\r\n let model: ComponentModel<TStruct> = {\r\n ...component.props,\r\n ...component.methods,\r\n // view: component.view,\r\n // View: ViewerFC,\r\n View: ViewFC,\r\n msgBus: msgBus\r\n };\r\n if (component.children) {\r\n for (const [key, value] of Object.entries(component.children)) {\r\n if (typeof value == \"function\") {\r\n // observer\r\n const ChildViewFC: ComponentViewFn = (props) => {\r\n const model = value(props) as ComponentModel;\r\n return <model.View />;\r\n // if (typeof model.view === \"function\") {\r\n // return model.view(props);\r\n // }\r\n // return <>{props.children}</>;\r\n // return <ViewerFC view={model.view} />;\r\n };\r\n Reflect.set(model, capitalize(key), ChildViewFC);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n }\r\n if (component.msgBroker) {\r\n const providers = component.msgBroker.provide;\r\n if (providers) {\r\n for (const [channel, providerGroups] of Object.entries(providers)) {\r\n for (const [group, provider] of Object.entries(providerGroups)) {\r\n msgBus.provide({\r\n ...provider,\r\n channel: channel,\r\n group: group\r\n });\r\n }\r\n }\r\n }\r\n const subscribers = component.msgBroker.subscribe;\r\n if (subscribers) {\r\n for (const [channel, subscriberGroups] of Object.entries(subscribers)) {\r\n for (const [group, subscriber] of Object.entries(subscriberGroups)) {\r\n msgBus.on({\r\n ...subscriber,\r\n channel: channel,\r\n group: group\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n const bindings = new Map<PropKey, IBinding>();\r\n // Reflect.ownKeys\r\n for (const [key, value] of Object.entries(params)) {\r\n if (isBinding(value)) {\r\n bindings.set(key, value);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n\r\n // decorators\r\n const annotationMap: Record<string, any> = {};\r\n\r\n if (component.props) {\r\n for (const key of Object.keys(component.props)) {\r\n annotationMap[key] = observable.ref;\r\n }\r\n }\r\n if (component.methods) {\r\n for (const key of Object.keys(component.methods)) {\r\n annotationMap[key] = false;\r\n }\r\n }\r\n\r\n annotationMap[\"View\" satisfies keyof ComponentModelBase<TStruct>] = false;\r\n annotationMap[\"msgBus\" satisfies keyof ComponentModelBase<TStruct>] = false;\r\n // annotationMap[\"view\" satisfies keyof Component<TStruct>] = false;\r\n\r\n const proxyEventHandlers: Pick<ProxyEventHandlers, \"onPropChanging\" | \"onPropChange\"> = {\r\n onPropChanging:\r\n params?.onPropChanging || component.events?.onPropChanging\r\n ? (prop, oldValue, newValue) => {\r\n let result = true;\r\n let handler = params.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = component.events?.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }\r\n : undefined,\r\n onPropChange:\r\n params?.onPropChange || component.events?.onPropChange\r\n ? (prop, value) => {\r\n params.onPropChange?.(String(prop), value);\r\n component.events.onPropChange?.(String(prop), value);\r\n }\r\n : undefined\r\n };\r\n\r\n function resolveOnGetEventHandler(prop: string) {\r\n const key = `${$ON_GET}${capitalize(prop)}`;\r\n return params[key] || component.events[key];\r\n }\r\n\r\n function resolveOnChangingEventHandler(prop: string) {\r\n const key = `${$ON_CHANGING}${capitalize(prop)}`;\r\n return ((oldValue: any, newValue: any) => {\r\n let result = true;\r\n let handler = params[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = component.events[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }) as ValueChangingHandler;\r\n }\r\n\r\n function resolveOnChangeEventHandler(prop: string) {\r\n const key = `${$ON_CHANGE}${capitalize(prop)}`;\r\n return ((value: any) => {\r\n (params[key] as ValueChangeHandler<any>)?.(value);\r\n (component.events[key] as ValueChangeHandler<any>)?.(value);\r\n }) as ValueChangeHandler;\r\n }\r\n\r\n if (component.props) {\r\n for (const prop of Object.keys(component.props)) {\r\n proxyEventHandlers[prop] = {\r\n onGet: resolveOnGetEventHandler(prop),\r\n onChanging: resolveOnChangingEventHandler(prop),\r\n onChange: resolveOnChangeEventHandler(prop)\r\n };\r\n }\r\n }\r\n\r\n model = observable(model, annotationMap);\r\n\r\n model = createProxy(model, bindings, proxyEventHandlers);\r\n\r\n if (component.events?.onInit) {\r\n component.events.onInit(model);\r\n }\r\n\r\n if (params?.onInit) {\r\n params.onInit(model);\r\n }\r\n\r\n return model;\r\n}\r\n\r\nexport function useComponent<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n params: ComponentParams<TStruct>\r\n): ComponentModel<TStruct> {\r\n const ref = useLazyRef(() => createModel(component, params));\r\n const model = ref.current;\r\n\r\n useLayoutEffect(() => {\r\n try {\r\n component.events?.onLayout?.(model);\r\n params?.onLayout?.(model);\r\n } catch (err) {\r\n component.events?.onError?.(model, err);\r\n params?.onError?.(model, err);\r\n }\r\n\r\n return () => {\r\n component.events?.onLayoutDestroy?.(model);\r\n params?.onLayoutDestroy?.(model);\r\n // ref.current?.dispose();\r\n ref.current = null;\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n try {\r\n component.events?.onReady?.(model);\r\n params?.onReady?.(model);\r\n } catch (err) {\r\n component.events?.onError?.(model, err);\r\n params?.onError?.(model, err);\r\n }\r\n return () => {\r\n component.events?.onDestroy?.(model);\r\n params?.onDestroy?.(model);\r\n };\r\n }, []);\r\n\r\n return ref.current;\r\n}\r\n\r\n// asFC/toFC\r\nexport function getFC<TStruct extends ComponentStruct>(\r\n factory: (params: ComponentParams<TStruct>) => ComponentModel<TStruct>\r\n): FC<ComponentParams<TStruct>> {\r\n // observer\r\n const fc = (params: ComponentParams<TStruct> & PropsWithChildren) => {\r\n // modelHook\r\n const model = factory(params); // without useRef!\r\n // return model.view();\r\n return <model.View {...params} />;\r\n // return <ViewerFC {...params} view={model.view} />;\r\n };\r\n return fc;\r\n}\r\n"],"names":["symbols","_a","Binding","get","set","converter","validator","__publicField","isBinding","obj","bind","bindProp","prop","value","$ON_GET","$ON_CHANGING","$ON_CHANGE","createProxy","state","bindings","proxyEventHandlers","onPropChanging","onPropChange","receiver","onGet","binding","oldValue","onChanging","result","runInAction","onChange","_b","capitalize","name","createModel","component","params","msgBus","view","ViewFC","observer","props","jsx","Fragment","model","key","ChildViewFC","providers","channel","providerGroups","group","provider","subscribers","subscriberGroups","subscriber","annotationMap","observable","newValue","handler","_c","resolveOnGetEventHandler","resolveOnChangingEventHandler","resolveOnChangeEventHandler","useComponent","ref","useLazyRef","useLayoutEffect","err","_e","_d","_f","useEffect","getFC","factory"],"mappings":"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"}
1
+ {"version":3,"file":"componentModel.es.js","sources":["../../src/componentModel/componentModel.tsx"],"sourcesContent":["import {\r\n AllHTMLAttributes,\r\n PropsWithChildren,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n FC,\r\n ReactNode,\r\n CSSProperties\r\n} from \"react\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { $CG_IN, $CG_OUT, MsgBus, MsgBusProviderParams, MsgBusStruct, MsgBusSubscriberParams } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { MaybePromise, SafeKey, Skip } from \"@actdim/utico/typeCore\";\r\nimport { observer } from \"mobx-react-lite\";\r\nimport { observable, observe, runInAction } from \"mobx\";\r\nimport { useLazyRef } from \"@/reactHooks\";\r\n\r\nexport type MsgBusChannelGroupProviderParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN // keyof TStruct[TChannel]\r\n> = Skip<MsgBusProviderParams<TStruct, TChannel, TGroup>, \"channel\" | \"group\">;\r\n\r\nexport type MsgBusChannelGroupSubscriberParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN // keyof TStruct[TChannel]\r\n> = Skip<MsgBusSubscriberParams<TStruct, TChannel, TGroup>, \"channel\" | \"group\">;\r\n\r\n// MsgBusScope\r\nexport type MsgBusBrokerScope<\r\n TStruct extends MsgBusStruct /*= MsgBusStruct*/,\r\n TKeysToProvide extends keyof TStruct = keyof TStruct,\r\n TKeysToSubscribe extends keyof TStruct = keyof TStruct,\r\n TKeysToPublish extends keyof TStruct = keyof TStruct\r\n> = {\r\n provide?: TKeysToProvide;\r\n // consume\r\n subscribe?: TKeysToSubscribe;\r\n // produce\r\n publish?: TKeysToPublish;\r\n};\r\n\r\nexport type ComponentPropStruct = Record<string, any>;\r\n// export type ComponentPropStruct = {\r\n// [prop: string]: any;\r\n// };\r\n\r\nexport type ComponentMethodStruct = Record<string, Function>;\r\n// export type ComponentMethodStruct = {\r\n// [action: string]: Function;\r\n// };\r\n\r\n// export type ComponentRefStruct = Record<string, ComponentStruct<TMsgBusStruct, T>>;\r\nexport type ComponentRefStruct = {\r\n [name: string]: ComponentStruct | ((params: any) => ComponentStruct);\r\n};\r\n\r\nexport type ComponentStructBase<\r\n TMsgBusStruct extends MsgBusStruct = MsgBusStruct,\r\n TPropStruct extends ComponentPropStruct = ComponentPropStruct,\r\n TMsgScope extends MsgBusBrokerScope<TMsgBusStruct> = MsgBusBrokerScope<TMsgBusStruct>\r\n> = {\r\n props?: TPropStruct;\r\n methods?: ComponentMethodStruct;\r\n children?: ComponentRefStruct;\r\n msgScope?: TMsgScope;\r\n};\r\n\r\n// ComponentShape\r\nexport type ComponentStruct<\r\n TMsgBusStruct extends MsgBusStruct = MsgBusStruct,\r\n T extends ComponentStructBase<TMsgBusStruct> = ComponentStructBase<TMsgBusStruct>\r\n> = T & {\r\n msgBus: TMsgBusStruct;\r\n};\r\n\r\nexport type MsgBusBroker<TStructToProvide extends MsgBusStruct = MsgBusStruct, TStructToSubscribe extends MsgBusStruct = MsgBusStruct> = {\r\n // providers\r\n provide?: {\r\n [TChannel in keyof TStructToProvide]: {\r\n [TGroup in keyof Skip<TStructToProvide[TChannel], typeof $CG_OUT>]?: MsgBusChannelGroupProviderParams<\r\n TStructToProvide,\r\n TChannel,\r\n TGroup\r\n >;\r\n };\r\n };\r\n // subscribers\r\n subscribe?: {\r\n [TChannel in keyof TStructToSubscribe]: {\r\n [TGroup in keyof TStructToSubscribe[TChannel]]?: MsgBusChannelGroupSubscriberParams<TStructToSubscribe, TChannel, TGroup>;\r\n };\r\n };\r\n};\r\n\r\ntype ValueConverter<TTo, TFrom> = {\r\n // ConvertFrom\r\n convert(value: TFrom): TTo;\r\n // ConvertTo\r\n convertBack(value: TTo): TFrom;\r\n};\r\n\r\ntype ValidationResult = {\r\n valid: boolean;\r\n message: string;\r\n};\r\n\r\ntype Validator<T> = {\r\n options: {\r\n blur: boolean;\r\n };\r\n validate: (value: T) => MaybePromise<ValidationResult>;\r\n};\r\n\r\nexport const symbols = {\r\n $isBinding: Symbol(\"$isBinding\")\r\n};\r\n\r\nexport interface IBinding<T = any, TFrom = any> {\r\n // getter\r\n readonly get: () => T;\r\n // setter\r\n readonly set: (value: T) => void;\r\n readonly converter: ValueConverter<T, TFrom>;\r\n readonly validator: Validator<T>;\r\n readonly readOnly: boolean;\r\n [symbols.$isBinding]: boolean;\r\n}\r\n\r\nclass Binding<T = any, TFrom = any> implements IBinding<any, any> {\r\n // getter\r\n readonly get: () => T;\r\n // setter\r\n readonly set: (value: T) => void;\r\n readonly converter: ValueConverter<T, TFrom>;\r\n readonly validator: Validator<T>;\r\n readonly readOnly: boolean;\r\n constructor(get: () => T, set?: (value: T) => void, converter?: ValueConverter<T, TFrom>, validator?: Validator<T>) {\r\n this.get = get;\r\n this.set = set;\r\n this.converter = converter;\r\n this.validator = validator;\r\n this.readOnly = !!set;\r\n this[symbols.$isBinding] = true;\r\n }\r\n [symbols.$isBinding]: boolean;\r\n}\r\n\r\nexport function isBinding(obj: any): obj is IBinding {\r\n return obj[symbols.$isBinding] === true;\r\n}\r\n\r\nexport function bind<T, TFrom = any>(\r\n get: () => T,\r\n set?: (value: T) => void,\r\n converter?: ValueConverter<T, TFrom>,\r\n validator?: Validator<T>\r\n) {\r\n return new Binding(get, set, converter, validator);\r\n}\r\n\r\nexport function bindProp<T extends object, P extends keyof T>(obj: T, prop: P) {\r\n return new Binding(\r\n () => obj[prop],\r\n (value: T[P]) => {\r\n obj[prop] = value;\r\n }\r\n );\r\n}\r\n\r\nexport type ComponentPropSource<T> = T | Binding<T>;\r\n\r\nexport type ComponentPropParams<TPropStruct extends ComponentPropStruct> = {\r\n [P in keyof TPropStruct]?: ComponentPropSource<TPropStruct[P]>;\r\n};\r\n\r\n// const $ON_PROP_CHANGING = \"onPropChanging\";\r\n// const $ON_PROP_CHANGE = \"onPropChange\";\r\n\r\nconst $ON_GET = \"onGet\";\r\n// const $ON_BEFORE_SET = \"onBeforeSet\";\r\nconst $ON_CHANGING = \"onChanging\";\r\nconst $ON_CHANGE = \"onChange\";\r\n// const $ON_SET = \"onSet\";\r\n\r\ntype PropValueChangingHandler<TProp = PropKey> = (prop: TProp, oldValue: any, newValue: any) => boolean;\r\ntype PropValueChangeHandler<TProp = PropKey> = (prop: TProp, value: any) => void;\r\n\r\n// BeforeValueSetHandler\r\ntype ValueChangingHandler<T = any> = (oldValue: T, newValue: T) => boolean;\r\n// ValueSetHandler\r\ntype ValueChangeHandler<T = any> = (value: T) => void;\r\n\r\ntype ComponentEvents<TStruct extends ComponentStruct = ComponentStruct> = {\r\n onPropChanging?: PropValueChangingHandler<keyof TStruct[\"props\"]>;\r\n onPropChange?: PropValueChangeHandler<keyof TStruct[\"props\"]>;\r\n onInit?: (model: ComponentModel<TStruct>) => void;\r\n onLayout?: (model: ComponentModel<TStruct>) => void;\r\n onReady?: (model: ComponentModel<TStruct>) => void;\r\n onLayoutDestroy?: (model: ComponentModel<TStruct>) => void; // onLayoutCleanup\r\n onDestroy?: (model: ComponentModel<TStruct>) => void; // onDispose/onCleanup\r\n onError?: (model: ComponentModel<TStruct>, error: any) => void;\r\n} & {\r\n [P in keyof TStruct[\"props\"] as `${typeof $ON_GET}${Capitalize<P & string>}`]?: () => TStruct[\"props\"][P];\r\n} & {\r\n [P in keyof TStruct[\"props\"] as `${typeof $ON_CHANGING}${Capitalize<P & string>}`]?: ValueChangingHandler<TStruct[\"props\"]>;\r\n} & {\r\n [P in keyof TStruct[\"props\"] as `${typeof $ON_CHANGE}${Capitalize<P & string>}`]?: ValueChangeHandler<TStruct[\"props\"]>;\r\n};\r\n\r\n// AllHTMLAttributes<JSX.Element>\r\n\r\n// type ComponentViewerProps = {\r\n// render?: boolean;\r\n// view?: () => ReactNode;\r\n// } & PropsWithChildren;\r\n\r\ntype ComponentViewProps = {\r\n render?: boolean;\r\n} & PropsWithChildren;\r\n\r\ntype ComponentViewFn = (props?: ComponentViewProps) => ReactNode; // JSX.Element\r\n\r\ntype PublicKeys<T> = {\r\n [K in keyof T]: K extends `_${string}` ? never : K;\r\n}[keyof T];\r\n\r\nexport type Component<TStruct extends ComponentStruct> = {\r\n props?: TStruct[\"props\"];\r\n methods?: TStruct[\"methods\"];\r\n children?: ComponentChildren<TStruct[\"children\"]>;\r\n events?: ComponentEvents<TStruct>;\r\n // msgs?\r\n msgBroker?: MsgBusBroker<\r\n Pick<TStruct[\"msgBus\"], SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"provide\"]>>,\r\n Pick<TStruct[\"msgBus\"], SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"subscribe\"]>>\r\n >;\r\n msgBus?: MsgBus<\r\n // TStruct[\"msgBus\"]\r\n Pick<\r\n TStruct[\"msgBus\"],\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"provide\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"subscribe\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"publish\"]>\r\n >\r\n >;\r\n view?: ComponentViewFn;\r\n};\r\n\r\ntype ComponentChildren<TRefStruct extends ComponentRefStruct> = {\r\n [P in keyof TRefStruct]: TRefStruct[P] extends (params: infer TParams) => infer T\r\n ? T extends ComponentStruct\r\n ? (params: TParams) => ComponentModel<T>\r\n : never\r\n : TRefStruct[P] extends ComponentStruct\r\n ? ComponentModel<TRefStruct[P]>\r\n : never;\r\n};\r\n\r\ntype ComponentModelChildren<TRefStruct extends ComponentRefStruct> = {\r\n [P in keyof TRefStruct as TRefStruct[P] extends Function ? `${Capitalize<P & string>}` : P]: TRefStruct[P] extends (\r\n params: infer TParams\r\n ) => infer T\r\n ? T extends ComponentStruct\r\n ? FC<ComponentParams<T> & TParams>\r\n : never\r\n : TRefStruct[P] extends ComponentStruct\r\n ? ComponentModel<TRefStruct[P]>\r\n : never;\r\n};\r\n\r\nexport type ComponentModelBase<TStruct extends ComponentStruct = ComponentStruct> = {\r\n readonly msgBus?: MsgBus<\r\n // TStruct[\"msgBus\"]\r\n Pick<\r\n TStruct[\"msgBus\"],\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"provide\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"subscribe\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"publish\"]>\r\n >\r\n >;\r\n\r\n readonly View: ComponentViewFn;\r\n};\r\n\r\nexport type ComponentModel<TStruct extends ComponentStruct = ComponentStruct> = TStruct[\"props\"] &\r\n TStruct[\"methods\"] &\r\n ComponentModelChildren<TStruct[\"children\"]> &\r\n ComponentModelBase<TStruct>;\r\n\r\n// style: CSSProperties;\r\n\r\ntype PropEventHandlers = {\r\n onGet?: () => any;\r\n onChanging?: (oldValue: any, newValue: any) => boolean;\r\n onChange?: (value: any) => void;\r\n};\r\n\r\ntype PropKey = string | symbol;\r\ntype ProxyEventHandlers = {\r\n onPropChanging?: PropValueChangingHandler<PropKey>;\r\n onPropChange?: PropValueChangeHandler<PropKey>;\r\n} & Record<PropKey, PropEventHandlers>;\r\n\r\n// ComponentConfig\r\nexport type ComponentParams<TStruct extends ComponentStruct = ComponentStruct> = ComponentPropParams<TStruct[\"props\"]> &\r\n ComponentEvents<TStruct>; // & PropsWithChildren\r\n\r\nconst blankView = () => null;\r\n\r\nfunction createProxy(state: any, bindings: Map<PropKey, IBinding>, proxyEventHandlers: ProxyEventHandlers) {\r\n const onPropChanging = proxyEventHandlers.onPropChanging;\r\n const onPropChange = proxyEventHandlers.onPropChange;\r\n return new Proxy(state, {\r\n get(obj, prop, receiver) {\r\n const onGet = proxyEventHandlers[prop]?.onGet;\r\n if (onGet) {\r\n return onGet();\r\n }\r\n const binding = bindings.get(String(prop));\r\n if (binding) {\r\n return binding.get();\r\n }\r\n return Reflect.get(obj, prop, receiver);\r\n },\r\n set(obj, prop, value, receiver) {\r\n const oldValue = obj[prop];\r\n\r\n const onChanging = proxyEventHandlers[prop]?.onChanging;\r\n if (onChanging) {\r\n const shouldChange = onChanging(oldValue, value);\r\n if (!shouldChange) {\r\n return true;\r\n }\r\n }\r\n\r\n if (onPropChanging) {\r\n const shouldChange = onPropChanging(prop, oldValue, value);\r\n if (!shouldChange) {\r\n return true;\r\n }\r\n }\r\n\r\n const result = runInAction(() => {\r\n return Reflect.set(obj, prop, value, receiver);\r\n });\r\n\r\n const binding = bindings.get(prop);\r\n\r\n if (binding?.set) {\r\n binding.set(value);\r\n }\r\n\r\n const onChange = proxyEventHandlers[prop]?.onChange;\r\n if (onChange) {\r\n onChange(value);\r\n }\r\n\r\n if (onPropChange) {\r\n onPropChange(prop, value);\r\n }\r\n\r\n return result;\r\n }\r\n });\r\n}\r\n\r\nfunction capitalize(name: string) {\r\n return name.replace(/^./, name[0].toUpperCase());\r\n}\r\n\r\nfunction asyncToGeneratorFlow(asyncFn: (...args: any[]) => Promise<any>) {\r\n return function* (...args: any[]) {\r\n const result = yield asyncFn(...args);\r\n return result;\r\n };\r\n}\r\n\r\n// const ViewerFC = observer((props: ComponentViewerProps) => {\r\n// if (typeof props.view === \"function\") {\r\n// return props.view();\r\n// }\r\n// return <>{props.children}</>;\r\n// });\r\n\r\nfunction createModel<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n params: ComponentParams<TStruct>\r\n): ComponentModel<TStruct> {\r\n const msgBus = component.msgBus;\r\n const view = component.view;\r\n\r\n const ViewFC = observer((props: ComponentViewProps) => {\r\n if (typeof view === \"function\") {\r\n return view(props);\r\n }\r\n return <>{props.children}</>;\r\n });\r\n\r\n let model: ComponentModel<TStruct> = {\r\n ...component.props,\r\n ...component.methods,\r\n // view: component.view,\r\n // View: ViewerFC,\r\n View: ViewFC,\r\n msgBus: msgBus\r\n };\r\n if (component.children) {\r\n for (const [key, value] of Object.entries(component.children)) {\r\n if (typeof value == \"function\") {\r\n // observer\r\n const ChildViewFC: ComponentViewFn = (props) => {\r\n const model = value(props) as ComponentModel;\r\n return <model.View />;\r\n // if (typeof model.view === \"function\") {\r\n // return model.view(props);\r\n // }\r\n // return <>{props.children}</>;\r\n // return <ViewerFC view={model.view} />;\r\n };\r\n Reflect.set(model, capitalize(key), ChildViewFC);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n }\r\n if (component.msgBroker) {\r\n const providers = component.msgBroker.provide;\r\n if (providers) {\r\n for (const [channel, providerGroups] of Object.entries(providers)) {\r\n for (const [group, provider] of Object.entries(providerGroups)) {\r\n msgBus.provide({\r\n ...provider,\r\n channel: channel,\r\n group: group\r\n });\r\n }\r\n }\r\n }\r\n const subscribers = component.msgBroker.subscribe;\r\n if (subscribers) {\r\n for (const [channel, subscriberGroups] of Object.entries(subscribers)) {\r\n for (const [group, subscriber] of Object.entries(subscriberGroups)) {\r\n msgBus.on({\r\n ...subscriber,\r\n channel: channel,\r\n group: group\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n const bindings = new Map<PropKey, IBinding>();\r\n // Reflect.ownKeys\r\n for (const [key, value] of Object.entries(params)) {\r\n if (isBinding(value)) {\r\n bindings.set(key, value);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n\r\n // decorators\r\n const annotationMap: Record<string, any> = {};\r\n\r\n if (component.props) {\r\n for (const key of Object.keys(component.props)) {\r\n annotationMap[key] = observable.ref;\r\n }\r\n }\r\n if (component.methods) {\r\n for (const key of Object.keys(component.methods)) {\r\n annotationMap[key] = false;\r\n }\r\n }\r\n\r\n annotationMap[\"View\" satisfies keyof ComponentModelBase<TStruct>] = false;\r\n annotationMap[\"msgBus\" satisfies keyof ComponentModelBase<TStruct>] = false;\r\n // annotationMap[\"view\" satisfies keyof Component<TStruct>] = false;\r\n\r\n const proxyEventHandlers: Pick<ProxyEventHandlers, \"onPropChanging\" | \"onPropChange\"> = {\r\n onPropChanging:\r\n params?.onPropChanging || component.events?.onPropChanging\r\n ? (prop, oldValue, newValue) => {\r\n let result = true;\r\n let handler = params.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = component.events?.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }\r\n : undefined,\r\n onPropChange:\r\n params?.onPropChange || component.events?.onPropChange\r\n ? (prop, value) => {\r\n params.onPropChange?.(String(prop), value);\r\n component.events.onPropChange?.(String(prop), value);\r\n }\r\n : undefined\r\n };\r\n\r\n function resolveOnGetEventHandler(prop: string) {\r\n const key = `${$ON_GET}${capitalize(prop)}`;\r\n return params[key] || component.events[key];\r\n }\r\n\r\n function resolveOnChangingEventHandler(prop: string) {\r\n const key = `${$ON_CHANGING}${capitalize(prop)}`;\r\n return ((oldValue: any, newValue: any) => {\r\n let result = true;\r\n let handler = params[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = component.events[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }) as ValueChangingHandler;\r\n }\r\n\r\n function resolveOnChangeEventHandler(prop: string) {\r\n const key = `${$ON_CHANGE}${capitalize(prop)}`;\r\n return ((value: any) => {\r\n (params[key] as ValueChangeHandler<any>)?.(value);\r\n (component.events[key] as ValueChangeHandler<any>)?.(value);\r\n }) as ValueChangeHandler;\r\n }\r\n\r\n if (component.props) {\r\n for (const prop of Object.keys(component.props)) {\r\n proxyEventHandlers[prop] = {\r\n onGet: resolveOnGetEventHandler(prop),\r\n onChanging: resolveOnChangingEventHandler(prop),\r\n onChange: resolveOnChangeEventHandler(prop)\r\n };\r\n }\r\n }\r\n\r\n model = observable(model, annotationMap);\r\n\r\n model = createProxy(model, bindings, proxyEventHandlers);\r\n\r\n if (component.events?.onInit) {\r\n component.events.onInit(model);\r\n }\r\n\r\n if (params?.onInit) {\r\n params.onInit(model);\r\n }\r\n\r\n return model;\r\n}\r\n\r\nexport function useComponent<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n params: ComponentParams<TStruct>\r\n): ComponentModel<TStruct> {\r\n const ref = useLazyRef(() => createModel(component, params));\r\n const model = ref.current;\r\n\r\n useLayoutEffect(() => {\r\n try {\r\n component.events?.onLayout?.(model);\r\n params?.onLayout?.(model);\r\n } catch (err) {\r\n component.events?.onError?.(model, err);\r\n params?.onError?.(model, err);\r\n }\r\n\r\n return () => {\r\n component.events?.onLayoutDestroy?.(model);\r\n params?.onLayoutDestroy?.(model);\r\n // ref.current?.dispose();\r\n ref.current = null;\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n try {\r\n component.events?.onReady?.(model);\r\n params?.onReady?.(model);\r\n } catch (err) {\r\n component.events?.onError?.(model, err);\r\n params?.onError?.(model, err);\r\n }\r\n return () => {\r\n component.events?.onDestroy?.(model);\r\n params?.onDestroy?.(model);\r\n };\r\n }, []);\r\n\r\n return ref.current;\r\n}\r\n\r\n// asFC/toFC\r\nexport function getFC<TStruct extends ComponentStruct>(\r\n factory: (params: ComponentParams<TStruct>) => ComponentModel<TStruct>\r\n): FC<ComponentParams<TStruct>> {\r\n // observer\r\n const fc = (params: ComponentParams<TStruct> & PropsWithChildren) => {\r\n // modelHook\r\n const model = factory(params); // without useRef!\r\n // return model.view();\r\n return <model.View {...params} />;\r\n // return <ViewerFC {...params} view={model.view} />;\r\n };\r\n return fc;\r\n}\r\n"],"names":["symbols","Binding","get","set","converter","validator","isBinding","obj","bind","bindProp","prop","value","$ON_GET","$ON_CHANGING","$ON_CHANGE","createProxy","state","bindings","proxyEventHandlers","onPropChanging","onPropChange","receiver","onGet","binding","oldValue","onChanging","result","runInAction","onChange","capitalize","name","createModel","component","params","msgBus","view","ViewFC","observer","props","jsx","Fragment","model","key","ChildViewFC","providers","channel","providerGroups","group","provider","subscribers","subscriberGroups","subscriber","annotationMap","observable","newValue","handler","resolveOnGetEventHandler","resolveOnChangingEventHandler","resolveOnChangeEventHandler","useComponent","ref","useLazyRef","useLayoutEffect","err","useEffect","getFC","factory"],"mappings":"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"}