@fozy-labs/rx-toolkit 0.5.3-rc.2 → 0.5.4

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 (196) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +143 -137
  3. package/dist/common/devtools/combineDevtools.js +3 -3
  4. package/dist/common/devtools/index.d.ts +3 -3
  5. package/dist/common/devtools/index.js +3 -3
  6. package/dist/common/devtools/reduxDevtools.d.ts +1 -1
  7. package/dist/common/devtools/reduxDevtools.js +17 -17
  8. package/dist/common/devtools/types.d.ts +0 -6
  9. package/dist/common/options/SharedOptions.d.ts +1 -0
  10. package/dist/common/options/SharedOptions.js +6 -0
  11. package/dist/common/options/index.d.ts +1 -1
  12. package/dist/common/options/index.js +1 -1
  13. package/dist/common/react/index.d.ts +2 -2
  14. package/dist/common/react/index.js +2 -2
  15. package/dist/common/react/useConstant.js +1 -1
  16. package/dist/common/utils/deepEqual.js +1 -1
  17. package/dist/common/utils/index.d.ts +3 -3
  18. package/dist/common/utils/index.js +3 -3
  19. package/dist/common/utils/shallowEqual.js +1 -1
  20. package/dist/index.d.ts +8 -7
  21. package/dist/index.js +8 -7
  22. package/dist/query/SKIP_TOKEN.js +1 -1
  23. package/dist/query/api/createCommand.d.ts +1 -1
  24. package/dist/query/api/createOperation.d.ts +1 -1
  25. package/dist/query/api/createOperation.js +1 -1
  26. package/dist/query/api/createResource.d.ts +1 -1
  27. package/dist/query/api/createResourceDuplicator.d.ts +1 -1
  28. package/dist/query/core/Command/Command.d.ts +7 -7
  29. package/dist/query/core/Command/Command.js +2 -2
  30. package/dist/query/core/Command/CommandAgent.d.ts +1 -1
  31. package/dist/query/core/Command/index.d.ts +2 -2
  32. package/dist/query/core/Command/index.js +2 -2
  33. package/dist/query/core/{Opertation → Operation}/Operation.d.ts +2 -2
  34. package/dist/query/core/{Opertation → Operation}/Operation.js +1 -1
  35. package/dist/query/core/{Opertation → Operation}/OperationAgent.d.ts +1 -1
  36. package/dist/query/core/{Opertation → Operation}/OperationAgent.js +1 -1
  37. package/dist/query/core/QueriesCache.d.ts +1 -1
  38. package/dist/query/core/QueriesCache.js +1 -1
  39. package/dist/query/core/QueriesLifetimeHooks.js +7 -7
  40. package/dist/query/core/Resource/Resource.d.ts +15 -15
  41. package/dist/query/core/Resource/Resource.js +7 -7
  42. package/dist/query/core/Resource/ResourceAgent.d.ts +1 -1
  43. package/dist/query/core/Resource/ResourceAgent.js +2 -2
  44. package/dist/query/core/Resource/ResourceDuplicator.d.ts +16 -16
  45. package/dist/query/core/Resource/ResourceDuplicator.js +18 -20
  46. package/dist/query/core/Resource/ResourceDuplicatorAgent.d.ts +5 -5
  47. package/dist/query/core/Resource/ResourceDuplicatorAgent.js +2 -2
  48. package/dist/query/core/Resource/ResourceRef.d.ts +2 -2
  49. package/dist/query/core/Resource/ResourceRef.js +12 -12
  50. package/dist/query/index.d.ts +11 -10
  51. package/dist/query/index.js +11 -10
  52. package/dist/query/lib/IndirectMap.js +4 -4
  53. package/dist/query/react/useCommandAgent.d.ts +2 -2
  54. package/dist/query/react/useOperationAgent.d.ts +1 -1
  55. package/dist/query/react/useOperationAgent.js +1 -1
  56. package/dist/query/react/useResourceAgent.d.ts +3 -3
  57. package/dist/query/react/useResourceAgent.js +1 -1
  58. package/dist/query/react/useResourceRef.d.ts +3 -3
  59. package/dist/query/react/useResourceRef.js +7 -2
  60. package/dist/query/types/Command.types.d.ts +1 -1
  61. package/dist/query/types/Operation.types.d.ts +1 -1
  62. package/dist/query/types/Resource.types.d.ts +7 -5
  63. package/dist/query/types/index.d.ts +4 -4
  64. package/dist/query/types/index.js +4 -4
  65. package/dist/query-v2/api/createApi.d.ts +10 -0
  66. package/dist/query-v2/api/createApi.js +83 -0
  67. package/dist/query-v2/core/common/CacheEntry.d.ts +29 -0
  68. package/dist/query-v2/core/common/CacheEntry.js +71 -0
  69. package/dist/query-v2/core/common/CacheMap.d.ts +38 -0
  70. package/dist/query-v2/core/common/CacheMap.js +127 -0
  71. package/dist/query-v2/core/common/LifecycleHooks.d.ts +22 -0
  72. package/dist/query-v2/core/common/LifecycleHooks.js +104 -0
  73. package/dist/query-v2/core/common/index.d.ts +3 -0
  74. package/dist/query-v2/core/common/index.js +3 -0
  75. package/dist/query-v2/core/index.d.ts +3 -0
  76. package/dist/query-v2/core/index.js +3 -0
  77. package/dist/query-v2/core/machines/Machine.d.ts +14 -0
  78. package/dist/query-v2/core/machines/Machine.js +33 -0
  79. package/dist/query-v2/core/machines/MachineError.d.ts +11 -0
  80. package/dist/query-v2/core/machines/MachineError.js +26 -0
  81. package/dist/query-v2/core/machines/MachineIdle.d.ts +8 -0
  82. package/dist/query-v2/core/machines/MachineIdle.js +19 -0
  83. package/dist/query-v2/core/machines/MachinePending.d.ts +12 -0
  84. package/dist/query-v2/core/machines/MachinePending.js +29 -0
  85. package/dist/query-v2/core/machines/MachineRefreshing.d.ts +14 -0
  86. package/dist/query-v2/core/machines/MachineRefreshing.js +46 -0
  87. package/dist/query-v2/core/machines/MachineSuccess.d.ts +16 -0
  88. package/dist/query-v2/core/machines/MachineSuccess.js +42 -0
  89. package/dist/query-v2/core/machines/MachineWithData.d.ts +18 -0
  90. package/dist/query-v2/core/machines/MachineWithData.js +40 -0
  91. package/dist/query-v2/core/machines/Patcher.d.ts +20 -0
  92. package/dist/query-v2/core/machines/Patcher.js +104 -0
  93. package/dist/query-v2/core/machines/index.d.ts +8 -0
  94. package/dist/query-v2/core/machines/index.js +8 -0
  95. package/dist/query-v2/core/resource/ResourceV2.d.ts +120 -0
  96. package/dist/query-v2/core/resource/ResourceV2.js +464 -0
  97. package/dist/query-v2/core/resource/ResourceV2Agent.d.ts +26 -0
  98. package/dist/query-v2/core/resource/ResourceV2Agent.js +132 -0
  99. package/dist/query-v2/core/resource/index.d.ts +2 -0
  100. package/dist/query-v2/core/resource/index.js +2 -0
  101. package/dist/query-v2/index.d.ts +11 -0
  102. package/dist/query-v2/index.js +17 -0
  103. package/dist/query-v2/lib/NO_VALUE.d.ts +2 -0
  104. package/dist/query-v2/lib/NO_VALUE.js +1 -0
  105. package/dist/query-v2/lib/SKIP_TOKEN.d.ts +2 -0
  106. package/dist/query-v2/lib/SKIP_TOKEN.js +1 -0
  107. package/dist/query-v2/lib/index.d.ts +4 -0
  108. package/dist/query-v2/lib/index.js +3 -0
  109. package/dist/query-v2/lib/stableStringify.d.ts +8 -0
  110. package/dist/query-v2/lib/stableStringify.js +23 -0
  111. package/dist/query-v2/plugins/ReactHooksPlugin.d.ts +25 -0
  112. package/dist/query-v2/plugins/ReactHooksPlugin.js +19 -0
  113. package/dist/query-v2/plugins/types.d.ts +1 -0
  114. package/dist/query-v2/plugins/types.js +1 -0
  115. package/dist/query-v2/react/__tests__/helpers.d.ts +12 -0
  116. package/dist/query-v2/react/__tests__/helpers.js +33 -0
  117. package/dist/query-v2/react/index.d.ts +2 -0
  118. package/dist/query-v2/react/index.js +2 -0
  119. package/dist/query-v2/react/useResourceV2Agent.d.ts +12 -0
  120. package/dist/query-v2/react/useResourceV2Agent.js +36 -0
  121. package/dist/query-v2/react/useResourceV2Ref.d.ts +12 -0
  122. package/dist/query-v2/react/useResourceV2Ref.js +57 -0
  123. package/dist/query-v2/snapshot/Snapshot.d.ts +13 -0
  124. package/dist/query-v2/snapshot/Snapshot.js +76 -0
  125. package/dist/query-v2/types/agent.types.d.ts +54 -0
  126. package/dist/query-v2/types/agent.types.js +1 -0
  127. package/dist/query-v2/types/api.types.d.ts +22 -0
  128. package/dist/query-v2/types/api.types.js +1 -0
  129. package/dist/query-v2/types/cache.types.d.ts +37 -0
  130. package/dist/query-v2/types/cache.types.js +1 -0
  131. package/dist/query-v2/types/index.d.ts +9 -0
  132. package/dist/query-v2/types/index.js +9 -0
  133. package/dist/query-v2/types/lifecycle.types.d.ts +25 -0
  134. package/dist/query-v2/types/lifecycle.types.js +1 -0
  135. package/dist/query-v2/types/machine.types.d.ts +67 -0
  136. package/dist/query-v2/types/machine.types.js +1 -0
  137. package/dist/query-v2/types/plugin.types.d.ts +38 -0
  138. package/dist/query-v2/types/plugin.types.js +1 -0
  139. package/dist/query-v2/types/resource.types.d.ts +35 -0
  140. package/dist/query-v2/types/resource.types.js +1 -0
  141. package/dist/query-v2/types/shared.types.d.ts +20 -0
  142. package/dist/query-v2/types/shared.types.js +1 -0
  143. package/dist/query-v2/types/snapshot.types.d.ts +21 -0
  144. package/dist/query-v2/types/snapshot.types.js +1 -0
  145. package/dist/signals/base/Batcher.js +9 -5
  146. package/dist/signals/base/ComputeCache.js +3 -3
  147. package/dist/signals/base/DependencyTracker.js +1 -1
  148. package/dist/signals/base/Devtools.d.ts +3 -2
  149. package/dist/signals/base/Devtools.js +54 -27
  150. package/dist/signals/base/Indexer.js +1 -1
  151. package/dist/signals/base/ReadonlySignal.js +1 -1
  152. package/dist/signals/base/SyncObservable.d.ts +1 -2
  153. package/dist/signals/base/SyncObservable.js +2 -5
  154. package/dist/signals/base/index.d.ts +6 -6
  155. package/dist/signals/base/index.js +6 -6
  156. package/dist/signals/index.d.ts +5 -4
  157. package/dist/signals/index.js +5 -4
  158. package/dist/signals/operators/index.d.ts +1 -1
  159. package/dist/signals/operators/index.js +1 -1
  160. package/dist/signals/react/index.d.ts +1 -1
  161. package/dist/signals/react/index.js +1 -1
  162. package/dist/signals/signals/Computed.d.ts +3 -4
  163. package/dist/signals/signals/Computed.js +18 -10
  164. package/dist/signals/signals/Effect.js +2 -1
  165. package/dist/signals/signals/LocalState.d.ts +3 -4
  166. package/dist/signals/signals/LocalState.js +8 -8
  167. package/dist/signals/signals/Signal.d.ts +7 -6
  168. package/dist/signals/signals/Signal.js +4 -1
  169. package/dist/signals/signals/State.d.ts +4 -5
  170. package/dist/signals/signals/State.js +23 -9
  171. package/dist/signals/signals/index.d.ts +5 -5
  172. package/dist/signals/signals/index.js +5 -6
  173. package/dist/signals/types/SignalOptions.d.ts +16 -0
  174. package/dist/signals/types/SignalOptions.js +1 -0
  175. package/dist/signals/types/index.d.ts +3 -1
  176. package/dist/signals/types/index.js +3 -1
  177. package/dist/signals/types/normalizeSignalOptions.d.ts +2 -0
  178. package/dist/signals/types/normalizeSignalOptions.js +10 -0
  179. package/dist/signals/types/signals.types.d.ts +2 -3
  180. package/docs/CHANGELOG.md +95 -90
  181. package/docs/CONTRIBUTING.md +230 -0
  182. package/docs/contributing/ai-assisted-development.md +47 -0
  183. package/docs/contributing/query-v2/README.md +379 -0
  184. package/docs/{release → contributing/release}/README.md +59 -59
  185. package/docs/devtools/README.md +228 -228
  186. package/docs/migrations/0.5.0.md +58 -58
  187. package/docs/migrations/query-v2.md +171 -0
  188. package/docs/options/README.md +92 -92
  189. package/docs/query/README.md +575 -573
  190. package/docs/query-v2/README.md +280 -0
  191. package/docs/query-v2/api-reference.md +235 -0
  192. package/docs/query-v2/optimistic-updates.md +148 -0
  193. package/docs/query-v2/ssr.md +130 -0
  194. package/docs/signals/README.md +300 -300
  195. package/docs/usage/react/README.md +309 -309
  196. package/package.json +85 -63
