@dxtmisha/wiki 0.39.7 → 0.39.8

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 (191) hide show
  1. package/dist/{defineProperty-DblGXmzD.js → defineProperty-Bjg6wMoX.js} +4 -4
  2. package/dist/library.js +1 -1
  3. package/dist/media.js +12 -0
  4. package/dist/storybook.js +1 -1
  5. package/package.json +1 -1
  6. package/src/media/functional/functional-basic/api/api.en.mdx +45 -0
  7. package/src/media/functional/functional-basic/api/api.ru.mdx +45 -0
  8. package/src/media/functional/functional-basic/api/api.vi.mdx +45 -0
  9. package/src/media/functional/functional-basic/classes/Api/Api.en.mdx +54 -54
  10. package/src/media/functional/functional-basic/classes/Api/Api.ru.mdx +54 -54
  11. package/src/media/functional/functional-basic/classes/Api/Api.vi.mdx +54 -54
  12. package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.en.mdx +111 -0
  13. package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.ru.mdx +111 -0
  14. package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.vi.mdx +111 -0
  15. package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.en.mdx +32 -0
  16. package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.ru.mdx +32 -0
  17. package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.vi.mdx +32 -0
  18. package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.en.mdx +24 -28
  19. package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.ru.mdx +24 -28
  20. package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.vi.mdx +24 -28
  21. package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.en.mdx +28 -14
  22. package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.ru.mdx +33 -19
  23. package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.vi.mdx +33 -19
  24. package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.en.mdx +56 -0
  25. package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.ru.mdx +56 -0
  26. package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.vi.mdx +55 -0
  27. package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.en.mdx +101 -49
  28. package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.ru.mdx +101 -49
  29. package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.vi.mdx +98 -47
  30. package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.en.mdx +44 -26
  31. package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.ru.mdx +45 -27
  32. package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.vi.mdx +44 -26
  33. package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.en.mdx +50 -21
  34. package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.ru.mdx +54 -25
  35. package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.vi.mdx +55 -26
  36. package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.en.mdx +29 -32
  37. package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.ru.mdx +33 -36
  38. package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.vi.mdx +33 -36
  39. package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.en.mdx +34 -53
  40. package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.ru.mdx +33 -52
  41. package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.vi.mdx +39 -58
  42. package/src/media/functional/functional-basic/classes/Cache/Cache.en.mdx +7 -4
  43. package/src/media/functional/functional-basic/classes/Cache/Cache.ru.mdx +7 -4
  44. package/src/media/functional/functional-basic/classes/Cache/Cache.vi.mdx +28 -25
  45. package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.en.mdx +45 -53
  46. package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.ru.mdx +46 -54
  47. package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.vi.mdx +47 -55
  48. package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.en.mdx +13 -1
  49. package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.ru.mdx +13 -1
  50. package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.vi.mdx +13 -0
  51. package/src/media/functional/functional-basic/classes/Cookie/Cookie.en.mdx +88 -44
  52. package/src/media/functional/functional-basic/classes/Cookie/Cookie.ru.mdx +88 -44
  53. package/src/media/functional/functional-basic/classes/Cookie/Cookie.vi.mdx +85 -41
  54. package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.en.mdx +43 -22
  55. package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.ru.mdx +46 -25
  56. package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.vi.mdx +43 -22
  57. package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.en.mdx +84 -0
  58. package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.ru.mdx +84 -0
  59. package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.vi.mdx +100 -0
  60. package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.en.mdx +153 -0
  61. package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.ru.mdx +153 -0
  62. package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.vi.mdx +153 -0
  63. package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.en.mdx +32 -25
  64. package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.ru.mdx +32 -25
  65. package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.vi.mdx +32 -27
  66. package/src/media/functional/functional-basic/classes/Datetime/Datetime.en.mdx +36 -4
  67. package/src/media/functional/functional-basic/classes/Datetime/Datetime.ru.mdx +36 -4
  68. package/src/media/functional/functional-basic/classes/Datetime/Datetime.vi.mdx +36 -4
  69. package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.en.mdx +101 -70
  70. package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.ru.mdx +100 -69
  71. package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.vi.mdx +101 -70
  72. package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.en.mdx +46 -42
  73. package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.ru.mdx +46 -42
  74. package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.vi.mdx +46 -42
  75. package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.en.mdx +44 -96
  76. package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.ru.mdx +44 -96
  77. package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.vi.mdx +44 -96
  78. package/src/media/functional/functional-basic/classes/EventItem/EventItem.en.mdx +49 -28
  79. package/src/media/functional/functional-basic/classes/EventItem/EventItem.ru.mdx +21 -0
  80. package/src/media/functional/functional-basic/classes/EventItem/EventItem.vi.mdx +63 -42
  81. package/src/media/functional/functional-basic/classes/Formatters/Formatters.en.mdx +97 -109
  82. package/src/media/functional/functional-basic/classes/Formatters/Formatters.ru.mdx +86 -98
  83. package/src/media/functional/functional-basic/classes/Formatters/Formatters.vi.mdx +99 -111
  84. package/src/media/functional/functional-basic/classes/Geo/Geo.en.mdx +3 -3
  85. package/src/media/functional/functional-basic/classes/Geo/Geo.ru.mdx +5 -5
  86. package/src/media/functional/functional-basic/classes/Geo/Geo.vi.mdx +5 -5
  87. package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.en.mdx +83 -40
  88. package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.ru.mdx +83 -40
  89. package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.vi.mdx +87 -44
  90. package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.en.mdx +81 -0
  91. package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.ru.mdx +81 -0
  92. package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.vi.mdx +81 -0
  93. package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.en.mdx +56 -105
  94. package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.ru.mdx +53 -102
  95. package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.vi.mdx +55 -105
  96. package/src/media/functional/functional-basic/classes/Hash/Hash.en.mdx +18 -7
  97. package/src/media/functional/functional-basic/classes/Hash/Hash.ru.mdx +18 -7
  98. package/src/media/functional/functional-basic/classes/Hash/Hash.vi.mdx +18 -7
  99. package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.en.mdx +54 -0
  100. package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.ru.mdx +54 -0
  101. package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.vi.mdx +54 -0
  102. package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.en.mdx +78 -0
  103. package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.ru.mdx +78 -0
  104. package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.vi.mdx +78 -0
  105. package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.en.mdx +50 -0
  106. package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.ru.mdx +50 -0
  107. package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.vi.mdx +50 -0
  108. package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.en.mdx +131 -0
  109. package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.ru.mdx +131 -0
  110. package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.vi.mdx +131 -0
  111. package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.en.mdx +97 -0
  112. package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.ru.mdx +97 -0
  113. package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.vi.mdx +97 -0
  114. package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.en.mdx +13 -5
  115. package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.ru.mdx +13 -5
  116. package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.vi.mdx +13 -5
  117. package/src/media/functional/functional-basic/functions/anyToString/anyToString.en.mdx +37 -19
  118. package/src/media/functional/functional-basic/functions/anyToString/anyToString.ru.mdx +37 -19
  119. package/src/media/functional/functional-basic/functions/anyToString/anyToString.vi.mdx +35 -17
  120. package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.en.mdx +31 -19
  121. package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.ru.mdx +31 -19
  122. package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.vi.mdx +32 -20
  123. package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.en.mdx +29 -15
  124. package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.ru.mdx +28 -14
  125. package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.vi.mdx +28 -14
  126. package/src/media/functional/functional-basic/functions/capitalize/capitalize.en.mdx +7 -3
  127. package/src/media/functional/functional-basic/functions/capitalize/capitalize.ru.mdx +7 -3
  128. package/src/media/functional/functional-basic/functions/capitalize/capitalize.vi.mdx +7 -3
  129. package/src/media/functional/functional-basic/functions/copyObject/copyObject.en.mdx +17 -13
  130. package/src/media/functional/functional-basic/functions/copyObject/copyObject.ru.mdx +17 -13
  131. package/src/media/functional/functional-basic/functions/copyObject/copyObject.vi.mdx +17 -13
  132. package/src/media/functional/functional-basic/functions/createElement/createElement.en.mdx +2 -0
  133. package/src/media/functional/functional-basic/functions/createElement/createElement.ru.mdx +2 -0
  134. package/src/media/functional/functional-basic/functions/createElement/createElement.vi.mdx +2 -0
  135. package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.en.mdx +1 -3
  136. package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.ru.mdx +1 -3
  137. package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.vi.mdx +1 -3
  138. package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.en.mdx +13 -10
  139. package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.ru.mdx +14 -11
  140. package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.vi.mdx +12 -9
  141. package/src/media/functional/functional-basic/functions/executePromise/executePromise.en.mdx +14 -13
  142. package/src/media/functional/functional-basic/functions/executePromise/executePromise.ru.mdx +15 -14
  143. package/src/media/functional/functional-basic/functions/executePromise/executePromise.vi.mdx +14 -13
  144. package/src/media/functional/functional-basic/functions/forEach/forEach.en.mdx +1 -1
  145. package/src/media/functional/functional-basic/functions/forEach/forEach.ru.mdx +1 -1
  146. package/src/media/functional/functional-basic/functions/forEach/forEach.vi.mdx +1 -1
  147. package/src/media/functional/functional-basic/functions/frame/frame.en.mdx +7 -4
  148. package/src/media/functional/functional-basic/functions/frame/frame.ru.mdx +6 -3
  149. package/src/media/functional/functional-basic/functions/frame/frame.vi.mdx +7 -4
  150. package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.en.mdx +34 -0
  151. package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.ru.mdx +34 -0
  152. package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.vi.mdx +35 -0
  153. package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.en.mdx +2 -0
  154. package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.ru.mdx +2 -0
  155. package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.vi.mdx +2 -0
  156. package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.en.mdx +21 -0
  157. package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.ru.mdx +21 -0
  158. package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.vi.mdx +21 -0
  159. package/src/media/functional/functional-basic/functions/getElementId/getElementId.en.mdx +17 -3
  160. package/src/media/functional/functional-basic/functions/getElementId/getElementId.ru.mdx +17 -3
  161. package/src/media/functional/functional-basic/functions/getElementId/getElementId.vi.mdx +18 -4
  162. package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.en.mdx +31 -0
  163. package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.ru.mdx +31 -0
  164. package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.vi.mdx +31 -0
  165. package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.en.mdx +25 -0
  166. package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.ru.mdx +25 -0
  167. package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.vi.mdx +25 -0
  168. package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.en.mdx +11 -4
  169. package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.ru.mdx +14 -7
  170. package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.vi.mdx +13 -6
  171. package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.en.mdx +3 -2
  172. package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.ru.mdx +3 -2
  173. package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.vi.mdx +3 -2
  174. package/src/media/functional/functional-basic/functions/toNumber/toNumber.en.mdx +25 -9
  175. package/src/media/functional/functional-basic/functions/toNumber/toNumber.ru.mdx +25 -9
  176. package/src/media/functional/functional-basic/functions/toNumber/toNumber.vi.mdx +25 -9
  177. package/src/media/functional/functional-basic/functions/toString/toString.en.mdx +28 -0
  178. package/src/media/functional/functional-basic/functions/toString/toString.ru.mdx +28 -0
  179. package/src/media/functional/functional-basic/functions/toString/toString.vi.mdx +28 -0
  180. package/src/media/functional/ui/about/about.en.mdx +45 -0
  181. package/src/media/functional/ui/about/about.ru.mdx +45 -0
  182. package/src/media/functional/ui/about/about.vi.mdx +45 -0
  183. package/src/media/functional/ui/component/component.en.mdx +104 -0
  184. package/src/media/functional/ui/component/component.ru.mdx +106 -0
  185. package/src/media/functional/ui/component/component.vi.mdx +104 -0
  186. package/src/media/functional/ui/setup/setup.en.mdx +72 -0
  187. package/src/media/functional/ui/setup/setup.ru.mdx +72 -0
  188. package/src/media/functional/ui/setup/setup.vi.mdx +72 -0
  189. package/src/media/functional/ui/wiki-data.en.mdx +114 -0
  190. package/src/media/functional/ui/wiki-data.ru.mdx +114 -0
  191. package/src/media/functional/ui/wiki-data.vi.mdx +114 -0
