@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.
Files changed (227) hide show
  1. package/dist/{defineProperty-DblGXmzD.js → defineProperty-149Ahniv.js} +4 -4
  2. package/dist/library.js +1 -1
  3. package/dist/media/descriptions/wikiDescriptionsArea.d.ts +7 -0
  4. package/dist/media/descriptions/wikiDescriptionsClientOnly.d.ts +7 -0
  5. package/dist/media/descriptions/wikiDescriptionsContainer.d.ts +7 -0
  6. package/dist/media/descriptions/wikiDescriptionsHeader.d.ts +7 -0
  7. package/dist/media/descriptions/wikiDescriptionsPageArea.d.ts +7 -0
  8. package/dist/media/mdx/Area/wikiMdxArea.d.ts +7 -0
  9. package/dist/media/mdx/ClientOnly/wikiMdxClientOnly.d.ts +7 -0
  10. package/dist/media/mdx/Container/wikiMdxContainer.d.ts +7 -0
  11. package/dist/media/mdx/Header/wikiMdxHeader.d.ts +7 -0
  12. package/dist/media/mdx/PageArea/wikiMdxPageArea.d.ts +7 -0
  13. package/dist/media.d.ts +1 -1
  14. package/dist/media.js +127 -68
  15. package/dist/storybook.js +2707 -1841
  16. package/dist/{wikiDescriptions-Cv4WzSNL.js → wikiDescriptions-7XaHU3Yk.js} +182 -0
  17. package/package.json +1 -1
  18. package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.en.mdx +43 -0
  19. package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.ru.mdx +43 -0
  20. package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.vi.mdx +41 -0
  21. package/src/media/functional/functional/composables/useApiRef/useApiRef.en.mdx +20 -4
  22. package/src/media/functional/functional/composables/useApiRef/useApiRef.ru.mdx +21 -3
  23. package/src/media/functional/functional/composables/useApiRef/useApiRef.vi.mdx +20 -2
  24. package/src/media/functional/functional/functions/computedAsync/computedAsync.en.mdx +8 -0
  25. package/src/media/functional/functional/functions/computedAsync/computedAsync.ru.mdx +8 -0
  26. package/src/media/functional/functional/functions/computedAsync/computedAsync.vi.mdx +8 -0
  27. package/src/media/functional/functional/functions/computedEternity/computedEternity.en.mdx +8 -0
  28. package/src/media/functional/functional/functions/computedEternity/computedEternity.ru.mdx +8 -0
  29. package/src/media/functional/functional/functions/computedEternity/computedEternity.vi.mdx +8 -0
  30. package/src/media/functional/functional-basic/api/api.en.mdx +45 -0
  31. package/src/media/functional/functional-basic/api/api.ru.mdx +45 -0
  32. package/src/media/functional/functional-basic/api/api.vi.mdx +45 -0
  33. package/src/media/functional/functional-basic/classes/Api/Api.en.mdx +57 -54
  34. package/src/media/functional/functional-basic/classes/Api/Api.ru.mdx +57 -54
  35. package/src/media/functional/functional-basic/classes/Api/Api.vi.mdx +57 -54
  36. package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.en.mdx +111 -0
  37. package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.ru.mdx +111 -0
  38. package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.vi.mdx +111 -0
  39. package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.en.mdx +32 -0
  40. package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.ru.mdx +32 -0
  41. package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.vi.mdx +32 -0
  42. package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.en.mdx +24 -28
  43. package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.ru.mdx +24 -28
  44. package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.vi.mdx +24 -28
  45. package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.en.mdx +28 -14
  46. package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.ru.mdx +33 -19
  47. package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.vi.mdx +33 -19
  48. package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.en.mdx +56 -0
  49. package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.ru.mdx +56 -0
  50. package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.vi.mdx +55 -0
  51. package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.en.mdx +106 -51
  52. package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.ru.mdx +107 -52
  53. package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.vi.mdx +103 -49
  54. package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.en.mdx +44 -26
  55. package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.ru.mdx +45 -27
  56. package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.vi.mdx +44 -26
  57. package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.en.mdx +59 -21
  58. package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.ru.mdx +63 -25
  59. package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.vi.mdx +64 -26
  60. package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.en.mdx +29 -32
  61. package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.ru.mdx +33 -36
  62. package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.vi.mdx +33 -36
  63. package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.en.mdx +34 -53
  64. package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.ru.mdx +33 -52
  65. package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.vi.mdx +39 -58
  66. package/src/media/functional/functional-basic/classes/Cache/Cache.en.mdx +7 -4
  67. package/src/media/functional/functional-basic/classes/Cache/Cache.ru.mdx +7 -4
  68. package/src/media/functional/functional-basic/classes/Cache/Cache.vi.mdx +28 -25
  69. package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.en.mdx +45 -53
  70. package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.ru.mdx +46 -54
  71. package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.vi.mdx +47 -55
  72. package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.en.mdx +13 -1
  73. package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.ru.mdx +13 -1
  74. package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.vi.mdx +13 -0
  75. package/src/media/functional/functional-basic/classes/Cookie/Cookie.en.mdx +88 -44
  76. package/src/media/functional/functional-basic/classes/Cookie/Cookie.ru.mdx +88 -44
  77. package/src/media/functional/functional-basic/classes/Cookie/Cookie.vi.mdx +85 -41
  78. package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.en.mdx +43 -22
  79. package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.ru.mdx +46 -25
  80. package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.vi.mdx +43 -22
  81. package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.en.mdx +84 -0
  82. package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.ru.mdx +84 -0
  83. package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.vi.mdx +100 -0
  84. package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.en.mdx +178 -0
  85. package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.ru.mdx +178 -0
  86. package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.vi.mdx +178 -0
  87. package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.en.mdx +32 -25
  88. package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.ru.mdx +32 -25
  89. package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.vi.mdx +32 -27
  90. package/src/media/functional/functional-basic/classes/Datetime/Datetime.en.mdx +36 -4
  91. package/src/media/functional/functional-basic/classes/Datetime/Datetime.ru.mdx +36 -4
  92. package/src/media/functional/functional-basic/classes/Datetime/Datetime.vi.mdx +36 -4
  93. package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.en.mdx +101 -70
  94. package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.ru.mdx +100 -69
  95. package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.vi.mdx +101 -70
  96. package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.en.mdx +46 -42
  97. package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.ru.mdx +46 -42
  98. package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.vi.mdx +46 -42
  99. package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.en.mdx +44 -96
  100. package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.ru.mdx +44 -96
  101. package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.vi.mdx +44 -96
  102. package/src/media/functional/functional-basic/classes/EventItem/EventItem.en.mdx +49 -28
  103. package/src/media/functional/functional-basic/classes/EventItem/EventItem.ru.mdx +21 -0
  104. package/src/media/functional/functional-basic/classes/EventItem/EventItem.vi.mdx +63 -42
  105. package/src/media/functional/functional-basic/classes/Formatters/Formatters.en.mdx +97 -109
  106. package/src/media/functional/functional-basic/classes/Formatters/Formatters.ru.mdx +86 -98
  107. package/src/media/functional/functional-basic/classes/Formatters/Formatters.vi.mdx +99 -111
  108. package/src/media/functional/functional-basic/classes/Geo/Geo.en.mdx +3 -3
  109. package/src/media/functional/functional-basic/classes/Geo/Geo.ru.mdx +5 -5
  110. package/src/media/functional/functional-basic/classes/Geo/Geo.vi.mdx +5 -5
  111. package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.en.mdx +83 -40
  112. package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.ru.mdx +83 -40
  113. package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.vi.mdx +87 -44
  114. package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.en.mdx +81 -0
  115. package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.ru.mdx +81 -0
  116. package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.vi.mdx +81 -0
  117. package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.en.mdx +56 -105
  118. package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.ru.mdx +53 -102
  119. package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.vi.mdx +55 -105
  120. package/src/media/functional/functional-basic/classes/Hash/Hash.en.mdx +18 -7
  121. package/src/media/functional/functional-basic/classes/Hash/Hash.ru.mdx +18 -7
  122. package/src/media/functional/functional-basic/classes/Hash/Hash.vi.mdx +18 -7
  123. package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.en.mdx +54 -0
  124. package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.ru.mdx +54 -0
  125. package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.vi.mdx +54 -0
  126. package/src/media/functional/functional-basic/classes/Meta/Meta.en.mdx +16 -0
  127. package/src/media/functional/functional-basic/classes/Meta/Meta.ru.mdx +16 -0
  128. package/src/media/functional/functional-basic/classes/Meta/Meta.vi.mdx +17 -1
  129. package/src/media/functional/functional-basic/classes/MetaManager/MetaManager.en.mdx +9 -0
  130. package/src/media/functional/functional-basic/classes/MetaManager/MetaManager.ru.mdx +9 -0
  131. package/src/media/functional/functional-basic/classes/MetaManager/MetaManager.vi.mdx +9 -0
  132. package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.en.mdx +79 -0
  133. package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.ru.mdx +79 -0
  134. package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.vi.mdx +79 -0
  135. package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.en.mdx +50 -0
  136. package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.ru.mdx +50 -0
  137. package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.vi.mdx +50 -0
  138. package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.en.mdx +131 -0
  139. package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.ru.mdx +131 -0
  140. package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.vi.mdx +131 -0
  141. package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.en.mdx +97 -0
  142. package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.ru.mdx +97 -0
  143. package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.vi.mdx +97 -0
  144. package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.en.mdx +13 -5
  145. package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.ru.mdx +13 -5
  146. package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.vi.mdx +13 -5
  147. package/src/media/functional/functional-basic/functions/anyToString/anyToString.en.mdx +37 -19
  148. package/src/media/functional/functional-basic/functions/anyToString/anyToString.ru.mdx +37 -19
  149. package/src/media/functional/functional-basic/functions/anyToString/anyToString.vi.mdx +35 -17
  150. package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.en.mdx +31 -19
  151. package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.ru.mdx +31 -19
  152. package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.vi.mdx +32 -20
  153. package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.en.mdx +29 -15
  154. package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.ru.mdx +28 -14
  155. package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.vi.mdx +28 -14
  156. package/src/media/functional/functional-basic/functions/capitalize/capitalize.en.mdx +7 -3
  157. package/src/media/functional/functional-basic/functions/capitalize/capitalize.ru.mdx +7 -3
  158. package/src/media/functional/functional-basic/functions/capitalize/capitalize.vi.mdx +7 -3
  159. package/src/media/functional/functional-basic/functions/copyObject/copyObject.en.mdx +17 -13
  160. package/src/media/functional/functional-basic/functions/copyObject/copyObject.ru.mdx +17 -13
  161. package/src/media/functional/functional-basic/functions/copyObject/copyObject.vi.mdx +17 -13
  162. package/src/media/functional/functional-basic/functions/createElement/createElement.en.mdx +2 -0
  163. package/src/media/functional/functional-basic/functions/createElement/createElement.ru.mdx +2 -0
  164. package/src/media/functional/functional-basic/functions/createElement/createElement.vi.mdx +2 -0
  165. package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.en.mdx +1 -3
  166. package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.ru.mdx +1 -3
  167. package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.vi.mdx +1 -3
  168. package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.en.mdx +13 -10
  169. package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.ru.mdx +14 -11
  170. package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.vi.mdx +12 -9
  171. package/src/media/functional/functional-basic/functions/executePromise/executePromise.en.mdx +14 -13
  172. package/src/media/functional/functional-basic/functions/executePromise/executePromise.ru.mdx +15 -14
  173. package/src/media/functional/functional-basic/functions/executePromise/executePromise.vi.mdx +14 -13
  174. package/src/media/functional/functional-basic/functions/forEach/forEach.en.mdx +1 -1
  175. package/src/media/functional/functional-basic/functions/forEach/forEach.ru.mdx +1 -1
  176. package/src/media/functional/functional-basic/functions/forEach/forEach.vi.mdx +1 -1
  177. package/src/media/functional/functional-basic/functions/frame/frame.en.mdx +7 -4
  178. package/src/media/functional/functional-basic/functions/frame/frame.ru.mdx +6 -3
  179. package/src/media/functional/functional-basic/functions/frame/frame.vi.mdx +7 -4
  180. package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.en.mdx +34 -0
  181. package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.ru.mdx +34 -0
  182. package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.vi.mdx +35 -0
  183. package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.en.mdx +2 -0
  184. package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.ru.mdx +2 -0
  185. package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.vi.mdx +2 -0
  186. package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.en.mdx +21 -0
  187. package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.ru.mdx +21 -0
  188. package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.vi.mdx +21 -0
  189. package/src/media/functional/functional-basic/functions/getElementId/getElementId.en.mdx +17 -3
  190. package/src/media/functional/functional-basic/functions/getElementId/getElementId.ru.mdx +17 -3
  191. package/src/media/functional/functional-basic/functions/getElementId/getElementId.vi.mdx +18 -4
  192. package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.en.mdx +31 -0
  193. package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.ru.mdx +31 -0
  194. package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.vi.mdx +31 -0
  195. package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.en.mdx +25 -0
  196. package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.ru.mdx +25 -0
  197. package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.vi.mdx +25 -0
  198. package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.en.mdx +11 -4
  199. package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.ru.mdx +14 -7
  200. package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.vi.mdx +13 -6
  201. package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.en.mdx +3 -2
  202. package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.ru.mdx +3 -2
  203. package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.vi.mdx +3 -2
  204. package/src/media/functional/functional-basic/functions/toNumber/toNumber.en.mdx +25 -9
  205. package/src/media/functional/functional-basic/functions/toNumber/toNumber.ru.mdx +25 -9
  206. package/src/media/functional/functional-basic/functions/toNumber/toNumber.vi.mdx +25 -9
  207. package/src/media/functional/functional-basic/functions/toString/toString.en.mdx +28 -0
  208. package/src/media/functional/functional-basic/functions/toString/toString.ru.mdx +28 -0
  209. package/src/media/functional/functional-basic/functions/toString/toString.vi.mdx +28 -0
  210. package/src/media/functional/functional-basic/icons/icons.en.mdx +3 -0
  211. package/src/media/functional/functional-basic/icons/icons.ru.mdx +3 -0
  212. package/src/media/functional/functional-basic/icons/icons.vi.mdx +3 -0
  213. package/src/media/functional/nitro-basic/functions/getInject.en.mdx +27 -0
  214. package/src/media/functional/nitro-basic/functions/getInject.ru.mdx +27 -0
  215. package/src/media/functional/nitro-basic/functions/getInject.vi.mdx +20 -0
  216. package/src/media/functional/ui/about/about.en.mdx +45 -0
  217. package/src/media/functional/ui/about/about.ru.mdx +45 -0
  218. package/src/media/functional/ui/about/about.vi.mdx +45 -0
  219. package/src/media/functional/ui/component/component.en.mdx +104 -0
  220. package/src/media/functional/ui/component/component.ru.mdx +106 -0
  221. package/src/media/functional/ui/component/component.vi.mdx +104 -0
  222. package/src/media/functional/ui/setup/setup.en.mdx +72 -0
  223. package/src/media/functional/ui/setup/setup.ru.mdx +72 -0
  224. package/src/media/functional/ui/setup/setup.vi.mdx +72 -0
  225. package/src/media/functional/ui/wiki-data.en.mdx +114 -0
  226. package/src/media/functional/ui/wiki-data.ru.mdx +114 -0
  227. 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
