@ibdop/platform-kit 1.0.17 → 1.0.19
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 +55 -10
- package/dist/index.js +10 -10
- package/dist/index.mjs +434 -395
- package/dist/index.umd.js +8 -8
- package/dist/services/api.d.ts.map +1 -1
- package/dist/services/httpTracing.d.ts +3 -0
- package/dist/services/httpTracing.d.ts.map +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/package.json +3 -1
- package/src/services/api.ts +15 -12
- package/src/services/httpTracing.ts +67 -0
- package/src/services/index.ts +6 -5
package/README.md
CHANGED
|
@@ -5,7 +5,14 @@
|
|
|
5
5
|
## Установка
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install @
|
|
8
|
+
npm install @ibdop/platform-kit --registry https://repo.dev.ingobank.ru/artifactory/api/npm/npm-local/
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Или настройте registry для scoped package
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm config set @ibdop:registry https://repo.dev.ingobank.ru/artifactory/api/npm/npm-local/
|
|
15
|
+
npm install @ibdop/platform-kit
|
|
9
16
|
```
|
|
10
17
|
|
|
11
18
|
### Peer Dependencies
|
|
@@ -19,14 +26,14 @@ npm install axios "^1.0.0"
|
|
|
19
26
|
## Быстрый старт
|
|
20
27
|
|
|
21
28
|
```typescript
|
|
22
|
-
import { ErrorBoundary, useShellAuth, createApiClient } from '@
|
|
29
|
+
import { ErrorBoundary, useShellAuth, createApiClient } from '@ibdop/platform-kit'
|
|
23
30
|
|
|
24
31
|
export function App() {
|
|
25
32
|
const auth = useShellAuth()
|
|
26
33
|
const api = createApiClient()
|
|
27
34
|
|
|
28
35
|
return (
|
|
29
|
-
<ErrorBoundary mfeName="@
|
|
36
|
+
<ErrorBoundary mfeName="@ibdop/mf-example">
|
|
30
37
|
<Dashboard auth={auth} />
|
|
31
38
|
</ErrorBoundary>
|
|
32
39
|
)
|
|
@@ -35,19 +42,46 @@ export function App() {
|
|
|
35
42
|
|
|
36
43
|
## Что внутри
|
|
37
44
|
|
|
38
|
-
| Модуль | Содержимое |
|
|
39
|
-
|
|
40
|
-
| **Hooks** | `useShellAuth
|
|
41
|
-
| **Components** | `ErrorBoundary
|
|
42
|
-
| **Services** | API
|
|
43
|
-
| **Utils** | `getMfeName
|
|
45
|
+
| Модуль | Назначение | Содержимое |
|
|
46
|
+
|--------|------------|------------|
|
|
47
|
+
| **Hooks** | React хуки для работы с shell и платформой | `useShellAuth` - аутентификация из shell<br>`useInfoData` - информация о версии MF<br>`useV1Config` - V1 конфигурация<br>`useApi` - HTTP запросы с обработкой ошибок<br>`usePermissions` - проверка прав доступа<br>`useFeatures` - feature toggles пользователя<br>`useFeatureAdmin` - управление фичами (admin) |
|
|
48
|
+
| **Components** | React компоненты для MF | `ErrorBoundary` - перехват ошибок с отправкой в shell<br>`VersionInfo` - отображение версии MF<br>`NotificationProvider` - система уведомлений |
|
|
49
|
+
| **Services** | Сервисы для работы с API и логированием | `createApiClient` - HTTP клиент на axios<br>`get/post/put/del` - методы API<br>`createMfLogger` - логгер для MF |
|
|
50
|
+
| **Utils** | Утилиты для работы с именем MF и auth | `getMfeName/requireMfeName` - получение имени MF<br>`getShellAuth/getAccessToken` - прямой доступ к auth<br>`isAuthenticated/redirectToLogin/logout` - auth утилиты |
|
|
51
|
+
|
|
52
|
+
### Назначение Platform Kit
|
|
53
|
+
|
|
54
|
+
**Platform Kit** — это единый набор инструментов для всех микрофронтендов (MF) платформы IngoBank DevOps:
|
|
55
|
+
|
|
56
|
+
- 🔐 **Единая аутентификация** — все MF получают auth из shell через `useShellAuth`
|
|
57
|
+
- 📊 **Информация о версиях** — централизованное отображение версий MF
|
|
58
|
+
- 🚦 **Feature Toggles** — управление функциями без деплоя
|
|
59
|
+
- 🛡️ **Error Boundaries** — перехват ошибок с отправкой в shell
|
|
60
|
+
- 📡 **HTTP клиент** — единый API с обработкой ошибок и прокси
|
|
61
|
+
- 🔔 **Уведомления** — кросс-MF система нотификаций
|
|
62
|
+
- 📝 **Логирование** — структурированные логи для отладки
|
|
63
|
+
- 🧵 **Trace propagation** — автоматическое добавление `traceparent` для `/api/*` и `/svc/*` запросов через `createApiClient`
|
|
44
64
|
|
|
45
65
|
## Документация
|
|
46
66
|
|
|
47
67
|
- **[`docs/USAGE.md`](docs/USAGE.md)** - Подключение и использование
|
|
48
68
|
- **[`docs/BUILD_AND_PUBLISH.md`](docs/BUILD_AND_PUBLISH.md)** - Сборка и публикация
|
|
69
|
+
- **[`PUBLISH_GUIDE.md`](PUBLISH_GUIDE.md)** - Руководство по публикации
|
|
70
|
+
- **[`CHANGELOG.md`](CHANGELOG.md)** - История изменений
|
|
49
71
|
- **[`PLAN.md`](PLAN.md)** - План разработки
|
|
50
72
|
|
|
73
|
+
## Публикация
|
|
74
|
+
|
|
75
|
+
Автоматическая публикация через GitLab CI/CD:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Обновление версии и создание тега
|
|
79
|
+
npm version patch # или minor/major
|
|
80
|
+
|
|
81
|
+
# Push тега - CI/CD автоматически опубликует пакет
|
|
82
|
+
git push origin main --tags
|
|
83
|
+
```
|
|
84
|
+
|
|
51
85
|
## Миграция
|
|
52
86
|
|
|
53
87
|
### Было
|
|
@@ -60,5 +94,16 @@ import ErrorBoundary from './components/ErrorBoundary'
|
|
|
60
94
|
### Стало
|
|
61
95
|
|
|
62
96
|
```typescript
|
|
63
|
-
import { useShellAuth, ErrorBoundary } from '@
|
|
97
|
+
import { useShellAuth, ErrorBoundary } from '@ibdop/platform-kit'
|
|
64
98
|
```
|
|
99
|
+
|
|
100
|
+
## CI/CD
|
|
101
|
+
|
|
102
|
+
- **Pipeline**: GitLab CI/CD
|
|
103
|
+
- **Сборка**: Docker (node-builder:24.13.0-r1)
|
|
104
|
+
- **Registry**: Artifactory NPM (`repo.dev.ingobank.ru`)
|
|
105
|
+
- **Триггер**: Git теги `v*.*.*`
|
|
106
|
+
|
|
107
|
+
## Лицензия
|
|
108
|
+
|
|
109
|
+
MIT © IngoBank DevOps Team
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react"),$t=require("axios");function L(){if(typeof window>"u")return null;const t=window;if(t.__SHELL_AUTH_INSTANCE__)return t.__SHELL_AUTH_INSTANCE__;const r=window;return r.__SHELL_AUTH__?.authInstance?r.__SHELL_AUTH__.authInstance:null}function Ut(){const t=L();if(!t)return{isAuthenticated:!1};let r;const n=t;if(t.user?.access_token)r=t.user.access_token;else if(t.user?.profile?.access_token)r=t.user.profile.access_token;else if(typeof n.getAccessToken=="function")try{const i=n.getAccessToken();i instanceof Promise?console.warn("[shellAuth] getAccessToken returned Promise - token may not be available synchronously"):typeof i=="string"&&(r=i)}catch(i){console.warn("[shellAuth] Failed to get access token via getAccessToken:",i)}return{isAuthenticated:t.isAuthenticated,user:t.user?{...t.user,access_token:r}:void 0}}function Vt(){const t=L();return t?.isAuthenticated?t.user?.profile?.access_token??null:null}function Bt(){return L()?.isAuthenticated??!1}async function Xe(){const t=L();t?.signinRedirect?await t.signinRedirect():typeof window<"u"&&(window.location.href="/")}async function Ht(){const t=L();t?.removeUser&&await t.removeUser()}const Ge={log:(...t)=>{},warn:(...t)=>{}};function K(){const[t,r]=l.useState(null),[n,i]=l.useState(!0),u=l.useRef(0),p=20,o=l.useCallback(()=>L(),[]);l.useEffect(()=>{const E=o();if(E){r(E),i(!1);return}const c=d=>{r(d.detail),i(!1)},g=setInterval(()=>{u.current++;const d=o();d?(Ge.log("Auth found via polling, attempts:",u.current),r(d),i(!1),clearInterval(g)):u.current>=p&&(i(!1),clearInterval(g))},500);return window.addEventListener("shell-auth-ready",c),()=>{clearInterval(g),window.removeEventListener("shell-auth-ready",c)}},[o]);const h=t||{user:null,isAuthenticated:!1,isLoading:n,signinRedirect:async()=>{const E=L();E?.signinRedirect?await E.signinRedirect():typeof window<"u"&&(window.location.href="/")},removeUser:async()=>{const E=L();E?.removeUser&&await E.removeUser()}};return Ge.log("Auth result:",{isAuthenticated:h.isAuthenticated,isLoading:h.isLoading}),h}const zt={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[useInfoData]",...t)}};function Wt(t){if(t)return t;if(typeof window<"u"){const r=window;if(r.__MF_NAME__)return r.__MF_NAME__}return"unknown-mfe"}function Qe(t){const[r,n]=l.useState(null),[i,u]=l.useState(!0),[p,o]=l.useState(null),a=l.useCallback(()=>{const E=Wt(t?.mfeName).replace("@ib-dop/","");u(!0),o(null),fetch(`/svc/${E}/info.json`).then(c=>{if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);return c.json()}).then(c=>{n(c)}).catch(c=>{zt.error("Failed to load info:",c),o(c instanceof Error?c.message:String(c))}).finally(()=>{u(!1)})},[t?.mfeName]);return l.useEffect(()=>{a()},[a]),{data:r,isLoading:i,error:p,refetch:a}}const ge={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[useV1Config]",...t)}},ne={authority:"",client_id:"",environment:"development"};function Gt(){const[t,r]=l.useState(null),[n,i]=l.useState(!0),[u,p]=l.useState(null);return l.useEffect(()=>{(()=>{if(typeof sessionStorage>"u"){p("sessionStorage not available"),r(ne),i(!1);return}try{const a=sessionStorage.getItem("config");if(a){const h=JSON.parse(a);r({...ne,...h}),p(null),ge.log("Config loaded successfully")}else r(ne),p("Config not found in sessionStorage"),ge.warn("Config not found in sessionStorage")}catch(a){ge.error("Error parsing config:",a),r(ne),p("Error parsing config")}finally{i(!1)}})()},[]),{data:t,isLoading:n,error:u}}const Ze="platform-kit",se={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error(`[${Ze}]`,...t)},info:(...t)=>{}};function Yt(t){const r=t.response;let n="unknown";return r?r.status===401?n="unauthorized":r.status===403?n="forbidden":r.status===404?n="not_found":r.status>=500&&(n="server"):n="network",{message:r?.data?.message??t.message??"Unknown error",code:r?.data?.code,status:r?.status,type:n,timestamp:Date.now(),url:t.config?.url}}const qt=3,Jt=1e3;function Kt(t){return!t||t>=500||t===429}function Xt(t){return new Promise(r=>setTimeout(r,t))}function et(t={}){const r=t.name||Ze,n=t.retries??qt,i=t.retryDelay??Jt,u={log:(...o)=>se.log(`[API:${r}]`,...o),warn:(...o)=>se.warn(`[API:${r}]`,...o),error:(...o)=>se.error(`[API:${r}]`,...o),info:(...o)=>se.info(`[API:${r}]`,...o)},p=$t.create({timeout:t.timeout??1e4,baseURL:t.baseURL??"",headers:{"Content-Type":"application/json"}});return p.interceptors.request.use(o=>{const a=L();return u.info("Auth state check:",{isAuthenticated:a?.isAuthenticated,hasUser:!!a?.user,hasToken:!!a?.user?.access_token}),a?.isAuthenticated&&a.user?.access_token?(o.headers.Authorization=`Bearer ${a.user.access_token}`,u.info("Auth token attached")):a?.isAuthenticated&&!a.user?.access_token?u.info("User authenticated but token not yet available"):u.info("User not authenticated - request without token"),u.log(`${o.method?.toUpperCase()} ${o.url}`),o},o=>(u.error("Request interceptor error:",o.message),Promise.reject(o))),p.interceptors.response.use(o=>(u.log(`Response ${o.status}:`,o.config.url),o),async o=>{const a=o.response?.status,h=o.config?.url,E=o.config?._retryCount??0;if(Kt(a)&&E<n){const c=o.config;c._retryCount=E+1;const g=i*Math.pow(2,E);return u.warn(`Retrying (${c._retryCount}/${n}) after ${g}ms:`,h),await Xt(g),p.request(c)}return a===401?(u.warn("401 Unauthorized - triggering re-auth"),Xe()):a===403?u.warn("403 Forbidden - insufficient permissions"):a===404?u.warn("404 Not found:",h):a===429?u.warn("429 Rate limited"):a===500?u.error("500 Server error:",h):o.response?u.warn(`Error ${a}:`,o.message):u.error("Network error - backend may be unavailable:",h),Promise.reject(Yt(o))}),p}const U=et();async function Qt(t,r,n=U){const i=await n.get(t,{params:r});return{data:i.data,status:i.status,ok:i.status>=200&&i.status<300}}async function Zt(t,r,n=U){const i=await n.post(t,r);return{data:i.data,status:i.status,ok:i.status>=200&&i.status<300}}async function er(t,r,n=U){const i=await n.put(t,r);return{data:i.data,status:i.status,ok:i.status>=200&&i.status<300}}async function tr(t,r=U){const n=await r.delete(t);return{data:n.data,status:n.status,ok:n.status>=200&&n.status<300}}function tt(t){if(typeof window>"u")return;const r=window.__MF_NAME__||"unknown",n={...t,mfeName:r,timestamp:Date.now()};window.dispatchEvent(new CustomEvent("mfe-notification",{detail:n,bubbles:!0}))}function Ye(t,r){const n={network:{title:"Нет подключения",message:"Сервер недоступен. Проверьте подключение к интернету."},unauthorized:{title:"Требуется вход",message:"Ваша сессия истекла. Войдите в систему снова."},forbidden:{title:"Доступ запрещён",message:"У вас нет прав для выполнения этого действия."},not_found:{title:"Не найдено",message:"Запрошенный ресурс не найден."},server:{title:"Ошибка сервера",message:"Произошла ошибка на сервере. Попробуйте позже."},client:{title:"Ошибка",message:t.message||"Произошла ошибка при выполнении запроса."},unknown:{title:"Неизвестная ошибка",message:t.message||"Произошла неизвестная ошибка."}},i=n[t.type]||n.unknown;tt({type:t.type==="network"?"warning":"error",title:i.title,message:r?`${i.message} (${r})`:i.message})}function rr(t){return t instanceof Error&&t.name==="AbortError"}function X(t,r={}){const{notifyOnError:n=!0,notifyOnSuccess:i=!1,successMessage:u,errorContext:p,onSuccess:o,onError:a}=r,[h,E]=l.useState(null),[c,g]=l.useState(null),[d,b]=l.useState(!1),_=l.useRef(null),T=c!==null,C=h!==null&&!d&&!T;l.useEffect(()=>()=>{_.current&&_.current.abort()},[]);const x=l.useCallback(()=>{_.current&&(_.current.abort(),_.current=null,b(!1))},[]),v=l.useCallback(async()=>{_.current&&_.current.abort(),_.current=new AbortController;const N=_.current.signal;b(!0),g(null);try{const P=await t(N);if(N.aborted)return null;if(P.ok)return E(P.data),i&&u&&tt({type:"success",title:"Успешно",message:u}),o?.(P.data),P.data;{const $={message:P.data||"Request failed",status:P.status,type:"client",timestamp:Date.now()};return g($),n&&Ye($,p),a?.($),null}}catch(P){if(rr(P))return null;const $=P;return g($),n&&Ye($,p),a?.($),null}finally{N.aborted||b(!1),_.current=null}},[t,n,i,u,p,o,a]),R=l.useCallback(()=>{E(null),g(null),b(!1)},[]);return{data:h,error:c,isLoading:d,isError:T,isSuccess:C,execute:v,reset:R,abort:x}}function nr(t,r={}){const{skip:n=!1,headers:i,immediate:u=!0,...p}=r,o=l.useMemo(()=>h=>{const E=i?i():{};return U.get(t,{headers:{"Content-Type":"application/json",...E},signal:h}).then(c=>({data:c.data,status:c.status,ok:c.status>=200&&c.status<300}))},[t,i]),a=X(o,{...p});return l.useEffect(()=>{u&&!n&&a.execute()},[u,n,t]),a}function sr(t,r,n={}){return X(u=>U.post(t,r,{signal:u}).then(p=>({data:p.data,status:p.status,ok:p.status>=200&&p.status<300})),n)}function ar(t,r,n={}){return X(u=>U.put(t,r,{signal:u}).then(p=>({data:p.data,status:p.status,ok:p.status>=200&&p.status<300})),n)}function or(t,r={}){return X(i=>U.delete(t,{signal:i}).then(u=>({data:u.data,status:u.status,ok:u.status>=200&&u.status<300})),r)}const ir={canView:["all"],canEdit:["ibdop-user","ibdop-admin","ibdop-devops"],canDelete:["ibdop-admin","ibdop-devops"],canAdmin:["ibdop-admin"],canViewSensitiveData:["ibdop-admin","ibdop-devops"],canExportData:["ibdop-user"],canManageUsers:["ibdop-admin"]};function ur(t={}){const r=K(),n=l.useMemo(()=>({...ir,...t}),[t]),i=l.useMemo(()=>{const p=r.user?.profile?.realm_roles||r.user?.profile?.roles||[];return Array.isArray(p)?p:[p]},[r.user]),u=p=>p.includes("all")?!0:p.some(o=>i.includes(o));return{canView:u(n.canView),canEdit:u(n.canEdit),canDelete:u(n.canDelete),canAdmin:u(n.canAdmin),canViewSensitiveData:u(n.canViewSensitiveData),canExportData:u(n.canExportData),canManageUsers:u(n.canManageUsers)}}function cr(){const t=K(),[r,n]=l.useState([]),[i,u]=l.useState(0),[p,o]=l.useState([]),[a,h]=l.useState(!0),[E,c]=l.useState(null),g=l.useCallback(async()=>{if(!t.isAuthenticated){console.debug("[useFeatures] Not authenticated"),h(!1);return}h(!0),c(null);try{const _={"Content-Type":"application/json"},T=t.user?.access_token;T&&(_.Authorization=`Bearer ${T}`);const C=await fetch("/api/features",{headers:_});if(!C.ok)throw new Error(`HTTP ${C.status}: ${C.statusText}`);const x=await C.json();n(x.features||[]),u(x.totalCount||0),o(x.userRoles||[])}catch(_){console.debug("Features fetch error:",_),c(_ instanceof Error?_.message:String(_)),n([]),o([])}finally{h(!1)}},[t.isAuthenticated,t.user?.access_token]);l.useEffect(()=>{g()},[g]);const d=l.useCallback(_=>r.find(C=>C.name===_)?.userEnabled??!1,[r]),b=l.useCallback(_=>r.filter(T=>T.mfDependencies?.includes(_)),[r]);return{features:r,totalCount:i,userRoles:p,isLoading:a,error:E,refetch:g,isFeatureEnabled:d,getFeaturesByMf:b}}function lr(){const t=K(),[r,n]=l.useState([]),[i,u]=l.useState([]),[p,o]=l.useState(!1),[a,h]=l.useState(!0),[E,c]=l.useState(null),g=l.useCallback(async()=>{if(!t.isAuthenticated){console.debug("[useFeatureAdmin] Not authenticated"),h(!1);return}h(!0),c(null);try{const C={"Content-Type":"application/json"},x=t.user?.access_token;x&&(C.Authorization=`Bearer ${x}`);const v=await fetch("/api/features/admin",{headers:C});if(!v.ok){if(v.status===403){console.warn("[useFeatureAdmin] 403 Forbidden - checking if token has admin role"),o(!1),n([]),u([]),h(!1);return}throw new Error(`HTTP ${v.status}: ${v.statusText}`)}const R=await v.json();n(R.featureToggles||[]),u(R.microfrontends||[]),o(R.isAdmin||!1)}catch(C){console.debug("FeatureAdmin fetch error:",C),n([]),u([]),o(!1)}finally{h(!1)}},[t.isAuthenticated,t.user?.access_token]),d=l.useCallback(async C=>{try{const x={"Content-Type":"application/json"},v=t.user?.access_token;v&&(x.Authorization=`Bearer ${v}`);const R=await fetch("/api/features/admin",{method:"POST",headers:x,body:JSON.stringify(C)});if(!R.ok){const N=await R.json().catch(()=>({}));throw new Error(N.error||`HTTP ${R.status}`)}return await g(),!0}catch(x){return c(x instanceof Error?x.message:String(x)),!1}},[g]),b=l.useCallback(async(C,x)=>{try{const v={"Content-Type":"application/json"},R=t.user?.access_token;R&&(v.Authorization=`Bearer ${R}`);const N=await fetch(`/api/features/admin/${encodeURIComponent(C)}`,{method:"PUT",headers:v,body:JSON.stringify(x)});if(!N.ok){const P=await N.json().catch(()=>({}));throw new Error(P.error||`HTTP ${N.status}`)}return await g(),!0}catch(v){return c(v instanceof Error?v.message:String(v)),!1}},[g]),_=l.useCallback(async(C,x)=>{try{const v={},R=t.user?.access_token;R&&(v.Authorization=`Bearer ${R}`);const N=await fetch(`/api/features/admin/${encodeURIComponent(C)}/toggle?enabled=${x}`,{method:"POST",headers:v});if(!N.ok){const P=await N.json().catch(()=>({}));throw new Error(P.error||`HTTP ${N.status}`)}return await g(),!0}catch(v){return c(v instanceof Error?v.message:String(v)),!1}},[g]),T=l.useCallback(async C=>{try{const x={},v=t.user?.access_token;v&&(x.Authorization=`Bearer ${v}`);const R=await fetch(`/api/features/admin/${encodeURIComponent(C)}`,{method:"DELETE",headers:x});if(!R.ok){const N=await R.json().catch(()=>({}));throw new Error(N.error||`HTTP ${R.status}`)}return await g(),!0}catch(x){return c(x instanceof Error?x.message:String(x)),!1}},[g]);return l.useEffect(()=>{g()},[g]),{features:r,microfrontends:i,isAdmin:p,isLoading:a,error:E,refetch:g,createFeature:d,updateFeature:b,toggleFeature:_,deleteFeature:T}}function fr(){const t=K(),[r,n]=l.useState([]),[i,u]=l.useState(0),[p,o]=l.useState(!0),[a,h]=l.useState(null),E=l.useCallback(async()=>{if(!t.isAuthenticated){o(!1);return}o(!0),h(null);try{const c={"Content-Type":"application/json"},g=t.user?.access_token;g&&(c.Authorization=`Bearer ${g}`);const d=await fetch("/api/features/microfrontends",{headers:c});if(!d.ok)throw new Error(`HTTP ${d.status}: ${d.statusText}`);const b=await d.json();n(b.microfrontends||[]),u(b.totalCount||0)}catch(c){h(c instanceof Error?c.message:String(c))}finally{o(!1)}},[t.isAuthenticated,t.user?.access_token]);return l.useEffect(()=>{E()},[E]),{microfrontends:r,totalCount:i,isLoading:p,error:a,refetch:E}}var ae={exports:{}},q={};var qe;function dr(){if(qe)return q;qe=1;var t=l,r=Symbol.for("react.element"),n=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,u=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function o(a,h,E){var c,g={},d=null,b=null;E!==void 0&&(d=""+E),h.key!==void 0&&(d=""+h.key),h.ref!==void 0&&(b=h.ref);for(c in h)i.call(h,c)&&!p.hasOwnProperty(c)&&(g[c]=h[c]);if(a&&a.defaultProps)for(c in h=a.defaultProps,h)g[c]===void 0&&(g[c]=h[c]);return{$$typeof:r,type:a,key:d,ref:b,props:g,_owner:u.current}}return q.Fragment=n,q.jsx=o,q.jsxs=o,q}var J={};var Je;function pr(){return Je||(Je=1,process.env.NODE_ENV!=="production"&&(function(){var t=l,r=Symbol.for("react.element"),n=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),p=Symbol.for("react.profiler"),o=Symbol.for("react.provider"),a=Symbol.for("react.context"),h=Symbol.for("react.forward_ref"),E=Symbol.for("react.suspense"),c=Symbol.for("react.suspense_list"),g=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),b=Symbol.for("react.offscreen"),_=Symbol.iterator,T="@@iterator";function C(e){if(e===null||typeof e!="object")return null;var s=_&&e[_]||e[T];return typeof s=="function"?s:null}var x=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function v(e){{for(var s=arguments.length,f=new Array(s>1?s-1:0),m=1;m<s;m++)f[m-1]=arguments[m];R("error",e,f)}}function R(e,s,f){{var m=x.ReactDebugCurrentFrame,S=m.getStackAddendum();S!==""&&(s+="%s",f=f.concat([S]));var A=f.map(function(k){return String(k)});A.unshift("Warning: "+s),Function.prototype.apply.call(console[e],console,A)}}var N=!1,P=!1,$=!1,ut=!1,ct=!1,be;be=Symbol.for("react.module.reference");function lt(e){return!!(typeof e=="string"||typeof e=="function"||e===i||e===p||ct||e===u||e===E||e===c||ut||e===b||N||P||$||typeof e=="object"&&e!==null&&(e.$$typeof===d||e.$$typeof===g||e.$$typeof===o||e.$$typeof===a||e.$$typeof===h||e.$$typeof===be||e.getModuleId!==void 0))}function ft(e,s,f){var m=e.displayName;if(m)return m;var S=s.displayName||s.name||"";return S!==""?f+"("+S+")":f}function we(e){return e.displayName||"Context"}function V(e){if(e==null)return null;if(typeof e.tag=="number"&&v("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case i:return"Fragment";case n:return"Portal";case p:return"Profiler";case u:return"StrictMode";case E:return"Suspense";case c:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case a:var s=e;return we(s)+".Consumer";case o:var f=e;return we(f._context)+".Provider";case h:return ft(e,e.render,"ForwardRef");case g:var m=e.displayName||null;return m!==null?m:V(e.type)||"Memo";case d:{var S=e,A=S._payload,k=S._init;try{return V(k(A))}catch{return null}}}return null}var B=Object.assign,G=0,ke,xe,Se,Ae,Ce,Te,Re;function Me(){}Me.__reactDisabledLog=!0;function dt(){{if(G===0){ke=console.log,xe=console.info,Se=console.warn,Ae=console.error,Ce=console.group,Te=console.groupCollapsed,Re=console.groupEnd;var e={configurable:!0,enumerable:!0,value:Me,writable:!0};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e})}G++}}function pt(){{if(G--,G===0){var e={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:B({},e,{value:ke}),info:B({},e,{value:xe}),warn:B({},e,{value:Se}),error:B({},e,{value:Ae}),group:B({},e,{value:Ce}),groupCollapsed:B({},e,{value:Te}),groupEnd:B({},e,{value:Re})})}G<0&&v("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var ie=x.ReactCurrentDispatcher,ue;function Z(e,s,f){{if(ue===void 0)try{throw Error()}catch(S){var m=S.stack.trim().match(/\n( *(at )?)/);ue=m&&m[1]||""}return`
|
|
2
|
-
`+ue+e}}var ce=!1,ee;{var
|
|
3
|
-
`),O=
|
|
4
|
-
`),M=
|
|
5
|
-
`+
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react"),Qe=require("axios");function L(){if(typeof window>"u")return null;const t=window;if(t.__SHELL_AUTH_INSTANCE__)return t.__SHELL_AUTH_INSTANCE__;const r=window;return r.__SHELL_AUTH__?.authInstance?r.__SHELL_AUTH__.authInstance:null}function Ht(){const t=L();if(!t)return{isAuthenticated:!1};let r;const n=t;if(t.user?.access_token)r=t.user.access_token;else if(t.user?.profile?.access_token)r=t.user.profile.access_token;else if(typeof n.getAccessToken=="function")try{const a=n.getAccessToken();a instanceof Promise?console.warn("[shellAuth] getAccessToken returned Promise - token may not be available synchronously"):typeof a=="string"&&(r=a)}catch(a){console.warn("[shellAuth] Failed to get access token via getAccessToken:",a)}return{isAuthenticated:t.isAuthenticated,user:t.user?{...t.user,access_token:r}:void 0}}function Wt(){const t=L();return t?.isAuthenticated?t.user?.profile?.access_token??null:null}function zt(){return L()?.isAuthenticated??!1}async function Ze(){const t=L();t?.signinRedirect?await t.signinRedirect():typeof window<"u"&&(window.location.href="/")}async function Gt(){const t=L();t?.removeUser&&await t.removeUser()}const Ge={log:(...t)=>{},warn:(...t)=>{}};function K(){const[t,r]=l.useState(null),[n,a]=l.useState(!0),u=l.useRef(0),p=20,o=l.useCallback(()=>L(),[]);l.useEffect(()=>{const E=o();if(E){r(E),a(!1);return}const c=d=>{r(d.detail),a(!1)},m=setInterval(()=>{u.current++;const d=o();d?(Ge.log("Auth found via polling, attempts:",u.current),r(d),a(!1),clearInterval(m)):u.current>=p&&(a(!1),clearInterval(m))},500);return window.addEventListener("shell-auth-ready",c),()=>{clearInterval(m),window.removeEventListener("shell-auth-ready",c)}},[o]);const h=t||{user:null,isAuthenticated:!1,isLoading:n,signinRedirect:async()=>{const E=L();E?.signinRedirect?await E.signinRedirect():typeof window<"u"&&(window.location.href="/")},removeUser:async()=>{const E=L();E?.removeUser&&await E.removeUser()}};return Ge.log("Auth result:",{isAuthenticated:h.isAuthenticated,isLoading:h.isLoading}),h}const Yt={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[useInfoData]",...t)}};function qt(t){if(t)return t;if(typeof window<"u"){const r=window;if(r.__MF_NAME__)return r.__MF_NAME__}return"unknown-mfe"}function et(t){const[r,n]=l.useState(null),[a,u]=l.useState(!0),[p,o]=l.useState(null),i=l.useCallback(()=>{const E=qt(t?.mfeName).replace("@ib-dop/","");u(!0),o(null),fetch(`/svc/${E}/info.json`).then(c=>{if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);return c.json()}).then(c=>{n(c)}).catch(c=>{Yt.error("Failed to load info:",c),o(c instanceof Error?c.message:String(c))}).finally(()=>{u(!1)})},[t?.mfeName]);return l.useEffect(()=>{i()},[i]),{data:r,isLoading:a,error:p,refetch:i}}const me={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[useV1Config]",...t)}},ne={authority:"",client_id:"",environment:"development"};function Jt(){const[t,r]=l.useState(null),[n,a]=l.useState(!0),[u,p]=l.useState(null);return l.useEffect(()=>{(()=>{if(typeof sessionStorage>"u"){p("sessionStorage not available"),r(ne),a(!1);return}try{const i=sessionStorage.getItem("config");if(i){const h=JSON.parse(i);r({...ne,...h}),p(null),me.log("Config loaded successfully")}else r(ne),p("Config not found in sessionStorage"),me.warn("Config not found in sessionStorage")}catch(i){me.error("Error parsing config:",i),r(ne),p("Error parsing config")}finally{a(!1)}})()},[]),{data:t,isLoading:n,error:u}}const Ye="ibdop_trace_id",Kt="00",Xt="01";function tt(t){const r=new Uint8Array(t);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(r);else for(let n=0;n<t;n+=1)r[n]=Math.floor(Math.random()*256);return Array.from(r,n=>n.toString(16).padStart(2,"0")).join("")}function Qt(t,r){return t.length===r&&/^[0-9a-f]+$/.test(t)}function Zt(t){const r=t.getItem(Ye)?.toLowerCase()??"";if(Qt(r,32))return r;const n=tt(16);return t.setItem(Ye,n),n}function er(t){const r=tt(8);return`${Kt}-${t}-${r}-${Xt}`}function tr(t,r){try{const n=new URL(t,r);return n.origin!==r?!1:n.pathname.startsWith("/api/")||n.pathname.startsWith("/svc/")}catch{return!1}}function rt(t){if(typeof window>"u"||!t.url||!tr(t.url,window.location.origin))return;const r=Zt(window.sessionStorage),n=er(r),a=Qe.AxiosHeaders.from(t.headers);a.has("traceparent")||a.set("traceparent",n),t.headers=a}const nt="platform-kit",se={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error(`[${nt}]`,...t)},info:(...t)=>{}};function rr(t){const r=t.response;let n="unknown";return r?r.status===401?n="unauthorized":r.status===403?n="forbidden":r.status===404?n="not_found":r.status>=500&&(n="server"):n="network",{message:r?.data?.message??t.message??"Unknown error",code:r?.data?.code,status:r?.status,type:n,timestamp:Date.now(),url:t.config?.url}}const nr=3,sr=1e3;function ar(t){return!t||t>=500||t===429}function or(t){return new Promise(r=>setTimeout(r,t))}function st(t={}){const r=t.name||nt,n=t.retries??nr,a=t.retryDelay??sr,u={log:(...o)=>se.log(`[API:${r}]`,...o),warn:(...o)=>se.warn(`[API:${r}]`,...o),error:(...o)=>se.error(`[API:${r}]`,...o),info:(...o)=>se.info(`[API:${r}]`,...o)},p=Qe.create({timeout:t.timeout??1e4,baseURL:t.baseURL??"",headers:{"Content-Type":"application/json"}});return p.interceptors.request.use(o=>{const i=L();return u.info("Auth state check:",{isAuthenticated:i?.isAuthenticated,hasUser:!!i?.user,hasToken:!!i?.user?.access_token}),i?.isAuthenticated&&i.user?.access_token?(o.headers.Authorization=`Bearer ${i.user.access_token}`,u.info("Auth token attached")):i?.isAuthenticated&&!i.user?.access_token?u.info("User authenticated but token not yet available"):u.info("User not authenticated - request without token"),rt(o),u.log(`${o.method?.toUpperCase()} ${o.url}`),o},o=>(u.error("Request interceptor error:",o.message),Promise.reject(o))),p.interceptors.response.use(o=>(u.log(`Response ${o.status}:`,o.config.url),o),async o=>{const i=o.response?.status,h=o.config?.url,E=o.config?._retryCount??0;if(ar(i)&&E<n){const c=o.config;c._retryCount=E+1;const m=a*Math.pow(2,E);return u.warn(`Retrying (${c._retryCount}/${n}) after ${m}ms:`,h),await or(m),p.request(c)}return i===401?(u.warn("401 Unauthorized - triggering re-auth"),Ze()):i===403?u.warn("403 Forbidden - insufficient permissions"):i===404?u.warn("404 Not found:",h):i===429?u.warn("429 Rate limited"):i===500?u.error("500 Server error:",h):o.response?u.warn(`Error ${i}:`,o.message):u.error("Network error - backend may be unavailable:",h),Promise.reject(rr(o))}),p}const U=st();async function ir(t,r,n=U){const a=await n.get(t,{params:r});return{data:a.data,status:a.status,ok:a.status>=200&&a.status<300}}async function ur(t,r,n=U){const a=await n.post(t,r);return{data:a.data,status:a.status,ok:a.status>=200&&a.status<300}}async function cr(t,r,n=U){const a=await n.put(t,r);return{data:a.data,status:a.status,ok:a.status>=200&&a.status<300}}async function lr(t,r=U){const n=await r.delete(t);return{data:n.data,status:n.status,ok:n.status>=200&&n.status<300}}function at(t){if(typeof window>"u")return;const r=window.__MF_NAME__||"unknown",n={...t,mfeName:r,timestamp:Date.now()};window.dispatchEvent(new CustomEvent("mfe-notification",{detail:n,bubbles:!0}))}function qe(t,r){const n={network:{title:"Нет подключения",message:"Сервер недоступен. Проверьте подключение к интернету."},unauthorized:{title:"Требуется вход",message:"Ваша сессия истекла. Войдите в систему снова."},forbidden:{title:"Доступ запрещён",message:"У вас нет прав для выполнения этого действия."},not_found:{title:"Не найдено",message:"Запрошенный ресурс не найден."},server:{title:"Ошибка сервера",message:"Произошла ошибка на сервере. Попробуйте позже."},client:{title:"Ошибка",message:t.message||"Произошла ошибка при выполнении запроса."},unknown:{title:"Неизвестная ошибка",message:t.message||"Произошла неизвестная ошибка."}},a=n[t.type]||n.unknown;at({type:t.type==="network"?"warning":"error",title:a.title,message:r?`${a.message} (${r})`:a.message})}function fr(t){return t instanceof Error&&t.name==="AbortError"}function X(t,r={}){const{notifyOnError:n=!0,notifyOnSuccess:a=!1,successMessage:u,errorContext:p,onSuccess:o,onError:i}=r,[h,E]=l.useState(null),[c,m]=l.useState(null),[d,w]=l.useState(!1),_=l.useRef(null),C=c!==null,T=h!==null&&!d&&!C;l.useEffect(()=>()=>{_.current&&_.current.abort()},[]);const x=l.useCallback(()=>{_.current&&(_.current.abort(),_.current=null,w(!1))},[]),y=l.useCallback(async()=>{_.current&&_.current.abort(),_.current=new AbortController;const N=_.current.signal;w(!0),m(null);try{const P=await t(N);if(N.aborted)return null;if(P.ok)return E(P.data),a&&u&&at({type:"success",title:"Успешно",message:u}),o?.(P.data),P.data;{const $={message:P.data||"Request failed",status:P.status,type:"client",timestamp:Date.now()};return m($),n&&qe($,p),i?.($),null}}catch(P){if(fr(P))return null;const $=P;return m($),n&&qe($,p),i?.($),null}finally{N.aborted||w(!1),_.current=null}},[t,n,a,u,p,o,i]),R=l.useCallback(()=>{E(null),m(null),w(!1)},[]);return{data:h,error:c,isLoading:d,isError:C,isSuccess:T,execute:y,reset:R,abort:x}}function dr(t,r={}){const{skip:n=!1,headers:a,immediate:u=!0,...p}=r,o=l.useMemo(()=>h=>{const E=a?a():{};return U.get(t,{headers:{"Content-Type":"application/json",...E},signal:h}).then(c=>({data:c.data,status:c.status,ok:c.status>=200&&c.status<300}))},[t,a]),i=X(o,{...p});return l.useEffect(()=>{u&&!n&&i.execute()},[u,n,t]),i}function pr(t,r,n={}){return X(u=>U.post(t,r,{signal:u}).then(p=>({data:p.data,status:p.status,ok:p.status>=200&&p.status<300})),n)}function hr(t,r,n={}){return X(u=>U.put(t,r,{signal:u}).then(p=>({data:p.data,status:p.status,ok:p.status>=200&&p.status<300})),n)}function mr(t,r={}){return X(a=>U.delete(t,{signal:a}).then(u=>({data:u.data,status:u.status,ok:u.status>=200&&u.status<300})),r)}const gr={canView:["all"],canEdit:["ibdop-user","ibdop-admin","ibdop-devops"],canDelete:["ibdop-admin","ibdop-devops"],canAdmin:["ibdop-admin"],canViewSensitiveData:["ibdop-admin","ibdop-devops"],canExportData:["ibdop-user"],canManageUsers:["ibdop-admin"]};function _r(t={}){const r=K(),n=l.useMemo(()=>({...gr,...t}),[t]),a=l.useMemo(()=>{const p=r.user?.profile?.realm_roles||r.user?.profile?.roles||[];return Array.isArray(p)?p:[p]},[r.user]),u=p=>p.includes("all")?!0:p.some(o=>a.includes(o));return{canView:u(n.canView),canEdit:u(n.canEdit),canDelete:u(n.canDelete),canAdmin:u(n.canAdmin),canViewSensitiveData:u(n.canViewSensitiveData),canExportData:u(n.canExportData),canManageUsers:u(n.canManageUsers)}}function yr(){const t=K(),[r,n]=l.useState([]),[a,u]=l.useState(0),[p,o]=l.useState([]),[i,h]=l.useState(!0),[E,c]=l.useState(null),m=l.useCallback(async()=>{if(!t.isAuthenticated){console.debug("[useFeatures] Not authenticated"),h(!1);return}h(!0),c(null);try{const _={"Content-Type":"application/json"},C=t.user?.access_token;C&&(_.Authorization=`Bearer ${C}`);const T=await fetch("/api/features",{headers:_});if(!T.ok)throw new Error(`HTTP ${T.status}: ${T.statusText}`);const x=await T.json();n(x.features||[]),u(x.totalCount||0),o(x.userRoles||[])}catch(_){console.debug("Features fetch error:",_),c(_ instanceof Error?_.message:String(_)),n([]),o([])}finally{h(!1)}},[t.isAuthenticated,t.user?.access_token]);l.useEffect(()=>{m()},[m]);const d=l.useCallback(_=>r.find(T=>T.name===_)?.userEnabled??!1,[r]),w=l.useCallback(_=>r.filter(C=>C.mfDependencies?.includes(_)),[r]);return{features:r,totalCount:a,userRoles:p,isLoading:i,error:E,refetch:m,isFeatureEnabled:d,getFeaturesByMf:w}}function vr(){const t=K(),[r,n]=l.useState([]),[a,u]=l.useState([]),[p,o]=l.useState(!1),[i,h]=l.useState(!0),[E,c]=l.useState(null),m=l.useCallback(async()=>{if(!t.isAuthenticated){console.debug("[useFeatureAdmin] Not authenticated"),h(!1);return}h(!0),c(null);try{const T={"Content-Type":"application/json"},x=t.user?.access_token;x&&(T.Authorization=`Bearer ${x}`);const y=await fetch("/api/features/admin",{headers:T});if(!y.ok){if(y.status===403){console.warn("[useFeatureAdmin] 403 Forbidden - checking if token has admin role"),o(!1),n([]),u([]),h(!1);return}throw new Error(`HTTP ${y.status}: ${y.statusText}`)}const R=await y.json();n(R.featureToggles||[]),u(R.microfrontends||[]),o(R.isAdmin||!1)}catch(T){console.debug("FeatureAdmin fetch error:",T),n([]),u([]),o(!1)}finally{h(!1)}},[t.isAuthenticated,t.user?.access_token]),d=l.useCallback(async T=>{try{const x={"Content-Type":"application/json"},y=t.user?.access_token;y&&(x.Authorization=`Bearer ${y}`);const R=await fetch("/api/features/admin",{method:"POST",headers:x,body:JSON.stringify(T)});if(!R.ok){const N=await R.json().catch(()=>({}));throw new Error(N.error||`HTTP ${R.status}`)}return await m(),!0}catch(x){return c(x instanceof Error?x.message:String(x)),!1}},[m]),w=l.useCallback(async(T,x)=>{try{const y={"Content-Type":"application/json"},R=t.user?.access_token;R&&(y.Authorization=`Bearer ${R}`);const N=await fetch(`/api/features/admin/${encodeURIComponent(T)}`,{method:"PUT",headers:y,body:JSON.stringify(x)});if(!N.ok){const P=await N.json().catch(()=>({}));throw new Error(P.error||`HTTP ${N.status}`)}return await m(),!0}catch(y){return c(y instanceof Error?y.message:String(y)),!1}},[m]),_=l.useCallback(async(T,x)=>{try{const y={},R=t.user?.access_token;R&&(y.Authorization=`Bearer ${R}`);const N=await fetch(`/api/features/admin/${encodeURIComponent(T)}/toggle?enabled=${x}`,{method:"POST",headers:y});if(!N.ok){const P=await N.json().catch(()=>({}));throw new Error(P.error||`HTTP ${N.status}`)}return await m(),!0}catch(y){return c(y instanceof Error?y.message:String(y)),!1}},[m]),C=l.useCallback(async T=>{try{const x={},y=t.user?.access_token;y&&(x.Authorization=`Bearer ${y}`);const R=await fetch(`/api/features/admin/${encodeURIComponent(T)}`,{method:"DELETE",headers:x});if(!R.ok){const N=await R.json().catch(()=>({}));throw new Error(N.error||`HTTP ${R.status}`)}return await m(),!0}catch(x){return c(x instanceof Error?x.message:String(x)),!1}},[m]);return l.useEffect(()=>{m()},[m]),{features:r,microfrontends:a,isAdmin:p,isLoading:i,error:E,refetch:m,createFeature:d,updateFeature:w,toggleFeature:_,deleteFeature:C}}function Er(){const t=K(),[r,n]=l.useState([]),[a,u]=l.useState(0),[p,o]=l.useState(!0),[i,h]=l.useState(null),E=l.useCallback(async()=>{if(!t.isAuthenticated){o(!1);return}o(!0),h(null);try{const c={"Content-Type":"application/json"},m=t.user?.access_token;m&&(c.Authorization=`Bearer ${m}`);const d=await fetch("/api/features/microfrontends",{headers:c});if(!d.ok)throw new Error(`HTTP ${d.status}: ${d.statusText}`);const w=await d.json();n(w.microfrontends||[]),u(w.totalCount||0)}catch(c){h(c instanceof Error?c.message:String(c))}finally{o(!1)}},[t.isAuthenticated,t.user?.access_token]);return l.useEffect(()=>{E()},[E]),{microfrontends:r,totalCount:a,isLoading:p,error:i,refetch:E}}var ae={exports:{}},q={};var Je;function wr(){if(Je)return q;Je=1;var t=l,r=Symbol.for("react.element"),n=Symbol.for("react.fragment"),a=Object.prototype.hasOwnProperty,u=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function o(i,h,E){var c,m={},d=null,w=null;E!==void 0&&(d=""+E),h.key!==void 0&&(d=""+h.key),h.ref!==void 0&&(w=h.ref);for(c in h)a.call(h,c)&&!p.hasOwnProperty(c)&&(m[c]=h[c]);if(i&&i.defaultProps)for(c in h=i.defaultProps,h)m[c]===void 0&&(m[c]=h[c]);return{$$typeof:r,type:i,key:d,ref:w,props:m,_owner:u.current}}return q.Fragment=n,q.jsx=o,q.jsxs=o,q}var J={};var Ke;function br(){return Ke||(Ke=1,process.env.NODE_ENV!=="production"&&(function(){var t=l,r=Symbol.for("react.element"),n=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),p=Symbol.for("react.profiler"),o=Symbol.for("react.provider"),i=Symbol.for("react.context"),h=Symbol.for("react.forward_ref"),E=Symbol.for("react.suspense"),c=Symbol.for("react.suspense_list"),m=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),w=Symbol.for("react.offscreen"),_=Symbol.iterator,C="@@iterator";function T(e){if(e===null||typeof e!="object")return null;var s=_&&e[_]||e[C];return typeof s=="function"?s:null}var x=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function y(e){{for(var s=arguments.length,f=new Array(s>1?s-1:0),g=1;g<s;g++)f[g-1]=arguments[g];R("error",e,f)}}function R(e,s,f){{var g=x.ReactDebugCurrentFrame,S=g.getStackAddendum();S!==""&&(s+="%s",f=f.concat([S]));var A=f.map(function(k){return String(k)});A.unshift("Warning: "+s),Function.prototype.apply.call(console[e],console,A)}}var N=!1,P=!1,$=!1,dt=!1,pt=!1,we;we=Symbol.for("react.module.reference");function ht(e){return!!(typeof e=="string"||typeof e=="function"||e===a||e===p||pt||e===u||e===E||e===c||dt||e===w||N||P||$||typeof e=="object"&&e!==null&&(e.$$typeof===d||e.$$typeof===m||e.$$typeof===o||e.$$typeof===i||e.$$typeof===h||e.$$typeof===we||e.getModuleId!==void 0))}function mt(e,s,f){var g=e.displayName;if(g)return g;var S=s.displayName||s.name||"";return S!==""?f+"("+S+")":f}function be(e){return e.displayName||"Context"}function V(e){if(e==null)return null;if(typeof e.tag=="number"&&y("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case a:return"Fragment";case n:return"Portal";case p:return"Profiler";case u:return"StrictMode";case E:return"Suspense";case c:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case i:var s=e;return be(s)+".Consumer";case o:var f=e;return be(f._context)+".Provider";case h:return mt(e,e.render,"ForwardRef");case m:var g=e.displayName||null;return g!==null?g:V(e.type)||"Memo";case d:{var S=e,A=S._payload,k=S._init;try{return V(k(A))}catch{return null}}}return null}var B=Object.assign,G=0,ke,xe,Se,Ae,Te,Ce,Re;function Me(){}Me.__reactDisabledLog=!0;function gt(){{if(G===0){ke=console.log,xe=console.info,Se=console.warn,Ae=console.error,Te=console.group,Ce=console.groupCollapsed,Re=console.groupEnd;var e={configurable:!0,enumerable:!0,value:Me,writable:!0};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e})}G++}}function _t(){{if(G--,G===0){var e={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:B({},e,{value:ke}),info:B({},e,{value:xe}),warn:B({},e,{value:Se}),error:B({},e,{value:Ae}),group:B({},e,{value:Te}),groupCollapsed:B({},e,{value:Ce}),groupEnd:B({},e,{value:Re})})}G<0&&y("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var ie=x.ReactCurrentDispatcher,ue;function Z(e,s,f){{if(ue===void 0)try{throw Error()}catch(S){var g=S.stack.trim().match(/\n( *(at )?)/);ue=g&&g[1]||""}return`
|
|
2
|
+
`+ue+e}}var ce=!1,ee;{var yt=typeof WeakMap=="function"?WeakMap:Map;ee=new yt}function Ie(e,s){if(!e||ce)return"";{var f=ee.get(e);if(f!==void 0)return f}var g;ce=!0;var S=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var A;A=ie.current,ie.current=null,gt();try{if(s){var k=function(){throw Error()};if(Object.defineProperty(k.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(k,[])}catch(D){g=D}Reflect.construct(e,[],k)}else{try{k.call()}catch(D){g=D}e.call(k.prototype)}}else{try{throw Error()}catch(D){g=D}e()}}catch(D){if(D&&g&&typeof D.stack=="string"){for(var b=D.stack.split(`
|
|
3
|
+
`),O=g.stack.split(`
|
|
4
|
+
`),M=b.length-1,I=O.length-1;M>=1&&I>=0&&b[M]!==O[I];)I--;for(;M>=1&&I>=0;M--,I--)if(b[M]!==O[I]){if(M!==1||I!==1)do if(M--,I--,I<0||b[M]!==O[I]){var F=`
|
|
5
|
+
`+b[M].replace(" at new "," at ");return e.displayName&&F.includes("<anonymous>")&&(F=F.replace("<anonymous>",e.displayName)),typeof e=="function"&&ee.set(e,F),F}while(M>=1&&I>=0);break}}}finally{ce=!1,ie.current=A,_t(),Error.prepareStackTrace=S}var z=e?e.displayName||e.name:"",H=z?Z(z):"";return typeof e=="function"&&ee.set(e,H),H}function vt(e,s,f){return Ie(e,!1)}function Et(e){var s=e.prototype;return!!(s&&s.isReactComponent)}function te(e,s,f){if(e==null)return"";if(typeof e=="function")return Ie(e,Et(e));if(typeof e=="string")return Z(e);switch(e){case E:return Z("Suspense");case c:return Z("SuspenseList")}if(typeof e=="object")switch(e.$$typeof){case h:return vt(e.render);case m:return te(e.type,s,f);case d:{var g=e,S=g._payload,A=g._init;try{return te(A(S),s,f)}catch{}}}return""}var Y=Object.prototype.hasOwnProperty,Ne={},Pe=x.ReactDebugCurrentFrame;function re(e){if(e){var s=e._owner,f=te(e.type,e._source,s?s.type:null);Pe.setExtraStackFrame(f)}else Pe.setExtraStackFrame(null)}function wt(e,s,f,g,S){{var A=Function.call.bind(Y);for(var k in e)if(A(e,k)){var b=void 0;try{if(typeof e[k]!="function"){var O=Error((g||"React class")+": "+f+" type `"+k+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof e[k]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw O.name="Invariant Violation",O}b=e[k](s,k,g,f,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED")}catch(M){b=M}b&&!(b instanceof Error)&&(re(S),y("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",g||"React class",f,k,typeof b),re(null)),b instanceof Error&&!(b.message in Ne)&&(Ne[b.message]=!0,re(S),y("Failed %s type: %s",f,b.message),re(null))}}}var bt=Array.isArray;function le(e){return bt(e)}function kt(e){{var s=typeof Symbol=="function"&&Symbol.toStringTag,f=s&&e[Symbol.toStringTag]||e.constructor.name||"Object";return f}}function xt(e){try{return Oe(e),!1}catch{return!0}}function Oe(e){return""+e}function je(e){if(xt(e))return y("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.",kt(e)),Oe(e)}var De=x.ReactCurrentOwner,St={key:!0,ref:!0,__self:!0,__source:!0},Fe,Le;function At(e){if(Y.call(e,"ref")){var s=Object.getOwnPropertyDescriptor(e,"ref").get;if(s&&s.isReactWarning)return!1}return e.ref!==void 0}function Tt(e){if(Y.call(e,"key")){var s=Object.getOwnPropertyDescriptor(e,"key").get;if(s&&s.isReactWarning)return!1}return e.key!==void 0}function Ct(e,s){typeof e.ref=="string"&&De.current}function Rt(e,s){{var f=function(){Fe||(Fe=!0,y("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",s))};f.isReactWarning=!0,Object.defineProperty(e,"key",{get:f,configurable:!0})}}function Mt(e,s){{var f=function(){Le||(Le=!0,y("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",s))};f.isReactWarning=!0,Object.defineProperty(e,"ref",{get:f,configurable:!0})}}var It=function(e,s,f,g,S,A,k){var b={$$typeof:r,type:e,key:s,ref:f,props:k,_owner:A};return b._store={},Object.defineProperty(b._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(b,"_self",{configurable:!1,enumerable:!1,writable:!1,value:g}),Object.defineProperty(b,"_source",{configurable:!1,enumerable:!1,writable:!1,value:S}),Object.freeze&&(Object.freeze(b.props),Object.freeze(b)),b};function Nt(e,s,f,g,S){{var A,k={},b=null,O=null;f!==void 0&&(je(f),b=""+f),Tt(s)&&(je(s.key),b=""+s.key),At(s)&&(O=s.ref,Ct(s,S));for(A in s)Y.call(s,A)&&!St.hasOwnProperty(A)&&(k[A]=s[A]);if(e&&e.defaultProps){var M=e.defaultProps;for(A in M)k[A]===void 0&&(k[A]=M[A])}if(b||O){var I=typeof e=="function"?e.displayName||e.name||"Unknown":e;b&&Rt(k,I),O&&Mt(k,I)}return It(e,b,O,S,g,De.current,k)}}var fe=x.ReactCurrentOwner,$e=x.ReactDebugCurrentFrame;function W(e){if(e){var s=e._owner,f=te(e.type,e._source,s?s.type:null);$e.setExtraStackFrame(f)}else $e.setExtraStackFrame(null)}var de;de=!1;function pe(e){return typeof e=="object"&&e!==null&&e.$$typeof===r}function Ue(){{if(fe.current){var e=V(fe.current.type);if(e)return`
|
|
6
6
|
|
|
7
|
-
Check the render method of \``+e+"`."}return""}}function
|
|
7
|
+
Check the render method of \``+e+"`."}return""}}function Pt(e){return""}var Ve={};function Ot(e){{var s=Ue();if(!s){var f=typeof e=="string"?e:e.displayName||e.name;f&&(s=`
|
|
8
8
|
|
|
9
|
-
Check the top-level render call using <`+f+">.")}return s}}function Be(e,s){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var f=
|
|
9
|
+
Check the top-level render call using <`+f+">.")}return s}}function Be(e,s){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var f=Ot(s);if(Ve[f])return;Ve[f]=!0;var g="";e&&e._owner&&e._owner!==fe.current&&(g=" It was passed a child from "+V(e._owner.type)+"."),W(e),y('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',f,g),W(null)}}function He(e,s){{if(typeof e!="object")return;if(le(e))for(var f=0;f<e.length;f++){var g=e[f];pe(g)&&Be(g,s)}else if(pe(e))e._store&&(e._store.validated=!0);else if(e){var S=T(e);if(typeof S=="function"&&S!==e.entries)for(var A=S.call(e),k;!(k=A.next()).done;)pe(k.value)&&Be(k.value,s)}}}function jt(e){{var s=e.type;if(s==null||typeof s=="string")return;var f;if(typeof s=="function")f=s.propTypes;else if(typeof s=="object"&&(s.$$typeof===h||s.$$typeof===m))f=s.propTypes;else return;if(f){var g=V(s);wt(f,e.props,"prop",g,e)}else if(s.PropTypes!==void 0&&!de){de=!0;var S=V(s);y("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",S||"Unknown")}typeof s.getDefaultProps=="function"&&!s.getDefaultProps.isReactClassApproved&&y("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}function Dt(e){{for(var s=Object.keys(e.props),f=0;f<s.length;f++){var g=s[f];if(g!=="children"&&g!=="key"){W(e),y("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.",g),W(null);break}}e.ref!==null&&(W(e),y("Invalid attribute `ref` supplied to `React.Fragment`."),W(null))}}var We={};function ze(e,s,f,g,S,A){{var k=ht(e);if(!k){var b="";(e===void 0||typeof e=="object"&&e!==null&&Object.keys(e).length===0)&&(b+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var O=Pt();O?b+=O:b+=Ue();var M;e===null?M="null":le(e)?M="array":e!==void 0&&e.$$typeof===r?(M="<"+(V(e.type)||"Unknown")+" />",b=" Did you accidentally export a JSX literal instead of a component?"):M=typeof e,y("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",M,b)}var I=Nt(e,s,f,S,A);if(I==null)return I;if(k){var F=s.children;if(F!==void 0)if(g)if(le(F)){for(var z=0;z<F.length;z++)He(F[z],e);Object.freeze&&Object.freeze(F)}else y("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else He(F,e)}if(Y.call(s,"key")){var H=V(e),D=Object.keys(s).filter(function(Bt){return Bt!=="key"}),he=D.length>0?"{key: someKey, "+D.join(": ..., ")+": ...}":"{key: someKey}";if(!We[H+he]){var Vt=D.length>0?"{"+D.join(": ..., ")+": ...}":"{}";y(`A props object containing a "key" prop is being spread into JSX:
|
|
10
10
|
let props = %s;
|
|
11
11
|
<%s {...props} />
|
|
12
12
|
React keys must be passed directly to JSX without using spread:
|
|
13
13
|
let props = %s;
|
|
14
|
-
<%s key={someKey} {...props} />`,he,H,
|
|
14
|
+
<%s key={someKey} {...props} />`,he,H,Vt,H),We[H+he]=!0}}return e===a?Dt(I):jt(I),I}}function Ft(e,s,f){return ze(e,s,f,!0)}function Lt(e,s,f){return ze(e,s,f,!1)}var $t=Lt,Ut=Ft;J.Fragment=a,J.jsx=$t,J.jsxs=Ut})()),J}var Xe;function kr(){return Xe||(Xe=1,process.env.NODE_ENV==="production"?ae.exports=wr():ae.exports=br()),ae.exports}var v=kr();const ot="platform-kit",xr=!1,ge={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error(`[${ot}]`,...t)}};class Sr extends l.Component{hasDispatched=!1;constructor(r){super(r),this.state={hasError:!1}}getMfeName(){if(this.props.mfeName)return this.props.mfeName;if(typeof window<"u"){const r=window;if(r.__MF_NAME__)return r.__MF_NAME__}return ot}shouldShowDetails(){if(this.props.showDetails!==void 0)return this.props.showDetails;if(typeof sessionStorage<"u")try{const r=sessionStorage.getItem("config");if(r){const n=JSON.parse(r);if(n.showErrorDetails!==void 0)return n.showErrorDetails}}catch{}return xr}dispatchError(r,n){if(this.hasDispatched||typeof window>"u")return;this.hasDispatched=!0;const a=this.getMfeName();ge.error("ErrorBoundary caught:",r);try{window.dispatchEvent(new CustomEvent("mfe-error",{detail:{mfeName:a,error:r.message||String(r),stack:r.stack,componentStack:n?.componentStack,timestamp:Date.now()},bubbles:!0}))}catch(u){ge.error("Failed to dispatch mfe-error event:",u)}}static getDerivedStateFromError(r){return{hasError:!0,error:r}}componentDidCatch(r,n){this.dispatchError(r,n),ge.error("Error info:",n.componentStack)}handleCopy=()=>{const r=`Error in ${this.getMfeName()}:
|
|
15
15
|
${this.state.error?.message}
|
|
16
|
-
${this.state.error?.stack}`;typeof navigator<"u"&&navigator.clipboard&&navigator.clipboard.writeText(r).then(()=>{alert("Ошибка скопирована в буфер обмена")}).catch(()=>{prompt("Скопируйте ошибку:",r)})};handleRetry=()=>{this.setState({hasError:!1,error:void 0}),this.hasDispatched=!1,typeof window<"u"&&window.location.reload()};handleGoHome=()=>{typeof window<"u"&&(window.location.href="/")};render(){if(this.state.hasError){const r=this.state.error?.message||"Unknown error",n=this.state.error?.stack||"",
|
|
16
|
+
${this.state.error?.stack}`;typeof navigator<"u"&&navigator.clipboard&&navigator.clipboard.writeText(r).then(()=>{alert("Ошибка скопирована в буфер обмена")}).catch(()=>{prompt("Скопируйте ошибку:",r)})};handleRetry=()=>{this.setState({hasError:!1,error:void 0}),this.hasDispatched=!1,typeof window<"u"&&window.location.reload()};handleGoHome=()=>{typeof window<"u"&&(window.location.href="/")};render(){if(this.state.hasError){const r=this.state.error?.message||"Unknown error",n=this.state.error?.stack||"",a=this.shouldShowDetails(),u=this.getMfeName();return v.jsxs("div",{style:{padding:"20px",textAlign:"center",color:"#d32f2f",fontFamily:"monospace",background:"#ffebee",border:"1px solid #ef5350",borderRadius:"4px",margin:"10px"},children:[v.jsxs("h2",{style:{fontSize:"16px",margin:"0 0 8px 0"},children:["⚠️ Ошибка в ",u]}),v.jsx("p",{style:{fontSize:"12px",margin:0},children:"Произошла ошибка в микрофронтенде. Сообщение отправлено в shell."}),a&&v.jsxs("details",{style:{whiteSpace:"pre-wrap",textAlign:"left",marginTop:"10px",background:"#fff",padding:"8px",borderRadius:"4px"},children:[v.jsx("summary",{style:{cursor:"pointer",fontWeight:"bold"},children:"Детали ошибки"}),v.jsxs("pre",{style:{fontSize:"11px",overflow:"auto",maxHeight:"150px",margin:"8px 0 0 0",padding:"8px",background:"#f5f5f5",borderRadius:"4px"},children:[r,n&&`
|
|
17
17
|
|
|
18
|
-
${n}`]})]}),y.jsxs("div",{style:{marginTop:"12px",display:"flex",gap:"8px",justifyContent:"center"},children:[y.jsx("button",{onClick:this.handleCopy,style:{padding:"8px 12px",background:"#666",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"📋 Копировать"}),y.jsx("button",{onClick:this.handleRetry,style:{padding:"8px 12px",background:"#d32f2f",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"🔄 Обновить"}),y.jsx("button",{onClick:this.handleGoHome,style:{padding:"8px 12px",background:"#1976d2",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"🏠 На главную"})]})]})}return this.props.children==null?null:this.props.children}}function _r(){const[t,r]=l.useState("light");return l.useEffect(()=>{const n=()=>{const p=document.body.classList.contains("dark")||document.body.classList.contains("dark-theme")||document.body.classList.contains("theme-dark")||document.body.classList.contains("bg-dark")||document.documentElement.classList.contains("dark")||document.documentElement.classList.contains("dark-theme")||window.matchMedia("(prefers-color-scheme: dark)").matches;r(p?"dark":"light"),console.log("[VersionInfo] Theme detected:",p?"dark":"light","classes:",document.body.className)};n();const i=new MutationObserver(n);i.observe(document.body,{attributes:!0,attributeFilter:["class"]});const u=window.matchMedia("(prefers-color-scheme: dark)");return u.addEventListener("change",n),()=>{i.disconnect(),u.removeEventListener("change",n)}},[]),t}const j={info:"ℹ️",code:"💻",link:"🔗",user:"👤",clock:"🕐",apps:"📦",storage:"💾",tags:"🏷️",spreadsheet:"📊"};function vr({mfeName:t}){const{data:r,isLoading:n,error:i}=Qe({mfeName:t}),[u,p]=l.useState(!1),o=_r();if(n)return y.jsxs("span",{className:"text-muted small me-2",children:[y.jsx("span",{className:"me-1",children:"⏳"}),"Загрузка..."]});if(i||!r)return y.jsxs("span",{className:"text-muted small me-2",title:`Ошибка: ${i||"нет данных"}`,children:[y.jsx("span",{className:"me-1",children:"ℹ️"}),"N/A"]});const a=r,h=a.BUILD_VERSION||a.IMAGE_VERSION||a.APP_NAME||"N/A",E=a.APP_NAME?`${a.APP_NAME}: ${h}`:h||t,c=[];return a.APP_NAME&&c.push({key:"APP_NAME",value:a.APP_NAME,label:"Приложение",icon:j.apps}),a.BUILD_VERSION&&c.push({key:"BUILD_VERSION",value:a.BUILD_VERSION,label:"Версия",icon:j.tags}),a.IMAGE_VERSION&&c.push({key:"IMAGE_VERSION",value:a.IMAGE_VERSION,label:"Образ",icon:j.storage}),a.GIT_COMMIT&&c.push({key:"GIT_COMMIT",value:a.GIT_COMMIT,label:"Commit",icon:j.spreadsheet}),a.COMMIT_SHA&&c.push({key:"COMMIT_SHA",value:a.COMMIT_SHA,label:"Commit",icon:j.spreadsheet}),a.GIT_BRANCH&&c.push({key:"GIT_BRANCH",value:a.GIT_BRANCH,label:"Ветка",icon:j.spreadsheet}),a.BUILD_BRANCH&&c.push({key:"BUILD_BRANCH",value:a.BUILD_BRANCH,label:"Ветка",icon:j.spreadsheet}),a.CI_COMMIT_AUTHOR&&c.push({key:"CI_COMMIT_AUTHOR",value:a.CI_COMMIT_AUTHOR,label:"Автор",icon:j.user}),a.CI_COMMIT_TIMESTAMP&&c.push({key:"CI_COMMIT_TIMESTAMP",value:a.CI_COMMIT_TIMESTAMP,label:"Дата",icon:j.clock}),a.BUILD_DATE&&c.push({key:"BUILD_DATE",value:a.BUILD_DATE,label:"Сборка",icon:j.clock}),a.CI_JOB_URL&&c.push({key:"CI_JOB_URL",value:a.CI_JOB_URL,label:"CI Job",icon:j.link}),a.CI_PIPELINE_URL&&c.push({key:"CI_PIPELINE_URL",value:a.CI_PIPELINE_URL,label:"Pipeline",icon:j.link}),a.CI_COMMIT_MESSAGE&&(a.CI_COMMIT_MESSAGE.length>60?a.CI_COMMIT_MESSAGE.substring(0,57)+"":a.CI_COMMIT_MESSAGE,c.push({key:"CI_COMMIT_MESSAGE",value:a.CI_COMMIT_MESSAGE,label:"Сообщение",icon:j.code})),y.jsxs("div",{style:{display:"inline-block",position:"relative"},children:[y.jsxs("button",{onClick:()=>p(!u),style:{background:"transparent",border:"none",cursor:"pointer",padding:"4px 8px",fontSize:"14px",display:"inline-flex",alignItems:"center"},title:"Информация о версии",children:[y.jsx("span",{className:"me-1",children:j.info}),y.jsx("span",{style:{color:o==="dark"?"#c4c7cc":"#212529"},children:h})]}),u&&y.jsxs("div",{style:{position:"absolute",top:"100%",right:0,zIndex:1e3,minWidth:"220px",maxWidth:"280px",background:o==="dark"?"#2d3036":"white",border:`1px solid ${o==="dark"?"#40444b":"#dee2e6"}`,borderRadius:"6px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",padding:"10px 12px",marginTop:"4px"},children:[y.jsxs("div",{style:{marginBottom:"8px",paddingBottom:"6px",borderBottom:`1px solid ${o==="dark"?"#40444b":"#dee2e6"}`,display:"flex",alignItems:"center",fontSize:"13px"},children:[y.jsx("span",{className:"me-1",children:j.apps}),y.jsx("strong",{style:{color:o==="dark"?"#e4e5e6":"#212529"},children:E})]}),c.length>0&&y.jsx("div",{style:{fontSize:"12px"},children:c.filter(g=>g.key!=="APP_NAME"&&g.key!=="BUILD_VERSION"&&g.key!=="IMAGE_VERSION").map(({key:g,value:d,label:b,icon:_})=>{const T=g.includes("URL"),C=T?"🔗":d;return y.jsxs("div",{style:{marginBottom:"4px",display:"flex",alignItems:"center"},children:[y.jsx("span",{className:"me-1",style:{flexShrink:0},children:_}),y.jsxs("span",{style:{color:o==="dark"?"#949ba3":"#6c757d",marginRight:"4px"},children:[b,":"]}),T?y.jsx("a",{href:d,target:"_blank",rel:"noopener noreferrer",style:{color:"#4da6ff",textDecoration:"none"},children:"🔗"}):y.jsx("span",{style:{color:o==="dark"?"#c4c7cc":"#212529"},children:C})]},g)})}),c.length===0&&y.jsx("div",{className:"text-center text-muted py-2 small",children:"Нет информации о версии"}),y.jsx("div",{style:{marginTop:"8px",paddingTop:"6px",borderTop:`1px solid ${o==="dark"?"#40444b":"#dee2e6"}`,textAlign:"center",fontSize:"11px",color:"#6c757d"},children:"IngoBank DevOps Platform"}),y.jsx("button",{onClick:()=>p(!1),style:{position:"absolute",top:"8px",right:"8px",background:"transparent",border:"none",cursor:"pointer",fontSize:"16px",color:"#6c757d"},children:"×"})]}),u&&y.jsx("div",{onClick:()=>p(!1),style:{position:"fixed",top:0,left:0,right:0,bottom:0,zIndex:999}})]})}const _e="platform-kit",nt=l.createContext(null);function yr({children:t}){const[r,n]=l.useState([]),i=typeof window<"u"&&window.__MF_NAME__||_e,u=l.useCallback((d,b,_,T)=>({id:`${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:d,title:b,message:_,mfeName:i,timestamp:Date.now(),duration:T}),[i]),p=l.useCallback(d=>{n(_=>[..._,d].slice(0,5));const b=d.duration||5e3;b>0&&setTimeout(()=>{n(_=>_.filter(T=>T.id!==d.id))},b)},[]),o=l.useCallback(d=>{const b=u(d.type,d.title,d.message,d.duration);p(b),typeof window<"u"&&window.dispatchEvent(new CustomEvent("mfe-notification",{detail:b,bubbles:!0}))},[u,p]),a=l.useCallback((d,b="Успешно")=>{o({type:"success",title:b,message:d})},[o]),h=l.useCallback((d,b="Ошибка")=>{o({type:"error",title:b,message:d})},[o]),E=l.useCallback((d,b="Предупреждение")=>{o({type:"warning",title:b,message:d})},[o]),c=l.useCallback((d,b="Информация")=>{o({type:"info",title:b,message:d})},[o]),g=l.useCallback(d=>{n(b=>b.filter(_=>_.id!==d))},[]);return l.useEffect(()=>{if(typeof window>"u")return;const d=b=>{const _=b.detail;if(_&&_.type&&_.title&&_.message){const T={..._,id:`${Date.now()}-${Math.random().toString(36).substr(2,9)}`};p(T)}};return window.addEventListener("mfe-notification",d),()=>{window.removeEventListener("mfe-notification",d)}},[p]),y.jsxs(nt.Provider,{value:{notify:o,notifySuccess:a,notifyError:h,notifyWarning:E,notifyInfo:c,removeNotification:g},children:[t,r.length>0&&y.jsx("div",{style:{position:"fixed",top:"80px",right:"20px",zIndex:9998,maxWidth:"400px",width:"100%",display:"flex",flexDirection:"column",gap:"8px",pointerEvents:"none"},children:r.map(d=>y.jsxs("div",{className:`notification notification-${d.type}`,style:{pointerEvents:"auto",padding:"12px 16px",borderRadius:"8px",background:d.type==="success"?"#d4edda":d.type==="error"?"#f8d7da":d.type==="warning"?"#fff3cd":"#d1ecf1",color:d.type==="success"?"#155724":d.type==="error"?"#721c24":d.type==="warning"?"#856404":"#0c5460",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",display:"flex",alignItems:"flex-start",gap:"12px"},children:[y.jsxs("div",{style:{flex:1},children:[y.jsx("strong",{style:{display:"block",marginBottom:"4px"},children:d.title}),y.jsx("p",{style:{margin:0,fontSize:"14px"},children:d.message}),y.jsx("small",{style:{opacity:.7,fontSize:"12px"},children:d.mfeName})]}),y.jsx("button",{onClick:()=>g(d.id),style:{background:"transparent",border:"none",cursor:"pointer",fontSize:"18px",lineHeight:1,opacity:.5},children:"×"})]},d.id))})]})}function Er(){const t=l.useContext(nt);return t||{notify:()=>{},notifySuccess:()=>{},notifyError:()=>{},notifyWarning:()=>{},notifyInfo:()=>{},removeNotification:()=>{}}}function br(t){if(typeof window>"u")return;const r=window.__MF_NAME__||_e,n={...t,mfeName:r,timestamp:Date.now()};window.dispatchEvent(new CustomEvent("mfe-notification",{detail:n,bubbles:!0}))}function Q(t,r){const n=r?.prefix?`[${r.prefix}]`:`[${t}]`;return{log:(...i)=>{},warn:(...i)=>{},error:(...i)=>{console.error(n,...i)},info:(...i)=>{}}}const wr=Q("platform-kit",{prefix:"AUTH"}),kr=Q("platform-kit",{prefix:"API"}),xr=Q("platform-kit",{prefix:"ERROR"}),Sr=Q("platform-kit",{prefix:"INFO"}),Ar={},Cr={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[getMfeName]",...t)}};function ye(t){return t?t.mfeName?t.mfeName:t.name?t.name.replace("@ib-dop/",""):null:null}function st(){if(typeof window>"u")return null;const t=window;return t.__MF_NAME__?t.__MF_NAME__:null}function at(){if(typeof window>"u")return null;try{const t=sessionStorage.getItem("mf-config");if(t){const r=JSON.parse(t);if(r.mfeName)return r.mfeName;if(r.name)return r.name;if(r.appName)return r.appName}}catch{}return null}function Ee(){const t=Ar;return t.VITE_MFE_NAME?String(t.VITE_MFE_NAME):t.MFE_NAME?String(t.MFE_NAME):null}let oe=null,ve=!1;function ot(t,r){const n=ye(t);if(n)return n;if(ve&&oe)return oe;const i=[{source:"window.__MF_NAME__",value:st()},{source:"sessionStorage.mf-config",value:at()},{source:"import.meta.env.VITE_MFE_NAME",value:Ee()}];for(const{source:p,value:o}of i)if(o)return oe=o,ve=!0,o;if(r)return r;const u="Cannot determine MFE name. Please pass mfeName in props, set window.__MF_NAME__, sessionStorage.mf-config, or VITE_MFE_NAME";throw Cr.error(u),new Error(u)}function Tr(t){return ot(t)}function it(t){return ye(t)?"props.mfeName":st()?"window.__MF_NAME__":at()?"sessionStorage.mf-config":Ee()?"import.meta.env.VITE_MFE_NAME":null}function Rr(t){return it(t)!==null}function Mr(){oe=null,ve=!1}function Ir(t){const r=[];return ye(t)&&r.push("props.mfeName"),typeof window<"u"&&(window.__MF_NAME__&&r.push("window.__MF_NAME__"),sessionStorage.getItem("mf-config")&&r.push("sessionStorage.mf-config")),Ee()&&r.push("import.meta.env.VITE_MFE_NAME"),r}exports.ErrorBoundary=mr;exports.NotificationProvider=yr;exports.VersionInfo=vr;exports.api=U;exports.apiLogger=kr;exports.authLogger=wr;exports.createApiClient=et;exports.createMfLogger=Q;exports.del=tr;exports.dispatchNotification=br;exports.errorLogger=xr;exports.get=Qt;exports.getAccessToken=Vt;exports.getAllMfeNameSources=Ir;exports.getAuthState=Ut;exports.getMfeName=ot;exports.getMfeNameSource=it;exports.getShellAuth=L;exports.hasMfeName=Rr;exports.infoLogger=Sr;exports.isAuthenticated=Bt;exports.logout=Ht;exports.post=Zt;exports.put=er;exports.redirectToLogin=Xe;exports.requireMfeName=Tr;exports.resetMfeNameCache=Mr;exports.useApi=X;exports.useDel=or;exports.useFeatureAdmin=lr;exports.useFeatures=cr;exports.useGet=nr;exports.useInfoData=Qe;exports.useMicrofrontendsFeatures=fr;exports.useNotification=Er;exports.usePermissions=ur;exports.usePost=sr;exports.usePut=ar;exports.useShellAuth=K;exports.useV1Config=Gt;
|
|
18
|
+
${n}`]})]}),v.jsxs("div",{style:{marginTop:"12px",display:"flex",gap:"8px",justifyContent:"center"},children:[v.jsx("button",{onClick:this.handleCopy,style:{padding:"8px 12px",background:"#666",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"📋 Копировать"}),v.jsx("button",{onClick:this.handleRetry,style:{padding:"8px 12px",background:"#d32f2f",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"🔄 Обновить"}),v.jsx("button",{onClick:this.handleGoHome,style:{padding:"8px 12px",background:"#1976d2",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"🏠 На главную"})]})]})}return this.props.children==null?null:this.props.children}}function Ar(){const[t,r]=l.useState("light");return l.useEffect(()=>{const n=()=>{const p=document.body.classList.contains("dark")||document.body.classList.contains("dark-theme")||document.body.classList.contains("theme-dark")||document.body.classList.contains("bg-dark")||document.documentElement.classList.contains("dark")||document.documentElement.classList.contains("dark-theme")||window.matchMedia("(prefers-color-scheme: dark)").matches;r(p?"dark":"light"),console.log("[VersionInfo] Theme detected:",p?"dark":"light","classes:",document.body.className)};n();const a=new MutationObserver(n);a.observe(document.body,{attributes:!0,attributeFilter:["class"]});const u=window.matchMedia("(prefers-color-scheme: dark)");return u.addEventListener("change",n),()=>{a.disconnect(),u.removeEventListener("change",n)}},[]),t}const j={info:"ℹ️",code:"💻",link:"🔗",user:"👤",clock:"🕐",apps:"📦",storage:"💾",tags:"🏷️",spreadsheet:"📊"};function Tr({mfeName:t}){const{data:r,isLoading:n,error:a}=et({mfeName:t}),[u,p]=l.useState(!1),o=Ar();if(n)return v.jsxs("span",{className:"text-muted small me-2",children:[v.jsx("span",{className:"me-1",children:"⏳"}),"Загрузка..."]});if(a||!r)return v.jsxs("span",{className:"text-muted small me-2",title:`Ошибка: ${a||"нет данных"}`,children:[v.jsx("span",{className:"me-1",children:"ℹ️"}),"N/A"]});const i=r,h=i.BUILD_VERSION||i.IMAGE_VERSION||i.APP_NAME||"N/A",E=i.APP_NAME?`${i.APP_NAME}: ${h}`:h||t,c=[];return i.APP_NAME&&c.push({key:"APP_NAME",value:i.APP_NAME,label:"Приложение",icon:j.apps}),i.BUILD_VERSION&&c.push({key:"BUILD_VERSION",value:i.BUILD_VERSION,label:"Версия",icon:j.tags}),i.IMAGE_VERSION&&c.push({key:"IMAGE_VERSION",value:i.IMAGE_VERSION,label:"Образ",icon:j.storage}),i.GIT_COMMIT&&c.push({key:"GIT_COMMIT",value:i.GIT_COMMIT,label:"Commit",icon:j.spreadsheet}),i.COMMIT_SHA&&c.push({key:"COMMIT_SHA",value:i.COMMIT_SHA,label:"Commit",icon:j.spreadsheet}),i.GIT_BRANCH&&c.push({key:"GIT_BRANCH",value:i.GIT_BRANCH,label:"Ветка",icon:j.spreadsheet}),i.BUILD_BRANCH&&c.push({key:"BUILD_BRANCH",value:i.BUILD_BRANCH,label:"Ветка",icon:j.spreadsheet}),i.CI_COMMIT_AUTHOR&&c.push({key:"CI_COMMIT_AUTHOR",value:i.CI_COMMIT_AUTHOR,label:"Автор",icon:j.user}),i.CI_COMMIT_TIMESTAMP&&c.push({key:"CI_COMMIT_TIMESTAMP",value:i.CI_COMMIT_TIMESTAMP,label:"Дата",icon:j.clock}),i.BUILD_DATE&&c.push({key:"BUILD_DATE",value:i.BUILD_DATE,label:"Сборка",icon:j.clock}),i.CI_JOB_URL&&c.push({key:"CI_JOB_URL",value:i.CI_JOB_URL,label:"CI Job",icon:j.link}),i.CI_PIPELINE_URL&&c.push({key:"CI_PIPELINE_URL",value:i.CI_PIPELINE_URL,label:"Pipeline",icon:j.link}),i.CI_COMMIT_MESSAGE&&(i.CI_COMMIT_MESSAGE.length>60?i.CI_COMMIT_MESSAGE.substring(0,57)+"":i.CI_COMMIT_MESSAGE,c.push({key:"CI_COMMIT_MESSAGE",value:i.CI_COMMIT_MESSAGE,label:"Сообщение",icon:j.code})),v.jsxs("div",{style:{display:"inline-block",position:"relative"},children:[v.jsxs("button",{onClick:()=>p(!u),style:{background:"transparent",border:"none",cursor:"pointer",padding:"4px 8px",fontSize:"14px",display:"inline-flex",alignItems:"center"},title:"Информация о версии",children:[v.jsx("span",{className:"me-1",children:j.info}),v.jsx("span",{style:{color:o==="dark"?"#c4c7cc":"#212529"},children:h})]}),u&&v.jsxs("div",{style:{position:"absolute",top:"100%",right:0,zIndex:1e3,minWidth:"220px",maxWidth:"280px",background:o==="dark"?"#2d3036":"white",border:`1px solid ${o==="dark"?"#40444b":"#dee2e6"}`,borderRadius:"6px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",padding:"10px 12px",marginTop:"4px"},children:[v.jsxs("div",{style:{marginBottom:"8px",paddingBottom:"6px",borderBottom:`1px solid ${o==="dark"?"#40444b":"#dee2e6"}`,display:"flex",alignItems:"center",fontSize:"13px"},children:[v.jsx("span",{className:"me-1",children:j.apps}),v.jsx("strong",{style:{color:o==="dark"?"#e4e5e6":"#212529"},children:E})]}),c.length>0&&v.jsx("div",{style:{fontSize:"12px"},children:c.filter(m=>m.key!=="APP_NAME"&&m.key!=="BUILD_VERSION"&&m.key!=="IMAGE_VERSION").map(({key:m,value:d,label:w,icon:_})=>{const C=m.includes("URL"),T=C?"🔗":d;return v.jsxs("div",{style:{marginBottom:"4px",display:"flex",alignItems:"center"},children:[v.jsx("span",{className:"me-1",style:{flexShrink:0},children:_}),v.jsxs("span",{style:{color:o==="dark"?"#949ba3":"#6c757d",marginRight:"4px"},children:[w,":"]}),C?v.jsx("a",{href:d,target:"_blank",rel:"noopener noreferrer",style:{color:"#4da6ff",textDecoration:"none"},children:"🔗"}):v.jsx("span",{style:{color:o==="dark"?"#c4c7cc":"#212529"},children:T})]},m)})}),c.length===0&&v.jsx("div",{className:"text-center text-muted py-2 small",children:"Нет информации о версии"}),v.jsx("div",{style:{marginTop:"8px",paddingTop:"6px",borderTop:`1px solid ${o==="dark"?"#40444b":"#dee2e6"}`,textAlign:"center",fontSize:"11px",color:"#6c757d"},children:"IngoBank DevOps Platform"}),v.jsx("button",{onClick:()=>p(!1),style:{position:"absolute",top:"8px",right:"8px",background:"transparent",border:"none",cursor:"pointer",fontSize:"16px",color:"#6c757d"},children:"×"})]}),u&&v.jsx("div",{onClick:()=>p(!1),style:{position:"fixed",top:0,left:0,right:0,bottom:0,zIndex:999}})]})}const _e="platform-kit",it=l.createContext(null);function Cr({children:t}){const[r,n]=l.useState([]),a=typeof window<"u"&&window.__MF_NAME__||_e,u=l.useCallback((d,w,_,C)=>({id:`${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:d,title:w,message:_,mfeName:a,timestamp:Date.now(),duration:C}),[a]),p=l.useCallback(d=>{n(_=>[..._,d].slice(0,5));const w=d.duration||5e3;w>0&&setTimeout(()=>{n(_=>_.filter(C=>C.id!==d.id))},w)},[]),o=l.useCallback(d=>{const w=u(d.type,d.title,d.message,d.duration);p(w),typeof window<"u"&&window.dispatchEvent(new CustomEvent("mfe-notification",{detail:w,bubbles:!0}))},[u,p]),i=l.useCallback((d,w="Успешно")=>{o({type:"success",title:w,message:d})},[o]),h=l.useCallback((d,w="Ошибка")=>{o({type:"error",title:w,message:d})},[o]),E=l.useCallback((d,w="Предупреждение")=>{o({type:"warning",title:w,message:d})},[o]),c=l.useCallback((d,w="Информация")=>{o({type:"info",title:w,message:d})},[o]),m=l.useCallback(d=>{n(w=>w.filter(_=>_.id!==d))},[]);return l.useEffect(()=>{if(typeof window>"u")return;const d=w=>{const _=w.detail;if(_&&_.type&&_.title&&_.message){const C={..._,id:`${Date.now()}-${Math.random().toString(36).substr(2,9)}`};p(C)}};return window.addEventListener("mfe-notification",d),()=>{window.removeEventListener("mfe-notification",d)}},[p]),v.jsxs(it.Provider,{value:{notify:o,notifySuccess:i,notifyError:h,notifyWarning:E,notifyInfo:c,removeNotification:m},children:[t,r.length>0&&v.jsx("div",{style:{position:"fixed",top:"80px",right:"20px",zIndex:9998,maxWidth:"400px",width:"100%",display:"flex",flexDirection:"column",gap:"8px",pointerEvents:"none"},children:r.map(d=>v.jsxs("div",{className:`notification notification-${d.type}`,style:{pointerEvents:"auto",padding:"12px 16px",borderRadius:"8px",background:d.type==="success"?"#d4edda":d.type==="error"?"#f8d7da":d.type==="warning"?"#fff3cd":"#d1ecf1",color:d.type==="success"?"#155724":d.type==="error"?"#721c24":d.type==="warning"?"#856404":"#0c5460",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",display:"flex",alignItems:"flex-start",gap:"12px"},children:[v.jsxs("div",{style:{flex:1},children:[v.jsx("strong",{style:{display:"block",marginBottom:"4px"},children:d.title}),v.jsx("p",{style:{margin:0,fontSize:"14px"},children:d.message}),v.jsx("small",{style:{opacity:.7,fontSize:"12px"},children:d.mfeName})]}),v.jsx("button",{onClick:()=>m(d.id),style:{background:"transparent",border:"none",cursor:"pointer",fontSize:"18px",lineHeight:1,opacity:.5},children:"×"})]},d.id))})]})}function Rr(){const t=l.useContext(it);return t||{notify:()=>{},notifySuccess:()=>{},notifyError:()=>{},notifyWarning:()=>{},notifyInfo:()=>{},removeNotification:()=>{}}}function Mr(t){if(typeof window>"u")return;const r=window.__MF_NAME__||_e,n={...t,mfeName:r,timestamp:Date.now()};window.dispatchEvent(new CustomEvent("mfe-notification",{detail:n,bubbles:!0}))}function Q(t,r){const n=r?.prefix?`[${r.prefix}]`:`[${t}]`;return{log:(...a)=>{},warn:(...a)=>{},error:(...a)=>{console.error(n,...a)},info:(...a)=>{}}}const Ir=Q("platform-kit",{prefix:"AUTH"}),Nr=Q("platform-kit",{prefix:"API"}),Pr=Q("platform-kit",{prefix:"ERROR"}),Or=Q("platform-kit",{prefix:"INFO"}),jr={},Dr={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[getMfeName]",...t)}};function ve(t){return t?t.mfeName?t.mfeName:t.name?t.name.replace("@ib-dop/",""):null:null}function ut(){if(typeof window>"u")return null;const t=window;return t.__MF_NAME__?t.__MF_NAME__:null}function ct(){if(typeof window>"u")return null;try{const t=sessionStorage.getItem("mf-config");if(t){const r=JSON.parse(t);if(r.mfeName)return r.mfeName;if(r.name)return r.name;if(r.appName)return r.appName}}catch{}return null}function Ee(){const t=jr;return t.VITE_MFE_NAME?String(t.VITE_MFE_NAME):t.MFE_NAME?String(t.MFE_NAME):null}let oe=null,ye=!1;function lt(t,r){const n=ve(t);if(n)return n;if(ye&&oe)return oe;const a=[{source:"window.__MF_NAME__",value:ut()},{source:"sessionStorage.mf-config",value:ct()},{source:"import.meta.env.VITE_MFE_NAME",value:Ee()}];for(const{source:p,value:o}of a)if(o)return oe=o,ye=!0,o;if(r)return r;const u="Cannot determine MFE name. Please pass mfeName in props, set window.__MF_NAME__, sessionStorage.mf-config, or VITE_MFE_NAME";throw Dr.error(u),new Error(u)}function Fr(t){return lt(t)}function ft(t){return ve(t)?"props.mfeName":ut()?"window.__MF_NAME__":ct()?"sessionStorage.mf-config":Ee()?"import.meta.env.VITE_MFE_NAME":null}function Lr(t){return ft(t)!==null}function $r(){oe=null,ye=!1}function Ur(t){const r=[];return ve(t)&&r.push("props.mfeName"),typeof window<"u"&&(window.__MF_NAME__&&r.push("window.__MF_NAME__"),sessionStorage.getItem("mf-config")&&r.push("sessionStorage.mf-config")),Ee()&&r.push("import.meta.env.VITE_MFE_NAME"),r}exports.ErrorBoundary=Sr;exports.NotificationProvider=Cr;exports.VersionInfo=Tr;exports.api=U;exports.apiLogger=Nr;exports.attachTraceparentToAxios=rt;exports.authLogger=Ir;exports.createApiClient=st;exports.createMfLogger=Q;exports.del=lr;exports.dispatchNotification=Mr;exports.errorLogger=Pr;exports.get=ir;exports.getAccessToken=Wt;exports.getAllMfeNameSources=Ur;exports.getAuthState=Ht;exports.getMfeName=lt;exports.getMfeNameSource=ft;exports.getShellAuth=L;exports.hasMfeName=Lr;exports.infoLogger=Or;exports.isAuthenticated=zt;exports.logout=Gt;exports.post=ur;exports.put=cr;exports.redirectToLogin=Ze;exports.requireMfeName=Fr;exports.resetMfeNameCache=$r;exports.useApi=X;exports.useDel=mr;exports.useFeatureAdmin=vr;exports.useFeatures=yr;exports.useGet=dr;exports.useInfoData=et;exports.useMicrofrontendsFeatures=Er;exports.useNotification=Rr;exports.usePermissions=_r;exports.usePost=pr;exports.usePut=hr;exports.useShellAuth=K;exports.useV1Config=Jt;
|