@@ -1,139 +1,89 @@
1
1
  import {Meta} from '@storybook/addon-docs/blocks'
2
2
 
3
- <Meta title='@dxtmisha/vi/functional-basic/Classes/GeoPhone - Mặt nạ số điện thoại'/>
3
+ <Meta title='@dxtmisha/vi/functional-basic/Classes/GeoPhone - Mặt nạ điện thoại'/>
4
4
 
5
5
  # Lớp GeoPhone
6
6
 
7
- Lớp chuyên biệt để lưu trữ và xử lý các mặt nạ số điện thoại quốc tế. cung cấp một hệ thống mạnh mẽ để xác định thông tin vị trí địa lý của quốc gia từ các chuỗi số điện thoại, định dạng số thô thành các đặc tả mặt nạ địa phương và quản lý bản đồ mã điện thoại quốc tế dựa trên cấu trúc cây tiền tố (prefix-tree).
7
+ Lớp chuyên biệt để lưu trữ và xử lý mặt nạ số điện thoại quốc tế. Cung cấp chế xác định quốc gia theo chuỗi số điện thoại, định dạng số thô thành mặt nạ được bản địa hóa và quản lý bản đồ mã điện thoại phức tạp dựa trên cây tiền tố (Trie). Lớp này được tích hợp chặt chẽ với dữ liệu địa lý `Geo`, cho phép tự động xác định mặt nạ dựa trên ngôn ngữ hiện tại của người dùng hoặc mã quốc gia được cung cấp.
8
8
 