- - **Bộ nhớ đệm & Giả lập dữ liệu (Caching & Emulation)** quản các phản hồi mẫu (mock responses) thông qua `ApiResponse`
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
- ## Phương thức Gọi Tín Hiệu (API Calling Methods)
41
+ ## Các phương thức
40
42
 
41
- ### `request`
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
- ### `get`
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
- **Tham số:**
74
- - `request: ApiFetch`Các lựa chọn query dẫn đường backend map.
75
-
76
- **Trả về:** `Promise<T>`
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
- **Trả về:** `Promise<T>`
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
- ## Cấu hình hệ thống (Configuration)
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
- ## Chuẩn bị gửi thông tin (Request Preparation)
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
- ## Giả lập phản hồi (ApiResponse)
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 specifically designed to handle tasks and side effects immediately running before and after an API request execution. It serves to intercept requests globally via tracking hooks (`callback` and `callbackEnd`), perform state manipulations, or trigger global logic like loading indicators.
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
- - **Pre-request Execution** — hook into the API lifecycle immediately before the actual `fetch` call is made.
12
- - **Post-request Analysis** — execute logic exactly after a request completes, with proper access to the `Response` object and the original request configuration.
13
- - **Concurrency Control** — ensures overlapping hooks are resolved collectively without collision.
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
- ## Initialization
17
+ ## Methods
17
18
 
