locator-ars-lib 1.0.4 → 1.0.6

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.
@@ -128,6 +128,7 @@ export {
128
128
  A as default,
129
129
  C as setupPermissions,
130
130
  D as usePermissions,
131
+ p as usePermissionsService,
131
132
  x as vCan
132
133
  };
133
134
  //# sourceMappingURL=locator-ars-lib.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"locator-ars-lib.es.js","sources":["../src/services/permissionsService.ts","../src/plugin.ts","../src/composables/usePermissions.ts","../src/components/Check.vue","../src/directives/vCan.ts","../src/index.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios'\n\nexport interface PermissionsOptions {\n baseUrl?: string\n endpoint?: string\n}\n\nexport class PermissionsService {\n private axios: AxiosInstance\n private cache: Map<string, boolean> = new Map()\n private endpoint: string\n\n constructor(options?: PermissionsOptions) {\n this.axios = axios.create({\n baseURL: options?.baseUrl || ''\n })\n this.endpoint = options?.endpoint || '/api/v1/dashboard/access'\n }\n\n async can(action: string): Promise<boolean> {\n // Check if we have a cached result\n if (this.cache.has(action)) {\n return this.cache.get(action) as boolean\n }\n\n try {\n const response = await this.axios.get(this.endpoint, {\n params: { action }\n })\n\n const allowed = response.data.allowed || false\n\n // Cache the result\n this.cache.set(action, allowed)\n\n return allowed\n } catch (error) {\n console.error(`Error checking permission for ${action}:`, error)\n return false\n }\n }\n\n clearCache(action?: string): void {\n if (action) {\n this.cache.delete(action)\n } else {\n this.cache.clear()\n }\n }\n} ","import { App, inject, InjectionKey } from 'vue'\nimport { PermissionsService, PermissionsOptions } from './services/permissionsService'\n\nexport const PermissionsKey: InjectionKey<PermissionsService> = Symbol('Permissions')\n\nexport function setupPermissions(options?: PermissionsOptions): PermissionsService {\n return new PermissionsService(options)\n}\n\nexport const PermissionsPlugin = {\n install(app: App, options?: PermissionsOptions) {\n const permissionsService = setupPermissions(options)\n app.provide(PermissionsKey, permissionsService)\n }\n}\n\nexport function usePermissionsService(): PermissionsService {\n const permissionsService = inject(PermissionsKey)\n if (!permissionsService) {\n throw new Error('Permissions plugin not installed!')\n }\n return permissionsService\n} ","import { ref, computed, Ref, watch, onUnmounted } from 'vue'\nimport { usePermissionsService } from '../plugin'\n\nexport interface UsePermissionsOptions {\n autoCheck?: boolean\n}\n\nexport function usePermissions(action: string | Ref<string>, options: UsePermissionsOptions = {}) {\n const permissionsService = usePermissionsService()\n const isAllowed = ref<boolean | null>(null)\n const isLoading = ref(false)\n const error = ref<Error | null>(null)\n\n const actionValue = computed(() => {\n return typeof action === 'string' ? action : action.value\n })\n\n const checkPermission = async () => {\n if (!actionValue.value) return\n\n isLoading.value = true\n error.value = null\n\n try {\n isAllowed.value = await permissionsService.can(actionValue.value)\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err))\n isAllowed.value = false\n } finally {\n isLoading.value = false\n }\n }\n\n // Auto-check on mount if requested\n if (options.autoCheck !== false) {\n checkPermission()\n }\n\n // Re-check when action changes\n if (typeof action !== 'string') {\n const unwatch = watch(action, () => {\n checkPermission()\n })\n\n onUnmounted(() => {\n unwatch()\n })\n }\n\n return {\n isAllowed,\n isLoading,\n error,\n check: checkPermission,\n can: computed(() => isAllowed.value === true)\n }\n} ","<template>\n <slot v-if=\"can\" />\n <slot name=\"fallback\" v-else-if=\"!isLoading\" />\n <slot name=\"loading\" v-else />\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, toRefs, PropType } from 'vue';\nimport { usePermissions } from '../composables/usePermissions';\n\nexport default defineComponent({\n name: 'Check',\n props: {\n action: {\n type: String as PropType<string>,\n required: true\n },\n fallback: {\n type: Boolean,\n default: false\n }\n },\n setup(props) {\n const { action } = toRefs(props);\n const { can, isLoading } = usePermissions(action, { autoCheck: true });\n\n return {\n can,\n isLoading\n };\n }\n});\n</script> ","import { ObjectDirective, DirectiveBinding } from 'vue'\nimport { usePermissionsService } from '../plugin'\n\ninterface CanHTMLElement extends HTMLElement {\n _permission_data?: {\n action: string\n originalDisplay: string\n }\n}\n\nexport const vCan: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n // Store original display value\n const originalDisplay = el.style.display\n\n // Store action and original display for updates\n el._permission_data = {\n action: binding.value,\n originalDisplay\n }\n\n const permissionsService = usePermissionsService()\n const hasPermission = await permissionsService.can(binding.value)\n\n if (!hasPermission) {\n el.style.display = 'none'\n }\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n // Action has changed or directive is new\n el._permission_data = {\n action: binding.value,\n originalDisplay: el.style.display || ''\n }\n\n const permissionsService = usePermissionsService()\n const hasPermission = await permissionsService.can(binding.value)\n\n if (!hasPermission) {\n el.style.display = 'none'\n } else {\n el.style.display = el._permission_data.originalDisplay\n }\n }\n },\n\n unmounted(el: CanHTMLElement) {\n if (el._permission_data) {\n el.style.display = el._permission_data.originalDisplay\n delete el._permission_data\n }\n }\n} ","import { App } from 'vue'\nimport Check from './components/Check.vue'\nimport { usePermissions } from './composables/usePermissions'\nimport { PermissionsPlugin, setupPermissions } from './plugin'\nimport { vCan } from './directives/vCan'\n\n// Именованные экспорты\nexport {\n Check,\n usePermissions,\n setupPermissions,\n vCan\n}\n\n// Создаем основной объект плагина\nconst plugin = {\n install(app: App, options?: { baseUrl?: string }) {\n app.use(PermissionsPlugin, options)\n app.component('Check', Check)\n app.directive('can', vCan)\n }\n}\n\n// Экспортируем плагин как по умолчанию\nexport default plugin "],"names":["PermissionsService","options","__publicField","axios","action","allowed","error","PermissionsKey","setupPermissions","PermissionsPlugin","app","permissionsService","usePermissionsService","inject","usePermissions","isAllowed","ref","isLoading","actionValue","computed","checkPermission","err","unwatch","watch","onUnmounted","_sfc_main","defineComponent","props","toRefs","can","_ctx","_renderSlot","vCan","el","binding","originalDisplay","plugin","Check"],"mappings":"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"}
