atmx-web 0.125.0 → 0.126.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/atmx.es.js +107 -61
- package/dist/atmx.umd.js +2 -2
- package/dist/core/query.d.ts +26 -1
- package/dist/index.d.ts +8 -1
- package/package.json +1 -1
package/dist/atmx.es.js
CHANGED
|
@@ -146,7 +146,7 @@ function m(e) {
|
|
|
146
146
|
}
|
|
147
147
|
function h(e) {
|
|
148
148
|
if (e.wasmUrl) return e.wasmUrl;
|
|
149
|
-
let t = `https://atmx.axiomcore.dev/${e.engineVersion || "v0.
|
|
149
|
+
let t = `https://atmx.axiomcore.dev/${e.engineVersion || "v0.126.0"}/axiom_runtime.wasm`;
|
|
150
150
|
return e.disableCacheBuster || (t += `?t=${Date.now()}`), t;
|
|
151
151
|
}
|
|
152
152
|
async function g(e) {
|
|
@@ -162,7 +162,7 @@ async function g(e) {
|
|
|
162
162
|
}
|
|
163
163
|
let t = window.wasm_bindgen, a = h(e);
|
|
164
164
|
try {
|
|
165
|
-
u = await t(fetch(a));
|
|
165
|
+
u = await t({ module_or_path: fetch(a) });
|
|
166
166
|
} catch (e) {
|
|
167
167
|
throw {
|
|
168
168
|
stage: "ffiBoundary",
|
|
@@ -391,7 +391,7 @@ var j = 0, M = class {
|
|
|
391
391
|
};
|
|
392
392
|
}
|
|
393
393
|
subscribe(e) {
|
|
394
|
-
this.listeners.add(e), e(this.state);
|
|
394
|
+
return this.listeners.add(e), e(this.state), () => this.listeners.delete(e);
|
|
395
395
|
}
|
|
396
396
|
update(e) {
|
|
397
397
|
if (this.state = {
|
|
@@ -443,7 +443,41 @@ var j = 0, M = class {
|
|
|
443
443
|
u.axiom_wasm_call(r, c.ptr, c.len, this.route.id, l.ptr, l.len, d.ptr, d.len, h.ptr, h.len, g.ptr, g.len, f, s.length), u.axiom_free_memory(c.ptr, c.len), u.axiom_free_memory(l.ptr, l.len), u.axiom_free_memory(d.ptr, d.len), u.axiom_free_memory(h.ptr, h.len), u.axiom_free_memory(g.ptr, g.len);
|
|
444
444
|
}
|
|
445
445
|
}, N = /* @__PURE__ */ new Map();
|
|
446
|
-
function P(
|
|
446
|
+
function P(e, t = {}) {
|
|
447
|
+
return `${e}:${JSON.stringify(t)}`;
|
|
448
|
+
}
|
|
449
|
+
function F(e, t = {}) {
|
|
450
|
+
let n = P(e, t), r = N.get(n);
|
|
451
|
+
if (r?.state.data !== null && r?.state.data !== void 0) return r.state.data;
|
|
452
|
+
try {
|
|
453
|
+
let e = sessionStorage.getItem(`atmx_cache_${n}`);
|
|
454
|
+
return e ? JSON.parse(e) : null;
|
|
455
|
+
} catch {
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
function I(e, t = {}) {
|
|
460
|
+
let n = a(e);
|
|
461
|
+
if (!n) throw Error(`ATMX Route not found: ${e}`);
|
|
462
|
+
let r = P(e, t), i = N.get(r);
|
|
463
|
+
i || (i = new M(r, n, t), N.set(r, i));
|
|
464
|
+
let o = !1, s = /* @__PURE__ */ new Set(), c = i.subscribe((e) => {
|
|
465
|
+
o || s.forEach((t) => t(e));
|
|
466
|
+
});
|
|
467
|
+
return i.fetch(), {
|
|
468
|
+
getSnapshot: () => ({ ...i.state }),
|
|
469
|
+
subscribe(e) {
|
|
470
|
+
return o ? () => {} : (s.add(e), e(i.state), () => s.delete(e));
|
|
471
|
+
},
|
|
472
|
+
refresh() {
|
|
473
|
+
o || i.fetch(!0);
|
|
474
|
+
},
|
|
475
|
+
dispose() {
|
|
476
|
+
o || (o = !0, s.clear(), c());
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
function L(n, r = {}, i = {}, s = {}) {
|
|
447
481
|
return new Promise((c, l) => {
|
|
448
482
|
let d = a(n);
|
|
449
483
|
if (!d) return l(/* @__PURE__ */ Error(`ATMX Route not found: ${n}`));
|
|
@@ -471,7 +505,7 @@ function P(n, r = {}, i = {}, s = {}) {
|
|
|
471
505
|
u.axiom_wasm_call(f, x.ptr, x.len, d.id, S.ptr, S.len, C.ptr, C.len, w.ptr, w.len, T.ptr, T.len, E, _.length), u.axiom_free_memory(x.ptr, x.len), u.axiom_free_memory(S.ptr, S.len), u.axiom_free_memory(C.ptr, C.len), u.axiom_free_memory(w.ptr, w.len), u.axiom_free_memory(T.ptr, T.len), E && u.axiom_free_memory(E, _.length);
|
|
472
506
|
});
|
|
473
507
|
}
|
|
474
|
-
function
|
|
508
|
+
function R(e, t) {
|
|
475
509
|
let [n, r] = e.split("."), i = `atmx_cache_${e}`;
|
|
476
510
|
t && Object.keys(t).length > 0 && (i += `:${JSON.stringify(t)}`), Object.keys(sessionStorage).forEach((e) => {
|
|
477
511
|
(e === i || !t && e.startsWith(i + ":")) && sessionStorage.removeItem(e);
|
|
@@ -479,8 +513,8 @@ function F(e, t) {
|
|
|
479
513
|
e.route.namespace === n && e.route.name === r && (!t || Object.keys(t).length === 0 || JSON.stringify(e.args) === JSON.stringify(t)) && e.fetch(!0);
|
|
480
514
|
});
|
|
481
515
|
}
|
|
482
|
-
function
|
|
483
|
-
let r =
|
|
516
|
+
function z(e, t = {}, n) {
|
|
517
|
+
let r = P(e, t);
|
|
484
518
|
try {
|
|
485
519
|
sessionStorage.setItem(`atmx_cache_${r}`, JSON.stringify(n));
|
|
486
520
|
} catch {}
|
|
@@ -493,27 +527,33 @@ function I(e, t = {}, n) {
|
|
|
493
527
|
error: null
|
|
494
528
|
});
|
|
495
529
|
}
|
|
496
|
-
function
|
|
530
|
+
function B(e, t = !0) {
|
|
497
531
|
let n = e ? `atmx_cache_${e}.` : "atmx_cache_";
|
|
498
532
|
Object.keys(sessionStorage).forEach((e) => {
|
|
499
533
|
e.startsWith(n) && sessionStorage.removeItem(e);
|
|
500
|
-
}),
|
|
501
|
-
(!e ||
|
|
534
|
+
}), N.forEach((n) => {
|
|
535
|
+
(!e || n.route.namespace === e) && (n.update({
|
|
536
|
+
state: "idle",
|
|
537
|
+
source: null,
|
|
538
|
+
data: null,
|
|
539
|
+
error: null,
|
|
540
|
+
isFetching: !1
|
|
541
|
+
}), t && n.fetch(!0));
|
|
502
542
|
});
|
|
503
543
|
}
|
|
504
544
|
//#endregion
|
|
505
545
|
//#region src/dom/lifecycle.ts
|
|
506
|
-
var
|
|
507
|
-
function
|
|
546
|
+
var V = 0;
|
|
547
|
+
function H(e, t) {
|
|
508
548
|
let n = `ax-on:${t}`;
|
|
509
549
|
e.hasAttribute(n) && C(e.getAttribute(n), O(e));
|
|
510
550
|
}
|
|
511
|
-
function
|
|
551
|
+
function U(e, t, n) {
|
|
512
552
|
if (!$.debug) return;
|
|
513
553
|
let r = e === "OUT" ? "#7c3aed" : "#059669";
|
|
514
554
|
console.groupCollapsed(`%c${e === "OUT" ? "➔ WASM CALL" : "← WASM RESP"} [#${t}]`, `color: ${r}; font-weight: bold;`), console.log("Details:", n), console.groupEnd();
|
|
515
555
|
}
|
|
516
|
-
function
|
|
556
|
+
function W(e, t) {
|
|
517
557
|
let n = t.trim().match(/^([\w\.\-]+)(?:\((.*)\))?$/);
|
|
518
558
|
if (!n) return null;
|
|
519
559
|
let r = n[1], i = {};
|
|
@@ -530,10 +570,10 @@ function V(e, t) {
|
|
|
530
570
|
args: i
|
|
531
571
|
};
|
|
532
572
|
}
|
|
533
|
-
function
|
|
573
|
+
function G(e) {
|
|
534
574
|
let t = e.getAttribute("ax-query");
|
|
535
575
|
if (!t) return;
|
|
536
|
-
let n =
|
|
576
|
+
let n = W(e, t);
|
|
537
577
|
if (!n) return;
|
|
538
578
|
let r = a(n.target);
|
|
539
579
|
if (!r) {
|
|
@@ -545,30 +585,30 @@ function H(e) {
|
|
|
545
585
|
}
|
|
546
586
|
let i = `${n.target}:${JSON.stringify(n.args)}`, o = N.get(i);
|
|
547
587
|
o || (o = new M(i, r, n.args), N.set(i, o)), e._axListener || (e._axListener = (t) => {
|
|
548
|
-
A(e, t), (t.state === "data" || t.state === "error") && (
|
|
588
|
+
A(e, t), (t.state === "data" || t.state === "error") && (H(e, t.state), e.dispatchEvent(new CustomEvent(`atmx:${t.state}`, {
|
|
549
589
|
bubbles: !0,
|
|
550
590
|
detail: t.data || t.error
|
|
551
591
|
})));
|
|
552
592
|
}, o.subscribe(e._axListener)), o.fetch();
|
|
553
593
|
}
|
|
554
|
-
function
|
|
594
|
+
function K(e) {
|
|
555
595
|
let t = e.getAttribute("ax-mutate");
|
|
556
596
|
if (!t) return;
|
|
557
|
-
let n =
|
|
597
|
+
let n = W(e, t);
|
|
558
598
|
if (!n) return;
|
|
559
599
|
let r = a(n.target);
|
|
560
600
|
if (!r) {
|
|
561
601
|
console.error(`ATMX: Mutation route not found for target '${n.target}'. Check your ax-mutate attribute.`), A(e, {
|
|
562
602
|
state: "error",
|
|
563
603
|
error: { message: `Route not found: ${n.target}` }
|
|
564
|
-
}),
|
|
604
|
+
}), H(e, "error");
|
|
565
605
|
return;
|
|
566
606
|
}
|
|
567
607
|
A(e, {
|
|
568
608
|
state: "mutating",
|
|
569
609
|
error: null,
|
|
570
610
|
data: null
|
|
571
|
-
}),
|
|
611
|
+
}), H(e, "mutating");
|
|
572
612
|
let i = {};
|
|
573
613
|
e instanceof HTMLFormElement && new FormData(e).forEach((t, n) => {
|
|
574
614
|
let r = e.elements.namedItem(n), a = !1;
|
|
@@ -597,11 +637,11 @@ function U(e) {
|
|
|
597
637
|
for (let [t, n] of Object.entries(l)) e.append(t, String(n));
|
|
598
638
|
p = new TextEncoder().encode(e.toString());
|
|
599
639
|
} else p = new TextEncoder().encode(JSON.stringify(l));
|
|
600
|
-
|
|
640
|
+
q(e, r.namespace, r.id, r.method, s, p, r.isStream, !0, u, f);
|
|
601
641
|
}
|
|
602
|
-
function
|
|
603
|
-
let f = ++
|
|
604
|
-
|
|
642
|
+
function q(e, n, r, i, a, o, s, c, l = {}, d = !1) {
|
|
643
|
+
let f = ++V;
|
|
644
|
+
U("OUT", f, {
|
|
605
645
|
namespace: n,
|
|
606
646
|
endpointId: r,
|
|
607
647
|
method: i,
|
|
@@ -610,7 +650,7 @@ function W(e, n, r, i, a, o, s, c, l = {}, d = !1) {
|
|
|
610
650
|
payload: o.length > 0 ? d ? new TextDecoder().decode(o) : JSON.parse(new TextDecoder().decode(o)) : null
|
|
611
651
|
}), t.set(f, {
|
|
612
652
|
isStream: s,
|
|
613
|
-
onResponse: (t) =>
|
|
653
|
+
onResponse: (t) => J(e, t, c, f),
|
|
614
654
|
onComplete: () => {
|
|
615
655
|
$.debug && console.log(`%c✔ Stream Complete [#${f}]`, "color: #94a3b8;");
|
|
616
656
|
}
|
|
@@ -618,8 +658,8 @@ function W(e, n, r, i, a, o, s, c, l = {}, d = !1) {
|
|
|
618
658
|
let h = m(n), g = m(i), _ = m(a), v = m(""), y = m(Object.keys(l).length > 0 ? JSON.stringify(l) : ""), b = p(o);
|
|
619
659
|
u.axiom_wasm_call(f, h.ptr, h.len, r, g.ptr, g.len, _.ptr, _.len, v.ptr, v.len, y.ptr, y.len, b, o.length), u.axiom_free_memory(h.ptr, h.len), u.axiom_free_memory(g.ptr, g.len), u.axiom_free_memory(_.ptr, _.len), u.axiom_free_memory(v.ptr, v.len), u.axiom_free_memory(y.ptr, y.len), b && u.axiom_free_memory(b, o.length);
|
|
620
660
|
}
|
|
621
|
-
function
|
|
622
|
-
if (
|
|
661
|
+
function J(t, n, r, i) {
|
|
662
|
+
if (U("IN", i, {
|
|
623
663
|
eventType: e[n.eventType],
|
|
624
664
|
data: n.data,
|
|
625
665
|
error: n.error
|
|
@@ -629,7 +669,7 @@ function G(t, n, r, i) {
|
|
|
629
669
|
error: n.error,
|
|
630
670
|
isFetching: !1,
|
|
631
671
|
isMutating: !1
|
|
632
|
-
}),
|
|
672
|
+
}), H(t, "error"), t.dispatchEvent(new CustomEvent("atmx:error", {
|
|
633
673
|
bubbles: !0,
|
|
634
674
|
detail: n.error
|
|
635
675
|
}));
|
|
@@ -655,14 +695,14 @@ function G(t, n, r, i) {
|
|
|
655
695
|
if (n) {
|
|
656
696
|
let e = S(n, O(t));
|
|
657
697
|
if (e) {
|
|
658
|
-
let n = a(
|
|
698
|
+
let n = a(W(t, t.getAttribute("ax-mutate")).target)?.namespace || "default", r = t.getAttribute("ax-token-target");
|
|
659
699
|
(r ? r.split(",").map((e) => e.trim()) : [n]).forEach((t) => {
|
|
660
700
|
$.setNamespaceAuthToken(t, e);
|
|
661
701
|
});
|
|
662
702
|
}
|
|
663
703
|
}
|
|
664
704
|
}
|
|
665
|
-
|
|
705
|
+
H(t, s), t.dispatchEvent(new CustomEvent(r ? "atmx:success" : "atmx:data", {
|
|
666
706
|
bubbles: !0,
|
|
667
707
|
detail: n.data
|
|
668
708
|
}));
|
|
@@ -670,15 +710,15 @@ function G(t, n, r, i) {
|
|
|
670
710
|
}
|
|
671
711
|
//#endregion
|
|
672
712
|
//#region src/dom/scanner.ts
|
|
673
|
-
var
|
|
713
|
+
var Y = new IntersectionObserver((e) => {
|
|
674
714
|
e.forEach((e) => {
|
|
675
715
|
if (e.isIntersecting) {
|
|
676
716
|
let t = e.target;
|
|
677
|
-
t.hasAttribute("ax-query") &&
|
|
717
|
+
t.hasAttribute("ax-query") && G(t), Y.unobserve(t);
|
|
678
718
|
}
|
|
679
719
|
});
|
|
680
720
|
});
|
|
681
|
-
function
|
|
721
|
+
function X(e) {
|
|
682
722
|
e.querySelectorAll("[\\:ax-query], [\\:ax-mutate]").forEach((e) => {
|
|
683
723
|
if (e.hasAttribute(":ax-query")) {
|
|
684
724
|
let t = S(e.getAttribute(":ax-query"), O(e));
|
|
@@ -690,11 +730,11 @@ function q(e) {
|
|
|
690
730
|
}
|
|
691
731
|
});
|
|
692
732
|
}
|
|
693
|
-
function
|
|
694
|
-
|
|
733
|
+
function ee(e = document) {
|
|
734
|
+
X(e), e.querySelectorAll("[ax-query]").forEach((e) => {
|
|
695
735
|
let t = e, n = t.getAttribute("ax-query");
|
|
696
736
|
if (!n) return;
|
|
697
|
-
let r =
|
|
737
|
+
let r = W(t, n);
|
|
698
738
|
if (r) {
|
|
699
739
|
let e = `${r.target}:${JSON.stringify(r.args)}`;
|
|
700
740
|
try {
|
|
@@ -709,20 +749,20 @@ function J(e = document) {
|
|
|
709
749
|
}
|
|
710
750
|
});
|
|
711
751
|
}
|
|
712
|
-
function
|
|
713
|
-
|
|
752
|
+
function Z(e = document) {
|
|
753
|
+
X(e), e.querySelectorAll("[ax-query]").forEach((e) => {
|
|
714
754
|
let t = e;
|
|
715
755
|
A(t, {});
|
|
716
756
|
let n = t.getAttribute("ax-trigger") || "load";
|
|
717
|
-
n === "load" ?
|
|
718
|
-
e.preventDefault(),
|
|
757
|
+
n === "load" ? G(t) : n === "intersect" ? Y.observe(t) : t.addEventListener(n, (e) => {
|
|
758
|
+
e.preventDefault(), G(t);
|
|
719
759
|
});
|
|
720
760
|
}), e.querySelectorAll("[ax-mutate]").forEach((e) => {
|
|
721
761
|
let t = e;
|
|
722
762
|
A(t, {});
|
|
723
763
|
let n = t.tagName === "FORM" ? "submit" : "click";
|
|
724
764
|
t.addEventListener(n, (e) => {
|
|
725
|
-
(t.tagName === "A" || t.tagName === "BUTTON" || t.tagName === "FORM") && e.preventDefault(),
|
|
765
|
+
(t.tagName === "A" || t.tagName === "BUTTON" || t.tagName === "FORM") && e.preventDefault(), K(t);
|
|
726
766
|
});
|
|
727
767
|
}), e.querySelectorAll("[ax-trigger=\"refresh\"]").forEach((e) => {
|
|
728
768
|
let t = e;
|
|
@@ -730,20 +770,20 @@ function Y(e = document) {
|
|
|
730
770
|
e.preventDefault();
|
|
731
771
|
let n = t.closest("[ax-query]");
|
|
732
772
|
if (n) {
|
|
733
|
-
let e =
|
|
773
|
+
let e = W(n, n.getAttribute("ax-query"));
|
|
734
774
|
if (e && a(e.target)) {
|
|
735
775
|
let t = `${e.target}:${JSON.stringify(e.args)}`, r = N.get(t);
|
|
736
|
-
r ? r.fetch(!0) :
|
|
776
|
+
r ? r.fetch(!0) : G(n);
|
|
737
777
|
}
|
|
738
778
|
}
|
|
739
779
|
});
|
|
740
780
|
});
|
|
741
781
|
}
|
|
742
|
-
function
|
|
782
|
+
function te() {
|
|
743
783
|
new MutationObserver((e) => {
|
|
744
784
|
e.forEach((e) => {
|
|
745
785
|
e.addedNodes.forEach((e) => {
|
|
746
|
-
e instanceof HTMLElement &&
|
|
786
|
+
e instanceof HTMLElement && Z(e);
|
|
747
787
|
});
|
|
748
788
|
});
|
|
749
789
|
}).observe(document.body, {
|
|
@@ -753,7 +793,7 @@ function X() {
|
|
|
753
793
|
}
|
|
754
794
|
//#endregion
|
|
755
795
|
//#region src/dom/components/engine-status.ts
|
|
756
|
-
var
|
|
796
|
+
var ne = class extends HTMLElement {
|
|
757
797
|
constructor() {
|
|
758
798
|
super();
|
|
759
799
|
}
|
|
@@ -774,10 +814,10 @@ var Z = class extends HTMLElement {
|
|
|
774
814
|
}) : (this.innerText = t, this.getAttribute("class") || (this.className = `text-xs font-bold ${n}`));
|
|
775
815
|
}
|
|
776
816
|
};
|
|
777
|
-
typeof window < "u" && !customElements.get("ax-engine-status") && customElements.define("ax-engine-status",
|
|
817
|
+
typeof window < "u" && !customElements.get("ax-engine-status") && customElements.define("ax-engine-status", ne);
|
|
778
818
|
//#endregion
|
|
779
819
|
//#region src/index.ts
|
|
780
|
-
var Q = "0.
|
|
820
|
+
var Q = "0.126.0", $ = new class {
|
|
781
821
|
version = Q;
|
|
782
822
|
initialized = !1;
|
|
783
823
|
debug = !1;
|
|
@@ -788,15 +828,15 @@ var Q = "0.125.0", $ = new class {
|
|
|
788
828
|
initDurationMs: 0
|
|
789
829
|
};
|
|
790
830
|
let t = await g(e);
|
|
791
|
-
return t.ok ? (this.debug = e.debug || !1,
|
|
831
|
+
return t.ok ? (this.debug = e.debug || !1, te(), Z(document.body), this.initialized = !0, this.debug && console.log("%c🚀 ATMX Debug Mode: Enabled", "color: #2563eb; font-weight: bold;"), console.log(`✅ ATMX v${this.version} Online (${t.initDurationMs}ms). Reactive Engine Started.`), document.dispatchEvent(new CustomEvent("atmx:ready", { detail: t }))) : (console.error("❌ ATMX Initialization Failed:", t.error), document.dispatchEvent(new CustomEvent("atmx:error", { detail: t.error }))), t;
|
|
792
832
|
}
|
|
793
833
|
hydrate(e) {
|
|
794
834
|
let t = document;
|
|
795
|
-
e && (t = typeof e == "string" ? document.querySelector(e) : e), t &&
|
|
835
|
+
e && (t = typeof e == "string" ? document.querySelector(e) : e), t && ee(t);
|
|
796
836
|
}
|
|
797
837
|
triggerQuery(e) {
|
|
798
838
|
let t = typeof e == "string" ? document.querySelector(e) : e;
|
|
799
|
-
t && t instanceof HTMLElement && t.hasAttribute("ax-query") &&
|
|
839
|
+
t && t instanceof HTMLElement && t.hasAttribute("ax-query") && G(t);
|
|
800
840
|
}
|
|
801
841
|
on(e, t) {
|
|
802
842
|
document.addEventListener(`atmx:${e}`, t);
|
|
@@ -817,7 +857,7 @@ var Q = "0.125.0", $ = new class {
|
|
|
817
857
|
y(e, t);
|
|
818
858
|
}
|
|
819
859
|
connect(e) {
|
|
820
|
-
let t =
|
|
860
|
+
let t = W(null, e);
|
|
821
861
|
if (!t) return;
|
|
822
862
|
let n = a(t.target);
|
|
823
863
|
if (!n) return;
|
|
@@ -825,7 +865,7 @@ var Q = "0.125.0", $ = new class {
|
|
|
825
865
|
i || (i = new M(r, n, t.args), N.set(r, i)), i.fetch();
|
|
826
866
|
}
|
|
827
867
|
disconnect(e) {
|
|
828
|
-
let n =
|
|
868
|
+
let n = W(null, e);
|
|
829
869
|
if (!n) return;
|
|
830
870
|
let r = a(n.target);
|
|
831
871
|
if (!r) return;
|
|
@@ -833,7 +873,7 @@ var Q = "0.125.0", $ = new class {
|
|
|
833
873
|
o && (o.currentReqId && t.delete(o.currentReqId), N.delete(i), this.debug && console.log(`🔌 ATMX Disconnected Stream: ${e}`));
|
|
834
874
|
}
|
|
835
875
|
send(e, t) {
|
|
836
|
-
let n =
|
|
876
|
+
let n = W(null, e);
|
|
837
877
|
if (!n) return;
|
|
838
878
|
let r = a(n.target);
|
|
839
879
|
if (!r) return;
|
|
@@ -841,25 +881,31 @@ var Q = "0.125.0", $ = new class {
|
|
|
841
881
|
o && o.currentReqId ? b(o.currentReqId, t) : console.warn(`ATMX: Cannot send message, stream not active for ${e}`);
|
|
842
882
|
}
|
|
843
883
|
mutate(e, t, n) {
|
|
844
|
-
return
|
|
884
|
+
return L(e, t, n);
|
|
885
|
+
}
|
|
886
|
+
query(e, t = {}) {
|
|
887
|
+
return I(e, t);
|
|
888
|
+
}
|
|
889
|
+
getCachedQueryData(e, t = {}) {
|
|
890
|
+
return F(e, t);
|
|
845
891
|
}
|
|
846
892
|
mutateBytes(e, t, n, r = {}) {
|
|
847
|
-
return
|
|
893
|
+
return L(e, t, {}, {
|
|
848
894
|
rawBody: n,
|
|
849
895
|
headers: r
|
|
850
896
|
});
|
|
851
897
|
}
|
|
852
898
|
invalidate(e, t) {
|
|
853
|
-
|
|
899
|
+
R(e, t);
|
|
854
900
|
}
|
|
855
901
|
setQueryData(e, t, n) {
|
|
856
|
-
|
|
902
|
+
z(e, t, n);
|
|
857
903
|
}
|
|
858
904
|
clearCache(e) {
|
|
859
|
-
|
|
905
|
+
B(e);
|
|
860
906
|
}
|
|
861
907
|
purgeCache(e) {
|
|
862
|
-
|
|
908
|
+
B(e, !1);
|
|
863
909
|
}
|
|
864
910
|
onError(e) {
|
|
865
911
|
document.addEventListener("atmx:error", (t) => {
|
package/dist/atmx.umd.js
CHANGED
|
@@ -822,5 +822,5 @@
|
|
|
822
822
|
|
|
823
823
|
return Object.assign(__wbg_init, { initSync }, exports);
|
|
824
824
|
})({ __proto__: null });
|
|
825
|
-
`,d=null;function f(e){try{localStorage.removeItem(`atmx_auth_store`);let t=[...Array.isArray(e?.endpoints)?e.endpoints:Object.values(e?.endpoints||{}),...Array.isArray(e?.ir?.endpoints)?e.ir.endpoints:Object.values(e?.ir?.endpoints||{})];for(let e of t)for(let t of e?.auth?.methods||[]){let e=t?.name||t?.type;e&&localStorage.removeItem(`axiom_cache_auth_${e}`)}}catch{}}function p(e){return(e.auth?.methods||[]).filter(e=>e?.type?.toLowerCase()!==`session`).map(e=>e?.name||e?.type).filter(Boolean)}function m(e){if(e.length===0)return 0;let t=d.axiom_malloc(e.length);return new Uint8Array(d.memory.buffer).set(e,t),t}function h(e){if(!e)return{ptr:0,len:0};let t=new TextEncoder().encode(e);return{ptr:m(t),len:t.length}}function g(e){if(e.wasmUrl)return e.wasmUrl;let t=`https://atmx.axiomcore.dev/${e.engineVersion||`v0.
|
|
826
|
-
`);for(let t of e)if(t.startsWith(n+`:`)){r=t.substring(n.length+1).trim();break}}let i=e.parentElement?.querySelector(`[name="${n}"]`);r?(e.textContent=r,e.removeAttribute(`hidden`),e.style.removeProperty(`display`),i&&(i.setAttribute(`aria-invalid`,`true`),i.classList.add(`border-red-500`,`focus:border-red-500`,`focus:ring-red-500`))):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`),e.textContent=``,i&&(i.removeAttribute(`aria-invalid`),i.classList.remove(`border-red-500`,`focus:border-red-500`,`focus:ring-red-500`)))}Array.from(e.attributes).forEach(n=>{if(n.name.startsWith(`ax-bind:`)){let i=n.name.substring(8),a=C(n.value,t,r);a===!1||a==null?e.removeAttribute(i):e.setAttribute(i,a===!0?i:String(a))}}),Array.from(e.children).forEach(e=>{E(e,t,!1,r)})}}function D(e,t,n){e.style.display=`none`,e.hasAttribute(`data-ax-for-id`)||e.setAttribute(`data-ax-for-id`,Math.random().toString(36).substr(2,9));let r=e.getAttribute(`data-ax-for-id`),i=e.getAttribute(`ax-for`).match(/^\s*(?:(?:\(\s*([\w\$]+)\s*,\s*([\w\$]+)\s*\))|([\w\$]+))\s+in\s+(.+)$/);if(!i)return;let a=i[1]||i[3],o=i[2],s=i[4],c=C(s,t,n),l=e.parentElement;if(!l)return;let u=Array.from(l.querySelectorAll(`[data-ax-clone-of="${r}"]`));if(!c||!Array.isArray(c)){u.forEach(e=>e.remove());return}let d=e.getAttribute(`ax-key`),f=[];c.forEach((i,s)=>{let c={...n,[a]:i};o&&(c[o]=s);let p=String(s);d&&(p=String(C(d,t,c)));let m=u.find(e=>e.getAttribute(`data-ax-key`)===p);m||(m=e.cloneNode(!0),m.removeAttribute(`ax-for`),m.style.removeProperty(`display`),m.style.length===0&&m.removeAttribute(`style`),m.setAttribute(`data-ax-clone-of`,r),m.setAttribute(`data-ax-key`,p)),l.insertBefore(m,e),E(m,t,!0,c),f.push(m)}),u.forEach(e=>{f.includes(e)||e.remove()})}var O=new WeakMap;function k(e){return O.has(e)||O.set(e,{state:`idle`,isFetching:!1,isMutating:!1,source:null,data:null,error:null}),O.get(e)}function A(e){let t=e.parentElement;for(;t;){if(t.hasAttribute(`ax-query`)||t.hasAttribute(`ax-mutate`)){let e=O.get(t);if(e&&e.data)return e.data}t=t.parentElement}return{}}function j(e,t){let n=k(e);Object.assign(n,t),t.state===`loading`&&(n.isFetching=!0),t.state===`mutating`&&(n.isMutating=!0),(t.state===`success`||t.state===`data`&&t.isFetching===!1)&&(n.isFetching=!1,n.isMutating=!1),O.set(e,n),T(e,n)}var M=0,N=class{key;route;args;state;listeners=new Set;currentReqId=null;constructor(e,t,n){this.key=e,this.route=t,this.args=n;let r=null;try{let t=sessionStorage.getItem(`atmx_cache_${e}`);t&&(r=JSON.parse(t))}catch{}r?this.state={state:`data`,isFetching:!1,source:`cache`,data:r,error:null}:this.state={state:`idle`,isFetching:!1,source:null,data:null,error:null}}subscribe(e){this.listeners.add(e),e(this.state)}update(e){if(this.state={...this.state,...e},this.state.data)try{sessionStorage.setItem(`atmx_cache_${this.key}`,JSON.stringify(this.state.data))}catch{}this.listeners.forEach(e=>e(this.state))}fetch(e=!1){if(this.state.isFetching&&!e)return;this.update({state:this.state.data?`data`:`loading`,isFetching:!0,error:null});let r=++M;this.currentReqId=r;let{path:i,remainingArgs:a}=s(this.route,this.args),o=new Uint8Array;Object.keys(a).length>0&&(o=new TextEncoder().encode(JSON.stringify(a))),$.debug&&(console.groupCollapsed(`%c➔ WASM QUERY [#${r}]`,`color: #7c3aed; font-weight: bold;`),console.log(`Namespace:`,this.route.namespace),console.log(`Endpoint ID:`,this.route.id),console.log(`Path:`,i),console.groupEnd()),n.set(r,{isStream:this.route.isStream,onResponse:e=>{if(this.currentReqId===r){if(e.eventType===t.Error){this.update({state:`error`,error:e.error,isFetching:!1});return}if(e.data!==void 0){let n=`network`,r=!1;e.eventType===t.CacheHit?(n=`cache`,r=!1):e.eventType===t.CacheHitAndFetching?(n=`cache`,r=!0):e.eventType===t.NetworkSuccess&&(n=`network`,r=!1),this.update({state:`data`,data:e.data,source:n,isFetching:r})}}},onComplete:()=>{this.currentReqId===r&&this.update({isFetching:!1})}});let c=h(this.route.namespace),l=h(this.route.method),u=h(i),f=m(o),p=h(``),g=h(``);d.axiom_wasm_call(r,c.ptr,c.len,this.route.id,l.ptr,l.len,u.ptr,u.len,p.ptr,p.len,g.ptr,g.len,f,o.length),d.axiom_free_memory(c.ptr,c.len),d.axiom_free_memory(l.ptr,l.len),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(p.ptr,p.len),d.axiom_free_memory(g.ptr,g.len)}},P=new Map;function F(e,r={},i={},a={}){return new Promise((c,l)=>{let u=o(e);if(!u)return l(Error(`ATMX Route not found: ${e}`));let f=++M,{path:p,remainingArgs:g}=s(u,{...r,...i}),_=a.rawBody;if(!_){let e=g;u.bodyParam&&g[u.bodyParam]!==void 0&&typeof g[u.bodyParam]==`object`&&(e=g[u.bodyParam]),_=new Uint8Array,Object.keys(e).length>0&&(_=new TextEncoder().encode(JSON.stringify(e)))}let v=!1,y=e=>{v||(v=!0,c(e))},b=e=>{v||(v=!0,l(e))};n.set(f,{isStream:u.isStream,onResponse:e=>{e.eventType===t.Error?(document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:e.error})),b(e.error)):e.data!==void 0&&y(e.data)},onComplete:()=>y(void 0)});let x=h(u.namespace),S=h(u.method),C=h(p),w=h(``),T=h(Object.keys(a.headers||{}).length>0?JSON.stringify(a.headers):``),E=m(_);d.axiom_wasm_call(f,x.ptr,x.len,u.id,S.ptr,S.len,C.ptr,C.len,w.ptr,w.len,T.ptr,T.len,E,_.length),d.axiom_free_memory(x.ptr,x.len),d.axiom_free_memory(S.ptr,S.len),d.axiom_free_memory(C.ptr,C.len),d.axiom_free_memory(w.ptr,w.len),d.axiom_free_memory(T.ptr,T.len),E&&d.axiom_free_memory(E,_.length)})}function I(e,t){let[n,r]=e.split(`.`),i=`atmx_cache_${e}`;t&&Object.keys(t).length>0&&(i+=`:${JSON.stringify(t)}`),Object.keys(sessionStorage).forEach(e=>{(e===i||!t&&e.startsWith(i+`:`))&&sessionStorage.removeItem(e)}),P.forEach((e,i)=>{e.route.namespace===n&&e.route.name===r&&(!t||Object.keys(t).length===0||JSON.stringify(e.args)===JSON.stringify(t))&&e.fetch(!0)})}function L(e,t={},n){let r=`${e}:${JSON.stringify(t)}`;try{sessionStorage.setItem(`atmx_cache_${r}`,JSON.stringify(n))}catch{}let i=P.get(r);i&&i.update({state:`data`,source:`cache`,isFetching:!1,data:n,error:null})}function R(e,t=!0){let n=e?`atmx_cache_${e}.`:`atmx_cache_`;Object.keys(sessionStorage).forEach(e=>{e.startsWith(n)&&sessionStorage.removeItem(e)}),t&&P.forEach(t=>{(!e||t.route.namespace===e)&&t.fetch(!0)})}var z=0;function B(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&w(e.getAttribute(n),k(e))}function V(e,t,n){if(!$.debug)return;let r=e===`OUT`?`#7c3aed`:`#059669`;console.groupCollapsed(`%c${e===`OUT`?`➔ WASM CALL`:`← WASM RESP`} [#${t}]`,`color: ${r}; font-weight: bold;`),console.log(`Details:`,n),console.groupEnd()}function H(e,t){let n=t.trim().match(/^([\w\.\-]+)(?:\((.*)\))?$/);if(!n)return null;let r=n[1],i={};if(n[2]&&n[2].trim()!==``)try{if(e){let t=k(e),r=t.data||A(e);i=Function(`$data`,`$state`,`return (${n[2]});`)(r??null,t)||{}}else i=Function(`return (${n[2]});`)()||{}}catch(e){console.error(`ATMX Scope Error in "${t}":`,e)}return{target:r,args:i}}function U(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=H(e,t);if(!n)return;let r=o(n.target);if(!r){j(e,{state:`error`,error:{message:`Route not found: ${n.target}`}});return}let i=`${n.target}:${JSON.stringify(n.args)}`,a=P.get(i);a||(a=new N(i,r,n.args),P.set(i,a)),e._axListener||(e._axListener=t=>{j(e,t),(t.state===`data`||t.state===`error`)&&(B(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function W(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=H(e,t);if(!n)return;let r=o(n.target);if(!r){console.error(`ATMX: Mutation route not found for target '${n.target}'. Check your ax-mutate attribute.`),j(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),B(e,`error`);return}j(e,{state:`mutating`,error:null,data:null}),B(e,`mutating`);let i={};e instanceof HTMLFormElement&&new FormData(e).forEach((t,n)=>{let r=e.elements.namedItem(n),a=!1;r instanceof HTMLInputElement?a=r.type===`number`:r instanceof RadioNodeList&&r.length>0&&(a=r[0].type===`number`);let o=a&&t!==``?Number(t):t;if(n.includes(`.`)){let e=n.split(`.`),t=i;for(let n=0;n<e.length-1;n++)t[e[n]]||(t[e[n]]={}),t=t[e[n]];t[e[e.length-1]]=o}else i[n]=o});let{path:a,remainingArgs:c}=s(r,{...i,...n.args}),l=c;r.bodyParam&&c[r.bodyParam]!==void 0&&typeof c[r.bodyParam]==`object`&&(l=c[r.bodyParam]);let u={},d=e.getAttribute(`ax-headers`);if(d)try{u=Function(`return (`+d+`);`)()||{}}catch(e){console.error(`ATMX: Invalid ax-headers syntax`,e)}let f=Object.entries(u).some(([e,t])=>e.toLowerCase()===`content-type`&&t.includes(`application/x-www-form-urlencoded`)),p=new Uint8Array;if(Object.keys(l).length>0)if(f){let e=new URLSearchParams;for(let[t,n]of Object.entries(l))e.append(t,String(n));p=new TextEncoder().encode(e.toString())}else p=new TextEncoder().encode(JSON.stringify(l));G(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function G(e,t,r,i,a,o,s,c,l={},u=!1){let f=++z;V(`OUT`,f,{namespace:t,endpointId:r,method:i,path:a,headers:l,payload:o.length>0?u?new TextDecoder().decode(o):JSON.parse(new TextDecoder().decode(o)):null}),n.set(f,{isStream:s,onResponse:t=>K(e,t,c,f),onComplete:()=>{$.debug&&console.log(`%c✔ Stream Complete [#${f}]`,`color: #94a3b8;`)}});let p=h(t),g=h(i),_=h(a),v=h(``),y=h(Object.keys(l).length>0?JSON.stringify(l):``),b=m(o);d.axiom_wasm_call(f,p.ptr,p.len,r,g.ptr,g.len,_.ptr,_.len,v.ptr,v.len,y.ptr,y.len,b,o.length),d.axiom_free_memory(p.ptr,p.len),d.axiom_free_memory(g.ptr,g.len),d.axiom_free_memory(_.ptr,_.len),d.axiom_free_memory(v.ptr,v.len),d.axiom_free_memory(y.ptr,y.len),b&&d.axiom_free_memory(b,o.length)}function K(e,n,r,i){if(V(`IN`,i,{eventType:t[n.eventType],data:n.data,error:n.error}),n.eventType===t.Error){j(e,{state:`error`,error:n.error,isFetching:!1,isMutating:!1}),B(e,`error`),e.dispatchEvent(new CustomEvent(`atmx:error`,{bubbles:!0,detail:n.error}));return}if(n.data!==void 0){let i=`network`,a=!1;n.eventType===t.CacheHit?i=`cache`:n.eventType===t.CacheHitAndFetching?(i=`cache`,a=!0):n.eventType===t.NetworkSuccess&&(i=`network`);let s=r?`success`:`data`;if(j(e,{state:s,data:n.data,source:i,isFetching:a,isMutating:!1}),r){let t=e.getAttribute(`ax-invalidates`);t&&t.split(`,`).map(e=>e.trim()).forEach(t=>{let n=C(`\`${t}\``,k(e))||t;$.invalidate(n)});let n=e.getAttribute(`ax-store-token`);if(n){let t=C(n,k(e));if(t){let n=o(H(e,e.getAttribute(`ax-mutate`)).target)?.namespace||`default`,r=e.getAttribute(`ax-token-target`);(r?r.split(`,`).map(e=>e.trim()):[n]).forEach(e=>{$.setNamespaceAuthToken(e,t)})}}}B(e,s),e.dispatchEvent(new CustomEvent(r?`atmx:success`:`atmx:data`,{bubbles:!0,detail:n.data}))}}var q=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){let t=e.target;t.hasAttribute(`ax-query`)&&U(t),q.unobserve(t)}})});function J(e){e.querySelectorAll(`[\\:ax-query], [\\:ax-mutate]`).forEach(e=>{if(e.hasAttribute(`:ax-query`)){let t=C(e.getAttribute(`:ax-query`),k(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=C(e.getAttribute(`:ax-mutate`),k(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function Y(e=document){J(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e,n=t.getAttribute(`ax-query`);if(!n)return;let r=H(t,n);if(r){let e=`${r.target}:${JSON.stringify(r.args)}`;try{let n=sessionStorage.getItem(`atmx_cache_${e}`);n&&j(t,{state:`data`,data:JSON.parse(n),source:`cache`,isFetching:!0})}catch{}}})}function X(e=document){J(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e;j(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?U(t):n===`intersect`?q.observe(t):t.addEventListener(n,e=>{e.preventDefault(),U(t)})}),e.querySelectorAll(`[ax-mutate]`).forEach(e=>{let t=e;j(t,{});let n=t.tagName===`FORM`?`submit`:`click`;t.addEventListener(n,e=>{(t.tagName===`A`||t.tagName===`BUTTON`||t.tagName===`FORM`)&&e.preventDefault(),W(t)})}),e.querySelectorAll(`[ax-trigger="refresh"]`).forEach(e=>{let t=e;t.addEventListener(`click`,e=>{e.preventDefault();let n=t.closest(`[ax-query]`);if(n){let e=H(n,n.getAttribute(`ax-query`));if(e&&o(e.target)){let t=`${e.target}:${JSON.stringify(e.args)}`,r=P.get(t);r?r.fetch(!0):U(n)}}})})}function Z(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&X(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var ee=class extends HTMLElement{constructor(){super()}connectedCallback(){let e=this.getAttribute(`loading-text`)||`Initializing...`,t=this.getAttribute(`ready-text`)||`Online`,n=this.getAttribute(`error-text`)||`Failed to Connect`;this.renderState(`loading`,e,`text-amber-500 animate-pulse`),document.addEventListener(`atmx:ready`,()=>{this.renderState(`ready`,t,`text-green-600`)}),document.addEventListener(`atmx:error`,e=>{let t=e;t.detail&&t.detail.stage===`runtime`&&this.renderState(`error`,`${n}: ${t.detail.message}`,`text-red-600`)})}renderState(e,t,n){this.setAttribute(`data-state`,e);let r=this.querySelectorAll(`[data-ax-when]`);r.length>0?r.forEach(t=>{t.getAttribute(`data-ax-when`)===e?t.removeAttribute(`hidden`):t.setAttribute(`hidden`,``)}):(this.innerText=t,this.getAttribute(`class`)||(this.className=`text-xs font-bold ${n}`))}};typeof window<`u`&&!customElements.get(`ax-engine-status`)&&customElements.define(`ax-engine-status`,ee);var Q=`0.125.0`,$=new class{version=Q;initialized=!1;debug=!1;async init(e){if(this.initialized)return{ok:!0,contracts:{},initDurationMs:0};let t=await _(e);return t.ok?(this.debug=e.debug||!1,Z(),X(document.body),this.initialized=!0,this.debug&&console.log(`%c🚀 ATMX Debug Mode: Enabled`,`color: #2563eb; font-weight: bold;`),console.log(`✅ ATMX v${this.version} Online (${t.initDurationMs}ms). Reactive Engine Started.`),document.dispatchEvent(new CustomEvent(`atmx:ready`,{detail:t}))):(console.error(`❌ ATMX Initialization Failed:`,t.error),document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:t.error}))),t}hydrate(e){let t=document;e&&(t=typeof e==`string`?document.querySelector(e):e),t&&Y(t)}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&U(t)}on(e,t){document.addEventListener(`atmx:${e}`,t)}setAuthToken(e,t,n){v(e,t,n)}setNamespaceAuthToken(e,t){y(e,t)}setGlobalAuthToken(e){S(e)}sendStreamMessage(e,t){x(e,t)}clearAuthToken(e,t){b(e,t)}connect(e){let t=H(null,e);if(!t)return;let n=o(t.target);if(!n)return;let r=`${n.namespace}:${n.id}:${JSON.stringify(t.args)}`,i=P.get(r);i||(i=new N(r,n,t.args),P.set(r,i)),i.fetch()}disconnect(e){let t=H(null,e);if(!t)return;let r=o(t.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(t.args)}`,a=P.get(i);a&&(a.currentReqId&&n.delete(a.currentReqId),P.delete(i),this.debug&&console.log(`🔌 ATMX Disconnected Stream: ${e}`))}send(e,t){let n=H(null,e);if(!n)return;let r=o(n.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(n.args)}`,a=P.get(i);a&&a.currentReqId?x(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}mutate(e,t,n){return F(e,t,n)}mutateBytes(e,t,n,r={}){return F(e,t,{},{rawBody:n,headers:r})}invalidate(e,t){I(e,t)}setQueryData(e,t,n){L(e,t,n)}clearCache(e){R(e)}purgeCache(e){R(e,!1)}onError(e){document.addEventListener(`atmx:error`,t=>{e(t.detail)})}};typeof window<`u`&&(window.atmx=$),e.ATMX_VERSION=Q,e.allocBytes=m,e.allocString=h,e.atmx=$,e.buildRequestPath=s,e.clearAuthToken=b,e.initWasm=_,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=x,e.setAuthToken=v,e.setGlobalAuthToken=S,Object.defineProperty(e,`wasmEngine`,{enumerable:!0,get:function(){return d}})});
|
|
825
|
+
`,d=null;function f(e){try{localStorage.removeItem(`atmx_auth_store`);let t=[...Array.isArray(e?.endpoints)?e.endpoints:Object.values(e?.endpoints||{}),...Array.isArray(e?.ir?.endpoints)?e.ir.endpoints:Object.values(e?.ir?.endpoints||{})];for(let e of t)for(let t of e?.auth?.methods||[]){let e=t?.name||t?.type;e&&localStorage.removeItem(`axiom_cache_auth_${e}`)}}catch{}}function p(e){return(e.auth?.methods||[]).filter(e=>e?.type?.toLowerCase()!==`session`).map(e=>e?.name||e?.type).filter(Boolean)}function m(e){if(e.length===0)return 0;let t=d.axiom_malloc(e.length);return new Uint8Array(d.memory.buffer).set(e,t),t}function h(e){if(!e)return{ptr:0,len:0};let t=new TextEncoder().encode(e);return{ptr:m(t),len:t.length}}function g(e){if(e.wasmUrl)return e.wasmUrl;let t=`https://atmx.axiomcore.dev/${e.engineVersion||`v0.126.0`}/axiom_runtime.wasm`;return e.disableCacheBuster||(t+=`?t=${Date.now()}`),t}async function _(e){let t=performance.now(),n={ok:!1,contracts:{},initDurationMs:0};try{if(!window.wasm_bindgen){let e=document.createElement(`script`);e.type=`text/javascript`,e.text=`${u}\nwindow.wasm_bindgen = wasm_bindgen;`,document.head.appendChild(e)}let t=window.wasm_bindgen,i=g(e);try{d=await t({module_or_path:fetch(i)})}catch(e){throw{stage:`ffiBoundary`,category:`network`,code:`WasmFetchFailed`,message:`Failed to download WASM engine: ${e.message}`,retryable:!0}}r(d),setInterval(()=>{d&&d.axiom_process_responses()},16);let o=h(``),s=d.axiom_wasm_initialize(o.ptr,o.len);if(d.axiom_free_memory(o.ptr,o.len),s!==0)throw{stage:`runtime`,category:`server`,code:`InitFailed`,message:`Engine init failed (Code: ${s})`,retryable:!1};for(let[t,r]of Object.entries(e.contracts))try{let i=await fetch(r.contractUrl);if(!i.ok)throw Error(`HTTP ${i.status}`);let o=await i.arrayBuffer(),s=0;try{let e=new TextDecoder().decode(o),n=JSON.parse(e),r=n?.ir?.endpoints;r&&(s=Array.isArray(r)?r.length:Object.keys(r).length),f(n),a(t,n)}catch(e){console.error(`ATMX: Failed to parse .axiom contract for '${t}'`,e)}let c=new Uint8Array(o),l=m(c),u=h(t),p=h(r.baseUrl),g=d.axiom_wasm_load_contract(u.ptr,u.len,p.ptr,p.len,l,c.length,0,0,0,0);if(d.axiom_free_memory(l,c.length),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(p.ptr,p.len),g!==0&&g!==-1)throw Error(`Load error (Code: ${g})`);e.debug&&console.log(`%c🔒 Axiom Contract Loaded: ${t} (${s} endpoints)`,`color: #10b981; font-weight: bold;`),n.contracts[t]={loaded:!0,endpointCount:s},document.dispatchEvent(new CustomEvent(`atmx:contract-loaded`,{detail:{namespace:t,endpointCount:s}}))}catch(e){n.contracts[t]={loaded:!1,endpointCount:0,error:e.message},console.error(`ATMX: Contract failed for ${t}`,e)}n.ok=!0}catch(e){n.ok=!1,n.error=e.stage?e:{stage:`runtime`,category:`unknown`,code:`FatalError`,message:e.message||String(e),retryable:!1}}return n.initDurationMs=Math.round(performance.now()-t),n}function v(e,t,n){if(!d)return;let r=h(e),i=h(t),a=h(n);d.axiom_wasm_set_auth_token(r.ptr,r.len,i.ptr,i.len,a.ptr,a.len),d.axiom_free_memory(r.ptr,r.len),d.axiom_free_memory(i.ptr,i.len),d.axiom_free_memory(a.ptr,a.len)}function y(e,t){if(!d)return;let n=new Set(l(e).flatMap(p));for(let r of n)v(e,r,t)}function b(e,t){if(!d)return;let n=h(e),r=h(t);d.axiom_wasm_clear_auth_token(n.ptr,n.len,r.ptr,r.len),d.axiom_free_memory(n.ptr,n.len),d.axiom_free_memory(r.ptr,r.len)}function x(e,t){if(!d)return;let n=new TextEncoder().encode(JSON.stringify(t)),r=m(n);d.axiom_wasm_send_stream_message(e,r,n.length),d.axiom_free_memory(r,n.length)}function S(e){if(!d)return;let t=new Map;for(let e of c()){let n=t.get(e.namespace)||new Set;p(e).forEach(e=>n.add(e)),t.set(e.namespace,n)}for(let[n,r]of t)for(let t of r)v(n,t,e)}function C(e,t,n={}){if(e)try{let r=Object.keys(n),i=Object.values(n);return Function(`$data`,`$error`,`$state`,...r,`return (${e});`)(t.data??null,t.error??null,t,...i)}catch(t){console.error(`ATMX Eval Error: ${e}`,t);return}}function w(e,t,n={}){if(e)try{let r=Object.keys(n),i=Object.values(n);Function(`$data`,`$error`,`$state`,...r,e)(t.data??null,t.error??null,t,...i)}catch(t){console.error(`ATMX Action Error: ${e}`,t)}}function T(e,t){E(e,t,!0,{})}function E(e,t,n,r){if(!(!n&&(e.hasAttribute(`ax-query`)||e.hasAttribute(`ax-mutate`)))&&!(!n&&e.hasAttribute(`data-ax-clone-of`))){if(e.hasAttribute(`ax-for`)){D(e,t,r);return}if(e.hasAttribute(`ax-when`)&&(e.getAttribute(`ax-when`).split(`,`).map(e=>e.trim()).includes(t.state)?(e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,`true`),e.style.setProperty(`display`,`none`,`important`))),e.hasAttribute(`ax-if`)&&(C(e.getAttribute(`ax-if`),t,r)?(e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`))),e.hasAttribute(`ax-text`)){let n=C(e.getAttribute(`ax-text`),t,r);e.textContent=n==null?``:String(n)}if(e.hasAttribute(`ax-error-for`)){let n=e.getAttribute(`ax-error-for`),r=``;if(t.state===`error`&&t.error?.code===`ValidationError`){let e=(t.error.details||``).split(`
|
|
826
|
+
`);for(let t of e)if(t.startsWith(n+`:`)){r=t.substring(n.length+1).trim();break}}let i=e.parentElement?.querySelector(`[name="${n}"]`);r?(e.textContent=r,e.removeAttribute(`hidden`),e.style.removeProperty(`display`),i&&(i.setAttribute(`aria-invalid`,`true`),i.classList.add(`border-red-500`,`focus:border-red-500`,`focus:ring-red-500`))):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`),e.textContent=``,i&&(i.removeAttribute(`aria-invalid`),i.classList.remove(`border-red-500`,`focus:border-red-500`,`focus:ring-red-500`)))}Array.from(e.attributes).forEach(n=>{if(n.name.startsWith(`ax-bind:`)){let i=n.name.substring(8),a=C(n.value,t,r);a===!1||a==null?e.removeAttribute(i):e.setAttribute(i,a===!0?i:String(a))}}),Array.from(e.children).forEach(e=>{E(e,t,!1,r)})}}function D(e,t,n){e.style.display=`none`,e.hasAttribute(`data-ax-for-id`)||e.setAttribute(`data-ax-for-id`,Math.random().toString(36).substr(2,9));let r=e.getAttribute(`data-ax-for-id`),i=e.getAttribute(`ax-for`).match(/^\s*(?:(?:\(\s*([\w\$]+)\s*,\s*([\w\$]+)\s*\))|([\w\$]+))\s+in\s+(.+)$/);if(!i)return;let a=i[1]||i[3],o=i[2],s=i[4],c=C(s,t,n),l=e.parentElement;if(!l)return;let u=Array.from(l.querySelectorAll(`[data-ax-clone-of="${r}"]`));if(!c||!Array.isArray(c)){u.forEach(e=>e.remove());return}let d=e.getAttribute(`ax-key`),f=[];c.forEach((i,s)=>{let c={...n,[a]:i};o&&(c[o]=s);let p=String(s);d&&(p=String(C(d,t,c)));let m=u.find(e=>e.getAttribute(`data-ax-key`)===p);m||(m=e.cloneNode(!0),m.removeAttribute(`ax-for`),m.style.removeProperty(`display`),m.style.length===0&&m.removeAttribute(`style`),m.setAttribute(`data-ax-clone-of`,r),m.setAttribute(`data-ax-key`,p)),l.insertBefore(m,e),E(m,t,!0,c),f.push(m)}),u.forEach(e=>{f.includes(e)||e.remove()})}var O=new WeakMap;function k(e){return O.has(e)||O.set(e,{state:`idle`,isFetching:!1,isMutating:!1,source:null,data:null,error:null}),O.get(e)}function ee(e){let t=e.parentElement;for(;t;){if(t.hasAttribute(`ax-query`)||t.hasAttribute(`ax-mutate`)){let e=O.get(t);if(e&&e.data)return e.data}t=t.parentElement}return{}}function A(e,t){let n=k(e);Object.assign(n,t),t.state===`loading`&&(n.isFetching=!0),t.state===`mutating`&&(n.isMutating=!0),(t.state===`success`||t.state===`data`&&t.isFetching===!1)&&(n.isFetching=!1,n.isMutating=!1),O.set(e,n),T(e,n)}var j=0,M=class{key;route;args;state;listeners=new Set;currentReqId=null;constructor(e,t,n){this.key=e,this.route=t,this.args=n;let r=null;try{let t=sessionStorage.getItem(`atmx_cache_${e}`);t&&(r=JSON.parse(t))}catch{}r?this.state={state:`data`,isFetching:!1,source:`cache`,data:r,error:null}:this.state={state:`idle`,isFetching:!1,source:null,data:null,error:null}}subscribe(e){return this.listeners.add(e),e(this.state),()=>this.listeners.delete(e)}update(e){if(this.state={...this.state,...e},this.state.data)try{sessionStorage.setItem(`atmx_cache_${this.key}`,JSON.stringify(this.state.data))}catch{}this.listeners.forEach(e=>e(this.state))}fetch(e=!1){if(this.state.isFetching&&!e)return;this.update({state:this.state.data?`data`:`loading`,isFetching:!0,error:null});let r=++j;this.currentReqId=r;let{path:i,remainingArgs:a}=s(this.route,this.args),o=new Uint8Array;Object.keys(a).length>0&&(o=new TextEncoder().encode(JSON.stringify(a))),$.debug&&(console.groupCollapsed(`%c➔ WASM QUERY [#${r}]`,`color: #7c3aed; font-weight: bold;`),console.log(`Namespace:`,this.route.namespace),console.log(`Endpoint ID:`,this.route.id),console.log(`Path:`,i),console.groupEnd()),n.set(r,{isStream:this.route.isStream,onResponse:e=>{if(this.currentReqId===r){if(e.eventType===t.Error){this.update({state:`error`,error:e.error,isFetching:!1});return}if(e.data!==void 0){let n=`network`,r=!1;e.eventType===t.CacheHit?(n=`cache`,r=!1):e.eventType===t.CacheHitAndFetching?(n=`cache`,r=!0):e.eventType===t.NetworkSuccess&&(n=`network`,r=!1),this.update({state:`data`,data:e.data,source:n,isFetching:r})}}},onComplete:()=>{this.currentReqId===r&&this.update({isFetching:!1})}});let c=h(this.route.namespace),l=h(this.route.method),u=h(i),f=m(o),p=h(``),g=h(``);d.axiom_wasm_call(r,c.ptr,c.len,this.route.id,l.ptr,l.len,u.ptr,u.len,p.ptr,p.len,g.ptr,g.len,f,o.length),d.axiom_free_memory(c.ptr,c.len),d.axiom_free_memory(l.ptr,l.len),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(p.ptr,p.len),d.axiom_free_memory(g.ptr,g.len)}},N=new Map;function P(e,t={}){return`${e}:${JSON.stringify(t)}`}function F(e,t={}){let n=P(e,t),r=N.get(n);if(r?.state.data!==null&&r?.state.data!==void 0)return r.state.data;try{let e=sessionStorage.getItem(`atmx_cache_${n}`);return e?JSON.parse(e):null}catch{return null}}function I(e,t={}){let n=o(e);if(!n)throw Error(`ATMX Route not found: ${e}`);let r=P(e,t),i=N.get(r);i||(i=new M(r,n,t),N.set(r,i));let a=!1,s=new Set,c=i.subscribe(e=>{a||s.forEach(t=>t(e))});return i.fetch(),{getSnapshot:()=>({...i.state}),subscribe(e){return a?()=>{}:(s.add(e),e(i.state),()=>s.delete(e))},refresh(){a||i.fetch(!0)},dispose(){a||(a=!0,s.clear(),c())}}}function L(e,r={},i={},a={}){return new Promise((c,l)=>{let u=o(e);if(!u)return l(Error(`ATMX Route not found: ${e}`));let f=++j,{path:p,remainingArgs:g}=s(u,{...r,...i}),_=a.rawBody;if(!_){let e=g;u.bodyParam&&g[u.bodyParam]!==void 0&&typeof g[u.bodyParam]==`object`&&(e=g[u.bodyParam]),_=new Uint8Array,Object.keys(e).length>0&&(_=new TextEncoder().encode(JSON.stringify(e)))}let v=!1,y=e=>{v||(v=!0,c(e))},b=e=>{v||(v=!0,l(e))};n.set(f,{isStream:u.isStream,onResponse:e=>{e.eventType===t.Error?(document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:e.error})),b(e.error)):e.data!==void 0&&y(e.data)},onComplete:()=>y(void 0)});let x=h(u.namespace),S=h(u.method),C=h(p),w=h(``),T=h(Object.keys(a.headers||{}).length>0?JSON.stringify(a.headers):``),E=m(_);d.axiom_wasm_call(f,x.ptr,x.len,u.id,S.ptr,S.len,C.ptr,C.len,w.ptr,w.len,T.ptr,T.len,E,_.length),d.axiom_free_memory(x.ptr,x.len),d.axiom_free_memory(S.ptr,S.len),d.axiom_free_memory(C.ptr,C.len),d.axiom_free_memory(w.ptr,w.len),d.axiom_free_memory(T.ptr,T.len),E&&d.axiom_free_memory(E,_.length)})}function R(e,t){let[n,r]=e.split(`.`),i=`atmx_cache_${e}`;t&&Object.keys(t).length>0&&(i+=`:${JSON.stringify(t)}`),Object.keys(sessionStorage).forEach(e=>{(e===i||!t&&e.startsWith(i+`:`))&&sessionStorage.removeItem(e)}),N.forEach((e,i)=>{e.route.namespace===n&&e.route.name===r&&(!t||Object.keys(t).length===0||JSON.stringify(e.args)===JSON.stringify(t))&&e.fetch(!0)})}function z(e,t={},n){let r=P(e,t);try{sessionStorage.setItem(`atmx_cache_${r}`,JSON.stringify(n))}catch{}let i=N.get(r);i&&i.update({state:`data`,source:`cache`,isFetching:!1,data:n,error:null})}function B(e,t=!0){let n=e?`atmx_cache_${e}.`:`atmx_cache_`;Object.keys(sessionStorage).forEach(e=>{e.startsWith(n)&&sessionStorage.removeItem(e)}),N.forEach(n=>{(!e||n.route.namespace===e)&&(n.update({state:`idle`,source:null,data:null,error:null,isFetching:!1}),t&&n.fetch(!0))})}var V=0;function H(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&w(e.getAttribute(n),k(e))}function U(e,t,n){if(!$.debug)return;let r=e===`OUT`?`#7c3aed`:`#059669`;console.groupCollapsed(`%c${e===`OUT`?`➔ WASM CALL`:`← WASM RESP`} [#${t}]`,`color: ${r}; font-weight: bold;`),console.log(`Details:`,n),console.groupEnd()}function W(e,t){let n=t.trim().match(/^([\w\.\-]+)(?:\((.*)\))?$/);if(!n)return null;let r=n[1],i={};if(n[2]&&n[2].trim()!==``)try{if(e){let t=k(e),r=t.data||ee(e);i=Function(`$data`,`$state`,`return (${n[2]});`)(r??null,t)||{}}else i=Function(`return (${n[2]});`)()||{}}catch(e){console.error(`ATMX Scope Error in "${t}":`,e)}return{target:r,args:i}}function G(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=W(e,t);if(!n)return;let r=o(n.target);if(!r){A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}});return}let i=`${n.target}:${JSON.stringify(n.args)}`,a=N.get(i);a||(a=new M(i,r,n.args),N.set(i,a)),e._axListener||(e._axListener=t=>{A(e,t),(t.state===`data`||t.state===`error`)&&(H(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function K(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=W(e,t);if(!n)return;let r=o(n.target);if(!r){console.error(`ATMX: Mutation route not found for target '${n.target}'. Check your ax-mutate attribute.`),A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),H(e,`error`);return}A(e,{state:`mutating`,error:null,data:null}),H(e,`mutating`);let i={};e instanceof HTMLFormElement&&new FormData(e).forEach((t,n)=>{let r=e.elements.namedItem(n),a=!1;r instanceof HTMLInputElement?a=r.type===`number`:r instanceof RadioNodeList&&r.length>0&&(a=r[0].type===`number`);let o=a&&t!==``?Number(t):t;if(n.includes(`.`)){let e=n.split(`.`),t=i;for(let n=0;n<e.length-1;n++)t[e[n]]||(t[e[n]]={}),t=t[e[n]];t[e[e.length-1]]=o}else i[n]=o});let{path:a,remainingArgs:c}=s(r,{...i,...n.args}),l=c;r.bodyParam&&c[r.bodyParam]!==void 0&&typeof c[r.bodyParam]==`object`&&(l=c[r.bodyParam]);let u={},d=e.getAttribute(`ax-headers`);if(d)try{u=Function(`return (`+d+`);`)()||{}}catch(e){console.error(`ATMX: Invalid ax-headers syntax`,e)}let f=Object.entries(u).some(([e,t])=>e.toLowerCase()===`content-type`&&t.includes(`application/x-www-form-urlencoded`)),p=new Uint8Array;if(Object.keys(l).length>0)if(f){let e=new URLSearchParams;for(let[t,n]of Object.entries(l))e.append(t,String(n));p=new TextEncoder().encode(e.toString())}else p=new TextEncoder().encode(JSON.stringify(l));q(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function q(e,t,r,i,a,o,s,c,l={},u=!1){let f=++V;U(`OUT`,f,{namespace:t,endpointId:r,method:i,path:a,headers:l,payload:o.length>0?u?new TextDecoder().decode(o):JSON.parse(new TextDecoder().decode(o)):null}),n.set(f,{isStream:s,onResponse:t=>J(e,t,c,f),onComplete:()=>{$.debug&&console.log(`%c✔ Stream Complete [#${f}]`,`color: #94a3b8;`)}});let p=h(t),g=h(i),_=h(a),v=h(``),y=h(Object.keys(l).length>0?JSON.stringify(l):``),b=m(o);d.axiom_wasm_call(f,p.ptr,p.len,r,g.ptr,g.len,_.ptr,_.len,v.ptr,v.len,y.ptr,y.len,b,o.length),d.axiom_free_memory(p.ptr,p.len),d.axiom_free_memory(g.ptr,g.len),d.axiom_free_memory(_.ptr,_.len),d.axiom_free_memory(v.ptr,v.len),d.axiom_free_memory(y.ptr,y.len),b&&d.axiom_free_memory(b,o.length)}function J(e,n,r,i){if(U(`IN`,i,{eventType:t[n.eventType],data:n.data,error:n.error}),n.eventType===t.Error){A(e,{state:`error`,error:n.error,isFetching:!1,isMutating:!1}),H(e,`error`),e.dispatchEvent(new CustomEvent(`atmx:error`,{bubbles:!0,detail:n.error}));return}if(n.data!==void 0){let i=`network`,a=!1;n.eventType===t.CacheHit?i=`cache`:n.eventType===t.CacheHitAndFetching?(i=`cache`,a=!0):n.eventType===t.NetworkSuccess&&(i=`network`);let s=r?`success`:`data`;if(A(e,{state:s,data:n.data,source:i,isFetching:a,isMutating:!1}),r){let t=e.getAttribute(`ax-invalidates`);t&&t.split(`,`).map(e=>e.trim()).forEach(t=>{let n=C(`\`${t}\``,k(e))||t;$.invalidate(n)});let n=e.getAttribute(`ax-store-token`);if(n){let t=C(n,k(e));if(t){let n=o(W(e,e.getAttribute(`ax-mutate`)).target)?.namespace||`default`,r=e.getAttribute(`ax-token-target`);(r?r.split(`,`).map(e=>e.trim()):[n]).forEach(e=>{$.setNamespaceAuthToken(e,t)})}}}H(e,s),e.dispatchEvent(new CustomEvent(r?`atmx:success`:`atmx:data`,{bubbles:!0,detail:n.data}))}}var Y=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){let t=e.target;t.hasAttribute(`ax-query`)&&G(t),Y.unobserve(t)}})});function X(e){e.querySelectorAll(`[\\:ax-query], [\\:ax-mutate]`).forEach(e=>{if(e.hasAttribute(`:ax-query`)){let t=C(e.getAttribute(`:ax-query`),k(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=C(e.getAttribute(`:ax-mutate`),k(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function te(e=document){X(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e,n=t.getAttribute(`ax-query`);if(!n)return;let r=W(t,n);if(r){let e=`${r.target}:${JSON.stringify(r.args)}`;try{let n=sessionStorage.getItem(`atmx_cache_${e}`);n&&A(t,{state:`data`,data:JSON.parse(n),source:`cache`,isFetching:!0})}catch{}}})}function Z(e=document){X(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e;A(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?G(t):n===`intersect`?Y.observe(t):t.addEventListener(n,e=>{e.preventDefault(),G(t)})}),e.querySelectorAll(`[ax-mutate]`).forEach(e=>{let t=e;A(t,{});let n=t.tagName===`FORM`?`submit`:`click`;t.addEventListener(n,e=>{(t.tagName===`A`||t.tagName===`BUTTON`||t.tagName===`FORM`)&&e.preventDefault(),K(t)})}),e.querySelectorAll(`[ax-trigger="refresh"]`).forEach(e=>{let t=e;t.addEventListener(`click`,e=>{e.preventDefault();let n=t.closest(`[ax-query]`);if(n){let e=W(n,n.getAttribute(`ax-query`));if(e&&o(e.target)){let t=`${e.target}:${JSON.stringify(e.args)}`,r=N.get(t);r?r.fetch(!0):G(n)}}})})}function ne(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&Z(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var re=class extends HTMLElement{constructor(){super()}connectedCallback(){let e=this.getAttribute(`loading-text`)||`Initializing...`,t=this.getAttribute(`ready-text`)||`Online`,n=this.getAttribute(`error-text`)||`Failed to Connect`;this.renderState(`loading`,e,`text-amber-500 animate-pulse`),document.addEventListener(`atmx:ready`,()=>{this.renderState(`ready`,t,`text-green-600`)}),document.addEventListener(`atmx:error`,e=>{let t=e;t.detail&&t.detail.stage===`runtime`&&this.renderState(`error`,`${n}: ${t.detail.message}`,`text-red-600`)})}renderState(e,t,n){this.setAttribute(`data-state`,e);let r=this.querySelectorAll(`[data-ax-when]`);r.length>0?r.forEach(t=>{t.getAttribute(`data-ax-when`)===e?t.removeAttribute(`hidden`):t.setAttribute(`hidden`,``)}):(this.innerText=t,this.getAttribute(`class`)||(this.className=`text-xs font-bold ${n}`))}};typeof window<`u`&&!customElements.get(`ax-engine-status`)&&customElements.define(`ax-engine-status`,re);var Q=`0.126.0`,$=new class{version=Q;initialized=!1;debug=!1;async init(e){if(this.initialized)return{ok:!0,contracts:{},initDurationMs:0};let t=await _(e);return t.ok?(this.debug=e.debug||!1,ne(),Z(document.body),this.initialized=!0,this.debug&&console.log(`%c🚀 ATMX Debug Mode: Enabled`,`color: #2563eb; font-weight: bold;`),console.log(`✅ ATMX v${this.version} Online (${t.initDurationMs}ms). Reactive Engine Started.`),document.dispatchEvent(new CustomEvent(`atmx:ready`,{detail:t}))):(console.error(`❌ ATMX Initialization Failed:`,t.error),document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:t.error}))),t}hydrate(e){let t=document;e&&(t=typeof e==`string`?document.querySelector(e):e),t&&te(t)}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&G(t)}on(e,t){document.addEventListener(`atmx:${e}`,t)}setAuthToken(e,t,n){v(e,t,n)}setNamespaceAuthToken(e,t){y(e,t)}setGlobalAuthToken(e){S(e)}sendStreamMessage(e,t){x(e,t)}clearAuthToken(e,t){b(e,t)}connect(e){let t=W(null,e);if(!t)return;let n=o(t.target);if(!n)return;let r=`${n.namespace}:${n.id}:${JSON.stringify(t.args)}`,i=N.get(r);i||(i=new M(r,n,t.args),N.set(r,i)),i.fetch()}disconnect(e){let t=W(null,e);if(!t)return;let r=o(t.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(t.args)}`,a=N.get(i);a&&(a.currentReqId&&n.delete(a.currentReqId),N.delete(i),this.debug&&console.log(`🔌 ATMX Disconnected Stream: ${e}`))}send(e,t){let n=W(null,e);if(!n)return;let r=o(n.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(n.args)}`,a=N.get(i);a&&a.currentReqId?x(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}mutate(e,t,n){return L(e,t,n)}query(e,t={}){return I(e,t)}getCachedQueryData(e,t={}){return F(e,t)}mutateBytes(e,t,n,r={}){return L(e,t,{},{rawBody:n,headers:r})}invalidate(e,t){R(e,t)}setQueryData(e,t,n){z(e,t,n)}clearCache(e){B(e)}purgeCache(e){B(e,!1)}onError(e){document.addEventListener(`atmx:error`,t=>{e(t.detail)})}};typeof window<`u`&&(window.atmx=$),e.ATMX_VERSION=Q,e.allocBytes=m,e.allocString=h,e.atmx=$,e.buildRequestPath=s,e.clearAuthToken=b,e.initWasm=_,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=x,e.setAuthToken=v,e.setGlobalAuthToken=S,Object.defineProperty(e,`wasmEngine`,{enumerable:!0,get:function(){return d}})});
|
package/dist/core/query.d.ts
CHANGED
|
@@ -2,6 +2,19 @@ import { Route } from './router';
|
|
|
2
2
|
import { AtmxContextData } from './context';
|
|
3
3
|
export declare let globalReqCounter: number;
|
|
4
4
|
type Listener = (state: Partial<AtmxContextData>) => void;
|
|
5
|
+
export interface ProgrammaticQuery {
|
|
6
|
+
/** The immediately available cache snapshot, if this endpoint has one. */
|
|
7
|
+
getSnapshot(): Partial<AtmxContextData>;
|
|
8
|
+
/**
|
|
9
|
+
* Receives the cache value synchronously and every later revalidation
|
|
10
|
+
* result. The returned function is safe to call more than once.
|
|
11
|
+
*/
|
|
12
|
+
subscribe(listener: Listener): () => void;
|
|
13
|
+
/** Revalidate while retaining the current cache value on screen. */
|
|
14
|
+
refresh(): void;
|
|
15
|
+
/** Stops receiving updates; it never clears the shared Axiom cache. */
|
|
16
|
+
dispose(): void;
|
|
17
|
+
}
|
|
5
18
|
export declare class ActiveQuery {
|
|
6
19
|
key: string;
|
|
7
20
|
route: Route;
|
|
@@ -10,11 +23,23 @@ export declare class ActiveQuery {
|
|
|
10
23
|
listeners: Set<Listener>;
|
|
11
24
|
currentReqId: number | null;
|
|
12
25
|
constructor(key: string, route: Route, args: Record<string, any>);
|
|
13
|
-
subscribe(listener: Listener): void;
|
|
26
|
+
subscribe(listener: Listener): () => void;
|
|
14
27
|
update(newState: Partial<AtmxContextData>): void;
|
|
15
28
|
fetch(force?: boolean): void;
|
|
16
29
|
}
|
|
17
30
|
export declare const queryRegistry: Map<string, ActiveQuery>;
|
|
31
|
+
/**
|
|
32
|
+
* Reads only ATMX's contract cache. Applications should use this instead of
|
|
33
|
+
* implementing a second localStorage cache for endpoint responses.
|
|
34
|
+
*/
|
|
35
|
+
export declare function getCachedQueryData(routeKey: string, args?: Record<string, any>): any | null;
|
|
36
|
+
/**
|
|
37
|
+
* Starts a programmatic contract query with the exact same cache, runtime
|
|
38
|
+
* policy, authentication transport, and stale-while-revalidate behaviour as
|
|
39
|
+
* an `ax-query` element. This is intentionally not a mutation wrapper: GET
|
|
40
|
+
* endpoint cache policies are now honoured for imperative dashboard code.
|
|
41
|
+
*/
|
|
42
|
+
export declare function executeProgrammaticQuery(routeKey: string, args?: Record<string, any>): ProgrammaticQuery;
|
|
18
43
|
export interface ProgrammaticMutationOptions {
|
|
19
44
|
/** Raw request bytes for endpoints such as contract uploads. */
|
|
20
45
|
rawBody?: Uint8Array;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AtmxConfig, AxiomError, InitResult } from './core/types';
|
|
2
|
-
export declare const ATMX_VERSION = "0.
|
|
2
|
+
export declare const ATMX_VERSION = "0.126.0";
|
|
3
3
|
declare class ATMX {
|
|
4
4
|
version: string;
|
|
5
5
|
initialized: boolean;
|
|
@@ -22,6 +22,13 @@ declare class ATMX {
|
|
|
22
22
|
disconnect(rpcCall: string): void;
|
|
23
23
|
send(rpcCall: string, payload: any): void;
|
|
24
24
|
mutate(rpcCall: string, args?: Record<string, any>, payload?: any): Promise<any>;
|
|
25
|
+
/**
|
|
26
|
+
* Imperative counterpart to `ax-query`. It preserves an endpoint's Axiom
|
|
27
|
+
* cache policy, including cache-first stale-while-revalidate rendering.
|
|
28
|
+
*/
|
|
29
|
+
query(rpcCall: string, args?: Record<string, any>): import('./core/query').ProgrammaticQuery;
|
|
30
|
+
/** Returns the persisted ATMX cache snapshot without issuing a request. */
|
|
31
|
+
getCachedQueryData(rpcCall: string, args?: Record<string, any>): any;
|
|
25
32
|
/**
|
|
26
33
|
* Calls a contract endpoint with an opaque request body while retaining the
|
|
27
34
|
* same contract-driven authentication and cookie-session transport.
|