@@ -1,59 +1,59 @@
1
- # Релиз
2
-
3
- Процесс выпуска новой версии RxToolkit.
4
-
5
- ## Подготовка
6
-
7
- 1. Убедитесь, что все изменения закоммичены
8
- 2. Обновите CHANGELOG (если есть)
9
- 3. Проверьте документацию
10
-
11
- ## Команды релиза
12
-
13
- ```bash
14
- # 1. Проверка типов
15
- npm run ts-check
16
-
17
- # 2. Сборка проекта
18
- npm run build
19
-
20
- # 3. Обновление версии
21
- npm version patch # для патч-версии (0.4.18 -> 0.4.19)
22
- npm version minor # для минорной версии (0.4.18 -> 0.5.0)
23
- npm version major # для мажорной версии (0.4.18 -> 1.0.0)
24
-
25
- # 4. Публикация в npm
26
- npm publish
27
-
28
- # 5. Пуш тегов в репозиторий
29
- git push origin develop --tags
30
- ```
31
-
32
- ## rc
33
-
34
- ### Выпуск релиза-кандидата (RC)
35
-
36
- ```bash
37
- # 1. Проверка типов
38
- npm run ts-check
39
-
40
- # 2. Сборка проекта
41
- npm run build
42
-
43
- # 3. Обновление версии до RC
44
- npm version prerelease --preid=rc
45
- # пример: 1.2.0 → 1.2.0-rc.0
46
-
47
- # 4. Публикация RC (НЕ latest!)
48
- npm publish --tag rc
49
-
50
- # 5. Пуш тегов
51
- git push origin develop --tags
52
- ```
53
-
54
- ### Переход с RC на stable
55
- ```bash
56
- npm version <latest_version>
57
- npm publish
58
- git push origin develop --tags
59
- ```
1
+ # Релиз
2
+
3
+ Процесс выпуска новой версии RxToolkit.
4
+
5
+ ## Подготовка
6
+
7
+ 1. Убедитесь, что все изменения закоммичены
8
+ 2. Обновите CHANGELOG (если есть)
9
+ 3. Проверьте документацию
10
+
11
+ ## Команды релиза
12
+
13
+ ```bash
14
+ # 1. Проверка типов
15
+ npm run ts-check
16
+
17
+ # 2. Сборка проекта
18
+ npm run build
19
+
20
+ # 3. Обновление версии
21
+ npm version patch # для патч-версии (0.4.18 -> 0.4.19)
22
+ npm version minor # для минорной версии (0.4.18 -> 0.5.0)
23
+ npm version major # для мажорной версии (0.4.18 -> 1.0.0)
24
+
25
+ # 4. Публикация в npm
26
+ npm publish
27
+
28
+ # 5. Пуш тегов в репозиторий
29
+ git push origin develop --tags
30
+ ```
31
+
32
+ ## rc
33
+
34
+ ### Выпуск релиза-кандидата (RC)
35
+
36
+ ```bash
37
+ # 1. Проверка типов
38
+ npm run ts-check
39
+
40
+ # 2. Сборка проекта
41
+ npm run build
42
+
43
+ # 3. Обновление версии до RC
44
+ npm version prerelease --preid=rc
45
+ # пример: 1.2.0 → 1.2.0-rc.0
46
+
47
+ # 4. Публикация RC (НЕ latest!)
48
+ npm publish --tag rc
49
+
50
+ # 5. Пуш тегов
51
+ git push origin develop --tags
52
+ ```
53
+
54
+ ### Переход с RC на stable
55
+ ```bash
56
+ npm version <latest_version>
57
+ npm publish
58
+ git push origin develop --tags
59
+ ```
@@ -1,228 +1,228 @@
1
- # Devtools
2
-
3
- RxToolkit предоставляет интеграцию с популярными инструментами разработчика для отладки реактивных приложений в реальном времени. Вы можете отслеживать изменения сигналов, выполнение команд и состояние ресурсов.
4
-
5
- **Отслеживает изменения:**
6
- - Сигналов (Signal / Computed)
7
- - Ресурсов и команд (Resource / Command)
8
-
9
- ---
10
-
11
- ## Redux DevTools
12
-
13
- Популярное браузерное расширение для отладки состояния приложений. **RxToolkit включает встроенный адаптер `reduxDevtools()`**.
14
-
15
- ### Установка
16
-
17
- 1. Установите [расширение Redux DevTools](https://github.com/reduxjs/redux-devtools) для браузера
18
- 2. Подключите в коде:
19
-
20
- ```typescript
21
- import { DefaultOptions, reduxDevtools } from '@fozy-labs/rx-toolkit';
22
-
23
- DefaultOptions.update({
24
- DEVTOOLS: reduxDevtools()
25
- });
26
- ```
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
-
53
- ## @reatom/devtools
54
-
55
- Npm пакет с встроенным отладчиком, работающим прямо в браузере. После подключения в углу страницы появляется кнопка, которая открывает панель инструментов.
56
-
57
- ### Установка
58
-
59
- ```bash
60
- npm install @reatom/devtools
61
- ```
62
-
63
- ### Подключение
64
-
65
- ```typescript
66
- import { DefaultOptions } from '@fozy-labs/rx-toolkit';
67
- import { createDevtools } from '@reatom/devtools';
68
-
69
- DefaultOptions.update({
70
- DEVTOOLS: createDevtools({
71
- initVisibility: true // Показать панель при загрузке
72
- })
73
- });
74
- ```
75
-
76
- **Может пригодиться:**
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
- ---
117
-
118
- ## Практики
119
-
120
- ### Development-режим
121
-
122
- Подключайте devtools только в режиме разработки:
123
-
124
- ```typescript
125
- // Node.js / Webpack
126
- if (process.env.NODE_ENV !== 'production') {
127
- DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
128
- }
129
-
130
- // Vite
131
- if (import.meta.env.DEV) {
132
- DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
133
- }
134
-
135
- // Next.js
136
- if (process.env.NODE_ENV === 'development') {
137
- DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
138
- }
139
- ```
140
-
141
- ### SSR-совместимость
142
-
143
- Защитите от выполнения на сервере:
144
-
145
- ```typescript
146
- if (typeof window !== 'undefined' && process.env.NODE_ENV !== 'production') {
147
- DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
148
- }
149
- ```
150
-
151
- ### Несколько инструментов
152
-
153
- Можно комбинировать несколько devtools с помощью `combineDevtools`:
154
-
155
- ```typescript
156
- import { combineDevtools, reduxDevtools, DefaultOptions } from '@fozy-labs/rx-toolkit';
157
- import { createDevtools } from '@reatom/devtools';
158
-
159
- DefaultOptions.update({
160
- DEVTOOLS: combineDevtools(
161
- reduxDevtools({ name: 'MyApp' }),
162
- createDevtools({ initVisibility: true })
163
- )
164
- });
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 = createCommand({
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 | '$COMPLETED' | '$CLEANED'): 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
-
1
+ # Devtools
2
+
3
+ RxToolkit предоставляет интеграцию с популярными инструментами разработчика для отладки реактивных приложений в реальном времени. Вы можете отслеживать изменения сигналов, выполнение команд и состояние ресурсов.
4
+
5
+ **Отслеживает изменения:**
6
+ - Сигналов (Signal / Computed)
7
+ - Ресурсов и команд (Resource / Command)
8
+
9
+ ---
10
+
11
+ ## Redux DevTools
12
+
13
+ Популярное браузерное расширение для отладки состояния приложений. **RxToolkit включает встроенный адаптер `reduxDevtools()`**.
14
+
15
+ ### Установка
16
+
17
+ 1. Установите [расширение Redux DevTools](https://github.com/reduxjs/redux-devtools) для браузера
18
+ 2. Подключите в коде:
19
+
20
+ ```typescript
21
+ import { DefaultOptions, reduxDevtools } from '@fozy-labs/rx-toolkit';
22
+
23
+ DefaultOptions.update({
24
+ DEVTOOLS: reduxDevtools()
25
+ });
26
+ ```
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
+
53
+ ## @reatom/devtools
54
+
55
+ Npm пакет с встроенным отладчиком, работающим прямо в браузере. После подключения в углу страницы появляется кнопка, которая открывает панель инструментов.
56
+
57
+ ### Установка
58
+
59
+ ```bash
60
+ npm install @reatom/devtools
61
+ ```
62
+
63
+ ### Подключение
64
+
65
+ ```typescript
66
+ import { DefaultOptions } from '@fozy-labs/rx-toolkit';
67
+ import { createDevtools } from '@reatom/devtools';
68
+
69
+ DefaultOptions.update({
70
+ DEVTOOLS: createDevtools({
71
+ initVisibility: true // Показать панель при загрузке
72
+ })
73
+ });
74
+ ```
75
+
76
+ **Может пригодиться:**
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
+ ---
117
+
118
+ ## Практики
119
+
120
+ ### Development-режим
121
+
122
+ Подключайте devtools только в режиме разработки:
123
+
124
+ ```typescript
125
+ // Node.js / Webpack
126
+ if (process.env.NODE_ENV !== 'production') {
127
+ DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
128
+ }
129
+
130
+ // Vite
131
+ if (import.meta.env.DEV) {
132
+ DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
133
+ }
134
+
135
+ // Next.js
136
+ if (process.env.NODE_ENV === 'development') {
137
+ DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
138
+ }
139
+ ```
140
+
141
+ ### SSR-совместимость
142
+
143
+ Защитите от выполнения на сервере:
144
+
145
+ ```typescript
146
+ if (typeof window !== 'undefined' && process.env.NODE_ENV !== 'production') {
147
+ DefaultOptions.update({ DEVTOOLS: reduxDevtools() });
148
+ }
149
+ ```
150
+
151
+ ### Несколько инструментов
152
+
153
+ Можно комбинировать несколько devtools с помощью `combineDevtools`:
154
+
155
+ ```typescript
156
+ import { combineDevtools, reduxDevtools, DefaultOptions } from '@fozy-labs/rx-toolkit';
157
+ import { createDevtools } from '@reatom/devtools';
158
+
159
+ DefaultOptions.update({
160
+ DEVTOOLS: combineDevtools(
161
+ reduxDevtools({ name: 'MyApp' }),
162
+ createDevtools({ initVisibility: true })
163
+ )
164
+ });
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 = createCommand({
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 | '$COMPLETED' | '$CLEANED'): 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
+