@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
@@ -1,78 +1,81 @@
1
1
  import {Meta} from '@storybook/addon-docs/blocks'
2
2
 
3
- <Meta title='@dxtmisha/vi/functional-basic/Classes/Api - Quản lý yêu cầu (Request)'/>
3
+ <Meta title='@dxtmisha/vi/functional-basic/Classes/Api - Quản lý yêu cầu (Static)'/>
4
4
 
5
5
  # Lớp Api
6
6
 
7
- `Api` là một lớp tĩnh (static wrapper) bao bọc xung quanh một đối tượng `ApiInstance`.
7
+ Lớp `Api` là **Lớp chính (Tĩnh)** và đóng vai trò là điểm truy cập chính để quản lý các yêu cầu HTTP. Nó là một wrapper tĩnh bao quanh một `ApiInstance` được quản lý toàn cục, cung cấp một giao diện singleton sạch sẽ cho các hoạt động mạng tiêu chuẩn.
8
8
 
9
- Mọi phương thức của lớp `Api` đều được tự động ủy quyền (delegate) cho một đối tượng `ApiInstance` chung (global object) bên trong. Điều này cho phép bạn làm việc với các yêu cầu HTTP mà không cần phải tự khởi tạo (instantiate) các đối tượng:
9
+ ## Các tính năng chính
10
10
 
11
- ```typescript
12
- import { Api } from '@dxtmisha/functional'
11
+ - **Giao diện tĩnh** — thực hiện các hoạt động HTTP tiêu chuẩn (`GET`, `POST`, v.v.) mà không cần khởi tạo thủ công.
12
+ - **Hook vòng đời toàn cục** — cấu hình việc chuẩn bị và phân tích yêu cầu một lần cho toàn bộ ứng dụng.
13
+ - **Cách ly SSR** — sử dụng `ServerStorage` để quản lý việc cách ly các instance riêng lẻ trong quá trình render phía máy chủ.
14
+ - **Thiết lập đơn giản** — cung cấp phương thức `setConfig` thống nhất để áp dụng nhiều lớp cấu hình cùng một lúc.
13
15
 
14
- // Các lệnh gọi này tương tác với cùng một đối tượng toàn phần (global instance) bên dưới
15
- Api.setUrl('https://api.example.com/v1/')
16
- Api.setHeaders({ 'Authorization': 'Bearer token123' })
16
+ ## Các phương thức
17
17
 
18
- const data = await Api.get({ path: 'users' })
19
- ```
18
+ ### Hành động
20
19
 
