vue-nuxt-permission
Version:
A lightweight, flexible permission directive and router guard for Vue 3
2 lines (1 loc) • 3.38 kB
JavaScript
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const F=require("vue"),y=new Map,G=e=>y.has(e)?y.get(e):null,J=(e,s)=>y.set(e,s),M=()=>y.clear(),q="__v_permission__",T=e=>btoa(JSON.stringify(e)),U=e=>JSON.parse(atob(e)),j=e=>{try{localStorage.setItem(q,T(e))}catch(s){console.warn("[v-permission] Failed to save permissions to storage:",s)}},K=()=>{try{const e=localStorage.getItem(q);return e?U(e):null}catch(e){return console.warn("[v-permission] Failed to read permissions from storage:",e),null}};let N={permissions:null},b=!1;const A=(e,s)=>{N.permissions=e,b=(s==null?void 0:s.developmentMode)??!1,M(),j(e)},W=()=>{const e=K();e&&A(e)},k=()=>{const{permissions:e}=N;return F.isRef(e)?e.value:e??[]},f=async(e,s)=>{const i=s??k(),o=JSON.stringify({permissionValue:e,currentPermissions:i}),a=G(o);if(a!==null)return a;const m=await(async n=>{var g;if(n==="*")return!0;if(typeof n=="string")return i.includes(n);if(Array.isArray(n))return n.includes("*")?!0:(await Promise.all(n.map(r=>f(r,i)))).some(Boolean);if(typeof n=="object"&&n.permissions&&n.mode){const{permissions:r,mode:v}=n;if(r.includes("*"))return!0;const d={and:()=>r.every(t=>i.includes(t)),or:()=>r.some(t=>i.includes(t)),startWith:()=>r.some(t=>i.some(c=>c.startsWith(t))),endWith:()=>r.some(t=>i.some(c=>c.endsWith(t))),exact:()=>r.some(t=>i.includes(t)),regex:()=>r.some(t=>{try{const c=new RegExp(t);return i.some(w=>c.test(w))}catch(c){return b&&console.warn("[v-permission] Invalid regex:",t,c),!1}})};return((g=d[v])==null?void 0:g.call(d))??!1}return b&&console.warn("[v-permission] Invalid permission value:",n),!1})(e);return J(o,m),m},E={async mounted(e,s){const{value:i,modifiers:o,arg:a}=s,u=await f(i);e._vPermissionOriginalDisplay=e.style.display,u||(a==="show"||o.show?e.style.display="none":e.remove()),o.once&&(e._vPermissionSkipUpdates=!0)},async updated(e,s){const{value:i,oldValue:o,modifiers:a,arg:u}=s;if(e._vPermissionSkipUpdates||a.lazy&&i===o)return;await f(i)?e.style.display=e._vPermissionOriginalDisplay||"":u==="show"||a.show?e.style.display="none":e.remove()},unmounted(e){e._vPermissionOriginalDisplay=void 0,e._vPermissionSkipUpdates=void 0}},z={install(e,s){s!=null&&s.permissions?A(s.permissions,{developmentMode:s.developmentMode}):W(),e.directive("permission",E)}};async function B(e,s,i,o={}){var C,O;const{authRoutes:a=[],protectedRoutes:u=[],getAuthState:m,loginPath:n="/login",homePath:g="/"}=o,r=(m==null?void 0:m())??{isAuthenticated:!1},{isAuthenticated:v}=r,d=(r==null?void 0:r.permissions)||((C=r==null?void 0:r.user)==null?void 0:C.permissions)||[],t=a.some(l=>l.path===e.path),c=(O=e.meta)==null?void 0:O.requiresAuth,w=async()=>{var h,p;if(!((h=e.meta)!=null&&h.checkPermission))return!0;const l=(p=e.meta)==null?void 0:p.permissions;return!l||l==="*"?!0:await f(l,d)},S=async(l,h="")=>{var p,R;for(const P of l){const D=h+P.path,_=(p=P.meta)==null?void 0:p.permissions;if(!_||_==="*"||await f(_,d))return D;if((R=P.children)!=null&&R.length){const I=await S(P.children,D);if(I)return I}}return null};if(!v)return c?i(n):i();if(t)return i(g);if(!await w()){const l=await S(u);return i(l||n)}i()}exports.PermissionPlugin=z;exports.clearPermissionCache=M;exports.configurePermission=A;exports.getCurrentPermissions=k;exports.globalGuard=B;exports.hasPermission=f;exports.initPermissionDirectiveIfNeeded=W;exports.vPermission=E;