locator-ars-lib 1.1.2 → 1.1.4

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.
package/README.md CHANGED
@@ -30,6 +30,7 @@ const app = createApp(App);
30
30
  app.use(LocatorArsLib, {
31
31
  baseUrl: "https://your-api.com", // Базовый URL для API (опционально)
32
32
  endpoint: "/api/v1/dashboard/access", // Путь для проверки прав (опционально)
33
+ application: "my-app-name", // Идентификатор приложения для заголовка Application (опционально)
33
34
  });
34
35
 
35
36
  app.mount("#app");
@@ -81,7 +82,11 @@ app.mount("#app");
81
82
  </template>
82
83
  ```
83
84
 
84
- ### 2. Директива v-can
85
+ > **Важно:** Компонент Check изначально скрывает основной контент до получения подтверждения о правах доступа. Только после успешной проверки прав происходит отображение контента. До этого момента отображается слот `loading`, если он предоставлен.
86
+
87
+ ### 2. Директивы v-can и v-cant
88
+
89
+ #### Директива v-can
85
90
 
86
91
  Используйте директиву для простой проверки на элементах:
87
92
 
@@ -95,6 +100,23 @@ app.mount("#app");
95
100
  </template>
96
101
  ```
97
102
 
103
+ > **Важно:** Директива v-can изначально скрывает элементы, к которым она применена. Элементы отображаются только после успешной проверки прав доступа.
104
+
105
+ #### Директива v-cant
106
+
107
+ Используйте директиву v-cant для отображения элементов только при отсутствии прав (противоположность v-can):
108
+
109
+ ```vue
110
+ <template>
111
+ <button v-can="'edit_user'">Редактировать</button>
112
+ <div v-cant="'edit_user'" class="no-permission-message">
113
+ У вас нет прав на редактирование
114
+ </div>
115
+ </template>
116
+ ```
117
+
118
+ > **Оптимизация:** Директивы v-can и v-cant используют общий механизм кеширования запросов на проверку прав. Это значит, что если на странице есть несколько элементов с проверкой одного и того же права, будет отправлен только один запрос к серверу.
119
+
98
120
  ### 3. Композиция usePermissions
99
121
 
100
122
  Для программного использования в компонентах:
@@ -110,7 +132,7 @@ const { can, isLoading } = usePermissions("manage_users");
110
132
  const action = ref("edit_post");
111
133
  const { can: canEditPost } = usePermissions(action);
112
134
 
113
- // Ручная проверка
135
+ // Ручная проверка (не выполняется автоматически)
114
136
  const { check, can: canDeleteUser } = usePermissions("delete_user", {
115
137
  autoCheck: false,
116
138
  });