9
- Lớp này tích hợp sâu với dữ liệu địa lý `Geo` để cung cấp khả năng tự động phân giải mặt nạ dựa trên vùng locale hiện tại của người dùng hoặc các mã quốc gia cụ thể.
9
+ ## Tính năng chính
10
10
 
11
- ## Các tính năng chính
11
+ - **Khớp tự động** — Tự động xác định quốc gia và mẫu mặt nạ phù hợp thông qua tìm kiếm đệ quy trong cây tiền tố.
12
+ - **Tối ưu hóa cây tiền tố** — Sử dụng cấu trúc `map` chuyên biệt (Trie) để tìm kiếm hiệu suất cao.
13
+ - **Bình thường hóa thông minh** — Tự động xử lý các biến thể quay số khu vực như số 0 ở đầu hoặc tiền tố quốc gia.
14
+ - **Định dạng tiêu chuẩn** — Chuyển đổi các chuỗi số thô thành định dạng dễ đọc.
12
15
 
13
- - **Tự động khớp (Auto Mapping)** — Tự động phân giải quốc gia và mẫu mặt nạ phù hợp một cách động thông qua tra cứu cây tiền tố đệ quy.
14
- - **Tối ưu hóa Cây Tiền tố (Prefix Tree)** — Sử dụng cấu trúc `map` chuyên biệt (Prefix Tree) để tìm kiếm hiệu quả và hiệu suất cao trên các kế hoạch đánh số quốc tế.
15
- - **Chuẩn hóa Thông minh** — Tự động xử lý các biến thể quay số theo vùng, chẳng hạn như số 0 ở đầu hoặc các tiền tố quốc gia (ví dụ: số '8' của Nga).
16
- - **Định dạng Chuẩn hóa** — Chuyển đổi các chuỗi số thô thành các định dạng điện thoại dễ đọc, phù hợp với các tiêu chuẩn viễn thông quốc tế.
16
+ ## Cách sử dụng bản
17
17
 
18
- ## Các phương thức Tìm kiếm
19
-
20
- ### `getByPhone`
21
-
22
- Phương thức định danh chính phân tích một chuỗi số điện thoại để trích xuất thông tin địa lý và mặt nạ đánh số phù hợp nhất.
23
-
24
- **Tham số:**
25
- - `phone: string` — Số điện thoại mục tiêu cần phân tích (chấp nhận các chuỗi thô hoặc đã được định dạng một phần).
26
-
27
- **Trả về:** `GeoPhoneMapInfo` — Một đối tượng cấu trúc chứa mục `GeoPhoneMap` khớp được và phần số đã được chuẩn hóa của điện thoại.
18
+ Bạn thể sử dụng các phương thức tĩnh của lớp để xác định nhanh quốc gia theo số điện thoại hoặc định dạng.
28
19
 
29
20
  ```javascript
30
21
  import { GeoPhone } from '@dxtmisha/functional-basic'
31
22
 
23
+ // Xác định quốc gia theo số điện thoại
32
24
  const info = GeoPhone.getByPhone('84901234567')
33
- // trả về:
34
- // {
35
- // item: { info: { phone: 84, ... }, mask: ['+84 ** **** ****'], ... },
36
- // phone: '901234567'
37
- // }
38
- ```
39
-
40
- ### `get`
41
-
42
- Truy xuất siêu dữ liệu điện thoại đã địa phương hóa được liên kết với một mã quốc gia cụ thể.
43
-
44
- **Tham số:**
45
- - `code: string` — Mã quốc gia tiêu chuẩn ISO 3166 (ví dụ: `'VN'`, `'RU'`, `'US'`).
25
+ console.log(info.item?.value) // 'VN'
46
26
 
47
- **Trả về:** `GeoPhoneValue | undefined` — Siêu dữ liệu thô của quốc gia, hoặc `undefined` nếu không tìm thấy trong bộ dữ liệu.
48
-
49
- ```javascript
50
- GeoPhone.get('VN')
51
- // { phone: 84, within: 0, mask: ['+** ** **** ****'], value: 'VN' }
27
+ // Định dạng theo mặt nạ
28
+ const formatted = GeoPhone.toMask('901234567', ['+** (***) ***-***'])
29
+ console.log(formatted) // '+84 (901) 234-567'
52
30
  ```
53
31
 
54
- ### `getByCode`
55
-
56
- Phương thức truy xuất mở rộng trả về dữ liệu mặt nạ đầy đủ bao gồm cả nút cây tìm kiếm cho một mã quốc gia nhất định.
57
-
58
- **Tham số:**
59
- - `code: string` — Chuỗi mã quốc gia mục tiêu.
60
-
61
- **Trả về:** `GeoPhoneMap | undefined` — Đối tượng nút bản đồ đầy đủ cho mã được yêu cầu.
62
-
63
- ```javascript
64
- GeoPhone.getByCode('US')
65
- // { info: { phone: 1, ... }, mask: ['1 (***) ***-****'], ... }
66
- ```
32
+ ## Các phương thức
67
33
 