18
- To initialize the object, call the `ApiPreparation()` constructor.
19
+ ### Action
19
20
 
20
- ```typescript
21
- import { ApiPreparation } from '@dxtmisha/functional'
21
+ #### `make`
22
22
 
23
- // 1. Simple initialization
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
- // 2. Setting pre-request callback
27
- preparation.set(async (apiFetch) => {
28
- console.log('Preparing request to:', apiFetch.path)
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
- // 3. Setting post-request callback
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
- ## Methods
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
- - `make(active: boolean, apiFetch: ApiFetch): Promise<void>` Executes the preparation callback before executing the request.
41
- - `makeEnd(active: boolean, query: Response, apiFetch: ApiFetch): Promise<ApiPreparationEnd>` Executes analysis logically after the request finishes.
42
- - `set(callback: (apiFetch: ApiFetch) => Promise<void>): this` Connects a callback function triggered right before a request execution.
43
- - `setEnd(callback: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>): this` Connects a callback function executed after request termination.
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
- Класс, специально разработанный для обработки задач и побочных эффектов непосредственно до и после выполнения API-запроса. Представляет собой хуки (`callback` и `callbackEnd`) для перехвата запросов, выполнения манипуляций или запуска глобальной логики, такой как индикаторы загрузки.
7
+ Специализированный класс, предназначенный для обработки задач и побочных эффектов непосредственно перед и после выполнения API-запроса. Он служит для глобального перехвата запросов через хуки, позволяя манипулировать состоянием или запускать глобальную логику, такую как обновление токенов или логирование.
8
+
9
+ > `ApiPreparation` является **вспомогательным классом**, предназначенным для управления жизненным циклом запросов. В большинстве случаев рекомендуется взаимодействовать с хуками через методы `setPreparation` и `setEnd` основного инстанса `Api`.
8
10
 
9
11
  ## Ключевые особенности
10
12
 
11
- - **Выполнение перед запросом** хук в жизненном цикле API непосредственно перед фактическим вызовом `fetch`.
12
- - **Анализ после запроса** выполнение логики сразу после завершения запроса с доступом к объекту `Response` и конфигурации исходного запроса.
13
- - **Контроль параллелизма**гарантирует корректное разрешение перекрывающихся хуков без конфликтов.
14
- - **Внедрение данных** — хуки после запроса могут возвращать данные или флаг `reset`, которые могут повлиять на общую обработку ответа API.
13
+ - **Последовательное выполнение**гарантирует, что хуки подготовки выполняются по одному, предотвращая коллизии при параллельных операциях (например, дублирование запросов на обновление токена).
14
+ - **Глобальный перехват**предоставляет единую точку входа и выхода для всего сетевого трафика, инициируемого родительским менеджером.
15
+ - **Повтор запроса**хуки после запроса могут сигнализировать системе о необходимости автоматического повтора запроса после изменения состояния.
15
16
 
16
- ## Инициализация
17
+ ## Методы
17
18
 
18
- Для инициализации объекта вызовите конструктор `ApiPreparation()`.
19
+ ### Действие
19
20
 
20
- ```typescript
21
- import { ApiPreparation } from '@dxtmisha/functional'
21
+ #### `make`
22
22
 