@@ -135,12 +157,24 @@ function handleDelete() {
135
157
  | action | string | | Название действия для проверки |
136
158
  | fallback | boolean | false | Показывать ли fallback слот при отсутствии прав |
137
159
 
138
- ### Директива v-can
160
+ ### Директивы
161
+
162
+ #### Директива v-can
139
163
 
140
164
  ```vue
141
165
  v-can="'action_name'"
142
166
  ```
143
167
 
168
+ Показывает элемент только при наличии прав доступа.
169
+
170
+ #### Директива v-cant
171
+
172
+ ```vue
173
+ v-cant="'action_name'"
174
+ ```
175
+
176
+ Показывает элемент только при отсутствии прав доступа (противоположность v-can).
177
+
144
178
  ### usePermissions composable
145
179
 
146
180
  ```typescript
@@ -157,6 +191,23 @@ const {
157
191
  | action | string \| Ref<string> | | Название действия для проверки |
158
192
  | options.autoCheck | boolean | true | Автоматически проверять при создании |
159
193
 
194
+ ## Особенности реализации
195
+
196
+ ### Кеширование запросов
197
+
198
+ Библиотека реализует оптимизацию запросов проверки прав для снижения нагрузки на сервер:
199
+
200
+ - Запросы на проверку одинаковых прав объединяются и выполняются один раз
201
+ - Результаты кешируются в памяти в рамках текущей сессии
202
+ - При перезагрузке страницы кеш автоматически очищается
203
+
204
+ ### Поведение при загрузке
205
+
206
+ Все компоненты и директивы по умолчанию скрывают контент до получения подтверждения о правах доступа:
207
+
208
+ - Компонент Check показывает слот loading во время запроса
209
+ - Директивы v-can и v-cant держат элементы скрытыми до получения результата
210
+
160
211
  ## Лицензия
161
212
 
162
213
  MIT
@@ -1,25 +1,26 @@
1
1
  var v = Object.defineProperty;
2
2
  var g = (e, s, i) => s in e ? v(e, s, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[s] = i;
3
3
  var o = (e, s, i) => g(e, typeof s != "symbol" ? s + "" : s, i);
4
- import { inject as _, ref as l, computed as y, watch as k, onUnmounted as P, defineComponent as w, toRefs as C, onMounted as S, renderSlot as m, createCommentVNode as L } from "vue";
4
+ import { inject as _, ref as l, computed as h, watch as k, onUnmounted as P, defineComponent as w, toRefs as C, onMounted as S, renderSlot as p, createCommentVNode as L } from "vue";
5
5
  import $ from "axios";
6
6
  class E {
7
7
  constructor(s) {
8
8
  o(this, "axios");
9
9
  o(this, "cache", /* @__PURE__ */ new Map());
10
10
  o(this, "endpoint");
11
+ o(this, "application");
11
12
  this.axios = $.create({
12
13
  baseURL: (s == null ? void 0 : s.baseUrl) || ""
13
- }), this.endpoint = (s == null ? void 0 : s.endpoint) || "/api/v1/dashboard/access";
14
+ }), this.endpoint = (s == null ? void 0 : s.endpoint) || "/api/v1/dashboard/access", this.application = s == null ? void 0 : s.application, this.application && (this.axios.defaults.headers.common.Application = this.application);
14
15
  }
15
16
  async can(s) {
16
17
  if (this.cache.has(s))
17
18
  return this.cache.get(s);
18
19
  try {
19
- const n = (await this.axios.get(this.endpoint, {
20
+ const a = (await this.axios.get(this.endpoint, {
20
21
  params: { action: s }
21
22
  })).data.allowed || !1;
22
- return this.cache.set(s, n), n;
23
+ return this.cache.set(s, a), a;
23
24
  } catch (i) {
24
25
  return console.error(`Error checking permission for ${s}:`, i), !1;
25
26
  }
@@ -28,32 +29,32 @@ class E {
28
29
  s ? this.cache.delete(s) : this.cache.clear();
29
30
  }
30
31
  }
31
- let f = null;
32
+ let m = null;
32
33
  const c = /* @__PURE__ */ new Map();
33
34
  function b(e) {
34
- f = e;
35
+ m = e;
35
36
  }
36
37
  async function I(e) {
37
- if (!f)
38
+ if (!m)
38
39
  return console.warn("Permissions service not initialized yet."), !1;
39
40
  if (!c.has(e)) {
40
- const s = f.can(e).catch((i) => (console.error("Error checking permission:", i), c.delete(e), !1));
41
+ const s = m.can(e).catch((i) => (console.error("Error checking permission:", i), c.delete(e), !1));
41
42
  c.set(e, s);
42
43
  }
43
44
  return c.get(e);
44
45
  }
45
46
  async function u(e, s, i) {
46
- const n = e.style.display;
47
+ const a = e.style.display;
47
48
  e._permission_data = {
48
49
  action: s,
49
- originalDisplay: n,
50
+ originalDisplay: a,
50
51
  permissionChecked: !1
51
52
  }, e.style.display = "none";
52
53
  try {
53
- const a = await I(s);
54
- (i && a || !i && !a) && (e.style.display = n || ""), e._permission_data.permissionChecked = !0;
55
- } catch (a) {
56
- console.error("Error in directive processing:", a), i || (e.style.display = n || "");
54
+ const n = await I(s);
55
+ (i && n || !i && !n) && (e.style.display = a || ""), e._permission_data.permissionChecked = !0;
56
+ } catch (n) {
57
+ console.error("Error in directive processing:", n), i || (e.style.display = a || "");
57
58
  }
58
59
  }
59
60
  const D = {
@@ -76,7 +77,7 @@ const D = {
76
77
  unmounted(e) {
77
78
  e._permission_data && (e.style.display = e._permission_data.originalDisplay, delete e._permission_data);
78
79
  }
79
- }, h = Symbol("Permissions");
80
+ }, y = Symbol("Permissions");
80
81
  function U(e) {
81
82
  const s = new E(e);
82
83
  return b(s), s;
@@ -84,25 +85,25 @@ function U(e) {
84
85
  const R = {
85
86
  install(e, s) {
86
87
  const i = U(s);
87
- e.provide(h, i), e.config.globalProperties.$permissions = i;
88
+ e.provide(y, i), e.config.globalProperties.$permissions = i;
88
89
  }
89
90
  };
90
91
  function V() {
91
- const e = _(h);
92
+ const e = _(y);
92
93
  if (!e)
93
94
  throw new Error("Permissions plugin not installed!");
94
95
  return e;
95
96
  }
96
97
  function j(e, s = {}) {
97
- const i = V(), n = l(null), a = l(!1), r = l(null), p = y(() => typeof e == "string" ? e : e.value), d = async () => {
98
- if (p.value) {
99
- a.value = !0, r.value = null;
98
+ const i = V(), a = l(null), n = l(!1), r = l(null), f = h(() => typeof e == "string" ? e : e.value), d = async () => {
99
+ if (f.value) {
100
+ n.value = !0, r.value = null;
100
101
  try {
101
- n.value = await i.can(p.value);
102
+ a.value = await i.can(f.value);
102
103
  } catch (t) {
103
- r.value = t instanceof Error ? t : new Error(String(t)), n.value = !1;
104
+ r.value = t instanceof Error ? t : new Error(String(t)), a.value = !1;
104
105
  } finally {
105
- a.value = !1;
106
+ n.value = !1;
106
107
  }
107
108
  }
108
109
  };
@@ -115,11 +116,11 @@ function j(e, s = {}) {
115
116
  });
116
117
  }
117
118
  return {
118
- isAllowed: n,
119
- isLoading: a,
119
+ isAllowed: a,
120
+ isLoading: n,
120
121
  error: r,
121
122
  check: d,
122
- can: y(() => n.value === !0)
123
+ can: h(() => a.value === !0)
123
124
  };
124
125
  }
125
126
  const q = w({
@@ -135,32 +136,32 @@ const q = w({
135
136
  }
136
137
  },
137
138
  setup(e) {
138
- const { action: s } = C(e), i = l(!0), { can: n, isLoading: a, check: r } = j(s, { autoCheck: !1 });
139
+ const { action: s } = C(e), i = l(!0), { can: a, isLoading: n, check: r } = j(s, { autoCheck: !1 });
139
140
  return S(async () => {
140
141
  await r(), i.value = !1;
141
142
  }), {
142
- can: n,
143
- isLoading: a,
143
+ can: a,
144
+ isLoading: n,
144
145
  isInitialLoading: i
145
146
  };
146
147
  }
147
148
  }), z = (e, s) => {
148
149
  const i = e.__vccOpts || e;
149
- for (const [n, a] of s)
150
- i[n] = a;
150
+ for (const [a, n] of s)
151
+ i[a] = n;
151
152
  return i;
152
153
  };
153
- function B(e, s, i, n, a, r) {
154
- return e.can && !e.isInitialLoading ? m(e.$slots, "default", { key: 0 }) : !e.isLoading && !e.isInitialLoading && !e.can ? m(e.$slots, "fallback", { key: 1 }) : e.isLoading || e.isInitialLoading ? m(e.$slots, "loading", { key: 2 }) : L("", !0);
154
+ function B(e, s, i, a, n, r) {
155
+ return e.can && !e.isInitialLoading ? p(e.$slots, "default", { key: 0 }) : !e.isLoading && !e.isInitialLoading && !e.can ? p(e.$slots, "fallback", { key: 1 }) : e.isLoading || e.isInitialLoading ? p(e.$slots, "loading", { key: 2 }) : L("", !0);
155
156
  }
156
- const K = /* @__PURE__ */ z(q, [["render", B]]), G = {
157
+ const K = /* @__PURE__ */ z(q, [["render", B]]), F = {
157
158
  install(e, s) {
158
159
  e.use(R, s), e.component("Check", K), e.directive("can", D), e.directive("cant", M);
159
160
  }
160
161
  };
161
162
  export {
162
163
  K as Check,
163
- G as default,
164
+ F as default,
164
165
  b as setPermissionsService,
165
166
  U as setupPermissions,
166
167
  j as usePermissions,
@@ -1 +1 @@
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// Кэш результатов проверки прав для избежания дублирования запросов\nconst permissionsCache: Map<string, Promise<boolean>> = new Map();\n\n// Функция для установки экземпляра сервиса (будет вызываться при инициализации плагина)\nexport function setPermissionsService(service: PermissionsService): void {\n globalPermissionsService = service;\n}\n\n// Общая функция проверки прав для обеих директив\nasync function checkPermission(action: string): Promise<boolean> {\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet.');\n return false;\n }\n\n // Проверяем есть ли запрос с таким же action уже в процессе выполнения\n if (!permissionsCache.has(action)) {\n // Создаем Promise для проверки прав и сохраняем в кэш\n const permissionPromise = globalPermissionsService.can(action)\n .catch(error => {\n console.error('Error checking permission:', error);\n permissionsCache.delete(action);\n return false;\n });\n\n permissionsCache.set(action, permissionPromise);\n }\n\n // Возвращаем результат из кэша (либо готовый, либо ожидающий Promise)\n return permissionsCache.get(action) as Promise<boolean>;\n}\n\n// Общая логика для обработки элементов, применяемая обеими директивами\nasync function processElement(el: CanHTMLElement, action: string, showWhenAllowed: boolean) {\n const originalDisplay = el.style.display;\n\n // Store action and original display for updates\n el._permission_data = {\n action,\n originalDisplay,\n permissionChecked: false\n };\n\n // Скрываем элемент изначально до проверки прав\n el.style.display = 'none';\n\n try {\n const hasPermission = await checkPermission(action);\n\n // Показываем элемент в зависимости от режима и результата проверки\n if ((showWhenAllowed && hasPermission) || (!showWhenAllowed && !hasPermission)) {\n el.style.display = originalDisplay || '';\n }\n\n el._permission_data.permissionChecked = true;\n } catch (error) {\n console.error('Error in directive processing:', error);\n // При ошибке для v-cant показываем элемент\n if (!showWhenAllowed) {\n el.style.display = originalDisplay || '';\n }\n }\n}\n\nexport const vCan: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n await processElement(el, binding.value, true);\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n await processElement(el, binding.value, true);\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}\n\n// Директива vCant - противоположность vCan, показывает элемент только если прав НЕТ\nexport const vCant: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n await processElement(el, binding.value, false);\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n await processElement(el, binding.value, false);\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, vCant, setPermissionsService } from './directives/vCan'\n\n// Именованные экспорты\nexport {\n Check,\n usePermissions,\n setupPermissions,\n vCan,\n vCant,\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 app.directive('cant', vCant)\n }\n}\n\n// Экспортируем плагин как по умолчанию\nexport default plugin "],"names":["PermissionsService","options","__publicField","axios","action","allowed","error","globalPermissionsService","permissionsCache","setPermissionsService","service","checkPermission","permissionPromise","processElement","el","showWhenAllowed","originalDisplay","hasPermission","vCan","binding","vCant","PermissionsKey","setupPermissions","PermissionsPlugin","app","permissionsService","usePermissionsService","inject","usePermissions","isAllowed","ref","isLoading","actionValue","computed","err","unwatch","watch","onUnmounted","_sfc_main","defineComponent","props","toRefs","isInitialLoading","can","check","onMounted","_ctx","_renderSlot","_createCommentVNode","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 application?: string\n}\n\nexport class PermissionsService {\n private axios: AxiosInstance\n private cache: Map<string, boolean> = new Map()\n private endpoint: string\n private application?: 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 this.application = options?.application\n\n // Если указано application, добавляем его в заголовки по умолчанию\n if (this.application) {\n this.axios.defaults.headers.common['Application'] = this.application\n }\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// Кэш результатов проверки прав для избежания дублирования запросов\nconst permissionsCache: Map<string, Promise<boolean>> = new Map();\n\n// Функция для установки экземпляра сервиса (будет вызываться при инициализации плагина)\nexport function setPermissionsService(service: PermissionsService): void {\n globalPermissionsService = service;\n}\n\n// Общая функция проверки прав для обеих директив\nasync function checkPermission(action: string): Promise<boolean> {\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet.');\n return false;\n }\n\n // Проверяем есть ли запрос с таким же action уже в процессе выполнения\n if (!permissionsCache.has(action)) {\n // Создаем Promise для проверки прав и сохраняем в кэш\n const permissionPromise = globalPermissionsService.can(action)\n .catch(error => {\n console.error('Error checking permission:', error);\n permissionsCache.delete(action);\n return false;\n });\n\n permissionsCache.set(action, permissionPromise);\n }\n\n // Возвращаем результат из кэша (либо готовый, либо ожидающий Promise)\n return permissionsCache.get(action) as Promise<boolean>;\n}\n\n// Общая логика для обработки элементов, применяемая обеими директивами\nasync function processElement(el: CanHTMLElement, action: string, showWhenAllowed: boolean) {\n const originalDisplay = el.style.display;\n\n // Store action and original display for updates\n el._permission_data = {\n action,\n originalDisplay,\n permissionChecked: false\n };\n\n // Скрываем элемент изначально до проверки прав\n el.style.display = 'none';\n\n try {\n const hasPermission = await checkPermission(action);\n\n // Показываем элемент в зависимости от режима и результата проверки\n if ((showWhenAllowed && hasPermission) || (!showWhenAllowed && !hasPermission)) {\n el.style.display = originalDisplay || '';\n }\n\n el._permission_data.permissionChecked = true;\n } catch (error) {\n console.error('Error in directive processing:', error);\n // При ошибке для v-cant показываем элемент\n if (!showWhenAllowed) {\n el.style.display = originalDisplay || '';\n }\n }\n}\n\nexport const vCan: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n await processElement(el, binding.value, true);\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n await processElement(el, binding.value, true);\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}\n\n// Директива vCant - противоположность vCan, показывает элемент только если прав НЕТ\nexport const vCant: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n await processElement(el, binding.value, false);\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n await processElement(el, binding.value, false);\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\n/**\n * Setup permissions service with provided options\n * @param options Configuration options\n * @param options.baseUrl Base URL for API requests\n * @param options.endpoint Custom endpoint for permission checks\n * @param options.application Application identifier to be sent as a header\n * @returns Configured PermissionsService instance\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, vCant, setPermissionsService } from './directives/vCan'\n\n// Именованные экспорты\nexport {\n Check,\n usePermissions,\n setupPermissions,\n vCan,\n vCant,\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 app.directive('cant', vCant)\n }\n}\n\n// Экспортируем плагин как по умолчанию\nexport default plugin "],"names":["PermissionsService","options","__publicField","axios","action","allowed","error","globalPermissionsService","permissionsCache","setPermissionsService","service","checkPermission","permissionPromise","processElement","el","showWhenAllowed","originalDisplay","hasPermission","vCan","binding","vCant","PermissionsKey","setupPermissions","PermissionsPlugin","app","permissionsService","usePermissionsService","inject","usePermissions","isAllowed","ref","isLoading","actionValue","computed","err","unwatch","watch","onUnmounted","_sfc_main","defineComponent","props","toRefs","isInitialLoading","can","check","onMounted","_ctx","_renderSlot","_createCommentVNode","plugin","Check"],"mappings":";;;;;AAQO,MAAMA,EAAmB;AAAA,EAM5B,YAAYC,GAA8B;AALlC,IAAAC,EAAA;AACA,IAAAA,EAAA,mCAAkC,IAAI;AACtC,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGC,SAAA,QAAQC,EAAM,OAAO;AAAA,MACtB,UAASF,KAAA,gBAAAA,EAAS,YAAW;AAAA,IAAA,CAChC,GACI,KAAA,YAAWA,KAAA,gBAAAA,EAAS,aAAY,4BACrC,KAAK,cAAcA,KAAA,gBAAAA,EAAS,aAGxB,KAAK,gBACL,KAAK,MAAM,SAAS,QAAQ,OAAO,cAAiB,KAAK;AAAA,EAC7D;AAAA,EAGJ,MAAM,IAAIG,GAAkC;AAExC,QAAI,KAAK,MAAM,IAAIA,CAAM;AACd,aAAA,KAAK,MAAM,IAAIA,CAAM;AAG5B,QAAA;AAKM,YAAAC,KAJW,MAAM,KAAK,MAAM,IAAI,KAAK,UAAU;AAAA,QACjD,QAAQ,EAAE,QAAAD,EAAO;AAAA,MAAA,CACpB,GAEwB,KAAK,WAAW;AAGpC,kBAAA,MAAM,IAAIA,GAAQC,CAAO,GAEvBA;AAAA,aACFC,GAAO;AACZ,qBAAQ,MAAM,iCAAiCF,CAAM,KAAKE,CAAK,GACxD;AAAA,IAAA;AAAA,EACX;AAAA,EAGJ,WAAWF,GAAuB;AAC9B,IAAIA,IACK,KAAA,MAAM,OAAOA,CAAM,IAExB,KAAK,MAAM,MAAM;AAAA,EACrB;AAER;AC7CA,IAAIG,IAAsD;AAG1D,MAAMC,wBAAsD,IAAI;AAGzD,SAASC,EAAsBC,GAAmC;AAC1C,EAAAH,IAAAG;AAC/B;AAGA,eAAeC,EAAgBP,GAAkC;AAC7D,MAAI,CAACG;AACD,mBAAQ,KAAK,0CAA0C,GAChD;AAIX,MAAI,CAACC,EAAiB,IAAIJ,CAAM,GAAG;AAE/B,UAAMQ,IAAoBL,EAAyB,IAAIH,CAAM,EACxD,MAAM,CAASE,OACJ,QAAA,MAAM,8BAA8BA,CAAK,GACjDE,EAAiB,OAAOJ,CAAM,GACvB,GACV;AAEY,IAAAI,EAAA,IAAIJ,GAAQQ,CAAiB;AAAA,EAAA;AAI3C,SAAAJ,EAAiB,IAAIJ,CAAM;AACtC;AAGA,eAAeS,EAAeC,GAAoBV,GAAgBW,GAA0B;AAClF,QAAAC,IAAkBF,EAAG,MAAM;AAGjC,EAAAA,EAAG,mBAAmB;AAAA,IAClB,QAAAV;AAAA,IACA,iBAAAY;AAAA,IACA,mBAAmB;AAAA,EACvB,GAGAF,EAAG,MAAM,UAAU;AAEf,MAAA;AACM,UAAAG,IAAgB,MAAMN,EAAgBP,CAAM;AAGlD,KAAKW,KAAmBE,KAAmB,CAACF,KAAmB,CAACE,OACzDH,EAAA,MAAM,UAAUE,KAAmB,KAG1CF,EAAG,iBAAiB,oBAAoB;AAAA,WACnCR,GAAO;AACJ,YAAA,MAAM,kCAAkCA,CAAK,GAEhDS,MACED,EAAA,MAAM,UAAUE,KAAmB;AAAA,EAC1C;AAER;AAEO,MAAME,IAAwB;AAAA,EACjC,MAAM,QAAQJ,GAAoBK,GAA2B;AACzD,UAAMN,EAAeC,GAAIK,EAAQ,OAAO,EAAI;AAAA,EAChD;AAAA,EAEA,MAAM,QAAQL,GAAoBK,GAA2B;AACzD,KAAI,CAACL,EAAG,oBAAoBA,EAAG,iBAAiB,WAAWK,EAAQ,UAC/D,MAAMN,EAAeC,GAAIK,EAAQ,OAAO,EAAI;AAAA,EAEpD;AAAA,EAEA,UAAUL,GAAoB;AAC1B,IAAIA,EAAG,qBACAA,EAAA,MAAM,UAAUA,EAAG,iBAAiB,iBACvC,OAAOA,EAAG;AAAA,EACd;AAER,GAGaM,IAAyB;AAAA,EAClC,MAAM,QAAQN,GAAoBK,GAA2B;AACzD,UAAMN,EAAeC,GAAIK,EAAQ,OAAO,EAAK;AAAA,EACjD;AAAA,EAEA,MAAM,QAAQL,GAAoBK,GAA2B;AACzD,KAAI,CAACL,EAAG,oBAAoBA,EAAG,iBAAiB,WAAWK,EAAQ,UAC/D,MAAMN,EAAeC,GAAIK,EAAQ,OAAO,EAAK;AAAA,EAErD;AAAA,EAEA,UAAUL,GAAoB;AAC1B,IAAIA,EAAG,qBACAA,EAAA,MAAM,UAAUA,EAAG,iBAAiB,iBACvC,OAAOA,EAAG;AAAA,EACd;AAER,GC/GaO,IAAmD,OAAO,aAAa;AAU7E,SAASC,EAAiBrB,GAAkD;AACzE,QAAAS,IAAU,IAAIV,EAAmBC,CAAO;AAE9C,SAAAQ,EAAsBC,CAAO,GACtBA;AACX;AAEO,MAAMa,IAAoB;AAAA,EAC7B,QAAQC,GAAUvB,GAA8B;AACtC,UAAAwB,IAAqBH,EAAiBrB,CAAO;AAC/C,IAAAuB,EAAA,QAAQH,GAAgBI,CAAkB,GAG1CD,EAAA,OAAO,iBAAiB,eAAeC;AAAA,EAAA;AAEnD;AAEO,SAASC,IAA4C;AAClD,QAAAD,IAAqBE,EAAON,CAAc;AAChD,MAAI,CAACI;AACK,UAAA,IAAI,MAAM,mCAAmC;AAEhD,SAAAA;AACX;AC9BO,SAASG,EAAexB,GAA8BH,IAAiC,IAAI;AAC9F,QAAMwB,IAAqBC,EAAsB,GAC3CG,IAAYC,EAAoB,IAAI,GACpCC,IAAYD,EAAI,EAAK,GACrBxB,IAAQwB,EAAkB,IAAI,GAE9BE,IAAcC,EAAS,MAClB,OAAO7B,KAAW,WAAWA,IAASA,EAAO,KACvD,GAEKO,IAAkB,YAAY;AAC5B,QAACqB,EAAY,OAEjB;AAAA,MAAAD,EAAU,QAAQ,IAClBzB,EAAM,QAAQ;AAEV,UAAA;AACA,QAAAuB,EAAU,QAAQ,MAAMJ,EAAmB,IAAIO,EAAY,KAAK;AAAA,eAC3DE,GAAK;AACJ,QAAA5B,EAAA,QAAQ4B,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,GAChEL,EAAU,QAAQ;AAAA,MAAA,UACpB;AACE,QAAAE,EAAU,QAAQ;AAAA,MAAA;AAAA;AAAA,EAE1B;AAQI,MALA9B,EAAQ,cAAc,MACNU,EAAA,GAIhB,OAAOP,KAAW,UAAU;AACtB,UAAA+B,IAAUC,EAAMhC,GAAQ,MAAM;AAChB,MAAAO,EAAA;AAAA,IAAA,CACnB;AAED,IAAA0B,EAAY,MAAM;AACN,MAAAF,EAAA;AAAA,IAAA,CACX;AAAA,EAAA;AAGE,SAAA;AAAA,IACH,WAAAN;AAAA,IACA,WAAAE;AAAA,IACA,OAAAzB;AAAA,IACA,OAAOK;AAAA,IACP,KAAKsB,EAAS,MAAMJ,EAAU,UAAU,EAAI;AAAA,EAChD;AACJ;AC9CA,MAAAS,IAAeC,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,EAEb;AAAA,EACA,MAAMC,GAAO;AACX,UAAM,EAAE,QAAApC,EAAA,IAAWqC,EAAOD,CAAK,GACzBE,IAAmBZ,EAAI,EAAI,GAC3B,EAAE,KAAAa,GAAK,WAAAZ,GAAW,OAAAa,EAAM,IAAIhB,EAAexB,GAAQ,EAAE,WAAW,IAAO;AAE7E,WAAAyC,EAAU,YAAY;AACpB,YAAMD,EAAM,GACZF,EAAiB,QAAQ;AAAA,IAAA,CAC1B,GAEM;AAAA,MACL,KAAAC;AAAA,MACA,WAAAZ;AAAA,MACA,kBAAAW;AAAA,IACF;AAAA,EAAA;AAEJ,CAAC;;;;;;;AArCa,SAAAI,EAAA,OAAG,CAAKA,EAApB,mBAAAC,EAAwCD,EAD1C,QAAA,WAAA,EAAA,KAAA,EAAA,CAAA,IAAA,CAEoCA,eAAS,CAAKA,EAAA,oBAAgB,CAAKA,EAAA,MAArEC,EAA4ED,EAF9E,QAAA,YAAA,EAAA,KAAA,EAAA,CAAA,IAGkCA,EAAa,aAAAA,EAAA,mBAA7CC,EAAiED,EAHnE,QAAA,WAAA,EAAA,KAAA,EAAA,CAAA,IAAAE,EAAA,IAAA,EAAA;;iDCkBMC,IAAS;AAAA,EACX,QAAQzB,GAAUvB,GAAgC;AAE1C,IAAAuB,EAAA,IAAID,GAAmBtB,CAAO,GAG9BuB,EAAA,UAAU,SAAS0B,CAAK,GACxB1B,EAAA,UAAU,OAAON,CAAI,GACrBM,EAAA,UAAU,QAAQJ,CAAK;AAAA,EAAA;AAEnC;"}
@@ -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 j=Object.defineProperty;var q=(n,i,o)=>i in n?j(n,i,{enumerable:!0,configurable:!0,writable:!0,value:o}):n[i]=o;var f=(n,i,o)=>q(n,typeof i!="symbol"?i+"":i,o);class C{constructor(s){f(this,"axios");f(this,"cache",new Map);f(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()}}let m=null;const u=new Map;function h(e){m=e}async function L(e){if(!m)return console.warn("Permissions service not initialized yet."),!1;if(!u.has(e)){const s=m.can(e).catch(r=>(console.error("Error checking permission:",r),u.delete(e),!1));u.set(e,s)}return u.get(e)}async function d(e,s,r){const a=e.style.display;e._permission_data={action:s,originalDisplay:a,permissionChecked:!1},e.style.display="none";try{const t=await L(s);(r&&t||!r&&!t)&&(e.style.display=a||""),e._permission_data.permissionChecked=!0}catch(t){console.error("Error in directive processing:",t),r||(e.style.display=a||"")}}const y={async mounted(e,s){await d(e,s.value,!0)},async updated(e,s){(!e._permission_data||e._permission_data.action!==s.value)&&await d(e,s.value,!0)},unmounted(e){e._permission_data&&(e.style.display=e._permission_data.originalDisplay,delete e._permission_data)}},v={async mounted(e,s){await d(e,s.value,!1)},async updated(e,s){(!e._permission_data||e._permission_data.action!==s.value)&&await d(e,s.value,!1)},unmounted(e){e._permission_data&&(e.style.display=e._permission_data.originalDisplay,delete e._permission_data)}},g=Symbol("Permissions");function _(e){const s=new C(e);return h(s),s}const $={install(e,s){const r=_(s);e.provide(g,r),e.config.globalProperties.$permissions=r}};function P(){const e=i.inject(g);if(!e)throw new Error("Permissions plugin not installed!");return e}function k(e,s={}){const r=P(),a=i.ref(null),t=i.ref(!1),c=i.ref(null),w=i.computed(()=>typeof e=="string"?e:e.value),p=async()=>{if(w.value){t.value=!0,c.value=null;try{a.value=await r.can(w.value)}catch(l){c.value=l instanceof Error?l:new Error(String(l)),a.value=!1}finally{t.value=!1}}};if(s.autoCheck!==!1&&p(),typeof e!="string"){const l=i.watch(e,()=>{p()});i.onUnmounted(()=>{l()})}return{isAllowed:a,isLoading:t,error:c,check:p,can:i.computed(()=>a.value===!0)}}const b=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:t,check:c}=k(s,{autoCheck:!1});return i.onMounted(async()=>{await c(),r.value=!1}),{can:a,isLoading:t,isInitialLoading:r}}}),E=(e,s)=>{const r=e.__vccOpts||e;for(const[a,t]of s)r[a]=t;return r};function M(e,s,r,a,t,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 S=E(b,[["render",M]]),I={install(e,s){e.use($,s),e.component("Check",S),e.directive("can",y),e.directive("cant",v)}};n.Check=S,n.default=I,n.setPermissionsService=h,n.setupPermissions=_,n.usePermissions=k,n.usePermissionsService=P,n.vCan=y,n.vCant=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 j=Object.defineProperty;var q=(n,i,o)=>i in n?j(n,i,{enumerable:!0,configurable:!0,writable:!0,value:o}):n[i]=o;var u=(n,i,o)=>q(n,typeof i!="symbol"?i+"":i,o);class C{constructor(s){u(this,"axios");u(this,"cache",new Map);u(this,"endpoint");u(this,"application");this.axios=o.create({baseURL:(s==null?void 0:s.baseUrl)||""}),this.endpoint=(s==null?void 0:s.endpoint)||"/api/v1/dashboard/access",this.application=s==null?void 0:s.application,this.application&&(this.axios.defaults.headers.common.Application=this.application)}async can(s){if(this.cache.has(s))return this.cache.get(s);try{const r=(await this.axios.get(this.endpoint,{params:{action:s}})).data.allowed||!1;return this.cache.set(s,r),r}catch(a){return console.error(`Error checking permission for ${s}:`,a),!1}}clearCache(s){s?this.cache.delete(s):this.cache.clear()}}let m=null;const d=new Map;function h(e){m=e}async function L(e){if(!m)return console.warn("Permissions service not initialized yet."),!1;if(!d.has(e)){const s=m.can(e).catch(a=>(console.error("Error checking permission:",a),d.delete(e),!1));d.set(e,s)}return d.get(e)}async function f(e,s,a){const r=e.style.display;e._permission_data={action:s,originalDisplay:r,permissionChecked:!1},e.style.display="none";try{const t=await L(s);(a&&t||!a&&!t)&&(e.style.display=r||""),e._permission_data.permissionChecked=!0}catch(t){console.error("Error in directive processing:",t),a||(e.style.display=r||"")}}const y={async mounted(e,s){await f(e,s.value,!0)},async updated(e,s){(!e._permission_data||e._permission_data.action!==s.value)&&await f(e,s.value,!0)},unmounted(e){e._permission_data&&(e.style.display=e._permission_data.originalDisplay,delete e._permission_data)}},v={async mounted(e,s){await f(e,s.value,!1)},async updated(e,s){(!e._permission_data||e._permission_data.action!==s.value)&&await f(e,s.value,!1)},unmounted(e){e._permission_data&&(e.style.display=e._permission_data.originalDisplay,delete e._permission_data)}},g=Symbol("Permissions");function _(e){const s=new C(e);return h(s),s}const $={install(e,s){const a=_(s);e.provide(g,a),e.config.globalProperties.$permissions=a}};function P(){const e=i.inject(g);if(!e)throw new Error("Permissions plugin not installed!");return e}function k(e,s={}){const a=P(),r=i.ref(null),t=i.ref(!1),c=i.ref(null),w=i.computed(()=>typeof e=="string"?e:e.value),p=async()=>{if(w.value){t.value=!0,c.value=null;try{r.value=await a.can(w.value)}catch(l){c.value=l instanceof Error?l:new Error(String(l)),r.value=!1}finally{t.value=!1}}};if(s.autoCheck!==!1&&p(),typeof e!="string"){const l=i.watch(e,()=>{p()});i.onUnmounted(()=>{l()})}return{isAllowed:r,isLoading:t,error:c,check:p,can:i.computed(()=>r.value===!0)}}const b=i.defineComponent({name:"Check",props:{action:{type:String,required:!0},fallback:{type:Boolean,default:!1}},setup(e){const{action:s}=i.toRefs(e),a=i.ref(!0),{can:r,isLoading:t,check:c}=k(s,{autoCheck:!1});return i.onMounted(async()=>{await c(),a.value=!1}),{can:r,isLoading:t,isInitialLoading:a}}}),E=(e,s)=>{const a=e.__vccOpts||e;for(const[r,t]of s)a[r]=t;return a};function M(e,s,a,r,t,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 S=E(b,[["render",M]]),I={install(e,s){e.use($,s),e.component("Check",S),e.directive("can",y),e.directive("cant",v)}};n.Check=S,n.default=I,n.setPermissionsService=h,n.setupPermissions=_,n.usePermissions=k,n.usePermissionsService=P,n.vCan=y,n.vCant=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/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// Кэш результатов проверки прав для избежания дублирования запросов\nconst permissionsCache: Map<string, Promise<boolean>> = new Map();\n\n// Функция для установки экземпляра сервиса (будет вызываться при инициализации плагина)\nexport function setPermissionsService(service: PermissionsService): void {\n globalPermissionsService = service;\n}\n\n// Общая функция проверки прав для обеих директив\nasync function checkPermission(action: string): Promise<boolean> {\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet.');\n return false;\n }\n\n // Проверяем есть ли запрос с таким же action уже в процессе выполнения\n if (!permissionsCache.has(action)) {\n // Создаем Promise для проверки прав и сохраняем в кэш\n const permissionPromise = globalPermissionsService.can(action)\n .catch(error => {\n console.error('Error checking permission:', error);\n permissionsCache.delete(action);\n return false;\n });\n\n permissionsCache.set(action, permissionPromise);\n }\n\n // Возвращаем результат из кэша (либо готовый, либо ожидающий Promise)\n return permissionsCache.get(action) as Promise<boolean>;\n}\n\n// Общая логика для обработки элементов, применяемая обеими директивами\nasync function processElement(el: CanHTMLElement, action: string, showWhenAllowed: boolean) {\n const originalDisplay = el.style.display;\n\n // Store action and original display for updates\n el._permission_data = {\n action,\n originalDisplay,\n permissionChecked: false\n };\n\n // Скрываем элемент изначально до проверки прав\n el.style.display = 'none';\n\n try {\n const hasPermission = await checkPermission(action);\n\n // Показываем элемент в зависимости от режима и результата проверки\n if ((showWhenAllowed && hasPermission) || (!showWhenAllowed && !hasPermission)) {\n el.style.display = originalDisplay || '';\n }\n\n el._permission_data.permissionChecked = true;\n } catch (error) {\n console.error('Error in directive processing:', error);\n // При ошибке для v-cant показываем элемент\n if (!showWhenAllowed) {\n el.style.display = originalDisplay || '';\n }\n }\n}\n\nexport const vCan: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n await processElement(el, binding.value, true);\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n await processElement(el, binding.value, true);\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}\n\n// Директива vCant - противоположность vCan, показывает элемент только если прав НЕТ\nexport const vCant: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n await processElement(el, binding.value, false);\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n await processElement(el, binding.value, false);\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, vCant, setPermissionsService } from './directives/vCan'\n\n// Именованные экспорты\nexport {\n Check,\n usePermissions,\n setupPermissions,\n vCan,\n vCant,\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 app.directive('cant', vCant)\n }\n}\n\n// Экспортируем плагин как по умолчанию\nexport default plugin "],"names":["PermissionsService","options","__publicField","axios","action","allowed","error","globalPermissionsService","permissionsCache","setPermissionsService","service","checkPermission","permissionPromise","processElement","el","showWhenAllowed","originalDisplay","hasPermission","vCan","binding","vCant","PermissionsKey","setupPermissions","PermissionsPlugin","app","permissionsService","usePermissionsService","inject","usePermissions","isAllowed","ref","isLoading","actionValue","computed","err","unwatch","watch","onUnmounted","_sfc_main","defineComponent","props","toRefs","isInitialLoading","can","check","onMounted","_ctx","_renderSlot","_createCommentVNode","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 application?: string\n}\n\nexport class PermissionsService {\n private axios: AxiosInstance\n private cache: Map<string, boolean> = new Map()\n private endpoint: string\n private application?: 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 this.application = options?.application\n\n // Если указано application, добавляем его в заголовки по умолчанию\n if (this.application) {\n this.axios.defaults.headers.common['Application'] = this.application\n }\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// Кэш результатов проверки прав для избежания дублирования запросов\nconst permissionsCache: Map<string, Promise<boolean>> = new Map();\n\n// Функция для установки экземпляра сервиса (будет вызываться при инициализации плагина)\nexport function setPermissionsService(service: PermissionsService): void {\n globalPermissionsService = service;\n}\n\n// Общая функция проверки прав для обеих директив\nasync function checkPermission(action: string): Promise<boolean> {\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet.');\n return false;\n }\n\n // Проверяем есть ли запрос с таким же action уже в процессе выполнения\n if (!permissionsCache.has(action)) {\n // Создаем Promise для проверки прав и сохраняем в кэш\n const permissionPromise = globalPermissionsService.can(action)\n .catch(error => {\n console.error('Error checking permission:', error);\n permissionsCache.delete(action);\n return false;\n });\n\n permissionsCache.set(action, permissionPromise);\n }\n\n // Возвращаем результат из кэша (либо готовый, либо ожидающий Promise)\n return permissionsCache.get(action) as Promise<boolean>;\n}\n\n// Общая логика для обработки элементов, применяемая обеими директивами\nasync function processElement(el: CanHTMLElement, action: string, showWhenAllowed: boolean) {\n const originalDisplay = el.style.display;\n\n // Store action and original display for updates\n el._permission_data = {\n action,\n originalDisplay,\n permissionChecked: false\n };\n\n // Скрываем элемент изначально до проверки прав\n el.style.display = 'none';\n\n try {\n const hasPermission = await checkPermission(action);\n\n // Показываем элемент в зависимости от режима и результата проверки\n if ((showWhenAllowed && hasPermission) || (!showWhenAllowed && !hasPermission)) {\n el.style.display = originalDisplay || '';\n }\n\n el._permission_data.permissionChecked = true;\n } catch (error) {\n console.error('Error in directive processing:', error);\n // При ошибке для v-cant показываем элемент\n if (!showWhenAllowed) {\n el.style.display = originalDisplay || '';\n }\n }\n}\n\nexport const vCan: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n await processElement(el, binding.value, true);\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n await processElement(el, binding.value, true);\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}\n\n// Директива vCant - противоположность vCan, показывает элемент только если прав НЕТ\nexport const vCant: ObjectDirective = {\n async mounted(el: CanHTMLElement, binding: DirectiveBinding) {\n await processElement(el, binding.value, false);\n },\n\n async updated(el: CanHTMLElement, binding: DirectiveBinding) {\n if (!el._permission_data || el._permission_data.action !== binding.value) {\n await processElement(el, binding.value, false);\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\n/**\n * Setup permissions service with provided options\n * @param options Configuration options\n * @param options.baseUrl Base URL for API requests\n * @param options.endpoint Custom endpoint for permission checks\n * @param options.application Application identifier to be sent as a header\n * @returns Configured PermissionsService instance\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, vCant, setPermissionsService } from './directives/vCan'\n\n// Именованные экспорты\nexport {\n Check,\n usePermissions,\n setupPermissions,\n vCan,\n vCant,\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 app.directive('cant', vCant)\n }\n}\n\n// Экспортируем плагин как по умолчанию\nexport default plugin "],"names":["PermissionsService","options","__publicField","axios","action","allowed","error","globalPermissionsService","permissionsCache","setPermissionsService","service","checkPermission","permissionPromise","processElement","el","showWhenAllowed","originalDisplay","hasPermission","vCan","binding","vCant","PermissionsKey","setupPermissions","PermissionsPlugin","app","permissionsService","usePermissionsService","inject","usePermissions","isAllowed","ref","isLoading","actionValue","computed","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.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "Permissions library for Vue 3 applications",
5
5
  "type": "module",
6
6
  "main": "./dist/locator-ars-lib.umd.js",