@devwareng/vanilla-ts 1.1.47 → 1.1.48

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/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var ee=Object.create;var y=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var re=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty;var se=(n,e)=>{for(var t in e)y(n,t,{get:e[t],enumerable:!0})},_=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ne(e))!oe.call(n,o)&&o!==t&&y(n,o,{get:()=>e[o],enumerable:!(r=te(e,o))||r.enumerable});return n};var f=(n,e,t)=>(t=n!=null?ee(re(n)):{},_(e||!n||!n.__esModule?y(t,"default",{value:n,enumerable:!0}):t,n)),ie=n=>_(y({},"__esModule",{value:!0}),n);var ue={};se(ue,{TSRouter:()=>P,html:()=>x,useAnchor:()=>q,useAnchorSingle:()=>k,useInitialDOM:()=>O,useTSAuth:()=>I,useTSComponent:()=>L,useTSElementEach:()=>F,useTSElements:()=>D,useTSEvent:()=>A,useTSEventAll:()=>H,useTSExtractParams:()=>b,useTSMetaData:()=>N,useTSNavigate:()=>U,useTSParams:()=>T,useTSPurifier:()=>R,useTSSelect:()=>$});module.exports=ie(ue);function x(n,...e){return n.reduce((t,r,o)=>t+r+(e[o]||""),"")}var w=f(require("dompurify"),1),R=(n,e)=>{let r={...{ADD_TAGS:["my-custom-tag"]},...e};return typeof n=="string"?w.default.sanitize(n,r):w.default.sanitize(n.innerHTML,r)};var A=(n,e,t)=>{let r=document.querySelector(`#${n}`);r?r.addEventListener(e,t):console.warn(`Element with id '${n}' not found.`)};var j=require("zustand/vanilla"),C=f(require("dompurify"),1);function ae(n,e){let t=[],r=n.replace(/:[^/]+/g,i=>(t.push(i.slice(1)),"([^/]+)")),o=new RegExp(`^${r}$`),s=e.match(o),a={};return s&&t.forEach((i,u)=>{a[i]=C.default.sanitize(s[u+1]??"")}),a}function ce(n){let e={},t=new URLSearchParams(n);for(let[r,o]of t.entries())e[r]=C.default.sanitize(o);return e}var T=(0,j.createStore)((n,e)=>({params:{},query:{},setFromPattern:t=>{let r=window.location.pathname,o=ae(t,r),s=ce(window.location.search);n({params:o,query:s})},getParam:t=>e().params[t],getQuery:t=>e().query[t]}));function b(n){let e=T.getState();e.setFromPattern(n);let t=e.params,r=e.query;return{...t,...r}}var H=(n,e,t)=>{let r=document.querySelectorAll(n);return r.forEach(o=>{o.addEventListener(e,t)}),()=>{r.forEach(o=>{o.removeEventListener(e,t)})}};var B=f(require("dompurify"),1),D=(n,e,t)=>{let r={ALLOWED_TAGS:["main","div","h1","p","button","span","a","img","input"],ALLOWED_ATTR:["class","id","href","style","src","alt"],...t},o=B.default.sanitize(e,r);if(n.innerHTML!==String(o))return n.innerHTML=String(o)};var G=f(require("dompurify"),1),v=null,O=(n,e)=>{if(typeof document>"u")return;let t=document.getElementById(n);if(!t)return;let r=t.innerHTML,o=G.default.sanitize(r);if(v!==null&&o!==v){let s=document.createElement("div");e(s),t.innerHTML=v}else v=o,e(t)};var z=n=>{let e=document.createElement("div");return e.innerText=n,e.innerHTML},k=(n,e,t,r="",o=null)=>{if(!n)return;let s=z(e),a=z(t),i=r?z(r):void 0;n.setAttribute("href",s),n.setAttribute("aria-label",a),i&&(n.className=i),o&&(n.innerHTML="",n.appendChild(o)),n.addEventListener("click",u=>{u.preventDefault();let m=u.currentTarget.getAttribute("href");if(m){let c=window.scrollY;window.scrollTo(0,0),window.history.pushState({scrollPosition:c},"",m);let g=new PopStateEvent("popstate");dispatchEvent(g)}}),window.addEventListener("popstate",u=>{let l=u.state;l&&l.scrollPosition!==void 0&&window.scrollTo(0,l.scrollPosition)})};var W=require("lodash-es"),M=n=>n;typeof window<"u"&&typeof document<"u"&&(M=n=>{let e=document.createElement("div");return e.innerText=n,e.innerHTML});var q=typeof window<"u"?(0,W.debounce)(n=>{n.forEach(e=>{if(!e)return;let t=e.getAttribute("href")||"#",r=e.getAttribute("class")||"",o=M(t),s=e.getAttribute("class")?M(e.getAttribute("class")):r;e.setAttribute("href",o),e.setAttribute("class",s),e.getAttribute("aria-label")&&e.setAttribute("aria-label",M(e.getAttribute("aria-label")));let a=e.querySelector(":scope > *");a&&(e.innerHTML="",e.appendChild(a)),e.addEventListener("click",i=>{let l=i.currentTarget.getAttribute("href");try{if(new URL(l,window.location.href).origin!==window.location.origin)return}catch(c){console.error("Invalid URL:",c);return}i.preventDefault(),window.history.pushState({},"",l);let m=new PopStateEvent("popstate");window.dispatchEvent(m)})})}):()=>{};var h=f(require("dompurify"),1);var Y=(n="'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'",e="'self' 'nonce-rAnd0m123'",t="'none'",r="'self' https://fonts.googleapis.com https://fonts.gstatic.com",o="'self' https://blogger.googleusercontent.com",s=["'self'","https://fonts.googleapis.com","https://fonts.gstatic.com","https://www.google.com/maps/"],a="'self' https://www.youtube.com",i="'self'",u="/csp-report",l=!1)=>{let m=()=>{try{let c=document.querySelector('meta[http-equiv="Content-Security-Policy"]');c||(c=document.createElement("meta"),c.setAttribute("http-equiv","Content-Security-Policy"),document.head.appendChild(c));let g=l?`report-uri ${u};`:"";c.setAttribute("content",`default-src 'self'; script-src ${n}; style-src ${e}; object-src ${t}; font-src ${r}; img-src ${o}; connect-src ${s.join(" ")}; frame-src ${a}; base-uri ${i}; ${g}`)}catch(c){console.error("Error adding CSP meta element:",c)}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",m):m()};var N=(n,e)=>{let t={name:h.default.sanitize(n.name||""),description:h.default.sanitize(n.description||"Default description"),author:h.default.sanitize(n.author||"")},r=d=>{t.name=h.default.sanitize(d),c("name",t.name)},o=d=>{t.description=h.default.sanitize(d),c("description",t.description)},s=d=>{t.author=h.default.sanitize(d),c("author",t.author)},a=()=>t.name,i=()=>t.description,u=()=>t.author,l=()=>t,m=(d,E)=>{let S=document.createElement("meta");S.setAttribute("name",d),S.setAttribute("content",E),document.head.appendChild(S)},c=(d,E)=>{let S=document.querySelector(`meta[name="${d}"]`);S?S.setAttribute("content",E):m(d,E)},g=()=>{c("name",t.name),c("description",t.description),c("author",t.author)};return e&&Y(e.scriptSrc,e.styleSrc,e.objectSrc,Array.isArray(e.connectSrc)?e.connectSrc.join(" "):e.connectSrc,e.reportOnly!==void 0?String(e.reportOnly):void 0),g(),{setName:r,setDescription:o,setAuthor:s,getName:a,getDescription:i,getAuthor:u,getAllMetaData:l,appendMetaTagsToHead:g}};var J=f(require("dompurify"),1),L=(n,e,t,r,o)=>{J.default.sanitize(e),t(e.querySelector(`#${n}`),r,o)};var $=n=>{let e=document.querySelector(n);return e||(console.warn(`[useTSSelect] No element found for selector: '${n}'`),null)};var K=require("jwt-decode"),I=(n,e)=>{let t=localStorage.getItem("token");if(!t)return window.location.href=e,null;try{let r=(0,K.jwtDecode)(t),o=Date.now()/1e3;return r.exp&&r.exp<o&&(console.error("Token has expired"),window.localStorage.removeItem("token"),window.location.href=e),null}catch(r){return console.error("Invalid token:",r),window.location.href=e,null}};var F=(n,e,t)=>{n.forEach(r=>{e.forEach(o=>{r.addEventListener(o,s=>{t(r,s)})})})};var U=()=>({back:()=>window.history.back(),forward:()=>window.history.forward()});var Q=f(require("dompurify"),1);var X=require("zustand/vanilla"),Z=f(require("dompurify"),1),p=(0,X.createStore)(n=>({params:{},query:{},setParams:e=>n(()=>({params:V(e)})),setQuery:e=>n(()=>({query:V(e)}))}));function V(n){let e={};for(let t in n)e[t]=Z.default.sanitize(n[t]);return e}var P=class{constructor(e,t){this.routes=[];this.routes=e,this.expectedParams=new Set(t),window.addEventListener("popstate",this.handlePopState.bind(this)),this.handlePopState()}handlePopState(){let e=window.location.pathname,t=window.location.search,r=this.parseQueryParams(t),o=this.findMatchingRoute(e,this.routes);if(o){if(o.routeto){this.navigate(o.routeto);return}let s=this.filterAndSanitizeParams(o.params);p.getState().setParams(s),p.getState().setQuery(r);let a=document.createElement("div");if(o.element?.(a,s,r),o.children){let i=e.slice(o.path.length),u=a.querySelector("#child");u&&this.renderChildren(o.children,i,u,s,r)}}else{let s=this.findMatchingRoute("*",this.routes);if(s){let a=this.filterAndSanitizeParams(s.params);p.getState().setParams(a),p.getState().setQuery(r);let i=document.createElement("div");s.element?.(i,a,r)}}}renderChildren(e,t,r,o,s){if(!e||e.length===0){let i=r.querySelector("#child");i&&i.remove();return}let a=this.findMatchingRoute(t,e);if(a){let i=document.createElement("div");i.id="child";let u={...o,...a.params},l=this.filterAndSanitizeParams(u);if(p.getState().setParams(l),p.getState().setQuery(s),a.element?.(i,l,s),r.appendChild(i),a.children){let m=t.slice(a.path.length);this.renderChildren(a.children,m,i,l,s)}}}parseQueryParams(e){let t={},r=new URLSearchParams(e);for(let[o,s]of r.entries())this.expectedParams.has(o)&&(t[o]=Q.default.sanitize(s));return t}findMatchingRoute(e,t,r={}){for(let o of t){let s=o.path;if(s==="*")return o;{let i=[],u=s.replace(/:[^\s/]+/g,c=>(i.push(c.substring(1)),"([^\\s/]+)")),l=new RegExp(`^${u}(?:/|$)`),m=e.match(l);if(m){let c={...r};if(i.forEach((g,d)=>{c[g]=m[d+1]??""}),o.children){let g=e.slice(m[0].length),d=this.findMatchingRoute(g,o.children,c);if(d)return d}return{...o,params:c}}}}}filterAndSanitizeParams(e){if(!e)return{};let t={};for(let r in e)this.expectedParams.has(r)&&(t[r]=Q.default.sanitize(e[r]??""));return t}navigate(e){history.pushState(null,"",e),this.handlePopState()}addRoute(e){this.routes.push(e)}};0&&(module.exports={TSRouter,html,useAnchor,useAnchorSingle,useInitialDOM,useTSAuth,useTSComponent,useTSElementEach,useTSElements,useTSEvent,useTSEventAll,useTSExtractParams,useTSMetaData,useTSNavigate,useTSParams,useTSPurifier,useTSSelect});
1
+ "use strict";var te=Object.create;var y=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var oe=Object.getPrototypeOf,se=Object.prototype.hasOwnProperty;var ie=(n,e)=>{for(var t in e)y(n,t,{get:e[t],enumerable:!0})},j=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of re(e))!se.call(n,o)&&o!==t&&y(n,o,{get:()=>e[o],enumerable:!(r=ne(e,o))||r.enumerable});return n};var f=(n,e,t)=>(t=n!=null?te(oe(n)):{},j(e||!n||!n.__esModule?y(t,"default",{value:n,enumerable:!0}):t,n)),ae=n=>j(y({},"__esModule",{value:!0}),n);var le={};ie(le,{TSRouter:()=>P,html:()=>x,useAnchor:()=>q,useAnchorSingle:()=>k,useInitialDOM:()=>O,useTSAuth:()=>I,useTSComponent:()=>L,useTSElementEach:()=>F,useTSElements:()=>D,useTSEvent:()=>A,useTSEventAll:()=>b,useTSExtractParams:()=>H,useTSMetaData:()=>N,useTSNavigate:()=>U,useTSOutlet:()=>Q,useTSParams:()=>T,useTSPurifier:()=>R,useTSSelect:()=>$});module.exports=ae(le);function x(n,...e){return n.reduce((t,r,o)=>t+r+(e[o]||""),"")}var w=f(require("dompurify"),1),R=(n,e)=>{let r={...{ADD_TAGS:["my-custom-tag"]},...e};return typeof n=="string"?w.default.sanitize(n,r):w.default.sanitize(n.innerHTML,r)};var A=(n,e,t)=>{let r=document.querySelector(`#${n}`);r?r.addEventListener(e,t):console.warn(`Element with id '${n}' not found.`)};var B=require("zustand/vanilla"),C=f(require("dompurify"),1);function ce(n,e){let t=[],r=n.replace(/:[^/]+/g,i=>(t.push(i.slice(1)),"([^/]+)")),o=new RegExp(`^${r}$`),s=e.match(o),a={};return s&&t.forEach((i,u)=>{a[i]=C.default.sanitize(s[u+1]??"")}),a}function ue(n){let e={},t=new URLSearchParams(n);for(let[r,o]of t.entries())e[r]=C.default.sanitize(o);return e}var T=(0,B.createStore)((n,e)=>({params:{},query:{},setFromPattern:t=>{let r=window.location.pathname,o=ce(t,r),s=ue(window.location.search);n({params:o,query:s})},getParam:t=>e().params[t],getQuery:t=>e().query[t]}));function H(n){let e=T.getState();e.setFromPattern(n);let t=e.params,r=e.query;return{...t,...r}}var b=(n,e,t)=>{let r=document.querySelectorAll(n);return r.forEach(o=>{o.addEventListener(e,t)}),()=>{r.forEach(o=>{o.removeEventListener(e,t)})}};var G=f(require("dompurify"),1),D=(n,e,t)=>{let r={ALLOWED_TAGS:["main","div","h1","p","button","span","a","img","input"],ALLOWED_ATTR:["class","id","href","style","src","alt"],...t},o=G.default.sanitize(e,r);if(n.innerHTML!==String(o))return n.innerHTML=String(o)};var W=f(require("dompurify"),1),v=null,O=(n,e)=>{if(typeof document>"u")return;let t=document.getElementById(n);if(!t)return;let r=t.innerHTML,o=W.default.sanitize(r);if(v!==null&&o!==v){let s=document.createElement("div");e(s),t.innerHTML=v}else v=o,e(t)};var z=n=>{let e=document.createElement("div");return e.innerText=n,e.innerHTML},k=(n,e,t,r="",o=null)=>{if(!n)return;let s=z(e),a=z(t),i=r?z(r):void 0;n.setAttribute("href",s),n.setAttribute("aria-label",a),i&&(n.className=i),o&&(n.innerHTML="",n.appendChild(o)),n.addEventListener("click",u=>{u.preventDefault();let m=u.currentTarget.getAttribute("href");if(m){let c=window.scrollY;window.scrollTo(0,0),window.history.pushState({scrollPosition:c},"",m);let g=new PopStateEvent("popstate");dispatchEvent(g)}}),window.addEventListener("popstate",u=>{let l=u.state;l&&l.scrollPosition!==void 0&&window.scrollTo(0,l.scrollPosition)})};var Y=require("lodash-es"),M=n=>n;typeof window<"u"&&typeof document<"u"&&(M=n=>{let e=document.createElement("div");return e.innerText=n,e.innerHTML});var q=typeof window<"u"?(0,Y.debounce)(n=>{n.forEach(e=>{if(!e)return;let t=e.getAttribute("href")||"#",r=e.getAttribute("class")||"",o=M(t),s=e.getAttribute("class")?M(e.getAttribute("class")):r;e.setAttribute("href",o),e.setAttribute("class",s),e.getAttribute("aria-label")&&e.setAttribute("aria-label",M(e.getAttribute("aria-label")));let a=e.querySelector(":scope > *");a&&(e.innerHTML="",e.appendChild(a)),e.addEventListener("click",i=>{let l=i.currentTarget.getAttribute("href");try{if(new URL(l,window.location.href).origin!==window.location.origin)return}catch(c){console.error("Invalid URL:",c);return}i.preventDefault(),window.history.pushState({},"",l);let m=new PopStateEvent("popstate");window.dispatchEvent(m)})})}):()=>{};var h=f(require("dompurify"),1);var J=(n="'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'",e="'self' 'nonce-rAnd0m123'",t="'none'",r="'self' https://fonts.googleapis.com https://fonts.gstatic.com",o="'self' https://blogger.googleusercontent.com",s=["'self'","https://fonts.googleapis.com","https://fonts.gstatic.com","https://www.google.com/maps/"],a="'self' https://www.youtube.com",i="'self'",u="/csp-report",l=!1)=>{let m=()=>{try{let c=document.querySelector('meta[http-equiv="Content-Security-Policy"]');c||(c=document.createElement("meta"),c.setAttribute("http-equiv","Content-Security-Policy"),document.head.appendChild(c));let g=l?`report-uri ${u};`:"";c.setAttribute("content",`default-src 'self'; script-src ${n}; style-src ${e}; object-src ${t}; font-src ${r}; img-src ${o}; connect-src ${s.join(" ")}; frame-src ${a}; base-uri ${i}; ${g}`)}catch(c){console.error("Error adding CSP meta element:",c)}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",m):m()};var N=(n,e)=>{let t={name:h.default.sanitize(n.name||""),description:h.default.sanitize(n.description||"Default description"),author:h.default.sanitize(n.author||"")},r=d=>{t.name=h.default.sanitize(d),c("name",t.name)},o=d=>{t.description=h.default.sanitize(d),c("description",t.description)},s=d=>{t.author=h.default.sanitize(d),c("author",t.author)},a=()=>t.name,i=()=>t.description,u=()=>t.author,l=()=>t,m=(d,E)=>{let S=document.createElement("meta");S.setAttribute("name",d),S.setAttribute("content",E),document.head.appendChild(S)},c=(d,E)=>{let S=document.querySelector(`meta[name="${d}"]`);S?S.setAttribute("content",E):m(d,E)},g=()=>{c("name",t.name),c("description",t.description),c("author",t.author)};return e&&J(e.scriptSrc,e.styleSrc,e.objectSrc,Array.isArray(e.connectSrc)?e.connectSrc.join(" "):e.connectSrc,e.reportOnly!==void 0?String(e.reportOnly):void 0),g(),{setName:r,setDescription:o,setAuthor:s,getName:a,getDescription:i,getAuthor:u,getAllMetaData:l,appendMetaTagsToHead:g}};var K=f(require("dompurify"),1),L=(n,e,t,r,o)=>{K.default.sanitize(e),t(e.querySelector(`#${n}`),r,o)};var $=n=>{let e=document.querySelector(n);return e||(console.warn(`[useTSSelect] No element found for selector: '${n}'`),null)};var V=require("jwt-decode"),I=(n,e)=>{let t=localStorage.getItem("token");if(!t)return window.location.href=e,null;try{let r=(0,V.jwtDecode)(t),o=Date.now()/1e3;return r.exp&&r.exp<o&&(console.error("Token has expired"),window.localStorage.removeItem("token"),window.location.href=e),null}catch(r){return console.error("Invalid token:",r),window.location.href=e,null}};var F=(n,e,t)=>{n.forEach(r=>{e.forEach(o=>{r.addEventListener(o,s=>{t(r,s)})})})};var U=()=>({back:()=>window.history.back(),forward:()=>window.history.forward()});var Q=(n,e)=>{let t=document.querySelector(n);t&&e(t)};var _=f(require("dompurify"),1);var Z=require("zustand/vanilla"),ee=f(require("dompurify"),1),p=(0,Z.createStore)(n=>({params:{},query:{},setParams:e=>n(()=>({params:X(e)})),setQuery:e=>n(()=>({query:X(e)}))}));function X(n){let e={};for(let t in n)e[t]=ee.default.sanitize(n[t]);return e}var P=class{constructor(e,t){this.routes=[];this.routes=e,this.expectedParams=new Set(t),window.addEventListener("popstate",this.handlePopState.bind(this)),this.handlePopState()}handlePopState(){let e=window.location.pathname,t=window.location.search,r=this.parseQueryParams(t),o=this.findMatchingRoute(e,this.routes);if(o){if(o.routeto){this.navigate(o.routeto);return}let s=this.filterAndSanitizeParams(o.params);p.getState().setParams(s),p.getState().setQuery(r);let a=document.createElement("div");if(o.element?.(a,s,r),o.children){let i=e.slice(o.path.length),u=a.querySelector("#child");u&&this.renderChildren(o.children,i,u,s,r)}}else{let s=this.findMatchingRoute("*",this.routes);if(s){let a=this.filterAndSanitizeParams(s.params);p.getState().setParams(a),p.getState().setQuery(r);let i=document.createElement("div");s.element?.(i,a,r)}}}renderChildren(e,t,r,o,s){if(!e||e.length===0){let i=r.querySelector("#child");i&&i.remove();return}let a=this.findMatchingRoute(t,e);if(a){let i=document.createElement("div");i.id="child";let u={...o,...a.params},l=this.filterAndSanitizeParams(u);if(p.getState().setParams(l),p.getState().setQuery(s),a.element?.(i,l,s),r.appendChild(i),a.children){let m=t.slice(a.path.length);this.renderChildren(a.children,m,i,l,s)}}}parseQueryParams(e){let t={},r=new URLSearchParams(e);for(let[o,s]of r.entries())this.expectedParams.has(o)&&(t[o]=_.default.sanitize(s));return t}findMatchingRoute(e,t,r={}){for(let o of t){let s=o.path;if(s==="*")return o;{let i=[],u=s.replace(/:[^\s/]+/g,c=>(i.push(c.substring(1)),"([^\\s/]+)")),l=new RegExp(`^${u}(?:/|$)`),m=e.match(l);if(m){let c={...r};if(i.forEach((g,d)=>{c[g]=m[d+1]??""}),o.children){let g=e.slice(m[0].length),d=this.findMatchingRoute(g,o.children,c);if(d)return d}return{...o,params:c}}}}}filterAndSanitizeParams(e){if(!e)return{};let t={};for(let r in e)this.expectedParams.has(r)&&(t[r]=_.default.sanitize(e[r]??""));return t}navigate(e){history.pushState(null,"",e),this.handlePopState()}addRoute(e){this.routes.push(e)}};0&&(module.exports={TSRouter,html,useAnchor,useAnchorSingle,useInitialDOM,useTSAuth,useTSComponent,useTSElementEach,useTSElements,useTSEvent,useTSEventAll,useTSExtractParams,useTSMetaData,useTSNavigate,useTSOutlet,useTSParams,useTSPurifier,useTSSelect});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.mts","../src/define/html.ts","../src/hooks/useTSPurifier.ts","../src/hooks/useTSEvent.ts","../src/hooks/useTSParams.ts","../src/hooks/useTSExtract.ts","../src/hooks/useTSAllElements.ts","../src/hooks/useTSElements.ts","../src/hooks/useIntialDOM.ts","../src/hooks/useTSAnchorSingle.ts","../src/hooks/useTSAnchor.ts","../src/hooks/useTSMetaData.ts","../src/hooks/useTSCSP.ts","../src/hooks/useTSComponent.ts","../src/hooks/useTSSelect.ts","../src/hooks/useTSAuth.ts","../src/hooks/useTSForEach.ts","../src/hooks/useTSNavigate.ts","../src/routes/class/Router.class.ts","../src/store/useTSParam.store.ts"],"sourcesContent":["export { html } from './src/define';\r\nexport { useTSNavigate, useTSMetaData, useTSSelect, useTSComponent, useTSAuth, useTSElementEach, useInitialDOM, useAnchor, useAnchorSingle, useTSPurifier, useTSEvent, useTSExtractParams, useTSParams, useTSEventAll, useTSElements } from \"./src/hooks\"\r\nexport { TSRouter } from \"./src/routes/class/Router.class\";","export function html(strings: TemplateStringsArray, ...values: any[]): string {\r\n return strings.reduce((result, str, i) => {\r\n return result + str + (values[i] || '');\r\n }, '');\r\n}","import DOMPurify from \"dompurify\";\r\nimport type { Config } from \"dompurify\";\r\n\r\ntype TSPurifier = (input: string | HTMLElement, config?: Config) => string;\r\n\r\nexport const useTSPurifier: TSPurifier = (\r\n input,\r\n config?\r\n) => {\r\n const defaultConfig: Config = {\r\n ADD_TAGS: [\"my-custom-tag\"],\r\n };\r\n\r\n const mergedConfig: Config = { ...defaultConfig, ...config };\r\n\r\n if (typeof input === \"string\") {\r\n return DOMPurify.sanitize(input, mergedConfig);\r\n } else {\r\n return DOMPurify.sanitize(input.innerHTML, mergedConfig);\r\n }\r\n};\r\n","\r\ntype TSEvent = (\r\n id: string,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: HTMLElementEventMap[keyof HTMLElementEventMap]) => void\r\n) => void;\r\n\r\nexport const useTSEvent: TSEvent = (\r\n id,\r\n eventType,\r\n handler\r\n) => {\r\n const element = document.querySelector(`#${id}`);\r\n if (element) {\r\n element.addEventListener(\r\n eventType,\r\n handler as EventListenerOrEventListenerObject\r\n );\r\n } else {\r\n console.warn(`Element with id '${id}' not found.`);\r\n }\r\n};\r\n","// utils/hooks/useTSParams.ts\r\nimport { createStore } from 'zustand/vanilla';\r\nimport DOMPurify from 'dompurify';\r\n\r\ntype ParamStore = {\r\n params: Record<string, string>;\r\n query: Record<string, string>;\r\n setFromPattern: (pattern: MustURL) => void;\r\n getParam: (key: string) => string | undefined;\r\n getQuery: (key: string) => string | undefined;\r\n};\r\n\r\ntype MustURL = `/${string}`;\r\n\r\nfunction extractPatternParams(pattern: MustURL, path: string): Record<string, string> {\r\n const paramNames: string[] = [];\r\n const regexPattern = pattern.replace(/:[^/]+/g, (match) => {\r\n paramNames.push(match.slice(1));\r\n return '([^/]+)';\r\n });\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n const match = path.match(regex);\r\n const result: Record<string, string> = {};\r\n\r\n if (match) {\r\n paramNames.forEach((name, i) => {\r\n result[name] = DOMPurify.sanitize(match[i + 1] ?? '');\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction extractQueryParams(search: MustURL): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n const urlSearchParams = new URLSearchParams(search);\r\n\r\n for (const [key, value] of urlSearchParams.entries()) {\r\n result[key] = DOMPurify.sanitize(value);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport const useTSParams = createStore<ParamStore>((set, get) => ({\r\n params: {},\r\n query: {},\r\n setFromPattern: (pattern: MustURL) => {\r\n const path = window.location.pathname;\r\n const params = extractPatternParams(pattern, path);\r\n const query = extractQueryParams(window.location.search as MustURL);\r\n set({ params, query });\r\n },\r\n getParam: (key: string) => get().params[key],\r\n getQuery: (key: string) => get().query[key],\r\n}));\r\n","import { useTSParams } from './useTSParams';\r\n\r\ntype MustURL = `/${string}`;\r\n\r\nexport function useTSExtractParams(pattern: MustURL) {\r\n const store = useTSParams.getState();\r\n\r\n // Populate internal param/query store\r\n store.setFromPattern(pattern);\r\n\r\n const params = store.params;\r\n const query = store.query;\r\n\r\n return { ...params, ...query };\r\n}\r\n","export const useTSEventAll = <T extends Event>(\r\n selector: string,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: T) => void\r\n) => {\r\n const elements = document.querySelectorAll(selector);\r\n elements.forEach(element => {\r\n element.addEventListener(eventType, handler as EventListener);\r\n });\r\n\r\n return () => {\r\n elements.forEach(element => {\r\n element.removeEventListener(eventType, handler as EventListener);\r\n });\r\n };\r\n};\r\n\r\nexport const useTSEventSelectAll = <T extends Event>(\r\n selectors: string[],\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: T) => void\r\n) => {\r\n const elements: NodeListOf<HTMLElement>[] = [];\r\n\r\n selectors.forEach(selector => {\r\n const selectedElements = document.querySelectorAll(\r\n selector\r\n ) as NodeListOf<HTMLElement>;\r\n selectedElements.forEach(element => {\r\n element.addEventListener(eventType, handler as EventListener);\r\n });\r\n elements.push(selectedElements);\r\n });\r\n\r\n return () => {\r\n elements.forEach(nodeList => {\r\n nodeList.forEach(element => {\r\n element.removeEventListener(eventType, handler as EventListener);\r\n });\r\n });\r\n };\r\n};\r\n","import DOMPurify, { Config } from \"dompurify\";\r\n\r\ntype TSElements = (\r\n htmlElement: HTMLElement,\r\n element: string,\r\n config?: Config\r\n) => void;\r\n\r\nexport const useTSElements: TSElements = (\r\n htmlElement,\r\n element,\r\n config\r\n) => {\r\n const defaultConfig: Config = {\r\n ALLOWED_TAGS: ['main', 'div', 'h1', 'p', 'button', 'span', 'a', 'img', 'input'],\r\n ALLOWED_ATTR: ['class', 'id', 'href', 'style', 'src', 'alt'],\r\n ...config, // allow user overrides\r\n };\r\n const sanitizedContent = DOMPurify.sanitize(/*html*/ element, defaultConfig!); // Pass options if provided\r\n\r\n if (htmlElement.innerHTML !== String(sanitizedContent)) {\r\n return (htmlElement.innerHTML = String(sanitizedContent));\r\n }\r\n};\r\n","import DOMPurify from \"dompurify\"\r\n\r\nlet previousHTML: string | null = null\r\n\r\ntype TSInitialDOM = (id: string, mount: (el: HTMLElement) => void) => void;\r\n\r\nexport const useInitialDOM: TSInitialDOM = (id, mount) => {\r\n // SSR guard\r\n if (typeof document === \"undefined\") return\r\n\r\n const targetElement = document.getElementById(id)\r\n if (!targetElement) return\r\n\r\n const currentHTML = targetElement.innerHTML\r\n const sanitizedHTML = DOMPurify.sanitize(currentHTML)\r\n\r\n if (previousHTML !== null && sanitizedHTML !== previousHTML) {\r\n // DOM changed externally — reset and remount in a temp container\r\n const fallbackEl = document.createElement(\"div\")\r\n mount(fallbackEl)\r\n targetElement.innerHTML = previousHTML\r\n } else {\r\n // First time or same sanitized DOM — mount to target\r\n previousHTML = sanitizedHTML\r\n mount(targetElement)\r\n }\r\n}\r\n","\r\ntype SanitizeInput = (input: string) => string;\r\n\r\ntype AnchorSingle = (\r\n element: HTMLElement,\r\n href: string,\r\n ariaLabel: string,\r\n className?: string,\r\n childElement?: HTMLElement | null\r\n) => void;\r\n\r\nconst sanitizeInput: SanitizeInput = (input) => {\r\n const element = document.createElement(\"div\");\r\n element.innerText = input;\r\n return element.innerHTML;\r\n};\r\n\r\nexport const useAnchorSingle: AnchorSingle = (\r\n element,\r\n href,\r\n ariaLabel,\r\n className = \"\",\r\n childElement = null\r\n) => {\r\n if (!element) return;\r\n\r\n const sanitizedHref = sanitizeInput(href);\r\n const sanitizedAriaLabel = sanitizeInput(ariaLabel);\r\n const sanitizedClassName = className ? sanitizeInput(className) : undefined;\r\n\r\n element.setAttribute(\"href\", sanitizedHref);\r\n element.setAttribute(\"aria-label\", sanitizedAriaLabel);\r\n\r\n if (sanitizedClassName) {\r\n element.className = sanitizedClassName;\r\n }\r\n\r\n if (childElement) {\r\n element.innerHTML = \"\";\r\n element.appendChild(childElement);\r\n }\r\n\r\n element.addEventListener(\"click\", e => {\r\n e.preventDefault();\r\n const target = e.currentTarget as HTMLAnchorElement;\r\n const href = target.getAttribute(\"href\");\r\n if (href) {\r\n const scrollPosition = window.scrollY;\r\n window.scrollTo(0, 0);\r\n window.history.pushState({ scrollPosition }, \"\", href);\r\n const navEvent = new PopStateEvent(\"popstate\");\r\n dispatchEvent(navEvent);\r\n }\r\n });\r\n\r\n window.addEventListener(\"popstate\", e => {\r\n const state = e.state as { scrollPosition?: number };\r\n if (state && state.scrollPosition !== undefined) {\r\n window.scrollTo(0, state.scrollPosition);\r\n }\r\n });\r\n};\r\n","import { debounce } from 'lodash-es';\r\n\r\nlet sanitizeInput = (input: string): string => input; // fallback for SSR\r\n\r\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n sanitizeInput = (input: string): string => {\r\n const element = document.createElement(\"div\");\r\n element.innerText = input;\r\n return element.innerHTML;\r\n };\r\n}\r\n\r\nexport const useAnchor = typeof window !== 'undefined'\r\n ? debounce((anchors: NodeListOf<HTMLAnchorElement>) => {\r\n anchors.forEach(anchor => {\r\n if (!anchor) return;\r\n\r\n const originalHref = anchor.getAttribute(\"href\") || \"#\";\r\n const originalClassName = anchor.getAttribute(\"class\") || \"\";\r\n\r\n const sanitizedHref = sanitizeInput(originalHref);\r\n const sanitizedClassName = anchor.getAttribute(\"class\")\r\n ? sanitizeInput(anchor.getAttribute(\"class\")!)\r\n : originalClassName;\r\n\r\n anchor.setAttribute(\"href\", sanitizedHref);\r\n anchor.setAttribute(\"class\", sanitizedClassName);\r\n\r\n if (anchor.getAttribute(\"aria-label\")) {\r\n anchor.setAttribute(\r\n \"aria-label\",\r\n sanitizeInput(anchor.getAttribute(\"aria-label\")!)\r\n );\r\n }\r\n\r\n const childElement = anchor.querySelector(\":scope > *\") as HTMLElement;\r\n if (childElement) {\r\n anchor.innerHTML = \"\";\r\n anchor.appendChild(childElement);\r\n }\r\n\r\n anchor.addEventListener(\"click\", e => {\r\n const target = e.currentTarget as HTMLAnchorElement;\r\n const href = target.getAttribute(\"href\");\r\n\r\n try {\r\n const url = new URL(href!, window.location.href);\r\n if (url.origin !== window.location.origin) return;\r\n } catch (error) {\r\n console.error(\"Invalid URL:\", error);\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n window.history.pushState({}, \"\", href);\r\n const navEvent = new PopStateEvent(\"popstate\");\r\n window.dispatchEvent(navEvent);\r\n });\r\n });\r\n })\r\n : () => { }; // SSR-safe no-op\r\n","import DOMPurify from \"dompurify\";\r\nimport { useTSCSP } from \"./useTSCSP\";\r\n\r\ntype SEOConfig = {\r\n name?: string;\r\n description?: string;\r\n author?: string;\r\n}\r\n\r\ntype CSPConfig = {\r\n scriptSrc?: string;\r\n styleSrc?: string;\r\n objectSrc?: string;\r\n connectSrc?: string[];\r\n reportOnly?: boolean;\r\n}\r\n\r\ntype SEOHandler = {\r\n setName: (name: string) => void;\r\n setDescription: (description: string) => void;\r\n setAuthor: (author: string) => void;\r\n getName: () => string;\r\n getDescription: () => string;\r\n getAuthor: () => string;\r\n getAllMetaData: () => SEOConfig;\r\n appendMetaTagsToHead: () => void;\r\n}\r\n\r\nexport const useTSMetaData = (\r\n config: SEOConfig,\r\n cspConfig?: CSPConfig\r\n): SEOHandler => {\r\n let metaData: SEOConfig = {\r\n name: DOMPurify.sanitize(config.name || \"\"),\r\n description: DOMPurify.sanitize(\r\n config.description || \"Default description\"\r\n ),\r\n author: DOMPurify.sanitize(config.author || \"\"),\r\n };\r\n\r\n const setName = (name: string): void => {\r\n metaData.name = DOMPurify.sanitize(name);\r\n updateMetaTag(\"name\", metaData.name);\r\n };\r\n\r\n const setDescription = (description: string): void => {\r\n metaData.description = DOMPurify.sanitize(description);\r\n updateMetaTag(\"description\", metaData.description);\r\n };\r\n\r\n const setAuthor = (author: string): void => {\r\n metaData.author = DOMPurify.sanitize(author);\r\n updateMetaTag(\"author\", metaData.author);\r\n };\r\n\r\n const getName = (): string => {\r\n return metaData.name!;\r\n };\r\n\r\n const getDescription = (): string => {\r\n return metaData.description!;\r\n };\r\n\r\n const getAuthor = (): string => {\r\n return metaData.author!;\r\n };\r\n\r\n const getAllMetaData = (): SEOConfig => {\r\n return metaData;\r\n };\r\n\r\n const createMetaTag = (name: string, content: string) => {\r\n const metaTag = document.createElement(\"meta\");\r\n metaTag.setAttribute(\"name\", name);\r\n metaTag.setAttribute(\"content\", content);\r\n document.head.appendChild(metaTag);\r\n };\r\n\r\n const updateMetaTag = (name: string, content: string) => {\r\n let metaTag = document.querySelector(`meta[name=\"${name}\"]`);\r\n if (metaTag) {\r\n metaTag.setAttribute(\"content\", content);\r\n } else {\r\n createMetaTag(name, content);\r\n }\r\n };\r\n\r\n const appendMetaTagsToHead = () => {\r\n updateMetaTag(\"name\", metaData.name!);\r\n updateMetaTag(\"description\", metaData.description!);\r\n updateMetaTag(\"author\", metaData.author!);\r\n };\r\n\r\n // Integrate with useTSCSP for CSP enforcement\r\n if (cspConfig) {\r\n useTSCSP(\r\n cspConfig.scriptSrc,\r\n cspConfig.styleSrc,\r\n cspConfig.objectSrc,\r\n Array.isArray(cspConfig.connectSrc) ? cspConfig.connectSrc.join(\" \") : cspConfig.connectSrc,\r\n cspConfig.reportOnly !== undefined ? String(cspConfig.reportOnly) : undefined\r\n );\r\n }\r\n\r\n appendMetaTagsToHead();\r\n\r\n return {\r\n setName,\r\n setDescription,\r\n setAuthor,\r\n getName,\r\n getDescription,\r\n getAuthor,\r\n getAllMetaData,\r\n appendMetaTagsToHead,\r\n };\r\n};\r\n","export const useTSCSP = (\r\n scriptSrc = `'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'`,\r\n styleSrc = \"'self' 'nonce-rAnd0m123'\", // Use nonce for inline styles\r\n objectSrc = \"'none'\",\r\n fontSrc = \"'self' https://fonts.googleapis.com https://fonts.gstatic.com\",\r\n imgSrc = \"'self' https://blogger.googleusercontent.com\",\r\n connectSrc = [\r\n \"'self'\",\r\n \"https://fonts.googleapis.com\",\r\n \"https://fonts.gstatic.com\",\r\n \"https://www.google.com/maps/\",\r\n ],\r\n frameSrc = \"'self' https://www.youtube.com\", // Add frame-src for embedding\r\n baseUri = \"'self'\",\r\n reportUri = \"/csp-report\",\r\n reportOnly = false\r\n) => {\r\n const addOrUpdateCSPMeta = () => {\r\n try {\r\n let metaElement = document.querySelector(\r\n 'meta[http-equiv=\"Content-Security-Policy\"]'\r\n );\r\n if (!metaElement) {\r\n metaElement = document.createElement(\"meta\");\r\n metaElement.setAttribute(\"http-equiv\", \"Content-Security-Policy\");\r\n document.head.appendChild(metaElement);\r\n }\r\n\r\n const reportUriDirective = reportOnly ? `report-uri ${reportUri};` : \"\";\r\n metaElement.setAttribute(\r\n \"content\",\r\n `default-src 'self'; script-src ${scriptSrc}; style-src ${styleSrc}; object-src ${objectSrc}; font-src ${fontSrc}; img-src ${imgSrc}; connect-src ${connectSrc.join(\r\n \" \"\r\n )}; frame-src ${frameSrc}; base-uri ${baseUri}; ${reportUriDirective}`\r\n );\r\n } catch (error) {\r\n console.error(\"Error adding CSP meta element:\", error);\r\n }\r\n };\r\n\r\n if (document.readyState === \"loading\") {\r\n document.addEventListener(\"DOMContentLoaded\", addOrUpdateCSPMeta);\r\n } else {\r\n addOrUpdateCSPMeta();\r\n }\r\n};\r\n","import DOMPurify from \"dompurify\";\r\n\r\ntype TSComponent = (\r\n id: string,\r\n DOM: HTMLElement,\r\n element: Function,\r\n params?: any,\r\n params2?: any\r\n) => void;\r\n\r\nexport const useTSComponent: TSComponent = (\r\n id,\r\n DOM,\r\n element,\r\n params,\r\n params2\r\n) => {\r\n DOMPurify.sanitize(DOM);\r\n element(DOM.querySelector(`#${id}`), params, params2);\r\n};\r\n","type TSSelect = <T extends Element = HTMLElement>(selector: string) => T | null;\r\n\r\nconst useTSSelect: TSSelect = <T extends Element = HTMLElement>(selector: string): T | null => {\r\n const element = document.querySelector<T>(selector);\r\n\r\n if (!element) {\r\n console.warn(`[useTSSelect] No element found for selector: '${selector}'`);\r\n return null;\r\n }\r\n\r\n return element;\r\n};\r\n\r\nexport { useTSSelect };\r\n","import { jwtDecode } from \"jwt-decode\";\r\n\r\nexport const useTSAuth = (_Component: HTMLElement | void, loginUrl: string) => {\r\n const token = localStorage.getItem(\"token\");\r\n\r\n if (!token) {\r\n // Redirect to login page if token is missing\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n\r\n try {\r\n const decodedToken: any = jwtDecode(token);\r\n\r\n // Example: Check if the token has expired\r\n const currentTime = Date.now() / 1000;\r\n if (decodedToken.exp && decodedToken.exp < currentTime) {\r\n console.error(\"Token has expired\");\r\n window.localStorage.removeItem(\"token\");\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n\r\n // If the user is authenticated, return the component\r\n return null;\r\n } catch (error) {\r\n console.error(\"Invalid token:\", error);\r\n // Redirect to login page if token decoding fails\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n};\r\n","\r\ntype TSElementEach = (\r\n elements: NodeListOf<HTMLElement> | HTMLElement[],\r\n events: (keyof HTMLElementEventMap)[],\r\n callback: (element: HTMLElement, event: Event) => void\r\n) => void;\r\n\r\nexport const useTSElementEach: TSElementEach = (\r\n elements,\r\n events,\r\n callback\r\n) => {\r\n elements.forEach(element => {\r\n events.forEach(eventType => {\r\n element.addEventListener(eventType, event => {\r\n callback(element, event);\r\n });\r\n });\r\n });\r\n};\r\n","export const useTSNavigate = () => {\r\n const back = () => window.history.back();\r\n const forward = () => window.history.forward();\r\n\r\n return {\r\n back,\r\n forward,\r\n };\r\n};\r\n","import DOMPurify from \"dompurify\";\r\nimport { tsParamsStore } from \"../../store\";\r\n\r\ntype RouteCallback = (\r\n errorElement?: HTMLElement,\r\n params?: Record<string, string>,\r\n query?: Record<string, string>\r\n) => void;\r\n\r\ninterface RouteConfig {\r\n path: string;\r\n routeto?: string;\r\n element: RouteCallback;\r\n errorElement?: RouteCallback;\r\n children?: RouteConfig[];\r\n params?: Record<string, string>;\r\n}\r\n\r\nexport class TSRouter {\r\n private routes: RouteConfig[] = [];\r\n private expectedParams: Set<string>;\r\n\r\n constructor(routes: RouteConfig[], expectedParams: string[]) {\r\n this.routes = routes;\r\n this.expectedParams = new Set(expectedParams);\r\n window.addEventListener(\"popstate\", this.handlePopState.bind(this));\r\n this.handlePopState(); // Initial load\r\n }\r\n\r\n private handlePopState() {\r\n const currentPath = window.location.pathname;\r\n const currentSearch = window.location.search;\r\n const queryParams = this.parseQueryParams(currentSearch);\r\n\r\n const matchingRoute = this.findMatchingRoute(currentPath, this.routes);\r\n\r\n if (matchingRoute) {\r\n if (matchingRoute.routeto) {\r\n this.navigate(matchingRoute.routeto);\r\n return;\r\n }\r\n\r\n const sanitizedParams = this.filterAndSanitizeParams(matchingRoute.params);\r\n tsParamsStore.getState().setParams(sanitizedParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n const errorElement = document.createElement(\"div\");\r\n\r\n matchingRoute.element?.(errorElement, sanitizedParams, queryParams);\r\n\r\n if (matchingRoute.children) {\r\n const nestedPath = currentPath.slice(matchingRoute.path.length);\r\n const childElement = errorElement.querySelector(\"#child\") as HTMLDivElement;\r\n if (childElement) {\r\n this.renderChildren(\r\n matchingRoute.children,\r\n nestedPath,\r\n childElement,\r\n sanitizedParams,\r\n queryParams\r\n );\r\n }\r\n }\r\n } else {\r\n const notFoundRoute = this.findMatchingRoute(\"*\", this.routes);\r\n if (notFoundRoute) {\r\n const fallbackParams = this.filterAndSanitizeParams(notFoundRoute.params);\r\n tsParamsStore.getState().setParams(fallbackParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n const errorElement = document.createElement(\"div\");\r\n notFoundRoute.element?.(errorElement, fallbackParams, queryParams);\r\n }\r\n }\r\n }\r\n\r\n private renderChildren(\r\n children: RouteConfig[] | undefined,\r\n nestedPath: string,\r\n parentElement: HTMLElement,\r\n parentParams: Record<string, string>,\r\n queryParams: Record<string, string>\r\n ) {\r\n if (!children || children.length === 0) {\r\n const childElement = parentElement.querySelector(\"#child\") as HTMLDivElement;\r\n if (childElement) childElement.remove();\r\n return;\r\n }\r\n\r\n const matchingChild = this.findMatchingRoute(nestedPath, children);\r\n if (matchingChild) {\r\n const childElement = document.createElement(\"div\");\r\n childElement.id = \"child\";\r\n const mergedParams = { ...parentParams, ...matchingChild.params };\r\n const sanitizedParams = this.filterAndSanitizeParams(mergedParams);\r\n\r\n tsParamsStore.getState().setParams(sanitizedParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n matchingChild.element?.(childElement, sanitizedParams, queryParams);\r\n parentElement.appendChild(childElement);\r\n\r\n if (matchingChild.children) {\r\n const nextNestedPath = nestedPath.slice(matchingChild.path.length);\r\n this.renderChildren(\r\n matchingChild.children,\r\n nextNestedPath,\r\n childElement,\r\n sanitizedParams,\r\n queryParams\r\n );\r\n }\r\n }\r\n }\r\n\r\n private parseQueryParams(search: string): Record<string, string> {\r\n const queryParams: Record<string, string> = {};\r\n const urlSearchParams = new URLSearchParams(search);\r\n\r\n for (const [key, value] of urlSearchParams.entries()) {\r\n if (this.expectedParams.has(key)) {\r\n queryParams[key] = DOMPurify.sanitize(value);\r\n }\r\n }\r\n\r\n return queryParams;\r\n }\r\n\r\n private findMatchingRoute(\r\n path: string,\r\n routes: RouteConfig[],\r\n inheritedParams: Record<string, string> = {}\r\n ): RouteConfig | undefined {\r\n for (const route of routes) {\r\n const routePath = route.path;\r\n const isDefaultRoute = routePath === \"*\";\r\n\r\n if (!isDefaultRoute) {\r\n const paramNames: string[] = [];\r\n const regexPattern = routePath.replace(/:[^\\s/]+/g, match => {\r\n paramNames.push(match.substring(1));\r\n return \"([^\\\\s/]+)\";\r\n });\r\n\r\n const regex = new RegExp(`^${regexPattern}(?:/|$)`);\r\n const match = path.match(regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = { ...inheritedParams };\r\n paramNames.forEach((name, index) => {\r\n params[name] = match[index + 1] ?? \"\";\r\n });\r\n\r\n if (route.children) {\r\n const nestedPath = path.slice(match[0].length);\r\n const matchingChild = this.findMatchingRoute(\r\n nestedPath,\r\n route.children,\r\n params\r\n );\r\n if (matchingChild) return matchingChild;\r\n }\r\n\r\n return { ...route, params };\r\n }\r\n } else {\r\n return route;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private filterAndSanitizeParams(\r\n params?: Record<string, string>\r\n ): Record<string, string> {\r\n if (!params) return {};\r\n const sanitizedParams: Record<string, string> = {};\r\n for (const key in params) {\r\n if (this.expectedParams.has(key)) {\r\n sanitizedParams[key] = DOMPurify.sanitize(params[key] ?? \"\");\r\n }\r\n }\r\n return sanitizedParams;\r\n }\r\n\r\n navigate(path: string) {\r\n history.pushState(null, \"\", path);\r\n this.handlePopState();\r\n }\r\n\r\n addRoute(route: RouteConfig) {\r\n this.routes.push(route);\r\n }\r\n}\r\n","import { createStore } from \"zustand/vanilla\";\r\nimport DOMPurify from \"dompurify\";\r\n\r\ninterface TSParamsState {\r\n params: Record<string, string>;\r\n query: Record<string, string>;\r\n setParams: (params: Record<string, string>) => void;\r\n setQuery: (query: Record<string, string>) => void;\r\n}\r\n\r\nexport const tsParamsStore = createStore<TSParamsState>((set) => ({\r\n params: {},\r\n query: {},\r\n setParams: (params) =>\r\n set(() => ({\r\n params: sanitize(params),\r\n })),\r\n setQuery: (query) =>\r\n set(() => ({\r\n query: sanitize(query),\r\n })),\r\n}));\r\n\r\nfunction sanitize(obj: Record<string, string>): Record<string, string> {\r\n const output: Record<string, string> = {};\r\n for (const key in obj) {\r\n output[key] = DOMPurify.sanitize(obj[key]);\r\n }\r\n return output;\r\n}\r\n"],"mappings":"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","names":["index_exports","__export","TSRouter","html","useAnchor","useAnchorSingle","useInitialDOM","useTSAuth","useTSComponent","useTSElementEach","useTSElements","useTSEvent","useTSEventAll","useTSExtractParams","useTSMetaData","useTSNavigate","useTSParams","useTSPurifier","useTSSelect","__toCommonJS","html","strings","values","result","str","i","import_dompurify","useTSPurifier","input","config","mergedConfig","DOMPurify","useTSEvent","id","eventType","handler","element","import_vanilla","import_dompurify","extractPatternParams","pattern","path","paramNames","regexPattern","match","regex","result","name","i","DOMPurify","extractQueryParams","search","urlSearchParams","key","value","useTSParams","set","get","params","query","useTSExtractParams","pattern","store","useTSParams","params","query","useTSEventAll","selector","eventType","handler","elements","element","import_dompurify","useTSElements","htmlElement","element","config","defaultConfig","sanitizedContent","DOMPurify","import_dompurify","previousHTML","useInitialDOM","id","mount","targetElement","currentHTML","sanitizedHTML","DOMPurify","fallbackEl","sanitizeInput","input","element","useAnchorSingle","href","ariaLabel","className","childElement","sanitizedHref","sanitizedAriaLabel","sanitizedClassName","e","scrollPosition","navEvent","state","import_lodash_es","sanitizeInput","input","element","useAnchor","anchors","anchor","originalHref","originalClassName","sanitizedHref","sanitizedClassName","childElement","e","href","error","navEvent","import_dompurify","useTSCSP","scriptSrc","styleSrc","objectSrc","fontSrc","imgSrc","connectSrc","frameSrc","baseUri","reportUri","reportOnly","addOrUpdateCSPMeta","metaElement","reportUriDirective","error","useTSMetaData","config","cspConfig","metaData","DOMPurify","setName","name","updateMetaTag","setDescription","description","setAuthor","author","getName","getDescription","getAuthor","getAllMetaData","createMetaTag","content","metaTag","appendMetaTagsToHead","useTSCSP","import_dompurify","useTSComponent","id","DOM","element","params","params2","DOMPurify","useTSSelect","selector","element","import_jwt_decode","useTSAuth","_Component","loginUrl","token","decodedToken","currentTime","error","useTSElementEach","elements","events","callback","element","eventType","event","useTSNavigate","import_dompurify","import_vanilla","import_dompurify","tsParamsStore","set","params","sanitize","query","obj","output","key","DOMPurify","TSRouter","routes","expectedParams","currentPath","currentSearch","queryParams","matchingRoute","sanitizedParams","tsParamsStore","errorElement","nestedPath","childElement","notFoundRoute","fallbackParams","children","parentElement","parentParams","matchingChild","mergedParams","nextNestedPath","search","urlSearchParams","key","value","DOMPurify","path","inheritedParams","route","routePath","paramNames","regexPattern","match","regex","params","name","index"]}
1
+ {"version":3,"sources":["../index.mts","../src/define/html.ts","../src/hooks/useTSPurifier.ts","../src/hooks/useTSEvent.ts","../src/hooks/useTSParams.ts","../src/hooks/useTSExtract.ts","../src/hooks/useTSAllElements.ts","../src/hooks/useTSElements.ts","../src/hooks/useIntialDOM.ts","../src/hooks/useTSAnchorSingle.ts","../src/hooks/useTSAnchor.ts","../src/hooks/useTSMetaData.ts","../src/hooks/useTSCSP.ts","../src/hooks/useTSComponent.ts","../src/hooks/useTSSelect.ts","../src/hooks/useTSAuth.ts","../src/hooks/useTSForEach.ts","../src/hooks/useTSNavigate.ts","../src/hooks/useTSOutlet.ts","../src/routes/class/Router.class.ts","../src/store/useTSParam.store.ts"],"sourcesContent":["export { html } from './src/define';\r\nexport { useTSOutlet, useTSNavigate, useTSMetaData, useTSSelect, useTSComponent, useTSAuth, useTSElementEach, useInitialDOM, useAnchor, useAnchorSingle, useTSPurifier, useTSEvent, useTSExtractParams, useTSParams, useTSEventAll, useTSElements } from \"./src/hooks\"\r\nexport { TSRouter } from \"./src/routes/class/Router.class\";","export function html(strings: TemplateStringsArray, ...values: any[]): string {\r\n return strings.reduce((result, str, i) => {\r\n return result + str + (values[i] || '');\r\n }, '');\r\n}","import DOMPurify from \"dompurify\";\r\nimport type { Config } from \"dompurify\";\r\n\r\ntype TSPurifier = (input: string | HTMLElement, config?: Config) => string;\r\n\r\nexport const useTSPurifier: TSPurifier = (\r\n input,\r\n config?\r\n) => {\r\n const defaultConfig: Config = {\r\n ADD_TAGS: [\"my-custom-tag\"],\r\n };\r\n\r\n const mergedConfig: Config = { ...defaultConfig, ...config };\r\n\r\n if (typeof input === \"string\") {\r\n return DOMPurify.sanitize(input, mergedConfig);\r\n } else {\r\n return DOMPurify.sanitize(input.innerHTML, mergedConfig);\r\n }\r\n};\r\n","\r\ntype TSEvent = (\r\n id: string,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: HTMLElementEventMap[keyof HTMLElementEventMap]) => void\r\n) => void;\r\n\r\nexport const useTSEvent: TSEvent = (\r\n id,\r\n eventType,\r\n handler\r\n) => {\r\n const element = document.querySelector(`#${id}`);\r\n if (element) {\r\n element.addEventListener(\r\n eventType,\r\n handler as EventListenerOrEventListenerObject\r\n );\r\n } else {\r\n console.warn(`Element with id '${id}' not found.`);\r\n }\r\n};\r\n","// utils/hooks/useTSParams.ts\r\nimport { createStore } from 'zustand/vanilla';\r\nimport DOMPurify from 'dompurify';\r\n\r\ntype ParamStore = {\r\n params: Record<string, string>;\r\n query: Record<string, string>;\r\n setFromPattern: (pattern: MustURL) => void;\r\n getParam: (key: string) => string | undefined;\r\n getQuery: (key: string) => string | undefined;\r\n};\r\n\r\ntype MustURL = `/${string}`;\r\n\r\nfunction extractPatternParams(pattern: MustURL, path: string): Record<string, string> {\r\n const paramNames: string[] = [];\r\n const regexPattern = pattern.replace(/:[^/]+/g, (match) => {\r\n paramNames.push(match.slice(1));\r\n return '([^/]+)';\r\n });\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n const match = path.match(regex);\r\n const result: Record<string, string> = {};\r\n\r\n if (match) {\r\n paramNames.forEach((name, i) => {\r\n result[name] = DOMPurify.sanitize(match[i + 1] ?? '');\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction extractQueryParams(search: MustURL): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n const urlSearchParams = new URLSearchParams(search);\r\n\r\n for (const [key, value] of urlSearchParams.entries()) {\r\n result[key] = DOMPurify.sanitize(value);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport const useTSParams = createStore<ParamStore>((set, get) => ({\r\n params: {},\r\n query: {},\r\n setFromPattern: (pattern: MustURL) => {\r\n const path = window.location.pathname;\r\n const params = extractPatternParams(pattern, path);\r\n const query = extractQueryParams(window.location.search as MustURL);\r\n set({ params, query });\r\n },\r\n getParam: (key: string) => get().params[key],\r\n getQuery: (key: string) => get().query[key],\r\n}));\r\n","import { useTSParams } from './useTSParams';\r\n\r\ntype MustURL = `/${string}`;\r\n\r\nexport function useTSExtractParams(pattern: MustURL) {\r\n const store = useTSParams.getState();\r\n\r\n // Populate internal param/query store\r\n store.setFromPattern(pattern);\r\n\r\n const params = store.params;\r\n const query = store.query;\r\n\r\n return { ...params, ...query };\r\n}\r\n","export const useTSEventAll = <T extends Event>(\r\n selector: string,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: T) => void\r\n) => {\r\n const elements = document.querySelectorAll(selector);\r\n elements.forEach(element => {\r\n element.addEventListener(eventType, handler as EventListener);\r\n });\r\n\r\n return () => {\r\n elements.forEach(element => {\r\n element.removeEventListener(eventType, handler as EventListener);\r\n });\r\n };\r\n};\r\n\r\nexport const useTSEventSelectAll = <T extends Event>(\r\n selectors: string[],\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: T) => void\r\n) => {\r\n const elements: NodeListOf<HTMLElement>[] = [];\r\n\r\n selectors.forEach(selector => {\r\n const selectedElements = document.querySelectorAll(\r\n selector\r\n ) as NodeListOf<HTMLElement>;\r\n selectedElements.forEach(element => {\r\n element.addEventListener(eventType, handler as EventListener);\r\n });\r\n elements.push(selectedElements);\r\n });\r\n\r\n return () => {\r\n elements.forEach(nodeList => {\r\n nodeList.forEach(element => {\r\n element.removeEventListener(eventType, handler as EventListener);\r\n });\r\n });\r\n };\r\n};\r\n","import DOMPurify, { Config } from \"dompurify\";\r\n\r\ntype TSElements = (\r\n htmlElement: HTMLElement,\r\n element: string,\r\n config?: Config\r\n) => void;\r\n\r\nexport const useTSElements: TSElements = (\r\n htmlElement,\r\n element,\r\n config\r\n) => {\r\n const defaultConfig: Config = {\r\n ALLOWED_TAGS: ['main', 'div', 'h1', 'p', 'button', 'span', 'a', 'img', 'input'],\r\n ALLOWED_ATTR: ['class', 'id', 'href', 'style', 'src', 'alt'],\r\n ...config, // allow user overrides\r\n };\r\n const sanitizedContent = DOMPurify.sanitize(/*html*/ element, defaultConfig!); // Pass options if provided\r\n\r\n if (htmlElement.innerHTML !== String(sanitizedContent)) {\r\n return (htmlElement.innerHTML = String(sanitizedContent));\r\n }\r\n};\r\n","import DOMPurify from \"dompurify\"\r\n\r\nlet previousHTML: string | null = null\r\n\r\ntype TSInitialDOM = (id: string, mount: (el: HTMLElement) => void) => void;\r\n\r\nexport const useInitialDOM: TSInitialDOM = (id, mount) => {\r\n // SSR guard\r\n if (typeof document === \"undefined\") return\r\n\r\n const targetElement = document.getElementById(id)\r\n if (!targetElement) return\r\n\r\n const currentHTML = targetElement.innerHTML\r\n const sanitizedHTML = DOMPurify.sanitize(currentHTML)\r\n\r\n if (previousHTML !== null && sanitizedHTML !== previousHTML) {\r\n // DOM changed externally — reset and remount in a temp container\r\n const fallbackEl = document.createElement(\"div\")\r\n mount(fallbackEl)\r\n targetElement.innerHTML = previousHTML\r\n } else {\r\n // First time or same sanitized DOM — mount to target\r\n previousHTML = sanitizedHTML\r\n mount(targetElement)\r\n }\r\n}\r\n","\r\ntype SanitizeInput = (input: string) => string;\r\n\r\ntype AnchorSingle = (\r\n element: HTMLElement,\r\n href: string,\r\n ariaLabel: string,\r\n className?: string,\r\n childElement?: HTMLElement | null\r\n) => void;\r\n\r\nconst sanitizeInput: SanitizeInput = (input) => {\r\n const element = document.createElement(\"div\");\r\n element.innerText = input;\r\n return element.innerHTML;\r\n};\r\n\r\nexport const useAnchorSingle: AnchorSingle = (\r\n element,\r\n href,\r\n ariaLabel,\r\n className = \"\",\r\n childElement = null\r\n) => {\r\n if (!element) return;\r\n\r\n const sanitizedHref = sanitizeInput(href);\r\n const sanitizedAriaLabel = sanitizeInput(ariaLabel);\r\n const sanitizedClassName = className ? sanitizeInput(className) : undefined;\r\n\r\n element.setAttribute(\"href\", sanitizedHref);\r\n element.setAttribute(\"aria-label\", sanitizedAriaLabel);\r\n\r\n if (sanitizedClassName) {\r\n element.className = sanitizedClassName;\r\n }\r\n\r\n if (childElement) {\r\n element.innerHTML = \"\";\r\n element.appendChild(childElement);\r\n }\r\n\r\n element.addEventListener(\"click\", e => {\r\n e.preventDefault();\r\n const target = e.currentTarget as HTMLAnchorElement;\r\n const href = target.getAttribute(\"href\");\r\n if (href) {\r\n const scrollPosition = window.scrollY;\r\n window.scrollTo(0, 0);\r\n window.history.pushState({ scrollPosition }, \"\", href);\r\n const navEvent = new PopStateEvent(\"popstate\");\r\n dispatchEvent(navEvent);\r\n }\r\n });\r\n\r\n window.addEventListener(\"popstate\", e => {\r\n const state = e.state as { scrollPosition?: number };\r\n if (state && state.scrollPosition !== undefined) {\r\n window.scrollTo(0, state.scrollPosition);\r\n }\r\n });\r\n};\r\n","import { debounce } from 'lodash-es';\r\n\r\nlet sanitizeInput = (input: string): string => input; // fallback for SSR\r\n\r\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n sanitizeInput = (input: string): string => {\r\n const element = document.createElement(\"div\");\r\n element.innerText = input;\r\n return element.innerHTML;\r\n };\r\n}\r\n\r\nexport const useAnchor = typeof window !== 'undefined'\r\n ? debounce((anchors: NodeListOf<HTMLAnchorElement>) => {\r\n anchors.forEach(anchor => {\r\n if (!anchor) return;\r\n\r\n const originalHref = anchor.getAttribute(\"href\") || \"#\";\r\n const originalClassName = anchor.getAttribute(\"class\") || \"\";\r\n\r\n const sanitizedHref = sanitizeInput(originalHref);\r\n const sanitizedClassName = anchor.getAttribute(\"class\")\r\n ? sanitizeInput(anchor.getAttribute(\"class\")!)\r\n : originalClassName;\r\n\r\n anchor.setAttribute(\"href\", sanitizedHref);\r\n anchor.setAttribute(\"class\", sanitizedClassName);\r\n\r\n if (anchor.getAttribute(\"aria-label\")) {\r\n anchor.setAttribute(\r\n \"aria-label\",\r\n sanitizeInput(anchor.getAttribute(\"aria-label\")!)\r\n );\r\n }\r\n\r\n const childElement = anchor.querySelector(\":scope > *\") as HTMLElement;\r\n if (childElement) {\r\n anchor.innerHTML = \"\";\r\n anchor.appendChild(childElement);\r\n }\r\n\r\n anchor.addEventListener(\"click\", e => {\r\n const target = e.currentTarget as HTMLAnchorElement;\r\n const href = target.getAttribute(\"href\");\r\n\r\n try {\r\n const url = new URL(href!, window.location.href);\r\n if (url.origin !== window.location.origin) return;\r\n } catch (error) {\r\n console.error(\"Invalid URL:\", error);\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n window.history.pushState({}, \"\", href);\r\n const navEvent = new PopStateEvent(\"popstate\");\r\n window.dispatchEvent(navEvent);\r\n });\r\n });\r\n })\r\n : () => { }; // SSR-safe no-op\r\n","import DOMPurify from \"dompurify\";\r\nimport { useTSCSP } from \"./useTSCSP\";\r\n\r\ntype SEOConfig = {\r\n name?: string;\r\n description?: string;\r\n author?: string;\r\n}\r\n\r\ntype CSPConfig = {\r\n scriptSrc?: string;\r\n styleSrc?: string;\r\n objectSrc?: string;\r\n connectSrc?: string[];\r\n reportOnly?: boolean;\r\n}\r\n\r\ntype SEOHandler = {\r\n setName: (name: string) => void;\r\n setDescription: (description: string) => void;\r\n setAuthor: (author: string) => void;\r\n getName: () => string;\r\n getDescription: () => string;\r\n getAuthor: () => string;\r\n getAllMetaData: () => SEOConfig;\r\n appendMetaTagsToHead: () => void;\r\n}\r\n\r\nexport const useTSMetaData = (\r\n config: SEOConfig,\r\n cspConfig?: CSPConfig\r\n): SEOHandler => {\r\n let metaData: SEOConfig = {\r\n name: DOMPurify.sanitize(config.name || \"\"),\r\n description: DOMPurify.sanitize(\r\n config.description || \"Default description\"\r\n ),\r\n author: DOMPurify.sanitize(config.author || \"\"),\r\n };\r\n\r\n const setName = (name: string): void => {\r\n metaData.name = DOMPurify.sanitize(name);\r\n updateMetaTag(\"name\", metaData.name);\r\n };\r\n\r\n const setDescription = (description: string): void => {\r\n metaData.description = DOMPurify.sanitize(description);\r\n updateMetaTag(\"description\", metaData.description);\r\n };\r\n\r\n const setAuthor = (author: string): void => {\r\n metaData.author = DOMPurify.sanitize(author);\r\n updateMetaTag(\"author\", metaData.author);\r\n };\r\n\r\n const getName = (): string => {\r\n return metaData.name!;\r\n };\r\n\r\n const getDescription = (): string => {\r\n return metaData.description!;\r\n };\r\n\r\n const getAuthor = (): string => {\r\n return metaData.author!;\r\n };\r\n\r\n const getAllMetaData = (): SEOConfig => {\r\n return metaData;\r\n };\r\n\r\n const createMetaTag = (name: string, content: string) => {\r\n const metaTag = document.createElement(\"meta\");\r\n metaTag.setAttribute(\"name\", name);\r\n metaTag.setAttribute(\"content\", content);\r\n document.head.appendChild(metaTag);\r\n };\r\n\r\n const updateMetaTag = (name: string, content: string) => {\r\n let metaTag = document.querySelector(`meta[name=\"${name}\"]`);\r\n if (metaTag) {\r\n metaTag.setAttribute(\"content\", content);\r\n } else {\r\n createMetaTag(name, content);\r\n }\r\n };\r\n\r\n const appendMetaTagsToHead = () => {\r\n updateMetaTag(\"name\", metaData.name!);\r\n updateMetaTag(\"description\", metaData.description!);\r\n updateMetaTag(\"author\", metaData.author!);\r\n };\r\n\r\n // Integrate with useTSCSP for CSP enforcement\r\n if (cspConfig) {\r\n useTSCSP(\r\n cspConfig.scriptSrc,\r\n cspConfig.styleSrc,\r\n cspConfig.objectSrc,\r\n Array.isArray(cspConfig.connectSrc) ? cspConfig.connectSrc.join(\" \") : cspConfig.connectSrc,\r\n cspConfig.reportOnly !== undefined ? String(cspConfig.reportOnly) : undefined\r\n );\r\n }\r\n\r\n appendMetaTagsToHead();\r\n\r\n return {\r\n setName,\r\n setDescription,\r\n setAuthor,\r\n getName,\r\n getDescription,\r\n getAuthor,\r\n getAllMetaData,\r\n appendMetaTagsToHead,\r\n };\r\n};\r\n","export const useTSCSP = (\r\n scriptSrc = `'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'`,\r\n styleSrc = \"'self' 'nonce-rAnd0m123'\", // Use nonce for inline styles\r\n objectSrc = \"'none'\",\r\n fontSrc = \"'self' https://fonts.googleapis.com https://fonts.gstatic.com\",\r\n imgSrc = \"'self' https://blogger.googleusercontent.com\",\r\n connectSrc = [\r\n \"'self'\",\r\n \"https://fonts.googleapis.com\",\r\n \"https://fonts.gstatic.com\",\r\n \"https://www.google.com/maps/\",\r\n ],\r\n frameSrc = \"'self' https://www.youtube.com\", // Add frame-src for embedding\r\n baseUri = \"'self'\",\r\n reportUri = \"/csp-report\",\r\n reportOnly = false\r\n) => {\r\n const addOrUpdateCSPMeta = () => {\r\n try {\r\n let metaElement = document.querySelector(\r\n 'meta[http-equiv=\"Content-Security-Policy\"]'\r\n );\r\n if (!metaElement) {\r\n metaElement = document.createElement(\"meta\");\r\n metaElement.setAttribute(\"http-equiv\", \"Content-Security-Policy\");\r\n document.head.appendChild(metaElement);\r\n }\r\n\r\n const reportUriDirective = reportOnly ? `report-uri ${reportUri};` : \"\";\r\n metaElement.setAttribute(\r\n \"content\",\r\n `default-src 'self'; script-src ${scriptSrc}; style-src ${styleSrc}; object-src ${objectSrc}; font-src ${fontSrc}; img-src ${imgSrc}; connect-src ${connectSrc.join(\r\n \" \"\r\n )}; frame-src ${frameSrc}; base-uri ${baseUri}; ${reportUriDirective}`\r\n );\r\n } catch (error) {\r\n console.error(\"Error adding CSP meta element:\", error);\r\n }\r\n };\r\n\r\n if (document.readyState === \"loading\") {\r\n document.addEventListener(\"DOMContentLoaded\", addOrUpdateCSPMeta);\r\n } else {\r\n addOrUpdateCSPMeta();\r\n }\r\n};\r\n","import DOMPurify from \"dompurify\";\r\n\r\ntype TSComponent = (\r\n id: string,\r\n DOM: HTMLElement,\r\n element: Function,\r\n params?: any,\r\n params2?: any\r\n) => void;\r\n\r\nexport const useTSComponent: TSComponent = (\r\n id,\r\n DOM,\r\n element,\r\n params,\r\n params2\r\n) => {\r\n DOMPurify.sanitize(DOM);\r\n element(DOM.querySelector(`#${id}`), params, params2);\r\n};\r\n","type TSSelect = <T extends Element = HTMLElement>(selector: string) => T | null;\r\n\r\nconst useTSSelect: TSSelect = <T extends Element = HTMLElement>(selector: string): T | null => {\r\n const element = document.querySelector<T>(selector);\r\n\r\n if (!element) {\r\n console.warn(`[useTSSelect] No element found for selector: '${selector}'`);\r\n return null;\r\n }\r\n\r\n return element;\r\n};\r\n\r\nexport { useTSSelect };\r\n","import { jwtDecode } from \"jwt-decode\";\r\n\r\nexport const useTSAuth = (_Component: HTMLElement | void, loginUrl: string) => {\r\n const token = localStorage.getItem(\"token\");\r\n\r\n if (!token) {\r\n // Redirect to login page if token is missing\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n\r\n try {\r\n const decodedToken: any = jwtDecode(token);\r\n\r\n // Example: Check if the token has expired\r\n const currentTime = Date.now() / 1000;\r\n if (decodedToken.exp && decodedToken.exp < currentTime) {\r\n console.error(\"Token has expired\");\r\n window.localStorage.removeItem(\"token\");\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n\r\n // If the user is authenticated, return the component\r\n return null;\r\n } catch (error) {\r\n console.error(\"Invalid token:\", error);\r\n // Redirect to login page if token decoding fails\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n};\r\n","\r\ntype TSElementEach = (\r\n elements: NodeListOf<HTMLElement> | HTMLElement[],\r\n events: (keyof HTMLElementEventMap)[],\r\n callback: (element: HTMLElement, event: Event) => void\r\n) => void;\r\n\r\nexport const useTSElementEach: TSElementEach = (\r\n elements,\r\n events,\r\n callback\r\n) => {\r\n elements.forEach(element => {\r\n events.forEach(eventType => {\r\n element.addEventListener(eventType, event => {\r\n callback(element, event);\r\n });\r\n });\r\n });\r\n};\r\n","export const useTSNavigate = () => {\r\n const back = () => window.history.back();\r\n const forward = () => window.history.forward();\r\n\r\n return {\r\n back,\r\n forward,\r\n };\r\n};\r\n","export const useTSOutlet = (\r\n selector: string,\r\n childComponent: (DOM: HTMLElement) => void\r\n) => {\r\n const outlet = document.querySelector<HTMLElement>(selector);\r\n if (outlet) childComponent(outlet);\r\n};\r\n","import DOMPurify from \"dompurify\";\r\nimport { tsParamsStore } from \"../../store\";\r\n\r\ntype RouteCallback = (\r\n errorElement?: HTMLElement,\r\n params?: Record<string, string>,\r\n query?: Record<string, string>\r\n) => void;\r\n\r\ninterface RouteConfig {\r\n path: string;\r\n routeto?: string;\r\n element: RouteCallback;\r\n errorElement?: RouteCallback;\r\n children?: RouteConfig[];\r\n params?: Record<string, string>;\r\n}\r\n\r\nexport class TSRouter {\r\n private routes: RouteConfig[] = [];\r\n private expectedParams: Set<string>;\r\n\r\n constructor(routes: RouteConfig[], expectedParams: string[]) {\r\n this.routes = routes;\r\n this.expectedParams = new Set(expectedParams);\r\n window.addEventListener(\"popstate\", this.handlePopState.bind(this));\r\n this.handlePopState(); // Initial load\r\n }\r\n\r\n private handlePopState() {\r\n const currentPath = window.location.pathname;\r\n const currentSearch = window.location.search;\r\n const queryParams = this.parseQueryParams(currentSearch);\r\n\r\n const matchingRoute = this.findMatchingRoute(currentPath, this.routes);\r\n\r\n if (matchingRoute) {\r\n if (matchingRoute.routeto) {\r\n this.navigate(matchingRoute.routeto);\r\n return;\r\n }\r\n\r\n const sanitizedParams = this.filterAndSanitizeParams(matchingRoute.params);\r\n tsParamsStore.getState().setParams(sanitizedParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n const errorElement = document.createElement(\"div\");\r\n\r\n matchingRoute.element?.(errorElement, sanitizedParams, queryParams);\r\n\r\n if (matchingRoute.children) {\r\n const nestedPath = currentPath.slice(matchingRoute.path.length);\r\n const childElement = errorElement.querySelector(\"#child\") as HTMLDivElement;\r\n if (childElement) {\r\n this.renderChildren(\r\n matchingRoute.children,\r\n nestedPath,\r\n childElement,\r\n sanitizedParams,\r\n queryParams\r\n );\r\n }\r\n }\r\n } else {\r\n const notFoundRoute = this.findMatchingRoute(\"*\", this.routes);\r\n if (notFoundRoute) {\r\n const fallbackParams = this.filterAndSanitizeParams(notFoundRoute.params);\r\n tsParamsStore.getState().setParams(fallbackParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n const errorElement = document.createElement(\"div\");\r\n notFoundRoute.element?.(errorElement, fallbackParams, queryParams);\r\n }\r\n }\r\n }\r\n\r\n private renderChildren(\r\n children: RouteConfig[] | undefined,\r\n nestedPath: string,\r\n parentElement: HTMLElement,\r\n parentParams: Record<string, string>,\r\n queryParams: Record<string, string>\r\n ) {\r\n if (!children || children.length === 0) {\r\n const childElement = parentElement.querySelector(\"#child\") as HTMLDivElement;\r\n if (childElement) childElement.remove();\r\n return;\r\n }\r\n\r\n const matchingChild = this.findMatchingRoute(nestedPath, children);\r\n if (matchingChild) {\r\n const childElement = document.createElement(\"div\");\r\n childElement.id = \"child\";\r\n const mergedParams = { ...parentParams, ...matchingChild.params };\r\n const sanitizedParams = this.filterAndSanitizeParams(mergedParams);\r\n\r\n tsParamsStore.getState().setParams(sanitizedParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n matchingChild.element?.(childElement, sanitizedParams, queryParams);\r\n parentElement.appendChild(childElement);\r\n\r\n if (matchingChild.children) {\r\n const nextNestedPath = nestedPath.slice(matchingChild.path.length);\r\n this.renderChildren(\r\n matchingChild.children,\r\n nextNestedPath,\r\n childElement,\r\n sanitizedParams,\r\n queryParams\r\n );\r\n }\r\n }\r\n }\r\n\r\n private parseQueryParams(search: string): Record<string, string> {\r\n const queryParams: Record<string, string> = {};\r\n const urlSearchParams = new URLSearchParams(search);\r\n\r\n for (const [key, value] of urlSearchParams.entries()) {\r\n if (this.expectedParams.has(key)) {\r\n queryParams[key] = DOMPurify.sanitize(value);\r\n }\r\n }\r\n\r\n return queryParams;\r\n }\r\n\r\n private findMatchingRoute(\r\n path: string,\r\n routes: RouteConfig[],\r\n inheritedParams: Record<string, string> = {}\r\n ): RouteConfig | undefined {\r\n for (const route of routes) {\r\n const routePath = route.path;\r\n const isDefaultRoute = routePath === \"*\";\r\n\r\n if (!isDefaultRoute) {\r\n const paramNames: string[] = [];\r\n const regexPattern = routePath.replace(/:[^\\s/]+/g, match => {\r\n paramNames.push(match.substring(1));\r\n return \"([^\\\\s/]+)\";\r\n });\r\n\r\n const regex = new RegExp(`^${regexPattern}(?:/|$)`);\r\n const match = path.match(regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = { ...inheritedParams };\r\n paramNames.forEach((name, index) => {\r\n params[name] = match[index + 1] ?? \"\";\r\n });\r\n\r\n if (route.children) {\r\n const nestedPath = path.slice(match[0].length);\r\n const matchingChild = this.findMatchingRoute(\r\n nestedPath,\r\n route.children,\r\n params\r\n );\r\n if (matchingChild) return matchingChild;\r\n }\r\n\r\n return { ...route, params };\r\n }\r\n } else {\r\n return route;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private filterAndSanitizeParams(\r\n params?: Record<string, string>\r\n ): Record<string, string> {\r\n if (!params) return {};\r\n const sanitizedParams: Record<string, string> = {};\r\n for (const key in params) {\r\n if (this.expectedParams.has(key)) {\r\n sanitizedParams[key] = DOMPurify.sanitize(params[key] ?? \"\");\r\n }\r\n }\r\n return sanitizedParams;\r\n }\r\n\r\n navigate(path: string) {\r\n history.pushState(null, \"\", path);\r\n this.handlePopState();\r\n }\r\n\r\n addRoute(route: RouteConfig) {\r\n this.routes.push(route);\r\n }\r\n}\r\n","import { createStore } from \"zustand/vanilla\";\r\nimport DOMPurify from \"dompurify\";\r\n\r\ninterface TSParamsState {\r\n params: Record<string, string>;\r\n query: Record<string, string>;\r\n setParams: (params: Record<string, string>) => void;\r\n setQuery: (query: Record<string, string>) => void;\r\n}\r\n\r\nexport const tsParamsStore = createStore<TSParamsState>((set) => ({\r\n params: {},\r\n query: {},\r\n setParams: (params) =>\r\n set(() => ({\r\n params: sanitize(params),\r\n })),\r\n setQuery: (query) =>\r\n set(() => ({\r\n query: sanitize(query),\r\n })),\r\n}));\r\n\r\nfunction sanitize(obj: Record<string, string>): Record<string, string> {\r\n const output: Record<string, string> = {};\r\n for (const key in obj) {\r\n output[key] = DOMPurify.sanitize(obj[key]);\r\n }\r\n return output;\r\n}\r\n"],"mappings":"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","names":["index_exports","__export","TSRouter","html","useAnchor","useAnchorSingle","useInitialDOM","useTSAuth","useTSComponent","useTSElementEach","useTSElements","useTSEvent","useTSEventAll","useTSExtractParams","useTSMetaData","useTSNavigate","useTSOutlet","useTSParams","useTSPurifier","useTSSelect","__toCommonJS","html","strings","values","result","str","i","import_dompurify","useTSPurifier","input","config","mergedConfig","DOMPurify","useTSEvent","id","eventType","handler","element","import_vanilla","import_dompurify","extractPatternParams","pattern","path","paramNames","regexPattern","match","regex","result","name","i","DOMPurify","extractQueryParams","search","urlSearchParams","key","value","useTSParams","set","get","params","query","useTSExtractParams","pattern","store","useTSParams","params","query","useTSEventAll","selector","eventType","handler","elements","element","import_dompurify","useTSElements","htmlElement","element","config","defaultConfig","sanitizedContent","DOMPurify","import_dompurify","previousHTML","useInitialDOM","id","mount","targetElement","currentHTML","sanitizedHTML","DOMPurify","fallbackEl","sanitizeInput","input","element","useAnchorSingle","href","ariaLabel","className","childElement","sanitizedHref","sanitizedAriaLabel","sanitizedClassName","e","scrollPosition","navEvent","state","import_lodash_es","sanitizeInput","input","element","useAnchor","anchors","anchor","originalHref","originalClassName","sanitizedHref","sanitizedClassName","childElement","e","href","error","navEvent","import_dompurify","useTSCSP","scriptSrc","styleSrc","objectSrc","fontSrc","imgSrc","connectSrc","frameSrc","baseUri","reportUri","reportOnly","addOrUpdateCSPMeta","metaElement","reportUriDirective","error","useTSMetaData","config","cspConfig","metaData","DOMPurify","setName","name","updateMetaTag","setDescription","description","setAuthor","author","getName","getDescription","getAuthor","getAllMetaData","createMetaTag","content","metaTag","appendMetaTagsToHead","useTSCSP","import_dompurify","useTSComponent","id","DOM","element","params","params2","DOMPurify","useTSSelect","selector","element","import_jwt_decode","useTSAuth","_Component","loginUrl","token","decodedToken","currentTime","error","useTSElementEach","elements","events","callback","element","eventType","event","useTSNavigate","useTSOutlet","selector","childComponent","outlet","import_dompurify","import_vanilla","import_dompurify","tsParamsStore","set","params","sanitize","query","obj","output","key","DOMPurify","TSRouter","routes","expectedParams","currentPath","currentSearch","queryParams","matchingRoute","sanitizedParams","tsParamsStore","errorElement","nestedPath","childElement","notFoundRoute","fallbackParams","children","parentElement","parentParams","matchingChild","mergedParams","nextNestedPath","search","urlSearchParams","key","value","DOMPurify","path","inheritedParams","route","routePath","paramNames","regexPattern","match","regex","params","name","index"]}
package/dist/index.d.cts CHANGED
@@ -78,6 +78,8 @@ declare const useTSNavigate: () => {
78
78
  forward: () => void;
79
79
  };
80
80
 
81
+ declare const useTSOutlet: (selector: string, childComponent: (DOM: HTMLElement) => void) => void;
82
+
81
83
  type RouteCallback = (errorElement?: HTMLElement, params?: Record<string, string>, query?: Record<string, string>) => void;
82
84
  interface RouteConfig {
83
85
  path: string;
@@ -100,4 +102,4 @@ declare class TSRouter {
100
102
  addRoute(route: RouteConfig): void;
101
103
  }
102
104
 
103
- export { TSRouter, html, useAnchor, useAnchorSingle, useInitialDOM, useTSAuth, useTSComponent, useTSElementEach, useTSElements, useTSEvent, useTSEventAll, useTSExtractParams, useTSMetaData, useTSNavigate, useTSParams, useTSPurifier, useTSSelect };
105
+ export { TSRouter, html, useAnchor, useAnchorSingle, useInitialDOM, useTSAuth, useTSComponent, useTSElementEach, useTSElements, useTSEvent, useTSEventAll, useTSExtractParams, useTSMetaData, useTSNavigate, useTSOutlet, useTSParams, useTSPurifier, useTSSelect };
package/dist/index.d.ts CHANGED
@@ -78,6 +78,8 @@ declare const useTSNavigate: () => {
78
78
  forward: () => void;
79
79
  };
80
80
 
81
+ declare const useTSOutlet: (selector: string, childComponent: (DOM: HTMLElement) => void) => void;
82
+
81
83
  type RouteCallback = (errorElement?: HTMLElement, params?: Record<string, string>, query?: Record<string, string>) => void;
82
84
  interface RouteConfig {
83
85
  path: string;
@@ -100,4 +102,4 @@ declare class TSRouter {
100
102
  addRoute(route: RouteConfig): void;
101
103
  }
102
104
 
103
- export { TSRouter, html, useAnchor, useAnchorSingle, useInitialDOM, useTSAuth, useTSComponent, useTSElementEach, useTSElements, useTSEvent, useTSEventAll, useTSExtractParams, useTSMetaData, useTSNavigate, useTSParams, useTSPurifier, useTSSelect };
105
+ export { TSRouter, html, useAnchor, useAnchorSingle, useInitialDOM, useTSAuth, useTSComponent, useTSElementEach, useTSElements, useTSEvent, useTSEventAll, useTSExtractParams, useTSMetaData, useTSNavigate, useTSOutlet, useTSParams, useTSPurifier, useTSSelect };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- function P(n,...e){return n.reduce((t,r,o)=>t+r+(e[o]||""),"")}import x from"dompurify";var w=(n,e)=>{let r={...{ADD_TAGS:["my-custom-tag"]},...e};return typeof n=="string"?x.sanitize(n,r):x.sanitize(n.innerHTML,r)};var R=(n,e,t)=>{let r=document.querySelector(`#${n}`);r?r.addEventListener(e,t):console.warn(`Element with id '${n}' not found.`)};import{createStore as _}from"zustand/vanilla";import A from"dompurify";function j(n,e){let t=[],r=n.replace(/:[^/]+/g,i=>(t.push(i.slice(1)),"([^/]+)")),o=new RegExp(`^${r}$`),s=e.match(o),a={};return s&&t.forEach((i,u)=>{a[i]=A.sanitize(s[u+1]??"")}),a}function B(n){let e={},t=new URLSearchParams(n);for(let[r,o]of t.entries())e[r]=A.sanitize(o);return e}var T=_((n,e)=>({params:{},query:{},setFromPattern:t=>{let r=window.location.pathname,o=j(t,r),s=B(window.location.search);n({params:o,query:s})},getParam:t=>e().params[t],getQuery:t=>e().query[t]}));function C(n){let e=T.getState();e.setFromPattern(n);let t=e.params,r=e.query;return{...t,...r}}var b=(n,e,t)=>{let r=document.querySelectorAll(n);return r.forEach(o=>{o.addEventListener(e,t)}),()=>{r.forEach(o=>{o.removeEventListener(e,t)})}};import G from"dompurify";var H=(n,e,t)=>{let r={ALLOWED_TAGS:["main","div","h1","p","button","span","a","img","input"],ALLOWED_ATTR:["class","id","href","style","src","alt"],...t},o=G.sanitize(e,r);if(n.innerHTML!==String(o))return n.innerHTML=String(o)};import W from"dompurify";var E=null,D=(n,e)=>{if(typeof document>"u")return;let t=document.getElementById(n);if(!t)return;let r=t.innerHTML,o=W.sanitize(r);if(E!==null&&o!==E){let s=document.createElement("div");e(s),t.innerHTML=E}else E=o,e(t)};var v=n=>{let e=document.createElement("div");return e.innerText=n,e.innerHTML},O=(n,e,t,r="",o=null)=>{if(!n)return;let s=v(e),a=v(t),i=r?v(r):void 0;n.setAttribute("href",s),n.setAttribute("aria-label",a),i&&(n.className=i),o&&(n.innerHTML="",n.appendChild(o)),n.addEventListener("click",u=>{u.preventDefault();let m=u.currentTarget.getAttribute("href");if(m){let c=window.scrollY;window.scrollTo(0,0),window.history.pushState({scrollPosition:c},"",m);let g=new PopStateEvent("popstate");dispatchEvent(g)}}),window.addEventListener("popstate",u=>{let l=u.state;l&&l.scrollPosition!==void 0&&window.scrollTo(0,l.scrollPosition)})};import{debounce as Y}from"lodash-es";var y=n=>n;typeof window<"u"&&typeof document<"u"&&(y=n=>{let e=document.createElement("div");return e.innerText=n,e.innerHTML});var z=typeof window<"u"?Y(n=>{n.forEach(e=>{if(!e)return;let t=e.getAttribute("href")||"#",r=e.getAttribute("class")||"",o=y(t),s=e.getAttribute("class")?y(e.getAttribute("class")):r;e.setAttribute("href",o),e.setAttribute("class",s),e.getAttribute("aria-label")&&e.setAttribute("aria-label",y(e.getAttribute("aria-label")));let a=e.querySelector(":scope > *");a&&(e.innerHTML="",e.appendChild(a)),e.addEventListener("click",i=>{let l=i.currentTarget.getAttribute("href");try{if(new URL(l,window.location.href).origin!==window.location.origin)return}catch(c){console.error("Invalid URL:",c);return}i.preventDefault(),window.history.pushState({},"",l);let m=new PopStateEvent("popstate");window.dispatchEvent(m)})})}):()=>{};import h from"dompurify";var k=(n="'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'",e="'self' 'nonce-rAnd0m123'",t="'none'",r="'self' https://fonts.googleapis.com https://fonts.gstatic.com",o="'self' https://blogger.googleusercontent.com",s=["'self'","https://fonts.googleapis.com","https://fonts.gstatic.com","https://www.google.com/maps/"],a="'self' https://www.youtube.com",i="'self'",u="/csp-report",l=!1)=>{let m=()=>{try{let c=document.querySelector('meta[http-equiv="Content-Security-Policy"]');c||(c=document.createElement("meta"),c.setAttribute("http-equiv","Content-Security-Policy"),document.head.appendChild(c));let g=l?`report-uri ${u};`:"";c.setAttribute("content",`default-src 'self'; script-src ${n}; style-src ${e}; object-src ${t}; font-src ${r}; img-src ${o}; connect-src ${s.join(" ")}; frame-src ${a}; base-uri ${i}; ${g}`)}catch(c){console.error("Error adding CSP meta element:",c)}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",m):m()};var q=(n,e)=>{let t={name:h.sanitize(n.name||""),description:h.sanitize(n.description||"Default description"),author:h.sanitize(n.author||"")},r=d=>{t.name=h.sanitize(d),c("name",t.name)},o=d=>{t.description=h.sanitize(d),c("description",t.description)},s=d=>{t.author=h.sanitize(d),c("author",t.author)},a=()=>t.name,i=()=>t.description,u=()=>t.author,l=()=>t,m=(d,S)=>{let p=document.createElement("meta");p.setAttribute("name",d),p.setAttribute("content",S),document.head.appendChild(p)},c=(d,S)=>{let p=document.querySelector(`meta[name="${d}"]`);p?p.setAttribute("content",S):m(d,S)},g=()=>{c("name",t.name),c("description",t.description),c("author",t.author)};return e&&k(e.scriptSrc,e.styleSrc,e.objectSrc,Array.isArray(e.connectSrc)?e.connectSrc.join(" "):e.connectSrc,e.reportOnly!==void 0?String(e.reportOnly):void 0),g(),{setName:r,setDescription:o,setAuthor:s,getName:a,getDescription:i,getAuthor:u,getAllMetaData:l,appendMetaTagsToHead:g}};import J from"dompurify";var M=(n,e,t,r,o)=>{J.sanitize(e),t(e.querySelector(`#${n}`),r,o)};var N=n=>{let e=document.querySelector(n);return e||(console.warn(`[useTSSelect] No element found for selector: '${n}'`),null)};import{jwtDecode as K}from"jwt-decode";var $=(n,e)=>{let t=localStorage.getItem("token");if(!t)return window.location.href=e,null;try{let r=K(t),o=Date.now()/1e3;return r.exp&&r.exp<o&&(console.error("Token has expired"),window.localStorage.removeItem("token"),window.location.href=e),null}catch(r){return console.error("Invalid token:",r),window.location.href=e,null}};var I=(n,e,t)=>{n.forEach(r=>{e.forEach(o=>{r.addEventListener(o,s=>{t(r,s)})})})};var F=()=>({back:()=>window.history.back(),forward:()=>window.history.forward()});import Q from"dompurify";import{createStore as V}from"zustand/vanilla";import X from"dompurify";var f=V(n=>({params:{},query:{},setParams:e=>n(()=>({params:U(e)})),setQuery:e=>n(()=>({query:U(e)}))}));function U(n){let e={};for(let t in n)e[t]=X.sanitize(n[t]);return e}var L=class{constructor(e,t){this.routes=[];this.routes=e,this.expectedParams=new Set(t),window.addEventListener("popstate",this.handlePopState.bind(this)),this.handlePopState()}handlePopState(){let e=window.location.pathname,t=window.location.search,r=this.parseQueryParams(t),o=this.findMatchingRoute(e,this.routes);if(o){if(o.routeto){this.navigate(o.routeto);return}let s=this.filterAndSanitizeParams(o.params);f.getState().setParams(s),f.getState().setQuery(r);let a=document.createElement("div");if(o.element?.(a,s,r),o.children){let i=e.slice(o.path.length),u=a.querySelector("#child");u&&this.renderChildren(o.children,i,u,s,r)}}else{let s=this.findMatchingRoute("*",this.routes);if(s){let a=this.filterAndSanitizeParams(s.params);f.getState().setParams(a),f.getState().setQuery(r);let i=document.createElement("div");s.element?.(i,a,r)}}}renderChildren(e,t,r,o,s){if(!e||e.length===0){let i=r.querySelector("#child");i&&i.remove();return}let a=this.findMatchingRoute(t,e);if(a){let i=document.createElement("div");i.id="child";let u={...o,...a.params},l=this.filterAndSanitizeParams(u);if(f.getState().setParams(l),f.getState().setQuery(s),a.element?.(i,l,s),r.appendChild(i),a.children){let m=t.slice(a.path.length);this.renderChildren(a.children,m,i,l,s)}}}parseQueryParams(e){let t={},r=new URLSearchParams(e);for(let[o,s]of r.entries())this.expectedParams.has(o)&&(t[o]=Q.sanitize(s));return t}findMatchingRoute(e,t,r={}){for(let o of t){let s=o.path;if(s==="*")return o;{let i=[],u=s.replace(/:[^\s/]+/g,c=>(i.push(c.substring(1)),"([^\\s/]+)")),l=new RegExp(`^${u}(?:/|$)`),m=e.match(l);if(m){let c={...r};if(i.forEach((g,d)=>{c[g]=m[d+1]??""}),o.children){let g=e.slice(m[0].length),d=this.findMatchingRoute(g,o.children,c);if(d)return d}return{...o,params:c}}}}}filterAndSanitizeParams(e){if(!e)return{};let t={};for(let r in e)this.expectedParams.has(r)&&(t[r]=Q.sanitize(e[r]??""));return t}navigate(e){history.pushState(null,"",e),this.handlePopState()}addRoute(e){this.routes.push(e)}};export{L as TSRouter,P as html,z as useAnchor,O as useAnchorSingle,D as useInitialDOM,$ as useTSAuth,M as useTSComponent,I as useTSElementEach,H as useTSElements,R as useTSEvent,b as useTSEventAll,C as useTSExtractParams,q as useTSMetaData,F as useTSNavigate,T as useTSParams,w as useTSPurifier,N as useTSSelect};
1
+ function P(n,...e){return n.reduce((t,r,o)=>t+r+(e[o]||""),"")}import x from"dompurify";var w=(n,e)=>{let r={...{ADD_TAGS:["my-custom-tag"]},...e};return typeof n=="string"?x.sanitize(n,r):x.sanitize(n.innerHTML,r)};var R=(n,e,t)=>{let r=document.querySelector(`#${n}`);r?r.addEventListener(e,t):console.warn(`Element with id '${n}' not found.`)};import{createStore as j}from"zustand/vanilla";import A from"dompurify";function B(n,e){let t=[],r=n.replace(/:[^/]+/g,i=>(t.push(i.slice(1)),"([^/]+)")),o=new RegExp(`^${r}$`),s=e.match(o),a={};return s&&t.forEach((i,u)=>{a[i]=A.sanitize(s[u+1]??"")}),a}function G(n){let e={},t=new URLSearchParams(n);for(let[r,o]of t.entries())e[r]=A.sanitize(o);return e}var T=j((n,e)=>({params:{},query:{},setFromPattern:t=>{let r=window.location.pathname,o=B(t,r),s=G(window.location.search);n({params:o,query:s})},getParam:t=>e().params[t],getQuery:t=>e().query[t]}));function C(n){let e=T.getState();e.setFromPattern(n);let t=e.params,r=e.query;return{...t,...r}}var H=(n,e,t)=>{let r=document.querySelectorAll(n);return r.forEach(o=>{o.addEventListener(e,t)}),()=>{r.forEach(o=>{o.removeEventListener(e,t)})}};import W from"dompurify";var b=(n,e,t)=>{let r={ALLOWED_TAGS:["main","div","h1","p","button","span","a","img","input"],ALLOWED_ATTR:["class","id","href","style","src","alt"],...t},o=W.sanitize(e,r);if(n.innerHTML!==String(o))return n.innerHTML=String(o)};import Y from"dompurify";var E=null,D=(n,e)=>{if(typeof document>"u")return;let t=document.getElementById(n);if(!t)return;let r=t.innerHTML,o=Y.sanitize(r);if(E!==null&&o!==E){let s=document.createElement("div");e(s),t.innerHTML=E}else E=o,e(t)};var v=n=>{let e=document.createElement("div");return e.innerText=n,e.innerHTML},O=(n,e,t,r="",o=null)=>{if(!n)return;let s=v(e),a=v(t),i=r?v(r):void 0;n.setAttribute("href",s),n.setAttribute("aria-label",a),i&&(n.className=i),o&&(n.innerHTML="",n.appendChild(o)),n.addEventListener("click",u=>{u.preventDefault();let m=u.currentTarget.getAttribute("href");if(m){let c=window.scrollY;window.scrollTo(0,0),window.history.pushState({scrollPosition:c},"",m);let g=new PopStateEvent("popstate");dispatchEvent(g)}}),window.addEventListener("popstate",u=>{let l=u.state;l&&l.scrollPosition!==void 0&&window.scrollTo(0,l.scrollPosition)})};import{debounce as J}from"lodash-es";var y=n=>n;typeof window<"u"&&typeof document<"u"&&(y=n=>{let e=document.createElement("div");return e.innerText=n,e.innerHTML});var z=typeof window<"u"?J(n=>{n.forEach(e=>{if(!e)return;let t=e.getAttribute("href")||"#",r=e.getAttribute("class")||"",o=y(t),s=e.getAttribute("class")?y(e.getAttribute("class")):r;e.setAttribute("href",o),e.setAttribute("class",s),e.getAttribute("aria-label")&&e.setAttribute("aria-label",y(e.getAttribute("aria-label")));let a=e.querySelector(":scope > *");a&&(e.innerHTML="",e.appendChild(a)),e.addEventListener("click",i=>{let l=i.currentTarget.getAttribute("href");try{if(new URL(l,window.location.href).origin!==window.location.origin)return}catch(c){console.error("Invalid URL:",c);return}i.preventDefault(),window.history.pushState({},"",l);let m=new PopStateEvent("popstate");window.dispatchEvent(m)})})}):()=>{};import h from"dompurify";var k=(n="'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'",e="'self' 'nonce-rAnd0m123'",t="'none'",r="'self' https://fonts.googleapis.com https://fonts.gstatic.com",o="'self' https://blogger.googleusercontent.com",s=["'self'","https://fonts.googleapis.com","https://fonts.gstatic.com","https://www.google.com/maps/"],a="'self' https://www.youtube.com",i="'self'",u="/csp-report",l=!1)=>{let m=()=>{try{let c=document.querySelector('meta[http-equiv="Content-Security-Policy"]');c||(c=document.createElement("meta"),c.setAttribute("http-equiv","Content-Security-Policy"),document.head.appendChild(c));let g=l?`report-uri ${u};`:"";c.setAttribute("content",`default-src 'self'; script-src ${n}; style-src ${e}; object-src ${t}; font-src ${r}; img-src ${o}; connect-src ${s.join(" ")}; frame-src ${a}; base-uri ${i}; ${g}`)}catch(c){console.error("Error adding CSP meta element:",c)}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",m):m()};var q=(n,e)=>{let t={name:h.sanitize(n.name||""),description:h.sanitize(n.description||"Default description"),author:h.sanitize(n.author||"")},r=d=>{t.name=h.sanitize(d),c("name",t.name)},o=d=>{t.description=h.sanitize(d),c("description",t.description)},s=d=>{t.author=h.sanitize(d),c("author",t.author)},a=()=>t.name,i=()=>t.description,u=()=>t.author,l=()=>t,m=(d,S)=>{let p=document.createElement("meta");p.setAttribute("name",d),p.setAttribute("content",S),document.head.appendChild(p)},c=(d,S)=>{let p=document.querySelector(`meta[name="${d}"]`);p?p.setAttribute("content",S):m(d,S)},g=()=>{c("name",t.name),c("description",t.description),c("author",t.author)};return e&&k(e.scriptSrc,e.styleSrc,e.objectSrc,Array.isArray(e.connectSrc)?e.connectSrc.join(" "):e.connectSrc,e.reportOnly!==void 0?String(e.reportOnly):void 0),g(),{setName:r,setDescription:o,setAuthor:s,getName:a,getDescription:i,getAuthor:u,getAllMetaData:l,appendMetaTagsToHead:g}};import K from"dompurify";var M=(n,e,t,r,o)=>{K.sanitize(e),t(e.querySelector(`#${n}`),r,o)};var N=n=>{let e=document.querySelector(n);return e||(console.warn(`[useTSSelect] No element found for selector: '${n}'`),null)};import{jwtDecode as V}from"jwt-decode";var $=(n,e)=>{let t=localStorage.getItem("token");if(!t)return window.location.href=e,null;try{let r=V(t),o=Date.now()/1e3;return r.exp&&r.exp<o&&(console.error("Token has expired"),window.localStorage.removeItem("token"),window.location.href=e),null}catch(r){return console.error("Invalid token:",r),window.location.href=e,null}};var I=(n,e,t)=>{n.forEach(r=>{e.forEach(o=>{r.addEventListener(o,s=>{t(r,s)})})})};var F=()=>({back:()=>window.history.back(),forward:()=>window.history.forward()});var U=(n,e)=>{let t=document.querySelector(n);t&&e(t)};import _ from"dompurify";import{createStore as X}from"zustand/vanilla";import Z from"dompurify";var f=X(n=>({params:{},query:{},setParams:e=>n(()=>({params:Q(e)})),setQuery:e=>n(()=>({query:Q(e)}))}));function Q(n){let e={};for(let t in n)e[t]=Z.sanitize(n[t]);return e}var L=class{constructor(e,t){this.routes=[];this.routes=e,this.expectedParams=new Set(t),window.addEventListener("popstate",this.handlePopState.bind(this)),this.handlePopState()}handlePopState(){let e=window.location.pathname,t=window.location.search,r=this.parseQueryParams(t),o=this.findMatchingRoute(e,this.routes);if(o){if(o.routeto){this.navigate(o.routeto);return}let s=this.filterAndSanitizeParams(o.params);f.getState().setParams(s),f.getState().setQuery(r);let a=document.createElement("div");if(o.element?.(a,s,r),o.children){let i=e.slice(o.path.length),u=a.querySelector("#child");u&&this.renderChildren(o.children,i,u,s,r)}}else{let s=this.findMatchingRoute("*",this.routes);if(s){let a=this.filterAndSanitizeParams(s.params);f.getState().setParams(a),f.getState().setQuery(r);let i=document.createElement("div");s.element?.(i,a,r)}}}renderChildren(e,t,r,o,s){if(!e||e.length===0){let i=r.querySelector("#child");i&&i.remove();return}let a=this.findMatchingRoute(t,e);if(a){let i=document.createElement("div");i.id="child";let u={...o,...a.params},l=this.filterAndSanitizeParams(u);if(f.getState().setParams(l),f.getState().setQuery(s),a.element?.(i,l,s),r.appendChild(i),a.children){let m=t.slice(a.path.length);this.renderChildren(a.children,m,i,l,s)}}}parseQueryParams(e){let t={},r=new URLSearchParams(e);for(let[o,s]of r.entries())this.expectedParams.has(o)&&(t[o]=_.sanitize(s));return t}findMatchingRoute(e,t,r={}){for(let o of t){let s=o.path;if(s==="*")return o;{let i=[],u=s.replace(/:[^\s/]+/g,c=>(i.push(c.substring(1)),"([^\\s/]+)")),l=new RegExp(`^${u}(?:/|$)`),m=e.match(l);if(m){let c={...r};if(i.forEach((g,d)=>{c[g]=m[d+1]??""}),o.children){let g=e.slice(m[0].length),d=this.findMatchingRoute(g,o.children,c);if(d)return d}return{...o,params:c}}}}}filterAndSanitizeParams(e){if(!e)return{};let t={};for(let r in e)this.expectedParams.has(r)&&(t[r]=_.sanitize(e[r]??""));return t}navigate(e){history.pushState(null,"",e),this.handlePopState()}addRoute(e){this.routes.push(e)}};export{L as TSRouter,P as html,z as useAnchor,O as useAnchorSingle,D as useInitialDOM,$ as useTSAuth,M as useTSComponent,I as useTSElementEach,b as useTSElements,R as useTSEvent,H as useTSEventAll,C as useTSExtractParams,q as useTSMetaData,F as useTSNavigate,U as useTSOutlet,T as useTSParams,w as useTSPurifier,N as useTSSelect};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/define/html.ts","../src/hooks/useTSPurifier.ts","../src/hooks/useTSEvent.ts","../src/hooks/useTSParams.ts","../src/hooks/useTSExtract.ts","../src/hooks/useTSAllElements.ts","../src/hooks/useTSElements.ts","../src/hooks/useIntialDOM.ts","../src/hooks/useTSAnchorSingle.ts","../src/hooks/useTSAnchor.ts","../src/hooks/useTSMetaData.ts","../src/hooks/useTSCSP.ts","../src/hooks/useTSComponent.ts","../src/hooks/useTSSelect.ts","../src/hooks/useTSAuth.ts","../src/hooks/useTSForEach.ts","../src/hooks/useTSNavigate.ts","../src/routes/class/Router.class.ts","../src/store/useTSParam.store.ts"],"sourcesContent":["export function html(strings: TemplateStringsArray, ...values: any[]): string {\r\n return strings.reduce((result, str, i) => {\r\n return result + str + (values[i] || '');\r\n }, '');\r\n}","import DOMPurify from \"dompurify\";\r\nimport type { Config } from \"dompurify\";\r\n\r\ntype TSPurifier = (input: string | HTMLElement, config?: Config) => string;\r\n\r\nexport const useTSPurifier: TSPurifier = (\r\n input,\r\n config?\r\n) => {\r\n const defaultConfig: Config = {\r\n ADD_TAGS: [\"my-custom-tag\"],\r\n };\r\n\r\n const mergedConfig: Config = { ...defaultConfig, ...config };\r\n\r\n if (typeof input === \"string\") {\r\n return DOMPurify.sanitize(input, mergedConfig);\r\n } else {\r\n return DOMPurify.sanitize(input.innerHTML, mergedConfig);\r\n }\r\n};\r\n","\r\ntype TSEvent = (\r\n id: string,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: HTMLElementEventMap[keyof HTMLElementEventMap]) => void\r\n) => void;\r\n\r\nexport const useTSEvent: TSEvent = (\r\n id,\r\n eventType,\r\n handler\r\n) => {\r\n const element = document.querySelector(`#${id}`);\r\n if (element) {\r\n element.addEventListener(\r\n eventType,\r\n handler as EventListenerOrEventListenerObject\r\n );\r\n } else {\r\n console.warn(`Element with id '${id}' not found.`);\r\n }\r\n};\r\n","// utils/hooks/useTSParams.ts\r\nimport { createStore } from 'zustand/vanilla';\r\nimport DOMPurify from 'dompurify';\r\n\r\ntype ParamStore = {\r\n params: Record<string, string>;\r\n query: Record<string, string>;\r\n setFromPattern: (pattern: MustURL) => void;\r\n getParam: (key: string) => string | undefined;\r\n getQuery: (key: string) => string | undefined;\r\n};\r\n\r\ntype MustURL = `/${string}`;\r\n\r\nfunction extractPatternParams(pattern: MustURL, path: string): Record<string, string> {\r\n const paramNames: string[] = [];\r\n const regexPattern = pattern.replace(/:[^/]+/g, (match) => {\r\n paramNames.push(match.slice(1));\r\n return '([^/]+)';\r\n });\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n const match = path.match(regex);\r\n const result: Record<string, string> = {};\r\n\r\n if (match) {\r\n paramNames.forEach((name, i) => {\r\n result[name] = DOMPurify.sanitize(match[i + 1] ?? '');\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction extractQueryParams(search: MustURL): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n const urlSearchParams = new URLSearchParams(search);\r\n\r\n for (const [key, value] of urlSearchParams.entries()) {\r\n result[key] = DOMPurify.sanitize(value);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport const useTSParams = createStore<ParamStore>((set, get) => ({\r\n params: {},\r\n query: {},\r\n setFromPattern: (pattern: MustURL) => {\r\n const path = window.location.pathname;\r\n const params = extractPatternParams(pattern, path);\r\n const query = extractQueryParams(window.location.search as MustURL);\r\n set({ params, query });\r\n },\r\n getParam: (key: string) => get().params[key],\r\n getQuery: (key: string) => get().query[key],\r\n}));\r\n","import { useTSParams } from './useTSParams';\r\n\r\ntype MustURL = `/${string}`;\r\n\r\nexport function useTSExtractParams(pattern: MustURL) {\r\n const store = useTSParams.getState();\r\n\r\n // Populate internal param/query store\r\n store.setFromPattern(pattern);\r\n\r\n const params = store.params;\r\n const query = store.query;\r\n\r\n return { ...params, ...query };\r\n}\r\n","export const useTSEventAll = <T extends Event>(\r\n selector: string,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: T) => void\r\n) => {\r\n const elements = document.querySelectorAll(selector);\r\n elements.forEach(element => {\r\n element.addEventListener(eventType, handler as EventListener);\r\n });\r\n\r\n return () => {\r\n elements.forEach(element => {\r\n element.removeEventListener(eventType, handler as EventListener);\r\n });\r\n };\r\n};\r\n\r\nexport const useTSEventSelectAll = <T extends Event>(\r\n selectors: string[],\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: T) => void\r\n) => {\r\n const elements: NodeListOf<HTMLElement>[] = [];\r\n\r\n selectors.forEach(selector => {\r\n const selectedElements = document.querySelectorAll(\r\n selector\r\n ) as NodeListOf<HTMLElement>;\r\n selectedElements.forEach(element => {\r\n element.addEventListener(eventType, handler as EventListener);\r\n });\r\n elements.push(selectedElements);\r\n });\r\n\r\n return () => {\r\n elements.forEach(nodeList => {\r\n nodeList.forEach(element => {\r\n element.removeEventListener(eventType, handler as EventListener);\r\n });\r\n });\r\n };\r\n};\r\n","import DOMPurify, { Config } from \"dompurify\";\r\n\r\ntype TSElements = (\r\n htmlElement: HTMLElement,\r\n element: string,\r\n config?: Config\r\n) => void;\r\n\r\nexport const useTSElements: TSElements = (\r\n htmlElement,\r\n element,\r\n config\r\n) => {\r\n const defaultConfig: Config = {\r\n ALLOWED_TAGS: ['main', 'div', 'h1', 'p', 'button', 'span', 'a', 'img', 'input'],\r\n ALLOWED_ATTR: ['class', 'id', 'href', 'style', 'src', 'alt'],\r\n ...config, // allow user overrides\r\n };\r\n const sanitizedContent = DOMPurify.sanitize(/*html*/ element, defaultConfig!); // Pass options if provided\r\n\r\n if (htmlElement.innerHTML !== String(sanitizedContent)) {\r\n return (htmlElement.innerHTML = String(sanitizedContent));\r\n }\r\n};\r\n","import DOMPurify from \"dompurify\"\r\n\r\nlet previousHTML: string | null = null\r\n\r\ntype TSInitialDOM = (id: string, mount: (el: HTMLElement) => void) => void;\r\n\r\nexport const useInitialDOM: TSInitialDOM = (id, mount) => {\r\n // SSR guard\r\n if (typeof document === \"undefined\") return\r\n\r\n const targetElement = document.getElementById(id)\r\n if (!targetElement) return\r\n\r\n const currentHTML = targetElement.innerHTML\r\n const sanitizedHTML = DOMPurify.sanitize(currentHTML)\r\n\r\n if (previousHTML !== null && sanitizedHTML !== previousHTML) {\r\n // DOM changed externally — reset and remount in a temp container\r\n const fallbackEl = document.createElement(\"div\")\r\n mount(fallbackEl)\r\n targetElement.innerHTML = previousHTML\r\n } else {\r\n // First time or same sanitized DOM — mount to target\r\n previousHTML = sanitizedHTML\r\n mount(targetElement)\r\n }\r\n}\r\n","\r\ntype SanitizeInput = (input: string) => string;\r\n\r\ntype AnchorSingle = (\r\n element: HTMLElement,\r\n href: string,\r\n ariaLabel: string,\r\n className?: string,\r\n childElement?: HTMLElement | null\r\n) => void;\r\n\r\nconst sanitizeInput: SanitizeInput = (input) => {\r\n const element = document.createElement(\"div\");\r\n element.innerText = input;\r\n return element.innerHTML;\r\n};\r\n\r\nexport const useAnchorSingle: AnchorSingle = (\r\n element,\r\n href,\r\n ariaLabel,\r\n className = \"\",\r\n childElement = null\r\n) => {\r\n if (!element) return;\r\n\r\n const sanitizedHref = sanitizeInput(href);\r\n const sanitizedAriaLabel = sanitizeInput(ariaLabel);\r\n const sanitizedClassName = className ? sanitizeInput(className) : undefined;\r\n\r\n element.setAttribute(\"href\", sanitizedHref);\r\n element.setAttribute(\"aria-label\", sanitizedAriaLabel);\r\n\r\n if (sanitizedClassName) {\r\n element.className = sanitizedClassName;\r\n }\r\n\r\n if (childElement) {\r\n element.innerHTML = \"\";\r\n element.appendChild(childElement);\r\n }\r\n\r\n element.addEventListener(\"click\", e => {\r\n e.preventDefault();\r\n const target = e.currentTarget as HTMLAnchorElement;\r\n const href = target.getAttribute(\"href\");\r\n if (href) {\r\n const scrollPosition = window.scrollY;\r\n window.scrollTo(0, 0);\r\n window.history.pushState({ scrollPosition }, \"\", href);\r\n const navEvent = new PopStateEvent(\"popstate\");\r\n dispatchEvent(navEvent);\r\n }\r\n });\r\n\r\n window.addEventListener(\"popstate\", e => {\r\n const state = e.state as { scrollPosition?: number };\r\n if (state && state.scrollPosition !== undefined) {\r\n window.scrollTo(0, state.scrollPosition);\r\n }\r\n });\r\n};\r\n","import { debounce } from 'lodash-es';\r\n\r\nlet sanitizeInput = (input: string): string => input; // fallback for SSR\r\n\r\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n sanitizeInput = (input: string): string => {\r\n const element = document.createElement(\"div\");\r\n element.innerText = input;\r\n return element.innerHTML;\r\n };\r\n}\r\n\r\nexport const useAnchor = typeof window !== 'undefined'\r\n ? debounce((anchors: NodeListOf<HTMLAnchorElement>) => {\r\n anchors.forEach(anchor => {\r\n if (!anchor) return;\r\n\r\n const originalHref = anchor.getAttribute(\"href\") || \"#\";\r\n const originalClassName = anchor.getAttribute(\"class\") || \"\";\r\n\r\n const sanitizedHref = sanitizeInput(originalHref);\r\n const sanitizedClassName = anchor.getAttribute(\"class\")\r\n ? sanitizeInput(anchor.getAttribute(\"class\")!)\r\n : originalClassName;\r\n\r\n anchor.setAttribute(\"href\", sanitizedHref);\r\n anchor.setAttribute(\"class\", sanitizedClassName);\r\n\r\n if (anchor.getAttribute(\"aria-label\")) {\r\n anchor.setAttribute(\r\n \"aria-label\",\r\n sanitizeInput(anchor.getAttribute(\"aria-label\")!)\r\n );\r\n }\r\n\r\n const childElement = anchor.querySelector(\":scope > *\") as HTMLElement;\r\n if (childElement) {\r\n anchor.innerHTML = \"\";\r\n anchor.appendChild(childElement);\r\n }\r\n\r\n anchor.addEventListener(\"click\", e => {\r\n const target = e.currentTarget as HTMLAnchorElement;\r\n const href = target.getAttribute(\"href\");\r\n\r\n try {\r\n const url = new URL(href!, window.location.href);\r\n if (url.origin !== window.location.origin) return;\r\n } catch (error) {\r\n console.error(\"Invalid URL:\", error);\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n window.history.pushState({}, \"\", href);\r\n const navEvent = new PopStateEvent(\"popstate\");\r\n window.dispatchEvent(navEvent);\r\n });\r\n });\r\n })\r\n : () => { }; // SSR-safe no-op\r\n","import DOMPurify from \"dompurify\";\r\nimport { useTSCSP } from \"./useTSCSP\";\r\n\r\ntype SEOConfig = {\r\n name?: string;\r\n description?: string;\r\n author?: string;\r\n}\r\n\r\ntype CSPConfig = {\r\n scriptSrc?: string;\r\n styleSrc?: string;\r\n objectSrc?: string;\r\n connectSrc?: string[];\r\n reportOnly?: boolean;\r\n}\r\n\r\ntype SEOHandler = {\r\n setName: (name: string) => void;\r\n setDescription: (description: string) => void;\r\n setAuthor: (author: string) => void;\r\n getName: () => string;\r\n getDescription: () => string;\r\n getAuthor: () => string;\r\n getAllMetaData: () => SEOConfig;\r\n appendMetaTagsToHead: () => void;\r\n}\r\n\r\nexport const useTSMetaData = (\r\n config: SEOConfig,\r\n cspConfig?: CSPConfig\r\n): SEOHandler => {\r\n let metaData: SEOConfig = {\r\n name: DOMPurify.sanitize(config.name || \"\"),\r\n description: DOMPurify.sanitize(\r\n config.description || \"Default description\"\r\n ),\r\n author: DOMPurify.sanitize(config.author || \"\"),\r\n };\r\n\r\n const setName = (name: string): void => {\r\n metaData.name = DOMPurify.sanitize(name);\r\n updateMetaTag(\"name\", metaData.name);\r\n };\r\n\r\n const setDescription = (description: string): void => {\r\n metaData.description = DOMPurify.sanitize(description);\r\n updateMetaTag(\"description\", metaData.description);\r\n };\r\n\r\n const setAuthor = (author: string): void => {\r\n metaData.author = DOMPurify.sanitize(author);\r\n updateMetaTag(\"author\", metaData.author);\r\n };\r\n\r\n const getName = (): string => {\r\n return metaData.name!;\r\n };\r\n\r\n const getDescription = (): string => {\r\n return metaData.description!;\r\n };\r\n\r\n const getAuthor = (): string => {\r\n return metaData.author!;\r\n };\r\n\r\n const getAllMetaData = (): SEOConfig => {\r\n return metaData;\r\n };\r\n\r\n const createMetaTag = (name: string, content: string) => {\r\n const metaTag = document.createElement(\"meta\");\r\n metaTag.setAttribute(\"name\", name);\r\n metaTag.setAttribute(\"content\", content);\r\n document.head.appendChild(metaTag);\r\n };\r\n\r\n const updateMetaTag = (name: string, content: string) => {\r\n let metaTag = document.querySelector(`meta[name=\"${name}\"]`);\r\n if (metaTag) {\r\n metaTag.setAttribute(\"content\", content);\r\n } else {\r\n createMetaTag(name, content);\r\n }\r\n };\r\n\r\n const appendMetaTagsToHead = () => {\r\n updateMetaTag(\"name\", metaData.name!);\r\n updateMetaTag(\"description\", metaData.description!);\r\n updateMetaTag(\"author\", metaData.author!);\r\n };\r\n\r\n // Integrate with useTSCSP for CSP enforcement\r\n if (cspConfig) {\r\n useTSCSP(\r\n cspConfig.scriptSrc,\r\n cspConfig.styleSrc,\r\n cspConfig.objectSrc,\r\n Array.isArray(cspConfig.connectSrc) ? cspConfig.connectSrc.join(\" \") : cspConfig.connectSrc,\r\n cspConfig.reportOnly !== undefined ? String(cspConfig.reportOnly) : undefined\r\n );\r\n }\r\n\r\n appendMetaTagsToHead();\r\n\r\n return {\r\n setName,\r\n setDescription,\r\n setAuthor,\r\n getName,\r\n getDescription,\r\n getAuthor,\r\n getAllMetaData,\r\n appendMetaTagsToHead,\r\n };\r\n};\r\n","export const useTSCSP = (\r\n scriptSrc = `'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'`,\r\n styleSrc = \"'self' 'nonce-rAnd0m123'\", // Use nonce for inline styles\r\n objectSrc = \"'none'\",\r\n fontSrc = \"'self' https://fonts.googleapis.com https://fonts.gstatic.com\",\r\n imgSrc = \"'self' https://blogger.googleusercontent.com\",\r\n connectSrc = [\r\n \"'self'\",\r\n \"https://fonts.googleapis.com\",\r\n \"https://fonts.gstatic.com\",\r\n \"https://www.google.com/maps/\",\r\n ],\r\n frameSrc = \"'self' https://www.youtube.com\", // Add frame-src for embedding\r\n baseUri = \"'self'\",\r\n reportUri = \"/csp-report\",\r\n reportOnly = false\r\n) => {\r\n const addOrUpdateCSPMeta = () => {\r\n try {\r\n let metaElement = document.querySelector(\r\n 'meta[http-equiv=\"Content-Security-Policy\"]'\r\n );\r\n if (!metaElement) {\r\n metaElement = document.createElement(\"meta\");\r\n metaElement.setAttribute(\"http-equiv\", \"Content-Security-Policy\");\r\n document.head.appendChild(metaElement);\r\n }\r\n\r\n const reportUriDirective = reportOnly ? `report-uri ${reportUri};` : \"\";\r\n metaElement.setAttribute(\r\n \"content\",\r\n `default-src 'self'; script-src ${scriptSrc}; style-src ${styleSrc}; object-src ${objectSrc}; font-src ${fontSrc}; img-src ${imgSrc}; connect-src ${connectSrc.join(\r\n \" \"\r\n )}; frame-src ${frameSrc}; base-uri ${baseUri}; ${reportUriDirective}`\r\n );\r\n } catch (error) {\r\n console.error(\"Error adding CSP meta element:\", error);\r\n }\r\n };\r\n\r\n if (document.readyState === \"loading\") {\r\n document.addEventListener(\"DOMContentLoaded\", addOrUpdateCSPMeta);\r\n } else {\r\n addOrUpdateCSPMeta();\r\n }\r\n};\r\n","import DOMPurify from \"dompurify\";\r\n\r\ntype TSComponent = (\r\n id: string,\r\n DOM: HTMLElement,\r\n element: Function,\r\n params?: any,\r\n params2?: any\r\n) => void;\r\n\r\nexport const useTSComponent: TSComponent = (\r\n id,\r\n DOM,\r\n element,\r\n params,\r\n params2\r\n) => {\r\n DOMPurify.sanitize(DOM);\r\n element(DOM.querySelector(`#${id}`), params, params2);\r\n};\r\n","type TSSelect = <T extends Element = HTMLElement>(selector: string) => T | null;\r\n\r\nconst useTSSelect: TSSelect = <T extends Element = HTMLElement>(selector: string): T | null => {\r\n const element = document.querySelector<T>(selector);\r\n\r\n if (!element) {\r\n console.warn(`[useTSSelect] No element found for selector: '${selector}'`);\r\n return null;\r\n }\r\n\r\n return element;\r\n};\r\n\r\nexport { useTSSelect };\r\n","import { jwtDecode } from \"jwt-decode\";\r\n\r\nexport const useTSAuth = (_Component: HTMLElement | void, loginUrl: string) => {\r\n const token = localStorage.getItem(\"token\");\r\n\r\n if (!token) {\r\n // Redirect to login page if token is missing\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n\r\n try {\r\n const decodedToken: any = jwtDecode(token);\r\n\r\n // Example: Check if the token has expired\r\n const currentTime = Date.now() / 1000;\r\n if (decodedToken.exp && decodedToken.exp < currentTime) {\r\n console.error(\"Token has expired\");\r\n window.localStorage.removeItem(\"token\");\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n\r\n // If the user is authenticated, return the component\r\n return null;\r\n } catch (error) {\r\n console.error(\"Invalid token:\", error);\r\n // Redirect to login page if token decoding fails\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n};\r\n","\r\ntype TSElementEach = (\r\n elements: NodeListOf<HTMLElement> | HTMLElement[],\r\n events: (keyof HTMLElementEventMap)[],\r\n callback: (element: HTMLElement, event: Event) => void\r\n) => void;\r\n\r\nexport const useTSElementEach: TSElementEach = (\r\n elements,\r\n events,\r\n callback\r\n) => {\r\n elements.forEach(element => {\r\n events.forEach(eventType => {\r\n element.addEventListener(eventType, event => {\r\n callback(element, event);\r\n });\r\n });\r\n });\r\n};\r\n","export const useTSNavigate = () => {\r\n const back = () => window.history.back();\r\n const forward = () => window.history.forward();\r\n\r\n return {\r\n back,\r\n forward,\r\n };\r\n};\r\n","import DOMPurify from \"dompurify\";\r\nimport { tsParamsStore } from \"../../store\";\r\n\r\ntype RouteCallback = (\r\n errorElement?: HTMLElement,\r\n params?: Record<string, string>,\r\n query?: Record<string, string>\r\n) => void;\r\n\r\ninterface RouteConfig {\r\n path: string;\r\n routeto?: string;\r\n element: RouteCallback;\r\n errorElement?: RouteCallback;\r\n children?: RouteConfig[];\r\n params?: Record<string, string>;\r\n}\r\n\r\nexport class TSRouter {\r\n private routes: RouteConfig[] = [];\r\n private expectedParams: Set<string>;\r\n\r\n constructor(routes: RouteConfig[], expectedParams: string[]) {\r\n this.routes = routes;\r\n this.expectedParams = new Set(expectedParams);\r\n window.addEventListener(\"popstate\", this.handlePopState.bind(this));\r\n this.handlePopState(); // Initial load\r\n }\r\n\r\n private handlePopState() {\r\n const currentPath = window.location.pathname;\r\n const currentSearch = window.location.search;\r\n const queryParams = this.parseQueryParams(currentSearch);\r\n\r\n const matchingRoute = this.findMatchingRoute(currentPath, this.routes);\r\n\r\n if (matchingRoute) {\r\n if (matchingRoute.routeto) {\r\n this.navigate(matchingRoute.routeto);\r\n return;\r\n }\r\n\r\n const sanitizedParams = this.filterAndSanitizeParams(matchingRoute.params);\r\n tsParamsStore.getState().setParams(sanitizedParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n const errorElement = document.createElement(\"div\");\r\n\r\n matchingRoute.element?.(errorElement, sanitizedParams, queryParams);\r\n\r\n if (matchingRoute.children) {\r\n const nestedPath = currentPath.slice(matchingRoute.path.length);\r\n const childElement = errorElement.querySelector(\"#child\") as HTMLDivElement;\r\n if (childElement) {\r\n this.renderChildren(\r\n matchingRoute.children,\r\n nestedPath,\r\n childElement,\r\n sanitizedParams,\r\n queryParams\r\n );\r\n }\r\n }\r\n } else {\r\n const notFoundRoute = this.findMatchingRoute(\"*\", this.routes);\r\n if (notFoundRoute) {\r\n const fallbackParams = this.filterAndSanitizeParams(notFoundRoute.params);\r\n tsParamsStore.getState().setParams(fallbackParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n const errorElement = document.createElement(\"div\");\r\n notFoundRoute.element?.(errorElement, fallbackParams, queryParams);\r\n }\r\n }\r\n }\r\n\r\n private renderChildren(\r\n children: RouteConfig[] | undefined,\r\n nestedPath: string,\r\n parentElement: HTMLElement,\r\n parentParams: Record<string, string>,\r\n queryParams: Record<string, string>\r\n ) {\r\n if (!children || children.length === 0) {\r\n const childElement = parentElement.querySelector(\"#child\") as HTMLDivElement;\r\n if (childElement) childElement.remove();\r\n return;\r\n }\r\n\r\n const matchingChild = this.findMatchingRoute(nestedPath, children);\r\n if (matchingChild) {\r\n const childElement = document.createElement(\"div\");\r\n childElement.id = \"child\";\r\n const mergedParams = { ...parentParams, ...matchingChild.params };\r\n const sanitizedParams = this.filterAndSanitizeParams(mergedParams);\r\n\r\n tsParamsStore.getState().setParams(sanitizedParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n matchingChild.element?.(childElement, sanitizedParams, queryParams);\r\n parentElement.appendChild(childElement);\r\n\r\n if (matchingChild.children) {\r\n const nextNestedPath = nestedPath.slice(matchingChild.path.length);\r\n this.renderChildren(\r\n matchingChild.children,\r\n nextNestedPath,\r\n childElement,\r\n sanitizedParams,\r\n queryParams\r\n );\r\n }\r\n }\r\n }\r\n\r\n private parseQueryParams(search: string): Record<string, string> {\r\n const queryParams: Record<string, string> = {};\r\n const urlSearchParams = new URLSearchParams(search);\r\n\r\n for (const [key, value] of urlSearchParams.entries()) {\r\n if (this.expectedParams.has(key)) {\r\n queryParams[key] = DOMPurify.sanitize(value);\r\n }\r\n }\r\n\r\n return queryParams;\r\n }\r\n\r\n private findMatchingRoute(\r\n path: string,\r\n routes: RouteConfig[],\r\n inheritedParams: Record<string, string> = {}\r\n ): RouteConfig | undefined {\r\n for (const route of routes) {\r\n const routePath = route.path;\r\n const isDefaultRoute = routePath === \"*\";\r\n\r\n if (!isDefaultRoute) {\r\n const paramNames: string[] = [];\r\n const regexPattern = routePath.replace(/:[^\\s/]+/g, match => {\r\n paramNames.push(match.substring(1));\r\n return \"([^\\\\s/]+)\";\r\n });\r\n\r\n const regex = new RegExp(`^${regexPattern}(?:/|$)`);\r\n const match = path.match(regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = { ...inheritedParams };\r\n paramNames.forEach((name, index) => {\r\n params[name] = match[index + 1] ?? \"\";\r\n });\r\n\r\n if (route.children) {\r\n const nestedPath = path.slice(match[0].length);\r\n const matchingChild = this.findMatchingRoute(\r\n nestedPath,\r\n route.children,\r\n params\r\n );\r\n if (matchingChild) return matchingChild;\r\n }\r\n\r\n return { ...route, params };\r\n }\r\n } else {\r\n return route;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private filterAndSanitizeParams(\r\n params?: Record<string, string>\r\n ): Record<string, string> {\r\n if (!params) return {};\r\n const sanitizedParams: Record<string, string> = {};\r\n for (const key in params) {\r\n if (this.expectedParams.has(key)) {\r\n sanitizedParams[key] = DOMPurify.sanitize(params[key] ?? \"\");\r\n }\r\n }\r\n return sanitizedParams;\r\n }\r\n\r\n navigate(path: string) {\r\n history.pushState(null, \"\", path);\r\n this.handlePopState();\r\n }\r\n\r\n addRoute(route: RouteConfig) {\r\n this.routes.push(route);\r\n }\r\n}\r\n","import { createStore } from \"zustand/vanilla\";\r\nimport DOMPurify from \"dompurify\";\r\n\r\ninterface TSParamsState {\r\n params: Record<string, string>;\r\n query: Record<string, string>;\r\n setParams: (params: Record<string, string>) => void;\r\n setQuery: (query: Record<string, string>) => void;\r\n}\r\n\r\nexport const tsParamsStore = createStore<TSParamsState>((set) => ({\r\n params: {},\r\n query: {},\r\n setParams: (params) =>\r\n set(() => ({\r\n params: sanitize(params),\r\n })),\r\n setQuery: (query) =>\r\n set(() => ({\r\n query: sanitize(query),\r\n })),\r\n}));\r\n\r\nfunction sanitize(obj: Record<string, string>): Record<string, string> {\r\n const output: Record<string, string> = {};\r\n for (const key in obj) {\r\n output[key] = DOMPurify.sanitize(obj[key]);\r\n }\r\n return output;\r\n}\r\n"],"mappings":"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","names":["html","strings","values","result","str","i","DOMPurify","useTSPurifier","input","config","mergedConfig","useTSEvent","id","eventType","handler","element","createStore","DOMPurify","extractPatternParams","pattern","path","paramNames","regexPattern","match","regex","result","name","i","extractQueryParams","search","urlSearchParams","key","value","useTSParams","set","get","params","query","useTSExtractParams","pattern","store","useTSParams","params","query","useTSEventAll","selector","eventType","handler","elements","element","DOMPurify","useTSElements","htmlElement","element","config","defaultConfig","sanitizedContent","DOMPurify","previousHTML","useInitialDOM","id","mount","targetElement","currentHTML","sanitizedHTML","fallbackEl","sanitizeInput","input","element","useAnchorSingle","href","ariaLabel","className","childElement","sanitizedHref","sanitizedAriaLabel","sanitizedClassName","e","scrollPosition","navEvent","state","debounce","sanitizeInput","input","element","useAnchor","anchors","anchor","originalHref","originalClassName","sanitizedHref","sanitizedClassName","childElement","e","href","error","navEvent","DOMPurify","useTSCSP","scriptSrc","styleSrc","objectSrc","fontSrc","imgSrc","connectSrc","frameSrc","baseUri","reportUri","reportOnly","addOrUpdateCSPMeta","metaElement","reportUriDirective","error","useTSMetaData","config","cspConfig","metaData","DOMPurify","setName","name","updateMetaTag","setDescription","description","setAuthor","author","getName","getDescription","getAuthor","getAllMetaData","createMetaTag","content","metaTag","appendMetaTagsToHead","useTSCSP","DOMPurify","useTSComponent","id","DOM","element","params","params2","useTSSelect","selector","element","jwtDecode","useTSAuth","_Component","loginUrl","token","decodedToken","currentTime","error","useTSElementEach","elements","events","callback","element","eventType","event","useTSNavigate","DOMPurify","createStore","DOMPurify","tsParamsStore","set","params","sanitize","query","obj","output","key","TSRouter","routes","expectedParams","currentPath","currentSearch","queryParams","matchingRoute","sanitizedParams","tsParamsStore","errorElement","nestedPath","childElement","notFoundRoute","fallbackParams","children","parentElement","parentParams","matchingChild","mergedParams","nextNestedPath","search","urlSearchParams","key","value","DOMPurify","path","inheritedParams","route","routePath","paramNames","regexPattern","match","regex","params","name","index"]}
1
+ {"version":3,"sources":["../src/define/html.ts","../src/hooks/useTSPurifier.ts","../src/hooks/useTSEvent.ts","../src/hooks/useTSParams.ts","../src/hooks/useTSExtract.ts","../src/hooks/useTSAllElements.ts","../src/hooks/useTSElements.ts","../src/hooks/useIntialDOM.ts","../src/hooks/useTSAnchorSingle.ts","../src/hooks/useTSAnchor.ts","../src/hooks/useTSMetaData.ts","../src/hooks/useTSCSP.ts","../src/hooks/useTSComponent.ts","../src/hooks/useTSSelect.ts","../src/hooks/useTSAuth.ts","../src/hooks/useTSForEach.ts","../src/hooks/useTSNavigate.ts","../src/hooks/useTSOutlet.ts","../src/routes/class/Router.class.ts","../src/store/useTSParam.store.ts"],"sourcesContent":["export function html(strings: TemplateStringsArray, ...values: any[]): string {\r\n return strings.reduce((result, str, i) => {\r\n return result + str + (values[i] || '');\r\n }, '');\r\n}","import DOMPurify from \"dompurify\";\r\nimport type { Config } from \"dompurify\";\r\n\r\ntype TSPurifier = (input: string | HTMLElement, config?: Config) => string;\r\n\r\nexport const useTSPurifier: TSPurifier = (\r\n input,\r\n config?\r\n) => {\r\n const defaultConfig: Config = {\r\n ADD_TAGS: [\"my-custom-tag\"],\r\n };\r\n\r\n const mergedConfig: Config = { ...defaultConfig, ...config };\r\n\r\n if (typeof input === \"string\") {\r\n return DOMPurify.sanitize(input, mergedConfig);\r\n } else {\r\n return DOMPurify.sanitize(input.innerHTML, mergedConfig);\r\n }\r\n};\r\n","\r\ntype TSEvent = (\r\n id: string,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: HTMLElementEventMap[keyof HTMLElementEventMap]) => void\r\n) => void;\r\n\r\nexport const useTSEvent: TSEvent = (\r\n id,\r\n eventType,\r\n handler\r\n) => {\r\n const element = document.querySelector(`#${id}`);\r\n if (element) {\r\n element.addEventListener(\r\n eventType,\r\n handler as EventListenerOrEventListenerObject\r\n );\r\n } else {\r\n console.warn(`Element with id '${id}' not found.`);\r\n }\r\n};\r\n","// utils/hooks/useTSParams.ts\r\nimport { createStore } from 'zustand/vanilla';\r\nimport DOMPurify from 'dompurify';\r\n\r\ntype ParamStore = {\r\n params: Record<string, string>;\r\n query: Record<string, string>;\r\n setFromPattern: (pattern: MustURL) => void;\r\n getParam: (key: string) => string | undefined;\r\n getQuery: (key: string) => string | undefined;\r\n};\r\n\r\ntype MustURL = `/${string}`;\r\n\r\nfunction extractPatternParams(pattern: MustURL, path: string): Record<string, string> {\r\n const paramNames: string[] = [];\r\n const regexPattern = pattern.replace(/:[^/]+/g, (match) => {\r\n paramNames.push(match.slice(1));\r\n return '([^/]+)';\r\n });\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n const match = path.match(regex);\r\n const result: Record<string, string> = {};\r\n\r\n if (match) {\r\n paramNames.forEach((name, i) => {\r\n result[name] = DOMPurify.sanitize(match[i + 1] ?? '');\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction extractQueryParams(search: MustURL): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n const urlSearchParams = new URLSearchParams(search);\r\n\r\n for (const [key, value] of urlSearchParams.entries()) {\r\n result[key] = DOMPurify.sanitize(value);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport const useTSParams = createStore<ParamStore>((set, get) => ({\r\n params: {},\r\n query: {},\r\n setFromPattern: (pattern: MustURL) => {\r\n const path = window.location.pathname;\r\n const params = extractPatternParams(pattern, path);\r\n const query = extractQueryParams(window.location.search as MustURL);\r\n set({ params, query });\r\n },\r\n getParam: (key: string) => get().params[key],\r\n getQuery: (key: string) => get().query[key],\r\n}));\r\n","import { useTSParams } from './useTSParams';\r\n\r\ntype MustURL = `/${string}`;\r\n\r\nexport function useTSExtractParams(pattern: MustURL) {\r\n const store = useTSParams.getState();\r\n\r\n // Populate internal param/query store\r\n store.setFromPattern(pattern);\r\n\r\n const params = store.params;\r\n const query = store.query;\r\n\r\n return { ...params, ...query };\r\n}\r\n","export const useTSEventAll = <T extends Event>(\r\n selector: string,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: T) => void\r\n) => {\r\n const elements = document.querySelectorAll(selector);\r\n elements.forEach(element => {\r\n element.addEventListener(eventType, handler as EventListener);\r\n });\r\n\r\n return () => {\r\n elements.forEach(element => {\r\n element.removeEventListener(eventType, handler as EventListener);\r\n });\r\n };\r\n};\r\n\r\nexport const useTSEventSelectAll = <T extends Event>(\r\n selectors: string[],\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (event: T) => void\r\n) => {\r\n const elements: NodeListOf<HTMLElement>[] = [];\r\n\r\n selectors.forEach(selector => {\r\n const selectedElements = document.querySelectorAll(\r\n selector\r\n ) as NodeListOf<HTMLElement>;\r\n selectedElements.forEach(element => {\r\n element.addEventListener(eventType, handler as EventListener);\r\n });\r\n elements.push(selectedElements);\r\n });\r\n\r\n return () => {\r\n elements.forEach(nodeList => {\r\n nodeList.forEach(element => {\r\n element.removeEventListener(eventType, handler as EventListener);\r\n });\r\n });\r\n };\r\n};\r\n","import DOMPurify, { Config } from \"dompurify\";\r\n\r\ntype TSElements = (\r\n htmlElement: HTMLElement,\r\n element: string,\r\n config?: Config\r\n) => void;\r\n\r\nexport const useTSElements: TSElements = (\r\n htmlElement,\r\n element,\r\n config\r\n) => {\r\n const defaultConfig: Config = {\r\n ALLOWED_TAGS: ['main', 'div', 'h1', 'p', 'button', 'span', 'a', 'img', 'input'],\r\n ALLOWED_ATTR: ['class', 'id', 'href', 'style', 'src', 'alt'],\r\n ...config, // allow user overrides\r\n };\r\n const sanitizedContent = DOMPurify.sanitize(/*html*/ element, defaultConfig!); // Pass options if provided\r\n\r\n if (htmlElement.innerHTML !== String(sanitizedContent)) {\r\n return (htmlElement.innerHTML = String(sanitizedContent));\r\n }\r\n};\r\n","import DOMPurify from \"dompurify\"\r\n\r\nlet previousHTML: string | null = null\r\n\r\ntype TSInitialDOM = (id: string, mount: (el: HTMLElement) => void) => void;\r\n\r\nexport const useInitialDOM: TSInitialDOM = (id, mount) => {\r\n // SSR guard\r\n if (typeof document === \"undefined\") return\r\n\r\n const targetElement = document.getElementById(id)\r\n if (!targetElement) return\r\n\r\n const currentHTML = targetElement.innerHTML\r\n const sanitizedHTML = DOMPurify.sanitize(currentHTML)\r\n\r\n if (previousHTML !== null && sanitizedHTML !== previousHTML) {\r\n // DOM changed externally — reset and remount in a temp container\r\n const fallbackEl = document.createElement(\"div\")\r\n mount(fallbackEl)\r\n targetElement.innerHTML = previousHTML\r\n } else {\r\n // First time or same sanitized DOM — mount to target\r\n previousHTML = sanitizedHTML\r\n mount(targetElement)\r\n }\r\n}\r\n","\r\ntype SanitizeInput = (input: string) => string;\r\n\r\ntype AnchorSingle = (\r\n element: HTMLElement,\r\n href: string,\r\n ariaLabel: string,\r\n className?: string,\r\n childElement?: HTMLElement | null\r\n) => void;\r\n\r\nconst sanitizeInput: SanitizeInput = (input) => {\r\n const element = document.createElement(\"div\");\r\n element.innerText = input;\r\n return element.innerHTML;\r\n};\r\n\r\nexport const useAnchorSingle: AnchorSingle = (\r\n element,\r\n href,\r\n ariaLabel,\r\n className = \"\",\r\n childElement = null\r\n) => {\r\n if (!element) return;\r\n\r\n const sanitizedHref = sanitizeInput(href);\r\n const sanitizedAriaLabel = sanitizeInput(ariaLabel);\r\n const sanitizedClassName = className ? sanitizeInput(className) : undefined;\r\n\r\n element.setAttribute(\"href\", sanitizedHref);\r\n element.setAttribute(\"aria-label\", sanitizedAriaLabel);\r\n\r\n if (sanitizedClassName) {\r\n element.className = sanitizedClassName;\r\n }\r\n\r\n if (childElement) {\r\n element.innerHTML = \"\";\r\n element.appendChild(childElement);\r\n }\r\n\r\n element.addEventListener(\"click\", e => {\r\n e.preventDefault();\r\n const target = e.currentTarget as HTMLAnchorElement;\r\n const href = target.getAttribute(\"href\");\r\n if (href) {\r\n const scrollPosition = window.scrollY;\r\n window.scrollTo(0, 0);\r\n window.history.pushState({ scrollPosition }, \"\", href);\r\n const navEvent = new PopStateEvent(\"popstate\");\r\n dispatchEvent(navEvent);\r\n }\r\n });\r\n\r\n window.addEventListener(\"popstate\", e => {\r\n const state = e.state as { scrollPosition?: number };\r\n if (state && state.scrollPosition !== undefined) {\r\n window.scrollTo(0, state.scrollPosition);\r\n }\r\n });\r\n};\r\n","import { debounce } from 'lodash-es';\r\n\r\nlet sanitizeInput = (input: string): string => input; // fallback for SSR\r\n\r\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n sanitizeInput = (input: string): string => {\r\n const element = document.createElement(\"div\");\r\n element.innerText = input;\r\n return element.innerHTML;\r\n };\r\n}\r\n\r\nexport const useAnchor = typeof window !== 'undefined'\r\n ? debounce((anchors: NodeListOf<HTMLAnchorElement>) => {\r\n anchors.forEach(anchor => {\r\n if (!anchor) return;\r\n\r\n const originalHref = anchor.getAttribute(\"href\") || \"#\";\r\n const originalClassName = anchor.getAttribute(\"class\") || \"\";\r\n\r\n const sanitizedHref = sanitizeInput(originalHref);\r\n const sanitizedClassName = anchor.getAttribute(\"class\")\r\n ? sanitizeInput(anchor.getAttribute(\"class\")!)\r\n : originalClassName;\r\n\r\n anchor.setAttribute(\"href\", sanitizedHref);\r\n anchor.setAttribute(\"class\", sanitizedClassName);\r\n\r\n if (anchor.getAttribute(\"aria-label\")) {\r\n anchor.setAttribute(\r\n \"aria-label\",\r\n sanitizeInput(anchor.getAttribute(\"aria-label\")!)\r\n );\r\n }\r\n\r\n const childElement = anchor.querySelector(\":scope > *\") as HTMLElement;\r\n if (childElement) {\r\n anchor.innerHTML = \"\";\r\n anchor.appendChild(childElement);\r\n }\r\n\r\n anchor.addEventListener(\"click\", e => {\r\n const target = e.currentTarget as HTMLAnchorElement;\r\n const href = target.getAttribute(\"href\");\r\n\r\n try {\r\n const url = new URL(href!, window.location.href);\r\n if (url.origin !== window.location.origin) return;\r\n } catch (error) {\r\n console.error(\"Invalid URL:\", error);\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n window.history.pushState({}, \"\", href);\r\n const navEvent = new PopStateEvent(\"popstate\");\r\n window.dispatchEvent(navEvent);\r\n });\r\n });\r\n })\r\n : () => { }; // SSR-safe no-op\r\n","import DOMPurify from \"dompurify\";\r\nimport { useTSCSP } from \"./useTSCSP\";\r\n\r\ntype SEOConfig = {\r\n name?: string;\r\n description?: string;\r\n author?: string;\r\n}\r\n\r\ntype CSPConfig = {\r\n scriptSrc?: string;\r\n styleSrc?: string;\r\n objectSrc?: string;\r\n connectSrc?: string[];\r\n reportOnly?: boolean;\r\n}\r\n\r\ntype SEOHandler = {\r\n setName: (name: string) => void;\r\n setDescription: (description: string) => void;\r\n setAuthor: (author: string) => void;\r\n getName: () => string;\r\n getDescription: () => string;\r\n getAuthor: () => string;\r\n getAllMetaData: () => SEOConfig;\r\n appendMetaTagsToHead: () => void;\r\n}\r\n\r\nexport const useTSMetaData = (\r\n config: SEOConfig,\r\n cspConfig?: CSPConfig\r\n): SEOHandler => {\r\n let metaData: SEOConfig = {\r\n name: DOMPurify.sanitize(config.name || \"\"),\r\n description: DOMPurify.sanitize(\r\n config.description || \"Default description\"\r\n ),\r\n author: DOMPurify.sanitize(config.author || \"\"),\r\n };\r\n\r\n const setName = (name: string): void => {\r\n metaData.name = DOMPurify.sanitize(name);\r\n updateMetaTag(\"name\", metaData.name);\r\n };\r\n\r\n const setDescription = (description: string): void => {\r\n metaData.description = DOMPurify.sanitize(description);\r\n updateMetaTag(\"description\", metaData.description);\r\n };\r\n\r\n const setAuthor = (author: string): void => {\r\n metaData.author = DOMPurify.sanitize(author);\r\n updateMetaTag(\"author\", metaData.author);\r\n };\r\n\r\n const getName = (): string => {\r\n return metaData.name!;\r\n };\r\n\r\n const getDescription = (): string => {\r\n return metaData.description!;\r\n };\r\n\r\n const getAuthor = (): string => {\r\n return metaData.author!;\r\n };\r\n\r\n const getAllMetaData = (): SEOConfig => {\r\n return metaData;\r\n };\r\n\r\n const createMetaTag = (name: string, content: string) => {\r\n const metaTag = document.createElement(\"meta\");\r\n metaTag.setAttribute(\"name\", name);\r\n metaTag.setAttribute(\"content\", content);\r\n document.head.appendChild(metaTag);\r\n };\r\n\r\n const updateMetaTag = (name: string, content: string) => {\r\n let metaTag = document.querySelector(`meta[name=\"${name}\"]`);\r\n if (metaTag) {\r\n metaTag.setAttribute(\"content\", content);\r\n } else {\r\n createMetaTag(name, content);\r\n }\r\n };\r\n\r\n const appendMetaTagsToHead = () => {\r\n updateMetaTag(\"name\", metaData.name!);\r\n updateMetaTag(\"description\", metaData.description!);\r\n updateMetaTag(\"author\", metaData.author!);\r\n };\r\n\r\n // Integrate with useTSCSP for CSP enforcement\r\n if (cspConfig) {\r\n useTSCSP(\r\n cspConfig.scriptSrc,\r\n cspConfig.styleSrc,\r\n cspConfig.objectSrc,\r\n Array.isArray(cspConfig.connectSrc) ? cspConfig.connectSrc.join(\" \") : cspConfig.connectSrc,\r\n cspConfig.reportOnly !== undefined ? String(cspConfig.reportOnly) : undefined\r\n );\r\n }\r\n\r\n appendMetaTagsToHead();\r\n\r\n return {\r\n setName,\r\n setDescription,\r\n setAuthor,\r\n getName,\r\n getDescription,\r\n getAuthor,\r\n getAllMetaData,\r\n appendMetaTagsToHead,\r\n };\r\n};\r\n","export const useTSCSP = (\r\n scriptSrc = `'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'`,\r\n styleSrc = \"'self' 'nonce-rAnd0m123'\", // Use nonce for inline styles\r\n objectSrc = \"'none'\",\r\n fontSrc = \"'self' https://fonts.googleapis.com https://fonts.gstatic.com\",\r\n imgSrc = \"'self' https://blogger.googleusercontent.com\",\r\n connectSrc = [\r\n \"'self'\",\r\n \"https://fonts.googleapis.com\",\r\n \"https://fonts.gstatic.com\",\r\n \"https://www.google.com/maps/\",\r\n ],\r\n frameSrc = \"'self' https://www.youtube.com\", // Add frame-src for embedding\r\n baseUri = \"'self'\",\r\n reportUri = \"/csp-report\",\r\n reportOnly = false\r\n) => {\r\n const addOrUpdateCSPMeta = () => {\r\n try {\r\n let metaElement = document.querySelector(\r\n 'meta[http-equiv=\"Content-Security-Policy\"]'\r\n );\r\n if (!metaElement) {\r\n metaElement = document.createElement(\"meta\");\r\n metaElement.setAttribute(\"http-equiv\", \"Content-Security-Policy\");\r\n document.head.appendChild(metaElement);\r\n }\r\n\r\n const reportUriDirective = reportOnly ? `report-uri ${reportUri};` : \"\";\r\n metaElement.setAttribute(\r\n \"content\",\r\n `default-src 'self'; script-src ${scriptSrc}; style-src ${styleSrc}; object-src ${objectSrc}; font-src ${fontSrc}; img-src ${imgSrc}; connect-src ${connectSrc.join(\r\n \" \"\r\n )}; frame-src ${frameSrc}; base-uri ${baseUri}; ${reportUriDirective}`\r\n );\r\n } catch (error) {\r\n console.error(\"Error adding CSP meta element:\", error);\r\n }\r\n };\r\n\r\n if (document.readyState === \"loading\") {\r\n document.addEventListener(\"DOMContentLoaded\", addOrUpdateCSPMeta);\r\n } else {\r\n addOrUpdateCSPMeta();\r\n }\r\n};\r\n","import DOMPurify from \"dompurify\";\r\n\r\ntype TSComponent = (\r\n id: string,\r\n DOM: HTMLElement,\r\n element: Function,\r\n params?: any,\r\n params2?: any\r\n) => void;\r\n\r\nexport const useTSComponent: TSComponent = (\r\n id,\r\n DOM,\r\n element,\r\n params,\r\n params2\r\n) => {\r\n DOMPurify.sanitize(DOM);\r\n element(DOM.querySelector(`#${id}`), params, params2);\r\n};\r\n","type TSSelect = <T extends Element = HTMLElement>(selector: string) => T | null;\r\n\r\nconst useTSSelect: TSSelect = <T extends Element = HTMLElement>(selector: string): T | null => {\r\n const element = document.querySelector<T>(selector);\r\n\r\n if (!element) {\r\n console.warn(`[useTSSelect] No element found for selector: '${selector}'`);\r\n return null;\r\n }\r\n\r\n return element;\r\n};\r\n\r\nexport { useTSSelect };\r\n","import { jwtDecode } from \"jwt-decode\";\r\n\r\nexport const useTSAuth = (_Component: HTMLElement | void, loginUrl: string) => {\r\n const token = localStorage.getItem(\"token\");\r\n\r\n if (!token) {\r\n // Redirect to login page if token is missing\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n\r\n try {\r\n const decodedToken: any = jwtDecode(token);\r\n\r\n // Example: Check if the token has expired\r\n const currentTime = Date.now() / 1000;\r\n if (decodedToken.exp && decodedToken.exp < currentTime) {\r\n console.error(\"Token has expired\");\r\n window.localStorage.removeItem(\"token\");\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n\r\n // If the user is authenticated, return the component\r\n return null;\r\n } catch (error) {\r\n console.error(\"Invalid token:\", error);\r\n // Redirect to login page if token decoding fails\r\n window.location.href = loginUrl;\r\n return null; // Return null when redirecting\r\n }\r\n};\r\n","\r\ntype TSElementEach = (\r\n elements: NodeListOf<HTMLElement> | HTMLElement[],\r\n events: (keyof HTMLElementEventMap)[],\r\n callback: (element: HTMLElement, event: Event) => void\r\n) => void;\r\n\r\nexport const useTSElementEach: TSElementEach = (\r\n elements,\r\n events,\r\n callback\r\n) => {\r\n elements.forEach(element => {\r\n events.forEach(eventType => {\r\n element.addEventListener(eventType, event => {\r\n callback(element, event);\r\n });\r\n });\r\n });\r\n};\r\n","export const useTSNavigate = () => {\r\n const back = () => window.history.back();\r\n const forward = () => window.history.forward();\r\n\r\n return {\r\n back,\r\n forward,\r\n };\r\n};\r\n","export const useTSOutlet = (\r\n selector: string,\r\n childComponent: (DOM: HTMLElement) => void\r\n) => {\r\n const outlet = document.querySelector<HTMLElement>(selector);\r\n if (outlet) childComponent(outlet);\r\n};\r\n","import DOMPurify from \"dompurify\";\r\nimport { tsParamsStore } from \"../../store\";\r\n\r\ntype RouteCallback = (\r\n errorElement?: HTMLElement,\r\n params?: Record<string, string>,\r\n query?: Record<string, string>\r\n) => void;\r\n\r\ninterface RouteConfig {\r\n path: string;\r\n routeto?: string;\r\n element: RouteCallback;\r\n errorElement?: RouteCallback;\r\n children?: RouteConfig[];\r\n params?: Record<string, string>;\r\n}\r\n\r\nexport class TSRouter {\r\n private routes: RouteConfig[] = [];\r\n private expectedParams: Set<string>;\r\n\r\n constructor(routes: RouteConfig[], expectedParams: string[]) {\r\n this.routes = routes;\r\n this.expectedParams = new Set(expectedParams);\r\n window.addEventListener(\"popstate\", this.handlePopState.bind(this));\r\n this.handlePopState(); // Initial load\r\n }\r\n\r\n private handlePopState() {\r\n const currentPath = window.location.pathname;\r\n const currentSearch = window.location.search;\r\n const queryParams = this.parseQueryParams(currentSearch);\r\n\r\n const matchingRoute = this.findMatchingRoute(currentPath, this.routes);\r\n\r\n if (matchingRoute) {\r\n if (matchingRoute.routeto) {\r\n this.navigate(matchingRoute.routeto);\r\n return;\r\n }\r\n\r\n const sanitizedParams = this.filterAndSanitizeParams(matchingRoute.params);\r\n tsParamsStore.getState().setParams(sanitizedParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n const errorElement = document.createElement(\"div\");\r\n\r\n matchingRoute.element?.(errorElement, sanitizedParams, queryParams);\r\n\r\n if (matchingRoute.children) {\r\n const nestedPath = currentPath.slice(matchingRoute.path.length);\r\n const childElement = errorElement.querySelector(\"#child\") as HTMLDivElement;\r\n if (childElement) {\r\n this.renderChildren(\r\n matchingRoute.children,\r\n nestedPath,\r\n childElement,\r\n sanitizedParams,\r\n queryParams\r\n );\r\n }\r\n }\r\n } else {\r\n const notFoundRoute = this.findMatchingRoute(\"*\", this.routes);\r\n if (notFoundRoute) {\r\n const fallbackParams = this.filterAndSanitizeParams(notFoundRoute.params);\r\n tsParamsStore.getState().setParams(fallbackParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n const errorElement = document.createElement(\"div\");\r\n notFoundRoute.element?.(errorElement, fallbackParams, queryParams);\r\n }\r\n }\r\n }\r\n\r\n private renderChildren(\r\n children: RouteConfig[] | undefined,\r\n nestedPath: string,\r\n parentElement: HTMLElement,\r\n parentParams: Record<string, string>,\r\n queryParams: Record<string, string>\r\n ) {\r\n if (!children || children.length === 0) {\r\n const childElement = parentElement.querySelector(\"#child\") as HTMLDivElement;\r\n if (childElement) childElement.remove();\r\n return;\r\n }\r\n\r\n const matchingChild = this.findMatchingRoute(nestedPath, children);\r\n if (matchingChild) {\r\n const childElement = document.createElement(\"div\");\r\n childElement.id = \"child\";\r\n const mergedParams = { ...parentParams, ...matchingChild.params };\r\n const sanitizedParams = this.filterAndSanitizeParams(mergedParams);\r\n\r\n tsParamsStore.getState().setParams(sanitizedParams);\r\n tsParamsStore.getState().setQuery(queryParams);\r\n\r\n matchingChild.element?.(childElement, sanitizedParams, queryParams);\r\n parentElement.appendChild(childElement);\r\n\r\n if (matchingChild.children) {\r\n const nextNestedPath = nestedPath.slice(matchingChild.path.length);\r\n this.renderChildren(\r\n matchingChild.children,\r\n nextNestedPath,\r\n childElement,\r\n sanitizedParams,\r\n queryParams\r\n );\r\n }\r\n }\r\n }\r\n\r\n private parseQueryParams(search: string): Record<string, string> {\r\n const queryParams: Record<string, string> = {};\r\n const urlSearchParams = new URLSearchParams(search);\r\n\r\n for (const [key, value] of urlSearchParams.entries()) {\r\n if (this.expectedParams.has(key)) {\r\n queryParams[key] = DOMPurify.sanitize(value);\r\n }\r\n }\r\n\r\n return queryParams;\r\n }\r\n\r\n private findMatchingRoute(\r\n path: string,\r\n routes: RouteConfig[],\r\n inheritedParams: Record<string, string> = {}\r\n ): RouteConfig | undefined {\r\n for (const route of routes) {\r\n const routePath = route.path;\r\n const isDefaultRoute = routePath === \"*\";\r\n\r\n if (!isDefaultRoute) {\r\n const paramNames: string[] = [];\r\n const regexPattern = routePath.replace(/:[^\\s/]+/g, match => {\r\n paramNames.push(match.substring(1));\r\n return \"([^\\\\s/]+)\";\r\n });\r\n\r\n const regex = new RegExp(`^${regexPattern}(?:/|$)`);\r\n const match = path.match(regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = { ...inheritedParams };\r\n paramNames.forEach((name, index) => {\r\n params[name] = match[index + 1] ?? \"\";\r\n });\r\n\r\n if (route.children) {\r\n const nestedPath = path.slice(match[0].length);\r\n const matchingChild = this.findMatchingRoute(\r\n nestedPath,\r\n route.children,\r\n params\r\n );\r\n if (matchingChild) return matchingChild;\r\n }\r\n\r\n return { ...route, params };\r\n }\r\n } else {\r\n return route;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private filterAndSanitizeParams(\r\n params?: Record<string, string>\r\n ): Record<string, string> {\r\n if (!params) return {};\r\n const sanitizedParams: Record<string, string> = {};\r\n for (const key in params) {\r\n if (this.expectedParams.has(key)) {\r\n sanitizedParams[key] = DOMPurify.sanitize(params[key] ?? \"\");\r\n }\r\n }\r\n return sanitizedParams;\r\n }\r\n\r\n navigate(path: string) {\r\n history.pushState(null, \"\", path);\r\n this.handlePopState();\r\n }\r\n\r\n addRoute(route: RouteConfig) {\r\n this.routes.push(route);\r\n }\r\n}\r\n","import { createStore } from \"zustand/vanilla\";\r\nimport DOMPurify from \"dompurify\";\r\n\r\ninterface TSParamsState {\r\n params: Record<string, string>;\r\n query: Record<string, string>;\r\n setParams: (params: Record<string, string>) => void;\r\n setQuery: (query: Record<string, string>) => void;\r\n}\r\n\r\nexport const tsParamsStore = createStore<TSParamsState>((set) => ({\r\n params: {},\r\n query: {},\r\n setParams: (params) =>\r\n set(() => ({\r\n params: sanitize(params),\r\n })),\r\n setQuery: (query) =>\r\n set(() => ({\r\n query: sanitize(query),\r\n })),\r\n}));\r\n\r\nfunction sanitize(obj: Record<string, string>): Record<string, string> {\r\n const output: Record<string, string> = {};\r\n for (const key in obj) {\r\n output[key] = DOMPurify.sanitize(obj[key]);\r\n }\r\n return output;\r\n}\r\n"],"mappings":"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","names":["html","strings","values","result","str","i","DOMPurify","useTSPurifier","input","config","mergedConfig","useTSEvent","id","eventType","handler","element","createStore","DOMPurify","extractPatternParams","pattern","path","paramNames","regexPattern","match","regex","result","name","i","extractQueryParams","search","urlSearchParams","key","value","useTSParams","set","get","params","query","useTSExtractParams","pattern","store","useTSParams","params","query","useTSEventAll","selector","eventType","handler","elements","element","DOMPurify","useTSElements","htmlElement","element","config","defaultConfig","sanitizedContent","DOMPurify","previousHTML","useInitialDOM","id","mount","targetElement","currentHTML","sanitizedHTML","fallbackEl","sanitizeInput","input","element","useAnchorSingle","href","ariaLabel","className","childElement","sanitizedHref","sanitizedAriaLabel","sanitizedClassName","e","scrollPosition","navEvent","state","debounce","sanitizeInput","input","element","useAnchor","anchors","anchor","originalHref","originalClassName","sanitizedHref","sanitizedClassName","childElement","e","href","error","navEvent","DOMPurify","useTSCSP","scriptSrc","styleSrc","objectSrc","fontSrc","imgSrc","connectSrc","frameSrc","baseUri","reportUri","reportOnly","addOrUpdateCSPMeta","metaElement","reportUriDirective","error","useTSMetaData","config","cspConfig","metaData","DOMPurify","setName","name","updateMetaTag","setDescription","description","setAuthor","author","getName","getDescription","getAuthor","getAllMetaData","createMetaTag","content","metaTag","appendMetaTagsToHead","useTSCSP","DOMPurify","useTSComponent","id","DOM","element","params","params2","useTSSelect","selector","element","jwtDecode","useTSAuth","_Component","loginUrl","token","decodedToken","currentTime","error","useTSElementEach","elements","events","callback","element","eventType","event","useTSNavigate","useTSOutlet","selector","childComponent","outlet","DOMPurify","createStore","DOMPurify","tsParamsStore","set","params","sanitize","query","obj","output","key","TSRouter","routes","expectedParams","currentPath","currentSearch","queryParams","matchingRoute","sanitizedParams","tsParamsStore","errorElement","nestedPath","childElement","notFoundRoute","fallbackParams","children","parentElement","parentParams","matchingChild","mergedParams","nextNestedPath","search","urlSearchParams","key","value","DOMPurify","path","inheritedParams","route","routePath","paramNames","regexPattern","match","regex","params","name","index"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devwareng/vanilla-ts",
3
- "version": "1.1.47",
3
+ "version": "1.1.48",
4
4
  "description": "Framework-less TypeScript hooks for SPA development.",
5
5
  "author": "Waren Arapoc Gador",
6
6
  "license": "MIT",
@@ -41,4 +41,4 @@
41
41
  "tsup": "^8.5.0",
42
42
  "typescript": "^5.3.0"
43
43
  }
44
- }
44
+ }