@livetemplate/client 0.11.8 → 0.11.9
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/livetemplate-client.browser.js +1 -1
- package/dist/livetemplate-client.browser.js.map +2 -2
- package/dist/livetemplate-client.d.ts.map +1 -1
- package/dist/livetemplate-client.js +10 -1
- package/dist/livetemplate-client.js.map +1 -1
- package/dist/tests/loading-lifecycle-empty-diff.test.d.ts +13 -0
- package/dist/tests/loading-lifecycle-empty-diff.test.d.ts.map +1 -0
- package/dist/tests/loading-lifecycle-empty-diff.test.js +57 -0
- package/dist/tests/loading-lifecycle-empty-diff.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
}
|
|
29
29
|
`,document.head.appendChild(t)}document.body.insertBefore(e,document.body.firstChild),this.bar=e}hide(){this.bar&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.bar=null)}enablePerActionIndicator(e){if(this.pendingHandler){if(this.currentDebounceMs===e)return;this.disablePerActionIndicator()}this.pendingCount=0,this.currentDebounceMs=e,this.pendingHandler=()=>{this.pendingCount++,this.pendingCount===1&&this.actionTimer===null&&this.bar===null&&(this.actionTimer=setTimeout(()=>{this.actionTimer=null,this.pendingCount>0&&this.show()},e))},this.updatedHandler=()=>{this.pendingCount=Math.max(0,this.pendingCount-1),this.pendingCount===0&&(this.actionTimer!==null&&(clearTimeout(this.actionTimer),this.actionTimer=null),this.hide())},document.addEventListener("lvt:pending",this.pendingHandler,!0),document.addEventListener("lvt:updated",this.updatedHandler,!0)}disablePerActionIndicator(){this.pendingHandler&&(document.removeEventListener("lvt:pending",this.pendingHandler,!0),this.pendingHandler=null),this.updatedHandler&&(document.removeEventListener("lvt:updated",this.updatedHandler,!0),this.updatedHandler=null),this.actionTimer!==null&&(clearTimeout(this.actionTimer),this.actionTimer=null),this.pendingCount=0,this.currentDebounceMs=null,this.hide()}};var Me=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(s=>{s.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(s=>{s.disabled=!1})})}};var tn=!1;function ir(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("commandfor");if(!n)return;let r=t.getAttribute("command"),s=document.getElementById(n);s&&(s instanceof HTMLDialogElement?r==="show-modal"&&!s.open?s.showModal():r==="close"&&s.open&&s.close():s instanceof HTMLElement&&s.hasAttribute("popover")&&(r==="show-popover"&&typeof s.showPopover=="function"?s.showPopover():r==="hide-popover"&&typeof s.hidePopover=="function"?s.hidePopover():r==="toggle-popover"&&typeof s.togglePopover=="function"&&s.togglePopover()))}function nn(){"commandForElement"in HTMLButtonElement.prototype||tn||(tn=!0,document.addEventListener("click",ir))}var re="__lvt_scroll_away",q=[];function sr(){for(let i=q.length-1;i>=0;i--){let e=q[i];e.trigger.isConnected||(e.target.removeEventListener("scroll",e.handler),delete e.trigger[re],q.splice(i,1))}}function sn(i){sr();let e=t=>{let n=t.getAttribute("lvt-scroll-away");if(!n)return;if(n!=="bottom"&&n!=="top"){console.warn(`Unknown lvt-scroll-away edge: ${n}`);return}let r=G(t);if(!r||r===t){let u=t[re];u&&(u.target.removeEventListener("scroll",u.handler),rn(u),delete t[re]),console.warn("lvt-scroll-away requires data-lvt-target pointing to a scrollable container");return}let s=t[re];if(s){if(s.target===r)return;s.target.removeEventListener("scroll",s.handler),rn(s)}let a=parseInt(getComputedStyle(t).getPropertyValue("--lvt-scroll-threshold").trim(),10),o=isNaN(a)?200:a,c=!1,l=()=>{c||(c=!0,requestAnimationFrame(()=>{c=!1,(n==="top"?r.scrollTop:r.scrollHeight-r.scrollTop-r.clientHeight)>o?t.classList.add("visible"):t.classList.remove("visible")}))};r.addEventListener("scroll",l,{passive:!0}),l();let d={trigger:t,target:r,handler:l};t[re]=d,q.push(d)};e(i),i.querySelectorAll("[lvt-scroll-away]").forEach(e)}function rn(i){let e=q.indexOf(i);e!==-1&&q.splice(e,1)}function on(i){for(let e=q.length-1;e>=0;e--){let t=q[e];i&&t.trigger.isConnected&&!i.contains(t.trigger)||(t.target.removeEventListener("scroll",t.handler),t.trigger.classList.remove("visible"),delete t.trigger[re],q.splice(e,1))}}var an="lvt-active",Ye="__lvt_spy",se="__lvt_spy_link_handler",P=[],ln=new WeakSet;function or(){for(let i=P.length-1;i>=0;i--){let e=P[i];e.container.isConnected||(Xe(e),P.splice(i,1))}if(P.length===0){let i=document[se];i&&(document.removeEventListener("click",i),delete document[se])}}function Xe(i){ie(i,null),i.scrollTarget.removeEventListener("scroll",i.scrollHandler),window.removeEventListener("resize",i.resizeHandler),delete i.container[Ye]}function Ge(i){let e=getComputedStyle(i).getPropertyValue("--lvt-spy-margin").trim(),t=Math.round(window.innerHeight*.25);if(!e)return t;let n=parseFloat(e);return isNaN(n)?t:e.endsWith("vh")?Math.round(n/100*window.innerHeight):e.endsWith("px")||/^-?\d+(\.\d+)?$/.test(e)?n:(console.warn(`lvt-spy: unsupported --lvt-spy-margin unit ${JSON.stringify(e)}; supported units are vh and px (or unitless). Falling back to 25vh.`),t)}function un(i){let e=i.getAttribute("lvt-spy");if(e&&e.trim()!=="")try{return Array.from(i.querySelectorAll(e))}catch(t){return console.warn(`lvt-spy: invalid selector ${JSON.stringify(e)}:`,t),[]}return[i]}function ie(i,e){for(let t of i.links){let n=t.getAttribute("href")||"",r=n.startsWith("#")?n.slice(1):"";e!==null&&r===e?t.classList.add(an):t.classList.remove(an)}}function pn(i){let e=new Set;for(let n of i.targets)n.id&&e.add(n.id);let t=[];document.querySelectorAll("[lvt-spy-link]").forEach(n=>{let r=n.getAttribute("href")||"",s=r.startsWith("#")?r.slice(1):"";e.has(s)&&t.push(n)}),i.links=t}function ar(i){for(let e of P)for(let t of e.targets)if(t.id===i)return e;return null}function xe(i,e){let t=null;for(let n of i){if(!n.id)continue;n.getBoundingClientRect().top<=e&&(t=n.id)}return t}function lr(i){let e=i.parentElement;for(;e&&e!==document.documentElement;){let t=getComputedStyle(e).overflowY;if(t==="auto"||t==="scroll"||t==="overlay")return e;e=e.parentElement}return window}function cr(i,e){if(i.length!==e.length)return!1;for(let t=0;t<i.length;t++)if(i[t]!==e[t])return!1;return!0}function cn(i,e){let t=e!=null?e:un(i);if(t.length===0)return;let n=t.filter(a=>!a.id&&!ln.has(a));if(n.length>0){console.warn(`lvt-spy: ${n.length} target(s) without an id attribute; they cannot be linked from [lvt-spy-link]. Add id="..." or drop them from the selector. First offender:`,n[0]);for(let a of n)ln.add(a)}let r={container:i,targets:t,marginPx:Ge(i),links:[],scrollTarget:lr(i),scrollHandler:()=>{},resizeHandler:()=>{}};pn(r);let s=!1;r.scrollHandler=()=>{s||(s=!0,requestAnimationFrame(()=>{s=!1,ie(r,xe(r.targets,r.marginPx))}))},r.resizeHandler=()=>{r.marginPx=Ge(r.container),ie(r,xe(r.targets,r.marginPx))},r.scrollTarget.addEventListener("scroll",r.scrollHandler,{passive:!0}),window.addEventListener("resize",r.resizeHandler,{passive:!0}),i[Ye]=r,P.push(r),ie(r,xe(r.targets,r.marginPx))}function dn(i){let e=i[Ye];if(e){let t=un(i);if(cr(e.targets,t)){e.marginPx=Ge(i),pn(e),ie(e,xe(e.targets,e.marginPx));return}Xe(e);let n=P.indexOf(e);n!==-1&&P.splice(n,1),cn(i,t);return}cn(i)}function dr(){if(document[se])return;let i=e=>{var a;let t=(a=e.target)==null?void 0:a.closest("[lvt-spy-link]");if(!t)return;let n=t.getAttribute("href")||"",r=n.startsWith("#")?n.slice(1):"";if(!r)return;let s=ar(r);s&&ie(s,r)};document.addEventListener("click",i,{passive:!0}),document[se]=i}function fn(i){or(),dr(),i.hasAttribute("lvt-spy")&&dn(i),i.querySelectorAll("[lvt-spy]").forEach(dn)}function gn(i){for(let e=P.length-1;e>=0;e--){let t=P[e];i&&t.container.isConnected&&!i.contains(t.container)||(Xe(t),P.splice(e,1))}if(P.length===0){let e=document[se];e&&(document.removeEventListener("click",e),delete document[se])}}function hn(i){return typeof structuredClone=="function"?structuredClone(i):JSON.parse(JSON.stringify(i))}function ur(i){return i!=null&&typeof i=="object"&&Array.isArray(i.d)&&Array.isArray(i.s)}function Je(i,e=0){if(e>50||i==null||typeof i!="object"||Array.isArray(i))return!1;if(ur(i))return!0;for(let n of Object.keys(i))if(/^\d+$/.test(n)){let r=i[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&Je(r,e+1))return!0}return!1}function pr(i,e){if(!e.s||!Array.isArray(e.s))return!1;if(Je(i)&&!Je(e))return!0;for(let t of Object.keys(i))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var He=class{constructor(e){this.logger=e;this.treeState={};this.rangeState={};this.rangeIdKeys={}}applyUpdate(e,t){var c,l;let n=!1,r=[],s=new Set;for(let[d,u]of Object.entries(e))if(Array.isArray(u)&&u.length>0&&Array.isArray(u[0])&&typeof u[0][0]=="string"){let g=this.treeState[d];g&&typeof g=="object"&&!Array.isArray(g)&&Array.isArray(g.d)&&Array.isArray(g.s)?((c=t==null?void 0:t.canApplyTargeted)==null?void 0:c.call(t,g,d))===!0?(this.applyDifferentialOpsToRange(g,u,d),r.push({rangePath:d,ops:u,statics:g.s,idKey:(l=g.m)==null?void 0:l.idKey}),s.add(d)):(this.treeState[d]=hn(g),this.applyDifferentialOpsToRange(this.treeState[d],u,d)):this.treeState[d]=u,n=!0}else{let g=this.treeState[d],h=typeof u=="object"&&u!==null&&!Array.isArray(u)?this.deepMergeTreeNodes(g,u,d):u;JSON.stringify(g)!==JSON.stringify(h)&&(this.treeState[d]=h,n=!0)}let o={html:this.reconstructFromTree(this.treeState,"",s.size>0?s:void 0),changed:n};return r.length>0&&(o.targetedOps=r),o}reset(){this.treeState={},this.rangeState={},this.rangeIdKeys={}}getTreeState(){return{...this.treeState}}getStaticStructure(){return this.treeState.s||null}renderState(){return this.reconstructFromTree(this.treeState,"")}deepMergeTreeNodes(e,t,n=""){var s;if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if(pr(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[a,o]of Object.entries(t)){let c=n?`${n}.${a}`:a,l=Array.isArray(o)&&o.length>0&&Array.isArray(o[0])&&typeof o[0][0]=="string",d=r[a]&&typeof r[a]=="object"&&!Array.isArray(r[a])&&Array.isArray(r[a].d)&&Array.isArray(r[a].s);l&&d?(r[a]=hn(r[a]),this.logger.debug(`[deepMerge] Applying diff ops at path ${c}`,{ops:o,rangeItems:(s=r[a].d)==null?void 0:s.length}),this.applyDifferentialOpsToRange(r[a],o,c)):typeof o=="object"&&o!==null&&!Array.isArray(o)&&typeof r[a]=="object"&&r[a]!==null&&!Array.isArray(r[a])?r[a]=this.deepMergeTreeNodes(r[a],o,c):r[a]=o}return r}applyDifferentialOpsToRange(e,t,n){if(!e||typeof e!="object"||!Array.isArray(e.d)||!Array.isArray(e.s)){this.logger.error(`[applyDiffOpsToRange] Invalid rangeStructure at path ${n}`,{rangeStructure:e});return}let r=e.d;this.rangeState[n]||(this.rangeState[n]={items:r,statics:e.s}),e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[n]=e.m.idKey),this.logger.debug(`[applyDiffOpsToRange] path=${n}, idKey=${this.rangeIdKeys[n]}, items=${r.length}, ops=${t.length}`);for(let s of t){if(!Array.isArray(s)||s.length<2)continue;switch(s[0]){case"r":{let o=s[1],c=this.findItemIndexByKey(r,o,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${o}, index=${c}, total=${r.length}`),c>=0?(r.splice(c,1),this.logger.debug(`[applyDiffOpsToRange] After removal: ${r.length} items`)):this.logger.debug(`[applyDiffOpsToRange] Remove failed: key ${o} not found`);break}case"u":{let o=this.findItemIndexByKey(r,s[1],e.s,n),c=s[2];o>=0&&c&&(r[o]=this.mergeRangeItem(r[o],c,n));break}case"a":{let o=Array.isArray(s[1])?s[1]:[s[1]];s[2]&&(e.s=s[2]),r.push(...o),s[3]&&typeof s[3]=="object"&&s[3].idKey&&(this.rangeIdKeys[n]=s[3].idKey);break}case"p":{let o=Array.isArray(s[1])?s[1]:[s[1]];s[2]&&(e.s=s[2]),r.unshift(...o);break}case"i":{let o=this.findItemIndexByKey(r,s[1],e.s,n);if(o>=0){let c=Array.isArray(s[2])?s[2]:[s[2]];r.splice(o+1,0,...c)}break}case"o":{let o=s[1],c=[],l=new Map;for(let d of r){let u=this.getItemKey(d,e.s,n);u&&l.set(u,d)}for(let d of o){let u=l.get(d);u&&c.push(u)}r.length=0,r.push(...c);break}default:break}}this.rangeState[n]={items:r,statics:e.s}}reconstructFromTree(e,t,n){if(e.s&&Array.isArray(e.s)){let r="";for(let s=0;s<e.s.length;s++){let a=e.s[s];if(r+=a,s<e.s.length-1){let o=s.toString();if(e[o]!==void 0){let c=t?`${t}.${o}`:o;if(n&&n.has(c)){r+=`<!--lvt-targeted-skip:${c}-->`;continue}r+=this.renderValue(e[o],o,c)}}}return r=r.replace(/<root>/g,"").replace(/<\/root>/g,""),r}return this.renderValue(e,"",t)}renderValue(e,t,n){if(e==null||typeof e=="string"&&e.startsWith("{{")&&e.endsWith("}}"))return"";if(typeof e=="object"&&!Array.isArray(e)){if(e.d&&Array.isArray(e.d)&&e.s&&Array.isArray(e.s)){let a=n||t||"";return a&&(this.rangeState[a]={items:e.d,statics:e.s},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[a]=e.m.idKey)),this.renderRangeStructure(e,t,n)}if("s"in e&&Array.isArray(e.s))return this.reconstructFromTree(e,n||"");let r=Object.keys(e),s=r.filter(a=>/^\d+$/.test(a)).sort((a,o)=>parseInt(a)-parseInt(o));if(s.length>0&&s.length===r.length)return s.map(a=>{let o=n?`${n}.${a}`:a;return this.renderValue(e[a],a,o)}).join("")}return Array.isArray(e)?e.length>0&&Array.isArray(e[0])&&typeof e[0][0]=="string"?this.applyDifferentialOperations(e,n):e.map((r,s)=>{let a=s.toString(),o=n?`${n}.${a}`:a;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,o):this.renderValue(r,a,o)}).join(""):typeof e=="object"?(this.logger.debug("Skipping plain object value (not a tree node) - this is normal for state-only data"),""):String(e)}renderRangeStructure(e,t,n){let{d:r,s}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let a="else",o=n?`${n}.else`:"else";return this.renderValue(e.else,a,o)}return""}return s&&Array.isArray(s)?r.map((a,o)=>this.renderRangeItem(a,o,s,n)).join(""):r.map((a,o)=>{let c=o.toString(),l=n?`${n}.${c}`:c;return this.renderValue(a,c,l)}).join("")}renderRangeItem(e,t,n,r){let s=n,a="";for(let o=0;o<s.length;o++)if(a+=s[o],o<s.length-1){let c=o.toString();if(e[c]!==void 0){let l=r?`${r}.${t}.${c}`:`${t}.${c}`;a+=this.renderValue(e[c],c,l)}}return a}applyDifferentialOperations(e,t){if(!t||!this.rangeState[t])return"";let n=this.rangeState[t],r=[...n.items],s=n.statics;for(let o of e){if(!Array.isArray(o)||o.length<2)continue;switch(o[0]){case"r":{let l=this.findItemIndexByKey(r,o[1],s,t);l>=0&&r.splice(l,1);break}case"u":{let l=this.findItemIndexByKey(r,o[1],s,t),d=o[2];l>=0&&d&&(r[l]=this.mergeRangeItem(r[l],d,t||""));break}case"a":{this.addItemsToRange(r,o[1],o[2],n,!1),o[3]&&typeof o[3]=="object"&&o[3].idKey&&(this.rangeIdKeys[t||""]=o[3].idKey);break}case"p":{this.addItemsToRange(r,o[1],o[2],n,!0);break}case"i":{let l=this.findItemIndexByKey(r,o[1],s,t);if(l>=0){let d=Array.isArray(o[2])?o[2]:[o[2]];r.splice(l+1,0,...d)}break}case"o":{let l=o[1],d=[],u=new Map;for(let p of r){let g=this.getItemKey(p,s,t);g&&u.set(g,p)}for(let p of l){let g=u.get(p);g&&d.push(g)}r.length=0,r.push(...d);break}default:break}}this.rangeState[t]={items:r,statics:n.statics},this.treeState[t]={d:r,s:n.statics};let a=this.getCurrentRangeStructure(t);return a&&a.s?this.renderItemsWithStatics(r,a.s,t):r.map(o=>this.renderValue(o)).join("")}getCurrentRangeStructure(e){if(this.rangeState[e])return{d:this.rangeState[e].items,s:this.rangeState[e].statics};let t=this.treeState[e];return t&&typeof t=="object"&&t.s?t:null}renderItemsWithStatics(e,t,n){let r=e.map((s,a)=>this.renderRangeItem(s,a,t,n)).join("");return this.logger.isDebugEnabled()&&(this.logger.debug("[renderItemsWithStatics] statics:",t),this.logger.debug("[renderItemsWithStatics] items count:",e.length),this.logger.debug("[renderItemsWithStatics] result snippet:",r.substring(0,200))),r}addItemsToRange(e,t,n,r,s){if(n&&(r.statics=n),!t)return;let a=Array.isArray(t)?t:[t];s?e.unshift(...a):e.push(...a)}getItemKey(e,t,n){if(e._k&&typeof e._k=="string")return e._k;if(!n||!this.rangeIdKeys[n])return null;let r=this.rangeIdKeys[n];return e[r]||null}findItemIndexByKey(e,t,n,r){return e.findIndex(s=>this.getItemKey(s,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};var Qe=["data-key","data-lvt-key"],fr=Qe.map(i=>new RegExp(`(?:^|[\\s<])${i}\\s*=`)),Q="data-lvt-targeted-applied",Z="data-lvt-targeted-skip",Re=class{constructor(e){this.ctx=e;this.containerCache=new Map}invalidate(){this.containerCache.clear()}invalidatePath(e){this.containerCache.delete(e)}findContainer(e,t,n){let r=this.containerCache.get(t);if(r&&r.isConnected&&e.contains(r))return r;if(r&&this.containerCache.delete(t),n===void 0)return null;let s=this.findItemByKey(e,n);if(!s||!s.parentElement)return null;let a=s.parentElement;return this.containerCache.set(t,a),a}canApplyTargeted(e,t,n){if(!t||typeof t!="object")return{ok:!1,reason:"no range structure"};if(!Array.isArray(t.s)||t.s.length===0)return{ok:!1,reason:"no statics"};let r=[t.s];if(t.sm&&typeof t.sm=="object")for(let d of Object.values(t.sm))Array.isArray(d)&&r.push(d);if(!r.some(d=>this.staticsContainKeyAttribute(d)))return{ok:!1,reason:"no data-key attribute in statics"};let a=t.d;if(Array.isArray(a)){for(let d of a)if(this.itemHasNestedRange(d))return{ok:!1,reason:"nested-range item"}}let o=this.extractItemKey(a==null?void 0:a[0],t),c=this.findContainer(e,n,o);if(!c)return{ok:!1,reason:"container not found in DOM"};let l=c;for(;l;){if(l.hasAttribute("lvt-ignore"))return{ok:!1,reason:"lvt-ignore ancestor"};if(l===e)break;l=l.parentElement}return{ok:!0,container:c,containerKey:o}}apply(e,t,n){let{rangePath:r,ops:s,statics:a}=t,o=this.firstKnownKey(s),c=this.findContainer(e,r,o);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] container not found for range ${r}; cannot apply`),null;let l=!0;for(let d of s){if(!Array.isArray(d)||d.length<1)continue;let u=d[0];try{let p=!0;switch(u){case"r":p=this.applyRemove(c,d[1]);break;case"u":p=this.applyUpdateRow(c,d[1],a,r,n);break;case"i":p=this.applyInsertAfter(c,d[1],d[2],a,r);break;case"a":p=this.applyAppend(c,d[1],a,r);break;case"p":p=this.applyPrepend(c,d[1],a,r);break;case"o":p=this.applyReorder(c,d[1]);break;default:this.ctx.logger.warn(`[RangeDomApplier] unknown op type ${u}; falling back`),p=!1}p||(l=!1)}catch(p){return this.ctx.logger.error(`[RangeDomApplier] op ${u} failed for range ${r}`,p),null}}return l?(typeof window!="undefined"&&"__lvtTargetedHits"in window&&window.__lvtTargetedHits++,c):null}cleanupMarkers(e){e.querySelectorAll(`[${Q}]`).forEach(r=>r.removeAttribute(Q)),e.hasAttribute(Q)&&e.removeAttribute(Q),e.querySelectorAll(`[${Z}]`).forEach(r=>r.removeAttribute(Z)),e.hasAttribute(Z)&&e.removeAttribute(Z)}applyRemove(e,t){let n=this.findItemByKey(e,t);return n?(this.fireHookOnSubtree(n,"lvt-destroyed"),n.remove(),!0):(this.ctx.logger.debug(`[RangeDomApplier] r: row with key ${t} not found (idempotent no-op)`),!0)}applyUpdateRow(e,t,n,r,s){var u,p;let a=this.findItemByKey(e,t);if(!a)return this.ctx.logger.debug(`[RangeDomApplier] u: row with key ${t} not found in DOM; falling back`),!1;let o=this.indexOfChild(e,a),c=this.lookupCurrentItem(r,t);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] u: item state for key ${t} not available; falling back`),!1;let l=this.ctx.renderItem(c,o,n,r),d=this.parseSingleRow(l);return d?(s?fe(a,d,{...s,childrenOnly:!1}):(this.fireHookOnSubtree(a,"lvt-destroyed"),a.replaceWith(d),(p=(u=this.ctx).onNodeAdded)==null||p.call(u,d),this.fireHookOnSubtree(d,"lvt-mounted")),!0):(this.ctx.logger.warn("[RangeDomApplier] u: failed to parse rendered row HTML; falling back"),!1)}applyInsertAfter(e,t,n,r,s){let a=this.findItemByKey(e,t);return a?this.renderItemsAtomic(n,r,s,this.indexOfChild(e,a)+1,o=>e.insertBefore(o,a.nextSibling)):(this.ctx.logger.debug(`[RangeDomApplier] i: anchor key ${t} not found; falling back`),!1)}applyAppend(e,t,n,r){return this.renderItemsAtomic(t,n,r,e.children.length,s=>e.appendChild(s))}applyPrepend(e,t,n,r){return this.renderItemsAtomic(t,n,r,0,s=>e.insertBefore(s,e.firstChild))}renderItemsAtomic(e,t,n,r,s){var l,d;let a=Array.isArray(e)?e:[e],o=document.createDocumentFragment(),c=[];for(let u=0;u<a.length;u++){let p=this.renderAndParse(a[u],r+u,t,n);if(!p)return!1;o.appendChild(p),c.push(p)}s(o);for(let u of c)(d=(l=this.ctx).onNodeAdded)==null||d.call(l,u),this.fireHookOnSubtree(u,"lvt-mounted");return!0}applyReorder(e,t){if(!Array.isArray(t))return!1;let n=new Map;Array.from(e.children).forEach(a=>{for(let o of Qe){let c=a.getAttribute(o);if(c!==null){n.set(c,a);break}}});let r=document.createDocumentFragment(),s=new Set(t);for(let a of t){let o=n.get(a);o&&r.appendChild(o)}if(s.size<n.size){this.ctx.logger.warn(`[RangeDomApplier] o: newKeyOrder (${s.size}) shorter than existing children (${n.size}); ${n.size-s.size} children will be dropped`);for(let[a,o]of n)s.has(a)||this.fireHookOnSubtree(o,"lvt-destroyed")}return e.replaceChildren(r),!0}renderAndParse(e,t,n,r){let s=this.ctx.renderItem(e,t,n,r);return this.parseSingleRow(s)}parseSingleRow(e){let t=document.createElement("template");t.innerHTML=e.trim();let n=t.content.firstElementChild;return n!=null?n:null}findItemByKey(e,t){let n;typeof CSS!="undefined"&&typeof CSS.escape=="function"?n=CSS.escape(t):(/[\[\]():.#>~+*=^$|! \t\n\r]/.test(t)&&this.ctx.logger.warn(`[RangeDomApplier] CSS.escape unavailable; key "${t}" contains characters that need escaping. Lookup may miss the row.`),n=t.replace(/(["\\])/g,"\\$1"));for(let r of Qe){let s=e.querySelector(`[${r}="${n}"]`);if(s)return s}return null}indexOfChild(e,t){let n=0,r=e.firstElementChild;for(;r;){if(r===t)return n;n++,r=r.nextElementSibling}return-1}firstKnownKey(e){for(let t of e){if(!Array.isArray(t)||t.length<2)continue;let n=t[0];if(n==="r"||n==="u"||n==="i")return typeof t[1]=="string"?t[1]:void 0;if(n==="o"&&Array.isArray(t[1])&&t[1].length>0)return typeof t[1][0]=="string"?t[1][0]:void 0;if(n==="a"||n==="p"){let r=Array.isArray(t[1])?t[1]:[t[1]];for(let s of r)if(s&&typeof s=="object"&&s._k!==void 0)return String(s._k)}}}staticsContainKeyAttribute(e){for(let t of e)if(typeof t=="string"){for(let n of fr)if(n.test(t))return!0}return!1}itemHasNestedRange(e){if(!e||typeof e!="object")return!1;for(let[t,n]of Object.entries(e))if(!t.startsWith("_")&&n&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.d)&&Array.isArray(r.s)||this.itemHasNestedRange(r))return!0}return!1}extractItemKey(e,t){var r;if(!e||typeof e!="object")return;if(e._k!==void 0)return String(e._k);let n=(r=t==null?void 0:t.m)==null?void 0:r.idKey;if(n&&e[n]!==void 0)return String(e[n])}lookupCurrentItem(e,t){return this.ctx.itemLookup(e,t)}fireHookOnSubtree(e,t){e.hasAttribute(t)&&this.ctx.executeLifecycleHook(e,t),e.querySelectorAll(`[${t}]`).forEach(r=>this.ctx.executeLifecycleHook(r,t))}};var Ce=class{constructor(){this.activeForm=null;this.activeButton=null;this.originalButtonText=null}setActiveSubmission(e,t,n){if(this.activeForm=e,this.activeButton=t,this.originalButtonText=n,e){e.setAttribute("aria-busy","true");let r=e.querySelector("fieldset");r&&(r.disabled=!0)}}handleResponse(e){this.activeForm&&this.activeForm.dispatchEvent(new CustomEvent("lvt:done",{detail:e})),e.success?this.handleSuccess(e):this.handleError(e),this.restoreFormState()}reset(){this.restoreFormState()}handleSuccess(e){if(!this.activeForm)return;this.activeForm.dispatchEvent(new CustomEvent("lvt:success",{detail:e}));let t=this.activeForm.closest("dialog");t&&t.open&&t.close(),this.activeForm.hasAttribute("lvt-form:preserve")||this.activeForm.reset()}handleError(e){this.activeForm&&this.activeForm.dispatchEvent(new CustomEvent("lvt:error",{detail:e}))}restoreFormState(){if(this.activeForm){this.activeForm.removeAttribute("aria-busy");let e=this.activeForm.querySelector("fieldset");e&&(e.disabled=!1)}this.activeButton&&this.originalButtonText!==null&&(this.activeButton.disabled=!1,this.activeButton.textContent=this.originalButtonText),this.activeForm=null,this.activeButton=null,this.originalButtonText=null}};var De=class{constructor(e,t){this.context=e;this.logger=t;this.boundFields=new Map;this.enabled=!1;this.wiredElements=new Set;this.elementCleanups=new Map}setCapabilities(e){this.enabled=e.includes("change"),this.logger.debug("Capabilities received, change auto-wiring:",this.enabled?"enabled":"disabled")}analyzeStatics(e){let t=this.boundFields.size;this.walkTree(e),this.boundFields.size>t&&this.logger.debug(`Detected ${this.boundFields.size} bound field(s):`,Array.from(this.boundFields.keys()))}wireElements(){if(!this.enabled)return;let e=this.context.getWrapperElement();if(!e)return;for(let n of this.elementCleanups.keys())n.isConnected||(this.elementCleanups.get(n)(),this.elementCleanups.delete(n),this.wiredElements.delete(n));for(let[n,r]of this.boundFields){let s=this.escapeCSSSelector(n),a=e.querySelectorAll(`[name="${s}"]`);for(let o of a){if(this.wiredElements.has(o)||o.hasAttribute("lvt-input")||o.hasAttribute("lvt-change"))continue;let c=o.closest("form");c&&(c.hasAttribute("lvt-change")||ne(c,"lvt-form:no-intercept",this.logger))||o instanceof HTMLInputElement&&(o.type==="hidden"||o.type==="submit"||o.type==="button")||o instanceof HTMLButtonElement||(this.attachListener(o,n,r),this.wiredElements.add(o))}}let t=e.querySelectorAll("select[name]");for(let n of t){if(this.wiredElements.has(n)||n.hasAttribute("lvt-input")||n.hasAttribute("lvt-change"))continue;let r=n.closest("form");if(r&&(r.hasAttribute("lvt-change")||r.hasAttribute("lvt-form:no-intercept")))continue;let s=n.getAttribute("name");s&&(this.attachListener(n,s,"value"),this.wiredElements.add(n))}}teardown(){for(let e of this.elementCleanups.values())e();this.elementCleanups.clear(),this.wiredElements.clear(),this.boundFields.clear(),this.enabled=!1}getBoundFields(){return this.boundFields}isEnabled(){return this.enabled}walkTree(e){if(!(!e||typeof e!="object"||Array.isArray(e))){e.s&&Array.isArray(e.s)&&this.analyzeStaticsArray(e.s);for(let t of Object.keys(e))if(/^\d+$/.test(t)){let n=e[t];n&&typeof n=="object"&&!Array.isArray(n)&&this.walkTree(n)}if(e.d&&Array.isArray(e.d))for(let t of e.d)t&&typeof t=="object"&&!Array.isArray(t)&&this.walkTree(t)}}analyzeStaticsArray(e){for(let t=0;t<e.length-1;t++){let n=e[t],r=e[t+1],s=this.detectBinding(n,r);s&&!this.boundFields.has(s.fieldName)&&this.boundFields.set(s.fieldName,s.bindingType)}}detectBinding(e,t){let n=this.detectValueBinding(e);return n?{fieldName:n,bindingType:"value"}:(n=this.detectTextareaBinding(e,t),n?{fieldName:n,bindingType:"content"}:(n=this.detectAttributeBinding(e,t),n?{fieldName:n,bindingType:"attribute"}:null))}escapeCSSSelector(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}extractUnclosedTag(e){let t=e.lastIndexOf("<"),n=e.lastIndexOf(">");return t===-1||t<=n?null:e.substring(t)}extractNameFromTag(e){let t=e.match(/\sname="([^"]+)"/);return t?t[1]:null}detectValueBinding(e){if(!e.endsWith('value="'))return null;let t=this.extractUnclosedTag(e);return t?this.extractNameFromTag(t):null}detectTextareaBinding(e,t){if(!t.startsWith("</textarea"))return null;let n=e.match(/<textarea[^>]*\sname="([^"]+)"[^>]*>$/);return n?n[1]:null}detectAttributeBinding(e,t){if(!e.endsWith(" ")||!/^[a-zA-Z>/\s]/.test(t))return null;let n=this.extractUnclosedTag(e);if(!n||!/^<input\s/i.test(n))return null;let r=n.match(/\stype="([^"]+)"/i);if(!r)return null;let s=r[1].toLowerCase();return s!=="checkbox"&&s!=="radio"?null:this.extractNameFromTag(n)}attachListener(e,t,n){let r=e.getAttribute("lvt-debounce"),s=r?parseInt(r,10):NaN,a=Number.isNaN(s)||s<0?300:s,c=ce(()=>{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},a),l=n==="attribute"||e instanceof HTMLSelectElement?"change":"input";e.addEventListener(l,c),this.elementCleanups.set(e,()=>{e.removeEventListener(l,c)}),this.logger.debug(`Auto-wired ${l} listener on [name="${t}"] (debounce: ${a}ms)`)}};var Ze=class{constructor(e){this.options=e;this.socket=null;this.reconnectTimer=null;this.manuallyClosed=!1;this.reconnectAttempts=0}connect(){this.manuallyClosed=!1,this.clearReconnectTimer(),this.socket=new WebSocket(this.options.url);let e=this.socket;e.onopen=()=>{var t,n;this.reconnectAttempts=0,(n=(t=this.options).onOpen)==null||n.call(t,e)},e.onmessage=t=>{var n,r;(r=(n=this.options).onMessage)==null||r.call(n,t)},e.onclose=t=>{var n,r;(r=(n=this.options).onClose)==null||r.call(n,t),!this.manuallyClosed&&this.options.autoReconnect&&this.scheduleReconnect()},e.onerror=t=>{var n,r;(r=(n=this.options).onError)==null||r.call(n,t)}}send(e){this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(e)}disconnect(){var e,t;this.manuallyClosed=!0,this.clearReconnectTimer(),this.socket&&(this.socket.readyState!==WebSocket.CLOSED&&((t=(e=this.options).onClose)==null||t.call(e,new CloseEvent("close",{code:1e3,reason:"",wasClean:this.socket.readyState===WebSocket.OPEN}))),this.socket.onopen=null,this.socket.onmessage=null,this.socket.onclose=null,this.socket.onerror=null,this.socket.close(),this.socket=null)}getSocket(){return this.socket}scheduleReconnect(){var o,c,l,d,u;this.clearReconnectTimer();let e=(o=this.options.maxReconnectAttempts)!=null?o:10;if(e>0&&this.reconnectAttempts>=e){(l=(c=this.options).onReconnectFailed)==null||l.call(c);return}this.reconnectAttempts++;let t=(d=this.options.reconnectDelay)!=null?d:1e3,n=(u=this.options.maxReconnectDelay)!=null?u:16e3,r=t*Math.pow(2,this.reconnectAttempts-1),s=Math.random()*1e3,a=Math.min(r+s,n);this.reconnectTimer=window.setTimeout(()=>{var p,g;(g=(p=this.options).onReconnectAttempt)==null||g.call(p,this.reconnectAttempts,a),this.connect()},a)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}},Ie=class{constructor(e){this.config=e;this.transport=null;this.liveUrlOverride=null}setLiveUrl(e){this.liveUrlOverride=e}async connect(){var d;let e=this.getLiveUrl();if(!await hr(e,this.config.logger))return{usingWebSocket:!1,initialState:await mn(e,this.config.logger)};let n,r,s=new Promise((u,p)=>{n=u,r=p}),a=!1,o=!1,c=null,l=u=>{a||(a=!0,c!==null&&(clearTimeout(c),c=null),u?r(u):n({usingWebSocket:!0}))};c=setTimeout(()=>{l(new Error("WebSocket open timed out after 10s"))},1e4),this.transport=new Ze({url:this.getWebSocketUrl(),autoReconnect:this.config.options.autoReconnect,reconnectDelay:this.config.options.reconnectDelay,maxReconnectDelay:16e3,maxReconnectAttempts:10,onOpen:()=>{o=!0,this.config.onConnected(),l()},onMessage:u=>{try{let p=JSON.parse(u.data);this.config.onMessage(p,u)}catch(p){this.config.logger.error("Failed to parse WebSocket message:",p)}},onClose:()=>{o?this.config.onDisconnected():l(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(u,p)=>{var g,h;(h=(g=this.config).onReconnectAttempt)==null||h.call(g,u,p)},onReconnectFailed:()=>{var u,p;(p=(u=this.config).onReconnectFailed)==null||p.call(u)},onError:u=>{var p,g;(g=(p=this.config).onError)==null||g.call(p,u),l(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await s}catch(u){return this.config.logger.warn("WebSocket open failed, falling back to HTTP",u),(d=this.transport)==null||d.disconnect(),this.transport=null,{usingWebSocket:!1,initialState:await mn(e,this.config.logger)}}}disconnect(){var e;(e=this.transport)==null||e.disconnect(),this.transport=null}send(e){var t;(t=this.transport)==null||t.send(e)}getReadyState(){var e,t;return(t=(e=this.transport)==null?void 0:e.getSocket())==null?void 0:t.readyState}getSocket(){var e,t;return(t=(e=this.transport)==null?void 0:e.getSocket())!=null?t:null}getWebSocketUrl(){let e=this.liveUrlOverride||this.config.options.liveUrl||"/live",t=this.config.options.wsUrl;return t||`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}${e}`}getLiveUrl(){return this.liveUrlOverride||this.config.options.liveUrl||window.location.pathname+window.location.search}};async function hr(i,e){try{let n=(await fetch(i,{method:"HEAD"})).headers.get("X-LiveTemplate-WebSocket");return n?n==="enabled":!0}catch(t){return e==null||e.warn("Failed to check WebSocket availability:",t),!0}}async function mn(i,e){try{let t=await fetch(i,{method:"GET",credentials:"include",headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`Failed to fetch initial state: ${t.status}`);return await t.json()}catch(t){return e==null||e.warn("Failed to fetch initial state:",t),null}}var Oe=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let s=new XMLHttpRequest;s.upload.addEventListener("progress",o=>{o.lengthComputable&&(e.bytesUploaded=o.loaded,e.progress=Math.round(o.loaded/o.total*100),n&&n(e))}),e.abortController.signal.addEventListener("abort",()=>{s.abort()});let a=new Promise((o,c)=>{s.addEventListener("load",()=>{s.status>=200&&s.status<300?(e.done=!0,e.progress=100,o()):c(new Error(`S3 upload failed with status ${s.status}: ${s.statusText}`))}),s.addEventListener("error",()=>{c(new Error("S3 upload failed: Network error"))}),s.addEventListener("abort",()=>{c(new Error("S3 upload cancelled"))})});if(s.open("PUT",t.url),t.headers)for(let[o,c]of Object.entries(t.headers))s.setRequestHeader(o,c);s.send(r),await a}catch(s){throw e.error=s instanceof Error?s.message:String(s),s}}};var _e=class{constructor(e,t={}){this.sendMessage=e;this.entries=new Map;this.pendingFiles=new Map;this.autoUploadConfig=new Map;this.uploaders=new Map;this.inputHandlers=new WeakMap;this.chunkSize=t.chunkSize||256*1024,this.onProgress=t.onProgress,this.onComplete=t.onComplete,this.onError=t.onError,this.uploaders.set("s3",new Oe)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let s=this.inputHandlers.get(n);s&&n.removeEventListener("change",s);let a=o=>{let c=o.target.files;!c||c.length===0||this.startUpload(r,Array.from(c))};n.addEventListener("change",a),this.inputHandlers.set(n,a)})}async startUpload(e,t){this.pendingFiles.set(e,t);let n=t.map(s=>({name:s.name,type:s.type||"application/octet-stream",size:s.size})),r={action:"upload_start",upload_name:e,files:n};this.sendMessage(r)}async handleUploadStartResponse(e){let{upload_name:t,entries:n}=e;n.length>0&&this.autoUploadConfig.set(t,n[0].auto_upload);let r=this.pendingFiles.get(t);if(!r){console.error(`No pending files found for upload: ${t}`);return}this.pendingFiles.delete(t);let s=new Map;for(let o of r)s.set(o.name,o);let a=[];for(let o of n){let c=s.get(o.client_name);if(!c){console.warn(`No file found for entry ${o.entry_id} (client_name: ${o.client_name})`);continue}let l={id:o.entry_id,file:c,uploadName:t,progress:0,bytesUploaded:0,valid:o.valid,done:!1,error:o.error,external:o.external};if(this.entries.set(l.id,l),a.push(l),!o.valid){this.onError&&o.error&&this.onError(l,o.error);continue}o.auto_upload&&(o.external?this.uploadExternal(l,o.external):this.uploadChunked(l))}}async uploadExternal(e,t){try{let n=this.uploaders.get(t.uploader);if(!n)throw new Error(`Unknown uploader: ${t.uploader}`);await n.upload(e,t,this.onProgress);let r={action:"upload_complete",upload_name:e.uploadName,entry_ids:[e.id]};this.sendMessage(r),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}catch(n){let r=n instanceof Error?n.message:String(n);e.error=r,this.onError&&this.onError(e,r),this.cleanupEntries(e.uploadName)}}async uploadChunked(e){let{file:t,id:n}=e,r=0;e.abortController=new AbortController;try{for(;r<t.size;){if(e.abortController.signal.aborted)throw new Error("Upload cancelled");let a=Math.min(r+this.chunkSize,t.size),o=t.slice(r,a),c=await this.fileToBase64(o),l={action:"upload_chunk",entry_id:n,chunk_base64:c,offset:r,total:t.size};this.sendMessage(l),r=a,e.bytesUploaded=r,e.progress=Math.round(r/t.size*100),this.onProgress&&this.onProgress(e)}e.done=!0;let s={action:"upload_complete",upload_name:e.uploadName,entry_ids:[n]};this.sendMessage(s),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}catch(s){let a=s instanceof Error?s.message:String(s);e.error=a,this.onError&&this.onError(e,a),this.cleanupEntries(e.uploadName)}}handleProgressMessage(e){let t=this.entries.get(e.entry_id);t&&(t.progress=e.progress,t.bytesUploaded=e.bytes_recv,this.onProgress&&this.onProgress(t))}cancelUpload(e){let t=this.entries.get(e);t&&(t.abortController&&t.abortController.abort(),this.sendMessage({action:"cancel_upload",entry_id:e}),this.entries.delete(e))}getEntries(e){let t=[];for(let n of this.entries.values())n.uploadName===e&&t.push(n);return t}triggerPendingUploads(e){let t=[];for(let n of this.entries.values())n.uploadName===e&&n.progress===0&&!n.done&&!n.error&&t.push(n);for(let n of t)n.external?this.uploadExternal(n,n.external):this.uploadChunked(n)}registerUploader(e,t){this.uploaders.set(e,t)}clearFileInput(e){document.querySelectorAll(`input[type="file"][lvt-upload="${e}"]`).forEach(n=>{n.value=""})}cleanupEntries(e,t=5e3){setTimeout(()=>{let n=[];for(let[r,s]of this.entries)e&&s.uploadName!==e||(s.done||s.error)&&n.push(r);for(let r of n)this.entries.delete(r)},t)}fileToBase64(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let a=r.result.split(",")[1];t(a)},r.onerror=n,r.readAsDataURL(e)})}};var vn={silent:0,error:1,warn:2,info:3,debug:4},yn="LiveTemplate",et=class i{constructor(e,t=[],n=console){this.state=e;this.scope=t;this.sink=n}setLevel(e){this.state.level=e}getLevel(){return this.state.level}child(e){return new i(this.state,[...this.scope,e],this.sink)}isDebugEnabled(){return this.shouldLog("debug")}error(...e){this.log("error","error",e)}warn(...e){this.log("warn","warn",e)}info(...e){this.log("info","info",e)}debug(...e){this.log("debug","debug",e)}log(e,t,n){if(!this.shouldLog(e))return;(this.sink[t]||console[t]||console.log).apply(this.sink,[this.formatPrefix(),...n])}shouldLog(e){return vn[e]<=vn[this.state.level]}formatPrefix(){return this.scope.length===0?`[${yn}]`:`[${yn}:${this.scope.join(":")}]`}};function tt(i={}){var n,r;let e={level:(n=i.level)!=null?n:"info"},t=Array.isArray(i.scope)?i.scope:i.scope?[i.scope]:[];return new et(e,t,(r=i.sink)!=null?r:console)}async function bn(i,e){try{let t=globalThis==null?void 0:globalThis.require;if(typeof t=="function"){let s=t("fs"),a=JSON.parse(s.readFileSync(e,"utf8"));return i.applyUpdate(a)}let r=await(await fetch(e)).json();return i.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function En(i,e){let t=[],n=l=>l.replace(/\s+/g," ").replace(/>\s+</g,"><").trim(),r=n(i),s=n(e);if(r===s)return{match:!0,differences:[]};let a=r.split(`
|
|
30
30
|
`),o=s.split(`
|
|
31
|
-
`),c=Math.max(a.length,o.length);for(let l=0;l<c;l++){let d=a[l]||"",u=o[l]||"";d!==u&&(t.push(`Line ${l+1}:`),t.push(` Expected: ${d}`),t.push(` Actual: ${u}`))}return{match:!1,differences:t}}var Fe=class i{constructor(e={}){this.nodesAddedThisRender=0;this.directiveTouchedThisRender=!1;this.lvtId=null;this.ws=null;this.wrapperElement=null;this.useHTTP=!1;this.sessionCookie=null;this.rateLimitedHandlers=new WeakMap;this.isInitialized=!1;this.messageCount=0;this.navigationEpoch=0;this.liveUrlOverride=null;this.visibilityHandlerAttached=!1;this.hiddenAt=0;this.reconnecting=!1;this.visibilityHandler=null;this.pageshowHandler=null;this.visibilityReconnectTimer=null;let{logger:t,logLevel:n,debug:r,...s}=e,a=n!=null?n:r?"debug":"info",o=t!=null?t:tt({level:a});t?n?t.setLevel(n):r&&t.setLevel("debug"):o.setLevel(a),this.logger=o.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...s},this.treeRenderer=new He(this.logger.child("TreeRenderer")),this.rangeDomApplier=new Re({logger:this.logger.child("RangeDomApplier"),renderItem:(c,l,d,u)=>this.treeRenderer.renderRangeItem(c,l,d,u),executeLifecycleHook:(c,l)=>this.executeLifecycleHook(c,l),itemLookup:(c,l)=>{var p;let d=this.treeRenderer.getTreeState()[c];if(!d||!Array.isArray(d.d))return null;let u=(p=d.m)==null?void 0:p.idKey;for(let g of d.d)if(!(!g||typeof g!="object")&&(g._k===l||u&&g[u]!==void 0&&String(g[u])===l))return g;return null},onNodeAdded:()=>{this.nodesAddedThisRender++}}),this.focusManager=new ge(this.logger.child("FocusManager")),this.formLifecycleManager=new Ce,this.loadingIndicator=new ke,this.formDisabler=new Me,this.uploadHandler=new _e(c=>this.send(c),{chunkSize:256*1024,onProgress:c=>{this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:progress",{detail:{entry:c}}))},onComplete:(c,l)=>{this.logger.info(`Upload complete: ${c}`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:complete",{detail:{uploadName:c,entries:l}}))},onError:(c,l)=>{this.logger.error(`Upload error for ${c.id}:`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:error",{detail:{entry:c,error:l}}))}}),this.eventDelegator=new Ae({getWrapperElement:()=>this.wrapperElement,getRateLimitedHandlers:()=>this.rateLimitedHandlers,parseValue:c=>this.parseValue(c),send:c=>this.send(c),sendHTTPMultipart:(c,l,d)=>this.sendHTTPMultipart(c,l,d),setActiveSubmission:(c,l,d)=>this.formLifecycleManager.setActiveSubmission(c,l,d),getWebSocketReadyState:()=>this.webSocketManager.getReadyState(),triggerPendingUploads:c=>this.uploadHandler.triggerPendingUploads(c)},this.logger.child("EventDelegator")),this.linkInterceptor=new Se({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:(c,l)=>this.handleNavigationResponse(c,l),sendNavigate:c=>this.sendNavigate(c),canSendNavigate:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1},this.logger.child("LinkInterceptor")),this.observerManager=new Le({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ObserverManager")),this.changeAutoWirer=new De({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new Ie({options:this.options,logger:this.logger.child("Transport"),onConnected:()=>{var c,l,d;this.ws=this.webSocketManager.getSocket(),this.logger.info("WebSocket connected"),this.clearFlashQueryParams(),(l=(c=this.options).onConnect)==null||l.call(c),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:connected"))},onDisconnected:()=>{var c,l,d;this.ws=null,this.logger.info("WebSocket disconnected"),(l=(c=this.options).onDisconnect)==null||l.call(c),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:disconnected"))},onMessage:(c,l)=>{this.handleWebSocketPayload(c,l)},onReconnectAttempt:()=>{this.logger.info("Attempting to reconnect...")},onError:c=>{var l,d;this.logger.error("WebSocket error:",c),(d=(l=this.options).onError)==null||d.call(l,c)}})}static autoInit(){let e=tt({scope:"Client:autoInit"}),t=()=>{var r,s,a;let n=document.querySelector("[data-lvt-id]");if(n){let o=new i;o.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(o.loadingIndicator.show(),o.formDisabler.disable(o.wrapperElement));let l=(a=(s=n.getAttribute("data-lvt-loading-debounce-ms"))!=null?s:(r=document.body)==null?void 0:r.getAttribute("data-lvt-loading-debounce-ms"))!=null?a:null;if(l!==null&&/^\d+$/.test(l)){let d=parseInt(l,10);Number.isFinite(d)&&d>=0&&n.addEventListener("lvt:updated",()=>{o.loadingIndicator.enablePerActionIndicator(d)},{once:!0,capture:!0})}o.connect().catch(d=>{e.error("Auto-initialization connect failed:",d)}),window.liveTemplateClient=o}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}handleWebSocketPayload(e,t){var s,a,o;let n=e;if(n.type==="error"){if(typeof n.code!="string"){this.logger.warn("Malformed error envelope (missing string `code`) \u2014 dropping",n);return}this.wrapperElement?this.wrapperElement.dispatchEvent(new CustomEvent("lvt:error",{detail:{code:n.code,topic:n.topic}})):this.logger.warn("lvt:error envelope arrived before wrapperElement was set; dropping",{code:n.code,topic:n.topic});return}let r=e;if(r.type==="upload_progress"){this.uploadHandler.handleProgressMessage(r);return}if(r.upload_name&&r.entries){let c=r;try{this.handleUploadStartResponse(c)}catch(l){this.logger.error("Error handling upload start response:",l)}return}if(r.upload_name&&r.hasOwnProperty("success")){r.success?this.logger.info(`Upload complete: ${r.upload_name}`):this.logger.error(`Upload failed: ${r.upload_name}`,r.error);return}this.isInitialized||(this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.wrapperElement&&this.wrapperElement.hasAttribute("data-lvt-loading")&&this.wrapperElement.removeAttribute("data-lvt-loading"),this.isInitialized=!0,je()),this.wrapperElement&&((s=e.meta)!=null&&s.capabilities&&this.changeAutoWirer.setCapabilities(e.meta.capabilities),this.changeAutoWirer.analyzeStatics(e.tree),this.updateDOM(this.wrapperElement,e.tree,e.meta),this.messageCount++,this.wrapperElement.dispatchEvent(new CustomEvent("lvt:updated",{detail:{messageCount:this.messageCount,action:(a=e.meta)==null?void 0:a.action,success:(o=e.meta)==null?void 0:o.success}})))}async connect(e="[data-lvt-id]"){var n,r;if(this.wrapperElement=document.querySelector(e),!this.wrapperElement)throw new Error(`LiveTemplate wrapper not found with selector: ${e}`);this.webSocketManager.disconnect();let t=await this.webSocketManager.connect();this.useHTTP=!t.usingWebSocket,this.useHTTP&&(this.ws=null,this.logger.info("WebSocket not available, using HTTP mode"),(r=(n=this.options).onConnect)==null||r.call(n),t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),this.eventDelegator.setupEventDelegation(),this.eventDelegator.setupWindowEventDelegation(),this.eventDelegator.setupClickAwayDelegation(),this.eventDelegator.setupDOMEventTriggerDelegation(),Ht(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),ye(),nn(),Zt(),this.wrapperElement&&Ke(this.wrapperElement,s=>this.send(s)),wt(this.wrapperElement),this.focusManager.attach(this.wrapperElement),this.observerManager.setupInfiniteScrollObserver(),this.observerManager.setupInfiniteScrollMutationObserver(),this.setupVisibilityReconnect()}disconnect(){this.webSocketManager.disconnect(),this.ws=null,this.useHTTP=!1,this.hiddenAt=0,this.reconnecting=!1,this.teardownVisibilityReconnect(),this.eventDelegator.teardownDOMEventTriggerDelegation(),en(),St(),this.loadingIndicator.disablePerActionIndicator(),this.wrapperElement&&(Et(this.wrapperElement),At(this.wrapperElement),on(this.wrapperElement),gn(this.wrapperElement),Dt(this.wrapperElement),It(this.wrapperElement)),this.resetSessionState()}resetSessionState(){this.treeRenderer.reset(),this.rangeDomApplier.invalidate(),this.focusManager.reset(),this.observerManager.teardown(),this.changeAutoWirer.teardown(),this.formLifecycleManager.reset(),this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.lvtId=null,this.isInitialized=!1}setupVisibilityReconnect(){this.visibilityHandlerAttached||typeof document=="undefined"||(this.visibilityHandlerAttached=!0,this.visibilityHandler=()=>{if(document.hidden){!this.useHTTP&&this.webSocketManager.getReadyState()===1&&(this.hiddenAt=Date.now());return}if(this.hiddenAt===0)return;let e=Date.now()-this.hiddenAt;this.hiddenAt=0,!(e<3e3)&&this.scheduleVisibilityReconnect()},this.pageshowHandler=e=>{e.persisted&&this.scheduleVisibilityReconnect()},document.addEventListener("visibilitychange",this.visibilityHandler),window.addEventListener("pageshow",this.pageshowHandler))}teardownVisibilityReconnect(){this.visibilityReconnectTimer!==null&&(clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=null),!(!this.visibilityHandlerAttached||typeof document=="undefined")&&(this.visibilityHandler&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.pageshowHandler&&(window.removeEventListener("pageshow",this.pageshowHandler),this.pageshowHandler=null),this.visibilityHandlerAttached=!1)}scheduleVisibilityReconnect(){this.visibilityReconnectTimer!==null&&clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=setTimeout(()=>{this.visibilityReconnectTimer=null,this.wrapperElement&&!this.useHTTP&&!this.reconnecting&&this.webSocketManager.getReadyState()!==void 0&&this.performVisibilityReconnect()},500)}async performVisibilityReconnect(){var e;if(!this.reconnecting){this.reconnecting=!0;try{this.logger.info("Reconnecting after visibility change"),this.webSocketManager.disconnect(),this.ws=null,this.resetSessionState();let t=await this.webSocketManager.connect();if(!this.reconnecting)return;this.useHTTP=!t.usingWebSocket,this.useHTTP&&(this.ws=null,t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),(e=this.wrapperElement)==null||e.dispatchEvent(new Event("lvt:reconnected"))}catch(t){this.logger.error("Visibility reconnect failed:",t)}finally{this.reconnecting=!1}}}clearFlashQueryParams(){let e=new URL(window.location.href),t=["error","success"],n=!1;for(let r of t)e.searchParams.has(r)&&(e.searchParams.delete(r),n=!0);n&&(this.logger.debug("Clearing flash query params from URL"),window.history.replaceState(null,"",e.toString()))}isReady(){let e=this.wrapperElement;return!e||e.hasAttribute("data-lvt-loading")?!1:this.useHTTP?!0:this.webSocketManager.getReadyState()===1}send(e){let t=this.webSocketManager.getReadyState();this.logger.isDebugEnabled()&&this.logger.debug("send() invoked",{message:e,useHTTP:this.useHTTP,hasWebSocket:t!==void 0,readyState:t}),this.useHTTP?(this.logger.debug("Using HTTP mode for send"),this.sendHTTP(e)):t===1?(this.logger.debug("Sending via WebSocket"),this.webSocketManager.send(JSON.stringify(e))):t!==void 0?(this.logger.warn(`WebSocket not ready (state: ${t}), using HTTP fallback`),this.sendHTTP(e)):this.logger.error("No transport available")}getLiveUrl(){return this.liveUrlOverride||this.options.liveUrl||"/live"}sendNavigate(e){let t=new URL(e,window.location.origin),n={},r=new Set;t.searchParams.forEach((a,o)=>{r.has(o)&&this.logger.warn("sendNavigate: duplicate query param key \u2014 last value wins; server may receive incomplete data",{key:o,href:e}),r.add(o),n[o]=a});let s=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let a=this.webSocketManager.getReadyState();return a===3?this.logger.error("sendNavigate: WebSocket is CLOSED and autoReconnect may be disabled; navigate message dropped. Reload or re-enable autoReconnect.",{href:e}):this.options.autoReconnect?this.logger.warn("sendNavigate: WS not open; browser URL is ahead of server state until reconnect",{href:e,readyState:a}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:a}),!1}return this.liveUrlOverride=s,this.webSocketManager.setLiveUrl(s),this.logger.debug("sendNavigate",{href:e,data:n}),this.send({action:"__navigate__",data:n}),!0}async sendHTTP(e){try{let t=this.getLiveUrl(),n=await fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!n.ok)throw new Error(`HTTP request failed: ${n.status}`);let r=await n.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,r.tree,r.meta)}catch(t){this.logger.error("Failed to send HTTP request:",t)}}sendHTTPMultipart(e,t,n){this.doSendHTTPMultipart(e,t,n)}async doSendHTTPMultipart(e,t,n){try{let r=this.getLiveUrl(),s=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!s.ok)throw new Error(`HTTP multipart request failed: ${s.status}`);let a=await s.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,a.tree,a.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}stylesheetsDiffer(e,t){let n=document.querySelectorAll('link[rel~="stylesheet"][href]'),r=new Set;n.forEach(c=>{let l=c.href;l&&r.add(l)});let s=e.querySelectorAll('link[rel~="stylesheet"][href]'),a=new Set;if(s.forEach(c=>{let l=c.getAttribute("href");if(l)try{a.add(new URL(l,t).href)}catch(d){a.add(l)}}),r.size!==a.size)return!0;let o=!1;return r.forEach(c=>{a.has(c)||(o=!0)}),o}performFullNavigation(e){window.location.href=e}handleNavigationResponse(e,t){var l;if(!this.wrapperElement)return;let r=new DOMParser().parseFromString(e,"text/html"),s=this.wrapperElement.getAttribute("data-lvt-id"),a=(l=r.querySelector("title"))==null?void 0:l.textContent;if(a&&(document.title=a),this.stylesheetsDiffer(r,t)){this.logger.info('Cross-app navigation detected (different <link rel="stylesheet"> set in fetched HTML); falling back to full navigation'),this.performFullNavigation(t);return}let o=r.querySelector("[data-lvt-id]");if(o){let d=o.getAttribute("data-lvt-id");if(!d){this.logger.warn("Cross-handler navigation: new wrapper has empty data-lvt-id"),window.location.reload();return}this.linkInterceptor.teardownForWrapper(s),this.eventDelegator.teardownForWrapper(s);let u=++this.navigationEpoch;this.disconnect(),this.wrapperElement.setAttribute("data-lvt-id",d),this.wrapperElement.replaceChildren(...Array.from(o.childNodes).map(g=>g.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement),window.scrollTo(0,0);let p=window.location.pathname+window.location.search;if(this.liveUrlOverride=p,this.webSocketManager.setLiveUrl(p),!this.useHTTP){let h=`[data-lvt-id="${d.replace(/[\\"]/g,"\\$&")}"]`;this.connect(h).catch(R=>{u===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",R),window.location.reload())})}return}this.linkInterceptor.teardownForWrapper(s),this.eventDelegator.teardownForWrapper(s),this.disconnect();let c=r.querySelector("body");c&&this.wrapperElement.replaceChildren(...Array.from(c.childNodes).map(d=>d.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement)}parseValue(e){let t=e.trim(),n=parseFloat(t);if(!isNaN(n)){if(Number.isInteger(n)&&Math.abs(n)>Number.MAX_SAFE_INTEGER)return t;if(t===n.toString())return n}return e==="true"?!0:e==="false"?!1:e}applyUpdate(e){return this.treeRenderer.applyUpdate(e)}applyUpdateToHTML(e,t){let n=this.applyUpdate(t);if(!this.lvtId){let l=e.match(/data-lvt-id="([^"]+)"/);l&&(this.lvtId=l[1])}let r=n.html;if(!e.match(/<body>([\s\S]*?)<\/body>/))return e;let c=`<div data-lvt-id="${this.lvtId||"lvt-unknown"}">`+r+"</div>";return e.replace(/<body>[\s\S]*?<\/body>/,`<body>${c}</body>`)}updateDOM(e,t,n){this.nodesAddedThisRender=0,this.directiveTouchedThisRender=!1;let r=this.treeRenderer.applyUpdate(t,{canApplyTargeted:(l,d)=>this.rangeDomApplier.canApplyTargeted(e,l,d).ok}),s=l=>!l||typeof l!="object"?!1:l.s&&Array.isArray(l.s)?!0:Object.values(l).some(d=>s(d));if(!r.changed&&!s(t))return;let a=document.createElement(e.tagName);if(this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] element.tagName:",e.tagName),this.logger.debug("[updateDOM] result.html (first 500 chars):",r.html.substring(0,500)),this.logger.debug("[updateDOM] Has <table> tag:",r.html.includes("<table>")),this.logger.debug("[updateDOM] Has <tbody> tag:",r.html.includes("<tbody>")),this.logger.debug("[updateDOM] Has <tr> tag:",r.html.includes("<tr"))),/<script[\s>]/i.test(r.html)){let l=e.tagName.toLowerCase(),d=l==="body"||l==="html"?"div":l,p=new DOMParser().parseFromString(`<${d}>${r.html}</${d}>`,"text/html"),g=p.body.firstElementChild;g?a.replaceChildren(...Array.from(g.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),a.replaceChildren(...Array.from(p.body.childNodes)))}else a.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",a.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has <table>:",a.innerHTML.includes("<table>")),this.logger.debug("[updateDOM] tempWrapper has <tbody>:",a.innerHTML.includes("<tbody>")),this.logger.debug("[updateDOM] tempWrapper has <tr>:",a.innerHTML.includes("<tr")));let o=document.activeElement;if(o instanceof HTMLInputElement&&o.list instanceof HTMLDataListElement&&!a.querySelector("[data-lvt-force-update]")){this.logger.debug("[updateDOM] deferred: datalist input focused"),this.focusManager.restoreFocusedElement();return}let c={childrenOnly:!0,getNodeKey:l=>{if(l.nodeType===1)return l.getAttribute("data-key")||l.getAttribute("data-lvt-key")||void 0},onBeforeElUpdated:(l,d)=>{if(d.nodeType===Node.ELEMENT_NODE&&d.hasAttribute(Z))return!1;if(d.nodeType===Node.ELEMENT_NODE&&l.nodeType===Node.ELEMENT_NODE){let u=d.attributes,p=l;for(let g=0;g<u.length;g++){let h=u[g].name;if(h.length>4&&h.charCodeAt(0)===108&&h.charCodeAt(1)===118&&h.charCodeAt(2)===116&&h.charCodeAt(3)===45&&!p.hasAttribute(h)){this.directiveTouchedThisRender=!0;break}}}if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore")&&!d.hasAttribute("data-lvt-force-update"))return!1;if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore-attrs")&&!d.hasAttribute("data-lvt-force-update")&&d.nodeType===Node.ELEMENT_NODE){let u=l.attributes,p=d;for(let g=0;g<u.length;g++){let h=u[g];p.hasAttributeNS(h.namespaceURI,h.localName)||p.setAttributeNS(h.namespaceURI,h.name,h.value)}}if(l instanceof HTMLDataListElement&&!d.hasAttribute("data-lvt-force-update")){let u=document.activeElement;if(u instanceof HTMLInputElement&&u.list===l)return!1}return l instanceof HTMLDialogElement&&l.hasAttribute("open")&&!d.hasAttribute("data-lvt-force-update")&&d.setAttribute("open",""),!d.hasAttribute("data-lvt-force-update")&&l instanceof HTMLElement&&l.hasAttribute("popover")&&ze(l)||(l instanceof HTMLInputElement&&d instanceof HTMLInputElement&&(l.type==="checkbox"||l.type==="radio")&&(d.hasAttribute("data-lvt-force-update")?(l.checked=d.checked,l.type==="checkbox"&&(l.indeterminate=d.indeterminate),l.removeAttribute("data-lvt-force-update")):(d.checked=l.checked,l.checked?d.setAttribute("checked",""):d.removeAttribute("checked"),l.type==="checkbox"&&(d.indeterminate=l.indeterminate))),this.focusManager.shouldSkipUpdate(l))?!1:l.isEqualNode(d)?!(!d.hasAttribute("data-lvt-force-update")&&(d.children.length===0||d.querySelector("[data-lvt-force-update]")===null)):(this.executeLifecycleHook(l,"lvt-updated"),!0)},onElUpdated:l=>{var d;l instanceof HTMLTextAreaElement&&(l.value=(d=l.textContent)!=null?d:""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update")},onNodeAdded:l=>{var d;l instanceof HTMLTextAreaElement&&(l.value=(d=l.textContent)!=null?d:""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update"),l.nodeType===Node.ELEMENT_NODE&&(this.executeLifecycleHook(l,"lvt-mounted"),this.nodesAddedThisRender++)},onBeforeNodeDiscarded:l=>(l.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(l,"lvt-destroyed"),!0)};if(r.targetedOps&&r.targetedOps.length>0){let l=[],d=!1;for(let u of r.targetedOps){let p=this.rangeDomApplier.apply(e,u,c);p?(p.setAttribute(Q,""),l.push(p)):d=!0}if(d){this.logger.warn("[updateDOM] one or more targeted DOM ops failed; rebuilding tempWrapper from treeState for a full morphdom sync");for(let p of l)p.removeAttribute(Q);let u=this.treeRenderer.renderState();a.innerHTML=u}else this.replaceTargetedSkipPlaceholders(a)}try{fe(e,a,c)}finally{this.rangeDomApplier.cleanupMarkers(e)}Bt(e),this.focusManager.restoreFocusedElement(),Tt(e),kt(e),Mt(e),xt(e),Lt(e),Ct(e,l=>this.send(l)),Ke(e,l=>this.send(l)),Rt(e),sn(e),fn(e),(this.nodesAddedThisRender>0||this.directiveTouchedThisRender)&&(bt(e,this.wrapperElement||void 0),this.eventDelegator.setupDOMEventTriggerDelegation(e),this.uploadHandler.initializeFileInputs(e)),this.changeAutoWirer.wireElements(),n&&this.formLifecycleManager.handleResponse(n)}handleUploadStartResponse(e){this.uploadHandler.handleUploadStartResponse(e)}replaceTargetedSkipPlaceholders(e){let t=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT),n=[],r;for(;r=t.nextNode();){let s=r;s.nodeValue&&/^lvt-targeted-skip:.+$/.test(s.nodeValue)&&n.push(s)}for(let s of n){let a=s.nodeValue.match(/^lvt-targeted-skip:(.+)$/),o=a?a[1]:"",c=s.parentElement;c&&c.setAttribute(Z,o),s.remove()}}executeLifecycleHook(e,t){let n=e.getAttribute(t);if(n)try{new Function("element",n).call(e,e)}catch(r){this.logger.error(`Error executing ${t} hook:`,r)}}reset(){this.resetSessionState()}getTreeState(){return this.treeRenderer.getTreeState()}getStaticStructure(){return this.treeRenderer.getStaticStructure()}};typeof window!="undefined"&&Fe.autoInit();return kn(mr);})();
|
|
31
|
+
`),c=Math.max(a.length,o.length);for(let l=0;l<c;l++){let d=a[l]||"",u=o[l]||"";d!==u&&(t.push(`Line ${l+1}:`),t.push(` Expected: ${d}`),t.push(` Actual: ${u}`))}return{match:!1,differences:t}}var Fe=class i{constructor(e={}){this.nodesAddedThisRender=0;this.directiveTouchedThisRender=!1;this.lvtId=null;this.ws=null;this.wrapperElement=null;this.useHTTP=!1;this.sessionCookie=null;this.rateLimitedHandlers=new WeakMap;this.isInitialized=!1;this.messageCount=0;this.navigationEpoch=0;this.liveUrlOverride=null;this.visibilityHandlerAttached=!1;this.hiddenAt=0;this.reconnecting=!1;this.visibilityHandler=null;this.pageshowHandler=null;this.visibilityReconnectTimer=null;let{logger:t,logLevel:n,debug:r,...s}=e,a=n!=null?n:r?"debug":"info",o=t!=null?t:tt({level:a});t?n?t.setLevel(n):r&&t.setLevel("debug"):o.setLevel(a),this.logger=o.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...s},this.treeRenderer=new He(this.logger.child("TreeRenderer")),this.rangeDomApplier=new Re({logger:this.logger.child("RangeDomApplier"),renderItem:(c,l,d,u)=>this.treeRenderer.renderRangeItem(c,l,d,u),executeLifecycleHook:(c,l)=>this.executeLifecycleHook(c,l),itemLookup:(c,l)=>{var p;let d=this.treeRenderer.getTreeState()[c];if(!d||!Array.isArray(d.d))return null;let u=(p=d.m)==null?void 0:p.idKey;for(let g of d.d)if(!(!g||typeof g!="object")&&(g._k===l||u&&g[u]!==void 0&&String(g[u])===l))return g;return null},onNodeAdded:()=>{this.nodesAddedThisRender++}}),this.focusManager=new ge(this.logger.child("FocusManager")),this.formLifecycleManager=new Ce,this.loadingIndicator=new ke,this.formDisabler=new Me,this.uploadHandler=new _e(c=>this.send(c),{chunkSize:256*1024,onProgress:c=>{this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:progress",{detail:{entry:c}}))},onComplete:(c,l)=>{this.logger.info(`Upload complete: ${c}`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:complete",{detail:{uploadName:c,entries:l}}))},onError:(c,l)=>{this.logger.error(`Upload error for ${c.id}:`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:error",{detail:{entry:c,error:l}}))}}),this.eventDelegator=new Ae({getWrapperElement:()=>this.wrapperElement,getRateLimitedHandlers:()=>this.rateLimitedHandlers,parseValue:c=>this.parseValue(c),send:c=>this.send(c),sendHTTPMultipart:(c,l,d)=>this.sendHTTPMultipart(c,l,d),setActiveSubmission:(c,l,d)=>this.formLifecycleManager.setActiveSubmission(c,l,d),getWebSocketReadyState:()=>this.webSocketManager.getReadyState(),triggerPendingUploads:c=>this.uploadHandler.triggerPendingUploads(c)},this.logger.child("EventDelegator")),this.linkInterceptor=new Se({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:(c,l)=>this.handleNavigationResponse(c,l),sendNavigate:c=>this.sendNavigate(c),canSendNavigate:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1},this.logger.child("LinkInterceptor")),this.observerManager=new Le({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ObserverManager")),this.changeAutoWirer=new De({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new Ie({options:this.options,logger:this.logger.child("Transport"),onConnected:()=>{var c,l,d;this.ws=this.webSocketManager.getSocket(),this.logger.info("WebSocket connected"),this.clearFlashQueryParams(),(l=(c=this.options).onConnect)==null||l.call(c),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:connected"))},onDisconnected:()=>{var c,l,d;this.ws=null,this.logger.info("WebSocket disconnected"),(l=(c=this.options).onDisconnect)==null||l.call(c),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:disconnected"))},onMessage:(c,l)=>{this.handleWebSocketPayload(c,l)},onReconnectAttempt:()=>{this.logger.info("Attempting to reconnect...")},onError:c=>{var l,d;this.logger.error("WebSocket error:",c),(d=(l=this.options).onError)==null||d.call(l,c)}})}static autoInit(){let e=tt({scope:"Client:autoInit"}),t=()=>{var r,s,a;let n=document.querySelector("[data-lvt-id]");if(n){let o=new i;o.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(o.loadingIndicator.show(),o.formDisabler.disable(o.wrapperElement));let l=(a=(s=n.getAttribute("data-lvt-loading-debounce-ms"))!=null?s:(r=document.body)==null?void 0:r.getAttribute("data-lvt-loading-debounce-ms"))!=null?a:null;if(l!==null&&/^\d+$/.test(l)){let d=parseInt(l,10);Number.isFinite(d)&&d>=0&&n.addEventListener("lvt:updated",()=>{o.loadingIndicator.enablePerActionIndicator(d)},{once:!0,capture:!0})}o.connect().catch(d=>{e.error("Auto-initialization connect failed:",d)}),window.liveTemplateClient=o}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}handleWebSocketPayload(e,t){var s,a,o;let n=e;if(n.type==="error"){if(typeof n.code!="string"){this.logger.warn("Malformed error envelope (missing string `code`) \u2014 dropping",n);return}this.wrapperElement?this.wrapperElement.dispatchEvent(new CustomEvent("lvt:error",{detail:{code:n.code,topic:n.topic}})):this.logger.warn("lvt:error envelope arrived before wrapperElement was set; dropping",{code:n.code,topic:n.topic});return}let r=e;if(r.type==="upload_progress"){this.uploadHandler.handleProgressMessage(r);return}if(r.upload_name&&r.entries){let c=r;try{this.handleUploadStartResponse(c)}catch(l){this.logger.error("Error handling upload start response:",l)}return}if(r.upload_name&&r.hasOwnProperty("success")){r.success?this.logger.info(`Upload complete: ${r.upload_name}`):this.logger.error(`Upload failed: ${r.upload_name}`,r.error);return}this.isInitialized||(this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.wrapperElement&&this.wrapperElement.hasAttribute("data-lvt-loading")&&this.wrapperElement.removeAttribute("data-lvt-loading"),this.isInitialized=!0,je()),this.wrapperElement&&((s=e.meta)!=null&&s.capabilities&&this.changeAutoWirer.setCapabilities(e.meta.capabilities),this.changeAutoWirer.analyzeStatics(e.tree),this.updateDOM(this.wrapperElement,e.tree,e.meta),this.messageCount++,this.wrapperElement.dispatchEvent(new CustomEvent("lvt:updated",{detail:{messageCount:this.messageCount,action:(a=e.meta)==null?void 0:a.action,success:(o=e.meta)==null?void 0:o.success}})))}async connect(e="[data-lvt-id]"){var n,r;if(this.wrapperElement=document.querySelector(e),!this.wrapperElement)throw new Error(`LiveTemplate wrapper not found with selector: ${e}`);this.webSocketManager.disconnect();let t=await this.webSocketManager.connect();this.useHTTP=!t.usingWebSocket,this.useHTTP&&(this.ws=null,this.logger.info("WebSocket not available, using HTTP mode"),(r=(n=this.options).onConnect)==null||r.call(n),t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),this.eventDelegator.setupEventDelegation(),this.eventDelegator.setupWindowEventDelegation(),this.eventDelegator.setupClickAwayDelegation(),this.eventDelegator.setupDOMEventTriggerDelegation(),Ht(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),ye(),nn(),Zt(),this.wrapperElement&&Ke(this.wrapperElement,s=>this.send(s)),wt(this.wrapperElement),this.focusManager.attach(this.wrapperElement),this.observerManager.setupInfiniteScrollObserver(),this.observerManager.setupInfiniteScrollMutationObserver(),this.setupVisibilityReconnect()}disconnect(){this.webSocketManager.disconnect(),this.ws=null,this.useHTTP=!1,this.hiddenAt=0,this.reconnecting=!1,this.teardownVisibilityReconnect(),this.eventDelegator.teardownDOMEventTriggerDelegation(),en(),St(),this.loadingIndicator.disablePerActionIndicator(),this.wrapperElement&&(Et(this.wrapperElement),At(this.wrapperElement),on(this.wrapperElement),gn(this.wrapperElement),Dt(this.wrapperElement),It(this.wrapperElement)),this.resetSessionState()}resetSessionState(){this.treeRenderer.reset(),this.rangeDomApplier.invalidate(),this.focusManager.reset(),this.observerManager.teardown(),this.changeAutoWirer.teardown(),this.formLifecycleManager.reset(),this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.lvtId=null,this.isInitialized=!1}setupVisibilityReconnect(){this.visibilityHandlerAttached||typeof document=="undefined"||(this.visibilityHandlerAttached=!0,this.visibilityHandler=()=>{if(document.hidden){!this.useHTTP&&this.webSocketManager.getReadyState()===1&&(this.hiddenAt=Date.now());return}if(this.hiddenAt===0)return;let e=Date.now()-this.hiddenAt;this.hiddenAt=0,!(e<3e3)&&this.scheduleVisibilityReconnect()},this.pageshowHandler=e=>{e.persisted&&this.scheduleVisibilityReconnect()},document.addEventListener("visibilitychange",this.visibilityHandler),window.addEventListener("pageshow",this.pageshowHandler))}teardownVisibilityReconnect(){this.visibilityReconnectTimer!==null&&(clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=null),!(!this.visibilityHandlerAttached||typeof document=="undefined")&&(this.visibilityHandler&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.pageshowHandler&&(window.removeEventListener("pageshow",this.pageshowHandler),this.pageshowHandler=null),this.visibilityHandlerAttached=!1)}scheduleVisibilityReconnect(){this.visibilityReconnectTimer!==null&&clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=setTimeout(()=>{this.visibilityReconnectTimer=null,this.wrapperElement&&!this.useHTTP&&!this.reconnecting&&this.webSocketManager.getReadyState()!==void 0&&this.performVisibilityReconnect()},500)}async performVisibilityReconnect(){var e;if(!this.reconnecting){this.reconnecting=!0;try{this.logger.info("Reconnecting after visibility change"),this.webSocketManager.disconnect(),this.ws=null,this.resetSessionState();let t=await this.webSocketManager.connect();if(!this.reconnecting)return;this.useHTTP=!t.usingWebSocket,this.useHTTP&&(this.ws=null,t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),(e=this.wrapperElement)==null||e.dispatchEvent(new Event("lvt:reconnected"))}catch(t){this.logger.error("Visibility reconnect failed:",t)}finally{this.reconnecting=!1}}}clearFlashQueryParams(){let e=new URL(window.location.href),t=["error","success"],n=!1;for(let r of t)e.searchParams.has(r)&&(e.searchParams.delete(r),n=!0);n&&(this.logger.debug("Clearing flash query params from URL"),window.history.replaceState(null,"",e.toString()))}isReady(){let e=this.wrapperElement;return!e||e.hasAttribute("data-lvt-loading")?!1:this.useHTTP?!0:this.webSocketManager.getReadyState()===1}send(e){let t=this.webSocketManager.getReadyState();this.logger.isDebugEnabled()&&this.logger.debug("send() invoked",{message:e,useHTTP:this.useHTTP,hasWebSocket:t!==void 0,readyState:t}),this.useHTTP?(this.logger.debug("Using HTTP mode for send"),this.sendHTTP(e)):t===1?(this.logger.debug("Sending via WebSocket"),this.webSocketManager.send(JSON.stringify(e))):t!==void 0?(this.logger.warn(`WebSocket not ready (state: ${t}), using HTTP fallback`),this.sendHTTP(e)):this.logger.error("No transport available")}getLiveUrl(){return this.liveUrlOverride||this.options.liveUrl||"/live"}sendNavigate(e){let t=new URL(e,window.location.origin),n={},r=new Set;t.searchParams.forEach((a,o)=>{r.has(o)&&this.logger.warn("sendNavigate: duplicate query param key \u2014 last value wins; server may receive incomplete data",{key:o,href:e}),r.add(o),n[o]=a});let s=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let a=this.webSocketManager.getReadyState();return a===3?this.logger.error("sendNavigate: WebSocket is CLOSED and autoReconnect may be disabled; navigate message dropped. Reload or re-enable autoReconnect.",{href:e}):this.options.autoReconnect?this.logger.warn("sendNavigate: WS not open; browser URL is ahead of server state until reconnect",{href:e,readyState:a}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:a}),!1}return this.liveUrlOverride=s,this.webSocketManager.setLiveUrl(s),this.logger.debug("sendNavigate",{href:e,data:n}),this.send({action:"__navigate__",data:n}),!0}async sendHTTP(e){try{let t=this.getLiveUrl(),n=await fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!n.ok)throw new Error(`HTTP request failed: ${n.status}`);let r=await n.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,r.tree,r.meta)}catch(t){this.logger.error("Failed to send HTTP request:",t)}}sendHTTPMultipart(e,t,n){this.doSendHTTPMultipart(e,t,n)}async doSendHTTPMultipart(e,t,n){try{let r=this.getLiveUrl(),s=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!s.ok)throw new Error(`HTTP multipart request failed: ${s.status}`);let a=await s.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,a.tree,a.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}stylesheetsDiffer(e,t){let n=document.querySelectorAll('link[rel~="stylesheet"][href]'),r=new Set;n.forEach(c=>{let l=c.href;l&&r.add(l)});let s=e.querySelectorAll('link[rel~="stylesheet"][href]'),a=new Set;if(s.forEach(c=>{let l=c.getAttribute("href");if(l)try{a.add(new URL(l,t).href)}catch(d){a.add(l)}}),r.size!==a.size)return!0;let o=!1;return r.forEach(c=>{a.has(c)||(o=!0)}),o}performFullNavigation(e){window.location.href=e}handleNavigationResponse(e,t){var l;if(!this.wrapperElement)return;let r=new DOMParser().parseFromString(e,"text/html"),s=this.wrapperElement.getAttribute("data-lvt-id"),a=(l=r.querySelector("title"))==null?void 0:l.textContent;if(a&&(document.title=a),this.stylesheetsDiffer(r,t)){this.logger.info('Cross-app navigation detected (different <link rel="stylesheet"> set in fetched HTML); falling back to full navigation'),this.performFullNavigation(t);return}let o=r.querySelector("[data-lvt-id]");if(o){let d=o.getAttribute("data-lvt-id");if(!d){this.logger.warn("Cross-handler navigation: new wrapper has empty data-lvt-id"),window.location.reload();return}this.linkInterceptor.teardownForWrapper(s),this.eventDelegator.teardownForWrapper(s);let u=++this.navigationEpoch;this.disconnect(),this.wrapperElement.setAttribute("data-lvt-id",d),this.wrapperElement.replaceChildren(...Array.from(o.childNodes).map(g=>g.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement),window.scrollTo(0,0);let p=window.location.pathname+window.location.search;if(this.liveUrlOverride=p,this.webSocketManager.setLiveUrl(p),!this.useHTTP){let h=`[data-lvt-id="${d.replace(/[\\"]/g,"\\$&")}"]`;this.connect(h).catch(R=>{u===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",R),window.location.reload())})}return}this.linkInterceptor.teardownForWrapper(s),this.eventDelegator.teardownForWrapper(s),this.disconnect();let c=r.querySelector("body");c&&this.wrapperElement.replaceChildren(...Array.from(c.childNodes).map(d=>d.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement)}parseValue(e){let t=e.trim(),n=parseFloat(t);if(!isNaN(n)){if(Number.isInteger(n)&&Math.abs(n)>Number.MAX_SAFE_INTEGER)return t;if(t===n.toString())return n}return e==="true"?!0:e==="false"?!1:e}applyUpdate(e){return this.treeRenderer.applyUpdate(e)}applyUpdateToHTML(e,t){let n=this.applyUpdate(t);if(!this.lvtId){let l=e.match(/data-lvt-id="([^"]+)"/);l&&(this.lvtId=l[1])}let r=n.html;if(!e.match(/<body>([\s\S]*?)<\/body>/))return e;let c=`<div data-lvt-id="${this.lvtId||"lvt-unknown"}">`+r+"</div>";return e.replace(/<body>[\s\S]*?<\/body>/,`<body>${c}</body>`)}updateDOM(e,t,n){this.nodesAddedThisRender=0,this.directiveTouchedThisRender=!1;let r=this.treeRenderer.applyUpdate(t,{canApplyTargeted:(l,d)=>this.rangeDomApplier.canApplyTargeted(e,l,d).ok}),s=l=>!l||typeof l!="object"?!1:l.s&&Array.isArray(l.s)?!0:Object.values(l).some(d=>s(d));if(!r.changed&&!s(t)){n&&this.formLifecycleManager.handleResponse(n);return}let a=document.createElement(e.tagName);if(this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] element.tagName:",e.tagName),this.logger.debug("[updateDOM] result.html (first 500 chars):",r.html.substring(0,500)),this.logger.debug("[updateDOM] Has <table> tag:",r.html.includes("<table>")),this.logger.debug("[updateDOM] Has <tbody> tag:",r.html.includes("<tbody>")),this.logger.debug("[updateDOM] Has <tr> tag:",r.html.includes("<tr"))),/<script[\s>]/i.test(r.html)){let l=e.tagName.toLowerCase(),d=l==="body"||l==="html"?"div":l,p=new DOMParser().parseFromString(`<${d}>${r.html}</${d}>`,"text/html"),g=p.body.firstElementChild;g?a.replaceChildren(...Array.from(g.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),a.replaceChildren(...Array.from(p.body.childNodes)))}else a.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",a.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has <table>:",a.innerHTML.includes("<table>")),this.logger.debug("[updateDOM] tempWrapper has <tbody>:",a.innerHTML.includes("<tbody>")),this.logger.debug("[updateDOM] tempWrapper has <tr>:",a.innerHTML.includes("<tr")));let o=document.activeElement;if(o instanceof HTMLInputElement&&o.list instanceof HTMLDataListElement&&!a.querySelector("[data-lvt-force-update]")){this.logger.debug("[updateDOM] deferred: datalist input focused"),this.focusManager.restoreFocusedElement();return}let c={childrenOnly:!0,getNodeKey:l=>{if(l.nodeType===1)return l.getAttribute("data-key")||l.getAttribute("data-lvt-key")||void 0},onBeforeElUpdated:(l,d)=>{if(d.nodeType===Node.ELEMENT_NODE&&d.hasAttribute(Z))return!1;if(d.nodeType===Node.ELEMENT_NODE&&l.nodeType===Node.ELEMENT_NODE){let u=d.attributes,p=l;for(let g=0;g<u.length;g++){let h=u[g].name;if(h.length>4&&h.charCodeAt(0)===108&&h.charCodeAt(1)===118&&h.charCodeAt(2)===116&&h.charCodeAt(3)===45&&!p.hasAttribute(h)){this.directiveTouchedThisRender=!0;break}}}if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore")&&!d.hasAttribute("data-lvt-force-update"))return!1;if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore-attrs")&&!d.hasAttribute("data-lvt-force-update")&&d.nodeType===Node.ELEMENT_NODE){let u=l.attributes,p=d;for(let g=0;g<u.length;g++){let h=u[g];p.hasAttributeNS(h.namespaceURI,h.localName)||p.setAttributeNS(h.namespaceURI,h.name,h.value)}}if(l instanceof HTMLDataListElement&&!d.hasAttribute("data-lvt-force-update")){let u=document.activeElement;if(u instanceof HTMLInputElement&&u.list===l)return!1}return l instanceof HTMLDialogElement&&l.hasAttribute("open")&&!d.hasAttribute("data-lvt-force-update")&&d.setAttribute("open",""),!d.hasAttribute("data-lvt-force-update")&&l instanceof HTMLElement&&l.hasAttribute("popover")&&ze(l)||(l instanceof HTMLInputElement&&d instanceof HTMLInputElement&&(l.type==="checkbox"||l.type==="radio")&&(d.hasAttribute("data-lvt-force-update")?(l.checked=d.checked,l.type==="checkbox"&&(l.indeterminate=d.indeterminate),l.removeAttribute("data-lvt-force-update")):(d.checked=l.checked,l.checked?d.setAttribute("checked",""):d.removeAttribute("checked"),l.type==="checkbox"&&(d.indeterminate=l.indeterminate))),this.focusManager.shouldSkipUpdate(l))?!1:l.isEqualNode(d)?!(!d.hasAttribute("data-lvt-force-update")&&(d.children.length===0||d.querySelector("[data-lvt-force-update]")===null)):(this.executeLifecycleHook(l,"lvt-updated"),!0)},onElUpdated:l=>{var d;l instanceof HTMLTextAreaElement&&(l.value=(d=l.textContent)!=null?d:""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update")},onNodeAdded:l=>{var d;l instanceof HTMLTextAreaElement&&(l.value=(d=l.textContent)!=null?d:""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update"),l.nodeType===Node.ELEMENT_NODE&&(this.executeLifecycleHook(l,"lvt-mounted"),this.nodesAddedThisRender++)},onBeforeNodeDiscarded:l=>(l.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(l,"lvt-destroyed"),!0)};if(r.targetedOps&&r.targetedOps.length>0){let l=[],d=!1;for(let u of r.targetedOps){let p=this.rangeDomApplier.apply(e,u,c);p?(p.setAttribute(Q,""),l.push(p)):d=!0}if(d){this.logger.warn("[updateDOM] one or more targeted DOM ops failed; rebuilding tempWrapper from treeState for a full morphdom sync");for(let p of l)p.removeAttribute(Q);let u=this.treeRenderer.renderState();a.innerHTML=u}else this.replaceTargetedSkipPlaceholders(a)}try{fe(e,a,c)}finally{this.rangeDomApplier.cleanupMarkers(e)}Bt(e),this.focusManager.restoreFocusedElement(),Tt(e),kt(e),Mt(e),xt(e),Lt(e),Ct(e,l=>this.send(l)),Ke(e,l=>this.send(l)),Rt(e),sn(e),fn(e),(this.nodesAddedThisRender>0||this.directiveTouchedThisRender)&&(bt(e,this.wrapperElement||void 0),this.eventDelegator.setupDOMEventTriggerDelegation(e),this.uploadHandler.initializeFileInputs(e)),this.changeAutoWirer.wireElements(),n&&this.formLifecycleManager.handleResponse(n)}handleUploadStartResponse(e){this.uploadHandler.handleUploadStartResponse(e)}replaceTargetedSkipPlaceholders(e){let t=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT),n=[],r;for(;r=t.nextNode();){let s=r;s.nodeValue&&/^lvt-targeted-skip:.+$/.test(s.nodeValue)&&n.push(s)}for(let s of n){let a=s.nodeValue.match(/^lvt-targeted-skip:(.+)$/),o=a?a[1]:"",c=s.parentElement;c&&c.setAttribute(Z,o),s.remove()}}executeLifecycleHook(e,t){let n=e.getAttribute(t);if(n)try{new Function("element",n).call(e,e)}catch(r){this.logger.error(`Error executing ${t} hook:`,r)}}reset(){this.resetSessionState()}getTreeState(){return this.treeRenderer.getTreeState()}getStaticStructure(){return this.treeRenderer.getStaticStructure()}};typeof window!="undefined"&&Fe.autoInit();return kn(mr);})();
|
|
32
32
|
//# sourceMappingURL=livetemplate-client.browser.js.map
|