@oxyhq/services 5.13.0 → 5.13.2

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 (353) hide show
  1. package/README.md +71 -0
  2. package/lib/commonjs/core/HttpClient.js +238 -0
  3. package/lib/commonjs/core/HttpClient.js.map +1 -0
  4. package/lib/commonjs/core/OxyServices.js +530 -332
  5. package/lib/commonjs/core/OxyServices.js.map +1 -1
  6. package/lib/commonjs/core/RequestManager.js +199 -0
  7. package/lib/commonjs/core/RequestManager.js.map +1 -0
  8. package/lib/commonjs/core/index.js +38 -1
  9. package/lib/commonjs/core/index.js.map +1 -1
  10. package/lib/commonjs/i18n/index.js +37 -1
  11. package/lib/commonjs/i18n/index.js.map +1 -1
  12. package/lib/commonjs/i18n/locales/ar-SA.json +128 -0
  13. package/lib/commonjs/i18n/locales/ca-ES.json +128 -0
  14. package/lib/commonjs/i18n/locales/de-DE.json +128 -0
  15. package/lib/commonjs/i18n/locales/en-US.json +85 -12
  16. package/lib/commonjs/i18n/locales/es-ES.json +58 -6
  17. package/lib/commonjs/i18n/locales/fr-FR.json +128 -0
  18. package/lib/commonjs/i18n/locales/it-IT.json +128 -0
  19. package/lib/commonjs/i18n/locales/ja-JP.json +127 -0
  20. package/lib/commonjs/i18n/locales/ko-KR.json +128 -0
  21. package/lib/commonjs/i18n/locales/pt-PT.json +128 -0
  22. package/lib/commonjs/i18n/locales/zh-CN.json +128 -0
  23. package/lib/commonjs/index.js +36 -0
  24. package/lib/commonjs/index.js.map +1 -1
  25. package/lib/commonjs/ui/components/Avatar.js +94 -27
  26. package/lib/commonjs/ui/components/Avatar.js.map +1 -1
  27. package/lib/commonjs/ui/components/FollowButton.js +1 -0
  28. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  29. package/lib/commonjs/ui/components/FontLoader.js +22 -42
  30. package/lib/commonjs/ui/components/FontLoader.js.map +1 -1
  31. package/lib/commonjs/ui/components/OxyProvider.js +5 -8
  32. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  33. package/lib/commonjs/ui/components/StepBasedScreen.js +64 -44
  34. package/lib/commonjs/ui/components/StepBasedScreen.js.map +1 -1
  35. package/lib/commonjs/ui/components/internal/GroupedPillButtons.js +14 -35
  36. package/lib/commonjs/ui/components/internal/GroupedPillButtons.js.map +1 -1
  37. package/lib/commonjs/ui/components/internal/PinInput.js +2 -2
  38. package/lib/commonjs/ui/components/internal/PinInput.js.map +1 -1
  39. package/lib/commonjs/ui/components/internal/TextField.js +13 -8
  40. package/lib/commonjs/ui/components/internal/TextField.js.map +1 -1
  41. package/lib/commonjs/ui/context/OxyContext.js +443 -371
  42. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  43. package/lib/commonjs/ui/hooks/useSessionSocket.js +80 -22
  44. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  45. package/lib/commonjs/ui/index.js +4 -1
  46. package/lib/commonjs/ui/index.js.map +1 -1
  47. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +32 -2
  48. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  49. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +101 -59
  50. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  51. package/lib/commonjs/ui/screens/FileManagementScreen.js +3 -2
  52. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  53. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +75 -117
  54. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  55. package/lib/commonjs/ui/screens/SignInScreen.js +43 -50
  56. package/lib/commonjs/ui/screens/SignInScreen.js.map +1 -1
  57. package/lib/commonjs/ui/screens/SignUpScreen.js +14 -16
  58. package/lib/commonjs/ui/screens/SignUpScreen.js.map +1 -1
  59. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +188 -142
  60. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  61. package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js +10 -10
  62. package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js.map +1 -1
  63. package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js +2 -4
  64. package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js.map +1 -1
  65. package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js +45 -25
  66. package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js.map +1 -1
  67. package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js +88 -53
  68. package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js.map +1 -1
  69. package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js +79 -58
  70. package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js.map +1 -1
  71. package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js +61 -52
  72. package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js.map +1 -1
  73. package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js +218 -39
  74. package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js.map +1 -1
  75. package/lib/commonjs/ui/screens/steps/SignInTotpStep.js +77 -50
  76. package/lib/commonjs/ui/screens/steps/SignInTotpStep.js.map +1 -1
  77. package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js +424 -71
  78. package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js.map +1 -1
  79. package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js +55 -30
  80. package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js.map +1 -1
  81. package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js +64 -46
  82. package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js.map +1 -1
  83. package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js +84 -146
  84. package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js.map +1 -1
  85. package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js +113 -34
  86. package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js.map +1 -1
  87. package/lib/commonjs/ui/stores/accountStore.js +237 -0
  88. package/lib/commonjs/ui/stores/accountStore.js.map +1 -0
  89. package/lib/commonjs/ui/stores/authStore.js +17 -20
  90. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  91. package/lib/commonjs/ui/styles/authStyles.js +16 -8
  92. package/lib/commonjs/ui/styles/authStyles.js.map +1 -1
  93. package/lib/commonjs/ui/styles/index.js +11 -0
  94. package/lib/commonjs/ui/styles/index.js.map +1 -1
  95. package/lib/commonjs/ui/styles/spacing.js +51 -0
  96. package/lib/commonjs/ui/styles/spacing.js.map +1 -0
  97. package/lib/commonjs/utils/asyncUtils.js +9 -22
  98. package/lib/commonjs/utils/asyncUtils.js.map +1 -1
  99. package/lib/commonjs/utils/cache.js +259 -0
  100. package/lib/commonjs/utils/cache.js.map +1 -0
  101. package/lib/commonjs/utils/index.js +99 -0
  102. package/lib/commonjs/utils/index.js.map +1 -1
  103. package/lib/commonjs/utils/languageUtils.js +159 -0
  104. package/lib/commonjs/utils/languageUtils.js.map +1 -0
  105. package/lib/commonjs/utils/requestUtils.js +217 -0
  106. package/lib/commonjs/utils/requestUtils.js.map +1 -0
  107. package/lib/commonjs/utils/sessionUtils.js +191 -0
  108. package/lib/commonjs/utils/sessionUtils.js.map +1 -0
  109. package/lib/commonjs/utils/validationUtils.js +1 -1
  110. package/lib/module/core/HttpClient.js +232 -0
  111. package/lib/module/core/HttpClient.js.map +1 -0
  112. package/lib/module/core/OxyServices.js +528 -326
  113. package/lib/module/core/OxyServices.js.map +1 -1
  114. package/lib/module/core/RequestManager.js +194 -0
  115. package/lib/module/core/RequestManager.js.map +1 -0
  116. package/lib/module/core/index.js +2 -0
  117. package/lib/module/core/index.js.map +1 -1
  118. package/lib/module/i18n/index.js +37 -1
  119. package/lib/module/i18n/index.js.map +1 -1
  120. package/lib/module/i18n/locales/ar-SA.json +128 -0
  121. package/lib/module/i18n/locales/ca-ES.json +128 -0
  122. package/lib/module/i18n/locales/de-DE.json +128 -0
  123. package/lib/module/i18n/locales/en-US.json +85 -12
  124. package/lib/module/i18n/locales/es-ES.json +58 -6
  125. package/lib/module/i18n/locales/fr-FR.json +128 -0
  126. package/lib/module/i18n/locales/it-IT.json +128 -0
  127. package/lib/module/i18n/locales/ja-JP.json +127 -0
  128. package/lib/module/i18n/locales/ko-KR.json +128 -0
  129. package/lib/module/i18n/locales/pt-PT.json +128 -0
  130. package/lib/module/i18n/locales/zh-CN.json +128 -0
  131. package/lib/module/index.js +2 -0
  132. package/lib/module/index.js.map +1 -1
  133. package/lib/module/ui/components/Avatar.js +94 -27
  134. package/lib/module/ui/components/Avatar.js.map +1 -1
  135. package/lib/module/ui/components/FollowButton.js +1 -0
  136. package/lib/module/ui/components/FollowButton.js.map +1 -1
  137. package/lib/module/ui/components/FontLoader.js +23 -43
  138. package/lib/module/ui/components/FontLoader.js.map +1 -1
  139. package/lib/module/ui/components/OxyProvider.js +6 -8
  140. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  141. package/lib/module/ui/components/StepBasedScreen.js +65 -45
  142. package/lib/module/ui/components/StepBasedScreen.js.map +1 -1
  143. package/lib/module/ui/components/internal/GroupedPillButtons.js +14 -35
  144. package/lib/module/ui/components/internal/GroupedPillButtons.js.map +1 -1
  145. package/lib/module/ui/components/internal/PinInput.js +2 -2
  146. package/lib/module/ui/components/internal/PinInput.js.map +1 -1
  147. package/lib/module/ui/components/internal/TextField.js +13 -8
  148. package/lib/module/ui/components/internal/TextField.js.map +1 -1
  149. package/lib/module/ui/context/OxyContext.js +442 -370
  150. package/lib/module/ui/context/OxyContext.js.map +1 -1
  151. package/lib/module/ui/hooks/useSessionSocket.js +80 -22
  152. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  153. package/lib/module/ui/index.js +4 -2
  154. package/lib/module/ui/index.js.map +1 -1
  155. package/lib/module/ui/screens/AccountSettingsScreen.js +33 -2
  156. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  157. package/lib/module/ui/screens/AccountSwitcherScreen.js +102 -60
  158. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  159. package/lib/module/ui/screens/FileManagementScreen.js +3 -2
  160. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  161. package/lib/module/ui/screens/LanguageSelectorScreen.js +73 -117
  162. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  163. package/lib/module/ui/screens/SignInScreen.js +44 -51
  164. package/lib/module/ui/screens/SignInScreen.js.map +1 -1
  165. package/lib/module/ui/screens/SignUpScreen.js +14 -16
  166. package/lib/module/ui/screens/SignUpScreen.js.map +1 -1
  167. package/lib/module/ui/screens/WelcomeNewUserScreen.js +187 -143
  168. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  169. package/lib/module/ui/screens/internal/SignInPasswordStep.js +10 -10
  170. package/lib/module/ui/screens/internal/SignInPasswordStep.js.map +1 -1
  171. package/lib/module/ui/screens/internal/SignInUsernameStep.js +2 -4
  172. package/lib/module/ui/screens/internal/SignInUsernameStep.js.map +1 -1
  173. package/lib/module/ui/screens/steps/RecoverRequestStep.js +45 -25
  174. package/lib/module/ui/screens/steps/RecoverRequestStep.js.map +1 -1
  175. package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js +89 -54
  176. package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js.map +1 -1
  177. package/lib/module/ui/screens/steps/RecoverSuccessStep.js +80 -59
  178. package/lib/module/ui/screens/steps/RecoverSuccessStep.js.map +1 -1
  179. package/lib/module/ui/screens/steps/RecoverVerifyStep.js +62 -53
  180. package/lib/module/ui/screens/steps/RecoverVerifyStep.js.map +1 -1
  181. package/lib/module/ui/screens/steps/SignInPasswordStep.js +219 -40
  182. package/lib/module/ui/screens/steps/SignInPasswordStep.js.map +1 -1
  183. package/lib/module/ui/screens/steps/SignInTotpStep.js +78 -51
  184. package/lib/module/ui/screens/steps/SignInTotpStep.js.map +1 -1
  185. package/lib/module/ui/screens/steps/SignInUsernameStep.js +426 -73
  186. package/lib/module/ui/screens/steps/SignInUsernameStep.js.map +1 -1
  187. package/lib/module/ui/screens/steps/SignUpIdentityStep.js +55 -30
  188. package/lib/module/ui/screens/steps/SignUpIdentityStep.js.map +1 -1
  189. package/lib/module/ui/screens/steps/SignUpSecurityStep.js +65 -47
  190. package/lib/module/ui/screens/steps/SignUpSecurityStep.js.map +1 -1
  191. package/lib/module/ui/screens/steps/SignUpSummaryStep.js +84 -146
  192. package/lib/module/ui/screens/steps/SignUpSummaryStep.js.map +1 -1
  193. package/lib/module/ui/screens/steps/SignUpWelcomeStep.js +114 -35
  194. package/lib/module/ui/screens/steps/SignUpWelcomeStep.js.map +1 -1
  195. package/lib/module/ui/stores/accountStore.js +229 -0
  196. package/lib/module/ui/stores/accountStore.js.map +1 -0
  197. package/lib/module/ui/stores/authStore.js +17 -20
  198. package/lib/module/ui/stores/authStore.js.map +1 -1
  199. package/lib/module/ui/styles/authStyles.js +16 -8
  200. package/lib/module/ui/styles/authStyles.js.map +1 -1
  201. package/lib/module/ui/styles/index.js +1 -0
  202. package/lib/module/ui/styles/index.js.map +1 -1
  203. package/lib/module/ui/styles/spacing.js +48 -0
  204. package/lib/module/ui/styles/spacing.js.map +1 -0
  205. package/lib/module/utils/asyncUtils.js +10 -22
  206. package/lib/module/utils/asyncUtils.js.map +1 -1
  207. package/lib/module/utils/cache.js +250 -0
  208. package/lib/module/utils/cache.js.map +1 -0
  209. package/lib/module/utils/index.js +7 -0
  210. package/lib/module/utils/index.js.map +1 -1
  211. package/lib/module/utils/languageUtils.js +151 -0
  212. package/lib/module/utils/languageUtils.js.map +1 -0
  213. package/lib/module/utils/requestUtils.js +210 -0
  214. package/lib/module/utils/requestUtils.js.map +1 -0
  215. package/lib/module/utils/sessionUtils.js +180 -0
  216. package/lib/module/utils/sessionUtils.js.map +1 -0
  217. package/lib/module/utils/validationUtils.js +1 -1
  218. package/lib/typescript/core/HttpClient.d.ts +64 -0
  219. package/lib/typescript/core/HttpClient.d.ts.map +1 -0
  220. package/lib/typescript/core/OxyServices.d.ts +86 -73
  221. package/lib/typescript/core/OxyServices.d.ts.map +1 -1
  222. package/lib/typescript/core/RequestManager.d.ts +67 -0
  223. package/lib/typescript/core/RequestManager.d.ts.map +1 -0
  224. package/lib/typescript/core/index.d.ts +2 -0
  225. package/lib/typescript/core/index.d.ts.map +1 -1
  226. package/lib/typescript/i18n/index.d.ts.map +1 -1
  227. package/lib/typescript/index.d.ts +2 -0
  228. package/lib/typescript/index.d.ts.map +1 -1
  229. package/lib/typescript/models/interfaces.d.ts +15 -0
  230. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  231. package/lib/typescript/models/session.d.ts +1 -0
  232. package/lib/typescript/models/session.d.ts.map +1 -1
  233. package/lib/typescript/ui/components/Avatar.d.ts +6 -7
  234. package/lib/typescript/ui/components/Avatar.d.ts.map +1 -1
  235. package/lib/typescript/ui/components/FollowButton.d.ts.map +1 -1
  236. package/lib/typescript/ui/components/FontLoader.d.ts +3 -3
  237. package/lib/typescript/ui/components/FontLoader.d.ts.map +1 -1
  238. package/lib/typescript/ui/components/OxyProvider.d.ts +2 -2
  239. package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
  240. package/lib/typescript/ui/components/StepBasedScreen.d.ts.map +1 -1
  241. package/lib/typescript/ui/components/internal/GroupedPillButtons.d.ts.map +1 -1
  242. package/lib/typescript/ui/components/internal/TextField.d.ts.map +1 -1
  243. package/lib/typescript/ui/context/OxyContext.d.ts +5 -0
  244. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  245. package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -1
  246. package/lib/typescript/ui/index.d.ts +2 -2
  247. package/lib/typescript/ui/index.d.ts.map +1 -1
  248. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  249. package/lib/typescript/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  250. package/lib/typescript/ui/screens/LanguageSelectorScreen.d.ts +3 -3
  251. package/lib/typescript/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  252. package/lib/typescript/ui/screens/SignInScreen.d.ts.map +1 -1
  253. package/lib/typescript/ui/screens/SignUpScreen.d.ts.map +1 -1
  254. package/lib/typescript/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  255. package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts.map +1 -1
  256. package/lib/typescript/ui/screens/steps/RecoverRequestStep.d.ts.map +1 -1
  257. package/lib/typescript/ui/screens/steps/RecoverResetPasswordStep.d.ts.map +1 -1
  258. package/lib/typescript/ui/screens/steps/RecoverSuccessStep.d.ts.map +1 -1
  259. package/lib/typescript/ui/screens/steps/RecoverVerifyStep.d.ts.map +1 -1
  260. package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts +2 -0
  261. package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts.map +1 -1
  262. package/lib/typescript/ui/screens/steps/SignInTotpStep.d.ts.map +1 -1
  263. package/lib/typescript/ui/screens/steps/SignInUsernameStep.d.ts.map +1 -1
  264. package/lib/typescript/ui/screens/steps/SignUpIdentityStep.d.ts.map +1 -1
  265. package/lib/typescript/ui/screens/steps/SignUpSecurityStep.d.ts.map +1 -1
  266. package/lib/typescript/ui/screens/steps/SignUpSummaryStep.d.ts.map +1 -1
  267. package/lib/typescript/ui/screens/steps/SignUpWelcomeStep.d.ts.map +1 -1
  268. package/lib/typescript/ui/stores/accountStore.d.ts +34 -0
  269. package/lib/typescript/ui/stores/accountStore.d.ts.map +1 -0
  270. package/lib/typescript/ui/stores/authStore.d.ts +7 -3
  271. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  272. package/lib/typescript/ui/styles/authStyles.d.ts +19 -2
  273. package/lib/typescript/ui/styles/authStyles.d.ts.map +1 -1
  274. package/lib/typescript/ui/styles/index.d.ts +1 -0
  275. package/lib/typescript/ui/styles/index.d.ts.map +1 -1
  276. package/lib/typescript/ui/styles/spacing.d.ts +43 -0
  277. package/lib/typescript/ui/styles/spacing.d.ts.map +1 -0
  278. package/lib/typescript/utils/asyncUtils.d.ts +2 -0
  279. package/lib/typescript/utils/asyncUtils.d.ts.map +1 -1
  280. package/lib/typescript/utils/cache.d.ts +128 -0
  281. package/lib/typescript/utils/cache.d.ts.map +1 -0
  282. package/lib/typescript/utils/index.d.ts +4 -0
  283. package/lib/typescript/utils/index.d.ts.map +1 -1
  284. package/lib/typescript/utils/languageUtils.d.ts +38 -0
  285. package/lib/typescript/utils/languageUtils.d.ts.map +1 -0
  286. package/lib/typescript/utils/requestUtils.d.ts +122 -0
  287. package/lib/typescript/utils/requestUtils.d.ts.map +1 -0
  288. package/lib/typescript/utils/sessionUtils.d.ts +55 -0
  289. package/lib/typescript/utils/sessionUtils.d.ts.map +1 -0
  290. package/lib/typescript/utils/validationUtils.d.ts +1 -1
  291. package/package.json +1 -1
  292. package/src/core/HttpClient.ts +277 -0
  293. package/src/core/OxyServices.ts +461 -352
  294. package/src/core/RequestManager.ts +240 -0
  295. package/src/core/index.ts +10 -0
  296. package/src/i18n/index.ts +36 -0
  297. package/src/i18n/locales/ar-SA.json +128 -0
  298. package/src/i18n/locales/ca-ES.json +128 -0
  299. package/src/i18n/locales/de-DE.json +128 -0
  300. package/src/i18n/locales/en-US.json +85 -12
  301. package/src/i18n/locales/es-ES.json +58 -6
  302. package/src/i18n/locales/fr-FR.json +128 -0
  303. package/src/i18n/locales/it-IT.json +128 -0
  304. package/src/i18n/locales/ja-JP.json +127 -0
  305. package/src/i18n/locales/ko-KR.json +128 -0
  306. package/src/i18n/locales/pt-PT.json +128 -0
  307. package/src/i18n/locales/zh-CN.json +128 -0
  308. package/src/index.ts +10 -0
  309. package/src/models/interfaces.ts +19 -0
  310. package/src/models/session.ts +1 -1
  311. package/src/ui/components/Avatar.tsx +151 -35
  312. package/src/ui/components/FollowButton.tsx +1 -0
  313. package/src/ui/components/FontLoader.tsx +17 -37
  314. package/src/ui/components/OxyProvider.tsx +14 -13
  315. package/src/ui/components/StepBasedScreen.tsx +66 -43
  316. package/src/ui/components/internal/GroupedPillButtons.tsx +15 -31
  317. package/src/ui/components/internal/PinInput.tsx +2 -2
  318. package/src/ui/components/internal/TextField.tsx +7 -6
  319. package/src/ui/context/OxyContext.tsx +441 -326
  320. package/src/ui/hooks/useSessionSocket.ts +72 -18
  321. package/src/ui/index.ts +4 -1
  322. package/src/ui/screens/AccountSettingsScreen.tsx +34 -2
  323. package/src/ui/screens/AccountSwitcherScreen.tsx +102 -68
  324. package/src/ui/screens/FileManagementScreen.tsx +16 -16
  325. package/src/ui/screens/LanguageSelectorScreen.tsx +86 -143
  326. package/src/ui/screens/SignInScreen.tsx +59 -43
  327. package/src/ui/screens/SignUpScreen.tsx +14 -15
  328. package/src/ui/screens/WelcomeNewUserScreen.tsx +153 -105
  329. package/src/ui/screens/internal/SignInPasswordStep.tsx +4 -6
  330. package/src/ui/screens/internal/SignInUsernameStep.tsx +1 -1
  331. package/src/ui/screens/steps/RecoverRequestStep.tsx +34 -24
  332. package/src/ui/screens/steps/RecoverResetPasswordStep.tsx +65 -36
  333. package/src/ui/screens/steps/RecoverSuccessStep.tsx +71 -47
  334. package/src/ui/screens/steps/RecoverVerifyStep.tsx +60 -50
  335. package/src/ui/screens/steps/SignInPasswordStep.tsx +190 -32
  336. package/src/ui/screens/steps/SignInTotpStep.tsx +68 -34
  337. package/src/ui/screens/steps/SignInUsernameStep.tsx +446 -63
  338. package/src/ui/screens/steps/SignUpIdentityStep.tsx +49 -35
  339. package/src/ui/screens/steps/SignUpSecurityStep.tsx +56 -39
  340. package/src/ui/screens/steps/SignUpSummaryStep.tsx +99 -89
  341. package/src/ui/screens/steps/SignUpWelcomeStep.tsx +88 -20
  342. package/src/ui/stores/accountStore.ts +285 -0
  343. package/src/ui/stores/authStore.ts +16 -19
  344. package/src/ui/styles/authStyles.ts +16 -8
  345. package/src/ui/styles/index.ts +1 -0
  346. package/src/ui/styles/spacing.ts +46 -0
  347. package/src/utils/asyncUtils.ts +10 -24
  348. package/src/utils/cache.ts +264 -0
  349. package/src/utils/index.ts +19 -0
  350. package/src/utils/languageUtils.ts +174 -0
  351. package/src/utils/requestUtils.ts +234 -0
  352. package/src/utils/sessionUtils.ts +206 -0
  353. package/src/utils/validationUtils.ts +1 -1
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Centralized cache utility with TTL support
5
+ *
6
+ * This is a production-ready cache implementation used across the codebase
7
+ * for consistent caching behavior and performance optimization.
8
+ */
9
+
10
+ /**
11
+ * Cache entry with expiration tracking
12
+ */
13
+
14
+ /**
15
+ * Cache statistics
16
+ */
17
+
18
+ /**
19
+ * TTL-based cache implementation
20
+ *
21
+ * Features:
22
+ * - Automatic expiration based on TTL
23
+ * - Manual cleanup of expired entries
24
+ * - Statistics tracking (hits, misses, hit rate)
25
+ * - Type-safe generic interface
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const cache = new TTLCache<string>(5 * 60 * 1000); // 5 minutes
30
+ *
31
+ * // Set with default TTL
32
+ * cache.set('key', 'value');
33
+ *
34
+ * // Set with custom TTL
35
+ * cache.set('key', 'value', 10 * 60 * 1000); // 10 minutes
36
+ *
37
+ * // Get value
38
+ * const value = cache.get('key');
39
+ *
40
+ * // Get statistics
41
+ * const stats = cache.getStats();
42
+ * ```
43
+ */
44
+ export class TTLCache {
45
+ cache = new Map();
46
+ hits = 0;
47
+ misses = 0;
48
+
49
+ /**
50
+ * Create a new TTL cache
51
+ * @param defaultTTL Default TTL in milliseconds (default: 5 minutes)
52
+ */
53
+ constructor(defaultTTL = 5 * 60 * 1000) {
54
+ this.defaultTTL = defaultTTL;
55
+ }
56
+
57
+ /**
58
+ * Get a value from cache
59
+ * @param key Cache key
60
+ * @returns Cached value or null if not found or expired
61
+ */
62
+ get(key) {
63
+ const entry = this.cache.get(key);
64
+ if (!entry) {
65
+ this.misses++;
66
+ return null;
67
+ }
68
+ const now = Date.now();
69
+ if (now > entry.expiresAt) {
70
+ this.cache.delete(key);
71
+ this.misses++;
72
+ return null;
73
+ }
74
+ this.hits++;
75
+ return entry.data;
76
+ }
77
+
78
+ /**
79
+ * Set a value in cache
80
+ * @param key Cache key
81
+ * @param data Data to cache
82
+ * @param ttl Optional TTL override (uses default if not provided)
83
+ */
84
+ set(key, data, ttl) {
85
+ const now = Date.now();
86
+ const expiresAt = now + (ttl || this.defaultTTL);
87
+ this.cache.set(key, {
88
+ data,
89
+ timestamp: now,
90
+ expiresAt
91
+ });
92
+ }
93
+
94
+ /**
95
+ * Delete a specific cache entry
96
+ * @param key Cache key
97
+ * @returns true if entry was deleted, false if not found
98
+ */
99
+ delete(key) {
100
+ return this.cache.delete(key);
101
+ }
102
+
103
+ /**
104
+ * Clear all cache entries
105
+ */
106
+ clear() {
107
+ this.cache.clear();
108
+ this.hits = 0;
109
+ this.misses = 0;
110
+ }
111
+
112
+ /**
113
+ * Check if a key exists and is not expired
114
+ * @param key Cache key
115
+ * @returns true if key exists and is valid
116
+ */
117
+ has(key) {
118
+ const entry = this.cache.get(key);
119
+ if (!entry) return false;
120
+ if (Date.now() > entry.expiresAt) {
121
+ this.cache.delete(key);
122
+ return false;
123
+ }
124
+ return true;
125
+ }
126
+
127
+ /**
128
+ * Get all valid cache keys
129
+ * @returns Array of valid cache keys
130
+ */
131
+ keys() {
132
+ const now = Date.now();
133
+ const validKeys = [];
134
+ for (const [key, entry] of this.cache.entries()) {
135
+ if (now <= entry.expiresAt) {
136
+ validKeys.push(key);
137
+ } else {
138
+ this.cache.delete(key);
139
+ }
140
+ }
141
+ return validKeys;
142
+ }
143
+
144
+ /**
145
+ * Clean up expired entries
146
+ * @returns Number of entries removed
147
+ */
148
+ cleanup() {
149
+ const now = Date.now();
150
+ let removed = 0;
151
+ for (const [key, entry] of this.cache.entries()) {
152
+ if (now > entry.expiresAt) {
153
+ this.cache.delete(key);
154
+ removed++;
155
+ }
156
+ }
157
+ return removed;
158
+ }
159
+
160
+ /**
161
+ * Get cache size (number of entries)
162
+ */
163
+ size() {
164
+ return this.cache.size;
165
+ }
166
+
167
+ /**
168
+ * Get cache statistics
169
+ */
170
+ getStats() {
171
+ const total = this.hits + this.misses;
172
+ return {
173
+ size: this.cache.size,
174
+ hits: this.hits,
175
+ misses: this.misses,
176
+ hitRate: total > 0 ? this.hits / total : 0
177
+ };
178
+ }
179
+
180
+ /**
181
+ * Reset statistics (keeps cache entries)
182
+ */
183
+ resetStats() {
184
+ this.hits = 0;
185
+ this.misses = 0;
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Create a TTL cache instance (convenience function)
191
+ *
192
+ * @example
193
+ * ```typescript
194
+ * const cache = createCache<string>(5 * 60 * 1000);
195
+ * ```
196
+ */
197
+ export function createCache(ttl = 5 * 60 * 1000) {
198
+ return new TTLCache(ttl);
199
+ }
200
+
201
+ /**
202
+ * Global cache cleanup interval (runs every minute)
203
+ * This helps prevent memory leaks from expired cache entries
204
+ */
205
+ let cleanupInterval = null;
206
+ const activeCaches = new Set();
207
+
208
+ /**
209
+ * Register a cache for automatic cleanup
210
+ * @param cache Cache instance to register
211
+ */
212
+ export function registerCacheForCleanup(cache) {
213
+ activeCaches.add(cache);
214
+
215
+ // Start cleanup interval if not already running
216
+ if (!cleanupInterval) {
217
+ cleanupInterval = setInterval(() => {
218
+ for (const cache of activeCaches) {
219
+ cache.cleanup();
220
+ }
221
+ }, 60000); // Every minute
222
+ }
223
+ }
224
+
225
+ /**
226
+ * Unregister a cache from automatic cleanup
227
+ * @param cache Cache instance to unregister
228
+ */
229
+ export function unregisterCacheFromCleanup(cache) {
230
+ activeCaches.delete(cache);
231
+
232
+ // Stop cleanup interval if no caches are registered
233
+ if (activeCaches.size === 0 && cleanupInterval) {
234
+ clearInterval(cleanupInterval);
235
+ cleanupInterval = null;
236
+ }
237
+ }
238
+
239
+ /**
240
+ * Stop all cache cleanup intervals
241
+ * Useful for tests to prevent Jest from hanging
242
+ */
243
+ export function stopAllCacheCleanup() {
244
+ if (cleanupInterval) {
245
+ clearInterval(cleanupInterval);
246
+ cleanupInterval = null;
247
+ }
248
+ activeCaches.clear();
249
+ }
250
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TTLCache","cache","Map","hits","misses","constructor","defaultTTL","get","key","entry","now","Date","expiresAt","delete","data","set","ttl","timestamp","clear","has","keys","validKeys","entries","push","cleanup","removed","size","getStats","total","hitRate","resetStats","createCache","cleanupInterval","activeCaches","Set","registerCacheForCleanup","add","setInterval","unregisterCacheFromCleanup","clearInterval","stopAllCacheCleanup"],"sourceRoot":"../../../src","sources":["utils/cache.ts"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  export { DeviceManager } from './deviceManager';
4
+ // Request utilities
5
+ export { RequestDeduplicator, RequestQueue, SimpleLogger } from './requestUtils';
6
+
7
+ // Cache utilities
8
+ export { TTLCache, createCache, registerCacheForCleanup, unregisterCacheFromCleanup, stopAllCacheCleanup } from './cache';
9
+ // Session utilities
10
+ export { normalizeSession, sortSessions, deduplicateSessions, deduplicateSessionsByUserId, normalizeAndSortSessions, mergeSessions, sessionsEqual, sessionsArraysEqual } from './sessionUtils';
4
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["DeviceManager"],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,iBAAiB","ignoreList":[]}
1
+ {"version":3,"names":["DeviceManager","RequestDeduplicator","RequestQueue","SimpleLogger","TTLCache","createCache","registerCacheForCleanup","unregisterCacheFromCleanup","stopAllCacheCleanup","normalizeSession","sortSessions","deduplicateSessions","deduplicateSessionsByUserId","normalizeAndSortSessions","mergeSessions","sessionsEqual","sessionsArraysEqual"],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,iBAAiB;AAG/C;AACA,SAASC,mBAAmB,EAAEC,YAAY,EAAEC,YAAY,QAAQ,gBAAgB;;AAEhF;AACA,SAASC,QAAQ,EAAEC,WAAW,EAAEC,uBAAuB,EAAEC,0BAA0B,EAAEC,mBAAmB,QAAQ,SAAS;AAGzH;AACA,SACEC,gBAAgB,EAChBC,YAAY,EACZC,mBAAmB,EACnBC,2BAA2B,EAC3BC,wBAAwB,EACxBC,aAAa,EACbC,aAAa,EACbC,mBAAmB,QACd,gBAAgB","ignoreList":[]}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Language utilities for OxyServices
5
+ * Provides access to supported languages and language metadata
6
+ */
7
+
8
+ // Supported languages with their metadata
9
+ export const SUPPORTED_LANGUAGES = [{
10
+ id: 'en-US',
11
+ name: 'English',
12
+ nativeName: 'English',
13
+ flag: '🇺🇸',
14
+ icon: 'language-outline',
15
+ color: '#007AFF'
16
+ }, {
17
+ id: 'es-ES',
18
+ name: 'Spanish',
19
+ nativeName: 'Español',
20
+ flag: '🇪🇸',
21
+ icon: 'language-outline',
22
+ color: '#FF3B30'
23
+ }, {
24
+ id: 'ca-ES',
25
+ name: 'Catalan',
26
+ nativeName: 'Català',
27
+ flag: '🇪🇸',
28
+ icon: 'language-outline',
29
+ color: '#0CA678'
30
+ }, {
31
+ id: 'fr-FR',
32
+ name: 'French',
33
+ nativeName: 'Français',
34
+ flag: '🇫🇷',
35
+ icon: 'language-outline',
36
+ color: '#5856D6'
37
+ }, {
38
+ id: 'de-DE',
39
+ name: 'German',
40
+ nativeName: 'Deutsch',
41
+ flag: '🇩🇪',
42
+ icon: 'language-outline',
43
+ color: '#FF9500'
44
+ }, {
45
+ id: 'it-IT',
46
+ name: 'Italian',
47
+ nativeName: 'Italiano',
48
+ flag: '🇮🇹',
49
+ icon: 'language-outline',
50
+ color: '#34C759'
51
+ }, {
52
+ id: 'pt-PT',
53
+ name: 'Portuguese',
54
+ nativeName: 'Português',
55
+ flag: '🇵🇹',
56
+ icon: 'language-outline',
57
+ color: '#AF52DE'
58
+ }, {
59
+ id: 'ja-JP',
60
+ name: 'Japanese',
61
+ nativeName: '日本語',
62
+ flag: '🇯🇵',
63
+ icon: 'language-outline',
64
+ color: '#FF2D92'
65
+ }, {
66
+ id: 'ko-KR',
67
+ name: 'Korean',
68
+ nativeName: '한국어',
69
+ flag: '🇰🇷',
70
+ icon: 'language-outline',
71
+ color: '#32D74B'
72
+ }, {
73
+ id: 'zh-CN',
74
+ name: 'Chinese',
75
+ nativeName: '中文',
76
+ flag: '🇨🇳',
77
+ icon: 'language-outline',
78
+ color: '#FF9F0A'
79
+ }, {
80
+ id: 'ar-SA',
81
+ name: 'Arabic',
82
+ nativeName: 'العربية',
83
+ flag: '🇸🇦',
84
+ icon: 'language-outline',
85
+ color: '#30B0C7'
86
+ }];
87
+ const FALLBACK_LANGUAGE = 'en-US';
88
+
89
+ /**
90
+ * Get language metadata by language code
91
+ * @param languageCode - BCP-47 language code (e.g., 'en-US', 'es-ES')
92
+ * @returns Language metadata or null if not found
93
+ */
94
+ export function getLanguageMetadata(languageCode) {
95
+ if (!languageCode) return null;
96
+
97
+ // Direct match
98
+ const exactMatch = SUPPORTED_LANGUAGES.find(lang => lang.id === languageCode);
99
+ if (exactMatch) return exactMatch;
100
+
101
+ // Try to match base language code (e.g., 'en' matches 'en-US')
102
+ const baseCode = languageCode.split('-')[0];
103
+ const baseMatch = SUPPORTED_LANGUAGES.find(lang => lang.id.startsWith(baseCode + '-'));
104
+ if (baseMatch) return baseMatch;
105
+ return null;
106
+ }
107
+
108
+ /**
109
+ * Get language name by language code
110
+ * @param languageCode - BCP-47 language code (e.g., 'en-US', 'es-ES')
111
+ * @returns Language name (e.g., 'English') or the code if not found
112
+ */
113
+ export function getLanguageName(languageCode) {
114
+ const metadata = getLanguageMetadata(languageCode);
115
+ return metadata?.name || languageCode || FALLBACK_LANGUAGE;
116
+ }
117
+
118
+ /**
119
+ * Get native language name by language code
120
+ * @param languageCode - BCP-47 language code (e.g., 'en-US', 'es-ES')
121
+ * @returns Native language name (e.g., 'Español') or the code if not found
122
+ */
123
+ export function getNativeLanguageName(languageCode) {
124
+ const metadata = getLanguageMetadata(languageCode);
125
+ return metadata?.nativeName || languageCode || FALLBACK_LANGUAGE;
126
+ }
127
+
128
+ /**
129
+ * Normalize language code to BCP-47 format
130
+ * @param lang - Language code (may be short like 'en' or full like 'en-US')
131
+ * @returns Normalized BCP-47 language code
132
+ */
133
+ export function normalizeLanguageCode(lang) {
134
+ if (!lang) return FALLBACK_LANGUAGE;
135
+ if (lang.includes('-')) return lang;
136
+ const map = {
137
+ en: 'en-US',
138
+ es: 'es-ES',
139
+ ca: 'ca-ES',
140
+ fr: 'fr-FR',
141
+ de: 'de-DE',
142
+ it: 'it-IT',
143
+ pt: 'pt-PT',
144
+ ja: 'ja-JP',
145
+ ko: 'ko-KR',
146
+ zh: 'zh-CN',
147
+ ar: 'ar-SA'
148
+ };
149
+ return map[lang] || lang;
150
+ }
151
+ //# sourceMappingURL=languageUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SUPPORTED_LANGUAGES","id","name","nativeName","flag","icon","color","FALLBACK_LANGUAGE","getLanguageMetadata","languageCode","exactMatch","find","lang","baseCode","split","baseMatch","startsWith","getLanguageName","metadata","getNativeLanguageName","normalizeLanguageCode","includes","map","en","es","ca","fr","de","it","pt","ja","ko","zh","ar"],"sourceRoot":"../../../src","sources":["utils/languageUtils.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Request utilities for HTTP clients
5
+ *
6
+ * Provides reusable components for request deduplication, queuing, and logging
7
+ */
8
+
9
+ /**
10
+ * Request deduplication - prevents duplicate concurrent requests
11
+ *
12
+ * When multiple requests with the same key are made simultaneously,
13
+ * only one request is executed and all callers receive the same result.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const deduplicator = new RequestDeduplicator();
18
+ *
19
+ * // Multiple calls with same key will share the same promise
20
+ * const promise1 = deduplicator.deduplicate('user-123', () => fetchUser('123'));
21
+ * const promise2 = deduplicator.deduplicate('user-123', () => fetchUser('123'));
22
+ * // promise1 === promise2, only one API call is made
23
+ * ```
24
+ */
25
+ export class RequestDeduplicator {
26
+ pendingRequests = new Map();
27
+
28
+ /**
29
+ * Deduplicate a request by key
30
+ * @param key Unique key for the request
31
+ * @param requestFn Function that returns a promise
32
+ * @returns Promise that will be shared if key already exists
33
+ */
34
+ async deduplicate(key, requestFn) {
35
+ const existing = this.pendingRequests.get(key);
36
+ if (existing) {
37
+ return existing;
38
+ }
39
+ const promise = requestFn().finally(() => {
40
+ this.pendingRequests.delete(key);
41
+ });
42
+ this.pendingRequests.set(key, promise);
43
+ return promise;
44
+ }
45
+
46
+ /**
47
+ * Clear all pending requests
48
+ */
49
+ clear() {
50
+ this.pendingRequests.clear();
51
+ }
52
+
53
+ /**
54
+ * Get number of pending requests
55
+ */
56
+ size() {
57
+ return this.pendingRequests.size;
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Request queue with concurrency control
63
+ *
64
+ * Limits the number of concurrent requests and queues excess requests.
65
+ * Useful for rate limiting and preventing request flooding.
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const queue = new RequestQueue(5, 100); // Max 5 concurrent, queue up to 100
70
+ *
71
+ * // All requests will be queued and processed with max 5 concurrent
72
+ * await queue.enqueue(() => fetchUser('1'));
73
+ * await queue.enqueue(() => fetchUser('2'));
74
+ * // ...
75
+ * ```
76
+ */
77
+ export class RequestQueue {
78
+ queue = [];
79
+ running = 0;
80
+ /**
81
+ * Create a new request queue
82
+ * @param maxConcurrent Maximum number of concurrent requests (default: 10)
83
+ * @param maxQueueSize Maximum queue size (default: 100)
84
+ */
85
+ constructor(maxConcurrent = 10, maxQueueSize = 100) {
86
+ this.maxConcurrent = maxConcurrent;
87
+ this.maxQueueSize = maxQueueSize;
88
+ }
89
+
90
+ /**
91
+ * Enqueue a request
92
+ * @param requestFn Function that returns a promise
93
+ * @returns Promise that resolves when request completes
94
+ */
95
+ async enqueue(requestFn) {
96
+ if (this.queue.length >= this.maxQueueSize) {
97
+ throw new Error('Request queue is full');
98
+ }
99
+ return new Promise((resolve, reject) => {
100
+ this.queue.push(async () => {
101
+ try {
102
+ const result = await requestFn();
103
+ resolve(result);
104
+ } catch (error) {
105
+ reject(error);
106
+ }
107
+ });
108
+ this.process();
109
+ });
110
+ }
111
+
112
+ /**
113
+ * Process queued requests
114
+ */
115
+ async process() {
116
+ if (this.running >= this.maxConcurrent || this.queue.length === 0) {
117
+ return;
118
+ }
119
+ this.running++;
120
+ const requestFn = this.queue.shift();
121
+ if (requestFn) {
122
+ try {
123
+ await requestFn();
124
+ } finally {
125
+ this.running--;
126
+ this.process();
127
+ }
128
+ } else {
129
+ this.running--;
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Clear all queued requests
135
+ */
136
+ clear() {
137
+ this.queue = [];
138
+ }
139
+
140
+ /**
141
+ * Get queue size
142
+ */
143
+ size() {
144
+ return this.queue.length;
145
+ }
146
+
147
+ /**
148
+ * Get number of currently running requests
149
+ */
150
+ runningCount() {
151
+ return this.running;
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Simple logger with level support
157
+ *
158
+ * Lightweight logger for HTTP clients and utilities.
159
+ * For more advanced logging, use loggerUtils.ts
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * const logger = new SimpleLogger(true, 'debug');
164
+ * logger.debug('Debug message');
165
+ * logger.info('Info message');
166
+ * logger.error('Error message');
167
+ * ```
168
+ */
169
+ export class SimpleLogger {
170
+ /**
171
+ * Create a new simple logger
172
+ * @param enabled Whether logging is enabled
173
+ * @param level Minimum log level
174
+ * @param prefix Prefix for log messages (default: '')
175
+ */
176
+ constructor(enabled = false, level = 'error', prefix = '') {
177
+ this.enabled = enabled;
178
+ this.level = level;
179
+ this.prefix = prefix;
180
+ }
181
+ shouldLog(level) {
182
+ if (!this.enabled || this.level === 'none') return false;
183
+ const levels = ['none', 'error', 'warn', 'info', 'debug'];
184
+ return levels.indexOf(level) <= levels.indexOf(this.level);
185
+ }
186
+ formatMessage(...args) {
187
+ return this.prefix ? [`[${this.prefix}]`, ...args] : args;
188
+ }
189
+ error(...args) {
190
+ if (this.shouldLog('error')) {
191
+ console.error(...this.formatMessage(...args));
192
+ }
193
+ }
194
+ warn(...args) {
195
+ if (this.shouldLog('warn')) {
196
+ console.warn(...this.formatMessage(...args));
197
+ }
198
+ }
199
+ info(...args) {
200
+ if (this.shouldLog('info')) {
201
+ console.info(...this.formatMessage(...args));
202
+ }
203
+ }
204
+ debug(...args) {
205
+ if (this.shouldLog('debug')) {
206
+ console.log(...this.formatMessage(...args));
207
+ }
208
+ }
209
+ }
210
+ //# sourceMappingURL=requestUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["RequestDeduplicator","pendingRequests","Map","deduplicate","key","requestFn","existing","get","promise","finally","delete","set","clear","size","RequestQueue","queue","running","constructor","maxConcurrent","maxQueueSize","enqueue","length","Error","Promise","resolve","reject","push","result","error","process","shift","runningCount","SimpleLogger","enabled","level","prefix","shouldLog","levels","indexOf","formatMessage","args","console","warn","info","debug","log"],"sourceRoot":"../../../src","sources":["utils/requestUtils.ts"],"mappings":"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","ignoreList":[]}