@telia-ace/widget-core 1.0.14 → 1.0.15
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.
|
@@ -31,6 +31,6 @@ export declare const createChildren: (platform: ComponentPlatform, node: Compone
|
|
|
31
31
|
[name: string]: ComponentSettings;
|
|
32
32
|
}, views: {
|
|
33
33
|
[key: string]: ViewDefinition;
|
|
34
|
-
}, branch?: string
|
|
34
|
+
}, branch?: string) => void;
|
|
35
35
|
export declare const createComponentModel: (platform: ComponentPlatform, settings: WidgetSettings) => EventSubscriptionCancellation;
|
|
36
36
|
export {};
|
|
@@ -5,4 +5,4 @@ export declare type ComponentDescriptor = {
|
|
|
5
5
|
name?: string;
|
|
6
6
|
branch: string;
|
|
7
7
|
};
|
|
8
|
-
export declare const asDescriptor: (node: ComponentNode, branch?: string
|
|
8
|
+
export declare const asDescriptor: (node: ComponentNode, branch?: string) => ComponentDescriptor;
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
1
|
+
var V = Object.defineProperty, _ = Object.defineProperties;
|
|
2
|
+
var z = Object.getOwnPropertyDescriptors;
|
|
3
|
+
var S = Object.getOwnPropertySymbols;
|
|
4
|
+
var Q = Object.prototype.hasOwnProperty, q = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var w = (n, t, e) => t in n ? V(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e, j = (n, t) => {
|
|
6
6
|
for (var e in t || (t = {}))
|
|
7
|
-
|
|
8
|
-
if (
|
|
9
|
-
for (var e of
|
|
10
|
-
|
|
7
|
+
Q.call(t, e) && w(n, e, t[e]);
|
|
8
|
+
if (S)
|
|
9
|
+
for (var e of S(t))
|
|
10
|
+
q.call(t, e) && w(n, e, t[e]);
|
|
11
11
|
return n;
|
|
12
|
-
},
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
|
|
12
|
+
}, H = (n, t) => _(n, z(t));
|
|
13
|
+
var l = (n, t, e) => (w(n, typeof t != "symbol" ? t + "" : t, e), e);
|
|
14
|
+
import { createConfigurationApi as K } from "@webprovisions/platform";
|
|
15
|
+
import { uuid as N, Logger as k } from "@telia-ace/widget-utilities";
|
|
16
|
+
class ht {
|
|
16
17
|
constructor(t) {
|
|
18
|
+
l(this, "events");
|
|
17
19
|
const { events: e } = t.get("$widget");
|
|
18
20
|
this.events = e.createChild(this);
|
|
19
21
|
}
|
|
@@ -21,10 +23,13 @@ class ct {
|
|
|
21
23
|
this.events.dispatch("data:action", { action: e, value: s, target: t }, { bubbles: !0 });
|
|
22
24
|
}
|
|
23
25
|
subscribe(t, e) {
|
|
24
|
-
return this.events.subscribe(
|
|
26
|
+
return this.events.subscribe(
|
|
27
|
+
"data:action",
|
|
28
|
+
(s, { action: r, value: c, target: o }) => t === o && e(t, r, c)
|
|
29
|
+
);
|
|
25
30
|
}
|
|
26
31
|
}
|
|
27
|
-
const
|
|
32
|
+
const U = (n) => {
|
|
28
33
|
const t = [];
|
|
29
34
|
return [
|
|
30
35
|
(s, r) => {
|
|
@@ -37,7 +42,7 @@ const K = (n) => {
|
|
|
37
42
|
}
|
|
38
43
|
];
|
|
39
44
|
};
|
|
40
|
-
class
|
|
45
|
+
class P {
|
|
41
46
|
constructor(t, e = []) {
|
|
42
47
|
this.platform = t, this.rules = e;
|
|
43
48
|
}
|
|
@@ -51,13 +56,20 @@ class N {
|
|
|
51
56
|
return this.rules.push({ id: t }), this;
|
|
52
57
|
}
|
|
53
58
|
select() {
|
|
54
|
-
return new
|
|
59
|
+
return new Y(this.platform, this);
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
|
-
class
|
|
62
|
+
class B {
|
|
58
63
|
constructor(t, e, s) {
|
|
59
|
-
this
|
|
60
|
-
|
|
64
|
+
l(this, "actions");
|
|
65
|
+
l(this, "subscribe");
|
|
66
|
+
l(this, "unsubscribe");
|
|
67
|
+
this.platform = t, this.node = e, this.actions = new R(
|
|
68
|
+
t,
|
|
69
|
+
new P(t).withId(e.id),
|
|
70
|
+
s
|
|
71
|
+
);
|
|
72
|
+
const [r, c] = U(this.platform.events);
|
|
61
73
|
this.subscribe = r, this.unsubscribe = c;
|
|
62
74
|
}
|
|
63
75
|
properties(t) {
|
|
@@ -86,33 +98,41 @@ class $ {
|
|
|
86
98
|
this.unsubscribe(), this.actions.dispose();
|
|
87
99
|
}
|
|
88
100
|
}
|
|
89
|
-
class
|
|
101
|
+
class Y {
|
|
90
102
|
constructor(t, e, s = !0) {
|
|
91
|
-
this
|
|
103
|
+
l(this, "actions");
|
|
104
|
+
l(this, "removes", []);
|
|
105
|
+
this.platform = t, this.target = e, this.clearOnDispose = s, this.actions = new R(this.platform, this.target);
|
|
92
106
|
}
|
|
93
107
|
writeProperties(t, e) {
|
|
94
|
-
this.removes.push(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
108
|
+
this.removes.push(
|
|
109
|
+
this.platform.write({
|
|
110
|
+
options: e,
|
|
111
|
+
attributes: { properties: t },
|
|
112
|
+
target: this.target,
|
|
113
|
+
removable: this.clearOnDispose
|
|
114
|
+
})
|
|
115
|
+
);
|
|
100
116
|
}
|
|
101
117
|
writeContext(t, e) {
|
|
102
|
-
this.removes.push(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
118
|
+
this.removes.push(
|
|
119
|
+
this.platform.write({
|
|
120
|
+
options: e,
|
|
121
|
+
attributes: { context: t },
|
|
122
|
+
target: this.target,
|
|
123
|
+
removable: this.clearOnDispose
|
|
124
|
+
})
|
|
125
|
+
);
|
|
108
126
|
}
|
|
109
127
|
writeLayout(t, e) {
|
|
110
|
-
this.removes.push(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
128
|
+
this.removes.push(
|
|
129
|
+
this.platform.write({
|
|
130
|
+
options: e,
|
|
131
|
+
attributes: { layout: t },
|
|
132
|
+
target: this.target,
|
|
133
|
+
removable: this.clearOnDispose
|
|
134
|
+
})
|
|
135
|
+
);
|
|
116
136
|
}
|
|
117
137
|
dispose() {
|
|
118
138
|
this.removes.forEach((t) => {
|
|
@@ -120,12 +140,12 @@ class U {
|
|
|
120
140
|
}), this.actions.dispose();
|
|
121
141
|
}
|
|
122
142
|
}
|
|
123
|
-
const
|
|
143
|
+
const F = (n, t, e) => {
|
|
124
144
|
const s = n.concat(), r = (c, o, a) => {
|
|
125
145
|
let u = !0;
|
|
126
146
|
if (s.length) {
|
|
127
|
-
const h = s.shift(), i = (p,
|
|
128
|
-
return Promise.resolve(h(c, i, a)).then((p) => j(
|
|
147
|
+
const h = s.shift(), i = (p, d) => (u = !1, r(p, Object.assign({}, o, d), a));
|
|
148
|
+
return Promise.resolve(h(c, i, a)).then((p) => H(j({}, p), {
|
|
129
149
|
cancelled: u
|
|
130
150
|
}));
|
|
131
151
|
}
|
|
@@ -133,9 +153,10 @@ const Y = (n, t, e) => {
|
|
|
133
153
|
};
|
|
134
154
|
return r(t, {}, e);
|
|
135
155
|
};
|
|
136
|
-
class
|
|
156
|
+
class R {
|
|
137
157
|
constructor(t, e, s) {
|
|
138
|
-
this
|
|
158
|
+
l(this, "subscriptions", []);
|
|
159
|
+
this.platform = t, this.target = e, this.ns = s, this.create = this.create.bind(this);
|
|
139
160
|
}
|
|
140
161
|
create(t, e = () => {
|
|
141
162
|
}) {
|
|
@@ -153,19 +174,35 @@ class k {
|
|
|
153
174
|
return this.subscriptions.push(r), r;
|
|
154
175
|
}
|
|
155
176
|
dispatch(t, e) {
|
|
156
|
-
const s = this.platform.nodes.all.concat(
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
177
|
+
const s = this.platform.nodes.all.concat(
|
|
178
|
+
this.platform.nodes.detached
|
|
179
|
+
), r = {}, c = this.platform.actionsState.handlers.filter(
|
|
180
|
+
(o) => o.key === t && (!o.ns || !this.ns || o.ns === this.ns)
|
|
181
|
+
);
|
|
182
|
+
return Promise.all(
|
|
183
|
+
c.map((o) => {
|
|
184
|
+
const a = s.filter(
|
|
185
|
+
(h) => o.target.match(h) && this.target.match(h)
|
|
186
|
+
), u = this.platform.actionsState.watchers.filter((h) => h.key === t && (!h.ns || !this.ns || h.ns === this.ns) && a.some((i) => h.target.match(i))).map((h) => h.fn);
|
|
187
|
+
return Promise.all(
|
|
188
|
+
a.map((h) => {
|
|
189
|
+
const i = new B(
|
|
190
|
+
this.platform,
|
|
191
|
+
h,
|
|
192
|
+
this.ns
|
|
193
|
+
);
|
|
194
|
+
return F(u, e, i).then((p) => {
|
|
195
|
+
const { data: d = {}, options: f, cancelled: g } = p;
|
|
196
|
+
return Promise.resolve(
|
|
197
|
+
g ? {} : o.fn(d, f, i)
|
|
198
|
+
).then((y) => {
|
|
199
|
+
r[h.id] = y;
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
})
|
|
203
|
+
);
|
|
204
|
+
})
|
|
205
|
+
).then(() => r);
|
|
169
206
|
}
|
|
170
207
|
watch(t, e) {
|
|
171
208
|
let s = t, r = this.ns;
|
|
@@ -188,7 +225,7 @@ class k {
|
|
|
188
225
|
this.subscriptions.forEach((t) => t());
|
|
189
226
|
}
|
|
190
227
|
}
|
|
191
|
-
const
|
|
228
|
+
const at = K((n) => {
|
|
192
229
|
n.createCommand("components", (t) => (e) => {
|
|
193
230
|
t.events.subscribeOnce("components:platform-created", (s, { platform: r }) => {
|
|
194
231
|
e.handlers && e.handlers.forEach(([c, o]) => {
|
|
@@ -197,9 +234,18 @@ const ht = q((n) => {
|
|
|
197
234
|
});
|
|
198
235
|
});
|
|
199
236
|
});
|
|
200
|
-
class
|
|
237
|
+
class $ {
|
|
201
238
|
constructor(t, e) {
|
|
202
|
-
this
|
|
239
|
+
l(this, "id");
|
|
240
|
+
l(this, "type");
|
|
241
|
+
l(this, "name");
|
|
242
|
+
l(this, "parent");
|
|
243
|
+
l(this, "tags", []);
|
|
244
|
+
l(this, "children", {});
|
|
245
|
+
l(this, "changesets", []);
|
|
246
|
+
l(this, "attributes");
|
|
247
|
+
l(this, "mountCount", 0);
|
|
248
|
+
this.events = t, this.id = N(), this.type = e, this.attributes = {
|
|
203
249
|
context: {},
|
|
204
250
|
properties: {},
|
|
205
251
|
layout: {},
|
|
@@ -208,7 +254,7 @@ class H {
|
|
|
208
254
|
}
|
|
209
255
|
mount(t, e) {
|
|
210
256
|
let s = t.get("mounted-nodes");
|
|
211
|
-
return s || (s = /* @__PURE__ */ new Map(), t.register("mounted-nodes", s)), s.has(this) ? (process.env.NODE_ENV !== "production" &&
|
|
257
|
+
return s || (s = /* @__PURE__ */ new Map(), t.register("mounted-nodes", s)), s.has(this) ? (process.env.NODE_ENV !== "production" && k.error("Trying to mount an already mounted component node.", this), () => {
|
|
212
258
|
}) : (this.events.dispatch("components:node-mounted", { node: this }), this.mountCount === 0 && (this.mountCount = this.mountCount + 1, this.events.dispatch("components:node-enter", { node: this })), () => {
|
|
213
259
|
s.delete(this), this.events.dispatch("components:node-unmounted", { node: this }), this.mountCount = this.mountCount - 1, this.mountCount === 0 && this.events.dispatch("components:node-exit", { node: this });
|
|
214
260
|
});
|
|
@@ -282,52 +328,55 @@ class H {
|
|
|
282
328
|
}), delete t.parent;
|
|
283
329
|
}
|
|
284
330
|
}
|
|
285
|
-
const
|
|
331
|
+
const M = (n, t, e) => {
|
|
286
332
|
for (let s = 0, r = n.length; s < r && e(n[s]) !== !0; s++) {
|
|
287
333
|
const c = t[n[s].id] || "default", o = n[s].getChildren(c);
|
|
288
|
-
|
|
334
|
+
M(o, t, e);
|
|
289
335
|
}
|
|
290
|
-
},
|
|
336
|
+
}, A = (n, t, e) => {
|
|
291
337
|
if (e(n) !== !0) {
|
|
292
338
|
const s = t[n.id] || "default", r = n.children[s];
|
|
293
|
-
|
|
339
|
+
M(r, t, e);
|
|
294
340
|
}
|
|
295
|
-
},
|
|
341
|
+
}, C = (n, t) => {
|
|
296
342
|
const e = [];
|
|
297
|
-
return
|
|
343
|
+
return A(n, t, (s) => {
|
|
298
344
|
e.push(s);
|
|
299
345
|
}), e;
|
|
300
|
-
},
|
|
346
|
+
}, G = (n, t, e) => {
|
|
301
347
|
let s;
|
|
302
|
-
return
|
|
348
|
+
return A(n, t, (r) => {
|
|
303
349
|
if (e(r))
|
|
304
350
|
return s = r, !0;
|
|
305
351
|
}), s;
|
|
306
352
|
};
|
|
307
|
-
class
|
|
353
|
+
class J {
|
|
308
354
|
constructor(t, e, s) {
|
|
309
|
-
this
|
|
310
|
-
|
|
355
|
+
l(this, "all", []);
|
|
356
|
+
l(this, "visible", []);
|
|
357
|
+
l(this, "detached", []);
|
|
358
|
+
this.root = t, this.switches = e, s.subscribe("components:node-appended", (r, c) => {
|
|
359
|
+
this.all.push(c.node), this.visible = C(t, e);
|
|
311
360
|
}), s.subscribe("components:node-removed", (r, c) => {
|
|
312
361
|
let o = this.all.indexOf(c.node);
|
|
313
|
-
o > -1 && this.all.splice(o, 1), o = this.visible.indexOf(c.node), o > -1 && this.visible.splice(o, 1), this.visible =
|
|
362
|
+
o > -1 && this.all.splice(o, 1), o = this.visible.indexOf(c.node), o > -1 && this.visible.splice(o, 1), this.visible = C(t, e);
|
|
314
363
|
}), s.subscribe("components:node-switched", (r, c) => {
|
|
315
|
-
this.visible =
|
|
364
|
+
this.visible = C(t, e);
|
|
316
365
|
});
|
|
317
366
|
}
|
|
318
367
|
query(t = {}) {
|
|
319
368
|
const e = [];
|
|
320
|
-
return
|
|
369
|
+
return A(this.root, this.switches, (s) => {
|
|
321
370
|
Object.keys(t).every((c) => t[c] === s[c]) && e.push(s);
|
|
322
371
|
}), e;
|
|
323
372
|
}
|
|
324
373
|
get(t) {
|
|
325
|
-
return
|
|
374
|
+
return G(this.root, this.switches, (e) => e.id === t) || this.detached.find((e) => e.id === t);
|
|
326
375
|
}
|
|
327
376
|
}
|
|
328
|
-
class
|
|
377
|
+
class X {
|
|
329
378
|
constructor() {
|
|
330
|
-
this
|
|
379
|
+
l(this, "handlers", /* @__PURE__ */ new Map());
|
|
331
380
|
}
|
|
332
381
|
add(t, e) {
|
|
333
382
|
this.handlers.set(t, e);
|
|
@@ -336,47 +385,49 @@ class J {
|
|
|
336
385
|
return this.handlers.get(t);
|
|
337
386
|
}
|
|
338
387
|
}
|
|
339
|
-
const
|
|
388
|
+
const Z = (n) => {
|
|
340
389
|
let t = n, e = 0;
|
|
341
390
|
for (; t.parent; )
|
|
342
391
|
e = e + 1, t = t.parent;
|
|
343
392
|
return e;
|
|
344
|
-
},
|
|
393
|
+
}, W = (n) => n.map(([e, s]) => [Z(e), e, s]).sort(([e], [s]) => e - s).map(([, e, s]) => [e, s]), E = (n) => n && typeof n == "object" && !Array.isArray(n), v = (n, ...t) => {
|
|
345
394
|
if (!t.length)
|
|
346
395
|
return n;
|
|
347
396
|
const e = t.shift();
|
|
348
|
-
if (
|
|
397
|
+
if (E(n) && E(e))
|
|
349
398
|
for (const s in e)
|
|
350
|
-
|
|
351
|
-
return
|
|
352
|
-
},
|
|
399
|
+
E(e[s]) ? (n[s] || Object.assign(n, { [s]: {} }), v(n[s], e[s])) : Object.assign(n, { [s]: e[s] });
|
|
400
|
+
return v(n, ...t);
|
|
401
|
+
}, tt = (n, t) => !n || n === "all" ? !0 : n.some((e) => t.indexOf(e) > -1), et = (n, t) => {
|
|
353
402
|
let e = [], s = [], r;
|
|
354
403
|
const c = () => {
|
|
355
404
|
process.env.NODE_ENV !== "production" && console.time("state-processor.flush");
|
|
356
|
-
const a = /* @__PURE__ */ new Map(), u =
|
|
357
|
-
var
|
|
358
|
-
const
|
|
405
|
+
const a = /* @__PURE__ */ new Map(), u = W(e.map((i, p) => [i, s[p]])), h = (i, p) => {
|
|
406
|
+
var L;
|
|
407
|
+
const d = a.get(i) || {}, f = p.context && !d.context, g = p.properties && !d.properties, y = p.layout && !d.layout;
|
|
359
408
|
a.set(i, {
|
|
360
|
-
context:
|
|
361
|
-
properties:
|
|
362
|
-
layout:
|
|
363
|
-
}),
|
|
364
|
-
const
|
|
365
|
-
if (i.changesets.forEach((
|
|
366
|
-
const [
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
}),
|
|
371
|
-
|
|
372
|
-
}),
|
|
373
|
-
|
|
374
|
-
}),
|
|
375
|
-
|
|
376
|
-
|
|
409
|
+
context: d.context || f,
|
|
410
|
+
properties: d.properties || g,
|
|
411
|
+
layout: d.layout || y
|
|
412
|
+
}), g && (i.attributes.properties = {}), y && (i.attributes.layout = {}), f && (i.attributes.context = v({}, (L = i.parent) == null ? void 0 : L.attributes.context));
|
|
413
|
+
const D = [], T = [], I = [];
|
|
414
|
+
if (i.changesets.forEach((b) => {
|
|
415
|
+
const [m, x] = b;
|
|
416
|
+
tt(x.breakpoints, n.breakpoints) && (g && (typeof m.properties == "function" ? D.push(
|
|
417
|
+
m.properties
|
|
418
|
+
) : v(i.attributes.properties, m.properties)), y && (typeof m.layout == "function" ? T.push(m.layout) : v(i.attributes.layout, m.layout)), f && (typeof m.context == "function" ? I.push(m.context) : v(i.attributes.context, m.context)));
|
|
419
|
+
}), D.forEach((b) => {
|
|
420
|
+
v(i.attributes.properties, b(i.attributes.properties));
|
|
421
|
+
}), T.forEach((b) => {
|
|
422
|
+
v(i.attributes.layout, b(i.attributes.layout));
|
|
423
|
+
}), I.forEach((b) => {
|
|
424
|
+
v(i.attributes.context, b(i.attributes.context));
|
|
425
|
+
}), f || p.recursive) {
|
|
426
|
+
const b = n.getBranch(i), m = p.recursive ? p : {
|
|
427
|
+
context: !!f
|
|
377
428
|
};
|
|
378
|
-
i.getChildren(
|
|
379
|
-
h(
|
|
429
|
+
i.getChildren(b).forEach((x) => {
|
|
430
|
+
h(x, m);
|
|
380
431
|
});
|
|
381
432
|
}
|
|
382
433
|
};
|
|
@@ -395,46 +446,93 @@ const X = (n) => {
|
|
|
395
446
|
return e.push(a), s.push(u), o();
|
|
396
447
|
};
|
|
397
448
|
};
|
|
398
|
-
class
|
|
449
|
+
class st {
|
|
399
450
|
constructor(t, e = {}) {
|
|
400
|
-
this
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
451
|
+
l(this, "events");
|
|
452
|
+
l(this, "breakpoints", []);
|
|
453
|
+
l(this, "nodes");
|
|
454
|
+
l(this, "actionsState", { handlers: [], watchers: [] });
|
|
455
|
+
l(this, "switches", {});
|
|
456
|
+
l(this, "changesets", []);
|
|
457
|
+
l(this, "subscriptions", []);
|
|
458
|
+
l(this, "processNode");
|
|
459
|
+
l(this, "customComponentHandler", new X());
|
|
460
|
+
this.providers = e, this.events = t.events.createChild(this);
|
|
461
|
+
const s = new $(this.events, "root");
|
|
462
|
+
s.name = `root-${t.name}`, this.nodes = new J(s, this.switches, this.events);
|
|
463
|
+
const r = this.processNode = et(this, (c) => {
|
|
404
464
|
const o = Array.from(c.keys());
|
|
405
465
|
process.env.NODE_ENV !== "production" && console.info(`STATE PROCESSOR: ${o.length} node(s) processed:
|
|
406
|
-
${o.map(
|
|
407
|
-
|
|
466
|
+
${o.map(
|
|
467
|
+
(a) => `${a.name || "<no name>"} (${a.id})
|
|
468
|
+
`
|
|
469
|
+
)}`), o.forEach((a) => {
|
|
408
470
|
const u = c.get(a);
|
|
409
471
|
a.parent && a.parent.type === "root" && this.events.dispatch("components:root-children-changed", { node: a }), u != null && u.context && this.events.dispatch("components:context-changed", { node: a }), u != null && u.properties && this.events.dispatch("components:properties-changed", { node: a }), u != null && u.layout && this.events.dispatch("components:layout-changed", { node: a });
|
|
410
472
|
}), this.events.dispatch("components:component-model-initialized", {}, { bubbles: !0 });
|
|
411
473
|
});
|
|
412
|
-
Promise.all(
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
474
|
+
Promise.all(
|
|
475
|
+
Object.keys(e).map((c) => e[c].load(this))
|
|
476
|
+
), this.subscriptions.push(
|
|
477
|
+
this.events.subscribe(
|
|
478
|
+
"components:node-appended",
|
|
479
|
+
(c, o) => {
|
|
480
|
+
const { node: a } = o;
|
|
481
|
+
this.changesets.forEach((u) => {
|
|
482
|
+
const { changeset: h, target: i, removes: p } = u, [d, f] = h;
|
|
483
|
+
i.match(o.node) && (d.properties && p.push(a.writeProperties(d.properties, f)), d.context && p.push(a.writeContext(d.context, f)), d.layout && p.push(a.writeLayout(d.layout, f)));
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
)
|
|
487
|
+
), this.subscriptions.push(
|
|
488
|
+
this.events.subscribe(
|
|
489
|
+
"components:node-appended",
|
|
490
|
+
(c, o) => {
|
|
491
|
+
r(o.node, { properties: !0, context: !0 });
|
|
492
|
+
}
|
|
493
|
+
)
|
|
494
|
+
), this.subscriptions.push(
|
|
495
|
+
this.events.subscribe(
|
|
496
|
+
"components:set-properties",
|
|
497
|
+
(c, o) => {
|
|
498
|
+
r(o.node, { properties: !0 });
|
|
499
|
+
}
|
|
500
|
+
)
|
|
501
|
+
), this.subscriptions.push(
|
|
502
|
+
this.events.subscribe(
|
|
503
|
+
"components:set-context",
|
|
504
|
+
(c, o) => {
|
|
505
|
+
r(o.node, { properties: !0, context: !0 });
|
|
506
|
+
}
|
|
507
|
+
)
|
|
508
|
+
), this.subscriptions.push(
|
|
509
|
+
this.events.subscribe(
|
|
510
|
+
"components:set-indent",
|
|
511
|
+
(c, o) => {
|
|
512
|
+
r(o.node, { layout: !0 });
|
|
513
|
+
}
|
|
514
|
+
)
|
|
515
|
+
), this.subscriptions.push(
|
|
516
|
+
this.events.subscribe(
|
|
517
|
+
"components:set-layout",
|
|
518
|
+
(c, o) => {
|
|
519
|
+
r(o.node, { layout: !0 });
|
|
520
|
+
}
|
|
521
|
+
)
|
|
522
|
+
), this.subscriptions.push(
|
|
523
|
+
this.events.subscribe("components:node-switched", (c, { node: o, branch: a }) => {
|
|
524
|
+
r(o, {
|
|
525
|
+
layout: !0,
|
|
526
|
+
recursive: !0,
|
|
527
|
+
properties: !0,
|
|
528
|
+
context: !0
|
|
529
|
+
});
|
|
530
|
+
})
|
|
531
|
+
), this.subscriptions.push(
|
|
532
|
+
this.events.subscribe("components:node-removed", (c, { parentNode: o }) => {
|
|
533
|
+
r(o, { properties: !0 });
|
|
534
|
+
})
|
|
535
|
+
), this.events.parent && this.events.parent.dispatch("components:platform-created", { platform: this });
|
|
438
536
|
}
|
|
439
537
|
static getInstance(t) {
|
|
440
538
|
return t.getAsync("components");
|
|
@@ -463,17 +561,17 @@ ${o.map((a) => `${a.name || "<no name>"} (${a.id})
|
|
|
463
561
|
return this.switches[t.id];
|
|
464
562
|
}
|
|
465
563
|
createNode(t, e = {}) {
|
|
466
|
-
const s = new
|
|
564
|
+
const s = new $(this.events, t);
|
|
467
565
|
return e.detached && this.nodes.detached.push(s), s;
|
|
468
566
|
}
|
|
469
567
|
components() {
|
|
470
|
-
return new
|
|
568
|
+
return new P(this);
|
|
471
569
|
}
|
|
472
570
|
actions(t, e) {
|
|
473
|
-
return new
|
|
571
|
+
return new R(this, t, e);
|
|
474
572
|
}
|
|
475
573
|
write(t) {
|
|
476
|
-
const { provider: e, target: s, attributes: r, options: c = {}, removable: o } = t, a = t.key ||
|
|
574
|
+
const { provider: e, target: s, attributes: r, options: c = {}, removable: o } = t, a = t.key || N(), h = { changeset: [r, c], target: s, removes: [] };
|
|
477
575
|
if (e) {
|
|
478
576
|
const i = this.providers[e];
|
|
479
577
|
i.write(a, s, r, c), h.removes.push(() => {
|
|
@@ -504,7 +602,7 @@ ${o.map((a) => `${a.name || "<no name>"} (${a.id})
|
|
|
504
602
|
this.subscriptions.forEach((t) => t());
|
|
505
603
|
}
|
|
506
604
|
}
|
|
507
|
-
const
|
|
605
|
+
const nt = (n) => {
|
|
508
606
|
if (Array.isArray(n)) {
|
|
509
607
|
const [t, ...e] = n;
|
|
510
608
|
return {
|
|
@@ -516,14 +614,14 @@ const st = (n) => {
|
|
|
516
614
|
definitionId: n,
|
|
517
615
|
overrides: []
|
|
518
616
|
};
|
|
519
|
-
},
|
|
617
|
+
}, O = (n, t, e, s, r, c) => {
|
|
520
618
|
e.forEach((o) => {
|
|
521
|
-
const a =
|
|
619
|
+
const a = nt(o), u = s[a.definitionId];
|
|
522
620
|
if (a.definitionId === "view") {
|
|
523
621
|
const h = n.createNode("view");
|
|
524
622
|
h.name = "view", Object.keys(r).forEach((i) => {
|
|
525
623
|
const p = r[i];
|
|
526
|
-
|
|
624
|
+
O(n, h, [p.entry], s, r, i);
|
|
527
625
|
}), t.appendChild(h), a.overrides.forEach((i) => {
|
|
528
626
|
i.properties && h.writeProperties(i.properties, {
|
|
529
627
|
breakpoints: i.breakpoints
|
|
@@ -542,17 +640,19 @@ const st = (n) => {
|
|
|
542
640
|
} else {
|
|
543
641
|
const h = s[a.definitionId];
|
|
544
642
|
if (process.env.NODE_ENV !== "production" && !h) {
|
|
545
|
-
|
|
643
|
+
k.error(
|
|
644
|
+
`No definition found for component type '${a.definitionId}'.`
|
|
645
|
+
);
|
|
546
646
|
return;
|
|
547
647
|
}
|
|
548
648
|
const i = n.createNode(h.type);
|
|
549
649
|
i.name = a.definitionId, i.tags = h.tags || [], h.properties && i.writeProperties(h.properties), h.context && i.writeContext(h.context), h.layout && i.writeLayout(h.layout), t.appendChild(i, c), a.overrides.forEach((p) => {
|
|
550
|
-
const
|
|
551
|
-
p.properties && i.writeProperties(p.properties,
|
|
552
|
-
}), h.children &&
|
|
650
|
+
const d = { breakpoints: p.breakpoints };
|
|
651
|
+
p.properties && i.writeProperties(p.properties, d), p.context && i.writeContext(p.context, d), p.layout && i.writeLayout(p.layout, d);
|
|
652
|
+
}), h.children && O(n, i, h.children, s, r);
|
|
553
653
|
}
|
|
554
654
|
});
|
|
555
|
-
},
|
|
655
|
+
}, pt = (n, t) => {
|
|
556
656
|
const { entry: e, components: s, breakpoints: r, views: c } = t, o = [];
|
|
557
657
|
return Object.keys(r).forEach((a) => {
|
|
558
658
|
const u = r[a], h = window.matchMedia(u);
|
|
@@ -561,48 +661,60 @@ const st = (n) => {
|
|
|
561
661
|
p.matches ? n.addBreakpoint(a) : n.removeBreakpoint(a);
|
|
562
662
|
};
|
|
563
663
|
h.addListener(i), o.push(() => h.removeListener(i));
|
|
564
|
-
}),
|
|
664
|
+
}), O(n, n.nodes.root, [e], s, c), () => o.forEach((a) => {
|
|
565
665
|
a();
|
|
566
666
|
});
|
|
567
|
-
},
|
|
667
|
+
}, ut = (n, t) => ({
|
|
568
668
|
id: n.id,
|
|
569
669
|
type: n.type,
|
|
570
670
|
name: n.name,
|
|
571
671
|
branch: t || "default"
|
|
572
|
-
}),
|
|
672
|
+
}), lt = (n, t, e, s = N(), r = {}) => n.getAsync("components").then((c) => {
|
|
573
673
|
let o;
|
|
574
674
|
if (typeof t == "string") {
|
|
575
|
-
const h = new
|
|
675
|
+
const h = new P(c);
|
|
576
676
|
h.ofType(t), o = h;
|
|
577
677
|
} else
|
|
578
678
|
o = t;
|
|
579
679
|
const a = {}, u = (h) => {
|
|
580
680
|
const i = a[h.id];
|
|
581
|
-
return i ? Promise.resolve(i.controller) :
|
|
681
|
+
return i ? Promise.resolve(i.controller) : st.getInstance(n).then((p) => new B(p, h, s));
|
|
582
682
|
};
|
|
583
|
-
c.events.subscribe(
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
683
|
+
c.events.subscribe(
|
|
684
|
+
"components:node-enter",
|
|
685
|
+
(h, { node: i }) => {
|
|
686
|
+
o.match(i) && u(i).then((p) => {
|
|
687
|
+
Promise.resolve(e(p)).then((d) => {
|
|
688
|
+
a[i.id] = {
|
|
689
|
+
dispose: d,
|
|
690
|
+
controller: p
|
|
691
|
+
};
|
|
692
|
+
});
|
|
590
693
|
});
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
694
|
+
}
|
|
695
|
+
), c.events.subscribe(
|
|
696
|
+
"components:node-exit",
|
|
697
|
+
(h, { node: i }) => {
|
|
698
|
+
const p = a[i.id];
|
|
699
|
+
p && (p.dispose && p.dispose(), r.reuseController || (p.controller.dispose(), delete a[i.id]));
|
|
700
|
+
}
|
|
701
|
+
);
|
|
596
702
|
});
|
|
597
|
-
class
|
|
703
|
+
class dt {
|
|
598
704
|
constructor(t) {
|
|
599
|
-
this
|
|
705
|
+
l(this, "aliases", /* @__PURE__ */ new Map());
|
|
706
|
+
l(this, "components", /* @__PURE__ */ new Map());
|
|
707
|
+
l(this, "events");
|
|
708
|
+
l(this, "logger", new k());
|
|
600
709
|
const { events: e } = t.get("$widget");
|
|
601
710
|
this.events = e;
|
|
602
711
|
}
|
|
603
712
|
getComponent(t) {
|
|
604
713
|
const e = this.aliases.get(t), s = this.components.get(e || t) || null;
|
|
605
|
-
return process.env.NODE_ENV !== "production" && (s || this.logger.warn(
|
|
714
|
+
return process.env.NODE_ENV !== "production" && (s || this.logger.warn(
|
|
715
|
+
e || t,
|
|
716
|
+
`Unable to resolve component: "${e || t}". You most likely forgot to register the required plugin for: ${e || t}.`
|
|
717
|
+
)), s;
|
|
606
718
|
}
|
|
607
719
|
registerComponent(t, e) {
|
|
608
720
|
return this.components.set(t, e), this.events.dispatch("component-resolver:resolve", t), () => {
|
|
@@ -623,24 +735,24 @@ class lt {
|
|
|
623
735
|
};
|
|
624
736
|
}
|
|
625
737
|
}
|
|
626
|
-
var
|
|
738
|
+
var it = /* @__PURE__ */ ((n) => (n.open = "open", n.closed = "closed", n.hidden = "hidden", n))(it || {});
|
|
627
739
|
export {
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
740
|
+
ht as ActionResolver,
|
|
741
|
+
R as ActionsController,
|
|
742
|
+
$ as ComponentNode,
|
|
743
|
+
B as ComponentNodeController,
|
|
744
|
+
st as ComponentPlatform,
|
|
745
|
+
P as ComponentQuery,
|
|
746
|
+
dt as ComponentResolver,
|
|
747
|
+
it as WidgetRenderState,
|
|
748
|
+
ut as asDescriptor,
|
|
749
|
+
at as componentConfigurationApi,
|
|
750
|
+
O as createChildren,
|
|
751
|
+
pt as createComponentModel,
|
|
752
|
+
U as createEventSubscriber,
|
|
753
|
+
lt as extendComponent,
|
|
754
|
+
G as findComponent,
|
|
755
|
+
C as findVisibleComponents,
|
|
756
|
+
A as traverseComponents
|
|
645
757
|
};
|
|
646
758
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/action-resolver.ts","../src/event-subscriber.ts","../src/component-platform/component-query.ts","../src/component-platform/component-controller.ts","../src/component-platform/actions-controller.ts","../src/component-platform/component-configuration-api.ts","../src/component-platform/component-node.ts","../src/component-platform/queries.ts","../src/component-platform/component-node-collection.ts","../src/component-platform/custom-component-handler.ts","../src/component-platform/state-processor.ts","../src/component-platform/component-platform.ts","../src/component-platform/create-component-model.ts","../src/component-platform/descriptor.ts","../src/component-platform/extend-component.ts","../src/component-resolver.ts","../src/types/configuration.ts"],"sourcesContent":["import {\r\n Container,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n Widget,\r\n} from '@webprovisions/platform';\r\n\r\nexport type Action = (origin: string, action: string, value?: any) => void;\r\n\r\nexport default class ActionResolver {\r\n private events: EventManager;\r\n\r\n constructor(container: Container) {\r\n const { events }: Widget = container.get('$widget');\r\n this.events = events.createChild(this);\r\n }\r\n\r\n action(target: string, action: string, value: any): void {\r\n this.events.dispatch('data:action', { action, value, target }, { bubbles: true });\r\n }\r\n\r\n subscribe(origin: string, fn: Action): EventSubscriptionCancellation {\r\n return this.events.subscribe(\r\n 'data:action',\r\n (e, { action, value, target }) => origin === target && fn(origin, action, value)\r\n );\r\n }\r\n}\r\n","import {\r\n EventListener,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n} from '@webprovisions/platform';\r\n\r\nexport type SubscribeDelegate = (type: string, listener: EventListener) => void;\r\n\r\n/**\r\n * Creates s subscriber for the specified `EventManager` and provides a single cancellation\r\n * function for all registered subscriptions.\r\n */\r\nexport const createEventSubscriber = (\r\n events: EventManager\r\n): [SubscribeDelegate, EventSubscriptionCancellation] => {\r\n const subs: EventSubscriptionCancellation[] = [];\r\n\r\n const subscribe = (type: string, listener: EventListener) => {\r\n subs.push(events.subscribe(type, listener));\r\n };\r\n\r\n return [\r\n subscribe,\r\n () => {\r\n subs.forEach((sub) => {\r\n sub();\r\n });\r\n },\r\n ];\r\n};\r\n","import { AbstractComponentController } from './component-controller';\r\nimport { ComponentNode } from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\n\r\nexport type ComponentQueryRule = {\r\n id?: string;\r\n type?: string;\r\n};\r\n\r\nexport class ComponentQuery {\r\n constructor(private platform: ComponentPlatform, public rules: ComponentQueryRule[] = []) {}\r\n\r\n match(node: ComponentNode) {\r\n return this.rules.every((rule) => {\r\n if (rule.id && rule.id !== node.id) {\r\n return false;\r\n }\r\n if (rule.type && rule.type !== node.type) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n ofType(type: string): ComponentQuery {\r\n this.rules.push({ type });\r\n return this;\r\n }\r\n\r\n withId(id: string): ComponentQuery {\r\n this.rules.push({ id });\r\n return this;\r\n }\r\n\r\n select(): AbstractComponentController {\r\n return new AbstractComponentController(this.platform, this);\r\n }\r\n}\r\n","import { EventSubscriptionCancellation } from '@webprovisions/platform';\r\nimport { createEventSubscriber, SubscribeDelegate } from '../event-subscriber';\r\nimport { ActionsController } from './actions-controller';\r\nimport {\r\n ChangesetOptions,\r\n ComponentNode,\r\n ComponentNodeContext,\r\n ComponentNodeLayout,\r\n ComponentNodeProperties,\r\n RemoveChangeset,\r\n} from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\nimport { ComponentQuery } from './component-query';\r\n\r\nexport interface ComponentController {\r\n actions: ActionsController;\r\n\r\n writeProperties(properties: Partial<ComponentNodeProperties>, options: ChangesetOptions): void;\r\n\r\n writeContext(context: Partial<ComponentNodeContext>, options: ChangesetOptions): void;\r\n\r\n writeLayout(context: Partial<ComponentNodeLayout>, options: ChangesetOptions): void;\r\n\r\n dispose(): void;\r\n}\r\n\r\nexport class ComponentNodeController implements ComponentController {\r\n actions: ActionsController;\r\n\r\n private subscribe: SubscribeDelegate;\r\n private unsubscribe: EventSubscriptionCancellation;\r\n\r\n constructor(private platform: ComponentPlatform, public node: ComponentNode, ns?: string) {\r\n this.actions = new ActionsController(\r\n platform,\r\n new ComponentQuery(platform).withId(node.id),\r\n ns\r\n );\r\n const [subscribe, unsubscribe] = createEventSubscriber(this.platform.events);\r\n this.subscribe = subscribe;\r\n this.unsubscribe = unsubscribe;\r\n }\r\n\r\n properties<T extends ComponentNodeProperties>(\r\n updated?: (properties: T) => void | Partial<ComponentNodeProperties>\r\n ): T {\r\n if (updated) {\r\n this.node.touchProperties((properties) => updated(<T>properties));\r\n }\r\n return <T>this.node.attributes.properties;\r\n }\r\n\r\n context(updated?: (context: ComponentNodeContext) => void): ComponentNodeContext {\r\n if (updated) {\r\n this.subscribe('components:context-changed', (event, { node }) => {\r\n if (node === this.node) {\r\n updated(this.node.attributes.context);\r\n }\r\n });\r\n }\r\n return this.node.attributes.context;\r\n }\r\n\r\n layout(updated?: (layout: ComponentNodeLayout) => void): ComponentNodeLayout {\r\n if (updated) {\r\n this.subscribe('components:layout-changed', (event, { node }) => {\r\n if (node === this.node) {\r\n updated(this.node.attributes.layout);\r\n }\r\n });\r\n }\r\n return this.node.attributes.layout;\r\n }\r\n\r\n writeProperties(\r\n properties:\r\n | Partial<ComponentNodeProperties>\r\n | ((properties: ComponentNodeProperties) => Partial<ComponentNodeProperties>),\r\n options?: ChangesetOptions\r\n ): void {\r\n this.node.writeProperties(properties, options);\r\n }\r\n\r\n writeContext(context: Partial<ComponentNodeContext>, options?: ChangesetOptions): void {\r\n this.node.writeProperties(context, options);\r\n }\r\n\r\n writeLayout(layout: Partial<ComponentNodeLayout>, options?: ChangesetOptions): void {\r\n this.node.writeLayout(layout, options);\r\n }\r\n\r\n dispose() {\r\n this.unsubscribe();\r\n this.actions.dispose();\r\n }\r\n}\r\n\r\nexport class AbstractComponentController implements ComponentController {\r\n actions: ActionsController;\r\n private removes: RemoveChangeset[] = [];\r\n\r\n constructor(\r\n private platform: ComponentPlatform,\r\n private target: ComponentQuery,\r\n private clearOnDispose = true\r\n ) {\r\n this.actions = new ActionsController(this.platform, this.target);\r\n }\r\n\r\n writeProperties(\r\n properties: Partial<ComponentNodeProperties>,\r\n options?: ChangesetOptions\r\n ): void {\r\n this.removes.push(\r\n this.platform.write({\r\n options,\r\n attributes: { properties },\r\n target: this.target,\r\n removable: this.clearOnDispose,\r\n })\r\n );\r\n }\r\n\r\n writeContext(context: Partial<ComponentNodeContext>, options?: ChangesetOptions): void {\r\n this.removes.push(\r\n this.platform.write({\r\n options,\r\n attributes: { context },\r\n target: this.target,\r\n removable: this.clearOnDispose,\r\n })\r\n );\r\n }\r\n\r\n writeLayout(layout: Partial<ComponentNodeLayout>, options?: ChangesetOptions): void {\r\n this.removes.push(\r\n this.platform.write({\r\n options,\r\n attributes: { layout },\r\n target: this.target,\r\n removable: this.clearOnDispose,\r\n })\r\n );\r\n }\r\n\r\n dispose() {\r\n this.removes.forEach((remove) => {\r\n remove();\r\n });\r\n this.actions.dispose();\r\n }\r\n}\r\n","import { EventSubscriptionCancellation } from '@webprovisions/platform';\r\nimport { ComponentNodeController } from './component-controller';\r\nimport { ComponentNode } from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\nimport { ComponentQuery } from './component-query';\r\n\r\nexport type ActionData = any;\r\n\r\nexport type ActionHandler = (data: any, options: any, instance: ComponentNodeController) => any;\r\nexport type NextActionDelegate = (data: any, options?: any) => Promise<any>;\r\nexport type WatchActionDelegate = (\r\n input: ActionData,\r\n next: NextActionDelegate,\r\n instance: ComponentNodeController\r\n) => Promise<any> | any;\r\nexport type ActionWatcherContext = {\r\n source: ComponentNode;\r\n action: string;\r\n};\r\n\r\nexport type ActionsState = {\r\n handlers: {\r\n fn: ActionHandler;\r\n key: string;\r\n target: ComponentQuery;\r\n ns?: string;\r\n }[];\r\n\r\n watchers: {\r\n target: ComponentQuery;\r\n fn: WatchActionDelegate;\r\n key: string;\r\n ns?: string;\r\n }[];\r\n};\r\n\r\ntype ActionWatcherExecutionResult = {\r\n data: any;\r\n options: any;\r\n cancelled: boolean;\r\n};\r\n\r\nconst executeActionListeners = (\r\n listeners: WatchActionDelegate[],\r\n data: any,\r\n controller: ComponentNodeController\r\n): Promise<ActionWatcherExecutionResult> => {\r\n const stack = listeners.concat();\r\n const dispatch = (\r\n data: any,\r\n globalOptions: any,\r\n controller: ComponentNodeController\r\n ): Promise<ActionWatcherExecutionResult> => {\r\n let cancelled = true;\r\n if (stack.length) {\r\n const handler = stack.shift() as WatchActionDelegate;\r\n\r\n const next = (data: any, options: any) => {\r\n cancelled = false;\r\n return dispatch(data, Object.assign({}, globalOptions, options), controller);\r\n };\r\n\r\n return Promise.resolve(handler(data, next, controller)).then((result) => ({\r\n ...result,\r\n cancelled,\r\n }));\r\n }\r\n\r\n return Promise.resolve({ data, cancelled: false, options: globalOptions });\r\n };\r\n return dispatch(data, {}, controller);\r\n};\r\n\r\nexport class ActionsController {\r\n private subscriptions: (() => void)[] = [];\r\n constructor(\r\n private platform: ComponentPlatform,\r\n private target: ComponentQuery,\r\n private ns?: string\r\n ) {\r\n this.create = this.create.bind(this);\r\n }\r\n\r\n create(key: string, fn: ActionHandler = () => {}): EventSubscriptionCancellation {\r\n const handler = {\r\n key,\r\n fn,\r\n target: this.target,\r\n ns: this.ns,\r\n };\r\n this.platform.actionsState.handlers.push(handler);\r\n const subscription = () => {\r\n const index = this.platform.actionsState.handlers.indexOf(handler);\r\n if (index > -1) {\r\n this.platform.actionsState.handlers.splice(index, 1);\r\n }\r\n };\r\n this.subscriptions.push(subscription);\r\n return subscription;\r\n }\r\n\r\n dispatch(key: string, data: any): Promise<{ [instanceId: string]: any }> {\r\n const instances: ComponentNode[] = this.platform.nodes.all.concat(\r\n this.platform.nodes.detached\r\n );\r\n\r\n const output: { [instanceId: string]: any } = {};\r\n\r\n // handlers matching the specified pattern.\r\n const handlers = this.platform.actionsState.handlers.filter(\r\n (handler) => handler.key === key && (!handler.ns || !this.ns || handler.ns === this.ns)\r\n );\r\n\r\n return Promise.all(\r\n handlers.map((handler) => {\r\n // select all matching instances for this particular\r\n // handler (a handler can be mapped to many instances)\r\n const matchedInstances = instances.filter(\r\n (instance) => handler.target.match(instance) && this.target.match(instance)\r\n );\r\n\r\n // execute watchers for each matched instance\r\n const watchers = this.platform.actionsState.watchers\r\n .filter((watcher) => {\r\n return (\r\n watcher.key === key &&\r\n (!watcher.ns || !this.ns || watcher.ns === this.ns) &&\r\n matchedInstances.some((instance) => watcher.target.match(instance))\r\n );\r\n })\r\n .map((watcher) => watcher.fn);\r\n\r\n // execute watchers and handler for each instance\r\n return Promise.all(\r\n matchedInstances.map((node) => {\r\n const controller = new ComponentNodeController(\r\n this.platform,\r\n node,\r\n this.ns\r\n );\r\n return executeActionListeners(watchers, data, controller).then((input) => {\r\n const { data = {}, options, cancelled } = input;\r\n return Promise.resolve(\r\n cancelled ? {} : handler.fn(data, options, controller)\r\n ).then((handlerResponse) => {\r\n output[node.id] = handlerResponse;\r\n });\r\n });\r\n })\r\n );\r\n })\r\n ).then(() => output);\r\n }\r\n\r\n watch(key: string, fn: WatchActionDelegate): EventSubscriptionCancellation {\r\n let parsedKey = key;\r\n let parsedNs = this.ns;\r\n const sections = key.split('.');\r\n\r\n if (sections.length > 1) {\r\n parsedNs = sections[0];\r\n parsedKey = sections.splice(1).join('.');\r\n }\r\n const watcher = {\r\n fn,\r\n target: this.target,\r\n key: parsedKey,\r\n ns: parsedNs,\r\n };\r\n this.platform.actionsState.watchers.push(watcher);\r\n const subscription = () => {\r\n const index = this.platform.actionsState.watchers.indexOf(watcher);\r\n if (index > -1) {\r\n this.platform.actionsState.watchers.splice(index, 1);\r\n }\r\n };\r\n this.subscriptions.push(subscription);\r\n return subscription;\r\n }\r\n\r\n dispose() {\r\n this.subscriptions.forEach((unsubscribe) => unsubscribe());\r\n }\r\n}\r\n","import { createConfigurationApi } from '@webprovisions/platform';\r\nimport { CustomHandlerCallback } from './custom-component-handler';\r\n\r\ntype Options = {\r\n handlers?: [string, CustomHandlerCallback][];\r\n};\r\n\r\nexport default createConfigurationApi((builder) => {\r\n builder.createCommand('components', (context) => (config: Options) => {\r\n context.events.subscribeOnce('components:platform-created', (event, { platform }) => {\r\n if (config.handlers) {\r\n config.handlers.forEach(([key, handler]) => {\r\n platform.addComponentHandler(key, handler);\r\n });\r\n }\r\n });\r\n });\r\n});\r\n","import { Logger, uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventManager, EventSubscriptionCancellation } from '@webprovisions/platform';\r\nimport { Breakpoints } from '../types';\r\n\r\nexport type ComponentNodeEventData = { node: ComponentNode };\r\n\r\nexport type RemoveChangeset = () => void;\r\n\r\nexport type ComponentNodeAttributes = {\r\n tags: string[];\r\n properties: ComponentNodeProperties;\r\n context: ComponentNodeContext;\r\n layout: ComponentNodeLayout;\r\n};\r\n\r\nexport type ResolveComponentNodeProperties = (\r\n properties: ComponentNodeProperties\r\n) => Partial<ComponentNodeProperties> | void;\r\n\r\nexport type ResolveComponentNodeContext = (\r\n context: ComponentNodeContext\r\n) => Partial<ComponentNodeContext>;\r\n\r\nexport type ResolveComponentNodeLayout = (\r\n layout: ComponentNodeLayout\r\n) => Partial<ComponentNodeLayout>;\r\n\r\nexport type ComponentNodeSettings = {\r\n tags?: string[];\r\n properties?: ComponentNodeProperties | ResolveComponentNodeProperties;\r\n context?: ComponentNodeContext | ResolveComponentNodeContext;\r\n layout?: ComponentNodeLayout | ResolveComponentNodeLayout;\r\n};\r\n\r\nexport type ComponentNodeProperties = { [key: string]: any };\r\n\r\nexport type ComponentNodeContext = { [key: string]: any };\r\n\r\nexport type ComponentNodeLayout = {\r\n size?: Size;\r\n indent?: number;\r\n order?: number;\r\n};\r\n\r\nexport type Size = number | 'full' | 'none';\r\n\r\nexport type UnmountComponentNode = () => void;\r\n\r\nexport type ChangesetOptions = {\r\n breakpoints?: Breakpoints;\r\n};\r\n\r\nexport type Changeset = [Partial<ComponentNodeSettings>, ChangesetOptions];\r\n\r\nexport class ComponentNode {\r\n id: string;\r\n type: string;\r\n name?: string;\r\n parent?: ComponentNode;\r\n tags: string[] = [];\r\n children: { [key: string]: ComponentNode[] } = {};\r\n changesets: Changeset[] = [];\r\n attributes: ComponentNodeAttributes;\r\n\r\n private mountCount = 0;\r\n\r\n constructor(private events: EventManager, type: string) {\r\n this.id = uuid();\r\n this.type = type;\r\n this.attributes = {\r\n context: {},\r\n properties: {},\r\n layout: {},\r\n tags: [],\r\n };\r\n // write default attributes\r\n this.writeLayout({ size: 'full', indent: 0 });\r\n }\r\n\r\n mount(viewOutletContainer: Container, element?: HTMLElement): UnmountComponentNode {\r\n let mountedNodes: Map<ComponentNode, EventSubscriptionCancellation> =\r\n viewOutletContainer.get('mounted-nodes');\r\n\r\n if (!mountedNodes) {\r\n mountedNodes = new Map<ComponentNode, EventSubscriptionCancellation>();\r\n viewOutletContainer.register('mounted-nodes', mountedNodes);\r\n }\r\n\r\n if (mountedNodes.has(this)) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n Logger.error('Trying to mount an already mounted component node.', this);\r\n }\r\n return () => {};\r\n }\r\n\r\n /**\r\n * Dispatched when a node is mounted in a component.\r\n * This happens once for every `ViewOutlet`.\r\n */\r\n this.events.dispatch('components:node-mounted', { node: this });\r\n\r\n if (this.mountCount === 0) {\r\n this.mountCount = this.mountCount + 1;\r\n /**\r\n * Dispatched when a node is mounted in a component the first time.\r\n */\r\n this.events.dispatch('components:node-enter', { node: this });\r\n }\r\n\r\n return () => {\r\n mountedNodes.delete(this);\r\n this.events.dispatch('components:node-unmounted', { node: this });\r\n\r\n this.mountCount = this.mountCount - 1;\r\n if (this.mountCount === 0) {\r\n this.events.dispatch('components:node-exit', { node: this });\r\n }\r\n };\r\n }\r\n\r\n appendChild(node: ComponentNode, branch: string = 'default') {\r\n if (node.parent) {\r\n if (node.parent === this) {\r\n return;\r\n }\r\n node.parent.removeChild(node);\r\n }\r\n node.parent = this;\r\n\r\n if (!this.children[branch]) {\r\n this.children[branch] = [];\r\n }\r\n this.children[branch].push(node);\r\n\r\n this.events.dispatch('components:node-appended', { node });\r\n }\r\n\r\n prependChild(node: ComponentNode, branch: string = 'default') {\r\n if (node.parent) {\r\n if (node.parent === this) {\r\n return;\r\n }\r\n node.parent.removeChild(node);\r\n }\r\n node.parent = this;\r\n\r\n if (!this.children[branch]) {\r\n this.children[branch] = [];\r\n }\r\n this.children[branch].unshift(node);\r\n\r\n this.events.dispatch('components:node-appended', { node });\r\n }\r\n\r\n touchProperties(\r\n properties: ResolveComponentNodeProperties,\r\n options: ChangesetOptions = {},\r\n removable?: boolean\r\n ): RemoveChangeset {\r\n const attributes: Partial<ComponentNodeSettings> = { properties };\r\n const changeset: Changeset = [attributes, options];\r\n this.changesets.push(changeset);\r\n this.events.dispatch('components:set-properties', { node: this });\r\n return () => {\r\n if (removable) {\r\n const indexToRemove = this.changesets.indexOf(changeset);\r\n if (indexToRemove > -1) {\r\n this.changesets.splice(indexToRemove, 1);\r\n this.events.dispatch('components:set-properties', { node: this });\r\n }\r\n }\r\n };\r\n }\r\n\r\n writeProperties(\r\n properties: Partial<ComponentNodeProperties> | ResolveComponentNodeProperties,\r\n options: ChangesetOptions = {},\r\n removable?: boolean\r\n ): RemoveChangeset {\r\n const attributes: Partial<ComponentNodeSettings> = { properties };\r\n const changeset: Changeset = [attributes, options];\r\n this.changesets.push(changeset);\r\n this.events.dispatch('components:set-properties', { node: this });\r\n return () => {\r\n if (removable) {\r\n const indexToRemove = this.changesets.indexOf(changeset);\r\n if (indexToRemove > -1) {\r\n this.changesets.splice(indexToRemove, 1);\r\n this.events.dispatch('components:set-properties', { node: this });\r\n }\r\n }\r\n };\r\n }\r\n\r\n writeLayout(\r\n layout: Partial<ComponentNodeLayout> | ResolveComponentNodeLayout,\r\n options: ChangesetOptions = {},\r\n removable?: boolean\r\n ): RemoveChangeset {\r\n const attributes: Partial<ComponentNodeSettings> = { layout };\r\n const changeset: Changeset = [attributes, options];\r\n this.changesets.push(changeset);\r\n this.events.dispatch('components:set-layout', { node: this });\r\n return () => {\r\n if (!removable) {\r\n return;\r\n }\r\n const indexToRemove = this.changesets.indexOf(changeset);\r\n if (indexToRemove > -1) {\r\n this.changesets.splice(indexToRemove, 1);\r\n this.events.dispatch('components:set-layout', { node: this });\r\n }\r\n };\r\n }\r\n\r\n writeContext(\r\n context: Partial<ComponentNodeContext> | ResolveComponentNodeContext,\r\n options: ChangesetOptions = {},\r\n removable?: boolean\r\n ): RemoveChangeset {\r\n const attributes: Partial<ComponentNodeSettings> = { context };\r\n const changeset: Changeset = [attributes, options];\r\n this.changesets.push(changeset);\r\n this.events.dispatch('components:set-context', { node: this });\r\n return () => {\r\n if (!removable) {\r\n return;\r\n }\r\n const indexToRemove = this.changesets.indexOf(changeset);\r\n if (indexToRemove > -1) {\r\n this.changesets.splice(indexToRemove, 1);\r\n this.events.dispatch('components:set-context', { node: this });\r\n }\r\n };\r\n }\r\n\r\n getChildren(branch: string = 'default'): ComponentNode[] {\r\n const children = this.children[branch] || [];\r\n return children.reduce((acc, node, i) => {\r\n const { order: index = i } = node.attributes.layout;\r\n if (!acc[index]) {\r\n acc[index] = node;\r\n } else {\r\n acc.splice(index, 0, node);\r\n }\r\n return acc;\r\n }, Array(children.length));\r\n }\r\n\r\n remove() {\r\n if (this.parent) {\r\n this.parent.removeChild(this);\r\n }\r\n }\r\n\r\n removeChild(node: ComponentNode) {\r\n Object.keys(this.children).forEach((branch) => {\r\n const children = this.children[branch];\r\n const indexToRemove = children.indexOf(node);\r\n if (indexToRemove > -1) {\r\n children.splice(indexToRemove, 1);\r\n this.events.dispatch('components:node-removed', { node, parentNode: this });\r\n }\r\n });\r\n delete node.parent;\r\n }\r\n}\r\n","import { ComponentNode } from './component-node';\r\nimport { SwitchMap } from './component-platform';\r\n\r\nconst traverseComponentsRecursive = (\r\n nodes: ComponentNode[],\r\n switches: SwitchMap,\r\n fn: (node: ComponentNode) => boolean | void\r\n) => {\r\n for (let i = 0, y = nodes.length; i < y; i++) {\r\n if (fn(nodes[i]) === true) {\r\n break;\r\n }\r\n const branch = switches[nodes[i].id] || 'default';\r\n const children = nodes[i].getChildren(branch);\r\n traverseComponentsRecursive(children, switches, fn);\r\n }\r\n};\r\n\r\nexport const traverseComponents = (\r\n root: ComponentNode,\r\n switches: SwitchMap,\r\n fn: (node: ComponentNode) => boolean | void\r\n) => {\r\n if (fn(root) !== true) {\r\n const branch = switches[root.id] || 'default';\r\n const children = root.children[branch];\r\n traverseComponentsRecursive(children, switches, fn);\r\n }\r\n};\r\n\r\nexport const findVisibleComponents = (\r\n root: ComponentNode,\r\n switches: SwitchMap\r\n): ComponentNode[] => {\r\n const nodes: ComponentNode[] = [];\r\n traverseComponents(root, switches, (node) => {\r\n nodes.push(node);\r\n });\r\n return nodes;\r\n};\r\n\r\nexport const findComponent = (\r\n root: ComponentNode,\r\n switches: SwitchMap,\r\n fn: (node: ComponentNode) => boolean\r\n) => {\r\n let matched: ComponentNode | undefined;\r\n traverseComponents(root, switches, (node) => {\r\n if (fn(node)) {\r\n matched = node;\r\n return true;\r\n }\r\n });\r\n return matched;\r\n};\r\n\r\nexport const getAncestors = (node: ComponentNode) => {\r\n if (!node.parent) {\r\n return [];\r\n }\r\n const tree: ComponentNode[] = [];\r\n let currentNode: ComponentNode | undefined = node.parent;\r\n while (currentNode) {\r\n tree.unshift(currentNode);\r\n currentNode = currentNode.parent;\r\n }\r\n return tree;\r\n};\r\n","import { EventManager } from '@webprovisions/platform';\r\nimport { ComponentNode, ComponentNodeEventData } from './component-node';\r\nimport { SwitchMap } from './component-platform';\r\nimport { findComponent, findVisibleComponents, traverseComponents } from './queries';\r\n\r\nexport type QueryDescriptor = {\r\n id?: string;\r\n type?: string;\r\n name?: string;\r\n};\r\n\r\nexport class ComponentNodeCollection {\r\n all: ComponentNode[] = [];\r\n visible: ComponentNode[] = [];\r\n detached: ComponentNode[] = [];\r\n\r\n constructor(public root: ComponentNode, private switches: SwitchMap, events: EventManager) {\r\n events.subscribe('components:node-appended', (event, data: ComponentNodeEventData) => {\r\n this.all.push(data.node);\r\n this.visible = findVisibleComponents(root, switches);\r\n });\r\n events.subscribe('components:node-removed', (event, data: ComponentNodeEventData) => {\r\n let indexToRemove = this.all.indexOf(data.node);\r\n if (indexToRemove > -1) {\r\n this.all.splice(indexToRemove, 1);\r\n }\r\n indexToRemove = this.visible.indexOf(data.node);\r\n if (indexToRemove > -1) {\r\n this.visible.splice(indexToRemove, 1);\r\n }\r\n this.visible = findVisibleComponents(root, switches);\r\n });\r\n events.subscribe('components:node-switched', (event, data: ComponentNodeEventData) => {\r\n this.visible = findVisibleComponents(root, switches);\r\n });\r\n }\r\n\r\n query(query: QueryDescriptor = {}): ComponentNode[] {\r\n const nodes: ComponentNode[] = [];\r\n traverseComponents(this.root, this.switches, (node) => {\r\n const match = Object.keys(query).every((member) => {\r\n return (<any>query)[member] === (<any>node)[member];\r\n });\r\n if (match) {\r\n nodes.push(node);\r\n }\r\n });\r\n return nodes;\r\n }\r\n\r\n get(id: string) {\r\n return (\r\n findComponent(this.root, this.switches, (node) => node.id === id) ||\r\n this.detached.find((node) => node.id === id)\r\n );\r\n }\r\n}\r\n","import { ComponentReference, ComponentSettings, ViewDefinition } from '../types';\r\nimport { ComponentNode } from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\nimport { NormalizedComponentReference } from './create-component-model';\r\n\r\nexport type CustomHandlerCallback = (\r\n ref: NormalizedComponentReference,\r\n options: {\r\n platform: ComponentPlatform;\r\n node: ComponentNode;\r\n references: ComponentReference[];\r\n definitions: { [name: string]: ComponentSettings };\r\n views: { [key: string]: ViewDefinition };\r\n branch?: string;\r\n }\r\n) => void;\r\n\r\nexport class CustomComponentHandler {\r\n private handlers = new Map<string, CustomHandlerCallback>();\r\n\r\n add(name: string, fn: CustomHandlerCallback) {\r\n this.handlers.set(name, fn);\r\n }\r\n\r\n get(name: string) {\r\n return this.handlers.get(name);\r\n }\r\n}\r\n","import { ComponentPlatform } from '.';\r\nimport { Breakpoints } from '../types';\r\nimport {\r\n ComponentNode,\r\n ResolveComponentNodeContext,\r\n ResolveComponentNodeLayout,\r\n ResolveComponentNodeProperties,\r\n} from './component-node';\r\n\r\nexport type ProcessOptions = {\r\n context?: boolean;\r\n properties?: boolean;\r\n layout?: boolean;\r\n recursive?: boolean;\r\n};\r\n\r\nexport type StateProcessor = (node: ComponentNode, options: ProcessOptions) => void;\r\n\r\nconst calculateNodeIndex = (node: ComponentNode): number => {\r\n let currentNode = node;\r\n let index = 0;\r\n\r\n while (currentNode.parent) {\r\n index = index + 1;\r\n currentNode = currentNode.parent;\r\n }\r\n\r\n return index;\r\n};\r\n\r\nconst sortQueue = (queue: [ComponentNode, ProcessOptions][]): [ComponentNode, ProcessOptions][] => {\r\n const mapped: [number, ComponentNode, ProcessOptions][] = queue.map(([node, options]) => {\r\n return [calculateNodeIndex(node), node, options];\r\n });\r\n return mapped\r\n .sort(([a], [b]) => a - b)\r\n .map(([, node, options]) => {\r\n return [node, options];\r\n });\r\n};\r\n\r\nconst isObject = (item: any) => {\r\n return item && typeof item === 'object' && !Array.isArray(item);\r\n};\r\n\r\nconst mergeDeep = (target: any, ...sources: any[]): any => {\r\n if (!sources.length) return target;\r\n const source = sources.shift();\r\n\r\n if (isObject(target) && isObject(source)) {\r\n for (const key in source) {\r\n if (isObject(source[key])) {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n mergeDeep(target[key], source[key]);\r\n } else {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n return mergeDeep(target, ...sources);\r\n};\r\n\r\nconst matchesBreakpoint = (b1: Breakpoints | undefined, b2: string[]) => {\r\n if (!b1 || b1 === 'all') {\r\n return true;\r\n }\r\n return b1.some((b1) => b2.indexOf(b1) > -1);\r\n};\r\n\r\nexport type ProcessResult = Map<ComponentNode, ProcessOptions>;\r\n\r\nexport type ProcessReportCallback = (report: ProcessResult) => void;\r\n\r\nexport const createStateProcessor = (\r\n platform: ComponentPlatform,\r\n callback: ProcessReportCallback\r\n): StateProcessor => {\r\n let nodeQueue: ComponentNode[] = [];\r\n let optionsQueue: ProcessOptions[] = [];\r\n\r\n let timeout: NodeJS.Timeout;\r\n\r\n const flush = () => {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.time('state-processor.flush');\r\n }\r\n const processHistory: Map<ComponentNode, ProcessOptions> = new Map();\r\n const sortedQueue = sortQueue(nodeQueue.map((node, i) => [node, optionsQueue[i]]));\r\n\r\n const processNode = (node: ComponentNode, options: ProcessOptions) => {\r\n const history = processHistory.get(node) || {};\r\n\r\n // todo: this doesnt take overrides into account\r\n const processContext = options.context && !history.context;\r\n const processProperties = options.properties && !history.properties;\r\n const processLayout = options.layout && !history.layout;\r\n\r\n processHistory.set(node, {\r\n context: history.context || processContext,\r\n properties: history.properties || processProperties,\r\n layout: history.layout || processLayout,\r\n });\r\n\r\n if (processProperties) {\r\n node.attributes.properties = {};\r\n }\r\n if (processLayout) {\r\n node.attributes.layout = {};\r\n }\r\n\r\n if (processContext) {\r\n node.attributes.context = mergeDeep({}, node.parent?.attributes.context);\r\n }\r\n\r\n const propertyResolvers: ResolveComponentNodeProperties[] = [];\r\n const layoutResolvers: ResolveComponentNodeLayout[] = [];\r\n const contextResolvers: ResolveComponentNodeContext[] = [];\r\n\r\n node.changesets.forEach((changeset) => {\r\n const [change, options] = changeset;\r\n if (matchesBreakpoint(options.breakpoints, platform.breakpoints)) {\r\n if (processProperties) {\r\n if (typeof change.properties === 'function') {\r\n propertyResolvers.push(\r\n <ResolveComponentNodeProperties>change.properties\r\n );\r\n } else {\r\n mergeDeep(node.attributes.properties, change.properties);\r\n }\r\n }\r\n\r\n if (processLayout) {\r\n if (typeof change.layout === 'function') {\r\n layoutResolvers.push(<ResolveComponentNodeLayout>change.layout);\r\n } else {\r\n mergeDeep(node.attributes.layout, change.layout);\r\n }\r\n }\r\n\r\n if (processContext) {\r\n if (typeof change.context === 'function') {\r\n contextResolvers.push(<ResolveComponentNodeContext>change.context);\r\n } else {\r\n mergeDeep(node.attributes.context, change.context);\r\n }\r\n }\r\n }\r\n });\r\n\r\n propertyResolvers.forEach((resolver) => {\r\n mergeDeep(node.attributes.properties, resolver(node.attributes.properties));\r\n });\r\n\r\n layoutResolvers.forEach((resolver) => {\r\n mergeDeep(node.attributes.layout, resolver(node.attributes.layout));\r\n });\r\n\r\n contextResolvers.forEach((resolver) => {\r\n mergeDeep(node.attributes.context, resolver(node.attributes.context));\r\n });\r\n\r\n if (processContext || options.recursive) {\r\n const branch = platform.getBranch(node);\r\n const childOptions: ProcessOptions = options.recursive\r\n ? options\r\n : {\r\n context: !!processContext,\r\n };\r\n node.getChildren(branch).forEach((child) => {\r\n processNode(child, childOptions);\r\n });\r\n }\r\n };\r\n\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.timeEnd('state-processor.flush');\r\n }\r\n\r\n sortedQueue.forEach(([node, options]) => {\r\n processNode(node, options);\r\n });\r\n\r\n nodeQueue = [];\r\n optionsQueue = [];\r\n\r\n callback(processHistory);\r\n };\r\n\r\n const schedule = () => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(flush, 0);\r\n };\r\n\r\n return (node, options) => {\r\n const index = nodeQueue.indexOf(node);\r\n\r\n if (index > -1) {\r\n // if node already exist in queue, update its options\r\n const summary = optionsQueue[index];\r\n if (options.context) {\r\n summary.context = true;\r\n }\r\n if (options.properties) {\r\n summary.properties = true;\r\n }\r\n if (options.layout) {\r\n summary.layout = true;\r\n }\r\n if (options.recursive) {\r\n summary.recursive = true;\r\n }\r\n return schedule();\r\n }\r\n\r\n nodeQueue.push(node);\r\n optionsQueue.push(options);\r\n\r\n return schedule();\r\n };\r\n};\r\n","import { uuid } from '@telia-ace/widget-utilities';\r\nimport {\r\n Container,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n Widget,\r\n} from '@webprovisions/platform';\r\nimport { ActionsController, ActionsState } from './actions-controller';\r\nimport { ChangesetProvider } from './changeset-provider';\r\nimport {\r\n Changeset,\r\n ChangesetOptions,\r\n ComponentNode,\r\n ComponentNodeEventData,\r\n ComponentNodeSettings,\r\n RemoveChangeset,\r\n} from './component-node';\r\nimport { ComponentNodeCollection } from './component-node-collection';\r\nimport { ComponentQuery } from './component-query';\r\nimport { CustomComponentHandler, CustomHandlerCallback } from './custom-component-handler';\r\nimport { createStateProcessor, StateProcessor } from './state-processor';\r\n\r\nexport type MergeOptions = { breakpoints?: string[] };\r\n\r\ntype AbstractChangesetRecord = {\r\n changeset: Changeset;\r\n target: ComponentQuery;\r\n removes: RemoveChangeset[];\r\n};\r\n\r\nexport type SwitchMap = { [id: string]: string };\r\n\r\nexport type ChangesetData = {\r\n key?: string;\r\n target: ComponentQuery;\r\n attributes: Partial<ComponentNodeSettings>;\r\n options?: ChangesetOptions;\r\n removable?: boolean;\r\n provider?: string;\r\n};\r\n\r\nexport class ComponentPlatform {\r\n events: EventManager;\r\n breakpoints: string[] = [];\r\n nodes: ComponentNodeCollection;\r\n // internal\r\n actionsState: ActionsState = { handlers: [], watchers: [] };\r\n\r\n private switches: SwitchMap = {};\r\n private changesets: AbstractChangesetRecord[] = [];\r\n private subscriptions: EventSubscriptionCancellation[] = [];\r\n private processNode: StateProcessor;\r\n private customComponentHandler = new CustomComponentHandler();\r\n\r\n constructor(widget: Widget, private providers: { [key: string]: ChangesetProvider } = {}) {\r\n this.events = widget.events.createChild(this);\r\n const root = new ComponentNode(this.events, 'root');\r\n root.name = `root-${widget.name}`;\r\n this.nodes = new ComponentNodeCollection(root, this.switches, this.events);\r\n\r\n const processNode = (this.processNode = createStateProcessor(this, (report) => {\r\n const nodes = Array.from(report.keys());\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.info(`STATE PROCESSOR: ${nodes.length} node(s) processed:\r\n${nodes.map(\r\n (node) => `${node.name || '<no name>'} (${node.id})\r\n`\r\n)}`);\r\n }\r\n nodes.forEach((node) => {\r\n const options = report.get(node);\r\n if (node.parent && node.parent.type === 'root') {\r\n this.events.dispatch('components:root-children-changed', { node });\r\n }\r\n if (options?.context) {\r\n this.events.dispatch('components:context-changed', { node });\r\n }\r\n if (options?.properties) {\r\n this.events.dispatch('components:properties-changed', { node });\r\n }\r\n if (options?.layout) {\r\n this.events.dispatch('components:layout-changed', { node });\r\n }\r\n });\r\n this.events.dispatch('components:component-model-initialized', {}, { bubbles: true });\r\n }));\r\n\r\n Promise.all(\r\n Object.keys(providers).map((key) => {\r\n const provider = providers[key];\r\n return provider.load(this);\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:node-appended',\r\n (event, data: ComponentNodeEventData) => {\r\n const { node } = data;\r\n this.changesets.forEach((record) => {\r\n const { changeset, target, removes } = record;\r\n const [change, options] = changeset;\r\n if (target.match(data.node)) {\r\n if (change.properties) {\r\n removes.push(node.writeProperties(change.properties, options));\r\n }\r\n if (change.context) {\r\n removes.push(node.writeContext(change.context, options));\r\n }\r\n if (change.layout) {\r\n removes.push(node.writeLayout(change.layout, options));\r\n }\r\n }\r\n });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:node-appended',\r\n (event, data: ComponentNodeEventData) => {\r\n processNode(data.node, { properties: true, context: true });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:set-properties',\r\n (event, data: ComponentNodeEventData) => {\r\n processNode(data.node, { properties: true });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:set-context',\r\n (event, data: ComponentNodeEventData) => {\r\n processNode(data.node, { properties: true, context: true });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:set-indent',\r\n (event, data: ComponentNodeEventData) => {\r\n processNode(data.node, { layout: true });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:set-layout',\r\n (event, data: ComponentNodeEventData) => {\r\n processNode(data.node, { layout: true });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe('components:node-switched', (event, { node, branch }) => {\r\n processNode(node, {\r\n layout: true,\r\n recursive: true,\r\n properties: true,\r\n context: true,\r\n });\r\n })\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe('components:node-removed', (event, { parentNode }) => {\r\n processNode(parentNode, { properties: true });\r\n })\r\n );\r\n\r\n if (this.events.parent) {\r\n this.events.parent.dispatch('components:platform-created', { platform: this });\r\n }\r\n }\r\n\r\n static getInstance(container: Container): Promise<ComponentPlatform> {\r\n return container.getAsync('components');\r\n }\r\n\r\n addBreakpoint(name: string) {\r\n if (this.breakpoints.indexOf(name) === -1) {\r\n this.breakpoints.push(name);\r\n this.processNode(this.nodes.root, {\r\n context: true,\r\n properties: true,\r\n layout: true,\r\n recursive: true,\r\n });\r\n }\r\n }\r\n\r\n removeBreakpoint(name: string) {\r\n const indexToRemove = this.breakpoints.indexOf(name);\r\n if (indexToRemove > -1) {\r\n this.breakpoints.splice(indexToRemove, 1);\r\n this.processNode(this.nodes.root, {\r\n context: true,\r\n properties: true,\r\n layout: true,\r\n recursive: true,\r\n });\r\n }\r\n }\r\n\r\n setSwitch(node: ComponentNode, branch: string) {\r\n this.switches[node.id] = branch;\r\n this.events.dispatch('components:node-switched', { node, branch });\r\n }\r\n\r\n getBranch(node: ComponentNode): string | undefined {\r\n return this.switches[node.id];\r\n }\r\n\r\n /**\r\n * Creates a `ComponentNode` of the specified type.\r\n * @param type Type of node.\r\n */\r\n createNode(type: string, options: { detached?: boolean } = {}): ComponentNode {\r\n const node = new ComponentNode(this.events, type);\r\n if (options.detached) {\r\n this.nodes.detached.push(node);\r\n }\r\n return node;\r\n }\r\n\r\n components(): ComponentQuery {\r\n return new ComponentQuery(this);\r\n }\r\n\r\n actions(target: ComponentQuery, ns: string): ActionsController {\r\n return new ActionsController(this, <any>target, ns);\r\n }\r\n\r\n write(data: ChangesetData): RemoveChangeset {\r\n const { provider: providerName, target, attributes, options = {}, removable } = data;\r\n const key = data.key || uuid();\r\n const changeset: Changeset = [attributes, options];\r\n const record: AbstractChangesetRecord = { changeset, target, removes: [] };\r\n if (providerName) {\r\n const provider = this.providers[providerName];\r\n provider.write(key, target, attributes, options);\r\n record.removes.push(() => {\r\n provider.remove(key);\r\n });\r\n }\r\n\r\n this.changesets.push(record);\r\n this.nodes.all.forEach((node) => {\r\n if (target.match(node)) {\r\n let remove: RemoveChangeset = () => {};\r\n if (attributes.properties) {\r\n remove = node.writeProperties(attributes.properties, options, removable);\r\n }\r\n if (attributes.context) {\r\n remove = node.writeContext(attributes.context, options, removable);\r\n }\r\n if (attributes.layout) {\r\n remove = node.writeContext(attributes.layout, options, removable);\r\n }\r\n record.removes.push(remove);\r\n }\r\n });\r\n return () => {\r\n if (removable) {\r\n record.removes.forEach((remove) => remove());\r\n const indexToRemove = this.changesets.indexOf(record);\r\n if (indexToRemove > -1) {\r\n this.changesets.splice(indexToRemove, 1);\r\n }\r\n }\r\n };\r\n }\r\n\r\n addComponentHandler(definitionType: string, fn: CustomHandlerCallback) {\r\n this.customComponentHandler.add(definitionType, fn);\r\n }\r\n\r\n getComponentHandler(definitionType: string) {\r\n return this.customComponentHandler.get(definitionType);\r\n }\r\n\r\n dispose() {\r\n this.subscriptions.forEach((sub) => sub());\r\n }\r\n}\r\n","import { Logger } from '@telia-ace/widget-utilities';\r\nimport { EventSubscriptionCancellation } from '@webprovisions/platform';\r\nimport { Breakpoints, ComponentSettings, ViewDefinition, WidgetSettings } from '../types';\r\nimport {\r\n ComponentNode,\r\n ComponentNodeContext,\r\n ComponentNodeLayout,\r\n ComponentNodeProperties,\r\n} from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\n\r\ntype ComponentReference = string | [string, ...ComponentReferenceOverride[]];\r\n\r\ntype ComponentReferenceOverride = {\r\n breakpoints?: Breakpoints;\r\n tags?: string[];\r\n context?: ComponentNodeContext;\r\n properties?: ComponentNodeProperties;\r\n layout?: ComponentNodeLayout;\r\n};\r\n\r\nexport type NormalizedComponentReference = {\r\n definitionId: string;\r\n overrides: ComponentReferenceOverride[];\r\n};\r\n\r\nexport const normalizeReference = (reference: ComponentReference): NormalizedComponentReference => {\r\n if (Array.isArray(reference)) {\r\n const [definitionId, ...overrides] = reference;\r\n return {\r\n definitionId,\r\n overrides,\r\n };\r\n }\r\n return {\r\n definitionId: reference,\r\n overrides: [],\r\n };\r\n};\r\n\r\nexport type ComponentHandlerOptions = {\r\n platform: ComponentPlatform;\r\n node: ComponentNode;\r\n references: ComponentReference[];\r\n definitions: { [name: string]: ComponentSettings };\r\n views: { [key: string]: ViewDefinition };\r\n branch?: string;\r\n};\r\n\r\nexport const createChildren = (\r\n platform: ComponentPlatform,\r\n node: ComponentNode,\r\n references: ComponentReference[],\r\n definitions: { [name: string]: ComponentSettings },\r\n views: { [key: string]: ViewDefinition },\r\n branch?: string\r\n) => {\r\n references.forEach((ref) => {\r\n const childRef = normalizeReference(ref);\r\n const childDef = definitions[childRef.definitionId];\r\n if (childRef.definitionId === 'view') {\r\n const viewNode = platform.createNode('view');\r\n viewNode.name = 'view';\r\n Object.keys(views).forEach((key) => {\r\n const viewDef = views[key];\r\n createChildren(platform, viewNode, [viewDef.entry], definitions, views, key);\r\n });\r\n node.appendChild(viewNode);\r\n\r\n childRef.overrides.forEach((override) => {\r\n if (override.properties) {\r\n viewNode.writeProperties(override.properties, {\r\n breakpoints: override.breakpoints,\r\n });\r\n }\r\n if (override.context) {\r\n viewNode.writeContext(override.context, { breakpoints: override.breakpoints });\r\n }\r\n if (override.layout) {\r\n viewNode.writeLayout(override.layout, { breakpoints: override.breakpoints });\r\n }\r\n });\r\n } else if (platform.getComponentHandler(childDef.type)) {\r\n const handle = platform.getComponentHandler(childDef.type);\r\n if (handle) {\r\n handle(childRef, {\r\n platform,\r\n node,\r\n references,\r\n definitions,\r\n views,\r\n branch,\r\n });\r\n }\r\n } else {\r\n const childDef = definitions[childRef.definitionId];\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (!childDef) {\r\n Logger.error(\r\n `No definition found for component type '${childRef.definitionId}'.`\r\n );\r\n return;\r\n }\r\n }\r\n const childNode = platform.createNode(childDef.type);\r\n childNode.name = childRef.definitionId;\r\n childNode.tags = childDef.tags || [];\r\n if (childDef.properties) {\r\n childNode.writeProperties(childDef.properties);\r\n }\r\n if (childDef.context) {\r\n childNode.writeContext(childDef.context);\r\n }\r\n if (childDef.layout) {\r\n childNode.writeLayout(childDef.layout);\r\n }\r\n node.appendChild(childNode, branch);\r\n\r\n childRef.overrides.forEach((override) => {\r\n const options = { breakpoints: override.breakpoints };\r\n if (override.properties) {\r\n childNode.writeProperties(override.properties, options);\r\n }\r\n if (override.context) {\r\n childNode.writeContext(override.context, options);\r\n }\r\n if (override.layout) {\r\n childNode.writeLayout(override.layout, options);\r\n }\r\n });\r\n\r\n if (childDef.children) {\r\n createChildren(platform, childNode, childDef.children, definitions, views);\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport const createComponentModel = (\r\n platform: ComponentPlatform,\r\n settings: WidgetSettings\r\n): EventSubscriptionCancellation => {\r\n const { entry, components, breakpoints, views } = settings;\r\n const subscriptions: EventSubscriptionCancellation[] = [];\r\n\r\n Object.keys(breakpoints).forEach((name) => {\r\n const query = breakpoints[name];\r\n const list = window.matchMedia(query);\r\n if (list.matches) {\r\n platform.breakpoints.push(name);\r\n }\r\n const listener = (event: MediaQueryListEvent) => {\r\n if (event.matches) {\r\n platform.addBreakpoint(name);\r\n } else {\r\n platform.removeBreakpoint(name);\r\n }\r\n };\r\n list.addListener(listener);\r\n subscriptions.push(() => list.removeListener(listener));\r\n });\r\n\r\n createChildren(platform, platform.nodes.root, [entry], components, views);\r\n\r\n return () =>\r\n subscriptions.forEach((sub) => {\r\n sub();\r\n });\r\n};\r\n","import { ComponentNode } from './component-node';\r\n\r\nexport type ComponentDescriptor = {\r\n id: string;\r\n type?: string;\r\n name?: string;\r\n branch: string;\r\n};\r\n\r\nexport const asDescriptor = (node: ComponentNode, branch?: string): ComponentDescriptor => {\r\n return {\r\n id: node.id,\r\n type: node.type,\r\n name: node.name,\r\n branch: branch || 'default',\r\n };\r\n};\r\n","import { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventSubscriptionCancellation } from '@webprovisions/platform';\r\nimport { ComponentNodeController } from './component-controller';\r\nimport { ComponentNode } from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\nimport { ComponentQuery } from './component-query';\r\n\r\nexport type ExtendComponentHandler = (controller: ComponentNodeController) => any;\r\n\r\nexport type ExtendComponentOptions = {\r\n reuseController?: boolean;\r\n};\r\n\r\nexport const extendComponent = (\r\n container: Container,\r\n typeOrQuery: string | ComponentQuery,\r\n handler: ExtendComponentHandler,\r\n ns: string = uuid(),\r\n options: ExtendComponentOptions = {}\r\n): Promise<void> => {\r\n return container.getAsync('components').then((components: ComponentPlatform) => {\r\n let target: ComponentQuery;\r\n if (typeof typeOrQuery === 'string') {\r\n const collection = new ComponentQuery(components);\r\n collection.ofType(typeOrQuery);\r\n target = collection;\r\n } else {\r\n target = typeOrQuery;\r\n }\r\n\r\n const managedInstances: {\r\n [instanceId: string]: {\r\n dispose: EventSubscriptionCancellation;\r\n controller: ComponentNodeController;\r\n };\r\n } = {};\r\n\r\n const getOrCreateController = (node: ComponentNode): Promise<ComponentNodeController> => {\r\n const existing = managedInstances[node.id];\r\n if (existing) {\r\n return Promise.resolve(existing.controller);\r\n }\r\n return ComponentPlatform.getInstance(container).then((platform) => {\r\n return new ComponentNodeController(platform, node, ns);\r\n });\r\n };\r\n\r\n components.events.subscribe(\r\n 'components:node-enter',\r\n (event, { node }: { node: ComponentNode }) => {\r\n if (target.match(node)) {\r\n getOrCreateController(node).then((controller) => {\r\n Promise.resolve(handler(controller)).then((dispose) => {\r\n managedInstances[node.id] = {\r\n dispose,\r\n controller,\r\n };\r\n });\r\n });\r\n }\r\n }\r\n );\r\n components.events.subscribe(\r\n 'components:node-exit',\r\n (event, { node }: { node: ComponentNode }) => {\r\n const instance = managedInstances[node.id];\r\n if (instance) {\r\n instance.dispose && instance.dispose();\r\n if (!options.reuseController) {\r\n instance.controller.dispose();\r\n delete managedInstances[node.id];\r\n }\r\n }\r\n }\r\n );\r\n });\r\n};\r\n","import { Logger } from '@telia-ace/widget-utilities';\r\nimport {\r\n Container,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n WidgetType,\r\n} from '@webprovisions/platform';\r\n\r\nexport type ReactComponent = any | null;\r\n\r\nexport default class ComponentResolver {\r\n aliases: Map<string, string> = new Map();\r\n components: Map<string, any> = new Map();\r\n events: EventManager;\r\n logger = new Logger();\r\n\r\n constructor(container: Container) {\r\n const { events }: WidgetType = container.get('$widget');\r\n this.events = events;\r\n }\r\n\r\n getComponent(key: string): ReactComponent {\r\n const alias = this.aliases.get(key);\r\n const component = this.components.get(alias || key) || null;\r\n\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (!component) {\r\n this.logger.warn(\r\n alias || key,\r\n `Unable to resolve component: \"${\r\n alias || key\r\n }\". You most likely forgot to register the required plugin for: ${\r\n alias || key\r\n }.`\r\n );\r\n }\r\n }\r\n\r\n return component;\r\n }\r\n\r\n registerComponent(key: string, component: ReactComponent): EventSubscriptionCancellation {\r\n this.components.set(key, component);\r\n\r\n this.events.dispatch('component-resolver:resolve', key);\r\n\r\n return () => {\r\n this.components.delete(key);\r\n };\r\n }\r\n\r\n registerResolver(\r\n key: string,\r\n fn: (component: ReactComponent) => void\r\n ): EventSubscriptionCancellation {\r\n return this.events.subscribe('component-resolver:resolve', (e, data: string) => {\r\n if (data === key) {\r\n const component = this.getComponent(key);\r\n fn(component);\r\n }\r\n });\r\n }\r\n\r\n registerAlias(alias: string, key: string): EventSubscriptionCancellation {\r\n this.aliases.set(alias, key);\r\n\r\n this.events.dispatch('component-resolver:resolve', alias);\r\n\r\n return () => {\r\n this.aliases.delete(alias);\r\n };\r\n }\r\n}\r\n","import { ComponentNodeLayout } from '../component-platform';\r\n\r\nexport type ComponentSettings = {\r\n type: string;\r\n context?: Context;\r\n properties?: Properties;\r\n layout?: ComponentNodeLayout;\r\n tags?: string[];\r\n children?: ComponentReference[];\r\n};\r\n\r\nenum HistoryMode {\r\n scopedHash = 'scopedHash',\r\n hash = 'hash',\r\n browser = 'browser',\r\n memory = 'memory',\r\n}\r\n\r\nexport type RoutingSettings = {\r\n initialPath: string;\r\n mode: HistoryMode;\r\n basePath?: string;\r\n};\r\n\r\nexport type ComponentReference = string | [string, ...ComponentReferenceOverride[]];\r\n\r\nexport type Properties = { [key: string]: any };\r\n\r\nexport type Context = { [key: string]: any };\r\n\r\nexport type ViewDefinition = {\r\n path: string | string[];\r\n entry: ComponentReference;\r\n};\r\n\r\nexport type Breakpoints = 'all' | string[];\r\n\r\nexport type ComponentReferenceOverride = {\r\n breakpoints?: Breakpoints;\r\n size?: number | 'full' | 'none';\r\n indent?: number;\r\n tags?: string[];\r\n context?: Context;\r\n properties?: Properties;\r\n};\r\n\r\nexport type ComponentDefinitionMap = {\r\n [name: string]: ComponentSettings;\r\n};\r\n\r\nexport type WidgetSettings = {\r\n data: { projection: string; site?: 'current' | 'referrer'; forceHttps?: boolean };\r\n components: ComponentDefinitionMap;\r\n entry: ComponentReference;\r\n breakpoints: { [name: string]: string };\r\n routing: RoutingSettings;\r\n views: { [name: string]: ViewDefinition };\r\n integrationResources: { path: string; mediaQueriesSupported: boolean }[];\r\n trigger?: { symbol?: Symbol; label?: string; action?: string };\r\n activate?: boolean | null;\r\n plugins?: { [key: string]: any };\r\n};\r\n\r\nexport type MinMax = {\r\n min: string;\r\n max: string;\r\n};\r\n\r\ntype Symbol = {\r\n type: 'Uri' | 'Svg' | 'FontAwesome' | 'Text' | string;\r\n content: string;\r\n};\r\n\r\nexport enum WidgetRenderState {\r\n open = 'open',\r\n closed = 'closed',\r\n hidden = 'hidden',\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/action-resolver.ts","../src/event-subscriber.ts","../src/component-platform/component-query.ts","../src/component-platform/component-controller.ts","../src/component-platform/actions-controller.ts","../src/component-platform/component-configuration-api.ts","../src/component-platform/component-node.ts","../src/component-platform/queries.ts","../src/component-platform/component-node-collection.ts","../src/component-platform/custom-component-handler.ts","../src/component-platform/state-processor.ts","../src/component-platform/component-platform.ts","../src/component-platform/create-component-model.ts","../src/component-platform/descriptor.ts","../src/component-platform/extend-component.ts","../src/component-resolver.ts","../src/types/configuration.ts"],"sourcesContent":["import {\r\n Container,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n Widget,\r\n} from '@webprovisions/platform';\r\n\r\nexport type Action = (origin: string, action: string, value?: any) => void;\r\n\r\nexport default class ActionResolver {\r\n private events: EventManager;\r\n\r\n constructor(container: Container) {\r\n const { events }: Widget = container.get('$widget');\r\n this.events = events.createChild(this);\r\n }\r\n\r\n action(target: string, action: string, value: any): void {\r\n this.events.dispatch('data:action', { action, value, target }, { bubbles: true });\r\n }\r\n\r\n subscribe(origin: string, fn: Action): EventSubscriptionCancellation {\r\n return this.events.subscribe(\r\n 'data:action',\r\n (e, { action, value, target }) => origin === target && fn(origin, action, value)\r\n );\r\n }\r\n}\r\n","import {\r\n EventListener,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n} from '@webprovisions/platform';\r\n\r\nexport type SubscribeDelegate = (type: string, listener: EventListener) => void;\r\n\r\n/**\r\n * Creates s subscriber for the specified `EventManager` and provides a single cancellation\r\n * function for all registered subscriptions.\r\n */\r\nexport const createEventSubscriber = (\r\n events: EventManager\r\n): [SubscribeDelegate, EventSubscriptionCancellation] => {\r\n const subs: EventSubscriptionCancellation[] = [];\r\n\r\n const subscribe = (type: string, listener: EventListener) => {\r\n subs.push(events.subscribe(type, listener));\r\n };\r\n\r\n return [\r\n subscribe,\r\n () => {\r\n subs.forEach((sub) => {\r\n sub();\r\n });\r\n },\r\n ];\r\n};\r\n","import { AbstractComponentController } from './component-controller';\r\nimport { ComponentNode } from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\n\r\nexport type ComponentQueryRule = {\r\n id?: string;\r\n type?: string;\r\n};\r\n\r\nexport class ComponentQuery {\r\n constructor(private platform: ComponentPlatform, public rules: ComponentQueryRule[] = []) {}\r\n\r\n match(node: ComponentNode) {\r\n return this.rules.every((rule) => {\r\n if (rule.id && rule.id !== node.id) {\r\n return false;\r\n }\r\n if (rule.type && rule.type !== node.type) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n ofType(type: string): ComponentQuery {\r\n this.rules.push({ type });\r\n return this;\r\n }\r\n\r\n withId(id: string): ComponentQuery {\r\n this.rules.push({ id });\r\n return this;\r\n }\r\n\r\n select(): AbstractComponentController {\r\n return new AbstractComponentController(this.platform, this);\r\n }\r\n}\r\n","import { EventSubscriptionCancellation } from '@webprovisions/platform';\r\nimport { createEventSubscriber, SubscribeDelegate } from '../event-subscriber';\r\nimport { ActionsController } from './actions-controller';\r\nimport {\r\n ChangesetOptions,\r\n ComponentNode,\r\n ComponentNodeContext,\r\n ComponentNodeLayout,\r\n ComponentNodeProperties,\r\n RemoveChangeset,\r\n} from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\nimport { ComponentQuery } from './component-query';\r\n\r\nexport interface ComponentController {\r\n actions: ActionsController;\r\n\r\n writeProperties(properties: Partial<ComponentNodeProperties>, options: ChangesetOptions): void;\r\n\r\n writeContext(context: Partial<ComponentNodeContext>, options: ChangesetOptions): void;\r\n\r\n writeLayout(context: Partial<ComponentNodeLayout>, options: ChangesetOptions): void;\r\n\r\n dispose(): void;\r\n}\r\n\r\nexport class ComponentNodeController implements ComponentController {\r\n actions: ActionsController;\r\n\r\n private subscribe: SubscribeDelegate;\r\n private unsubscribe: EventSubscriptionCancellation;\r\n\r\n constructor(private platform: ComponentPlatform, public node: ComponentNode, ns?: string) {\r\n this.actions = new ActionsController(\r\n platform,\r\n new ComponentQuery(platform).withId(node.id),\r\n ns\r\n );\r\n const [subscribe, unsubscribe] = createEventSubscriber(this.platform.events);\r\n this.subscribe = subscribe;\r\n this.unsubscribe = unsubscribe;\r\n }\r\n\r\n properties<T extends ComponentNodeProperties>(\r\n updated?: (properties: T) => void | Partial<ComponentNodeProperties>\r\n ): T {\r\n if (updated) {\r\n this.node.touchProperties((properties) => updated(<T>properties));\r\n }\r\n return <T>this.node.attributes.properties;\r\n }\r\n\r\n context(updated?: (context: ComponentNodeContext) => void): ComponentNodeContext {\r\n if (updated) {\r\n this.subscribe('components:context-changed', (event, { node }) => {\r\n if (node === this.node) {\r\n updated(this.node.attributes.context);\r\n }\r\n });\r\n }\r\n return this.node.attributes.context;\r\n }\r\n\r\n layout(updated?: (layout: ComponentNodeLayout) => void): ComponentNodeLayout {\r\n if (updated) {\r\n this.subscribe('components:layout-changed', (event, { node }) => {\r\n if (node === this.node) {\r\n updated(this.node.attributes.layout);\r\n }\r\n });\r\n }\r\n return this.node.attributes.layout;\r\n }\r\n\r\n writeProperties(\r\n properties:\r\n | Partial<ComponentNodeProperties>\r\n | ((properties: ComponentNodeProperties) => Partial<ComponentNodeProperties>),\r\n options?: ChangesetOptions\r\n ): void {\r\n this.node.writeProperties(properties, options);\r\n }\r\n\r\n writeContext(context: Partial<ComponentNodeContext>, options?: ChangesetOptions): void {\r\n this.node.writeProperties(context, options);\r\n }\r\n\r\n writeLayout(layout: Partial<ComponentNodeLayout>, options?: ChangesetOptions): void {\r\n this.node.writeLayout(layout, options);\r\n }\r\n\r\n dispose() {\r\n this.unsubscribe();\r\n this.actions.dispose();\r\n }\r\n}\r\n\r\nexport class AbstractComponentController implements ComponentController {\r\n actions: ActionsController;\r\n private removes: RemoveChangeset[] = [];\r\n\r\n constructor(\r\n private platform: ComponentPlatform,\r\n private target: ComponentQuery,\r\n private clearOnDispose = true\r\n ) {\r\n this.actions = new ActionsController(this.platform, this.target);\r\n }\r\n\r\n writeProperties(\r\n properties: Partial<ComponentNodeProperties>,\r\n options?: ChangesetOptions\r\n ): void {\r\n this.removes.push(\r\n this.platform.write({\r\n options,\r\n attributes: { properties },\r\n target: this.target,\r\n removable: this.clearOnDispose,\r\n })\r\n );\r\n }\r\n\r\n writeContext(context: Partial<ComponentNodeContext>, options?: ChangesetOptions): void {\r\n this.removes.push(\r\n this.platform.write({\r\n options,\r\n attributes: { context },\r\n target: this.target,\r\n removable: this.clearOnDispose,\r\n })\r\n );\r\n }\r\n\r\n writeLayout(layout: Partial<ComponentNodeLayout>, options?: ChangesetOptions): void {\r\n this.removes.push(\r\n this.platform.write({\r\n options,\r\n attributes: { layout },\r\n target: this.target,\r\n removable: this.clearOnDispose,\r\n })\r\n );\r\n }\r\n\r\n dispose() {\r\n this.removes.forEach((remove) => {\r\n remove();\r\n });\r\n this.actions.dispose();\r\n }\r\n}\r\n","import { EventSubscriptionCancellation } from '@webprovisions/platform';\r\nimport { ComponentNodeController } from './component-controller';\r\nimport { ComponentNode } from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\nimport { ComponentQuery } from './component-query';\r\n\r\nexport type ActionData = any;\r\n\r\nexport type ActionHandler = (data: any, options: any, instance: ComponentNodeController) => any;\r\nexport type NextActionDelegate = (data: any, options?: any) => Promise<any>;\r\nexport type WatchActionDelegate = (\r\n input: ActionData,\r\n next: NextActionDelegate,\r\n instance: ComponentNodeController\r\n) => Promise<any> | any;\r\nexport type ActionWatcherContext = {\r\n source: ComponentNode;\r\n action: string;\r\n};\r\n\r\nexport type ActionsState = {\r\n handlers: {\r\n fn: ActionHandler;\r\n key: string;\r\n target: ComponentQuery;\r\n ns?: string;\r\n }[];\r\n\r\n watchers: {\r\n target: ComponentQuery;\r\n fn: WatchActionDelegate;\r\n key: string;\r\n ns?: string;\r\n }[];\r\n};\r\n\r\ntype ActionWatcherExecutionResult = {\r\n data: any;\r\n options: any;\r\n cancelled: boolean;\r\n};\r\n\r\nconst executeActionListeners = (\r\n listeners: WatchActionDelegate[],\r\n data: any,\r\n controller: ComponentNodeController\r\n): Promise<ActionWatcherExecutionResult> => {\r\n const stack = listeners.concat();\r\n const dispatch = (\r\n data: any,\r\n globalOptions: any,\r\n controller: ComponentNodeController\r\n ): Promise<ActionWatcherExecutionResult> => {\r\n let cancelled = true;\r\n if (stack.length) {\r\n const handler = stack.shift() as WatchActionDelegate;\r\n\r\n const next = (data: any, options: any) => {\r\n cancelled = false;\r\n return dispatch(data, Object.assign({}, globalOptions, options), controller);\r\n };\r\n\r\n return Promise.resolve(handler(data, next, controller)).then((result) => ({\r\n ...result,\r\n cancelled,\r\n }));\r\n }\r\n\r\n return Promise.resolve({ data, cancelled: false, options: globalOptions });\r\n };\r\n return dispatch(data, {}, controller);\r\n};\r\n\r\nexport class ActionsController {\r\n private subscriptions: (() => void)[] = [];\r\n constructor(\r\n private platform: ComponentPlatform,\r\n private target: ComponentQuery,\r\n private ns?: string\r\n ) {\r\n this.create = this.create.bind(this);\r\n }\r\n\r\n create(key: string, fn: ActionHandler = () => {}): EventSubscriptionCancellation {\r\n const handler = {\r\n key,\r\n fn,\r\n target: this.target,\r\n ns: this.ns,\r\n };\r\n this.platform.actionsState.handlers.push(handler);\r\n const subscription = () => {\r\n const index = this.platform.actionsState.handlers.indexOf(handler);\r\n if (index > -1) {\r\n this.platform.actionsState.handlers.splice(index, 1);\r\n }\r\n };\r\n this.subscriptions.push(subscription);\r\n return subscription;\r\n }\r\n\r\n dispatch(key: string, data: any): Promise<{ [instanceId: string]: any }> {\r\n const instances: ComponentNode[] = this.platform.nodes.all.concat(\r\n this.platform.nodes.detached\r\n );\r\n\r\n const output: { [instanceId: string]: any } = {};\r\n\r\n // handlers matching the specified pattern.\r\n const handlers = this.platform.actionsState.handlers.filter(\r\n (handler) => handler.key === key && (!handler.ns || !this.ns || handler.ns === this.ns)\r\n );\r\n\r\n return Promise.all(\r\n handlers.map((handler) => {\r\n // select all matching instances for this particular\r\n // handler (a handler can be mapped to many instances)\r\n const matchedInstances = instances.filter(\r\n (instance) => handler.target.match(instance) && this.target.match(instance)\r\n );\r\n\r\n // execute watchers for each matched instance\r\n const watchers = this.platform.actionsState.watchers\r\n .filter((watcher) => {\r\n return (\r\n watcher.key === key &&\r\n (!watcher.ns || !this.ns || watcher.ns === this.ns) &&\r\n matchedInstances.some((instance) => watcher.target.match(instance))\r\n );\r\n })\r\n .map((watcher) => watcher.fn);\r\n\r\n // execute watchers and handler for each instance\r\n return Promise.all(\r\n matchedInstances.map((node) => {\r\n const controller = new ComponentNodeController(\r\n this.platform,\r\n node,\r\n this.ns\r\n );\r\n return executeActionListeners(watchers, data, controller).then((input) => {\r\n const { data = {}, options, cancelled } = input;\r\n return Promise.resolve(\r\n cancelled ? {} : handler.fn(data, options, controller)\r\n ).then((handlerResponse) => {\r\n output[node.id] = handlerResponse;\r\n });\r\n });\r\n })\r\n );\r\n })\r\n ).then(() => output);\r\n }\r\n\r\n watch(key: string, fn: WatchActionDelegate): EventSubscriptionCancellation {\r\n let parsedKey = key;\r\n let parsedNs = this.ns;\r\n const sections = key.split('.');\r\n\r\n if (sections.length > 1) {\r\n parsedNs = sections[0];\r\n parsedKey = sections.splice(1).join('.');\r\n }\r\n const watcher = {\r\n fn,\r\n target: this.target,\r\n key: parsedKey,\r\n ns: parsedNs,\r\n };\r\n this.platform.actionsState.watchers.push(watcher);\r\n const subscription = () => {\r\n const index = this.platform.actionsState.watchers.indexOf(watcher);\r\n if (index > -1) {\r\n this.platform.actionsState.watchers.splice(index, 1);\r\n }\r\n };\r\n this.subscriptions.push(subscription);\r\n return subscription;\r\n }\r\n\r\n dispose() {\r\n this.subscriptions.forEach((unsubscribe) => unsubscribe());\r\n }\r\n}\r\n","import { createConfigurationApi } from '@webprovisions/platform';\r\nimport { CustomHandlerCallback } from './custom-component-handler';\r\n\r\ntype Options = {\r\n handlers?: [string, CustomHandlerCallback][];\r\n};\r\n\r\nexport default createConfigurationApi((builder) => {\r\n builder.createCommand('components', (context) => (config: Options) => {\r\n context.events.subscribeOnce('components:platform-created', (event, { platform }) => {\r\n if (config.handlers) {\r\n config.handlers.forEach(([key, handler]) => {\r\n platform.addComponentHandler(key, handler);\r\n });\r\n }\r\n });\r\n });\r\n});\r\n","import { Logger, uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventManager, EventSubscriptionCancellation } from '@webprovisions/platform';\r\nimport { Breakpoints } from '../types';\r\n\r\nexport type ComponentNodeEventData = { node: ComponentNode };\r\n\r\nexport type RemoveChangeset = () => void;\r\n\r\nexport type ComponentNodeAttributes = {\r\n tags: string[];\r\n properties: ComponentNodeProperties;\r\n context: ComponentNodeContext;\r\n layout: ComponentNodeLayout;\r\n};\r\n\r\nexport type ResolveComponentNodeProperties = (\r\n properties: ComponentNodeProperties\r\n) => Partial<ComponentNodeProperties> | void;\r\n\r\nexport type ResolveComponentNodeContext = (\r\n context: ComponentNodeContext\r\n) => Partial<ComponentNodeContext>;\r\n\r\nexport type ResolveComponentNodeLayout = (\r\n layout: ComponentNodeLayout\r\n) => Partial<ComponentNodeLayout>;\r\n\r\nexport type ComponentNodeSettings = {\r\n tags?: string[];\r\n properties?: ComponentNodeProperties | ResolveComponentNodeProperties;\r\n context?: ComponentNodeContext | ResolveComponentNodeContext;\r\n layout?: ComponentNodeLayout | ResolveComponentNodeLayout;\r\n};\r\n\r\nexport type ComponentNodeProperties = { [key: string]: any };\r\n\r\nexport type ComponentNodeContext = { [key: string]: any };\r\n\r\nexport type ComponentNodeLayout = {\r\n size?: Size;\r\n indent?: number;\r\n order?: number;\r\n};\r\n\r\nexport type Size = number | 'full' | 'none';\r\n\r\nexport type UnmountComponentNode = () => void;\r\n\r\nexport type ChangesetOptions = {\r\n breakpoints?: Breakpoints;\r\n};\r\n\r\nexport type Changeset = [Partial<ComponentNodeSettings>, ChangesetOptions];\r\n\r\nexport class ComponentNode {\r\n id: string;\r\n type: string;\r\n name?: string;\r\n parent?: ComponentNode;\r\n tags: string[] = [];\r\n children: { [key: string]: ComponentNode[] } = {};\r\n changesets: Changeset[] = [];\r\n attributes: ComponentNodeAttributes;\r\n\r\n private mountCount = 0;\r\n\r\n constructor(private events: EventManager, type: string) {\r\n this.id = uuid();\r\n this.type = type;\r\n this.attributes = {\r\n context: {},\r\n properties: {},\r\n layout: {},\r\n tags: [],\r\n };\r\n // write default attributes\r\n this.writeLayout({ size: 'full', indent: 0 });\r\n }\r\n\r\n mount(viewOutletContainer: Container, element?: HTMLElement): UnmountComponentNode {\r\n let mountedNodes: Map<ComponentNode, EventSubscriptionCancellation> =\r\n viewOutletContainer.get('mounted-nodes');\r\n\r\n if (!mountedNodes) {\r\n mountedNodes = new Map<ComponentNode, EventSubscriptionCancellation>();\r\n viewOutletContainer.register('mounted-nodes', mountedNodes);\r\n }\r\n\r\n if (mountedNodes.has(this)) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n Logger.error('Trying to mount an already mounted component node.', this);\r\n }\r\n return () => {};\r\n }\r\n\r\n /**\r\n * Dispatched when a node is mounted in a component.\r\n * This happens once for every `ViewOutlet`.\r\n */\r\n this.events.dispatch('components:node-mounted', { node: this });\r\n\r\n if (this.mountCount === 0) {\r\n this.mountCount = this.mountCount + 1;\r\n /**\r\n * Dispatched when a node is mounted in a component the first time.\r\n */\r\n this.events.dispatch('components:node-enter', { node: this });\r\n }\r\n\r\n return () => {\r\n mountedNodes.delete(this);\r\n this.events.dispatch('components:node-unmounted', { node: this });\r\n\r\n this.mountCount = this.mountCount - 1;\r\n if (this.mountCount === 0) {\r\n this.events.dispatch('components:node-exit', { node: this });\r\n }\r\n };\r\n }\r\n\r\n appendChild(node: ComponentNode, branch: string = 'default') {\r\n if (node.parent) {\r\n if (node.parent === this) {\r\n return;\r\n }\r\n node.parent.removeChild(node);\r\n }\r\n node.parent = this;\r\n\r\n if (!this.children[branch]) {\r\n this.children[branch] = [];\r\n }\r\n this.children[branch].push(node);\r\n\r\n this.events.dispatch('components:node-appended', { node });\r\n }\r\n\r\n prependChild(node: ComponentNode, branch: string = 'default') {\r\n if (node.parent) {\r\n if (node.parent === this) {\r\n return;\r\n }\r\n node.parent.removeChild(node);\r\n }\r\n node.parent = this;\r\n\r\n if (!this.children[branch]) {\r\n this.children[branch] = [];\r\n }\r\n this.children[branch].unshift(node);\r\n\r\n this.events.dispatch('components:node-appended', { node });\r\n }\r\n\r\n touchProperties(\r\n properties: ResolveComponentNodeProperties,\r\n options: ChangesetOptions = {},\r\n removable?: boolean\r\n ): RemoveChangeset {\r\n const attributes: Partial<ComponentNodeSettings> = { properties };\r\n const changeset: Changeset = [attributes, options];\r\n this.changesets.push(changeset);\r\n this.events.dispatch('components:set-properties', { node: this });\r\n return () => {\r\n if (removable) {\r\n const indexToRemove = this.changesets.indexOf(changeset);\r\n if (indexToRemove > -1) {\r\n this.changesets.splice(indexToRemove, 1);\r\n this.events.dispatch('components:set-properties', { node: this });\r\n }\r\n }\r\n };\r\n }\r\n\r\n writeProperties(\r\n properties: Partial<ComponentNodeProperties> | ResolveComponentNodeProperties,\r\n options: ChangesetOptions = {},\r\n removable?: boolean\r\n ): RemoveChangeset {\r\n const attributes: Partial<ComponentNodeSettings> = { properties };\r\n const changeset: Changeset = [attributes, options];\r\n this.changesets.push(changeset);\r\n this.events.dispatch('components:set-properties', { node: this });\r\n return () => {\r\n if (removable) {\r\n const indexToRemove = this.changesets.indexOf(changeset);\r\n if (indexToRemove > -1) {\r\n this.changesets.splice(indexToRemove, 1);\r\n this.events.dispatch('components:set-properties', { node: this });\r\n }\r\n }\r\n };\r\n }\r\n\r\n writeLayout(\r\n layout: Partial<ComponentNodeLayout> | ResolveComponentNodeLayout,\r\n options: ChangesetOptions = {},\r\n removable?: boolean\r\n ): RemoveChangeset {\r\n const attributes: Partial<ComponentNodeSettings> = { layout };\r\n const changeset: Changeset = [attributes, options];\r\n this.changesets.push(changeset);\r\n this.events.dispatch('components:set-layout', { node: this });\r\n return () => {\r\n if (!removable) {\r\n return;\r\n }\r\n const indexToRemove = this.changesets.indexOf(changeset);\r\n if (indexToRemove > -1) {\r\n this.changesets.splice(indexToRemove, 1);\r\n this.events.dispatch('components:set-layout', { node: this });\r\n }\r\n };\r\n }\r\n\r\n writeContext(\r\n context: Partial<ComponentNodeContext> | ResolveComponentNodeContext,\r\n options: ChangesetOptions = {},\r\n removable?: boolean\r\n ): RemoveChangeset {\r\n const attributes: Partial<ComponentNodeSettings> = { context };\r\n const changeset: Changeset = [attributes, options];\r\n this.changesets.push(changeset);\r\n this.events.dispatch('components:set-context', { node: this });\r\n return () => {\r\n if (!removable) {\r\n return;\r\n }\r\n const indexToRemove = this.changesets.indexOf(changeset);\r\n if (indexToRemove > -1) {\r\n this.changesets.splice(indexToRemove, 1);\r\n this.events.dispatch('components:set-context', { node: this });\r\n }\r\n };\r\n }\r\n\r\n getChildren(branch: string = 'default'): ComponentNode[] {\r\n const children = this.children[branch] || [];\r\n return children.reduce((acc, node, i) => {\r\n const { order: index = i } = node.attributes.layout;\r\n if (!acc[index]) {\r\n acc[index] = node;\r\n } else {\r\n acc.splice(index, 0, node);\r\n }\r\n return acc;\r\n }, Array(children.length));\r\n }\r\n\r\n remove() {\r\n if (this.parent) {\r\n this.parent.removeChild(this);\r\n }\r\n }\r\n\r\n removeChild(node: ComponentNode) {\r\n Object.keys(this.children).forEach((branch) => {\r\n const children = this.children[branch];\r\n const indexToRemove = children.indexOf(node);\r\n if (indexToRemove > -1) {\r\n children.splice(indexToRemove, 1);\r\n this.events.dispatch('components:node-removed', { node, parentNode: this });\r\n }\r\n });\r\n delete node.parent;\r\n }\r\n}\r\n","import { ComponentNode } from './component-node';\r\nimport { SwitchMap } from './component-platform';\r\n\r\nconst traverseComponentsRecursive = (\r\n nodes: ComponentNode[],\r\n switches: SwitchMap,\r\n fn: (node: ComponentNode) => boolean | void\r\n) => {\r\n for (let i = 0, y = nodes.length; i < y; i++) {\r\n if (fn(nodes[i]) === true) {\r\n break;\r\n }\r\n const branch = switches[nodes[i].id] || 'default';\r\n const children = nodes[i].getChildren(branch);\r\n traverseComponentsRecursive(children, switches, fn);\r\n }\r\n};\r\n\r\nexport const traverseComponents = (\r\n root: ComponentNode,\r\n switches: SwitchMap,\r\n fn: (node: ComponentNode) => boolean | void\r\n) => {\r\n if (fn(root) !== true) {\r\n const branch = switches[root.id] || 'default';\r\n const children = root.children[branch];\r\n traverseComponentsRecursive(children, switches, fn);\r\n }\r\n};\r\n\r\nexport const findVisibleComponents = (\r\n root: ComponentNode,\r\n switches: SwitchMap\r\n): ComponentNode[] => {\r\n const nodes: ComponentNode[] = [];\r\n traverseComponents(root, switches, (node) => {\r\n nodes.push(node);\r\n });\r\n return nodes;\r\n};\r\n\r\nexport const findComponent = (\r\n root: ComponentNode,\r\n switches: SwitchMap,\r\n fn: (node: ComponentNode) => boolean\r\n) => {\r\n let matched: ComponentNode | undefined;\r\n traverseComponents(root, switches, (node) => {\r\n if (fn(node)) {\r\n matched = node;\r\n return true;\r\n }\r\n });\r\n return matched;\r\n};\r\n\r\nexport const getAncestors = (node: ComponentNode) => {\r\n if (!node.parent) {\r\n return [];\r\n }\r\n const tree: ComponentNode[] = [];\r\n let currentNode: ComponentNode | undefined = node.parent;\r\n while (currentNode) {\r\n tree.unshift(currentNode);\r\n currentNode = currentNode.parent;\r\n }\r\n return tree;\r\n};\r\n","import { EventManager } from '@webprovisions/platform';\r\nimport { ComponentNode, ComponentNodeEventData } from './component-node';\r\nimport { SwitchMap } from './component-platform';\r\nimport { findComponent, findVisibleComponents, traverseComponents } from './queries';\r\n\r\nexport type QueryDescriptor = {\r\n id?: string;\r\n type?: string;\r\n name?: string;\r\n};\r\n\r\nexport class ComponentNodeCollection {\r\n all: ComponentNode[] = [];\r\n visible: ComponentNode[] = [];\r\n detached: ComponentNode[] = [];\r\n\r\n constructor(public root: ComponentNode, private switches: SwitchMap, events: EventManager) {\r\n events.subscribe('components:node-appended', (event, data: ComponentNodeEventData) => {\r\n this.all.push(data.node);\r\n this.visible = findVisibleComponents(root, switches);\r\n });\r\n events.subscribe('components:node-removed', (event, data: ComponentNodeEventData) => {\r\n let indexToRemove = this.all.indexOf(data.node);\r\n if (indexToRemove > -1) {\r\n this.all.splice(indexToRemove, 1);\r\n }\r\n indexToRemove = this.visible.indexOf(data.node);\r\n if (indexToRemove > -1) {\r\n this.visible.splice(indexToRemove, 1);\r\n }\r\n this.visible = findVisibleComponents(root, switches);\r\n });\r\n events.subscribe('components:node-switched', (event, data: ComponentNodeEventData) => {\r\n this.visible = findVisibleComponents(root, switches);\r\n });\r\n }\r\n\r\n query(query: QueryDescriptor = {}): ComponentNode[] {\r\n const nodes: ComponentNode[] = [];\r\n traverseComponents(this.root, this.switches, (node) => {\r\n const match = Object.keys(query).every((member) => {\r\n return (<any>query)[member] === (<any>node)[member];\r\n });\r\n if (match) {\r\n nodes.push(node);\r\n }\r\n });\r\n return nodes;\r\n }\r\n\r\n get(id: string) {\r\n return (\r\n findComponent(this.root, this.switches, (node) => node.id === id) ||\r\n this.detached.find((node) => node.id === id)\r\n );\r\n }\r\n}\r\n","import { ComponentReference, ComponentSettings, ViewDefinition } from '../types';\r\nimport { ComponentNode } from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\nimport { NormalizedComponentReference } from './create-component-model';\r\n\r\nexport type CustomHandlerCallback = (\r\n ref: NormalizedComponentReference,\r\n options: {\r\n platform: ComponentPlatform;\r\n node: ComponentNode;\r\n references: ComponentReference[];\r\n definitions: { [name: string]: ComponentSettings };\r\n views: { [key: string]: ViewDefinition };\r\n branch?: string;\r\n }\r\n) => void;\r\n\r\nexport class CustomComponentHandler {\r\n private handlers = new Map<string, CustomHandlerCallback>();\r\n\r\n add(name: string, fn: CustomHandlerCallback) {\r\n this.handlers.set(name, fn);\r\n }\r\n\r\n get(name: string) {\r\n return this.handlers.get(name);\r\n }\r\n}\r\n","import { ComponentPlatform } from '.';\r\nimport { Breakpoints } from '../types';\r\nimport {\r\n ComponentNode,\r\n ResolveComponentNodeContext,\r\n ResolveComponentNodeLayout,\r\n ResolveComponentNodeProperties,\r\n} from './component-node';\r\n\r\nexport type ProcessOptions = {\r\n context?: boolean;\r\n properties?: boolean;\r\n layout?: boolean;\r\n recursive?: boolean;\r\n};\r\n\r\nexport type StateProcessor = (node: ComponentNode, options: ProcessOptions) => void;\r\n\r\nconst calculateNodeIndex = (node: ComponentNode): number => {\r\n let currentNode = node;\r\n let index = 0;\r\n\r\n while (currentNode.parent) {\r\n index = index + 1;\r\n currentNode = currentNode.parent;\r\n }\r\n\r\n return index;\r\n};\r\n\r\nconst sortQueue = (queue: [ComponentNode, ProcessOptions][]): [ComponentNode, ProcessOptions][] => {\r\n const mapped: [number, ComponentNode, ProcessOptions][] = queue.map(([node, options]) => {\r\n return [calculateNodeIndex(node), node, options];\r\n });\r\n return mapped\r\n .sort(([a], [b]) => a - b)\r\n .map(([, node, options]) => {\r\n return [node, options];\r\n });\r\n};\r\n\r\nconst isObject = (item: any) => {\r\n return item && typeof item === 'object' && !Array.isArray(item);\r\n};\r\n\r\nconst mergeDeep = (target: any, ...sources: any[]): any => {\r\n if (!sources.length) return target;\r\n const source = sources.shift();\r\n\r\n if (isObject(target) && isObject(source)) {\r\n for (const key in source) {\r\n if (isObject(source[key])) {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n mergeDeep(target[key], source[key]);\r\n } else {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n return mergeDeep(target, ...sources);\r\n};\r\n\r\nconst matchesBreakpoint = (b1: Breakpoints | undefined, b2: string[]) => {\r\n if (!b1 || b1 === 'all') {\r\n return true;\r\n }\r\n return b1.some((b1) => b2.indexOf(b1) > -1);\r\n};\r\n\r\nexport type ProcessResult = Map<ComponentNode, ProcessOptions>;\r\n\r\nexport type ProcessReportCallback = (report: ProcessResult) => void;\r\n\r\nexport const createStateProcessor = (\r\n platform: ComponentPlatform,\r\n callback: ProcessReportCallback\r\n): StateProcessor => {\r\n let nodeQueue: ComponentNode[] = [];\r\n let optionsQueue: ProcessOptions[] = [];\r\n\r\n let timeout: NodeJS.Timeout;\r\n\r\n const flush = () => {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.time('state-processor.flush');\r\n }\r\n const processHistory: Map<ComponentNode, ProcessOptions> = new Map();\r\n const sortedQueue = sortQueue(nodeQueue.map((node, i) => [node, optionsQueue[i]]));\r\n\r\n const processNode = (node: ComponentNode, options: ProcessOptions) => {\r\n const history = processHistory.get(node) || {};\r\n\r\n // todo: this doesnt take overrides into account\r\n const processContext = options.context && !history.context;\r\n const processProperties = options.properties && !history.properties;\r\n const processLayout = options.layout && !history.layout;\r\n\r\n processHistory.set(node, {\r\n context: history.context || processContext,\r\n properties: history.properties || processProperties,\r\n layout: history.layout || processLayout,\r\n });\r\n\r\n if (processProperties) {\r\n node.attributes.properties = {};\r\n }\r\n if (processLayout) {\r\n node.attributes.layout = {};\r\n }\r\n\r\n if (processContext) {\r\n node.attributes.context = mergeDeep({}, node.parent?.attributes.context);\r\n }\r\n\r\n const propertyResolvers: ResolveComponentNodeProperties[] = [];\r\n const layoutResolvers: ResolveComponentNodeLayout[] = [];\r\n const contextResolvers: ResolveComponentNodeContext[] = [];\r\n\r\n node.changesets.forEach((changeset) => {\r\n const [change, options] = changeset;\r\n if (matchesBreakpoint(options.breakpoints, platform.breakpoints)) {\r\n if (processProperties) {\r\n if (typeof change.properties === 'function') {\r\n propertyResolvers.push(\r\n <ResolveComponentNodeProperties>change.properties\r\n );\r\n } else {\r\n mergeDeep(node.attributes.properties, change.properties);\r\n }\r\n }\r\n\r\n if (processLayout) {\r\n if (typeof change.layout === 'function') {\r\n layoutResolvers.push(<ResolveComponentNodeLayout>change.layout);\r\n } else {\r\n mergeDeep(node.attributes.layout, change.layout);\r\n }\r\n }\r\n\r\n if (processContext) {\r\n if (typeof change.context === 'function') {\r\n contextResolvers.push(<ResolveComponentNodeContext>change.context);\r\n } else {\r\n mergeDeep(node.attributes.context, change.context);\r\n }\r\n }\r\n }\r\n });\r\n\r\n propertyResolvers.forEach((resolver) => {\r\n mergeDeep(node.attributes.properties, resolver(node.attributes.properties));\r\n });\r\n\r\n layoutResolvers.forEach((resolver) => {\r\n mergeDeep(node.attributes.layout, resolver(node.attributes.layout));\r\n });\r\n\r\n contextResolvers.forEach((resolver) => {\r\n mergeDeep(node.attributes.context, resolver(node.attributes.context));\r\n });\r\n\r\n if (processContext || options.recursive) {\r\n const branch = platform.getBranch(node);\r\n const childOptions: ProcessOptions = options.recursive\r\n ? options\r\n : {\r\n context: !!processContext,\r\n };\r\n node.getChildren(branch).forEach((child) => {\r\n processNode(child, childOptions);\r\n });\r\n }\r\n };\r\n\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.timeEnd('state-processor.flush');\r\n }\r\n\r\n sortedQueue.forEach(([node, options]) => {\r\n processNode(node, options);\r\n });\r\n\r\n nodeQueue = [];\r\n optionsQueue = [];\r\n\r\n callback(processHistory);\r\n };\r\n\r\n const schedule = () => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(flush, 0);\r\n };\r\n\r\n return (node, options) => {\r\n const index = nodeQueue.indexOf(node);\r\n\r\n if (index > -1) {\r\n // if node already exist in queue, update its options\r\n const summary = optionsQueue[index];\r\n if (options.context) {\r\n summary.context = true;\r\n }\r\n if (options.properties) {\r\n summary.properties = true;\r\n }\r\n if (options.layout) {\r\n summary.layout = true;\r\n }\r\n if (options.recursive) {\r\n summary.recursive = true;\r\n }\r\n return schedule();\r\n }\r\n\r\n nodeQueue.push(node);\r\n optionsQueue.push(options);\r\n\r\n return schedule();\r\n };\r\n};\r\n","import { uuid } from '@telia-ace/widget-utilities';\r\nimport {\r\n Container,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n Widget,\r\n} from '@webprovisions/platform';\r\nimport { ActionsController, ActionsState } from './actions-controller';\r\nimport { ChangesetProvider } from './changeset-provider';\r\nimport {\r\n Changeset,\r\n ChangesetOptions,\r\n ComponentNode,\r\n ComponentNodeEventData,\r\n ComponentNodeSettings,\r\n RemoveChangeset,\r\n} from './component-node';\r\nimport { ComponentNodeCollection } from './component-node-collection';\r\nimport { ComponentQuery } from './component-query';\r\nimport { CustomComponentHandler, CustomHandlerCallback } from './custom-component-handler';\r\nimport { createStateProcessor, StateProcessor } from './state-processor';\r\n\r\nexport type MergeOptions = { breakpoints?: string[] };\r\n\r\ntype AbstractChangesetRecord = {\r\n changeset: Changeset;\r\n target: ComponentQuery;\r\n removes: RemoveChangeset[];\r\n};\r\n\r\nexport type SwitchMap = { [id: string]: string };\r\n\r\nexport type ChangesetData = {\r\n key?: string;\r\n target: ComponentQuery;\r\n attributes: Partial<ComponentNodeSettings>;\r\n options?: ChangesetOptions;\r\n removable?: boolean;\r\n provider?: string;\r\n};\r\n\r\nexport class ComponentPlatform {\r\n events: EventManager;\r\n breakpoints: string[] = [];\r\n nodes: ComponentNodeCollection;\r\n // internal\r\n actionsState: ActionsState = { handlers: [], watchers: [] };\r\n\r\n private switches: SwitchMap = {};\r\n private changesets: AbstractChangesetRecord[] = [];\r\n private subscriptions: EventSubscriptionCancellation[] = [];\r\n private processNode: StateProcessor;\r\n private customComponentHandler = new CustomComponentHandler();\r\n\r\n constructor(widget: Widget, private providers: { [key: string]: ChangesetProvider } = {}) {\r\n this.events = widget.events.createChild(this);\r\n const root = new ComponentNode(this.events, 'root');\r\n root.name = `root-${widget.name}`;\r\n this.nodes = new ComponentNodeCollection(root, this.switches, this.events);\r\n\r\n const processNode = (this.processNode = createStateProcessor(this, (report) => {\r\n const nodes = Array.from(report.keys());\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.info(`STATE PROCESSOR: ${nodes.length} node(s) processed:\r\n${nodes.map(\r\n (node) => `${node.name || '<no name>'} (${node.id})\r\n`\r\n)}`);\r\n }\r\n nodes.forEach((node) => {\r\n const options = report.get(node);\r\n if (node.parent && node.parent.type === 'root') {\r\n this.events.dispatch('components:root-children-changed', { node });\r\n }\r\n if (options?.context) {\r\n this.events.dispatch('components:context-changed', { node });\r\n }\r\n if (options?.properties) {\r\n this.events.dispatch('components:properties-changed', { node });\r\n }\r\n if (options?.layout) {\r\n this.events.dispatch('components:layout-changed', { node });\r\n }\r\n });\r\n this.events.dispatch('components:component-model-initialized', {}, { bubbles: true });\r\n }));\r\n\r\n Promise.all(\r\n Object.keys(providers).map((key) => {\r\n const provider = providers[key];\r\n return provider.load(this);\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:node-appended',\r\n (event, data: ComponentNodeEventData) => {\r\n const { node } = data;\r\n this.changesets.forEach((record) => {\r\n const { changeset, target, removes } = record;\r\n const [change, options] = changeset;\r\n if (target.match(data.node)) {\r\n if (change.properties) {\r\n removes.push(node.writeProperties(change.properties, options));\r\n }\r\n if (change.context) {\r\n removes.push(node.writeContext(change.context, options));\r\n }\r\n if (change.layout) {\r\n removes.push(node.writeLayout(change.layout, options));\r\n }\r\n }\r\n });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:node-appended',\r\n (event, data: ComponentNodeEventData) => {\r\n processNode(data.node, { properties: true, context: true });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:set-properties',\r\n (event, data: ComponentNodeEventData) => {\r\n processNode(data.node, { properties: true });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:set-context',\r\n (event, data: ComponentNodeEventData) => {\r\n processNode(data.node, { properties: true, context: true });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:set-indent',\r\n (event, data: ComponentNodeEventData) => {\r\n processNode(data.node, { layout: true });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe(\r\n 'components:set-layout',\r\n (event, data: ComponentNodeEventData) => {\r\n processNode(data.node, { layout: true });\r\n }\r\n )\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe('components:node-switched', (event, { node, branch }) => {\r\n processNode(node, {\r\n layout: true,\r\n recursive: true,\r\n properties: true,\r\n context: true,\r\n });\r\n })\r\n );\r\n this.subscriptions.push(\r\n this.events.subscribe('components:node-removed', (event, { parentNode }) => {\r\n processNode(parentNode, { properties: true });\r\n })\r\n );\r\n\r\n if (this.events.parent) {\r\n this.events.parent.dispatch('components:platform-created', { platform: this });\r\n }\r\n }\r\n\r\n static getInstance(container: Container): Promise<ComponentPlatform> {\r\n return container.getAsync('components');\r\n }\r\n\r\n addBreakpoint(name: string) {\r\n if (this.breakpoints.indexOf(name) === -1) {\r\n this.breakpoints.push(name);\r\n this.processNode(this.nodes.root, {\r\n context: true,\r\n properties: true,\r\n layout: true,\r\n recursive: true,\r\n });\r\n }\r\n }\r\n\r\n removeBreakpoint(name: string) {\r\n const indexToRemove = this.breakpoints.indexOf(name);\r\n if (indexToRemove > -1) {\r\n this.breakpoints.splice(indexToRemove, 1);\r\n this.processNode(this.nodes.root, {\r\n context: true,\r\n properties: true,\r\n layout: true,\r\n recursive: true,\r\n });\r\n }\r\n }\r\n\r\n setSwitch(node: ComponentNode, branch: string) {\r\n this.switches[node.id] = branch;\r\n this.events.dispatch('components:node-switched', { node, branch });\r\n }\r\n\r\n getBranch(node: ComponentNode): string | undefined {\r\n return this.switches[node.id];\r\n }\r\n\r\n /**\r\n * Creates a `ComponentNode` of the specified type.\r\n * @param type Type of node.\r\n */\r\n createNode(type: string, options: { detached?: boolean } = {}): ComponentNode {\r\n const node = new ComponentNode(this.events, type);\r\n if (options.detached) {\r\n this.nodes.detached.push(node);\r\n }\r\n return node;\r\n }\r\n\r\n components(): ComponentQuery {\r\n return new ComponentQuery(this);\r\n }\r\n\r\n actions(target: ComponentQuery, ns: string): ActionsController {\r\n return new ActionsController(this, <any>target, ns);\r\n }\r\n\r\n write(data: ChangesetData): RemoveChangeset {\r\n const { provider: providerName, target, attributes, options = {}, removable } = data;\r\n const key = data.key || uuid();\r\n const changeset: Changeset = [attributes, options];\r\n const record: AbstractChangesetRecord = { changeset, target, removes: [] };\r\n if (providerName) {\r\n const provider = this.providers[providerName];\r\n provider.write(key, target, attributes, options);\r\n record.removes.push(() => {\r\n provider.remove(key);\r\n });\r\n }\r\n\r\n this.changesets.push(record);\r\n this.nodes.all.forEach((node) => {\r\n if (target.match(node)) {\r\n let remove: RemoveChangeset = () => {};\r\n if (attributes.properties) {\r\n remove = node.writeProperties(attributes.properties, options, removable);\r\n }\r\n if (attributes.context) {\r\n remove = node.writeContext(attributes.context, options, removable);\r\n }\r\n if (attributes.layout) {\r\n remove = node.writeContext(attributes.layout, options, removable);\r\n }\r\n record.removes.push(remove);\r\n }\r\n });\r\n return () => {\r\n if (removable) {\r\n record.removes.forEach((remove) => remove());\r\n const indexToRemove = this.changesets.indexOf(record);\r\n if (indexToRemove > -1) {\r\n this.changesets.splice(indexToRemove, 1);\r\n }\r\n }\r\n };\r\n }\r\n\r\n addComponentHandler(definitionType: string, fn: CustomHandlerCallback) {\r\n this.customComponentHandler.add(definitionType, fn);\r\n }\r\n\r\n getComponentHandler(definitionType: string) {\r\n return this.customComponentHandler.get(definitionType);\r\n }\r\n\r\n dispose() {\r\n this.subscriptions.forEach((sub) => sub());\r\n }\r\n}\r\n","import { Logger } from '@telia-ace/widget-utilities';\r\nimport { EventSubscriptionCancellation } from '@webprovisions/platform';\r\nimport { Breakpoints, ComponentSettings, ViewDefinition, WidgetSettings } from '../types';\r\nimport {\r\n ComponentNode,\r\n ComponentNodeContext,\r\n ComponentNodeLayout,\r\n ComponentNodeProperties,\r\n} from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\n\r\ntype ComponentReference = string | [string, ...ComponentReferenceOverride[]];\r\n\r\ntype ComponentReferenceOverride = {\r\n breakpoints?: Breakpoints;\r\n tags?: string[];\r\n context?: ComponentNodeContext;\r\n properties?: ComponentNodeProperties;\r\n layout?: ComponentNodeLayout;\r\n};\r\n\r\nexport type NormalizedComponentReference = {\r\n definitionId: string;\r\n overrides: ComponentReferenceOverride[];\r\n};\r\n\r\nexport const normalizeReference = (reference: ComponentReference): NormalizedComponentReference => {\r\n if (Array.isArray(reference)) {\r\n const [definitionId, ...overrides] = reference;\r\n return {\r\n definitionId,\r\n overrides,\r\n };\r\n }\r\n return {\r\n definitionId: reference,\r\n overrides: [],\r\n };\r\n};\r\n\r\nexport type ComponentHandlerOptions = {\r\n platform: ComponentPlatform;\r\n node: ComponentNode;\r\n references: ComponentReference[];\r\n definitions: { [name: string]: ComponentSettings };\r\n views: { [key: string]: ViewDefinition };\r\n branch?: string;\r\n};\r\n\r\nexport const createChildren = (\r\n platform: ComponentPlatform,\r\n node: ComponentNode,\r\n references: ComponentReference[],\r\n definitions: { [name: string]: ComponentSettings },\r\n views: { [key: string]: ViewDefinition },\r\n branch?: string\r\n) => {\r\n references.forEach((ref) => {\r\n const childRef = normalizeReference(ref);\r\n const childDef = definitions[childRef.definitionId];\r\n if (childRef.definitionId === 'view') {\r\n const viewNode = platform.createNode('view');\r\n viewNode.name = 'view';\r\n Object.keys(views).forEach((key) => {\r\n const viewDef = views[key];\r\n createChildren(platform, viewNode, [viewDef.entry], definitions, views, key);\r\n });\r\n node.appendChild(viewNode);\r\n\r\n childRef.overrides.forEach((override) => {\r\n if (override.properties) {\r\n viewNode.writeProperties(override.properties, {\r\n breakpoints: override.breakpoints,\r\n });\r\n }\r\n if (override.context) {\r\n viewNode.writeContext(override.context, { breakpoints: override.breakpoints });\r\n }\r\n if (override.layout) {\r\n viewNode.writeLayout(override.layout, { breakpoints: override.breakpoints });\r\n }\r\n });\r\n } else if (platform.getComponentHandler(childDef.type)) {\r\n const handle = platform.getComponentHandler(childDef.type);\r\n if (handle) {\r\n handle(childRef, {\r\n platform,\r\n node,\r\n references,\r\n definitions,\r\n views,\r\n branch,\r\n });\r\n }\r\n } else {\r\n const childDef = definitions[childRef.definitionId];\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (!childDef) {\r\n Logger.error(\r\n `No definition found for component type '${childRef.definitionId}'.`\r\n );\r\n return;\r\n }\r\n }\r\n const childNode = platform.createNode(childDef.type);\r\n childNode.name = childRef.definitionId;\r\n childNode.tags = childDef.tags || [];\r\n if (childDef.properties) {\r\n childNode.writeProperties(childDef.properties);\r\n }\r\n if (childDef.context) {\r\n childNode.writeContext(childDef.context);\r\n }\r\n if (childDef.layout) {\r\n childNode.writeLayout(childDef.layout);\r\n }\r\n node.appendChild(childNode, branch);\r\n\r\n childRef.overrides.forEach((override) => {\r\n const options = { breakpoints: override.breakpoints };\r\n if (override.properties) {\r\n childNode.writeProperties(override.properties, options);\r\n }\r\n if (override.context) {\r\n childNode.writeContext(override.context, options);\r\n }\r\n if (override.layout) {\r\n childNode.writeLayout(override.layout, options);\r\n }\r\n });\r\n\r\n if (childDef.children) {\r\n createChildren(platform, childNode, childDef.children, definitions, views);\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport const createComponentModel = (\r\n platform: ComponentPlatform,\r\n settings: WidgetSettings\r\n): EventSubscriptionCancellation => {\r\n const { entry, components, breakpoints, views } = settings;\r\n const subscriptions: EventSubscriptionCancellation[] = [];\r\n\r\n Object.keys(breakpoints).forEach((name) => {\r\n const query = breakpoints[name];\r\n const list = window.matchMedia(query);\r\n if (list.matches) {\r\n platform.breakpoints.push(name);\r\n }\r\n const listener = (event: MediaQueryListEvent) => {\r\n if (event.matches) {\r\n platform.addBreakpoint(name);\r\n } else {\r\n platform.removeBreakpoint(name);\r\n }\r\n };\r\n list.addListener(listener);\r\n subscriptions.push(() => list.removeListener(listener));\r\n });\r\n\r\n createChildren(platform, platform.nodes.root, [entry], components, views);\r\n\r\n return () =>\r\n subscriptions.forEach((sub) => {\r\n sub();\r\n });\r\n};\r\n","import { ComponentNode } from './component-node';\r\n\r\nexport type ComponentDescriptor = {\r\n id: string;\r\n type?: string;\r\n name?: string;\r\n branch: string;\r\n};\r\n\r\nexport const asDescriptor = (node: ComponentNode, branch?: string): ComponentDescriptor => {\r\n return {\r\n id: node.id,\r\n type: node.type,\r\n name: node.name,\r\n branch: branch || 'default',\r\n };\r\n};\r\n","import { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventSubscriptionCancellation } from '@webprovisions/platform';\r\nimport { ComponentNodeController } from './component-controller';\r\nimport { ComponentNode } from './component-node';\r\nimport { ComponentPlatform } from './component-platform';\r\nimport { ComponentQuery } from './component-query';\r\n\r\nexport type ExtendComponentHandler = (controller: ComponentNodeController) => any;\r\n\r\nexport type ExtendComponentOptions = {\r\n reuseController?: boolean;\r\n};\r\n\r\nexport const extendComponent = (\r\n container: Container,\r\n typeOrQuery: string | ComponentQuery,\r\n handler: ExtendComponentHandler,\r\n ns: string = uuid(),\r\n options: ExtendComponentOptions = {}\r\n): Promise<void> => {\r\n return container.getAsync('components').then((components: ComponentPlatform) => {\r\n let target: ComponentQuery;\r\n if (typeof typeOrQuery === 'string') {\r\n const collection = new ComponentQuery(components);\r\n collection.ofType(typeOrQuery);\r\n target = collection;\r\n } else {\r\n target = typeOrQuery;\r\n }\r\n\r\n const managedInstances: {\r\n [instanceId: string]: {\r\n dispose: EventSubscriptionCancellation;\r\n controller: ComponentNodeController;\r\n };\r\n } = {};\r\n\r\n const getOrCreateController = (node: ComponentNode): Promise<ComponentNodeController> => {\r\n const existing = managedInstances[node.id];\r\n if (existing) {\r\n return Promise.resolve(existing.controller);\r\n }\r\n return ComponentPlatform.getInstance(container).then((platform) => {\r\n return new ComponentNodeController(platform, node, ns);\r\n });\r\n };\r\n\r\n components.events.subscribe(\r\n 'components:node-enter',\r\n (event, { node }: { node: ComponentNode }) => {\r\n if (target.match(node)) {\r\n getOrCreateController(node).then((controller) => {\r\n Promise.resolve(handler(controller)).then((dispose) => {\r\n managedInstances[node.id] = {\r\n dispose,\r\n controller,\r\n };\r\n });\r\n });\r\n }\r\n }\r\n );\r\n components.events.subscribe(\r\n 'components:node-exit',\r\n (event, { node }: { node: ComponentNode }) => {\r\n const instance = managedInstances[node.id];\r\n if (instance) {\r\n instance.dispose && instance.dispose();\r\n if (!options.reuseController) {\r\n instance.controller.dispose();\r\n delete managedInstances[node.id];\r\n }\r\n }\r\n }\r\n );\r\n });\r\n};\r\n","import { Logger } from '@telia-ace/widget-utilities';\r\nimport {\r\n Container,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n WidgetType,\r\n} from '@webprovisions/platform';\r\n\r\nexport type ReactComponent = any | null;\r\n\r\nexport default class ComponentResolver {\r\n aliases: Map<string, string> = new Map();\r\n components: Map<string, any> = new Map();\r\n events: EventManager;\r\n logger = new Logger();\r\n\r\n constructor(container: Container) {\r\n const { events }: WidgetType = container.get('$widget');\r\n this.events = events;\r\n }\r\n\r\n getComponent(key: string): ReactComponent {\r\n const alias = this.aliases.get(key);\r\n const component = this.components.get(alias || key) || null;\r\n\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (!component) {\r\n this.logger.warn(\r\n alias || key,\r\n `Unable to resolve component: \"${\r\n alias || key\r\n }\". You most likely forgot to register the required plugin for: ${\r\n alias || key\r\n }.`\r\n );\r\n }\r\n }\r\n\r\n return component;\r\n }\r\n\r\n registerComponent(key: string, component: ReactComponent): EventSubscriptionCancellation {\r\n this.components.set(key, component);\r\n\r\n this.events.dispatch('component-resolver:resolve', key);\r\n\r\n return () => {\r\n this.components.delete(key);\r\n };\r\n }\r\n\r\n registerResolver(\r\n key: string,\r\n fn: (component: ReactComponent) => void\r\n ): EventSubscriptionCancellation {\r\n return this.events.subscribe('component-resolver:resolve', (e, data: string) => {\r\n if (data === key) {\r\n const component = this.getComponent(key);\r\n fn(component);\r\n }\r\n });\r\n }\r\n\r\n registerAlias(alias: string, key: string): EventSubscriptionCancellation {\r\n this.aliases.set(alias, key);\r\n\r\n this.events.dispatch('component-resolver:resolve', alias);\r\n\r\n return () => {\r\n this.aliases.delete(alias);\r\n };\r\n }\r\n}\r\n","import { ComponentNodeLayout } from '../component-platform';\r\n\r\nexport type ComponentSettings = {\r\n type: string;\r\n context?: Context;\r\n properties?: Properties;\r\n layout?: ComponentNodeLayout;\r\n tags?: string[];\r\n children?: ComponentReference[];\r\n};\r\n\r\nenum HistoryMode {\r\n scopedHash = 'scopedHash',\r\n hash = 'hash',\r\n browser = 'browser',\r\n memory = 'memory',\r\n}\r\n\r\nexport type RoutingSettings = {\r\n initialPath: string;\r\n mode: HistoryMode;\r\n basePath?: string;\r\n};\r\n\r\nexport type ComponentReference = string | [string, ...ComponentReferenceOverride[]];\r\n\r\nexport type Properties = { [key: string]: any };\r\n\r\nexport type Context = { [key: string]: any };\r\n\r\nexport type ViewDefinition = {\r\n path: string | string[];\r\n entry: ComponentReference;\r\n};\r\n\r\nexport type Breakpoints = 'all' | string[];\r\n\r\nexport type ComponentReferenceOverride = {\r\n breakpoints?: Breakpoints;\r\n size?: number | 'full' | 'none';\r\n indent?: number;\r\n tags?: string[];\r\n context?: Context;\r\n properties?: Properties;\r\n};\r\n\r\nexport type ComponentDefinitionMap = {\r\n [name: string]: ComponentSettings;\r\n};\r\n\r\nexport type WidgetSettings = {\r\n data: { projection: string; site?: 'current' | 'referrer'; forceHttps?: boolean };\r\n components: ComponentDefinitionMap;\r\n entry: ComponentReference;\r\n breakpoints: { [name: string]: string };\r\n routing: RoutingSettings;\r\n views: { [name: string]: ViewDefinition };\r\n integrationResources: { path: string; mediaQueriesSupported: boolean }[];\r\n trigger?: { symbol?: Symbol; label?: string; action?: string };\r\n activate?: boolean | null;\r\n plugins?: { [key: string]: any };\r\n};\r\n\r\nexport type MinMax = {\r\n min: string;\r\n max: string;\r\n};\r\n\r\ntype Symbol = {\r\n type: 'Uri' | 'Svg' | 'FontAwesome' | 'Text' | string;\r\n content: string;\r\n};\r\n\r\nexport enum WidgetRenderState {\r\n open = 'open',\r\n closed = 'closed',\r\n hidden = 'hidden',\r\n}\r\n"],"names":["ActionResolver","container","__publicField","events","target","action","value","origin","fn","e","createEventSubscriber","subs","type","listener","sub","ComponentQuery","platform","rules","node","rule","id","AbstractComponentController","ComponentNodeController","ns","ActionsController","subscribe","unsubscribe","updated","properties","event","options","context","layout","clearOnDispose","remove","executeActionListeners","listeners","data","controller","stack","dispatch","globalOptions","cancelled","handler","next","result","__spreadProps","__spreadValues","key","subscription","index","instances","output","handlers","matchedInstances","instance","watchers","watcher","input","handlerResponse","parsedKey","parsedNs","sections","componentConfigurationApi","createConfigurationApi","builder","config","ComponentNode","uuid","viewOutletContainer","element","mountedNodes","Logger","branch","removable","changeset","indexToRemove","children","acc","i","traverseComponentsRecursive","nodes","switches","y","traverseComponents","root","findVisibleComponents","findComponent","matched","ComponentNodeCollection","query","member","CustomComponentHandler","name","calculateNodeIndex","currentNode","sortQueue","queue","a","b","isObject","item","mergeDeep","sources","source","matchesBreakpoint","b1","b2","createStateProcessor","callback","nodeQueue","optionsQueue","timeout","flush","processHistory","sortedQueue","processNode","history","processContext","processProperties","processLayout","_a","propertyResolvers","layoutResolvers","contextResolvers","change","resolver","childOptions","child","schedule","summary","ComponentPlatform","widget","providers","report","record","removes","parentNode","providerName","attributes","provider","definitionType","normalizeReference","reference","definitionId","overrides","createChildren","references","definitions","views","ref","childRef","childDef","viewNode","viewDef","override","handle","childNode","createComponentModel","settings","entry","components","breakpoints","subscriptions","list","asDescriptor","extendComponent","typeOrQuery","collection","managedInstances","getOrCreateController","existing","dispose","ComponentResolver","alias","component","WidgetRenderState"],"mappings":"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"}
|
package/dist/types/ui.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export declare type Theme = {
|
|
2
2
|
gap: string;
|
|
3
3
|
accessibility: {
|
|
4
|
-
isTabbing: boolean;
|
|
5
4
|
border: string;
|
|
6
5
|
colors: {
|
|
7
6
|
inactiveText: string;
|
|
@@ -50,5 +49,4 @@ export declare type Theme = {
|
|
|
50
49
|
export declare type ModeWrapper = React.FC<{
|
|
51
50
|
className: string;
|
|
52
51
|
route: string;
|
|
53
|
-
isTabbing: boolean;
|
|
54
52
|
}>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telia-ace/widget-core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.15",
|
|
4
4
|
"description": "Core framework for ACE widgets.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"author": "Telia Company AB",
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"telia"
|
|
9
9
|
],
|
|
10
10
|
"main": "dist/index.js",
|
|
11
|
+
"sourceMain": "src/index.ts",
|
|
11
12
|
"type": "module",
|
|
12
13
|
"types": "dist/index.d.ts",
|
|
13
14
|
"files": [
|
|
@@ -21,14 +22,13 @@
|
|
|
21
22
|
"scripts": {
|
|
22
23
|
"clean": "rimraf ./dist",
|
|
23
24
|
"precompile": "tsc -emitDeclarationOnly",
|
|
24
|
-
"compile": "vite build"
|
|
25
|
-
"postcompile": "node scripts/print-version.js"
|
|
25
|
+
"compile": "vite build"
|
|
26
26
|
},
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@telia-ace/widget-utilities": "^1.0.
|
|
29
|
+
"@telia-ace/widget-utilities": "^1.0.4",
|
|
30
30
|
"@webprovisions/bootstrapping": "^1.0.12",
|
|
31
31
|
"@webprovisions/platform": "^1.1.2"
|
|
32
32
|
},
|
|
33
|
-
"gitHead": "
|
|
33
|
+
"gitHead": "9cb0d80e6c65317a2e27a381ebe24fd0662f33e8"
|
|
34
34
|
}
|