@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.
- package/LICENSE +21 -21
- package/README.md +143 -137
- package/dist/common/devtools/combineDevtools.js +3 -3
- package/dist/common/devtools/index.d.ts +3 -3
- package/dist/common/devtools/index.js +3 -3
- package/dist/common/devtools/reduxDevtools.d.ts +1 -1
- package/dist/common/devtools/reduxDevtools.js +17 -17
- package/dist/common/devtools/types.d.ts +0 -6
- package/dist/common/options/DefaultOptions.d.ts +1 -1
- package/dist/common/options/SharedOptions.d.ts +3 -2
- package/dist/common/options/SharedOptions.js +6 -0
- package/dist/common/options/index.d.ts +1 -1
- package/dist/common/options/index.js +1 -1
- package/dist/common/react/index.d.ts +2 -2
- package/dist/common/react/index.js +2 -2
- package/dist/common/react/useConstant.js +1 -1
- package/dist/common/utils/deepEqual.js +1 -1
- package/dist/common/utils/index.d.ts +3 -3
- package/dist/common/utils/index.js +3 -3
- package/dist/common/utils/shallowEqual.js +1 -1
- package/dist/index.d.ts +8 -7
- package/dist/index.js +8 -7
- package/dist/query/SKIP_TOKEN.js +1 -1
- package/dist/query/api/createCommand.d.ts +21 -0
- package/dist/query/api/createCommand.js +20 -0
- package/dist/query/api/createOperation.d.ts +5 -3
- package/dist/query/api/createOperation.js +6 -2
- package/dist/query/api/createResource.d.ts +2 -2
- package/dist/query/api/createResourceDuplicator.d.ts +2 -2
- package/dist/query/core/Command/Command.d.ts +35 -0
- package/dist/query/core/{Opertation/Operation.js → Command/Command.js} +13 -14
- package/dist/query/core/Command/CommandAgent.d.ts +19 -0
- package/dist/query/core/{Opertation/OperationAgent.js → Command/CommandAgent.js} +13 -13
- package/dist/query/core/Command/index.d.ts +2 -0
- package/dist/query/core/Command/index.js +2 -0
- package/dist/query/core/Operation/Operation.d.ts +8 -0
- package/dist/query/core/Operation/Operation.js +4 -0
- package/dist/query/core/Operation/OperationAgent.d.ts +4 -0
- package/dist/query/core/Operation/OperationAgent.js +4 -0
- package/dist/query/core/QueriesCache.d.ts +2 -2
- package/dist/query/core/QueriesCache.js +1 -1
- package/dist/query/core/QueriesLifetimeHooks.d.ts +1 -1
- package/dist/query/core/QueriesLifetimeHooks.js +7 -7
- package/dist/query/core/Resource/Resource.d.ts +16 -16
- package/dist/query/core/Resource/Resource.js +7 -7
- package/dist/query/core/Resource/ResourceAgent.d.ts +2 -2
- package/dist/query/core/Resource/ResourceAgent.js +3 -3
- package/dist/query/core/Resource/ResourceDuplicator.d.ts +17 -17
- package/dist/query/core/Resource/ResourceDuplicator.js +18 -20
- package/dist/query/core/Resource/ResourceDuplicatorAgent.d.ts +6 -6
- package/dist/query/core/Resource/ResourceDuplicatorAgent.js +3 -3
- package/dist/query/core/Resource/ResourceRef.d.ts +2 -2
- package/dist/query/core/Resource/ResourceRef.js +12 -12
- package/dist/query/index.d.ts +11 -8
- package/dist/query/index.js +14 -8
- package/dist/query/lib/IndirectMap.js +4 -4
- package/dist/query/lib/ReactiveCache.d.ts +1 -1
- package/dist/query/react/useCommandAgent.d.ts +24 -0
- package/dist/query/react/useCommandAgent.js +39 -0
- package/dist/query/react/useOperationAgent.d.ts +6 -8
- package/dist/query/react/useOperationAgent.js +6 -23
- package/dist/query/react/useResourceAgent.d.ts +4 -4
- package/dist/query/react/useResourceAgent.js +1 -1
- package/dist/query/react/useResourceRef.d.ts +3 -3
- package/dist/query/react/useResourceRef.js +7 -2
- package/dist/query/types/Command.types.d.ts +154 -0
- package/dist/query/types/Command.types.js +1 -0
- package/dist/query/types/Operation.types.d.ts +13 -154
- package/dist/query/types/Resource.types.d.ts +7 -5
- package/dist/query/types/index.d.ts +4 -3
- package/dist/query/types/index.js +5 -3
- package/dist/query-v2/api/createApi.d.ts +10 -0
- package/dist/query-v2/api/createApi.js +83 -0
- package/dist/query-v2/core/common/CacheEntry.d.ts +29 -0
- package/dist/query-v2/core/common/CacheEntry.js +71 -0
- package/dist/query-v2/core/common/CacheMap.d.ts +38 -0
- package/dist/query-v2/core/common/CacheMap.js +127 -0
- package/dist/query-v2/core/common/LifecycleHooks.d.ts +22 -0
- package/dist/query-v2/core/common/LifecycleHooks.js +104 -0
- package/dist/query-v2/core/common/index.d.ts +3 -0
- package/dist/query-v2/core/common/index.js +3 -0
- package/dist/query-v2/core/index.d.ts +3 -0
- package/dist/query-v2/core/index.js +3 -0
- package/dist/query-v2/core/machines/Machine.d.ts +14 -0
- package/dist/query-v2/core/machines/Machine.js +33 -0
- package/dist/query-v2/core/machines/MachineError.d.ts +11 -0
- package/dist/query-v2/core/machines/MachineError.js +26 -0
- package/dist/query-v2/core/machines/MachineIdle.d.ts +8 -0
- package/dist/query-v2/core/machines/MachineIdle.js +19 -0
- package/dist/query-v2/core/machines/MachinePending.d.ts +12 -0
- package/dist/query-v2/core/machines/MachinePending.js +29 -0
- package/dist/query-v2/core/machines/MachineRefreshing.d.ts +14 -0
- package/dist/query-v2/core/machines/MachineRefreshing.js +46 -0
- package/dist/query-v2/core/machines/MachineSuccess.d.ts +16 -0
- package/dist/query-v2/core/machines/MachineSuccess.js +42 -0
- package/dist/query-v2/core/machines/MachineWithData.d.ts +18 -0
- package/dist/query-v2/core/machines/MachineWithData.js +40 -0
- package/dist/query-v2/core/machines/Patcher.d.ts +20 -0
- package/dist/query-v2/core/machines/Patcher.js +104 -0
- package/dist/query-v2/core/machines/index.d.ts +8 -0
- package/dist/query-v2/core/machines/index.js +8 -0
- package/dist/query-v2/core/resource/ResourceV2.d.ts +120 -0
- package/dist/query-v2/core/resource/ResourceV2.js +464 -0
- package/dist/query-v2/core/resource/ResourceV2Agent.d.ts +26 -0
- package/dist/query-v2/core/resource/ResourceV2Agent.js +132 -0
- package/dist/query-v2/core/resource/index.d.ts +2 -0
- package/dist/query-v2/core/resource/index.js +2 -0
- package/dist/query-v2/index.d.ts +11 -0
- package/dist/query-v2/index.js +17 -0
- package/dist/query-v2/lib/NO_VALUE.d.ts +2 -0
- package/dist/query-v2/lib/NO_VALUE.js +1 -0
- package/dist/query-v2/lib/SKIP_TOKEN.d.ts +2 -0
- package/dist/query-v2/lib/SKIP_TOKEN.js +1 -0
- package/dist/query-v2/lib/index.d.ts +4 -0
- package/dist/query-v2/lib/index.js +3 -0
- package/dist/query-v2/lib/stableStringify.d.ts +8 -0
- package/dist/query-v2/lib/stableStringify.js +23 -0
- package/dist/query-v2/plugins/ReactHooksPlugin.d.ts +25 -0
- package/dist/query-v2/plugins/ReactHooksPlugin.js +19 -0
- package/dist/query-v2/plugins/types.d.ts +1 -0
- package/dist/query-v2/plugins/types.js +1 -0
- package/dist/query-v2/react/__tests__/helpers.d.ts +12 -0
- package/dist/query-v2/react/__tests__/helpers.js +33 -0
- package/dist/query-v2/react/index.d.ts +2 -0
- package/dist/query-v2/react/index.js +2 -0
- package/dist/query-v2/react/useResourceV2Agent.d.ts +12 -0
- package/dist/query-v2/react/useResourceV2Agent.js +36 -0
- package/dist/query-v2/react/useResourceV2Ref.d.ts +12 -0
- package/dist/query-v2/react/useResourceV2Ref.js +57 -0
- package/dist/query-v2/snapshot/Snapshot.d.ts +13 -0
- package/dist/query-v2/snapshot/Snapshot.js +76 -0
- package/dist/query-v2/types/agent.types.d.ts +54 -0
- package/dist/query-v2/types/agent.types.js +1 -0
- package/dist/query-v2/types/api.types.d.ts +22 -0
- package/dist/query-v2/types/api.types.js +1 -0
- package/dist/query-v2/types/cache.types.d.ts +37 -0
- package/dist/query-v2/types/cache.types.js +1 -0
- package/dist/query-v2/types/index.d.ts +9 -0
- package/dist/query-v2/types/index.js +9 -0
- package/dist/query-v2/types/lifecycle.types.d.ts +25 -0
- package/dist/query-v2/types/lifecycle.types.js +1 -0
- package/dist/query-v2/types/machine.types.d.ts +67 -0
- package/dist/query-v2/types/machine.types.js +1 -0
- package/dist/query-v2/types/plugin.types.d.ts +38 -0
- package/dist/query-v2/types/plugin.types.js +1 -0
- package/dist/query-v2/types/resource.types.d.ts +35 -0
- package/dist/query-v2/types/resource.types.js +1 -0
- package/dist/query-v2/types/shared.types.d.ts +20 -0
- package/dist/query-v2/types/shared.types.js +1 -0
- package/dist/query-v2/types/snapshot.types.d.ts +21 -0
- package/dist/query-v2/types/snapshot.types.js +1 -0
- package/dist/signals/base/Batcher.js +9 -5
- package/dist/signals/base/ComputeCache.js +3 -3
- package/dist/signals/base/DependencyTracker.js +1 -1
- package/dist/signals/base/Devtools.d.ts +3 -2
- package/dist/signals/base/Devtools.js +54 -27
- package/dist/signals/base/Indexer.js +1 -1
- package/dist/signals/base/ReadonlySignal.js +1 -1
- package/dist/signals/base/SyncObservable.d.ts +1 -2
- package/dist/signals/base/SyncObservable.js +2 -5
- package/dist/signals/base/index.d.ts +6 -6
- package/dist/signals/base/index.js +6 -6
- package/dist/signals/index.d.ts +5 -4
- package/dist/signals/index.js +5 -4
- package/dist/signals/operators/index.d.ts +1 -1
- package/dist/signals/operators/index.js +1 -1
- package/dist/signals/operators/signalize.d.ts +1 -1
- package/dist/signals/react/index.d.ts +1 -1
- package/dist/signals/react/index.js +1 -1
- package/dist/signals/signals/Computed.d.ts +3 -4
- package/dist/signals/signals/Computed.js +18 -10
- package/dist/signals/signals/Effect.js +2 -1
- package/dist/signals/signals/LocalState.d.ts +44 -0
- package/dist/signals/signals/{LocalSignal.js → LocalState.js} +62 -28
- package/dist/signals/signals/Signal.d.ts +8 -7
- package/dist/signals/signals/Signal.js +4 -1
- package/dist/signals/signals/State.d.ts +4 -5
- package/dist/signals/signals/State.js +23 -9
- package/dist/signals/signals/index.d.ts +5 -5
- package/dist/signals/signals/index.js +5 -6
- package/dist/signals/types/SignalOptions.d.ts +16 -0
- package/dist/signals/types/SignalOptions.js +1 -0
- package/dist/signals/types/index.d.ts +3 -1
- package/dist/signals/types/index.js +3 -1
- package/dist/signals/types/normalizeSignalOptions.d.ts +2 -0
- package/dist/signals/types/normalizeSignalOptions.js +10 -0
- package/dist/signals/types/signals.types.d.ts +6 -2
- package/docs/CHANGELOG.md +111 -32
- package/docs/CONTRIBUTING.md +230 -0
- package/docs/contributing/ai-assisted-development.md +47 -0
- package/docs/contributing/query-v2/README.md +379 -0
- package/docs/{release → contributing/release}/README.md +59 -59
- package/docs/devtools/README.md +228 -228
- package/docs/migrations/0.5.0.md +58 -58
- package/docs/migrations/query-v2.md +171 -0
- package/docs/options/README.md +92 -90
- package/docs/query/README.md +575 -571
- package/docs/query-v2/README.md +280 -0
- package/docs/query-v2/api-reference.md +235 -0
- package/docs/query-v2/optimistic-updates.md +148 -0
- package/docs/query-v2/ssr.md +130 -0
- package/docs/signals/README.md +300 -295
- package/docs/usage/react/README.md +309 -307
- package/package.json +86 -63
- package/dist/query/core/Opertation/Operation.d.ts +0 -35
- package/dist/query/core/Opertation/OperationAgent.d.ts +0 -19
- package/dist/signals/signals/LocalSignal.d.ts +0 -32
package/docs/migrations/0.5.0.md
CHANGED
|
@@ -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** | Пропуск запроса с типобезопасностью |
|
package/docs/options/README.md
CHANGED
|
@@ -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 и
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
DefaultOptions
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
+
---
|