@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.
- 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/SharedOptions.d.ts +1 -0
- 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 +1 -1
- package/dist/query/api/createOperation.d.ts +1 -1
- package/dist/query/api/createOperation.js +1 -1
- package/dist/query/api/createResource.d.ts +1 -1
- package/dist/query/api/createResourceDuplicator.d.ts +1 -1
- package/dist/query/core/Command/Command.d.ts +7 -7
- package/dist/query/core/Command/Command.js +2 -2
- package/dist/query/core/Command/CommandAgent.d.ts +1 -1
- package/dist/query/core/Command/index.d.ts +2 -2
- package/dist/query/core/Command/index.js +2 -2
- package/dist/query/core/{Opertation → Operation}/Operation.d.ts +2 -2
- package/dist/query/core/{Opertation → Operation}/Operation.js +1 -1
- package/dist/query/core/{Opertation → Operation}/OperationAgent.d.ts +1 -1
- package/dist/query/core/{Opertation → Operation}/OperationAgent.js +1 -1
- package/dist/query/core/QueriesCache.d.ts +1 -1
- package/dist/query/core/QueriesCache.js +1 -1
- package/dist/query/core/QueriesLifetimeHooks.js +7 -7
- package/dist/query/core/Resource/Resource.d.ts +15 -15
- package/dist/query/core/Resource/Resource.js +7 -7
- package/dist/query/core/Resource/ResourceAgent.d.ts +1 -1
- package/dist/query/core/Resource/ResourceAgent.js +2 -2
- package/dist/query/core/Resource/ResourceDuplicator.d.ts +16 -16
- package/dist/query/core/Resource/ResourceDuplicator.js +18 -20
- package/dist/query/core/Resource/ResourceDuplicatorAgent.d.ts +5 -5
- package/dist/query/core/Resource/ResourceDuplicatorAgent.js +2 -2
- 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 -10
- package/dist/query/index.js +11 -10
- package/dist/query/lib/IndirectMap.js +4 -4
- package/dist/query/react/useCommandAgent.d.ts +2 -2
- package/dist/query/react/useOperationAgent.d.ts +1 -1
- package/dist/query/react/useOperationAgent.js +1 -1
- package/dist/query/react/useResourceAgent.d.ts +3 -3
- 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 +1 -1
- package/dist/query/types/Operation.types.d.ts +1 -1
- package/dist/query/types/Resource.types.d.ts +7 -5
- package/dist/query/types/index.d.ts +4 -4
- package/dist/query/types/index.js +4 -4
- 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/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 +3 -4
- package/dist/signals/signals/LocalState.js +8 -8
- package/dist/signals/signals/Signal.d.ts +7 -6
- 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 +2 -3
- package/docs/CHANGELOG.md +95 -90
- 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 -92
- package/docs/query/README.md +575 -573
- 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 -300
- package/docs/usage/react/README.md +309 -309
- package/package.json +85 -63
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# SSR — RxQuery v2
|
|
2
|
+
|
|
3
|
+
> ⚠️ **Экспериментальный модуль.** API может измениться.
|
|
4
|
+
|
|
5
|
+
RxQuery v2 поддерживает серверный рендеринг (SSR) через механизм **snapshot** — сериализуемого слепка кэша, который можно передать с сервера на клиент.
|
|
6
|
+
|
|
7
|
+
## Обзор
|
|
8
|
+
|
|
9
|
+
1. **Сервер**: выполняет запросы, собирает данные в snapshot через `getSnapshot()`
|
|
10
|
+
2. **Передача**: snapshot сериализуется и встраивается в HTML
|
|
11
|
+
3. **Клиент**: создаёт API с `initialSnapshot`, данные доступны мгновенно
|
|
12
|
+
|
|
13
|
+
## Требования
|
|
14
|
+
|
|
15
|
+
- `keyStrategy` должен быть `'serialize'` (по умолчанию)
|
|
16
|
+
- Каждый ресурс должен иметь уникальный `key`
|
|
17
|
+
- Только записи в состоянии `success` включаются в snapshot
|
|
18
|
+
|
|
19
|
+
## Серверная часть: getSnapshot
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { unstable_queryV2 } from '@fozy-labs/rx-toolkit';
|
|
23
|
+
|
|
24
|
+
// На сервере: создаём API и выполняем запросы
|
|
25
|
+
const api = unstable_queryV2.createApi({
|
|
26
|
+
keyPrefix: 'my-app',
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const userResource = api.createResource<{ id: string }, User>({
|
|
30
|
+
key: 'users',
|
|
31
|
+
queryFn: fetchUser,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Выполняем запросы
|
|
35
|
+
await userResource.query({ id: '1' });
|
|
36
|
+
await userResource.query({ id: '2' });
|
|
37
|
+
|
|
38
|
+
// Собираем snapshot
|
|
39
|
+
const snapshot = api.getSnapshot();
|
|
40
|
+
// snapshot — сериализуемый объект, готовый к JSON.stringify
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Формат snapshot
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
interface TApiSnapshot {
|
|
47
|
+
version: number; // Версия формата
|
|
48
|
+
keyPrefix: string | null; // Префикс API
|
|
49
|
+
resources: {
|
|
50
|
+
[resourceKey: string]: {
|
|
51
|
+
entries: {
|
|
52
|
+
[serializedArgs: string]: {
|
|
53
|
+
status: 'success';
|
|
54
|
+
args: unknown;
|
|
55
|
+
data: unknown;
|
|
56
|
+
updatedAt: number; // Timestamp
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Клиентская часть: initialSnapshot
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
import { unstable_queryV2 } from '@fozy-labs/rx-toolkit';
|
|
68
|
+
|
|
69
|
+
// На клиенте: создаём API с начальным snapshot
|
|
70
|
+
const api = unstable_queryV2.createApi({
|
|
71
|
+
keyPrefix: 'my-app',
|
|
72
|
+
initialSnapshot: window.__API_SNAPSHOT__ ?? null, // Например, через объект window
|
|
73
|
+
maxSnapshotDataAge: 300_000, // 5 минут (по умолчанию)
|
|
74
|
+
plugins: [new unstable_queryV2.ReactHooksPlugin()],
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const userResource = api.createResource<{ id: string }, User>({
|
|
78
|
+
key: 'users',
|
|
79
|
+
queryFn: fetchUser,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Данные из snapshot доступны мгновенно, без запроса к серверу
|
|
83
|
+
function UserProfile({ userId }: { userId: string }) {
|
|
84
|
+
const state = userResource.useResourceV2Agent({ id: userId });
|
|
85
|
+
// state.data — данные из snapshot (если не устарели)
|
|
86
|
+
return <div>{state.data?.name}</div>;
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## maxSnapshotDataAge
|
|
91
|
+
|
|
92
|
+
Определяет максимальный возраст данных snapshot (в мс). Если запись старше этого значения, она будет проигнорирована при гидрации, и запрос будет выполнен заново.
|
|
93
|
+
|
|
94
|
+
| Уровень | По умолчанию | Описание |
|
|
95
|
+
|---------|-------------|----------|
|
|
96
|
+
| `createApi` | `300000` (5 мин) | Глобальное значение |
|
|
97
|
+
| `createResource` | — | Переопределяет API-уровень |
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
const api = unstable_queryV2.createApi({
|
|
101
|
+
maxSnapshotDataAge: 60_000, // 1 минута для всего API
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const frequentResource = api.createResource({
|
|
105
|
+
key: 'prices',
|
|
106
|
+
queryFn: fetchPrices,
|
|
107
|
+
maxSnapshotDataAge: 10_000, // 10 секунд для этого ресурса
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Ограничения
|
|
112
|
+
|
|
113
|
+
- **Стратегия `compare`** не поддерживает snapshots. Используйте `keyStrategy: 'serialize'` (по умолчанию).
|
|
114
|
+
- В snapshot попадают **только** записи в состоянии `success`.
|
|
115
|
+
- Snapshot не включает информацию о патчах или pending-запросах.
|
|
116
|
+
- `keyPrefix` на сервере и клиенте должен совпадать.
|
|
117
|
+
|
|
118
|
+
### Оптимистичные обновления и snapshot
|
|
119
|
+
|
|
120
|
+
- Во время активных оптимистичных патчей `data` в snapshot — это **патченное** (оптимистичное) значение, а не `originalData`.
|
|
121
|
+
- `originalData` и `patches` не включаются в `TResourceV2SnapshotSlice`.
|
|
122
|
+
- Гидрация snapshot, сделанного в момент патча, установит оптимистичные данные как канонические серверные данные.
|
|
123
|
+
- **Рекомендация**: вызывайте `commit()` / `abort()` для всех патчей перед `getSnapshot()`.
|
|
124
|
+
|
|
125
|
+
### Ошибки гидрации
|
|
126
|
+
|
|
127
|
+
- `hydrateSnapshot` **выбрасывает ошибку** при несовпадении `version` (формат snapshot несовместим).
|
|
128
|
+
- `hydrateSnapshot` **выбрасывает ошибку** при несовпадении `keyPrefix` (snapshot от другого API-инстанса).
|
|
129
|
+
- Неизвестные ключи ресурсов пропускаются с `console.warn` (нефатальная ситуация — ресурс мог быть удалён между версиями).
|
|
130
|
+
- При rolling-деплоях, где версия snapshot может не совпадать, оберните гидрацию в `try/catch`.
|