@devwareng/vanilla-ts 1.4.47 → 1.4.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,4 +1,4 @@
1
- "use strict";var Me=Object.create;var C=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames;var Pe=Object.getPrototypeOf,xe=Object.prototype.hasOwnProperty;var De=(t,e)=>{for(var n in e)C(t,n,{get:e[n],enumerable:!0})},ue=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ae(e))!xe.call(t,o)&&o!==n&&C(t,o,{get:()=>e[o],enumerable:!(r=Re(e,o))||r.enumerable});return t};var E=(t,e,n)=>(n=t!=null?Me(Pe(t)):{},ue(e||!t||!t.__esModule?C(n,"default",{value:t,enumerable:!0}):n,t)),He=t=>ue(C({},"__esModule",{value:!0}),t);var Fe={};De(Fe,{TSFilebasedRouter:()=>we,TSRouter:()=>N,createEffect:()=>ne,createSignal:()=>te,html:()=>F,loadPyFiles:()=>ie,mapper:()=>me,renderChildRoutes:()=>ee,useAnchor:()=>O,useAnchorSingle:()=>G,useInitialDOM:()=>B,useTSAnchorMount:()=>oe,useTSAuth:()=>Y,useTSCollection:()=>J,useTSComponent:()=>x,useTSElementEach:()=>D,useTSElements:()=>W,useTSEvent:()=>_,useTSEventAll:()=>j,useTSExtractParams:()=>U,useTSHashAnchor:()=>H,useTSLazy:()=>ae,useTSMetaData:()=>V,useTSNavigate:()=>K,useTSNoReload:()=>b,useTSOutlet:()=>Z,useTSParams:()=>P,useTSPurifier:()=>I,useTSSSRHydration:()=>ce,useTSSelect:()=>X,useTSloadBrython:()=>se});module.exports=He(Fe);function Oe(t){return(t==null?"":String(t)).replace(/<\s*(script|iframe|object|embed|link|style)[^>]*>.*?<\s*\/\s*\1\s*>/gi,"").replace(/<\s*(script|iframe|object|embed|link|style)[^>]*>/gi,"").replace(/\son\w+\s*=\s*(['"]).*?\1/gi,"").replace(/\s(href|src)\s*=\s*(['"])\s*javascript:[^'"]*\2/gi,"")}function F(t,...e){return t.reduce((n,r,o)=>{let s=o<e.length?Oe(e[o]):"";return n+r+s},"")}var be=t=>t.replace(/<\/?(script|iframe|object|embed|link|meta|style)[^>]*>/gi,"").replace(/\s+on[a-z]+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi,"").replace(/\s+(href|src)\s*=\s*(['"]?)\s*javascript:[^'"\s>]*/gi,""),me=t=>t?.map(e=>be(e)).join("")??"";var z=E(require("dompurify"),1),I=(t,e)=>{let r={...{ADD_TAGS:["my-custom-tag"]},...e};return typeof t=="string"?z.default.sanitize(t,r):z.default.sanitize(t.innerHTML,r)};var _=(t,e,n)=>{if(typeof t=="string"){let r=document.getElementById(t);r?r.addEventListener(e,n):console.warn(`Element with id '${t}' not found.`)}else t===document?document.addEventListener(e,n):console.warn("Invalid id parameter provided.")};var de=require("zustand/vanilla"),q=E(require("dompurify"),1);function Ce(t,e){let n=[],r=t.replace(/:[^/]+/g,a=>(n.push(a.slice(1)),"([^/]+)")),o=new RegExp(`^${r}$`),s=e.match(o),i={};return s&&n.forEach((a,c)=>{i[a]=q.default.sanitize(s[c+1]??"")}),i}function $e(t){let e={},n=new URLSearchParams(t);for(let[r,o]of n.entries())e[r]=q.default.sanitize(o);return e}var P=(0,de.createStore)((t,e)=>({params:{},query:{},setFromPattern:n=>{let r=window.location.pathname,o=Ce(n,r),s=$e(window.location.search);t({params:o,query:s})},getParam:n=>e().params[n],getQuery:n=>e().query[n]}));function U(t){let e=P.getState();e.setFromPattern(t);let n=e.params,r=e.query;return{...n,...r}}var j=(t,e,n)=>{let r=document.querySelectorAll(t);return r.forEach(o=>{o.addEventListener(e,n)}),()=>{r.forEach(o=>{o.removeEventListener(e,n)})}};var $=E(require("dompurify"),1),W=(t,e,n,r={})=>{let o={USE_PROFILES:{svg:!0,html:!0},ALLOWED_TAGS:["svg","path","circle","rect","line","polyline","polygon","g","main","div","h1","h2","h3","h4","h5","h6","p","button","span","a","img","input","ul","li","i"],ALLOWED_ATTR:["class","id","href","src","alt","fill","stroke","stroke-width","viewBox","xmlns","d","x","y","cx","cy","r","width","height","data-onclick","data-onchange","data-onselect"],FORBID_TAGS:["script","iframe"],ALLOWED_URI_REGEXP:/^(?:(?:https?|mailto|tel|ftp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,...n};$.default.addHook("uponSanitizeElement",(i,a)=>{let c=a.tagName.toLowerCase();c.includes("-")&&(a.allowedTags[c]=!0)}),$.default.addHook("uponSanitizeAttribute",(i,a)=>{a.attrName&&a.attrName.toLowerCase().startsWith("on")&&(a.keepAttr=!1)});let s=$.default.sanitize(e,o);t.innerHTML=s,t.querySelectorAll("[data-onclick]").forEach(i=>{let a=i.dataset.onclick;r[a]&&i.addEventListener("click",r[a])}),t.querySelectorAll("[data-onchange]").forEach(i=>{let a=i.dataset.onchange;r[a]&&i.addEventListener("change",r[a])}),t.querySelectorAll("[data-onselect]").forEach(i=>{let a=i.dataset.onselect;r[a]&&i.addEventListener("select",r[a])})};var pe=E(require("dompurify"),1),k=null,B=(t,e)=>{if(typeof document>"u")return;let n=document.getElementById(t);if(!n)return;let r=n.innerHTML,s=pe.default.sanitize(r,{ALLOWED_TAGS:["div","span","p","h1","h2","h3","h4","h5","h6","ul","ol","li","strong","em","a","img","br"],ALLOWED_ATTR:["href","src","alt","title","class","id","data-onclick","data-onchange"],ALLOW_DATA_ATTR:!1,KEEP_CONTENT:!1}).replace(/\b(href|src)=["']?(?!https?:|mailto:|\/|#)/gi,'$1="#"');if(k!==null&&s!==k){let i=document.createElement("div");e(i),n.innerHTML=k}else k=s,n.innerHTML=s,e(n)};var Q=E(require("dompurify"),1);typeof window<"u"&&!window.__anchorSinglePopstateHandlerAttached&&(window.addEventListener("popstate",t=>{let e=t.state;e?.scrollPosition!==void 0&&window.scrollTo(0,e.scrollPosition)}),window.__anchorSinglePopstateHandlerAttached=!0);var G=(t,e,n,r="",o=null)=>{if(!t)return;let s=Q.default.sanitize(e,{ALLOWED_URI_REGEXP:/^(https?:|\/)/}),i=Q.default.sanitize(n,{USE_PROFILES:{html:!1}});t.setAttribute("href",s),t.setAttribute("aria-label",i),r&&(t.className=r.trim()),o&&t.replaceChildren(o),typeof window<"u"&&t.addEventListener("click",a=>{a.preventDefault();let l=a.currentTarget.getAttribute("href");if(l){let h=window.scrollY;window.scrollTo(0,0),window.history.pushState({scrollPosition:h},"",l),dispatchEvent(new PopStateEvent("popstate"))}})};var A=E(require("dompurify"),1);var fe=(t="'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'",e="'self' 'nonce-rAnd0m123'",n="'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/"],i="'self' https://www.youtube.com",a="'self'",c="/csp-report",l=!1)=>{let h=()=>{try{let u=document.querySelector('meta[http-equiv="Content-Security-Policy"]');u||(u=document.createElement("meta"),u.setAttribute("http-equiv","Content-Security-Policy"),document.head.appendChild(u));let y=l?`report-uri ${c};`:"";u.setAttribute("content",`default-src 'self'; script-src ${t}; style-src ${e}; object-src ${n}; font-src ${r}; img-src ${o}; connect-src ${s.join(" ")}; frame-src ${i}; base-uri ${a}; ${y}`)}catch(u){console.error("Error adding CSP meta element:",u)}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",h):h()};var V=(t,e)=>{let n={name:A.default.sanitize(t.name||""),description:A.default.sanitize(t.description||"Default description"),author:A.default.sanitize(t.author||"")},r=p=>{n.name=A.default.sanitize(p),u("name",n.name)},o=p=>{n.description=A.default.sanitize(p),u("description",n.description)},s=p=>{n.author=A.default.sanitize(p),u("author",n.author)},i=()=>n.name,a=()=>n.description,c=()=>n.author,l=()=>n,h=(p,R)=>{let v=document.createElement("meta");v.setAttribute("name",p),v.setAttribute("content",R),document.head.appendChild(v)},u=(p,R)=>{let v=document.querySelector(`meta[name="${p}"]`);v?v.setAttribute("content",R):h(p,R)},y=()=>{u("name",n.name),u("description",n.description),u("author",n.author)};return e&&fe(e.scriptSrc,e.styleSrc,e.objectSrc,Array.isArray(e.connectSrc)?e.connectSrc.join(" "):e.connectSrc,e.reportOnly!==void 0?String(e.reportOnly):void 0),y(),{setName:r,setDescription:o,setAuthor:s,getName:i,getDescription:a,getAuthor:c,getAllMetaData:l,appendMetaTagsToHead:y}};var he=E(require("dompurify"),1),x=(t,e,n,r,o)=>{let s=`#${t}`,i=e.querySelectorAll(s);if(i.length===0)throw new Error(`[useTSComponent] No element found with id '${t}' in the given parent.`);if(i.length>1)throw new Error(`[useTSComponent] Duplicate id '${t}' detected. Found ${i.length} elements.`);let a=i[0];a.innerHTML=he.default.sanitize(a.innerHTML,{USE_PROFILES:{html:!0}}),n(a,r,o)};var J=(t,e,n,r=[])=>{let o=new Set;t.forEach((s,i)=>{if(o.has(s)){console.warn(`[useTSCollection] Duplicate ID in collection array: "${s}" \u2014 skipping.`);return}o.add(s);let a=e.querySelectorAll(`#${s}`);if(a.length>1){console.warn(`[useTSCollection] Duplicate ID in DOM: "${s}" (${a.length} elements found) \u2014 skipping component mount.`);return}let c=n[i],l=Array.isArray(r)?r[i]:void 0;typeof c=="function"?x(s,e,c,l):console.warn(`[useTSCollection] No valid component function found for ID: "${s}"`)})};var X=(t,e)=>{let r=(e??document).querySelectorAll(t);if(r.length===0)return process.env.NODE_ENV!=="production"&&console.warn(`[useTSSelect] No element found for selector: '${t}'`),null;if(t.startsWith("#")&&r.length>1){if(process.env.NODE_ENV!=="production")throw new Error(`[useTSSelect] Duplicate ID detected: '${t}'. Found ${r.length} elements with this ID.`);return r[0]}return r.length>1&&process.env.NODE_ENV!=="production"&&console.warn(`[useTSSelect] Multiple elements found for selector: '${t}'. Returning the first one.`),r[0]};var ge=require("jwt-decode"),Y=(t,e)=>{let n=localStorage.getItem("token");if(!n)return window.location.href=e,null;try{let r=(0,ge.jwtDecode)(n),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 D=(t,e,n)=>{t.forEach(r=>{e.forEach(o=>{r.addEventListener(o,s=>{n(r,s)})})})};var K=()=>({back:()=>window.history.back(),forward:()=>window.history.forward()});var Z=(t,e)=>{let n=document.querySelector(`#${t}`)||document.querySelector(`.${t}`);if(!n)return;let r=window.location.pathname.replace(/\/$/,"");for(let o of e){let s=o.path.replace(/\/$/,"");if(r===s||r.startsWith(`${s}/`)){o.component(n);break}}};function ee(t,e){let n=window.location.pathname.replace(/\/$/,"");e.routes.forEach(r=>{r.children?.length&&r.children.forEach(o=>{let s=o.path.replace(/\/$/,"");if(n===s||n.startsWith(`${s}/`)){let i=t.querySelector(`#${o.outlet}`)||t.querySelector(`.${o.outlet}`);i instanceof HTMLElement&&o.element&&o.element(i)}})})}var Te=require("zustand/vanilla");function te(t){let e=(0,Te.createStore)(()=>({value:t})),n=new Set;return{get:()=>e.getState().value,set:r=>{e.setState({value:r}),n.forEach(o=>o(r))},subscribe:r=>(n.add(r),r(e.getState().value),()=>n.delete(r))}}function ne(t){let e=t();typeof e=="function"&&e()}var H=()=>{let t=document.querySelectorAll('a[href^="#"]');D(t,["click"],(e,n)=>{n.preventDefault();let r=e.getAttribute("href")?.substring(1),o=r?document.getElementById(r):null;o&&o.scrollIntoView({behavior:"smooth",block:"start"})})};var Se=require("lodash-es"),re=t=>t;typeof window<"u"&&typeof document<"u"&&(re=t=>{let e=document.createElement("div");return e.innerText=t,e.innerHTML});var ke=t=>{(t?Array.isArray(t)?t:t instanceof HTMLAnchorElement?[t]:Array.from(t):Array.from(document.querySelectorAll("a"))).forEach(n=>{if(!n||n.dataset.anchorEnhanced==="true")return;n.dataset.anchorEnhanced="true";let r=n.getAttribute("class")||"";n.setAttribute("class",re(r));let o=n.getAttribute("aria-label");o&&n.setAttribute("aria-label",re(o));let s=n.querySelector(":scope > *");s&&(n.innerHTML="",n.appendChild(s));let i=n.getAttribute("href")||"";if(!i.startsWith("#")){try{if(new URL(i,window.location.href).origin!==window.location.origin)return}catch{return}n.addEventListener("click",a=>{a.preventDefault();let c=n.getAttribute("href")||"";try{let l=new URL(c,window.location.href);window.history.pushState({},"",l.pathname+l.search+l.hash),window.dispatchEvent(new PopStateEvent("popstate"))}catch(l){console.error("Invalid URL in anchor:",c,l)}})}})},Ne=(0,Se.debounce)(ke,50),O=t=>{Ne(t)};var b=t=>{let e=t.querySelectorAll("a");O(e)};var oe=t=>{H(),b(t)};var se=async()=>{let t="https://cdn.jsdelivr.net/npm/brython@3/brython.min.js",e="https://cdn.jsdelivr.net/npm/brython@3/brython_stdlib.js",n=r=>new Promise((o,s)=>{let i=document.createElement("script");i.src=r,i.onload=()=>o(),i.onerror=()=>s(new Error(`Failed to load ${r}`)),document.head.appendChild(i)});await n(t),await n(e),typeof window.brython=="function"?window.brython():console.error("Brython did not load correctly.")},ie=t=>new Promise((e,n)=>{let r=document.createElement("script");r.type="text/python",r.src=`/src/python/${t}`,r.onload=()=>e(),r.onerror=()=>n(new Error(`Failed to load ${t}`)),document.body.appendChild(r)});function ae(t){let e=null;return async(n,r)=>{try{if(!e){let o=await t();e=o.default||o}if(typeof e=="function")return e(n,r);if(e instanceof HTMLElement){n?.appendChild(e);return}if(e&&typeof e.render=="function")return e.render(n,r);console.warn("useTSLazy: Unsupported module type",e)}catch(o){console.error("useTSLazy failed:",o)}}}var ce=t=>typeof window>"u"?{isDOM:null}:{isDOM:t||document.body};var le=E(require("dompurify"),1);var ye=require("zustand/vanilla"),ve=E(require("dompurify"),1),M=(0,ye.createStore)(t=>({params:{},query:{},setParams:e=>t(()=>({params:Ee(e)})),setQuery:e=>t(()=>({query:Ee(e)}))}));function Ee(t){let e={};for(let n in t)e[n]=ve.default.sanitize(t[n]);return e}var N=class{constructor(e,n){this.routes=[];this.routes=e,this.expectedParams=new Set(n),window.addEventListener("popstate",this.handlePopState.bind(this)),this.handlePopState()}handlePopState(){let e=window.location.pathname,n=window.location.search,r=this.parseQueryParams(n),o=this.findMatchingRoute(e,this.routes);if(o){if(o.routeto){this.navigate(o.routeto);return}let s=this.filterAndSanitizeParams(o.params);M.getState().setParams(s),M.getState().setQuery(r);let i=document.createElement("div");if(o.element?.(i,s,r),o.children){let a=e.slice(o.path.length),c=i.querySelector("#child");c&&this.renderChildren(o.children,a,c,s,r)}}else{let s=this.findMatchingRoute("*",this.routes);if(s){let i=this.filterAndSanitizeParams(s.params);M.getState().setParams(i),M.getState().setQuery(r);let a=document.createElement("div");s.element?.(a,i,r)}}}renderChildren(e,n,r,o,s){if(!e||e.length===0){let a=r.querySelector("#child");a&&a.remove();return}let i=this.findMatchingRoute(n,e);if(i){let a=document.createElement("div");a.id="child";let c={...o,...i.params},l=this.filterAndSanitizeParams(c);if(M.getState().setParams(l),M.getState().setQuery(s),i.element?.(a,l,s),r.appendChild(a),i.children){let h=n.slice(i.path.length);this.renderChildren(i.children,h,a,l,s)}}}parseQueryParams(e){let n={},r=new URLSearchParams(e);for(let[o,s]of r.entries())this.expectedParams.has(o)&&(n[o]=le.default.sanitize(s));return n}findMatchingRoute(e,n,r={}){for(let o of n){let s=o.path;if(s==="*")return o;{let a=[],c=s.replace(/:[^\s/]+/g,u=>(a.push(u.substring(1)),"([^\\s/]+)")),l=new RegExp(`^${c}(?:/|$)`),h=e.match(l);if(h){let u={...r};if(a.forEach((y,p)=>{u[y]=h[p+1]??""}),o.children){let y=e.slice(h[0].length),p=this.findMatchingRoute(y,o.children,u);if(p)return p}return{...o,params:u}}}}}filterAndSanitizeParams(e){if(!e)return{};let n={};for(let r in e)this.expectedParams.has(r)&&(n[r]=le.default.sanitize(e[r]??""));return n}navigate(e){history.pushState(null,"",e),this.handlePopState()}addRoute(e){this.routes.push(e)}};var we=async()=>{if(typeof window<"u")return;let t=await import("fs/promises"),e=await import("path"),n=await import("chokidar"),r=e.resolve("src/pages"),o=e.resolve("src/gen"),s=e.resolve("src/routes"),i=e.join(o,"tsrouter.gen.ts"),a=e.join(s,"__root.ts");async function c(d){try{await t.mkdir(d,{recursive:!0})}catch{}}function l(d,m){let f="/"+e.relative(m,d).replace(/\\/g,"/");return f=f.replace(/\.ts$/,"").replace(/\/index$/,"")||"/",f.replace(/\[(.+?)\]/g,":$1")}function h(d){return d.replace(/^\//,"").split("/").map(m=>m.startsWith(":")?m.slice(1):m).filter(Boolean).join("-")||"index"}function u(d,m){let g=e.relative(m,d).replace(/\\/g,"/").split("/").filter(Boolean),T=g[g.length-1].replace(".ts",""),w=g.length>1?g[g.length-2]:"";if(T.startsWith("[")&&T.endsWith("]")){let L=T.slice(1,-1);return w.charAt(0).toUpperCase()+w.slice(1)+L.charAt(0).toUpperCase()+L.slice(1)+"Param"}else return T.charAt(0).toUpperCase()+T.slice(1)}async function y(d){let m=await t.readdir(d,{withFileTypes:!0}),f=[];for(let g of m){let T=e.join(d,g.name);if(g.isDirectory())f=f.concat(await y(T));else if(g.isFile()&&g.name.endsWith(".ts")){let w=l(T,r),L=h(w),S=u(T,r);f.push({file:T,route:w,routeName:L,importName:S})}}return f}function p(d,m){let f=m.includes(":");return`import { html, useTSElements, useTSMetaData${f?", useTSExtractParams":""} } from '@devwareng/vanilla-ts'
1
+ "use strict";var Re=Object.create;var C=Object.defineProperty;var Ae=Object.getOwnPropertyDescriptor;var Pe=Object.getOwnPropertyNames;var xe=Object.getPrototypeOf,De=Object.prototype.hasOwnProperty;var He=(t,e)=>{for(var n in e)C(t,n,{get:e[n],enumerable:!0})},me=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Pe(e))!De.call(t,o)&&o!==n&&C(t,o,{get:()=>e[o],enumerable:!(r=Ae(e,o))||r.enumerable});return t};var S=(t,e,n)=>(n=t!=null?Re(xe(t)):{},me(e||!t||!t.__esModule?C(n,"default",{value:t,enumerable:!0}):n,t)),be=t=>me(C({},"__esModule",{value:!0}),t);var ze={};He(ze,{TSFilebasedRouter:()=>Le,TSRouter:()=>N,createEffect:()=>ne,createSignal:()=>te,html:()=>F,loadPyFiles:()=>ie,mapper:()=>de,renderChildRoutes:()=>ee,useAnchor:()=>b,useAnchorSingle:()=>G,useInitialDOM:()=>B,useTSAnchorMount:()=>oe,useTSAuth:()=>Y,useTSCollection:()=>J,useTSComponent:()=>x,useTSElementEach:()=>D,useTSElements:()=>W,useTSEvent:()=>_,useTSEventAll:()=>j,useTSExtractParams:()=>U,useTSHashAnchor:()=>H,useTSLazy:()=>ae,useTSMetaData:()=>V,useTSNavigate:()=>K,useTSNoReload:()=>O,useTSOutlet:()=>Z,useTSParams:()=>P,useTSPurifier:()=>I,useTSSSRHydration:()=>ce,useTSSelect:()=>X,useTSloadBrython:()=>se});module.exports=be(ze);function Oe(t){return(t==null?"":String(t)).replace(/<\s*(script|iframe|object|embed|link|style)[^>]*>.*?<\s*\/\s*\1\s*>/gi,"").replace(/<\s*(script|iframe|object|embed|link|style)[^>]*>/gi,"").replace(/\son\w+\s*=\s*(['"]).*?\1/gi,"").replace(/\s(href|src)\s*=\s*(['"])\s*javascript:[^'"]*\2/gi,"")}function F(t,...e){return t.reduce((n,r,o)=>{let s=o<e.length?Oe(e[o]):"";return n+r+s},"")}var Ce=t=>t.replace(/<\/?(script|iframe|object|embed|link|meta|style)[^>]*>/gi,"").replace(/\s+on[a-z]+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi,"").replace(/\s+(href|src)\s*=\s*(['"]?)\s*javascript:[^'"\s>]*/gi,""),de=t=>t?.map(e=>Ce(e)).join("")??"";var z=S(require("dompurify"),1),I=(t,e)=>{let r={...{ADD_TAGS:["my-custom-tag"]},...e};return typeof t=="string"?z.default.sanitize(t,r):z.default.sanitize(t.innerHTML,r)};var _=(t,e,n)=>{if(typeof t=="string"){let r=document.getElementById(t);r?r.addEventListener(e,n):console.warn(`Element with id '${t}' not found.`)}else t===document?document.addEventListener(e,n):console.warn("Invalid id parameter provided.")};var pe=require("zustand/vanilla"),q=S(require("dompurify"),1);function $e(t,e){let n=[],r=t.replace(/:[^/]+/g,a=>(n.push(a.slice(1)),"([^/]+)")),o=new RegExp(`^${r}$`),s=e.match(o),i={};return s&&n.forEach((a,c)=>{i[a]=q.default.sanitize(s[c+1]??"")}),i}function ke(t){let e={},n=new URLSearchParams(t);for(let[r,o]of n.entries())e[r]=q.default.sanitize(o);return e}var P=(0,pe.createStore)((t,e)=>({params:{},query:{},setFromPattern:n=>{let r=window.location.pathname,o=$e(n,r),s=ke(window.location.search);t({params:o,query:s})},getParam:n=>e().params[n],getQuery:n=>e().query[n]}));function U(t){let e=P.getState();e.setFromPattern(t);let n=e.params,r=e.query;return{...n,...r}}var j=(t,e,n)=>{let r=document.querySelectorAll(t);return r.forEach(o=>{o.addEventListener(e,n)}),()=>{r.forEach(o=>{o.removeEventListener(e,n)})}};var $=S(require("dompurify"),1),W=(t,e,n,r={})=>{let o={USE_PROFILES:{svg:!0,html:!0},ALLOWED_TAGS:["svg","path","circle","rect","line","polyline","polygon","g","main","div","h1","h2","h3","h4","h5","h6","p","button","span","a","img","input","ul","li","i"],ALLOWED_ATTR:["class","id","href","src","alt","fill","stroke","stroke-width","viewBox","xmlns","d","x","y","cx","cy","r","width","height","data-onclick","data-onchange","data-onselect"],FORBID_TAGS:["script","iframe"],ALLOWED_URI_REGEXP:/^(?:(?:https?|mailto|tel|ftp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,...n};$.default.addHook("uponSanitizeElement",(i,a)=>{let c=a.tagName.toLowerCase();c.includes("-")&&(a.allowedTags[c]=!0)}),$.default.addHook("uponSanitizeAttribute",(i,a)=>{a.attrName&&a.attrName.toLowerCase().startsWith("on")&&(a.keepAttr=!1)});let s=$.default.sanitize(e,o);t.innerHTML=s,t.querySelectorAll("[data-onclick]").forEach(i=>{let a=i.dataset.onclick;r[a]&&i.addEventListener("click",r[a])}),t.querySelectorAll("[data-onchange]").forEach(i=>{let a=i.dataset.onchange;r[a]&&i.addEventListener("change",r[a])}),t.querySelectorAll("[data-onselect]").forEach(i=>{let a=i.dataset.onselect;r[a]&&i.addEventListener("select",r[a])})};var fe=S(require("dompurify"),1),k=null,B=(t,e)=>{if(typeof document>"u")return;let n=document.getElementById(t);if(!n)return;let r=n.innerHTML,s=fe.default.sanitize(r,{ALLOWED_TAGS:["div","span","p","h1","h2","h3","h4","h5","h6","ul","ol","li","strong","em","a","img","br"],ALLOWED_ATTR:["href","src","alt","title","class","id","data-onclick","data-onchange"],ALLOW_DATA_ATTR:!1,KEEP_CONTENT:!1}).replace(/\b(href|src)=["']?(?!https?:|mailto:|\/|#)/gi,'$1="#"');if(k!==null&&s!==k){let i=document.createElement("div");e(i),n.innerHTML=k}else k=s,n.innerHTML=s,e(n)};var Q=S(require("dompurify"),1);typeof window<"u"&&!window.__anchorSinglePopstateHandlerAttached&&(window.addEventListener("popstate",t=>{let e=t.state;e?.scrollPosition!==void 0&&window.scrollTo(0,e.scrollPosition)}),window.__anchorSinglePopstateHandlerAttached=!0);var G=(t,e,n,r="",o=null)=>{if(!t)return;let s=Q.default.sanitize(e,{ALLOWED_URI_REGEXP:/^(https?:|\/)/}),i=Q.default.sanitize(n,{USE_PROFILES:{html:!1}});t.setAttribute("href",s),t.setAttribute("aria-label",i),r&&(t.className=r.trim()),o&&t.replaceChildren(o),typeof window<"u"&&t.addEventListener("click",a=>{a.preventDefault();let l=a.currentTarget.getAttribute("href");if(l){let h=window.scrollY;window.scrollTo(0,0),window.history.pushState({scrollPosition:h},"",l),dispatchEvent(new PopStateEvent("popstate"))}})};var R=S(require("dompurify"),1);var he=(t="'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'",e="'self' 'nonce-rAnd0m123'",n="'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/"],i="'self' https://www.youtube.com",a="'self'",c="/csp-report",l=!1)=>{let h=()=>{try{let u=document.querySelector('meta[http-equiv="Content-Security-Policy"]');u||(u=document.createElement("meta"),u.setAttribute("http-equiv","Content-Security-Policy"),document.head.appendChild(u));let y=l?`report-uri ${c};`:"";u.setAttribute("content",`default-src 'self'; script-src ${t}; style-src ${e}; object-src ${n}; font-src ${r}; img-src ${o}; connect-src ${s.join(" ")}; frame-src ${i}; base-uri ${a}; ${y}`)}catch(u){console.error("Error adding CSP meta element:",u)}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",h):h()};var V=(t,e)=>{let n={name:R.default.sanitize(t.name||""),description:R.default.sanitize(t.description||"Default description"),author:R.default.sanitize(t.author||"")},r=p=>{n.name=R.default.sanitize(p),u("name",n.name)},o=p=>{n.description=R.default.sanitize(p),u("description",n.description)},s=p=>{n.author=R.default.sanitize(p),u("author",n.author)},i=()=>n.name,a=()=>n.description,c=()=>n.author,l=()=>n,h=(p,A)=>{let v=document.createElement("meta");v.setAttribute("name",p),v.setAttribute("content",A),document.head.appendChild(v)},u=(p,A)=>{let v=document.querySelector(`meta[name="${p}"]`);v?v.setAttribute("content",A):h(p,A)},y=()=>{u("name",n.name),u("description",n.description),u("author",n.author)};return e&&he(e.scriptSrc,e.styleSrc,e.objectSrc,Array.isArray(e.connectSrc)?e.connectSrc.join(" "):e.connectSrc,e.reportOnly!==void 0?String(e.reportOnly):void 0),y(),{setName:r,setDescription:o,setAuthor:s,getName:i,getDescription:a,getAuthor:c,getAllMetaData:l,appendMetaTagsToHead:y}};var ge=S(require("dompurify"),1),x=(t,e,n,r,o)=>{let s=`#${t}`,i=e.querySelectorAll(s);if(i.length===0)throw new Error(`[useTSComponent] No element found with id '${t}' in the given parent.`);if(i.length>1)throw new Error(`[useTSComponent] Duplicate id '${t}' detected. Found ${i.length} elements.`);let a=i[0];a.innerHTML=ge.default.sanitize(a.innerHTML,{USE_PROFILES:{html:!0}}),n(a,r,o)};var J=(t,e,n,r=[])=>{let o=new Set;t.forEach((s,i)=>{if(o.has(s)){console.warn(`[useTSCollection] Duplicate ID in collection array: "${s}" \u2014 skipping.`);return}o.add(s);let a=e.querySelectorAll(`#${s}`);if(a.length>1){console.warn(`[useTSCollection] Duplicate ID in DOM: "${s}" (${a.length} elements found) \u2014 skipping component mount.`);return}let c=n[i],l=Array.isArray(r)?r[i]:void 0;typeof c=="function"?x(s,e,c,l):console.warn(`[useTSCollection] No valid component function found for ID: "${s}"`)})};var X=(t,e)=>{let r=(e??document).querySelectorAll(t);if(r.length===0)return process.env.NODE_ENV!=="production"&&console.warn(`[useTSSelect] No element found for selector: '${t}'`),null;if(t.startsWith("#")&&r.length>1){if(process.env.NODE_ENV!=="production")throw new Error(`[useTSSelect] Duplicate ID detected: '${t}'. Found ${r.length} elements with this ID.`);return r[0]}return r.length>1&&process.env.NODE_ENV!=="production"&&console.warn(`[useTSSelect] Multiple elements found for selector: '${t}'. Returning the first one.`),r[0]};var Te=require("jwt-decode"),Y=(t,e)=>{let n=localStorage.getItem("token");if(!n)return window.location.href=e,null;try{let r=(0,Te.jwtDecode)(n),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 D=(t,e,n)=>{t.forEach(r=>{e.forEach(o=>{r.addEventListener(o,s=>{n(r,s)})})})};var K=()=>({back:()=>window.history.back(),forward:()=>window.history.forward()});var Z=(t,e)=>{let n=document.querySelector(`#${t}`)||document.querySelector(`.${t}`);if(!n)return;let r=window.location.pathname.replace(/\/$/,"");for(let o of e){let s=o.path.replace(/\/$/,"");if(r===s||r.startsWith(`${s}/`)){o.component(n);break}}};function ee(t,e){let n=window.location.pathname.replace(/\/$/,"");e.routes.forEach(r=>{r.children?.length&&r.children.forEach(o=>{let s=o.path.replace(/\/$/,"");if(n===s||n.startsWith(`${s}/`)){let i=t.querySelector(`#${o.outlet}`)||t.querySelector(`.${o.outlet}`);i instanceof HTMLElement&&o.element&&o.element(i)}})})}var Se=require("zustand/vanilla");function te(t){let e=(0,Se.createStore)(()=>({value:t})),n=new Set;return{get:()=>e.getState().value,set:r=>{e.setState({value:r}),n.forEach(o=>o(r))},subscribe:r=>(n.add(r),r(e.getState().value),()=>n.delete(r))}}function ne(t){let e=t();typeof e=="function"&&e()}var H=()=>{let t=document.querySelectorAll('a[href^="#"]');D(t,["click"],(e,n)=>{n.preventDefault();let r=e.getAttribute("href")?.substring(1),o=r?document.getElementById(r):null;o&&o.scrollIntoView({behavior:"smooth",block:"start"})})};var Ee=require("lodash-es"),re=t=>t;typeof window<"u"&&typeof document<"u"&&(re=t=>{let e=document.createElement("div");return e.innerText=t,e.innerHTML});var Ne=t=>{(t?Array.isArray(t)?t:t instanceof HTMLAnchorElement?[t]:Array.from(t):Array.from(document.querySelectorAll("a"))).forEach(n=>{if(!n||n.dataset.anchorEnhanced==="true")return;n.dataset.anchorEnhanced="true";let r=n.getAttribute("class")||"";n.setAttribute("class",re(r));let o=n.getAttribute("aria-label");o&&n.setAttribute("aria-label",re(o));let s=n.querySelector(":scope > *");s&&(n.innerHTML="",n.appendChild(s));let i=n.getAttribute("href")||"";if(!i.startsWith("#")){try{if(new URL(i,window.location.href).origin!==window.location.origin)return}catch{return}n.addEventListener("click",a=>{a.preventDefault();let c=n.getAttribute("href")||"";try{let l=new URL(c,window.location.href);window.history.pushState({},"",l.pathname+l.search+l.hash),window.dispatchEvent(new PopStateEvent("popstate"))}catch(l){console.error("Invalid URL in anchor:",c,l)}})}})},Fe=(0,Ee.debounce)(Ne,50),b=t=>{Fe(t)};var O=t=>{let e=t.querySelectorAll("a");b(e)};var oe=t=>{H(),O(t)};var se=async()=>{let t="https://cdn.jsdelivr.net/npm/brython@3/brython.min.js",e="https://cdn.jsdelivr.net/npm/brython@3/brython_stdlib.js",n=r=>new Promise((o,s)=>{let i=document.createElement("script");i.src=r,i.onload=()=>o(),i.onerror=()=>s(new Error(`Failed to load ${r}`)),document.head.appendChild(i)});await n(t),await n(e),typeof window.brython=="function"?window.brython():console.error("Brython did not load correctly.")},ie=t=>new Promise((e,n)=>{let r=document.createElement("script");r.type="text/python",r.src=`/src/python/${t}`,r.onload=()=>e(),r.onerror=()=>n(new Error(`Failed to load ${t}`)),document.body.appendChild(r)});function ae(t){let e=null;return async(n,r)=>{try{if(!e){let o=await t();e=o.default||o}if(typeof e=="function")return e(n,r);if(e instanceof HTMLElement){n?.appendChild(e);return}if(e&&typeof e.render=="function")return e.render(n,r);console.warn("useTSLazy: Unsupported module type",e)}catch(o){console.error("useTSLazy failed:",o)}}}var ce=t=>typeof window>"u"?{isDOM:null}:{isDOM:t||document.body};var le=S(require("dompurify"),1);var ve=require("zustand/vanilla"),we=S(require("dompurify"),1),M=(0,ve.createStore)(t=>({params:{},query:{},setParams:e=>t(()=>({params:ye(e)})),setQuery:e=>t(()=>({query:ye(e)}))}));function ye(t){let e={};for(let n in t)e[n]=we.default.sanitize(t[n]);return e}var N=class{constructor(e,n){this.routes=[];this.routes=e,this.expectedParams=new Set(n),window.addEventListener("popstate",this.handlePopState.bind(this)),this.handlePopState()}handlePopState(){let e=window.location.pathname,n=window.location.search,r=this.parseQueryParams(n),o=this.findMatchingRoute(e,this.routes);if(o){if(o.routeto){this.navigate(o.routeto);return}let s=this.filterAndSanitizeParams(o.params);M.getState().setParams(s),M.getState().setQuery(r);let i=document.createElement("div");if(o.element?.(i,s,r),o.children){let a=e.slice(o.path.length),c=i.querySelector("#child");c&&this.renderChildren(o.children,a,c,s,r)}}else{let s=this.findMatchingRoute("*",this.routes);if(s){let i=this.filterAndSanitizeParams(s.params);M.getState().setParams(i),M.getState().setQuery(r);let a=document.createElement("div");s.element?.(a,i,r)}}}renderChildren(e,n,r,o,s){if(!e||e.length===0){let a=r.querySelector("#child");a&&a.remove();return}let i=this.findMatchingRoute(n,e);if(i){let a=document.createElement("div");a.id="child";let c={...o,...i.params},l=this.filterAndSanitizeParams(c);if(M.getState().setParams(l),M.getState().setQuery(s),i.element?.(a,l,s),r.appendChild(a),i.children){let h=n.slice(i.path.length);this.renderChildren(i.children,h,a,l,s)}}}parseQueryParams(e){let n={},r=new URLSearchParams(e);for(let[o,s]of r.entries())this.expectedParams.has(o)&&(n[o]=le.default.sanitize(s));return n}findMatchingRoute(e,n,r={}){for(let o of n){let s=o.path;if(s==="*")return o;{let a=[],c=s.replace(/:[^\s/]+/g,u=>(a.push(u.substring(1)),"([^\\s/]+)")),l=new RegExp(`^${c}(?:/|$)`),h=e.match(l);if(h){let u={...r};if(a.forEach((y,p)=>{u[y]=h[p+1]??""}),o.children){let y=e.slice(h[0].length),p=this.findMatchingRoute(y,o.children,u);if(p)return p}return{...o,params:u}}}}}filterAndSanitizeParams(e){if(!e)return{};let n={};for(let r in e)this.expectedParams.has(r)&&(n[r]=le.default.sanitize(e[r]??""));return n}navigate(e){history.pushState(null,"",e),this.handlePopState()}addRoute(e){this.routes.push(e)}};var Le=async()=>{if(typeof window<"u")return;let t=await import("fs/promises"),e=await import("path"),n=await import("chokidar"),r;try{r=(await import("stream")).Readable}catch{}let o=e.resolve("src/pages"),s=e.resolve("src/gen"),i=e.resolve("src/routes"),a=e.join(s,"tsrouter.gen.ts"),c=e.join(i,"__root.ts");async function l(d){try{await t.mkdir(d,{recursive:!0})}catch{}}function h(d,m){let f="/"+e.relative(m,d).replace(/\\/g,"/");return f=f.replace(/\.ts$/,"").replace(/\/index$/,"")||"/",f.replace(/\[(.+?)\]/g,":$1")}function u(d){return d.replace(/^\//,"").split("/").map(m=>m.startsWith(":")?m.slice(1):m).filter(Boolean).join("-")||"index"}function y(d,m){let g=e.relative(m,d).replace(/\\/g,"/").split("/").filter(Boolean),T=g[g.length-1].replace(".ts",""),w=g.length>1?g[g.length-2]:"";if(T.startsWith("[")&&T.endsWith("]")){let L=T.slice(1,-1);return w.charAt(0).toUpperCase()+w.slice(1)+L.charAt(0).toUpperCase()+L.slice(1)+"Param"}else return T.charAt(0).toUpperCase()+T.slice(1)}async function p(d){let m=await t.readdir(d,{withFileTypes:!0}),f=[];for(let g of m){let T=e.join(d,g.name);if(g.isDirectory())f=f.concat(await p(T));else if(g.isFile()&&g.name.endsWith(".ts")){let w=h(T,o),L=u(w),E=y(T,o);f.push({file:T,route:w,routeName:L,importName:E})}}return f}function A(d,m){let f=m.includes(":");return`import { html, useTSElements, useTSMetaData${f?", useTSExtractParams":""} } from '@devwareng/vanilla-ts'
2
2
 
3
3
  export default function ${d}(DOM: HTMLElement) {
4
4
  useTSMetaData({
@@ -20,7 +20,7 @@ export default function ${d}(DOM: HTMLElement) {
20
20
  );
21
21
 
22
22
  return ui;
23
- }`}function R(){return`import { createRouter } from "@/gen/tsrouter.gen";
23
+ }`}function v(){return`import { createRouter } from "@/gen/tsrouter.gen";
24
24
  import { useTSParams } from "@devwareng/vanilla-ts";
25
25
 
26
26
  export const Router = (DOM: HTMLElement) => {
@@ -31,8 +31,8 @@ export const Router = (DOM: HTMLElement) => {
31
31
  window.addEventListener("popstate", () => {
32
32
  router.navigate(window.location.pathname);
33
33
  });
34
- };`}async function v(){let d=await y(r),m=d.find(S=>S.route==="/notfound"),f=d.filter(S=>S.route!=="/notfound"),g=d.map(S=>{let Le="../pages/"+e.relative(r,S.file).replace(/\\/g,"/").replace(/\.ts$/,"");return`import ${S.importName} from "${Le}";`}).join(`
35
- `),T=f.map(S=>`{ path: "${S.route}", name: "${S.routeName}", component: (DOM: HTMLElement) => ${S.importName}(DOM) }`).join(`,
34
+ };`}async function ue(){let d=await p(o),m=d.find(E=>E.route==="/notfound"),f=d.filter(E=>E.route!=="/notfound"),g=d.map(E=>{let Me="../pages/"+e.relative(o,E.file).replace(/\\/g,"/").replace(/\.ts$/,"");return`import ${E.importName} from "${Me}";`}).join(`
35
+ `),T=f.map(E=>`{ path: "${E.route}", name: "${E.routeName}", component: (DOM: HTMLElement) => ${E.importName}(DOM) }`).join(`,
36
36
  `),w=m?`export const NotFound = ${m.importName}`:"export function NotFound(DOM: HTMLElement) {\n return useTSElements(DOM, html`<div><h1>404 - Page Not Found</h1></div>`)\n}",L=`// AUTO-GENERATED FILE. DO NOT EDIT MANUALLY.
37
37
  import { html, useTSElements } from "@devwareng/vanilla-ts"
38
38
 
@@ -83,4 +83,4 @@ export function createRouter(DOM: HTMLElement) {
83
83
  navigate(window.location.pathname + window.location.search)
84
84
  return { navigate, routes: routeTree }
85
85
  }
86
- `;await c(o),await t.writeFile(i,L,"utf-8"),await t.writeFile(a,R(),"utf-8")}await c(o),await c(s),await v(),n.watch(r).on("all",async(d,m)=>{if(d==="add"&&m.endsWith(".ts")){let g=e.basename(m,".ts").replace(/\[|\]/g,"Param").replace(/(^\w|-\w)/g,L=>L.replace("-","").toUpperCase()),T=l(m,r);(await t.readFile(m,"utf-8")).trim()||await t.writeFile(m,p(g,T),"utf-8"),await v()}}),n.watch(a).on("unlink",async()=>{await t.writeFile(a,R(),"utf-8")}),console.log("\u{1F7E2} TS Filebased Router Mounted Successfully...")};0&&(module.exports={TSFilebasedRouter,TSRouter,createEffect,createSignal,html,loadPyFiles,mapper,renderChildRoutes,useAnchor,useAnchorSingle,useInitialDOM,useTSAnchorMount,useTSAuth,useTSCollection,useTSComponent,useTSElementEach,useTSElements,useTSEvent,useTSEventAll,useTSExtractParams,useTSHashAnchor,useTSLazy,useTSMetaData,useTSNavigate,useTSNoReload,useTSOutlet,useTSParams,useTSPurifier,useTSSSRHydration,useTSSelect,useTSloadBrython});
86
+ `;await l(s),await t.writeFile(a,L,"utf-8"),await t.writeFile(c,v(),"utf-8")}await l(s),await l(i),await ue(),n.watch(o).on("all",async(d,m)=>{if(d==="add"&&m.endsWith(".ts")){let g=e.basename(m,".ts").replace(/\[|\]/g,"Param").replace(/(^\w|-\w)/g,L=>L.replace("-","").toUpperCase()),T=h(m,o);(await t.readFile(m,"utf-8")).trim()||await t.writeFile(m,A(g,T),"utf-8"),await ue()}}),n.watch(c).on("unlink",async()=>{await t.writeFile(c,v(),"utf-8")}),console.log("\u{1F7E2} TS Filebased Router Mounted Successfully...")};0&&(module.exports={TSFilebasedRouter,TSRouter,createEffect,createSignal,html,loadPyFiles,mapper,renderChildRoutes,useAnchor,useAnchorSingle,useInitialDOM,useTSAnchorMount,useTSAuth,useTSCollection,useTSComponent,useTSElementEach,useTSElements,useTSEvent,useTSEventAll,useTSExtractParams,useTSHashAnchor,useTSLazy,useTSMetaData,useTSNavigate,useTSNoReload,useTSOutlet,useTSParams,useTSPurifier,useTSSSRHydration,useTSSelect,useTSloadBrython});
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- function me(t){return(t==null?"":String(t)).replace(/<\s*(script|iframe|object|embed|link|style)[^>]*>.*?<\s*\/\s*\1\s*>/gi,"").replace(/<\s*(script|iframe|object|embed|link|style)[^>]*>/gi,"").replace(/\son\w+\s*=\s*(['"]).*?\1/gi,"").replace(/\s(href|src)\s*=\s*(['"])\s*javascript:[^'"]*\2/gi,"")}function N(t,...e){return t.reduce((n,r,o)=>{let s=o<e.length?me(e[o]):"";return n+r+s},"")}var de=t=>t.replace(/<\/?(script|iframe|object|embed|link|meta|style)[^>]*>/gi,"").replace(/\s+on[a-z]+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi,"").replace(/\s+(href|src)\s*=\s*(['"]?)\s*javascript:[^'"\s>]*/gi,""),pe=t=>t?.map(e=>de(e)).join("")??"";import F from"dompurify";var z=(t,e)=>{let r={...{ADD_TAGS:["my-custom-tag"]},...e};return typeof t=="string"?F.sanitize(t,r):F.sanitize(t.innerHTML,r)};var I=(t,e,n)=>{if(typeof t=="string"){let r=document.getElementById(t);r?r.addEventListener(e,n):console.warn(`Element with id '${t}' not found.`)}else t===document?document.addEventListener(e,n):console.warn("Invalid id parameter provided.")};import{createStore as fe}from"zustand/vanilla";import _ from"dompurify";function he(t,e){let n=[],r=t.replace(/:[^/]+/g,a=>(n.push(a.slice(1)),"([^/]+)")),o=new RegExp(`^${r}$`),s=e.match(o),i={};return s&&n.forEach((a,c)=>{i[a]=_.sanitize(s[c+1]??"")}),i}function ge(t){let e={},n=new URLSearchParams(t);for(let[r,o]of n.entries())e[r]=_.sanitize(o);return e}var A=fe((t,e)=>({params:{},query:{},setFromPattern:n=>{let r=window.location.pathname,o=he(n,r),s=ge(window.location.search);t({params:o,query:s})},getParam:n=>e().params[n],getQuery:n=>e().query[n]}));function q(t){let e=A.getState();e.setFromPattern(t);let n=e.params,r=e.query;return{...n,...r}}var U=(t,e,n)=>{let r=document.querySelectorAll(t);return r.forEach(o=>{o.addEventListener(e,n)}),()=>{r.forEach(o=>{o.removeEventListener(e,n)})}};import C from"dompurify";var j=(t,e,n,r={})=>{let o={USE_PROFILES:{svg:!0,html:!0},ALLOWED_TAGS:["svg","path","circle","rect","line","polyline","polygon","g","main","div","h1","h2","h3","h4","h5","h6","p","button","span","a","img","input","ul","li","i"],ALLOWED_ATTR:["class","id","href","src","alt","fill","stroke","stroke-width","viewBox","xmlns","d","x","y","cx","cy","r","width","height","data-onclick","data-onchange","data-onselect"],FORBID_TAGS:["script","iframe"],ALLOWED_URI_REGEXP:/^(?:(?:https?|mailto|tel|ftp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,...n};C.addHook("uponSanitizeElement",(i,a)=>{let c=a.tagName.toLowerCase();c.includes("-")&&(a.allowedTags[c]=!0)}),C.addHook("uponSanitizeAttribute",(i,a)=>{a.attrName&&a.attrName.toLowerCase().startsWith("on")&&(a.keepAttr=!1)});let s=C.sanitize(e,o);t.innerHTML=s,t.querySelectorAll("[data-onclick]").forEach(i=>{let a=i.dataset.onclick;r[a]&&i.addEventListener("click",r[a])}),t.querySelectorAll("[data-onchange]").forEach(i=>{let a=i.dataset.onchange;r[a]&&i.addEventListener("change",r[a])}),t.querySelectorAll("[data-onselect]").forEach(i=>{let a=i.dataset.onselect;r[a]&&i.addEventListener("select",r[a])})};import Te from"dompurify";var P=null,W=(t,e)=>{if(typeof document>"u")return;let n=document.getElementById(t);if(!n)return;let r=n.innerHTML,s=Te.sanitize(r,{ALLOWED_TAGS:["div","span","p","h1","h2","h3","h4","h5","h6","ul","ol","li","strong","em","a","img","br"],ALLOWED_ATTR:["href","src","alt","title","class","id","data-onclick","data-onchange"],ALLOW_DATA_ATTR:!1,KEEP_CONTENT:!1}).replace(/\b(href|src)=["']?(?!https?:|mailto:|\/|#)/gi,'$1="#"');if(P!==null&&s!==P){let i=document.createElement("div");e(i),n.innerHTML=P}else P=s,n.innerHTML=s,e(n)};import B from"dompurify";typeof window<"u"&&!window.__anchorSinglePopstateHandlerAttached&&(window.addEventListener("popstate",t=>{let e=t.state;e?.scrollPosition!==void 0&&window.scrollTo(0,e.scrollPosition)}),window.__anchorSinglePopstateHandlerAttached=!0);var Q=(t,e,n,r="",o=null)=>{if(!t)return;let s=B.sanitize(e,{ALLOWED_URI_REGEXP:/^(https?:|\/)/}),i=B.sanitize(n,{USE_PROFILES:{html:!1}});t.setAttribute("href",s),t.setAttribute("aria-label",i),r&&(t.className=r.trim()),o&&t.replaceChildren(o),typeof window<"u"&&t.addEventListener("click",a=>{a.preventDefault();let l=a.currentTarget.getAttribute("href");if(l){let h=window.scrollY;window.scrollTo(0,0),window.history.pushState({scrollPosition:h},"",l),dispatchEvent(new PopStateEvent("popstate"))}})};import R from"dompurify";var G=(t="'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'",e="'self' 'nonce-rAnd0m123'",n="'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/"],i="'self' https://www.youtube.com",a="'self'",c="/csp-report",l=!1)=>{let h=()=>{try{let u=document.querySelector('meta[http-equiv="Content-Security-Policy"]');u||(u=document.createElement("meta"),u.setAttribute("http-equiv","Content-Security-Policy"),document.head.appendChild(u));let E=l?`report-uri ${c};`:"";u.setAttribute("content",`default-src 'self'; script-src ${t}; style-src ${e}; object-src ${n}; font-src ${r}; img-src ${o}; connect-src ${s.join(" ")}; frame-src ${i}; base-uri ${a}; ${E}`)}catch(u){console.error("Error adding CSP meta element:",u)}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",h):h()};var V=(t,e)=>{let n={name:R.sanitize(t.name||""),description:R.sanitize(t.description||"Default description"),author:R.sanitize(t.author||"")},r=p=>{n.name=R.sanitize(p),u("name",n.name)},o=p=>{n.description=R.sanitize(p),u("description",n.description)},s=p=>{n.author=R.sanitize(p),u("author",n.author)},i=()=>n.name,a=()=>n.description,c=()=>n.author,l=()=>n,h=(p,M)=>{let y=document.createElement("meta");y.setAttribute("name",p),y.setAttribute("content",M),document.head.appendChild(y)},u=(p,M)=>{let y=document.querySelector(`meta[name="${p}"]`);y?y.setAttribute("content",M):h(p,M)},E=()=>{u("name",n.name),u("description",n.description),u("author",n.author)};return e&&G(e.scriptSrc,e.styleSrc,e.objectSrc,Array.isArray(e.connectSrc)?e.connectSrc.join(" "):e.connectSrc,e.reportOnly!==void 0?String(e.reportOnly):void 0),E(),{setName:r,setDescription:o,setAuthor:s,getName:i,getDescription:a,getAuthor:c,getAllMetaData:l,appendMetaTagsToHead:E}};import Se from"dompurify";var x=(t,e,n,r,o)=>{let s=`#${t}`,i=e.querySelectorAll(s);if(i.length===0)throw new Error(`[useTSComponent] No element found with id '${t}' in the given parent.`);if(i.length>1)throw new Error(`[useTSComponent] Duplicate id '${t}' detected. Found ${i.length} elements.`);let a=i[0];a.innerHTML=Se.sanitize(a.innerHTML,{USE_PROFILES:{html:!0}}),n(a,r,o)};var J=(t,e,n,r=[])=>{let o=new Set;t.forEach((s,i)=>{if(o.has(s)){console.warn(`[useTSCollection] Duplicate ID in collection array: "${s}" \u2014 skipping.`);return}o.add(s);let a=e.querySelectorAll(`#${s}`);if(a.length>1){console.warn(`[useTSCollection] Duplicate ID in DOM: "${s}" (${a.length} elements found) \u2014 skipping component mount.`);return}let c=n[i],l=Array.isArray(r)?r[i]:void 0;typeof c=="function"?x(s,e,c,l):console.warn(`[useTSCollection] No valid component function found for ID: "${s}"`)})};var X=(t,e)=>{let r=(e??document).querySelectorAll(t);if(r.length===0)return process.env.NODE_ENV!=="production"&&console.warn(`[useTSSelect] No element found for selector: '${t}'`),null;if(t.startsWith("#")&&r.length>1){if(process.env.NODE_ENV!=="production")throw new Error(`[useTSSelect] Duplicate ID detected: '${t}'. Found ${r.length} elements with this ID.`);return r[0]}return r.length>1&&process.env.NODE_ENV!=="production"&&console.warn(`[useTSSelect] Multiple elements found for selector: '${t}'. Returning the first one.`),r[0]};import{jwtDecode as Ee}from"jwt-decode";var Y=(t,e)=>{let n=localStorage.getItem("token");if(!n)return window.location.href=e,null;try{let r=Ee(n),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 D=(t,e,n)=>{t.forEach(r=>{e.forEach(o=>{r.addEventListener(o,s=>{n(r,s)})})})};var K=()=>({back:()=>window.history.back(),forward:()=>window.history.forward()});var Z=(t,e)=>{let n=document.querySelector(`#${t}`)||document.querySelector(`.${t}`);if(!n)return;let r=window.location.pathname.replace(/\/$/,"");for(let o of e){let s=o.path.replace(/\/$/,"");if(r===s||r.startsWith(`${s}/`)){o.component(n);break}}};function ee(t,e){let n=window.location.pathname.replace(/\/$/,"");e.routes.forEach(r=>{r.children?.length&&r.children.forEach(o=>{let s=o.path.replace(/\/$/,"");if(n===s||n.startsWith(`${s}/`)){let i=t.querySelector(`#${o.outlet}`)||t.querySelector(`.${o.outlet}`);i instanceof HTMLElement&&o.element&&o.element(i)}})})}import{createStore as ye}from"zustand/vanilla";function te(t){let e=ye(()=>({value:t})),n=new Set;return{get:()=>e.getState().value,set:r=>{e.setState({value:r}),n.forEach(o=>o(r))},subscribe:r=>(n.add(r),r(e.getState().value),()=>n.delete(r))}}function ne(t){let e=t();typeof e=="function"&&e()}var H=()=>{let t=document.querySelectorAll('a[href^="#"]');D(t,["click"],(e,n)=>{n.preventDefault();let r=e.getAttribute("href")?.substring(1),o=r?document.getElementById(r):null;o&&o.scrollIntoView({behavior:"smooth",block:"start"})})};import{debounce as ve}from"lodash-es";var $=t=>t;typeof window<"u"&&typeof document<"u"&&($=t=>{let e=document.createElement("div");return e.innerText=t,e.innerHTML});var we=t=>{(t?Array.isArray(t)?t:t instanceof HTMLAnchorElement?[t]:Array.from(t):Array.from(document.querySelectorAll("a"))).forEach(n=>{if(!n||n.dataset.anchorEnhanced==="true")return;n.dataset.anchorEnhanced="true";let r=n.getAttribute("class")||"";n.setAttribute("class",$(r));let o=n.getAttribute("aria-label");o&&n.setAttribute("aria-label",$(o));let s=n.querySelector(":scope > *");s&&(n.innerHTML="",n.appendChild(s));let i=n.getAttribute("href")||"";if(!i.startsWith("#")){try{if(new URL(i,window.location.href).origin!==window.location.origin)return}catch{return}n.addEventListener("click",a=>{a.preventDefault();let c=n.getAttribute("href")||"";try{let l=new URL(c,window.location.href);window.history.pushState({},"",l.pathname+l.search+l.hash),window.dispatchEvent(new PopStateEvent("popstate"))}catch(l){console.error("Invalid URL in anchor:",c,l)}})}})},Le=ve(we,50),O=t=>{Le(t)};var b=t=>{let e=t.querySelectorAll("a");O(e)};var re=t=>{H(),b(t)};var oe=async()=>{let t="https://cdn.jsdelivr.net/npm/brython@3/brython.min.js",e="https://cdn.jsdelivr.net/npm/brython@3/brython_stdlib.js",n=r=>new Promise((o,s)=>{let i=document.createElement("script");i.src=r,i.onload=()=>o(),i.onerror=()=>s(new Error(`Failed to load ${r}`)),document.head.appendChild(i)});await n(t),await n(e),typeof window.brython=="function"?window.brython():console.error("Brython did not load correctly.")},se=t=>new Promise((e,n)=>{let r=document.createElement("script");r.type="text/python",r.src=`/src/python/${t}`,r.onload=()=>e(),r.onerror=()=>n(new Error(`Failed to load ${t}`)),document.body.appendChild(r)});function ie(t){let e=null;return async(n,r)=>{try{if(!e){let o=await t();e=o.default||o}if(typeof e=="function")return e(n,r);if(e instanceof HTMLElement){n?.appendChild(e);return}if(e&&typeof e.render=="function")return e.render(n,r);console.warn("useTSLazy: Unsupported module type",e)}catch(o){console.error("useTSLazy failed:",o)}}}var ae=t=>typeof window>"u"?{isDOM:null}:{isDOM:t||document.body};import le from"dompurify";import{createStore as Me}from"zustand/vanilla";import Re from"dompurify";var L=Me(t=>({params:{},query:{},setParams:e=>t(()=>({params:ce(e)})),setQuery:e=>t(()=>({query:ce(e)}))}));function ce(t){let e={};for(let n in t)e[n]=Re.sanitize(t[n]);return e}var k=class{constructor(e,n){this.routes=[];this.routes=e,this.expectedParams=new Set(n),window.addEventListener("popstate",this.handlePopState.bind(this)),this.handlePopState()}handlePopState(){let e=window.location.pathname,n=window.location.search,r=this.parseQueryParams(n),o=this.findMatchingRoute(e,this.routes);if(o){if(o.routeto){this.navigate(o.routeto);return}let s=this.filterAndSanitizeParams(o.params);L.getState().setParams(s),L.getState().setQuery(r);let i=document.createElement("div");if(o.element?.(i,s,r),o.children){let a=e.slice(o.path.length),c=i.querySelector("#child");c&&this.renderChildren(o.children,a,c,s,r)}}else{let s=this.findMatchingRoute("*",this.routes);if(s){let i=this.filterAndSanitizeParams(s.params);L.getState().setParams(i),L.getState().setQuery(r);let a=document.createElement("div");s.element?.(a,i,r)}}}renderChildren(e,n,r,o,s){if(!e||e.length===0){let a=r.querySelector("#child");a&&a.remove();return}let i=this.findMatchingRoute(n,e);if(i){let a=document.createElement("div");a.id="child";let c={...o,...i.params},l=this.filterAndSanitizeParams(c);if(L.getState().setParams(l),L.getState().setQuery(s),i.element?.(a,l,s),r.appendChild(a),i.children){let h=n.slice(i.path.length);this.renderChildren(i.children,h,a,l,s)}}}parseQueryParams(e){let n={},r=new URLSearchParams(e);for(let[o,s]of r.entries())this.expectedParams.has(o)&&(n[o]=le.sanitize(s));return n}findMatchingRoute(e,n,r={}){for(let o of n){let s=o.path;if(s==="*")return o;{let a=[],c=s.replace(/:[^\s/]+/g,u=>(a.push(u.substring(1)),"([^\\s/]+)")),l=new RegExp(`^${c}(?:/|$)`),h=e.match(l);if(h){let u={...r};if(a.forEach((E,p)=>{u[E]=h[p+1]??""}),o.children){let E=e.slice(h[0].length),p=this.findMatchingRoute(E,o.children,u);if(p)return p}return{...o,params:u}}}}}filterAndSanitizeParams(e){if(!e)return{};let n={};for(let r in e)this.expectedParams.has(r)&&(n[r]=le.sanitize(e[r]??""));return n}navigate(e){history.pushState(null,"",e),this.handlePopState()}addRoute(e){this.routes.push(e)}};var Ae=async()=>{if(typeof window<"u")return;let t=await import("fs/promises"),e=await import("path"),n=await import("chokidar"),r=e.resolve("src/pages"),o=e.resolve("src/gen"),s=e.resolve("src/routes"),i=e.join(o,"tsrouter.gen.ts"),a=e.join(s,"__root.ts");async function c(d){try{await t.mkdir(d,{recursive:!0})}catch{}}function l(d,m){let f="/"+e.relative(m,d).replace(/\\/g,"/");return f=f.replace(/\.ts$/,"").replace(/\/index$/,"")||"/",f.replace(/\[(.+?)\]/g,":$1")}function h(d){return d.replace(/^\//,"").split("/").map(m=>m.startsWith(":")?m.slice(1):m).filter(Boolean).join("-")||"index"}function u(d,m){let g=e.relative(m,d).replace(/\\/g,"/").split("/").filter(Boolean),T=g[g.length-1].replace(".ts",""),v=g.length>1?g[g.length-2]:"";if(T.startsWith("[")&&T.endsWith("]")){let w=T.slice(1,-1);return v.charAt(0).toUpperCase()+v.slice(1)+w.charAt(0).toUpperCase()+w.slice(1)+"Param"}else return T.charAt(0).toUpperCase()+T.slice(1)}async function E(d){let m=await t.readdir(d,{withFileTypes:!0}),f=[];for(let g of m){let T=e.join(d,g.name);if(g.isDirectory())f=f.concat(await E(T));else if(g.isFile()&&g.name.endsWith(".ts")){let v=l(T,r),w=h(v),S=u(T,r);f.push({file:T,route:v,routeName:w,importName:S})}}return f}function p(d,m){let f=m.includes(":");return`import { html, useTSElements, useTSMetaData${f?", useTSExtractParams":""} } from '@devwareng/vanilla-ts'
1
+ function de(t){return(t==null?"":String(t)).replace(/<\s*(script|iframe|object|embed|link|style)[^>]*>.*?<\s*\/\s*\1\s*>/gi,"").replace(/<\s*(script|iframe|object|embed|link|style)[^>]*>/gi,"").replace(/\son\w+\s*=\s*(['"]).*?\1/gi,"").replace(/\s(href|src)\s*=\s*(['"])\s*javascript:[^'"]*\2/gi,"")}function F(t,...e){return t.reduce((n,r,o)=>{let s=o<e.length?de(e[o]):"";return n+r+s},"")}var pe=t=>t.replace(/<\/?(script|iframe|object|embed|link|meta|style)[^>]*>/gi,"").replace(/\s+on[a-z]+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi,"").replace(/\s+(href|src)\s*=\s*(['"]?)\s*javascript:[^'"\s>]*/gi,""),fe=t=>t?.map(e=>pe(e)).join("")??"";import z from"dompurify";var I=(t,e)=>{let r={...{ADD_TAGS:["my-custom-tag"]},...e};return typeof t=="string"?z.sanitize(t,r):z.sanitize(t.innerHTML,r)};var _=(t,e,n)=>{if(typeof t=="string"){let r=document.getElementById(t);r?r.addEventListener(e,n):console.warn(`Element with id '${t}' not found.`)}else t===document?document.addEventListener(e,n):console.warn("Invalid id parameter provided.")};import{createStore as he}from"zustand/vanilla";import q from"dompurify";function ge(t,e){let n=[],r=t.replace(/:[^/]+/g,a=>(n.push(a.slice(1)),"([^/]+)")),o=new RegExp(`^${r}$`),s=e.match(o),i={};return s&&n.forEach((a,c)=>{i[a]=q.sanitize(s[c+1]??"")}),i}function Te(t){let e={},n=new URLSearchParams(t);for(let[r,o]of n.entries())e[r]=q.sanitize(o);return e}var A=he((t,e)=>({params:{},query:{},setFromPattern:n=>{let r=window.location.pathname,o=ge(n,r),s=Te(window.location.search);t({params:o,query:s})},getParam:n=>e().params[n],getQuery:n=>e().query[n]}));function U(t){let e=A.getState();e.setFromPattern(t);let n=e.params,r=e.query;return{...n,...r}}var j=(t,e,n)=>{let r=document.querySelectorAll(t);return r.forEach(o=>{o.addEventListener(e,n)}),()=>{r.forEach(o=>{o.removeEventListener(e,n)})}};import C from"dompurify";var W=(t,e,n,r={})=>{let o={USE_PROFILES:{svg:!0,html:!0},ALLOWED_TAGS:["svg","path","circle","rect","line","polyline","polygon","g","main","div","h1","h2","h3","h4","h5","h6","p","button","span","a","img","input","ul","li","i"],ALLOWED_ATTR:["class","id","href","src","alt","fill","stroke","stroke-width","viewBox","xmlns","d","x","y","cx","cy","r","width","height","data-onclick","data-onchange","data-onselect"],FORBID_TAGS:["script","iframe"],ALLOWED_URI_REGEXP:/^(?:(?:https?|mailto|tel|ftp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,...n};C.addHook("uponSanitizeElement",(i,a)=>{let c=a.tagName.toLowerCase();c.includes("-")&&(a.allowedTags[c]=!0)}),C.addHook("uponSanitizeAttribute",(i,a)=>{a.attrName&&a.attrName.toLowerCase().startsWith("on")&&(a.keepAttr=!1)});let s=C.sanitize(e,o);t.innerHTML=s,t.querySelectorAll("[data-onclick]").forEach(i=>{let a=i.dataset.onclick;r[a]&&i.addEventListener("click",r[a])}),t.querySelectorAll("[data-onchange]").forEach(i=>{let a=i.dataset.onchange;r[a]&&i.addEventListener("change",r[a])}),t.querySelectorAll("[data-onselect]").forEach(i=>{let a=i.dataset.onselect;r[a]&&i.addEventListener("select",r[a])})};import Se from"dompurify";var P=null,B=(t,e)=>{if(typeof document>"u")return;let n=document.getElementById(t);if(!n)return;let r=n.innerHTML,s=Se.sanitize(r,{ALLOWED_TAGS:["div","span","p","h1","h2","h3","h4","h5","h6","ul","ol","li","strong","em","a","img","br"],ALLOWED_ATTR:["href","src","alt","title","class","id","data-onclick","data-onchange"],ALLOW_DATA_ATTR:!1,KEEP_CONTENT:!1}).replace(/\b(href|src)=["']?(?!https?:|mailto:|\/|#)/gi,'$1="#"');if(P!==null&&s!==P){let i=document.createElement("div");e(i),n.innerHTML=P}else P=s,n.innerHTML=s,e(n)};import Q from"dompurify";typeof window<"u"&&!window.__anchorSinglePopstateHandlerAttached&&(window.addEventListener("popstate",t=>{let e=t.state;e?.scrollPosition!==void 0&&window.scrollTo(0,e.scrollPosition)}),window.__anchorSinglePopstateHandlerAttached=!0);var G=(t,e,n,r="",o=null)=>{if(!t)return;let s=Q.sanitize(e,{ALLOWED_URI_REGEXP:/^(https?:|\/)/}),i=Q.sanitize(n,{USE_PROFILES:{html:!1}});t.setAttribute("href",s),t.setAttribute("aria-label",i),r&&(t.className=r.trim()),o&&t.replaceChildren(o),typeof window<"u"&&t.addEventListener("click",a=>{a.preventDefault();let l=a.currentTarget.getAttribute("href");if(l){let h=window.scrollY;window.scrollTo(0,0),window.history.pushState({scrollPosition:h},"",l),dispatchEvent(new PopStateEvent("popstate"))}})};import R from"dompurify";var V=(t="'self' 'nonce-rAnd0m123' 'unsafe-inline' 'unsafe-eval'",e="'self' 'nonce-rAnd0m123'",n="'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/"],i="'self' https://www.youtube.com",a="'self'",c="/csp-report",l=!1)=>{let h=()=>{try{let u=document.querySelector('meta[http-equiv="Content-Security-Policy"]');u||(u=document.createElement("meta"),u.setAttribute("http-equiv","Content-Security-Policy"),document.head.appendChild(u));let E=l?`report-uri ${c};`:"";u.setAttribute("content",`default-src 'self'; script-src ${t}; style-src ${e}; object-src ${n}; font-src ${r}; img-src ${o}; connect-src ${s.join(" ")}; frame-src ${i}; base-uri ${a}; ${E}`)}catch(u){console.error("Error adding CSP meta element:",u)}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",h):h()};var J=(t,e)=>{let n={name:R.sanitize(t.name||""),description:R.sanitize(t.description||"Default description"),author:R.sanitize(t.author||"")},r=p=>{n.name=R.sanitize(p),u("name",n.name)},o=p=>{n.description=R.sanitize(p),u("description",n.description)},s=p=>{n.author=R.sanitize(p),u("author",n.author)},i=()=>n.name,a=()=>n.description,c=()=>n.author,l=()=>n,h=(p,M)=>{let y=document.createElement("meta");y.setAttribute("name",p),y.setAttribute("content",M),document.head.appendChild(y)},u=(p,M)=>{let y=document.querySelector(`meta[name="${p}"]`);y?y.setAttribute("content",M):h(p,M)},E=()=>{u("name",n.name),u("description",n.description),u("author",n.author)};return e&&V(e.scriptSrc,e.styleSrc,e.objectSrc,Array.isArray(e.connectSrc)?e.connectSrc.join(" "):e.connectSrc,e.reportOnly!==void 0?String(e.reportOnly):void 0),E(),{setName:r,setDescription:o,setAuthor:s,getName:i,getDescription:a,getAuthor:c,getAllMetaData:l,appendMetaTagsToHead:E}};import Ee from"dompurify";var x=(t,e,n,r,o)=>{let s=`#${t}`,i=e.querySelectorAll(s);if(i.length===0)throw new Error(`[useTSComponent] No element found with id '${t}' in the given parent.`);if(i.length>1)throw new Error(`[useTSComponent] Duplicate id '${t}' detected. Found ${i.length} elements.`);let a=i[0];a.innerHTML=Ee.sanitize(a.innerHTML,{USE_PROFILES:{html:!0}}),n(a,r,o)};var X=(t,e,n,r=[])=>{let o=new Set;t.forEach((s,i)=>{if(o.has(s)){console.warn(`[useTSCollection] Duplicate ID in collection array: "${s}" \u2014 skipping.`);return}o.add(s);let a=e.querySelectorAll(`#${s}`);if(a.length>1){console.warn(`[useTSCollection] Duplicate ID in DOM: "${s}" (${a.length} elements found) \u2014 skipping component mount.`);return}let c=n[i],l=Array.isArray(r)?r[i]:void 0;typeof c=="function"?x(s,e,c,l):console.warn(`[useTSCollection] No valid component function found for ID: "${s}"`)})};var Y=(t,e)=>{let r=(e??document).querySelectorAll(t);if(r.length===0)return process.env.NODE_ENV!=="production"&&console.warn(`[useTSSelect] No element found for selector: '${t}'`),null;if(t.startsWith("#")&&r.length>1){if(process.env.NODE_ENV!=="production")throw new Error(`[useTSSelect] Duplicate ID detected: '${t}'. Found ${r.length} elements with this ID.`);return r[0]}return r.length>1&&process.env.NODE_ENV!=="production"&&console.warn(`[useTSSelect] Multiple elements found for selector: '${t}'. Returning the first one.`),r[0]};import{jwtDecode as ye}from"jwt-decode";var K=(t,e)=>{let n=localStorage.getItem("token");if(!n)return window.location.href=e,null;try{let r=ye(n),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 D=(t,e,n)=>{t.forEach(r=>{e.forEach(o=>{r.addEventListener(o,s=>{n(r,s)})})})};var Z=()=>({back:()=>window.history.back(),forward:()=>window.history.forward()});var ee=(t,e)=>{let n=document.querySelector(`#${t}`)||document.querySelector(`.${t}`);if(!n)return;let r=window.location.pathname.replace(/\/$/,"");for(let o of e){let s=o.path.replace(/\/$/,"");if(r===s||r.startsWith(`${s}/`)){o.component(n);break}}};function te(t,e){let n=window.location.pathname.replace(/\/$/,"");e.routes.forEach(r=>{r.children?.length&&r.children.forEach(o=>{let s=o.path.replace(/\/$/,"");if(n===s||n.startsWith(`${s}/`)){let i=t.querySelector(`#${o.outlet}`)||t.querySelector(`.${o.outlet}`);i instanceof HTMLElement&&o.element&&o.element(i)}})})}import{createStore as ve}from"zustand/vanilla";function ne(t){let e=ve(()=>({value:t})),n=new Set;return{get:()=>e.getState().value,set:r=>{e.setState({value:r}),n.forEach(o=>o(r))},subscribe:r=>(n.add(r),r(e.getState().value),()=>n.delete(r))}}function re(t){let e=t();typeof e=="function"&&e()}var H=()=>{let t=document.querySelectorAll('a[href^="#"]');D(t,["click"],(e,n)=>{n.preventDefault();let r=e.getAttribute("href")?.substring(1),o=r?document.getElementById(r):null;o&&o.scrollIntoView({behavior:"smooth",block:"start"})})};import{debounce as we}from"lodash-es";var $=t=>t;typeof window<"u"&&typeof document<"u"&&($=t=>{let e=document.createElement("div");return e.innerText=t,e.innerHTML});var Le=t=>{(t?Array.isArray(t)?t:t instanceof HTMLAnchorElement?[t]:Array.from(t):Array.from(document.querySelectorAll("a"))).forEach(n=>{if(!n||n.dataset.anchorEnhanced==="true")return;n.dataset.anchorEnhanced="true";let r=n.getAttribute("class")||"";n.setAttribute("class",$(r));let o=n.getAttribute("aria-label");o&&n.setAttribute("aria-label",$(o));let s=n.querySelector(":scope > *");s&&(n.innerHTML="",n.appendChild(s));let i=n.getAttribute("href")||"";if(!i.startsWith("#")){try{if(new URL(i,window.location.href).origin!==window.location.origin)return}catch{return}n.addEventListener("click",a=>{a.preventDefault();let c=n.getAttribute("href")||"";try{let l=new URL(c,window.location.href);window.history.pushState({},"",l.pathname+l.search+l.hash),window.dispatchEvent(new PopStateEvent("popstate"))}catch(l){console.error("Invalid URL in anchor:",c,l)}})}})},Me=we(Le,50),b=t=>{Me(t)};var O=t=>{let e=t.querySelectorAll("a");b(e)};var oe=t=>{H(),O(t)};var se=async()=>{let t="https://cdn.jsdelivr.net/npm/brython@3/brython.min.js",e="https://cdn.jsdelivr.net/npm/brython@3/brython_stdlib.js",n=r=>new Promise((o,s)=>{let i=document.createElement("script");i.src=r,i.onload=()=>o(),i.onerror=()=>s(new Error(`Failed to load ${r}`)),document.head.appendChild(i)});await n(t),await n(e),typeof window.brython=="function"?window.brython():console.error("Brython did not load correctly.")},ie=t=>new Promise((e,n)=>{let r=document.createElement("script");r.type="text/python",r.src=`/src/python/${t}`,r.onload=()=>e(),r.onerror=()=>n(new Error(`Failed to load ${t}`)),document.body.appendChild(r)});function ae(t){let e=null;return async(n,r)=>{try{if(!e){let o=await t();e=o.default||o}if(typeof e=="function")return e(n,r);if(e instanceof HTMLElement){n?.appendChild(e);return}if(e&&typeof e.render=="function")return e.render(n,r);console.warn("useTSLazy: Unsupported module type",e)}catch(o){console.error("useTSLazy failed:",o)}}}var ce=t=>typeof window>"u"?{isDOM:null}:{isDOM:t||document.body};import ue from"dompurify";import{createStore as Re}from"zustand/vanilla";import Ae from"dompurify";var L=Re(t=>({params:{},query:{},setParams:e=>t(()=>({params:le(e)})),setQuery:e=>t(()=>({query:le(e)}))}));function le(t){let e={};for(let n in t)e[n]=Ae.sanitize(t[n]);return e}var k=class{constructor(e,n){this.routes=[];this.routes=e,this.expectedParams=new Set(n),window.addEventListener("popstate",this.handlePopState.bind(this)),this.handlePopState()}handlePopState(){let e=window.location.pathname,n=window.location.search,r=this.parseQueryParams(n),o=this.findMatchingRoute(e,this.routes);if(o){if(o.routeto){this.navigate(o.routeto);return}let s=this.filterAndSanitizeParams(o.params);L.getState().setParams(s),L.getState().setQuery(r);let i=document.createElement("div");if(o.element?.(i,s,r),o.children){let a=e.slice(o.path.length),c=i.querySelector("#child");c&&this.renderChildren(o.children,a,c,s,r)}}else{let s=this.findMatchingRoute("*",this.routes);if(s){let i=this.filterAndSanitizeParams(s.params);L.getState().setParams(i),L.getState().setQuery(r);let a=document.createElement("div");s.element?.(a,i,r)}}}renderChildren(e,n,r,o,s){if(!e||e.length===0){let a=r.querySelector("#child");a&&a.remove();return}let i=this.findMatchingRoute(n,e);if(i){let a=document.createElement("div");a.id="child";let c={...o,...i.params},l=this.filterAndSanitizeParams(c);if(L.getState().setParams(l),L.getState().setQuery(s),i.element?.(a,l,s),r.appendChild(a),i.children){let h=n.slice(i.path.length);this.renderChildren(i.children,h,a,l,s)}}}parseQueryParams(e){let n={},r=new URLSearchParams(e);for(let[o,s]of r.entries())this.expectedParams.has(o)&&(n[o]=ue.sanitize(s));return n}findMatchingRoute(e,n,r={}){for(let o of n){let s=o.path;if(s==="*")return o;{let a=[],c=s.replace(/:[^\s/]+/g,u=>(a.push(u.substring(1)),"([^\\s/]+)")),l=new RegExp(`^${c}(?:/|$)`),h=e.match(l);if(h){let u={...r};if(a.forEach((E,p)=>{u[E]=h[p+1]??""}),o.children){let E=e.slice(h[0].length),p=this.findMatchingRoute(E,o.children,u);if(p)return p}return{...o,params:u}}}}}filterAndSanitizeParams(e){if(!e)return{};let n={};for(let r in e)this.expectedParams.has(r)&&(n[r]=ue.sanitize(e[r]??""));return n}navigate(e){history.pushState(null,"",e),this.handlePopState()}addRoute(e){this.routes.push(e)}};var Pe=async()=>{if(typeof window<"u")return;let t=await import("fs/promises"),e=await import("path"),n=await import("chokidar"),r;try{r=(await import("stream")).Readable}catch{}let o=e.resolve("src/pages"),s=e.resolve("src/gen"),i=e.resolve("src/routes"),a=e.join(s,"tsrouter.gen.ts"),c=e.join(i,"__root.ts");async function l(d){try{await t.mkdir(d,{recursive:!0})}catch{}}function h(d,m){let f="/"+e.relative(m,d).replace(/\\/g,"/");return f=f.replace(/\.ts$/,"").replace(/\/index$/,"")||"/",f.replace(/\[(.+?)\]/g,":$1")}function u(d){return d.replace(/^\//,"").split("/").map(m=>m.startsWith(":")?m.slice(1):m).filter(Boolean).join("-")||"index"}function E(d,m){let g=e.relative(m,d).replace(/\\/g,"/").split("/").filter(Boolean),T=g[g.length-1].replace(".ts",""),v=g.length>1?g[g.length-2]:"";if(T.startsWith("[")&&T.endsWith("]")){let w=T.slice(1,-1);return v.charAt(0).toUpperCase()+v.slice(1)+w.charAt(0).toUpperCase()+w.slice(1)+"Param"}else return T.charAt(0).toUpperCase()+T.slice(1)}async function p(d){let m=await t.readdir(d,{withFileTypes:!0}),f=[];for(let g of m){let T=e.join(d,g.name);if(g.isDirectory())f=f.concat(await p(T));else if(g.isFile()&&g.name.endsWith(".ts")){let v=h(T,o),w=u(v),S=E(T,o);f.push({file:T,route:v,routeName:w,importName:S})}}return f}function M(d,m){let f=m.includes(":");return`import { html, useTSElements, useTSMetaData${f?", useTSExtractParams":""} } from '@devwareng/vanilla-ts'
2
2
 
3
3
  export default function ${d}(DOM: HTMLElement) {
4
4
  useTSMetaData({
@@ -20,7 +20,7 @@ export default function ${d}(DOM: HTMLElement) {
20
20
  );
21
21
 
22
22
  return ui;
23
- }`}function M(){return`import { createRouter } from "@/gen/tsrouter.gen";
23
+ }`}function y(){return`import { createRouter } from "@/gen/tsrouter.gen";
24
24
  import { useTSParams } from "@devwareng/vanilla-ts";
25
25
 
26
26
  export const Router = (DOM: HTMLElement) => {
@@ -31,7 +31,7 @@ export const Router = (DOM: HTMLElement) => {
31
31
  window.addEventListener("popstate", () => {
32
32
  router.navigate(window.location.pathname);
33
33
  });
34
- };`}async function y(){let d=await E(r),m=d.find(S=>S.route==="/notfound"),f=d.filter(S=>S.route!=="/notfound"),g=d.map(S=>{let ue="../pages/"+e.relative(r,S.file).replace(/\\/g,"/").replace(/\.ts$/,"");return`import ${S.importName} from "${ue}";`}).join(`
34
+ };`}async function N(){let d=await p(o),m=d.find(S=>S.route==="/notfound"),f=d.filter(S=>S.route!=="/notfound"),g=d.map(S=>{let me="../pages/"+e.relative(o,S.file).replace(/\\/g,"/").replace(/\.ts$/,"");return`import ${S.importName} from "${me}";`}).join(`
35
35
  `),T=f.map(S=>`{ path: "${S.route}", name: "${S.routeName}", component: (DOM: HTMLElement) => ${S.importName}(DOM) }`).join(`,
36
36
  `),v=m?`export const NotFound = ${m.importName}`:"export function NotFound(DOM: HTMLElement) {\n return useTSElements(DOM, html`<div><h1>404 - Page Not Found</h1></div>`)\n}",w=`// AUTO-GENERATED FILE. DO NOT EDIT MANUALLY.
37
37
  import { html, useTSElements } from "@devwareng/vanilla-ts"
@@ -83,4 +83,4 @@ export function createRouter(DOM: HTMLElement) {
83
83
  navigate(window.location.pathname + window.location.search)
84
84
  return { navigate, routes: routeTree }
85
85
  }
86
- `;await c(o),await t.writeFile(i,w,"utf-8"),await t.writeFile(a,M(),"utf-8")}await c(o),await c(s),await y(),n.watch(r).on("all",async(d,m)=>{if(d==="add"&&m.endsWith(".ts")){let g=e.basename(m,".ts").replace(/\[|\]/g,"Param").replace(/(^\w|-\w)/g,w=>w.replace("-","").toUpperCase()),T=l(m,r);(await t.readFile(m,"utf-8")).trim()||await t.writeFile(m,p(g,T),"utf-8"),await y()}}),n.watch(a).on("unlink",async()=>{await t.writeFile(a,M(),"utf-8")}),console.log("\u{1F7E2} TS Filebased Router Mounted Successfully...")};export{Ae as TSFilebasedRouter,k as TSRouter,ne as createEffect,te as createSignal,N as html,se as loadPyFiles,pe as mapper,ee as renderChildRoutes,O as useAnchor,Q as useAnchorSingle,W as useInitialDOM,re as useTSAnchorMount,Y as useTSAuth,J as useTSCollection,x as useTSComponent,D as useTSElementEach,j as useTSElements,I as useTSEvent,U as useTSEventAll,q as useTSExtractParams,H as useTSHashAnchor,ie as useTSLazy,V as useTSMetaData,K as useTSNavigate,b as useTSNoReload,Z as useTSOutlet,A as useTSParams,z as useTSPurifier,ae as useTSSSRHydration,X as useTSSelect,oe as useTSloadBrython};
86
+ `;await l(s),await t.writeFile(a,w,"utf-8"),await t.writeFile(c,y(),"utf-8")}await l(s),await l(i),await N(),n.watch(o).on("all",async(d,m)=>{if(d==="add"&&m.endsWith(".ts")){let g=e.basename(m,".ts").replace(/\[|\]/g,"Param").replace(/(^\w|-\w)/g,w=>w.replace("-","").toUpperCase()),T=h(m,o);(await t.readFile(m,"utf-8")).trim()||await t.writeFile(m,M(g,T),"utf-8"),await N()}}),n.watch(c).on("unlink",async()=>{await t.writeFile(c,y(),"utf-8")}),console.log("\u{1F7E2} TS Filebased Router Mounted Successfully...")};export{Pe as TSFilebasedRouter,k as TSRouter,re as createEffect,ne as createSignal,F as html,ie as loadPyFiles,fe as mapper,te as renderChildRoutes,b as useAnchor,G as useAnchorSingle,B as useInitialDOM,oe as useTSAnchorMount,K as useTSAuth,X as useTSCollection,x as useTSComponent,D as useTSElementEach,W as useTSElements,_ as useTSEvent,j as useTSEventAll,U as useTSExtractParams,H as useTSHashAnchor,ae as useTSLazy,J as useTSMetaData,Z as useTSNavigate,O as useTSNoReload,ee as useTSOutlet,A as useTSParams,I as useTSPurifier,ce as useTSSSRHydration,Y as useTSSelect,se as useTSloadBrython};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devwareng/vanilla-ts",
3
- "version": "1.4.47",
3
+ "version": "1.4.48",
4
4
  "description": "Framework-less TypeScript hooks for SPA development.",
5
5
  "author": "Waren Arapoc Gador",
6
6
  "license": "MIT",