@fozy-labs/rx-toolkit 0.5.3-rc.1 → 0.5.3

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 (207) 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/DefaultOptions.d.ts +1 -1
  10. package/dist/common/options/SharedOptions.d.ts +3 -2
  11. package/dist/common/options/SharedOptions.js +6 -0
  12. package/dist/common/options/index.d.ts +1 -1
  13. package/dist/common/options/index.js +1 -1
  14. package/dist/common/react/index.d.ts +2 -2
  15. package/dist/common/react/index.js +2 -2
  16. package/dist/common/react/useConstant.js +1 -1
  17. package/dist/common/utils/deepEqual.js +1 -1
  18. package/dist/common/utils/index.d.ts +3 -3
  19. package/dist/common/utils/index.js +3 -3
  20. package/dist/common/utils/shallowEqual.js +1 -1
  21. package/dist/index.d.ts +8 -7
  22. package/dist/index.js +8 -7
  23. package/dist/query/SKIP_TOKEN.js +1 -1
  24. package/dist/query/api/createCommand.d.ts +21 -0
  25. package/dist/query/api/createCommand.js +20 -0
  26. package/dist/query/api/createOperation.d.ts +5 -3
  27. package/dist/query/api/createOperation.js +6 -2
  28. package/dist/query/api/createResource.d.ts +2 -2
  29. package/dist/query/api/createResourceDuplicator.d.ts +2 -2
  30. package/dist/query/core/Command/Command.d.ts +35 -0
  31. package/dist/query/core/{Opertation/Operation.js → Command/Command.js} +13 -14
  32. package/dist/query/core/Command/CommandAgent.d.ts +19 -0
  33. package/dist/query/core/{Opertation/OperationAgent.js → Command/CommandAgent.js} +13 -13
  34. package/dist/query/core/Command/index.d.ts +2 -0
  35. package/dist/query/core/Command/index.js +2 -0
  36. package/dist/query/core/Operation/Operation.d.ts +8 -0
  37. package/dist/query/core/Operation/Operation.js +4 -0
  38. package/dist/query/core/Operation/OperationAgent.d.ts +4 -0
  39. package/dist/query/core/Operation/OperationAgent.js +4 -0
  40. package/dist/query/core/QueriesCache.d.ts +2 -2
  41. package/dist/query/core/QueriesCache.js +1 -1
  42. package/dist/query/core/QueriesLifetimeHooks.d.ts +1 -1
  43. package/dist/query/core/QueriesLifetimeHooks.js +7 -7
  44. package/dist/query/core/Resource/Resource.d.ts +16 -16
  45. package/dist/query/core/Resource/Resource.js +7 -7
  46. package/dist/query/core/Resource/ResourceAgent.d.ts +2 -2
  47. package/dist/query/core/Resource/ResourceAgent.js +3 -3
  48. package/dist/query/core/Resource/ResourceDuplicator.d.ts +17 -17
  49. package/dist/query/core/Resource/ResourceDuplicator.js +18 -20
  50. package/dist/query/core/Resource/ResourceDuplicatorAgent.d.ts +6 -6
  51. package/dist/query/core/Resource/ResourceDuplicatorAgent.js +3 -3
  52. package/dist/query/core/Resource/ResourceRef.d.ts +2 -2
  53. package/dist/query/core/Resource/ResourceRef.js +12 -12
  54. package/dist/query/index.d.ts +11 -8
  55. package/dist/query/index.js +14 -8
  56. package/dist/query/lib/IndirectMap.js +4 -4
  57. package/dist/query/lib/ReactiveCache.d.ts +1 -1
  58. package/dist/query/react/useCommandAgent.d.ts +24 -0
  59. package/dist/query/react/useCommandAgent.js +39 -0
  60. package/dist/query/react/useOperationAgent.d.ts +6 -8
  61. package/dist/query/react/useOperationAgent.js +6 -23
  62. package/dist/query/react/useResourceAgent.d.ts +4 -4
  63. package/dist/query/react/useResourceAgent.js +1 -1
  64. package/dist/query/react/useResourceRef.d.ts +3 -3
  65. package/dist/query/react/useResourceRef.js +7 -2
  66. package/dist/query/types/Command.types.d.ts +154 -0
  67. package/dist/query/types/Command.types.js +1 -0
  68. package/dist/query/types/Operation.types.d.ts +13 -154
  69. package/dist/query/types/Resource.types.d.ts +7 -5
  70. package/dist/query/types/index.d.ts +4 -3
  71. package/dist/query/types/index.js +5 -3
  72. package/dist/query-v2/api/createApi.d.ts +10 -0
  73. package/dist/query-v2/api/createApi.js +83 -0
  74. package/dist/query-v2/core/common/CacheEntry.d.ts +29 -0
  75. package/dist/query-v2/core/common/CacheEntry.js +71 -0
  76. package/dist/query-v2/core/common/CacheMap.d.ts +38 -0
  77. package/dist/query-v2/core/common/CacheMap.js +127 -0
  78. package/dist/query-v2/core/common/LifecycleHooks.d.ts +22 -0
  79. package/dist/query-v2/core/common/LifecycleHooks.js +104 -0
  80. package/dist/query-v2/core/common/index.d.ts +3 -0
  81. package/dist/query-v2/core/common/index.js +3 -0
  82. package/dist/query-v2/core/index.d.ts +3 -0
  83. package/dist/query-v2/core/index.js +3 -0
  84. package/dist/query-v2/core/machines/Machine.d.ts +14 -0
  85. package/dist/query-v2/core/machines/Machine.js +33 -0
  86. package/dist/query-v2/core/machines/MachineError.d.ts +11 -0
  87. package/dist/query-v2/core/machines/MachineError.js +26 -0
  88. package/dist/query-v2/core/machines/MachineIdle.d.ts +8 -0
  89. package/dist/query-v2/core/machines/MachineIdle.js +19 -0
  90. package/dist/query-v2/core/machines/MachinePending.d.ts +12 -0
  91. package/dist/query-v2/core/machines/MachinePending.js +29 -0
  92. package/dist/query-v2/core/machines/MachineRefreshing.d.ts +14 -0
  93. package/dist/query-v2/core/machines/MachineRefreshing.js +46 -0
  94. package/dist/query-v2/core/machines/MachineSuccess.d.ts +16 -0
  95. package/dist/query-v2/core/machines/MachineSuccess.js +42 -0
  96. package/dist/query-v2/core/machines/MachineWithData.d.ts +18 -0
  97. package/dist/query-v2/core/machines/MachineWithData.js +40 -0
  98. package/dist/query-v2/core/machines/Patcher.d.ts +20 -0
  99. package/dist/query-v2/core/machines/Patcher.js +104 -0
  100. package/dist/query-v2/core/machines/index.d.ts +8 -0
  101. package/dist/query-v2/core/machines/index.js +8 -0
  102. package/dist/query-v2/core/resource/ResourceV2.d.ts +120 -0
  103. package/dist/query-v2/core/resource/ResourceV2.js +464 -0
  104. package/dist/query-v2/core/resource/ResourceV2Agent.d.ts +26 -0
  105. package/dist/query-v2/core/resource/ResourceV2Agent.js +132 -0
  106. package/dist/query-v2/core/resource/index.d.ts +2 -0
  107. package/dist/query-v2/core/resource/index.js +2 -0
  108. package/dist/query-v2/index.d.ts +11 -0
  109. package/dist/query-v2/index.js +17 -0
  110. package/dist/query-v2/lib/NO_VALUE.d.ts +2 -0
  111. package/dist/query-v2/lib/NO_VALUE.js +1 -0
  112. package/dist/query-v2/lib/SKIP_TOKEN.d.ts +2 -0
  113. package/dist/query-v2/lib/SKIP_TOKEN.js +1 -0
  114. package/dist/query-v2/lib/index.d.ts +4 -0
  115. package/dist/query-v2/lib/index.js +3 -0
  116. package/dist/query-v2/lib/stableStringify.d.ts +8 -0
  117. package/dist/query-v2/lib/stableStringify.js +23 -0
  118. package/dist/query-v2/plugins/ReactHooksPlugin.d.ts +25 -0
  119. package/dist/query-v2/plugins/ReactHooksPlugin.js +19 -0
  120. package/dist/query-v2/plugins/types.d.ts +1 -0
  121. package/dist/query-v2/plugins/types.js +1 -0
  122. package/dist/query-v2/react/__tests__/helpers.d.ts +12 -0
  123. package/dist/query-v2/react/__tests__/helpers.js +33 -0
  124. package/dist/query-v2/react/index.d.ts +2 -0
  125. package/dist/query-v2/react/index.js +2 -0
  126. package/dist/query-v2/react/useResourceV2Agent.d.ts +12 -0
  127. package/dist/query-v2/react/useResourceV2Agent.js +36 -0
  128. package/dist/query-v2/react/useResourceV2Ref.d.ts +12 -0
  129. package/dist/query-v2/react/useResourceV2Ref.js +57 -0
  130. package/dist/query-v2/snapshot/Snapshot.d.ts +13 -0
  131. package/dist/query-v2/snapshot/Snapshot.js +76 -0
  132. package/dist/query-v2/types/agent.types.d.ts +54 -0
  133. package/dist/query-v2/types/agent.types.js +1 -0
  134. package/dist/query-v2/types/api.types.d.ts +22 -0
  135. package/dist/query-v2/types/api.types.js +1 -0
  136. package/dist/query-v2/types/cache.types.d.ts +37 -0
  137. package/dist/query-v2/types/cache.types.js +1 -0
  138. package/dist/query-v2/types/index.d.ts +9 -0
  139. package/dist/query-v2/types/index.js +9 -0
  140. package/dist/query-v2/types/lifecycle.types.d.ts +25 -0
  141. package/dist/query-v2/types/lifecycle.types.js +1 -0
  142. package/dist/query-v2/types/machine.types.d.ts +67 -0
  143. package/dist/query-v2/types/machine.types.js +1 -0
  144. package/dist/query-v2/types/plugin.types.d.ts +38 -0
  145. package/dist/query-v2/types/plugin.types.js +1 -0
  146. package/dist/query-v2/types/resource.types.d.ts +35 -0
  147. package/dist/query-v2/types/resource.types.js +1 -0
  148. package/dist/query-v2/types/shared.types.d.ts +20 -0
  149. package/dist/query-v2/types/shared.types.js +1 -0
  150. package/dist/query-v2/types/snapshot.types.d.ts +21 -0
  151. package/dist/query-v2/types/snapshot.types.js +1 -0
  152. package/dist/signals/base/Batcher.js +9 -5
  153. package/dist/signals/base/ComputeCache.js +3 -3
  154. package/dist/signals/base/DependencyTracker.js +1 -1
  155. package/dist/signals/base/Devtools.d.ts +3 -2
  156. package/dist/signals/base/Devtools.js +54 -27
  157. package/dist/signals/base/Indexer.js +1 -1
  158. package/dist/signals/base/ReadonlySignal.js +1 -1
  159. package/dist/signals/base/SyncObservable.d.ts +1 -2
  160. package/dist/signals/base/SyncObservable.js +2 -5
  161. package/dist/signals/base/index.d.ts +6 -6
  162. package/dist/signals/base/index.js +6 -6
  163. package/dist/signals/index.d.ts +5 -4
  164. package/dist/signals/index.js +5 -4
  165. package/dist/signals/operators/index.d.ts +1 -1
  166. package/dist/signals/operators/index.js +1 -1
  167. package/dist/signals/operators/signalize.d.ts +1 -1
  168. package/dist/signals/react/index.d.ts +1 -1
  169. package/dist/signals/react/index.js +1 -1
  170. package/dist/signals/signals/Computed.d.ts +3 -4
  171. package/dist/signals/signals/Computed.js +18 -10
  172. package/dist/signals/signals/Effect.js +2 -1
  173. package/dist/signals/signals/LocalState.d.ts +44 -0
  174. package/dist/signals/signals/{LocalSignal.js → LocalState.js} +62 -28
  175. package/dist/signals/signals/Signal.d.ts +8 -7
  176. package/dist/signals/signals/Signal.js +4 -1
  177. package/dist/signals/signals/State.d.ts +4 -5
  178. package/dist/signals/signals/State.js +23 -9
  179. package/dist/signals/signals/index.d.ts +5 -5
  180. package/dist/signals/signals/index.js +5 -6
  181. package/dist/signals/types/SignalOptions.d.ts +16 -0
  182. package/dist/signals/types/SignalOptions.js +1 -0
  183. package/dist/signals/types/index.d.ts +3 -1
  184. package/dist/signals/types/index.js +3 -1
  185. package/dist/signals/types/normalizeSignalOptions.d.ts +2 -0
  186. package/dist/signals/types/normalizeSignalOptions.js +10 -0
  187. package/dist/signals/types/signals.types.d.ts +6 -2
  188. package/docs/CHANGELOG.md +111 -32
  189. package/docs/CONTRIBUTING.md +230 -0
  190. package/docs/contributing/ai-assisted-development.md +47 -0
  191. package/docs/contributing/query-v2/README.md +379 -0
  192. package/docs/{release → contributing/release}/README.md +59 -59
  193. package/docs/devtools/README.md +228 -228
  194. package/docs/migrations/0.5.0.md +58 -58
  195. package/docs/migrations/query-v2.md +171 -0
  196. package/docs/options/README.md +92 -90
  197. package/docs/query/README.md +575 -571
  198. package/docs/query-v2/README.md +280 -0
  199. package/docs/query-v2/api-reference.md +235 -0
  200. package/docs/query-v2/optimistic-updates.md +148 -0
  201. package/docs/query-v2/ssr.md +130 -0
  202. package/docs/signals/README.md +300 -295
  203. package/docs/usage/react/README.md +309 -307
  204. package/package.json +86 -63
  205. package/dist/query/core/Opertation/Operation.d.ts +0 -35
  206. package/dist/query/core/Opertation/OperationAgent.d.ts +0 -19
  207. package/dist/signals/signals/LocalSignal.d.ts +0 -32