21
- ## Các phương thức
20
+ Các phương thức để thực hiện các yêu cầu mạng vật lý.
21
+
22
+ - `request<T>(pathRequest: string | ApiFetch): Promise<T>` — Trình thực thi cốt lõi; chấp nhận một chuỗi đường dẫn hoặc đối tượng cấu hình.
23
+ - `get<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu GET.
24
+ - `post<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu POST.
25
+ - `put<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu PUT.
26
+ - `patch<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu PATCH.
27
+ - `delete<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu DELETE.
28
+
29
+ ### Kiểm tra
30
+
31
+ - `isLocalhost(): boolean` — Kiểm tra xem môi trường hiện tại có phải là máy chủ phát triển cục bộ hay không.
22
32
 
23
- ### Truy cập instance
33
+ ### Cấu hình
24
34
 
25
- - `getItem(): ApiInstance` — Trả về đối tượng `ApiInstance` nội bộ được sử dụng bởi tất cả các phương thức tĩnh.
35
+ - `setUrl(url: string): void` — Thay đổi URL base của API.
36
+ - `setHeaders(headers: Record<string, string>): void` — Thiết lập các header yêu cầu mặc định.
37
+ - `setRequestDefault(request: Record<string, any>): void` — Thiết lập dữ liệu body yêu cầu mặc định.
38
+ - `setPreparation(callback): void` — Đăng ký một hook để chạy trước mỗi yêu cầu được bật.
39
+ - `setEnd(callback): void` — Đăng ký một hook để chạy sau mỗi phản hồi được bật.
40
+ - `setTimeout(timeout: number): void` — Thay đổi timeout yêu cầu toàn cục.
41
+ - `setOrigin(origin: string): void` — Thay đổi nguồn (giao thức và tên miền) cho URL base.
42
+ - `setConfig(config?: ApiConfig): void` — Áp dụng một đối tượng cấu hình đầy đủ.
26
43
 
27
- ### Phương thức thông tin
44
+ ### Phụ trợ
28
45
 
29
- - `isLocalhost(): boolean` — Trả về `true` nếu đang chạy trên máy chủ phát triển cục bộ.
30
- - `getStatus(): ApiStatus` — Trả về trình quản lý `ApiStatus` để theo dõi trạng thái và lỗi của yêu cầu cuối cùng.
31
- - `getResponse(): ApiResponse` — Trả về trình quản lý phản hồi/mô phỏng `ApiResponse`.
32
- - `getUrl(path: string, api?: boolean): string` — Trả về URL đầy đủ cho yêu cầu. Các trình giữ chỗ động `{locale}`, `{country}`, `{language}` được thay thế tự động.
33
- - `getBody(request?, method?): string | FormData | undefined` — Trả về dữ liệu cho phần thân (body) của yêu cầu.
34
- - `getBodyForGet(request, path?, method?): string` — Trả về chuỗi tham số truy vấn (query string) cho phương thức GET.
46
+ - `getStatus(): ApiStatus` — Truy cập trình quản trạng thái cho yêu cầu cuối cùng.
47
+ - `getResponse(): ApiResponse` — Truy cập trình quản lý phản hồi/mô phỏng.
48
+ - `getHydration(): ApiHydration` — Truy cập trình quản lý hydration.
49
+ - `getHydrationScript(): string` — Trả về khối script để hydration từ SSR sang client.
50
+ - `getOrigin(): string` — Trả về URL base đã kết hợp với đường dẫn API.
51
+ - `getUrl(path: string, api?: boolean): string` — Trả về URL đã được phân giải đầy đủ với các token bản địa hóa.
52
+ - `getBody(request?, method?): string | FormData | undefined` — Chuẩn bị body yêu cầu.
53
+ - `getBodyForGet(request, path?, method?): string` — Chuẩn bị chuỗi truy vấn (query string).
54
+ - `getItem(): ApiInstance` — Trả về đối tượng `ApiInstance` cơ sở.
35
55
 
36
- ### Phương thức cấu hình
56
+ ## Các kiểu dữ liệu (Types)
37
57
 
38
- Tất cả các phương thức cấu hình đều trả về chính lớp `Api` để hỗ trợ chuỗi lệnh (chaining):
58
+ ### ApiConfig
39
59
 
40
- - `setUrl(url: string): Api` — Đặt URL sở cho tất cả các yêu cầu.
41
- - `setHeaders(headers: Record<string, string>): Api` — Đặt các headers mặc định cho tất cả các yêu cầu.
42
- - `setRequestDefault(request: Record<string, any>): Api` Đặt dữ liệu yêu cầu mặc định được hợp nhất vào mọi thân yêu cầu (request body).
43
- - `setPreparation(callback): Api`Đặt hàm callback được thực thi trước mỗi yêu cầu.
44
- - `setEnd(callback): Api` Đặt hàm callback được thực thi sau mỗi yêu cầu.
45
- - `setConfig(config?: ApiConfig): Api` Áp dụng toàn bộ đối tượng cấu hình cùng một lúc (`urlRoot`, `headers`, `requestDefault`, `preparation`, `end`).
60
+ - `urlRoot: string` — URL base cho API.
61
+ - `origin: string` — giao thức tên miền cho URL base.
62
+ - `headers: Record<string, string>`các header yêu cầu mặc định.
63
+ - `requestDefault: Record<string, any>` dữ liệu yêu cầu mặc định.
64
+ - `preparation: (apiFetch: ApiFetch) => Promise<void>` hook đầu vào (entry hook).
65
+ - `end: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>` hook đầu ra (exit hook).
66
+ - `timeout: number` — timeout toàn cục tính bằng mili giây.
46
67
 
47
- ### Phương thức yêu cầu
68
+ ## Kiến trúc Proxy
48
69
 
49
- - `request<T>(pathRequest: string | ApiFetch): Promise<T>` Trình thực thi yêu cầu chính. Chấp nhận chuỗi đường dẫn hoặc đối tượng cấu hình `ApiFetch`.
50
- - `get<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu HTTP GET.
51
- - `post<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu HTTP POST.
52
- - `put<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu HTTP PUT.
53
- - `delete<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu HTTP DELETE.
70
+ Lớp `Api` hoạt động như một **Proxy tĩnh**. Tất cả các lệnh gọi phương thức đều được chuyển hướng đến một `ApiInstance` nội bộ.
54
71
 
55
- ## setConfig
72
+ ### Quản lý Instance
56
73
 
57
- Phương thức `setConfig` cho phép áp dụng nhiều tùy chọn cấu hình cùng lúc bằng đối tượng `ApiConfig`:
74
+ Trình quản lý nội bộ được lưu trữ trong `ServerStorage` bằng một khóa duy nhất (`__dxt_api_instance__`). Kiến trúc này giải quyết hai vấn đề lớn:
58
75
 
59
- ```typescript
60
- import { Api } from '@dxtmisha/functional'
76
+ 1. **An toàn luồng trong SSR**: Trong quá trình render phía máy chủ, `ServerStorage` đảm bảo rằng mỗi yêu cầu đến có cấu hình và trạng thái API riêng biệt, ngăn chặn rò rỉ dữ liệu giữa các người dùng.
77
+ 2. **Sự đơn giản của Singleton trên Client**: Ở phía client, nó hoạt động như một singleton thực sự, cho phép bạn cấu hình API tại điểm truy cập và sử dụng nó ở bất cứ đâu mà không cần truyền instance.
61
78
 