68
- ## Các phương thức Truy cập Dữ liệu
34
+ ### Thông tin
69
35
 
70
- - `getList(): GeoPhoneValue[]` — Trả về danh sách phẳng đầy đủ, đã được sắp xếp của tất cả siêu dữ liệu điện thoại quốc tế đã đăng ký.
71
- - `getMap(): Record<string, GeoPhoneMap>` — Trả về nút gốc của cây tiền tố nội bộ được sử dụng để định danh số điện thoại tốc độ cao.
36
+ - `getList(): GeoPhoneValue[]` — Trả về danh sách phẳng đầy đủ, đã được sắp xếp của tất cả dữ liệu meta điện thoại quốc tế.
37
+ - `getMap(): Record<string, GeoPhoneMap>` — Trả về nút gốc của cây tiền tố nội bộ được sử dụng để tìm kiếm.
72
38
 
73
- ## Các phương thức Định dạng & Tiện ích
39
+ ### Lựa chọn
74
40
 
75
- ### `toMask`
41
+ - `get(code: string): GeoPhoneValue | undefined` — Lấy dữ liệu meta điện thoại liên kết với một mã quốc gia cụ thể.
42
+ - `getByPhone(phone: string): GeoPhoneMapInfo` — Phân tích chuỗi số điện thoại để trích xuất thông tin và mặt nạ phù hợp.
43
+ - `getByCode(code: string): GeoPhoneMap | undefined` — Trả về thông tin mặt nạ đầy đủ cho một mã nhất định.
76
44
 
77
- Chuyển đổi một chuỗi số điện thoại thô thành phiên bản đã được định dạng dựa trên một tập hợp các mặt nạ cụ thể.
45
+ ### Phụ trợ
78
46
 
79
- **Tham số:**
80
- - `phone: string` — Đầu vào số thô.
81
- - `masks?: string[]` — Một mảng các chuỗi mặt nạ hợp lệ để lặp qua nhằm tìm kiếm sự phù hợp.
47
+ - `toMask(phone: string, masks?: string[]): string | undefined` — Chuyển đổi chuỗi số điện thoại thô thành phiên bản đã định dạng.
48
+ - `removeZero(phone: string): string` — Bình thường hóa biểu diễn nội bộ của số bằng cách loại bỏ các số 0 ở đầu hoặc điều chỉnh tiền tố khu vực.
82
49
 
83
- **Trả về:** `string | undefined` — Chuỗi đã được định dạng cho người dùng, hoặc `undefined` nếu không có độ dài mặt nạ nào khớp với đầu vào.
84
-
85
- ```javascript
86
- GeoPhone.toMask('901234567', ['+** ** **** ****'])
87
- // '+84 90 1234 567'
88
- ```
89
-
90
- ### `removeZero`
91
-
92
- Chuẩn hóa biểu diễn số nội bộ bằng cách loại bỏ các số 0 ở đầu hoặc sửa các tiền tố quay số vùng để đảm bảo logic tìm kiếm nhất quán.
93
-
94
- **Tham số:**
95
- - `phone: string` — Chuỗi số điện thoại đầu vào.
96
-
97
- **Trả về:** `string` — Chuỗi số đã được chuẩn hóa.
98
-
99
- ```javascript
100
- GeoPhone.removeZero('0901234567') // '901234567'
101
- GeoPhone.removeZero('89001234567') // '9001234567'
102
- ```
103
-
104
- ## Các đối tượng GeoPhone
50
+ ## Kiểu dữ liệu
105
51
 
106
52
  ### `GeoPhoneValue`
107
53
  Cấu trúc siêu dữ liệu cơ bản cho cấu hình điện thoại của mỗi quốc gia:
108
- - `phone: number` — Mã quay số (ví dụ: `84`).
109
- - `within: number` — Mã quy tắc quay số nội bộ.
110
- - `mask: string[]` — Mảng các mẫu mặt nạ.
111
- - `value: string` — Định danh quốc gia.
54
+ - `phone: number` — Mã điện thoại quốc gia (ví dụ: `84`).
55
+ - `within: number` — Mã quy tắc gọi nội bộ (dùng để chọn ký tự đặc biệt trong mặt nạ).
56
+ - `mask: string[]` — Mảng các mẫu mặt nạ được gán cho quốc gia.
57
+ - `value: string` — định danh quốc gia (ISO 3166).
112
58
 
113
59
  ### `GeoPhoneMap`
114
- Một nút trong cây tiền tố nội bộ:
115
- - `items: GeoPhoneValue[]` — Danh sách các mục thuộc nhánh này.
116
- - `info: GeoPhoneValue | undefined` — Giá trị khớp tại nút số cụ thể này.
117
- - `next: Record<string, GeoPhoneMap>`Con trỏ đến các chữ số tiếp theo trong cây.
60
+ Một nút trong cây tiền tố nội bộ (Trie) được sử dụng để tìm kiếm:
61
+ - `items: GeoPhoneValue[]` — Danh sách tất cả các mục sẵn trong nhánh này của cây.
62
+ - `info: GeoPhoneValue | undefined` — Dữ liệu meta điện thoại nếu nút hiện tại một mã đầy đủ.
63
+ - `value: string | undefined` định danh quốc gia cho nút này.
64
+ - `mask: string[]` — Mảng các mặt nạ với các ký tự nội bộ đã được thay thế (`~`, `=`, `$`).
65
+ - `maskFull: string[]` — Mặt nạ đầy đủ bao gồm cả mã quốc tế.
66
+ - `next: Record<string, GeoPhoneMap>` — Con trỏ đến các chữ số tiếp theo trong cây tìm kiếm.
67
+
68
+ ### `GeoPhoneMapInfo`
69
+ Kết quả của phương thức tìm kiếm `getByPhone`:
70
+ - `item?: GeoPhoneMap` — Nút cây tìm thấy với thông tin quốc gia và mặt nạ.
71
+ - `phone?: string` — Phần còn lại của số sau khi tách mã quốc gia.
118
72
 
119
73
  ## Ví dụ
120
74
 
