locator-ars-lib 1.1.10 → 1.1.11

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,32 +1,34 @@
1
1
  var v = Object.defineProperty;
2
- var _ = (e, s, a) => s in e ? v(e, s, { enumerable: !0, configurable: !0, writable: !0, value: a }) : e[s] = a;
3
- var c = (e, s, a) => _(e, typeof s != "symbol" ? s + "" : s, a);
4
- import { inject as g, ref as u, computed as p, watch as k, onUnmounted as P, defineComponent as w, toRefs as C, onMounted as S, renderSlot as y, createCommentVNode as A } from "vue";
2
+ var _ = (e, s, r) => s in e ? v(e, s, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[s] = r;
3
+ var c = (e, s, r) => _(e, typeof s != "symbol" ? s + "" : s, r);
4
+ import { inject as g, ref as u, computed as p, watch as w, onUnmounted as k, defineComponent as P, toRefs as C, onMounted as S, renderSlot as y, createCommentVNode as A } from "vue";
5
5
  import L from "axios";
6
6
  class N {
7
7
  constructor(s) {
8
8
  c(this, "axios");
9
9
  c(this, "cache", /* @__PURE__ */ new Map());
10
10
  c(this, "endpoint");
11
- c(this, "application");
12
- const a = (s == null ? void 0 : s.withCredentials) !== !1;
11
+ c(this, "isLocalDev");
12
+ const r = (s == null ? void 0 : s.withCredentials) !== !1;
13
13
  this.axios = L.create({
14
14
  baseURL: (s == null ? void 0 : s.baseUrl) || "",
15
- withCredentials: a
15
+ withCredentials: r
16
16
  // Important for cross-domain requests with authentication
17
- }), 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);
17
+ }), this.endpoint = (s == null ? void 0 : s.endpoint) || "/api/v1/dashboard/access", this.isLocalDev = typeof window < "u" && window.location && (window.location.hostname === "test.locator.local" || window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1");
18
18
  }
19
19
  async can(s) {
20
- const a = Array.isArray(s) ? JSON.stringify(s) : s;
21
- if (this.cache.has(a))
22
- return this.cache.get(a);
20
+ if (this.isLocalDev)
21
+ return !0;
22
+ const r = Array.isArray(s) ? JSON.stringify(s) : s;
23
+ if (this.cache.has(r))
24
+ return this.cache.get(r);
23
25
  try {
24
- let r = { action: s };
25
- Array.isArray(s) && (r = { action: JSON.stringify(s) });
26
- const n = (await this.axios.get(this.endpoint, { params: r })).data.allowed || !1;
27
- return this.cache.set(a, n), n;
28
- } catch (r) {
29
- return console.error(`Error checking permission for ${Array.isArray(s) ? JSON.stringify(s) : s}:`, r), !1;
26
+ let i = { action: s };
27
+ Array.isArray(s) && (i = { action: JSON.stringify(s) });
28
+ const n = (await this.axios.get(this.endpoint, { params: i })).data.allowed || !1;
29
+ return this.cache.set(r, n), n;
30
+ } catch (i) {
31
+ return console.error(`Error checking permission for ${Array.isArray(s) ? JSON.stringify(s) : s}:`, i), !1;
30
32
  }
31
33
  }
