atmx-web 0.84.0 → 0.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/atmx.es.js CHANGED
@@ -127,8 +127,9 @@ function p(e) {
127
127
  len: t.length
128
128
  };
129
129
  }
130
- function m() {
131
- return "https://atmx.axiomcore.dev/latest/axiom_runtime.wasm";
130
+ function m(e) {
131
+ let t = `https://atmx.axiomcore.dev/${e.engineVersion || "v0.86.0"}/axiom_runtime.wasm`;
132
+ return e.disableCacheBuster || (t += `?t=${Date.now()}`), t;
132
133
  }
133
134
  async function h(e) {
134
135
  let t = performance.now(), r = {
@@ -141,7 +142,7 @@ async function h(e) {
141
142
  let e = document.createElement("script");
142
143
  e.type = "text/javascript", e.text = `${l}\nwindow.wasm_bindgen = wasm_bindgen;`, document.head.appendChild(e);
143
144
  }
144
- let t = window.wasm_bindgen, a = `${m()}?t=${Date.now()}`;
145
+ let t = window.wasm_bindgen, a = m(e);
145
146
  try {
146
147
  u = await t(fetch(a));
147
148
  } catch (e) {
@@ -411,7 +412,7 @@ var A = 0, j = class {
411
412
  let r = ++A;
412
413
  this.currentReqId = r;
413
414
  let { path: i, remainingArgs: a } = o(this.route, this.args), s = new Uint8Array();
414
- Object.keys(a).length > 0 && (s = new TextEncoder().encode(JSON.stringify(a))), q.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()), t.set(r, {
415
+ Object.keys(a).length > 0 && (s = new TextEncoder().encode(JSON.stringify(a))), J.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()), t.set(r, {
415
416
  isStream: this.route.isStream,
416
417
  onResponse: (t) => {
417
418
  if (this.currentReqId === r) {
@@ -447,7 +448,7 @@ function P(e, t) {
447
448
  e.hasAttribute(n) && S(e.getAttribute(n), D(e));
448
449
  }
449
450
  function F(e, t, n) {
450
- if (!q.debug) return;
451
+ if (!J.debug) return;
451
452
  let r = e === "OUT" ? "#7c3aed" : "#059669";
452
453
  console.groupCollapsed(`%c${e === "OUT" ? "➔ WASM CALL" : "← WASM RESP"} [#${t}]`, `color: ${r}; font-weight: bold;`), console.log("Details:", n), console.groupEnd();
453
454
  }
@@ -481,7 +482,7 @@ function L(e) {
481
482
  });
482
483
  return;
483
484
  }
484
- let i = `${r.namespace}:${r.id}:${JSON.stringify(n.args)}`, o = M.get(i);
485
+ let i = `${n.target}:${JSON.stringify(n.args)}`, o = M.get(i);
485
486
  o || (o = new j(i, r, n.args), M.set(i, o)), e._axListener || (e._axListener = (t) => {
486
487
  k(e, t), (t.state === "data" || t.state === "error") && (P(e, t.state), e.dispatchEvent(new CustomEvent(`atmx:${t.state}`, {
487
488
  bubbles: !0,
@@ -550,7 +551,7 @@ function z(e, n, r, i, a, o, s, c, l = {}, d = !1) {
550
551
  isStream: s,
551
552
  onResponse: (t) => B(e, t, c, m),
552
553
  onComplete: () => {
553
- q.debug && console.log(`%c✔ Stream Complete [#${m}]`, "color: #94a3b8;");
554
+ J.debug && console.log(`%c✔ Stream Complete [#${m}]`, "color: #94a3b8;");
554
555
  }
555
556
  });
556
557
  let h = p(n), g = p(i), _ = p(a), v = p(""), y = p(Object.keys(l).length > 0 ? JSON.stringify(l) : ""), b = f(o);
@@ -590,7 +591,7 @@ function B(t, n, r, i) {
590
591
  if (n) {
591
592
  let e = a(I(t, t.getAttribute("ax-mutate")).target)?.namespace || "default", r = t.getAttribute("ax-token-target");
592
593
  (r ? r.split(",").map((e) => e.trim()) : [e]).forEach((e) => {
593
- q.setNamespaceAuthToken(e, n);
594
+ J.setNamespaceAuthToken(e, n);
594
595
  });
595
596
  }
596
597
  }
@@ -624,6 +625,25 @@ function H(e) {
624
625
  });
625
626
  }
626
627
  function U(e = document) {
628
+ H(e), e.querySelectorAll("[ax-query]").forEach((e) => {
629
+ let t = e, n = t.getAttribute("ax-query");
630
+ if (!n) return;
631
+ let r = I(t, n);
632
+ if (r) {
633
+ let e = `${r.target}:${JSON.stringify(r.args)}`;
634
+ try {
635
+ let n = sessionStorage.getItem(`atmx_cache_${e}`);
636
+ n && k(t, {
637
+ state: "data",
638
+ data: JSON.parse(n),
639
+ source: "cache",
640
+ isFetching: !0
641
+ });
642
+ } catch {}
643
+ }
644
+ });
645
+ }
646
+ function W(e = document) {
627
647
  H(e), e.querySelectorAll("[ax-query]").forEach((e) => {
628
648
  let t = e;
629
649
  k(t, {});
@@ -645,22 +665,19 @@ function U(e = document) {
645
665
  let n = t.closest("[ax-query]");
646
666
  if (n) {
647
667
  let e = I(n, n.getAttribute("ax-query"));
648
- if (e) {
649
- let t = a(e.target);
650
- if (t) {
651
- let r = `${t.namespace}:${t.id}:${JSON.stringify(e.args)}`, i = M.get(r);
652
- i ? i.fetch(!0) : L(n);
653
- }
668
+ if (e && a(e.target)) {
669
+ let t = `${e.target}:${JSON.stringify(e.args)}`, r = M.get(t);
670
+ r ? r.fetch(!0) : L(n);
654
671
  }
655
672
  }
656
673
  });
657
674
  });
658
675
  }
659
- function W() {
676
+ function G() {
660
677
  new MutationObserver((e) => {
661
678
  e.forEach((e) => {
662
679
  e.addedNodes.forEach((e) => {
663
- e instanceof HTMLElement && U(e);
680
+ e instanceof HTMLElement && W(e);
664
681
  });
665
682
  });
666
683
  }).observe(document.body, {
@@ -670,7 +687,7 @@ function W() {
670
687
  }
671
688
  //#endregion
672
689
  //#region src/dom/components/engine-status.ts
673
- var G = class extends HTMLElement {
690
+ var K = class extends HTMLElement {
674
691
  constructor() {
675
692
  super();
676
693
  }
@@ -691,11 +708,11 @@ var G = class extends HTMLElement {
691
708
  }) : (this.innerText = t, this.getAttribute("class") || (this.className = `text-xs font-bold ${n}`));
692
709
  }
693
710
  };
694
- typeof window < "u" && !customElements.get("ax-engine-status") && customElements.define("ax-engine-status", G);
711
+ typeof window < "u" && !customElements.get("ax-engine-status") && customElements.define("ax-engine-status", K);
695
712
  //#endregion
696
713
  //#region src/index.ts
697
- var K = "0.84.0", q = new class {
698
- version = K;
714
+ var q = "0.86.0", J = new class {
715
+ version = q;
699
716
  initialized = !1;
700
717
  debug = !1;
701
718
  async init(e) {
@@ -705,7 +722,11 @@ var K = "0.84.0", q = new class {
705
722
  initDurationMs: 0
706
723
  };
707
724
  let t = await h(e);
708
- return t.ok ? (this.debug = e.debug || !1, W(), U(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;
725
+ return t.ok ? (this.debug = e.debug || !1, G(), W(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;
726
+ }
727
+ hydrate(e) {
728
+ let t = document;
729
+ e && (t = typeof e == "string" ? document.querySelector(e) : e), t && U(t);
709
730
  }
710
731
  triggerQuery(e) {
711
732
  let t = typeof e == "string" ? document.querySelector(e) : e;
@@ -754,6 +775,6 @@ var K = "0.84.0", q = new class {
754
775
  o && o.currentReqId ? y(o.currentReqId, t) : console.warn(`ATMX: Cannot send message, stream not active for ${e}`);
755
776
  }
756
777
  }();
757
- typeof window < "u" && (window.atmx = q);
778
+ typeof window < "u" && (window.atmx = J);
758
779
  //#endregion
759
- export { K as ATMX_VERSION, f as allocBytes, p as allocString, q as atmx, o as buildRequestPath, v as clearAuthToken, h as initWasm, t as pendingRequests, a as resolveRoute, y as sendStreamMessage, g as setAuthToken, b as setGlobalAuthToken, u as wasmEngine };
780
+ export { q as ATMX_VERSION, f as allocBytes, p as allocString, J as atmx, o as buildRequestPath, v as clearAuthToken, h as initWasm, t as pendingRequests, a as resolveRoute, y as sendStreamMessage, g as setAuthToken, b as setGlobalAuthToken, u as wasmEngine };
package/dist/atmx.umd.js CHANGED
@@ -883,5 +883,5 @@
883
883
 
884
884
  return Object.assign(__wbg_init, { initSync }, exports);
885
885
  })({ __proto__: null });
886
- `,d=null,f=`atmx_auth_store`;function p(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 m(e){if(!e)return{ptr:0,len:0};let t=new TextEncoder().encode(e);return{ptr:p(t),len:t.length}}function h(){return`https://atmx.axiomcore.dev/latest/axiom_runtime.wasm`}async function g(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=`${h()}?t=${Date.now()}`;try{d=await t(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=m(``),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};try{let e=JSON.parse(localStorage.getItem(f)||`{}`);for(let[t,n]of Object.entries(e))for(let[e,r]of Object.entries(n))_(t,e,r,!1)}catch(e){console.warn(`ATMX: Failed to hydrate auth tokens`,e)}for(let[t,r]of Object.entries(e.contracts))try{let i=await fetch(r.contractUrl);if(!i.ok)throw Error(`HTTP ${i.status}`);let o=await i.arrayBuffer(),s=0;try{let e=new TextDecoder().decode(o),n=JSON.parse(e),r=n?.ir?.endpoints;r&&(s=Array.isArray(r)?r.length:Object.keys(r).length),a(t,n)}catch(e){console.error(`ATMX: Failed to parse .axiom contract for '${t}'`,e)}let c=new Uint8Array(o),l=p(c),u=m(t),f=m(r.baseUrl),h=d.axiom_wasm_load_contract(u.ptr,u.len,f.ptr,f.len,l,c.length,0,0,0,0);if(d.axiom_free_memory(l,c.length),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(f.ptr,f.len),h!==0&&h!==-1)throw Error(`Load error (Code: ${h})`);e.debug&&console.log(`%c🔒 Axiom Contract Loaded: ${t} (${s} endpoints)`,`color: #10b981; font-weight: bold;`),n.contracts[t]={loaded:!0,endpointCount:s},document.dispatchEvent(new CustomEvent(`atmx:contract-loaded`,{detail:{namespace:t,endpointCount:s}}))}catch(e){n.contracts[t]={loaded:!1,endpointCount:0,error:e.message},console.error(`ATMX: Contract failed for ${t}`,e)}n.ok=!0}catch(e){n.ok=!1,n.error=e.stage?e:{stage:`runtime`,category:`unknown`,code:`FatalError`,message:e.message||String(e),retryable:!1}}return n.initDurationMs=Math.round(performance.now()-t),n}function _(e,t,n,r=!0){if(!d)return;if(r)try{let r=JSON.parse(localStorage.getItem(f)||`{}`);r[e]||(r[e]={}),r[e][t]=n,localStorage.setItem(f,JSON.stringify(r))}catch{}let i=m(e),a=m(t),o=m(n);d.axiom_wasm_set_auth_token(i.ptr,i.len,a.ptr,a.len,o.ptr,o.len),d.axiom_free_memory(i.ptr,i.len),d.axiom_free_memory(a.ptr,a.len),d.axiom_free_memory(o.ptr,o.len)}function v(e,t,n=!0){if(!d)return;let r=l(e),i=n?JSON.parse(localStorage.getItem(f)||`{}`):{};n&&!i[e]&&(i[e]={});for(let a of r){let r=m(a.namespace),o=m(a.name),s=m(t);d.axiom_wasm_set_auth_token(r.ptr,r.len,o.ptr,o.len,s.ptr,s.len),d.axiom_free_memory(r.ptr,r.len),d.axiom_free_memory(o.ptr,o.len),d.axiom_free_memory(s.ptr,s.len),n&&(i[e][a.name]=t)}n&&localStorage.setItem(f,JSON.stringify(i))}function y(e,t){if(!d)return;try{let n=JSON.parse(localStorage.getItem(f)||`{}`);n[e]&&(delete n[e][t],localStorage.setItem(f,JSON.stringify(n)))}catch{}let n=m(e),r=m(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 b(e,t){if(!d)return;let n=new TextEncoder().encode(JSON.stringify(t)),r=p(n);d.axiom_wasm_send_stream_message(e,r,n.length),d.axiom_free_memory(r,n.length)}function x(e,t=!0){if(!d)return;let n=c(),r=t?JSON.parse(localStorage.getItem(f)||`{}`):{};for(let i of n){let n=m(i.namespace),a=m(i.name),o=m(e);d.axiom_wasm_set_auth_token(n.ptr,n.len,a.ptr,a.len,o.ptr,o.len),d.axiom_free_memory(n.ptr,n.len),d.axiom_free_memory(a.ptr,a.len),d.axiom_free_memory(o.ptr,o.len),t&&(r[i.namespace]||(r[i.namespace]={}),r[i.namespace][i.name]=e)}t&&localStorage.setItem(f,JSON.stringify(r))}function S(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||{},t.error||{},t,...i)}catch(t){console.error(`ATMX Eval Error: ${e}`,t);return}}function C(e,t,n={}){if(e)try{let r=Object.keys(n),i=Object.values(n);Function(`$data`,`$error`,`$state`,...r,e)(t.data||{},t.error||{},t,...i)}catch(t){console.error(`ATMX Action Error: ${e}`,t)}}function w(e,t){T(e,t,!0,{})}function T(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`)){E(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`)&&(S(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=S(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(`
887
- `);for(let t of e)if(t.startsWith(n+`:`)){r=t.substring(n.length+1).trim();break}}r?(e.textContent=r,e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`))}Array.from(e.attributes).forEach(n=>{if(n.name.startsWith(`ax-bind:`)){let i=n.name.substring(8),a=S(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=>{T(e,t,!1,r)})}}function E(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=S(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(S(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),T(m,t,!0,c),f.push(m)}),u.forEach(e=>{f.includes(e)||e.remove()})}var D=new WeakMap;function O(e){return D.has(e)||D.set(e,{state:`idle`,isFetching:!1,isMutating:!1,source:null,data:null,error:null}),D.get(e)}function k(e){let t=e.parentElement;for(;t;){if(t.hasAttribute(`ax-query`)||t.hasAttribute(`ax-mutate`)){let e=D.get(t);if(e&&e.data)return e.data}t=t.parentElement}return{}}function A(e,t){let n=O(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),D.set(e,n),w(e,n)}var j=0,M=class{key;route;args;state;listeners=new Set;currentReqId=null;constructor(e,t,n){this.key=e,this.route=t,this.args=n;let r=null;try{let t=sessionStorage.getItem(`atmx_cache_${e}`);t&&(r=JSON.parse(t))}catch{}r?this.state={state:`data`,isFetching:!1,source:`cache`,data:r,error:null}:this.state={state:`idle`,isFetching:!1,source:null,data:null,error:null}}subscribe(e){this.listeners.add(e),e(this.state)}update(e){if(this.state={...this.state,...e},this.state.data)try{sessionStorage.setItem(`atmx_cache_${this.key}`,JSON.stringify(this.state.data))}catch{}this.listeners.forEach(e=>e(this.state))}fetch(e=!1){if(this.state.isFetching&&!e)return;this.update({state:this.state.data?`data`:`loading`,isFetching:!0,error:null});let r=++j;this.currentReqId=r;let{path:i,remainingArgs:a}=s(this.route,this.args),o=new Uint8Array;Object.keys(a).length>0&&(o=new TextEncoder().encode(JSON.stringify(a))),J.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){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=m(this.route.namespace),l=m(this.route.method),u=m(i),f=p(o),h=m(``),g=m(``);d.axiom_wasm_call(r,c.ptr,c.len,this.route.id,l.ptr,l.len,u.ptr,u.len,h.ptr,h.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(h.ptr,h.len),d.axiom_free_memory(g.ptr,g.len)}},N=new Map,P=0;function F(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&C(e.getAttribute(n),O(e))}function I(e,t,n){if(!J.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 L(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=O(e),r=t.data||k(e);i=Function(`$data`,`$state`,`return (${n[2]});`)(r,t)||{}}else i=Function(`return (${n[2]});`)()||{}}catch(e){console.error(`ATMX Scope Error in "${t}":`,e)}return{target:r,args:i}}function R(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=L(e,t);if(!n)return;let r=o(n.target);if(!r){A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}});return}let i=`${r.namespace}:${r.id}:${JSON.stringify(n.args)}`,a=N.get(i);a||(a=new M(i,r,n.args),N.set(i,a)),e._axListener||(e._axListener=t=>{A(e,t),(t.state===`data`||t.state===`error`)&&(F(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function z(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=L(e,t);if(!n)return;let r=o(n.target);if(!r){A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),F(e,`error`);return}A(e,{state:`mutating`,error:null,data:null}),F(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));B(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function B(e,t,r,i,a,o,s,c,l={},u=!1){let f=++P;I(`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=>V(e,t,c,f),onComplete:()=>{J.debug&&console.log(`%c✔ Stream Complete [#${f}]`,`color: #94a3b8;`)}});let h=m(t),g=m(i),_=m(a),v=m(``),y=m(Object.keys(l).length>0?JSON.stringify(l):``),b=p(o);d.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),d.axiom_free_memory(h.ptr,h.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 V(e,n,r,i){if(I(`IN`,i,{eventType:t[n.eventType],data:n.data,error:n.error}),n.eventType===t.Error){A(e,{state:`error`,error:n.error,isFetching:!1,isMutating:!1}),F(e,`error`),e.dispatchEvent(new CustomEvent(`atmx:error`,{bubbles:!0,detail:n.error}));return}if(n.data){let i=`network`,a=!1;n.eventType===t.CacheHit?i=`cache`:n.eventType===t.CacheHitAndFetching?(i=`cache`,a=!0):n.eventType===t.NetworkSuccess&&(i=`network`);let s=r?`success`:`data`;if(A(e,{state:s,data:n.data,source:i,isFetching:a,isMutating:!1}),r){let t=e.getAttribute(`ax-store-token`);if(t){let n=S(t,O(e));if(n){let t=o(L(e,e.getAttribute(`ax-mutate`)).target)?.namespace||`default`,r=e.getAttribute(`ax-token-target`);(r?r.split(`,`).map(e=>e.trim()):[t]).forEach(e=>{J.setNamespaceAuthToken(e,n)})}}}F(e,s),e.dispatchEvent(new CustomEvent(r?`atmx:success`:`atmx:data`,{bubbles:!0,detail:n.data}))}}var H=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){let t=e.target;t.hasAttribute(`ax-query`)&&R(t),H.unobserve(t)}})});function U(e){e.querySelectorAll(`[\\:ax-query], [\\:ax-mutate]`).forEach(e=>{if(e.hasAttribute(`:ax-query`)){let t=S(e.getAttribute(`:ax-query`),O(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=S(e.getAttribute(`:ax-mutate`),O(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function W(e=document){U(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e;A(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?R(t):n===`intersect`?H.observe(t):t.addEventListener(n,e=>{e.preventDefault(),R(t)})}),e.querySelectorAll(`[ax-mutate]`).forEach(e=>{let t=e;A(t,{});let n=t.tagName===`FORM`?`submit`:`click`;t.addEventListener(n,e=>{(t.tagName===`A`||t.tagName===`BUTTON`||t.tagName===`FORM`)&&e.preventDefault(),z(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=L(n,n.getAttribute(`ax-query`));if(e){let t=o(e.target);if(t){let r=`${t.namespace}:${t.id}:${JSON.stringify(e.args)}`,i=N.get(r);i?i.fetch(!0):R(n)}}}})})}function G(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&W(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var K=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`,K);var q=`0.84.0`,J=new class{version=q;initialized=!1;debug=!1;async init(e){if(this.initialized)return{ok:!0,contracts:{},initDurationMs:0};let t=await g(e);return t.ok?(this.debug=e.debug||!1,G(),W(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}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&R(t)}on(e,t){document.addEventListener(`atmx:${e}`,t)}setAuthToken(e,t,n){_(e,t,n)}setNamespaceAuthToken(e,t,n=!0){v(e,t,n)}setGlobalAuthToken(e){x(e)}sendStreamMessage(e,t){b(e,t)}clearAuthToken(e,t){y(e,t)}connect(e){let t=L(null,e);if(!t)return;let n=o(t.target);if(!n)return;let r=`${n.namespace}:${n.id}:${JSON.stringify(t.args)}`,i=N.get(r);i||(i=new M(r,n,t.args),N.set(r,i)),i.fetch()}disconnect(e){let t=L(null,e);if(!t)return;let r=o(t.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(t.args)}`,a=N.get(i);a&&(a.currentReqId&&n.delete(a.currentReqId),N.delete(i),this.debug&&console.log(`🔌 ATMX Disconnected Stream: ${e}`))}send(e,t){let n=L(null,e);if(!n)return;let r=o(n.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(n.args)}`,a=N.get(i);a&&a.currentReqId?b(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}};typeof window<`u`&&(window.atmx=J),e.ATMX_VERSION=q,e.allocBytes=p,e.allocString=m,e.atmx=J,e.buildRequestPath=s,e.clearAuthToken=y,e.initWasm=g,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=b,e.setAuthToken=_,e.setGlobalAuthToken=x,Object.defineProperty(e,`wasmEngine`,{enumerable:!0,get:function(){return d}})});
886
+ `,d=null,f=`atmx_auth_store`;function p(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 m(e){if(!e)return{ptr:0,len:0};let t=new TextEncoder().encode(e);return{ptr:p(t),len:t.length}}function h(e){let t=`https://atmx.axiomcore.dev/${e.engineVersion||`v0.86.0`}/axiom_runtime.wasm`;return e.disableCacheBuster||(t+=`?t=${Date.now()}`),t}async function g(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=h(e);try{d=await t(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=m(``),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};try{let e=JSON.parse(localStorage.getItem(f)||`{}`);for(let[t,n]of Object.entries(e))for(let[e,r]of Object.entries(n))_(t,e,r,!1)}catch(e){console.warn(`ATMX: Failed to hydrate auth tokens`,e)}for(let[t,r]of Object.entries(e.contracts))try{let i=await fetch(r.contractUrl);if(!i.ok)throw Error(`HTTP ${i.status}`);let o=await i.arrayBuffer(),s=0;try{let e=new TextDecoder().decode(o),n=JSON.parse(e),r=n?.ir?.endpoints;r&&(s=Array.isArray(r)?r.length:Object.keys(r).length),a(t,n)}catch(e){console.error(`ATMX: Failed to parse .axiom contract for '${t}'`,e)}let c=new Uint8Array(o),l=p(c),u=m(t),f=m(r.baseUrl),h=d.axiom_wasm_load_contract(u.ptr,u.len,f.ptr,f.len,l,c.length,0,0,0,0);if(d.axiom_free_memory(l,c.length),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(f.ptr,f.len),h!==0&&h!==-1)throw Error(`Load error (Code: ${h})`);e.debug&&console.log(`%c🔒 Axiom Contract Loaded: ${t} (${s} endpoints)`,`color: #10b981; font-weight: bold;`),n.contracts[t]={loaded:!0,endpointCount:s},document.dispatchEvent(new CustomEvent(`atmx:contract-loaded`,{detail:{namespace:t,endpointCount:s}}))}catch(e){n.contracts[t]={loaded:!1,endpointCount:0,error:e.message},console.error(`ATMX: Contract failed for ${t}`,e)}n.ok=!0}catch(e){n.ok=!1,n.error=e.stage?e:{stage:`runtime`,category:`unknown`,code:`FatalError`,message:e.message||String(e),retryable:!1}}return n.initDurationMs=Math.round(performance.now()-t),n}function _(e,t,n,r=!0){if(!d)return;if(r)try{let r=JSON.parse(localStorage.getItem(f)||`{}`);r[e]||(r[e]={}),r[e][t]=n,localStorage.setItem(f,JSON.stringify(r))}catch{}let i=m(e),a=m(t),o=m(n);d.axiom_wasm_set_auth_token(i.ptr,i.len,a.ptr,a.len,o.ptr,o.len),d.axiom_free_memory(i.ptr,i.len),d.axiom_free_memory(a.ptr,a.len),d.axiom_free_memory(o.ptr,o.len)}function v(e,t,n=!0){if(!d)return;let r=l(e),i=n?JSON.parse(localStorage.getItem(f)||`{}`):{};n&&!i[e]&&(i[e]={});for(let a of r){let r=m(a.namespace),o=m(a.name),s=m(t);d.axiom_wasm_set_auth_token(r.ptr,r.len,o.ptr,o.len,s.ptr,s.len),d.axiom_free_memory(r.ptr,r.len),d.axiom_free_memory(o.ptr,o.len),d.axiom_free_memory(s.ptr,s.len),n&&(i[e][a.name]=t)}n&&localStorage.setItem(f,JSON.stringify(i))}function y(e,t){if(!d)return;try{let n=JSON.parse(localStorage.getItem(f)||`{}`);n[e]&&(delete n[e][t],localStorage.setItem(f,JSON.stringify(n)))}catch{}let n=m(e),r=m(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 b(e,t){if(!d)return;let n=new TextEncoder().encode(JSON.stringify(t)),r=p(n);d.axiom_wasm_send_stream_message(e,r,n.length),d.axiom_free_memory(r,n.length)}function x(e,t=!0){if(!d)return;let n=c(),r=t?JSON.parse(localStorage.getItem(f)||`{}`):{};for(let i of n){let n=m(i.namespace),a=m(i.name),o=m(e);d.axiom_wasm_set_auth_token(n.ptr,n.len,a.ptr,a.len,o.ptr,o.len),d.axiom_free_memory(n.ptr,n.len),d.axiom_free_memory(a.ptr,a.len),d.axiom_free_memory(o.ptr,o.len),t&&(r[i.namespace]||(r[i.namespace]={}),r[i.namespace][i.name]=e)}t&&localStorage.setItem(f,JSON.stringify(r))}function S(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||{},t.error||{},t,...i)}catch(t){console.error(`ATMX Eval Error: ${e}`,t);return}}function C(e,t,n={}){if(e)try{let r=Object.keys(n),i=Object.values(n);Function(`$data`,`$error`,`$state`,...r,e)(t.data||{},t.error||{},t,...i)}catch(t){console.error(`ATMX Action Error: ${e}`,t)}}function w(e,t){T(e,t,!0,{})}function T(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`)){E(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`)&&(S(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=S(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(`
887
+ `);for(let t of e)if(t.startsWith(n+`:`)){r=t.substring(n.length+1).trim();break}}r?(e.textContent=r,e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`))}Array.from(e.attributes).forEach(n=>{if(n.name.startsWith(`ax-bind:`)){let i=n.name.substring(8),a=S(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=>{T(e,t,!1,r)})}}function E(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=S(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(S(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),T(m,t,!0,c),f.push(m)}),u.forEach(e=>{f.includes(e)||e.remove()})}var D=new WeakMap;function O(e){return D.has(e)||D.set(e,{state:`idle`,isFetching:!1,isMutating:!1,source:null,data:null,error:null}),D.get(e)}function k(e){let t=e.parentElement;for(;t;){if(t.hasAttribute(`ax-query`)||t.hasAttribute(`ax-mutate`)){let e=D.get(t);if(e&&e.data)return e.data}t=t.parentElement}return{}}function A(e,t){let n=O(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),D.set(e,n),w(e,n)}var j=0,M=class{key;route;args;state;listeners=new Set;currentReqId=null;constructor(e,t,n){this.key=e,this.route=t,this.args=n;let r=null;try{let t=sessionStorage.getItem(`atmx_cache_${e}`);t&&(r=JSON.parse(t))}catch{}r?this.state={state:`data`,isFetching:!1,source:`cache`,data:r,error:null}:this.state={state:`idle`,isFetching:!1,source:null,data:null,error:null}}subscribe(e){this.listeners.add(e),e(this.state)}update(e){if(this.state={...this.state,...e},this.state.data)try{sessionStorage.setItem(`atmx_cache_${this.key}`,JSON.stringify(this.state.data))}catch{}this.listeners.forEach(e=>e(this.state))}fetch(e=!1){if(this.state.isFetching&&!e)return;this.update({state:this.state.data?`data`:`loading`,isFetching:!0,error:null});let r=++j;this.currentReqId=r;let{path:i,remainingArgs:a}=s(this.route,this.args),o=new Uint8Array;Object.keys(a).length>0&&(o=new TextEncoder().encode(JSON.stringify(a))),Y.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){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=m(this.route.namespace),l=m(this.route.method),u=m(i),f=p(o),h=m(``),g=m(``);d.axiom_wasm_call(r,c.ptr,c.len,this.route.id,l.ptr,l.len,u.ptr,u.len,h.ptr,h.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(h.ptr,h.len),d.axiom_free_memory(g.ptr,g.len)}},N=new Map,P=0;function F(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&C(e.getAttribute(n),O(e))}function I(e,t,n){if(!Y.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 L(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=O(e),r=t.data||k(e);i=Function(`$data`,`$state`,`return (${n[2]});`)(r,t)||{}}else i=Function(`return (${n[2]});`)()||{}}catch(e){console.error(`ATMX Scope Error in "${t}":`,e)}return{target:r,args:i}}function R(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=L(e,t);if(!n)return;let r=o(n.target);if(!r){A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}});return}let i=`${n.target}:${JSON.stringify(n.args)}`,a=N.get(i);a||(a=new M(i,r,n.args),N.set(i,a)),e._axListener||(e._axListener=t=>{A(e,t),(t.state===`data`||t.state===`error`)&&(F(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function z(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=L(e,t);if(!n)return;let r=o(n.target);if(!r){A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),F(e,`error`);return}A(e,{state:`mutating`,error:null,data:null}),F(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));B(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function B(e,t,r,i,a,o,s,c,l={},u=!1){let f=++P;I(`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=>V(e,t,c,f),onComplete:()=>{Y.debug&&console.log(`%c✔ Stream Complete [#${f}]`,`color: #94a3b8;`)}});let h=m(t),g=m(i),_=m(a),v=m(``),y=m(Object.keys(l).length>0?JSON.stringify(l):``),b=p(o);d.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),d.axiom_free_memory(h.ptr,h.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 V(e,n,r,i){if(I(`IN`,i,{eventType:t[n.eventType],data:n.data,error:n.error}),n.eventType===t.Error){A(e,{state:`error`,error:n.error,isFetching:!1,isMutating:!1}),F(e,`error`),e.dispatchEvent(new CustomEvent(`atmx:error`,{bubbles:!0,detail:n.error}));return}if(n.data){let i=`network`,a=!1;n.eventType===t.CacheHit?i=`cache`:n.eventType===t.CacheHitAndFetching?(i=`cache`,a=!0):n.eventType===t.NetworkSuccess&&(i=`network`);let s=r?`success`:`data`;if(A(e,{state:s,data:n.data,source:i,isFetching:a,isMutating:!1}),r){let t=e.getAttribute(`ax-store-token`);if(t){let n=S(t,O(e));if(n){let t=o(L(e,e.getAttribute(`ax-mutate`)).target)?.namespace||`default`,r=e.getAttribute(`ax-token-target`);(r?r.split(`,`).map(e=>e.trim()):[t]).forEach(e=>{Y.setNamespaceAuthToken(e,n)})}}}F(e,s),e.dispatchEvent(new CustomEvent(r?`atmx:success`:`atmx:data`,{bubbles:!0,detail:n.data}))}}var H=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){let t=e.target;t.hasAttribute(`ax-query`)&&R(t),H.unobserve(t)}})});function U(e){e.querySelectorAll(`[\\:ax-query], [\\:ax-mutate]`).forEach(e=>{if(e.hasAttribute(`:ax-query`)){let t=S(e.getAttribute(`:ax-query`),O(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=S(e.getAttribute(`:ax-mutate`),O(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function W(e=document){U(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e,n=t.getAttribute(`ax-query`);if(!n)return;let r=L(t,n);if(r){let e=`${r.target}:${JSON.stringify(r.args)}`;try{let n=sessionStorage.getItem(`atmx_cache_${e}`);n&&A(t,{state:`data`,data:JSON.parse(n),source:`cache`,isFetching:!0})}catch{}}})}function G(e=document){U(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e;A(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?R(t):n===`intersect`?H.observe(t):t.addEventListener(n,e=>{e.preventDefault(),R(t)})}),e.querySelectorAll(`[ax-mutate]`).forEach(e=>{let t=e;A(t,{});let n=t.tagName===`FORM`?`submit`:`click`;t.addEventListener(n,e=>{(t.tagName===`A`||t.tagName===`BUTTON`||t.tagName===`FORM`)&&e.preventDefault(),z(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=L(n,n.getAttribute(`ax-query`));if(e&&o(e.target)){let t=`${e.target}:${JSON.stringify(e.args)}`,r=N.get(t);r?r.fetch(!0):R(n)}}})})}function K(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&G(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var q=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`,q);var J=`0.86.0`,Y=new class{version=J;initialized=!1;debug=!1;async init(e){if(this.initialized)return{ok:!0,contracts:{},initDurationMs:0};let t=await g(e);return t.ok?(this.debug=e.debug||!1,K(),G(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&&W(t)}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&R(t)}on(e,t){document.addEventListener(`atmx:${e}`,t)}setAuthToken(e,t,n){_(e,t,n)}setNamespaceAuthToken(e,t,n=!0){v(e,t,n)}setGlobalAuthToken(e){x(e)}sendStreamMessage(e,t){b(e,t)}clearAuthToken(e,t){y(e,t)}connect(e){let t=L(null,e);if(!t)return;let n=o(t.target);if(!n)return;let r=`${n.namespace}:${n.id}:${JSON.stringify(t.args)}`,i=N.get(r);i||(i=new M(r,n,t.args),N.set(r,i)),i.fetch()}disconnect(e){let t=L(null,e);if(!t)return;let r=o(t.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(t.args)}`,a=N.get(i);a&&(a.currentReqId&&n.delete(a.currentReqId),N.delete(i),this.debug&&console.log(`🔌 ATMX Disconnected Stream: ${e}`))}send(e,t){let n=L(null,e);if(!n)return;let r=o(n.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(n.args)}`,a=N.get(i);a&&a.currentReqId?b(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}};typeof window<`u`&&(window.atmx=Y),e.ATMX_VERSION=J,e.allocBytes=p,e.allocString=m,e.atmx=Y,e.buildRequestPath=s,e.clearAuthToken=y,e.initWasm=g,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=b,e.setAuthToken=_,e.setGlobalAuthToken=x,Object.defineProperty(e,`wasmEngine`,{enumerable:!0,get:function(){return d}})});
@@ -5,6 +5,8 @@ export interface AtmxContractConfig {
5
5
  export interface AtmxConfig {
6
6
  contracts: Record<string, AtmxContractConfig>;
7
7
  debug?: boolean;
8
+ engineVersion?: string;
9
+ disableCacheBuster?: boolean;
8
10
  }
9
11
  export declare enum EventType {
10
12
  Complete = 0,
@@ -1,2 +1,3 @@
1
+ export declare function hydrateQueries(root?: HTMLElement | Document): void;
1
2
  export declare function scanAndInitialize(root?: HTMLElement | Document): void;
2
3
  export declare function initMutationObserver(): void;
package/dist/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import { AtmxConfig, InitResult } from './core/types';
2
- export declare const ATMX_VERSION = "0.84.0";
2
+ export declare const ATMX_VERSION = "0.86.0";
3
3
  declare class ATMX {
4
4
  version: string;
5
5
  initialized: boolean;
6
6
  debug: boolean;
7
7
  init(config: AtmxConfig): Promise<InitResult>;
8
+ hydrate(elementOrSelector?: string | HTMLElement): void;
8
9
  triggerQuery(elementOrSelector: string | HTMLElement): void;
9
10
  on(eventName: "ready" | "data" | "error" | "success" | "contract-loaded", callback: (e: any) => void): void;
10
11
  setAuthToken(namespace: string, methodName: string, token: string): void;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "files": [
4
4
  "dist"
5
5
  ],
6
- "version": "0.84.0",
6
+ "version": "0.86.0",
7
7
  "description": "Axiom ATMX Core Runtime for Vanilla Web",
8
8
  "type": "module",
9
9
  "main": "./dist/atmx.umd.js",