75
+ ### Logic ký tự nội bộ (Within)
76
+ Logic nội bộ của lớp sẽ thay thế dấu "sao" đầu tiên trong mặt nạ bằng một ký tự đặc biệt tùy thuộc vào quy tắc khu vực:
77
+ - `~` — cho Nga (mã nội bộ 8).
78
+ - `=` — cho các khu vực mặc định/khác (ví dụ: Việt Nam, Hoa Kỳ).
79
+
80
+ ```javascript
81
+ const mapInfo = GeoPhone.getByCode('RU')
82
+ console.log(mapInfo.mask[0]) // '~ (***) ***-**-**'
83
+ ```
84
+
85
+ ### Nhiều mặt nạ
121
86
  ```javascript
122
- import { GeoPhone } from '@dxtmisha/functional'
123
-
124
- // 1. Định danh quốc gia bằng số điện thoại
125
- const lookup = GeoPhone.getByPhone('+84901234567')
126
- if (lookup.item) {
127
- console.log('Quốc gia:', lookup.item.value) // 'VN'
128
- console.log('Mặt nạ chính:', lookup.item.mask[0])
129
- }
130
-
131
- // 2. Định dạng thủ công
132
- const formatted = GeoPhone.toMask('442071234567', ['+** (**) **** ****'])
133
- console.log(formatted) // '+44 (20) 7123 4567'
134
-
135
- // 3. Chuẩn hóa đầu vào để tìm kiếm
136
- const rawInput = '0084901234567'
137
- const normalized = GeoPhone.removeZero(rawInput.replace(/^00/, ''))
138
- console.log(normalized) // '84901234567'
87
+ const masks = ['+** (***) ***-***', '+** (***) ***-**-**']
88
+ console.log(GeoPhone.toMask('84901234567', masks)) // 11 số -> '+84 (901) 234-567'
139
89
  ```
@@ -4,7 +4,9 @@ import {Meta} from '@storybook/addon-docs/blocks'
4
4
 
5
5
  # Hash Class
6
6
 
7
- A static class for managing data stored in the URL hash (`#`). It automatically synchronizes application state with the URL — every `set` call updates the browser's hash string, while the `hashchange` event refreshes the internal state.
7
+ A static facade class for managing data stored in the URL hash (`#`). It delegates execution to the `HashInstance` class, providing centralized access and state isolation (e.g., for SSR).
8
+
9
+ It automatically synchronizes application state with the URL — every `set` call updates the browser's hash string, while the `hashchange` event refreshes the internal state.
8
10
 
9
11
  ## Key Features
10
12
 
@@ -12,10 +14,11 @@ A static class for managing data stored in the URL hash (`#`). It automatically
12
14
  - **Reactivity via Watchers** — The `addWatch` method allows subscribing to changes on a specific variable.
13
15
  - **Auto-initialization** — When the page loads, data is automatically read from the URL.
14
16
  - **Smart Typing** — Values are deserialized from a string: numbers, booleans, and objects are restored to their original types.
17
+ - **SSR Isolation** — `ServerStorage` ensures a unique data instance for each request on the server.
15
18
 
16
19
  ## Initialization
17
20
 
18
- The class is static and initializes automatically on page load — reading the current URL hash string.
21
+ The class is static and initializes automatically upon the first access.
19
22
 
20
23
  ```javascript
21
24
  // URL: https://myapp.com/#page=2;filter=active
@@ -28,11 +31,19 @@ const filter = Hash.get('filter') // 'active' (string)
28
31
 
29
32
  ## Methods
30
33
 
31
- - `get<T>(name: string, defaultValue?: T | (() => T)): T` — Returns the value of a hash variable. If the value doesn't exist, it is set using `defaultValue` (which can be a function).
32
- - `set<T>(name: string, callback: T | (() => T)): void` — Sets a variable's value and updates the URL hash. If the value hasn't changed, no update occurs.
33
- - `addWatch<T>(name: string, callback: (value: T) => void): void` — Subscribes to changes for a specific hash variable.
34
- - `removeWatch<T>(name: string, callback: (value: T) => void): void` — Unsubscribes from changes for a specific variable.
35
- - `reload(): void` Reads the current URL hash and synchronizes it with the internal state.
34
+ ### Instance
35
+ - `static getItem(): HashInstance` — Returns the current `HashInstance` (isolated for the current request).
36
+
37
+ ### Reading and Writing
38
+ - `static get<T>(name: string, defaultValue?: T | (() => T)): T` Returns the value of a hash variable.
39
+ - `static set<T>(name: string, callback: T | (() => T)): void` — Sets a variable's value and updates the URL hash.
40
+
41
+ ### Watchers
42
+ - `static addWatch<T>(name: string, callback: (value: T) => void): void` — Subscribes to changes for a specific hash variable.
43
+ - `static removeWatch<T>(name: string, callback: (value: T) => void): void` — Unsubscribes from changes for a specific variable.
44
+
45
+ ### Management
46
+ - `static reload(): void` — Forces synchronization of the state with the current URL hash.
36
47
 
37
48
  ## Examples
38
49
 
@@ -4,7 +4,9 @@ import {Meta} from '@storybook/addon-docs/blocks'
4
4
 
5
5
  # Класс Hash
6
6
 
7
- Статический класс для управления данными, которые хранятся в URL-хэше (`#`). Автоматически синхронизирует состояние приложения с URL — каждый вызов `set` обновляет строку хэша в браузере, а событие `hashchange` обновляет внутреннее состояние.
7
+ Статический класс-фасад для управления данными, которые хранятся в URL-хэше (`#`). Он делегирует выполнение классу `HashInstance`, обеспечивая централизованный доступ и изоляцию состояния (например, при SSR).
8
+
9
+ Автоматически синхронизирует состояние приложения с URL — каждый вызов `set` обновляет строку хэша в браузере, а событие `hashchange` обновляет внутреннее состояние.
8
10
 
9
11
  ## Ключевые особенности
10
12
 
@@ -12,10 +14,11 @@ import {Meta} from '@storybook/addon-docs/blocks'
12
14
  - **Реактивность через watchers** — Метод `addWatch` позволяет подписаться на изменение конкретной переменной.
13
15
  - **Авто-инициализация** — При загрузке страницы данные автоматически считываются из URL.
14
16
  - **Умный тип** — Значения десериализуются из строки: числа, булевые значения и объекты восстанавливаются.
