@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 CHANGED
@@ -2,73 +2,202 @@
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/@inso_web/els-react.svg)](https://www.npmjs.com/package/@inso_web/els-react)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/@inso_web/els-react.svg)](https://www.npmjs.com/package/@inso_web/els-react)
5
- [![bundle size](https://img.shields.io/bundlephobia/minzip/@inso_web/els-react)](https://bundlephobia.com/package/@inso_web/els-react)
6
5
  [![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue.svg)](https://www.typescriptlang.org/)
7
6
  [![license MIT](https://img.shields.io/npm/l/@inso_web/els-react.svg)](./LICENSE)
8
7
 
9
- React‑обёртка для [`@inso_web/els-client`](https://www.npmjs.com/package/@inso_web/els-client): Provider, hooks и ErrorBoundary для автоматического сбора ошибок в React 17+.
8
+ React-обёртка для **Error Logs Service (ELS)**: `<ELSProvider>` для DI клиента, hook `useELS()`, готовый `<ErrorBoundary>` с автоматической отправкой ошибок render-фазы. React 17+.
10
9
 
11
- ## Фичи
10
+ ## Что внутри
12
11
 
13
- - `ELSProvider`инициализация клиента и очереди
14
- - `useELS()` — доступ к клиенту
15
- - `useErrorReporter()`хук для ручного репорта ошибок
16
- - `ELSErrorBoundary` — ловит исключения в дереве и отправляет в ELS
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
- ## Quick Start
17
+ ---
18
+
19
+ ## UI: что вы получаете
20
+
21
+ ELS из коробки даёт админ-панель — все события из вашего React приложения попадают в неё.
22
+
23
+ ### Список логов с фильтрами
24
+
25
+ ![Список логов](./docs/screenshots/01-error-logs-list.png)
26
+
27
+ Виртуальная таблица всех событий: trace ID, приложение, источник (client/server), уровень, сообщение, страница, IP. Левый сайдбар — фасеты по приложению, окружению, **версии**, источнику, уровню, браузеру, языку, IP, категории ошибки.
28
+
29
+ ### Детальная карточка с метаданными
30
+
31
+ ![Детальная карточка](./docs/screenshots/02-event-detail-info.png)
32
+
33
+ Время сервера/клиента, IP с гео, окружение, **версия приложения**, fingerprint, session ID. Карточки повторений и корреляция событий справа.
34
+
35
+ ### AI-диагностика ошибок
36
+
37
+ ![AI диагностика](./docs/screenshots/03-error-detail-ai.png)
38
+
39
+ Stack trace с распарсенными фреймами + AI-анализ что именно сломалось и как чинить. Для React-ошибок дополнительно сохраняется `componentStack`.
40
+
41
+ ### Аналитика и регрессии по версиям
42
+
43
+ ![Аналитика](./docs/screenshots/04-analytics-dashboard.png)
44
+
45
+ Total / critical+errors / warnings / error rate. AI-обзор слева, timeline в центре, donut'ы по приложению/источнику/уровню. **Виджет «Регрессии»**: какие fingerprint'ы появились впервые в свежей версии и какие пропали.
46
+
47
+ ### Управление API-ключами
48
+
49
+ ![API ключи](./docs/screenshots/05-api-keys.png)
50
+ ![Действия с ключом](./docs/screenshots/06-api-key-actions.png)
51
+
52
+ Scoped-ключи (write/read/read-any), live/test environments, ротация без даунтайма.
53
+
54
+ ### Избранные события
55
+
56
+ ![Избранные](./docs/screenshots/07-favorites.png)
57
+
58
+ Закладки на конкретные trace ID — для расследований, не теряются между сессиями.
59
+
60
+ ---
61
+
62
+ ## Установка
21
63
 
22
64
  ```bash
23
- npm install @inso_web/els-react @inso_web/els-client
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 { ELSProvider, ELSErrorBoundary, useErrorReporter } from '@inso_web/els-react';
28
-
29
- function App() {
30
- return (
31
- <ELSProvider config={{
32
- endpoint: 'https://api.insoweb.ru/els',
33
- apiKey: import.meta.env.VITE_ELS_KEY,
34
- appSlug: 'my-app',
35
- deploymentEnv: 'PRODUCTION',
36
- }}>
37
- <ELSErrorBoundary fallback={<div>Что‑то пошло не так</div>}>
38
- <MyApp />
39
- </ELSErrorBoundary>
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
- function MyComponent() {
45
- const report = useErrorReporter();
46
- return <button onClick={() => report(new Error('manual'))}>report</button>;
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
- ```ts
53
- <ELSProvider
54
- config={ELSConfig}
55
- useQueue={boolean} // default true
56
- flushIntervalMs={number}
57
- maxBatchSize={number}
58
- captureGlobalErrors={boolean} // default true
59
- />
60
-
61
- useELS(): { client, queue }
62
- useErrorReporter(): (err, extra?) => void
63
- <ELSErrorBoundary fallback={...} onError={(err, info) => ...} />
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
- ## Examples
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
- Runnable примеры: [`./examples/`](./examples/)
198
+ Либо используйте обёртки next/nest которые уже имеют такой guard.
70
199
 
71
- - `vite-react` — Vite + React 18 + TypeScript starter
200
+ ---
72
201
 
73
202
  ## License
74
203
 
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inso_web/els-react",
3
- "version": "0.3.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.3.0"
54
+ "@inso_web/els-client": "^0.4.1"
54
55
  },
55
56
  "devDependencies": {
56
57
  "@testing-library/react": "^14.1.2",