62
- Api.setConfig({
63
- urlRoot: 'https://api.example.com/v1/',
64
- headers: { 'Authorization': 'Bearer token123' },
65
- requestDefault: { source: 'webapp' },
66
- preparation: async (apiFetch) => {
67
- console.log('Chuẩn bị:', apiFetch.path)
68
- },
69
- end: async (response, apiFetch) => {
70
- if (response.status === 401) {
71
- return { reset: true }
72
- }
73
- return {}
74
- }
75
- })
76
- ```
79
+ ### Ủy quyền (Delegation)
77
80
 
78
- > **Quan trọng:** Toàn bộ danh sách đầy đủ về các tùy chọn `ApiFetch`, hook vòng đời, phỏng phản hồi cấu trúc dữ liệu phản hồi đã được ghi chép chi tiết tại tài liệu gốc của lớp **ApiInstance**.
81
+ Mặc `Api` giao diện được ưu tiên cho logic ứng dụng tiêu chuẩn, nhưng logic cốt lõi (thử lại, logic hydration, jitter) nằm bên trong `ApiInstance`. Đối với các tình huống nâng cao liên quan đến nhiều URL base hoặc các bộ header khác nhau đồng thời, bạn có thể khởi tạo `ApiInstance` trực tiếp.
@@ -0,0 +1,111 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/en/functional-basic/Classes/ApiCache - API Response Caching'/>
4
+
5
+ # ApiCache Class
6
+
7
+ A class for caching API responses. It allows storing query results in memory or an external storage, preventing redundant network calls within a specified period. In the current implementation, caching is active by default only on the server side (SSR) to speed up rendering and reduce API load during concurrent requests.
8
+
9
+ > `ApiCache` is an **auxiliary class**, designed for low-level cache management. In most cases, it is recommended to interact with caching through the `cache` parameter in `ApiInstance` or the global `Api` object.
10
+
11
+ ## Key Features
12
+
13
+ - **Automated Key Management** — generates unique cache keys based on request parameters (path, method, body, etc.).
14
+ - **Flexible TTL (Time To Live)** — allows setting the storage duration for each request individually or using a default (24 hours).
15
+ - **SSR Optimization** — prevents unnecessary API calls in the Node.js environment. Disabled by default in the browser (only works if explicitly enabled through configuration parameters).
16
+ - **Listener Support** — ability to connect external storage (e.g., Redis, Nitro Storage) via callback functions.
17
+ - **Background Cleanup** — automatically removes expired entries when accessing the cache.
18
+
19
+ ## Methods
20
+
21
+ ### Action
22
+
23
+ Methods for managing cache entries.
24
+
25
+ - `get<T>(key: string): Promise<T | undefined>` — Retrieves a value from the cache.
26
+ - `getByFetch<T>(fetch: ApiFetch): Promise<T | undefined>` — Retrieves a value using request options as the key source.
27
+ - `set<T>(key: string, value: T, age?: number): Promise<void>` — Stores a value in the cache.
28
+ - `setByFetch<T>(fetch: ApiFetch, value: T): Promise<void>` — Stores a value using request options.
29
+ - `remove(key: string): Promise<void>` — Manually removes an entry.
30
+
31
+ ### Configuration
32
+
33
+ - `init(getListener, setListener, removeListener, cacheStepAgeClearOld?): void` — Configures the cache with storage listeners.
34
+ - `reset(): void` — Clears in-memory items and detaches listeners.
35
+
36
+ ## Types
37
+
38
+ #### `ApiCacheItem<T>`
39
+ The structure of a cached record.
40
+ - `value: T` — The cached data.
41
+ - `age: number` — TTL in seconds.
42
+ - `cacheAge: number` — Creation timestamp (ms).
43
+
44
+ #### `ApiCacheList`
45
+ An internal dictionary for in-memory storage fallback.
46
+ - `[key: string]: ApiCacheItem` — Key-value pairs of cached items.
47
+
48
+ ## Initialization and External Storage
49
+
50
+ By default, `ApiCache` stores records in the process RAM and works only on the server side. While this is fast, it has limitations in production environments:
51
+ 1. **Cluster Synchronization**: In a multi-instance setup, caches are not shared between processes.
52
+ 2. **Process Restarts**: Memory is cleared whenever the server restarts or a serverless function "cold starts".
53
+ 3. **Memory Limits**: Storing large amounts of data in RAM can lead to increased memory consumption.
54
+
55
+ To solve these issues, you must initialize `ApiCache` with the `init` method, providing listeners that bridge it to an external storage mechanism.
56
+
57
+ > Important: You must call `ApiCache.init()` during your application's bootstrap phase (before the first API request) to ensure the cache is correctly configured.
58
+
59
+ ### Node.js (Custom Storage)
60
+
61
+ In a standard Node.js environment, you can use listeners to interact with a centralized database or a persistent cache like Redis.
62
+
63
+ ```typescript
64
+ import { ApiCache } from '@dxtmisha/functional-basic'
65
+
66
+ // Configuration with storage listeners
67
+ ApiCache.init(
68
+ // 1. Get data from external storage
69
+ async (key) => await myExternalStorage.get(key),
70
+
71
+ // 2. Save data to external storage
72
+ async (key, value) => {
73
+ await myExternalStorage.put(key, value)
74
+ return true // Return true to indicate successful external storage
75
+ },
76
+
77
+ // 3. Remove data from external storage
78
+ async (key) => {
79
+ await myExternalStorage.delete(key)
80
+ return true
81
+ },
82
+
83
+ // 4. Optional: threshold for background cleanup trigger
84
+ 16384
85
+ )
86
+ ```
87
+
88
+ ### Nuxt / Nitro
89
+
90
+ In Nuxt/Nitro, the recommended approach is to use the built-in `useStorage` helper within a server plugin. This allows you to leverage Redis, FS, or other Nitro-supported storage drivers.
91
+
92
+ ```typescript
93
+ // server/plugins/api-cache.ts
94
+ import { ApiCache } from '@dxtmisha/functional-basic'
95
+
96
+ export default defineNitroPlugin(() => {
97
+ const storage = useStorage('cache') // Nitro Cache region
98
+
99
+ ApiCache.init(
100
+ async (key) => await storage.getItem(key),
101
+ async (key, value) => {
102
+ await storage.setItem(key, value)
103
+ return true
104
+ },
105
+ async (key) => {
106
+ await storage.removeItem(key)
107
+ return true
108
+ }
109
+ )
110
+ })
111
+ ```
@@ -0,0 +1,111 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/ru/functional-basic/Classes/ApiCache - Кэширование ответов API'/>
4
+
5
+ # Класс ApiCache
6
+
7
+ Класс для кэширования ответов API. Он позволяет сохранять результаты запросов в памяти или во внешнем хранилище, предотвращая избыточные сетевые вызовы в течение заданного периода. В текущей реализации кэширование по умолчанию активно только на стороне сервера (SSR) для ускорения рендеринга и снижения нагрузки на API при одновременных запросах.
8
+
9
+ > `ApiCache` является **вспомогательным классом**, предназначенным для низкоуровневого управления кэшем. В большинстве случаев рекомендуется взаимодействовать с кэшированием через параметр `cache` в `ApiInstance` или глобальный объект `Api`.
10
+
11
+ ## Основные возможности
12
+
13
+ - **Автоматическое управление ключами** — генерирует уникальные ключи кэша на основе параметров запроса (путь, метод, тело запроса и т.д.).
14
+ - **Гибкий TTL (Time To Live)** — позволяет устанавливать время хранения для каждого запроса индивидуально или использовать значение по умолчанию (24 часа).
15
+ - **Оптимизация SSR** — предотвращает ненужные вызовы API в среде Node.js. По умолчанию отключено в браузере (работает только если явно включено через параметры конфигурации).
16
+ - **Поддержка слушателей** — возможность подключения внешнего хранилища (например, Redis, Nitro Storage) через функции обратного вызова.
17
+ - **Фоновая очистка** — автоматически удаляет устаревшие записи при обращении к кэшу.
18
+
19
+ ## Методы
20
+
21
+ ### Действие
22
+
23
+ Методы для управления записями кэша.
24
+
25
+ - `get<T>(key: string): Promise<T | undefined>` — Извлекает значение из кэша.
26
+ - `getByFetch<T>(fetch: ApiFetch): Promise<T | undefined>` — Извлекает значение, используя опции запроса как источник ключа.
27
+ - `set<T>(key: string, value: T, age?: number): Promise<void>` — Сохраняет значение в кэше.
28
+ - `setByFetch<T>(fetch: ApiFetch, value: T): Promise<void>` — Сохраняет значение на основе опций запроса.
29
+ - `remove(key: string): Promise<void>` — Удаляет запись вручную.
30
+
31
+ ### Конфигурация
32
+
33
+ - `init(getListener, setListener, removeListener, cacheStepAgeClearOld?): void` — Настраивает кэш слушателями хранилища.
34
+ - `reset(): void` — Очищает элементы в памяти и отключает слушателей.
35
+
36
+ ## Типы данных
37
+
38
+ #### `ApiCacheItem<T>`
39
+ Структура кэшированной записи.
40
+ - `value: T` — Значение данных.
41
+ - `age: number` — TTL в секундах.
42
+ - `cacheAge: number` — Метка времени создания (мс).
43
+
44
+ #### `ApiCacheList`
45
+ Внутренний словарь для резервного хранения в оперативной памяти.
46
+ - `[key: string]: ApiCacheItem` — Пары ключ-значение кэшированных элементов.
47
+
48
+ ## Инициализация и внешнее хранилище
49
+
50
+ По умолчанию `ApiCache` сохраняет записи в оперативной памяти (RAM) процесса и работает только на стороне сервера. Хотя это очень быстро, в продуктовой среде такой подход имеет ограничения:
51
+ 1. **Синхронизация в кластере**: В многоэкземплярной конфигурации кэши не разделяются между процессами.
52
+ 2. **Перезагрузка процесса**: Память очищается при каждом перезапуск сервера или «холодном старте» серверных функций.
53
+ 3. **Лимиты памяти**: Хранение больших объемов данных в RAM может привести к чрезмерному потреблению ресурсов.
54
+
55
+ Для решения этих задач необходимо инициализировать `ApiCache` с помощью метода `init`, предоставив слушателей (listeners) для связи с внешним механизмом хранения.
56
+
57
+ > Важно: Метод `ApiCache.init()` должен быть вызван на этапе запуска приложения (до первого API-запроса), чтобы гарантировать правильную конфигурацию кэша.
58
+
59
+ ### Node.js (Произвольное хранилище)
60
+
61
+ В стандартной среде Node.js вы можете использовать слушателей для взаимодействия с централизованной базой данных или персистентным кэшем, таким как Redis.
62
+
63
+ ```typescript
64
+ import { ApiCache } from '@dxtmisha/functional-basic'
65
+
66
+ // Конфигурация со слушателями хранилища
67
+ ApiCache.init(
68
+ // 1. Получение данных из внешнего хранилища
69
+ async (key) => await myExternalStorage.get(key),
70
+
71
+ // 2. Сохранение данных во внешнее хранилище
72
+ async (key, value) => {
73
+ await myExternalStorage.put(key, value)
74
+ return true // Возвращаем true для подтверждения внешнего сохранения
75
+ },
76
+
77
+ // 3. Удаление данных из внешнего хранилища
78
+ async (key) => {
79
+ await myExternalStorage.delete(key)
80
+ return true
81
+ },
82
+
83
+ // 4. Опционально: порог срабатывания фоновой очистки
84
+ 16384
85
+ )
86
+ ```
87
+
88
+ ### Nuxt / Nitro
89
+
90
+ В Nuxt/Nitro рекомендуемый подход — использование встроенного хелпера `useStorage` внутри серверного плагина. Это позволяет задействовать Redis, файловую систему или любой другой драйвер, поддерживаемый Nitro.
91
+
92
+ ```typescript
93
+ // server/plugins/api-cache.ts
94
+ import { ApiCache } from '@dxtmisha/functional-basic'
95
+
96
+ export default defineNitroPlugin(() => {
97
+ const storage = useStorage('cache') // Регион кэша Nitro
98
+
99
+ ApiCache.init(
100
+ async (key) => await storage.getItem(key),
101
+ async (key, value) => {
102
+ await storage.setItem(key, value)
103
+ return true
104
+ },
105
+ async (key) => {
106
+ await storage.removeItem(key)
107
+ return true
108
+ }
109
+ )
110
+ })
111
+ ```
@@ -0,0 +1,111 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/vi/functional-basic/Classes/ApiCache - Bộ nhớ đệm phản hồi API'/>
4
+
5
+ # Lớp ApiCache
6
+
7
+ Một lớp để lưu bộ nhớ đệm (caching) cho các phản hồi API. Nó cho phép lưu trữ kết quả truy vấn trong bộ nhớ hoặc kho lưu trữ bên ngoài, ngăn chặn các cuộc gọi mạng dư thừa trong một khoảng thời gian cụ thể. Trong phiên bản hiện tại, việc lưu bộ nhớ đệm chỉ hoạt động ở phía máy chủ (SSR) để tăng tốc độ hiển thị và giảm tải API trong quá trình xử lý nhiều yêu cầu đồng thời.
8
+
9
+ > `ApiCache` là một **lớp bổ trợ**, được thiết kế để quản lý bộ nhớ đệm ở cấp độ thấp. Trong hầu hết các trường hợp, bạn nên tương tác với việc lưu bộ nhớ đệm thông qua tham số `cache` trong `ApiInstance` hoặc đối tượng `Api` toàn cục.
10
+
11
+ ## Các tính năng chính
12
+
13
+ - **Quản lý khóa tự động** — tạo các khóa cache duy nhất dựa trên các tham số yêu cầu (đường dẫn, phương thức, thân yêu cầu, v.v.).
14
+ - **TTL linh hoạt (Time To Live)** — cho phép thiết lập thời gian lưu trữ cho từng yêu cầu riêng lẻ hoặc sử dụng mặc định (24 giờ).
15
+ - **Tối ưu hóa SSR** — ngăn chặn các cuộc gọi API không cần thiết trong môi trường Node.js. Chế độ này mặc định bị tắt trong trình duyệt.
16
+ - **Hỗ trợ Bộ lắng nghe (Listener)** — khả năng kết nối kho lưu trữ bên ngoài (ví dụ: Redis, Nitro Storage) thông qua các hàm callback.
17
+ - **Dọn dẹp chạy ngầm** — tự động xóa các mục đã hết hạn khi truy cập bộ nhớ đệm.
18
+
19
+ ## Các phương thức
20
+
21
+ ### Hành động
22
+
23
+ Các phương thức để quản lý các mục lưu trữ trong cache.
24
+
25
+ - `get<T>(key: string): Promise<T | undefined>` — Lấy một giá trị từ cache.
26
+ - `getByFetch<T>(fetch: ApiFetch): Promise<T | undefined>` — Lấy một giá trị sử dụng các tùy chọn yêu cầu làm nguồn tạo khóa.
27
+ - `set<T>(key: string, value: T, age?: number): Promise<void>` — Lưu một giá trị vào cache.
28
+ - `setByFetch<T>(fetch: ApiFetch, value: T): Promise<void>` — Lưu một giá trị dựa trên các tùy chọn yêu cầu.
29
+ - `remove(key: string): Promise<void>` — Xóa một mục cache thủ công.
30
+
31
+ ### Cấu hình
32
+
33
+ - `init(getListener, setListener, removeListener, cacheStepAgeClearOld?): void` — Cấu hình cache với các listener của bộ lưu trữ.
34
+ - `reset(): void` — Xóa các mục trong bộ nhớ RAM và ngắt kết nối các listener.
35
+
36
+ ## Các kiểu dữ liệu
37
+
38
+ #### `ApiCacheItem<T>`
39
+ Cấu trúc của một bản ghi trong bộ nhớ đệm.
40
+ - `value: T` — Dữ liệu được lưu.
41
+ - `age: number` — TTL tính bằng giây.
42
+ - `cacheAge: number` — Dấu thời gian (ms) khi bản ghi được tạo.
43
+
44
+ #### `ApiCacheList`
45
+ Từ điển nội bộ dành cho việc lưu trữ dự phòng trong bộ nhớ RAM.
46
+ - `[key: string]: ApiCacheItem` — Các cặp khóa-giá trị của các mục được lưu vào bộ nhớ đệm.
47
+
48
+ ## Khởi tạo và Kho lưu trữ bên ngoài
49
+
50
+ Theo mặc định, `ApiCache` lưu trữ các bản ghi trong RAM của tiến trình. Mặc dù cách này rất nhanh, nhưng nó có những hạn chế khi triển khai thực tế:
51
+ 1. **Đồng bộ hóa trong cụм (Cluster)**: Trong thiết lập đa thực thể, bộ nhớ đệm không được chia sẻ giữa các tiến trình.
52
+ 2. **Khởi động lại tiến trình**: Bộ nhớ sẽ bị xóa bất khi nào máy chủ khởi động lại hoặc có một "cold start" của các hàm serverless.
53
+ 3. **Giới hạn bộ nhớ**: Lưu trữ lượng lớn dữ liệu trong RAM có thể dẫnถึง việc tiêu thụ bộ nhớ quá mức.
54
+
55
+ Để giải quyết những vấn đề này, bạn phải khởi tạo `ApiCache` bằng phương thức `init`, cung cấp các bộ lắng nghe (listeners) đóng vai trò cầu nối với cơ chế lưu trữ bên ngoài.
56
+
57
+ > Quan trọng: Bạn phải gọi `ApiCache.init()` trong giai đoạn khởi tạo ứng dụng (trước yêu cầu API đầu tiên) để đảm bảo bộ nhớ đệm được cấu hình chính xác.
58
+
59
+ ### Node.js (Kho lưu trữ tùy chỉnh)
60
+
61
+ Trong môi trường Node.js tiêu chuẩn, bạn có thể sử dụng các bộ lắng nghe để tương tác với một cơ sở dữ liệu tập trung hoặc một bộ nhớ đệm bền vững như Redis.
62
+
63
+ ```typescript
64
+ import { ApiCache } from '@dxtmisha/functional-basic'
65
+
66
+ // Cấu hình với các bộ lắng nghe lưu trữ
67
+ ApiCache.init(
68
+ // 1. Lấy dữ liệu từ kho lưu trữ bên ngoài
69
+ async (key) => await myExternalStorage.get(key),
70
+
71
+ // 2. Lưu dữ liệu vào kho lưu trữ bên ngoài
72
+ async (key, value) => {
73
+ await myExternalStorage.put(key, value)
74
+ return true // Trả về true để xác nhận đã lưu trữ bên ngoài thành công
75
+ },
76
+
77
+ // 3. Xóa dữ liệu khỏi kho lưu trữ bên ngoài
78
+ async (key) => {
79
+ await myExternalStorage.delete(key)
80
+ return true
81
+ },
82
+
83
+ // 4. Tùy chọn: ngưỡng kích hoạt dọn dẹp chạy ngầm
84
+ 16384
85
+ )
86
+ ```
87
+
88
+ ### Nuxt / Nitro
89
+
90
+ Trong Nuxt/Nitro, cách tiếp cận được khuyến nghị là sử dụng helper `useStorage` tích hợp sẵn bên trong một plugin máy chủ. Điều này cho phép bạn tận dụng Redis, FS, hoặc bất kỳ trình điều khiển lưu trữ nào khác được Nitro hỗ trợ.
91
+
92
+ ```typescript
93
+ // server/plugins/api-cache.ts
94
+ import { ApiCache } from '@dxtmisha/functional-basic'
95
+
96
+ export default defineNitroPlugin(() => {
97
+ const storage = useStorage('cache') // Nitro Cache region
98
+
99
+ ApiCache.init(
100
+ async (key) => await storage.getItem(key),
101
+ async (key, value) => {
102
+ await storage.setItem(key, value)
103
+ return true
104
+ },
105
+ async (key) => {
106
+ await storage.removeItem(key)
107
+ return true
108
+ }
109
+ )
110
+ })
111
+ ```
@@ -0,0 +1,32 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/en/functional-basic/Classes/ApiDataReturn - API Response Data Processing'/>
4
+
5
+ # ApiDataReturn Class
6
+
7
+ A class for handling and processing data received from an API request. It transforms raw response data into a structured format, extracts metadata, and maps content according to the requested configuration.
8
+
9
+ > `ApiDataReturn` is an **auxiliary class**, designed for handling and formatting API response data. In most cases, it is recommended to interact with results through the response returned by `ApiInstance` methods or the global `Api` object.
10
+
11
+ ## Key Features
12
+
13
+ - **Automated Parsing** — intelligently parses JSON responses or returns raw text based on Content-Type headers.
14
+ - **Data Normalization** — ensures that the returned object follows a consistent structure, even if the server response varies.
15
+ - **Metadata Extraction** — automatically extracts common fields like `success`, `status`, `code`, and `message` from the root of the response and merges them into the data object.
16
+ - **Flexible Configuration** — supports custom processing logic via `queryReturn` and controls whether to unwrap the `data` field using `toData`.
17
+
18
+ ## Methods
19
+
20
+ ### Action
21
+
22
+ - `async init(): Promise<this>` — Initializes the class by reading and parsing data from the response object.
23
+ - `get(): ApiData<T>` — Returns the processed and formatted data.
24
+ - `getAndStatus(status: ApiStatus): ApiData<T>` — Returns the processed data injected with a `statusObject` from the provided status instance.
25
+ - `getData(): ApiData<T> | undefined` — Returns the raw, unformatted data as initially read from the response.
26
+
27
+ ## Internal Logic (Protected)
28
+
29
+ - `readData<T>(): Promise<ApiData<T>>` — Low-level method that reads the response body and parses it as JSON or text.
30
+ - `initData(): ApiData<T>` — Formats the raw data according to configuration, handling property unwrapping.
31
+ - `initItem(data: Record<string, any>): ApiData<T>` — Merges metadata fields from the response root into the main data object.
32
+
@@ -0,0 +1,32 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/ru/functional-basic/Classes/ApiDataReturn - Обработка данных ответа API'/>
4
+
5
+ # Класс ApiDataReturn
6
+
7
+ Класс для обработки и подготовки данных, полученных в результате запроса к API. Он преобразует необработанные данные ответа в структурированный формат, извлекает метаданные и сопоставляет содержимое в соответствии с запрошенной конфигурацией.
8
+
9
+ > `ApiDataReturn` является **вспомогательным классом**, предназначенным для обработки и форматирования данных ответа API. В большинстве случаев рекомендуется взаимодействовать с результатами через ответ, возвращаемый методами `ApiInstance` или глобальным объектом `Api`.
10
+
11
+ ## Ключевые особенности
12
+
13
+ - **Автоматический парсинг** — интеллектуально анализирует JSON-ответы или возвращает необработанный текст на основе заголовков Content-Type.
14
+ - **Нормализация данных** — гарантирует, что возвращаемый объект соответствует согласованной структуре, даже если ответ сервера различается.
15
+ - **Извлечение метаданных** — автоматически извлекает общие поля, такие как `success`, `status`, `code` и `message`, из корня ответа и объединяет их с объектом данных.
16
+ - **Гибкая конфигурация** — поддерживает пользовательскую логику обработки через `queryReturn` и управляет развертыванием поля `data` с помощью `toData`.
17
+
18
+ ## Методы
19
+
20
+ ### Действие
21
+
22
+ - `async init(): Promise<this>` — Инициализирует класс, считывая и анализируя данные из объекта ответа.
23
+ - `get(): ApiData<T>` — Возвращает обработанные и отформатированные данные.
24
+ - `getAndStatus(status: ApiStatus): ApiData<T>` — Возвращает обработанные данные с внедренным объектом `statusObject` из предоставленного экземпляра статуса.
25
+ - `getData(): ApiData<T> | undefined` — Возвращает исходные, неотформатированные данные, как они были изначально считаны из ответа.
26
+
27
+ ## Внутренняя логика (Protected)
28
+
29
+ - `readData<T>(): Promise<ApiData<T>>` — Низкоуровневый метод, который считывает тело ответа и парсит его как JSON или текст.
30
+ - `initData(): ApiData<T>` — Форматирует необработанные данные в соответствии с конфигурацией, обрабатывая развертывание свойств.
31
+ - `initItem(data: Record<string, any>): ApiData<T>` — Переносит поля метаданных из корня ответа в основной объект данных.
32
+
@@ -0,0 +1,32 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/vi/functional-basic/Classes/ApiDataReturn - Xử lý dữ liệu phản hồi API'/>
4
+
5
+ # Lớp ApiDataReturn
6
+
7
+ Lớp dùng để xử lý và chuẩn bị dữ liệu nhận được từ yêu cầu API. Nó chuyển đổi dữ liệu phản hồi thô thành định dạng có cấu trúc, trích xuất metadata và ánh xạ nội dung theo cấu hình đã yêu cầu.
8
+
9
+ > `ApiDataReturn` là một **lớp phụ trợ**, được thiết kế để xử lý và định dạng dữ liệu phản hồi API. Trong hầu hết các trường hợp, khuyến khích tương tác với kết quả thông qua phản hồi được trả về bởi các phương thức của `ApiInstance` hoặc đối tượng `Api` toàn cục.
10
+
11
+ ## Các tính năng chính
12
+
13
+ - **Phân tích tự động** — phân tích thông minh các phản hồi JSON hoặc trả về văn bản thô dựa trên tiêu đề Content-Type.
14
+ - **Chuẩn hóa dữ liệu** — đảm bảo rằng đối tượng trả về tuân theo một cấu trúc nhất quán, ngay cả khi phản hồi của máy chủ thay đổi.
15
+ - **Trích xuất Metadata** — tự động trích xuất các trường chung như `success`, `status`, `code` và `message` từ gốc của phản hồi và hợp nhất chúng vào đối tượng dữ liệu.
16
+ - **Cấu hình linh hoạt** — hỗ trợ logic xử lý tùy chỉnh thông qua `queryReturn` và kiểm soát việc giải nén trường `data` bằng `toData`.
17
+
18
+ ## Các phương thức
19
+
20
+ ### Hành động
21
+
22
+ - `async init(): Promise<this>` — Khởi tạo lớp bằng cách đọc và phân tích dữ liệu từ đối tượng phản hồi.
23
+ - `get(): ApiData<T>` — Trả về dữ liệu đã được xử lý và định dạng.
24
+ - `getAndStatus(status: ApiStatus): ApiData<T>` — Trả về dữ liệu đã xử lý được chèn thêm `statusObject` từ đối tượng status được cung cấp.
25
+ - `getData(): ApiData<T> | undefined` — Trả về dữ liệu thô, chưa định dạng như lúc ban đầu được đọc từ phản hồi.
26
+
27
+ ## Logic nội bộ (Protected)
28
+
29
+ - `readData<T>(): Promise<ApiData<T>>` — Phương thức cấp thấp đọc thân phản hồi và phân tích nó dưới dạng JSON hoặc văn bản.
30
+ - `initData(): ApiData<T>` — Định dạng dữ liệu thô theo cấu hình, xử lý việc giải nén các thuộc tính.
31
+ - `initItem(data: Record<string, any>): ApiData<T>` — Hợp nhất các trường metadata từ gốc phản hồi vào đối tượng dữ liệu chính.
32
+