@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
|
@@ -10,11 +10,13 @@ Nó kết hợp chặt chẽ với các lớp phụ thuộc: `ApiStatus`, `ApiRe
|
|
|
10
10
|
|
|
11
11
|
## Các tính năng chính
|
|
12
12
|
|
|
13
|
-
- **Các phương thức CRUD** — các bí danh (alias) tiện lợi `get`, `post`, `put`, `delete` để thao tác với các yêu cầu HTTP
|
|
13
|
+
- **Các phương thức CRUD** — các bí danh (alias) tiện lợi `get`, `post`, `put`, `patch`, `delete` để thao tác với các yêu cầu HTTP
|
|
14
14
|
- **Cấu hình toàn cục (Global Configuration)** — thiết lập URL cơ sở (base URL), header và tham số mặc định cho tất cả yêu cầu
|
|
15
15
|
- **Các Hook vòng đời (Lifecycle Hooks)** — khả năng xác định các hàm callback được thực thi trước (`setPreparation`) và sau (`setEnd`) mỗi yêu cầu
|
|
16
16
|
- **Theo dõi trạng thái** — truy cập trạng thái và lỗi của yêu cầu cuối cùng thông qua `ApiStatus`
|
|
17
|
-
- **
|
|
17
|
+
- **Hydration** — chuyển dữ liệu từ máy chủ sang máy khách (SSR) để hiển thị tức thì
|
|
18
|
+
- **Bộ nhớ đệm (Caching)** — lưu các phản hồi trong bộ nhớ trong hoặc ngoài thông qua `ApiCache`
|
|
19
|
+
- **Giả lập phản hồi** — quản lý linh hoạt dữ liệu giả thông qua `ApiResponse`
|
|
18
20
|
- **Tự động phân tích dữ liệu** — tự động chuyển đổi định dạng body thành JSON/FormData và trích xuất dữ liệu từ các phản hồi JSON
|
|
19
21
|
- **Định vị khu vực (Geolocation)** — tự động thay thế các tham số `{locale}`, `{country}`, `{language}` trong đường dẫn yêu cầu
|
|
20
22
|
|
|
@@ -36,9 +38,11 @@ Thực thể `ApiInstance` có thể được cấu hình trong quá trình kh
|
|
|
36
38
|
- `loadingClass?: LoadingInstance` — thực thể của trình quản lý chỉ báo tải (mặc định: `Loading.getItem()`).
|
|
37
39
|
- `errorCenterClass?: ErrorCenterInstance` — thực thể của trung tâm lỗi để kích hoạt các sự kiện (mặc định: `ErrorCenter.getItem()`).
|
|
38
40
|
|
|
39
|
-
##
|
|
41
|
+
## Các phương thức
|
|
40
42
|
|
|
41
|
-
###
|
|
43
|
+
### Hành động
|
|
44
|
+
|
|
45
|
+
#### `request`
|
|
42
46
|
|
|
43
47
|
Thuật toán kích hoạt thực hiện tác vụ chính trên fetch thuần mạng vật lý. Nếu cung cấp trong ngữ cảnh string cô đơn mà không phải Object, nó kích hoạt hệ phân tán luồng định sẵn cài cắm theo kiểu `GET`.
|
|
44
48
|
Khi hệ thống bối rối hoặc gọi trượt giao thức mạng (như lỗi nội bộ 500 status), chương trình chủ lực sẽ trực xuất luôn mã lỗi (`throw e`), qua đó giúp lập trình viên dùng `try/catch` thu hồi lệnh dễ dàng. Khi máy chủ trả lại tệp Object thuộc chuẩn JSON, gói nhận dạng trạng thái lệnh (`statusObject`) sẽ đắp kèm thành khối liền mạch trước khi đẩy về UI.
|
|
@@ -48,72 +52,46 @@ Khi hệ thống bối rối hoặc gọi trượt giao thức mạng (như lỗ
|
|
|
48
52
|
|
|
49
53
|
**Trả về:** `Promise<ApiData<T>>` — giao diện format hoàn thiện của phản hồi mã hóa (decoded). Bao gồm các thông số biến (`data`, `statusObject`...) đi kèm nếu server nhả form dữ liệu có bọc.
|
|
50
54
|
|
|
51
|
-
###
|
|
52
|
-
|
|
53
|
-
Bật một khối yêu cầu API bằng giao thức `GET` theo cơ chế gỡ rối và ép đầu cung dữ liệu thông số search URL lên cấu trúc HTTP tự động.
|
|
54
|
-
|
|
55
|
-
**Tham số:**
|
|
56
|
-
- `request: ApiFetch` — Các thông số truy xuất của lệnh.
|
|
57
|
-
|
|
58
|
-
**Trả về:** `Promise<T>`
|
|
59
|
-
|
|
60
|
-
### `post`
|
|
61
|
-
|
|
62
|
-
Giao chuyển chùm truy vấn truyền động REST/GraphQL bằng luồng định tuyến tuân thủ HTTP `POST`.
|
|
63
|
-
|
|
64
|
-
**Tham số:**
|
|
65
|
-
- `request: ApiFetch` — Cơ sở cấu hình bao bọc giao diện, kèm tham số URL hiện chỉ định.
|
|
66
|
-
|
|
67
|
-
**Trả về:** `Promise<T>`
|
|
68
|
-
|
|
69
|
-
### `put`
|
|
70
|
-
|
|
71
|
-
Trình bày khả năng hiệu chỉnh một khối dữ liệu thông qua cấu hình thao tác tiêu chuẩn ở hệ phương án `PUT`.
|
|
55
|
+
### Các phương thức rút gọn
|
|
72
56
|
|
|
73
|
-
|
|
74
|
-
- `request: ApiFetch
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
### `delete`
|
|
79
|
-
|
|
80
|
-
Phát tín hiệu dọn dẹp theo phân hóa truyền thống ở nhát kích HTTP `DELETE`.
|
|
81
|
-
|
|
82
|
-
**Tham số:**
|
|
83
|
-
- `request: ApiFetch` — Bọc thông số liên kết arguments format.
|
|
57
|
+
- `get(request: ApiFetch): Promise<T>` — Bật một khối yêu cầu API bằng giao thức `GET` theo cơ chế gỡ rối và ép đầu cung dữ liệu thông số search URL lên cấu trúc HTTP tự động.
|
|
58
|
+
- `post(request: ApiFetch): Promise<T>` — Giao chuyển chùm truy vấn truyền động REST/GraphQL bằng luồng định tuyến tuân thủ HTTP `POST`.
|
|
59
|
+
- `put(request: ApiFetch): Promise<T>` — Trình bày khả năng hiệu chỉnh một khối dữ liệu thông qua cấu hình thao tác tiêu chuẩn ở hệ phương án `PUT`.
|
|
60
|
+
- `patch(request: ApiFetch): Promise<T>` — Kích hoạt việc cập nhật từng phần thông tin (partial update) của tài nguyên thông qua phương thức HTTP `PATCH`.
|
|
61
|
+
- `delete(request: ApiFetch): Promise<T>` — Phát tín hiệu dọn dẹp theo phân hóa truyền thống ở nhát kích HTTP `DELETE`.
|
|
84
62
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
## Các phương thức khởi tạo Interface
|
|
63
|
+
### Kiểm tra
|
|
88
64
|
|
|
89
65
|
- `isLocalhost(): boolean` — Kiểm tra xem mã có đang thực thi trên một máy chủ phát triển localhost không.
|
|
90
66
|
- `getStatus(): ApiStatus` — Trả về trình quản lý trạng thái `ApiStatus` để theo dõi mã trạng thái HTTP.
|
|
91
67
|
- `getResponse(): ApiResponse` — Trả về trình quản lý bộ giả lập và phản hồi `ApiResponse`.
|
|
92
68
|
|
|
93
|
-
|
|
69
|
+
### Cấu hình
|
|
94
70
|
|
|
95
|
-
Hỗ trợ phương pháp nối chuỗi (chaining methods) trả về đối tượng `ApiInstance` mấu chốt
|
|
71
|
+
Hỗ trợ phương pháp nối chuỗi (chaining methods) trả về đối tượng `ApiInstance` mấu chốt:
|
|
96
72
|
- `setHeaders(headers: Record<string, string>): this` — Áp dụng một thư mục Header chuẩn cho toàn hệ thống.
|
|
97
73
|
- `setRequestDefault(request: Record<string, any>): this` — Đưa toàn bộ thông số tham số mặc định chuẩn vào mạng.
|
|
98
74
|
- `setUrl(url: string): this` — Ghi đè định danh URL mặc định nhánh server API.
|
|
99
75
|
- `setPreparation(callback: (apiFetch: ApiFetch) => Promise<void>): this` — Thiết lập vòng lặp hook _ngay trước_ thời khắc thao tác diễn ra.
|
|
100
76
|
- `setEnd(callback: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>): this` — Thiết lập vòng lặp hook _sau_ khi tín hiệu mạng phản hồi trả về.
|
|
77
|
+
- `setOrigin(origin: string): this` — Thiết lập nguồn (giao thức và tên miền) cho URL base.
|
|
101
78
|
|
|
102
|
-
|
|
79
|
+
### Phụ trợ
|
|
103
80
|
|
|
104
81
|
- `getUrl(path: string, api?: boolean): string` — Tạo ra đường dẫn API đầy đủ, tự thay thế thẻ định danh quốc gia `{locale}`, `{country}` v.v...
|
|
82
|
+
- `getOrigin(): string` — Trả về URL base đã kết hợp với đường dẫn API.
|
|
105
83
|
- `getBody(request?: ApiFetch['request'], method?: string): string | FormData | undefined` — Hoán đổi tài liệu để form nạp JSON hoặc `FormData`.
|
|
106
84
|
- `getBodyForGet(request: ApiFetch['request'], path?: string, method?: string): string` — Hoàn trả dữ liệu params cấu hình chuẩn cho thanh Search URL `GET`.
|
|
107
85
|
|
|
108
86
|
## Đối tượng ApiFetch
|
|
109
87
|
|
|
110
|
-
`ApiFetch` là đối tượng cấu hình chính được truyền vào các phương thức `request`, `get`, `post`, `put`, `delete`. Tất cả các trường đều là tùy chọn:
|
|
88
|
+
`ApiFetch` là đối tượng cấu hình chính được truyền vào các phương thức `request`, `get`, `post`, `put`, `patch`, `delete`. Tất cả các trường đều là tùy chọn:
|
|
111
89
|
|
|
112
90
|
- `path?: string` — đường dẫn đến endpoint tương đối với URL cơ sở (ví dụ: `'users/list'`).
|
|
113
91
|
- `pathFull?: string` — URL đầy đủ của yêu cầu. Nếu có, sẽ bỏ qua `api` và `path`.
|
|
114
92
|
- `api?: boolean` — có thêm URL cơ sở vào trước `path` không. Mặc định: `true`.
|
|
115
|
-
- `method?: ApiMethod` — phương thức HTTP (`'GET'`, `'POST'`, `'PUT'`, `'DELETE'`). Mặc định: `'GET'`.
|
|
116
|
-
- `request?: FormData | Record<string, any> | string` — nội dung yêu cầu (POST/PUT) hoặc tham số query (GET). Được gửi dưới dạng JSON hoặc `FormData`.
|
|
93
|
+
- `method?: ApiMethod` — phương thức HTTP (`'GET'`, `'POST'`, `'PUT'`, `'PATCH'`, `'DELETE'`). Mặc định: `'GET'`.
|
|
94
|
+
- `request?: FormData | Record<string, any> | string` — nội dung yêu cầu (POST/PUT/PATCH) hoặc tham số query (GET). Được gửi dưới dạng JSON hoặc `FormData`.
|
|
117
95
|
- `headers?: Record<string, string> | null` — tiêu đề bổ sung. `null` — tắt tất cả tiêu đề.
|
|
118
96
|
- `type?: string` — giá trị `Content-Type`. Mặc định: `'application/json;charset=UTF-8'`.
|
|
119
97
|
- `auth?: boolean` — thêm tiêu đề xác thực.
|
|
@@ -128,7 +106,8 @@ Hỗ trợ phương pháp nối chuỗi (chaining methods) trả về đối tư
|
|
|
128
106
|
- `timeout?: number` — thời gian chờ yêu cầu tính bằng mili giây. Mặc định: `16000`ms.
|
|
129
107
|
- `controller?: AbortController` — bộ điều khiển để hủy yêu cầu.
|
|
130
108
|
- `retry?: number` — số lần thử lại khi thất bại.
|
|
131
|
-
- `retryDelay?: number` — độ trễ cơ bản giữa các lần thử lại tính bằng mili giây. Mặc định: `64`ms.
|
|
109
|
+
- `retryDelay?: number` — độ trễ cơ bản giữa các lần thử lại tính bằng mili giây. Mặc định: `64`ms. Jitter được sử dụng để ngăn chặn vấn đề thundering herd.
|
|
110
|
+
- `endResetLimit?: number` — giới hạn đệ quy thử lại thông qua `setEnd` với `reset: true`. Mặc định: `8`.
|
|
132
111
|
|
|
133
112
|
## Cấu trúc dữ liệu phản hồi
|
|
134
113
|
|
|
@@ -215,7 +194,7 @@ Phương thức `setEnd` thiết lập một hàm callback được gọi sau kh
|
|
|
215
194
|
- `apiFetch: ApiFetch` — đối tượng tham số đã dùng để thực hiện yêu cầu.
|
|
216
195
|
|
|
217
196
|
**Trả về:** `Promise<ApiPreparationEnd>`. Đối tượng kết quả có thể chứa các trường sau:
|
|
218
|
-
- `reset?: boolean` — nếu được đặt thành `true`, thư viện sẽ hủy chuỗi hiện tại và **thực hiện lại yêu cầu** (đệ quy) sau một khoảng trễ ngẫu nhiên (xem `retryDelay`). Toàn bộ quá trình chuẩn bị và thực thi sẽ được khởi động lại. Việc này được dùng để tự động xử lý quyền truy cập đã được làm mới.
|
|
197
|
+
- `reset?: boolean` — nếu được đặt thành `true`, thư viện sẽ hủy chuỗi hiện tại và **thực hiện lại yêu cầu** (đệ quy) sau một khoảng trễ ngẫu nhiên (xem `retryDelay`). Toàn bộ quá trình chuẩn bị và thực thi sẽ được khởi động lại. Việc này được dùng để tự động xử lý quyền truy cập đã được làm mới. Quá trình đệ quy này được giới hạn bởi `endResetLimit` (mặc định: 8).
|
|
219
198
|
- `data?: any` — cho phép bạn ghi đè dữ liệu mà phương thức API trả về. Nếu trường này được chỉ định, cơ chế đọc phản hồi tiêu chuẩn (JSON/văn bản) sẽ bị bỏ qua.
|
|
220
199
|
|
|
221
200
|
```javascript
|
|
@@ -245,7 +224,82 @@ Bạn có thể tắt chọn lọc các hook toàn cục trong đối tượng `
|
|
|
245
224
|
- `globalPreparation: false` — bỏ qua việc thực thi hook `setPreparation`.
|
|
246
225
|
- `globalEnd: false` — bỏ qua việc thực thi hook `setEnd`.
|
|
247
226
|
|
|
248
|
-
|
|
227
|
+
|
|
228
|
+
## Hydration
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
Hydration là một cơ chế để chuyển dữ liệu thu được trong quá trình Server-Side Rendering (SSR) sang phía client. Điều này giúp tránh việc thực hiện lại các yêu cầu mạng tương tự ngay sau khi trang được tải trong trình duyệt, giúp tăng tốc độ hiển thị và giảm tải cho máy chủ.
|
|
232
|
+
|
|
233
|
+
### Cách thức hoạt động
|
|
234
|
+
|
|
235
|
+
1. **Phía máy chủ (SSR):**
|
|
236
|
+
- Tất cả các yêu cầu đã thực hiện (thường là phương thức `GET` với `global: true`) sẽ tự động được lưu vào danh sách hydration.
|
|
237
|
+
- Sau khi hoàn tất tạo trang, cần gọi phương thức `api.getHydrationScript()` và chèn chuỗi kết quả vào mẫu HTML (thường là ở cuối thẻ `<body>`).
|
|
238
|
+
|
|
239
|
+
2. **Phía client (Trình duyệt):**
|
|
240
|
+
- Khi tạo một instance `ApiInstance`, nó sẽ tự động tìm kiếm script hydration trên trang.
|
|
241
|
+
- Dữ liệu tìm thấy sẽ được tải vào hệ thống và được thay thế cho lần gọi đầu tiên của các yêu cầu tương tự.
|
|
242
|
+
- Nhờ đó, mã phía client nhận được dữ liệu ngay lập tức mà không cần chờ phản hồi từ mạng.
|
|
243
|
+
|
|
244
|
+
### Ví dụ sử dụng (SSR)
|
|
245
|
+
|
|
246
|
+
```javascript
|
|
247
|
+
// Trên máy chủ
|
|
248
|
+
const api = new ApiInstance();
|
|
249
|
+
await api.get({ path: 'settings' });
|
|
250
|
+
|
|
251
|
+
// Trong mẫu trang (ví dụ: ở cuối thẻ body)
|
|
252
|
+
// Phương thức trả về chuỗi: <script id="__ui:api:hydration:id__" type="application/json">[...]</script>
|
|
253
|
+
const hydrationScript = api.getHydrationScript();
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
## Bộ nhớ đệm
|
|
258
|
+
|
|
259
|
+
Thư viện cung cấp cơ chế bộ nhớ đệm (caching) tích hợp cho các phản hồi, cho phép bạn lưu kết quả yêu cầu trong bộ nhớ hoặc trong bộ nhớ ngoài (ví dụ: `LocalStorage`).
|
|
260
|
+
|
|
261
|
+
### Các tính năng chính
|
|
262
|
+
|
|
263
|
+
- **Thời gian sống (TTL)** — đối với mỗi yêu cầu, bạn có thể chỉ định thời gian hiệu lực của bộ nhớ đệm tính bằng giây.
|
|
264
|
+
- **Bộ nhớ ngoài** — khả năng tích hợp với bất kỳ bộ lưu trữ dữ liệu bất đồng bộ nào.
|
|
265
|
+
- **Tự động làm sạch** — dữ liệu cũ sẽ bị xóa khỏi bộ nhớ khi vượt quá giới hạn.
|
|
266
|
+
|
|
267
|
+
### Thiết lập bộ nhớ ngoài
|
|
268
|
+
|
|
269
|
+
Mặc định, bộ nhớ đệm chỉ hoạt động trong RAM và sẽ bị xóa khi tải lại trang. Để lưu dữ liệu lâu dài, bạn cần khởi tạo `ApiCache` với các listener của riêng mình (ví dụ: sử dụng `LocalStorage` hoặc `IndexedDB`):
|
|
270
|
+
|
|
271
|
+
```javascript
|
|
272
|
+
import { ApiCache, DataStorage } from '@dxtmisha/functional';
|
|
273
|
+
|
|
274
|
+
// Ví dụ về khởi tạo bằng LocalStorage qua trình bọc DataStorage
|
|
275
|
+
ApiCache.init(
|
|
276
|
+
async (key) => DataStorage.get(key),
|
|
277
|
+
async (key, value) => {
|
|
278
|
+
DataStorage.set(key, value);
|
|
279
|
+
return true;
|
|
280
|
+
},
|
|
281
|
+
async (key) => {
|
|
282
|
+
DataStorage.remove(key);
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
);
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Sử dụng trong các yêu cầu
|
|
289
|
+
|
|
290
|
+
Để bật tính năng bộ nhớ đệm, chỉ cần truyền thời gian tính bằng giây vào trường `cache` của đối tượng `ApiFetch`:
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
// Lưu bộ nhớ đệm trong 1 giờ (3600 giây)
|
|
294
|
+
const data = await api.get({
|
|
295
|
+
path: 'catalog/list',
|
|
296
|
+
cache: 3600
|
|
297
|
+
});
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
Nếu dữ liệu có trong bộ nhớ đệm và thời gian sống của nó chưa hết hạn, thư viện sẽ trả về dữ liệu đó ngay lập tức mà không thực hiện yêu cầu thực tế tới máy chủ.
|
|
301
|
+
|
|
302
|
+
## Giả lập phản hồi
|
|
249
303
|
|
|
250
304
|
Trình quản lý giả lập `ApiResponse` (có thể truy cập thông qua `api.getResponse()`) cho phép cấu hình các phản hồi mẫu (mock) cho những đường dẫn cụ thể. Hệ thống này vô cùng hữu ích khi phát triển giao diện (UI frontend) trước khi có API backend hoàn chỉnh hoặc khi cần viết test.
|
|
251
305
|
|
|
@@ -255,7 +309,7 @@ Phương thức `add` nhận một đối tượng dạng `ApiResponseItem` ho
|
|
|
255
309
|
|
|
256
310
|
**Các trường quan trọng trong `ApiResponseItem`:**
|
|
257
311
|
- `path` — Dạng chuỗi (String - khớp chính xác) hoặc Biểu thức chính quy (`RegExp`) dùng để chặn đường dẫn (URL) cụ thể.
|
|
258
|
-
- `method` — Phương thức HTTP (`ApiMethodItem.get`, `post`, v.v...).
|
|
312
|
+
- `method` — Phương thức HTTP (`ApiMethodItem.get`, `post`, `put`, `patch`, v.v...).
|
|
259
313
|
- `request` — (Tùy chọn) Bộ lọc theo tải trọng body. Bạn có thể dùng chuỗi đánh dấu đặc biệt `'*any'` để vô hiệu hoá bộ kiểm tra nội dung và bắt mọi yêu cầu gửi đến đường dẫn này.
|
|
260
314
|
- `response` — Một đối tượng dữ liệu tĩnh _hoặc_ một hàm khởi tạo (factory function) `(request) => any` dùng để tạo câu trả lời tự động dựa trên tải trọng yêu cầu gửi đến.
|
|
261
315
|
- `disable` — (Tùy chọn) Vô hiệu hóa mock này (boolean hoặc callback).
|
|
@@ -4,40 +4,58 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
4
4
|
|
|
5
5
|
# ApiPreparation Class
|
|
6
6
|
|
|
7
|
-
A class
|
|
7
|
+
A specialized class designed to handle tasks and side effects immediately before and after an API request execution. It serves to intercept requests globally via tracking hooks, enabling state manipulation or triggering of global logic like token refreshes or logging.
|
|
8
|
+
|
|
9
|
+
> `ApiPreparation` is an **auxiliary class**, designed for managing request lifecycles. In most cases, it is recommended to interact with hooks through the `setPreparation` and `setEnd` methods of the main `Api` instance.
|
|
8
10
|
|
|
9
11
|
## Key Features
|
|
10
12
|
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **Data Injection** — post-request hooks optionally return data or a `reset` flag that can manipulate downstream handlers.
|
|
13
|
+
- **Sequential Execution** — ensures that preparation hooks resolve one at a time, preventing collisions during concurrent operations (e.g., duplicate token refreshes).
|
|
14
|
+
- **Global Interception** — provides a single point of entry and exit for all network traffic initiated by its parent manager.
|
|
15
|
+
- **Request Replay** — post-request hooks can signal the system to automatically retry a request after state changes.
|
|
15
16
|
|
|
16
|
-
##
|
|
17
|
+
## Methods
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
### Action
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
import { ApiPreparation } from '@dxtmisha/functional'
|
|
21
|
+
#### `make`
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
const preparation = new ApiPreparation()
|
|
23
|
+
Executes the registered preparation callback. If another preparation is currently in progress, it waits for it to complete.
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
})
|
|
25
|
+
**Parameters:**
|
|
26
|
+
- `active: boolean` — Whether the hook is enabled for the current request.
|
|
27
|
+
- `apiFetch: ApiFetch` — The configuration for the upcoming request.
|
|
30
28
|
|
|
31
|
-
|
|
32
|
-
preparation.setEnd(async (query, apiFetch) => {
|
|
33
|
-
console.log('Request finished with status:', query.status)
|
|
34
|
-
return { reset: false }
|
|
35
|
-
})
|
|
36
|
-
```
|
|
29
|
+
**Returns:** `Promise<void>`
|
|
37
30
|
|
|
38
|
-
|
|
31
|
+
#### `makeEnd`
|
|
32
|
+
|
|
33
|
+
Executes the registered analysis callback after a request completes.
|
|
34
|
+
|
|
35
|
+
**Parameters:**
|
|
36
|
+
- `active: boolean` — Whether the hook is enabled for the current request.
|
|
37
|
+
- `query: Response` — The native Fetch API response object.
|
|
38
|
+
- `apiFetch: ApiFetch` — The configuration used for the request.
|
|
39
|
+
|
|
40
|
+
**Returns:** `Promise<ApiPreparationEnd>` — An object controlling the next steps (e.g., reset, data injection).
|
|
41
|
+
|
|
42
|
+
### Configuration
|
|
43
|
+
|
|
44
|
+
- `set(callback: (apiFetch: ApiFetch) => Promise<void>): this` — Registers a function to run before every enabled request.
|
|
45
|
+
- `setEnd(callback: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>): this` — Registers a function to run after every enabled response.
|
|
46
|
+
|
|
47
|
+
## Types
|
|
48
|
+
|
|
49
|
+
#### `ApiPreparationEnd`
|
|
50
|
+
Result of the analysis hook execution.
|
|
51
|
+
- `reset?: boolean` — If true, the request will be aborted and restarted.
|
|
52
|
+
- `data?: any` — Custom data to pass along.
|
|
53
|
+
|
|
54
|
+
## Guide: Mechanics of Hooks
|
|
55
|
+
|
|
56
|
+
The following rules and conditions define how the preparation system synchronizes and manages lifecycle hooks:
|
|
39
57
|
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
58
|
+
- **Synchronization** — the system uses a polling mechanism (160ms interval) to ensure that only one `setPreparation` hook executes at a time. If multiple requests start concurrently, subsequent calls will wait up to 32 polling attempts (~5 seconds) for the first one to finish.
|
|
59
|
+
- **Context Injection** — the `apiFetch` object is passed to the hooks by reference. Modifying its properties (like headers or request body) inside `setPreparation` directly affects the physical network call that follows.
|
|
60
|
+
- **Flow Control (Reset)** — the `setEnd` hook can return `{ reset: true }`. When this flag is detected, the `ApiInstance` will abort the current request chain and immediately restart it from the preparation phase. This is primarily used for silent, automatic token refreshing.
|
|
61
|
+
- **Execution Scope** — hooks only run if they are explicitly enabled in the request configuration. By default, `globalPreparation` and `globalEnd` are set to true in `ApiFetch`.
|
|
@@ -1,43 +1,61 @@
|
|
|
1
1
|
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
2
|
|
|
3
|
-
<Meta title='@dxtmisha/ru/functional-basic/Classes/ApiPreparation - Подготовка API
|
|
3
|
+
<Meta title='@dxtmisha/ru/functional-basic/Classes/ApiPreparation - Подготовка запросов API'/>
|
|
4
4
|
|
|
5
5
|
# Класс ApiPreparation
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Специализированный класс, предназначенный для обработки задач и побочных эффектов непосредственно перед и после выполнения API-запроса. Он служит для глобального перехвата запросов через хуки, позволяя манипулировать состоянием или запускать глобальную логику, такую как обновление токенов или логирование.
|
|
8
|
+
|
|
9
|
+
> `ApiPreparation` является **вспомогательным классом**, предназначенным для управления жизненным циклом запросов. В большинстве случаев рекомендуется взаимодействовать с хуками через методы `setPreparation` и `setEnd` основного инстанса `Api`.
|
|
8
10
|
|
|
9
11
|
## Ключевые особенности
|
|
10
12
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
- **Внедрение данных** — хуки после запроса могут возвращать данные или флаг `reset`, которые могут повлиять на общую обработку ответа API.
|
|
13
|
+
- **Последовательное выполнение** — гарантирует, что хуки подготовки выполняются по одному, предотвращая коллизии при параллельных операциях (например, дублирование запросов на обновление токена).
|
|
14
|
+
- **Глобальный перехват** — предоставляет единую точку входа и выхода для всего сетевого трафика, инициируемого родительским менеджером.
|
|
15
|
+
- **Повтор запроса** — хуки после запроса могут сигнализировать системе о необходимости автоматического повтора запроса после изменения состояния.
|
|
15
16
|
|
|
16
|
-
##
|
|
17
|
+
## Методы
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
### Действие
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
import { ApiPreparation } from '@dxtmisha/functional'
|
|
21
|
+
#### `make`
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
const preparation = new ApiPreparation()
|
|
23
|
+
Выполняет зарегистрированный коллбэк подготовки. Если другая подготовка уже выполняется, метод ожидает её завершения.
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
})
|
|
25
|
+
**Параметры:**
|
|
26
|
+
- `active: boolean` — Активен ли хук для текущего запроса.
|
|
27
|
+
- `apiFetch: ApiFetch` — Конфигурация предстоящего запроса.
|
|
30
28
|
|
|
31
|
-
|
|
32
|
-
preparation.setEnd(async (query, apiFetch) => {
|
|
33
|
-
console.log('Запрос завершен со статусом:', query.status)
|
|
34
|
-
return { reset: false }
|
|
35
|
-
})
|
|
36
|
-
```
|
|
29
|
+
**Возвращает:** `Promise<void>`
|
|
37
30
|
|
|
38
|
-
|
|
31
|
+
#### `makeEnd`
|
|
32
|
+
|
|
33
|
+
Выполняет зарегистрированный коллбэк анализа после завершения запроса.
|
|
34
|
+
|
|
35
|
+
**Параметры:**
|
|
36
|
+
- `active: boolean` — Активен ли хук для текущего запроса.
|
|
37
|
+
- `query: Response` — Нативный объект ответа Fetch API.
|
|
38
|
+
- `apiFetch: ApiFetch` — Конфигурация, использованная для запроса.
|
|
39
|
+
|
|
40
|
+
**Возвращает:** `Promise<ApiPreparationEnd>` — Объект, управляющий дальнейшими шагами (например, сброс или подмена данных).
|
|
41
|
+
|
|
42
|
+
### Конфигурация
|
|
43
|
+
|
|
44
|
+
- `set(callback: (apiFetch: ApiFetch) => Promise<void>): this` — Регистрирует функцию для запуска перед каждым включенным запросом.
|
|
45
|
+
- `setEnd(callback: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>): this` — Регистрирует функцию для запуска после каждого включенного ответа.
|
|
46
|
+
|
|
47
|
+
## Типы
|
|
48
|
+
|
|
49
|
+
#### `ApiPreparationEnd`
|
|
50
|
+
Результат выполнения хука анализа.
|
|
51
|
+
- `reset?: boolean` — Если true, запрос будет прерван и перезапущен.
|
|
52
|
+
- `data?: any` — Произвольные данные.
|
|
53
|
+
|
|
54
|
+
## Руководство: Механика хуков
|
|
55
|
+
|
|
56
|
+
Следующие правила и условия определяют, как система подготовки синхронизирует и управляет хуками жизненного цикла:
|
|
39
57
|
|
|
40
|
-
-
|
|
41
|
-
- `
|
|
42
|
-
-
|
|
43
|
-
-
|
|
58
|
+
- **Синхронизация** — система использует механизм опроса (интервал 160 мс), чтобы гарантировать, что одновременно выполняется только один хук `setPreparation`. Если одновременно запускаются несколько запросов, последующие вызовы будут ждать до 32 попыток опроса (~5 секунд), пока первый не завершится.
|
|
59
|
+
- **Инъекция контекста** — объект `apiFetch` передается в хук по ссылке. Изменение его свойств (таких как заголовки или тело запроса) внутри `setPreparation` напрямую влияет на последующий сетевой вызов.
|
|
60
|
+
- **Управление потоком (Reset)** — хук `setEnd` может вернуть `{ reset: true }`. Когда этот флаг обнаружен, `ApiInstance` прервет текущую цепочку запроса и немедленно перезапустит её с фазы подготовки. Это в основном используется для прозрачного автоматического обновления токенов.
|
|
61
|
+
- **Область выполнения** — хуки запускаются только в том случае, если они явно включены в конфигурации запроса. По умолчанию `globalPreparation` и `globalEnd` в `ApiFetch` установлены в true.
|
|
@@ -4,40 +4,58 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
4
4
|
|
|
5
5
|
# Lớp ApiPreparation
|
|
6
6
|
|
|
7
|
-
Một lớp được thiết kế
|
|
7
|
+
Một lớp chuyên dụng được thiết kế để xử lý các tác vụ và hiệu ứng phụ ngay trước và sau khi thực thi một yêu cầu API. Nó phục vụ việc chặn các yêu cầu trên toàn cục thông qua các hook theo dõi, cho phép thao tác trạng thái hoặc kích hoạt logic toàn cục như làm mới token hoặc ghi log.
|
|
8
|
+
|
|
9
|
+
> `ApiPreparation` là một **lớp bổ trợ** (auxiliary class), được thiết kế để quản lý vòng đời yêu cầu. Trong hầu hết các trường hợp, bạn nên tương tác với các hook thông qua các phương thức `setPreparation` và `setEnd` của thực thể `Api` chính.
|
|
8
10
|
|
|
9
11
|
## Các tính năng chính
|
|
10
12
|
|
|
11
|
-
- **Thực thi
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **Móc nối dữ liệu (Data Injection)** — các hook nối mạng có đặc quyền trả về dữ liệu hoặc một cờ tín hiệu `reset` nhằm thao túng hay ngắt phiên xử lý phản hồi API toàn cục sau đó.
|
|
13
|
+
- **Thực thi tuần tự** — đảm bảo rằng các hook chuẩn bị được giải quyết từng cái một, ngăn chặn xung đột trong các hoạt động đồng thời (ví dụ: làm mới token bị trùng lặp).
|
|
14
|
+
- **Chặn luồng toàn cục** — cung cấp một điểm vào và ra duy nhất cho tất cả lưu lượng mạng được khởi tạo bởi trình quản lý cha của nó.
|
|
15
|
+
- **Phát lại yêu cầu** — các hook sau yêu cầu có thể báo hiệu hệ thống tự động thử lại một yêu cầu sau khi trạng thái thay đổi.
|
|
15
16
|
|
|
16
|
-
##
|
|
17
|
+
## Các phương thức
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
### Hành động
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
import { ApiPreparation } from '@dxtmisha/functional'
|
|
21
|
+
#### `make`
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
const preparation = new ApiPreparation()
|
|
23
|
+
Thực thi callback chuẩn bị đã đăng ký. Nếu một quá trình chuẩn bị khác đang diễn ra, nó sẽ đợi cho đến khi hoàn thành.
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
})
|
|
25
|
+
**Tham số:**
|
|
26
|
+
- `active: boolean` — Hook có được bật cho yêu cầu hiện tại hay không.
|
|
27
|
+
- `apiFetch: ApiFetch` — Cấu hình cho yêu cầu sắp tới.
|
|
30
28
|
|
|
31
|
-
|
|
32
|
-
preparation.setEnd(async (query, apiFetch) => {
|
|
33
|
-
console.log('Yêu cầu đã hoàn tất với trạng thái:', query.status)
|
|
34
|
-
return { reset: false }
|
|
35
|
-
})
|
|
36
|
-
```
|
|
29
|
+
**Trả về:** `Promise<void>`
|
|
37
30
|
|
|
38
|
-
|
|
31
|
+
#### `makeEnd`
|
|
32
|
+
|
|
33
|
+
Thực thi callback phân tích đã đăng ký sau khi một yêu cầu hoàn thành.
|
|
34
|
+
|
|
35
|
+
**Tham số:**
|
|
36
|
+
- `active: boolean` — Hook có được bật cho yêu cầu hiện tại hay không.
|
|
37
|
+
- `query: Response` — Đối tượng phản hồi Fetch API gốc.
|
|
38
|
+
- `apiFetch: ApiFetch` — Cấu hình đã được sử dụng cho yêu cầu.
|
|
39
|
+
|
|
40
|
+
**Trả về:** `Promise<ApiPreparationEnd>` — Một đối tượng điều khiển các bước tiếp theo (ví dụ: reset, tiêm dữ liệu).
|
|
41
|
+
|
|
42
|
+
### Cấu hình
|
|
43
|
+
|
|
44
|
+
- `set(callback: (apiFetch: ApiFetch) => Promise<void>): this` — Đăng ký một hàm sẽ chạy trước mọi yêu cầu được bật.
|
|
45
|
+
- `setEnd(callback: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>): this` — Đăng ký một hàm sẽ chạy sau mọi phản hồi được bật.
|
|
46
|
+
|
|
47
|
+
## Các kiểu dữ liệu
|
|
48
|
+
|
|
49
|
+
#### `ApiPreparationEnd`
|
|
50
|
+
Kết quả thực thi của hook phân tích.
|
|
51
|
+
- `reset?: boolean` — Nếu true, yêu cầu sẽ bị hủy và khởi động lại.
|
|
52
|
+
- `data?: any` — Dữ liệu tùy chỉnh để truyền đi.
|
|
53
|
+
|
|
54
|
+
## Hướng dẫn: Cơ chế của Hook
|
|
55
|
+
|
|
56
|
+
Các quy tắc và điều kiện sau đây xác định cách hệ thống chuẩn bị đồng bộ hóa và quản lý các hook vòng đời:
|
|
39
57
|
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
58
|
+
- **Đồng bộ hóa** — hệ thống sử dụng cơ chế thăm dò (khoảng thời gian 160ms) để đảm bảo rằng chỉ có một hook `setPreparation` thực thi tại một thời điểm. Nếu nhiều yêu cầu bắt đầu đồng thời, các cuộc gọi tiếp theo sẽ đợi tối đa 32 lần thăm dò (~5 giây) để cuộc gọi đầu tiên hoàn thành.
|
|
59
|
+
- **Tiêm ngữ cảnh** — đối tượng `apiFetch` được truyền vào các hook theo dạng tham chiếu. Việc sửa đổi các thuộc tính của nó (như tiêu đề hoặc thân yêu cầu) bên trong `setPreparation` sẽ ảnh hưởng trực tiếp đến lệnh gọi mạng vật lý ngay sau đó.
|
|
60
|
+
- **Điều khiển luồng (Reset)** — hook `setEnd` có thể trả về `{ reset: true }`. Khi cờ này được phát hiện, `ApiInstance` sẽ hủy chuỗi yêu cầu hiện tại và khởi động lại nó ngay lập tức từ giai đoạn chuẩn bị. Điều này chủ yếu được sử dụng để làm mới token tự động và thầm lặng.
|
|
61
|
+
- **Phạm vi thực thi** — các hook chỉ chạy nếu chúng được bật rõ ràng trong cấu hình yêu cầu. Theo mặc định, `globalPreparation` và `globalEnd` được đặt thành true trong `ApiFetch`.
|
|
@@ -4,7 +4,9 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
4
4
|
|
|
5
5
|
# ApiResponse Class
|
|
6
6
|
|
|
7
|
-
A manager class for intercepting, caching, and emulating API responses. It allows you to intercept outgoing API requests and return predefined mock data instead of triggering actual physical network traffic.
|
|
7
|
+
A manager class for intercepting, caching, and emulating API responses. It allows you to intercept outgoing API requests and return predefined mock data instead of triggering actual physical network traffic.
|
|
8
|
+
|
|
9
|
+
> `ApiResponse` is an **auxiliary class**, designed for API emulation and mocking. In most cases, it is recommended to register mock responses through the `response` parameter in the global `Api` configuration.
|
|
8
10
|
|
|
9
11
|
## Key Features
|
|
10
12
|
|
|
@@ -15,32 +17,68 @@ A manager class for intercepting, caching, and emulating API responses. It allow
|
|
|
15
17
|
|
|
16
18
|
## Initialization
|
|
17
19
|
|
|
18
|
-
To initialize the object, call the `ApiResponse(requestDefault)
|
|
20
|
+
To initialize the object, call the constructor `ApiResponse(requestDefault)`.
|
|
19
21
|
|
|
20
22
|
**Parameters:**
|
|
21
|
-
- `requestDefault: ApiDefault` —
|
|
23
|
+
- `requestDefault: ApiDefault` — default request class used for configuration and storage.
|
|
22
24
|
|
|
23
25
|
```typescript
|
|
24
|
-
import { ApiResponse
|
|
25
|
-
|
|
26
|
-
// 1. Initialize dependencies
|
|
27
|
-
const apiDefault = new ApiDefault()
|
|
28
|
-
|
|
29
|
-
// 2. Create emulator instance
|
|
30
|
-
const apiResponse = new ApiResponse(apiDefault)
|
|
26
|
+
import { ApiResponse } from '@dxtmisha/functional-basic'
|
|
31
27
|
|
|
32
|
-
|
|
33
|
-
apiResponse.add({
|
|
34
|
-
path: 'user/get',
|
|
35
|
-
method: 'get',
|
|
36
|
-
response: { id: 1, name: 'Admin' }
|
|
37
|
-
})
|
|
28
|
+
const apiResponse = new ApiResponse(myApiDefault)
|
|
38
29
|
```
|
|
39
30
|
|
|
40
31
|
## Methods
|
|
41
32
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
33
|
+
### Action
|
|
34
|
+
|
|
35
|
+
#### `emulator`
|
|
36
|
+
|
|
37
|
+
Core engine loop that validates request configurations and executes matched routing latency mock responses. This method only runs in DOM environments.
|
|
38
|
+
|
|
39
|
+
**Parameters:**
|
|
40
|
+
- `apiFetch: ApiFetch` — The properties of the request to emulate.
|
|
41
|
+
|
|
42
|
+
**Returns:** `Promise<T | undefined>` — The emulated response data.
|
|
43
|
+
|
|
44
|
+
#### `emulatorAsync`
|
|
45
|
+
|
|
46
|
+
Synchronous version of the emulator. It returns the mock response immediately without any delay or loading state. This method only runs in DOM environments.
|
|
47
|
+
|
|
48
|
+
**Parameters:**
|
|
49
|
+
- `apiFetch: ApiFetch` — The properties of the request to emulate.
|
|
50
|
+
|
|
51
|
+
**Returns:** `T | undefined` — The emulated response data.
|
|
52
|
+
|
|
53
|
+
### Check
|
|
54
|
+
|
|
55
|
+
- `get(path: string, method: ApiMethod, request?: ApiFetch['request'], devMode?: boolean): ApiResponseItem | undefined` — Synchronously checks for a matching cached mock request.
|
|
56
|
+
- `getList(): (ApiResponseItem & Record<string, any>)[]` — Returns a list of all registered emulator configurations.
|
|
57
|
+
|
|
58
|
+
### Configuration
|
|
59
|
+
|
|
60
|
+
- `add(response: ApiResponseItem | ApiResponseItem[]): this` — Adds mock response objects to the local registry.
|
|
61
|
+
- `setDevMode(devMode: boolean): this` — Toggles the development debug log mode.
|
|
62
|
+
|
|
63
|
+
## Types
|
|
64
|
+
|
|
65
|
+
#### `ApiResponseItem`
|
|
66
|
+
An object defining a mock response configuration.
|
|
67
|
+
- `path: string | RegExp` — The matching URL path or pattern.
|
|
68
|
+
- `method: ApiMethod` — The HTTP method (GET, POST, etc.).
|
|
69
|
+
- `response: any | ((request?: any) => any)` — The mock data or a function returning it.
|
|
70
|
+
- `request?: ApiFetch['request'] | '*any'` — Optional request payload to match against.
|
|
71
|
+
- `lag?: boolean` — Whether to simulate network latency.
|
|
72
|
+
- `disable?: any` — Condition to disable the mock (boolean or function).
|
|
73
|
+
- `isForGlobal?: boolean` — Mark as global mock (hidden from getList).
|
|
74
|
+
|
|
75
|
+
## Guide: API Emulation
|
|
76
|
+
|
|
77
|
+
The following rules and conditions define how the emulation system intercepts and mocks network requests:
|
|
78
|
+
|
|
79
|
+
- **Mock Registration** — responses added via `add()` take precedence and are checked before any real network call is initiated.
|
|
80
|
+
- **Matching Criteria** — a mock is triggered only if the path (string or RegExp), HTTP method, and request body all match the configuration.
|
|
81
|
+
- **Body Wildcards** — using `*any` as the request value allows the mock to match any payload, bypassing deep object comparison.
|
|
82
|
+
- **Dynamic Data** — the `response` property can be a function, allowing you to generate dynamic mock data based on the incoming request parameters.
|
|
83
|
+
- **Latency Simulation** — setting `lag: true` adds a random delay (0-2000ms) and triggers the common loading state (`d-response-loading` class on body).
|
|
84
|
+
- **Match Persistence** — by default, an emulator configuration matches only once unless `devMode` is enabled, preventing duplicate mock triggers for the same state.
|