UNPKG

vue-nuxt-permission

Version:

A unified permission system for Vue 3 and Nuxt 3 / Nuxt 4 with directives, guards, and async support.

3 lines (2 loc) 8.31 kB
"use strict";/*! vue-nuxt-permission v2.2.1 | (c) 2026 Kerolos Zakaria | MIT License */const f=require("vue"),R="__v_permission__",x=()=>typeof window<"u"&&typeof localStorage<"u",q=e=>{try{const r=JSON.stringify(e);if(typeof TextEncoder<"u"){const s=new TextEncoder().encode(r),i=Array.from(s,t=>String.fromCharCode(t)).join("");return btoa(i)}return btoa(unescape(encodeURIComponent(r)))}catch{return""}},K=e=>{try{const r=atob(e);if(typeof TextDecoder<"u"){const i=new Uint8Array(r.length);for(let n=0;n<r.length;n++)i[n]=r.charCodeAt(n);const t=new TextDecoder().decode(i);return JSON.parse(t)}const s=decodeURIComponent(escape(r));return JSON.parse(s)}catch{return null}},v=e=>{if(x())try{localStorage.setItem(R,q(e))}catch(r){console.warn("[v-permission] Failed to save permissions to storage:",r)}},w=()=>{if(!x())return null;try{const e=localStorage.getItem(R);return e?K(e):null}catch(e){return console.warn("[v-permission] Failed to read permissions from storage:",e),null}},B=()=>{if(x())try{localStorage.removeItem(R)}catch(e){console.warn("[v-permission] Failed to clear permissions from storage:",e)}},d={permissions:null,developmentMode:!1,decrypt:void 0},g=f.ref([]),L=()=>d.decrypt,G=e=>{d.decrypt=e},E=(e,r)=>{const s=(r==null?void 0:r.decrypt)??(r==null?void 0:r.transform)??d.decrypt;if((r!=null&&r.decrypt||r!=null&&r.transform)&&(d.decrypt=r.decrypt??r.transform),d.developmentMode=(r==null?void 0:r.developmentMode)??!1,f.isRef(e)){const t=e;if(d.permissions=t,s&&t.value&&!Array.isArray(t.value)){const o=s(t.value);if(o instanceof Promise){o.then(c=>{const a=Array.isArray(c)?c:[];t.value=a,g.value=a,(r==null?void 0:r.persist)!==!1&&v(a)});return}else{const c=Array.isArray(o)?o:[];t.value=c}}const n=Array.isArray(t.value)?t.value:[];g.value=n,(r==null?void 0:r.persist)!==!1&&v(n);return}if(s&&e!==null&&e!==void 0&&!Array.isArray(e)){const t=s(e);if(t instanceof Promise){t.then(n=>{const o=Array.isArray(n)?n:[];d.permissions=o,g.value=o,(r==null?void 0:r.persist)!==!1&&v(o)});return}else{const n=Array.isArray(t)?t:[];d.permissions=n,g.value=n,(r==null?void 0:r.persist)!==!1&&v(n);return}}const i=Array.isArray(e)?e:[];d.permissions=i,g.value=i,(r==null?void 0:r.persist)!==!1&&v(i)},O=()=>g,U=()=>{const{permissions:e}=d;if(!e)return[];if(f.isRef(e)){const r=e.value;return Array.isArray(r)?r:[]}return Array.isArray(e)?e:[]},b=()=>d.developmentMode,l=new Map,V=1e3,N=5*60*1e3,F=e=>{const r=l.get(e);return r?Date.now()-r.timestamp>N?(l.delete(e),null):r.value:null},I=(e,r)=>{if(l.size>=V){const s=l.keys().next().value;s&&l.delete(s)}l.set(e,{value:r,timestamp:Date.now()})},k=()=>l.clear(),X=()=>{const e=Date.now();for(const[r,s]of l.entries())e-s.timestamp>N&&l.delete(r)},C=e=>{if(!e)return[];const r=f.isRef(e)?e.value:e;return Array.isArray(r)?r.filter(Boolean):[]},Y=e=>Array.from(new Set(e)).sort(),T=e=>{const r=new WeakSet;return JSON.stringify(e,(s,i)=>i&&typeof i=="object"?r.has(i)?void 0:(r.add(i),Array.isArray(i)?i:Object.keys(i).sort().reduce((t,n)=>(t[n]=i[n],t),{})):i)},p=e=>!!e&&typeof e=="object"&&!Array.isArray(e)&&"permissions"in e&&"mode"in e,D=new Set(["and","or","not","startWith","endWith","regex"]),j=e=>{try{return new RegExp(e).test(""),!0}catch{return!1}},Z=(e,r)=>{var i;const s=U();if(e==="*")return!0;if(typeof e=="string")return s.includes(e);if(Array.isArray(e))return e.includes("*")?!0:e.some(t=>s.includes(t));if(p(e)){const{permissions:t,mode:n}=e;if(!D.has(n)||!Array.isArray(t)||t.length===0)return!1;if(t.includes("*"))return!0;const o={and:()=>t.every(c=>s.includes(c)),or:()=>t.some(c=>s.includes(c)),not:()=>!t.some(c=>s.includes(c)),startWith:()=>t.some(c=>s.some(a=>a.startsWith(c))),endWith:()=>t.some(c=>s.some(a=>a.endsWith(c))),regex:()=>t.some(c=>{if(!j(c))return!1;try{const a=new RegExp(c);return s.some(P=>a.test(P))}catch{return!1}})};return((i=o[n])==null?void 0:i.call(o))??!1}return!1},H=async(e,r)=>{const s=r??U(),i=T({permissionValue:e,current:s}),t=F(i);if(t!==null)return t;const n=(...a)=>{b()&&console.log("[v-permission:core]",...a)},c=await(async a=>{var P;if(a==="*")return!0;if(typeof a=="string")return s.includes(a);if(Array.isArray(a))return a.includes("*")?!0:a.some(u=>s.includes(u));if(p(a)){const{permissions:u,mode:h}=a;if(!D.has(h))return n(`Invalid permission mode: "${h}". Valid modes:`,Array.from(D)),!1;if(!Array.isArray(u)||u.length===0)return n("Permission array is empty or invalid"),!1;if(u.includes("*"))return!0;const A={and:()=>u.every(m=>s.includes(m)),or:()=>u.some(m=>s.includes(m)),not:()=>!u.some(m=>s.includes(m)),startWith:()=>u.some(m=>s.some(y=>y.startsWith(m))),endWith:()=>u.some(m=>s.some(y=>y.endsWith(m))),regex:()=>u.some(m=>{if(!j(m))return n("Invalid or dangerous regex pattern:",m),!1;try{const y=new RegExp(m);return s.some(z=>y.test(z))}catch(y){return n("Regex evaluation error:",m,y),!1}})};return((P=A[h])==null?void 0:P.call(A))??!1}return n("Invalid permission value:",a),!1})(e);return I(i,c),c},M=(...e)=>{b()&&(console.groupCollapsed("[v-permission:debug]"),console.log(...e),console.groupEnd())};function _(e,r){const s=e._vPermissionValueRef;return s&&f.isRef(s)?s.value:f.isRef(r)?r.value:r}function W(e){try{const r=window.getComputedStyle(e);e._vPermissionOriginalDisplay=r.display||e.style.display||""}catch{e._vPermissionOriginalDisplay=e.style.display||""}}function $(e){if(e.parentNode&&!e._vPermissionComment){const r=document.createComment("v-permission");e._vPermissionParent=e.parentNode,e._vPermissionNextSibling=e.nextSibling,e._vPermissionComment=r,e.replaceWith(r),M("Removed element from DOM")}}function Q(e){if(e._vPermissionComment){const r=e._vPermissionComment;e.parentNode?r.remove():r.replaceWith(e),e._vPermissionComment=void 0}}function S(e,r){const s=e._vPermissionUseShow===!0;Z(r)?(Q(e),s&&(e.style.display=e._vPermissionOriginalDisplay||"")):s?e.style.display="none":$(e),H(r).catch(t=>{console.error("[v-permission] Async evaluation failed:",t)})}const J={mounted(e,r){const{modifiers:s,arg:i}=r;e._vPermissionUseShow=i==="show"||s.show===!0,e._vPermissionValueRef=f.isRef(r.value)?r.value:null,W(e),s.once&&(e._vPermissionSkipUpdates=!0);const t=_(e,r.value);if(S(e,t),M("Mounted v-permission =>",t),!s.once){const n=f.watch(O(),()=>{if(e._vPermissionSkipUpdates)return;const o=_(e,r.value);S(e,o)},{deep:!0});e._vPermissionUnwatch=n}},updated(e,r){if(e._vPermissionSkipUpdates)return;const s=_(e,r.value);let i=r.oldValue;f.isRef(i)&&(i=i.value);const t=JSON.stringify(s)!==JSON.stringify(i);r.modifiers.lazy&&!t||(t&&e.parentNode&&W(e),S(e,s))},unmounted(e){e._vPermissionUnwatch&&(e._vPermissionUnwatch(),e._vPermissionUnwatch=void 0),e._vPermissionComment&&e._vPermissionComment.remove(),delete e._vPermissionOriginalDisplay,delete e._vPermissionSkipUpdates,delete e._vPermissionParent,delete e._vPermissionNextSibling,delete e._vPermissionComment,delete e._vPermissionValueRef,delete e._vPermissionUseShow}},ee={async install(e,r){let s=[];const i=(r==null?void 0:r.decrypt)??(r==null?void 0:r.transform);if(r!=null&&r.fetchPermissions)try{const n=await r.fetchPermissions();if(i&&n&&!Array.isArray(n)){const o=await i(n);s=Array.isArray(o)?o:[]}else s=C(n)}catch(n){console.error("[v-permission] Failed to fetch permissions:",n),s=w()??[]}else if((r==null?void 0:r.permissions)!==void 0)if(i&&r.permissions&&!Array.isArray(r.permissions)){const n=await i(r.permissions);s=Array.isArray(n)?n:[]}else s=C(r.permissions);else s=w()??[];k(),E(s,{developmentMode:r==null?void 0:r.developmentMode,persist:r==null?void 0:r.persist,decrypt:r==null?void 0:r.decrypt,transform:r==null?void 0:r.transform});const t=O();e.provide("__v_permission_reactive__",t),e.directive("permission",J)}};exports.PermissionPlugin=ee;exports.clearPermissionCache=k;exports.clearPermissionsFromStorage=B;exports.configurePermission=E;exports.getCachedPermission=F;exports.getCurrentPermissions=U;exports.getDecryptHook=L;exports.getPermissionsFromStorage=w;exports.getReactivePermissions=O;exports.hasPermission=H;exports.invalidateCache=X;exports.isDevMode=b;exports.isPermissionObject=p;exports.logDebug=M;exports.normalizePermissions=C;exports.savePermissionsToStorage=v;exports.setCachedPermission=I;exports.setDecryptHook=G;exports.sortUniq=Y;exports.stableStringify=T;exports.vPermission=J; //# sourceMappingURL=plugin-BkYe8puG.cjs.map