23
- // 1. Простая инициализация
24
- const preparation = new ApiPreparation()
23
+ Выполняет зарегистрированный коллбэк подготовки. Если другая подготовка уже выполняется, метод ожидает её завершения.
25
24
 
26
- // 2. Установка колбэка перед запросом
27
- preparation.set(async (apiFetch) => {
28
- console.log('Подготовка запроса к:', apiFetch.path)
29
- })
25
+ **Параметры:**
26
+ - `active: boolean` — Активен ли хук для текущего запроса.
27
+ - `apiFetch: ApiFetch` — Конфигурация предстоящего запроса.
30
28
 
31
- // 3. Установка колбэка после запроса
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
- - `make(active: boolean, apiFetch: ApiFetch): Promise<void>` Выполняет логику подготовки перед выполнением запроса.
41
- - `makeEnd(active: boolean, query: Response, apiFetch: ApiFetch): Promise<ApiPreparationEnd>` Выполняет анализ после завершения запроса.
42
- - `set(callback: (apiFetch: ApiFetch) => Promise<void>): this` Устанавливает колбэк, который запускается перед запросом.
43
- - `setEnd(callback: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>): this` Устанавливает колбэк, который запускается после завершения запроса.
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ế đặc biệt để xử lý các tác vụ và hiệu ứng phụ (side effects) chạy ngay trước và sau khi thực thi một yêu cầu API. Nó đóng vai trò cung cấp các siêu liên kết điểm chốt (`callback` `callbackEnd`) để chặn hoặc theo dõi các yêu cầu, thực hiện thao tác hay kích hoạt xử giao diện như đồ họa tải trang.
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 trước yêu cầu (Pre-request Execution)** can thiệp vào vòng đời API ngay trước thời điểm tiến hành gọi `fetch` vật thực tế.
12
- - **Phân tích sau yêu cầu (Post-request Analysis)** — kích hoạt chạy logic ngay khi yêu cầu truy vấn hoàn tất, khả năng kết nối tới các thông số `Response` trả về cộng với cấu hình truy vấn ban đầu.
13
- - **Kiểm soát động (Concurrency Control)** — đảm bảo các hook chồng chéo được xử hợp không bị tắt nghẽn.
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 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 cha của nó.
15
+ - **Phát lại yêu cầu** — các hook sau yêu cầu 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
- ## Khởi tạo
17
+ ## Các phương thức
17
18
 