32
34
  clearCache(s) {
@@ -42,7 +44,7 @@ async function $(e) {
42
44
  if (!l)
43
45
  return console.warn("Permissions service not initialized yet."), !1;
44
46
  if (!t.has(e)) {
45
- const s = l.can(e).catch((a) => (console.error("Error checking permission:", a), t.delete(e), !1));
47
+ const s = l.can(e).catch((r) => (console.error("Error checking permission:", r), t.delete(e), !1));
46
48
  t.set(e, s);
47
49
  }
48
50
  return t.get(e);
@@ -56,23 +58,23 @@ async function E(e) {
56
58
  return !1;
57
59
  const s = JSON.stringify(e);
58
60
  if (!t.has(s)) {
59
- const a = l.can(e).catch((r) => (console.error("Error checking permissions:", r), t.delete(s), !1));
60
- t.set(s, a);
61
+ const r = l.can(e).catch((i) => (console.error("Error checking permissions:", i), t.delete(s), !1));
62
+ t.set(s, r);
61
63
  }
62
64
  return t.get(s);
63
65
  }
64
- async function f(e, s, a) {
65
- const r = e.style.display;
66
+ async function f(e, s, r) {
67
+ const i = e.style.display;
66
68
  e._permission_data = {
67
69
  action: s,
68
- originalDisplay: r,
70
+ originalDisplay: i,
69
71
  permissionChecked: !1
70
72
  }, e.style.display = "none";
71
73
  try {
72
- const i = await E(s);
73
- (a && i || !a && !i) && (e.style.display = r || ""), e._permission_data.permissionChecked = !0;
74
- } catch (i) {
75
- console.error("Error in directive processing:", i), a || (e.style.display = r || "");
74
+ const a = await E(s);
75
+ (r && a || !r && !a) && (e.style.display = i || ""), e._permission_data.permissionChecked = !0;
76
+ } catch (a) {
77
+ console.error("Error in directive processing:", a), r || (e.style.display = i || "");
76
78
  }
77
79
  }
78
80
  const J = {
@@ -85,7 +87,7 @@ const J = {
85
87
  unmounted(e) {
86
88
  e._permission_data && (e.style.display = e._permission_data.originalDisplay, delete e._permission_data);
87
89
  }
88
- }, I = {
90
+ }, D = {
89
91
  async mounted(e, s) {
90
92
  await f(e, s.value, !1);
91
93
  },
@@ -96,14 +98,14 @@ const J = {
96
98
  e._permission_data && (e.style.display = e._permission_data.originalDisplay, delete e._permission_data);
97
99
  }
98
100
  }, h = Symbol("Permissions");
99
- function j(e) {
101
+ function I(e) {
100
102
  const s = new N(e);
101
103
  return O(s), s;
102
104
  }
103
- const D = {
105
+ const j = {
104
106
  install(e, s) {
105
- const a = j(s);
106
- e.provide(h, a), e.config.globalProperties.$permissions = a;
107
+ const r = I(s);
108
+ e.provide(h, r), e.config.globalProperties.$permissions = r;
107
109
  }
108
110
  };
109
111
  function K() {
@@ -113,35 +115,35 @@ function K() {
113
115
  return e;
114
116
  }
115
117
  function M(e, s = {}) {
116
- const a = K(), r = u(null), i = u(!1), n = u(null), m = p(() => typeof e == "object" && "value" in e ? e.value : e), d = async () => {
118
+ const r = K(), i = u(null), a = u(!1), n = u(null), m = p(() => typeof e == "object" && "value" in e ? e.value : e), d = async () => {
117
119
  if (m.value) {
118
- i.value = !0, n.value = null;
120
+ a.value = !0, n.value = null;
119
121
  try {
120
- r.value = await a.can(m.value);
122
+ i.value = await r.can(m.value);
121
123
  } catch (o) {
122
- n.value = o instanceof Error ? o : new Error(String(o)), r.value = !1;
124
+ n.value = o instanceof Error ? o : new Error(String(o)), i.value = !1;
123
125
  } finally {
124
- i.value = !1;
126
+ a.value = !1;
125
127
  }
126
128
  }
127
129
  };
128
130
  if (s.autoCheck !== !1 && d(), typeof e == "object" && "value" in e) {
129
- const o = k(e, () => {
131
+ const o = w(e, () => {
130
132
  d();
131
133
  });
132
- P(() => {
134
+ k(() => {
133
135
  o();
134
136
  });
135
137
  }
136
138
  return {
137
- isAllowed: r,
138
- isLoading: i,
139
+ isAllowed: i,
140
+ isLoading: a,
139
141
  error: n,
140
142
  check: d,
141
- can: p(() => r.value === !0)
143
+ can: p(() => i.value === !0)
142
144
  };
143
145
  }
144
- const U = w({
146
+ const U = P({
145
147
  name: "Check",
146
148
  props: {
147
149
  action: {
@@ -154,37 +156,37 @@ const U = w({
154
156
  }
155
157
  },
156
158
  setup(e) {
157
- const { action: s } = C(e), a = u(!0), { can: r, isLoading: i, check: n } = M(s, { autoCheck: !1 });
159
+ const { action: s } = C(e), r = u(!0), { can: i, isLoading: a, check: n } = M(s, { autoCheck: !1 });
158
160
  return S(async () => {
159
- await n(), a.value = !1;
161
+ await n(), r.value = !1;
160
162
  }), {
161
- can: r,
162
- isLoading: i,
163
- isInitialLoading: a
163
+ can: i,
164
+ isLoading: a,
165
+ isInitialLoading: r
164
166
  };
165
167
  }
166
168
  }), z = (e, s) => {
167
- const a = e.__vccOpts || e;
168
- for (const [r, i] of s)
169
- a[r] = i;
170
- return a;
169
+ const r = e.__vccOpts || e;
170
+ for (const [i, a] of s)
171
+ r[i] = a;
172
+ return r;
171
173
  };
172
- function R(e, s, a, r, i, n) {
174
+ function R(e, s, r, i, a, n) {
173
175
  return e.can && !e.isInitialLoading ? y(e.$slots, "default", { key: 0 }) : !e.isLoading && !e.isInitialLoading && !e.can ? y(e.$slots, "fallback", { key: 1 }) : e.isLoading || e.isInitialLoading ? y(e.$slots, "loading", { key: 2 }) : A("", !0);
174
176
  }
175
177
  const V = /* @__PURE__ */ z(U, [["render", R]]), F = {
176
178
  install(e, s) {
177
- e.use(D, s), e.component("Check", V), e.directive("can", J), e.directive("cant", I);
179
+ e.use(j, s), e.component("Check", V), e.directive("can", J), e.directive("cant", D);
178
180
  }
179
181
  };
180
182
  export {
181
183
  V as Check,
182
184
  F as default,
183
185
  O as setPermissionsService,
184
- j as setupPermissions,
186
+ I as setupPermissions,
185
187
  M as usePermissions,
186
188
  K as usePermissionsService,
187
189
  J as vCan,
188
- I as vCant
190
+ D as vCant
189
191
  };
190
192
  //# sourceMappingURL=locator-ars-lib.es.js.map
@@ -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 application?: string\n /**\n * Whether to send cookies with cross-origin requests\n * @default true\n */\n withCredentials?: boolean\n}\n\nexport class PermissionsService {\n private axios: AxiosInstance\n private cache: Map<string, boolean | string> = new Map()\n private endpoint: string\n private application?: string\n\n constructor(options?: PermissionsOptions) {\n // Ensure withCredentials is always true unless explicitly set to false\n const withCredentials = options?.withCredentials !== false;\n\n this.axios = axios.create({\n baseURL: options?.baseUrl || '',\n withCredentials // Important for cross-domain requests with authentication\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 | string[]): Promise<boolean> {\n // Преобразуем массив в строку вида ['value1','value2','value3']\n const actionKey = Array.isArray(action) ? JSON.stringify(action) : action;\n\n // Check if we have a cached result\n if (this.cache.has(actionKey)) {\n return this.cache.get(actionKey) as boolean;\n }\n\n try {\n let params: { action: string | string[] } = { action };\n\n // Если это массив, преобразуем его в строку вида ['value1','value2','value3']\n if (Array.isArray(action)) {\n params = { action: JSON.stringify(action) };\n }\n\n const response = await this.axios.get(this.endpoint, { params });\n const allowed = response.data.allowed || false;\n\n // Cache the result\n this.cache.set(actionKey, allowed);\n\n return allowed;\n } catch (error) {\n console.error(`Error checking permission for ${Array.isArray(action) ? JSON.stringify(action) : 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 | 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 checkPermissions(actions: string | string[]): Promise<boolean> {\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet.');\n return false;\n }\n\n if (typeof actions === 'string') {\n return checkPermission(actions);\n }\n\n // Если передан пустой массив, считаем что прав нет\n if (actions.length === 0) {\n return false;\n }\n\n // Используем кэш для массива, чтобы избежать повторных запросов\n const cacheKey = JSON.stringify(actions);\n if (!permissionsCache.has(cacheKey)) {\n // Отправляем один запрос с массивом разрешений\n const permissionPromise = globalPermissionsService.can(actions)\n .catch(error => {\n console.error('Error checking permissions:', error);\n permissionsCache.delete(cacheKey);\n return false;\n });\n\n permissionsCache.set(cacheKey, permissionPromise);\n }\n\n return permissionsCache.get(cacheKey) as Promise<boolean>;\n}\n\n// Общая логика для обработки элементов, применяемая обеими директивами\nasync function processElement(el: CanHTMLElement, action: string | 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 checkPermissions(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 // Проверяем изменение значения, учитывая возможность массива\n const actionChanged = !el._permission_data ||\n (typeof el._permission_data.action !== typeof binding.value) ||\n (typeof binding.value === 'string' && el._permission_data.action !== binding.value) ||\n (Array.isArray(binding.value) &&\n (!Array.isArray(el._permission_data.action) ||\n JSON.stringify(el._permission_data.action) !== JSON.stringify(binding.value)));\n\n if (actionChanged) {\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 // Проверяем изменение значения, учитывая возможность массива\n const actionChanged = !el._permission_data ||\n (typeof el._permission_data.action !== typeof binding.value) ||\n (typeof binding.value === 'string' && el._permission_data.action !== binding.value) ||\n (Array.isArray(binding.value) &&\n (!Array.isArray(el._permission_data.action) ||\n JSON.stringify(el._permission_data.action) !== JSON.stringify(binding.value)));\n\n if (actionChanged) {\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\ntype ActionType = string | string[] | Ref<string | string[]>\n\nexport function usePermissions(action: ActionType, 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 === 'object' && 'value' in action ? action.value : action\n })\n\n const checkPermission = async () => {\n if (!actionValue.value) return\n\n isLoading.value = true\n error.value = null\n\n try {\n // Передаем разрешения напрямую в метод can, который теперь поддерживает массивы\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 === 'object' && 'value' in action) {\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, Array] as PropType<string | 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","withCredentials","axios","action","actionKey","params","allowed","error","globalPermissionsService","permissionsCache","setPermissionsService","service","checkPermission","permissionPromise","checkPermissions","actions","cacheKey","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 /**\n * Whether to send cookies with cross-origin requests\n * @default true\n */\n withCredentials?: boolean\n}\n\nexport class PermissionsService {\n private axios: AxiosInstance\n private cache: Map<string, boolean | string> = new Map()\n private endpoint: string\n private isLocalDev: boolean\n\n constructor(options?: PermissionsOptions) {\n // Ensure withCredentials is always true unless explicitly set to false\n const withCredentials = options?.withCredentials !== false;\n\n this.axios = axios.create({\n baseURL: options?.baseUrl || '',\n withCredentials // Important for cross-domain requests with authentication\n })\n this.endpoint = options?.endpoint || '/api/v1/dashboard/access'\n \n // Detect local development mode (Vite dev server)\n this.isLocalDev = typeof window !== 'undefined' && \n window.location && \n (window.location.hostname === 'test.locator.local' ||\n window.location.hostname === 'localhost' || \n window.location.hostname === '127.0.0.1');\n }\n\n async can(action: string | string[]): Promise<boolean> {\n // В режиме локальной разработки всегда возвращаем true\n if (this.isLocalDev) {\n return true;\n }\n\n // Преобразуем массив в строку вида ['value1','value2','value3']\n const actionKey = Array.isArray(action) ? JSON.stringify(action) : action;\n\n // Check if we have a cached result\n if (this.cache.has(actionKey)) {\n return this.cache.get(actionKey) as boolean;\n }\n\n try {\n let params: { action: string | string[] } = { action };\n\n // Если это массив, преобразуем его в строку вида ['value1','value2','value3']\n if (Array.isArray(action)) {\n params = { action: JSON.stringify(action) };\n }\n\n const response = await this.axios.get(this.endpoint, { params });\n const allowed = response.data.allowed || false;\n\n // Cache the result\n this.cache.set(actionKey, allowed);\n\n return allowed;\n } catch (error) {\n console.error(`Error checking permission for ${Array.isArray(action) ? JSON.stringify(action) : 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 | 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 checkPermissions(actions: string | string[]): Promise<boolean> {\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet.');\n return false;\n }\n\n if (typeof actions === 'string') {\n return checkPermission(actions);\n }\n\n // Если передан пустой массив, считаем что прав нет\n if (actions.length === 0) {\n return false;\n }\n\n // Используем кэш для массива, чтобы избежать повторных запросов\n const cacheKey = JSON.stringify(actions);\n if (!permissionsCache.has(cacheKey)) {\n // Отправляем один запрос с массивом разрешений\n const permissionPromise = globalPermissionsService.can(actions)\n .catch(error => {\n console.error('Error checking permissions:', error);\n permissionsCache.delete(cacheKey);\n return false;\n });\n\n permissionsCache.set(cacheKey, permissionPromise);\n }\n\n return permissionsCache.get(cacheKey) as Promise<boolean>;\n}\n\n// Общая логика для обработки элементов, применяемая обеими директивами\nasync function processElement(el: CanHTMLElement, action: string | 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 checkPermissions(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 // Проверяем изменение значения, учитывая возможность массива\n const actionChanged = !el._permission_data ||\n (typeof el._permission_data.action !== typeof binding.value) ||\n (typeof binding.value === 'string' && el._permission_data.action !== binding.value) ||\n (Array.isArray(binding.value) &&\n (!Array.isArray(el._permission_data.action) ||\n JSON.stringify(el._permission_data.action) !== JSON.stringify(binding.value)));\n\n if (actionChanged) {\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 // Проверяем изменение значения, учитывая возможность массива\n const actionChanged = !el._permission_data ||\n (typeof el._permission_data.action !== typeof binding.value) ||\n (typeof binding.value === 'string' && el._permission_data.action !== binding.value) ||\n (Array.isArray(binding.value) &&\n (!Array.isArray(el._permission_data.action) ||\n JSON.stringify(el._permission_data.action) !== JSON.stringify(binding.value)));\n\n if (actionChanged) {\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\ntype ActionType = string | string[] | Ref<string | string[]>\n\nexport function usePermissions(action: ActionType, 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 === 'object' && 'value' in action ? action.value : action\n })\n\n const checkPermission = async () => {\n if (!actionValue.value) return\n\n isLoading.value = true\n error.value = null\n\n try {\n // Передаем разрешения напрямую в метод can, который теперь поддерживает массивы\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 === 'object' && 'value' in action) {\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, Array] as PropType<string | 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","withCredentials","axios","action","actionKey","params","allowed","error","globalPermissionsService","permissionsCache","setPermissionsService","service","checkPermission","permissionPromise","checkPermissions","actions","cacheKey","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,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,l){"use strict";var j=Object.defineProperty;var M=(a,i,l)=>i in a?j(a,i,{enumerable:!0,configurable:!0,writable:!0,value:l}):a[i]=l;var d=(a,i,l)=>M(a,typeof i!="symbol"?i+"":i,l);class w{constructor(s){d(this,"axios");d(this,"cache",new Map);d(this,"endpoint");d(this,"application");const r=(s==null?void 0:s.withCredentials)!==!1;this.axios=l.create({baseURL:(s==null?void 0:s.baseUrl)||"",withCredentials:r}),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){const r=Array.isArray(s)?JSON.stringify(s):s;if(this.cache.has(r))return this.cache.get(r);try{let n={action:s};Array.isArray(s)&&(n={action:JSON.stringify(s)});const o=(await this.axios.get(this.endpoint,{params:n})).data.allowed||!1;return this.cache.set(r,o),o}catch(n){return console.error(`Error checking permission for ${Array.isArray(s)?JSON.stringify(s):s}:`,n),!1}}clearCache(s){s?this.cache.delete(s):this.cache.clear()}}let u=null;const c=new Map;function p(e){u=e}async function A(e){if(!u)return console.warn("Permissions service not initialized yet."),!1;if(!c.has(e)){const s=u.can(e).catch(r=>(console.error("Error checking permission:",r),c.delete(e),!1));c.set(e,s)}return c.get(e)}async function L(e){if(!u)return console.warn("Permissions service not initialized yet."),!1;if(typeof e=="string")return A(e);if(e.length===0)return!1;const s=JSON.stringify(e);if(!c.has(s)){const r=u.can(e).catch(n=>(console.error("Error checking permissions:",n),c.delete(s),!1));c.set(s,r)}return c.get(s)}async function y(e,s,r){const n=e.style.display;e._permission_data={action:s,originalDisplay:n,permissionChecked:!1},e.style.display="none";try{const t=await L(s);(r&&t||!r&&!t)&&(e.style.display=n||""),e._permission_data.permissionChecked=!0}catch(t){console.error("Error in directive processing:",t),r||(e.style.display=n||"")}}const h={async mounted(e,s){await y(e,s.value,!0)},async updated(e,s){(!e._permission_data||typeof e._permission_data.action!=typeof s.value||typeof s.value=="string"&&e._permission_data.action!==s.value||Array.isArray(s.value)&&(!Array.isArray(e._permission_data.action)||JSON.stringify(e._permission_data.action)!==JSON.stringify(s.value)))&&await y(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 y(e,s.value,!1)},async updated(e,s){(!e._permission_data||typeof e._permission_data.action!=typeof s.value||typeof s.value=="string"&&e._permission_data.action!==s.value||Array.isArray(s.value)&&(!Array.isArray(e._permission_data.action)||JSON.stringify(e._permission_data.action)!==JSON.stringify(s.value)))&&await y(e,s.value,!1)},unmounted(e){e._permission_data&&(e.style.display=e._permission_data.originalDisplay,delete e._permission_data)}},_=Symbol("Permissions");function g(e){const s=new w(e);return p(s),s}const O={install(e,s){const r=g(s);e.provide(_,r),e.config.globalProperties.$permissions=r}};function P(){const e=i.inject(_);if(!e)throw new Error("Permissions plugin not installed!");return e}function S(e,s={}){const r=P(),n=i.ref(null),t=i.ref(!1),o=i.ref(null),C=i.computed(()=>typeof e=="object"&&"value"in e?e.value:e),m=async()=>{if(C.value){t.value=!0,o.value=null;try{n.value=await r.can(C.value)}catch(f){o.value=f instanceof Error?f:new Error(String(f)),n.value=!1}finally{t.value=!1}}};if(s.autoCheck!==!1&&m(),typeof e=="object"&&"value"in e){const f=i.watch(e,()=>{m()});i.onUnmounted(()=>{f()})}return{isAllowed:n,isLoading:t,error:o,check:m,can:i.computed(()=>n.value===!0)}}const N=i.defineComponent({name:"Check",props:{action:{type:[String,Array],required:!0},fallback:{type:Boolean,default:!1}},setup(e){const{action:s}=i.toRefs(e),r=i.ref(!0),{can:n,isLoading:t,check:o}=S(s,{autoCheck:!1});return i.onMounted(async()=>{await o(),r.value=!1}),{can:n,isLoading:t,isInitialLoading:r}}}),$=(e,s)=>{const r=e.__vccOpts||e;for(const[n,t]of s)r[n]=t;return r};function E(e,s,r,n,t,o){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 k=$(N,[["render",E]]),J={install(e,s){e.use(O,s),e.component("Check",k),e.directive("can",h),e.directive("cant",v)}};a.Check=k,a.default=J,a.setPermissionsService=p,a.setupPermissions=g,a.usePermissions=S,a.usePermissionsService=P,a.vCan=h,a.vCant=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,l){"use strict";var D=Object.defineProperty;var j=(n,i,l)=>i in n?D(n,i,{enumerable:!0,configurable:!0,writable:!0,value:l}):n[i]=l;var d=(n,i,l)=>j(n,typeof i!="symbol"?i+"":i,l);class C{constructor(s){d(this,"axios");d(this,"cache",new Map);d(this,"endpoint");d(this,"isLocalDev");const r=(s==null?void 0:s.withCredentials)!==!1;this.axios=l.create({baseURL:(s==null?void 0:s.baseUrl)||"",withCredentials:r}),this.endpoint=(s==null?void 0:s.endpoint)||"/api/v1/dashboard/access",this.isLocalDev=typeof window<"u"&&window.location&&(window.location.hostname==="test.locator.local"||window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1")}async can(s){if(this.isLocalDev)return!0;const r=Array.isArray(s)?JSON.stringify(s):s;if(this.cache.has(r))return this.cache.get(r);try{let a={action:s};Array.isArray(s)&&(a={action:JSON.stringify(s)});const o=(await this.axios.get(this.endpoint,{params:a})).data.allowed||!1;return this.cache.set(r,o),o}catch(a){return console.error(`Error checking permission for ${Array.isArray(s)?JSON.stringify(s):s}:`,a),!1}}clearCache(s){s?this.cache.delete(s):this.cache.clear()}}let u=null;const c=new Map;function p(e){u=e}async function A(e){if(!u)return console.warn("Permissions service not initialized yet."),!1;if(!c.has(e)){const s=u.can(e).catch(r=>(console.error("Error checking permission:",r),c.delete(e),!1));c.set(e,s)}return c.get(e)}async function L(e){if(!u)return console.warn("Permissions service not initialized yet."),!1;if(typeof e=="string")return A(e);if(e.length===0)return!1;const s=JSON.stringify(e);if(!c.has(s)){const r=u.can(e).catch(a=>(console.error("Error checking permissions:",a),c.delete(s),!1));c.set(s,r)}return c.get(s)}async function y(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 h={async mounted(e,s){await y(e,s.value,!0)},async updated(e,s){(!e._permission_data||typeof e._permission_data.action!=typeof s.value||typeof s.value=="string"&&e._permission_data.action!==s.value||Array.isArray(s.value)&&(!Array.isArray(e._permission_data.action)||JSON.stringify(e._permission_data.action)!==JSON.stringify(s.value)))&&await y(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 y(e,s.value,!1)},async updated(e,s){(!e._permission_data||typeof e._permission_data.action!=typeof s.value||typeof s.value=="string"&&e._permission_data.action!==s.value||Array.isArray(s.value)&&(!Array.isArray(e._permission_data.action)||JSON.stringify(e._permission_data.action)!==JSON.stringify(s.value)))&&await y(e,s.value,!1)},unmounted(e){e._permission_data&&(e.style.display=e._permission_data.originalDisplay,delete e._permission_data)}},_=Symbol("Permissions");function g(e){const s=new C(e);return p(s),s}const O={install(e,s){const r=g(s);e.provide(_,r),e.config.globalProperties.$permissions=r}};function w(){const e=i.inject(_);if(!e)throw new Error("Permissions plugin not installed!");return e}function P(e,s={}){const r=w(),a=i.ref(null),t=i.ref(!1),o=i.ref(null),k=i.computed(()=>typeof e=="object"&&"value"in e?e.value:e),m=async()=>{if(k.value){t.value=!0,o.value=null;try{a.value=await r.can(k.value)}catch(f){o.value=f instanceof Error?f:new Error(String(f)),a.value=!1}finally{t.value=!1}}};if(s.autoCheck!==!1&&m(),typeof e=="object"&&"value"in e){const f=i.watch(e,()=>{m()});i.onUnmounted(()=>{f()})}return{isAllowed:a,isLoading:t,error:o,check:m,can:i.computed(()=>a.value===!0)}}const N=i.defineComponent({name:"Check",props:{action:{type:[String,Array],required:!0},fallback:{type:Boolean,default:!1}},setup(e){const{action:s}=i.toRefs(e),r=i.ref(!0),{can:a,isLoading:t,check:o}=P(s,{autoCheck:!1});return i.onMounted(async()=>{await o(),r.value=!1}),{can:a,isLoading:t,isInitialLoading:r}}}),$=(e,s)=>{const r=e.__vccOpts||e;for(const[a,t]of s)r[a]=t;return r};function E(e,s,r,a,t,o){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=$(N,[["render",E]]),J={install(e,s){e.use(O,s),e.component("Check",S),e.directive("can",h),e.directive("cant",v)}};n.Check=S,n.default=J,n.setPermissionsService=p,n.setupPermissions=g,n.usePermissions=P,n.usePermissionsService=w,n.vCan=h,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 application?: string\n /**\n * Whether to send cookies with cross-origin requests\n * @default true\n */\n withCredentials?: boolean\n}\n\nexport class PermissionsService {\n private axios: AxiosInstance\n private cache: Map<string, boolean | string> = new Map()\n private endpoint: string\n private application?: string\n\n constructor(options?: PermissionsOptions) {\n // Ensure withCredentials is always true unless explicitly set to false\n const withCredentials = options?.withCredentials !== false;\n\n this.axios = axios.create({\n baseURL: options?.baseUrl || '',\n withCredentials // Important for cross-domain requests with authentication\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 | string[]): Promise<boolean> {\n // Преобразуем массив в строку вида ['value1','value2','value3']\n const actionKey = Array.isArray(action) ? JSON.stringify(action) : action;\n\n // Check if we have a cached result\n if (this.cache.has(actionKey)) {\n return this.cache.get(actionKey) as boolean;\n }\n\n try {\n let params: { action: string | string[] } = { action };\n\n // Если это массив, преобразуем его в строку вида ['value1','value2','value3']\n if (Array.isArray(action)) {\n params = { action: JSON.stringify(action) };\n }\n\n const response = await this.axios.get(this.endpoint, { params });\n const allowed = response.data.allowed || false;\n\n // Cache the result\n this.cache.set(actionKey, allowed);\n\n return allowed;\n } catch (error) {\n console.error(`Error checking permission for ${Array.isArray(action) ? JSON.stringify(action) : 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 | 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 checkPermissions(actions: string | string[]): Promise<boolean> {\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet.');\n return false;\n }\n\n if (typeof actions === 'string') {\n return checkPermission(actions);\n }\n\n // Если передан пустой массив, считаем что прав нет\n if (actions.length === 0) {\n return false;\n }\n\n // Используем кэш для массива, чтобы избежать повторных запросов\n const cacheKey = JSON.stringify(actions);\n if (!permissionsCache.has(cacheKey)) {\n // Отправляем один запрос с массивом разрешений\n const permissionPromise = globalPermissionsService.can(actions)\n .catch(error => {\n console.error('Error checking permissions:', error);\n permissionsCache.delete(cacheKey);\n return false;\n });\n\n permissionsCache.set(cacheKey, permissionPromise);\n }\n\n return permissionsCache.get(cacheKey) as Promise<boolean>;\n}\n\n// Общая логика для обработки элементов, применяемая обеими директивами\nasync function processElement(el: CanHTMLElement, action: string | 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 checkPermissions(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 // Проверяем изменение значения, учитывая возможность массива\n const actionChanged = !el._permission_data ||\n (typeof el._permission_data.action !== typeof binding.value) ||\n (typeof binding.value === 'string' && el._permission_data.action !== binding.value) ||\n (Array.isArray(binding.value) &&\n (!Array.isArray(el._permission_data.action) ||\n JSON.stringify(el._permission_data.action) !== JSON.stringify(binding.value)));\n\n if (actionChanged) {\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 // Проверяем изменение значения, учитывая возможность массива\n const actionChanged = !el._permission_data ||\n (typeof el._permission_data.action !== typeof binding.value) ||\n (typeof binding.value === 'string' && el._permission_data.action !== binding.value) ||\n (Array.isArray(binding.value) &&\n (!Array.isArray(el._permission_data.action) ||\n JSON.stringify(el._permission_data.action) !== JSON.stringify(binding.value)));\n\n if (actionChanged) {\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\ntype ActionType = string | string[] | Ref<string | string[]>\n\nexport function usePermissions(action: ActionType, 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 === 'object' && 'value' in action ? action.value : action\n })\n\n const checkPermission = async () => {\n if (!actionValue.value) return\n\n isLoading.value = true\n error.value = null\n\n try {\n // Передаем разрешения напрямую в метод can, который теперь поддерживает массивы\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 === 'object' && 'value' in action) {\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, Array] as PropType<string | 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","withCredentials","axios","action","actionKey","params","allowed","error","globalPermissionsService","permissionsCache","setPermissionsService","service","checkPermission","permissionPromise","checkPermissions","actions","cacheKey","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 /**\n * Whether to send cookies with cross-origin requests\n * @default true\n */\n withCredentials?: boolean\n}\n\nexport class PermissionsService {\n private axios: AxiosInstance\n private cache: Map<string, boolean | string> = new Map()\n private endpoint: string\n private isLocalDev: boolean\n\n constructor(options?: PermissionsOptions) {\n // Ensure withCredentials is always true unless explicitly set to false\n const withCredentials = options?.withCredentials !== false;\n\n this.axios = axios.create({\n baseURL: options?.baseUrl || '',\n withCredentials // Important for cross-domain requests with authentication\n })\n this.endpoint = options?.endpoint || '/api/v1/dashboard/access'\n \n // Detect local development mode (Vite dev server)\n this.isLocalDev = typeof window !== 'undefined' && \n window.location && \n (window.location.hostname === 'test.locator.local' ||\n window.location.hostname === 'localhost' || \n window.location.hostname === '127.0.0.1');\n }\n\n async can(action: string | string[]): Promise<boolean> {\n // В режиме локальной разработки всегда возвращаем true\n if (this.isLocalDev) {\n return true;\n }\n\n // Преобразуем массив в строку вида ['value1','value2','value3']\n const actionKey = Array.isArray(action) ? JSON.stringify(action) : action;\n\n // Check if we have a cached result\n if (this.cache.has(actionKey)) {\n return this.cache.get(actionKey) as boolean;\n }\n\n try {\n let params: { action: string | string[] } = { action };\n\n // Если это массив, преобразуем его в строку вида ['value1','value2','value3']\n if (Array.isArray(action)) {\n params = { action: JSON.stringify(action) };\n }\n\n const response = await this.axios.get(this.endpoint, { params });\n const allowed = response.data.allowed || false;\n\n // Cache the result\n this.cache.set(actionKey, allowed);\n\n return allowed;\n } catch (error) {\n console.error(`Error checking permission for ${Array.isArray(action) ? JSON.stringify(action) : 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 | 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 checkPermissions(actions: string | string[]): Promise<boolean> {\n if (!globalPermissionsService) {\n console.warn('Permissions service not initialized yet.');\n return false;\n }\n\n if (typeof actions === 'string') {\n return checkPermission(actions);\n }\n\n // Если передан пустой массив, считаем что прав нет\n if (actions.length === 0) {\n return false;\n }\n\n // Используем кэш для массива, чтобы избежать повторных запросов\n const cacheKey = JSON.stringify(actions);\n if (!permissionsCache.has(cacheKey)) {\n // Отправляем один запрос с массивом разрешений\n const permissionPromise = globalPermissionsService.can(actions)\n .catch(error => {\n console.error('Error checking permissions:', error);\n permissionsCache.delete(cacheKey);\n return false;\n });\n\n permissionsCache.set(cacheKey, permissionPromise);\n }\n\n return permissionsCache.get(cacheKey) as Promise<boolean>;\n}\n\n// Общая логика для обработки элементов, применяемая обеими директивами\nasync function processElement(el: CanHTMLElement, action: string | 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 checkPermissions(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 // Проверяем изменение значения, учитывая возможность массива\n const actionChanged = !el._permission_data ||\n (typeof el._permission_data.action !== typeof binding.value) ||\n (typeof binding.value === 'string' && el._permission_data.action !== binding.value) ||\n (Array.isArray(binding.value) &&\n (!Array.isArray(el._permission_data.action) ||\n JSON.stringify(el._permission_data.action) !== JSON.stringify(binding.value)));\n\n if (actionChanged) {\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 // Проверяем изменение значения, учитывая возможность массива\n const actionChanged = !el._permission_data ||\n (typeof el._permission_data.action !== typeof binding.value) ||\n (typeof binding.value === 'string' && el._permission_data.action !== binding.value) ||\n (Array.isArray(binding.value) &&\n (!Array.isArray(el._permission_data.action) ||\n JSON.stringify(el._permission_data.action) !== JSON.stringify(binding.value)));\n\n if (actionChanged) {\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\ntype ActionType = string | string[] | Ref<string | string[]>\n\nexport function usePermissions(action: ActionType, 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 === 'object' && 'value' in action ? action.value : action\n })\n\n const checkPermission = async () => {\n if (!actionValue.value) return\n\n isLoading.value = true\n error.value = null\n\n try {\n // Передаем разрешения напрямую в метод can, который теперь поддерживает массивы\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 === 'object' && 'value' in action) {\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, Array] as PropType<string | 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","withCredentials","axios","action","actionKey","params","allowed","error","globalPermissionsService","permissionsCache","setPermissionsService","service","checkPermission","permissionPromise","checkPermissions","actions","cacheKey","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.10",
3
+ "version": "1.1.11",
4
4
  "description": "Permissions library for Vue 3 applications",
5
5
  "type": "module",
6
6
  "main": "./dist/locator-ars-lib.umd.js",