atmx-web 0.135.0 → 0.137.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/README.md +37 -0
- package/dist/atmx.es.js +120 -75
- package/dist/atmx.umd.js +2 -2
- package/dist/core/sdk-placeholder.d.ts +15 -0
- package/dist/index.d.ts +16 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# ATMX browser startup
|
|
2
|
+
|
|
3
|
+
Treat Axiom startup as an explicit async boundary: load the generated SDK,
|
|
4
|
+
await `atmx.init`, then mount application code that queries or mutates the
|
|
5
|
+
contract. `atmx.init` is idempotent, and `atmx.whenReady()` lets independently
|
|
6
|
+
loaded components await the same initialization.
|
|
7
|
+
|
|
8
|
+
```ts
|
|
9
|
+
import { atmx } from "@axiomcore/atmx";
|
|
10
|
+
import { sdk, AxiomDefaultConfig } from "./generated/sdk";
|
|
11
|
+
|
|
12
|
+
const result = await atmx.init(AxiomDefaultConfig);
|
|
13
|
+
if (!result.ok) throw new Error(result.error?.message || "Axiom failed to start");
|
|
14
|
+
|
|
15
|
+
mountApplication({ sdk });
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
For a declarative framework loaded by a regular script tag (including Alpine),
|
|
19
|
+
install the synchronous facade immediately after ATMX and before the framework
|
|
20
|
+
hydrates. It only produces canonical route strings; the generated module
|
|
21
|
+
replaces it with the typed SDK when it finishes loading.
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<script src="/assets/atmx.umd.js"></script>
|
|
25
|
+
<script>atmx.installSDKPlaceholder()</script>
|
|
26
|
+
<script type="module">
|
|
27
|
+
import { AxiomDefaultConfig } from "/generated/sdk.js";
|
|
28
|
+
const result = await atmx.init(AxiomDefaultConfig);
|
|
29
|
+
if (!result.ok) console.error(result.error);
|
|
30
|
+
</script>
|
|
31
|
+
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Do not rely on browser script timing, a cache being warm, or an Alpine-specific
|
|
35
|
+
startup hook. Awaiting the runtime for imperative code and installing the
|
|
36
|
+
facade before declarative hydration keeps the contract interface stable across
|
|
37
|
+
frameworks and CDN latency.
|
package/dist/atmx.es.js
CHANGED
|
@@ -152,7 +152,7 @@ function m(e) {
|
|
|
152
152
|
}
|
|
153
153
|
function h(e) {
|
|
154
154
|
if (e.wasmUrl) return e.wasmUrl;
|
|
155
|
-
let t = `https://atmx.axiomcore.dev/${e.engineVersion || "v0.
|
|
155
|
+
let t = `https://atmx.axiomcore.dev/${e.engineVersion || "v0.137.0"}/axiom_runtime.wasm`;
|
|
156
156
|
return e.disableCacheBuster || (t += `?t=${Date.now()}`), t;
|
|
157
157
|
}
|
|
158
158
|
function g(e, t) {
|
|
@@ -296,7 +296,7 @@ function E(e, t) {
|
|
|
296
296
|
function D(e, t, n, r) {
|
|
297
297
|
if (!(!n && (e.hasAttribute("ax-query") || e.hasAttribute("ax-mutate"))) && !(!n && e.hasAttribute("data-ax-clone-of"))) {
|
|
298
298
|
if (e.hasAttribute("ax-for")) {
|
|
299
|
-
|
|
299
|
+
ee(e, t, r);
|
|
300
300
|
return;
|
|
301
301
|
}
|
|
302
302
|
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") && (w(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")) {
|
|
@@ -325,7 +325,7 @@ function D(e, t, n, r) {
|
|
|
325
325
|
});
|
|
326
326
|
}
|
|
327
327
|
}
|
|
328
|
-
function
|
|
328
|
+
function ee(e, t, n) {
|
|
329
329
|
e.style.display = "none", e.hasAttribute("data-ax-for-id") || e.setAttribute("data-ax-for-id", Math.random().toString(36).substr(2, 9));
|
|
330
330
|
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+(.+)$/);
|
|
331
331
|
if (!i) return;
|
|
@@ -353,22 +353,22 @@ function O(e, t, n) {
|
|
|
353
353
|
}
|
|
354
354
|
//#endregion
|
|
355
355
|
//#region src/core/context.ts
|
|
356
|
-
var
|
|
357
|
-
function
|
|
358
|
-
return
|
|
356
|
+
var O = /* @__PURE__ */ new WeakMap();
|
|
357
|
+
function k(e) {
|
|
358
|
+
return O.has(e) || O.set(e, {
|
|
359
359
|
state: "idle",
|
|
360
360
|
isFetching: !1,
|
|
361
361
|
isMutating: !1,
|
|
362
362
|
source: null,
|
|
363
363
|
data: null,
|
|
364
364
|
error: null
|
|
365
|
-
}),
|
|
365
|
+
}), O.get(e);
|
|
366
366
|
}
|
|
367
|
-
function
|
|
367
|
+
function A(e) {
|
|
368
368
|
let t = e.parentElement;
|
|
369
369
|
for (; t;) {
|
|
370
370
|
if (t.hasAttribute("ax-query") || t.hasAttribute("ax-mutate")) {
|
|
371
|
-
let e =
|
|
371
|
+
let e = O.get(t);
|
|
372
372
|
if (e && e.data) return e.data;
|
|
373
373
|
}
|
|
374
374
|
t = t.parentElement;
|
|
@@ -376,8 +376,8 @@ function ee(e) {
|
|
|
376
376
|
return {};
|
|
377
377
|
}
|
|
378
378
|
function j(e, t) {
|
|
379
|
-
let n =
|
|
380
|
-
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),
|
|
379
|
+
let n = k(e);
|
|
380
|
+
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), E(e, n);
|
|
381
381
|
}
|
|
382
382
|
//#endregion
|
|
383
383
|
//#region src/core/query.ts
|
|
@@ -465,7 +465,7 @@ var M = 0, N = class {
|
|
|
465
465
|
function F(e, t = {}) {
|
|
466
466
|
return `${e}:${JSON.stringify(t)}`;
|
|
467
467
|
}
|
|
468
|
-
function
|
|
468
|
+
function I(e, t = {}) {
|
|
469
469
|
let n = F(e, t), r = P.get(n);
|
|
470
470
|
if (r?.state.data !== null && r?.state.data !== void 0) return r.state.data;
|
|
471
471
|
try {
|
|
@@ -475,7 +475,7 @@ function te(e, t = {}) {
|
|
|
475
475
|
return null;
|
|
476
476
|
}
|
|
477
477
|
}
|
|
478
|
-
function
|
|
478
|
+
function L(e, t = {}) {
|
|
479
479
|
let n = a(e);
|
|
480
480
|
if (!n) throw Error(`ATMX Route not found: ${e}`);
|
|
481
481
|
let r = F(e, t), i = P.get(r);
|
|
@@ -496,7 +496,7 @@ function ne(e, t = {}) {
|
|
|
496
496
|
}
|
|
497
497
|
};
|
|
498
498
|
}
|
|
499
|
-
function
|
|
499
|
+
function R(n, r = {}, i = {}, s = {}) {
|
|
500
500
|
return new Promise((c, l) => {
|
|
501
501
|
let d = a(n);
|
|
502
502
|
if (!d) return l(/* @__PURE__ */ Error(`ATMX Route not found: ${n}`));
|
|
@@ -524,7 +524,7 @@ function I(n, r = {}, i = {}, s = {}) {
|
|
|
524
524
|
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);
|
|
525
525
|
});
|
|
526
526
|
}
|
|
527
|
-
function
|
|
527
|
+
function z(e, t) {
|
|
528
528
|
let [n, r] = e.split("."), i = `atmx_cache_${e}`;
|
|
529
529
|
t && Object.keys(t).length > 0 && (i += `:${JSON.stringify(t)}`), Object.keys(sessionStorage).forEach((e) => {
|
|
530
530
|
(e === i || !t && e.startsWith(i + ":")) && sessionStorage.removeItem(e);
|
|
@@ -532,7 +532,7 @@ function L(e, t) {
|
|
|
532
532
|
e.route.namespace === n && e.route.name === r && (!t || Object.keys(t).length === 0 || JSON.stringify(e.args) === JSON.stringify(t)) && e.fetch(!0);
|
|
533
533
|
});
|
|
534
534
|
}
|
|
535
|
-
function
|
|
535
|
+
function B(e, t = {}, n) {
|
|
536
536
|
let r = F(e, t);
|
|
537
537
|
try {
|
|
538
538
|
sessionStorage.setItem(`atmx_cache_${r}`, JSON.stringify(n));
|
|
@@ -546,7 +546,7 @@ function R(e, t = {}, n) {
|
|
|
546
546
|
error: null
|
|
547
547
|
});
|
|
548
548
|
}
|
|
549
|
-
function
|
|
549
|
+
function V(e, t = !0) {
|
|
550
550
|
let n = e ? `atmx_cache_${e}.` : "atmx_cache_";
|
|
551
551
|
Object.keys(sessionStorage).forEach((e) => {
|
|
552
552
|
e.startsWith(n) && sessionStorage.removeItem(e);
|
|
@@ -562,23 +562,23 @@ function z(e, t = !0) {
|
|
|
562
562
|
}
|
|
563
563
|
//#endregion
|
|
564
564
|
//#region src/dom/lifecycle.ts
|
|
565
|
-
var
|
|
566
|
-
function
|
|
565
|
+
var H = 0;
|
|
566
|
+
function U(e, t) {
|
|
567
567
|
let n = `ax-on:${t}`;
|
|
568
|
-
e.hasAttribute(n) && T(e.getAttribute(n),
|
|
568
|
+
e.hasAttribute(n) && T(e.getAttribute(n), k(e));
|
|
569
569
|
}
|
|
570
|
-
function
|
|
570
|
+
function W(e, t, n) {
|
|
571
571
|
if (!$.debug) return;
|
|
572
572
|
let r = e === "OUT" ? "#7c3aed" : "#059669";
|
|
573
573
|
console.groupCollapsed(`%c${e === "OUT" ? "➔ WASM CALL" : "← WASM RESP"} [#${t}]`, `color: ${r}; font-weight: bold;`), console.log("Details:", n), console.groupEnd();
|
|
574
574
|
}
|
|
575
|
-
function
|
|
575
|
+
function G(e, t) {
|
|
576
576
|
let n = t.trim().match(/^([\w\.\-]+)(?:\((.*)\))?$/);
|
|
577
577
|
if (!n) return null;
|
|
578
578
|
let r = n[1], i = {};
|
|
579
579
|
if (n[2] && n[2].trim() !== "") try {
|
|
580
580
|
if (e) {
|
|
581
|
-
let t =
|
|
581
|
+
let t = k(e), r = t.data || A(e);
|
|
582
582
|
i = Function("$data", "$state", `return (${n[2]});`)(r ?? null, t) || {};
|
|
583
583
|
} else i = Function(`return (${n[2]});`)() || {};
|
|
584
584
|
} catch (e) {
|
|
@@ -589,10 +589,10 @@ function U(e, t) {
|
|
|
589
589
|
args: i
|
|
590
590
|
};
|
|
591
591
|
}
|
|
592
|
-
function
|
|
592
|
+
function K(e) {
|
|
593
593
|
let t = e.getAttribute("ax-query");
|
|
594
594
|
if (!t) return;
|
|
595
|
-
let n =
|
|
595
|
+
let n = G(e, t);
|
|
596
596
|
if (!n) return;
|
|
597
597
|
let r = a(n.target);
|
|
598
598
|
if (!r) {
|
|
@@ -604,30 +604,30 @@ function W(e) {
|
|
|
604
604
|
}
|
|
605
605
|
let i = `${n.target}:${JSON.stringify(n.args)}`, o = P.get(i);
|
|
606
606
|
o || (o = new N(i, r, n.args), P.set(i, o)), e._axListener || (e._axListener = (t) => {
|
|
607
|
-
j(e, t), (t.state === "data" || t.state === "error") && (
|
|
607
|
+
j(e, t), (t.state === "data" || t.state === "error") && (U(e, t.state), e.dispatchEvent(new CustomEvent(`atmx:${t.state}`, {
|
|
608
608
|
bubbles: !0,
|
|
609
609
|
detail: t.data || t.error
|
|
610
610
|
})));
|
|
611
611
|
}, o.subscribe(e._axListener)), o.fetch();
|
|
612
612
|
}
|
|
613
|
-
function
|
|
613
|
+
function q(e) {
|
|
614
614
|
let t = e.getAttribute("ax-mutate");
|
|
615
615
|
if (!t) return;
|
|
616
|
-
let n =
|
|
616
|
+
let n = G(e, t);
|
|
617
617
|
if (!n) return;
|
|
618
618
|
let r = a(n.target);
|
|
619
619
|
if (!r) {
|
|
620
620
|
console.error(`ATMX: Mutation route not found for target '${n.target}'. Check your ax-mutate attribute.`), j(e, {
|
|
621
621
|
state: "error",
|
|
622
622
|
error: { message: `Route not found: ${n.target}` }
|
|
623
|
-
}),
|
|
623
|
+
}), U(e, "error");
|
|
624
624
|
return;
|
|
625
625
|
}
|
|
626
626
|
j(e, {
|
|
627
627
|
state: "mutating",
|
|
628
628
|
error: null,
|
|
629
629
|
data: null
|
|
630
|
-
}),
|
|
630
|
+
}), U(e, "mutating");
|
|
631
631
|
let i = {};
|
|
632
632
|
e instanceof HTMLFormElement && new FormData(e).forEach((t, n) => {
|
|
633
633
|
let r = e.elements.namedItem(n), a = !1;
|
|
@@ -656,11 +656,11 @@ function G(e) {
|
|
|
656
656
|
for (let [t, n] of Object.entries(l)) e.append(t, String(n));
|
|
657
657
|
p = new TextEncoder().encode(e.toString());
|
|
658
658
|
} else p = new TextEncoder().encode(JSON.stringify(l));
|
|
659
|
-
|
|
659
|
+
te(e, r.namespace, r.id, r.method, s, p, r.isStream, !0, u, f);
|
|
660
660
|
}
|
|
661
|
-
function
|
|
662
|
-
let f = ++
|
|
663
|
-
|
|
661
|
+
function te(e, n, r, i, a, o, s, c, l = {}, d = !1) {
|
|
662
|
+
let f = ++H;
|
|
663
|
+
W("OUT", f, {
|
|
664
664
|
namespace: n,
|
|
665
665
|
endpointId: r,
|
|
666
666
|
method: i,
|
|
@@ -669,7 +669,7 @@ function K(e, n, r, i, a, o, s, c, l = {}, d = !1) {
|
|
|
669
669
|
payload: o.length > 0 ? d ? new TextDecoder().decode(o) : JSON.parse(new TextDecoder().decode(o)) : null
|
|
670
670
|
}), t.set(f, {
|
|
671
671
|
isStream: s,
|
|
672
|
-
onResponse: (t) =>
|
|
672
|
+
onResponse: (t) => ne(e, t, c, f),
|
|
673
673
|
onComplete: () => {
|
|
674
674
|
$.debug && console.log(`%c✔ Stream Complete [#${f}]`, "color: #94a3b8;");
|
|
675
675
|
}
|
|
@@ -677,8 +677,8 @@ function K(e, n, r, i, a, o, s, c, l = {}, d = !1) {
|
|
|
677
677
|
let h = m(n), g = m(i), _ = m(a), v = m(""), y = m(Object.keys(l).length > 0 ? JSON.stringify(l) : ""), b = p(o);
|
|
678
678
|
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);
|
|
679
679
|
}
|
|
680
|
-
function
|
|
681
|
-
if (
|
|
680
|
+
function ne(t, n, r, i) {
|
|
681
|
+
if (W("IN", i, {
|
|
682
682
|
eventType: e[n.eventType],
|
|
683
683
|
data: n.data,
|
|
684
684
|
error: n.error
|
|
@@ -688,7 +688,7 @@ function q(t, n, r, i) {
|
|
|
688
688
|
error: n.error,
|
|
689
689
|
isFetching: !1,
|
|
690
690
|
isMutating: !1
|
|
691
|
-
}),
|
|
691
|
+
}), U(t, "error"), t.dispatchEvent(new CustomEvent("atmx:error", {
|
|
692
692
|
bubbles: !0,
|
|
693
693
|
detail: n.error
|
|
694
694
|
}));
|
|
@@ -707,21 +707,21 @@ function q(t, n, r, i) {
|
|
|
707
707
|
}), r) {
|
|
708
708
|
let e = t.getAttribute("ax-invalidates");
|
|
709
709
|
e && e.split(",").map((e) => e.trim()).forEach((e) => {
|
|
710
|
-
let n = w(`\`${e}\``,
|
|
710
|
+
let n = w(`\`${e}\``, k(t)) || e;
|
|
711
711
|
$.invalidate(n);
|
|
712
712
|
});
|
|
713
713
|
let n = t.getAttribute("ax-store-token");
|
|
714
714
|
if (n) {
|
|
715
|
-
let e = w(n,
|
|
715
|
+
let e = w(n, k(t));
|
|
716
716
|
if (e) {
|
|
717
|
-
let n = a(
|
|
717
|
+
let n = a(G(t, t.getAttribute("ax-mutate")).target)?.namespace || "default", r = t.getAttribute("ax-token-target");
|
|
718
718
|
(r ? r.split(",").map((e) => e.trim()) : [n]).forEach((t) => {
|
|
719
719
|
$.setNamespaceAuthToken(t, e);
|
|
720
720
|
});
|
|
721
721
|
}
|
|
722
722
|
}
|
|
723
723
|
}
|
|
724
|
-
|
|
724
|
+
U(t, s), t.dispatchEvent(new CustomEvent(r ? "atmx:success" : "atmx:data", {
|
|
725
725
|
bubbles: !0,
|
|
726
726
|
detail: n.data
|
|
727
727
|
}));
|
|
@@ -733,27 +733,27 @@ var J = new IntersectionObserver((e) => {
|
|
|
733
733
|
e.forEach((e) => {
|
|
734
734
|
if (e.isIntersecting) {
|
|
735
735
|
let t = e.target;
|
|
736
|
-
t.hasAttribute("ax-query") &&
|
|
736
|
+
t.hasAttribute("ax-query") && K(t), J.unobserve(t);
|
|
737
737
|
}
|
|
738
738
|
});
|
|
739
739
|
});
|
|
740
740
|
function Y(e) {
|
|
741
741
|
e.querySelectorAll("[\\:ax-query], [\\:ax-mutate]").forEach((e) => {
|
|
742
742
|
if (e.hasAttribute(":ax-query")) {
|
|
743
|
-
let t = w(e.getAttribute(":ax-query"),
|
|
743
|
+
let t = w(e.getAttribute(":ax-query"), k(e));
|
|
744
744
|
t && e.setAttribute("ax-query", String(t)), e.removeAttribute(":ax-query");
|
|
745
745
|
}
|
|
746
746
|
if (e.hasAttribute(":ax-mutate")) {
|
|
747
|
-
let t = w(e.getAttribute(":ax-mutate"),
|
|
747
|
+
let t = w(e.getAttribute(":ax-mutate"), k(e));
|
|
748
748
|
t && e.setAttribute("ax-mutate", String(t)), e.removeAttribute(":ax-mutate");
|
|
749
749
|
}
|
|
750
750
|
});
|
|
751
751
|
}
|
|
752
|
-
function
|
|
752
|
+
function re(e = document) {
|
|
753
753
|
Y(e), e.querySelectorAll("[ax-query]").forEach((e) => {
|
|
754
754
|
let t = e, n = t.getAttribute("ax-query");
|
|
755
755
|
if (!n) return;
|
|
756
|
-
let r =
|
|
756
|
+
let r = G(t, n);
|
|
757
757
|
if (r) {
|
|
758
758
|
let e = `${r.target}:${JSON.stringify(r.args)}`;
|
|
759
759
|
try {
|
|
@@ -768,20 +768,20 @@ function X(e = document) {
|
|
|
768
768
|
}
|
|
769
769
|
});
|
|
770
770
|
}
|
|
771
|
-
function
|
|
771
|
+
function X(e = document) {
|
|
772
772
|
Y(e), e.querySelectorAll("[ax-query]").forEach((e) => {
|
|
773
773
|
let t = e;
|
|
774
774
|
j(t, {});
|
|
775
775
|
let n = t.getAttribute("ax-trigger") || "load";
|
|
776
|
-
n === "load" ?
|
|
777
|
-
e.preventDefault(),
|
|
776
|
+
n === "load" ? K(t) : n === "intersect" ? J.observe(t) : t.addEventListener(n, (e) => {
|
|
777
|
+
e.preventDefault(), K(t);
|
|
778
778
|
});
|
|
779
779
|
}), e.querySelectorAll("[ax-mutate]").forEach((e) => {
|
|
780
780
|
let t = e;
|
|
781
781
|
j(t, {});
|
|
782
782
|
let n = t.tagName === "FORM" ? "submit" : "click";
|
|
783
783
|
t.addEventListener(n, (e) => {
|
|
784
|
-
(t.tagName === "A" || t.tagName === "BUTTON" || t.tagName === "FORM") && e.preventDefault(),
|
|
784
|
+
(t.tagName === "A" || t.tagName === "BUTTON" || t.tagName === "FORM") && e.preventDefault(), q(t);
|
|
785
785
|
});
|
|
786
786
|
}), e.querySelectorAll("[ax-trigger=\"refresh\"]").forEach((e) => {
|
|
787
787
|
let t = e;
|
|
@@ -789,20 +789,20 @@ function Z(e = document) {
|
|
|
789
789
|
e.preventDefault();
|
|
790
790
|
let n = t.closest("[ax-query]");
|
|
791
791
|
if (n) {
|
|
792
|
-
let e =
|
|
792
|
+
let e = G(n, n.getAttribute("ax-query"));
|
|
793
793
|
if (e && a(e.target)) {
|
|
794
794
|
let t = `${e.target}:${JSON.stringify(e.args)}`, r = P.get(t);
|
|
795
|
-
r ? r.fetch(!0) :
|
|
795
|
+
r ? r.fetch(!0) : K(n);
|
|
796
796
|
}
|
|
797
797
|
}
|
|
798
798
|
});
|
|
799
799
|
});
|
|
800
800
|
}
|
|
801
|
-
function
|
|
801
|
+
function ie() {
|
|
802
802
|
new MutationObserver((e) => {
|
|
803
803
|
e.forEach((e) => {
|
|
804
804
|
e.addedNodes.forEach((e) => {
|
|
805
|
-
e instanceof HTMLElement &&
|
|
805
|
+
e instanceof HTMLElement && X(e);
|
|
806
806
|
});
|
|
807
807
|
});
|
|
808
808
|
}).observe(document.body, {
|
|
@@ -811,8 +811,38 @@ function re() {
|
|
|
811
811
|
});
|
|
812
812
|
}
|
|
813
813
|
//#endregion
|
|
814
|
+
//#region src/core/sdk-placeholder.ts
|
|
815
|
+
function ae(e) {
|
|
816
|
+
return e.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").toLowerCase();
|
|
817
|
+
}
|
|
818
|
+
function oe(e) {
|
|
819
|
+
return e && Object.keys(e).length > 0 ? JSON.stringify(e) : "";
|
|
820
|
+
}
|
|
821
|
+
function se(e, t) {
|
|
822
|
+
let n = `${e}.${ae(t)}`, r = ((e) => `${n}(${oe(e)})`), i = () => window.atmx;
|
|
823
|
+
return r.invalidate = (e) => i()?.invalidate(n, e), r.setData = (e, t) => i()?.setQueryData(n, t || {}, e), r.mutate = (e = {}, t) => i()?.mutate(n, t, e), r;
|
|
824
|
+
}
|
|
825
|
+
function ce(e) {
|
|
826
|
+
let t = /* @__PURE__ */ new Map();
|
|
827
|
+
return new Proxy({}, { get(n, r) {
|
|
828
|
+
if (typeof r != "string") return;
|
|
829
|
+
let i = t.get(r);
|
|
830
|
+
return i || (i = se(e, r), t.set(r, i)), i;
|
|
831
|
+
} });
|
|
832
|
+
}
|
|
833
|
+
function Z() {
|
|
834
|
+
let e = window;
|
|
835
|
+
if (e.sdk) return e.sdk;
|
|
836
|
+
let t = /* @__PURE__ */ new Map();
|
|
837
|
+
return e.sdk = new Proxy({}, { get(e, n) {
|
|
838
|
+
if (typeof n != "string") return;
|
|
839
|
+
let r = t.get(n);
|
|
840
|
+
return r || (r = ce(n), t.set(n, r)), r;
|
|
841
|
+
} }), e.sdk;
|
|
842
|
+
}
|
|
843
|
+
//#endregion
|
|
814
844
|
//#region src/dom/components/engine-status.ts
|
|
815
|
-
var
|
|
845
|
+
var le = class extends HTMLElement {
|
|
816
846
|
constructor() {
|
|
817
847
|
super();
|
|
818
848
|
}
|
|
@@ -833,29 +863,44 @@ var ie = class extends HTMLElement {
|
|
|
833
863
|
}) : (this.innerText = t, this.getAttribute("class") || (this.className = `text-xs font-bold ${n}`));
|
|
834
864
|
}
|
|
835
865
|
};
|
|
836
|
-
typeof window < "u" && !customElements.get("ax-engine-status") && customElements.define("ax-engine-status",
|
|
866
|
+
typeof window < "u" && !customElements.get("ax-engine-status") && customElements.define("ax-engine-status", le);
|
|
837
867
|
//#endregion
|
|
838
868
|
//#region src/index.ts
|
|
839
|
-
var Q = "0.
|
|
869
|
+
var Q = "0.137.0", $ = new class {
|
|
840
870
|
version = Q;
|
|
841
871
|
initialized = !1;
|
|
842
872
|
debug = !1;
|
|
873
|
+
initializing = null;
|
|
843
874
|
async init(e) {
|
|
844
|
-
|
|
875
|
+
return this.initialized ? {
|
|
845
876
|
ok: !0,
|
|
846
877
|
contracts: {},
|
|
847
878
|
initDurationMs: 0
|
|
848
|
-
}
|
|
879
|
+
} : (this.initializing ||= this.initialize(e).finally(() => {
|
|
880
|
+
this.initializing = null;
|
|
881
|
+
}), this.initializing);
|
|
882
|
+
}
|
|
883
|
+
whenReady() {
|
|
884
|
+
return this.initialized ? Promise.resolve({
|
|
885
|
+
ok: !0,
|
|
886
|
+
contracts: {},
|
|
887
|
+
initDurationMs: 0
|
|
888
|
+
}) : this.initializing ? this.initializing : Promise.reject(/* @__PURE__ */ Error("ATMX has not been initialized. Call and await atmx.init(config) before mounting your UI."));
|
|
889
|
+
}
|
|
890
|
+
installSDKPlaceholder() {
|
|
891
|
+
return Z();
|
|
892
|
+
}
|
|
893
|
+
async initialize(e) {
|
|
849
894
|
let t = await v(e);
|
|
850
|
-
return t.ok ? (this.debug = e.debug || !1,
|
|
895
|
+
return t.ok ? (this.debug = e.debug || !1, ie(), 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;
|
|
851
896
|
}
|
|
852
897
|
hydrate(e) {
|
|
853
898
|
let t = document;
|
|
854
|
-
e && (t = typeof e == "string" ? document.querySelector(e) : e), t &&
|
|
899
|
+
e && (t = typeof e == "string" ? document.querySelector(e) : e), t && re(t);
|
|
855
900
|
}
|
|
856
901
|
triggerQuery(e) {
|
|
857
902
|
let t = typeof e == "string" ? document.querySelector(e) : e;
|
|
858
|
-
t && t instanceof HTMLElement && t.hasAttribute("ax-query") &&
|
|
903
|
+
t && t instanceof HTMLElement && t.hasAttribute("ax-query") && K(t);
|
|
859
904
|
}
|
|
860
905
|
on(e, t) {
|
|
861
906
|
document.addEventListener(`atmx:${e}`, t);
|
|
@@ -876,7 +921,7 @@ var Q = "0.135.0", $ = new class {
|
|
|
876
921
|
x(e, t);
|
|
877
922
|
}
|
|
878
923
|
connect(e) {
|
|
879
|
-
let t =
|
|
924
|
+
let t = G(null, e);
|
|
880
925
|
if (!t) return;
|
|
881
926
|
let n = a(t.target);
|
|
882
927
|
if (!n) return;
|
|
@@ -884,7 +929,7 @@ var Q = "0.135.0", $ = new class {
|
|
|
884
929
|
i || (i = new N(r, n, t.args), P.set(r, i)), i.fetch();
|
|
885
930
|
}
|
|
886
931
|
disconnect(e) {
|
|
887
|
-
let n =
|
|
932
|
+
let n = G(null, e);
|
|
888
933
|
if (!n) return;
|
|
889
934
|
let r = a(n.target);
|
|
890
935
|
if (!r) return;
|
|
@@ -892,7 +937,7 @@ var Q = "0.135.0", $ = new class {
|
|
|
892
937
|
o && (o.currentReqId && t.delete(o.currentReqId), P.delete(i), this.debug && console.log(`🔌 ATMX Disconnected Stream: ${e}`));
|
|
893
938
|
}
|
|
894
939
|
send(e, t) {
|
|
895
|
-
let n =
|
|
940
|
+
let n = G(null, e);
|
|
896
941
|
if (!n) return;
|
|
897
942
|
let r = a(n.target);
|
|
898
943
|
if (!r) return;
|
|
@@ -900,31 +945,31 @@ var Q = "0.135.0", $ = new class {
|
|
|
900
945
|
o && o.currentReqId ? S(o.currentReqId, t) : console.warn(`ATMX: Cannot send message, stream not active for ${e}`);
|
|
901
946
|
}
|
|
902
947
|
mutate(e, t, n) {
|
|
903
|
-
return
|
|
948
|
+
return R(e, t, n);
|
|
904
949
|
}
|
|
905
950
|
query(e, t = {}) {
|
|
906
|
-
return
|
|
951
|
+
return L(e, t);
|
|
907
952
|
}
|
|
908
953
|
getCachedQueryData(e, t = {}) {
|
|
909
|
-
return
|
|
954
|
+
return I(e, t);
|
|
910
955
|
}
|
|
911
956
|
mutateBytes(e, t, n, r = {}) {
|
|
912
|
-
return
|
|
957
|
+
return R(e, t, {}, {
|
|
913
958
|
rawBody: n,
|
|
914
959
|
headers: r
|
|
915
960
|
});
|
|
916
961
|
}
|
|
917
962
|
invalidate(e, t) {
|
|
918
|
-
|
|
963
|
+
z(e, t);
|
|
919
964
|
}
|
|
920
965
|
setQueryData(e, t, n) {
|
|
921
|
-
|
|
966
|
+
B(e, t, n);
|
|
922
967
|
}
|
|
923
968
|
clearCache(e) {
|
|
924
|
-
|
|
969
|
+
V(e);
|
|
925
970
|
}
|
|
926
971
|
purgeCache(e) {
|
|
927
|
-
|
|
972
|
+
V(e, !1);
|
|
928
973
|
}
|
|
929
974
|
onError(e) {
|
|
930
975
|
document.addEventListener("atmx:error", (t) => {
|
|
@@ -934,4 +979,4 @@ var Q = "0.135.0", $ = new class {
|
|
|
934
979
|
}();
|
|
935
980
|
typeof window < "u" && (window.atmx = $);
|
|
936
981
|
//#endregion
|
|
937
|
-
export { Q as ATMX_VERSION, p as allocBytes, m as allocString, $ as atmx, o as buildRequestPath, x as clearAuthToken, v as initWasm, t as pendingRequests, a as resolveRoute, S as sendStreamMessage, y as setAuthToken, C as setGlobalAuthToken, u as wasmEngine };
|
|
982
|
+
export { Q as ATMX_VERSION, p as allocBytes, m as allocString, $ as atmx, o as buildRequestPath, x as clearAuthToken, v as initWasm, Z as installSDKPlaceholder, t as pendingRequests, a as resolveRoute, S as sendStreamMessage, y as setAuthToken, C as setGlobalAuthToken, u as wasmEngine };
|
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=T(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=>{O(e,t,!1,r)})}}function k(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=T(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(T(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),O(m,t,!0,c),f.push(m)}),u.forEach(e=>{f.includes(e)||e.remove()})}var A=new WeakMap;function j(e){return A.has(e)||A.set(e,{state:`idle`,isFetching:!1,isMutating:!1,source:null,data:null,error:null}),A.get(e)}function M(e){let t=e.parentElement;for(;t;){if(t.hasAttribute(`ax-query`)||t.hasAttribute(`ax-mutate`)){let e=A.get(t);if(e&&e.data)return e.data}t=t.parentElement}return{}}function N(e,t){let n=j(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),A.set(e,n),D(e,n)}var P=0,F=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=++P;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)}},I=new Map;function L(e,t={}){return`${e}:${JSON.stringify(t)}`}function R(e,t={}){let n=L(e,t),r=I.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 z(e,t={}){let n=o(e);if(!n)throw Error(`ATMX Route not found: ${e}`);let r=L(e,t),i=I.get(r);i||(i=new F(r,n,t),I.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 B(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=++P,{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 V(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)}),I.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 H(e,t={},n){let r=L(e,t);try{sessionStorage.setItem(`atmx_cache_${r}`,JSON.stringify(n))}catch{}let i=I.get(r);i&&i.update({state:`data`,source:`cache`,isFetching:!1,data:n,error:null})}function U(e,t=!0){let n=e?`atmx_cache_${e}.`:`atmx_cache_`;Object.keys(sessionStorage).forEach(e=>{e.startsWith(n)&&sessionStorage.removeItem(e)}),I.forEach(n=>{(!e||n.route.namespace===e)&&(n.update({state:`idle`,source:null,data:null,error:null,isFetching:!1}),t&&n.fetch(!0))})}var W=0;function G(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&E(e.getAttribute(n),j(e))}function K(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 q(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=j(e),r=t.data||M(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 J(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=q(e,t);if(!n)return;let r=o(n.target);if(!r){N(e,{state:`error`,error:{message:`Route not found: ${n.target}`}});return}let i=`${n.target}:${JSON.stringify(n.args)}`,a=I.get(i);a||(a=new F(i,r,n.args),I.set(i,a)),e._axListener||(e._axListener=t=>{N(e,t),(t.state===`data`||t.state===`error`)&&(G(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function ee(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=q(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.`),N(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),G(e,`error`);return}N(e,{state:`mutating`,error:null,data:null}),G(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));te(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function te(e,t,r,i,a,o,s,c,l={},u=!1){let f=++W;K(`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=>ne(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 ne(e,n,r,i){if(K(`IN`,i,{eventType:t[n.eventType],data:n.data,error:n.error}),n.eventType===t.Error){N(e,{state:`error`,error:n.error,isFetching:!1,isMutating:!1}),G(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(N(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=T(`\`${t}\``,j(e))||t;$.invalidate(n)});let n=e.getAttribute(`ax-store-token`);if(n){let t=T(n,j(e));if(t){let n=o(q(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)})}}}G(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`)&&J(t),Y.unobserve(t)}})});function X(e){e.querySelectorAll(`[\\:ax-query], [\\:ax-mutate]`).forEach(e=>{if(e.hasAttribute(`:ax-query`)){let t=T(e.getAttribute(`:ax-query`),j(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=T(e.getAttribute(`:ax-mutate`),j(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function re(e=document){X(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e,n=t.getAttribute(`ax-query`);if(!n)return;let r=q(t,n);if(r){let e=`${r.target}:${JSON.stringify(r.args)}`;try{let n=sessionStorage.getItem(`atmx_cache_${e}`);n&&N(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;N(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?J(t):n===`intersect`?Y.observe(t):t.addEventListener(n,e=>{e.preventDefault(),J(t)})}),e.querySelectorAll(`[ax-mutate]`).forEach(e=>{let t=e;N(t,{});let n=t.tagName===`FORM`?`submit`:`click`;t.addEventListener(n,e=>{(t.tagName===`A`||t.tagName===`BUTTON`||t.tagName===`FORM`)&&e.preventDefault(),ee(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=q(n,n.getAttribute(`ax-query`));if(e&&o(e.target)){let t=`${e.target}:${JSON.stringify(e.args)}`,r=I.get(t);r?r.fetch(!0):J(n)}}})})}function ie(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&Z(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var ae=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`,ae);var Q=`0.135.0`,$=new class{version=Q;initialized=!1;debug=!1;async init(e){if(this.initialized)return{ok:!0,contracts:{},initDurationMs:0};let t=await y(e);return t.ok?(this.debug=e.debug||!1,ie(),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&&re(t)}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&J(t)}on(e,t){document.addEventListener(`atmx:${e}`,t)}setAuthToken(e,t,n){b(e,t,n)}setNamespaceAuthToken(e,t){x(e,t)}setGlobalAuthToken(e){w(e)}sendStreamMessage(e,t){C(e,t)}clearAuthToken(e,t){S(e,t)}connect(e){let t=q(null,e);if(!t)return;let n=o(t.target);if(!n)return;let r=`${n.namespace}:${n.id}:${JSON.stringify(t.args)}`,i=I.get(r);i||(i=new F(r,n,t.args),I.set(r,i)),i.fetch()}disconnect(e){let t=q(null,e);if(!t)return;let r=o(t.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(t.args)}`,a=I.get(i);a&&(a.currentReqId&&n.delete(a.currentReqId),I.delete(i),this.debug&&console.log(`🔌 ATMX Disconnected Stream: ${e}`))}send(e,t){let n=q(null,e);if(!n)return;let r=o(n.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(n.args)}`,a=I.get(i);a&&a.currentReqId?C(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}mutate(e,t,n){return B(e,t,n)}query(e,t={}){return z(e,t)}getCachedQueryData(e,t={}){return R(e,t)}mutateBytes(e,t,n,r={}){return B(e,t,{},{rawBody:n,headers:r})}invalidate(e,t){V(e,t)}setQueryData(e,t,n){H(e,t,n)}clearCache(e){U(e)}purgeCache(e){U(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=S,e.initWasm=y,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=C,e.setAuthToken=b,e.setGlobalAuthToken=w,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.137.0`}/axiom_runtime.wasm`;return e.disableCacheBuster||(t+=`?t=${Date.now()}`),t}function _(e,t){let n=e?.trim(),r=t?.trim();if(!(!n||!r))return{signature:n,publicKey:r}}async function v(e,t){let n=_(e.contractSignature,e.contractPublicKey);if(n)return n;let r=_(t.headers.get(`X-Axiom-Signature`)??void 0,t.headers.get(`X-Axiom-Public-Key`)??void 0);if(r)return r}async function y(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=await v(r,i),c=0;try{let e=new TextDecoder().decode(o),n=JSON.parse(e),r=n?.ir?.endpoints;r&&(c=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 l=new Uint8Array(o),u=m(l),p=h(t),g=h(r.baseUrl),_=h(s?.signature||``),y=h(s?.publicKey||``),b=d.axiom_wasm_load_contract(p.ptr,p.len,g.ptr,g.len,u,l.length,_.ptr,_.len,y.ptr,y.len);if(d.axiom_free_memory(u,l.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(y.ptr,y.len),b!==0&&b!==-1)throw Error(`Load error (Code: ${b})`);b===-1&&e.debug&&console.warn(`ATMX: '${t}' is running with an unverified contract; telemetry is disabled. Pull the contract with AxiomCore or configure a valid proof.`),e.debug&&console.log(`%c🔒 Axiom Contract Loaded: ${t} (${c} endpoints)`,`color: #10b981; font-weight: bold;`),n.contracts[t]={loaded:!0,endpointCount:c},document.dispatchEvent(new CustomEvent(`atmx:contract-loaded`,{detail:{namespace:t,endpointCount:c}}))}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 b(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 x(e,t){if(!d)return;let n=new Set(l(e).flatMap(p));for(let r of n)b(e,r,t)}function S(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 C(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 w(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)b(n,t,e)}function T(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 E(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 ee(e,t){D(e,t,!0,{})}function D(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`)){te(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`)&&(T(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=T(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=T(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=>{D(e,t,!1,r)})}}function te(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=T(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(T(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),D(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),ee(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){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=++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,t={}){return`${e}:${JSON.stringify(t)}`}function ne(e,t={}){let n=F(e,t),r=P.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 re(e,t={}){let n=o(e);if(!n)throw Error(`ATMX Route not found: ${e}`);let r=F(e,t),i=P.get(r);i||(i=new N(r,n,t),P.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 I(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 L(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 R(e,t={},n){let r=F(e,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 z(e,t=!0){let n=e?`atmx_cache_${e}.`:`atmx_cache_`;Object.keys(sessionStorage).forEach(e=>{e.startsWith(n)&&sessionStorage.removeItem(e)}),P.forEach(n=>{(!e||n.route.namespace===e)&&(n.update({state:`idle`,source:null,data:null,error:null,isFetching:!1}),t&&n.fetch(!0))})}var ie=0;function B(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&E(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=++ie;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=T(`\`${t}\``,k(e))||t;$.invalidate(n)});let n=e.getAttribute(`ax-store-token`);if(n){let t=T(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=T(e.getAttribute(`:ax-query`),k(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=T(e.getAttribute(`:ax-mutate`),k(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function ae(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 Y(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 oe(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&Y(e)})})}).observe(document.body,{childList:!0,subtree:!0})}function se(e){return e.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).replace(/([A-Z])([A-Z][a-z])/g,`$1_$2`).toLowerCase()}function ce(e){return e&&Object.keys(e).length>0?JSON.stringify(e):``}function le(e,t){let n=`${e}.${se(t)}`,r=(e=>`${n}(${ce(e)})`),i=()=>window.atmx;return r.invalidate=e=>i()?.invalidate(n,e),r.setData=(e,t)=>i()?.setQueryData(n,t||{},e),r.mutate=(e={},t)=>i()?.mutate(n,t,e),r}function X(e){let t=new Map;return new Proxy({},{get(n,r){if(typeof r!=`string`)return;let i=t.get(r);return i||(i=le(e,r),t.set(r,i)),i}})}function Z(){let e=window;if(e.sdk)return e.sdk;let t=new Map;return e.sdk=new Proxy({},{get(e,n){if(typeof n!=`string`)return;let r=t.get(n);return r||(r=X(n),t.set(n,r)),r}}),e.sdk}var ue=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`,ue);var Q=`0.137.0`,$=new class{version=Q;initialized=!1;debug=!1;initializing=null;async init(e){return this.initialized?{ok:!0,contracts:{},initDurationMs:0}:(this.initializing||=this.initialize(e).finally(()=>{this.initializing=null}),this.initializing)}whenReady(){return this.initialized?Promise.resolve({ok:!0,contracts:{},initDurationMs:0}):this.initializing?this.initializing:Promise.reject(Error(`ATMX has not been initialized. Call and await atmx.init(config) before mounting your UI.`))}installSDKPlaceholder(){return Z()}async initialize(e){let t=await y(e);return t.ok?(this.debug=e.debug||!1,oe(),Y(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&&ae(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){b(e,t,n)}setNamespaceAuthToken(e,t){x(e,t)}setGlobalAuthToken(e){w(e)}sendStreamMessage(e,t){C(e,t)}clearAuthToken(e,t){S(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?C(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}mutate(e,t,n){return I(e,t,n)}query(e,t={}){return re(e,t)}getCachedQueryData(e,t={}){return ne(e,t)}mutateBytes(e,t,n,r={}){return I(e,t,{},{rawBody:n,headers:r})}invalidate(e,t){L(e,t)}setQueryData(e,t,n){R(e,t,n)}clearCache(e){z(e)}purgeCache(e){z(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=S,e.initWasm=y,e.installSDKPlaceholder=Z,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=C,e.setAuthToken=b,e.setGlobalAuthToken=w,Object.defineProperty(e,`wasmEngine`,{enumerable:!0,get:function(){return d}})});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type RouteFunction = ((args?: Record<string, unknown>) => string) & {
|
|
2
|
+
invalidate: (args?: Record<string, unknown>) => void;
|
|
3
|
+
setData: (data: unknown, args?: Record<string, unknown>) => void;
|
|
4
|
+
mutate: (payload?: unknown, args?: Record<string, unknown>) => Promise<unknown> | undefined;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Makes `window.sdk.<namespace>.<operation>()` safe before the generated SDK
|
|
8
|
+
* module has loaded. The generated SDK always replaces this value with its
|
|
9
|
+
* typed implementation once its module executes.
|
|
10
|
+
*
|
|
11
|
+
* Call immediately after loading ATMX and before a declarative framework
|
|
12
|
+
* (Alpine, Vue, Svelte, etc.) hydrates the page.
|
|
13
|
+
*/
|
|
14
|
+
export declare function installSDKPlaceholder(): Record<string, Record<string, RouteFunction>>;
|
|
15
|
+
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
import { AtmxConfig, AxiomError, InitResult } from './core/types';
|
|
2
|
-
export declare const ATMX_VERSION = "0.
|
|
2
|
+
export declare const ATMX_VERSION = "0.137.0";
|
|
3
3
|
declare class ATMX {
|
|
4
4
|
version: string;
|
|
5
5
|
initialized: boolean;
|
|
6
6
|
debug: boolean;
|
|
7
|
+
private initializing;
|
|
7
8
|
init(config: AtmxConfig): Promise<InitResult>;
|
|
9
|
+
/** Resolves the in-flight initialization, if one has been started. */
|
|
10
|
+
whenReady(): Promise<InitResult>;
|
|
11
|
+
/**
|
|
12
|
+
* Installs a temporary global SDK facade for declarative frameworks that
|
|
13
|
+
* hydrate before the generated ES module arrives. It carries no data and is
|
|
14
|
+
* replaced automatically by the typed generated SDK.
|
|
15
|
+
*/
|
|
16
|
+
installSDKPlaceholder(): Record<string, Record<string, ((args?: Record<string, unknown>) => string) & {
|
|
17
|
+
invalidate: (args?: Record<string, unknown>) => void;
|
|
18
|
+
setData: (data: unknown, args?: Record<string, unknown>) => void;
|
|
19
|
+
mutate: (payload?: unknown, args?: Record<string, unknown>) => Promise<unknown> | undefined;
|
|
20
|
+
}>>;
|
|
21
|
+
private initialize;
|
|
8
22
|
hydrate(elementOrSelector?: string | HTMLElement): void;
|
|
9
23
|
triggerQuery(elementOrSelector: string | HTMLElement): void;
|
|
10
24
|
on(eventName: "ready" | "data" | "error" | "success" | "contract-loaded", callback: (e: any) => void): void;
|
|
@@ -44,6 +58,7 @@ declare class ATMX {
|
|
|
44
58
|
export declare const atmx: ATMX;
|
|
45
59
|
export { initWasm, wasmEngine, allocBytes, allocString, setAuthToken, clearAuthToken, setGlobalAuthToken, sendStreamMessage, } from './core/wasm';
|
|
46
60
|
export { resolveRoute, buildRequestPath } from './core/router';
|
|
61
|
+
export { installSDKPlaceholder } from './core/sdk-placeholder';
|
|
47
62
|
export type { Route } from './core/router';
|
|
48
63
|
export { pendingRequests } from './core/callback';
|
|
49
64
|
export type { AtmxConfig, AxiomResponse, AxiomError, EventType, } from './core/types';
|