@devwareng/vanilla-ts 1.4.69 → 1.5.113

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.js CHANGED
@@ -1,26 +1,56 @@
1
- function ue(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 k(t,...e){return t.reduce((n,r,o)=>{let s=o<e.length?ue(e[o]):"";return n+r+s},"")}var me=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=>me(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 pe}from"zustand/vanilla";import _ from"dompurify";function fe(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 he(t){let e={},n=new URLSearchParams(t);for(let[r,o]of n.entries())e[r]=_.sanitize(o);return e}var x=pe((t,e)=>({params:{},query:{},setFromPattern:n=>{let r=window.location.pathname,o=fe(n,r),s=he(window.location.search);t({params:o,query:s})},getParam:n=>e().params[n],getQuery:n=>e().query[n]}));function q(t){let e=x.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 O 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};O.addHook("uponSanitizeElement",(i,a)=>{let c=a.tagName.toLowerCase();c.includes("-")&&(a.allowedTags[c]=!0)}),O.addHook("uponSanitizeAttribute",(i,a)=>{a.attrName&&a.attrName.toLowerCase().startsWith("on")&&(a.keepAttr=!1)});let s=O.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 ge from"dompurify";var A=null,W=(t,e)=>{if(typeof document>"u")return;let n=document.getElementById(t);if(!n)return;let r=n.innerHTML,s=ge.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(A!==null&&s!==A){let i=document.createElement("div");e(i),n.innerHTML=A}else A=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 G=(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 T=window.scrollY;window.scrollTo(0,0),window.history.pushState({scrollPosition:T},"",l),dispatchEvent(new PopStateEvent("popstate"))}})};import R from"dompurify";var Q=(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 T=()=>{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",T):T()};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,T=(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):T(p,M)},E=()=>{u("name",n.name),u("description",n.description),u("author",n.author)};return e&&Q(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 Te from"dompurify";var D=(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=Te.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"?D(s,e,c,l):console.warn(`[useTSCollection] No valid component function found for ID: "${s}"`)})};var P=(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 Se}from"jwt-decode";var X=(t,e)=>{let n=localStorage.getItem("token");if(!n)return window.location.href=e,null;try{let r=Se(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 b=(t,e,n)=>{t.forEach(r=>{e.forEach(o=>{r.addEventListener(o,s=>{n(r,s)})})})};var Y=()=>({back:()=>window.history.back(),forward:()=>window.history.forward()});var K=(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 Z(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 Ee}from"zustand/vanilla";function ee(t){let e=Ee(()=>({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 te(t){let e=t();typeof e=="function"&&e()}var ne=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.")},re=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 oe(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 se=t=>typeof window>"u"?{isDOM:null}:{isDOM:t||document.body};import{debounce as ye}from"lodash-es";var H=t=>t;typeof window<"u"&&typeof document<"u"&&(H=t=>{let e=document.createElement("div");return e.innerText=t,e.innerHTML});var ve=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",H(r));let o=n.getAttribute("aria-label");o&&n.setAttribute("aria-label",H(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)}})}})},we=ye(ve,50),ie=t=>{we(t)};var ae=()=>{let t=P("a");ie(t)};import le from"dompurify";import{createStore as Le}from"zustand/vanilla";import Me from"dompurify";var L=Le(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]=Me.sanitize(t[n]);return e}var C=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 T=n.slice(i.path.length);this.renderChildren(i.children,T,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}(?:/|$)`),T=e.match(l);if(T){let u={...r};if(a.forEach((E,p)=>{u[E]=T[p+1]??""}),o.children){let E=e.slice(T[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 Re=()=>({name:"ts-filebased-router",async buildStart(){if(typeof process>"u"||!process.versions?.node)return;let t=await import("fs/promises"),e=await import("path"),n=await import("./esm-KRNKVVL7.js"),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"),c=process.env.NODE_ENV!=="production";async function l(d){try{await t.mkdir(d,{recursive:!0})}catch{}}function T(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),S=g[g.length-1].replace(".ts",""),v=g.length>1?g[g.length-2]:"";if(S.startsWith("[")&&S.endsWith("]")){let w=S.slice(1,-1);return v.charAt(0).toUpperCase()+v.slice(1)+w.charAt(0).toUpperCase()+w.slice(1)+"Param"}else return S.charAt(0).toUpperCase()+S.slice(1)}async function p(d){let m=await t.readdir(d,{withFileTypes:!0}),f=[];for(let g of m){let S=e.join(d,g.name);if(g.isDirectory())f=f.concat(await p(S));else if(g.isFile()&&g.name.endsWith(".ts")){let v=T(S,r),w=u(v),h=E(S,r);f.push({file:S,route:v,routeName:w,importName:h})}}return f}function M(d,m){let f=m.includes(":"),g=f?m.match(/:([^/]+)/)?.[1]:null;return`import { html, useTSElements, useTSMetaData${f?", useTSExtractParams":""} } from '@devwareng/vanilla-ts';
1
+ function fe(t){let e=t==null?"":String(t),n=e.toLowerCase();return(n.includes("<script")||n.includes("javascript:"))&&(e=""),e.replace(/<\s*(script|iframe|object|embed|link|style|meta|body)[^>]*>.*?<\s*\/\s*\1\s*>/gi,"").replace(/<\s*(script|iframe|object|embed|link|style|meta)[^>]*>/gi,"").replace(/\s+on\w+\s*=\s*(['"]).*?\1/gi,"").replace(/\s+on\w+\s*=\s*[^\s>]+/gi,"").replace(/\s(href|src)\s*=\s*(['"]?)\s*(javascript:|vbscript:|data:|file:)[^'">\s]*\2/gi,'$1="#"')}function F(t,...e){return t.reduce((n,r,o)=>{let s=o<e.length?fe(e[o]):"";return n+r+s},"")}var he=t=>t.replace(/<\/?(script|iframe|object|embed|link|meta|style|form|textarea|svg|math|body)[^>]*>/gi,"").replace(/<(?!\/?(b|i|em|strong|p|br|ul|ol|li|a|div|span|h1|h2|h3|h4|h5|h6|section|article|input|button)\b)[^>]*>/gi,"").replace(/\s+on[a-z]+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi,"").replace(/\s*style\s*=\s*("[^"]*"|'[^']*')/gi,"").replace(/<a\b([^>]*)href\s*=\s*(['"]?)(?!https?:|#)[^'"\s>]+(['"]?)([^>]*)>/gi,"<a$1$4>").replace(/\s+(href|src)\s*=\s*(['"]?)\s*(javascript:|data:)[^'"\s>]*/gi,"").replace(/<a\b([^>]*)\bhref\s*=\s*(['"])(\/blog|#blog)\2([^>]*)>/gi,'<a$1 href=$2$3$2 href-line="true"$4>').trim(),ge=t=>t?.map(e=>he(e)).join("")??"";import _ from"dompurify";var I=(t,e)=>{let r={...{ADD_TAGS:["my-custom-tag"]},...e};return typeof t=="string"?_.sanitize(t,r):_.sanitize(t.innerHTML,r)};var z=(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 Te}from"zustand/vanilla";import q from"dompurify";function Se(t,e){let n=[],r=t.replace(/:[^/]+/g,i=>(n.push(i.slice(1)),"([^/]+)")),o=new RegExp(`^${r}$`),s=e.match(o),a={};return s&&n.forEach((i,c)=>{a[i]=q.sanitize(s[c+1]??"")}),a}function Ee(t){let e={},n=new URLSearchParams(t);for(let[r,o]of n.entries())e[r]=q.sanitize(o);return e}var P=Te((t,e)=>({params:{},query:{},setFromPattern:n=>{let r=window.location.pathname,o=Se(n,r),s=Ee(window.location.search);t({params:o,query:s})},getParam:n=>e().params[n],getQuery:n=>e().query[n]}));function j(t){let e=P.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 B 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","label","form"],ALLOWED_ATTR:["class","id","href","src","alt","title","fill","stroke","stroke-width","viewBox","xmlns","d","x","y","cx","cy","r","width","height","type","name","value","placeholder","data-click","data-change","data-select","data-classlist","data-hover","data-submit"],FORBID_TAGS:["script","iframe","foreignObject","body","html"],FORBID_ATTR:["style","xlink:href","on*"],ALLOWED_URI_REGEXP:/^(?:(?:https?|mailto|tel|ftp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,...r};B.addHook("uponSanitizeAttribute",(i,c)=>{let l=(c.attrName||"").toLowerCase(),m=(c.attrValue??"").toString().trim();if(/^data-(click|change|submit|select|hover|classlist)$/.test(l)){c.keepAttr=!0;return}if(l.startsWith("on")){c.keepAttr=!1;return}if(i.nodeName.toLowerCase()==="img"&&l==="src"){/^https?:\/\//i.test(m)||/^\/(?!\/)/.test(m)||/^data:image\/(png|jpeg|jpg|gif|webp);base64,/i.test(m)||(c.keepAttr=!1);return}if(l==="class"){let y=m.split(/\s+/).filter(Boolean).filter(d=>/^[a-zA-Z0-9\-\:\/_]+$/.test(d));c.attrValue=y.join(" ");return}});let s=B.sanitize(e,{...o,RETURN_DOM_FRAGMENT:!0});t.innerHTML="",t.appendChild(s);let a=(i,c)=>{t.querySelectorAll(`[${i}]`).forEach(l=>{let m=l.getAttribute(i);m&&Object.prototype.hasOwnProperty.call(n,m)&&l.addEventListener(c,u=>{c==="submit"&&u.preventDefault(),n[m](u)})})};a("data-click","click"),a("data-change","change"),a("data-select","select"),a("data-submit","submit"),t.querySelectorAll("[data-hover]").forEach(i=>{let c=i.dataset.hover;c&&Object.prototype.hasOwnProperty.call(n,c)&&(i.addEventListener("mouseenter",n[c]),i.addEventListener("mouseleave",n[c]))}),t.querySelectorAll("[data-classlist]").forEach(i=>{let c=i.dataset.classlist;/^[a-zA-Z0-9\-\s:_]+$/.test(c)&&i.classList.add(...c.split(/\s+/))})};import ye from"dompurify";var D=null,G=(t,e)=>{if(typeof document>"u")return;let n=document.getElementById(t);if(!n)return;let r=n.innerHTML,s=ye.sanitize(r,{USE_PROFILES:{html:!0},ALLOWED_TAGS:["div","span","p","h1","h2","h3","h4","h5","h6","ul","ol","li","strong","em","a","img","br","form","button","input","label"],ALLOWED_ATTR:["href","src","alt","title","class","id","type","name","value","placeholder","data-click","data-change","data-submit","data-select","data-hover","data-classlist"],FORBID_TAGS:["script","iframe","object","embed","body","html"],FORBID_ATTR:["style","srcset","on*"],ALLOW_DATA_ATTR:!0,KEEP_CONTENT:!1}).replace(/\b(href|src)=["']?([^"'>\s]+)/gi,(a,i,c)=>/^https?:\/\//i.test(c)||/^mailto:/i.test(c)||/^tel:/i.test(c)||/^\/(?!\/)/.test(c)||/^#/.test(c)||/^data:image\/(png|jpeg|jpg|gif|webp);base64,/i.test(c)?`${i}="${c}"`:`${i}="#"`);if(D!==null&&s!==D){let a=document.createElement("div");e(a),n.innerHTML=D}else D=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 V=(t,e,n,r="",o=null)=>{if(!t)return;let s=Q.sanitize(e,{ALLOWED_URI_REGEXP:/^(https?:|\/)/}),a=Q.sanitize(n,{USE_PROFILES:{html:!1}});t.setAttribute("href",s),t.setAttribute("aria-label",a),r&&(t.className=r.trim()),o&&t.replaceChildren(o),typeof window<"u"&&t.addEventListener("click",i=>{i.preventDefault();let l=i.currentTarget.getAttribute("href");if(l){let m=window.scrollY;window.scrollTo(0,0),window.history.pushState({scrollPosition:m},"",l),dispatchEvent(new PopStateEvent("popstate"))}})};import R from"dompurify";var Y=(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/"],a="'self' https://www.youtube.com",i="'self'",c="/csp-report",l=!1)=>{let m=()=>{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 ${a}; base-uri ${i}; ${y}`)}catch(u){console.error("Error adding CSP meta element:",u)}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",m):m()};var J=(t,e)=>{let n={name:R.sanitize(t.name||""),description:R.sanitize(t.description||"Default description"),author:R.sanitize(t.author||"")},r=d=>{n.name=R.sanitize(d),u("name",n.name)},o=d=>{n.description=R.sanitize(d),u("description",n.description)},s=d=>{n.author=R.sanitize(d),u("author",n.author)},a=()=>n.name,i=()=>n.description,c=()=>n.author,l=()=>n,m=(d,M)=>{let v=document.createElement("meta");v.setAttribute("name",d),v.setAttribute("content",M),document.head.appendChild(v)},u=(d,M)=>{let v=document.querySelector(`meta[name="${d}"]`);v?v.setAttribute("content",M):m(d,M)},y=()=>{u("name",n.name),u("description",n.description),u("author",n.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),y(),{setName:r,setDescription:o,setAuthor:s,getName:a,getDescription:i,getAuthor:c,getAllMetaData:l,appendMetaTagsToHead:y}};import ve from"dompurify";var O=(t,e,n,r,o)=>{let s=`#${t}`,a=e.querySelectorAll(s);if(a.length===0)throw new Error(`[useTSComponent] No element found with id '${t}' in the given parent.`);if(a.length>1)throw new Error(`[useTSComponent] Duplicate id '${t}' detected. Found ${a.length} elements.`);let i=a[0];i.innerHTML=ve.sanitize(i.innerHTML,{USE_PROFILES:{html:!0}}),n(i,r,o)};var K=(t,e,n,r=[])=>{let o=new Set;t.forEach((s,a)=>{if(o.has(s)){console.warn(`[useTSCollection] Duplicate ID in collection array: "${s}" \u2014 skipping.`);return}o.add(s);let i=e.querySelectorAll(`#${s}`);if(i.length>1){console.warn(`[useTSCollection] Duplicate ID in DOM: "${s}" (${i.length} elements found) \u2014 skipping component mount.`);return}let c=n[a],l=Array.isArray(r)?r[a]:void 0;typeof c=="function"?O(s,e,c,l):console.warn(`[useTSCollection] No valid component function found for ID: "${s}"`)})};var A=(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 we}from"jwt-decode";var X=(t,e)=>{let n=localStorage.getItem("token");if(!n)return window.location.href=e,null;try{let r=we(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 H=(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 a=t.querySelector(`#${o.outlet}`)||t.querySelector(`.${o.outlet}`);a instanceof HTMLElement&&o.element&&o.element(a)}})})}import{createStore as Le}from"zustand/vanilla";function ne(t){let e=Le(()=>({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 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 a=document.createElement("script");a.src=r,a.onload=()=>o(),a.onerror=()=>s(new Error(`Failed to load ${r}`)),document.head.appendChild(a)});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){let o=e.cloneNode(!0);return n?.appendChild(o),o}if(typeof e=="object"&&e!==null&&"render"in 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{debounce as Me}from"lodash-es";var C=t=>t;typeof window<"u"&&typeof document<"u"&&(C=t=>{let e=document.createElement("div");return e.innerText=t,e.innerHTML});var Re=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",C(r));let o=n.getAttribute("aria-label");o&&n.setAttribute("aria-label",C(o));let s=n.querySelector(":scope > *");s&&(n.innerHTML="",n.appendChild(s));let a=n.getAttribute("href")||"";if(!a.startsWith("#")){try{if(new URL(a,window.location.href).origin!==window.location.origin)return}catch{return}n.addEventListener("click",i=>{i.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)}})}})},Ae=Me(Re,50),ce=t=>{Ae(t)};var le=t=>{if(!t)return;let e=A("a",t);ce(e)};import me from"dompurify";import{createStore as be}from"zustand/vanilla";import xe from"dompurify";var w=be(t=>({params:{},query:{},setParams:e=>t(()=>({params:ue(e)})),setQuery:e=>t(()=>({query:ue(e)}))}));function ue(t){let e={};for(let n in t)e[n]=xe.sanitize(t[n]);return e}var $=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);w.getState().setParams(s),w.getState().setQuery(r);let a=document.createElement("div");if(o.element?.(a,s,r),o.children){let i=e.slice(o.path.length),c=a.querySelector("#child");c&&this.renderChildren(o.children,i,c,s,r)}}else{let s=this.findMatchingRoute("*",this.routes);if(s){let a=this.filterAndSanitizeParams(s.params);w.getState().setParams(a),w.getState().setQuery(r);let i=document.createElement("div");s.element?.(i,a,r)}}}renderChildren(e,n,r,o,s){if(!e||e.length===0){let i=r.querySelector("#child");i&&i.remove();return}let a=this.findMatchingRoute(n,e);if(a){let i=document.createElement("div");i.id="child";let c={...o,...a.params},l=this.filterAndSanitizeParams(c);if(w.getState().setParams(l),w.getState().setQuery(s),a.element?.(i,l,s),r.appendChild(i),a.children){let m=n.slice(a.path.length);this.renderChildren(a.children,m,i,l,s)}}}parseQueryParams(e){let n={},r=new URLSearchParams(e);for(let[o,s]of r.entries())this.expectedParams.has(o)&&(n[o]=me.sanitize(s));return n}findMatchingRoute(e,n,r={}){for(let o of n){let s=o.path;if(s==="*")return o;{let i=[],c=s.replace(/:[^\s/]+/g,u=>(i.push(u.substring(1)),"([^\\s/]+)")),l=new RegExp(`^${c}(?:/|$)`),m=e.match(l);if(m){let u={...r};if(i.forEach((y,d)=>{u[y]=m[d+1]??""}),o.children){let y=e.slice(m[0].length),d=this.findMatchingRoute(y,o.children,u);if(d)return d}return{...o,params:u}}}}}filterAndSanitizeParams(e){if(!e)return{};let n={};for(let r in e)this.expectedParams.has(r)&&(n[r]=me.sanitize(e[r]??""));return n}navigate(e){history.pushState(null,"",e),this.handlePopState()}addRoute(e){this.routes.push(e)}};var Pe=()=>({name:"ts-filebased-router",async buildStart(){if(typeof process>"u"||!process.versions?.node)return;let t=await import("fs/promises"),e=await import("path"),n=await import("./esm-KRNKVVL7.js"),r=e.resolve("src/pages"),o=e.resolve("src/gen"),s=e.resolve("src/routes"),a=e.join(o,"tsrouter.gen.ts"),i=e.join(s,"__root.ts"),c=process.env.NODE_ENV!=="production";async function l(p){try{await t.mkdir(p,{recursive:!0})}catch{}}function m(p,f){let h="/"+e.relative(f,p).replace(/\\/g,"/");return h=h.replace(/\.ts$/,"").replace(/\/index$/,"")||"/",h.replace(/\[(.+?)\]/g,":$1")}function u(p){return p.replace(/^\//,"").split("/").map(f=>f.startsWith(":")?f.slice(1):f).filter(Boolean).join("-")||"index"}function y(p,f){let T=e.relative(f,p).replace(/\\/g,"/").split("/").filter(Boolean),S=T[T.length-1].replace(".ts",""),E=T.length>1?T[T.length-2]:"";if(S==="index")return E?E.charAt(0).toUpperCase()+E.slice(1):"Index";if(S.startsWith("[")&&S.endsWith("]")){let L=S.slice(1,-1);return E.charAt(0).toUpperCase()+L.charAt(0).toUpperCase()+L.slice(1)}return S.charAt(0).toUpperCase()+S.slice(1)}async function d(p){let f=await t.readdir(p,{withFileTypes:!0}),h=[];for(let T of f){let S=e.join(p,T.name);if(T.isDirectory())h=h.concat(await d(S));else if(T.isFile()&&T.name.endsWith(".ts")){let E=m(S,r),L=u(E),g=y(S,r);h.push({file:S,route:E,routeName:L,importName:g})}}return h}function M(){return`import { useInitialDOM } from "@devwareng/vanilla-ts";
2
+ import App from "./App";
2
3
 
3
- export default function ${d}(DOM: HTMLElement) {
4
+ useInitialDOM("app", App)`}function v(){return`import App from './App'
5
+
6
+ export function render(_url: string) {
7
+ const html = App()
8
+ return { html }
9
+ }`}function de(){return`import { html, useTSComponent, useTSElements, useTSNoReload, useTSSSRHydration } from '@devwareng/vanilla-ts'
10
+ import { Router } from './routes/__root';
11
+ import "tailwindcss/index.css"
12
+ import "animate.css"
13
+
14
+ export default function App(DOM?: HTMLElement) {
15
+ const { isDOM } = useTSSSRHydration(DOM!)
16
+ if (!isDOM) return
17
+
18
+ const ui = useTSElements(
19
+ isDOM,
20
+ html\`
21
+ <div class="min-h-screen text-white bg-black">
22
+ <div id="routes"></div>
23
+ </div>
24
+ \`
25
+ )
26
+
27
+ useTSNoReload(isDOM)
28
+ useTSComponent("routes", isDOM, Router)
29
+
30
+ return ui
31
+ }`}function N(p,f){let h=f.includes(":"),T=h?f.match(/:([^/]+)/)?.[1]:null;return`import { html, useTSElements, useTSMetaData${h?", useTSExtractParams":""} } from '@devwareng/vanilla-ts';
32
+
33
+ export default function ${p}(DOM: HTMLElement) {
4
34
  useTSMetaData({
5
- name: '${d.toLowerCase()}',
35
+ name: '${p.toLowerCase()}',
6
36
  description: '',
7
37
  author: ''
8
38
  });
9
39
 
10
- ${f?`const params = useTSExtractParams("${m}");
11
- if (!params.${g}) return;`:""}
40
+ ${h?`const params = useTSExtractParams("${f}");
41
+ if (!params.${T}) return;`:""}
12
42
  const ui = useTSElements(
13
43
  DOM,
14
44
  html\`
15
- <div class="p-4">
16
- <h1>${d}</h1>
17
- ${f?"<pre>${JSON.stringify(params, null, 2)}</pre>":""}
45
+ <div class="p-4 animate__animated animate__fadeIn duration-300">
46
+ <h1>${p}</h1>
47
+ ${h?"<pre>${JSON.stringify(params, null, 2)}</pre>":""}
18
48
  </div>
19
49
  \`
20
50
  );
21
51
 
22
52
  return ui
23
- }`}function y(){return`import { createRouter } from "@/gen/tsrouter.gen";
53
+ }`}function k(){return`import { createRouter } from "@/gen/tsrouter.gen";
24
54
  import { useTSParams } from "@devwareng/vanilla-ts";
25
55
 
26
56
  export const Router = (DOM: HTMLElement) => {
@@ -31,14 +61,14 @@ export const Router = (DOM: HTMLElement) => {
31
61
  window.addEventListener("popstate", () => {
32
62
  router.navigate(window.location.pathname);
33
63
  });
34
- };`}async function $(){let d=await p(r),m=d.find(h=>h.route==="/notfound"),f=d.filter(h=>h.route!=="/notfound");for(let h of d)(await t.readFile(h.file,"utf-8")).trim()||await t.writeFile(h.file,M(h.importName,h.route),"utf-8");let g=d.map(h=>{let N="../pages/"+e.relative(r,h.file).replace(/\\/g,"/").replace(/\.ts$/,"");return`import ${h.importName} from "${N}";`}).join(`
35
- `),S=f.map(h=>`{ path: "${h.route}", name: "${h.routeName}", component: (DOM: HTMLElement) => ${h.importName}(DOM) }`).join(`,
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.
64
+ };`}async function b(){let p=await d(r),f=p.find(g=>g.route==="/notfound"),h=p.filter(g=>g.route!=="/notfound");for(let g of p)(await t.readFile(g.file,"utf-8")).trim()||await t.writeFile(g.file,N(g.importName,g.route),"utf-8");let T=p.map(g=>{let x="../pages/"+e.relative(r,g.file).replace(/\\/g,"/").replace(/\.ts$/,"");return`import ${g.importName} from "${x}";`}).join(`
65
+ `),S=h.map(g=>`{ path: "${g.route}", name: "${g.routeName}", component: (DOM: HTMLElement) => ${g.importName}(DOM) }`).join(`,
66
+ `),E=f?`export const NotFound = ${f.importName}`:'export function NotFound(DOM: HTMLElement) {\n return useTSElements(DOM, html`<div class="animate__animated animate__fadeIn duration-300 p-4"><h1>404 - Page Not Found</h1></div>`)\n}',L=`// AUTO-GENERATED FILE. DO NOT EDIT MANUALLY.
37
67
  import { html, useTSElements } from "@devwareng/vanilla-ts"
38
68
 
39
- ${g}
69
+ ${T}
40
70
 
41
- ${v}
71
+ ${E}
42
72
 
43
73
  export function RootDocument(DOM: HTMLElement) {
44
74
  return useTSElements(DOM, html\`<div><h1>Root</h1></div>\`)
@@ -83,4 +113,4 @@ export function createRouter(DOM: HTMLElement) {
83
113
  navigate(window.location.pathname + window.location.search)
84
114
  return { navigate, routes: routeTree }
85
115
  }
86
- `;await l(o),await t.writeFile(i,w,"utf-8"),await t.writeFile(a,y(),"utf-8")}await l(o),await l(s),await $(),c&&(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()),S=T(m,r);(await t.readFile(m,"utf-8")).trim()||await t.writeFile(m,M(g,S),"utf-8"),await $()}}),n.watch(a).on("unlink",async()=>{await t.writeFile(a,y(),"utf-8")})),console.log("\u{1F7E2} TS Filebased Router Generated Successfully...")}});export{Re as TSFilebasedRouter,C as TSRouter,te as createEffect,ee as createSignal,k as html,re as loadPyFiles,de as mapper,Z as renderChildRoutes,G as useAnchorSingle,W as useInitialDOM,X as useTSAuth,J as useTSCollection,D as useTSComponent,b as useTSElementEach,j as useTSElements,I as useTSEvent,U as useTSEventAll,q as useTSExtractParams,oe as useTSLazy,V as useTSMetaData,Y as useTSNavigate,ae as useTSNoReload,K as useTSOutlet,x as useTSParams,z as useTSPurifier,se as useTSSSRHydration,P as useTSSelect,ne as useTSloadBrython};
116
+ `;await l(o),await t.writeFile(a,L,"utf-8"),await t.writeFile(i,k(),"utf-8")}if(await l(o),await l(s),await l(r),await b(),c){n.watch(r).on("all",async(S,E)=>{if(E.endsWith(".ts"))if(S==="add"){let g=e.basename(E,".ts").replace(/\[|\]/g,"Param").replace(/(^\w|-\w)/g,pe=>pe.replace("-","").toUpperCase()),x=m(E,r);(await t.readFile(E,"utf-8")).trim()||await t.writeFile(E,N(g,x),"utf-8"),await b()}else S==="unlink"?(console.log(`\u26A0\uFE0F File removed: ${E}`),await b()):S==="change"&&await b()});let f=e.resolve("src/entry-client.ts"),h=e.resolve("src/entry-server.ts");try{await t.access(f)}catch{await t.writeFile(f,M(),"utf-8"),console.log("\u{1F7E2} Created default src/entry-client.ts")}try{await t.access(h)}catch{await t.writeFile(h,v(),"utf-8"),console.log("\u{1F7E2} Created default src/entry-server.ts")}let T=e.resolve("src/App.ts");try{await t.access(T)}catch{await t.writeFile(T,de(),"utf-8"),console.log("\u{1F7E2} Created default src/App.ts")}n.watch(i).on("unlink",async()=>{console.log("\u26A0\uFE0F Root file removed: regenerating..."),await t.writeFile(i,k(),"utf-8")})}console.log("\u{1F7E2} TS Filebased Router Generated Successfully...")}});export{Pe as TSFilebasedRouter,$ as TSRouter,re as createEffect,ne as createSignal,F as html,se as loadPyFiles,ge as mapper,te as renderChildRoutes,V as useAnchorSingle,G as useInitialDOM,X as useTSAuth,K as useTSCollection,O as useTSComponent,H as useTSElementEach,W as useTSElements,z as useTSEvent,U as useTSEventAll,j as useTSExtractParams,ie as useTSLazy,J as useTSMetaData,Z as useTSNavigate,le as useTSNoReload,ee as useTSOutlet,P as useTSParams,I as useTSPurifier,ae as useTSSSRHydration,A as useTSSelect,oe as useTSloadBrython};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devwareng/vanilla-ts",
3
- "version": "1.4.69",
3
+ "version": "1.5.113",
4
4
  "description": "Framework-less TypeScript hooks for SPA development.",
5
5
  "author": "Waren Arapoc Gador",
6
6
  "license": "MIT",
@@ -44,6 +44,7 @@
44
44
  "@types/js-cookie": "^3.0.6",
45
45
  "@types/lodash-es": "^4.17.12",
46
46
  "@types/node": "^24.3.0",
47
+ "animate.css": "^4.1.1",
47
48
  "process": "^0.11.10",
48
49
  "tsup": "^8.5.0",
49
50
  "tsx": "^4.20.5",