@dxtmisha/wiki 0.39.7 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{defineProperty-DblGXmzD.js → defineProperty-149Ahniv.js} +4 -4
- package/dist/library.js +1 -1
- package/dist/media/descriptions/wikiDescriptionsArea.d.ts +7 -0
- package/dist/media/descriptions/wikiDescriptionsClientOnly.d.ts +7 -0
- package/dist/media/descriptions/wikiDescriptionsContainer.d.ts +7 -0
- package/dist/media/descriptions/wikiDescriptionsHeader.d.ts +7 -0
- package/dist/media/descriptions/wikiDescriptionsPageArea.d.ts +7 -0
- package/dist/media/mdx/Area/wikiMdxArea.d.ts +7 -0
- package/dist/media/mdx/ClientOnly/wikiMdxClientOnly.d.ts +7 -0
- package/dist/media/mdx/Container/wikiMdxContainer.d.ts +7 -0
- package/dist/media/mdx/Header/wikiMdxHeader.d.ts +7 -0
- package/dist/media/mdx/PageArea/wikiMdxPageArea.d.ts +7 -0
- package/dist/media.d.ts +1 -1
- package/dist/media.js +127 -68
- package/dist/storybook.js +2707 -1841
- package/dist/{wikiDescriptions-Cv4WzSNL.js → wikiDescriptions-7XaHU3Yk.js} +182 -0
- package/package.json +1 -1
- package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.en.mdx +43 -0
- package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.ru.mdx +43 -0
- package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.vi.mdx +41 -0
- package/src/media/functional/functional/composables/useApiRef/useApiRef.en.mdx +20 -4
- package/src/media/functional/functional/composables/useApiRef/useApiRef.ru.mdx +21 -3
- package/src/media/functional/functional/composables/useApiRef/useApiRef.vi.mdx +20 -2
- package/src/media/functional/functional/functions/computedAsync/computedAsync.en.mdx +8 -0
- package/src/media/functional/functional/functions/computedAsync/computedAsync.ru.mdx +8 -0
- package/src/media/functional/functional/functions/computedAsync/computedAsync.vi.mdx +8 -0
- package/src/media/functional/functional/functions/computedEternity/computedEternity.en.mdx +8 -0
- package/src/media/functional/functional/functions/computedEternity/computedEternity.ru.mdx +8 -0
- package/src/media/functional/functional/functions/computedEternity/computedEternity.vi.mdx +8 -0
- package/src/media/functional/functional-basic/api/api.en.mdx +45 -0
- package/src/media/functional/functional-basic/api/api.ru.mdx +45 -0
- package/src/media/functional/functional-basic/api/api.vi.mdx +45 -0
- package/src/media/functional/functional-basic/classes/Api/Api.en.mdx +57 -54
- package/src/media/functional/functional-basic/classes/Api/Api.ru.mdx +57 -54
- package/src/media/functional/functional-basic/classes/Api/Api.vi.mdx +57 -54
- package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.en.mdx +111 -0
- package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.ru.mdx +111 -0
- package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.vi.mdx +111 -0
- package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.en.mdx +32 -0
- package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.ru.mdx +32 -0
- package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.vi.mdx +32 -0
- package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.en.mdx +24 -28
- package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.ru.mdx +24 -28
- package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.vi.mdx +24 -28
- package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.en.mdx +28 -14
- package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.ru.mdx +33 -19
- package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.vi.mdx +33 -19
- package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.en.mdx +56 -0
- package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.ru.mdx +56 -0
- package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.vi.mdx +55 -0
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.en.mdx +106 -51
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.ru.mdx +107 -52
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.vi.mdx +103 -49
- package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.en.mdx +44 -26
- package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.ru.mdx +45 -27
- package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.vi.mdx +44 -26
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.en.mdx +59 -21
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.ru.mdx +63 -25
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.vi.mdx +64 -26
- package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.en.mdx +29 -32
- package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.ru.mdx +33 -36
- package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.vi.mdx +33 -36
- package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.en.mdx +34 -53
- package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.ru.mdx +33 -52
- package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.vi.mdx +39 -58
- package/src/media/functional/functional-basic/classes/Cache/Cache.en.mdx +7 -4
- package/src/media/functional/functional-basic/classes/Cache/Cache.ru.mdx +7 -4
- package/src/media/functional/functional-basic/classes/Cache/Cache.vi.mdx +28 -25
- package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.en.mdx +45 -53
- package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.ru.mdx +46 -54
- package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.vi.mdx +47 -55
- package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.en.mdx +13 -1
- package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.ru.mdx +13 -1
- package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.vi.mdx +13 -0
- package/src/media/functional/functional-basic/classes/Cookie/Cookie.en.mdx +88 -44
- package/src/media/functional/functional-basic/classes/Cookie/Cookie.ru.mdx +88 -44
- package/src/media/functional/functional-basic/classes/Cookie/Cookie.vi.mdx +85 -41
- package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.en.mdx +43 -22
- package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.ru.mdx +46 -25
- package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.vi.mdx +43 -22
- package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.en.mdx +84 -0
- package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.ru.mdx +84 -0
- package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.vi.mdx +100 -0
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.en.mdx +178 -0
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.ru.mdx +178 -0
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.vi.mdx +178 -0
- package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.en.mdx +32 -25
- package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.ru.mdx +32 -25
- package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.vi.mdx +32 -27
- package/src/media/functional/functional-basic/classes/Datetime/Datetime.en.mdx +36 -4
- package/src/media/functional/functional-basic/classes/Datetime/Datetime.ru.mdx +36 -4
- package/src/media/functional/functional-basic/classes/Datetime/Datetime.vi.mdx +36 -4
- package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.en.mdx +101 -70
- package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.ru.mdx +100 -69
- package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.vi.mdx +101 -70
- package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.en.mdx +46 -42
- package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.ru.mdx +46 -42
- package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.vi.mdx +46 -42
- package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.en.mdx +44 -96
- package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.ru.mdx +44 -96
- package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.vi.mdx +44 -96
- package/src/media/functional/functional-basic/classes/EventItem/EventItem.en.mdx +49 -28
- package/src/media/functional/functional-basic/classes/EventItem/EventItem.ru.mdx +21 -0
- package/src/media/functional/functional-basic/classes/EventItem/EventItem.vi.mdx +63 -42
- package/src/media/functional/functional-basic/classes/Formatters/Formatters.en.mdx +97 -109
- package/src/media/functional/functional-basic/classes/Formatters/Formatters.ru.mdx +86 -98
- package/src/media/functional/functional-basic/classes/Formatters/Formatters.vi.mdx +99 -111
- package/src/media/functional/functional-basic/classes/Geo/Geo.en.mdx +3 -3
- package/src/media/functional/functional-basic/classes/Geo/Geo.ru.mdx +5 -5
- package/src/media/functional/functional-basic/classes/Geo/Geo.vi.mdx +5 -5
- package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.en.mdx +83 -40
- package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.ru.mdx +83 -40
- package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.vi.mdx +87 -44
- package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.en.mdx +81 -0
- package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.ru.mdx +81 -0
- package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.vi.mdx +81 -0
- package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.en.mdx +56 -105
- package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.ru.mdx +53 -102
- package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.vi.mdx +55 -105
- package/src/media/functional/functional-basic/classes/Hash/Hash.en.mdx +18 -7
- package/src/media/functional/functional-basic/classes/Hash/Hash.ru.mdx +18 -7
- package/src/media/functional/functional-basic/classes/Hash/Hash.vi.mdx +18 -7
- package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.en.mdx +54 -0
- package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.ru.mdx +54 -0
- package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.vi.mdx +54 -0
- package/src/media/functional/functional-basic/classes/Meta/Meta.en.mdx +16 -0
- package/src/media/functional/functional-basic/classes/Meta/Meta.ru.mdx +16 -0
- package/src/media/functional/functional-basic/classes/Meta/Meta.vi.mdx +17 -1
- package/src/media/functional/functional-basic/classes/MetaManager/MetaManager.en.mdx +9 -0
- package/src/media/functional/functional-basic/classes/MetaManager/MetaManager.ru.mdx +9 -0
- package/src/media/functional/functional-basic/classes/MetaManager/MetaManager.vi.mdx +9 -0
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.en.mdx +79 -0
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.ru.mdx +79 -0
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.vi.mdx +79 -0
- package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.en.mdx +50 -0
- package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.ru.mdx +50 -0
- package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.vi.mdx +50 -0
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.en.mdx +131 -0
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.ru.mdx +131 -0
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.vi.mdx +131 -0
- package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.en.mdx +97 -0
- package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.ru.mdx +97 -0
- package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.vi.mdx +97 -0
- package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.en.mdx +13 -5
- package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.ru.mdx +13 -5
- package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.vi.mdx +13 -5
- package/src/media/functional/functional-basic/functions/anyToString/anyToString.en.mdx +37 -19
- package/src/media/functional/functional-basic/functions/anyToString/anyToString.ru.mdx +37 -19
- package/src/media/functional/functional-basic/functions/anyToString/anyToString.vi.mdx +35 -17
- package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.en.mdx +31 -19
- package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.ru.mdx +31 -19
- package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.vi.mdx +32 -20
- package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.en.mdx +29 -15
- package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.ru.mdx +28 -14
- package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.vi.mdx +28 -14
- package/src/media/functional/functional-basic/functions/capitalize/capitalize.en.mdx +7 -3
- package/src/media/functional/functional-basic/functions/capitalize/capitalize.ru.mdx +7 -3
- package/src/media/functional/functional-basic/functions/capitalize/capitalize.vi.mdx +7 -3
- package/src/media/functional/functional-basic/functions/copyObject/copyObject.en.mdx +17 -13
- package/src/media/functional/functional-basic/functions/copyObject/copyObject.ru.mdx +17 -13
- package/src/media/functional/functional-basic/functions/copyObject/copyObject.vi.mdx +17 -13
- package/src/media/functional/functional-basic/functions/createElement/createElement.en.mdx +2 -0
- package/src/media/functional/functional-basic/functions/createElement/createElement.ru.mdx +2 -0
- package/src/media/functional/functional-basic/functions/createElement/createElement.vi.mdx +2 -0
- package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.en.mdx +1 -3
- package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.ru.mdx +1 -3
- package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.vi.mdx +1 -3
- package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.en.mdx +13 -10
- package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.ru.mdx +14 -11
- package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.vi.mdx +12 -9
- package/src/media/functional/functional-basic/functions/executePromise/executePromise.en.mdx +14 -13
- package/src/media/functional/functional-basic/functions/executePromise/executePromise.ru.mdx +15 -14
- package/src/media/functional/functional-basic/functions/executePromise/executePromise.vi.mdx +14 -13
- package/src/media/functional/functional-basic/functions/forEach/forEach.en.mdx +1 -1
- package/src/media/functional/functional-basic/functions/forEach/forEach.ru.mdx +1 -1
- package/src/media/functional/functional-basic/functions/forEach/forEach.vi.mdx +1 -1
- package/src/media/functional/functional-basic/functions/frame/frame.en.mdx +7 -4
- package/src/media/functional/functional-basic/functions/frame/frame.ru.mdx +6 -3
- package/src/media/functional/functional-basic/functions/frame/frame.vi.mdx +7 -4
- package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.en.mdx +34 -0
- package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.ru.mdx +34 -0
- package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.vi.mdx +35 -0
- package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.en.mdx +2 -0
- package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.ru.mdx +2 -0
- package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.vi.mdx +2 -0
- package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.en.mdx +21 -0
- package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.ru.mdx +21 -0
- package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.vi.mdx +21 -0
- package/src/media/functional/functional-basic/functions/getElementId/getElementId.en.mdx +17 -3
- package/src/media/functional/functional-basic/functions/getElementId/getElementId.ru.mdx +17 -3
- package/src/media/functional/functional-basic/functions/getElementId/getElementId.vi.mdx +18 -4
- package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.en.mdx +31 -0
- package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.ru.mdx +31 -0
- package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.vi.mdx +31 -0
- package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.en.mdx +25 -0
- package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.ru.mdx +25 -0
- package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.vi.mdx +25 -0
- package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.en.mdx +11 -4
- package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.ru.mdx +14 -7
- package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.vi.mdx +13 -6
- package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.en.mdx +3 -2
- package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.ru.mdx +3 -2
- package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.vi.mdx +3 -2
- package/src/media/functional/functional-basic/functions/toNumber/toNumber.en.mdx +25 -9
- package/src/media/functional/functional-basic/functions/toNumber/toNumber.ru.mdx +25 -9
- package/src/media/functional/functional-basic/functions/toNumber/toNumber.vi.mdx +25 -9
- package/src/media/functional/functional-basic/functions/toString/toString.en.mdx +28 -0
- package/src/media/functional/functional-basic/functions/toString/toString.ru.mdx +28 -0
- package/src/media/functional/functional-basic/functions/toString/toString.vi.mdx +28 -0
- package/src/media/functional/functional-basic/icons/icons.en.mdx +3 -0
- package/src/media/functional/functional-basic/icons/icons.ru.mdx +3 -0
- package/src/media/functional/functional-basic/icons/icons.vi.mdx +3 -0
- package/src/media/functional/nitro-basic/functions/getInject.en.mdx +27 -0
- package/src/media/functional/nitro-basic/functions/getInject.ru.mdx +27 -0
- package/src/media/functional/nitro-basic/functions/getInject.vi.mdx +20 -0
- package/src/media/functional/ui/about/about.en.mdx +45 -0
- package/src/media/functional/ui/about/about.ru.mdx +45 -0
- package/src/media/functional/ui/about/about.vi.mdx +45 -0
- package/src/media/functional/ui/component/component.en.mdx +104 -0
- package/src/media/functional/ui/component/component.ru.mdx +106 -0
- package/src/media/functional/ui/component/component.vi.mdx +104 -0
- package/src/media/functional/ui/setup/setup.en.mdx +72 -0
- package/src/media/functional/ui/setup/setup.ru.mdx +72 -0
- package/src/media/functional/ui/setup/setup.vi.mdx +72 -0
- package/src/media/functional/ui/wiki-data.en.mdx +114 -0
- package/src/media/functional/ui/wiki-data.ru.mdx +114 -0
- package/src/media/functional/ui/wiki-data.vi.mdx +114 -0
|
@@ -8,6 +8,7 @@ import { Meta } from '@storybook/addon-docs/blocks'
|
|
|
8
8
|
|
|
9
9
|
**Параметры:**
|
|
10
10
|
- `getter: () => Promise<T> | T` — Функция, которая возвращает вычисляемое значение (может быть синхронной или асинхронной).
|
|
11
|
+
- `initialState?: T` — Начальное значение результата.
|
|
11
12
|
|
|
12
13
|
**Возвращает:**
|
|
13
14
|
`CustomRef<T>` — Реактивное вычисляемое свойство с результатом выполнения геттера.
|
|
@@ -15,6 +16,13 @@ import { Meta } from '@storybook/addon-docs/blocks'
|
|
|
15
16
|
```typescript
|
|
16
17
|
import { computedEternity } from '@dxtmisha/functional'
|
|
17
18
|
|
|
19
|
+
// Начальное значение
|
|
20
|
+
const status = computedEternity(async () => {
|
|
21
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
22
|
+
return 'online'
|
|
23
|
+
}, 'offline')
|
|
24
|
+
// Status.value будет 'offline' до завершения выполнения геттера
|
|
25
|
+
|
|
18
26
|
// Асинхронный геттер - будет вызван только при первом обращении к 'data.value'
|
|
19
27
|
const data = computedEternity(async () => {
|
|
20
28
|
const response = await fetch('/api/data')
|
|
@@ -8,6 +8,7 @@ Tạo một thuộc tính tính toán được tính toán theo yêu cầu và
|
|
|
8
8
|
|
|
9
9
|
**Các tham số:**
|
|
10
10
|
- `getter: () => Promise<T> | T` — Một hàm trả về giá trị cần tính toán (có thể là đồng bộ hoặc bất đồng bộ).
|
|
11
|
+
- `initialState?: T` — Giá trị ban đầu của kết quả.
|
|
11
12
|
|
|
12
13
|
**Trả về:**
|
|
13
14
|
`CustomRef<T>` — Một ref tùy chỉnh phản ứng chứa kết quả đã giải quyết của getter.
|
|
@@ -15,6 +16,13 @@ Tạo một thuộc tính tính toán được tính toán theo yêu cầu và
|
|
|
15
16
|
```typescript
|
|
16
17
|
import { computedEternity } from '@dxtmisha/functional'
|
|
17
18
|
|
|
19
|
+
// Trạng thái ban đầu
|
|
20
|
+
const status = computedEternity(async () => {
|
|
21
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
22
|
+
return 'online'
|
|
23
|
+
}, 'offline')
|
|
24
|
+
// Status.value là 'offline' cho đến khi getter được giải quyết
|
|
25
|
+
|
|
18
26
|
// Getter bất đồng bộ - sẽ chỉ được gọi khi 'data.value' được truy cập lần đầu tiên
|
|
19
27
|
const data = computedEternity(async () => {
|
|
20
28
|
const response = await fetch('/api/data')
|
|
@@ -6,6 +6,17 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
6
6
|
|
|
7
7
|
The `Api` class is a central utility for making HTTP requests. It provides a simple interface for common methods and manages global settings like base URL, default headers, and lifecycle hooks.
|
|
8
8
|
|
|
9
|
+
### Key Capabilities
|
|
10
|
+
|
|
11
|
+
The class provides a comprehensive set of tools for managing network communication:
|
|
12
|
+
- **CRUD Methods** — execution of `GET`, `POST`, `PUT`, `PATCH`, `DELETE` requests.
|
|
13
|
+
- **Global Configuration** — setting up base URLs, headers, and parameters.
|
|
14
|
+
- **Lifecycle Hooks** — handling events before and after the request (e.g., for Refresh Token).
|
|
15
|
+
- **Hydration (SSR)** — transferring data from server to client to prevent duplicate requests.
|
|
16
|
+
- **Caching** — saving responses in memory or external storage (LocalStorage).
|
|
17
|
+
- **Response Emulation** — creating mock data for development and testing.
|
|
18
|
+
- **Loading and Error Management** — integration with global indicator components and error centers.
|
|
19
|
+
|
|
9
20
|
## Basic Usage
|
|
10
21
|
|
|
11
22
|
The simplest way to make a request is by using the static methods `get`, `post`, `put`, or `delete`. All methods support response typing via Generics.
|
|
@@ -84,6 +95,40 @@ Api.setEnd(async (response, apiFetch) => {
|
|
|
84
95
|
})
|
|
85
96
|
```
|
|
86
97
|
|
|
98
|
+
## Hydration
|
|
99
|
+
|
|
100
|
+
Hydration allows transferring data obtained during server-side rendering (SSR) to the client side. This prevents the same requests from being executed again immediately after the page loads.
|
|
101
|
+
|
|
102
|
+
1. **On the Server**: Perform the necessary requests and get the script via `Api.getHydrationScript()`.
|
|
103
|
+
2. **In the Template**: Insert the resulting string into the HTML.
|
|
104
|
+
3. **On the Client**: Upon `Api` initialization, the data will be automatically loaded into the response manager.
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// SSR Example
|
|
108
|
+
await Api.get({ path: 'settings' });
|
|
109
|
+
const hydrationScript = Api.getHydrationScript(); // <script>...</script>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Caching
|
|
113
|
+
|
|
114
|
+
The `Api` class supports automatic response caching. You can use either the built-in in-memory storage or connect external storage (e.g., `LocalStorage`).
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
import { ApiCache, DataStorage } from '@dxtmisha/functional-basic';
|
|
118
|
+
|
|
119
|
+
// Connecting external storage (optional)
|
|
120
|
+
ApiCache.init(
|
|
121
|
+
async (key) => DataStorage.get(key),
|
|
122
|
+
async (key, value) => DataStorage.set(key, value)
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Usage in a request
|
|
126
|
+
const data = await Api.get({
|
|
127
|
+
path: 'catalog/list',
|
|
128
|
+
cache: 3600 // Cache for 1 hour (in seconds)
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
87
132
|
## Response Emulation
|
|
88
133
|
|
|
89
134
|
The built-in `ApiResponse` manager (accessible via `Api.getResponse()`) allows you to intercept requests and return mock data. This is extremely useful for UI development when the backend is not ready, or for writing tests.
|
|
@@ -6,6 +6,17 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
6
6
|
|
|
7
7
|
Класс `Api` — это основной инструмент для работы с HTTP-запросами. Он предоставляет простой интерфейс для стандартных методов и управляет глобальными настройками, такими как базовый URL, заголовки по умолчанию и хуки жизненного цикла.
|
|
8
8
|
|
|
9
|
+
### Основные возможности
|
|
10
|
+
|
|
11
|
+
Класс предоставляет полный набор инструментов для управления сетевым взаимодействием:
|
|
12
|
+
- **CRUD методы** — выполнение `GET`, `POST`, `PUT`, `PATCH`, `DELETE` запросов.
|
|
13
|
+
- **Глобальная конфигурация** — настройка базовых URL, заголовков и параметров.
|
|
14
|
+
- **Хуки жизненного цикла** — обработка событий до и после запроса (например, для Refresh Token).
|
|
15
|
+
- **Гидратация (SSR)** — передача данных от сервера к клиенту для предотвращения дублирования запросов.
|
|
16
|
+
- **Кэширование** — сохранение ответов в памяти или внешнем хранилище (LocalStorage).
|
|
17
|
+
- **Эмуляция ответов** — создание мок-данных для разработки и тестирования.
|
|
18
|
+
- **Управление загрузкой и ошибками** — интеграция с глобальными компонентами индикации и центрами ошибок.
|
|
19
|
+
|
|
9
20
|
## Базовое использование
|
|
10
21
|
|
|
11
22
|
Самый простой способ выполнить запрос — использовать статические методы `get`, `post`, `put`, или `delete`. Все методы поддерживают типизацию ответа через Generic.
|
|
@@ -84,6 +95,40 @@ Api.setEnd(async (response, apiFetch) => {
|
|
|
84
95
|
})
|
|
85
96
|
```
|
|
86
97
|
|
|
98
|
+
## Гидратация
|
|
99
|
+
|
|
100
|
+
Гидратация позволяет передавать данные, полученные при серверном рендеринге (SSR), на клиентскую сторону. Это предотвращает повторное выполнение одних и тех же запросов сразу после загрузки страницы.
|
|
101
|
+
|
|
102
|
+
1. **На сервере**: выполните нужные запросы и получите скрипт через `Api.getHydrationScript()`.
|
|
103
|
+
2. **В шаблоне**: вставьте полученную строку в HTML.
|
|
104
|
+
3. **На клиенте**: при инициализации `Api` данные будут автоматически загружены в менеджер ответов.
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// Пример на сервере (SSR)
|
|
108
|
+
await Api.get({ path: 'settings' });
|
|
109
|
+
const hydrationScript = Api.getHydrationScript(); // <script>...</script>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Кэширование
|
|
113
|
+
|
|
114
|
+
Класс `Api` поддерживает автоматическое кэширование ответов. Вы можете использовать как встроенное хранилище в памяти, так и подключить внешнее (например, `LocalStorage`).
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
import { ApiCache, DataStorage } from '@dxtmisha/functional-basic';
|
|
118
|
+
|
|
119
|
+
// Подключение внешнего хранилища (необязательно)
|
|
120
|
+
ApiCache.init(
|
|
121
|
+
async (key) => DataStorage.get(key),
|
|
122
|
+
async (key, value) => DataStorage.set(key, value)
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Использование в запросе
|
|
126
|
+
const data = await Api.get({
|
|
127
|
+
path: 'catalog/list',
|
|
128
|
+
cache: 3600 // Кэшировать на 1 час (в секундах)
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
87
132
|
## Эмуляция ответов
|
|
88
133
|
|
|
89
134
|
Встроенный менеджер `ApiResponse` (доступен через `Api.getResponse()`) позволяет перехватывать запросы и возвращать мок-данные. Это крайне полезно при разработке интерфейса, когда бэкенд еще не готов, или для написания тестов.
|
|
@@ -6,6 +6,17 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
6
6
|
|
|
7
7
|
Lớp `Api` là công cụ trung tâm để thực hiện các yêu cầu HTTP. Nó cung cấp một giao diện đơn giản cho các phương thức phổ biến và quản lý các cài đặt toàn cục như URL cơ sở, tiêu đề mặc định và các hook vòng đời.
|
|
8
8
|
|
|
9
|
+
### Các khả năng chính
|
|
10
|
+
|
|
11
|
+
Lớp cung cấp một bộ công cụ toàn diện để quản lý tương tác mạng:
|
|
12
|
+
- **Các phương thức CRUD** — thực hiện các yêu cầu `GET`, `POST`, `PUT`, `PATCH`, `DELETE`.
|
|
13
|
+
- **Cấu hình toàn cục** — thiết lập URL cơ sở, tiêu đề và tham số.
|
|
14
|
+
- **Hook vòng đời** — xử lý các sự kiện trước và sau yêu cầu (ví dụ: cho Refresh Token).
|
|
15
|
+
- **Hydration (SSR)** — chuyển dữ liệu từ máy chủ sang máy khách để ngăn chặn các yêu cầu trùng lặp.
|
|
16
|
+
- **Bộ nhớ đệm (Caching)** — lưu các phản hồi trong bộ nhớ hoặc bộ nhớ ngoài (LocalStorage).
|
|
17
|
+
- **Giả lập phản hồi** — tạo dữ liệu giả để phát triển và kiểm thử.
|
|
18
|
+
- **Quản lý tải và lỗi** — tích hợp với các thành phần chỉ báo toàn cục và trung tâm lỗi.
|
|
19
|
+
|
|
9
20
|
## Cách dùng cơ bản
|
|
10
21
|
|
|
11
22
|
Cách đơn giản nhất để thực hiện yêu cầu là sử dụng các phương thức tĩnh `get`, `post`, `put`, hoặc `delete`. Tất cả các phương thức đều hỗ trợ định nghĩa kiểu dữ liệu (typing) thông qua Generic.
|
|
@@ -84,6 +95,40 @@ Api.setEnd(async (response, apiFetch) => {
|
|
|
84
95
|
})
|
|
85
96
|
```
|
|
86
97
|
|
|
98
|
+
## Hydration
|
|
99
|
+
|
|
100
|
+
Hydration cho phép chuyển dữ liệu thu được trong quá trình server-side rendering (SSR) sang phía máy khách. Điều này ngăn chặn việc thực hiện lại các yêu cầu tương tự ngay sau khi trang tải xong.
|
|
101
|
+
|
|
102
|
+
1. **Trên máy chủ**: Thực hiện các yêu cầu cần thiết và lấy script qua `Api.getHydrationScript()`.
|
|
103
|
+
2. **Trong mẫu (Template)**: Chèn chuỗi kết quả vào HTML.
|
|
104
|
+
3. **Trên máy khách**: Khi khởi tạo `Api`, dữ liệu sẽ tự động được tải vào trình quản lý phản hồi.
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// Ví dụ SSR
|
|
108
|
+
await Api.get({ path: 'settings' });
|
|
109
|
+
const hydrationScript = Api.getHydrationScript(); // <script>...</script>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Bộ nhớ đệm (Caching)
|
|
113
|
+
|
|
114
|
+
Lớp `Api` hỗ trợ tự động lưu bộ nhớ đệm cho các phản hồi. Bạn có thể sử dụng bộ nhớ trong tích hợp hoặc kết nối bộ nhớ ngoài (ví dụ: `LocalStorage`).
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
import { ApiCache, DataStorage } from '@dxtmisha/functional-basic';
|
|
118
|
+
|
|
119
|
+
// Kết nối bộ nhớ ngoài (tùy chọn)
|
|
120
|
+
ApiCache.init(
|
|
121
|
+
async (key) => DataStorage.get(key),
|
|
122
|
+
async (key, value) => DataStorage.set(key, value)
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Sử dụng trong một yêu cầu
|
|
126
|
+
const data = await Api.get({
|
|
127
|
+
path: 'catalog/list',
|
|
128
|
+
cache: 3600 // Lưu bộ nhớ đệm trong 1 giờ (tính bằng giây)
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
87
132
|
## Giả lập phản hồi
|
|
88
133
|
|
|
89
134
|
Trình quản lý `ApiResponse` tích hợp sẵn (có thể truy cập qua `Api.getResponse()`) cho phép bạn chặn các yêu cầu và trả về dữ liệu giả (mock). Điều này cực kỳ hữu ích cho việc phát triển giao diện khi backend chưa sẵn sàng hoặc để viết các bài kiểm thử.
|
|
@@ -1,78 +1,81 @@
|
|
|
1
1
|
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
2
|
|
|
3
|
-
<Meta title='@dxtmisha/en/functional-basic/Classes/Api - Request Management'/>
|
|
3
|
+
<Meta title='@dxtmisha/en/functional-basic/Classes/Api - Request Management (Static)'/>
|
|
4
4
|
|
|
5
5
|
# Api Class
|
|
6
6
|
|
|
7
|
-
`Api` is a static wrapper
|
|
7
|
+
The `Api` class is a **Primary Class (Static)** and serves as the main entry point for managing HTTP requests. It is a static wrapper around a globally managed `ApiInstance`, providing a clean, singleton-based interface for standard network operations.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Key Features
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
- **Static Interface** — perform standard HTTP operations (`GET`, `POST`, etc.) without manual instantiation.
|
|
12
|
+
- **Global Lifecycle Hooks** — configure request preparation and analysis once for the entire application.
|
|
13
|
+
- **SSR Isolation** — utilizes `ServerStorage` to manage individual instance isolation during server-side rendering.
|
|
14
|
+
- **Simplified Setup** — provides a unified `setConfig` method to apply multiple configuration layers at once.
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
Api.setUrl('https://api.example.com/v1/')
|
|
16
|
-
Api.setHeaders({ 'Authorization': 'Bearer token123' })
|
|
16
|
+
## Methods
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
```
|
|
18
|
+
### Action
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
Methods for performing physical network requests.
|
|
21
|
+
|
|
22
|
+
- `request<T>(pathRequest: string | ApiFetch): Promise<T>` — Core executor; accepts a path string or configuration object.
|
|
23
|
+
- `get<T>(request: ApiFetch): Promise<T>` — Sends a GET request.
|
|
24
|
+
- `post<T>(request: ApiFetch): Promise<T>` — Sends a POST request.
|
|
25
|
+
- `put<T>(request: ApiFetch): Promise<T>` — Sends a PUT request.
|
|
26
|
+
- `patch<T>(request: ApiFetch): Promise<T>` — Sends a PATCH request.
|
|
27
|
+
- `delete<T>(request: ApiFetch): Promise<T>` — Sends a DELETE request.
|
|
28
|
+
|
|
29
|
+
### Check
|
|
30
|
+
|
|
31
|
+
- `isLocalhost(): boolean` — Checks if the current environment is a local development server.
|
|
22
32
|
|
|
23
|
-
###
|
|
33
|
+
### Configuration
|
|
24
34
|
|
|
25
|
-
- `
|
|
35
|
+
- `setUrl(url: string): void` — Changes the base API URL.
|
|
36
|
+
- `setHeaders(headers: Record<string, string>): void` — Sets default request headers.
|
|
37
|
+
- `setRequestDefault(request: Record<string, any>): void` — Sets default request body data.
|
|
38
|
+
- `setPreparation(callback): void` — Registers a hook to run before every enabled request.
|
|
39
|
+
- `setEnd(callback): void` — Registers a hook to run after every enabled response.
|
|
40
|
+
- `setTimeout(timeout: number): void` — Changes the global request timeout.
|
|
41
|
+
- `setOrigin(origin: string): void` — Changes the origin (protocol and domain) for the base URL.
|
|
42
|
+
- `setConfig(config?: ApiConfig): void` — Applies a complete configuration object.
|
|
26
43
|
|
|
27
|
-
###
|
|
44
|
+
### Auxiliary
|
|
28
45
|
|
|
29
|
-
- `
|
|
30
|
-
- `
|
|
31
|
-
- `
|
|
32
|
-
- `
|
|
33
|
-
- `
|
|
34
|
-
- `
|
|
46
|
+
- `getStatus(): ApiStatus` — Accesses the status manager for the last request.
|
|
47
|
+
- `getResponse(): ApiResponse` — Accesses the response/emulation manager.
|
|
48
|
+
- `getHydration(): ApiHydration` — Accesses the hydration manager.
|
|
49
|
+
- `getHydrationScript(): string` — Returns the script block for SSR-to-client hydration.
|
|
50
|
+
- `getOrigin(): string` — Returns the base origin URL combined with the API path.
|
|
51
|
+
- `getUrl(path: string, api?: boolean): string` — Returns the fully resolved URL with `{locale}`, `{country}`, `{language}` placeholder substitution.
|
|
52
|
+
- `getBody(request, method?): string | FormData | undefined` — Prepares the request body.
|
|
53
|
+
- `getBodyForGet(request, path?, method?): string` — Prepares the query string.
|
|
54
|
+
- `getItem(): ApiInstance` — Returns the underlying `ApiInstance` object.
|
|
35
55
|
|
|
36
|
-
|
|
56
|
+
## Types
|
|
37
57
|
|
|
38
|
-
|
|
58
|
+
### ApiConfig
|
|
39
59
|
|
|
40
|
-
- `
|
|
41
|
-
- `
|
|
42
|
-
- `
|
|
43
|
-
- `
|
|
44
|
-
- `
|
|
45
|
-
- `
|
|
60
|
+
- `urlRoot: string` — the base URL for the API.
|
|
61
|
+
- `origin: string` — protocol and domain for the base URL.
|
|
62
|
+
- `headers: Record<string, string>` — default request headers.
|
|
63
|
+
- `requestDefault: Record<string, any>` — default request data.
|
|
64
|
+
- `preparation: (apiFetch: ApiFetch) => Promise<void>` — entry hook.
|
|
65
|
+
- `end: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>` — exit hook.
|
|
66
|
+
- `timeout: number` — global timeout in milliseconds.
|
|
46
67
|
|
|
47
|
-
|
|
68
|
+
## Proxy Architecture
|
|
48
69
|
|
|
49
|
-
|
|
50
|
-
- `get<T>(request: ApiFetch): Promise<T>` — Sends an HTTP GET request.
|
|
51
|
-
- `post<T>(request: ApiFetch): Promise<T>` — Sends an HTTP POST request.
|
|
52
|
-
- `put<T>(request: ApiFetch): Promise<T>` — Sends an HTTP PUT request.
|
|
53
|
-
- `delete<T>(request: ApiFetch): Promise<T>` — Sends an HTTP DELETE request.
|
|
70
|
+
The `Api` class operates as a **Static Proxy**. All method calls are redirected to an internal `ApiInstance`.
|
|
54
71
|
|
|
55
|
-
|
|
72
|
+
### Instance Management
|
|
56
73
|
|
|
57
|
-
The `
|
|
74
|
+
The internal manager is stored in `ServerStorage` using a unique key (`__dxt_api_instance__`). This architecture solves two major problems:
|
|
58
75
|
|
|
59
|
-
|
|
60
|
-
|
|
76
|
+
1. **Thread Safety in SSR**: During server-side rendering, `ServerStorage` ensures that each incoming request has its own isolated API configuration and state, preventing data leaks between users.
|
|
77
|
+
2. **Singleton Simplicity on Client**: On the client side, it behaves as a true singleton, allowing you to configure the API in your entry point and use it anywhere without passing instances.
|
|
61
78
|
|
|
62
|
-
|
|
63
|
-
urlRoot: 'https://api.example.com/v1/',
|
|
64
|
-
headers: { 'Authorization': 'Bearer token123' },
|
|
65
|
-
requestDefault: { source: 'webapp' },
|
|
66
|
-
preparation: async (apiFetch) => {
|
|
67
|
-
console.log('Preparing:', apiFetch.path)
|
|
68
|
-
},
|
|
69
|
-
end: async (response, apiFetch) => {
|
|
70
|
-
if (response.status === 401) {
|
|
71
|
-
return { reset: true }
|
|
72
|
-
}
|
|
73
|
-
return {}
|
|
74
|
-
}
|
|
75
|
-
})
|
|
76
|
-
```
|
|
79
|
+
### Delegation
|
|
77
80
|
|
|
78
|
-
|
|
81
|
+
While `Api` is the preferred interface for standard application logic, the core logic (retries, hydration logic, jitter) resides within `ApiInstance`. For advanced scenarios involving multiple base URLs or different header sets simultaneously, you may instantiate `ApiInstance` directly.
|
|
@@ -1,78 +1,81 @@
|
|
|
1
1
|
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
2
|
|
|
3
|
-
<Meta title='@dxtmisha/ru/functional-basic/Classes/Api - Управление запросами'/>
|
|
3
|
+
<Meta title='@dxtmisha/ru/functional-basic/Classes/Api - Управление запросами (Static)'/>
|
|
4
4
|
|
|
5
5
|
# Класс Api
|
|
6
6
|
|
|
7
|
-
`Api`
|
|
7
|
+
Класс `Api` является **основным классом (статическим)** и служит главной точкой входа для управления HTTP-запросами. Он представляет собой статическую обертку над глобально управляемым `ApiInstance`, предоставляя чистый интерфейс на основе синглтона для стандартных сетевых операций.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Ключевые особенности
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
- **Статический интерфейс** — выполнение стандартных HTTP-операций (`GET`, `POST` и т. д.) без необходимости ручного создания экземпляров.
|
|
12
|
+
- **Глобальные хуки жизненного цикла** — настройте подготовку и анализ запросов один раз для всего приложения.
|
|
13
|
+
- **Изоляция в SSR** — использует `ServerStorage` для управления изоляцией отдельных экземпляров во время рендеринга на стороне сервера.
|
|
14
|
+
- **Упрощенная настройка** — предоставляет унифицированный метод `setConfig` для одновременного применения нескольких слоев конфигурации.
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
Api.setUrl('https://api.example.com/v1/')
|
|
16
|
-
Api.setHeaders({ 'Authorization': 'Bearer token123' })
|
|
16
|
+
## Методы
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
```
|
|
18
|
+
### Действие
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
Методы для выполнения физических сетевых запросов.
|
|
21
|
+
|
|
22
|
+
- `request<T>(pathRequest: string | ApiFetch): Promise<T>` — Основной исполнитель; принимает строку пути или объект конфигурации.
|
|
23
|
+
- `get<T>(request: ApiFetch): Promise<T>` — Отправляет GET-запрос.
|
|
24
|
+
- `post<T>(request: ApiFetch): Promise<T>` — Отправляет POST-запрос.
|
|
25
|
+
- `put<T>(request: ApiFetch): Promise<T>` — Отправляет PUT-запрос.
|
|
26
|
+
- `patch<T>(request: ApiFetch): Promise<T>` — Отправляет PATCH-запрос.
|
|
27
|
+
- `delete<T>(request: ApiFetch): Promise<T>` — Отправляет DELETE-запрос.
|
|
28
|
+
|
|
29
|
+
### Проверка
|
|
30
|
+
|
|
31
|
+
- `isLocalhost(): boolean` — Проверяет, запущена ли среда на локальном сервере разработки.
|
|
22
32
|
|
|
23
|
-
###
|
|
33
|
+
### Конфигурация
|
|
24
34
|
|
|
25
|
-
- `
|
|
35
|
+
- `setUrl(url: string): void` — Изменяет базовый URL API.
|
|
36
|
+
- `setHeaders(headers: Record<string, string>): void` — Устанавливает заголовки запроса по умолчанию.
|
|
37
|
+
- `setRequestDefault(request: Record<string, any>): void` — Устанавливает данные тела запроса по умолчанию.
|
|
38
|
+
- `setPreparation(callback): void` — Регистрирует хук, запускаемый перед каждым включенным запросом.
|
|
39
|
+
- `setEnd(callback): void` — Регистрирует хук, запускаемый после каждого включенного ответа.
|
|
40
|
+
- `setTimeout(timeout: number): void` — Изменяет глобальный таймаут запроса.
|
|
41
|
+
- `setOrigin(origin: string): void` — Изменяет источник (протокол и домен) для базового URL.
|
|
42
|
+
- `setConfig(config?: ApiConfig): void` — Применяет полный объект конфигурации.
|
|
26
43
|
|
|
27
|
-
###
|
|
44
|
+
### Вспомогательные
|
|
28
45
|
|
|
29
|
-
- `
|
|
30
|
-
- `
|
|
31
|
-
- `
|
|
32
|
-
- `
|
|
33
|
-
- `
|
|
34
|
-
- `
|
|
46
|
+
- `getStatus(): ApiStatus` — Доступ к менеджеру статуса последнего запроса.
|
|
47
|
+
- `getResponse(): ApiResponse` — Доступ к менеджеру ответов/эмуляции.
|
|
48
|
+
- `getHydration(): ApiHydration` — Доступ к менеджеру гидратации.
|
|
49
|
+
- `getHydrationScript(): string` — Возвращает блок скрипта для гидратации SSR-клиент.
|
|
50
|
+
- `getOrigin(): string` — Возвращает базовый URL источника, объединенный с путем API.
|
|
51
|
+
- `getUrl(path: string, api?: boolean): string` — Возвращает полностью разрешенный URL с подстановкой плейсхолдеров `{locale}`, `{country}`, `{language}`.
|
|
52
|
+
- `getBody(request?, method?): string | FormData | undefined` — Подготавливает тело запроса.
|
|
53
|
+
- `getBodyForGet(request, path?, method?): string` — Подготавливает строку запроса.
|
|
54
|
+
- `getItem(): ApiInstance` — Возвращает базовый объект `ApiInstance`.
|
|
35
55
|
|
|
36
|
-
|
|
56
|
+
## Типы
|
|
37
57
|
|
|
38
|
-
|
|
58
|
+
### ApiConfig
|
|
39
59
|
|
|
40
|
-
- `
|
|
41
|
-
- `
|
|
42
|
-
- `
|
|
43
|
-
- `
|
|
44
|
-
- `
|
|
45
|
-
- `
|
|
60
|
+
- `urlRoot: string` — базовый URL для API.
|
|
61
|
+
- `origin: string` — протокол и домен для формирования базового URL.
|
|
62
|
+
- `headers: Record<string, string>` — заголовки запроса по умолчанию.
|
|
63
|
+
- `requestDefault: Record<string, any>` — данные запроса по умолчанию.
|
|
64
|
+
- `preparation: (apiFetch: ApiFetch) => Promise<void>` — входной хук.
|
|
65
|
+
- `end: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>` — выходной хук.
|
|
66
|
+
- `timeout: number` — глобальный таймаут в миллисекундах.
|
|
46
67
|
|
|
47
|
-
|
|
68
|
+
## Прокси-архитектура
|
|
48
69
|
|
|
49
|
-
|
|
50
|
-
- `get<T>(request: ApiFetch): Promise<T>` — Отправляет HTTP GET запрос.
|
|
51
|
-
- `post<T>(request: ApiFetch): Promise<T>` — Отправляет HTTP POST запрос.
|
|
52
|
-
- `put<T>(request: ApiFetch): Promise<T>` — Отправляет HTTP PUT запрос.
|
|
53
|
-
- `delete<T>(request: ApiFetch): Promise<T>` — Отправляет HTTP DELETE запрос.
|
|
70
|
+
Класс `Api` работает как **статический прокси**. Все вызовы методов перенаправляются на внутренний `ApiInstance`.
|
|
54
71
|
|
|
55
|
-
|
|
72
|
+
### Управление экземпляром
|
|
56
73
|
|
|
57
|
-
|
|
74
|
+
Внутренний менеджер хранится в `ServerStorage` под уникальным ключом (`__dxt_api_instance__`). Эта архитектура решает две основные проблемы:
|
|
58
75
|
|
|
59
|
-
|
|
60
|
-
|
|
76
|
+
1. **Потокобезопасность в SSR**: Во время рендеринга на стороне сервера `ServerStorage` гарантирует, что каждый входящий запрос имеет свою собственную изолированную конфигурацию и состояние API, предотвращая утечку данных между пользователями.
|
|
77
|
+
2. **Простота синглтона на клиенте**: На стороне клиента он ведет себя как настоящий синглтон, позволяя настроить API в точке входа и использовать его где угодно без передачи экземпляров.
|
|
61
78
|
|
|
62
|
-
|
|
63
|
-
urlRoot: 'https://api.example.com/v1/',
|
|
64
|
-
headers: { 'Authorization': 'Bearer token123' },
|
|
65
|
-
requestDefault: { source: 'webapp' },
|
|
66
|
-
preparation: async (apiFetch) => {
|
|
67
|
-
console.log('Подготовка:', apiFetch.path)
|
|
68
|
-
},
|
|
69
|
-
end: async (response, apiFetch) => {
|
|
70
|
-
if (response.status === 401) {
|
|
71
|
-
return { reset: true }
|
|
72
|
-
}
|
|
73
|
-
return {}
|
|
74
|
-
}
|
|
75
|
-
})
|
|
76
|
-
```
|
|
79
|
+
### Делегирование
|
|
77
80
|
|
|
78
|
-
|
|
81
|
+
Хотя `Api` является предпочтительным интерфейсом для стандартной логики приложения, основная логика (повторы, гидратация, джиттер) находится внутри `ApiInstance`. Для сложных сценариев, включающих несколько базовых URL-адресов или разные наборы заголовков одновременно, вы можете создавать экземпляры `ApiInstance` напрямую.
|