17
+ - **SSR-изоляция** — Через `ServerStorage` обеспечивается уникальный экземпляр данных для каждого запроса на сервере.
15
18
 
16
19
  ## Инициализация
17
20
 
18
- Класс является статическим и инициализируется автоматически при загрузке страницы — считывает текущую строку хэша URL.
21
+ Класс является статическим и инициализируется автоматически при первом обращении.
19
22
 
20
23
  ```javascript
21
24
  // URL: https://myapp.com/#page=2;filter=active
@@ -28,11 +31,19 @@ const filter = Hash.get('filter') // 'active' (string)
28
31
 
29
32
  ## Методы
30
33
 
31
- - `get<T>(name: string, defaultValue?: T | (() => T)): T` — Возвращает значение переменной из хэша. Если значения нет, устанавливает его через `defaultValue` (может быть функцией).
32
- - `set<T>(name: string, callback: T | (() => T)): void` — Устанавливает значение переменной и обновляет URL-хэш. Если значение не изменилось, обновление не происходит.
33
- - `addWatch<T>(name: string, callback: (value: T) => void): void` — Подписывается на изменение конкретной переменной в хэше.
34
- - `removeWatch<T>(name: string, callback: (value: T) => void): void` — Отписывается от изменений конкретной переменной.
35
- - `reload(): void` Считывает текущий URL-хэш и синхронизирует с ним внутреннее состояние.
34
+ ### Экземпляр
35
+ - `static getItem(): HashInstance` — Возвращает текущий экземпляр `HashInstance` (изолированный для текущего запроса).
36
+
37
+ ### Чтение и запись
38
+ - `static get<T>(name: string, defaultValue?: T | (() => T)): T` Возвращает значение переменной из хэша.
39
+ - `static set<T>(name: string, callback: T | (() => T)): void` — Устанавливает значение переменной и обновляет URL-хэш.
40
+
41
+ ### Наблюдение (Watchers)
42
+ - `static addWatch<T>(name: string, callback: (value: T) => void): void` — Подписывается на изменение переменной.
43
+ - `static removeWatch<T>(name: string, callback: (value: T) => void): void` — Отписывается от изменений.
44
+
45
+ ### Управление
46
+ - `static reload(): void` — Принудительно синхронизирует состояние с текущим URL-хэшем.
36
47
 
37
48
  ## Примеры
38
49
 
@@ -4,7 +4,9 @@ import {Meta} from '@storybook/addon-docs/blocks'
4
4
 
5
5
  # Lớp Hash
6
6
 
7
- Một lớp tĩnh để quản lý dữ liệu được lưu trữ trong URL hash (`#`). Tự động đồng bộ hóa trạng thái ứng dụng với URL mỗi lần gọi `set` sẽ cập nhật chuỗi hash trên trình duyệt, sự kiện `hashchange` sẽ làm mới trạng thái nội bộ.
7
+ Một lớp facade tĩnh để quản lý dữ liệu được lưu trữ trong URL hash (`#`). ủy quyền thực thi cho lớp `HashInstance`, cung cấp khả năng truy cập tập trung и cách ly trạng thái (ví dụ: cho SSR).
8
+
9
+ Nó tự động đồng bộ hóa trạng thái ứng dụng với URL — mỗi lần gọi `set` sẽ cập nhật chuỗi hash trên trình duyệt, và sự kiện `hashchange` sẽ làm mới trạng thái nội bộ.
8
10
 
9
11
  ## Tính năng chính
10
12
 
@@ -12,10 +14,11 @@ Một lớp tĩnh để quản lý dữ liệu được lưu trữ trong URL has
12
14
  - **Phản hồi qua Watcher** — Phương thức `addWatch` cho phép đăng ký theo dõi thay đổi của một biến cụ thể.
13
15
  - **Tự động khởi tạo** — Khi tải trang, dữ liệu được tự động đọc từ URL.
14
16
  - **Phân tích kiểu thông minh** — Giá trị được giải mã từ chuỗi: số, boolean và đối tượng được khôi phục về kiểu gốc.
17
+ - **Cách ly SSR** — `ServerStorage` đảm bảo mỗi yêu cầu trên máy chủ có một phiên bản dữ liệu riêng.
15
18
 
16
19
  ## Khởi tạo
17
20
 
18
- Lớp này là tĩnh và khởi tạo tự động khi tải trang đọc chuỗi hash URL hiện tại.
21
+ Lớp này là tĩnh và khởi tạo tự động khi truy cập lần đầu.
19
22
 
