locator-ars-lib 1.0.7 → 1.0.9

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.
@@ -1,14 +1,14 @@
1
- var y = Object.defineProperty;
2
- var v = (e, s, r) => s in e ? y(e, s, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[s] = r;
3
- var o = (e, s, r) => v(e, typeof s != "symbol" ? s + "" : s, r);
4
- import { inject as _, ref as l, computed as p, watch as w, onUnmounted as k, defineComponent as g, toRefs as P, renderSlot as u } from "vue";
5
- import C from "axios";
6
- class S {
1
+ var h = Object.defineProperty;
2
+ var y = (e, s, i) => s in e ? h(e, s, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[s] = i;
3
+ var c = (e, s, i) => y(e, typeof s != "symbol" ? s + "" : s, i);
4
+ import { inject as v, ref as l, computed as p, watch as g, onUnmounted as _, defineComponent as k, toRefs as w, onMounted as P, renderSlot as d, createCommentVNode as C } from "vue";
5
+ import S from "axios";
6
+ class L {
7
7
  constructor(s) {
8
- o(this, "axios");
9
- o(this, "cache", /* @__PURE__ */ new Map());
10
- o(this, "endpoint");
11
- this.axios = C.create({
8
+ c(this, "axios");
9
+ c(this, "cache", /* @__PURE__ */ new Map());
10
+ c(this, "endpoint");
11
+ this.axios = S.create({
12
12
  baseURL: (s == null ? void 0 : s.baseUrl) || ""
13
13
  }), this.endpoint = (s == null ? void 0 : s.endpoint) || "/api/v1/dashboard/access";
14
14
  }
@@ -16,64 +16,108 @@ class S {
16
16
  if (this.cache.has(s))
17
17
  return this.cache.get(s);
18
18
  try {
19
- const i = (await this.axios.get(this.endpoint, {
19
+ const n = (await this.axios.get(this.endpoint, {
20
20
  params: { action: s }
21
21
  })).data.allowed || !1;
22
- return this.cache.set(s, i), i;
23
- } catch (r) {
24
- return console.error(`Error checking permission for ${s}:`, r), !1;
22
+ return this.cache.set(s, n), n;
23
+ } catch (i) {
24
+ return console.error(`Error checking permission for ${s}:`, i), !1;
25
25
  }
26
26
  }
27
27
  clearCache(s) {
28
28
  s ? this.cache.delete(s) : this.cache.clear();
29
29
  }
30
30
  }
31
- const f = Symbol("Permissions");
31
+ let t = null;
32
32
  function $(e) {
33
- return new S(e);
33
+ t = e;
34
34
  }
35
35
  const E = {
36
+ async mounted(e, s) {
37
+ const i = e.style.display;
38
+ if (e._permission_data = {
39
+ action: s.value,
40
+ originalDisplay: i,
41
+ permissionChecked: !1
42
+ }, !t) {
43
+ console.warn("Permissions service not initialized yet. Element will remain visible.");
44
+ return;
45
+ }
46
+ try {
47
+ await t.can(s.value) || (e.style.display = "none"), e._permission_data.permissionChecked = !0;
48
+ } catch (n) {
49
+ console.error("Error checking permission:", n);
50
+ }
51
+ },
52
+ async updated(e, s) {
53
+ var i;
54
+ if (!e._permission_data || e._permission_data.action !== s.value) {
55
+ const n = ((i = e._permission_data) == null ? void 0 : i.originalDisplay) || e.style.display || "";
56
+ if (e._permission_data = {
57
+ action: s.value,
58
+ originalDisplay: n,
59
+ permissionChecked: !1
60
+ }, !t) {
61
+ console.warn("Permissions service not initialized yet. Element will remain visible.");
62
+ return;
63
+ }
64
+ try {
65
+ await t.can(s.value) ? e.style.display = e._permission_data.originalDisplay : e.style.display = "none", e._permission_data.permissionChecked = !0;
66
+ } catch (r) {
67
+ console.error("Error checking permission:", r);
68
+ }
69
+ }
70
+ },
71
+ unmounted(e) {
72
+ e._permission_data && (e.style.display = e._permission_data.originalDisplay, delete e._permission_data);
73
+ }
74
+ }, f = Symbol("Permissions");
75
+ function b(e) {
76
+ const s = new L(e);
77
+ return $(s), s;
78
+ }
79
+ const D = {
36
80
  install(e, s) {
37
- const r = $(s);
38
- e.provide(f, r);
81
+ const i = b(s);
82
+ e.provide(f, i), e.config.globalProperties.$permissions = i;
39
83
  }
40
84
  };
41
- function h() {
42
- const e = _(f);
85
+ function I() {
86
+ const e = v(f);
43
87
  if (!e)
44
88
  throw new Error("Permissions plugin not installed!");
45
89
  return e;
46
90
  }
47
- function D(e, s = {}) {
48
- const r = h(), i = l(null), n = l(!1), a = l(null), m = p(() => typeof e == "string" ? e : e.value), c = async () => {
91
+ function U(e, s = {}) {
92
+ const i = I(), n = l(null), r = l(!1), a = l(null), m = p(() => typeof e == "string" ? e : e.value), u = async () => {
49
93
  if (m.value) {
50
- n.value = !0, a.value = null;
94
+ r.value = !0, a.value = null;
51
95
  try {
52
- i.value = await r.can(m.value);
53
- } catch (t) {
54
- a.value = t instanceof Error ? t : new Error(String(t)), i.value = !1;
96
+ n.value = await i.can(m.value);
97
+ } catch (o) {
98
+ a.value = o instanceof Error ? o : new Error(String(o)), n.value = !1;
55
99
  } finally {
56
- n.value = !1;
100
+ r.value = !1;
57
101
  }
58
102
  }
59
103
  };
60
- if (s.autoCheck !== !1 && c(), typeof e != "string") {
61
- const t = w(e, () => {
62
- c();
104
+ if (s.autoCheck !== !1 && u(), typeof e != "string") {
105
+ const o = g(e, () => {
106
+ u();
63
107
  });
64
- k(() => {
65
- t();
108
+ _(() => {
109
+ o();
66
110
  });
67
111
  }
68
112
  return {
69
- isAllowed: i,
70
- isLoading: n,
113
+ isAllowed: n,
114
+ isLoading: r,
71
115
  error: a,
72
- check: c,
73
- can: p(() => i.value === !0)
116
+ check: u,
117
+ can: p(() => n.value === !0)
74
118
  };
75
119
  }
76
- const L = g({
120
+ const z = k({
77
121
  name: "Check",
78
122
  props: {
79
123
  action: {
@@ -86,78 +130,36 @@ const L = g({
86
130
  }
87
131
  },
88
132
  setup(e) {
89
- const { action: s } = P(e), { can: r, isLoading: i } = D(s, { autoCheck: !0 });
90
- return {
91
- can: r,
92
- isLoading: i
133
+ const { action: s } = w(e), i = l(!0), { can: n, isLoading: r, check: a } = U(s, { autoCheck: !1 });
134
+ return P(async () => {
135
+ await a(), i.value = !1;
136
+ }), {
137
+ can: n,
138
+ isLoading: r,
139
+ isInitialLoading: i
93
140
  };
94
141
  }
95
- }), U = (e, s) => {
96
- const r = e.__vccOpts || e;
97
- for (const [i, n] of s)
98
- r[i] = n;
99
- return r;
142
+ }), M = (e, s) => {
143
+ const i = e.__vccOpts || e;
144
+ for (const [n, r] of s)
145
+ i[n] = r;
146
+ return i;
100
147
  };
101
- function b(e, s, r, i, n, a) {
102
- return e.can ? u(e.$slots, "default", { key: 0 }) : e.isLoading ? u(e.$slots, "loading", { key: 2 }) : u(e.$slots, "fallback", { key: 1 });
148
+ function R(e, s, i, n, r, a) {
149
+ return e.can && !e.isInitialLoading ? d(e.$slots, "default", { key: 0 }) : !e.isLoading && !e.isInitialLoading && !e.can ? d(e.$slots, "fallback", { key: 1 }) : e.isLoading || e.isInitialLoading ? d(e.$slots, "loading", { key: 2 }) : C("", !0);
103
150
  }
104
- const R = /* @__PURE__ */ U(L, [["render", b]]), d = async (e = 5, s = 100) => {
105
- let r = 0;
106
- for (; r < e; )
107
- try {
108
- return h();
109
- } catch {
110
- if (r++, r >= e)
111
- return console.warn("Could not get PermissionsService after multiple attempts"), null;
112
- await new Promise((n) => setTimeout(n, s));
113
- }
114
- return null;
115
- }, j = {
116
- async mounted(e, s) {
117
- const r = e.style.display;
118
- e._permission_data = {
119
- action: s.value,
120
- originalDisplay: r,
121
- permissionChecked: !1
122
- };
123
- try {
124
- const i = await d();
125
- i ? (await i.can(s.value) || (e.style.display = "none"), e._permission_data.permissionChecked = !0) : console.warn(`Permission check failed for action: ${s.value}`);
126
- } catch (i) {
127
- console.error("Error checking permission:", i);
128
- }
129
- },
130
- async updated(e, s) {
131
- var r;
132
- if (!e._permission_data || e._permission_data.action !== s.value) {
133
- const i = ((r = e._permission_data) == null ? void 0 : r.originalDisplay) || e.style.display || "";
134
- e._permission_data = {
135
- action: s.value,
136
- originalDisplay: i,
137
- permissionChecked: !1
138
- };
139
- try {
140
- const n = await d();
141
- n && (await n.can(s.value) ? e.style.display = e._permission_data.originalDisplay : e.style.display = "none", e._permission_data.permissionChecked = !0);
142
- } catch (n) {
143
- console.error("Error checking permission:", n);
144
- }
145
- }
146
- },
147
- unmounted(e) {
148
- e._permission_data && (e.style.display = e._permission_data.originalDisplay, delete e._permission_data);
149
- }
150
- }, F = {
151
+ const V = /* @__PURE__ */ M(z, [["render", R]]), B = {
151
152
  install(e, s) {
152
- e.use(E, s), e.component("Check", R), e.directive("can", j);
153
+ e.use(D, s), e.component("Check", V), e.directive("can", E);
153
154
  }
154
155
  };
155
156
  export {
156
- R as Check,
157
- F as default,
158
- $ as setupPermissions,
159
- D as usePermissions,
160
- h as usePermissionsService,
161
- j as vCan
157
+ V as Check,
158
+ B as default,
159
+ $ as setPermissionsService,
160
+ b as setupPermissions,
161
+ U as usePermissions,
162
+ I as usePermissionsService,
163
+ E as vCan
162
164
  };
163
165
  //# 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'\nimport { PermissionsService } from '../services/permissionsService'\n\ninterface CanHTMLElement extends HTMLElement {\n _permission_data?: {\n action: string\n originalDisplay: string\n permissionChecked?: boolean\n }\n}\n\n// Задержка для ожидания инициализации плагина\nconst waitForPermissionsService = async (maxAttempts = 5, delay = 100): Promise<PermissionsService | null> => {\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n try {\n return usePermissionsService();\n } catch (error) {\n attempts++;\n // Если достигли максимального количества попыток, вернуть null\n if (attempts >= maxAttempts) {\n console.warn('Could not get PermissionsService after multiple attempts');\n return null;\n }\n // Ждем перед следующей попыткой\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n return null;\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 permissionChecked: false\n }\n\n try {\n const permissionsService = await waitForPermissionsService();\n\n if (permissionsService) {\n const hasPermission = await permissionsService.can(binding.value);\n\n if (!hasPermission) {\n el.style.display = 'none';\n }\n\n el._permission_data.permissionChecked = true;\n } else {\n // Если не удалось получить сервис, по умолчанию показываем элемент\n console.warn(`Permission check failed for action: ${binding.value}`);\n }\n } catch (error) {\n console.error('Error checking permission:', error);\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 const originalDisplay = el._permission_data?.originalDisplay || el.style.display || '';\n\n el._permission_data = {\n action: binding.value,\n originalDisplay,\n permissionChecked: false\n }\n\n try {\n const permissionsService = await waitForPermissionsService();\n\n if (permissionsService) {\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 el._permission_data.permissionChecked = true;\n }\n } catch (error) {\n console.error('Error checking permission:', error);\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 // Важно: сначала нужно инициализировать PermissionsPlugin для provide/inject механизма\n app.use(PermissionsPlugin, options)\n\n // Затем регистрируем компонент и директиву\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","waitForPermissionsService","maxAttempts","delay","attempts","resolve","vCan","el","binding","originalDisplay","_a","plugin","Check"],"mappings":"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"}
1
+ {"version":3,"file":"locator-ars-lib.es.js","sources":["../src/services/permissionsService.ts","../src/directives/vCan.ts","../src/plugin.ts","../src/composables/usePermissions.ts","../src/components/Check.vue","../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 { ObjectDirective, DirectiveBinding } from 'vue'\nimport { PermissionsService } from '../services/permissionsService'\n\ninterface CanHTMLElement extends HTMLElement {\n _permission_data?: {\n action: string\n originalDisplay: string\n permissionChecked?: boolean\n }\n}\n\n// Глобальный сервис проверки прав\nlet globalPermissionsService: PermissionsService | null = null;\n\n// Функция для установки экземпляра сервиса (будет вызываться при инициализации плагина)\nexport function setPermissionsService(service: PermissionsService): void {\n globalPermissionsService = service;\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 permissionChecked: false\n };\n\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet. Element will remain visible.');\n return;\n }\n\n try {\n const hasPermission = await globalPermissionsService.can(binding.value);\n\n if (!hasPermission) {\n el.style.display = 'none';\n }\n\n el._permission_data.permissionChecked = true;\n } catch (error) {\n console.error('Error checking permission:', error);\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 const originalDisplay = el._permission_data?.originalDisplay || el.style.display || '';\n\n el._permission_data = {\n action: binding.value,\n originalDisplay,\n permissionChecked: false\n };\n\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet. Element will remain visible.');\n return;\n }\n\n try {\n const hasPermission = await globalPermissionsService.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 el._permission_data.permissionChecked = true;\n } catch (error) {\n console.error('Error checking permission:', error);\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, inject, InjectionKey } from 'vue'\nimport { PermissionsService, PermissionsOptions } from './services/permissionsService'\nimport { setPermissionsService } from './directives/vCan'\n\nexport const PermissionsKey: InjectionKey<PermissionsService> = Symbol('Permissions')\n\nexport function setupPermissions(options?: PermissionsOptions): PermissionsService {\n const service = new PermissionsService(options);\n // Устанавливаем глобальный сервис для директивы\n setPermissionsService(service);\n return service;\n}\n\nexport const PermissionsPlugin = {\n install(app: App, options?: PermissionsOptions) {\n const permissionsService = setupPermissions(options);\n app.provide(PermissionsKey, permissionsService);\n\n // Добавим сервис в глобальные свойства Vue для доступа откуда угодно\n app.config.globalProperties.$permissions = 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 && !isInitialLoading\" />\n <slot name=\"fallback\" v-else-if=\"!isLoading && !isInitialLoading && !can\" />\n <slot name=\"loading\" v-else-if=\"isLoading || isInitialLoading\" />\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, toRefs, PropType, ref, onMounted } 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 isInitialLoading = ref(true);\n const { can, isLoading, check } = usePermissions(action, { autoCheck: false });\n \n onMounted(async () => {\n await check();\n isInitialLoading.value = false;\n });\n\n return {\n can,\n isLoading,\n isInitialLoading\n };\n }\n});\n</script> ","import { App } from 'vue'\nimport Check from './components/Check.vue'\nimport { usePermissions } from './composables/usePermissions'\nimport { PermissionsPlugin, setupPermissions, usePermissionsService } from './plugin'\nimport { vCan, setPermissionsService } from './directives/vCan'\n\n// Именованные экспорты\nexport {\n Check,\n usePermissions,\n setupPermissions,\n vCan,\n usePermissionsService,\n setPermissionsService\n}\n\n// Создаем основной объект плагина\nconst plugin = {\n install(app: App, options?: { baseUrl?: string }) {\n // Важно: сначала нужно инициализировать PermissionsPlugin для provide/inject механизма\n app.use(PermissionsPlugin, options)\n\n // Затем регистрируем компонент и директиву\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","globalPermissionsService","setPermissionsService","service","vCan","el","binding","originalDisplay","_a","PermissionsKey","setupPermissions","PermissionsPlugin","app","permissionsService","usePermissionsService","inject","usePermissions","isAllowed","ref","isLoading","actionValue","computed","checkPermission","err","unwatch","watch","onUnmounted","_sfc_main","defineComponent","props","toRefs","isInitialLoading","can","check","onMounted","_ctx","_renderSlot","_createCommentVNode","plugin","Check"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(a,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("vue"),require("axios")):typeof define=="function"&&define.amd?define(["exports","vue","axios"],i):(a=typeof globalThis<"u"?globalThis:a||self,i(a.LocatorArsLib={},a.Vue,a.axios))})(this,function(a,i,o){"use strict";var E=Object.defineProperty;var L=(a,i,o)=>i in a?E(a,i,{enumerable:!0,configurable:!0,writable:!0,value:o}):a[i]=o;var u=(a,i,o)=>L(a,typeof i!="symbol"?i+"":i,o);class w{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 n=(await this.axios.get(this.endpoint,{params:{action:s}})).data.allowed||!1;return this.cache.set(s,n),n}catch(r){return console.error(`Error checking permission for ${s}:`,r),!1}}clearCache(s){s?this.cache.delete(s):this.cache.clear()}}const m=Symbol("Permissions");function p(e){return new w(e)}const P={install(e,s){const r=p(s);e.provide(m,r)}};function d(){const e=i.inject(m);if(!e)throw new Error("Permissions plugin not installed!");return e}function h(e,s={}){const r=d(),n=i.ref(null),t=i.ref(!1),c=i.ref(null),k=i.computed(()=>typeof e=="string"?e:e.value),f=async()=>{if(k.value){t.value=!0,c.value=null;try{n.value=await r.can(k.value)}catch(l){c.value=l instanceof Error?l:new Error(String(l)),n.value=!1}finally{t.value=!1}}};if(s.autoCheck!==!1&&f(),typeof e!="string"){const l=i.watch(e,()=>{f()});i.onUnmounted(()=>{l()})}return{isAllowed:n,isLoading:t,error:c,check:f,can:i.computed(()=>n.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:n}=h(s,{autoCheck:!0});return{can:r,isLoading:n}}}),S=(e,s)=>{const r=e.__vccOpts||e;for(const[n,t]of s)r[n]=t;return r};function C(e,s,r,n,t,c){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=S(g,[["render",C]]),_=async(e=5,s=100)=>{let r=0;for(;r<e;)try{return d()}catch{if(r++,r>=e)return console.warn("Could not get PermissionsService after multiple attempts"),null;await new Promise(t=>setTimeout(t,s))}return null},v={async mounted(e,s){const r=e.style.display;e._permission_data={action:s.value,originalDisplay:r,permissionChecked:!1};try{const n=await _();n?(await n.can(s.value)||(e.style.display="none"),e._permission_data.permissionChecked=!0):console.warn(`Permission check failed for action: ${s.value}`)}catch(n){console.error("Error checking permission:",n)}},async updated(e,s){var r;if(!e._permission_data||e._permission_data.action!==s.value){const n=((r=e._permission_data)==null?void 0:r.originalDisplay)||e.style.display||"";e._permission_data={action:s.value,originalDisplay:n,permissionChecked:!1};try{const t=await _();t&&(await t.can(s.value)?e.style.display=e._permission_data.originalDisplay:e.style.display="none",e._permission_data.permissionChecked=!0)}catch(t){console.error("Error checking permission:",t)}}},unmounted(e){e._permission_data&&(e.style.display=e._permission_data.originalDisplay,delete e._permission_data)}},$={install(e,s){e.use(P,s),e.component("Check",y),e.directive("can",v)}};a.Check=y,a.default=$,a.setupPermissions=p,a.usePermissions=h,a.usePermissionsService=d,a.vCan=v,Object.defineProperties(a,{__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,t){"use strict";var $=Object.defineProperty;var E=(n,i,t)=>i in n?$(n,i,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[i]=t;var u=(n,i,t)=>E(n,typeof i!="symbol"?i+"":i,t);class k{constructor(s){u(this,"axios");u(this,"cache",new Map);u(this,"endpoint");this.axios=t.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()}}let l=null;function f(e){l=e}const p={async mounted(e,s){const r=e.style.display;if(e._permission_data={action:s.value,originalDisplay:r,permissionChecked:!1},!l){console.warn("Permissions service not initialized yet. Element will remain visible.");return}try{await l.can(s.value)||(e.style.display="none"),e._permission_data.permissionChecked=!0}catch(a){console.error("Error checking permission:",a)}},async updated(e,s){var r;if(!e._permission_data||e._permission_data.action!==s.value){const a=((r=e._permission_data)==null?void 0:r.originalDisplay)||e.style.display||"";if(e._permission_data={action:s.value,originalDisplay:a,permissionChecked:!1},!l){console.warn("Permissions service not initialized yet. Element will remain visible.");return}try{await l.can(s.value)?e.style.display=e._permission_data.originalDisplay:e.style.display="none",e._permission_data.permissionChecked=!0}catch(o){console.error("Error checking permission:",o)}}},unmounted(e){e._permission_data&&(e.style.display=e._permission_data.originalDisplay,delete e._permission_data)}},h=Symbol("Permissions");function y(e){const s=new k(e);return f(s),s}const w={install(e,s){const r=y(s);e.provide(h,r),e.config.globalProperties.$permissions=r}};function g(){const e=i.inject(h);if(!e)throw new Error("Permissions plugin not installed!");return e}function v(e,s={}){const r=g(),a=i.ref(null),o=i.ref(!1),c=i.ref(null),_=i.computed(()=>typeof e=="string"?e:e.value),m=async()=>{if(_.value){o.value=!0,c.value=null;try{a.value=await r.can(_.value)}catch(d){c.value=d instanceof Error?d:new Error(String(d)),a.value=!1}finally{o.value=!1}}};if(s.autoCheck!==!1&&m(),typeof e!="string"){const d=i.watch(e,()=>{m()});i.onUnmounted(()=>{d()})}return{isAllowed:a,isLoading:o,error:c,check:m,can:i.computed(()=>a.value===!0)}}const S=i.defineComponent({name:"Check",props:{action:{type:String,required:!0},fallback:{type:Boolean,default:!1}},setup(e){const{action:s}=i.toRefs(e),r=i.ref(!0),{can:a,isLoading:o,check:c}=v(s,{autoCheck:!1});return i.onMounted(async()=>{await c(),r.value=!1}),{can:a,isLoading:o,isInitialLoading:r}}}),C=(e,s)=>{const r=e.__vccOpts||e;for(const[a,o]of s)r[a]=o;return r};function L(e,s,r,a,o,c){return e.can&&!e.isInitialLoading?i.renderSlot(e.$slots,"default",{key:0}):!e.isLoading&&!e.isInitialLoading&&!e.can?i.renderSlot(e.$slots,"fallback",{key:1}):e.isLoading||e.isInitialLoading?i.renderSlot(e.$slots,"loading",{key:2}):i.createCommentVNode("",!0)}const P=C(S,[["render",L]]),b={install(e,s){e.use(w,s),e.component("Check",P),e.directive("can",p)}};n.Check=P,n.default=b,n.setPermissionsService=f,n.setupPermissions=y,n.usePermissions=v,n.usePermissionsService=g,n.vCan=p,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'\nimport { PermissionsService } from '../services/permissionsService'\n\ninterface CanHTMLElement extends HTMLElement {\n _permission_data?: {\n action: string\n originalDisplay: string\n permissionChecked?: boolean\n }\n}\n\n// Задержка для ожидания инициализации плагина\nconst waitForPermissionsService = async (maxAttempts = 5, delay = 100): Promise<PermissionsService | null> => {\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n try {\n return usePermissionsService();\n } catch (error) {\n attempts++;\n // Если достигли максимального количества попыток, вернуть null\n if (attempts >= maxAttempts) {\n console.warn('Could not get PermissionsService after multiple attempts');\n return null;\n }\n // Ждем перед следующей попыткой\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n return null;\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 permissionChecked: false\n }\n\n try {\n const permissionsService = await waitForPermissionsService();\n\n if (permissionsService) {\n const hasPermission = await permissionsService.can(binding.value);\n\n if (!hasPermission) {\n el.style.display = 'none';\n }\n\n el._permission_data.permissionChecked = true;\n } else {\n // Если не удалось получить сервис, по умолчанию показываем элемент\n console.warn(`Permission check failed for action: ${binding.value}`);\n }\n } catch (error) {\n console.error('Error checking permission:', error);\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 const originalDisplay = el._permission_data?.originalDisplay || el.style.display || '';\n\n el._permission_data = {\n action: binding.value,\n originalDisplay,\n permissionChecked: false\n }\n\n try {\n const permissionsService = await waitForPermissionsService();\n\n if (permissionsService) {\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 el._permission_data.permissionChecked = true;\n }\n } catch (error) {\n console.error('Error checking permission:', error);\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 // Важно: сначала нужно инициализировать PermissionsPlugin для provide/inject механизма\n app.use(PermissionsPlugin, options)\n\n // Затем регистрируем компонент и директиву\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","waitForPermissionsService","maxAttempts","delay","attempts","resolve","vCan","el","binding","originalDisplay","_a","plugin","Check"],"mappings":"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"}
1
+ {"version":3,"file":"locator-ars-lib.umd.js","sources":["../src/services/permissionsService.ts","../src/directives/vCan.ts","../src/plugin.ts","../src/composables/usePermissions.ts","../src/components/Check.vue","../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 { ObjectDirective, DirectiveBinding } from 'vue'\nimport { PermissionsService } from '../services/permissionsService'\n\ninterface CanHTMLElement extends HTMLElement {\n _permission_data?: {\n action: string\n originalDisplay: string\n permissionChecked?: boolean\n }\n}\n\n// Глобальный сервис проверки прав\nlet globalPermissionsService: PermissionsService | null = null;\n\n// Функция для установки экземпляра сервиса (будет вызываться при инициализации плагина)\nexport function setPermissionsService(service: PermissionsService): void {\n globalPermissionsService = service;\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 permissionChecked: false\n };\n\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet. Element will remain visible.');\n return;\n }\n\n try {\n const hasPermission = await globalPermissionsService.can(binding.value);\n\n if (!hasPermission) {\n el.style.display = 'none';\n }\n\n el._permission_data.permissionChecked = true;\n } catch (error) {\n console.error('Error checking permission:', error);\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 const originalDisplay = el._permission_data?.originalDisplay || el.style.display || '';\n\n el._permission_data = {\n action: binding.value,\n originalDisplay,\n permissionChecked: false\n };\n\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet. Element will remain visible.');\n return;\n }\n\n try {\n const hasPermission = await globalPermissionsService.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 el._permission_data.permissionChecked = true;\n } catch (error) {\n console.error('Error checking permission:', error);\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, inject, InjectionKey } from 'vue'\nimport { PermissionsService, PermissionsOptions } from './services/permissionsService'\nimport { setPermissionsService } from './directives/vCan'\n\nexport const PermissionsKey: InjectionKey<PermissionsService> = Symbol('Permissions')\n\nexport function setupPermissions(options?: PermissionsOptions): PermissionsService {\n const service = new PermissionsService(options);\n // Устанавливаем глобальный сервис для директивы\n setPermissionsService(service);\n return service;\n}\n\nexport const PermissionsPlugin = {\n install(app: App, options?: PermissionsOptions) {\n const permissionsService = setupPermissions(options);\n app.provide(PermissionsKey, permissionsService);\n\n // Добавим сервис в глобальные свойства Vue для доступа откуда угодно\n app.config.globalProperties.$permissions = 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 && !isInitialLoading\" />\n <slot name=\"fallback\" v-else-if=\"!isLoading && !isInitialLoading && !can\" />\n <slot name=\"loading\" v-else-if=\"isLoading || isInitialLoading\" />\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, toRefs, PropType, ref, onMounted } 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 isInitialLoading = ref(true);\n const { can, isLoading, check } = usePermissions(action, { autoCheck: false });\n \n onMounted(async () => {\n await check();\n isInitialLoading.value = false;\n });\n\n return {\n can,\n isLoading,\n isInitialLoading\n };\n }\n});\n</script> ","import { App } from 'vue'\nimport Check from './components/Check.vue'\nimport { usePermissions } from './composables/usePermissions'\nimport { PermissionsPlugin, setupPermissions, usePermissionsService } from './plugin'\nimport { vCan, setPermissionsService } from './directives/vCan'\n\n// Именованные экспорты\nexport {\n Check,\n usePermissions,\n setupPermissions,\n vCan,\n usePermissionsService,\n setPermissionsService\n}\n\n// Создаем основной объект плагина\nconst plugin = {\n install(app: App, options?: { baseUrl?: string }) {\n // Важно: сначала нужно инициализировать PermissionsPlugin для provide/inject механизма\n app.use(PermissionsPlugin, options)\n\n // Затем регистрируем компонент и директиву\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","globalPermissionsService","setPermissionsService","service","vCan","el","binding","originalDisplay","_a","PermissionsKey","setupPermissions","PermissionsPlugin","app","permissionsService","usePermissionsService","inject","usePermissions","isAllowed","ref","isLoading","actionValue","computed","checkPermission","err","unwatch","watch","onUnmounted","_sfc_main","defineComponent","props","toRefs","isInitialLoading","can","check","onMounted","_ctx","_renderSlot","_createCommentVNode","plugin","Check"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "locator-ars-lib",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Permissions library for Vue 3 applications",
5
5
  "type": "module",
6
6
  "main": "./dist/locator-ars-lib.umd.js",