atmx-web 0.123.0 ā 0.126.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/atmx.es.js +248 -191
- package/dist/atmx.umd.js +15 -18
- package/dist/axiom_runtime.wasm +0 -0
- package/dist/core/query.d.ts +34 -3
- package/dist/core/types.d.ts +6 -0
- package/dist/core/wasm.d.ts +3 -3
- package/dist/index.d.ts +21 -2
- package/package.json +1 -1
package/dist/atmx.umd.js
CHANGED
|
@@ -320,9 +320,6 @@
|
|
|
320
320
|
const ret = getObject(arg0).read();
|
|
321
321
|
return addHeapObject(ret);
|
|
322
322
|
},
|
|
323
|
-
__wbg_removeItem_487c385a3066a8ed: function() { return handleError(function (arg0, arg1, arg2) {
|
|
324
|
-
getObject(arg0).removeItem(getStringFromWasm0(arg1, arg2));
|
|
325
|
-
}, arguments); },
|
|
326
323
|
__wbg_require_b4edbdcf3e2a1ef0: function() { return handleError(function () {
|
|
327
324
|
const ret = module.require;
|
|
328
325
|
return addHeapObject(ret);
|
|
@@ -435,22 +432,22 @@
|
|
|
435
432
|
},
|
|
436
433
|
__wbindgen_cast_0000000000000001: function(arg0, arg1) {
|
|
437
434
|
// Cast intrinsic for \`Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 193, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref\`.
|
|
438
|
-
const ret = makeMutClosure(arg0, arg1,
|
|
435
|
+
const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_2381);
|
|
439
436
|
return addHeapObject(ret);
|
|
440
437
|
},
|
|
441
438
|
__wbindgen_cast_0000000000000002: function(arg0, arg1) {
|
|
442
439
|
// Cast intrinsic for \`Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Event")], shim_idx: 45, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref\`.
|
|
443
|
-
const ret = makeMutClosure(arg0, arg1,
|
|
440
|
+
const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_496);
|
|
444
441
|
return addHeapObject(ret);
|
|
445
442
|
},
|
|
446
443
|
__wbindgen_cast_0000000000000003: function(arg0, arg1) {
|
|
447
444
|
// Cast intrinsic for \`Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("MessageEvent")], shim_idx: 45, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref\`.
|
|
448
|
-
const ret = makeMutClosure(arg0, arg1,
|
|
445
|
+
const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_496_2);
|
|
449
446
|
return addHeapObject(ret);
|
|
450
447
|
},
|
|
451
448
|
__wbindgen_cast_0000000000000004: function(arg0, arg1) {
|
|
452
|
-
// Cast intrinsic for \`Closure(Closure { owned: true, function: Function { arguments: [], shim_idx:
|
|
453
|
-
const ret = makeMutClosure(arg0, arg1,
|
|
449
|
+
// Cast intrinsic for \`Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 106, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref\`.
|
|
450
|
+
const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_2221);
|
|
454
451
|
return addHeapObject(ret);
|
|
455
452
|
},
|
|
456
453
|
__wbindgen_cast_0000000000000005: function(arg0, arg1) {
|
|
@@ -477,22 +474,22 @@
|
|
|
477
474
|
};
|
|
478
475
|
}
|
|
479
476
|
|
|
480
|
-
function
|
|
481
|
-
wasm.
|
|
477
|
+
function __wasm_bindgen_func_elem_2221(arg0, arg1) {
|
|
478
|
+
wasm.__wasm_bindgen_func_elem_2221(arg0, arg1);
|
|
482
479
|
}
|
|
483
480
|
|
|
484
|
-
function
|
|
485
|
-
wasm.
|
|
481
|
+
function __wasm_bindgen_func_elem_496(arg0, arg1, arg2) {
|
|
482
|
+
wasm.__wasm_bindgen_func_elem_496(arg0, arg1, addHeapObject(arg2));
|
|
486
483
|
}
|
|
487
484
|
|
|
488
|
-
function
|
|
489
|
-
wasm.
|
|
485
|
+
function __wasm_bindgen_func_elem_496_2(arg0, arg1, arg2) {
|
|
486
|
+
wasm.__wasm_bindgen_func_elem_496_2(arg0, arg1, addHeapObject(arg2));
|
|
490
487
|
}
|
|
491
488
|
|
|
492
|
-
function
|
|
489
|
+
function __wasm_bindgen_func_elem_2381(arg0, arg1, arg2) {
|
|
493
490
|
try {
|
|
494
491
|
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
495
|
-
wasm.
|
|
492
|
+
wasm.__wasm_bindgen_func_elem_2381(retptr, arg0, arg1, addHeapObject(arg2));
|
|
496
493
|
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
497
494
|
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
498
495
|
if (r1) {
|
|
@@ -825,5 +822,5 @@
|
|
|
825
822
|
|
|
826
823
|
return Object.assign(__wbg_init, { initSync }, exports);
|
|
827
824
|
})({ __proto__: null });
|
|
828
|
-
`,d=null
|
|
829
|
-
`);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=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))),$.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=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;function P(e,r={},i={}){return new Promise((a,c)=>{let l=o(e);if(!l)return c(Error(`ATMX Route not found: ${e}`));let u=++j,{path:f,remainingArgs:h}=s(l,{...r,...i}),g=h;l.bodyParam&&h[l.bodyParam]!==void 0&&typeof h[l.bodyParam]==`object`&&(g=h[l.bodyParam]);let _=new Uint8Array;Object.keys(g).length>0&&(_=new TextEncoder().encode(JSON.stringify(g))),n.set(u,{isStream:l.isStream,onResponse:e=>{e.eventType===t.Error?(document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:e.error})),c(e.error)):e.data!==void 0&&a(e.data)},onComplete:()=>{}});let v=m(l.namespace),y=m(l.method),b=m(f),x=m(``),S=m(``),C=p(_);d.axiom_wasm_call(u,v.ptr,v.len,l.id,y.ptr,y.len,b.ptr,b.len,x.ptr,x.len,S.ptr,S.len,C,_.length),d.axiom_free_memory(v.ptr,v.len),d.axiom_free_memory(y.ptr,y.len),d.axiom_free_memory(b.ptr,b.len),d.axiom_free_memory(x.ptr,x.len),d.axiom_free_memory(S.ptr,S.len),C&&d.axiom_free_memory(C,_.length)})}function F(e,t){let[n,r]=e.split(`.`),i=`atmx_cache_${e}`;t&&Object.keys(t).length>0&&(i+=`:${JSON.stringify(t)}`),Object.keys(sessionStorage).forEach(e=>{(e===i||!t&&e.startsWith(i+`:`))&&sessionStorage.removeItem(e)}),N.forEach((e,i)=>{e.route.namespace===n&&e.route.name===r&&(!t||Object.keys(t).length===0||JSON.stringify(e.args)===JSON.stringify(t))&&e.fetch(!0)})}function I(e,t={},n){let r=`${e}:${JSON.stringify(t)}`;try{sessionStorage.setItem(`atmx_cache_${r}`,JSON.stringify(n))}catch{}let i=N.get(r);i&&i.update({state:`data`,source:`cache`,isFetching:!1,data:n,error:null})}function L(e){let t=e?`atmx_cache_${e}.`:`atmx_cache_`;Object.keys(sessionStorage).forEach(e=>{e.startsWith(t)&&sessionStorage.removeItem(e)}),N.forEach(t=>{(!e||t.route.namespace===e)&&t.fetch(!0)})}var R=0;function z(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&C(e.getAttribute(n),O(e))}function B(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 V(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??null,t)||{}}else i=Function(`return (${n[2]});`)()||{}}catch(e){console.error(`ATMX Scope Error in "${t}":`,e)}return{target:r,args:i}}function H(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=V(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`)&&(z(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function U(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=V(e,t);if(!n)return;let r=o(n.target);if(!r){console.error(`ATMX: Mutation route not found for target '${n.target}'. Check your ax-mutate attribute.`),A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),z(e,`error`);return}A(e,{state:`mutating`,error:null,data:null}),z(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));W(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function W(e,t,r,i,a,o,s,c,l={},u=!1){let f=++R;B(`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=>G(e,t,c,f),onComplete:()=>{$.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 G(e,n,r,i){if(B(`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}),z(e,`error`),e.dispatchEvent(new CustomEvent(`atmx:error`,{bubbles:!0,detail:n.error}));return}if(n.data!==void 0){let i=`network`,a=!1;n.eventType===t.CacheHit?i=`cache`:n.eventType===t.CacheHitAndFetching?(i=`cache`,a=!0):n.eventType===t.NetworkSuccess&&(i=`network`);let s=r?`success`:`data`;if(A(e,{state:s,data:n.data,source:i,isFetching:a,isMutating:!1}),r){let t=e.getAttribute(`ax-invalidates`);t&&t.split(`,`).map(e=>e.trim()).forEach(t=>{let n=S(`\`${t}\``,O(e))||t;$.invalidate(n)});let n=e.getAttribute(`ax-store-token`);if(n){let t=S(n,O(e));if(t){let n=o(V(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)})}}}z(e,s),e.dispatchEvent(new CustomEvent(r?`atmx:success`:`atmx:data`,{bubbles:!0,detail:n.data}))}}var K=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){let t=e.target;t.hasAttribute(`ax-query`)&&H(t),K.unobserve(t)}})});function q(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 J(e=document){q(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e,n=t.getAttribute(`ax-query`);if(!n)return;let r=V(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 Y(e=document){q(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e;A(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?H(t):n===`intersect`?K.observe(t):t.addEventListener(n,e=>{e.preventDefault(),H(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(),U(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=V(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):H(n)}}})})}function X(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&Y(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var Z=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`,Z);var Q=`0.123.0`,$=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,X(),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&&J(t)}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&H(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=V(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=V(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=V(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}`)}mutate(e,t,n){return P(e,t,n)}invalidate(e,t){F(e,t)}setQueryData(e,t,n){I(e,t,n)}clearCache(e){L(e)}onError(e){document.addEventListener(`atmx:error`,t=>{e(t.detail)})}};typeof window<`u`&&(window.atmx=$),e.ATMX_VERSION=Q,e.allocBytes=p,e.allocString=m,e.atmx=$,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}})});
|
|
825
|
+
`,d=null;function f(e){try{localStorage.removeItem(`atmx_auth_store`);let t=[...Array.isArray(e?.endpoints)?e.endpoints:Object.values(e?.endpoints||{}),...Array.isArray(e?.ir?.endpoints)?e.ir.endpoints:Object.values(e?.ir?.endpoints||{})];for(let e of t)for(let t of e?.auth?.methods||[]){let e=t?.name||t?.type;e&&localStorage.removeItem(`axiom_cache_auth_${e}`)}}catch{}}function p(e){return(e.auth?.methods||[]).filter(e=>e?.type?.toLowerCase()!==`session`).map(e=>e?.name||e?.type).filter(Boolean)}function m(e){if(e.length===0)return 0;let t=d.axiom_malloc(e.length);return new Uint8Array(d.memory.buffer).set(e,t),t}function h(e){if(!e)return{ptr:0,len:0};let t=new TextEncoder().encode(e);return{ptr:m(t),len:t.length}}function g(e){if(e.wasmUrl)return e.wasmUrl;let t=`https://atmx.axiomcore.dev/${e.engineVersion||`v0.126.0`}/axiom_runtime.wasm`;return e.disableCacheBuster||(t+=`?t=${Date.now()}`),t}async function _(e){let t=performance.now(),n={ok:!1,contracts:{},initDurationMs:0};try{if(!window.wasm_bindgen){let e=document.createElement(`script`);e.type=`text/javascript`,e.text=`${u}\nwindow.wasm_bindgen = wasm_bindgen;`,document.head.appendChild(e)}let t=window.wasm_bindgen,i=g(e);try{d=await t({module_or_path:fetch(i)})}catch(e){throw{stage:`ffiBoundary`,category:`network`,code:`WasmFetchFailed`,message:`Failed to download WASM engine: ${e.message}`,retryable:!0}}r(d),setInterval(()=>{d&&d.axiom_process_responses()},16);let o=h(``),s=d.axiom_wasm_initialize(o.ptr,o.len);if(d.axiom_free_memory(o.ptr,o.len),s!==0)throw{stage:`runtime`,category:`server`,code:`InitFailed`,message:`Engine init failed (Code: ${s})`,retryable:!1};for(let[t,r]of Object.entries(e.contracts))try{let i=await fetch(r.contractUrl);if(!i.ok)throw Error(`HTTP ${i.status}`);let o=await i.arrayBuffer(),s=0;try{let e=new TextDecoder().decode(o),n=JSON.parse(e),r=n?.ir?.endpoints;r&&(s=Array.isArray(r)?r.length:Object.keys(r).length),f(n),a(t,n)}catch(e){console.error(`ATMX: Failed to parse .axiom contract for '${t}'`,e)}let c=new Uint8Array(o),l=m(c),u=h(t),p=h(r.baseUrl),g=d.axiom_wasm_load_contract(u.ptr,u.len,p.ptr,p.len,l,c.length,0,0,0,0);if(d.axiom_free_memory(l,c.length),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(p.ptr,p.len),g!==0&&g!==-1)throw Error(`Load error (Code: ${g})`);e.debug&&console.log(`%cš Axiom Contract Loaded: ${t} (${s} endpoints)`,`color: #10b981; font-weight: bold;`),n.contracts[t]={loaded:!0,endpointCount:s},document.dispatchEvent(new CustomEvent(`atmx:contract-loaded`,{detail:{namespace:t,endpointCount:s}}))}catch(e){n.contracts[t]={loaded:!1,endpointCount:0,error:e.message},console.error(`ATMX: Contract failed for ${t}`,e)}n.ok=!0}catch(e){n.ok=!1,n.error=e.stage?e:{stage:`runtime`,category:`unknown`,code:`FatalError`,message:e.message||String(e),retryable:!1}}return n.initDurationMs=Math.round(performance.now()-t),n}function v(e,t,n){if(!d)return;let r=h(e),i=h(t),a=h(n);d.axiom_wasm_set_auth_token(r.ptr,r.len,i.ptr,i.len,a.ptr,a.len),d.axiom_free_memory(r.ptr,r.len),d.axiom_free_memory(i.ptr,i.len),d.axiom_free_memory(a.ptr,a.len)}function y(e,t){if(!d)return;let n=new Set(l(e).flatMap(p));for(let r of n)v(e,r,t)}function b(e,t){if(!d)return;let n=h(e),r=h(t);d.axiom_wasm_clear_auth_token(n.ptr,n.len,r.ptr,r.len),d.axiom_free_memory(n.ptr,n.len),d.axiom_free_memory(r.ptr,r.len)}function x(e,t){if(!d)return;let n=new TextEncoder().encode(JSON.stringify(t)),r=m(n);d.axiom_wasm_send_stream_message(e,r,n.length),d.axiom_free_memory(r,n.length)}function S(e){if(!d)return;let t=new Map;for(let e of c()){let n=t.get(e.namespace)||new Set;p(e).forEach(e=>n.add(e)),t.set(e.namespace,n)}for(let[n,r]of t)for(let t of r)v(n,t,e)}function C(e,t,n={}){if(e)try{let r=Object.keys(n),i=Object.values(n);return Function(`$data`,`$error`,`$state`,...r,`return (${e});`)(t.data??null,t.error??null,t,...i)}catch(t){console.error(`ATMX Eval Error: ${e}`,t);return}}function w(e,t,n={}){if(e)try{let r=Object.keys(n),i=Object.values(n);Function(`$data`,`$error`,`$state`,...r,e)(t.data??null,t.error??null,t,...i)}catch(t){console.error(`ATMX Action Error: ${e}`,t)}}function T(e,t){E(e,t,!0,{})}function E(e,t,n,r){if(!(!n&&(e.hasAttribute(`ax-query`)||e.hasAttribute(`ax-mutate`)))&&!(!n&&e.hasAttribute(`data-ax-clone-of`))){if(e.hasAttribute(`ax-for`)){D(e,t,r);return}if(e.hasAttribute(`ax-when`)&&(e.getAttribute(`ax-when`).split(`,`).map(e=>e.trim()).includes(t.state)?(e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,`true`),e.style.setProperty(`display`,`none`,`important`))),e.hasAttribute(`ax-if`)&&(C(e.getAttribute(`ax-if`),t,r)?(e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`))),e.hasAttribute(`ax-text`)){let n=C(e.getAttribute(`ax-text`),t,r);e.textContent=n==null?``:String(n)}if(e.hasAttribute(`ax-error-for`)){let n=e.getAttribute(`ax-error-for`),r=``;if(t.state===`error`&&t.error?.code===`ValidationError`){let e=(t.error.details||``).split(`
|
|
826
|
+
`);for(let t of e)if(t.startsWith(n+`:`)){r=t.substring(n.length+1).trim();break}}let i=e.parentElement?.querySelector(`[name="${n}"]`);r?(e.textContent=r,e.removeAttribute(`hidden`),e.style.removeProperty(`display`),i&&(i.setAttribute(`aria-invalid`,`true`),i.classList.add(`border-red-500`,`focus:border-red-500`,`focus:ring-red-500`))):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`),e.textContent=``,i&&(i.removeAttribute(`aria-invalid`),i.classList.remove(`border-red-500`,`focus:border-red-500`,`focus:ring-red-500`)))}Array.from(e.attributes).forEach(n=>{if(n.name.startsWith(`ax-bind:`)){let i=n.name.substring(8),a=C(n.value,t,r);a===!1||a==null?e.removeAttribute(i):e.setAttribute(i,a===!0?i:String(a))}}),Array.from(e.children).forEach(e=>{E(e,t,!1,r)})}}function D(e,t,n){e.style.display=`none`,e.hasAttribute(`data-ax-for-id`)||e.setAttribute(`data-ax-for-id`,Math.random().toString(36).substr(2,9));let r=e.getAttribute(`data-ax-for-id`),i=e.getAttribute(`ax-for`).match(/^\s*(?:(?:\(\s*([\w\$]+)\s*,\s*([\w\$]+)\s*\))|([\w\$]+))\s+in\s+(.+)$/);if(!i)return;let a=i[1]||i[3],o=i[2],s=i[4],c=C(s,t,n),l=e.parentElement;if(!l)return;let u=Array.from(l.querySelectorAll(`[data-ax-clone-of="${r}"]`));if(!c||!Array.isArray(c)){u.forEach(e=>e.remove());return}let d=e.getAttribute(`ax-key`),f=[];c.forEach((i,s)=>{let c={...n,[a]:i};o&&(c[o]=s);let p=String(s);d&&(p=String(C(d,t,c)));let m=u.find(e=>e.getAttribute(`data-ax-key`)===p);m||(m=e.cloneNode(!0),m.removeAttribute(`ax-for`),m.style.removeProperty(`display`),m.style.length===0&&m.removeAttribute(`style`),m.setAttribute(`data-ax-clone-of`,r),m.setAttribute(`data-ax-key`,p)),l.insertBefore(m,e),E(m,t,!0,c),f.push(m)}),u.forEach(e=>{f.includes(e)||e.remove()})}var O=new WeakMap;function k(e){return O.has(e)||O.set(e,{state:`idle`,isFetching:!1,isMutating:!1,source:null,data:null,error:null}),O.get(e)}function ee(e){let t=e.parentElement;for(;t;){if(t.hasAttribute(`ax-query`)||t.hasAttribute(`ax-mutate`)){let e=O.get(t);if(e&&e.data)return e.data}t=t.parentElement}return{}}function A(e,t){let n=k(e);Object.assign(n,t),t.state===`loading`&&(n.isFetching=!0),t.state===`mutating`&&(n.isMutating=!0),(t.state===`success`||t.state===`data`&&t.isFetching===!1)&&(n.isFetching=!1,n.isMutating=!1),O.set(e,n),T(e,n)}var j=0,M=class{key;route;args;state;listeners=new Set;currentReqId=null;constructor(e,t,n){this.key=e,this.route=t,this.args=n;let r=null;try{let t=sessionStorage.getItem(`atmx_cache_${e}`);t&&(r=JSON.parse(t))}catch{}r?this.state={state:`data`,isFetching:!1,source:`cache`,data:r,error:null}:this.state={state:`idle`,isFetching:!1,source:null,data:null,error:null}}subscribe(e){return this.listeners.add(e),e(this.state),()=>this.listeners.delete(e)}update(e){if(this.state={...this.state,...e},this.state.data)try{sessionStorage.setItem(`atmx_cache_${this.key}`,JSON.stringify(this.state.data))}catch{}this.listeners.forEach(e=>e(this.state))}fetch(e=!1){if(this.state.isFetching&&!e)return;this.update({state:this.state.data?`data`:`loading`,isFetching:!0,error:null});let r=++j;this.currentReqId=r;let{path:i,remainingArgs:a}=s(this.route,this.args),o=new Uint8Array;Object.keys(a).length>0&&(o=new TextEncoder().encode(JSON.stringify(a))),$.debug&&(console.groupCollapsed(`%cā WASM QUERY [#${r}]`,`color: #7c3aed; font-weight: bold;`),console.log(`Namespace:`,this.route.namespace),console.log(`Endpoint ID:`,this.route.id),console.log(`Path:`,i),console.groupEnd()),n.set(r,{isStream:this.route.isStream,onResponse:e=>{if(this.currentReqId===r){if(e.eventType===t.Error){this.update({state:`error`,error:e.error,isFetching:!1});return}if(e.data!==void 0){let n=`network`,r=!1;e.eventType===t.CacheHit?(n=`cache`,r=!1):e.eventType===t.CacheHitAndFetching?(n=`cache`,r=!0):e.eventType===t.NetworkSuccess&&(n=`network`,r=!1),this.update({state:`data`,data:e.data,source:n,isFetching:r})}}},onComplete:()=>{this.currentReqId===r&&this.update({isFetching:!1})}});let c=h(this.route.namespace),l=h(this.route.method),u=h(i),f=m(o),p=h(``),g=h(``);d.axiom_wasm_call(r,c.ptr,c.len,this.route.id,l.ptr,l.len,u.ptr,u.len,p.ptr,p.len,g.ptr,g.len,f,o.length),d.axiom_free_memory(c.ptr,c.len),d.axiom_free_memory(l.ptr,l.len),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(p.ptr,p.len),d.axiom_free_memory(g.ptr,g.len)}},N=new Map;function P(e,t={}){return`${e}:${JSON.stringify(t)}`}function F(e,t={}){let n=P(e,t),r=N.get(n);if(r?.state.data!==null&&r?.state.data!==void 0)return r.state.data;try{let e=sessionStorage.getItem(`atmx_cache_${n}`);return e?JSON.parse(e):null}catch{return null}}function I(e,t={}){let n=o(e);if(!n)throw Error(`ATMX Route not found: ${e}`);let r=P(e,t),i=N.get(r);i||(i=new M(r,n,t),N.set(r,i));let a=!1,s=new Set,c=i.subscribe(e=>{a||s.forEach(t=>t(e))});return i.fetch(),{getSnapshot:()=>({...i.state}),subscribe(e){return a?()=>{}:(s.add(e),e(i.state),()=>s.delete(e))},refresh(){a||i.fetch(!0)},dispose(){a||(a=!0,s.clear(),c())}}}function L(e,r={},i={},a={}){return new Promise((c,l)=>{let u=o(e);if(!u)return l(Error(`ATMX Route not found: ${e}`));let f=++j,{path:p,remainingArgs:g}=s(u,{...r,...i}),_=a.rawBody;if(!_){let e=g;u.bodyParam&&g[u.bodyParam]!==void 0&&typeof g[u.bodyParam]==`object`&&(e=g[u.bodyParam]),_=new Uint8Array,Object.keys(e).length>0&&(_=new TextEncoder().encode(JSON.stringify(e)))}let v=!1,y=e=>{v||(v=!0,c(e))},b=e=>{v||(v=!0,l(e))};n.set(f,{isStream:u.isStream,onResponse:e=>{e.eventType===t.Error?(document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:e.error})),b(e.error)):e.data!==void 0&&y(e.data)},onComplete:()=>y(void 0)});let x=h(u.namespace),S=h(u.method),C=h(p),w=h(``),T=h(Object.keys(a.headers||{}).length>0?JSON.stringify(a.headers):``),E=m(_);d.axiom_wasm_call(f,x.ptr,x.len,u.id,S.ptr,S.len,C.ptr,C.len,w.ptr,w.len,T.ptr,T.len,E,_.length),d.axiom_free_memory(x.ptr,x.len),d.axiom_free_memory(S.ptr,S.len),d.axiom_free_memory(C.ptr,C.len),d.axiom_free_memory(w.ptr,w.len),d.axiom_free_memory(T.ptr,T.len),E&&d.axiom_free_memory(E,_.length)})}function R(e,t){let[n,r]=e.split(`.`),i=`atmx_cache_${e}`;t&&Object.keys(t).length>0&&(i+=`:${JSON.stringify(t)}`),Object.keys(sessionStorage).forEach(e=>{(e===i||!t&&e.startsWith(i+`:`))&&sessionStorage.removeItem(e)}),N.forEach((e,i)=>{e.route.namespace===n&&e.route.name===r&&(!t||Object.keys(t).length===0||JSON.stringify(e.args)===JSON.stringify(t))&&e.fetch(!0)})}function z(e,t={},n){let r=P(e,t);try{sessionStorage.setItem(`atmx_cache_${r}`,JSON.stringify(n))}catch{}let i=N.get(r);i&&i.update({state:`data`,source:`cache`,isFetching:!1,data:n,error:null})}function B(e,t=!0){let n=e?`atmx_cache_${e}.`:`atmx_cache_`;Object.keys(sessionStorage).forEach(e=>{e.startsWith(n)&&sessionStorage.removeItem(e)}),N.forEach(n=>{(!e||n.route.namespace===e)&&(n.update({state:`idle`,source:null,data:null,error:null,isFetching:!1}),t&&n.fetch(!0))})}var V=0;function H(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&w(e.getAttribute(n),k(e))}function U(e,t,n){if(!$.debug)return;let r=e===`OUT`?`#7c3aed`:`#059669`;console.groupCollapsed(`%c${e===`OUT`?`ā WASM CALL`:`ā WASM RESP`} [#${t}]`,`color: ${r}; font-weight: bold;`),console.log(`Details:`,n),console.groupEnd()}function W(e,t){let n=t.trim().match(/^([\w\.\-]+)(?:\((.*)\))?$/);if(!n)return null;let r=n[1],i={};if(n[2]&&n[2].trim()!==``)try{if(e){let t=k(e),r=t.data||ee(e);i=Function(`$data`,`$state`,`return (${n[2]});`)(r??null,t)||{}}else i=Function(`return (${n[2]});`)()||{}}catch(e){console.error(`ATMX Scope Error in "${t}":`,e)}return{target:r,args:i}}function G(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=W(e,t);if(!n)return;let r=o(n.target);if(!r){A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}});return}let i=`${n.target}:${JSON.stringify(n.args)}`,a=N.get(i);a||(a=new M(i,r,n.args),N.set(i,a)),e._axListener||(e._axListener=t=>{A(e,t),(t.state===`data`||t.state===`error`)&&(H(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function K(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=W(e,t);if(!n)return;let r=o(n.target);if(!r){console.error(`ATMX: Mutation route not found for target '${n.target}'. Check your ax-mutate attribute.`),A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),H(e,`error`);return}A(e,{state:`mutating`,error:null,data:null}),H(e,`mutating`);let i={};e instanceof HTMLFormElement&&new FormData(e).forEach((t,n)=>{let r=e.elements.namedItem(n),a=!1;r instanceof HTMLInputElement?a=r.type===`number`:r instanceof RadioNodeList&&r.length>0&&(a=r[0].type===`number`);let o=a&&t!==``?Number(t):t;if(n.includes(`.`)){let e=n.split(`.`),t=i;for(let n=0;n<e.length-1;n++)t[e[n]]||(t[e[n]]={}),t=t[e[n]];t[e[e.length-1]]=o}else i[n]=o});let{path:a,remainingArgs:c}=s(r,{...i,...n.args}),l=c;r.bodyParam&&c[r.bodyParam]!==void 0&&typeof c[r.bodyParam]==`object`&&(l=c[r.bodyParam]);let u={},d=e.getAttribute(`ax-headers`);if(d)try{u=Function(`return (`+d+`);`)()||{}}catch(e){console.error(`ATMX: Invalid ax-headers syntax`,e)}let f=Object.entries(u).some(([e,t])=>e.toLowerCase()===`content-type`&&t.includes(`application/x-www-form-urlencoded`)),p=new Uint8Array;if(Object.keys(l).length>0)if(f){let e=new URLSearchParams;for(let[t,n]of Object.entries(l))e.append(t,String(n));p=new TextEncoder().encode(e.toString())}else p=new TextEncoder().encode(JSON.stringify(l));q(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function q(e,t,r,i,a,o,s,c,l={},u=!1){let f=++V;U(`OUT`,f,{namespace:t,endpointId:r,method:i,path:a,headers:l,payload:o.length>0?u?new TextDecoder().decode(o):JSON.parse(new TextDecoder().decode(o)):null}),n.set(f,{isStream:s,onResponse:t=>J(e,t,c,f),onComplete:()=>{$.debug&&console.log(`%cā Stream Complete [#${f}]`,`color: #94a3b8;`)}});let p=h(t),g=h(i),_=h(a),v=h(``),y=h(Object.keys(l).length>0?JSON.stringify(l):``),b=m(o);d.axiom_wasm_call(f,p.ptr,p.len,r,g.ptr,g.len,_.ptr,_.len,v.ptr,v.len,y.ptr,y.len,b,o.length),d.axiom_free_memory(p.ptr,p.len),d.axiom_free_memory(g.ptr,g.len),d.axiom_free_memory(_.ptr,_.len),d.axiom_free_memory(v.ptr,v.len),d.axiom_free_memory(y.ptr,y.len),b&&d.axiom_free_memory(b,o.length)}function J(e,n,r,i){if(U(`IN`,i,{eventType:t[n.eventType],data:n.data,error:n.error}),n.eventType===t.Error){A(e,{state:`error`,error:n.error,isFetching:!1,isMutating:!1}),H(e,`error`),e.dispatchEvent(new CustomEvent(`atmx:error`,{bubbles:!0,detail:n.error}));return}if(n.data!==void 0){let i=`network`,a=!1;n.eventType===t.CacheHit?i=`cache`:n.eventType===t.CacheHitAndFetching?(i=`cache`,a=!0):n.eventType===t.NetworkSuccess&&(i=`network`);let s=r?`success`:`data`;if(A(e,{state:s,data:n.data,source:i,isFetching:a,isMutating:!1}),r){let t=e.getAttribute(`ax-invalidates`);t&&t.split(`,`).map(e=>e.trim()).forEach(t=>{let n=C(`\`${t}\``,k(e))||t;$.invalidate(n)});let n=e.getAttribute(`ax-store-token`);if(n){let t=C(n,k(e));if(t){let n=o(W(e,e.getAttribute(`ax-mutate`)).target)?.namespace||`default`,r=e.getAttribute(`ax-token-target`);(r?r.split(`,`).map(e=>e.trim()):[n]).forEach(e=>{$.setNamespaceAuthToken(e,t)})}}}H(e,s),e.dispatchEvent(new CustomEvent(r?`atmx:success`:`atmx:data`,{bubbles:!0,detail:n.data}))}}var Y=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){let t=e.target;t.hasAttribute(`ax-query`)&&G(t),Y.unobserve(t)}})});function X(e){e.querySelectorAll(`[\\:ax-query], [\\:ax-mutate]`).forEach(e=>{if(e.hasAttribute(`:ax-query`)){let t=C(e.getAttribute(`:ax-query`),k(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=C(e.getAttribute(`:ax-mutate`),k(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function te(e=document){X(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e,n=t.getAttribute(`ax-query`);if(!n)return;let r=W(t,n);if(r){let e=`${r.target}:${JSON.stringify(r.args)}`;try{let n=sessionStorage.getItem(`atmx_cache_${e}`);n&&A(t,{state:`data`,data:JSON.parse(n),source:`cache`,isFetching:!0})}catch{}}})}function Z(e=document){X(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e;A(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?G(t):n===`intersect`?Y.observe(t):t.addEventListener(n,e=>{e.preventDefault(),G(t)})}),e.querySelectorAll(`[ax-mutate]`).forEach(e=>{let t=e;A(t,{});let n=t.tagName===`FORM`?`submit`:`click`;t.addEventListener(n,e=>{(t.tagName===`A`||t.tagName===`BUTTON`||t.tagName===`FORM`)&&e.preventDefault(),K(t)})}),e.querySelectorAll(`[ax-trigger="refresh"]`).forEach(e=>{let t=e;t.addEventListener(`click`,e=>{e.preventDefault();let n=t.closest(`[ax-query]`);if(n){let e=W(n,n.getAttribute(`ax-query`));if(e&&o(e.target)){let t=`${e.target}:${JSON.stringify(e.args)}`,r=N.get(t);r?r.fetch(!0):G(n)}}})})}function ne(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&Z(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var re=class extends HTMLElement{constructor(){super()}connectedCallback(){let e=this.getAttribute(`loading-text`)||`Initializing...`,t=this.getAttribute(`ready-text`)||`Online`,n=this.getAttribute(`error-text`)||`Failed to Connect`;this.renderState(`loading`,e,`text-amber-500 animate-pulse`),document.addEventListener(`atmx:ready`,()=>{this.renderState(`ready`,t,`text-green-600`)}),document.addEventListener(`atmx:error`,e=>{let t=e;t.detail&&t.detail.stage===`runtime`&&this.renderState(`error`,`${n}: ${t.detail.message}`,`text-red-600`)})}renderState(e,t,n){this.setAttribute(`data-state`,e);let r=this.querySelectorAll(`[data-ax-when]`);r.length>0?r.forEach(t=>{t.getAttribute(`data-ax-when`)===e?t.removeAttribute(`hidden`):t.setAttribute(`hidden`,``)}):(this.innerText=t,this.getAttribute(`class`)||(this.className=`text-xs font-bold ${n}`))}};typeof window<`u`&&!customElements.get(`ax-engine-status`)&&customElements.define(`ax-engine-status`,re);var Q=`0.126.0`,$=new class{version=Q;initialized=!1;debug=!1;async init(e){if(this.initialized)return{ok:!0,contracts:{},initDurationMs:0};let t=await _(e);return t.ok?(this.debug=e.debug||!1,ne(),Z(document.body),this.initialized=!0,this.debug&&console.log(`%cš ATMX Debug Mode: Enabled`,`color: #2563eb; font-weight: bold;`),console.log(`ā
ATMX v${this.version} Online (${t.initDurationMs}ms). Reactive Engine Started.`),document.dispatchEvent(new CustomEvent(`atmx:ready`,{detail:t}))):(console.error(`ā ATMX Initialization Failed:`,t.error),document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:t.error}))),t}hydrate(e){let t=document;e&&(t=typeof e==`string`?document.querySelector(e):e),t&&te(t)}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&G(t)}on(e,t){document.addEventListener(`atmx:${e}`,t)}setAuthToken(e,t,n){v(e,t,n)}setNamespaceAuthToken(e,t){y(e,t)}setGlobalAuthToken(e){S(e)}sendStreamMessage(e,t){x(e,t)}clearAuthToken(e,t){b(e,t)}connect(e){let t=W(null,e);if(!t)return;let n=o(t.target);if(!n)return;let r=`${n.namespace}:${n.id}:${JSON.stringify(t.args)}`,i=N.get(r);i||(i=new M(r,n,t.args),N.set(r,i)),i.fetch()}disconnect(e){let t=W(null,e);if(!t)return;let r=o(t.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(t.args)}`,a=N.get(i);a&&(a.currentReqId&&n.delete(a.currentReqId),N.delete(i),this.debug&&console.log(`š ATMX Disconnected Stream: ${e}`))}send(e,t){let n=W(null,e);if(!n)return;let r=o(n.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(n.args)}`,a=N.get(i);a&&a.currentReqId?x(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}mutate(e,t,n){return L(e,t,n)}query(e,t={}){return I(e,t)}getCachedQueryData(e,t={}){return F(e,t)}mutateBytes(e,t,n,r={}){return L(e,t,{},{rawBody:n,headers:r})}invalidate(e,t){R(e,t)}setQueryData(e,t,n){z(e,t,n)}clearCache(e){B(e)}purgeCache(e){B(e,!1)}onError(e){document.addEventListener(`atmx:error`,t=>{e(t.detail)})}};typeof window<`u`&&(window.atmx=$),e.ATMX_VERSION=Q,e.allocBytes=m,e.allocString=h,e.atmx=$,e.buildRequestPath=s,e.clearAuthToken=b,e.initWasm=_,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=x,e.setAuthToken=v,e.setGlobalAuthToken=S,Object.defineProperty(e,`wasmEngine`,{enumerable:!0,get:function(){return d}})});
|
package/dist/axiom_runtime.wasm
CHANGED
|
Binary file
|
package/dist/core/query.d.ts
CHANGED
|
@@ -2,6 +2,19 @@ import { Route } from './router';
|
|
|
2
2
|
import { AtmxContextData } from './context';
|
|
3
3
|
export declare let globalReqCounter: number;
|
|
4
4
|
type Listener = (state: Partial<AtmxContextData>) => void;
|
|
5
|
+
export interface ProgrammaticQuery {
|
|
6
|
+
/** The immediately available cache snapshot, if this endpoint has one. */
|
|
7
|
+
getSnapshot(): Partial<AtmxContextData>;
|
|
8
|
+
/**
|
|
9
|
+
* Receives the cache value synchronously and every later revalidation
|
|
10
|
+
* result. The returned function is safe to call more than once.
|
|
11
|
+
*/
|
|
12
|
+
subscribe(listener: Listener): () => void;
|
|
13
|
+
/** Revalidate while retaining the current cache value on screen. */
|
|
14
|
+
refresh(): void;
|
|
15
|
+
/** Stops receiving updates; it never clears the shared Axiom cache. */
|
|
16
|
+
dispose(): void;
|
|
17
|
+
}
|
|
5
18
|
export declare class ActiveQuery {
|
|
6
19
|
key: string;
|
|
7
20
|
route: Route;
|
|
@@ -10,19 +23,37 @@ export declare class ActiveQuery {
|
|
|
10
23
|
listeners: Set<Listener>;
|
|
11
24
|
currentReqId: number | null;
|
|
12
25
|
constructor(key: string, route: Route, args: Record<string, any>);
|
|
13
|
-
subscribe(listener: Listener): void;
|
|
26
|
+
subscribe(listener: Listener): () => void;
|
|
14
27
|
update(newState: Partial<AtmxContextData>): void;
|
|
15
28
|
fetch(force?: boolean): void;
|
|
16
29
|
}
|
|
17
30
|
export declare const queryRegistry: Map<string, ActiveQuery>;
|
|
31
|
+
/**
|
|
32
|
+
* Reads only ATMX's contract cache. Applications should use this instead of
|
|
33
|
+
* implementing a second localStorage cache for endpoint responses.
|
|
34
|
+
*/
|
|
35
|
+
export declare function getCachedQueryData(routeKey: string, args?: Record<string, any>): any | null;
|
|
36
|
+
/**
|
|
37
|
+
* Starts a programmatic contract query with the exact same cache, runtime
|
|
38
|
+
* policy, authentication transport, and stale-while-revalidate behaviour as
|
|
39
|
+
* an `ax-query` element. This is intentionally not a mutation wrapper: GET
|
|
40
|
+
* endpoint cache policies are now honoured for imperative dashboard code.
|
|
41
|
+
*/
|
|
42
|
+
export declare function executeProgrammaticQuery(routeKey: string, args?: Record<string, any>): ProgrammaticQuery;
|
|
43
|
+
export interface ProgrammaticMutationOptions {
|
|
44
|
+
/** Raw request bytes for endpoints such as contract uploads. */
|
|
45
|
+
rawBody?: Uint8Array;
|
|
46
|
+
/** Headers are passed through the FFI boundary without touching auth. */
|
|
47
|
+
headers?: Record<string, string>;
|
|
48
|
+
}
|
|
18
49
|
/**
|
|
19
50
|
* IMPROVEMENT 1: Programmatic Mutations
|
|
20
51
|
*/
|
|
21
|
-
export declare function executeProgrammaticMutation(routeKey: string, args?: Record<string, any>, payloadObj?: Record<string, any
|
|
52
|
+
export declare function executeProgrammaticMutation(routeKey: string, args?: Record<string, any>, payloadObj?: Record<string, any>, options?: ProgrammaticMutationOptions): Promise<any>;
|
|
22
53
|
/**
|
|
23
54
|
* IMPROVEMENT 3: Cache Invalidation
|
|
24
55
|
*/
|
|
25
56
|
export declare function invalidateQuery(routeKey: string, args?: Record<string, any>): void;
|
|
26
57
|
export declare function setQueryData(routeKey: string, args: Record<string, any> | undefined, newData: any): void;
|
|
27
|
-
export declare function clearAllCaches(namespace?: string): void;
|
|
58
|
+
export declare function clearAllCaches(namespace?: string, revalidate?: boolean): void;
|
|
28
59
|
export {};
|
package/dist/core/types.d.ts
CHANGED
|
@@ -6,6 +6,12 @@ export interface AtmxConfig {
|
|
|
6
6
|
contracts: Record<string, AtmxContractConfig>;
|
|
7
7
|
debug?: boolean;
|
|
8
8
|
engineVersion?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Optional self-hosted runtime binary. Supplying this keeps the JavaScript
|
|
11
|
+
* facade and Wasm engine on the exact same release, which is important for
|
|
12
|
+
* applications that ship their own ATMX bundle.
|
|
13
|
+
*/
|
|
14
|
+
wasmUrl?: string;
|
|
9
15
|
disableCacheBuster?: boolean;
|
|
10
16
|
}
|
|
11
17
|
export declare enum EventType {
|
package/dist/core/wasm.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ export declare function allocString(str: string): {
|
|
|
7
7
|
len: number;
|
|
8
8
|
};
|
|
9
9
|
export declare function initWasm(config: AtmxConfig): Promise<InitResult>;
|
|
10
|
-
export declare function setAuthToken(namespace: string, identifier: string, token: string
|
|
11
|
-
export declare function setNamespaceAuthToken(namespace: string, token: string
|
|
10
|
+
export declare function setAuthToken(namespace: string, identifier: string, token: string): void;
|
|
11
|
+
export declare function setNamespaceAuthToken(namespace: string, token: string): void;
|
|
12
12
|
export declare function clearAuthToken(namespace: string, identifier: string): void;
|
|
13
13
|
export declare function sendStreamMessage(reqId: number, payload: any): void;
|
|
14
|
-
export declare function setGlobalAuthToken(token: string
|
|
14
|
+
export declare function setGlobalAuthToken(token: string): void;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AtmxConfig, AxiomError, InitResult } from './core/types';
|
|
2
|
-
export declare const ATMX_VERSION = "0.
|
|
2
|
+
export declare const ATMX_VERSION = "0.126.0";
|
|
3
3
|
declare class ATMX {
|
|
4
4
|
version: string;
|
|
5
5
|
initialized: boolean;
|
|
@@ -8,8 +8,13 @@ declare class ATMX {
|
|
|
8
8
|
hydrate(elementOrSelector?: string | HTMLElement): void;
|
|
9
9
|
triggerQuery(elementOrSelector: string | HTMLElement): void;
|
|
10
10
|
on(eventName: "ready" | "data" | "error" | "success" | "contract-loaded", callback: (e: any) => void): void;
|
|
11
|
+
/**
|
|
12
|
+
* Provides an explicit bearer/API-key credential for this runtime session.
|
|
13
|
+
* This value is never persisted by ATMX. Cookie sessions are automatic when
|
|
14
|
+
* the loaded contract declares `type = "session" location = "cookie"`.
|
|
15
|
+
*/
|
|
11
16
|
setAuthToken(namespace: string, methodName: string, token: string): void;
|
|
12
|
-
setNamespaceAuthToken(namespace: string, token: string
|
|
17
|
+
setNamespaceAuthToken(namespace: string, token: string): void;
|
|
13
18
|
setGlobalAuthToken(token: string): void;
|
|
14
19
|
sendStreamMessage(reqId: number, payload: any): void;
|
|
15
20
|
clearAuthToken(namespace: string, methodName: string): void;
|
|
@@ -17,9 +22,23 @@ declare class ATMX {
|
|
|
17
22
|
disconnect(rpcCall: string): void;
|
|
18
23
|
send(rpcCall: string, payload: any): void;
|
|
19
24
|
mutate(rpcCall: string, args?: Record<string, any>, payload?: any): Promise<any>;
|
|
25
|
+
/**
|
|
26
|
+
* Imperative counterpart to `ax-query`. It preserves an endpoint's Axiom
|
|
27
|
+
* cache policy, including cache-first stale-while-revalidate rendering.
|
|
28
|
+
*/
|
|
29
|
+
query(rpcCall: string, args?: Record<string, any>): import('./core/query').ProgrammaticQuery;
|
|
30
|
+
/** Returns the persisted ATMX cache snapshot without issuing a request. */
|
|
31
|
+
getCachedQueryData(rpcCall: string, args?: Record<string, any>): any;
|
|
32
|
+
/**
|
|
33
|
+
* Calls a contract endpoint with an opaque request body while retaining the
|
|
34
|
+
* same contract-driven authentication and cookie-session transport.
|
|
35
|
+
*/
|
|
36
|
+
mutateBytes(rpcCall: string, args: Record<string, any>, payload: Uint8Array, headers?: Record<string, string>): Promise<any>;
|
|
20
37
|
invalidate(rpcCall: string, args?: Record<string, any>): void;
|
|
21
38
|
setQueryData(rpcCall: string, args: Record<string, any>, data: any): void;
|
|
22
39
|
clearCache(namespace?: string): void;
|
|
40
|
+
/** Removes cached data without starting replacement network requests. */
|
|
41
|
+
purgeCache(namespace?: string): void;
|
|
23
42
|
onError(callback: (error: AxiomError) => void): void;
|
|
24
43
|
}
|
|
25
44
|
export declare const atmx: ATMX;
|