18
- Để khởi tạo đối tượng, hãy gọi hàm khởi tạo `ApiPreparation()`.
19
+ ### Hành động
19
20
 
20
- ```typescript
21
- import { ApiPreparation } from '@dxtmisha/functional'
21
+ #### `make`
22
22
 
23
- // 1. Khởi tạo đơn giản
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
- // 2. Thiết lập callback trước yêu cầu
27
- preparation.set(async (apiFetch) => {
28
- console.log('Đang chuẩn bị yêu cầu tới:', apiFetch.path)
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
- // 3. Thiết lập callback sau yêu cầu
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
- ## Các phương thức
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
- - `make(active: boolean, apiFetch: ApiFetch): Promise<void>` Thực thi vòng lặp chuẩn bị ngay trước thời khắc truy vấn vận hành.
41
- - `makeEnd(active: boolean, query: Response, apiFetch: ApiFetch): Promise<ApiPreparationEnd>` Thực thi tính chất phân tích vòng lặp móc nối sau khi liên kết server đóng băng.
42
- - `set(callback: (apiFetch: ApiFetch) => Promise<void>): this` Cách đấu nối một hàm tuỳ chỉnh thiết lập logic chạy tuần tự trước một yêu cầu.
43
- - `setEnd(callback: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>): this` Thiết lập một hàm vòng sự kiện được kích hoạt tức thì sau khi một phiên yêu cầu khép lại.
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 (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 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 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àng trong cấu hình yêu cầu. Theo mặc định, `globalPreparation` `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. Crucial during early UI development, automated unit testing, or offline development environments.
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)` constructor.
20
+ To initialize the object, call the constructor `ApiResponse(requestDefault)`.
19
21
 
20
22
  **Parameters:**
21
- - `requestDefault: ApiDefault` — an instance for processing default request parameters.
23
+ - `requestDefault: ApiDefault` — default request class used for configuration and storage.
22
24
 
23
25
  ```typescript
24
- import { ApiResponse, ApiDefault } from '@dxtmisha/functional'
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
- // 3. Adding a mock response
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
- - `get(path: string = '', method: ApiMethod, request?: ApiFetch['request'], devMode?: boolean): ApiResponseItem | undefined` — Synchronously checks for a global matching cached mock request and returns its configuration.
43
- - `getList(): (ApiResponseItem & Record<string, any>)[]` — Returns a flat list of all currently registered emulator mock configurations.
44
- - `add(response: ApiResponseItem | ApiResponseItem[]): this` — Connects routing pathways and attaches fallback mock-response objects to the local registry.
45
- - `setDevMode(devMode: boolean): this` — Sets the development output log mode on/off natively.
46
- - `emulator<T>(apiFetch: ApiFetch): Promise<T | undefined>` — Core engine loop validating configurations and executing matched routing latency mock responses recursively.
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.