Packages
lustre
5.0.0
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 Yt=5,oe=Math.pow(2,Yt),vn=oe-1,jn=oe/2,Ln=oe/4;var Ie=[" "," ",`
`,"\v","\f","\r","\x85","\u2028","\u2029"].join(""),In=new RegExp(`^[${Ie}]*`),qn=new RegExp(`[${Ie}]*$`);var b=globalThis?.document,fe="http://www.w3.org/1999/xhtml",pe=1,de=3,H=11,Fe=!!globalThis.HTMLElement?.prototype?.moveBefore;var Qe=0;var Ze=1;var et=2;var tt=1;var rt=2;var nt=0;var it=1;var st=2;var ot=3;var ut=`
`,lt=" ";var _t=new WeakMap;async function ht(i){let e=[];for(let r of b.querySelectorAll("link[rel=stylesheet], style"))r.sheet||e.push(new Promise((n,s)=>{r.addEventListener("load",n),r.addEventListener("error",s)}));if(await Promise.allSettled(e),!i.host.isConnected)return[];i.adoptedStyleSheets=i.host.getRootNode().adoptedStyleSheets;let t=[];for(let r of b.styleSheets)try{i.adoptedStyleSheets.push(r)}catch{try{let n=_t.get(r);if(!n){n=new CSSStyleSheet;for(let s of r.cssRules)n.insertRule(s.cssText,n.cssRules.length);_t.set(r,n)}i.adoptedStyleSheets.push(n)}catch{let n=r.ownerNode.cloneNode();i.prepend(n),t.push(n)}}return t}var mt=0;var xt=1;var $t=2;var $e=3;var gt=4;var ge=5;var we=6;var be=7;var F=class{offset=0;#n=null;#e=()=>{};#r=!1;constructor(e,t,{useServerEvents:r=!1}={}){this.#n=e,this.#e=t,this.#r=r}mount(e){K(this.#n,this.#p(e))}#t=[];push(e){let t=this.offset;t&&(g(e.changes,r=>{switch(r.kind){case we:case $e:r.before=(r.before|0)+t;break;case be:case ge:r.from=(r.from|0)+t;break}}),g(e.children,r=>{r.index=(r.index|0)+t})),this.#t.push({node:this.#n,patch:e}),this.#i()}#i(){let e=this;for(;e.#t.length;){let{node:t,patch:r}=e.#t.pop();g(r.changes,n=>{switch(n.kind){case we:e.#s(t,n.children,n.before);break;case $e:e.#o(t,n.key,n.before,n.count);break;case gt:e.#c(t,n.key,n.count);break;case be:e.#u(t,n.from,n.count);break;case ge:e.#d(t,n.from,n.count,n.with);break;case mt:e.#a(t,n.content);break;case xt:e.#f(t,n.inner_html);break;case $t:e.#m(t,n.added,n.removed);break}}),r.removed&&e.#u(t,t.childNodes.length-r.removed,r.removed),g(r.children,n=>{e.#t.push({node:R(t,n.index),patch:n})})}}#s(e,t,r){let n=yt();g(t,s=>{let c=this.#p(s);ke(e,c),K(n,c)}),ye(e,n,R(e,r))}#o(e,t,r,n){let s=kt(e,t),c=R(e,r);for(let m=0;m<n&&s!==null;++m){let p=s.nextSibling;Fe?e.moveBefore(s,c):ye(e,s,c),s=p}}#c(e,t,r){this.#l(e,kt(e,t),r)}#u(e,t,r){this.#l(e,R(e,t),r)}#l(e,t,r){for(;r-- >0&&t!==null;){let n=t.nextSibling,s=t[u].key;s&&e[u].keyedChildren.delete(s);for(let[c,{timeout:m}]of t[u].debouncers)clearTimeout(m);e.removeChild(t),t=n}}#d(e,t,r,n){this.#u(e,t,r);let s=this.#p(n);ke(e,s),ye(e,s,R(e,t))}#a(e,t){e.data=t??""}#f(e,t){e.innerHTML=t??""}#m(e,t,r){g(r,n=>{let s=n.name;e[u].handlers.has(s)?(e.removeEventListener(s,vt),e[u].handlers.delete(s),e[u].throttles.has(s)&&e[u].throttles.delete(s),e[u].debouncers.has(s)&&(clearTimeout(e[u].debouncers.get(s).timeout),e[u].debouncers.delete(s))):(e.removeAttribute(s),Lt[s]?.removed?.(e,s))}),g(t,n=>{this.#h(e,n)})}#p(e){switch(e.kind){case it:{let t=wt(e);return this.#_(t,e),this.#s(t,e.children,0),t}case st:{let t=bt(e.content);return B(t,e.key),t}case nt:{let t=yt(),r=bt();return B(r,e.key),K(t,r),g(e.children,n=>{K(t,this.#p(n))}),t}case ot:{let t=wt(e);return this.#_(t,e),this.#f(t,e.inner_html),t}}}#_(e,{attributes:t}){g(t,r=>this.#h(e,r))}#h(e,t){let r=e[u];switch(t.kind){case Qe:{let n=t.name,s=t.value??"";s!==e.getAttribute(n)&&e.setAttribute(n,s),Lt[n]?.added?.(e,s);break}case Ze:e[t.name]=t.value;break;case et:{r.handlers.has(t.name)||e.addEventListener(t.name,vt,{passive:!t.prevent_default});let n=t.prevent_default,s=t.stop_propagation,c=t.immediate,m=Array.isArray(t.include)?t.include:[];if(t.limit?.kind===rt){let p=r.throttles.get(t.name)??{last:0,delay:t.limit.delay};r.throttles.set(t.name,p)}if(t.limit?.kind===tt){let p=r.debouncers.get(t.name)??{timeout:null,delay:t.limit.delay};r.debouncers.set(t.name,p)}r.handlers.set(t.name,p=>{n&&p.preventDefault(),s&&p.stopPropagation();let y=p.type,$="",C=p.currentTarget;for(;C!==this.#n;){let x=C[u].key,j=C.parentNode;if(x)$=`${lt}${x}${$}`;else{let ee=j.childNodes,Se=[].indexOf.call(ee,C);j===this.#n&&(Se-=this.offset),$=`${ut}${Se}${$}`}C=j}$=$.slice(1);let Z=this.#r?jr(p,m):p;if(r.throttles.has(y)){let x=r.throttles.get(y),j=Date.now(),ee=x.last||0;j>ee+x.delay?(x.last=j,this.#e(Z,$,y,c)):p.preventDefault()}else if(r.debouncers.has(y)){let x=r.debouncers.get(y);clearTimeout(x.timeout),x.timeout=setTimeout(()=>{this.#e(Z,$,y,c)},x.delay)}else this.#e(Z,$,y,c)});break}}}},g=(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)},K=(i,e)=>i.appendChild(e),ye=(i,e,t)=>i.insertBefore(e,t??null),wt=({key:i,tag:e,namespace:t})=>{let r=b.createElementNS(t||fe,e);return B(r,i),r},bt=i=>b.createTextNode(i??""),yt=()=>b.createDocumentFragment(),R=(i,e)=>i.childNodes[e|0],u=Symbol("lustre"),B=(i,e="")=>{switch(i.nodeType){case pe:case H:i[u]={key:e,keyedChildren:new Map,handlers:new Map,throttles:new Map,debouncers:new Map};break;case de:i[u]={key:e,debouncers:new Map};break}},ke=(i,e)=>{if(e.nodeType===H){for(e=e.firstChild;e;e=e.nextSibling)ke(i,e);return}let t=e[u].key;t&&i[u].keyedChildren.set(t,new WeakRef(e))},kt=(i,e)=>i[u].keyedChildren.get(e).deref(),vt=i=>{let t=i.currentTarget[u].handlers.get(i.type);i.type==="submit"&&(i.detail.formData=[...new FormData(i.target).entries()]),t(i)},jr=(i,e=[])=>{let t={};(i.type==="input"||i.type==="change")&&e.push("target.value"),i.type==="submit"&&e.push("detail.formData");for(let r of e){let n=r.split(".");for(let s=0,c=i,m=t;s<n.length;s++){if(s===n.length-1){m[n[s]]=c[n[s]];break}m=m[n[s]]??={},c=c[n[s]]}}return t},jt=i=>({added(e){e[i]=!0},removed(e){e[i]=!1}}),Lr=i=>({added(e,t){e[i]=t}}),Lt={checked:jt("checked"),selected:jt("selected"),value:Lr("value"),autofocus:{added(i){queueMicrotask(()=>i.focus?.())}},autoplay:{added(i){try{i.play?.()}catch(e){console.error(e)}}}};var Ot=0;var St=1;var Et=2;var X=0;var At=1;var Bt=2;var Q=3;var ve=class extends HTMLElement{static get observedAttributes(){return["route","method"]}#n;#e="ws";#r=null;#t=null;#i=[];#s;#o=new Set;#c=new Set;#u=!1;#l=[];#d=new MutationObserver(e=>{let t=[];for(let r of e){if(r.type!=="attributes")continue;let n=r.attributeName;(!this.#u||this.#o.has(n))&&t.push([n,this.getAttribute(n)])}if(t.length===1){let[r,n]=t[0];this.#t?.send({kind:X,name:r,value:n})}else t.length?this.#t?.send({kind:Q,messages:t.map(([r,n])=>({kind:X,name:r,value:n}))}):this.#l.push(...t)});constructor(){super(),this.internals=this.attachInternals(),this.#d.observe(this,{attributes:!0})}connectedCallback(){this.#e=this.getAttribute("method")||"ws";for(let t of this.attributes)this.#l.push([t.name,t.value]);let e=this.getAttribute("route");e&&(this.#r=new URL(e,location.href),this.#a())}attributeChangedCallback(e,t,r){switch(e){case(t!==r&&"route"):{this.#r=new URL(r,location.href),this.#a();return}case"method":{let n=r.toLowerCase();if(n==this.#e)return;["ws","sse","polling"].includes(n)&&(this.#e=n,this.#e=="ws"&&(this.#r.protocol=="https:"&&(this.#r.protocol="wss:"),this.#r.protocol=="http:"&&(this.#r.protocol="ws:")),this.#a());return}}}async messageReceivedCallback(e){switch(e.kind){case Ot:{for(this.#n??=this.attachShadow({mode:e.open_shadow_root?"open":"closed"});this.#n.firstChild;)this.#n.firstChild.remove();B(this.#n),this.#s=new F(this.#n,(r,n,s)=>{this.#t?.send({kind:At,path:n,name:s,event:r})},{useServerEvents:!0}),this.#o=new Set(e.observed_attributes);let t=this.#l.filter(([r])=>this.#o.has(r));t.length&&this.#t.send({kind:Q,messages:t.map(([r,n])=>({kind:X,name:r,value:n}))}),this.#l=[],this.#c=new Set(e.observed_properties);for(let r of this.#c)Object.defineProperty(this,r,{get(){return this[`_${r}`]},set(n){this[`_${r}`]=n,this.#t?.send({kind:Bt,name:r,value:n})}});e.will_adopt_styles&&await this.#f(),this.#s.mount(e.vdom),this.dispatchEvent(new CustomEvent("lustre:mount"));break}case St:{this.#s.push(e.patch);break}case Et:{this.dispatchEvent(new CustomEvent(e.name,{detail:e.data}));break}}}#a(){if(!this.#r||!this.#e)return;this.#t&&this.#t.close();let n={onConnect:()=>{this.#u=!0,this.dispatchEvent(new CustomEvent("lustre:connect"),{detail:{route:this.#r,method:this.#e}})},onMessage:s=>{this.messageReceivedCallback(s)},onClose:()=>{this.#u=!1,this.dispatchEvent(new CustomEvent("lustre:close"),{detail:{route:this.#r,method:this.#e}})}};switch(this.#e){case"ws":this.#t=new je(this.#r,n);break;case"sse":this.#t=new Le(this.#r,n);break;case"polling":this.#t=new Oe(this.#r,n);break}}async#f(){for(;this.#i.length;)this.#i.pop().remove(),this.#n.firstChild.remove();this.#i=await ht(this.#n),this.#s.offset=this.#i.length}},je=class{#n;#e;#r=!1;#t=[];#i;#s;#o;constructor(e,{onConnect:t,onMessage:r,onClose:n}){this.#n=e,this.#e=new WebSocket(this.#n),this.#i=t,this.#s=r,this.#o=n,this.#e.onopen=()=>{this.#i()},this.#e.onmessage=({data:s})=>{try{this.#s(JSON.parse(s))}finally{this.#t.length?this.#e.send(JSON.stringify({kind:Q,messages:this.#t})):this.#r=!1,this.#t=[]}},this.#e.onclose=()=>{this.#o()}}send(e){if(this.#r||this.#e.readyState!==WebSocket.OPEN){this.#t.push(e);return}else this.#e.send(JSON.stringify(e)),this.#r=!0}close(){this.#e.close()}},Le=class{#n;#e;#r;#t;#i;constructor(e,{onConnect:t,onMessage:r,onClose:n}){this.#n=e,this.#e=new EventSource(this.#n),this.#r=t,this.#t=r,this.#i=n,this.#e.onopen=()=>{this.#r()},this.#e.onmessage=({data:s})=>{try{this.#t(JSON.parse(s))}catch{}}}send(e){}close(){this.#e.close(),this.#i()}},Oe=class{#n;#e;#r;#t;#i;#s;constructor(e,{onConnect:t,onMessage:r,onClose:n,...s}){this.#n=e,this.#t=t,this.#i=r,this.#s=n,this.#e=s.interval??5e3,this.#o().finally(()=>{this.#t(),this.#r=setInterval(()=>this.#o(),this.#e)})}async send(e){}close(){clearInterval(this.#r),this.#s()}#o(){return fetch(this.#n).then(e=>e.json()).then(this.#i).catch(console.error)}};customElements.define("lustre-server-component",ve);export{ve as ServerComponent};