Packages
lustre
5.1.1
5.7.1
5.7.0
5.6.0
5.5.2
5.5.1
5.5.0
5.4.0
5.3.5
5.3.4
5.3.3
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.1
5.1.0
5.0.3
5.0.2
5.0.1
5.0.0
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.6
4.3.5
4.3.4
4.3.3
4.3.2
4.3.1
4.3.0
4.2.6
4.2.5
4.2.4
4.2.3
4.2.2
4.2.1
4.2.0
4.1.8
4.1.7
4.1.6
4.1.5
4.1.4
4.1.3
4.1.2
4.1.1
4.1.0
4.0.0
4.0.0-rc1
4.0.0-rc.2
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.12
3.0.11
3.0.10
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.8
3.0.0-rc.7
3.0.0-rc.6
3.0.0-rc.5
3.0.0-rc.4
3.0.0-rc.3
3.0.0-rc.2
3.0.0-rc.1
2.0.1
2.0.0
1.3.0
1.2.0
1.1.0
1.0.0
Create HTML templates, single page applications, Web Components, and real-time server components in Gleam!
Current section
Files
Jump to
Current section
Files
priv/static/lustre-server-component.min.mjs
var qt=5,re=Math.pow(2,qt),Tn=re-1,Nn=re/2,Mn=re/4;var De=[" "," ",`
`,"\v","\f","\r","\x85","\u2028","\u2029"].join(""),vr=new RegExp(`^[${De}]*`),kr=new RegExp(`[${De}]*$`);var g=()=>globalThis?.document,le="http://www.w3.org/1999/xhtml",ae=1,ce=3,fe=11,Ge=!!globalThis.HTMLElement?.prototype?.moveBefore;var nt=0;var rt=1;var it=2;var st=0;var ut=1;var ot=2;var lt=3;var at=`
`,ct=" ";var xt=new WeakMap;async function $t(i){let e=[];for(let n of g().querySelectorAll("link[rel=stylesheet], style"))n.sheet||e.push(new Promise((r,s)=>{n.addEventListener("load",r),n.addEventListener("error",s)}));if(await Promise.allSettled(e),!i.host.isConnected)return[];i.adoptedStyleSheets=i.host.getRootNode().adoptedStyleSheets;let t=[];for(let n of g().styleSheets)try{i.adoptedStyleSheets.push(n)}catch{try{let r=xt.get(n);if(!r){r=new CSSStyleSheet;for(let s of n.cssRules)r.insertRule(s.cssText,r.cssRules.length);xt.set(n,r)}i.adoptedStyleSheets.push(r)}catch{let r=n.ownerNode.cloneNode();i.prepend(r),t.push(r)}}return t}var wt=0;var bt=1;var yt=2;var he=3;var gt=4;var me=5;var xe=6;var $e=7;var F=class{offset=0;#r=null;#e=()=>{};#t=!1;#n=!1;constructor(e,t,{useServerEvents:n=!1,exposeKeys:r=!1}={}){this.#r=e,this.#e=t,this.#t=n,this.#n=r}mount(e){Q(this.#r,this.#p(this.#r,e))}#i=[];push(e){let t=this.offset;t&&(w(e.changes,n=>{switch(n.kind){case xe:case he:n.before=(n.before|0)+t;break;case $e:case me:n.from=(n.from|0)+t;break}}),w(e.children,n=>{n.index=(n.index|0)+t})),this.#i.push({node:this.#r,patch:e}),this.#s()}#s(){let e=this;for(;e.#i.length;){let{node:t,patch:n}=e.#i.pop();w(n.changes,u=>{switch(u.kind){case xe:e.#u(t,u.children,u.before);break;case he:e.#c(t,u.key,u.before,u.count);break;case gt:e.#l(t,u.key,u.count);break;case $e:e.#o(t,u.from,u.count);break;case me:e.#a(t,u.from,u.count,u.with);break;case wt:e.#d(t,u.content);break;case bt:e.#_(t,u.inner_html);break;case yt:e.#x(t,u.added,u.removed);break}}),n.removed&&e.#o(t,t.childNodes.length-n.removed,n.removed);let r=-1,s=null;w(n.children,u=>{let o=u.index|0,b=s&&r-o===1?s.previousSibling:R(t,o);e.#i.push({node:b,patch:u}),s=b,r=o})}}#u(e,t,n){let r=jt();w(t,s=>{let u=this.#p(e,s);Q(r,u)}),we(e,r,R(e,n))}#c(e,t,n,r){let s=Et(e,t),u=R(e,n);for(let o=0;o<r&&s!==null;++o){let b=s.nextSibling;Ge?e.moveBefore(s,u):we(e,s,u),s=b}}#l(e,t,n){this.#f(e,Et(e,t),n)}#o(e,t,n){this.#f(e,R(e,t),n)}#f(e,t,n){for(;n-- >0&&t!==null;){let r=t.nextSibling,s=t[p].key;s&&e[p].keyedChildren.delete(s);for(let[u,{timeout:o}]of t[p].debouncers??[])clearTimeout(o);e.removeChild(t),t=r}}#a(e,t,n,r){this.#o(e,t,n);let s=this.#p(e,r);we(e,s,R(e,t))}#d(e,t){e.data=t??""}#_(e,t){e.innerHTML=t??""}#x(e,t,n){w(n,r=>{let s=r.name;e[p].handlers.has(s)?(e.removeEventListener(s,be),e[p].handlers.delete(s),e[p].throttles.has(s)&&e[p].throttles.delete(s),e[p].debouncers.has(s)&&(clearTimeout(e[p].debouncers.get(s).timeout),e[p].debouncers.delete(s))):(e.removeAttribute(s),At[s]?.removed?.(e,s))}),w(t,r=>{this.#m(e,r)})}#p(e,t){switch(t.kind){case ut:{let n=vt(e,t);return this.#h(n,t),this.#u(n,t.children,0),n}case ot:return kt(e,t);case st:{let n=jt(),r=kt(e,t);return Q(n,r),w(t.children,s=>{Q(n,this.#p(e,s))}),n}case lt:{let n=vt(e,t);return this.#h(n,t),this.#_(n,t.inner_html),n}}}#h(e,{key:t,attributes:n}){this.#n&&t&&e.setAttribute("data-lustre-key",t),w(n,r=>this.#m(e,r))}#m(e,t){let{debouncers:n,handlers:r,throttles:s}=e[p],{kind:u,name:o,value:b,prevent_default:Nt,stop_propagation:Mt,immediate:te,include:It,debounce:je,throttle:Ee}=t;switch(u){case nt:{let l=b??"";if(o==="virtual:defaultValue"){e.defaultValue=l;return}l!==e.getAttribute(o)&&e.setAttribute(o,l),At[o]?.added?.(e,b);break}case rt:e[o]=b;break;case it:{if(r.has(o)&&e.removeEventListener(o,be),e.addEventListener(o,be,{passive:!t.prevent_default}),Ee>0){let l=s.get(o)??{};l.delay=Ee,s.set(o,l)}else s.delete(o);if(je>0){let l=n.get(o)??{};l.delay=je,n.set(o,l)}else clearTimeout(n.get(o)?.timeout),n.delete(o);r.set(o,l=>{Nt&&l.preventDefault(),Mt&&l.stopPropagation();let v=l.type,$="",A=l.currentTarget;for(;A!==this.#r;){let C=A[p].key,z=A.parentNode;if(C)$=`${ct}${C}${$}`;else{let Ut=z.childNodes,Se=[].indexOf.call(Ut,A);z===this.#r&&(Se-=this.offset),$=`${at}${Se}${$}`}A=z}$=$.slice(1);let ne=this.#t?jn(l,It??[]):l,k=s.get(v);if(k){let C=Date.now(),z=k.last||0;C>z+k.delay&&(k.last=C,k.lastEvent=l,this.#e(ne,$,v,te))}let B=n.get(v);B&&(clearTimeout(B.timeout),B.timeout=setTimeout(()=>{l!==s.get(v)?.lastEvent&&this.#e(ne,$,v,te)},B.delay)),!k&&!B&&this.#e(ne,$,v,te)});break}}}},w=(i,e)=>{if(Array.isArray(i))for(let t=0;t<i.length;t++)e(i[t]);else if(i)for(i;i.tail;i=i.tail)e(i.head)},Q=(i,e)=>i.appendChild(e),we=(i,e,t)=>i.insertBefore(e,t??null),vt=(i,{key:e,tag:t,namespace:n})=>{let r=g().createElementNS(n||le,t);return P(i,r,e),r},kt=(i,{key:e,content:t})=>{let n=g().createTextNode(t??"");return P(i,n,e),n},jt=()=>g().createDocumentFragment(),R=(i,e)=>i.childNodes[e|0],p=Symbol("lustre"),P=(i,e,t="")=>{switch(e.nodeType){case ae:case fe:e[p]={key:t,keyedChildren:new Map,handlers:new Map,throttles:new Map,debouncers:new Map};break;case ce:e[p]={key:t};break}i&&t&&i[p].keyedChildren.set(t,new WeakRef(e))};var Et=(i,e)=>i[p].keyedChildren.get(e).deref(),be=i=>{let t=i.currentTarget[p].handlers.get(i.type);i.type==="submit"&&(i.detail??={},i.detail.formData=[...new FormData(i.target).entries()]),t(i)},jn=(i,e=[])=>{let t={};(i.type==="input"||i.type==="change")&&e.push("target.value"),i.type==="submit"&&e.push("detail.formData");for(let n of e){let r=n.split(".");for(let s=0,u=i,o=t;s<r.length;s++){if(s===r.length-1){o[r[s]]=u[r[s]];break}o=o[r[s]]??={},u=u[r[s]]}}return t},St=i=>({added(e){e[i]=!0},removed(e){e[i]=!1}}),En=i=>({added(e,t){e[i]=t}}),At={checked:St("checked"),selected:St("selected"),value:En("value"),autofocus:{added(i){queueMicrotask(()=>i.focus?.())}},autoplay:{added(i){try{i.play?.()}catch(e){console.error(e)}}}};var Bt=0;var Ct=1;var zt=2;var Z=0;var Ot=1;var Tt=2;var ee=3;var ye=class extends HTMLElement{static get observedAttributes(){return["route","method"]}#r;#e="ws";#t=null;#n=null;#i=[];#s;#u=new Set;#c=new Set;#l=!1;#o=[];#f=new MutationObserver(e=>{let t=[];for(let n of e){if(n.type!=="attributes")continue;let r=n.attributeName;(!this.#l||this.#u.has(r))&&t.push([r,this.getAttribute(r)])}if(t.length===1){let[n,r]=t[0];this.#n?.send({kind:Z,name:n,value:r})}else t.length?this.#n?.send({kind:ee,messages:t.map(([n,r])=>({kind:Z,name:n,value:r}))}):this.#o.push(...t)});constructor(){super(),this.internals=this.attachInternals(),this.#f.observe(this,{attributes:!0})}connectedCallback(){this.#e=this.getAttribute("method")||"ws";for(let t of this.attributes)this.#o.push([t.name,t.value]);let e=this.getAttribute("route");e&&(this.#t=new URL(e,location.href),this.#a())}attributeChangedCallback(e,t,n){switch(e){case(t!==n&&"route"):{this.#t=new URL(n,location.href),this.#a();return}case"method":{let r=n.toLowerCase();if(r==this.#e)return;["ws","sse","polling"].includes(r)&&(this.#e=r,this.#e=="ws"&&(this.#t.protocol=="https:"&&(this.#t.protocol="wss:"),this.#t.protocol=="http:"&&(this.#t.protocol="ws:")),this.#a());return}}}async messageReceivedCallback(e){switch(e.kind){case Bt:{for(this.#r??=this.attachShadow({mode:e.open_shadow_root?"open":"closed"});this.#r.firstChild;)this.#r.firstChild.remove();P(null,this.#r),this.#s=new F(this.#r,(n,r,s)=>{this.#n?.send({kind:Ot,path:r,name:s,event:n})},{useServerEvents:!0}),this.#u=new Set(e.observed_attributes);let t=this.#o.filter(([n])=>this.#u.has(n));t.length&&this.#n.send({kind:ee,messages:t.map(([n,r])=>({kind:Z,name:n,value:r}))}),this.#o=[],this.#c=new Set(e.observed_properties);for(let n of this.#c)Object.defineProperty(this,n,{get(){return this[`_${n}`]},set(r){this[`_${n}`]=r,this.#n?.send({kind:Tt,name:n,value:r})}});e.will_adopt_styles&&await this.#d(),this.#s.mount(e.vdom),this.dispatchEvent(new CustomEvent("lustre:mount"));break}case Ct:{this.#s.push(e.patch);break}case zt:{this.dispatchEvent(new CustomEvent(e.name,{detail:e.data}));break}}}#a(){if(!this.#t||!this.#e)return;this.#n&&this.#n.close();let r={onConnect:()=>{this.#l=!0,this.dispatchEvent(new CustomEvent("lustre:connect"),{detail:{route:this.#t,method:this.#e}})},onMessage:s=>{this.messageReceivedCallback(s)},onClose:()=>{this.#l=!1,this.dispatchEvent(new CustomEvent("lustre:close"),{detail:{route:this.#t,method:this.#e}})}};switch(this.#e){case"ws":this.#n=new ge(this.#t,r);break;case"sse":this.#n=new ve(this.#t,r);break;case"polling":this.#n=new ke(this.#t,r);break}}async#d(){for(;this.#i.length;)this.#i.pop().remove(),this.#r.firstChild.remove();this.#i=await $t(this.#r),this.#s.offset=this.#i.length}},ge=class{#r;#e;#t=!1;#n=[];#i;#s;#u;constructor(e,{onConnect:t,onMessage:n,onClose:r}){this.#r=e,this.#e=new WebSocket(this.#r),this.#i=t,this.#s=n,this.#u=r,this.#e.onopen=()=>{this.#i()},this.#e.onmessage=({data:s})=>{try{this.#s(JSON.parse(s))}finally{this.#n.length?this.#e.send(JSON.stringify({kind:ee,messages:this.#n})):this.#t=!1,this.#n=[]}},this.#e.onclose=()=>{this.#u()}}send(e){if(this.#t||this.#e.readyState!==WebSocket.OPEN){this.#n.push(e);return}else this.#e.send(JSON.stringify(e)),this.#t=!0}close(){this.#e.close()}},ve=class{#r;#e;#t;#n;#i;constructor(e,{onConnect:t,onMessage:n,onClose:r}){this.#r=e,this.#e=new EventSource(this.#r),this.#t=t,this.#n=n,this.#i=r,this.#e.onopen=()=>{this.#t()},this.#e.onmessage=({data:s})=>{try{this.#n(JSON.parse(s))}catch{}}}send(e){}close(){this.#e.close(),this.#i()}},ke=class{#r;#e;#t;#n;#i;#s;constructor(e,{onConnect:t,onMessage:n,onClose:r,...s}){this.#r=e,this.#n=t,this.#i=n,this.#s=r,this.#e=s.interval??5e3,this.#u().finally(()=>{this.#n(),this.#t=setInterval(()=>this.#u(),this.#e)})}async send(e){}close(){clearInterval(this.#t),this.#s()}#u(){return fetch(this.#r).then(e=>e.json()).then(this.#i).catch(console.error)}};customElements.define("lustre-server-component",ye);export{ye as ServerComponent};