1
+ {"version":3,"file":"locator-ars-lib.es.js","sources":["../src/services/permissionsService.ts","../src/plugin.ts","../src/composables/usePermissions.ts","../src/components/Check.vue","../src/directives/vCan.ts","../src/index.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios'\n\nexport interface PermissionsOptions {\n baseUrl?: string\n endpoint?: string\n}\n\nexport class PermissionsService {\n private axios: AxiosInstance\n private cache: Map<string, boolean> = new Map()\n private endpoint: string\n\n constructor(options?: PermissionsOptions) {\n this.axios = axios.create({\n baseURL: options?.baseUrl || ''\n })\n this.endpoint = options?.endpoint || '/api/v1/dashboard/access'\n }\n\n async can(action: string): Promise<boolean> {\n // Check if we have a cached result\n if (this.cache.has(action)) {\n return this.cache.get(action) as boolean\n }\n\n try {\n const response = await this.axios.get(this.endpoint, {\n params: { action }\n })\n\n const allowed = response.data.allowed || false\n\n // Cache the result\n this.cache.set(action, allowed)\n\n return allowed\n } catch (error) {\n console.error(`Error checking permission for ${action}:`, error)\n return false\n }\n }\n\n clearCache(action?: string): void {\n if (action) {\n this.cache.delete(action)\n } else {\n this.cache.clear()\n }\n }\n} ","import { App, inject, InjectionKey } from 'vue'\nimport { PermissionsService, PermissionsOptions } from './services/permissionsService'\n\nexport const PermissionsKey: InjectionKey<PermissionsService> = Symbol('Permissions')\n\nexport function setupPermissions(options?: PermissionsOptions): PermissionsService {\n return new PermissionsService(options)\n}\n\nexport const PermissionsPlugin = {\n install(app: App, options?: PermissionsOptions) {\n const permissionsService = setupPermissions(options)\n app.provide(PermissionsKey, permissionsService)\n }\n}\n\nexport function usePermissionsService(): PermissionsService {\n const permissionsService = inject(PermissionsKey)\n if (!permissionsService) {\n throw new Error('Permissions plugin not installed!')\n }\n return permissionsService\n} ","import { ref, computed, Ref, watch, onUnmounted } from 'vue'\nimport { usePermissionsService } from '../plugin'\n\nexport interface UsePermissionsOptions {\n autoCheck?: boolean\n}\n\nexport function usePermissions(action: string | Ref<string>, options: UsePermissionsOptions = {}) {\n const permissionsService = usePermissionsService()\n const isAllowed = ref<boolean | null>(null)\n const isLoading = ref(false)\n const error = ref<Error | null>(null)\n\n const actionValue = computed(() => {\n return typeof action === 'string' ? action : action.value\n })\n\n const checkPermission = async () => {\n if (!actionValue.value) return\n\n isLoading.value = true\n error.value = null\n\n try {\n isAllowed.value = await permissionsService.can(actionValue.value)\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err))\n isAllowed.value = false\n } finally {\n isLoading.value = false\n }\n }\n\n // Auto-check on mount if requested\n if (options.autoCheck !== false) {\n checkPermission()\n }\n\n // Re-check when action changes\n if (typeof action !== 'string') {\n const unwatch = watch(action, () => {\n checkPermission()\n })\n\n onUnmounted(() => {\n unwatch()\n })\n }\n\n return {\n isAllowed,\n isLoading,\n error,\n check: checkPermission,\n can: computed(() => isAllowed.value === true)\n }\n} ","<template>\n <slot v-if=\"can\" />\n <slot name=\"fallback\" v-else-if=\"!isLoading\" />\n <slot name=\"loading\" v-else />\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, toRefs, PropType } from 'vue';\nimport { usePermissions } from '../composables/usePermissions';\n\nexport default defineComponent({\n name: 'Check',\n props: {\n action: {\n type: String as PropType<string>,\n required: true\n },\n fallback: {\n type: Boolean,\n default: false\n }\n },\n setup(props) {\n const { action } = toRefs(props);\n const { can, isLoading } = usePermissions(action, { autoCheck: true });\n\n return {\n can,\n isLoading\n };\n }\n});\n</script> ","import { ObjectDirective, DirectiveBinding } from 'vue'\nimport { usePermissionsService } from '../plugin'\n\ninterface CanHTMLElement extends HTMLElement {\n _permission_data?: {\n action: string\n originalDisplay: string\n }\n}\n\nexport const vCan: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n // Store original display value\n const originalDisplay = el.style.display\n\n // Store action and original display for updates\n el._permission_data = {\n action: binding.value,\n originalDisplay\n }\n\n const permissionsService = usePermissionsService()\n const hasPermission = await permissionsService.can(binding.value)\n\n if (!hasPermission) {\n el.style.display = 'none'\n }\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n // Action has changed or directive is new\n el._permission_data = {\n action: binding.value,\n originalDisplay: el.style.display || ''\n }\n\n const permissionsService = usePermissionsService()\n const hasPermission = await permissionsService.can(binding.value)\n\n if (!hasPermission) {\n el.style.display = 'none'\n } else {\n el.style.display = el._permission_data.originalDisplay\n }\n }\n },\n\n unmounted(el: CanHTMLElement) {\n if (el._permission_data) {\n el.style.display = el._permission_data.originalDisplay\n delete el._permission_data\n }\n }\n} ","import { App } from 'vue'\nimport Check from './components/Check.vue'\nimport { usePermissions } from './composables/usePermissions'\nimport { PermissionsPlugin, setupPermissions, usePermissionsService } from './plugin'\nimport { vCan } from './directives/vCan'\n\n// Именованные экспорты\nexport {\n Check,\n usePermissions,\n setupPermissions,\n vCan,\n usePermissionsService\n}\n\n// Создаем основной объект плагина\nconst plugin = {\n install(app: App, options?: { baseUrl?: string }) {\n app.use(PermissionsPlugin, options)\n app.component('Check', Check)\n app.directive('can', vCan)\n }\n}\n\n// Экспортируем плагин как по умолчанию\nexport default plugin "],"names":["PermissionsService","options","__publicField","axios","action","allowed","error","PermissionsKey","setupPermissions","PermissionsPlugin","app","permissionsService","usePermissionsService","inject","usePermissions","isAllowed","ref","isLoading","actionValue","computed","checkPermission","err","unwatch","watch","onUnmounted","_sfc_main","defineComponent","props","toRefs","can","_ctx","_renderSlot","vCan","el","binding","originalDisplay","plugin","Check"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(n,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("vue"),require("axios")):typeof define=="function"&&define.amd?define(["exports","vue","axios"],i):(n=typeof globalThis<"u"?globalThis:n||self,i(n.LocatorArsLib={},n.Vue,n.axios))})(this,function(n,i,o){"use strict";var $=Object.defineProperty;var L=(n,i,o)=>i in n?$(n,i,{enumerable:!0,configurable:!0,writable:!0,value:o}):n[i]=o;var u=(n,i,o)=>L(n,typeof i!="symbol"?i+"":i,o);class P{constructor(s){u(this,"axios");u(this,"cache",new Map);u(this,"endpoint");this.axios=o.create({baseURL:(s==null?void 0:s.baseUrl)||""}),this.endpoint=(s==null?void 0:s.endpoint)||"/api/v1/dashboard/access"}async can(s){if(this.cache.has(s))return this.cache.get(s);try{const a=(await this.axios.get(this.endpoint,{params:{action:s}})).data.allowed||!1;return this.cache.set(s,a),a}catch(r){return console.error(`Error checking permission for ${s}:`,r),!1}}clearCache(s){s?this.cache.delete(s):this.cache.clear()}}const p=Symbol("Permissions");function m(e){return new P(e)}const S={install(e,s){const r=m(s);e.provide(p,r)}};function d(){const e=i.inject(p);if(!e)throw new Error("Permissions plugin not installed!");return e}function h(e,s={}){const r=d(),a=i.ref(null),t=i.ref(!1),l=i.ref(null),_=i.computed(()=>typeof e=="string"?e:e.value),f=async()=>{if(_.value){t.value=!0,l.value=null;try{a.value=await r.can(_.value)}catch(c){l.value=c instanceof Error?c:new Error(String(c)),a.value=!1}finally{t.value=!1}}};if(s.autoCheck!==!1&&f(),typeof e!="string"){const c=i.watch(e,()=>{f()});i.onUnmounted(()=>{c()})}return{isAllowed:a,isLoading:t,error:l,check:f,can:i.computed(()=>a.value===!0)}}const g=i.defineComponent({name:"Check",props:{action:{type:String,required:!0},fallback:{type:Boolean,default:!1}},setup(e){const{action:s}=i.toRefs(e),{can:r,isLoading:a}=h(s,{autoCheck:!0});return{can:r,isLoading:a}}}),k=(e,s)=>{const r=e.__vccOpts||e;for(const[a,t]of s)r[a]=t;return r};function w(e,s,r,a,t,l){return e.can?i.renderSlot(e.$slots,"default",{key:0}):e.isLoading?i.renderSlot(e.$slots,"loading",{key:2}):i.renderSlot(e.$slots,"fallback",{key:1})}const y=k(g,[["render",w]]),v={async mounted(e,s){const r=e.style.display;e._permission_data={action:s.value,originalDisplay:r},await d().can(s.value)||(e.style.display="none")},async updated(e,s){(!e._permission_data||e._permission_data.action!==s.value)&&(e._permission_data={action:s.value,originalDisplay:e.style.display||""},await d().can(s.value)?e.style.display=e._permission_data.originalDisplay:e.style.display="none")},unmounted(e){e._permission_data&&(e.style.display=e._permission_data.originalDisplay,delete e._permission_data)}},C={install(e,s){e.use(S,s),e.component("Check",y),e.directive("can",v)}};n.Check=y,n.default=C,n.setupPermissions=m,n.usePermissions=h,n.vCan=v,Object.defineProperties(n,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(n,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("vue"),require("axios")):typeof define=="function"&&define.amd?define(["exports","vue","axios"],i):(n=typeof globalThis<"u"?globalThis:n||self,i(n.LocatorArsLib={},n.Vue,n.axios))})(this,function(n,i,o){"use strict";var $=Object.defineProperty;var L=(n,i,o)=>i in n?$(n,i,{enumerable:!0,configurable:!0,writable:!0,value:o}):n[i]=o;var d=(n,i,o)=>L(n,typeof i!="symbol"?i+"":i,o);class P{constructor(s){d(this,"axios");d(this,"cache",new Map);d(this,"endpoint");this.axios=o.create({baseURL:(s==null?void 0:s.baseUrl)||""}),this.endpoint=(s==null?void 0:s.endpoint)||"/api/v1/dashboard/access"}async can(s){if(this.cache.has(s))return this.cache.get(s);try{const a=(await this.axios.get(this.endpoint,{params:{action:s}})).data.allowed||!1;return this.cache.set(s,a),a}catch(r){return console.error(`Error checking permission for ${s}:`,r),!1}}clearCache(s){s?this.cache.delete(s):this.cache.clear()}}const p=Symbol("Permissions");function m(e){return new P(e)}const S={install(e,s){const r=m(s);e.provide(p,r)}};function l(){const e=i.inject(p);if(!e)throw new Error("Permissions plugin not installed!");return e}function h(e,s={}){const r=l(),a=i.ref(null),t=i.ref(!1),u=i.ref(null),_=i.computed(()=>typeof e=="string"?e:e.value),f=async()=>{if(_.value){t.value=!0,u.value=null;try{a.value=await r.can(_.value)}catch(c){u.value=c instanceof Error?c:new Error(String(c)),a.value=!1}finally{t.value=!1}}};if(s.autoCheck!==!1&&f(),typeof e!="string"){const c=i.watch(e,()=>{f()});i.onUnmounted(()=>{c()})}return{isAllowed:a,isLoading:t,error:u,check:f,can:i.computed(()=>a.value===!0)}}const g=i.defineComponent({name:"Check",props:{action:{type:String,required:!0},fallback:{type:Boolean,default:!1}},setup(e){const{action:s}=i.toRefs(e),{can:r,isLoading:a}=h(s,{autoCheck:!0});return{can:r,isLoading:a}}}),k=(e,s)=>{const r=e.__vccOpts||e;for(const[a,t]of s)r[a]=t;return r};function w(e,s,r,a,t,u){return e.can?i.renderSlot(e.$slots,"default",{key:0}):e.isLoading?i.renderSlot(e.$slots,"loading",{key:2}):i.renderSlot(e.$slots,"fallback",{key:1})}const y=k(g,[["render",w]]),v={async mounted(e,s){const r=e.style.display;e._permission_data={action:s.value,originalDisplay:r},await l().can(s.value)||(e.style.display="none")},async updated(e,s){(!e._permission_data||e._permission_data.action!==s.value)&&(e._permission_data={action:s.value,originalDisplay:e.style.display||""},await l().can(s.value)?e.style.display=e._permission_data.originalDisplay:e.style.display="none")},unmounted(e){e._permission_data&&(e.style.display=e._permission_data.originalDisplay,delete e._permission_data)}},C={install(e,s){e.use(S,s),e.component("Check",y),e.directive("can",v)}};n.Check=y,n.default=C,n.setupPermissions=m,n.usePermissions=h,n.usePermissionsService=l,n.vCan=v,Object.defineProperties(n,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
2
2
  //# sourceMappingURL=locator-ars-lib.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"locator-ars-lib.umd.js","sources":["../src/services/permissionsService.ts","../src/plugin.ts","../src/composables/usePermissions.ts","../src/components/Check.vue","../src/directives/vCan.ts","../src/index.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios'\n\nexport interface PermissionsOptions {\n baseUrl?: string\n endpoint?: string\n}\n\nexport class PermissionsService {\n private axios: AxiosInstance\n private cache: Map<string, boolean> = new Map()\n private endpoint: string\n\n constructor(options?: PermissionsOptions) {\n this.axios = axios.create({\n baseURL: options?.baseUrl || ''\n })\n this.endpoint = options?.endpoint || '/api/v1/dashboard/access'\n }\n\n async can(action: string): Promise<boolean> {\n // Check if we have a cached result\n if (this.cache.has(action)) {\n return this.cache.get(action) as boolean\n }\n\n try {\n const response = await this.axios.get(this.endpoint, {\n params: { action }\n })\n\n const allowed = response.data.allowed || false\n\n // Cache the result\n this.cache.set(action, allowed)\n\n return allowed\n } catch (error) {\n console.error(`Error checking permission for ${action}:`, error)\n return false\n }\n }\n\n clearCache(action?: string): void {\n if (action) {\n this.cache.delete(action)\n } else {\n this.cache.clear()\n }\n }\n} ","import { App, inject, InjectionKey } from 'vue'\nimport { PermissionsService, PermissionsOptions } from './services/permissionsService'\n\nexport const PermissionsKey: InjectionKey<PermissionsService> = Symbol('Permissions')\n\nexport function setupPermissions(options?: PermissionsOptions): PermissionsService {\n return new PermissionsService(options)\n}\n\nexport const PermissionsPlugin = {\n install(app: App, options?: PermissionsOptions) {\n const permissionsService = setupPermissions(options)\n app.provide(PermissionsKey, permissionsService)\n }\n}\n\nexport function usePermissionsService(): PermissionsService {\n const permissionsService = inject(PermissionsKey)\n if (!permissionsService) {\n throw new Error('Permissions plugin not installed!')\n }\n return permissionsService\n} ","import { ref, computed, Ref, watch, onUnmounted } from 'vue'\nimport { usePermissionsService } from '../plugin'\n\nexport interface UsePermissionsOptions {\n autoCheck?: boolean\n}\n\nexport function usePermissions(action: string | Ref<string>, options: UsePermissionsOptions = {}) {\n const permissionsService = usePermissionsService()\n const isAllowed = ref<boolean | null>(null)\n const isLoading = ref(false)\n const error = ref<Error | null>(null)\n\n const actionValue = computed(() => {\n return typeof action === 'string' ? action : action.value\n })\n\n const checkPermission = async () => {\n if (!actionValue.value) return\n\n isLoading.value = true\n error.value = null\n\n try {\n isAllowed.value = await permissionsService.can(actionValue.value)\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err))\n isAllowed.value = false\n } finally {\n isLoading.value = false\n }\n }\n\n // Auto-check on mount if requested\n if (options.autoCheck !== false) {\n checkPermission()\n }\n\n // Re-check when action changes\n if (typeof action !== 'string') {\n const unwatch = watch(action, () => {\n checkPermission()\n })\n\n onUnmounted(() => {\n unwatch()\n })\n }\n\n return {\n isAllowed,\n isLoading,\n error,\n check: checkPermission,\n can: computed(() => isAllowed.value === true)\n }\n} ","<template>\n <slot v-if=\"can\" />\n <slot name=\"fallback\" v-else-if=\"!isLoading\" />\n <slot name=\"loading\" v-else />\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, toRefs, PropType } from 'vue';\nimport { usePermissions } from '../composables/usePermissions';\n\nexport default defineComponent({\n name: 'Check',\n props: {\n action: {\n type: String as PropType<string>,\n required: true\n },\n fallback: {\n type: Boolean,\n default: false\n }\n },\n setup(props) {\n const { action } = toRefs(props);\n const { can, isLoading } = usePermissions(action, { autoCheck: true });\n\n return {\n can,\n isLoading\n };\n }\n});\n</script> ","import { ObjectDirective, DirectiveBinding } from 'vue'\nimport { usePermissionsService } from '../plugin'\n\ninterface CanHTMLElement extends HTMLElement {\n _permission_data?: {\n action: string\n originalDisplay: string\n }\n}\n\nexport const vCan: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n // Store original display value\n const originalDisplay = el.style.display\n\n // Store action and original display for updates\n el._permission_data = {\n action: binding.value,\n originalDisplay\n }\n\n const permissionsService = usePermissionsService()\n const hasPermission = await permissionsService.can(binding.value)\n\n if (!hasPermission) {\n el.style.display = 'none'\n }\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n // Action has changed or directive is new\n el._permission_data = {\n action: binding.value,\n originalDisplay: el.style.display || ''\n }\n\n const permissionsService = usePermissionsService()\n const hasPermission = await permissionsService.can(binding.value)\n\n if (!hasPermission) {\n el.style.display = 'none'\n } else {\n el.style.display = el._permission_data.originalDisplay\n }\n }\n },\n\n unmounted(el: CanHTMLElement) {\n if (el._permission_data) {\n el.style.display = el._permission_data.originalDisplay\n delete el._permission_data\n }\n }\n} ","import { App } from 'vue'\nimport Check from './components/Check.vue'\nimport { usePermissions } from './composables/usePermissions'\nimport { PermissionsPlugin, setupPermissions } from './plugin'\nimport { vCan } from './directives/vCan'\n\n// Именованные экспорты\nexport {\n Check,\n usePermissions,\n setupPermissions,\n vCan\n}\n\n// Создаем основной объект плагина\nconst plugin = {\n install(app: App, options?: { baseUrl?: string }) {\n app.use(PermissionsPlugin, options)\n app.component('Check', Check)\n app.directive('can', vCan)\n }\n}\n\n// Экспортируем плагин как по умолчанию\nexport default plugin "],"names":["PermissionsService","options","__publicField","axios","action","allowed","error","PermissionsKey","setupPermissions","PermissionsPlugin","app","permissionsService","usePermissionsService","inject","usePermissions","isAllowed","ref","isLoading","actionValue","computed","checkPermission","err","unwatch","watch","onUnmounted","_sfc_main","defineComponent","props","toRefs","can","_ctx","_renderSlot","vCan","el","binding","originalDisplay","plugin","Check"],"mappings":"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"}
1
+ {"version":3,"file":"locator-ars-lib.umd.js","sources":["../src/services/permissionsService.ts","../src/plugin.ts","../src/composables/usePermissions.ts","../src/components/Check.vue","../src/directives/vCan.ts","../src/index.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios'\n\nexport interface PermissionsOptions {\n baseUrl?: string\n endpoint?: string\n}\n\nexport class PermissionsService {\n private axios: AxiosInstance\n private cache: Map<string, boolean> = new Map()\n private endpoint: string\n\n constructor(options?: PermissionsOptions) {\n this.axios = axios.create({\n baseURL: options?.baseUrl || ''\n })\n this.endpoint = options?.endpoint || '/api/v1/dashboard/access'\n }\n\n async can(action: string): Promise<boolean> {\n // Check if we have a cached result\n if (this.cache.has(action)) {\n return this.cache.get(action) as boolean\n }\n\n try {\n const response = await this.axios.get(this.endpoint, {\n params: { action }\n })\n\n const allowed = response.data.allowed || false\n\n // Cache the result\n this.cache.set(action, allowed)\n\n return allowed\n } catch (error) {\n console.error(`Error checking permission for ${action}:`, error)\n return false\n }\n }\n\n clearCache(action?: string): void {\n if (action) {\n this.cache.delete(action)\n } else {\n this.cache.clear()\n }\n }\n} ","import { App, inject, InjectionKey } from 'vue'\nimport { PermissionsService, PermissionsOptions } from './services/permissionsService'\n\nexport const PermissionsKey: InjectionKey<PermissionsService> = Symbol('Permissions')\n\nexport function setupPermissions(options?: PermissionsOptions): PermissionsService {\n return new PermissionsService(options)\n}\n\nexport const PermissionsPlugin = {\n install(app: App, options?: PermissionsOptions) {\n const permissionsService = setupPermissions(options)\n app.provide(PermissionsKey, permissionsService)\n }\n}\n\nexport function usePermissionsService(): PermissionsService {\n const permissionsService = inject(PermissionsKey)\n if (!permissionsService) {\n throw new Error('Permissions plugin not installed!')\n }\n return permissionsService\n} ","import { ref, computed, Ref, watch, onUnmounted } from 'vue'\nimport { usePermissionsService } from '../plugin'\n\nexport interface UsePermissionsOptions {\n autoCheck?: boolean\n}\n\nexport function usePermissions(action: string | Ref<string>, options: UsePermissionsOptions = {}) {\n const permissionsService = usePermissionsService()\n const isAllowed = ref<boolean | null>(null)\n const isLoading = ref(false)\n const error = ref<Error | null>(null)\n\n const actionValue = computed(() => {\n return typeof action === 'string' ? action : action.value\n })\n\n const checkPermission = async () => {\n if (!actionValue.value) return\n\n isLoading.value = true\n error.value = null\n\n try {\n isAllowed.value = await permissionsService.can(actionValue.value)\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err))\n isAllowed.value = false\n } finally {\n isLoading.value = false\n }\n }\n\n // Auto-check on mount if requested\n if (options.autoCheck !== false) {\n checkPermission()\n }\n\n // Re-check when action changes\n if (typeof action !== 'string') {\n const unwatch = watch(action, () => {\n checkPermission()\n })\n\n onUnmounted(() => {\n unwatch()\n })\n }\n\n return {\n isAllowed,\n isLoading,\n error,\n check: checkPermission,\n can: computed(() => isAllowed.value === true)\n }\n} ","<template>\n <slot v-if=\"can\" />\n <slot name=\"fallback\" v-else-if=\"!isLoading\" />\n <slot name=\"loading\" v-else />\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, toRefs, PropType } from 'vue';\nimport { usePermissions } from '../composables/usePermissions';\n\nexport default defineComponent({\n name: 'Check',\n props: {\n action: {\n type: String as PropType<string>,\n required: true\n },\n fallback: {\n type: Boolean,\n default: false\n }\n },\n setup(props) {\n const { action } = toRefs(props);\n const { can, isLoading } = usePermissions(action, { autoCheck: true });\n\n return {\n can,\n isLoading\n };\n }\n});\n</script> ","import { ObjectDirective, DirectiveBinding } from 'vue'\nimport { usePermissionsService } from '../plugin'\n\ninterface CanHTMLElement extends HTMLElement {\n _permission_data?: {\n action: string\n originalDisplay: string\n }\n}\n\nexport const vCan: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n // Store original display value\n const originalDisplay = el.style.display\n\n // Store action and original display for updates\n el._permission_data = {\n action: binding.value,\n originalDisplay\n }\n\n const permissionsService = usePermissionsService()\n const hasPermission = await permissionsService.can(binding.value)\n\n if (!hasPermission) {\n el.style.display = 'none'\n }\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n // Action has changed or directive is new\n el._permission_data = {\n action: binding.value,\n originalDisplay: el.style.display || ''\n }\n\n const permissionsService = usePermissionsService()\n const hasPermission = await permissionsService.can(binding.value)\n\n if (!hasPermission) {\n el.style.display = 'none'\n } else {\n el.style.display = el._permission_data.originalDisplay\n }\n }\n },\n\n unmounted(el: CanHTMLElement) {\n if (el._permission_data) {\n el.style.display = el._permission_data.originalDisplay\n delete el._permission_data\n }\n }\n} ","import { App } from 'vue'\nimport Check from './components/Check.vue'\nimport { usePermissions } from './composables/usePermissions'\nimport { PermissionsPlugin, setupPermissions, usePermissionsService } from './plugin'\nimport { vCan } from './directives/vCan'\n\n// Именованные экспорты\nexport {\n Check,\n usePermissions,\n setupPermissions,\n vCan,\n usePermissionsService\n}\n\n// Создаем основной объект плагина\nconst plugin = {\n install(app: App, options?: { baseUrl?: string }) {\n app.use(PermissionsPlugin, options)\n app.component('Check', Check)\n app.directive('can', vCan)\n }\n}\n\n// Экспортируем плагин как по умолчанию\nexport default plugin "],"names":["PermissionsService","options","__publicField","axios","action","allowed","error","PermissionsKey","setupPermissions","PermissionsPlugin","app","permissionsService","usePermissionsService","inject","usePermissions","isAllowed","ref","isLoading","actionValue","computed","checkPermission","err","unwatch","watch","onUnmounted","_sfc_main","defineComponent","props","toRefs","can","_ctx","_renderSlot","vCan","el","binding","originalDisplay","plugin","Check"],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "locator-ars-lib",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Permissions library for Vue 3 applications",
5
5
  "type": "module",
6
6
  "main": "./dist/locator-ars-lib.umd.js",
7
7
  "module": "./dist/locator-ars-lib.es.js",
8
8
  "exports": {
9
9
  ".": {
10
+ "types": "./types/index.d.ts",
10
11
  "import": "./dist/locator-ars-lib.es.js",
11
12
  "require": "./dist/locator-ars-lib.umd.js"
12
13
  }
@@ -36,6 +36,8 @@ declare module 'locator-ars-lib' {
36
36
  options?: PermissionsOptions
37
37
  ): PermissionsService
38
38
 
39
+ export function usePermissionsService(): PermissionsService
40
+
39
41
  const plugin: {
40
42
  install(app: App, options?: PermissionsOptions): void
41
43
  }