UNPKG

@westacks/vortex

Version:

Server-based routing for SPAs

2 lines (1 loc) 5.52 kB
"use strict";require("axios");const i=require("../../form-BGYwcZf7.cjs"),s=require("../../page-CvrPUcPo.cjs"),a={key:"historyKey",iv:"historyIv"};function y(){sessionStorage.removeItem(a.key),sessionStorage.removeItem(a.iv)}async function x(e){const t=f(),r=await d();e=JSON.stringify(e);const o=new Uint8Array(e.length*3),n=new TextEncoder().encodeInto(e,o);return await crypto.subtle.encrypt({name:"AES-GCM",iv:t},r,o.subarray(0,n.written))}async function w(e){const t=f(),r=await d(),o=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},r,e);return JSON.parse(new TextDecoder().decode(o))}async function d(){const e=JSON.parse(sessionStorage.getItem(a.key)||"null"),t=n=>crypto.subtle.importKey("raw",new Uint8Array(n),{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);if(e)return await t(e);const r=await crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),o=await crypto.subtle.exportKey("raw",r);return sessionStorage.setItem(a.key,JSON.stringify(Array.from(new Uint8Array(o)))),r}function f(){const e=JSON.parse(sessionStorage.getItem(a.iv)||"null");if(e)return new Uint8Array(e);const t=crypto.getRandomValues(new Uint8Array(12));return sessionStorage.setItem(a.iv,JSON.stringify(Array.from(t))),t}const b=e=>e instanceof ArrayBuffer?w(e):Promise.resolve(e),p=(e,t={})=>e.encryptHistory?x({page:e,remember:t}):Promise.resolve({page:e,remember:t});async function u(e,t=!1){const r=t?e:s.page.get();if(i.cache.size>0){const n=Object.fromEntries(i.cache);if(history.replaceState(await p(r,n),"",window.location.href),t)return}const o=t?"replaceState":"pushState";i.cache.clear(),window.history[o](await p(e),"",e.url)}async function l(e){if(!e.state)return;let t;try{t=await b(e.state)}catch(r){return console.warn("Failed to resolve state",{cause:r}),i.axios.get(window.location.href,{vortex:{preserveScroll:!0,replaceHistory:!0}})}Object.entries(t.remember).forEach(([r,o])=>i.cache.set(r,o)),s.page.set(t.page)}function S(e){if(!e.vortex)return e;const t=s.page.get(),r=typeof e.vortex=="object"?e.vortex:{};return e.headers.accept="text/html, application/xhtml+xml, application/json",e.headers["x-inertia"]=!0,e.headers["x-inertia-version"]=t?.version,e.headers["x-inertia-partial-component"]=t?.component,Array.isArray(r.only)&&r.only.length>0&&(e.headers["x-inertia-partial-data"]=r.only.join(",")),Array.isArray(r.except)&&r.except.length>0&&(e.headers["x-inertia-partial-except"]=r.except.join(",")),Array.isArray(r.reset)&&r.reset.length>0&&(e.headers["x-inertia-reset"]=r.reset.join(",")),e}function m(e){if(e.config.prefetch||!e.config.vortex||!e.headers["x-inertia"])return e;const t=s.page.get(),r=typeof e.config.vortex=="object"?e.config.vortex:{};if(Array.isArray(r.only)&&r.only.length>0){const o={};for(const n of r.only)o[n]=e.data.props[n];e.data.props={...t.props,...o}}if(Array.isArray(r.except)&&r.except.length>0){const o={};for(const n of r.except)o[n]=t.props[n];e.data.props={...e.data.props,...o}}return e.data=j(e.data,t),r?.preserveHistory?e.data.url=t?.url||e.data.url:u(e.data,r?.replaceHistory||t?.url===e.data.url&&r?.replaceHistory!==!1),s.page.set(e.data),t.clearHistory&&y(),h(e.data),r?.preserveScroll||window.scrollTo(0,0),e}function A(e){if(!e.config?.vortex)return Promise.reject(e);if(e.response?.headers["x-inertia-location"])return window.location.href=e.response.headers["x-inertia-location"],Promise.resolve(e.response);if(!e.response?.headers["x-inertia"])E(e.response);else return m(e.response);return Promise.reject(e)}function h(e){if(e.deferredProps)for(const t of Object.values(e.deferredProps))i.axios.reload({vortex:{only:t,preserveHistory:!0,preserveScroll:!0}})}function j(e,t){if(e.deepMergeProps)for(const r of e.deepMergeProps)e.props[r]=g(t.props[r],e.props[r]);if(e.mergeProps)for(const r of e.mergeProps){const o=e.props[r];Array.isArray(o)?e.props[r]=[...t.props[r]||[],...o]:typeof o=="object"&&o!==null&&(e.props[r]={...t.props[r]||[],...o})}return e}function E(e){const t=document.createElement("dialog");Object.assign(t.style,{position:"fixed",inset:"0",maxWidth:"none",maxHeight:"none",width:"100%",height:"100%",display:"flex",justifyContent:"center",alignItems:"center",background:"transparent",backdropFilter:"blur(3px)",outline:"none"}),t.addEventListener("keydown",c=>{c.key==="Escape"&&t.close()});const r=document.createElement("form");r.method="dialog",Object.assign(r.style,{position:"absolute",inset:"0",zIndex:"-1",margin:"0",padding:"0",border:"none"});const o=document.createElement("button");o.type="submit",o.innerText="close",Object.assign(o.style,{width:"100%",height:"100%",opacity:"0",cursor:"pointer"});const n=document.createElement("iframe");n.src=URL.createObjectURL(new Blob([e.data],{type:e.headers["content-type"]})),Object.assign(n.style,{width:"90vw",height:"90vh"}),r.appendChild(o),t.appendChild(n),t.appendChild(r),t.onclose=()=>{URL.revokeObjectURL(n.src),document.body.removeChild(t),document.body.style.overflow=""},document.body.appendChild(t),document.body.style.overflow="hidden",t.showModal(),t.focus()}const g=(e,t)=>Array.isArray(t)?[...Array.isArray(e)?e:[],...t]:typeof t=="object"&&t!==null?Object.keys(t).reduce((r,o)=>(r[o]=g(e?e[o]:void 0,t[o]),r),{...e}):t,v=e=>({request:t,response:r})=>{u(e,!0),window.addEventListener("popstate",l),i.useForm.resolveErrors=c=>c?.data?.props?.errors??{};const o=t.use(S),n=r.use(m,A);return h(e),()=>{t.eject(o),r.eject(n),i.useForm.resolveErrors=c=>({}),window.removeEventListener("popstate",l)}};v.clearHistory=y;module.exports=v;