campfire.js
Version:
a cozy web framework
3 lines (2 loc) • 13.1 kB
JavaScript
var i=class i{static get document(){return i._document}static initialize(){if(!i._initialized){try{typeof window<"u"&&window.document&&(i._document=window.document,i._window=window,i._HTMLElement=window.HTMLElement)}catch{}i._initialized=!0}}static configure(e){e.document&&(i._document=e.document),e.window&&(i._window=e.window),e.HTMLElement&&(i._HTMLElement=e.HTMLElement),typeof e.ssr<"u"&&(this.ssr=e.ssr),i._initialized=!0}static ensureInitialized(){i._initialized||i.initialize(),i.ensureAvailable(i._document,"document"),i.ensureAvailable(i._window,"window"),i.ensureAvailable(i._HTMLElement,"HTMLElement")}static ensureAvailable(e,t){if(!e)throw new Error(`CfDom: ${t} is not available.Please configure CfDom with a valid DOM implementation.`)}static createElement(e){return i.ensureInitialized(),i._document.createElement(e)}static createDocumentFragment(){return i.ensureInitialized(),i._document.createDocumentFragment()}static querySelector(e,t){return i.ensureInitialized(),(t??i._document).querySelector(e)}static querySelectorAll(e,t){return i.ensureInitialized(),(t??i._document).querySelectorAll(e)}static get body(){return i.ensureInitialized(),i._document.body}static addElEventListener(e,t,n,s){if(i.ensureInitialized(),this.isSsr())throw new Error("Event listeners are not available in SSR contexts!");e.addEventListener(t,n,s)}static isHTMLElement(e){return i.ensureInitialized(),e instanceof i._HTMLElement}static isBrowser(){return typeof window<"u"&&!!window.document}static isUsingCustomDOMImplementation(){return i.ensureInitialized(),i._document!==null&&(typeof window>"u"||i._document!==window.document)}static isSsr(e){return typeof e<"u"?this.ssr=e:this.ssr}};i._document=null,i._window=null,i._HTMLElement=null,i._initialized=!1,i.ssr=!1;var u=i;u.initialize();var O=(r,e)=>{if(!("into"in e)&&!("after"in e)&&!("before"in e))throw new Error("No valid position specified. Use 'into', 'after', or 'before'.");let t="beforeend",n;"after"in e?(t="afterend",n=e.after):"before"in e?(t="beforebegin",n=e.before):("into"in e&&e.at==="start"&&(t="afterbegin"),n=e.into);let s=u.createDocumentFragment();if(Array.isArray(r))for(let o of r)s.appendChild(o);else s.appendChild(r);if(t==="beforebegin"){let o=n.parentNode;o&&o.insertBefore(s,n)}else if(t==="afterend"){let o=n.parentNode;o&&o.insertBefore(s,n.nextSibling)}else t==="afterbegin"?n.insertBefore(s,n.firstChild):n.appendChild(s);return r},P=r=>globalThis.addEventListener("DOMContentLoaded",r);function v({s:r,all:e,from:t,single:n}){let s=t??u.document;if(e)return Array.from(u.querySelectorAll(r,s));let o=u.querySelector(r,s);return n?o:[o]}var j=r=>r.remove(),N=r=>{r.innerHTML=""};var p=r=>r?r.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):"",B=r=>{if(!r)return"";let e=/&(?:amp|lt|gt|quot|#(0+)?39);/g,t={"&":"&","<":"<",">":">",""":'"',"'":"'"};return r.replace(e,n=>t[n]||"'")},F=(...r)=>{let e=0,t=r[0],n=1;typeof r[1]<"u"&&(e=r[0],t=r[1]),r[2]&&(n=r[2]);let s=[];for(let o=e;o<t;o+=n)s.push(o);return s},q=r=>(e,...t)=>{r(...t).then(n=>e(null,n)).catch(n=>e(n,null))},U=(r,e,t=!1)=>{let n=null,s=()=>{try{r()}finally{n=setTimeout(s,e)}};return t?s():n=setTimeout(s,e),()=>{n!==null&&clearTimeout(n)}},z=r=>`${r}-${Math.random().toString(36).slice(2,8)}`,M=(r="cf-")=>{let e=new Set;return()=>{let t=z(r);for(;e.has(t);)t=z(r);return e.add(t),t}},x=(r,e=new WeakMap)=>{if(r===null||typeof r!="object"||typeof r=="function")return r;if(e.has(r))return e.get(r);try{if(Array.isArray(r)){let t=[];e.set(r,t);for(let n of r)t.push(x(n,e));return t}if(Object.getPrototypeOf(r)===Object.prototype){let t={};e.set(r,t);for(let n in r)Object.hasOwn(r,n)&&(t[n]=x(r[n],e));return t}return r}catch{return r}};var K=(r,e)=>({raw:!0,contents:Array.isArray(r)?r.join(e?.joiner??" "):r.toString()}),H=(r,...e)=>{let t=[];for(let n=0;n<r.length;n++){t.push(r[n]||"");let s=e[n];typeof s<"u"&&typeof s!="object"?t.push(p((s??"").toString())):t.push(s?.contents||"")}return t.join("")};var re=r=>u.createElement(r),ne=r=>{let{tag:e,id:t,classes:n=[]}=se(r);if(n?.some(o=>o.includes("#")))throw new Error("Error: Found # in a class name. Did you mean to do elt#id.classes instead of elt.classes#id?");e||(e="div");let s=re(e);return t&&(s.id=t),n?.length&&n.forEach(o=>s.classList.add(o)),s},se=r=>{let e=r?r.match(/([0-9a-zA-Z\-]*)?(#[0-9a-zA-Z\-]*)?((.[0-9a-zA-Z\-]+)*)/):void 0,t=e?e.slice(1,4)?.map(n=>n?n.trim():void 0):Array(3).fill(void 0);return t&&t[1]&&(t[1]=t[1].replace(/#*/g,"")),e?{tag:t[0]||void 0,id:t[1]||void 0,classes:t[2]?t[2].split(".").filter(n=>n.trim()):void 0}:{}},y=class{constructor(e,t){this.props={};this.elem=typeof e=="string"?ne(e):e,this.props=t||{}}cls(e,t=!0){var n;return(n=this.props).classes??(n.classes={}),this.props.classes[e]=!!t,this}done(){return D(this.elem,this.props)}ref(){return this.done()[0]}content(e){return this.props.contents=e,this}render(e){return this.props.render=e,this}attr(e,t){var n;return(n=this.props).attrs||(n.attrs={}),this.props.attrs[e]=t.toString(),this}attrs(e){return this.props.attrs=e,this}raw(e){return this.props.raw=e,this}misc(e,t){var n;return(n=this.props).misc||(n.misc={}),typeof e=="object"?this.props.misc=e:this.props.misc[e]=t,this}style(e,t){var n;return(n=this.props).style||(n.style={}),this.props.style[e]=t,this}styles(e){return this.props.style=e??{},this}on(e,t){var n;return(n=this.props).on||(n.on={}),this.props.on[e]=t,this}gimme(...e){var t;return(t=this.props).gimme||(t.gimme=[]),this.props.gimme=e,this}deps(e){return this.props.deps={...this.props.deps,...e},this}html(e,...t){return this.props.raw=!0,typeof e=="string"?this.props.contents=e:Array.isArray(e)&&(this.props.contents=H(e,...t)),this}children(e){return this.props.children=e,this}track(e){return console.log(e),this.props.track=e,this}};var A=new Map,R=(r,e)=>{A.set(r,e)},_=r=>{A.delete(r)},$=r=>A.get(r)||null;var W=r=>{let e={};for(let t in r)e[t]=r[t].current();return e},oe=r=>!(!r||typeof r!="function"),V=(r,e)=>Object.keys(e).forEach(t=>e[t]?r.classList.add(t):r.classList.remove(t)),Z=(r,e)=>{let{style:t={},attrs:n={},misc:s={},classes:o={}}=e.props;return V(r,o),Object.assign(r.style,t),n&&Object.entries(n||{}).forEach(([a,c])=>{typeof c=="string"&&c.length===0?r.removeAttribute(a):r.getAttribute(a)!==String(c)&&r.setAttribute(a,String(c))}),s&&Object.assign(r,s),r},ae=r=>v({s:"[data-cf-slot]",all:!0,from:r}).map(e=>[e.getAttribute("data-cf-slot"),e]).reduce((e,[t,n])=>(e[t]??(e[t]=[]),e[t].push(n),e),{}),le=({elt:r,render:e,deps:t})=>{Object.entries(t).forEach(([n,s])=>s.any(o=>{let a=new y(r),c=e(W(t),{elt:r,event:{...o,triggeredBy:n},b:a,first:!1}),g=ae(r);if(typeof c=="string")r.innerHTML=c;else if(c instanceof y){let d=c.props.contents||"";r.innerHTML=c.props.raw?d:p(d),Z(r,c)}else return;for(let d in g){let[f]=v({s:`cf-slot[name='${d}']`,from:r});if(!f)continue;let w=g[d]||[],S=u.createDocumentFragment();w.forEach(L=>S.appendChild(L)),f.replaceWith(S)}}))},ce=(r,e)=>{r.querySelectorAll("cf-slot[name]").forEach(t=>{let n=t.getAttribute("name");if(n&&Object.hasOwn(e,n)){let s=e[n],o=Array.isArray(s)?u.createDocumentFragment():s;Array.isArray(s)?s.forEach(a=>{o.appendChild(a),a.setAttribute("data-cf-slot",n)}):s.setAttribute("data-cf-slot",n),t.replaceWith(o)}})},D=(r,e={})=>{let{contents:t,render:n,misc:s,style:o,on:a={},attrs:c={},raw:g,classes:d={},gimme:f=[],deps:w={},children:S={},track:L}=e,C=!!g;L&&R(L,r),V(r,d);let I=l=>r.innerHTML=C?l:p(l);if(oe(n)){le({elt:r,render:n,deps:w});let l=n(W(w),{elt:r,b:new y(r),first:!0});typeof l>"u"?r.setAttribute("data-cf-fg-updates","true"):(r.removeAttribute("data-cf-fg-updates"),typeof l=="string"&&I(l),l instanceof y&&(C=!!l.props.raw,I(l.props.contents||""),Z(r,l)))}else typeof t=="string"&&I(t);ce(r,S),s&&Object.assign(r,s),o&&Object.assign(r.style,o),Object.entries(a).forEach(([l,h])=>u.addElEventListener(r,l,h)),Object.entries(c).forEach(([l,h])=>{let ee=r.getAttribute(l),te=String(h);ee!==te&&(typeof h=="string"&&h.length===0?r.removeAttribute(l):r.setAttribute(l,String(h)))});let k=[];for(let l of f){let h=r.querySelector(l);k.push(h)}return[r,...k]},G=(r="div",e={})=>new y(r,e);var ue=M("cf-store"),m=class r{constructor(e){this.id=ue();this._subscribers={};this._subscriberCounts={};this._dead=!1;this.value=e}on(e,t,n){var o,a;(o=this._subscriberCounts)[e]??(o[e]=0),(a=this._subscribers)[e]??(a[e]={});let s=this._subscriberCounts[e]++;return this._subscribers[e][s]=t,e==="update"&&n&&t({type:"update",value:this.value}),this._subscriberCounts[e]++}any(e){this.on("append",e),this.on("change",e),this.on("clear",e),this.on("deletion",e),this.on("update",e)}unsubscribe(e,t){delete this._subscribers[e]?.[t]}static isUpdater(e){return typeof e=="function"}update(e){if(this._dead)return null;let t;return r.isUpdater(e)?t=e(this.value):t=e,this.value=t,this._sendEvent({type:"update",value:Object.freeze(t)}),t}_sendEvent(e){if(this._dead)return;let t=this._subscribers[e.type];if(t)for(let n in t)t[n](e)}dispose(){this._dead=!0,this._subscribers={},this._subscriberCounts={}}current(){return x(this.value)}valueOf(){return x(this.value)}};var T=class extends m{constructor(t){super(t||[]);this.map=(...t)=>this.value.map(...t);this.forEach=(...t)=>this.value.forEach(...t);this.findIndex=(...t)=>this.value.findIndex(...t)}clear(){this.value=[],this._sendEvent({type:"clear"})}push(t){return this.value.push(t),this._sendEvent({type:"append",value:Object.freeze(t),idx:this.value.length-1}),this.value.length}remove(t){if(!(t<0)){if(t>=this.value.length)throw new RangeError("Invalid index.");this._sendEvent({type:"deletion",idx:t,value:this.value.splice(t,1)[0]})}}get(t){if(t<0||t>=this.value.length)throw new RangeError("Invalid index.");return Object.freeze(this.value[t])}set(t,n){if(t<0||t>=this.value.length)throw new RangeError("Invalid index.");this.value[t]=n,this._sendEvent({type:"change",value:Object.freeze(n),idx:t})}[Symbol.iterator](){return this.value[Symbol.iterator]()}get length(){return this.value.length}};var E=class extends m{constructor(e){if(super({}),!!e)for(let[t,n]of Object.entries(e))this.value[t]=Object.freeze(n)}set(e,t){this.value[e]=Object.freeze(t),this._sendEvent({key:e,value:t,type:"change"})}remove(e){let t=this.value[e];t===null||typeof t>"u"||(delete this.value[e],this._sendEvent({key:e,value:t,type:"deletion"}))}clear(){this.value={},this._sendEvent({type:"clear"})}transform(e,t){let n=this.value[e];if(!n)throw new Error(`ERROR: key ${e} does not exist in store!`);let s=Object.freeze(t(n));this.set(e,s),this._sendEvent({type:"change",value:s,key:e})}get(e){return this.value[e]}has(e){return Object.hasOwn(this.value,e)}entries(){return Object.entries(this.value)}get size(){return Object.keys(this.value).length}};function J(r){if("type"in r){if(r.type==="list")return new T(r.value);if(r.type==="map")return new E(r.value)}return new m(r.value)}var pe=r=>{let e=/\\?({{{\s*([^}]+)\s*}}}|{{[#^/]?\s*([^}]+)\s*}})/g,t=0,n=[],s=e.exec(r);for(;s!==null;){let[o,a,c,g]=s,d=o.startsWith("\\"),f=o.length>2?o[2]:null;t<s.index&&n.push({type:"text",value:r.slice(t,s.index)}),d?n.push({type:"text",value:a}):f==="/"?n.push({type:"section-close",key:g}):f==="#"||f==="^"?n.push({type:"section-open",key:g?.trim(),inverted:f==="^"}):n.push({type:"var",key:(c||g)?.trim(),unescaped:!!c}),t=e.lastIndex,s=e.exec(r)}return t<r.length&&n.push({type:"text",value:r.slice(t)}),n};function me(r){let e=[],t=[e];for(let n of r)if(n.type==="section-open"){let s={type:"section",key:n.key,inverted:n.inverted,children:[]};t.at(-1)?.push(s),t.push(s.children)}else if(n.type==="section-close"){if(t.length===1)throw new Error(`Unexpected closing tag ${n.key}`);t.pop()}else t.at(-1)?.push(n);if(t.length>1)throw new Error("Unclosed section(s) found");return e}var Q=r=>me(pe(r)),b=(r,e,t)=>r.map(n=>{switch(n.type){case"text":return n.value;case"var":{if(n.key==="."&&"."in e)return n.unescaped?String(e["."]):p(String(e["."]));if(!(n.key in e))return n.unescaped?`{{{ ${n.key} }}}`:`{{ ${n.key} }}`;let s=String(e[n.key]);return n.unescaped?s:p(s)}case"section":{let s=e[n.key],o=!!s;return n.inverted&&(o=s===null||s===!1||typeof s>"u"||Array.isArray(s)&&s.length===0),o?n.inverted?b(n.children,e,t):Array.isArray(s)?s.map(a=>b(n.children,typeof a=="object"?a:{".":a},e)).join(""):typeof s=="object"&&s!==null?b(n.children,s,e):b(n.children,e,t):""}}}).join(""),X=(r,e)=>b(Q(r),e),Y=r=>{let e=Q(r);return t=>b(e,t)};var Ze={ListStore:T,MapStore:E,Store:m,store:J,nu:G,mustache:X,template:Y,escape:p,unescape:B,extend:D,insert:O,empty:N,rm:j,select:v,onload:P,html:H,r:K,seq:F,CfDom:u,callbackify:q,poll:U,ids:M,track:R,tracked:$,untrack:_};export{u as CfDom,T as ListStore,E as MapStore,m as Store,q as callbackify,Ze as default,N as empty,p as escape,D as extend,H as html,M as ids,O as insert,X as mustache,G as nu,P as onload,U as poll,K as r,j as rm,v as select,F as seq,J as store,Y as template,R as track,$ as tracked,B as unescape,_ as untrack};
//# sourceMappingURL=campfire.esm.min.js.map