@fozy-labs/rx-toolkit 0.4.17 → 0.5.0-rc.0

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.
Files changed (77) hide show
  1. package/README.md +20 -19
  2. package/dist/common/devtools/reduxDevtools.d.ts +17 -0
  3. package/dist/common/devtools/reduxDevtools.js +98 -17
  4. package/dist/common/devtools/types.d.ts +1 -0
  5. package/dist/common/options/DefaultOptions.d.ts +0 -2
  6. package/dist/common/options/DefaultOptions.js +0 -2
  7. package/dist/common/options/SharedOptions.d.ts +0 -2
  8. package/dist/common/options/SharedOptions.js +0 -1
  9. package/dist/query/api/resetAllQueriesCache.d.ts +1 -0
  10. package/dist/query/api/resetAllQueriesCache.js +4 -0
  11. package/dist/query/core/Opertation/Operation.js +10 -7
  12. package/dist/query/core/Opertation/OperationAgent.d.ts +0 -2
  13. package/dist/query/core/Opertation/OperationAgent.js +4 -21
  14. package/dist/query/core/QueriesCache.d.ts +1 -1
  15. package/dist/query/core/QueriesCache.js +2 -6
  16. package/dist/query/core/{CleanAllQueriesSignal.d.ts → ResetAllQueriesSignal.d.ts} +1 -1
  17. package/dist/query/core/ResetAllQueriesSignal.js +11 -0
  18. package/dist/query/core/Resource/Resource.js +7 -3
  19. package/dist/query/core/Resource/ResourceAgent.d.ts +2 -3
  20. package/dist/query/core/Resource/ResourceAgent.js +62 -29
  21. package/dist/query/index.d.ts +1 -1
  22. package/dist/query/index.js +1 -1
  23. package/dist/query/lib/IndirectMap.d.ts +1 -1
  24. package/dist/query/lib/IndirectMap.js +1 -1
  25. package/dist/query/lib/ReactiveCache.d.ts +1 -1
  26. package/dist/query/lib/ReactiveCache.js +2 -2
  27. package/dist/query/react/useOperationAgent.js +2 -5
  28. package/dist/query/react/useResourceAgent.js +1 -4
  29. package/dist/query/types/Operation.types.d.ts +1 -3
  30. package/dist/query/types/Resource.types.d.ts +1 -3
  31. package/dist/signals/base/Batcher.d.ts +1 -1
  32. package/dist/signals/base/Batcher.js +1 -1
  33. package/dist/signals/base/DependencyTracker.d.ts +18 -0
  34. package/dist/signals/base/DependencyTracker.js +13 -0
  35. package/dist/signals/base/Devtools.d.ts +1 -1
  36. package/dist/signals/base/Devtools.js +13 -1
  37. package/dist/signals/base/ReadonlySignal.d.ts +5 -7
  38. package/dist/signals/base/ReadonlySignal.js +20 -12
  39. package/dist/signals/base/index.d.ts +1 -2
  40. package/dist/signals/base/index.js +1 -2
  41. package/dist/signals/operators/index.d.ts +0 -2
  42. package/dist/signals/operators/index.js +0 -2
  43. package/dist/signals/operators/signalize.d.ts +2 -2
  44. package/dist/signals/operators/signalize.js +1 -1
  45. package/dist/signals/react/useSignal.d.ts +6 -2
  46. package/dist/signals/react/useSignal.js +2 -21
  47. package/dist/signals/signals/Computed.d.ts +13 -11
  48. package/dist/signals/signals/Computed.js +79 -26
  49. package/dist/signals/signals/Effect.d.ts +11 -7
  50. package/dist/signals/signals/Effect.js +60 -58
  51. package/dist/signals/signals/LocalSignal.d.ts +14 -7
  52. package/dist/signals/signals/LocalSignal.js +52 -33
  53. package/dist/signals/signals/Signal.d.ts +13 -37
  54. package/dist/signals/signals/Signal.js +44 -58
  55. package/dist/signals/types/index.d.ts +1 -0
  56. package/dist/signals/types/index.js +1 -0
  57. package/dist/signals/types/signals.types.d.ts +16 -0
  58. package/docs/CHANGELOG.md +32 -0
  59. package/docs/devtools/README.md +162 -29
  60. package/docs/migrations/0.5.0.md +73 -0
  61. package/docs/options/README.md +89 -0
  62. package/docs/query/README.md +425 -89
  63. package/docs/release/README.md +58 -6
  64. package/docs/signals/README.md +207 -34
  65. package/docs/usage/react/README.md +261 -49
  66. package/package.json +5 -5
  67. package/dist/query/api/cleanAllQueriesCache.d.ts +0 -1
  68. package/dist/query/api/cleanAllQueriesCache.js +0 -4
  69. package/dist/query/core/CleanAllQueriesSignal.js +0 -11
  70. package/dist/signals/base/Tracker.d.ts +0 -10
  71. package/dist/signals/base/Tracker.js +0 -7
  72. package/dist/signals/base/types.d.ts +0 -23
  73. package/dist/signals/operators/filterUpdates.d.ts +0 -5
  74. package/dist/signals/operators/filterUpdates.js +0 -18
  75. package/dist/signals/operators/mapSignals.d.ts +0 -3
  76. package/dist/signals/operators/mapSignals.js +0 -10
  77. /package/dist/signals/{base/types.js → types/signals.types.js} +0 -0
