@inso_web/els-react 0.3.0 → 0.4.1
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 +174 -45
- package/docs/screenshots/01-error-logs-list.png +0 -0
- package/docs/screenshots/02-event-detail-info.png +0 -0
- package/docs/screenshots/03-error-detail-ai.png +0 -0
- package/docs/screenshots/04-analytics-dashboard.png +0 -0
- package/docs/screenshots/05-api-keys.png +0 -0
- package/docs/screenshots/06-api-key-actions.png +0 -0
- package/docs/screenshots/07-favorites.png +0 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -2,73 +2,202 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@inso_web/els-react)
|
|
4
4
|
[](https://www.npmjs.com/package/@inso_web/els-react)
|
|
5
|
-
[](https://bundlephobia.com/package/@inso_web/els-react)
|
|
6
5
|
[](https://www.typescriptlang.org/)
|
|
7
6
|
[](./LICENSE)
|
|
8
7
|
|
|
9
|
-
React
|
|
8
|
+
React-обёртка для **Error Logs Service (ELS)**: `<ELSProvider>` для DI клиента, hook `useELS()`, готовый `<ErrorBoundary>` с автоматической отправкой ошибок render-фазы. React 17+.
|
|
10
9
|
|
|
11
|
-
##
|
|
10
|
+
## Что внутри
|
|
12
11
|
|
|
13
|
-
-
|
|
14
|
-
- `useELS()` —
|
|
15
|
-
-
|
|
16
|
-
- `
|
|
17
|
-
- `withErrorReporting(Component)` — HOC
|
|
18
|
-
- Авто‑подписка на `window.onerror` и `unhandledrejection`
|
|
12
|
+
- `<ELSProvider client={...}>` — кладёт клиент в контекст.
|
|
13
|
+
- `useELS()` — hook возвращает logger.
|
|
14
|
+
- `<ELSErrorBoundary>` — error boundary который ловит render-ошибки и шлёт в ELS со stack trace + componentStack.
|
|
15
|
+
- `useGlobalErrorHandlers()` — hook для подписки на `window.error` и `unhandledrejection`.
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## UI: что вы получаете
|
|
20
|
+
|
|
21
|
+
ELS из коробки даёт админ-панель — все события из вашего React приложения попадают в неё.
|
|
22
|
+
|
|
23
|
+
### Список логов с фильтрами
|
|
24
|
+
|
|
25
|
+

|
|
26
|
+
|
|
27
|
+
Виртуальная таблица всех событий: trace ID, приложение, источник (client/server), уровень, сообщение, страница, IP. Левый сайдбар — фасеты по приложению, окружению, **версии**, источнику, уровню, браузеру, языку, IP, категории ошибки.
|
|
28
|
+
|
|
29
|
+
### Детальная карточка с метаданными
|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+
Время сервера/клиента, IP с гео, окружение, **версия приложения**, fingerprint, session ID. Карточки повторений и корреляция событий справа.
|
|
34
|
+
|
|
35
|
+
### AI-диагностика ошибок
|
|
36
|
+
|
|
37
|
+

|
|
38
|
+
|
|
39
|
+
Stack trace с распарсенными фреймами + AI-анализ что именно сломалось и как чинить. Для React-ошибок дополнительно сохраняется `componentStack`.
|
|
40
|
+
|
|
41
|
+
### Аналитика и регрессии по версиям
|
|
42
|
+
|
|
43
|
+

|
|
44
|
+
|
|
45
|
+
Total / critical+errors / warnings / error rate. AI-обзор слева, timeline в центре, donut'ы по приложению/источнику/уровню. **Виджет «Регрессии»**: какие fingerprint'ы появились впервые в свежей версии и какие пропали.
|
|
46
|
+
|
|
47
|
+
### Управление API-ключами
|
|
48
|
+
|
|
49
|
+

|
|
50
|
+

|
|
51
|
+
|
|
52
|
+
Scoped-ключи (write/read/read-any), live/test environments, ротация без даунтайма.
|
|
53
|
+
|
|
54
|
+
### Избранные события
|
|
55
|
+
|
|
56
|
+

|
|
57
|
+
|
|
58
|
+
Закладки на конкретные trace ID — для расследований, не теряются между сессиями.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Установка
|
|
21
63
|
|
|
22
64
|
```bash
|
|
23
|
-
npm install @inso_web/els-
|
|
65
|
+
npm install @inso_web/els-client @inso_web/els-react
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Quick Start
|
|
71
|
+
|
|
72
|
+
### 1. Подключите Provider
|
|
73
|
+
|
|
74
|
+
`main.tsx` (Vite) или `index.tsx` (CRA):
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
import { ELSClient } from '@inso_web/els-client';
|
|
78
|
+
import { ELSProvider } from '@inso_web/els-react';
|
|
79
|
+
import { App } from './App';
|
|
80
|
+
|
|
81
|
+
const client = new ELSClient({
|
|
82
|
+
endpoint: import.meta.env.VITE_ELS_URL,
|
|
83
|
+
apiKey: import.meta.env.VITE_ELS_API_KEY,
|
|
84
|
+
appSlug: 'my-react-app',
|
|
85
|
+
serviceName: 'web',
|
|
86
|
+
deploymentEnv: import.meta.env.PROD ? 'PRODUCTION' : 'DEV',
|
|
87
|
+
appVersion: import.meta.env.VITE_BUILD_VERSION,
|
|
88
|
+
minLevel: 'info',
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
92
|
+
<ELSProvider client={client}>
|
|
93
|
+
<App />
|
|
94
|
+
</ELSProvider>,
|
|
95
|
+
);
|
|
24
96
|
```
|
|
25
97
|
|
|
98
|
+
### 2. Логируйте через `useELS()`
|
|
99
|
+
|
|
26
100
|
```tsx
|
|
27
|
-
import {
|
|
28
|
-
|
|
29
|
-
function
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
</ELSProvider>
|
|
41
|
-
);
|
|
101
|
+
import { useELS } from '@inso_web/els-react';
|
|
102
|
+
|
|
103
|
+
export function CheckoutButton() {
|
|
104
|
+
const log = useELS();
|
|
105
|
+
const onClick = async () => {
|
|
106
|
+
log.info('Checkout started');
|
|
107
|
+
try {
|
|
108
|
+
await fetch('/api/checkout', { method: 'POST' });
|
|
109
|
+
} catch (err) {
|
|
110
|
+
log.error(err as Error, 'Checkout failed');
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
return <button onClick={onClick}>Pay</button>;
|
|
42
114
|
}
|
|
115
|
+
```
|
|
43
116
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
117
|
+
### 3. Оберните корень в `<ELSErrorBoundary>`
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
import { ELSErrorBoundary } from '@inso_web/els-react';
|
|
121
|
+
|
|
122
|
+
<ELSErrorBoundary fallback={<div>Что-то пошло не так</div>}>
|
|
123
|
+
<App />
|
|
124
|
+
</ELSErrorBoundary>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Render-ошибки автоматически пойдут в ELS с stack trace + componentStack.
|
|
128
|
+
|
|
129
|
+
### 4. Глобальные обработчики (опционально)
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
import { useGlobalErrorHandlers } from '@inso_web/els-react';
|
|
133
|
+
|
|
134
|
+
export function ErrorReporter() {
|
|
135
|
+
useGlobalErrorHandlers(); // window.error + unhandledrejection
|
|
136
|
+
return null;
|
|
47
137
|
}
|
|
48
138
|
```
|
|
49
139
|
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Версионирование
|
|
143
|
+
|
|
144
|
+
Прокидывайте версию через переменные сборки. Для Vite — `VITE_BUILD_VERSION` (Vite инлайнит на этапе build):
|
|
145
|
+
|
|
146
|
+
```Dockerfile
|
|
147
|
+
ARG VITE_BUILD_VERSION=dev
|
|
148
|
+
ENV VITE_BUILD_VERSION=$VITE_BUILD_VERSION
|
|
149
|
+
RUN npm run build
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
```yaml
|
|
153
|
+
# .gitlab-ci.yml
|
|
154
|
+
- export BUILD_VERSION=$(date -u +%Y%m%d%H%M%S)
|
|
155
|
+
- docker build --build-arg VITE_BUILD_VERSION="$BUILD_VERSION" ...
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
new ELSClient({ ..., appVersion: import.meta.env.VITE_BUILD_VERSION });
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
ELS принимает любой формат до 128 символов: semver, CalVer, date-compact, git SHA, opaque. Парсер на стороне сервера автоматически распознаёт тип и сортирует timeline.
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
50
166
|
## API
|
|
51
167
|
|
|
52
|
-
```
|
|
53
|
-
<
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
withErrorReporting(Component, boundaryProps?)
|
|
168
|
+
```tsx
|
|
169
|
+
const ELSProvider: React.FC<{ client: ELSClient; children: ReactNode }>;
|
|
170
|
+
|
|
171
|
+
function useELS(): Logger;
|
|
172
|
+
|
|
173
|
+
class ELSErrorBoundary extends React.Component<{
|
|
174
|
+
fallback?: ReactNode | ((error: Error) => ReactNode);
|
|
175
|
+
onError?: (error: Error, info: ErrorInfo) => void;
|
|
176
|
+
children: ReactNode;
|
|
177
|
+
}>;
|
|
178
|
+
|
|
179
|
+
function useGlobalErrorHandlers(opts?: { errors?: boolean; rejections?: boolean }): void;
|
|
65
180
|
```
|
|
66
181
|
|
|
67
|
-
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## FAQ
|
|
185
|
+
|
|
186
|
+
**Совместимо с React 18 / 19?** Да. Поддерживается React 17+.
|
|
187
|
+
|
|
188
|
+
**А `apiKey` для клиентского bundle — это безопасно?** Да. ELS-ключи scoped (только write для приложения), и они всё равно видны в bundle (как у Sentry public DSN).
|
|
189
|
+
|
|
190
|
+
**Что если `apiKey` пустой?** Если передать `apiKey: ''` в `new ELSClient({...})` — конструктор throw'нёт. Используйте guard в коде:
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
const client = apiKey
|
|
194
|
+
? new ELSClient({ ..., apiKey })
|
|
195
|
+
: { info: () => {}, warn: () => {}, error: () => {}, /* ... */ };
|
|
196
|
+
```
|
|
68
197
|
|
|
69
|
-
|
|
198
|
+
Либо используйте обёртки next/nest которые уже имеют такой guard.
|
|
70
199
|
|
|
71
|
-
|
|
200
|
+
---
|
|
72
201
|
|
|
73
202
|
## License
|
|
74
203
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inso_web/els-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "React‑обёртка для Error Logs Service (ELS): Provider, hooks, ErrorBoundary и HOC для автоматического репорта ошибок компонентов.",
|
|
5
5
|
"homepage": "https://api.insoweb.ru/els",
|
|
6
6
|
"author": "INSOWEB",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"dist",
|
|
20
|
+
"docs",
|
|
20
21
|
"examples",
|
|
21
22
|
"README.md",
|
|
22
23
|
"LICENSE"
|
|
@@ -50,7 +51,7 @@
|
|
|
50
51
|
"react": ">=17.0.0"
|
|
51
52
|
},
|
|
52
53
|
"dependencies": {
|
|
53
|
-
"@inso_web/els-client": "^0.
|
|
54
|
+
"@inso_web/els-client": "^0.4.1"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
57
|
"@testing-library/react": "^14.1.2",
|