@unbndl/store 1.0.1 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export declare function fromStore<M extends object>(target: HTMLElement, contextLabel?: string): import('@unbndl/view').Source<M>;
@@ -0,0 +1,2 @@
1
+ export * as Store from './store';
2
+ export * from './fromStore';
@@ -0,0 +1,18 @@
1
+ import { Context } from '@unbndl/html';
2
+ import { Auth } from '@unbndl/auth';
3
+ import { Message, Provider, Service } from '@unbndl/service';
4
+ declare const STORE_CONTEXT_DEFAULT = "context:store";
5
+ type UpdateFn<M extends object, Msg extends Message.Base, Cmd extends Message.Base> = (model: M, message: Msg | Cmd) => M | Message.Async<M, Cmd>;
6
+ type AuthorizedUpdateFn<M extends object, Msg extends Message.Base, Cmd extends Message.Base> = (model: M, message: Msg | Cmd, auth: Auth.Model) => M | Message.Async<M, Cmd>;
7
+ declare class StoreService<M extends object, Msg extends Message.Base, Cmd extends Message.Base> extends Service<Msg | Cmd, M> {
8
+ static EVENT_TYPE: string;
9
+ constructor(context: Context<M>, update: UpdateFn<M, Msg, Cmd>);
10
+ }
11
+ declare class StoreProvider<M extends object, Msg extends Message.Base, Cmd extends Message.Base> extends Provider<M> {
12
+ viewModel: import('@unbndl/view').ViewModel<Auth.Model>;
13
+ _updateFn: AuthorizedUpdateFn<M, Msg, Cmd>;
14
+ constructor(updateFn: AuthorizedUpdateFn<M, Msg, Cmd>, init: M);
15
+ connectedCallback(): void;
16
+ }
17
+ declare function dispatch<Msg extends Message.Base>(target: HTMLElement, message: Msg): void;
18
+ export { STORE_CONTEXT_DEFAULT as CONTEXT_DEFAULT, StoreProvider as Provider, StoreService as Service, dispatch };
@@ -0,0 +1,2 @@
1
+ export * from './store/src/index'
2
+ export {}
package/dist/store.js CHANGED
@@ -85,7 +85,7 @@ var ee = u(), te = class extends CustomEvent {
85
85
  };
86
86
  function d(e, ...t) {
87
87
  let n = { execute() {
88
- e(...t.map((e) => e instanceof p ? e.open(n) : e)), t.forEach((e) => e instanceof p && e.close());
88
+ console.log("▶️ Executing created effect:", t, e), e(...t.map((e) => e.open(n))), t.forEach((e) => e.close());
89
89
  } };
90
90
  n.execute();
91
91
  }
@@ -132,7 +132,7 @@ var f = class e {
132
132
  n && f.scheduler.subscribe(t, e, n);
133
133
  }
