UNPKG

sigment

Version:

A lightweight reactive JavaScript framework built with signals and vanilla JS — no virtual DOM, no JSX, no transpilation.

12 lines (9 loc) 12.4 kB
var P=Object.defineProperty;var l=(e,t)=>P(e,"name",{value:t,configurable:!0});var y={cleanHtml:G,cleanhtml:!0,setMaxCacheSize:J,maxCacheSize:10},g={funcname:[],dataMap:new Map},C=null,w={},M=new Map,v=new Map,x={innerHTMLElements:["div","p","span","h1","h2","h3","h4","h5","h6","a","ul","ol","li","table","tr","td","th","thead","tbody","tfoot","form","label","button","section","article","header","footer","nav","aside","main","figure","figcaption","blockquote","cite","code","pre","em","strong","i","b","u","s","small","mark","time","abbr","q","dl","dt","dd","fieldset","legend","textarea","output","progress","meter","fragment","details","summary","dialog","menu","slot","template"],valueElements:["input","textarea","select","button","option","progress","meter"],srcElements:["img","script","iframe","audio","video","source","track","embed","frame","input"],hrefElements:["a","link","area","base"],voidElements:["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr","frame"]};Object.values(x).flat().forEach(e=>{globalThis[e]=(...t)=>S(e,...t)});var D=new Set(x.valueElements),Y=new Set(x.srcElements),Q=new Set(x.hrefElements),I=new Set(x.voidElements);function X(e,t){w[e]||(w[e]=K(t))}l(X,"createGlobalSignal");function Z(e){return w[e]}l(Z,"getGlobalSignal");function j(e,t){g.dataMap.has(e)&&g.dataMap.delete(e),g.dataMap.set(e,t)}l(j,"addEntry");function E(e){A(E.name);let t=g.dataMap.get(e);return t?t.value:null}l(E,"gve");function ee(e,t,n){let o;if(t instanceof HTMLElement?o=t.outerHTML:typeof t=="object"?o=JSON.stringify(t):o=t.toString(),o.length>4096){console.error("Cookie size exceeds 4KB limit. Data not stored.");return}document.cookie=e+"="+o+"; max-age="+n+" ; path=/ ;",setTimeout(()=>{document.cookie="testCookie=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/;"},n*1e3)}l(ee,"setCookie");function te(e){let n=`; ${document.cookie}`.split(`; ${e}=`);if(n.length===2){let o=n.pop().split(";").shift();try{let i=JSON.parse(o);return typeof i=="object"&&i!==null&&"nodeType"in i&&i.nodeType===1,i}catch{return o}}return null}l(te,"getCookie");function ne(e,t){let n;t instanceof HTMLElement?n=t.outerHTML:typeof t=="object"?n=JSON.stringify(t):n=t.toString(),localStorage.setItem(e,n)}l(ne,"setStorage");function oe(e){let t=localStorage.getItem(e);if(t!==null)try{let n=JSON.parse(t);return typeof n=="object"&&n!==null&&"nodeType"in n&&n.nodeType===1,n}catch{return t}}l(oe,"getStorage");function L(e,t=void 0){A(L.name),g.createInstance=L.name;let n="";t===void 0?n=e():n=e(t)}l(L,"createInstance");function z(e,t){A(z.name),g.rpc=z.name;let n={};for(let[o,i]of Object.entries(t))e[o]?n[o]=e[o].apply(null,i):(console.error(`Function ${o} not found!`),n[o]=null);return n}l(z,"rpc");function H(e,t=!1,n){A(H.name),g.gvec=H.name;let o=Object.keys(e),i=o[0],c=o[1],r=o[2];var a=e[i];a=a.name;var m=e[c];let f=e[c];var p=E(c)===null;if(p||t===!1){var h=""+c;g.dataMap.delete(h),L(m,e[r])}m=E(c);var s=E(i);if(s===null)throw new Error(` source id '${i} is not found in source component `);if(m===null)throw new Error(` target id '${c} is not found in target component `);if(s.replaceWith(m),n!==void 0)for(let b in f){let O=b.toString();if(typeof n=="object"){for(var u in n)if(O===u){var d=n[u];typeof d=="object"?f[b].apply(null,d):f[b].apply(null,[])}}else if(n.indexOf(",">-1)){let R=n.split(",");for(let T=0;T<R.length;T++)O===R[T]&&f[b].apply(null,[])}else O===n&&f[b].apply(null,[])}}l(H,"gvec");async function re(e,t={}){let{passRestriction:n=[]}=t,o=window.location.pathname.replace(/^\/|\/$/g,"").toLowerCase(),i=e.replace(/^\/|\/$/g,"").toLowerCase();if(!new RegExp("^"+i.replace(/:[^\/]+/g,"[^/]+")+"$").test(o))return!1;let r=Array.isArray(n)?n:[n];for(let a of r)try{let m=typeof a=="function"?a():a;if(m instanceof Promise){if(!await m)return!1}else if(!m)return!1}catch(m){return console.error("Route check failed:",m),!1}return!0}l(re,"Route");function ie(e){return e==null||e===""}l(ie,"IsEmpty");function se(e){window.history.pushState(e,e,e)}l(se,"Navigate");function J(e){y.maxCacheSize=e}l(J,"setMaxCacheSize");function G(e){y.cleanhtml=e}l(G,"cleanHtml");async function le(e,t){let n=t.replace(/\//g,"").toLowerCase(),o=Object.keys(e).find(i=>i.toLowerCase()===n);if(!o){let i=Object.keys(e).join(", ");throw new Error(`Unknown component: "${t}". Available components: ${i} To add this component: const loadAsyncComponents = { ...existingComponents, "${t}": () => import('./${t}.js') };`)}if(v.has(o))return v.get(o);try{let c=(await e[o]()).default;return v.set(o,c),c}catch(i){throw new Error(`Failed to load component "${o}": ${i.message}`)}}l(le,"loadFunc");function ce(e){if(e){let t=e.toLowerCase(),n=!1;for(let o of v.keys())o.toLowerCase()===t&&(v.delete(o),n=!0);return n}else return v.clear(),!0}l(ce,"clearComponentCache");function ae(e){var a,m;let n=window.location.pathname.split("/").filter(Boolean),o=n[0]||"home",i={},c=(m=(a=e[o])==null?void 0:a.urlParam)==null?void 0:m.split("/");return c&&c.length&&c.forEach((f,p)=>{f=f.replace(/[{}]/g,""),n[p+1]&&(i[f]=n[p+1])}),new URL(window.location.href).searchParams.forEach((f,p)=>{i[p]=f}),{componentName:o,params:i}}l(ae,"parsePath");function k(e){return new DOMParser().parseFromString(e,"text/html").body.firstChild}l(k,"parseHTML");async function fe(e,t,n=null,o=null){let i=e[t.toLowerCase()];if(i||(typeof e.fallback=="string"?i=e[e.fallback]:i=e.fallback),!i)return k("<h1>404 - Component not found</h1>");let{loader:c,guard:r,cacheExpiration:a=null,...m}=i;if(o===null&&typeof i.logic=="function"&&(o=i.logic),typeof r=="function"&&!await r(n))return k("<h1>403 - Forbidden</h1><p>You do not have access to this page.</p>");for(let f in m){let p=m[f];if(typeof p=="function")try{await p()}catch(h){console.error(h)}}try{let f=Date.now(),p=v.get(t);p&&a!==null&&f-p.cachedAt>a&&(v.delete(t),p=null);let h;if(p)h=p.component,v.set(t,{component:h,cachedAt:f});else{if(h=(await c()).default,v.size>=y.maxCacheSize){let u=v.keys().next().value;v.delete(u)}v.set(t,{component:h,cachedAt:f})}return typeof h!="function"?k("<h1>Invalid component</h1>"):typeof n=="object"&&!Array.isArray(n)?h(n):n?h(...n):h()}catch(f){return console.error(f),k("<h1>Error loading component</h1>")}}l(fe,"loadRunFunc");function F(e=""){var i,c;A(F.name),g.buildRoadMap=F.name;var t="";let n=(i=new Error().stack)==null?void 0:i.toString();navigator.userAgent.toLowerCase().indexOf("firefox")>0?n=n.split("@"):n=n.split(` `);for(let r=0;r<n.length;r++){var o="";if(navigator.userAgent.indexOf("Firefox")>0){let a=n[r].lastIndexOf(` `);if(a===-1)continue;o=n[r].slice(a+1),o===""?(a=n[r].lastIndexOf("/")+1,a>-1&&(o=n[r].substr(a),o=o.substr(0,o.indexOf(".")))):o.indexOf("/")>-1&&(o=o.substr(0,o.indexOf("/")))}else o=(c=n[r])==null?void 0:c.trim().split(" ")[1];if(!g.funcname.includes(o)&&!(o===void 0||o==="")&&!(o.indexOf("http://")>-1||o.indexOf("https://")>-1)){if(g.gvec!==void 0&&o.indexOf(g.gvec)>-1)break;t.indexOf("|"+o)>-1||(t+="|"+o.replace(".","|"))}}return e+t}l(F,"buildRoadMap");function A(e){!g.funcname.includes(e)&&g.funcname.push(e)}l(A,"setFuncName");function K(e){let t=e,n=new Set;function o(){return C&&n.add(C),t}l(o,"get");function i(c,r=!1){(r||t!==c)&&(t=c,n.forEach(a=>a()))}return l(i,"set"),[o,i]}l(K,"createSignal");function $(e){function t(){C=t,e(),C=null}l(t,"wrapped"),t()}l($,"createEffect");function V(e){e=e.toLowerCase(),x.innerHTMLElements.includes(e)||(x.innerHTMLElements.push(e),globalThis[e]=(...t)=>S(e,...t))}l(V,"createTypeElement");function U(e){e=e.toLowerCase(),x.innerHTMLElements.includes(e)||(x.innerHTMLElements.push(e),globalThis[e]=(...t)=>S(e,...t))}l(U,"createSigment");function ue(e){U(e)}l(ue,"addSigment");function de(e,...t){if(V(e),t.length!==0)return globalThis[e](...t)}l(de,"createElement");function B(e){let t=document.createTextNode("");return $(()=>{if(typeof w!="object"||w===null){t.textContent=e;return}let n=e.replace(/{{(.*?)}}/g,(o,i)=>{let c=i.trim();if(w.hasOwnProperty(c)){let r=w[c];if(r&&typeof r[0]=="function")return r[0]()??""}return""});t.textContent=n}),t}l(B,"interpolateReactiveText");function pe(e,t=5e3,n={}){let o=JSON.stringify([e,n,t]);if(!M.has(o)){let i=q(async()=>{let c=await fetch(e,n);if(!c.ok)throw new Error(`Fetch failed: ${c.status}`);return c.json()},t);M.set(o,i)}return M.get(o)()}l(pe,"fetchCache");function N(e){if(Array.isArray(e))return e.map(N);if(e&&typeof e=="object"){let t={};return Object.keys(e).sort().forEach(n=>{t[n]=N(e[n])}),t}return e}l(N,"sortObjectDeep");function _(e){if(e&&typeof e=="object"&&!Array.isArray(e)){let t={};return Object.keys(e).sort().forEach(n=>{t[n]=e[n]}),t}return e}l(_,"sortObjectShallow");function q(e,t=5e3,n={}){let o=new Map,i=l((...c)=>{let{deepSort:r}=n,a;r===!0?a=c.map(s=>s&&typeof s=="object"?N(s):s):r===!1?a=c.map(s=>s&&typeof s=="object"?_(s):s):a=c;let m=JSON.stringify(a),f=Date.now(),p=o.get(m);if(p&&f-p.timestamp<t)return p.value;let h=e(...c);return o.set(m,{value:h,timestamp:f}),h instanceof Promise&&h.catch(()=>o.delete(m)),h},"wrapped");return i.clear=()=>o.clear(),i}l(q,"memoizeFunc");function S(e,...t){let n={},o=[];A(S.name);var i="";i=F();var c=i.split("|");if(c.includes(g.rpc))return;t[0]&&typeof t[0]=="object"&&!Array.isArray(t[0])&&!(t[0]instanceof Node)?(n=t[0],o=t.slice(1)):o=t;let r=null,a=e.toLowerCase()==="fragment";a?r=document.createDocumentFragment():r=document.createElement(e);let m=I.has(e),f=D.has(e),p=e==="input"||e==="option",h=e==="option";if(!a)for(let s in n){let u=n[s];s.startsWith("on")&&typeof u=="function"?r.addEventListener(s.slice(2).toLowerCase(),u):typeof u=="function"&&s!=="children"?$(()=>{let d=u();d==null||d===!1?(r.removeAttribute(s),s==="value"&&f&&(r.value="",y.cleanhtml||r.removeAttribute("value")),s==="checked"&&p&&(r.checked=!1,y.cleanhtml||r.removeAttribute("checked")),s==="selected"&&h&&(r.selected=!1,y.cleanhtml||r.removeAttribute("selected")),s==="id"&&(r.iid="",y.cleanhtml||r.removeAttribute("id"))):s==="id"?(r.iid=d,y.cleanhtml?r.setAttribute("id",d):r.removeAttribute("id"),j(d,{name:d,caller:d+i,value:r})):s==="value"&&f?(r.value=d,y.cleanhtml?r.setAttribute("value",d):r.removeAttribute("value")):s==="checked"&&p?(r.checked=d,y.cleanhtml&&d?r.setAttribute("checked",""):r.removeAttribute("checked")):s==="selected"&&h?(r.selected=d,y.cleanhtml&&d?r.setAttribute("selected",""):r.removeAttribute("selected")):r.setAttribute(s,d)}):u!=null&&u!==!1&&(s==="id"?(r.iid=u,y.cleanhtml?r.setAttribute("id",u):r.removeAttribute("id"),j(u,{name:u,caller:u+i,value:r})):s==="value"&&f?(r.value=u,y.cleanhtml?r.setAttribute("value",u):r.removeAttribute("value")):s==="checked"&&p?(r.checked=u,y.cleanhtml?r.setAttribute("checked",""):r.removeAttribute("checked")):s==="selected"&&h?(r.selected=u,y.cleanhtml?r.setAttribute("selected",""):r.removeAttribute("selected")):r.setAttribute(s,u))}return m?o.length===1&&(typeof o[0]=="string"||typeof o[0]=="number")?f&&(r.value=o[0],y.cleanhtml?r.setAttribute("value",o[0]):r.removeAttribute("value")):o.length>0&&console.warn(`Void element <${e}> should not have children.`):o.flat().forEach(s=>{if(typeof s=="function"){let u=document.createTextNode("");r.appendChild(u),$(()=>{let d=s();if(d instanceof Node){let b=u.parentNode;if(!b)return;b.nodeType===Node.DOCUMENT_FRAGMENT_NODE?b.replaceChildren(d):b.replaceChild(d,u),u=d}else{let b=d==null?"":String(d);u.textContent!==b&&(u.textContent=b)}})}else if(typeof s=="string"&&s.includes("{{")&&!s.includes("function"))r.appendChild(B(s));else if(typeof s=="string"||typeof s=="number"){if(s.includes("function get(")||s.includes("function (")||s.includes("[native code]"))throw new Error("Detected reactive getter function used inside a template string. Use a function instead like: div(() => `Your text is: ${someState()}`)");r.appendChild(document.createTextNode(s))}else(s instanceof DocumentFragment||s instanceof Node)&&r.appendChild(s)}),r}l(S,"h");export{ie as IsEmpty,y as MyApp,se as Navigate,re as Route,ue as addSigment,ce as clearComponentCache,$ as createEffect,de as createElement,X as createGlobalSignal,U as createSigment,K as createSignal,pe as fetchCache,te as getCookie,Z as getGlobalSignal,oe as getStorage,E as getVirtualElementById,X as globalSignal,E as gve,H as gvec,S as h,le as loadFunc,fe as loadRunFunc,q as memoizeFunc,ae as parsePath,z as rpc,ee as setCookie,ne as setStorage,K as signal,Z as useGlobalSignal};