20
23
  ```javascript
21
24
  // URL: https://myapp.com/#page=2;filter=active
@@ -28,11 +31,19 @@ const filter = Hash.get('filter') // 'active' (string)
28
31
 
29
32
  ## Phương thức
30
33
 
31
- - `get<T>(name: string, defaultValue?: T | (() => T)): T` — Trả về giá trị của biến hash. Nếu không có giá trị, nó được thiết lập qua `defaultValue` (có thể là hàm).
32
- - `set<T>(name: string, callback: T | (() => T)): void` — Thiết lập giá trị của biến cập nhật URL hash. Nếu giá trị không thay đổi, không có cập nhật nào xảy ra.
33
- - `addWatch<T>(name: string, callback: (value: T) => void): void` — Đăng ký theo dõi thay đổi của một biến hash cụ thể.
34
- - `removeWatch<T>(name: string, callback: (value: T) => void): void` — Hủy đăng ký theo dõi thay đổi của một biến.
35
- - `reload(): void` Đọc URL hash hiện tại đồng bộ hóa với trạng thái nội bộ.
34
+ ### Phiên bản
35
+ - `static getItem(): HashInstance` — Trả về phiên bản `HashInstance` hiện tại (được cách ly cho yêu cầu hiện tại).
36
+
37
+ ### Đọc и Ghi
38
+ - `static get<T>(name: string, defaultValue?: T | (() => T)): T` Trả về giá trị của biến hash.
39
+ - `static set<T>(name: string, callback: T | (() => T)): void` — Thiết lập giá trị của biến и cập nhật URL hash.
40
+
41
+ ### Theo dõi (Watchers)
42
+ - `static addWatch<T>(name: string, callback: (value: T) => void): void` — Đăng ký theo dõi thay đổi của một biến hash cụ thể.
43
+ - `static removeWatch<T>(name: string, callback: (value: T) => void): void` — Hủy đăng ký theo dõi thay đổi của một biến.
44
+
45
+ ### Quản lý
46
+ - `static reload(): void` — Ép buộc đồng bộ hóa trạng thái với URL hash hiện tại.
36
47
 
37
48
  ## Ví dụ
38
49
 
@@ -0,0 +1,54 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/en/functional-basic/Classes/HashInstance - URL Hash Instance'/>
4
+
5
+ # HashInstance Class
6
+
7
+ `HashInstance` is the core class that implements the logic for managing data in the URL hash. It provides state storage, mechanisms for subscribing to changes, and synchronization with the browser API.
8
+
9
+ You can use this class directly if you need isolated hash management separate from the global `Hash` state.
10
+
11
+ ## Key Features
12
+
13
+ - **Isolated State** — Stores its own set of hash variables.
14
+ - **Chainable API** — Most methods return `this`, allowing for concise code.
15
+ - **Automatic Synchronization** — Upon initialization, it reads data from the URL and subscribes to the `hashchange` event.
16
+ - **SSR Compatibility** — Works safely in server-side environments using stubs for DOM APIs.
17
+
18
+ ## Initialization
19
+
20
+ To create an instance, use the `HashInstance()` constructor.
21
+
22
+ ```typescript
23
+ import { HashInstance } from '@dxtmisha/functional-basic'
24
+
25
+ const myHash = new HashInstance()
26
+ ```
27
+
28
+ ## Methods
29
+
30
+ ### Reading and Writing
31
+ - `get<T>(name: string, defaultValue?: T | (() => T)): T` — Returns the value of a variable. If it doesn't exist, sets `defaultValue` and returns it.
32
+ - `set<T>(name: string, callback: T | (() => T)): this` — Updates the variable's value and synchronizes the URL.
33
+
34
+ ### Watchers
35
+ - `addWatch<T>(name: string, callback: (value: T) => void): this` — Adds a handler for variable changes.
36
+ - `removeWatch<T>(name: string, callback: (value: T) => void): this` — Removes a handler.
37
+
38
+ ### Management
39
+ - `reload(): this` — Refreshes the internal state from the current URL hash.
40
+
41
+ ## Examples
42
+
43
+ ### Using an Isolated Instance
44
+ ```typescript
45
+ const searchHash = new HashInstance()
46
+
47
+ // Subscribe
48
+ searchHash.addWatch('query', (q) => {
49
+ console.log('Search:', q)
50
+ })
51
+
52
+ // Set value (will update URL)
53
+ searchHash.set('query', 'smartphones')
54
+ ```
@@ -0,0 +1,54 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/ru/functional-basic/Classes/HashInstance - Экземпляр URL Hash'/>
4
+
5
+ # Класс HashInstance
6
+
7
+ `HashInstance` — это основной класс, реализующий логику управления данными в URL-хэше. Он обеспечивает хранение состояния, механизмы подписки на изменения и синхронизацию с браузерным API.
8
+
9
+ Вы можете использовать этот класс напрямую, если вам требуется изолированное управление хэшем, отличное от глобального состояния `Hash`.
10
+
11
+ ## Ключевые особенности
12
+
13
+ - **Изолированное состояние** — Хранит свой набор переменных хэша.
14
+ - **Поддержка цепочки вызовов** — Большинство методов возвращают `this`, позволяя писать компактный код.
15
+ - **Автоматическая синхронизация** — При инициализации считывает данные из URL и подписывается на событие `hashchange`.
16
+ - **SSR-совместимость** — Безопасно работает в серверном окружении, используя заглушки для DOM API.
17
+
18
+ ## Инициализация
19
+
20
+ Для создания экземпляра используйте конструктор `HashInstance()`.
21
+
22
+ ```typescript
23
+ import { HashInstance } from '@dxtmisha/functional-basic'
24
+
25
+ const myHash = new HashInstance()
26
+ ```
27
+
28
+ ## Методы
29
+
30
+ ### Чтение и запись
31
+ - `get<T>(name: string, defaultValue?: T | (() => T)): T` — Возвращает значение переменной. Если её нет, устанавливает `defaultValue` и возвращает его.
32
+ - `set<T>(name: string, callback: T | (() => T)): this` — Обновляет значение переменной и синхронизирует URL.
33
+
34
+ ### Наблюдение (Watchers)
35
+ - `addWatch<T>(name: string, callback: (value: T) => void): this` — Добавляет обработчик изменения переменной.
36
+ - `removeWatch<T>(name: string, callback: (value: T) => void): this` — Удаляет обработчик.
37
+
38
+ ### Управление
39
+ - `reload(): this` — Обновляет внутреннее состояние из текущего URL-хэша.
40
+
41
+ ## Примеры
42
+
43
+ ### Использование изолированного экземпляра
44
+ ```typescript
45
+ const searchHash = new HashInstance()
46
+
47
+ // Подписка
48
+ searchHash.addWatch('query', (q) => {
49
+ console.log('Поиск:', q)
50
+ })
51
+
52
+ // Установка значения (обновит URL)
53
+ searchHash.set('query', 'smartphones')
54
+ ```
@@ -0,0 +1,54 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/vi/functional-basic/Classes/HashInstance - Phiên bản URL Hash'/>
4
+
5
+ # Lớp HashInstance
6
+
7
+ `HashInstance` là lớp cốt lõi triển khai logic quản lý dữ liệu trong URL hash. Nó cung cấp khả năng lưu trữ trạng thái, các cơ chế để đăng ký theo dõi thay đổi và đồng bộ hóa với browser API.
8
+
9
+ Bạn có thể sử dụng lớp này trực tiếp nếu cần quản lý hash riêng biệt, tách rời khỏi trạng thái `Hash` toàn cục.
10
+
11
+ ## Tính năng chính
12
+
13
+ - **Trạng thái biệt lập** — Lưu trữ bộ biến hash riêng của nó.
14
+ - **Chainable API** — Hầu hết các phương thức trả về `this`, cho phép viết mã ngắn gọn.
15
+ - **Đồng bộ hóa tự động** — Khi khởi tạo, nó đọc dữ liệu từ URL và đăng ký sự kiện `hashchange`.
16
+ - **Tương thích SSR** — Hoạt động an toàn trong môi trường máy chủ bằng cách sử dụng các bản giả cho DOM API.
17
+
18
+ ## Khởi tạo
19
+
20
+ Để tạo một phiên bản, hãy sử dụng hàm khởi tạo `HashInstance()`.
21
+
22
+ ```typescript
23
+ import { HashInstance } from '@dxtmisha/functional-basic'
24
+
25
+ const myHash = new HashInstance()
26
+ ```
27
+
28
+ ## Phương thức
29
+
30
+ ### Đọc và Ghi
31
+ - `get<T>(name: string, defaultValue?: T | (() => T)): T` — Trả về giá trị của một biến. Nếu nó không tồn tại, thiết lập `defaultValue` và trả về nó.
32
+ - `set<T>(name: string, callback: T | (() => T)): this` — Cập nhật giá trị của biến và đồng bộ hóa URL.
33
+
34
+ ### Theo dõi (Watchers)
35
+ - `addWatch<T>(name: string, callback: (value: T) => void): this` — Thêm bộ xử lý cho các thay đổi của biến.
36
+ - `removeWatch<T>(name: string, callback: (value: T) => void): this` — Xóa bộ xử lý.
37
+
38
+ ### Quản lý
39
+ - `reload(): this` — Làm mới trạng thái nội bộ từ URL hash hiện tại.
40
+
41
+ ## Ví dụ
42
+
43
+ ### Sử dụng một phiên bản biệt lập
44
+ ```typescript
45
+ const searchHash = new HashInstance()
46
+
47
+ // Đăng ký theo dõi
48
+ searchHash.addWatch('query', (q) => {
49
+ console.log('Tìm kiếm:', q)
50
+ })
51
+
52
+ // Thiết lập giá trị (sẽ cập nhật URL)
53
+ searchHash.set('query', 'smartphones')
54
+ ```
@@ -0,0 +1,78 @@
1
+ import {Meta} from '@storybook/addon-docs/blocks'
2
+
3
+ <Meta title='@dxtmisha/en/functional-basic/Classes/MetaStatic - Meta Tags Management (Static)'/>
4
+
5
+ # Class MetaStatic
6
+
7
+ The `MetaStatic` class is a **static entry point** for managing page meta tags, Open Graph (OG), and Twitter Card data. It acts as a static wrapper around a globally managed `Meta` instance, providing a clean singleton interface for SEO and social sharing management.
8
+
9
+ ## Key Features
10
+
11
+ - **Static Interface** — Manage page titles, descriptions, and more without manual instantiation.
12
+ - **Unified Management** — Automatically syncs titles and other information across standard meta, OG, and Twitter.
13
+ - **SSR Isolation** — Uses `ServerStorage` to handle instance isolation during server-side rendering.
14
+ - **Fluent API** — Support for method chaining in setter methods.
15
+
16
+ ## Methods
17
+
18
+ ### Access
19
+
20
+ - `getItem(): Meta` — Returns the underlying `Meta` instance.
21
+ - `getOg(): MetaOg` — Gets the MetaOg instance for advanced Open Graph operations.
22
+ - `getTwitter(): MetaTwitter` — Gets the MetaTwitter instance for advanced Twitter Card operations.
23
+
24
+ ### Getters
25
+
26
+ - `getTitle(): string` — Gets the current page title (without suffix).
27
+ - `getDescription(): string` — Gets the current description meta tag.
28
+ - `getKeywords(): string` — Gets the current keywords.
29
+ - `getImage(): string` — Gets the image URL (from OG settings).
30
+ - `getCanonical(): string` — Gets the canonical URL.
31
+ - `getRobots(): MetaRobots` — Gets the current robots directive.
32
+ - `getAuthor(): string` — Gets the author name.
33
+ - `getSiteName(): string` — Gets the site name (from OG settings).
34
+ - `getLocale(): string` — Gets the locale (from OG settings).
35
+
36
+ ### Setters
37
+
38
+ All setter methods return `typeof MetaStatic` to support method chaining.
39
+
40
+ - `setTitle(title: string): typeof MetaStatic` — Sets the page title and updates OG/Twitter titles.
41
+ - `setDescription(description: string): typeof MetaStatic` — Sets the description meta tag.
42
+ - `setKeywords(keywords: string | string[]): typeof MetaStatic` — Sets the keywords (string or array).
43
+ - `setImage(image: string): typeof MetaStatic` — Sets the image for OG and Twitter.
44
+ - `setCanonical(canonical: string): typeof MetaStatic` — Sets the canonical URL and updates OG/Twitter URLs.
45
+ - `setRobots(robots: MetaRobots): typeof MetaStatic` — Sets the robots directive.
46
+ - `setAuthor(author: string): typeof MetaStatic` — Sets the author meta tag.
47
+ - `setSiteName(siteName: string): typeof MetaStatic` — Sets the site name for OG and Twitter.
48
+ - `setLocale(locale: string): typeof MetaStatic` — Sets the locale for Open Graph.
49
+ - `setSuffix(suffix?: string): typeof MetaStatic` — Sets a suffix (e.g., " | My Site") appended to titles.
50
+
51
+ ### Output
52
+
53
+ - `html(): string` — Generates a complete string of HTML meta tags for all managed properties.
54
+
55
+ ## Architecture
56
+
57
+ `MetaStatic` works as a **static proxy**. All calls are forwarded to an internal `Meta` instance managed via `ServerStorage`.
58
+
59
+ ### Request Isolation (SSR)
60
+
61
+ By using `ServerStorage`, `MetaStatic` ensures that during Server-Side Rendering (SSR), meta information for one request does not leak into another. Each request gets its own isolated context.
62
+
63
+ ### Examples
64
+
65
+ ```typescript
66
+ import { MetaStatic } from '@dxtmisha/functional-basic';
67
+
68
+ MetaStatic
69
+ .setSuffix('My Online Store')
70
+ .setTitle('Summer Collection')
71
+ .setDescription('Explore our new arrivals.')
72
+ .setImage('https://example.com/cover.jpg')
73
+ .setLocale('en_US');
74
+
75
+ console.log(MetaStatic.getTitle()); // "Summer Collection"
76
+ document.title; // "Summer Collection - My Online Store"
77
+ ```
78
+