134
134
  runEffects(e, t) {
135
- if (f.scheduler.scheduleEffects(t, e), this.host) {
135
+ if (console.log("⚙️ Running effects for signal", e, t), f.scheduler.scheduleEffects(t, e), this.host) {
136
136
  let n = new te(this.eventType, {
137
137
  property: e,
138
138
  value: t[e]
@@ -157,7 +157,7 @@ var f = class e {
157
157
  this.proxy[e] = t;
158
158
  }
159
159
  toObject() {
160
- return this.object;
160
+ return this.proxy;
161
161
  }
162
162
  update(e) {
163
163
  Object.assign(this.proxy, e);
@@ -201,7 +201,7 @@ function m(e) {
201
201
  default: return !1;
202
202
  }
203
203
  }
204
- var ie = class {
204
+ var h = class {
205
205
  constructor(e, ...t) {
206
206
  this.effectFn = () => e(...t);
207
207
  }
@@ -209,17 +209,17 @@ var ie = class {
209
209
  this.effectFn();
210
210
  }
211
211
  };
212
- function ae(e, t) {
212
+ function g(e, t) {
213
213
  return Object.assign(e, { render: t }), e;
214
214
  }
215
- function oe(e, t, ...n) {
215
+ function _(e, t, ...n) {
216
216
  let r = e.cloneNode(!0);
217
217
  return Array.from(t.entries()).forEach(([e, t]) => {
218
218
  let i = r.querySelector(`[data-${e}]`);
219
219
  i && t.forEach((e) => e(i, r, ...n));
220
220
  }), r;
221
221
  }
222
- var se = class e {
222
+ var v = class e {
223
223
  static {
224
224
  this.parser = new DOMParser();
225
225
  }
@@ -255,7 +255,7 @@ var se = class e {
255
255
  }
256
256
  });
257
257
  }
258
- return ae(s, (...e) => oe(s, c, ...e));
258
+ return g(s, (...e) => _(s, c, ...e));
259
259
  }
260
260
  static {
261
261
  this.OPEN_RE = /<([a-zA-z][$a-zA-Z0-9.-]*)\s+[^>]*$/;
@@ -294,35 +294,35 @@ var se = class e {
294
294
  let n = this.plugins;
295
295
  for (let r = 0; r < n.length; r++) {
296
296
  let i = n[r];
297
- if (e.kind === i.place && ce(t, i)) return i.mutator(e, t);
297
+ if (e.kind === i.place && y(t, i)) return i.mutator(e, t);
298
298
  }
299
299
  }
300
300
  };
301
- function ce(e, t) {
301
+ function y(e, t) {
302
302
  return typeof t.types == "function" ? t.types(e, t) : t.types.includes(typeof e);
303
303
  }
304
- var h = class {
304
+ var b = class {
305
305
  constructor(e) {
306
306
  this.place = e;
307
307
  }
308
308
  apply(e, t) {
309
309
  throw "abstract method 'apply' called";
310
310
  }
311
- }, g = class extends h {
311
+ }, x = class extends b {
312
312
  constructor(e, t) {
313
313
  super(e), this.content = t;
314
314
  }
315
315
  apply(e, t) {
316
316
  (e.parentNode || t).replaceChild(this.content, e);
317
317
  }
318
- }, le = class extends h {
318
+ }, ie = class extends b {
319
319
  constructor(e, t) {
320
320
  super(e), this.text = t, this.name = e.attrName;
321
321
  }
322
322
  apply(e) {
323
323
  e.setAttribute(this.name, this.text);
324
324
  }
325
- }, _ = class extends h {
325
+ }, ae = class extends b {
326
326
  constructor(e, t) {
327
327
  super(e), this.fn = t;
328
328
  }
@@ -331,12 +331,12 @@ var h = class {
331
331
  return (e, t, ...r) => {
332
332
  let i = new Comment(` <<< ${n} `), a = new Comment(` >>> ${n} `), o = new DocumentFragment();
333
333
  o.replaceChildren(i, a), (e.parentNode || t).replaceChild(o, e), d((...e) => {
334
- v(this.fn(...e), i, a);
334
+ oe(this.fn(...e), i, a);
335
335
  }, ...r);
336
336
  };
337
337
  }
338
338
  };
339
- function v(e, t, n) {
339
+ function oe(e, t, n) {
340
340
  let r = t.parentNode;
341
341
  if (!r) throw Error("No parent for placeholder");
342
342
  let i = (e) => {
@@ -345,26 +345,24 @@ function v(e, t, n) {
345
345
  return t.replaceChildren(...n), t;
346
346
  } else if (e instanceof Node) return e;
347
347
  else return new Text(e?.toString() || "");
348
- }, a = i(e);
349
- console.log("📸 Rendered for view:", e, a);
350
- let o = t.nextSibling;
348
+ }, a = i(e), o = t.nextSibling;
351
349
  for (; o && o !== n;) {
352
350
  let e = o;
353
351
  o = o.nextSibling, r.removeChild(e);
354
352
  }
355
353
  a && r.insertBefore(a, n);
356
354
  }
357
- var y = class extends h {
355
+ var se = class extends b {
358
356
  constructor(e, t) {
359
357
  super(e), this.fn = t, this.name = e.attrName;
360
358
  }
361
359
  apply(e, t) {
362
360
  return (e, t, ...n) => d((...t) => {
363
- b(this.fn(...t), e, this.name);
361
+ ce(this.fn(...t), e, this.name);
364
362
  }, ...n);
365
363
  }
366
364
  };
367
- function b(e, t, n) {
365
+ function ce(e, t, n) {
368
366
  let r = n.match(/^([.$])(.+)$/);
369
367
  if (r) {
370
368
  let [n, i, a] = r;
@@ -388,7 +386,7 @@ function b(e, t, n) {
388
386
  default: t.setAttribute(n, e?.toString());
389
387
  }
390
388
  }
391
- var x = class extends h {
389
+ var le = class extends b {
392
390
  constructor(e, t) {
393
391
  super(e), this.fn = t;
394
392
  }
@@ -399,7 +397,7 @@ var x = class extends h {
399
397
  }, ...n);
400
398
  }
401
399
  };
402
- new se().use([
400
+ new v().use([
403
401
  {
404
402
  place: "element content",
405
403
  types: [
@@ -409,7 +407,7 @@ new se().use([
409
407
  "symbol",
410
408
  "boolean"
411
409
  ],
412
- mutator: (e, t) => new g(e, new Text(t?.toString() || ""))
410
+ mutator: (e, t) => new x(e, new Text(t?.toString() || ""))
413
411
  },
414
412
  {
415
413
  place: "attr value",
@@ -419,27 +417,35 @@ new se().use([
419
417
  "bigint",
420
418
  "symbol"
421
419
  ],
422
- mutator: (e, t) => new le(e, t?.toString() || "")
420
+ mutator: (e, t) => new ie(e, t?.toString() || "")
423
421
  },
424
422
  {
425
423
  place: "element content",
426
424
  types: (e) => e instanceof Node,
427
- mutator: (e, t) => new g(e, t)
425
+ mutator: (e, t) => new x(e, t)
426
+ },
427
+ {
428
+ place: "element content",
429
+ types: (e) => Array.isArray(e),
430
+ mutator: (e, t) => {
431
+ let n = new DocumentFragment(), r = t.map((e) => e instanceof Node ? e : new Text(e?.toString() || ""));
432
+ return n.append(...r), new x(e, n);
433
+ }
428
434
  },
429
435
  {
430
436
  place: "element content",
431
437
  types: ["function"],
432
- mutator: (e, t) => new _(e, t)
438
+ mutator: (e, t) => new ae(e, t)
433
439
  },
434
440
  {
435
441
  place: "attr value",
436
442
  types: ["function"],
437
- mutator: (e, t) => new y(e, t)
443
+ mutator: (e, t) => new se(e, t)
438
444
  },
439
445
  {
440
446
  place: "tag content",
441
447
  types: ["function"],
442
- mutator: (e, t) => new x(e, t)
448
+ mutator: (e, t) => new le(e, t)
443
449
  }
444
450
  ]);
445
451
  var ue = class e extends HTMLElement {
@@ -510,13 +516,13 @@ var me = class {
510
516
  }
511
517
  attachObserver(e) {
512
518
  let t = this.provider.attach((t) => {
513
- let { property: n, value: r } = t.detail, i = new ie(e, {
519
+ let { property: n, value: r } = t.detail, i = new h(e, {
514
520
  property: n,
515
521
  value: r
516
522
  });
517
- this.observed && (this.observed[n] = r, i.execute());
523
+ console.log("📡Signal received:", n, r), i.execute();
518
524
  });
519
- return this.observed = t, t;
525
+ return console.log("👀 Initial observation:", t), t;
520
526
  }
521
527
  }, he = class {
522
528
  constructor(e, t, n = "service:message", r = !0) {
@@ -530,19 +536,22 @@ var me = class {
530
536
  });
531
537
  }
532
538
  start() {
533
- this._running || (this._running = !0, this._pending.forEach((e) => this.process(e)));
539
+ this._running || (console.log(`Starting ${this._eventType} service`), this._running = !0, this._pending.forEach((e) => this.process(e)));
534
540
  }
535
541
  consume(e) {
536
- if (e.length === 0) {
542
+ if (e.length !== 0) {
537
543
  let t = e;
538
- this._running ? this.process(t) : this._pending.push(t);
544
+ this._running ? this.process(t) : (console.log(`📥 Queueing ${this._eventType} message`, e), this._pending.push(t));
539
545
  }
540
546
  }
541
547
  process(e) {
548
+ console.log(`📤 Processing ${this._eventType} message`, e);
542
549
  let t = this._update(e, this._context.toObject());
543
- if (!Array.isArray(t)) return t;
544
- let [n, ...r] = t;
545
- return r.forEach((e) => e.then((e) => this.consume(e))), n;
550
+ if (console.log("⏭️ next state: ", t), !Array.isArray(t)) this._context.update(t);
551
+ else {
552
+ let [e, ...n] = t;
553
+ n.forEach((e) => e.then((e) => this.consume(e))), this._context.update(e);
554
+ }
546
555
  }
547
556
  };
548
557
  function ge(e, t) {
@@ -589,7 +598,7 @@ var _e = class {
589
598
  super((e, t) => this.update(e, t), t, e.EVENT_TYPE), this._redirectForLogin = n;
590
599
  }
591
600
  update(e, t) {
592
- switch (e[0]) {
601
+ switch (console.log("Auth update", e), e[0]) {
593
602
  case "auth/signin":
594
603
  let { token: n, redirect: r } = e[1];
595
604
  return [D(n), T(r)];
@@ -613,7 +622,7 @@ function T(e, t = {}) {
613
622
  function E(e, t = {}) {
614
623
  if (e) {
615
624
  let n = window.location.href, r = new URL(e, n);
616
- Object.entries(t).forEach(([e, t]) => r.searchParams.set(e, t)), console.log("Redirecting to ", e), window.location.assign(r);
625
+ Object.entries(t).forEach(([e, t]) => r.searchParams.set(e, t)), console.log("Auth redirecting to ", e), window.history.pushState({}, "", e), window.history.go();
617
626
  }
618
627
  }
619
628
  function D(e) {
@@ -673,7 +682,7 @@ var be = P(), xe = class extends CustomEvent {
673
682
  };
674
683
  function F(e, ...t) {
675
684
  let n = { execute() {
676
- e(...t.map((e) => e instanceof L ? e.open(n) : e)), t.forEach((e) => e instanceof L && e.close());
685
+ console.log("▶️ Executing created effect:", t, e), e(...t.map((e) => e.open(n))), t.forEach((e) => e.close());
677
686
  } };
678
687
  n.execute();
679
688
  }
@@ -720,7 +729,7 @@ var I = class e {
720
729
  n && I.scheduler.subscribe(t, e, n);
721
730
  }
722
731
  runEffects(e, t) {
723
- if (I.scheduler.scheduleEffects(t, e), this.host) {
732
+ if (console.log("⚙️ Running effects for signal", e, t), I.scheduler.scheduleEffects(t, e), this.host) {
724
733
  let n = new xe(this.eventType, {
725
734
  property: e,
726
735
  value: t[e]
@@ -745,7 +754,7 @@ var I = class e {
745
754
  this.proxy[e] = t;
746
755
  }
747
756
  toObject() {
748
- return this.object;
757
+ return this.proxy;
749
758
  }
750
759
  update(e) {
751
760
  Object.assign(this.proxy, e);
@@ -910,7 +919,7 @@ var z = class {
910
919
  apply(e) {
911
920
  e.setAttribute(this.name, this.text);
912
921
  }
913
- }, V = class extends z {
922
+ }, Ae = class extends z {
914
923
  constructor(e, t) {
915
924
  super(e), this.fn = t;
916
925
  }
@@ -919,12 +928,12 @@ var z = class {
919
928
  return (e, t, ...r) => {
920
929
  let i = new Comment(` <<< ${n} `), a = new Comment(` >>> ${n} `), o = new DocumentFragment();
921
930
  o.replaceChildren(i, a), (e.parentNode || t).replaceChild(o, e), F((...e) => {
922
- Ae(this.fn(...e), i, a);
931
+ je(this.fn(...e), i, a);
923
932
  }, ...r);
924
933
  };
925
934
  }
926
935
  };
927
- function Ae(e, t, n) {
936
+ function je(e, t, n) {
928
937
  let r = t.parentNode;
929
938
  if (!r) throw Error("No parent for placeholder");
930
939
  let i = (e) => {
@@ -933,26 +942,24 @@ function Ae(e, t, n) {
933
942
  return t.replaceChildren(...n), t;
934
943
  } else if (e instanceof Node) return e;
935
944
  else return new Text(e?.toString() || "");
936
- }, a = i(e);
937
- console.log("📸 Rendered for view:", e, a);
938
- let o = t.nextSibling;
945
+ }, a = i(e), o = t.nextSibling;
939
946
  for (; o && o !== n;) {
940
947
  let e = o;
941
948
  o = o.nextSibling, r.removeChild(e);
942
949
  }
943
950
  a && r.insertBefore(a, n);
944
951
  }
945
- var je = class extends z {
952
+ var Me = class extends z {
946
953
  constructor(e, t) {
947
954
  super(e), this.fn = t, this.name = e.attrName;
948
955
  }
949
956
  apply(e, t) {
950
957
  return (e, t, ...n) => F((...t) => {
951
- Me(this.fn(...t), e, this.name);
958
+ Ne(this.fn(...t), e, this.name);
952
959
  }, ...n);
953
960
  }
954
961
  };
955
- function Me(e, t, n) {
962
+ function Ne(e, t, n) {
956
963
  let r = n.match(/^([.$])(.+)$/);
957
964
  if (r) {
958
965
  let [n, i, a] = r;
@@ -976,7 +983,7 @@ function Me(e, t, n) {
976
983
  default: t.setAttribute(n, e?.toString());
977
984
  }
978
985
  }
979
- var Ne = class extends z {
986
+ var Pe = class extends z {
980
987
  constructor(e, t) {
981
988
  super(e), this.fn = t;
982
989
  }
@@ -1014,23 +1021,31 @@ new De().use([
1014
1021
  types: (e) => e instanceof Node,
1015
1022
  mutator: (e, t) => new B(e, t)
1016
1023
  },
1024
+ {
1025
+ place: "element content",
1026
+ types: (e) => Array.isArray(e),
1027
+ mutator: (e, t) => {
1028
+ let n = new DocumentFragment(), r = t.map((e) => e instanceof Node ? e : new Text(e?.toString() || ""));
1029
+ return n.append(...r), new B(e, n);
1030
+ }
1031
+ },
1017
1032
  {
1018
1033
  place: "element content",
1019
1034
  types: ["function"],
1020
- mutator: (e, t) => new V(e, t)
1035
+ mutator: (e, t) => new Ae(e, t)
1021
1036
  },
1022
1037
  {
1023
1038
  place: "attr value",
1024
1039
  types: ["function"],
1025
- mutator: (e, t) => new je(e, t)
1040
+ mutator: (e, t) => new Me(e, t)
1026
1041
  },
1027
1042
  {
1028
1043
  place: "tag content",
1029
1044
  types: ["function"],
1030
- mutator: (e, t) => new Ne(e, t)
1045
+ mutator: (e, t) => new Pe(e, t)
1031
1046
  }
1032
1047
  ]);
1033
- var H = class e extends HTMLElement {
1048
+ var V = class e extends HTMLElement {
1034
1049
  static {
1035
1050
  this.DISCOVERY_EVENT = "un-provider:discover";
1036
1051
  }
@@ -1042,11 +1057,11 @@ var H = class e extends HTMLElement {
1042
1057
  }
1043
1058
  static {
1044
1059
  document.addEventListener(e.DISCOVERY_EVENT, (e) => {
1045
- let [t, n] = e.detail, r = Ie(t);
1060
+ let [t, n] = e.detail, r = Le(t);
1046
1061
  r && n(r);
1047
1062
  }), document.addEventListener(e.REGISTRY_EVENT, (e) => {
1048
1063
  let [t, n] = e.detail;
1049
- Fe(t, n);
1064
+ Ie(t, n);
1050
1065
  });
1051
1066
  }
1052
1067
  constructor(t, n) {
@@ -1068,9 +1083,9 @@ var H = class e extends HTMLElement {
1068
1083
  this.removeEventListener(e.CHANGE_EVENT, t);
1069
1084
  }
1070
1085
  };
1071
- function Pe(e, t) {
1086
+ function Fe(e, t) {
1072
1087
  return new Promise((n, r) => {
1073
- let i = new CustomEvent(H.DISCOVERY_EVENT, {
1088
+ let i = new CustomEvent(V.DISCOVERY_EVENT, {
1074
1089
  bubbles: !0,
1075
1090
  composed: !0,
1076
1091
  detail: [t, (e) => e ? n(e) : r()]
@@ -1078,20 +1093,20 @@ function Pe(e, t) {
1078
1093
  e.isConnected ? e.dispatchEvent(i) : document.dispatchEvent(i);
1079
1094
  });
1080
1095
  }
1081
- var U = {};
1082
- function Fe(e, t) {
1083
- U[e] = t;
1096
+ var H = {};
1097
+ function Ie(e, t) {
1098
+ H[e] = t;
1084
1099
  }
1085
- function Ie(e) {
1086
- return U[e];
1100
+ function Le(e) {
1101
+ return H[e];
1087
1102
  }
1088
- var Le = class {
1103
+ var Re = class {
1089
1104
  constructor(e) {
1090
1105
  this.contextLabel = e;
1091
1106
  }
1092
1107
  observe(e, t) {
1093
1108
  return new Promise((n, r) => {
1094
- this.provider ? n(this.attachObserver(t)) : Pe(e, this.contextLabel).then((e) => {
1109
+ this.provider ? n(this.attachObserver(t)) : Fe(e, this.contextLabel).then((e) => {
1095
1110
  this.provider = e, n(this.attachObserver(t));
1096
1111
  }).catch((e) => r(e));
1097
1112
  });
@@ -1102,11 +1117,11 @@ var Le = class {
1102
1117
  property: n,
1103
1118
  value: r
1104
1119
  });
1105
- this.observed && (this.observed[n] = r, i.execute());
1120
+ console.log("📡Signal received:", n, r), i.execute();
1106
1121
  });
1107
- return this.observed = t, t;
1122
+ return console.log("👀 Initial observation:", t), t;
1108
1123
  }
1109
- }, Re = class {
1124
+ }, ze = class {
1110
1125
  constructor(e, t, n = "service:message", r = !0) {
1111
1126
  this._pending = [], this._context = t, this._update = e, this._eventType = n, this._running = r;
1112
1127
  }
@@ -1118,50 +1133,60 @@ var Le = class {
1118
1133
  });
1119
1134
  }
1120
1135
  start() {
1121
- this._running || (this._running = !0, this._pending.forEach((e) => this.process(e)));
1136
+ this._running || (console.log(`Starting ${this._eventType} service`), this._running = !0, this._pending.forEach((e) => this.process(e)));
1122
1137
  }
1123
1138
  consume(e) {
1124
- if (e.length === 0) {
1139
+ if (e.length !== 0) {
1125
1140
  let t = e;
1126
- this._running ? this.process(t) : this._pending.push(t);
1141
+ this._running ? this.process(t) : (console.log(`📥 Queueing ${this._eventType} message`, e), this._pending.push(t));
1127
1142
  }
1128
1143
  }
1129
1144
  process(e) {
1145
+ console.log(`📤 Processing ${this._eventType} message`, e);
1130
1146
  let t = this._update(e, this._context.toObject());
1131
- if (!Array.isArray(t)) return t;
1132
- let [n, ...r] = t;
1133
- return r.forEach((e) => e.then((e) => this.consume(e))), n;
1147
+ if (console.log("⏭️ next state: ", t), !Array.isArray(t)) this._context.update(t);
1148
+ else {
1149
+ let [e, ...n] = t;
1150
+ n.forEach((e) => e.then((e) => this.consume(e))), this._context.update(e);
1151
+ }
1134
1152
  }
1135
- }, ze = class {
1153
+ };
1154
+ function Be(e, t) {
1155
+ return new Ve(e, t);
1156
+ }
1157
+ var Ve = class {
1136
1158
  constructor(e, t) {
1137
- this.client = e, this.observer = new Le(t);
1159
+ this.client = e, this.observer = new Re(t);
1138
1160
  }
1139
1161
  start(e) {
1140
1162
  return this.observer.observe(this.client, (t) => {
1141
1163
  e(t.property, t.value);
1142
1164
  });
1143
1165
  }
1144
- }, W = class {
1166
+ }, U = class {
1145
1167
  constructor(e, t) {
1146
- this.origin = e;
1147
- let n = Be(t).map(([e, t]) => [t, e]);
1168
+ this.initialized = !1, this.origin = e;
1169
+ let n = He(t).map(([e, t]) => [t, e]);
1148
1170
  this.inverse = Object.fromEntries(n);
1149
1171
  }
1150
1172
  mapObservation(e) {
1151
- let t = Object.entries(e);
1152
- return Object.fromEntries(t.map(([e, t]) => [this.inverse[e], t]).filter((e) => e.length > 0));
1173
+ let t = Object.entries(e).map(([e, t]) => {
1174
+ let n = this.inverse[e];
1175
+ return n ? [n, t] : [];
1176
+ });
1177
+ return Object.fromEntries(t.filter((e) => e.length > 0));
1153
1178
  }
1154
1179
  start(e) {
1155
1180
  return this.origin.start((t, n) => {
1156
1181
  let r = this.inverse[t];
1157
- e(r, n);
1158
- }).then((e) => this.mapObservation(e));
1182
+ e(r, n), this.initialized = !0;
1183
+ }).then((e) => this.initialized ? {} : this.mapObservation(e));
1159
1184
  }
1160
1185
  };
1161
- function Be(e) {
1186
+ function He(e) {
1162
1187
  return Object.entries(e).map(([e, t]) => [e, t]);
1163
1188
  }
1164
- var Ve = class extends CustomEvent {
1189
+ var Ue = class extends CustomEvent {
1165
1190
  constructor(e, t) {
1166
1191
  super(e, {
1167
1192
  bubbles: !0,
@@ -1171,13 +1196,13 @@ var Ve = class extends CustomEvent {
1171
1196
  });
1172
1197
  }
1173
1198
  };
1174
- function G(e, ...t) {
1199
+ function W(e, ...t) {
1175
1200
  let n = { execute() {
1176
- e(...t.map((e) => e instanceof q ? e.open(n) : e)), t.forEach((e) => e instanceof q && e.close());
1201
+ console.log("▶️ Executing created effect:", t, e), e(...t.map((e) => e.open(n))), t.forEach((e) => e.close());
1177
1202
  } };
1178
1203
  n.execute();
1179
1204
  }
1180
- var K = class e {
1205
+ var G = class e {
1181
1206
  constructor() {
1182
1207
  this.signals = /* @__PURE__ */ new WeakMap(), this.scheduled = /* @__PURE__ */ new WeakSet();
1183
1208
  }
@@ -1198,7 +1223,7 @@ var K = class e {
1198
1223
  this.scheduled.delete(e), e.execute();
1199
1224
  }));
1200
1225
  }
1201
- }, He = class {
1226
+ }, We = class {
1202
1227
  constructor() {
1203
1228
  this.running = [], this.eventType = "un-effect:change";
1204
1229
  }
@@ -1217,11 +1242,11 @@ var K = class e {
1217
1242
  }
1218
1243
  subscribe(e, t) {
1219
1244
  let n = this.current();
1220
- n && K.scheduler.subscribe(t, e, n);
1245
+ n && G.scheduler.subscribe(t, e, n);
1221
1246
  }
1222
1247
  runEffects(e, t) {
1223
- if (K.scheduler.scheduleEffects(t, e), this.host) {
1224
- let n = new Ve(this.eventType, {
1248
+ if (console.log("⚙️ Running effects for signal", e, t), G.scheduler.scheduleEffects(t, e), this.host) {
1249
+ let n = new Ue(this.eventType, {
1225
1250
  property: e,
1226
1251
  value: t[e]
1227
1252
  });
@@ -1231,12 +1256,12 @@ var K = class e {
1231
1256
  setHost(e, t) {
1232
1257
  this.host = e, t && (this.eventType = t);
1233
1258
  }
1234
- }, q = class {
1259
+ }, K = class {
1235
1260
  static {
1236
1261
  this.CHANGE_EVENT_TYPE = "un-context:change";
1237
1262
  }
1238
1263
  constructor(e, t) {
1239
- t ? (this.manager = t.manager, this.object = t.object, this.proxy = t.proxy, this.update(e)) : (this.manager = new He(), this.object = e, this.proxy = Ue(this.object, this.manager));
1264
+ t ? (this.manager = t.manager, this.object = t.object, this.proxy = t.proxy, this.update(e)) : (this.manager = new We(), this.object = e, this.proxy = Ge(this.object, this.manager));
1240
1265
  }
1241
1266
  get(e) {
1242
1267
  return this.proxy[e];
@@ -1245,7 +1270,7 @@ var K = class e {
1245
1270
  this.proxy[e] = t;
1246
1271
  }
1247
1272
  toObject() {
1248
- return this.object;
1273
+ return this.proxy;
1249
1274
  }
1250
1275
  update(e) {
1251
1276
  Object.assign(this.proxy, e);
@@ -1254,7 +1279,7 @@ var K = class e {
1254
1279
  this.update(e(this.proxy));
1255
1280
  }
1256
1281
  createEffect(e) {
1257
- G(e, this);
1282
+ W(e, this);
1258
1283
  }
1259
1284
  setHost(e, t) {
1260
1285
  this.manager.setHost(e, t);
@@ -1266,19 +1291,19 @@ var K = class e {
1266
1291
  this.manager.pop();
1267
1292
  }
1268
1293
  };
1269
- function Ue(e, t) {
1294
+ function Ge(e, t) {
1270
1295
  return new Proxy(e, {
1271
1296
  get: (e, n, r) => {
1272
1297
  let i = Reflect.get(e, n, r);
1273
- return t.isRunning() && J(i) && t.subscribe(n, e), i;
1298
+ return t.isRunning() && q(i) && t.subscribe(n, e), i;
1274
1299
  },
1275
1300
  set: (e, n, r, i) => {
1276
1301
  let a = Reflect.set(e, n, r, i);
1277
- return a && J(r) && t.runEffects(n, e), a;
1302
+ return a && q(r) && t.runEffects(n, e), a;
1278
1303
  }
1279
1304
  });
1280
1305
  }
1281
- function J(e) {
1306
+ function q(e) {
1282
1307
  switch (typeof e) {
1283
1308
  case "object":
1284
1309
  case "number":
@@ -1289,17 +1314,17 @@ function J(e) {
1289
1314
  default: return !1;
1290
1315
  }
1291
1316
  }
1292
- function We(e, t) {
1317
+ function Ke(e, t) {
1293
1318
  return Object.assign(e, { render: t }), e;
1294
1319
  }
1295
- function Ge(e, t, ...n) {
1320
+ function qe(e, t, ...n) {
1296
1321
  let r = e.cloneNode(!0);
1297
1322
  return Array.from(t.entries()).forEach(([e, t]) => {
1298
1323
  let i = r.querySelector(`[data-${e}]`);
1299
1324
  i && t.forEach((e) => e(i, r, ...n));
1300
1325
  }), r;
1301
1326
  }
1302
- var Ke = class e {
1327
+ var Je = class e {
1303
1328
  static {
1304
1329
  this.parser = new DOMParser();
1305
1330
  }
@@ -1335,7 +1360,7 @@ var Ke = class e {
1335
1360
  }
1336
1361
  });
1337
1362
  }
1338
- return We(s, (...e) => Ge(s, c, ...e));
1363
+ return Ke(s, (...e) => qe(s, c, ...e));
1339
1364
  }
1340
1365
  static {
1341
1366
  this.OPEN_RE = /<([a-zA-z][$a-zA-Z0-9.-]*)\s+[^>]*$/;
@@ -1374,35 +1399,35 @@ var Ke = class e {
1374
1399
  let n = this.plugins;
1375
1400
  for (let r = 0; r < n.length; r++) {
1376
1401
  let i = n[r];
1377
- if (e.kind === i.place && qe(t, i)) return i.mutator(e, t);
1402
+ if (e.kind === i.place && Ye(t, i)) return i.mutator(e, t);
1378
1403
  }
1379
1404
  }
1380
1405
  };
1381
- function qe(e, t) {
1406
+ function Ye(e, t) {
1382
1407
  return typeof t.types == "function" ? t.types(e, t) : t.types.includes(typeof e);
1383
1408
  }
1384
- var Y = class {
1409
+ var J = class {
1385
1410
  constructor(e) {
1386
1411
  this.place = e;
1387
1412
  }
1388
1413
  apply(e, t) {
1389
1414
  throw "abstract method 'apply' called";
1390
1415
  }
1391
- }, X = class extends Y {
1416
+ }, Y = class extends J {
1392
1417
  constructor(e, t) {
1393
1418
  super(e), this.content = t;
1394
1419
  }
1395
1420
  apply(e, t) {
1396
1421
  (e.parentNode || t).replaceChild(this.content, e);
1397
1422
  }
1398
- }, Je = class extends Y {
1423
+ }, Xe = class extends J {
1399
1424
  constructor(e, t) {
1400
1425
  super(e), this.text = t, this.name = e.attrName;
1401
1426
  }
1402
1427
  apply(e) {
1403
1428
  e.setAttribute(this.name, this.text);
1404
1429
  }
1405
- }, Ye = class extends Y {
1430
+ }, Ze = class extends J {
1406
1431
  constructor(e, t) {
1407
1432
  super(e), this.fn = t;
1408
1433
  }
@@ -1410,13 +1435,13 @@ var Y = class {
1410
1435
  let n = this.place.nodeLabel;
1411
1436
  return (e, t, ...r) => {
1412
1437
  let i = new Comment(` <<< ${n} `), a = new Comment(` >>> ${n} `), o = new DocumentFragment();
1413
- o.replaceChildren(i, a), (e.parentNode || t).replaceChild(o, e), G((...e) => {
1414
- Xe(this.fn(...e), i, a);
1438
+ o.replaceChildren(i, a), (e.parentNode || t).replaceChild(o, e), W((...e) => {
1439
+ Qe(this.fn(...e), i, a);
1415
1440
  }, ...r);
1416
1441
  };
1417
1442
  }
1418
1443
  };
1419
- function Xe(e, t, n) {
1444
+ function Qe(e, t, n) {
1420
1445
  let r = t.parentNode;
1421
1446
  if (!r) throw Error("No parent for placeholder");
1422
1447
  let i = (e) => {
@@ -1425,26 +1450,24 @@ function Xe(e, t, n) {
1425
1450
  return t.replaceChildren(...n), t;
1426
1451
  } else if (e instanceof Node) return e;
1427
1452
  else return new Text(e?.toString() || "");
1428
- }, a = i(e);
1429
- console.log("📸 Rendered for view:", e, a);
1430
- let o = t.nextSibling;
1453
+ }, a = i(e), o = t.nextSibling;
1431
1454
  for (; o && o !== n;) {
1432
1455
  let e = o;
1433
1456
  o = o.nextSibling, r.removeChild(e);
1434
1457
  }
1435
1458
  a && r.insertBefore(a, n);
1436
1459
  }
1437
- var Ze = class extends Y {
1460
+ var $e = class extends J {
1438
1461
  constructor(e, t) {
1439
1462
  super(e), this.fn = t, this.name = e.attrName;
1440
1463
  }
1441
1464
  apply(e, t) {
1442
- return (e, t, ...n) => G((...t) => {
1443
- Qe(this.fn(...t), e, this.name);
1465
+ return (e, t, ...n) => W((...t) => {
1466
+ et(this.fn(...t), e, this.name);
1444
1467
  }, ...n);
1445
1468
  }
1446
1469
  };
1447
- function Qe(e, t, n) {
1470
+ function et(e, t, n) {
1448
1471
  let r = n.match(/^([.$])(.+)$/);
1449
1472
  if (r) {
1450
1473
  let [n, i, a] = r;
@@ -1453,7 +1476,7 @@ function Qe(e, t, n) {
1453
1476
  t[a] = e;
1454
1477
  break;
1455
1478
  case "$":
1456
- "viewModel" in t && t.viewModel instanceof q && t.viewModel.set(a, e);
1479
+ "viewModel" in t && t.viewModel instanceof K && t.viewModel.set(a, e);
1457
1480
  break;
1458
1481
  }
1459
1482
  } else switch (typeof e) {
@@ -1468,18 +1491,18 @@ function Qe(e, t, n) {
1468
1491
  default: t.setAttribute(n, e?.toString());
1469
1492
  }
1470
1493
  }
1471
- var $e = class extends Y {
1494
+ var X = class extends J {
1472
1495
  constructor(e, t) {
1473
1496
  super(e), this.fn = t;
1474
1497
  }
1475
1498
  apply(e, t) {
1476
- return (e, t, ...n) => G((...t) => {
1499
+ return (e, t, ...n) => W((...t) => {
1477
1500
  let n = this.fn(...t);
1478
1501
  typeof n == "function" && n(e);
1479
1502
  }, ...n);
1480
1503
  }
1481
1504
  };
1482
- new Ke().use([
1505
+ new Je().use([
1483
1506
  {
1484
1507
  place: "element content",
1485
1508
  types: [
@@ -1489,7 +1512,7 @@ new Ke().use([
1489
1512
  "symbol",
1490
1513
  "boolean"
1491
1514
  ],
1492
- mutator: (e, t) => new X(e, new Text(t?.toString() || ""))
1515
+ mutator: (e, t) => new Y(e, new Text(t?.toString() || ""))
1493
1516
  },
1494
1517
  {
1495
1518
  place: "attr value",
@@ -1499,30 +1522,38 @@ new Ke().use([
1499
1522
  "bigint",
1500
1523
  "symbol"
1501
1524
  ],
1502
- mutator: (e, t) => new Je(e, t?.toString() || "")
1525
+ mutator: (e, t) => new Xe(e, t?.toString() || "")
1503
1526
  },
1504
1527
  {
1505
1528
  place: "element content",
1506
1529
  types: (e) => e instanceof Node,
1507
- mutator: (e, t) => new X(e, t)
1530
+ mutator: (e, t) => new Y(e, t)
1531
+ },
1532
+ {
1533
+ place: "element content",
1534
+ types: (e) => Array.isArray(e),
1535
+ mutator: (e, t) => {
1536
+ let n = new DocumentFragment(), r = t.map((e) => e instanceof Node ? e : new Text(e?.toString() || ""));
1537
+ return n.append(...r), new Y(e, n);
1538
+ }
1508
1539
  },
1509
1540
  {
1510
1541
  place: "element content",
1511
1542
  types: ["function"],
1512
- mutator: (e, t) => new Ye(e, t)
1543
+ mutator: (e, t) => new Ze(e, t)
1513
1544
  },
1514
1545
  {
1515
1546
  place: "attr value",
1516
1547
  types: ["function"],
1517
- mutator: (e, t) => new Ze(e, t)
1548
+ mutator: (e, t) => new $e(e, t)
1518
1549
  },
1519
1550
  {
1520
1551
  place: "tag content",
1521
1552
  types: ["function"],
1522
- mutator: (e, t) => new $e(e, t)
1553
+ mutator: (e, t) => new X(e, t)
1523
1554
  }
1524
1555
  ]);
1525
- var Z = class extends q {
1556
+ var Z = class extends K {
1526
1557
  constructor(e, t) {
1527
1558
  super(e, t);
1528
1559
  }
@@ -1531,20 +1562,23 @@ var Z = class extends q {
1531
1562
  }
1532
1563
  with(e, ...t) {
1533
1564
  let n = Object.fromEntries(t.map((e) => [e, e]));
1534
- return this.merge(new W(e, n));
1565
+ return this.merge(new U(e, n));
1535
1566
  }
1536
1567
  withCalculated(e, t) {
1537
- return this.merge(new W(e, t));
1568
+ return this.merge(new U(e, t));
1538
1569
  }
1539
1570
  withRenamed(e, t) {
1540
- return this.merge(new W(e, t));
1571
+ return this.merge(new U(e, t));
1541
1572
  }
1542
1573
  merge(e) {
1543
1574
  if (e) {
1544
- let t = e.start((e, n) => {
1545
- console.log("🪄 Merging effect", e, n, t), this.set(e, n);
1575
+ let t = /* @__PURE__ */ new Map();
1576
+ e.start((e, n) => {
1577
+ this.set(e, n), t.set(e, !0);
1546
1578
  }).then((e) => {
1547
- console.log("👀 ViewModel source observed:", e, t), Object.keys(e).forEach((t) => this.set(t, e[t]));
1579
+ Object.keys(e).filter((e) => !t.get(e)).forEach((t) => {
1580
+ this.set(t, e[t]);
1581
+ });
1548
1582
  });
1549
1583
  }
1550
1584
  return this;
@@ -1553,38 +1587,38 @@ var Z = class extends q {
1553
1587
  return e.render(this);
1554
1588
  }
1555
1589
  };
1556
- function et(e) {
1590
+ function tt(e) {
1557
1591
  return e === void 0 ? new Z({}) : new Z(e);
1558
1592
  }
1559
1593
  //#endregion
1560
1594
  //#region src/store.ts
1561
- var tt = /* @__PURE__ */ t({
1595
+ var nt = /* @__PURE__ */ t({
1562
1596
  CONTEXT_DEFAULT: () => Q,
1563
- Provider: () => nt,
1597
+ Provider: () => rt,
1564
1598
  Service: () => $,
1565
- dispatch: () => rt
1566
- }), Q = "context:store", $ = class e extends Re {
1599
+ dispatch: () => it
1600
+ }), Q = "context:store", $ = class e extends ze {
1567
1601
  static {
1568
1602
  this.EVENT_TYPE = "store:message";
1569
1603
  }
1570
1604
  constructor(t, n) {
1571
1605
  super((e, t) => n(t, e), t, e.EVENT_TYPE);
1572
1606
  }
1573
- }, nt = class extends H {
1607
+ }, rt = class extends V {
1574
1608
  constructor(e, t) {
1575
- super(t, Q), this.viewModel = et({ authenticated: !1 }).with(k(this), "authenticated", "username", "token"), this._updateFn = e;
1609
+ super(t, Q), this.viewModel = tt({ authenticated: !1 }).with(k(this), "authenticated", "username", "token"), this._updateFn = e;
1576
1610
  }
1577
1611
  connectedCallback() {
1578
1612
  new $(this.context, (e, t) => this._updateFn(e, t, this.viewModel.toObject())).attach(this);
1579
1613
  }
1580
1614
  };
1581
- function rt(e, t) {
1615
+ function it(e, t) {
1582
1616
  console.log("📨 Dispatching message:", t, e), e.dispatchEvent(new j.Dispatch(t, $.EVENT_TYPE));
1583
1617
  }
1584
1618
  //#endregion
1585
1619
  //#region src/fromStore.ts
1586
- function it(e, t = Q) {
1587
- return new ze(e, t);
1620
+ function at(e, t = Q) {
1621
+ return Be(e, t);
1588
1622
  }
1589
1623
  //#endregion
1590
- export { tt as Store, it as fromStore };
1624
+ export { nt as Store, at as fromStore };
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.store={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.defineProperty,n=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},r=class extends Error{};r.prototype.name=`InvalidTokenError`;function i(e){return decodeURIComponent(atob(e).replace(/(.)/g,(e,t)=>{let n=t.charCodeAt(0).toString(16).toUpperCase();return n.length<2&&(n=`0`+n),`%`+n}))}function a(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`);switch(t.length%4){case 0:break;case 2:t+=`==`;break;case 3:t+=`=`;break;default:throw Error(`base64 string is not of the correct length`)}try{return i(t)}catch{return atob(t)}}function o(e,t){if(typeof e!=`string`)throw new r(`Invalid token specified: must be a string`);t||={};let n=t.header===!0?0:1,i=e.split(`.`)[n];if(typeof i!=`string`)throw new r(`Invalid token specified: missing part #${n+1}`);let o;try{o=a(i)}catch(e){throw new r(`Invalid token specified: invalid base64 for part #${n+1} (${e.message})`)}try{return JSON.parse(o)}catch(e){throw new r(`Invalid token specified: invalid json for part #${n+1} (${e.message})`)}}var s=Object.defineProperty,c=((e,t)=>{let n={};for(var r in e)s(n,r,{get:e[r],enumerable:!0});return t||s(n,Symbol.toStringTag,{value:`Module`}),n})({Dispatch:()=>u,None:()=>l,dispatch:()=>ee,dispatcher:()=>d}),l=[],u=class extends CustomEvent{constructor(e,t=`un:message`){super(t,{bubbles:!0,composed:!0,detail:e})}};function d(e=`un:message`){return(t,...n)=>t.dispatchEvent(new u(n,e))}var ee=d(),te=class extends CustomEvent{constructor(e,t){super(e,{bubbles:!0,cancelable:!0,composed:!0,detail:t})}};function f(e,...t){let n={execute(){e(...t.map(e=>e instanceof m?e.open(n):e)),t.forEach(e=>e instanceof m&&e.close())}};n.execute()}var p=class e{constructor(){this.signals=new WeakMap,this.scheduled=new WeakSet}static{this.scheduler=new e}subscribe(e,t,n){let r=this.signals.get(e);r||(r=new Map,this.signals.set(e,r));let i=r.get(t);i||(i=new Set,r.set(t,i)),i.add(n)}scheduleEffects(e,t){let n=this.signals.get(e);if(!n)return;let r=n.get(t);if(r)for(let e of r)this.scheduled.has(e)||(this.scheduled.add(e),setTimeout(()=>{this.scheduled.delete(e),e.execute()}))}},ne=class{constructor(){this.running=[],this.eventType=`un-effect:change`}isRunning(){return this.running.length>0}push(e){this.running.push(e)}pop(){this.running.pop()}current(){let e=this.running.length;return e?this.running[e-1]:void 0}subscribe(e,t){let n=this.current();n&&p.scheduler.subscribe(t,e,n)}runEffects(e,t){if(p.scheduler.scheduleEffects(t,e),this.host){let n=new te(this.eventType,{property:e,value:t[e]});this.host.dispatchEvent(n)}}setHost(e,t){this.host=e,t&&(this.eventType=t)}},m=class{static{this.CHANGE_EVENT_TYPE=`un-context:change`}constructor(e,t){t?(this.manager=t.manager,this.object=t.object,this.proxy=t.proxy,this.update(e)):(this.manager=new ne,this.object=e,this.proxy=re(this.object,this.manager))}get(e){return this.proxy[e]}set(e,t){this.proxy[e]=t}toObject(){return this.object}update(e){Object.assign(this.proxy,e)}apply(e){this.update(e(this.proxy))}createEffect(e){f(e,this)}setHost(e,t){this.manager.setHost(e,t)}open(e){return this.manager.push(e),this.proxy}close(){this.manager.pop()}};function re(e,t){return new Proxy(e,{get:(e,n,r)=>{let i=Reflect.get(e,n,r);return t.isRunning()&&h(i)&&t.subscribe(n,e),i},set:(e,n,r,i)=>{let a=Reflect.set(e,n,r,i);return a&&h(r)&&t.runEffects(n,e),a}})}function h(e){switch(typeof e){case`object`:case`number`:case`string`:case`symbol`:case`boolean`:case`undefined`:return!0;default:return!1}}var g=class{constructor(e,...t){this.effectFn=()=>e(...t)}execute(){this.effectFn()}};function _(e,t){return Object.assign(e,{render:t}),e}function v(e,t,...n){let r=e.cloneNode(!0);return Array.from(t.entries()).forEach(([e,t])=>{let i=r.querySelector(`[data-${e}]`);i&&t.forEach(e=>e(i,r,...n))}),r}var ie=class e{static{this.parser=new DOMParser}constructor(e){this.docType=`text/html`,this.plugins=[],e&&(this.docType=e)}use(e){this.plugins=this.plugins.concat(e)}parse(t,n){let r={},i=t.map((e,i)=>{if(i>=n.length)return[e];let a=n[i],o=this.classifyPlace(i,t),s=this.tryReplacements(o,a);if(s){let t=r[o.nodeLabel];switch(t?t.push(s):r[o.nodeLabel]=[s],o.kind){case`attr value`:return[e,`"" data-${o.nodeLabel}`];case`tag content`:return[e,`data-${o.nodeLabel}`];case`element content`:return[e,`<ins data-${o.nodeLabel}></ins>`]}}else throw console.error(`No match for template parameter`,o,a),`Failed to render template parameter ${i} around ${e}`;return[e]}).flat().join(``),a=e.parser.parseFromString(i,this.docType),o=a.head.childElementCount?a.head.children:a.body.children,s=new DocumentFragment;s.replaceChildren(...o);let c=new Map;for(let e in r){let t=s.querySelector(`[data-${e}]`);t&&r[e].forEach(n=>{let r=n.apply(t,s);if(r){let t=c.get(e);t?t.push(r):c.set(e,[r])}})}return _(s,(...e)=>v(s,c,...e))}static{this.OPEN_RE=/<([a-zA-z][$a-zA-Z0-9.-]*)\s+[^>]*$/}static{this.IN_TAG_RE=/^(\s+|[^<>]*|"[^"]*")*$/}static{this.ATTR_RE=/([$.]?[a-zA-Z][$a-zA-Z0-9.-]*)=\s*$/}static{this.CLOSE_RE=/[/]?>[^<]*$/}classifyPlace(t,n){let r=null;for(let i=t;i>=0&&!(n[i].match(e.CLOSE_RE)||(r=n[i].match(e.OPEN_RE),r)||!n[i].match(e.IN_TAG_RE));i--);if(r){let i=n[t].match(e.ATTR_RE);return i?{kind:`attr value`,nodeLabel:`node${t}`,tagName:r[1],attrName:i[1]}:{kind:`tag content`,nodeLabel:`node${t}`,tagName:r[1]}}return{kind:`element content`,nodeLabel:`node${t}`}}tryReplacements(e,t){let n=this.plugins;for(let r=0;r<n.length;r++){let i=n[r];if(e.kind===i.place&&ae(t,i))return i.mutator(e,t)}}};function ae(e,t){return typeof t.types==`function`?t.types(e,t):t.types.includes(typeof e)}var y=class{constructor(e){this.place=e}apply(e,t){throw`abstract method 'apply' called`}},b=class extends y{constructor(e,t){super(e),this.content=t}apply(e,t){(e.parentNode||t).replaceChild(this.content,e)}},oe=class extends y{constructor(e,t){super(e),this.text=t,this.name=e.attrName}apply(e){e.setAttribute(this.name,this.text)}},se=class extends y{constructor(e,t){super(e),this.fn=t}apply(e,t){let n=this.place.nodeLabel;return(e,t,...r)=>{let i=new Comment(` <<< ${n} `),a=new Comment(` >>> ${n} `),o=new DocumentFragment;o.replaceChildren(i,a),(e.parentNode||t).replaceChild(o,e),f((...e)=>{ce(this.fn(...e),i,a)},...r)}}};function ce(e,t,n){let r=t.parentNode;if(!r)throw Error(`No parent for placeholder`);let i=e=>{if(Array.isArray(e)){let t=new DocumentFragment,n=e.map(i);return t.replaceChildren(...n),t}else if(e instanceof Node)return e;else return new Text(e?.toString()||``)},a=i(e);console.log(`📸 Rendered for view:`,e,a);let o=t.nextSibling;for(;o&&o!==n;){let e=o;o=o.nextSibling,r.removeChild(e)}a&&r.insertBefore(a,n)}var le=class extends y{constructor(e,t){super(e),this.fn=t,this.name=e.attrName}apply(e,t){return(e,t,...n)=>f((...t)=>{ue(this.fn(...t),e,this.name)},...n)}};function ue(e,t,n){let r=n.match(/^([.$])(.+)$/);if(r){let[n,i,a]=r;switch(i){case`.`:t[a]=e;break;case`$`:`viewModel`in t&&t.viewModel instanceof m&&t.viewModel.set(a,e);break}}else switch(typeof e){case`string`:t.setAttribute(n,e);break;case`undefined`:case`object`:case`boolean`:e?t.setAttribute(n,n):t.removeAttribute(n);break;default:t.setAttribute(n,e?.toString())}}var de=class extends y{constructor(e,t){super(e),this.fn=t}apply(e,t){return(e,t,...n)=>f((...t)=>{let n=this.fn(...t);typeof n==`function`&&n(e)},...n)}};new ie().use([{place:`element content`,types:[`string`,`number`,`bigint`,`symbol`,`boolean`],mutator:(e,t)=>new b(e,new Text(t?.toString()||``))},{place:`attr value`,types:[`string`,`number`,`bigint`,`symbol`],mutator:(e,t)=>new oe(e,t?.toString()||``)},{place:`element content`,types:e=>e instanceof Node,mutator:(e,t)=>new b(e,t)},{place:`element content`,types:[`function`],mutator:(e,t)=>new se(e,t)},{place:`attr value`,types:[`function`],mutator:(e,t)=>new le(e,t)},{place:`tag content`,types:[`function`],mutator:(e,t)=>new de(e,t)}]);var fe=class e extends HTMLElement{static{this.DISCOVERY_EVENT=`un-provider:discover`}static{this.REGISTRY_EVENT=`un-provider:register`}static{this.CHANGE_EVENT=`un-provider:change`}static{document.addEventListener(e.DISCOVERY_EVENT,e=>{let[t,n]=e.detail,r=he(t);r&&n(r)}),document.addEventListener(e.REGISTRY_EVENT,e=>{let[t,n]=e.detail;me(t,n)})}constructor(t,n){super(),this.contextLabel=n,this.context=new m(t),this.context.setHost(this,e.CHANGE_EVENT),this.addEventListener(e.DISCOVERY_EVENT,e=>{let[t,n]=e.detail;t===this.contextLabel&&(e.stopPropagation(),n(this))});let r=new CustomEvent(e.REGISTRY_EVENT,{bubbles:!0,composed:!0,detail:[this.contextLabel,this]});this.dispatchEvent(r)}attach(t){return this.addEventListener(e.CHANGE_EVENT,t),this.context.toObject()}detach(t){this.removeEventListener(e.CHANGE_EVENT,t)}};function pe(e,t){return new Promise((n,r)=>{let i=new CustomEvent(fe.DISCOVERY_EVENT,{bubbles:!0,composed:!0,detail:[t,e=>e?n(e):r()]});e.isConnected?e.dispatchEvent(i):document.dispatchEvent(i)})}var x={};function me(e,t){x[e]=t}function he(e){return x[e]}var ge=class{constructor(e){this.contextLabel=e}observe(e,t){return new Promise((n,r)=>{this.provider?n(this.attachObserver(t)):pe(e,this.contextLabel).then(e=>{this.provider=e,n(this.attachObserver(t))}).catch(e=>r(e))})}attachObserver(e){let t=this.provider.attach(t=>{let{property:n,value:r}=t.detail,i=new g(e,{property:n,value:r});this.observed&&(this.observed[n]=r,i.execute())});return this.observed=t,t}},_e=class{constructor(e,t,n=`service:message`,r=!0){this._pending=[],this._context=t,this._update=e,this._eventType=n,this._running=r}attach(e){e.addEventListener(this._eventType,e=>{e.stopPropagation();let t=e.detail;this.consume(t)})}start(){this._running||(this._running=!0,this._pending.forEach(e=>this.process(e)))}consume(e){if(e.length===0){let t=e;this._running?this.process(t):this._pending.push(t)}}process(e){let t=this._update(e,this._context.toObject());if(!Array.isArray(t))return t;let[n,...r]=t;return r.forEach(e=>e.then(e=>this.consume(e))),n}};function ve(e,t){return new ye(e,t)}var ye=class{constructor(e,t){this.client=e,this.observer=new ge(t)}start(e){return this.observer.observe(this.client,t=>{e(t.property,t.value)})}},be=`context:auth`,S=class e{static{this.TOKEN_KEY=`un-auth:token`}constructor(e){this.authenticated=!1,this.username=e||`anonymous`}static deauthenticate(t){return t.authenticated=!1,t.username=`anonymous`,localStorage.removeItem(e.TOKEN_KEY),t}},C=class e extends S{constructor(e){super();let t=o(e);console.log(`Token payload`,t),this.token=e,this.authenticated=!0,this.username=t.username}static authenticate(t){let n=new e(t);return localStorage.setItem(S.TOKEN_KEY,t),n}static authenticateFromLocalStorage(){let t=localStorage.getItem(S.TOKEN_KEY);return t?e.authenticate(t):new S}},w=class e extends _e{static{this.EVENT_TYPE=`auth:message`}constructor(t,n){super((e,t)=>this.update(e,t),t,e.EVENT_TYPE),this._redirectForLogin=n}update(e,t){switch(e[0]){case`auth/signin`:let{token:n,redirect:r}=e[1];return[D(n),T(r)];case`auth/signout`:return[O(t),T(this._redirectForLogin)];case`auth/redirect`:E(this._redirectForLogin,{next:window.location.href});break;default:let i=e[0];throw Error(`Unhandled Auth message "${i}"`)}return t}};c.dispatcher(w.EVENT_TYPE);function T(e,t={}){return new Promise(n=>{E(e,t),n(c.None)})}function E(e,t={}){if(e){let n=window.location.href,r=new URL(e,n);Object.entries(t).forEach(([e,t])=>r.searchParams.set(e,t)),console.log(`Redirecting to `,e),window.location.assign(r)}}function D(e){let{authenticated:t,username:n}=C.authenticate(e);return{authenticated:t,username:n,token:e}}function O(e){let{authenticated:t,username:n}=S.deauthenticate(new S(e.username));return{username:n,authenticated:t,token:void 0}}function k(e,t=be){return ve(e,t)}var A=Object.defineProperty,j=((e,t)=>{let n={};for(var r in e)A(n,r,{get:e[r],enumerable:!0});return t||A(n,Symbol.toStringTag,{value:`Module`}),n})({Dispatch:()=>N,None:()=>M,dispatch:()=>xe,dispatcher:()=>P}),M=[],N=class extends CustomEvent{constructor(e,t=`un:message`){super(t,{bubbles:!0,composed:!0,detail:e})}};function P(e=`un:message`){return(t,...n)=>t.dispatchEvent(new N(n,e))}var xe=P(),Se=class extends CustomEvent{constructor(e,t){super(e,{bubbles:!0,cancelable:!0,composed:!0,detail:t})}};function F(e,...t){let n={execute(){e(...t.map(e=>e instanceof L?e.open(n):e)),t.forEach(e=>e instanceof L&&e.close())}};n.execute()}var I=class e{constructor(){this.signals=new WeakMap,this.scheduled=new WeakSet}static{this.scheduler=new e}subscribe(e,t,n){let r=this.signals.get(e);r||(r=new Map,this.signals.set(e,r));let i=r.get(t);i||(i=new Set,r.set(t,i)),i.add(n)}scheduleEffects(e,t){let n=this.signals.get(e);if(!n)return;let r=n.get(t);if(r)for(let e of r)this.scheduled.has(e)||(this.scheduled.add(e),setTimeout(()=>{this.scheduled.delete(e),e.execute()}))}},Ce=class{constructor(){this.running=[],this.eventType=`un-effect:change`}isRunning(){return this.running.length>0}push(e){this.running.push(e)}pop(){this.running.pop()}current(){let e=this.running.length;return e?this.running[e-1]:void 0}subscribe(e,t){let n=this.current();n&&I.scheduler.subscribe(t,e,n)}runEffects(e,t){if(I.scheduler.scheduleEffects(t,e),this.host){let n=new Se(this.eventType,{property:e,value:t[e]});this.host.dispatchEvent(n)}}setHost(e,t){this.host=e,t&&(this.eventType=t)}},L=class{static{this.CHANGE_EVENT_TYPE=`un-context:change`}constructor(e,t){t?(this.manager=t.manager,this.object=t.object,this.proxy=t.proxy,this.update(e)):(this.manager=new Ce,this.object=e,this.proxy=we(this.object,this.manager))}get(e){return this.proxy[e]}set(e,t){this.proxy[e]=t}toObject(){return this.object}update(e){Object.assign(this.proxy,e)}apply(e){this.update(e(this.proxy))}createEffect(e){F(e,this)}setHost(e,t){this.manager.setHost(e,t)}open(e){return this.manager.push(e),this.proxy}close(){this.manager.pop()}};function we(e,t){return new Proxy(e,{get:(e,n,r)=>{let i=Reflect.get(e,n,r);return t.isRunning()&&R(i)&&t.subscribe(n,e),i},set:(e,n,r,i)=>{let a=Reflect.set(e,n,r,i);return a&&R(r)&&t.runEffects(n,e),a}})}function R(e){switch(typeof e){case`object`:case`number`:case`string`:case`symbol`:case`boolean`:case`undefined`:return!0;default:return!1}}var Te=class{constructor(e,...t){this.effectFn=()=>e(...t)}execute(){this.effectFn()}};function Ee(e,t){return Object.assign(e,{render:t}),e}function De(e,t,...n){let r=e.cloneNode(!0);return Array.from(t.entries()).forEach(([e,t])=>{let i=r.querySelector(`[data-${e}]`);i&&t.forEach(e=>e(i,r,...n))}),r}var Oe=class e{static{this.parser=new DOMParser}constructor(e){this.docType=`text/html`,this.plugins=[],e&&(this.docType=e)}use(e){this.plugins=this.plugins.concat(e)}parse(t,n){let r={},i=t.map((e,i)=>{if(i>=n.length)return[e];let a=n[i],o=this.classifyPlace(i,t),s=this.tryReplacements(o,a);if(s){let t=r[o.nodeLabel];switch(t?t.push(s):r[o.nodeLabel]=[s],o.kind){case`attr value`:return[e,`"" data-${o.nodeLabel}`];case`tag content`:return[e,`data-${o.nodeLabel}`];case`element content`:return[e,`<ins data-${o.nodeLabel}></ins>`]}}else throw console.error(`No match for template parameter`,o,a),`Failed to render template parameter ${i} around ${e}`;return[e]}).flat().join(``),a=e.parser.parseFromString(i,this.docType),o=a.head.childElementCount?a.head.children:a.body.children,s=new DocumentFragment;s.replaceChildren(...o);let c=new Map;for(let e in r){let t=s.querySelector(`[data-${e}]`);t&&r[e].forEach(n=>{let r=n.apply(t,s);if(r){let t=c.get(e);t?t.push(r):c.set(e,[r])}})}return Ee(s,(...e)=>De(s,c,...e))}static{this.OPEN_RE=/<([a-zA-z][$a-zA-Z0-9.-]*)\s+[^>]*$/}static{this.IN_TAG_RE=/^(\s+|[^<>]*|"[^"]*")*$/}static{this.ATTR_RE=/([$.]?[a-zA-Z][$a-zA-Z0-9.-]*)=\s*$/}static{this.CLOSE_RE=/[/]?>[^<]*$/}classifyPlace(t,n){let r=null;for(let i=t;i>=0&&!(n[i].match(e.CLOSE_RE)||(r=n[i].match(e.OPEN_RE),r)||!n[i].match(e.IN_TAG_RE));i--);if(r){let i=n[t].match(e.ATTR_RE);return i?{kind:`attr value`,nodeLabel:`node${t}`,tagName:r[1],attrName:i[1]}:{kind:`tag content`,nodeLabel:`node${t}`,tagName:r[1]}}return{kind:`element content`,nodeLabel:`node${t}`}}tryReplacements(e,t){let n=this.plugins;for(let r=0;r<n.length;r++){let i=n[r];if(e.kind===i.place&&ke(t,i))return i.mutator(e,t)}}};function ke(e,t){return typeof t.types==`function`?t.types(e,t):t.types.includes(typeof e)}var z=class{constructor(e){this.place=e}apply(e,t){throw`abstract method 'apply' called`}},B=class extends z{constructor(e,t){super(e),this.content=t}apply(e,t){(e.parentNode||t).replaceChild(this.content,e)}},Ae=class extends z{constructor(e,t){super(e),this.text=t,this.name=e.attrName}apply(e){e.setAttribute(this.name,this.text)}},je=class extends z{constructor(e,t){super(e),this.fn=t}apply(e,t){let n=this.place.nodeLabel;return(e,t,...r)=>{let i=new Comment(` <<< ${n} `),a=new Comment(` >>> ${n} `),o=new DocumentFragment;o.replaceChildren(i,a),(e.parentNode||t).replaceChild(o,e),F((...e)=>{Me(this.fn(...e),i,a)},...r)}}};function Me(e,t,n){let r=t.parentNode;if(!r)throw Error(`No parent for placeholder`);let i=e=>{if(Array.isArray(e)){let t=new DocumentFragment,n=e.map(i);return t.replaceChildren(...n),t}else if(e instanceof Node)return e;else return new Text(e?.toString()||``)},a=i(e);console.log(`📸 Rendered for view:`,e,a);let o=t.nextSibling;for(;o&&o!==n;){let e=o;o=o.nextSibling,r.removeChild(e)}a&&r.insertBefore(a,n)}var Ne=class extends z{constructor(e,t){super(e),this.fn=t,this.name=e.attrName}apply(e,t){return(e,t,...n)=>F((...t)=>{Pe(this.fn(...t),e,this.name)},...n)}};function Pe(e,t,n){let r=n.match(/^([.$])(.+)$/);if(r){let[n,i,a]=r;switch(i){case`.`:t[a]=e;break;case`$`:`viewModel`in t&&t.viewModel instanceof L&&t.viewModel.set(a,e);break}}else switch(typeof e){case`string`:t.setAttribute(n,e);break;case`undefined`:case`object`:case`boolean`:e?t.setAttribute(n,n):t.removeAttribute(n);break;default:t.setAttribute(n,e?.toString())}}var Fe=class extends z{constructor(e,t){super(e),this.fn=t}apply(e,t){return(e,t,...n)=>F((...t)=>{let n=this.fn(...t);typeof n==`function`&&n(e)},...n)}};new Oe().use([{place:`element content`,types:[`string`,`number`,`bigint`,`symbol`,`boolean`],mutator:(e,t)=>new B(e,new Text(t?.toString()||``))},{place:`attr value`,types:[`string`,`number`,`bigint`,`symbol`],mutator:(e,t)=>new Ae(e,t?.toString()||``)},{place:`element content`,types:e=>e instanceof Node,mutator:(e,t)=>new B(e,t)},{place:`element content`,types:[`function`],mutator:(e,t)=>new je(e,t)},{place:`attr value`,types:[`function`],mutator:(e,t)=>new Ne(e,t)},{place:`tag content`,types:[`function`],mutator:(e,t)=>new Fe(e,t)}]);var V=class e extends HTMLElement{static{this.DISCOVERY_EVENT=`un-provider:discover`}static{this.REGISTRY_EVENT=`un-provider:register`}static{this.CHANGE_EVENT=`un-provider:change`}static{document.addEventListener(e.DISCOVERY_EVENT,e=>{let[t,n]=e.detail,r=Re(t);r&&n(r)}),document.addEventListener(e.REGISTRY_EVENT,e=>{let[t,n]=e.detail;Le(t,n)})}constructor(t,n){super(),this.contextLabel=n,this.context=new L(t),this.context.setHost(this,e.CHANGE_EVENT),this.addEventListener(e.DISCOVERY_EVENT,e=>{let[t,n]=e.detail;t===this.contextLabel&&(e.stopPropagation(),n(this))});let r=new CustomEvent(e.REGISTRY_EVENT,{bubbles:!0,composed:!0,detail:[this.contextLabel,this]});this.dispatchEvent(r)}attach(t){return this.addEventListener(e.CHANGE_EVENT,t),this.context.toObject()}detach(t){this.removeEventListener(e.CHANGE_EVENT,t)}};function Ie(e,t){return new Promise((n,r)=>{let i=new CustomEvent(V.DISCOVERY_EVENT,{bubbles:!0,composed:!0,detail:[t,e=>e?n(e):r()]});e.isConnected?e.dispatchEvent(i):document.dispatchEvent(i)})}var H={};function Le(e,t){H[e]=t}function Re(e){return H[e]}var ze=class{constructor(e){this.contextLabel=e}observe(e,t){return new Promise((n,r)=>{this.provider?n(this.attachObserver(t)):Ie(e,this.contextLabel).then(e=>{this.provider=e,n(this.attachObserver(t))}).catch(e=>r(e))})}attachObserver(e){let t=this.provider.attach(t=>{let{property:n,value:r}=t.detail,i=new Te(e,{property:n,value:r});this.observed&&(this.observed[n]=r,i.execute())});return this.observed=t,t}},Be=class{constructor(e,t,n=`service:message`,r=!0){this._pending=[],this._context=t,this._update=e,this._eventType=n,this._running=r}attach(e){e.addEventListener(this._eventType,e=>{e.stopPropagation();let t=e.detail;this.consume(t)})}start(){this._running||(this._running=!0,this._pending.forEach(e=>this.process(e)))}consume(e){if(e.length===0){let t=e;this._running?this.process(t):this._pending.push(t)}}process(e){let t=this._update(e,this._context.toObject());if(!Array.isArray(t))return t;let[n,...r]=t;return r.forEach(e=>e.then(e=>this.consume(e))),n}},Ve=class{constructor(e,t){this.client=e,this.observer=new ze(t)}start(e){return this.observer.observe(this.client,t=>{e(t.property,t.value)})}},U=class{constructor(e,t){this.origin=e;let n=He(t).map(([e,t])=>[t,e]);this.inverse=Object.fromEntries(n)}mapObservation(e){let t=Object.entries(e);return Object.fromEntries(t.map(([e,t])=>[this.inverse[e],t]).filter(e=>e.length>0))}start(e){return this.origin.start((t,n)=>{let r=this.inverse[t];e(r,n)}).then(e=>this.mapObservation(e))}};function He(e){return Object.entries(e).map(([e,t])=>[e,t])}var Ue=class extends CustomEvent{constructor(e,t){super(e,{bubbles:!0,cancelable:!0,composed:!0,detail:t})}};function W(e,...t){let n={execute(){e(...t.map(e=>e instanceof K?e.open(n):e)),t.forEach(e=>e instanceof K&&e.close())}};n.execute()}var G=class e{constructor(){this.signals=new WeakMap,this.scheduled=new WeakSet}static{this.scheduler=new e}subscribe(e,t,n){let r=this.signals.get(e);r||(r=new Map,this.signals.set(e,r));let i=r.get(t);i||(i=new Set,r.set(t,i)),i.add(n)}scheduleEffects(e,t){let n=this.signals.get(e);if(!n)return;let r=n.get(t);if(r)for(let e of r)this.scheduled.has(e)||(this.scheduled.add(e),setTimeout(()=>{this.scheduled.delete(e),e.execute()}))}},We=class{constructor(){this.running=[],this.eventType=`un-effect:change`}isRunning(){return this.running.length>0}push(e){this.running.push(e)}pop(){this.running.pop()}current(){let e=this.running.length;return e?this.running[e-1]:void 0}subscribe(e,t){let n=this.current();n&&G.scheduler.subscribe(t,e,n)}runEffects(e,t){if(G.scheduler.scheduleEffects(t,e),this.host){let n=new Ue(this.eventType,{property:e,value:t[e]});this.host.dispatchEvent(n)}}setHost(e,t){this.host=e,t&&(this.eventType=t)}},K=class{static{this.CHANGE_EVENT_TYPE=`un-context:change`}constructor(e,t){t?(this.manager=t.manager,this.object=t.object,this.proxy=t.proxy,this.update(e)):(this.manager=new We,this.object=e,this.proxy=Ge(this.object,this.manager))}get(e){return this.proxy[e]}set(e,t){this.proxy[e]=t}toObject(){return this.object}update(e){Object.assign(this.proxy,e)}apply(e){this.update(e(this.proxy))}createEffect(e){W(e,this)}setHost(e,t){this.manager.setHost(e,t)}open(e){return this.manager.push(e),this.proxy}close(){this.manager.pop()}};function Ge(e,t){return new Proxy(e,{get:(e,n,r)=>{let i=Reflect.get(e,n,r);return t.isRunning()&&q(i)&&t.subscribe(n,e),i},set:(e,n,r,i)=>{let a=Reflect.set(e,n,r,i);return a&&q(r)&&t.runEffects(n,e),a}})}function q(e){switch(typeof e){case`object`:case`number`:case`string`:case`symbol`:case`boolean`:case`undefined`:return!0;default:return!1}}function Ke(e,t){return Object.assign(e,{render:t}),e}function qe(e,t,...n){let r=e.cloneNode(!0);return Array.from(t.entries()).forEach(([e,t])=>{let i=r.querySelector(`[data-${e}]`);i&&t.forEach(e=>e(i,r,...n))}),r}var Je=class e{static{this.parser=new DOMParser}constructor(e){this.docType=`text/html`,this.plugins=[],e&&(this.docType=e)}use(e){this.plugins=this.plugins.concat(e)}parse(t,n){let r={},i=t.map((e,i)=>{if(i>=n.length)return[e];let a=n[i],o=this.classifyPlace(i,t),s=this.tryReplacements(o,a);if(s){let t=r[o.nodeLabel];switch(t?t.push(s):r[o.nodeLabel]=[s],o.kind){case`attr value`:return[e,`"" data-${o.nodeLabel}`];case`tag content`:return[e,`data-${o.nodeLabel}`];case`element content`:return[e,`<ins data-${o.nodeLabel}></ins>`]}}else throw console.error(`No match for template parameter`,o,a),`Failed to render template parameter ${i} around ${e}`;return[e]}).flat().join(``),a=e.parser.parseFromString(i,this.docType),o=a.head.childElementCount?a.head.children:a.body.children,s=new DocumentFragment;s.replaceChildren(...o);let c=new Map;for(let e in r){let t=s.querySelector(`[data-${e}]`);t&&r[e].forEach(n=>{let r=n.apply(t,s);if(r){let t=c.get(e);t?t.push(r):c.set(e,[r])}})}return Ke(s,(...e)=>qe(s,c,...e))}static{this.OPEN_RE=/<([a-zA-z][$a-zA-Z0-9.-]*)\s+[^>]*$/}static{this.IN_TAG_RE=/^(\s+|[^<>]*|"[^"]*")*$/}static{this.ATTR_RE=/([$.]?[a-zA-Z][$a-zA-Z0-9.-]*)=\s*$/}static{this.CLOSE_RE=/[/]?>[^<]*$/}classifyPlace(t,n){let r=null;for(let i=t;i>=0&&!(n[i].match(e.CLOSE_RE)||(r=n[i].match(e.OPEN_RE),r)||!n[i].match(e.IN_TAG_RE));i--);if(r){let i=n[t].match(e.ATTR_RE);return i?{kind:`attr value`,nodeLabel:`node${t}`,tagName:r[1],attrName:i[1]}:{kind:`tag content`,nodeLabel:`node${t}`,tagName:r[1]}}return{kind:`element content`,nodeLabel:`node${t}`}}tryReplacements(e,t){let n=this.plugins;for(let r=0;r<n.length;r++){let i=n[r];if(e.kind===i.place&&Ye(t,i))return i.mutator(e,t)}}};function Ye(e,t){return typeof t.types==`function`?t.types(e,t):t.types.includes(typeof e)}var J=class{constructor(e){this.place=e}apply(e,t){throw`abstract method 'apply' called`}},Y=class extends J{constructor(e,t){super(e),this.content=t}apply(e,t){(e.parentNode||t).replaceChild(this.content,e)}},Xe=class extends J{constructor(e,t){super(e),this.text=t,this.name=e.attrName}apply(e){e.setAttribute(this.name,this.text)}},Ze=class extends J{constructor(e,t){super(e),this.fn=t}apply(e,t){let n=this.place.nodeLabel;return(e,t,...r)=>{let i=new Comment(` <<< ${n} `),a=new Comment(` >>> ${n} `),o=new DocumentFragment;o.replaceChildren(i,a),(e.parentNode||t).replaceChild(o,e),W((...e)=>{Qe(this.fn(...e),i,a)},...r)}}};function Qe(e,t,n){let r=t.parentNode;if(!r)throw Error(`No parent for placeholder`);let i=e=>{if(Array.isArray(e)){let t=new DocumentFragment,n=e.map(i);return t.replaceChildren(...n),t}else if(e instanceof Node)return e;else return new Text(e?.toString()||``)},a=i(e);console.log(`📸 Rendered for view:`,e,a);let o=t.nextSibling;for(;o&&o!==n;){let e=o;o=o.nextSibling,r.removeChild(e)}a&&r.insertBefore(a,n)}var $e=class extends J{constructor(e,t){super(e),this.fn=t,this.name=e.attrName}apply(e,t){return(e,t,...n)=>W((...t)=>{et(this.fn(...t),e,this.name)},...n)}};function et(e,t,n){let r=n.match(/^([.$])(.+)$/);if(r){let[n,i,a]=r;switch(i){case`.`:t[a]=e;break;case`$`:`viewModel`in t&&t.viewModel instanceof K&&t.viewModel.set(a,e);break}}else switch(typeof e){case`string`:t.setAttribute(n,e);break;case`undefined`:case`object`:case`boolean`:e?t.setAttribute(n,n):t.removeAttribute(n);break;default:t.setAttribute(n,e?.toString())}}var X=class extends J{constructor(e,t){super(e),this.fn=t}apply(e,t){return(e,t,...n)=>W((...t)=>{let n=this.fn(...t);typeof n==`function`&&n(e)},...n)}};new Je().use([{place:`element content`,types:[`string`,`number`,`bigint`,`symbol`,`boolean`],mutator:(e,t)=>new Y(e,new Text(t?.toString()||``))},{place:`attr value`,types:[`string`,`number`,`bigint`,`symbol`],mutator:(e,t)=>new Xe(e,t?.toString()||``)},{place:`element content`,types:e=>e instanceof Node,mutator:(e,t)=>new Y(e,t)},{place:`element content`,types:[`function`],mutator:(e,t)=>new Ze(e,t)},{place:`attr value`,types:[`function`],mutator:(e,t)=>new $e(e,t)},{place:`tag content`,types:[`function`],mutator:(e,t)=>new X(e,t)}]);var Z=class extends K{constructor(e,t){super(e,t)}get $(){return this.toObject()}with(e,...t){let n=Object.fromEntries(t.map(e=>[e,e]));return this.merge(new U(e,n))}withCalculated(e,t){return this.merge(new U(e,t))}withRenamed(e,t){return this.merge(new U(e,t))}merge(e){if(e){let t=e.start((e,n)=>{console.log(`🪄 Merging effect`,e,n,t),this.set(e,n)}).then(e=>{console.log(`👀 ViewModel source observed:`,e,t),Object.keys(e).forEach(t=>this.set(t,e[t]))})}return this}render(e){return e.render(this)}};function tt(e){return e===void 0?new Z({}):new Z(e)}var nt=n({CONTEXT_DEFAULT:()=>Q,Provider:()=>rt,Service:()=>$,dispatch:()=>it}),Q=`context:store`,$=class e extends Be{static{this.EVENT_TYPE=`store:message`}constructor(t,n){super((e,t)=>n(t,e),t,e.EVENT_TYPE)}},rt=class extends V{constructor(e,t){super(t,Q),this.viewModel=tt({authenticated:!1}).with(k(this),`authenticated`,`username`,`token`),this._updateFn=e}connectedCallback(){new $(this.context,(e,t)=>this._updateFn(e,t,this.viewModel.toObject())).attach(this)}};function it(e,t){console.log(`📨 Dispatching message:`,t,e),e.dispatchEvent(new j.Dispatch(t,$.EVENT_TYPE))}function at(e,t=Q){return new Ve(e,t)}Object.defineProperty(e,`Store`,{enumerable:!0,get:function(){return nt}}),e.fromStore=at});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.store={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.defineProperty,n=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},r=class extends Error{};r.prototype.name=`InvalidTokenError`;function i(e){return decodeURIComponent(atob(e).replace(/(.)/g,(e,t)=>{let n=t.charCodeAt(0).toString(16).toUpperCase();return n.length<2&&(n=`0`+n),`%`+n}))}function a(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`);switch(t.length%4){case 0:break;case 2:t+=`==`;break;case 3:t+=`=`;break;default:throw Error(`base64 string is not of the correct length`)}try{return i(t)}catch{return atob(t)}}function o(e,t){if(typeof e!=`string`)throw new r(`Invalid token specified: must be a string`);t||={};let n=t.header===!0?0:1,i=e.split(`.`)[n];if(typeof i!=`string`)throw new r(`Invalid token specified: missing part #${n+1}`);let o;try{o=a(i)}catch(e){throw new r(`Invalid token specified: invalid base64 for part #${n+1} (${e.message})`)}try{return JSON.parse(o)}catch(e){throw new r(`Invalid token specified: invalid json for part #${n+1} (${e.message})`)}}var s=Object.defineProperty,c=((e,t)=>{let n={};for(var r in e)s(n,r,{get:e[r],enumerable:!0});return t||s(n,Symbol.toStringTag,{value:`Module`}),n})({Dispatch:()=>u,None:()=>l,dispatch:()=>ee,dispatcher:()=>d}),l=[],u=class extends CustomEvent{constructor(e,t=`un:message`){super(t,{bubbles:!0,composed:!0,detail:e})}};function d(e=`un:message`){return(t,...n)=>t.dispatchEvent(new u(n,e))}var ee=d(),te=class extends CustomEvent{constructor(e,t){super(e,{bubbles:!0,cancelable:!0,composed:!0,detail:t})}};function f(e,...t){let n={execute(){console.log(`▶️ Executing created effect:`,t,e),e(...t.map(e=>e.open(n))),t.forEach(e=>e.close())}};n.execute()}var p=class e{constructor(){this.signals=new WeakMap,this.scheduled=new WeakSet}static{this.scheduler=new e}subscribe(e,t,n){let r=this.signals.get(e);r||(r=new Map,this.signals.set(e,r));let i=r.get(t);i||(i=new Set,r.set(t,i)),i.add(n)}scheduleEffects(e,t){let n=this.signals.get(e);if(!n)return;let r=n.get(t);if(r)for(let e of r)this.scheduled.has(e)||(this.scheduled.add(e),setTimeout(()=>{this.scheduled.delete(e),e.execute()}))}},ne=class{constructor(){this.running=[],this.eventType=`un-effect:change`}isRunning(){return this.running.length>0}push(e){this.running.push(e)}pop(){this.running.pop()}current(){let e=this.running.length;return e?this.running[e-1]:void 0}subscribe(e,t){let n=this.current();n&&p.scheduler.subscribe(t,e,n)}runEffects(e,t){if(console.log(`⚙️ Running effects for signal`,e,t),p.scheduler.scheduleEffects(t,e),this.host){let n=new te(this.eventType,{property:e,value:t[e]});this.host.dispatchEvent(n)}}setHost(e,t){this.host=e,t&&(this.eventType=t)}},m=class{static{this.CHANGE_EVENT_TYPE=`un-context:change`}constructor(e,t){t?(this.manager=t.manager,this.object=t.object,this.proxy=t.proxy,this.update(e)):(this.manager=new ne,this.object=e,this.proxy=re(this.object,this.manager))}get(e){return this.proxy[e]}set(e,t){this.proxy[e]=t}toObject(){return this.proxy}update(e){Object.assign(this.proxy,e)}apply(e){this.update(e(this.proxy))}createEffect(e){f(e,this)}setHost(e,t){this.manager.setHost(e,t)}open(e){return this.manager.push(e),this.proxy}close(){this.manager.pop()}};function re(e,t){return new Proxy(e,{get:(e,n,r)=>{let i=Reflect.get(e,n,r);return t.isRunning()&&h(i)&&t.subscribe(n,e),i},set:(e,n,r,i)=>{let a=Reflect.set(e,n,r,i);return a&&h(r)&&t.runEffects(n,e),a}})}function h(e){switch(typeof e){case`object`:case`number`:case`string`:case`symbol`:case`boolean`:case`undefined`:return!0;default:return!1}}var g=class{constructor(e,...t){this.effectFn=()=>e(...t)}execute(){this.effectFn()}};function _(e,t){return Object.assign(e,{render:t}),e}function v(e,t,...n){let r=e.cloneNode(!0);return Array.from(t.entries()).forEach(([e,t])=>{let i=r.querySelector(`[data-${e}]`);i&&t.forEach(e=>e(i,r,...n))}),r}var ie=class e{static{this.parser=new DOMParser}constructor(e){this.docType=`text/html`,this.plugins=[],e&&(this.docType=e)}use(e){this.plugins=this.plugins.concat(e)}parse(t,n){let r={},i=t.map((e,i)=>{if(i>=n.length)return[e];let a=n[i],o=this.classifyPlace(i,t),s=this.tryReplacements(o,a);if(s){let t=r[o.nodeLabel];switch(t?t.push(s):r[o.nodeLabel]=[s],o.kind){case`attr value`:return[e,`"" data-${o.nodeLabel}`];case`tag content`:return[e,`data-${o.nodeLabel}`];case`element content`:return[e,`<ins data-${o.nodeLabel}></ins>`]}}else throw console.error(`No match for template parameter`,o,a),`Failed to render template parameter ${i} around ${e}`;return[e]}).flat().join(``),a=e.parser.parseFromString(i,this.docType),o=a.head.childElementCount?a.head.children:a.body.children,s=new DocumentFragment;s.replaceChildren(...o);let c=new Map;for(let e in r){let t=s.querySelector(`[data-${e}]`);t&&r[e].forEach(n=>{let r=n.apply(t,s);if(r){let t=c.get(e);t?t.push(r):c.set(e,[r])}})}return _(s,(...e)=>v(s,c,...e))}static{this.OPEN_RE=/<([a-zA-z][$a-zA-Z0-9.-]*)\s+[^>]*$/}static{this.IN_TAG_RE=/^(\s+|[^<>]*|"[^"]*")*$/}static{this.ATTR_RE=/([$.]?[a-zA-Z][$a-zA-Z0-9.-]*)=\s*$/}static{this.CLOSE_RE=/[/]?>[^<]*$/}classifyPlace(t,n){let r=null;for(let i=t;i>=0&&!(n[i].match(e.CLOSE_RE)||(r=n[i].match(e.OPEN_RE),r)||!n[i].match(e.IN_TAG_RE));i--);if(r){let i=n[t].match(e.ATTR_RE);return i?{kind:`attr value`,nodeLabel:`node${t}`,tagName:r[1],attrName:i[1]}:{kind:`tag content`,nodeLabel:`node${t}`,tagName:r[1]}}return{kind:`element content`,nodeLabel:`node${t}`}}tryReplacements(e,t){let n=this.plugins;for(let r=0;r<n.length;r++){let i=n[r];if(e.kind===i.place&&ae(t,i))return i.mutator(e,t)}}};function ae(e,t){return typeof t.types==`function`?t.types(e,t):t.types.includes(typeof e)}var y=class{constructor(e){this.place=e}apply(e,t){throw`abstract method 'apply' called`}},b=class extends y{constructor(e,t){super(e),this.content=t}apply(e,t){(e.parentNode||t).replaceChild(this.content,e)}},oe=class extends y{constructor(e,t){super(e),this.text=t,this.name=e.attrName}apply(e){e.setAttribute(this.name,this.text)}},se=class extends y{constructor(e,t){super(e),this.fn=t}apply(e,t){let n=this.place.nodeLabel;return(e,t,...r)=>{let i=new Comment(` <<< ${n} `),a=new Comment(` >>> ${n} `),o=new DocumentFragment;o.replaceChildren(i,a),(e.parentNode||t).replaceChild(o,e),f((...e)=>{ce(this.fn(...e),i,a)},...r)}}};function ce(e,t,n){let r=t.parentNode;if(!r)throw Error(`No parent for placeholder`);let i=e=>{if(Array.isArray(e)){let t=new DocumentFragment,n=e.map(i);return t.replaceChildren(...n),t}else if(e instanceof Node)return e;else return new Text(e?.toString()||``)},a=i(e),o=t.nextSibling;for(;o&&o!==n;){let e=o;o=o.nextSibling,r.removeChild(e)}a&&r.insertBefore(a,n)}var le=class extends y{constructor(e,t){super(e),this.fn=t,this.name=e.attrName}apply(e,t){return(e,t,...n)=>f((...t)=>{ue(this.fn(...t),e,this.name)},...n)}};function ue(e,t,n){let r=n.match(/^([.$])(.+)$/);if(r){let[n,i,a]=r;switch(i){case`.`:t[a]=e;break;case`$`:`viewModel`in t&&t.viewModel instanceof m&&t.viewModel.set(a,e);break}}else switch(typeof e){case`string`:t.setAttribute(n,e);break;case`undefined`:case`object`:case`boolean`:e?t.setAttribute(n,n):t.removeAttribute(n);break;default:t.setAttribute(n,e?.toString())}}var de=class extends y{constructor(e,t){super(e),this.fn=t}apply(e,t){return(e,t,...n)=>f((...t)=>{let n=this.fn(...t);typeof n==`function`&&n(e)},...n)}};new ie().use([{place:`element content`,types:[`string`,`number`,`bigint`,`symbol`,`boolean`],mutator:(e,t)=>new b(e,new Text(t?.toString()||``))},{place:`attr value`,types:[`string`,`number`,`bigint`,`symbol`],mutator:(e,t)=>new oe(e,t?.toString()||``)},{place:`element content`,types:e=>e instanceof Node,mutator:(e,t)=>new b(e,t)},{place:`element content`,types:e=>Array.isArray(e),mutator:(e,t)=>{let n=new DocumentFragment,r=t.map(e=>e instanceof Node?e:new Text(e?.toString()||``));return n.append(...r),new b(e,n)}},{place:`element content`,types:[`function`],mutator:(e,t)=>new se(e,t)},{place:`attr value`,types:[`function`],mutator:(e,t)=>new le(e,t)},{place:`tag content`,types:[`function`],mutator:(e,t)=>new de(e,t)}]);var fe=class e extends HTMLElement{static{this.DISCOVERY_EVENT=`un-provider:discover`}static{this.REGISTRY_EVENT=`un-provider:register`}static{this.CHANGE_EVENT=`un-provider:change`}static{document.addEventListener(e.DISCOVERY_EVENT,e=>{let[t,n]=e.detail,r=he(t);r&&n(r)}),document.addEventListener(e.REGISTRY_EVENT,e=>{let[t,n]=e.detail;me(t,n)})}constructor(t,n){super(),this.contextLabel=n,this.context=new m(t),this.context.setHost(this,e.CHANGE_EVENT),this.addEventListener(e.DISCOVERY_EVENT,e=>{let[t,n]=e.detail;t===this.contextLabel&&(e.stopPropagation(),n(this))});let r=new CustomEvent(e.REGISTRY_EVENT,{bubbles:!0,composed:!0,detail:[this.contextLabel,this]});this.dispatchEvent(r)}attach(t){return this.addEventListener(e.CHANGE_EVENT,t),this.context.toObject()}detach(t){this.removeEventListener(e.CHANGE_EVENT,t)}};function pe(e,t){return new Promise((n,r)=>{let i=new CustomEvent(fe.DISCOVERY_EVENT,{bubbles:!0,composed:!0,detail:[t,e=>e?n(e):r()]});e.isConnected?e.dispatchEvent(i):document.dispatchEvent(i)})}var x={};function me(e,t){x[e]=t}function he(e){return x[e]}var ge=class{constructor(e){this.contextLabel=e}observe(e,t){return new Promise((n,r)=>{this.provider?n(this.attachObserver(t)):pe(e,this.contextLabel).then(e=>{this.provider=e,n(this.attachObserver(t))}).catch(e=>r(e))})}attachObserver(e){let t=this.provider.attach(t=>{let{property:n,value:r}=t.detail,i=new g(e,{property:n,value:r});console.log(`📡Signal received:`,n,r),i.execute()});return console.log(`👀 Initial observation:`,t),t}},_e=class{constructor(e,t,n=`service:message`,r=!0){this._pending=[],this._context=t,this._update=e,this._eventType=n,this._running=r}attach(e){e.addEventListener(this._eventType,e=>{e.stopPropagation();let t=e.detail;this.consume(t)})}start(){this._running||(console.log(`Starting ${this._eventType} service`),this._running=!0,this._pending.forEach(e=>this.process(e)))}consume(e){if(e.length!==0){let t=e;this._running?this.process(t):(console.log(`📥 Queueing ${this._eventType} message`,e),this._pending.push(t))}}process(e){console.log(`📤 Processing ${this._eventType} message`,e);let t=this._update(e,this._context.toObject());if(console.log(`⏭️ next state: `,t),!Array.isArray(t))this._context.update(t);else{let[e,...n]=t;n.forEach(e=>e.then(e=>this.consume(e))),this._context.update(e)}}};function ve(e,t){return new ye(e,t)}var ye=class{constructor(e,t){this.client=e,this.observer=new ge(t)}start(e){return this.observer.observe(this.client,t=>{e(t.property,t.value)})}},be=`context:auth`,S=class e{static{this.TOKEN_KEY=`un-auth:token`}constructor(e){this.authenticated=!1,this.username=e||`anonymous`}static deauthenticate(t){return t.authenticated=!1,t.username=`anonymous`,localStorage.removeItem(e.TOKEN_KEY),t}},C=class e extends S{constructor(e){super();let t=o(e);console.log(`Token payload`,t),this.token=e,this.authenticated=!0,this.username=t.username}static authenticate(t){let n=new e(t);return localStorage.setItem(S.TOKEN_KEY,t),n}static authenticateFromLocalStorage(){let t=localStorage.getItem(S.TOKEN_KEY);return t?e.authenticate(t):new S}},w=class e extends _e{static{this.EVENT_TYPE=`auth:message`}constructor(t,n){super((e,t)=>this.update(e,t),t,e.EVENT_TYPE),this._redirectForLogin=n}update(e,t){switch(console.log(`Auth update`,e),e[0]){case`auth/signin`:let{token:n,redirect:r}=e[1];return[D(n),T(r)];case`auth/signout`:return[O(t),T(this._redirectForLogin)];case`auth/redirect`:E(this._redirectForLogin,{next:window.location.href});break;default:let i=e[0];throw Error(`Unhandled Auth message "${i}"`)}return t}};c.dispatcher(w.EVENT_TYPE);function T(e,t={}){return new Promise(n=>{E(e,t),n(c.None)})}function E(e,t={}){if(e){let n=window.location.href,r=new URL(e,n);Object.entries(t).forEach(([e,t])=>r.searchParams.set(e,t)),console.log(`Auth redirecting to `,e),window.history.pushState({},``,e),window.history.go()}}function D(e){let{authenticated:t,username:n}=C.authenticate(e);return{authenticated:t,username:n,token:e}}function O(e){let{authenticated:t,username:n}=S.deauthenticate(new S(e.username));return{username:n,authenticated:t,token:void 0}}function k(e,t=be){return ve(e,t)}var A=Object.defineProperty,j=((e,t)=>{let n={};for(var r in e)A(n,r,{get:e[r],enumerable:!0});return t||A(n,Symbol.toStringTag,{value:`Module`}),n})({Dispatch:()=>N,None:()=>M,dispatch:()=>xe,dispatcher:()=>P}),M=[],N=class extends CustomEvent{constructor(e,t=`un:message`){super(t,{bubbles:!0,composed:!0,detail:e})}};function P(e=`un:message`){return(t,...n)=>t.dispatchEvent(new N(n,e))}var xe=P(),Se=class extends CustomEvent{constructor(e,t){super(e,{bubbles:!0,cancelable:!0,composed:!0,detail:t})}};function F(e,...t){let n={execute(){console.log(`▶️ Executing created effect:`,t,e),e(...t.map(e=>e.open(n))),t.forEach(e=>e.close())}};n.execute()}var I=class e{constructor(){this.signals=new WeakMap,this.scheduled=new WeakSet}static{this.scheduler=new e}subscribe(e,t,n){let r=this.signals.get(e);r||(r=new Map,this.signals.set(e,r));let i=r.get(t);i||(i=new Set,r.set(t,i)),i.add(n)}scheduleEffects(e,t){let n=this.signals.get(e);if(!n)return;let r=n.get(t);if(r)for(let e of r)this.scheduled.has(e)||(this.scheduled.add(e),setTimeout(()=>{this.scheduled.delete(e),e.execute()}))}},Ce=class{constructor(){this.running=[],this.eventType=`un-effect:change`}isRunning(){return this.running.length>0}push(e){this.running.push(e)}pop(){this.running.pop()}current(){let e=this.running.length;return e?this.running[e-1]:void 0}subscribe(e,t){let n=this.current();n&&I.scheduler.subscribe(t,e,n)}runEffects(e,t){if(console.log(`⚙️ Running effects for signal`,e,t),I.scheduler.scheduleEffects(t,e),this.host){let n=new Se(this.eventType,{property:e,value:t[e]});this.host.dispatchEvent(n)}}setHost(e,t){this.host=e,t&&(this.eventType=t)}},L=class{static{this.CHANGE_EVENT_TYPE=`un-context:change`}constructor(e,t){t?(this.manager=t.manager,this.object=t.object,this.proxy=t.proxy,this.update(e)):(this.manager=new Ce,this.object=e,this.proxy=we(this.object,this.manager))}get(e){return this.proxy[e]}set(e,t){this.proxy[e]=t}toObject(){return this.proxy}update(e){Object.assign(this.proxy,e)}apply(e){this.update(e(this.proxy))}createEffect(e){F(e,this)}setHost(e,t){this.manager.setHost(e,t)}open(e){return this.manager.push(e),this.proxy}close(){this.manager.pop()}};function we(e,t){return new Proxy(e,{get:(e,n,r)=>{let i=Reflect.get(e,n,r);return t.isRunning()&&R(i)&&t.subscribe(n,e),i},set:(e,n,r,i)=>{let a=Reflect.set(e,n,r,i);return a&&R(r)&&t.runEffects(n,e),a}})}function R(e){switch(typeof e){case`object`:case`number`:case`string`:case`symbol`:case`boolean`:case`undefined`:return!0;default:return!1}}var Te=class{constructor(e,...t){this.effectFn=()=>e(...t)}execute(){this.effectFn()}};function Ee(e,t){return Object.assign(e,{render:t}),e}function De(e,t,...n){let r=e.cloneNode(!0);return Array.from(t.entries()).forEach(([e,t])=>{let i=r.querySelector(`[data-${e}]`);i&&t.forEach(e=>e(i,r,...n))}),r}var Oe=class e{static{this.parser=new DOMParser}constructor(e){this.docType=`text/html`,this.plugins=[],e&&(this.docType=e)}use(e){this.plugins=this.plugins.concat(e)}parse(t,n){let r={},i=t.map((e,i)=>{if(i>=n.length)return[e];let a=n[i],o=this.classifyPlace(i,t),s=this.tryReplacements(o,a);if(s){let t=r[o.nodeLabel];switch(t?t.push(s):r[o.nodeLabel]=[s],o.kind){case`attr value`:return[e,`"" data-${o.nodeLabel}`];case`tag content`:return[e,`data-${o.nodeLabel}`];case`element content`:return[e,`<ins data-${o.nodeLabel}></ins>`]}}else throw console.error(`No match for template parameter`,o,a),`Failed to render template parameter ${i} around ${e}`;return[e]}).flat().join(``),a=e.parser.parseFromString(i,this.docType),o=a.head.childElementCount?a.head.children:a.body.children,s=new DocumentFragment;s.replaceChildren(...o);let c=new Map;for(let e in r){let t=s.querySelector(`[data-${e}]`);t&&r[e].forEach(n=>{let r=n.apply(t,s);if(r){let t=c.get(e);t?t.push(r):c.set(e,[r])}})}return Ee(s,(...e)=>De(s,c,...e))}static{this.OPEN_RE=/<([a-zA-z][$a-zA-Z0-9.-]*)\s+[^>]*$/}static{this.IN_TAG_RE=/^(\s+|[^<>]*|"[^"]*")*$/}static{this.ATTR_RE=/([$.]?[a-zA-Z][$a-zA-Z0-9.-]*)=\s*$/}static{this.CLOSE_RE=/[/]?>[^<]*$/}classifyPlace(t,n){let r=null;for(let i=t;i>=0&&!(n[i].match(e.CLOSE_RE)||(r=n[i].match(e.OPEN_RE),r)||!n[i].match(e.IN_TAG_RE));i--);if(r){let i=n[t].match(e.ATTR_RE);return i?{kind:`attr value`,nodeLabel:`node${t}`,tagName:r[1],attrName:i[1]}:{kind:`tag content`,nodeLabel:`node${t}`,tagName:r[1]}}return{kind:`element content`,nodeLabel:`node${t}`}}tryReplacements(e,t){let n=this.plugins;for(let r=0;r<n.length;r++){let i=n[r];if(e.kind===i.place&&ke(t,i))return i.mutator(e,t)}}};function ke(e,t){return typeof t.types==`function`?t.types(e,t):t.types.includes(typeof e)}var z=class{constructor(e){this.place=e}apply(e,t){throw`abstract method 'apply' called`}},B=class extends z{constructor(e,t){super(e),this.content=t}apply(e,t){(e.parentNode||t).replaceChild(this.content,e)}},Ae=class extends z{constructor(e,t){super(e),this.text=t,this.name=e.attrName}apply(e){e.setAttribute(this.name,this.text)}},je=class extends z{constructor(e,t){super(e),this.fn=t}apply(e,t){let n=this.place.nodeLabel;return(e,t,...r)=>{let i=new Comment(` <<< ${n} `),a=new Comment(` >>> ${n} `),o=new DocumentFragment;o.replaceChildren(i,a),(e.parentNode||t).replaceChild(o,e),F((...e)=>{Me(this.fn(...e),i,a)},...r)}}};function Me(e,t,n){let r=t.parentNode;if(!r)throw Error(`No parent for placeholder`);let i=e=>{if(Array.isArray(e)){let t=new DocumentFragment,n=e.map(i);return t.replaceChildren(...n),t}else if(e instanceof Node)return e;else return new Text(e?.toString()||``)},a=i(e),o=t.nextSibling;for(;o&&o!==n;){let e=o;o=o.nextSibling,r.removeChild(e)}a&&r.insertBefore(a,n)}var Ne=class extends z{constructor(e,t){super(e),this.fn=t,this.name=e.attrName}apply(e,t){return(e,t,...n)=>F((...t)=>{Pe(this.fn(...t),e,this.name)},...n)}};function Pe(e,t,n){let r=n.match(/^([.$])(.+)$/);if(r){let[n,i,a]=r;switch(i){case`.`:t[a]=e;break;case`$`:`viewModel`in t&&t.viewModel instanceof L&&t.viewModel.set(a,e);break}}else switch(typeof e){case`string`:t.setAttribute(n,e);break;case`undefined`:case`object`:case`boolean`:e?t.setAttribute(n,n):t.removeAttribute(n);break;default:t.setAttribute(n,e?.toString())}}var Fe=class extends z{constructor(e,t){super(e),this.fn=t}apply(e,t){return(e,t,...n)=>F((...t)=>{let n=this.fn(...t);typeof n==`function`&&n(e)},...n)}};new Oe().use([{place:`element content`,types:[`string`,`number`,`bigint`,`symbol`,`boolean`],mutator:(e,t)=>new B(e,new Text(t?.toString()||``))},{place:`attr value`,types:[`string`,`number`,`bigint`,`symbol`],mutator:(e,t)=>new Ae(e,t?.toString()||``)},{place:`element content`,types:e=>e instanceof Node,mutator:(e,t)=>new B(e,t)},{place:`element content`,types:e=>Array.isArray(e),mutator:(e,t)=>{let n=new DocumentFragment,r=t.map(e=>e instanceof Node?e:new Text(e?.toString()||``));return n.append(...r),new B(e,n)}},{place:`element content`,types:[`function`],mutator:(e,t)=>new je(e,t)},{place:`attr value`,types:[`function`],mutator:(e,t)=>new Ne(e,t)},{place:`tag content`,types:[`function`],mutator:(e,t)=>new Fe(e,t)}]);var V=class e extends HTMLElement{static{this.DISCOVERY_EVENT=`un-provider:discover`}static{this.REGISTRY_EVENT=`un-provider:register`}static{this.CHANGE_EVENT=`un-provider:change`}static{document.addEventListener(e.DISCOVERY_EVENT,e=>{let[t,n]=e.detail,r=Re(t);r&&n(r)}),document.addEventListener(e.REGISTRY_EVENT,e=>{let[t,n]=e.detail;Le(t,n)})}constructor(t,n){super(),this.contextLabel=n,this.context=new L(t),this.context.setHost(this,e.CHANGE_EVENT),this.addEventListener(e.DISCOVERY_EVENT,e=>{let[t,n]=e.detail;t===this.contextLabel&&(e.stopPropagation(),n(this))});let r=new CustomEvent(e.REGISTRY_EVENT,{bubbles:!0,composed:!0,detail:[this.contextLabel,this]});this.dispatchEvent(r)}attach(t){return this.addEventListener(e.CHANGE_EVENT,t),this.context.toObject()}detach(t){this.removeEventListener(e.CHANGE_EVENT,t)}};function Ie(e,t){return new Promise((n,r)=>{let i=new CustomEvent(V.DISCOVERY_EVENT,{bubbles:!0,composed:!0,detail:[t,e=>e?n(e):r()]});e.isConnected?e.dispatchEvent(i):document.dispatchEvent(i)})}var H={};function Le(e,t){H[e]=t}function Re(e){return H[e]}var ze=class{constructor(e){this.contextLabel=e}observe(e,t){return new Promise((n,r)=>{this.provider?n(this.attachObserver(t)):Ie(e,this.contextLabel).then(e=>{this.provider=e,n(this.attachObserver(t))}).catch(e=>r(e))})}attachObserver(e){let t=this.provider.attach(t=>{let{property:n,value:r}=t.detail,i=new Te(e,{property:n,value:r});console.log(`📡Signal received:`,n,r),i.execute()});return console.log(`👀 Initial observation:`,t),t}},Be=class{constructor(e,t,n=`service:message`,r=!0){this._pending=[],this._context=t,this._update=e,this._eventType=n,this._running=r}attach(e){e.addEventListener(this._eventType,e=>{e.stopPropagation();let t=e.detail;this.consume(t)})}start(){this._running||(console.log(`Starting ${this._eventType} service`),this._running=!0,this._pending.forEach(e=>this.process(e)))}consume(e){if(e.length!==0){let t=e;this._running?this.process(t):(console.log(`📥 Queueing ${this._eventType} message`,e),this._pending.push(t))}}process(e){console.log(`📤 Processing ${this._eventType} message`,e);let t=this._update(e,this._context.toObject());if(console.log(`⏭️ next state: `,t),!Array.isArray(t))this._context.update(t);else{let[e,...n]=t;n.forEach(e=>e.then(e=>this.consume(e))),this._context.update(e)}}};function Ve(e,t){return new He(e,t)}var He=class{constructor(e,t){this.client=e,this.observer=new ze(t)}start(e){return this.observer.observe(this.client,t=>{e(t.property,t.value)})}},U=class{constructor(e,t){this.initialized=!1,this.origin=e;let n=Ue(t).map(([e,t])=>[t,e]);this.inverse=Object.fromEntries(n)}mapObservation(e){let t=Object.entries(e).map(([e,t])=>{let n=this.inverse[e];return n?[n,t]:[]});return Object.fromEntries(t.filter(e=>e.length>0))}start(e){return this.origin.start((t,n)=>{let r=this.inverse[t];e(r,n),this.initialized=!0}).then(e=>this.initialized?{}:this.mapObservation(e))}};function Ue(e){return Object.entries(e).map(([e,t])=>[e,t])}var We=class extends CustomEvent{constructor(e,t){super(e,{bubbles:!0,cancelable:!0,composed:!0,detail:t})}};function W(e,...t){let n={execute(){console.log(`▶️ Executing created effect:`,t,e),e(...t.map(e=>e.open(n))),t.forEach(e=>e.close())}};n.execute()}var G=class e{constructor(){this.signals=new WeakMap,this.scheduled=new WeakSet}static{this.scheduler=new e}subscribe(e,t,n){let r=this.signals.get(e);r||(r=new Map,this.signals.set(e,r));let i=r.get(t);i||(i=new Set,r.set(t,i)),i.add(n)}scheduleEffects(e,t){let n=this.signals.get(e);if(!n)return;let r=n.get(t);if(r)for(let e of r)this.scheduled.has(e)||(this.scheduled.add(e),setTimeout(()=>{this.scheduled.delete(e),e.execute()}))}},Ge=class{constructor(){this.running=[],this.eventType=`un-effect:change`}isRunning(){return this.running.length>0}push(e){this.running.push(e)}pop(){this.running.pop()}current(){let e=this.running.length;return e?this.running[e-1]:void 0}subscribe(e,t){let n=this.current();n&&G.scheduler.subscribe(t,e,n)}runEffects(e,t){if(console.log(`⚙️ Running effects for signal`,e,t),G.scheduler.scheduleEffects(t,e),this.host){let n=new We(this.eventType,{property:e,value:t[e]});this.host.dispatchEvent(n)}}setHost(e,t){this.host=e,t&&(this.eventType=t)}},K=class{static{this.CHANGE_EVENT_TYPE=`un-context:change`}constructor(e,t){t?(this.manager=t.manager,this.object=t.object,this.proxy=t.proxy,this.update(e)):(this.manager=new Ge,this.object=e,this.proxy=Ke(this.object,this.manager))}get(e){return this.proxy[e]}set(e,t){this.proxy[e]=t}toObject(){return this.proxy}update(e){Object.assign(this.proxy,e)}apply(e){this.update(e(this.proxy))}createEffect(e){W(e,this)}setHost(e,t){this.manager.setHost(e,t)}open(e){return this.manager.push(e),this.proxy}close(){this.manager.pop()}};function Ke(e,t){return new Proxy(e,{get:(e,n,r)=>{let i=Reflect.get(e,n,r);return t.isRunning()&&q(i)&&t.subscribe(n,e),i},set:(e,n,r,i)=>{let a=Reflect.set(e,n,r,i);return a&&q(r)&&t.runEffects(n,e),a}})}function q(e){switch(typeof e){case`object`:case`number`:case`string`:case`symbol`:case`boolean`:case`undefined`:return!0;default:return!1}}function qe(e,t){return Object.assign(e,{render:t}),e}function Je(e,t,...n){let r=e.cloneNode(!0);return Array.from(t.entries()).forEach(([e,t])=>{let i=r.querySelector(`[data-${e}]`);i&&t.forEach(e=>e(i,r,...n))}),r}var Ye=class e{static{this.parser=new DOMParser}constructor(e){this.docType=`text/html`,this.plugins=[],e&&(this.docType=e)}use(e){this.plugins=this.plugins.concat(e)}parse(t,n){let r={},i=t.map((e,i)=>{if(i>=n.length)return[e];let a=n[i],o=this.classifyPlace(i,t),s=this.tryReplacements(o,a);if(s){let t=r[o.nodeLabel];switch(t?t.push(s):r[o.nodeLabel]=[s],o.kind){case`attr value`:return[e,`"" data-${o.nodeLabel}`];case`tag content`:return[e,`data-${o.nodeLabel}`];case`element content`:return[e,`<ins data-${o.nodeLabel}></ins>`]}}else throw console.error(`No match for template parameter`,o,a),`Failed to render template parameter ${i} around ${e}`;return[e]}).flat().join(``),a=e.parser.parseFromString(i,this.docType),o=a.head.childElementCount?a.head.children:a.body.children,s=new DocumentFragment;s.replaceChildren(...o);let c=new Map;for(let e in r){let t=s.querySelector(`[data-${e}]`);t&&r[e].forEach(n=>{let r=n.apply(t,s);if(r){let t=c.get(e);t?t.push(r):c.set(e,[r])}})}return qe(s,(...e)=>Je(s,c,...e))}static{this.OPEN_RE=/<([a-zA-z][$a-zA-Z0-9.-]*)\s+[^>]*$/}static{this.IN_TAG_RE=/^(\s+|[^<>]*|"[^"]*")*$/}static{this.ATTR_RE=/([$.]?[a-zA-Z][$a-zA-Z0-9.-]*)=\s*$/}static{this.CLOSE_RE=/[/]?>[^<]*$/}classifyPlace(t,n){let r=null;for(let i=t;i>=0&&!(n[i].match(e.CLOSE_RE)||(r=n[i].match(e.OPEN_RE),r)||!n[i].match(e.IN_TAG_RE));i--);if(r){let i=n[t].match(e.ATTR_RE);return i?{kind:`attr value`,nodeLabel:`node${t}`,tagName:r[1],attrName:i[1]}:{kind:`tag content`,nodeLabel:`node${t}`,tagName:r[1]}}return{kind:`element content`,nodeLabel:`node${t}`}}tryReplacements(e,t){let n=this.plugins;for(let r=0;r<n.length;r++){let i=n[r];if(e.kind===i.place&&Xe(t,i))return i.mutator(e,t)}}};function Xe(e,t){return typeof t.types==`function`?t.types(e,t):t.types.includes(typeof e)}var J=class{constructor(e){this.place=e}apply(e,t){throw`abstract method 'apply' called`}},Y=class extends J{constructor(e,t){super(e),this.content=t}apply(e,t){(e.parentNode||t).replaceChild(this.content,e)}},Ze=class extends J{constructor(e,t){super(e),this.text=t,this.name=e.attrName}apply(e){e.setAttribute(this.name,this.text)}},X=class extends J{constructor(e,t){super(e),this.fn=t}apply(e,t){let n=this.place.nodeLabel;return(e,t,...r)=>{let i=new Comment(` <<< ${n} `),a=new Comment(` >>> ${n} `),o=new DocumentFragment;o.replaceChildren(i,a),(e.parentNode||t).replaceChild(o,e),W((...e)=>{Qe(this.fn(...e),i,a)},...r)}}};function Qe(e,t,n){let r=t.parentNode;if(!r)throw Error(`No parent for placeholder`);let i=e=>{if(Array.isArray(e)){let t=new DocumentFragment,n=e.map(i);return t.replaceChildren(...n),t}else if(e instanceof Node)return e;else return new Text(e?.toString()||``)},a=i(e),o=t.nextSibling;for(;o&&o!==n;){let e=o;o=o.nextSibling,r.removeChild(e)}a&&r.insertBefore(a,n)}var $e=class extends J{constructor(e,t){super(e),this.fn=t,this.name=e.attrName}apply(e,t){return(e,t,...n)=>W((...t)=>{et(this.fn(...t),e,this.name)},...n)}};function et(e,t,n){let r=n.match(/^([.$])(.+)$/);if(r){let[n,i,a]=r;switch(i){case`.`:t[a]=e;break;case`$`:`viewModel`in t&&t.viewModel instanceof K&&t.viewModel.set(a,e);break}}else switch(typeof e){case`string`:t.setAttribute(n,e);break;case`undefined`:case`object`:case`boolean`:e?t.setAttribute(n,n):t.removeAttribute(n);break;default:t.setAttribute(n,e?.toString())}}var tt=class extends J{constructor(e,t){super(e),this.fn=t}apply(e,t){return(e,t,...n)=>W((...t)=>{let n=this.fn(...t);typeof n==`function`&&n(e)},...n)}};new Ye().use([{place:`element content`,types:[`string`,`number`,`bigint`,`symbol`,`boolean`],mutator:(e,t)=>new Y(e,new Text(t?.toString()||``))},{place:`attr value`,types:[`string`,`number`,`bigint`,`symbol`],mutator:(e,t)=>new Ze(e,t?.toString()||``)},{place:`element content`,types:e=>e instanceof Node,mutator:(e,t)=>new Y(e,t)},{place:`element content`,types:e=>Array.isArray(e),mutator:(e,t)=>{let n=new DocumentFragment,r=t.map(e=>e instanceof Node?e:new Text(e?.toString()||``));return n.append(...r),new Y(e,n)}},{place:`element content`,types:[`function`],mutator:(e,t)=>new X(e,t)},{place:`attr value`,types:[`function`],mutator:(e,t)=>new $e(e,t)},{place:`tag content`,types:[`function`],mutator:(e,t)=>new tt(e,t)}]);var Z=class extends K{constructor(e,t){super(e,t)}get $(){return this.toObject()}with(e,...t){let n=Object.fromEntries(t.map(e=>[e,e]));return this.merge(new U(e,n))}withCalculated(e,t){return this.merge(new U(e,t))}withRenamed(e,t){return this.merge(new U(e,t))}merge(e){if(e){let t=new Map;e.start((e,n)=>{this.set(e,n),t.set(e,!0)}).then(e=>{Object.keys(e).filter(e=>!t.get(e)).forEach(t=>{this.set(t,e[t])})})}return this}render(e){return e.render(this)}};function nt(e){return e===void 0?new Z({}):new Z(e)}var rt=n({CONTEXT_DEFAULT:()=>Q,Provider:()=>it,Service:()=>$,dispatch:()=>at}),Q=`context:store`,$=class e extends Be{static{this.EVENT_TYPE=`store:message`}constructor(t,n){super((e,t)=>n(t,e),t,e.EVENT_TYPE)}},it=class extends V{constructor(e,t){super(t,Q),this.viewModel=nt({authenticated:!1}).with(k(this),`authenticated`,`username`,`token`),this._updateFn=e}connectedCallback(){new $(this.context,(e,t)=>this._updateFn(e,t,this.viewModel.toObject())).attach(this)}};function at(e,t){console.log(`📨 Dispatching message:`,t,e),e.dispatchEvent(new j.Dispatch(t,$.EVENT_TYPE))}function ot(e,t=Q){return Ve(e,t)}Object.defineProperty(e,`Store`,{enumerable:!0,get:function(){return rt}}),e.fromStore=ot});
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@unbndl/store",
3
- "version": "1.0.1",
3
+ "version": "1.0.7",
4
4
  "description": "Unbundled library for maintaining client-side state in a store, following the Elm architecture and MVU",
5
5
  "main": "./dist/store.js",
6
6
  "type": "module",
7
+ "types": "./dist/store.d.ts",
7
8
  "scripts": {
8
9
  "build": "npx vite build",
9
10
  "test": "echo \"Error: no test specified\" && exit 1"
@@ -19,5 +20,11 @@
19
20
  "The Elm Architecture (TEA)"
20
21
  ],
21
22
  "author": "ken@mnmlst.me",
22
- "license": "BSD-3-Clause"
23
+ "license": "BSD-3-Clause",
24
+ "dependencies": {
25
+ "route-parser": "^0.0.5"
26
+ },
27
+ "devDependencies": {
28
+ "@types/route-parser": "^0.1.7"
29
+ }
23
30
  }
package/src/fromStore.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { FromService } from "@unbndl/service";
1
+ import { fromService } from "@unbndl/service";
2
2
  import * as Store from "./store.ts";
3
3
 
4
4
  export function fromStore<M extends object>(
5
5
  target: HTMLElement,
6
6
  contextLabel: string = Store.CONTEXT_DEFAULT
7
7
  ) {
8
- return new FromService<M>(target, contextLabel);
8
+ return fromService<M>(target, contextLabel);
9
9
  }
package/vite.config.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import { defineConfig } from "vite";
2
2
  import { resolve } from "path";
3
+ import dts from "vite-plugin-dts";
4
+
3
5
 
4
6
  export default defineConfig({
5
7
  build: {
@@ -7,5 +9,12 @@ export default defineConfig({
7
9
  entry: resolve(__dirname, "src/index.ts"),
8
10
  name: "store"
9
11
  }
10
- }
12
+ },
13
+ plugins: [
14
+ dts({
15
+ insertTypesEntry: true,
16
+ rollupTypes: true
17
+ })
18
+ ]
19
+
11
20
  });