@tma.js/sdk 0.13.2 → 1.0.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 (426) hide show
  1. package/dist/dts/{components/BackButton → back-button}/BackButton.d.ts +12 -9
  2. package/dist/dts/back-button/index.d.ts +2 -0
  3. package/dist/dts/{components/BackButton → back-button}/types.d.ts +3 -2
  4. package/dist/dts/bridge/env/hasExternalNotify.d.ts +12 -0
  5. package/dist/dts/bridge/env/hasWebviewProxy.d.ts +12 -0
  6. package/dist/dts/bridge/env/index.d.ts +3 -0
  7. package/dist/dts/bridge/env/isIframe.d.ts +5 -0
  8. package/dist/dts/bridge/errors/MethodUnsupportedError.d.ts +8 -0
  9. package/dist/dts/bridge/errors/ParameterUnsupportedError.d.ts +8 -0
  10. package/dist/dts/bridge/errors/index.d.ts +2 -0
  11. package/dist/dts/bridge/events/createEmitter.d.ts +6 -0
  12. package/dist/dts/bridge/events/events.d.ts +130 -0
  13. package/dist/dts/bridge/events/index.d.ts +9 -0
  14. package/dist/dts/bridge/events/off.d.ts +7 -0
  15. package/dist/dts/bridge/events/on.d.ts +10 -0
  16. package/dist/dts/bridge/events/onTelegramEvent.d.ts +7 -0
  17. package/dist/dts/bridge/events/once.d.ts +9 -0
  18. package/dist/dts/bridge/events/parsers/clipboardTextReceived.d.ts +13 -0
  19. package/dist/dts/bridge/events/parsers/customMethodInvoked.d.ts +16 -0
  20. package/dist/dts/bridge/events/parsers/index.d.ts +9 -0
  21. package/dist/dts/bridge/events/parsers/invoiceClosed.d.ts +12 -0
  22. package/dist/dts/bridge/events/parsers/phoneRequested.d.ts +8 -0
  23. package/dist/dts/bridge/events/parsers/popupClosed.d.ts +8 -0
  24. package/dist/dts/bridge/events/parsers/qrTextReceived.d.ts +7 -0
  25. package/dist/dts/bridge/events/parsers/theme-changed.d.ts +42 -0
  26. package/dist/dts/bridge/events/parsers/viewportChanged.d.ts +19 -0
  27. package/dist/dts/bridge/events/parsers/writeAccessRequested.d.ts +8 -0
  28. package/dist/dts/bridge/events/singletonEmitter.d.ts +6 -0
  29. package/dist/dts/bridge/events/subscribe.d.ts +9 -0
  30. package/dist/dts/bridge/events/unsubscribe.d.ts +6 -0
  31. package/dist/dts/bridge/index.d.ts +5 -0
  32. package/dist/dts/bridge/methods/createPostEvent.d.ts +10 -0
  33. package/dist/dts/bridge/methods/haptic.d.ts +40 -0
  34. package/dist/dts/bridge/methods/index.d.ts +6 -0
  35. package/dist/dts/bridge/methods/invoke-custom-method.d.ts +24 -0
  36. package/dist/dts/bridge/methods/methods.d.ts +329 -0
  37. package/dist/dts/bridge/methods/popup.d.ts +49 -0
  38. package/dist/dts/bridge/methods/postEvent.d.ts +29 -0
  39. package/dist/dts/bridge/request.d.ts +65 -0
  40. package/dist/dts/classnames/classNames.d.ts +10 -0
  41. package/dist/dts/classnames/index.d.ts +2 -0
  42. package/dist/dts/classnames/mergeClassNames.d.ts +32 -0
  43. package/dist/dts/{components/ClosingBehaviour/ClosingBehaviour.d.ts → closing-behavior/ClosingBehavior.d.ts} +5 -4
  44. package/dist/dts/closing-behavior/index.d.ts +2 -0
  45. package/dist/dts/closing-behavior/types.d.ts +7 -0
  46. package/dist/dts/{components/CloudStorage → cloud-storage}/CloudStorage.d.ts +19 -11
  47. package/dist/dts/colors/index.d.ts +5 -0
  48. package/dist/dts/colors/isColorDark.d.ts +6 -0
  49. package/dist/dts/colors/isRGB.d.ts +6 -0
  50. package/dist/dts/colors/isRGBShort.d.ts +6 -0
  51. package/dist/dts/colors/toRGB.d.ts +11 -0
  52. package/dist/dts/colors/types.d.ts +8 -0
  53. package/dist/dts/event-emitter/EventEmitter.d.ts +64 -0
  54. package/dist/dts/event-emitter/index.d.ts +2 -0
  55. package/dist/dts/event-emitter/types.d.ts +44 -0
  56. package/dist/dts/globals.d.ts +22 -0
  57. package/dist/dts/{components/HapticFeedback → haptic-feedback}/HapticFeedback.d.ts +3 -3
  58. package/dist/dts/index.d.ts +24 -6
  59. package/dist/dts/init/catchCustomStyles.d.ts +4 -0
  60. package/dist/dts/init/creators/createBackButton.d.ts +2 -2
  61. package/dist/dts/init/creators/createClosingBehavior.d.ts +3 -3
  62. package/dist/dts/init/creators/createMainButton.d.ts +3 -3
  63. package/dist/dts/init/creators/createMiniApp.d.ts +14 -0
  64. package/dist/dts/init/creators/createRequestIdGenerator.d.ts +1 -1
  65. package/dist/dts/init/creators/createThemeParams.d.ts +2 -3
  66. package/dist/dts/init/creators/createViewport.d.ts +16 -9
  67. package/dist/dts/init/creators/index.d.ts +1 -1
  68. package/dist/dts/init/css/bindMiniAppCSSVars.d.ts +16 -0
  69. package/dist/dts/init/css/bindThemeCSSVars.d.ts +12 -0
  70. package/dist/dts/init/css/bindViewportCSSVars.d.ts +20 -0
  71. package/dist/dts/init/css/index.d.ts +1 -0
  72. package/dist/dts/init/css/processCSSVarsOption.d.ts +12 -0
  73. package/dist/dts/init/css/setCSSVar.d.ts +6 -0
  74. package/dist/dts/init/init.d.ts +5 -5
  75. package/dist/dts/init/types.d.ts +42 -69
  76. package/dist/dts/init-data/InitData.d.ts +53 -0
  77. package/dist/dts/init-data/chatParser.d.ts +5 -0
  78. package/dist/dts/init-data/index.d.ts +6 -0
  79. package/dist/dts/init-data/initDataParser.d.ts +5 -0
  80. package/dist/dts/init-data/parseInitData.d.ts +6 -0
  81. package/dist/dts/init-data/types.d.ts +133 -0
  82. package/dist/dts/init-data/userParser.d.ts +5 -0
  83. package/dist/dts/invoice/Invoice.d.ts +43 -0
  84. package/dist/dts/invoice/index.d.ts +2 -0
  85. package/dist/dts/invoice/types.d.ts +7 -0
  86. package/dist/dts/launch-params/computeLaunchData.d.ts +6 -0
  87. package/dist/dts/launch-params/computePageReload.d.ts +6 -0
  88. package/dist/dts/launch-params/getFirstNavigationEntry.d.ts +6 -0
  89. package/dist/dts/launch-params/index.d.ts +12 -0
  90. package/dist/dts/launch-params/launchParamsParser.d.ts +5 -0
  91. package/dist/dts/launch-params/parseLaunchParams.d.ts +6 -0
  92. package/dist/dts/launch-params/retrieveCurrent.d.ts +5 -0
  93. package/dist/dts/launch-params/retrieveFromLocation.d.ts +6 -0
  94. package/dist/dts/launch-params/retrieveFromPerformance.d.ts +8 -0
  95. package/dist/dts/launch-params/retrieveLaunchData.d.ts +6 -0
  96. package/dist/dts/launch-params/serializeLaunchParams.d.ts +6 -0
  97. package/dist/dts/launch-params/storage.d.ts +13 -0
  98. package/dist/dts/launch-params/types.d.ts +48 -0
  99. package/dist/dts/logger/Logger.d.ts +38 -0
  100. package/dist/dts/logger/index.d.ts +1 -0
  101. package/dist/dts/main-button/MainButton.d.ts +104 -0
  102. package/dist/dts/main-button/index.d.ts +2 -0
  103. package/dist/dts/main-button/types.d.ts +20 -0
  104. package/dist/dts/mini-app/MiniApp.d.ts +99 -0
  105. package/dist/dts/mini-app/index.d.ts +2 -0
  106. package/dist/dts/mini-app/types.d.ts +19 -0
  107. package/dist/dts/misc/index.d.ts +2 -0
  108. package/dist/dts/misc/isRecord.d.ts +5 -0
  109. package/dist/dts/misc/isTMA.d.ts +4 -0
  110. package/dist/dts/navigation/HashNavigator/HashNavigator.d.ts +43 -0
  111. package/dist/dts/navigation/HashNavigator/drop.d.ts +4 -0
  112. package/dist/dts/navigation/HashNavigator/go.d.ts +5 -0
  113. package/dist/dts/navigation/HashNavigator/index.d.ts +2 -0
  114. package/dist/dts/navigation/HashNavigator/types.d.ts +34 -0
  115. package/dist/dts/navigation/Navigator/Navigator.d.ts +104 -0
  116. package/dist/dts/navigation/Navigator/index.d.ts +2 -0
  117. package/dist/dts/navigation/Navigator/types.d.ts +44 -0
  118. package/dist/dts/navigation/ensurePrefix.d.ts +7 -0
  119. package/dist/dts/navigation/getHash.d.ts +14 -0
  120. package/dist/dts/navigation/index.d.ts +4 -0
  121. package/dist/dts/parsing/ArrayValueParser.d.ts +18 -0
  122. package/dist/dts/parsing/ParseError.d.ts +22 -0
  123. package/dist/dts/parsing/ParseSchemaFieldError.d.ts +17 -0
  124. package/dist/dts/parsing/ValueParser.d.ts +36 -0
  125. package/dist/dts/parsing/createValueParserGenerator.d.ts +9 -0
  126. package/dist/dts/parsing/index.d.ts +10 -0
  127. package/dist/dts/parsing/parseBySchema.d.ts +8 -0
  128. package/dist/dts/parsing/parsers/array.d.ts +6 -0
  129. package/dist/dts/parsing/parsers/boolean.d.ts +4 -0
  130. package/dist/dts/parsing/parsers/date.d.ts +4 -0
  131. package/dist/dts/parsing/parsers/index.d.ts +8 -0
  132. package/dist/dts/parsing/parsers/json.d.ts +8 -0
  133. package/dist/dts/parsing/parsers/number.d.ts +4 -0
  134. package/dist/dts/parsing/parsers/rgb.d.ts +4 -0
  135. package/dist/dts/parsing/parsers/searchParams.d.ts +8 -0
  136. package/dist/dts/parsing/parsers/string.d.ts +4 -0
  137. package/dist/dts/parsing/toRecord.d.ts +7 -0
  138. package/dist/dts/parsing/types.d.ts +30 -0
  139. package/dist/dts/parsing/unexpectedTypeError.d.ts +4 -0
  140. package/dist/dts/{components/Popup → popup}/Popup.d.ts +10 -9
  141. package/dist/dts/popup/index.d.ts +2 -0
  142. package/dist/dts/popup/preparePopupParams.d.ts +7 -0
  143. package/dist/dts/{components/Popup → popup}/types.d.ts +4 -4
  144. package/dist/dts/{components/QRScanner → qr-scanner}/QRScanner.d.ts +6 -5
  145. package/dist/dts/qr-scanner/index.d.ts +2 -0
  146. package/dist/dts/{components/QRScanner → qr-scanner}/types.d.ts +1 -1
  147. package/dist/dts/state/State.d.ts +19 -6
  148. package/dist/dts/state/types.d.ts +4 -7
  149. package/dist/dts/storage.d.ts +4 -4
  150. package/dist/dts/supports/createSupportsFunc.d.ts +10 -0
  151. package/dist/dts/supports/createSupportsParamFunc.d.ts +15 -0
  152. package/dist/dts/supports/index.d.ts +4 -0
  153. package/dist/dts/supports/supports.d.ts +15 -0
  154. package/dist/dts/supports/types.d.ts +1 -0
  155. package/dist/dts/theme-params/ThemeParams.d.ts +62 -0
  156. package/dist/dts/theme-params/index.d.ts +6 -0
  157. package/dist/dts/theme-params/keys.d.ts +11 -0
  158. package/dist/dts/theme-params/parseThemeParams.d.ts +6 -0
  159. package/dist/dts/theme-params/requestThemeParams.d.ts +7 -0
  160. package/dist/dts/theme-params/serializeThemeParams.d.ts +5 -0
  161. package/dist/dts/theme-params/themeParamsParser.d.ts +2 -0
  162. package/dist/dts/theme-params/types.d.ts +14 -0
  163. package/dist/dts/timeout/TimeoutError.d.ts +3 -0
  164. package/dist/dts/timeout/index.d.ts +3 -0
  165. package/dist/dts/timeout/isTimeoutError.d.ts +6 -0
  166. package/dist/dts/timeout/withTimeout.d.ts +14 -0
  167. package/dist/dts/types/index.d.ts +3 -0
  168. package/dist/dts/types/platform.d.ts +4 -0
  169. package/dist/dts/types/request-id.d.ts +9 -0
  170. package/dist/dts/types/utils.d.ts +36 -0
  171. package/dist/dts/utils/Utils.d.ts +45 -0
  172. package/dist/dts/utils/index.d.ts +1 -0
  173. package/dist/dts/version/compareVersions.d.ts +8 -0
  174. package/dist/dts/version/index.d.ts +2 -0
  175. package/dist/dts/version/types.d.ts +4 -0
  176. package/dist/dts/{components/Viewport → viewport}/Viewport.d.ts +16 -38
  177. package/dist/dts/viewport/index.d.ts +3 -0
  178. package/dist/dts/viewport/requestViewport.d.ts +12 -0
  179. package/dist/dts/{components/Viewport → viewport}/types.d.ts +9 -1
  180. package/dist/dts/viewport/utils.d.ts +5 -0
  181. package/dist/index.cjs +1 -1
  182. package/dist/index.cjs.map +1 -1
  183. package/dist/index.iife.js +1 -1
  184. package/dist/index.iife.js.map +1 -1
  185. package/dist/index.mjs +2249 -1036
  186. package/dist/index.mjs.map +1 -1
  187. package/package.json +7 -16
  188. package/src/{components/BackButton → back-button}/BackButton.ts +23 -21
  189. package/src/back-button/index.ts +2 -0
  190. package/src/{components/BackButton → back-button}/types.ts +3 -2
  191. package/src/bridge/env/hasExternalNotify.ts +19 -0
  192. package/src/bridge/env/hasWebviewProxy.ts +19 -0
  193. package/src/bridge/env/index.ts +3 -0
  194. package/src/bridge/env/isIframe.ts +11 -0
  195. package/src/bridge/errors/MethodUnsupportedError.ts +13 -0
  196. package/src/bridge/errors/ParameterUnsupportedError.ts +13 -0
  197. package/src/bridge/errors/index.ts +2 -0
  198. package/src/bridge/events/createEmitter.ts +108 -0
  199. package/src/bridge/events/events.ts +170 -0
  200. package/src/bridge/events/index.ts +9 -0
  201. package/src/bridge/events/off.ts +14 -0
  202. package/src/bridge/events/on.ts +19 -0
  203. package/src/bridge/events/onTelegramEvent.ts +83 -0
  204. package/src/bridge/events/once.ts +18 -0
  205. package/src/bridge/events/parsers/clipboardTextReceived.ts +26 -0
  206. package/src/bridge/events/parsers/customMethodInvoked.ts +25 -0
  207. package/src/bridge/events/parsers/index.ts +9 -0
  208. package/src/bridge/events/parsers/invoiceClosed.ts +26 -0
  209. package/src/bridge/events/parsers/phoneRequested.ts +14 -0
  210. package/src/bridge/events/parsers/popupClosed.ts +19 -0
  211. package/src/bridge/events/parsers/qrTextReceived.ts +14 -0
  212. package/src/bridge/events/parsers/theme-changed.ts +58 -0
  213. package/src/bridge/events/parsers/viewportChanged.ts +33 -0
  214. package/src/bridge/events/parsers/writeAccessRequested.ts +14 -0
  215. package/src/bridge/events/singletonEmitter.ts +19 -0
  216. package/src/bridge/events/subscribe.ts +15 -0
  217. package/src/bridge/events/unsubscribe.ts +10 -0
  218. package/src/bridge/index.ts +5 -0
  219. package/src/bridge/methods/createPostEvent.ts +40 -0
  220. package/src/bridge/methods/haptic.ts +52 -0
  221. package/src/bridge/methods/index.ts +6 -0
  222. package/src/bridge/methods/invoke-custom-method.ts +25 -0
  223. package/src/bridge/methods/methods.ts +372 -0
  224. package/src/bridge/methods/popup.ts +53 -0
  225. package/src/bridge/methods/postEvent.ts +101 -0
  226. package/src/bridge/request.ts +185 -0
  227. package/src/classnames/classNames.ts +34 -0
  228. package/src/classnames/index.ts +2 -0
  229. package/src/classnames/mergeClassNames.ts +68 -0
  230. package/src/{components/ClosingBehaviour/ClosingBehaviour.ts → closing-behavior/ClosingBehavior.ts} +12 -10
  231. package/src/closing-behavior/index.ts +2 -0
  232. package/src/closing-behavior/types.ts +12 -0
  233. package/src/{components/CloudStorage → cloud-storage}/CloudStorage.ts +50 -28
  234. package/src/colors/index.ts +5 -0
  235. package/src/colors/isColorDark.ts +22 -0
  236. package/src/colors/isRGB.ts +9 -0
  237. package/src/colors/isRGBShort.ts +9 -0
  238. package/src/colors/toRGB.ts +49 -0
  239. package/src/colors/types.ts +9 -0
  240. package/src/event-emitter/EventEmitter.ts +146 -0
  241. package/src/event-emitter/index.ts +2 -0
  242. package/src/event-emitter/types.ts +60 -0
  243. package/src/globals.ts +38 -0
  244. package/src/{components/HapticFeedback → haptic-feedback}/HapticFeedback.ts +16 -8
  245. package/src/index.ts +171 -6
  246. package/src/init/catchCustomStyles.ts +17 -0
  247. package/src/init/creators/createBackButton.ts +4 -6
  248. package/src/init/creators/createClosingBehavior.ts +6 -8
  249. package/src/init/creators/createMainButton.ts +13 -20
  250. package/src/init/creators/createMiniApp.ts +44 -0
  251. package/src/init/creators/createRequestIdGenerator.ts +1 -1
  252. package/src/init/creators/createThemeParams.ts +3 -6
  253. package/src/init/creators/createViewport.ts +92 -42
  254. package/src/init/creators/index.ts +1 -1
  255. package/src/init/css/bindMiniAppCSSVars.ts +48 -0
  256. package/src/init/css/bindThemeCSSVars.ts +31 -0
  257. package/src/init/css/bindViewportCSSVars.ts +36 -0
  258. package/src/init/css/index.ts +1 -0
  259. package/src/init/css/processCSSVarsOption.ts +57 -0
  260. package/src/init/css/setCSSVar.ts +8 -0
  261. package/src/init/init.ts +96 -138
  262. package/src/init/types.ts +42 -87
  263. package/src/init-data/InitData.ts +96 -0
  264. package/src/init-data/chatParser.ts +19 -0
  265. package/src/init-data/index.ts +6 -0
  266. package/src/init-data/initDataParser.ts +41 -0
  267. package/src/init-data/parseInitData.ts +10 -0
  268. package/src/init-data/types.ts +164 -0
  269. package/src/init-data/userParser.ts +45 -0
  270. package/src/invoice/Invoice.ts +123 -0
  271. package/src/invoice/index.ts +2 -0
  272. package/src/invoice/types.ts +11 -0
  273. package/src/launch-params/computeLaunchData.ts +81 -0
  274. package/src/launch-params/computePageReload.ts +13 -0
  275. package/src/launch-params/getFirstNavigationEntry.ts +10 -0
  276. package/src/launch-params/index.ts +12 -0
  277. package/src/launch-params/launchParamsParser.ts +41 -0
  278. package/src/launch-params/parseLaunchParams.ts +10 -0
  279. package/src/launch-params/retrieveCurrent.ts +27 -0
  280. package/src/launch-params/retrieveFromLocation.ts +10 -0
  281. package/src/launch-params/retrieveFromPerformance.ts +23 -0
  282. package/src/launch-params/retrieveLaunchData.ts +30 -0
  283. package/src/launch-params/serializeLaunchParams.ts +37 -0
  284. package/src/launch-params/storage.ts +33 -0
  285. package/src/launch-params/types.ts +57 -0
  286. package/src/logger/Logger.ts +72 -0
  287. package/src/logger/index.ts +1 -0
  288. package/src/main-button/MainButton.ts +239 -0
  289. package/src/main-button/index.ts +2 -0
  290. package/src/main-button/types.ts +26 -0
  291. package/src/mini-app/MiniApp.ts +237 -0
  292. package/src/mini-app/index.ts +2 -0
  293. package/src/mini-app/types.ts +25 -0
  294. package/src/misc/index.ts +2 -0
  295. package/src/misc/isRecord.ts +7 -0
  296. package/src/misc/isTMA.ts +13 -0
  297. package/src/navigation/HashNavigator/HashNavigator.ts +220 -0
  298. package/src/navigation/HashNavigator/drop.ts +36 -0
  299. package/src/navigation/HashNavigator/go.ts +28 -0
  300. package/src/navigation/HashNavigator/index.ts +2 -0
  301. package/src/navigation/HashNavigator/types.ts +41 -0
  302. package/src/navigation/Navigator/Navigator.ts +282 -0
  303. package/src/navigation/Navigator/index.ts +2 -0
  304. package/src/navigation/Navigator/types.ts +55 -0
  305. package/src/navigation/ensurePrefix.ts +9 -0
  306. package/src/navigation/getHash.ts +17 -0
  307. package/src/navigation/index.ts +4 -0
  308. package/src/parsing/ArrayValueParser.ts +79 -0
  309. package/src/parsing/ParseError.ts +27 -0
  310. package/src/parsing/ParseSchemaFieldError.ts +21 -0
  311. package/src/parsing/ValueParser.ts +71 -0
  312. package/src/parsing/createValueParserGenerator.ts +16 -0
  313. package/src/parsing/index.ts +10 -0
  314. package/src/parsing/parseBySchema.ts +65 -0
  315. package/src/parsing/parsers/array.ts +9 -0
  316. package/src/parsing/parsers/boolean.ts +22 -0
  317. package/src/parsing/parsers/date.ts +13 -0
  318. package/src/parsing/parsers/index.ts +8 -0
  319. package/src/parsing/parsers/json.ts +17 -0
  320. package/src/parsing/parsers/number.ts +21 -0
  321. package/src/parsing/parsers/rgb.ts +12 -0
  322. package/src/parsing/parsers/searchParams.ts +24 -0
  323. package/src/parsing/parsers/string.ts +12 -0
  324. package/src/parsing/toRecord.ts +27 -0
  325. package/src/parsing/types.ts +32 -0
  326. package/src/parsing/unexpectedTypeError.ts +6 -0
  327. package/src/{components/Popup → popup}/Popup.ts +38 -28
  328. package/src/popup/index.ts +2 -0
  329. package/src/{components/Popup/utils.ts → popup/preparePopupParams.ts} +3 -3
  330. package/src/{components/Popup → popup}/types.ts +4 -4
  331. package/src/{components/QRScanner → qr-scanner}/QRScanner.ts +18 -10
  332. package/src/qr-scanner/index.ts +2 -0
  333. package/src/{components/QRScanner → qr-scanner}/types.ts +1 -1
  334. package/src/state/State.ts +30 -16
  335. package/src/state/types.ts +5 -8
  336. package/src/storage.ts +6 -4
  337. package/src/supports/createSupportsFunc.ts +18 -0
  338. package/src/supports/createSupportsParamFunc.ts +27 -0
  339. package/src/supports/index.ts +4 -0
  340. package/src/supports/supports.ts +84 -0
  341. package/src/supports/types.ts +1 -0
  342. package/src/theme-params/ThemeParams.ts +131 -0
  343. package/src/theme-params/index.ts +6 -0
  344. package/src/theme-params/keys.ts +24 -0
  345. package/src/theme-params/parseThemeParams.ts +10 -0
  346. package/src/theme-params/requestThemeParams.ts +13 -0
  347. package/src/theme-params/serializeThemeParams.ts +20 -0
  348. package/src/theme-params/themeParamsParser.ts +20 -0
  349. package/src/theme-params/types.ts +33 -0
  350. package/src/timeout/TimeoutError.ts +6 -0
  351. package/src/timeout/index.ts +3 -0
  352. package/src/timeout/isTimeoutError.ts +9 -0
  353. package/src/timeout/withTimeout.ts +36 -0
  354. package/src/types/index.ts +3 -0
  355. package/src/types/platform.ts +14 -0
  356. package/src/types/request-id.ts +10 -0
  357. package/src/types/utils.ts +50 -0
  358. package/src/utils/Utils.ts +107 -0
  359. package/src/utils/index.ts +1 -0
  360. package/src/version/compareVersions.ts +28 -0
  361. package/src/version/index.ts +2 -0
  362. package/src/version/types.ts +4 -0
  363. package/src/{components/Viewport → viewport}/Viewport.ts +72 -98
  364. package/src/viewport/index.ts +3 -0
  365. package/src/viewport/requestViewport.ts +23 -0
  366. package/src/{components/Viewport → viewport}/types.ts +10 -1
  367. package/src/viewport/utils.ts +7 -0
  368. package/dist/dts/components/BackButton/index.d.ts +0 -2
  369. package/dist/dts/components/ClosingBehaviour/index.d.ts +0 -2
  370. package/dist/dts/components/ClosingBehaviour/types.d.ts +0 -7
  371. package/dist/dts/components/InitData/InitData.d.ts +0 -60
  372. package/dist/dts/components/InitData/index.d.ts +0 -1
  373. package/dist/dts/components/MainButton/MainButton.d.ts +0 -114
  374. package/dist/dts/components/MainButton/index.d.ts +0 -2
  375. package/dist/dts/components/MainButton/types.d.ts +0 -15
  376. package/dist/dts/components/Popup/index.d.ts +0 -2
  377. package/dist/dts/components/Popup/utils.d.ts +0 -7
  378. package/dist/dts/components/QRScanner/index.d.ts +0 -2
  379. package/dist/dts/components/ThemeParams/ThemeParams.d.ts +0 -73
  380. package/dist/dts/components/ThemeParams/index.d.ts +0 -2
  381. package/dist/dts/components/ThemeParams/types.d.ts +0 -9
  382. package/dist/dts/components/Viewport/index.d.ts +0 -2
  383. package/dist/dts/components/WebApp/WebApp.d.ts +0 -146
  384. package/dist/dts/components/WebApp/index.d.ts +0 -2
  385. package/dist/dts/components/WebApp/types.d.ts +0 -11
  386. package/dist/dts/components/index.d.ts +0 -11
  387. package/dist/dts/env.d.ts +0 -10
  388. package/dist/dts/errors/MethodNotSupportedError.d.ts +0 -6
  389. package/dist/dts/errors/ParameterNotSupportedError.d.ts +0 -6
  390. package/dist/dts/errors/index.d.ts +0 -2
  391. package/dist/dts/init/creators/createWebApp.d.ts +0 -16
  392. package/dist/dts/init/css.d.ts +0 -57
  393. package/dist/dts/supports.d.ts +0 -22
  394. package/dist/dts/types.d.ts +0 -10
  395. package/dist/dts/url.d.ts +0 -7
  396. package/src/components/BackButton/index.ts +0 -2
  397. package/src/components/ClosingBehaviour/index.ts +0 -6
  398. package/src/components/ClosingBehaviour/types.ts +0 -12
  399. package/src/components/InitData/InitData.ts +0 -139
  400. package/src/components/InitData/index.ts +0 -1
  401. package/src/components/MainButton/MainButton.ts +0 -242
  402. package/src/components/MainButton/index.ts +0 -2
  403. package/src/components/MainButton/types.ts +0 -20
  404. package/src/components/Popup/index.ts +0 -8
  405. package/src/components/QRScanner/index.ts +0 -2
  406. package/src/components/ThemeParams/ThemeParams.ts +0 -166
  407. package/src/components/ThemeParams/index.ts +0 -2
  408. package/src/components/ThemeParams/types.ts +0 -18
  409. package/src/components/Viewport/index.ts +0 -2
  410. package/src/components/WebApp/WebApp.ts +0 -311
  411. package/src/components/WebApp/index.ts +0 -2
  412. package/src/components/WebApp/types.ts +0 -17
  413. package/src/components/index.ts +0 -11
  414. package/src/env.ts +0 -22
  415. package/src/errors/MethodNotSupportedError.ts +0 -9
  416. package/src/errors/ParameterNotSupportedError.ts +0 -9
  417. package/src/errors/index.ts +0 -2
  418. package/src/init/creators/createWebApp.ts +0 -52
  419. package/src/init/css.ts +0 -166
  420. package/src/supports.ts +0 -44
  421. package/src/types.ts +0 -13
  422. package/src/url.ts +0 -23
  423. /package/dist/dts/{components/CloudStorage → cloud-storage}/index.d.ts +0 -0
  424. /package/dist/dts/{components/HapticFeedback → haptic-feedback}/index.d.ts +0 -0
  425. /package/src/{components/CloudStorage → cloud-storage}/index.ts +0 -0
  426. /package/src/{components/HapticFeedback → haptic-feedback}/index.ts +0 -0
