-
Notifications
You must be signed in to change notification settings - Fork 1
/
vscript.min.js
1 lines (1 loc) · 2.66 KB
/
vscript.min.js
1
let State={};async function walk(root,init){for(const element of root.children)if(element instanceof HTMLElement){for(const attribute of element.attributes){if(init&&("v-data"==attribute.name&&Object.assign(State,eval(`(${attribute.value})`)),attribute.name.startsWith("@"))){const attrs=attribute.name.substring(1).split("."),isMouseEvent=["click","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"].includes(attrs[0]);if(1==attrs.length)"@boost"==attribute.name&&element.addEventListener("click",(t=>{if(t.isTrusted&&t.target==t.currentTarget){if(t.ctrlKey||t.shiftKey)return;t.preventDefault();const e=t.target.getAttribute("href"),a=new URL(e,window.location.origin).pathname;fetch(a,{method:"GET",headers:{"v-request":"true"}}).then((async t=>{if(t.status<300){const e=t.headers.get("title");"string"==typeof e&&(document.title=e),window.history.pushState({},"",a);const n=await t.text();document.body.innerHTML=n,walk(document.body,!0)}}))}})),isMouseEvent&&element.addEventListener(attrs[0],(event=>{event.isTrusted&&eval(`with (State) { (${attribute.value}) }`)}));else if(isMouseEvent)switch(attrs[attrs.length-1]){case"inject":element.addEventListener(attrs[0],(function(event){if(event.isTrusted&&event.target==event.currentTarget){const path=attribute.value||window.location.href;let target=event.target;if(event.target.hasAttribute("v-target")){const t=event.target.getAttribute("v-target");target=document.getElementById(t)}fetch(new URL(path,window.location.origin),{method:"GET",headers:{"v-request":"true"}}).then((async res=>{if(res.status<300&&res.headers.get("content-type")?.startsWith("text/html")){const html=await res.text();if(target instanceof HTMLElement){target.insertAdjacentHTML("beforebegin",html),walk(target.previousSibling,!0),target.parentElement.removeChild(target);const callback=event.target.getAttribute("v-callback");"string"==typeof callback&&eval(`with (State) { (${callback}) }`)}}}))}}));break;case"eject":element.addEventListener(attrs[0],(function(t){if(t.isTrusted&&t.target==t.currentTarget){let e=t.target;if(t.target.hasAttribute("v-target")){const a=t.target.getAttribute("v-target");e=document.getElementById(a)}const a=document.createElement(e.tagName);a.id=e.id,e.replaceWith(a)}}))}}"v-text"==attribute.name&&(element.innerText=eval(`with (State) { (${attribute.value}) }`)),"v-show"==attribute.name&&(element.style.display=eval(`with (State) { (${attribute.value}) }`)?"revert":"none")}element.children.length&&walk(element,init)}}walk(document.body,!0),State=new Proxy(State,{set(t,e,a){t[e]=a,walk(document.body,!1)}}),window.addEventListener("popstate",(t=>{t.isTrusted&&(location.pathname=window.location.pathname)}));