@@ -1,58 +1,58 @@
1
- # Миграция с версии 0.4.x на 0.5.0
2
-
3
-
4
- ### Новый функциональный API для создания сигналов
5
-
6
- ```typescript
7
- // Было
8
- const signal = new Signal(0); // ❌
9
- const computed = new Computed(() => signal.value * 2); // ❌
10
- signal.value += 1;
11
-
12
-
13
- // Стало
14
- const signal = Signal.create(0); // ✅
15
- const computed = Signal.compute(() => signal() * 2); // ✅
16
- signal.set(signal() + 1);
17
- ```
18
-
19
-
20
- ### Сигналы больше не поддерживают `value`, `getValue()` и `next()`
21
-
22
- ```typescript
23
- // Было
24
- signal.value; // ❌
25
- signal.getValue(); // ❌
26
- signal.next(val); // ❌
27
- singal.value += 1; // ❌
28
-
29
- // Стало
30
- signal() // ✅
31
- signal.get(); // ✅
32
- signal.set(val); // ✅
33
- ```
34
- ### Сигналы больше не наследуются от Observable
35
-
36
- ```typescript
37
- // Было
38
- signal.subscribe(fn); // ❌
39
- signal.pipe() // ❌
40
-
41
- // Стало
42
- signal.obs.subscribe(fn); // ✅
43
- signal.obs.pipe() // ✅
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
- ```
1
+ # Миграция с версии 0.4.x на 0.5.0
2
+
3
+
4
+ ### Новый функциональный API для создания сигналов
5
+
6
+ ```typescript
7
+ // Было
8
+ const signal = new Signal(0); // ❌
9
+ const computed = new Computed(() => signal.value * 2); // ❌
10
+ signal.value += 1;
11
+
12
+
13
+ // Стало
14
+ const signal = Signal.create(0); // ✅
15
+ const computed = Signal.compute(() => signal() * 2); // ✅
16
+ signal.set(signal() + 1);
17
+ ```
18
+
19
+
20
+ ### Сигналы больше не поддерживают `value`, `getValue()` и `next()`
21
+
22
+ ```typescript
23
+ // Было
24
+ signal.value; // ❌
25
+ signal.getValue(); // ❌
26
+ signal.next(val); // ❌
27
+ singal.value += 1; // ❌
28
+
29
+ // Стало
30
+ signal() // ✅
31
+ signal.get(); // ✅
32
+ signal.set(val); // ✅
33
+ ```
34
+ ### Сигналы больше не наследуются от Observable
35
+
36
+ ```typescript
37
+ // Было
38
+ signal.subscribe(fn); // ❌
39
+ signal.pipe() // ❌
40
+
41
+ // Стало
42
+ signal.obs.subscribe(fn); // ✅
43
+ signal.obs.pipe() // ✅
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
+ ```
@@ -0,0 +1,171 @@
1
+ # Миграция с Query v1 на Query v2
2
+
3
+ > ⚠️ Query v2 — **экспериментальный модуль**. v1 продолжает поддерживаться.
4
+
5
+ ## Сосуществование v1 и v2
6
+
7
+ Оба модуля могут использоваться одновременно в одном приложении без конфликтов. Они полностью изолированы:
8
+ - v1: импорты из `@fozy-labs/rx-toolkit` (`createResource`, `createCommand`)
9
+ - v2: импорты из `@fozy-labs/rx-toolkit` через namespace `queryV2`
10
+
11
+ ```typescript
12
+ // v1
13
+ import { createResource, useResourceAgent } from '@fozy-labs/rx-toolkit';
14
+
15
+ // v2
16
+ import { unstable_queryV2 } from '@fozy-labs/rx-toolkit';
17
+ const api = unstable_queryV2.createApi({ /* ... */ });
18
+ ```
19
+
20
+ Кэши v1 и v2 не пересекаются. Можно мигрировать ресурсы по одному.
21
+
22
+ ---
23
+
24
+ ## Маппинг концепций
25
+
26
+ ### createResource → createApi + api.createResource
27
+
28
+ ```typescript
29
+ // v1
30
+ const userResource = createResource({
31
+ queryFn: fetchUser,
32
+ cacheLifetime: 30000,
33
+ devtoolsName: 'user',
34
+ });
35
+
36
+ // v2
37
+ const api = unstable_queryV2.createApi({
38
+ plugins: [new unstable_queryV2.ReactHooksPlugin()],
39
+ });
40
+ const userResource = api.createResource({
41
+ key: 'user',
42
+ queryFn: fetchUser,
43
+ cacheLifetime: 30000,
44
+ });
45
+ ```
46
+
47
+ **Ключевые отличия:**
48
+ - Ресурс создаётся через API-инстанс, а не как standalone
49
+ - `devtoolsName` заменён на `key` + `beforeDevtoolsPush`
50
+ - Общая конфигурация (cacheLifetime, serialization) задаётся на уровне API
51
+
52
+ ### Resource → ResourceV2
53
+
54
+ | v1 | v2 | Примечание |
55
+ |----|----|-----------|
56
+ | `createResource(opts)` | `api.createResource(opts)` | Через API-инстанс |
57
+ | `queryFn(args, tools)` | `queryFn(args, { abortSignal })` | Та же сигнатура tools |
58
+ | `select` | — | Убрано, трансформация вне ресурса |
59
+ | `devtoolsName` | `key` + `beforeDevtoolsPush` | Ключ для snapshot и devtools |
60
+ | `compareArgsFn` | `compareArg` | Переименовано |
61
+
62
+ ### Command → Вне scope v2
63
+
64
+ В v2 нет прямого аналога `createCommand`. Мутации реализуются через:
65
+ - Прямые вызовы API + `ref.createPatch()` для оптимистичных обновлений
66
+ - `ref.invalidate()` для инвалидации после мутации
67
+
68
+ ```typescript
69
+ // v1: Command с link
70
+ const updateUser = createCommand({
71
+ queryFn: updateUserApi,
72
+ link(add) {
73
+ add({
74
+ resource: userResource,
75
+ forwardArgs: (args) => ({ id: args.id }),
76
+ update: ({ draft, args }) => { draft.name = args.name; },
77
+ });
78
+ },
79
+ });
80
+
81
+ // v2: Прямой вызов + патч
82
+ async function updateUser(id: string, name: string) {
83
+ const ref = userResource.useResourceV2Ref({ id });
84
+ const patch = ref.createPatch(draft => { draft.name = name; });
85
+ try {
86
+ await fetch(`/api/users/${id}`, { method: 'PATCH', body: JSON.stringify({ name }) });
87
+ patch?.commit();
88
+ } catch {
89
+ patch?.abort();
90
+ }
91
+ }
92
+ ```
93
+
94
+ ### Boolean flags → Machine states
95
+
96
+ ```typescript
97
+ // v1
98
+ if (query.isLoading) { /* ... */ }
99
+ if (query.isSuccess) { /* ... */ }
100
+ if (query.isError) { /* ... */ }
101
+
102
+ // v2 — агент предоставляет те же флаги
103
+ if (state.isLoading) { /* ... */ }
104
+ if (state.isSuccess) { /* ... */ }
105
+ if (state.isError) { /* ... */ }
106
+
107
+ // v2 — дополнительно: машина состояний
108
+ if (state.status === 'pending') { /* ... */ }
109
+ if (state.status === 'refreshing') { /* ... */ }
110
+ if (state.isInitialLoading) { /* первая загрузка */ }
111
+ if (state.isRefreshing) { /* обновление с данными */ }
112
+ ```
113
+
114
+ ### useResourceAgent → useResourceV2Agent
115
+
116
+ ```typescript
117
+ // v1
118
+ import { useResourceAgent } from '@fozy-labs/rx-toolkit';
119
+ const query = useResourceAgent(userResource, { id: '1' });
120
+
121
+ // v2 (через ReactHooksPlugin)
122
+ const state = userResource.useResourceV2Agent({ id: '1' });
123
+ ```
124
+
125
+ **Изменения:**
126
+ - Хук вызывается на самом ресурсе (метод, добавленный плагином)
127
+ - Не нужен отдельный импорт хука
128
+ - Для пропуска запроса используется `SKIP` вместо условного вызова
129
+
130
+ ### useResourceRef → useResourceV2Ref
131
+
132
+ ```typescript
133
+ // v1
134
+ import { useResourceRef } from '@fozy-labs/rx-toolkit';
135
+ const ref = useResourceRef(userResource, { id: '1' });
136
+ ref.patch(draft => { draft.name = 'new'; });
137
+
138
+ // v2 (через ReactHooksPlugin)
139
+ const ref = userResource.useResourceV2Ref({ id: '1' });
140
+ const patch = ref.createPatch(draft => { draft.name = 'new'; });
141
+ patch?.commit(); // или patch?.abort();
142
+ ```
143
+
144
+ **Изменения:**
145
+ - `patch()` → `createPatch()` с явным `commit/abort`
146
+ - Добавлен `ref.create(data)` для предзаполнения кэша
147
+ - `ref.lock()` возвращает `{ unlock }` для разблокировки
148
+
149
+ ### resetAllQueriesCache → api.resetAll
150
+
151
+ ```typescript
152
+ // v1
153
+ import { resetAllQueriesCache } from '@fozy-labs/rx-toolkit';
154
+ resetAllQueriesCache();
155
+
156
+ // v2
157
+ api.resetAll();
158
+ ```
159
+
160
+ ---
161
+
162
+ ## Новое в v2
163
+
164
+ | Функция | Описание |
165
+ |---------|----------|
166
+ | **Плагины** | Расширяемая архитектура (`ReactHooksPlugin` и др.) |
167
+ | **Machine states** | Типизированные состояния вместо boolean-флагов |
168
+ | **SSR Snapshots** | `getSnapshot()` / `initialSnapshot` для серверного рендеринга |
169
+ | **API factory** | Единая точка конфигурации |
170
+ | **Очередь патчей** | Несколько независимых оптимистичных обновлений |
171
+ | **SKIP_TOKEN** | Пропуск запроса с типобезопасностью |
@@ -1,90 +1,92 @@
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.
68
- Можено, например, подключить к DI систему, для раширенного devtools нейминга.
69
-
70
- ```typescript
71
- import { DefaultOptions } from '@fozy-labs/rx-toolkit';
72
-
73
- DefaultOptions.update({
74
- getScopeName: () => MyDiAbsractDi.getCurrentScopeName(),
75
- });
76
-
77
- // Объявляем класс
78
- class Counter {
79
- value$ = Signal.create(0, '{scope}/Counter/value$');
80
- }
81
-
82
- // В другом месте приложения
83
- function ChannelCounter() {
84
- const counter = MyDiAbsractDi.resolve<Counter>('Counter', 'ChannelScope');
85
- console.log(counter.value$()); // Devtools покажет имя сигнала как "ChannelScope/Counter/value$"
86
- return null;
87
- }
88
- ```
89
-
90
- ---
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 и Commands). Вызывается при каждой ошибке запроса.
35
+
36
+ > **Note:** Старое имя `Operations` является deprecated-алиасом для `Commands` и будет удалено в v0.6.0.
37
+
38
+ ```typescript
39
+ import { DefaultOptions } from '@fozy-labs/rx-toolkit';
40
+ import * as Sentry from '@sentry/browser';
41
+
42
+ DefaultOptions.update({
43
+ onQueryError: (error) => {
44
+ // Логирование
45
+ console.error('[RxToolkit Query Error]', error);
46
+
47
+ // Отправка в абстакную систему мониторинга
48
+ Sentry.captureException(error, {
49
+ tags: { source: 'rx-toolkit-query' }
50
+ });
51
+
52
+ // Уведомление пользователя
53
+ if (error instanceof NetworkError) {
54
+ toast.error('Проблема с сетью. Попробуйте позже.');
55
+ } else if (error instanceof AuthError) {
56
+ redirectToLogin();
57
+ }
58
+ }
59
+ });
60
+ ```
61
+
62
+ ---
63
+
64
+ ### getScopeName
65
+
66
+ **Тип:** `(() => string | null) | null`
67
+ **По умолчанию:** `null`
68
+
69
+ Функция для получения имени текущего scope.
70
+ Можено, например, подключить к DI систему, для раширенного devtools нейминга.
71
+
72
+ ```typescript
73
+ import { DefaultOptions } from '@fozy-labs/rx-toolkit';
74
+
75
+ DefaultOptions.update({
76
+ getScopeName: () => MyDiAbsractDi.getCurrentScopeName(),
77
+ });
78
+
79
+ // Объявляем класс
80
+ class Counter {
81
+ value$ = Signal.state(0, '{scope}/Counter/value$');
82
+ }
83
+
84
+ // В другом месте приложения
85
+ function ChannelCounter() {
86
+ const counter = MyDiAbsractDi.resolve<Counter>('Counter', 'ChannelScope');
87
+ console.log(counter.value$()); // Devtools покажет имя сигнала как "ChannelScope/Counter/value$"
88
+ return null;
89
+ }
90
+ ```
91
+
92
+ ---