@@ -1,10 +1,15 @@
1
- import { EventEmitter } from '@tma.js/event-emitter';
2
- import { postEvent as defaultPostEvent, request, type PostEvent } from '@tma.js/bridge';
3
-
4
- import type { Version } from '@tma.js/utils';
5
-
6
- import { createSupportsFunc, type SupportsFunc } from '../../supports.js';
7
- import { State } from '../../state/index.js';
1
+ import {
2
+ type PostEvent,
3
+ postEvent as defaultPostEvent,
4
+ request,
5
+ } from '~/bridge/index.js';
6
+ import { EventEmitter } from '~/event-emitter/index.js';
7
+ import { State } from '~/state/index.js';
8
+ import {
9
+ createSupportsFunc,
10
+ type SupportsFunc,
11
+ } from '~/supports/index.js';
12
+ import type { Version } from '~/version/index.js';
8
13
 
9
14
  import type { QRScannerEvents, QRScannerState } from './types.js';
10
15
 
@@ -16,7 +21,10 @@ export class QRScanner {
16
21
 
17
22
  private readonly state: State<QRScannerState>;
18
23
 
19
- constructor(version: Version, private readonly postEvent: PostEvent = defaultPostEvent) {
24
+ constructor(
25
+ version: Version,
26
+ private readonly postEvent: PostEvent = defaultPostEvent,
27
+ ) {
20
28
  this.state = new State({ isOpened: false }, this.ee);
21
29
  this.supports = createSupportsFunc(version, {
22
30
  close: 'web_app_close_scan_qr_popup',
@@ -73,12 +81,12 @@ export class QRScanner {
73
81
  /**
74
82
  * Adds new event listener.
75
83
  */
76
- on: typeof this.ee.on = this.ee.on.bind(this.ee);
84
+ on = this.ee.on.bind(this.ee);
77
85
 
78
86
  /**
79
87
  * Removes event listener.
80
88
  */
81
- off: typeof this.ee.off = this.ee.off.bind(this.ee);
89
+ off = this.ee.off.bind(this.ee);
82
90
 
83
91
  /**
84
92
  * Checks if specified method is supported by current component.
@@ -0,0 +1,2 @@
1
+ export * from './QRScanner.js';
2
+ export * from './types.js';
@@ -1,4 +1,4 @@
1
- import type { StateEvents } from '../../state/index.js';
1
+ import type { StateEvents } from '~/state/index.js';
2
2
 
3
3
  export interface QRScannerState {
4
4
  isOpened: boolean;
@@ -1,53 +1,67 @@
1
- import type { EventEmitter } from '@tma.js/event-emitter';
1
+ import type { EventEmitter } from '~/event-emitter/index.js';
2
+ import type { StringKeys } from '~/types/index.js';
2
3
 
3
- import type { StateEvents, StringKeys } from './types.js';
4
+ import type { StateEvents } from './types.js';
4
5
 
5
6
  /**
6
7
  * Represents state which is observable via passed EventEmitter.
7
8
  */
8
9
  export class State<S extends object> {
9
- constructor(private readonly state: S, private readonly ee?: EventEmitter<StateEvents<S>>) {
10
- }
11
-
12
- private emit(key: string, value?: unknown) {
13
- if (this.ee) {
14
- (this.ee as any).emit(key, value);
15
- }
10
+ constructor(
11
+ private readonly state: S,
12
+ private readonly ee: Pick<EventEmitter<StateEvents<S>>, 'on' | 'off' | 'emit'>,
13
+ ) {
16
14
  }
17
15
 
18
16
  private internalSet<K extends StringKeys<S>>(key: K, value: S[K]): boolean {
19
- if (this.state[key] === value) {
17
+ if (this.state[key] === value || value === undefined) {
20
18
  return false;
21
19
  }
22
20
 
23
21
  this.state[key] = value;
24
- this.emit(`${key}Changed`, value);
22
+ (this.ee as any).emit(`change:${key}`, value);
25
23
 
26
24
  return true;
27
25
  }
28
26
 
27
+ /**
28
+ * Returns copy of current state.
29
+ */
30
+ clone(): S {
31
+ return { ...this.state };
32
+ }
33
+
34
+ /**
35
+ * Sets value by key.
36
+ * @param key - state key.
37
+ * @param value - value to set.
38
+ */
29
39
  set<K extends StringKeys<S>>(key: K, value: S[K]): void;
30
40
  set(state: Partial<S>): void;
31
- set(keyOrState: any, value?: any): void {
41
+ set(keyOrState: StringKeys<S> | Partial<S>, value?: S[keyof S]): void {
32
42
  let didChange = false;
33
43
 
34
44
  if (typeof keyOrState === 'string') {
35
- didChange = this.internalSet(keyOrState as any, value);
45
+ didChange = this.internalSet(keyOrState, value as any);
36
46
  } else {
37
47
  // eslint-disable-next-line
38
48
  for (const key in keyOrState) {
39
- if (this.internalSet(key as any, keyOrState[key])) {
49
+ if (this.internalSet(key, keyOrState[key] as any)) {
40
50
  didChange = true;
41
51
  }
42
52
  }
43
53
  }
44
54
 
45
55
  if (didChange) {
46
- this.emit('changed');
56
+ (this.ee as any).emit('change');
47
57
  }
48
58
  }
49
59
 
50
- get<K extends StringKeys<S>>(key: K): Readonly<S[K]> {
60
+ /**
61
+ * Returns value by specified key.
62
+ * @param key - state key.
63
+ */
64
+ get<K extends StringKeys<S>>(key: K): S[K] {
51
65
  return this.state[key];
52
66
  }
53
67
  }
@@ -1,12 +1,9 @@
1
- /**
2
- * Computes state property changed event.
3
- */
4
- export type PropChangedEvent<K extends string> = `${K}Changed`;
1
+ import type { StringKeys } from '~/types/index.js';
5
2
 
6
3
  /**
7
- * Returns object string keys.
4
+ * Computes state property changed event.
8
5
  */
9
- export type StringKeys<T extends object> = Extract<keyof T, string>;
6
+ export type PropChangedEvent<K extends string> = `change:${K}`;
10
7
 
11
8
  /**
12
9
  * Extracts state property type by its computed change event name.
@@ -20,7 +17,7 @@ export type PropertyType<State extends object, Event extends string> = {
20
17
  * Value is according listener.
21
18
  */
22
19
  export type PropChangedEventsMap<State extends object> = {
23
- [Event in `${StringKeys<State>}Changed`]: (value: PropertyType<State, Event>) => void;
20
+ [Event in PropChangedEvent<StringKeys<State>>]: (value: PropertyType<State, Event>) => void;
24
21
  };
25
22
 
26
23
  /**
@@ -30,5 +27,5 @@ export type StateEvents<State extends object> = PropChangedEventsMap<State> & {
30
27
  /**
31
28
  * Being called whenever any property was updated.
32
29
  */
33
- changed: () => void;
30
+ change: () => void;
34
31
  };
package/src/storage.ts CHANGED
@@ -1,5 +1,7 @@
1
- import type { HeaderColorKey } from '@tma.js/bridge';
2
- import type { RGB } from '@tma.js/colors';
1
+ import type { HeaderColorKey } from '~/bridge/index.js';
2
+ import type { RGB } from '~/colors/index.js';
3
+
4
+ // fixme: components-related. Should probably rename
3
5
 
4
6
  /**
5
7
  * Describes storage keys and according values.
@@ -14,8 +16,8 @@ interface StorageParams {
14
16
  'main-button': {
15
17
  backgroundColor: RGB;
16
18
  isEnabled: boolean;
19
+ isLoaderVisible: boolean;
17
20
  isVisible: boolean;
18
- isProgressVisible: boolean;
19
21
  text: string;
20
22
  textColor: RGB;
21
23
  };
@@ -25,7 +27,7 @@ interface StorageParams {
25
27
  stableHeight: number;
26
28
  width: number;
27
29
  };
28
- 'web-app': {
30
+ 'mini-app': {
29
31
  backgroundColor: RGB;
30
32
  headerColor: HeaderColorKey | RGB;
31
33
  };
@@ -0,0 +1,18 @@
1
+ import type { MiniAppsMethodName } from '~/bridge/index.js';
2
+ import type { Version } from '~/version/index.js';
3
+
4
+ import { supports } from './supports.js';
5
+ import type { SupportsFunc } from './types.js';
6
+
7
+ /**
8
+ * Returns function, which accepts predefined method name and checks if it is supported
9
+ * via passed schema and version.
10
+ * @param schema - object which contains methods names and TWA method as a dependency.
11
+ * @param version - platform version.
12
+ */
13
+ export function createSupportsFunc<M extends string>(
14
+ version: Version,
15
+ schema: Record<M, MiniAppsMethodName>,
16
+ ): SupportsFunc<M> {
17
+ return (method) => supports(schema[method], version);
18
+ }
@@ -0,0 +1,27 @@
1
+ import type { MiniAppsMethodVersionedParams, MiniAppsMethodWithVersionedParams } from '~/bridge/index.js';
2
+ import type { Version } from '~/version/index.js';
3
+
4
+ import { supports } from './supports.js';
5
+ import type { SupportsFunc } from './types.js';
6
+
7
+ type HasCheckSupportMethodTuple = {
8
+ [M in MiniAppsMethodWithVersionedParams]: [M, MiniAppsMethodVersionedParams<M>]
9
+ }[MiniAppsMethodWithVersionedParams];
10
+
11
+ /**
12
+ * Returns function, which accepts predefined method name and checks if it is supported
13
+ * via passed schema and version.
14
+ * @param schema - object which contains methods names and TWA methods with specified parameter
15
+ * as a dependency.
16
+ * @param version - platform version.
17
+ */
18
+ export function createSupportsParamFunc<P extends string>(
19
+ version: Version,
20
+ schema: Record<P, HasCheckSupportMethodTuple>,
21
+ ): SupportsFunc<P> {
22
+ return (method) => {
23
+ const [tmaMethod, param] = schema[method];
24
+
25
+ return supports(tmaMethod, param, version);
26
+ };
27
+ }
@@ -0,0 +1,4 @@
1
+ export * from './createSupportsFunc.js';
2
+ export * from './createSupportsParamFunc.js';
3
+ export * from './supports.js';
4
+ export * from './types.js';
@@ -0,0 +1,84 @@
1
+ import {
2
+ compareVersions,
3
+ type Version,
4
+ } from '~/version/index.js';
5
+ import type {
6
+ MiniAppsMethodName,
7
+ MiniAppsMethodVersionedParams,
8
+ MiniAppsMethodWithVersionedParams,
9
+ } from '~/bridge/methods/index.js';
10
+
11
+ /**
12
+ * Returns true if "a" version is less than or equal to "b" version.
13
+ * @param a
14
+ * @param b
15
+ */
16
+ function versionLessOrEqual(a: Version, b: Version): boolean {
17
+ return compareVersions(a, b) <= 0;
18
+ }
19
+
20
+ /**
21
+ * Returns true in case, passed parameter in specified method is supported.
22
+ * @param method - method name
23
+ * @param param - method parameter
24
+ * @param inVersion - platform version.
25
+ */
26
+ export function supports<M extends MiniAppsMethodWithVersionedParams>(
27
+ method: M,
28
+ param: MiniAppsMethodVersionedParams<M>,
29
+ inVersion: Version,
30
+ ): boolean;
31
+
32
+ /**
33
+ * Returns true in case, specified method is supported in passed version.
34
+ * @param method - method name.
35
+ * @param inVersion - platform version.
36
+ */
37
+ export function supports(method: MiniAppsMethodName, inVersion: Version): boolean;
38
+
39
+ export function supports(
40
+ method: MiniAppsMethodName,
41
+ paramOrVersion: Version | string,
42
+ inVersion?: string,
43
+ ): boolean {
44
+ // Method name, parameter, target version.
45
+ if (typeof inVersion === 'string') {
46
+ if (method === 'web_app_open_link') {
47
+ if (paramOrVersion === 'try_instant_view') {
48
+ return versionLessOrEqual('6.4', inVersion);
49
+ }
50
+ }
51
+
52
+ if (method === 'web_app_set_header_color') {
53
+ if (paramOrVersion === 'color') {
54
+ return versionLessOrEqual('6.9', inVersion);
55
+ }
56
+ }
57
+ }
58
+
59
+ switch (method) {
60
+ case 'web_app_open_tg_link':
61
+ case 'web_app_open_invoice':
62
+ case 'web_app_setup_back_button':
63
+ case 'web_app_set_background_color':
64
+ case 'web_app_set_header_color':
65
+ case 'web_app_trigger_haptic_feedback':
66
+ return versionLessOrEqual('6.1', paramOrVersion);
67
+ case 'web_app_open_popup':
68
+ return versionLessOrEqual('6.2', paramOrVersion);
69
+ case 'web_app_close_scan_qr_popup':
70
+ case 'web_app_open_scan_qr_popup':
71
+ case 'web_app_read_text_from_clipboard':
72
+ return versionLessOrEqual('6.4', paramOrVersion);
73
+ case 'web_app_switch_inline_query':
74
+ return versionLessOrEqual('6.7', paramOrVersion);
75
+ case 'web_app_invoke_custom_method':
76
+ case 'web_app_request_write_access':
77
+ case 'web_app_request_phone':
78
+ return versionLessOrEqual('6.9', paramOrVersion);
79
+ case 'web_app_setup_settings_button':
80
+ return versionLessOrEqual('6.10', paramOrVersion);
81
+ default:
82
+ return true;
83
+ }
84
+ }
@@ -0,0 +1 @@
1
+ export type SupportsFunc<M extends string> = (method: M) => boolean;
@@ -0,0 +1,131 @@
1
+ import { on } from '~/bridge/index.js';
2
+ import { isColorDark, type RGB } from '~/colors/index.js';
3
+ import { EventEmitter } from '~/event-emitter/index.js';
4
+ import { State } from '~/state/index.js';
5
+
6
+ import { parseThemeParams } from './parseThemeParams.js';
7
+ import type {
8
+ ThemeParamsEvents,
9
+ ThemeParamsParsed,
10
+ ThemeParamsState,
11
+ } from './types.js';
12
+
13
+ export class ThemeParams {
14
+ private readonly ee = new EventEmitter<ThemeParamsEvents>();
15
+
16
+ private readonly state: State<ThemeParamsState>;
17
+
18
+ constructor(params: ThemeParamsParsed) {
19
+ this.state = new State(params, this.ee);
20
+ }
21
+
22
+ /**
23
+ * @since v6.10
24
+ */
25
+ get accentTextColor(): RGB | undefined {
26
+ return this.get('accentTextColor');
27
+ }
28
+
29
+ get backgroundColor(): RGB | undefined {
30
+ return this.get('backgroundColor');
31
+ }
32
+
33
+ get buttonColor(): RGB | undefined {
34
+ return this.get('buttonColor');
35
+ }
36
+
37
+ get buttonTextColor(): RGB | undefined {
38
+ return this.get('buttonTextColor');
39
+ }
40
+
41
+ get destructiveTextColor(): RGB | undefined {
42
+ return this.get('destructiveTextColor');
43
+ }
44
+
45
+ /**
46
+ * Retrieves palette color value by its name.
47
+ * @param key - palette key name.
48
+ */
49
+ get(key: Extract<keyof ThemeParamsParsed, string>): RGB | undefined {
50
+ return this.state.get(key);
51
+ }
52
+
53
+ /**
54
+ * Returns the copy of the internal state of the current component instance.
55
+ */
56
+ getState(): ThemeParamsParsed {
57
+ return this.state.clone();
58
+ }
59
+
60
+ /**
61
+ * @since v6.10
62
+ */
63
+ get headerBackgroundColor(): RGB | undefined {
64
+ return this.get('headerBackgroundColor');
65
+ }
66
+
67
+ get hintColor(): RGB | undefined {
68
+ return this.get('hintColor');
69
+ }
70
+
71
+ /**
72
+ * Returns true in case, current color scheme is recognized as dark. This
73
+ * value is calculated according to theme background color.
74
+ */
75
+ get isDark(): boolean {
76
+ return !this.backgroundColor || isColorDark(this.backgroundColor);
77
+ }
78
+
79
+ get linkColor(): RGB | undefined {
80
+ return this.get('linkColor');
81
+ }
82
+
83
+ /**
84
+ * Adds new event listener.
85
+ */
86
+ on = this.ee.on.bind(this.ee);
87
+
88
+ /**
89
+ * Removes event listener.
90
+ */
91
+ off = this.ee.off.bind(this.ee);
92
+
93
+ get secondaryBackgroundColor(): RGB | undefined {
94
+ return this.get('secondaryBackgroundColor');
95
+ }
96
+
97
+ /**
98
+ * @since v6.10
99
+ */
100
+ get sectionBackgroundColor(): RGB | undefined {
101
+ return this.get('sectionBackgroundColor');
102
+ }
103
+
104
+ /**
105
+ * @since v6.10
106
+ */
107
+ get sectionHeaderTextColor(): RGB | undefined {
108
+ return this.get('sectionHeaderTextColor');
109
+ }
110
+
111
+ /**
112
+ * Starts listening to theme changes and applies them.
113
+ * @returns Function to stop listening.
114
+ */
115
+ listen() {
116
+ return on('theme_changed', (event) => {
117
+ this.state.set(parseThemeParams(event.theme_params));
118
+ });
119
+ }
120
+
121
+ /**
122
+ * @since v6.10
123
+ */
124
+ get subtitleTextColor(): RGB | undefined {
125
+ return this.get('subtitleTextColor');
126
+ }
127
+
128
+ get textColor(): RGB | undefined {
129
+ return this.get('textColor');
130
+ }
131
+ }
@@ -0,0 +1,6 @@
1
+ export * from './parseThemeParams.js';
2
+ export * from './requestThemeParams.js';
3
+ export * from './serializeThemeParams.js';
4
+ export * from './ThemeParams.js';
5
+ export * from './themeParamsParser.js';
6
+ export * from './types.js';
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Converts palette key from Telegram application to representation used by the package.
3
+ * @param key - palette key.
4
+ */
5
+ export function keyToLocal(key: string): string {
6
+ return key
7
+ // Replace all "background" strings to "bg".
8
+ .replace(/(^|_)bg/, (_, prefix) => `${prefix}background`)
9
+ // Convert camel case to snake case.
10
+ .replace(/_([a-z])/g, (_match, letter) => letter.toUpperCase());
11
+ }
12
+
13
+ /**
14
+ * Converts palette key from local representation to representation sent from the Telegram
15
+ * application.
16
+ * @param key - palette key.
17
+ */
18
+ export function keyToExternal(key: string): string {
19
+ return key
20
+ // Convert camel case to snake case.
21
+ .replace(/[A-Z]/g, (match) => `_${match.toLowerCase()}`)
22
+ // Replace all "background" strings to "bg".
23
+ .replace(/(^|_)background/, (_, prefix) => `${prefix}bg`);
24
+ }
@@ -0,0 +1,10 @@
1
+ import { themeParamsParser } from './themeParamsParser.js';
2
+ import type { ThemeParamsParsed } from './types.js';
3
+
4
+ /**
5
+ * Parses incoming value as theme parameters.
6
+ * @param value - value to parse.
7
+ */
8
+ export function parseThemeParams(value: unknown): ThemeParamsParsed {
9
+ return themeParamsParser().parse(value);
10
+ }
@@ -0,0 +1,13 @@
1
+ import { request, type RequestOptions } from '~/bridge/index.js';
2
+
3
+ import { parseThemeParams } from './parseThemeParams.js';
4
+ import type { ThemeParamsParsed } from './types.js';
5
+
6
+ /**
7
+ * Requests current theme parameters from the Telegram application.
8
+ * @param options - request options.
9
+ */
10
+ export function requestThemeParams(options: RequestOptions = {}): Promise<ThemeParamsParsed> {
11
+ return request('web_app_request_theme', 'theme_changed', options)
12
+ .then(parseThemeParams);
13
+ }
@@ -0,0 +1,20 @@
1
+ import type { RGB } from '~/colors/index.js';
2
+
3
+ import { keyToExternal } from './keys.js';
4
+ import type { ThemeParamsParsed } from './types.js';
5
+
6
+ /**
7
+ * Serializes theme parameters to representation sent from the Telegram application.
8
+ */
9
+ export function serializeThemeParams(themeParams: ThemeParamsParsed): string {
10
+ return JSON.stringify(
11
+ Object
12
+ .entries(themeParams)
13
+ .reduce<Record<string, RGB>>((acc, [key, value]) => {
14
+ if (value) {
15
+ acc[keyToExternal(key)] = value;
16
+ }
17
+ return acc;
18
+ }, {}),
19
+ );
20
+ }
@@ -0,0 +1,20 @@
1
+ import {
2
+ createValueParserGenerator,
3
+ rgb,
4
+ toRecord,
5
+ } from '~/parsing/index.js';
6
+
7
+ import { keyToLocal } from './keys.js';
8
+ import type { ThemeParamsParsed } from './types.js';
9
+
10
+ const rgbOptional = rgb().optional();
11
+
12
+ export const themeParamsParser = createValueParserGenerator<ThemeParamsParsed>(
13
+ (value) => Object
14
+ .entries(toRecord(value))
15
+ .reduce<ThemeParamsParsed>((acc, [k, v]) => {
16
+ acc[keyToLocal(k)] = rgbOptional.parse(v);
17
+ return acc;
18
+ }, {}),
19
+ 'ThemeParams',
20
+ );
@@ -0,0 +1,33 @@
1
+ import type { RGB } from '~/colors/index.js';
2
+ import type { StateEvents } from '~/state/index.js';
3
+
4
+ export type ThemeParamsKey =
5
+ | 'accentTextColor'
6
+ | 'backgroundColor'
7
+ | 'buttonColor'
8
+ | 'buttonTextColor'
9
+ | 'destructiveTextColor'
10
+ | 'headerBackgroundColor'
11
+ | 'hintColor'
12
+ | 'linkColor'
13
+ | 'secondaryBackgroundColor'
14
+ | 'sectionBackgroundColor'
15
+ | 'sectionHeaderTextColor'
16
+ | 'subtitleTextColor'
17
+ | 'textColor';
18
+
19
+ /**
20
+ * Application [theme parameters](https://docs.telegram-mini-apps.com/platform/functionality/theming).
21
+ * Defines palette used by the Telegram application.
22
+ */
23
+ export interface ThemeParamsParsed {
24
+ [key: ThemeParamsKey | string]: RGB | undefined;
25
+ }
26
+
27
+ export type ThemeParamsState = ThemeParamsParsed;
28
+
29
+ export type ThemeParamsEvents = StateEvents<ThemeParamsState>;
30
+
31
+ export type ThemeParamsEventName = keyof ThemeParamsEvents;
32
+
33
+ export type ThemeParamsEventListener<E extends ThemeParamsEventName> = ThemeParamsEvents[E];
@@ -0,0 +1,6 @@
1
+ export class TimeoutError extends Error {
2
+ constructor(timeout: number) {
3
+ super(`Async call timeout exceeded. Timeout: ${timeout}`);
4
+ Object.setPrototypeOf(this, TimeoutError.prototype);
5
+ }
6
+ }
@@ -0,0 +1,3 @@
1
+ export * from './isTimeoutError.js';
2
+ export * from './TimeoutError.js';
3
+ export * from './withTimeout.js';
@@ -0,0 +1,9 @@
1
+ import { TimeoutError } from './TimeoutError.js';
2
+
3
+ /**
4
+ * Returns true in case, passed value is TimeoutError.
5
+ * @param value - checked value.
6
+ */
7
+ export function isTimeoutError(value: unknown): value is TimeoutError {
8
+ return value instanceof TimeoutError;
9
+ }
@@ -0,0 +1,36 @@
1
+ import { TimeoutError } from './TimeoutError.js';
2
+
3
+ type AnyAsyncFunction = (...args: any[]) => Promise<any>;
4
+
5
+ /**
6
+ * Creates promise which rejects after timeout milliseconds.
7
+ * @param timeout - timeout in milliseconds.
8
+ */
9
+ function createTimeoutPromise(timeout: number): Promise<void> {
10
+ return new Promise((_, rej) => {
11
+ setTimeout(rej, timeout, new TimeoutError(timeout));
12
+ });
13
+ }
14
+
15
+ /**
16
+ * Rejects specified promise in case, it is processed more than timeout seconds.
17
+ * @param promise - wrapped promise.
18
+ * @param timeout - timeout in milliseconds.
19
+ */
20
+ export function withTimeout<P extends Promise<any>>(promise: P, timeout: number): P;
21
+ /**
22
+ * Wraps async function in function using timeout.
23
+ * @param func - wrapped function.
24
+ * @param timeout - async function timeout.
25
+ */
26
+ export function withTimeout<F extends AnyAsyncFunction>(func: F, timeout: number): F;
27
+ export function withTimeout(funcOrPromise: Promise<any> | AnyAsyncFunction, timeout: number) {
28
+ if (typeof funcOrPromise === 'function') {
29
+ return (...args: any[]) => Promise.race([
30
+ funcOrPromise(...args),
31
+ createTimeoutPromise(timeout),
32
+ ]);
33
+ }
34
+
35
+ return Promise.race([funcOrPromise, createTimeoutPromise(timeout)]);
36
+ }