@@ -1,70 +1,140 @@
1
1
  # Devtools
2
2
 
3
- RxToolkit предоставляет интеграцию с популярными инструментами разработчика для отладки реактивных приложений в реальном времени. Вы можете отслеживать изменения сигналов, выполнение операций и состояние ресурсов, анализировать граф зависимостей и исследовать поведение реактивной системы.
3
+ RxToolkit предоставляет интеграцию с популярными инструментами разработчика для отладки реактивных приложений в реальном времени. Вы можете отслеживать изменения сигналов, выполнение операций и состояние ресурсов.
4
4
 
5
- **Отслеживает изменения состояния:**
6
- - Сигналов (Signal/Computed)
7
- - Ресурсов и операций (Resource/Operation)
5
+ **Отслеживает изменения:**
6
+ - Сигналов (Signal / Computed)
7
+ - Ресурсов и операций (Resource / Operation)
8
+
9
+ ---
8
10
 
9
11
  ## Redux DevTools
10
12
 
11
13
  Популярное браузерное расширение для отладки состояния приложений. **RxToolkit включает встроенный адаптер `reduxDevtools()`**.
12
14
 
13
- **Установка:**
14
- 1. Установите [расширение](https://github.com/reduxjs/redux-devtools) для браузера
15
+ ### Установка
16
+
17
+ 1. Установите [расширение Redux DevTools](https://github.com/reduxjs/redux-devtools) для браузера
15
18
  2. Подключите в коде:
16
19
 
17
20
  ```typescript
18
21
  import { DefaultOptions, reduxDevtools } from '@fozy-labs/rx-toolkit';
19
22
 
20
23
  DefaultOptions.update({
21
- DEVTOOLS: reduxDevtools()
24
+ DEVTOOLS: reduxDevtools()
22
25
  });
23
26
  ```
24
27
 
28
+ ### Опции reduxDevtools
29
+
30
+ ```typescript
31
+ reduxDevtools({
32
+ // Имя приложения в DevTools
33
+ name: 'MyApp',
34
+
35
+ // Стратегия батчинга обновлений
36
+ batchStrategy: 'microtask', // 'sync' | 'microtask' | 'task'
37
+
38
+ // Задержка для стратегии 'task' (мс)
39
+ taskDelay: 0,
40
+ })
41
+ ```
42
+
43
+ **Стратегии батчинга (batchStrategy):**
44
+
45
+ | Стратегия | Описание |
46
+ |---------------|-----------------------------------------------------------------------------------------------------------------|
47
+ | `'sync'` | Синхронное выполнение без батчинга. Каждое обновление отправляется немедленно. Интегрируется с Batcher сигналов |
48
+ | `'microtask'` | **(default)** Пакование в микротаске. Все обновления в текущем синхронном потоке объединяются |
49
+ | `'task'` | Пакование в макротаске (setTimeout) с настраиваемой задержкой |
50
+
51
+ ---
52
+
25
53
  ## @reatom/devtools
26
54
 
27
- Npm пакет, содержащий отладчик, работающий прямо в браузере.
28
- Совместим по API с `rx-toolkit`.
29
- После подключения в углу страницы появляется кнопка,
30
- которая открывает панель инструментов.
55
+ Npm пакет с встроенным отладчиком, работающим прямо в браузере. После подключения в углу страницы появляется кнопка, которая открывает панель инструментов.
56
+
57
+ ### Установка
31
58
 
32
- **Установка:**
33
59
  ```bash
34
60
  npm install @reatom/devtools
35
61
  ```
36
62
 
37
- **Подключение:**
63
+ ### Подключение
64
+
38
65
  ```typescript
39
66
  import { DefaultOptions } from '@fozy-labs/rx-toolkit';
40
67
  import { createDevtools } from '@reatom/devtools';
41
68
 
42
69
  DefaultOptions.update({
43
- DEVTOOLS: createDevtools({
44
- initVisibility: true
45
- })
70
+ DEVTOOLS: createDevtools({
71
+ initVisibility: true // Показать панель при загрузке
72
+ })
46
73
  });
47
74
  ```
48
75
 
49
76
  **Может пригодиться:**
50
- - Если в вашей среде не удобно или проблематично установить браузерное расширение.
51
- - Если вы уже работали с Reatom.
77
+ - Если в вашей среде неудобно или проблематично установить браузерное расширение
78
+ - Для мобильной отладки
79
+
80
+ ---
81
+
82
+ ## DefaultOptions
83
+
84
+ `DefaultOptions.update()` позволяет настроить глобальные опции RxToolkit:
85
+
86
+ ```typescript
87
+ import { DefaultOptions, reduxDevtools } from '@fozy-labs/rx-toolkit';
88
+ import { Observable } from 'rxjs';
89
+
90
+ DefaultOptions.update({
91
+ // Devtools интеграция
92
+ DEVTOOLS: reduxDevtools(),
93
+
94
+ // Глобальный обработчик ошибок запросов
95
+ onQueryError: (error) => {
96
+ console.error('Query error:', error);
97
+ // Можно отправить в систему мониторинга
98
+ errorTracker.capture(error);
99
+ },
100
+
101
+ // Функция для получения имени текущего scope (полезно для SSR)
102
+ getScopeName: () => {
103
+ return currentRequestId ?? null;
104
+ },
105
+ });
106
+ ```
107
+
108
+ ### Параметры DefaultOptions
109
+
110
+ | Параметр | Тип | Описание |
111
+ |----------|-----|----------|
112
+ | `DEVTOOLS` | `DevtoolsLike \| null` | Интеграция с devtools |
113
+ | `onQueryError` | `(error: unknown) => void` | Глобальный обработчик ошибок запросов |
114
+ | `getScopeName` | `() => string \| null` | Получение имени текущего scope |
115
+
116
+ ---
52
117
 
53
118
  ## Практики
54
119
 
55
120
  ### Development-режим
56
121
 
57
- Подключайте devtools только в разработке:
122
+ Подключайте devtools только в режиме разработки:
58
123
 
59
124
  ```typescript
60
- // Node.js/Webpack
125
+ // Node.js / Webpack
61
126
  if (process.env.NODE_ENV !== 'production') {
62
- DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
127
+ DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
63
128
  }
64
129
 
65
130
  // Vite
66
131
  if (import.meta.env.DEV) {
67
- DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
132
+ DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
133
+ }
134
+
135
+ // Next.js
136
+ if (process.env.NODE_ENV === 'development') {
137
+ DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
68
138
  }
69
139
  ```
70
140
 
@@ -74,22 +144,85 @@ if (import.meta.env.DEV) {
74
144
 
75
145
  ```typescript
76
146
  if (typeof window !== 'undefined' && process.env.NODE_ENV !== 'production') {
77
- DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
147
+ DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
78
148
  }
79
149
  ```
80
150
 
81
151
  ### Несколько инструментов
82
152
 
83
- Можно комбинировать несколько devtools:
153
+ Можно комбинировать несколько devtools с помощью `combineDevtools`:
84
154
 
85
155
  ```typescript
86
- import { combineDevtools, reduxDevtools } from '@fozy-labs/rx-toolkit';
156
+ import { combineDevtools, reduxDevtools, DefaultOptions } from '@fozy-labs/rx-toolkit';
87
157
  import { createDevtools } from '@reatom/devtools';
88
158
 
89
159
  DefaultOptions.update({
90
- DEVTOOLS: combineDevtools(
91
- reduxDevtools({ name: 'MyApp' }),
92
- createDevtools({ initVisibility: true })
93
- )
160
+ DEVTOOLS: combineDevtools(
161
+ reduxDevtools({ name: 'MyApp' }),
162
+ createDevtools({ initVisibility: true })
163
+ )
94
164
  });
95
165
  ```
166
+
167
+ ### Именование для devtools
168
+
169
+ При создании сигналов и запросов можно указывать имена для удобной отладки:
170
+
171
+ ```typescript
172
+ // Сигналы
173
+ const count$ = new Signal(0, 'counter');
174
+ const user$ = new Signal(null, { name: 'currentUser' });
175
+
176
+ // Ресурсы и операции
177
+ const userResource = createResource({
178
+ queryFn: fetchUser,
179
+ devtoolsName: 'user-resource', // Имя в devtools
180
+ });
181
+
182
+ const updateUser = createOperation({
183
+ queryFn: updateUserApi,
184
+ devtoolsName: 'update-user',
185
+ });
186
+
187
+ // Отключение devtools для конкретного сигнала
188
+ const internalSignal = new Signal(0, { isDisabled: true });
189
+
190
+ // Отключение devtools для ресурса
191
+ const internalResource = createResource({
192
+ queryFn: fetchInternal,
193
+ devtoolsName: false, // Не отслеживать
194
+ });
195
+ ```
196
+
197
+ ---
198
+
199
+ ## DevtoolsLike интерфейс
200
+
201
+ Если вам нужно создать кастомную интеграцию с devtools:
202
+
203
+ ```typescript
204
+ interface DevtoolsLike {
205
+ state<T>(name: string, initState: T): DevtoolsStateLike<T>;
206
+ }
207
+
208
+ interface DevtoolsStateLike<T = any> {
209
+ (newState: T): void;
210
+ }
211
+ ```
212
+
213
+ **Пример кастомного devtools:**
214
+
215
+ ```typescript
216
+ const customDevtools: DevtoolsLike = {
217
+ state(name, initState) {
218
+ console.log(`[INIT] ${name}:`, initState);
219
+
220
+ return (newState) => {
221
+ console.log(`[UPDATE] ${name}:`, newState);
222
+ };
223
+ }
224
+ };
225
+
226
+ DefaultOptions.update({ DEVTOOLS: customDevtools });
227
+ ```
228
+
@@ -0,0 +1,73 @@
1
+ # Миграция с версии 0.4.x на 0.5.0
2
+
3
+ ### Сигналы больше не наследуются от Observable
4
+
5
+ ```typescript
6
+ // Было
7
+ signal.subscribe(fn); // ❌
8
+ signal.pipe() // ❌
9
+
10
+ // Стало
11
+ signal.obs.subscribe(fn); // ✅
12
+ signal.obs.pipe() // ✅
13
+ ```
14
+
15
+ ### Сигналы больше не поддерживают `value`, `getValue()` и `next()`
16
+
17
+ ```typescript
18
+ // Было
19
+ signal.value; // ❌
20
+ signal.getValue(); // ❌
21
+ signal.next(val); // ❌
22
+ singal.value += 1; // ❌
23
+
24
+ // Стало
25
+ signal() // ✅
26
+ signal.get(); // ✅
27
+ signal.set(val); // ✅
28
+ ```
29
+
30
+ ### Computed, на который нет подписок, пересчитывается при каждом обращении.
31
+
32
+ ```typescripttypescript
33
+ // Было
34
+ const comp$ = new Computed(() => myHeavyCalc(singal.value)); // ✅ пересчитывается
35
+ comp$.get(); // ✅ берется из кеша
36
+ comp.subscribe(() => {}); // ✅ берется из кеша
37
+ comp$.get(); // ✅ берется из кеша
38
+
39
+ // Стало
40
+ const comp$ = Signal.compute(() => myHeavyCalc(singal())); // ✅ ждет
41
+ comp$.get(); // ✅ пересчитывается
42
+ comp$.subscribe(() => {}); // ✅ пересчитывается
43
+ comp$.get(); // ✅ берется из кеша
44
+ ```
45
+
46
+ ### Нет необходимости вызывать `complete()` для Signal и Computed
47
+
48
+ ```typescript
49
+ // Было
50
+ const signal = new Signal(0);
51
+ // Что-то делаем
52
+ signal.complete(); // ❌
53
+
54
+ // Стало
55
+ const signal = Signal.create(0);
56
+ // Что-то делаем
57
+ // Ничего не нужно вызывать ✅
58
+ ```
59
+
60
+ ### Новый функциональный API для создания сигналов (рекомендуется)
61
+
62
+ ```typescript
63
+ // Было
64
+ const signal = new Signal(0);
65
+ const computed = new Computed(() => signal.value * 2);
66
+ signal.value += 1; // ❌
67
+
68
+
69
+ // Стало
70
+ const signal = Signal.create(0);
71
+ const computed = Signal.compute(() => signal() * 2);
72
+ signal.set(signal.peek() + 1); // ✅
73
+ ```
@@ -0,0 +1,89 @@
1
+ # Глобальные настройки
2
+
3
+ RxToolkit предоставляет `DefaultOptions` для настройки глобального поведения библиотеки. Все настройки опциональны и применяются ко всему приложению.
4
+
5
+ ## API
6
+
7
+ ### DefaultOptions.update()
8
+
9
+ Обновляет глобальные настройки библиотеки.
10
+
11
+ ```typescript
12
+ import { DefaultOptions } from '@fozy-labs/rx-toolkit';
13
+
14
+ DefaultOptions.update({
15
+ DEVTOOLS: reduxDevtools(),
16
+ onQueryError: (error) => console.error(error),
17
+ getScopeName: () => MyScopeLibarary.getCurrentScopeName(),
18
+ });
19
+ ```
20
+
21
+ ## Параметры
22
+
23
+ ### DEVTOOLS
24
+
25
+ **См.** [Документация Devtools](../devtools/README.md)
26
+
27
+ ---
28
+
29
+ ### onQueryError
30
+
31
+ **Тип:** `(error: unknown) => void | null`
32
+ **По умолчанию:** `null`
33
+
34
+ Глобальный обработчик ошибок для всех запросов (Resources и Operations). Вызывается при каждой ошибке запроса.
35
+
36
+ ```typescript
37
+ import { DefaultOptions } from '@fozy-labs/rx-toolkit';
38
+ import * as Sentry from '@sentry/browser';
39
+
40
+ DefaultOptions.update({
41
+ onQueryError: (error) => {
42
+ // Логирование
43
+ console.error('[RxToolkit Query Error]', error);
44
+
45
+ // Отправка в систему мониторинга
46
+ Sentry.captureException(error, {
47
+ tags: { source: 'rx-toolkit-query' }
48
+ });
49
+
50
+ // Уведомление пользователя
51
+ if (error instanceof NetworkError) {
52
+ toast.error('Проблема с сетью. Попробуйте позже.');
53
+ } else if (error instanceof AuthError) {
54
+ redirectToLogin();
55
+ }
56
+ }
57
+ });
58
+ ```
59
+
60
+ ---
61
+
62
+ ### getScopeName
63
+
64
+ **Тип:** `(() => string | null) | null`
65
+ **По умолчанию:** `null`
66
+
67
+ Функция для получения имени текущего scope. Полезно для SSR, изоляции данных между запросами или многопользовательских приложений.
68
+
69
+ ```typescript
70
+ import { DefaultOptions } from '@fozy-labs/rx-toolkit';
71
+
72
+ // SSR: изоляция данных между запросами
73
+ let currentRequestId: string | null = null;
74
+
75
+ DefaultOptions.update({
76
+ getScopeName: () => currentRequestId
77
+ });
78
+
79
+ // В middleware сервера
80
+ app.use((req, res, next) => {
81
+ currentRequestId = req.id;
82
+ res.on('finish', () => {
83
+ currentRequestId = null;
84
+ });
85
+ next();
86
+ });
87
+ ```
88
+
89
+ ---