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 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.135.0"}/axiom_runtime.wasm`;
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
- O(e, t, r);
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 O(e, t, n) {
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 k = /* @__PURE__ */ new WeakMap();
357
- function A(e) {
358
- return k.has(e) || k.set(e, {
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
- }), k.get(e);
365
+ }), O.get(e);
366
366
  }
367
- function ee(e) {
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 = k.get(t);
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 = A(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), k.set(e, n), E(e, n);
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 te(e, t = {}) {
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 ne(e, t = {}) {
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 I(n, r = {}, i = {}, s = {}) {
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 L(e, t) {
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 R(e, t = {}, n) {
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 z(e, t = !0) {
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 B = 0;
566
- function V(e, t) {
565
+ var H = 0;
566
+ function U(e, t) {
567
567
  let n = `ax-on:${t}`;
568
- e.hasAttribute(n) && T(e.getAttribute(n), A(e));
568
+ e.hasAttribute(n) && T(e.getAttribute(n), k(e));
569
569
  }
570
- function H(e, t, n) {
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 U(e, t) {
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 = A(e), r = t.data || ee(e);
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 W(e) {
592
+ function K(e) {
593
593
  let t = e.getAttribute("ax-query");
594
594
  if (!t) return;
595
- let n = U(e, t);
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") && (V(e, t.state), e.dispatchEvent(new CustomEvent(`atmx:${t.state}`, {
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 G(e) {
613
+ function q(e) {
614
614
  let t = e.getAttribute("ax-mutate");
615
615
  if (!t) return;
616
- let n = U(e, t);
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
- }), V(e, "error");
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
- }), V(e, "mutating");
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
- K(e, r.namespace, r.id, r.method, s, p, r.isStream, !0, u, f);
659
+ te(e, r.namespace, r.id, r.method, s, p, r.isStream, !0, u, f);
660
660
  }
661
- function K(e, n, r, i, a, o, s, c, l = {}, d = !1) {
662
- let f = ++B;
663
- H("OUT", f, {
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) => q(e, t, c, f),
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 q(t, n, r, i) {
681
- if (H("IN", i, {
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
- }), V(t, "error"), t.dispatchEvent(new CustomEvent("atmx:error", {
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}\``, A(t)) || 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, A(t));
715
+ let e = w(n, k(t));
716
716
  if (e) {
717
- let n = a(U(t, t.getAttribute("ax-mutate")).target)?.namespace || "default", r = t.getAttribute("ax-token-target");
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
- V(t, s), t.dispatchEvent(new CustomEvent(r ? "atmx:success" : "atmx:data", {
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") && W(t), J.unobserve(t);
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"), A(e));
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"), A(e));
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 X(e = document) {
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 = U(t, n);
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 Z(e = document) {
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" ? W(t) : n === "intersect" ? J.observe(t) : t.addEventListener(n, (e) => {
777
- e.preventDefault(), W(t);
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(), G(t);
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 = U(n, n.getAttribute("ax-query"));
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) : W(n);
795
+ r ? r.fetch(!0) : K(n);
796
796
  }
797
797
  }
798
798
  });
799
799
  });
800
800
  }
801
- function re() {
801
+ function ie() {
802
802
  new MutationObserver((e) => {
803
803
  e.forEach((e) => {
804
804
  e.addedNodes.forEach((e) => {
805
- e instanceof HTMLElement && Z(e);
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 ie = class extends HTMLElement {
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", ie);
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.135.0", $ = new class {
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
- if (this.initialized) return {
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, re(), 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;
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 && X(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") && W(t);
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 = U(null, e);
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 = U(null, e);
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 = U(null, e);
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 I(e, t, n);
948
+ return R(e, t, n);
904
949
  }
905
950
  query(e, t = {}) {
906
- return ne(e, t);
951
+ return L(e, t);
907
952
  }
908
953
  getCachedQueryData(e, t = {}) {
909
- return te(e, t);
954
+ return I(e, t);
910
955
  }
911
956
  mutateBytes(e, t, n, r = {}) {
912
- return I(e, t, {}, {
957
+ return R(e, t, {}, {
913
958
  rawBody: n,
914
959
  headers: r
915
960
  });
916
961
  }
917
962
  invalidate(e, t) {
918
- L(e, t);
963
+ z(e, t);
919
964
  }
920
965
  setQueryData(e, t, n) {
921
- R(e, t, n);
966
+ B(e, t, n);
922
967
  }
923
968
  clearCache(e) {
924
- z(e);
969
+ V(e);
925
970
  }
926
971
  purgeCache(e) {
927
- z(e, !1);
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.135.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 D(e,t){O(e,t,!0,{})}function O(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`)){k(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=>{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.135.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';
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "files": [
4
4
  "dist"
5
5
  ],
6
- "version": "0.135.0",
6
+ "version": "0.137.0",
7
7
  "description": "Axiom ATMX Core Runtime for Vanilla Web",
8
8
  "type": "module",
9
9
  "main": "./dist/atmx.umd.js",