@tma.js/sdk 1.4.4 → 1.4.7

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 (298) hide show
  1. package/README.md +2 -2
  2. package/dist/dts/bridge/env/index.d.ts +0 -1
  3. package/dist/dts/bridge/events/events.d.ts +16 -16
  4. package/dist/dts/bridge/methods/methods.d.ts +27 -27
  5. package/dist/dts/bridge/methods/popup.d.ts +1 -1
  6. package/dist/dts/index.d.ts +3 -3
  7. package/dist/dts/init-data/types.d.ts +3 -3
  8. package/dist/dts/launch-params/index.d.ts +1 -4
  9. package/dist/dts/launch-params/retrieveFromLocation.d.ts +2 -2
  10. package/dist/dts/launch-params/retrieveFromPerformance.d.ts +3 -4
  11. package/dist/dts/launch-params/retrieveFromUrl.d.ts +3 -2
  12. package/dist/dts/launch-params/retrieveLaunchData.d.ts +1 -0
  13. package/dist/dts/launch-params/retrieveLaunchParams.d.ts +6 -0
  14. package/dist/dts/launch-params/storage.d.ts +3 -5
  15. package/dist/dts/launch-params/types.d.ts +1 -1
  16. package/dist/dts/{launch-params → misc}/getFirstNavigationEntry.d.ts +1 -1
  17. package/dist/dts/misc/index.d.ts +3 -0
  18. package/dist/dts/{bridge/env → misc}/isIframe.d.ts +1 -1
  19. package/dist/dts/misc/isPageReload.d.ts +5 -0
  20. package/dist/dts/theme-params/types.d.ts +1 -1
  21. package/dist/index.cjs +1 -2
  22. package/dist/index.iife.js +1 -2
  23. package/dist/index.mjs +841 -866
  24. package/package.json +2 -3
  25. package/dist/dts/launch-params/computeLaunchData.d.ts +0 -6
  26. package/dist/dts/launch-params/computePageReload.d.ts +0 -6
  27. package/dist/dts/launch-params/retrieveCurrent.d.ts +0 -5
  28. package/dist/index.cjs.map +0 -1
  29. package/dist/index.iife.js.map +0 -1
  30. package/dist/index.mjs.map +0 -1
  31. package/src/__tests__/globals.ts +0 -39
  32. package/src/back-button/BackButton.ts +0 -90
  33. package/src/back-button/__tests__/BackButton.ts +0 -129
  34. package/src/back-button/index.ts +0 -2
  35. package/src/back-button/types.ts +0 -14
  36. package/src/bridge/__tests__/parseMessage.ts +0 -23
  37. package/src/bridge/__tests__/request.ts +0 -236
  38. package/src/bridge/env/__tests__/hasExternalNotify.ts +0 -15
  39. package/src/bridge/env/__tests__/hasWebviewProxy.ts +0 -15
  40. package/src/bridge/env/__tests__/isIframe.ts +0 -30
  41. package/src/bridge/env/hasExternalNotify.ts +0 -19
  42. package/src/bridge/env/hasWebviewProxy.ts +0 -19
  43. package/src/bridge/env/index.ts +0 -3
  44. package/src/bridge/env/isIframe.ts +0 -11
  45. package/src/bridge/errors/MethodUnsupportedError.ts +0 -13
  46. package/src/bridge/errors/ParameterUnsupportedError.ts +0 -13
  47. package/src/bridge/errors/index.ts +0 -2
  48. package/src/bridge/events/__tests__/createEmitter.ts +0 -143
  49. package/src/bridge/events/__tests__/off.ts +0 -34
  50. package/src/bridge/events/__tests__/on.ts +0 -49
  51. package/src/bridge/events/__tests__/onTelegramEvent.ts +0 -49
  52. package/src/bridge/events/__tests__/once.ts +0 -64
  53. package/src/bridge/events/__tests__/singletonEmitter.ts +0 -22
  54. package/src/bridge/events/__tests__/subscribe.ts +0 -49
  55. package/src/bridge/events/__tests__/unsubscribe.ts +0 -34
  56. package/src/bridge/events/createEmitter.ts +0 -108
  57. package/src/bridge/events/events.ts +0 -170
  58. package/src/bridge/events/index.ts +0 -9
  59. package/src/bridge/events/off.ts +0 -14
  60. package/src/bridge/events/on.ts +0 -19
  61. package/src/bridge/events/onTelegramEvent.ts +0 -81
  62. package/src/bridge/events/once.ts +0 -18
  63. package/src/bridge/events/parsers/__tests__/clipboardTextReceived.ts +0 -21
  64. package/src/bridge/events/parsers/__tests__/invoiceClosed.ts +0 -12
  65. package/src/bridge/events/parsers/__tests__/popupClosed.ts +0 -10
  66. package/src/bridge/events/parsers/__tests__/qrTextReceived.ts +0 -9
  67. package/src/bridge/events/parsers/__tests__/theme-changed.ts +0 -42
  68. package/src/bridge/events/parsers/__tests__/viewportChanged.ts +0 -49
  69. package/src/bridge/events/parsers/clipboardTextReceived.ts +0 -26
  70. package/src/bridge/events/parsers/customMethodInvoked.ts +0 -25
  71. package/src/bridge/events/parsers/index.ts +0 -9
  72. package/src/bridge/events/parsers/invoiceClosed.ts +0 -26
  73. package/src/bridge/events/parsers/phoneRequested.ts +0 -14
  74. package/src/bridge/events/parsers/popupClosed.ts +0 -19
  75. package/src/bridge/events/parsers/qrTextReceived.ts +0 -14
  76. package/src/bridge/events/parsers/theme-changed.ts +0 -58
  77. package/src/bridge/events/parsers/viewportChanged.ts +0 -33
  78. package/src/bridge/events/parsers/writeAccessRequested.ts +0 -14
  79. package/src/bridge/events/singletonEmitter.ts +0 -19
  80. package/src/bridge/events/subscribe.ts +0 -15
  81. package/src/bridge/events/unsubscribe.ts +0 -10
  82. package/src/bridge/index.ts +0 -7
  83. package/src/bridge/invokeCustomMethod.ts +0 -56
  84. package/src/bridge/methods/__tests__/createPostEvent.ts +0 -37
  85. package/src/bridge/methods/__tests__/postEvent.ts +0 -137
  86. package/src/bridge/methods/createPostEvent.ts +0 -40
  87. package/src/bridge/methods/custom-methods.ts +0 -68
  88. package/src/bridge/methods/haptic.ts +0 -52
  89. package/src/bridge/methods/index.ts +0 -6
  90. package/src/bridge/methods/methods.ts +0 -370
  91. package/src/bridge/methods/popup.ts +0 -53
  92. package/src/bridge/methods/postEvent.ts +0 -101
  93. package/src/bridge/parseMessage.ts +0 -28
  94. package/src/bridge/request.ts +0 -176
  95. package/src/classnames/__tests__/classNames.ts +0 -20
  96. package/src/classnames/__tests__/mergeClassNames.ts +0 -21
  97. package/src/classnames/classNames.ts +0 -34
  98. package/src/classnames/index.ts +0 -2
  99. package/src/classnames/mergeClassNames.ts +0 -60
  100. package/src/closing-behavior/ClosingBehavior.ts +0 -64
  101. package/src/closing-behavior/__tests__/ClosingBehavior.ts +0 -86
  102. package/src/closing-behavior/index.ts +0 -2
  103. package/src/closing-behavior/types.ts +0 -12
  104. package/src/cloud-storage/CloudStorage.ts +0 -138
  105. package/src/cloud-storage/index.ts +0 -1
  106. package/src/colors/__tests__/isColorDark.ts +0 -12
  107. package/src/colors/__tests__/isRGB.ts +0 -13
  108. package/src/colors/__tests__/isRGBShort.ts +0 -13
  109. package/src/colors/__tests__/toRGB.ts +0 -23
  110. package/src/colors/index.ts +0 -5
  111. package/src/colors/isColorDark.ts +0 -22
  112. package/src/colors/isRGB.ts +0 -9
  113. package/src/colors/isRGBShort.ts +0 -9
  114. package/src/colors/toRGB.ts +0 -49
  115. package/src/colors/types.ts +0 -9
  116. package/src/css/__tests__/bindMiniAppCSSVars.ts +0 -175
  117. package/src/css/__tests__/bindThemeCSSVars.ts +0 -52
  118. package/src/css/__tests__/bindViewportCSSVars.ts +0 -55
  119. package/src/css/__tests__/setCSSVar.ts +0 -14
  120. package/src/css/bindMiniAppCSSVars.ts +0 -51
  121. package/src/css/bindThemeCSSVars.ts +0 -31
  122. package/src/css/bindViewportCSSVars.ts +0 -36
  123. package/src/css/index.ts +0 -4
  124. package/src/css/setCSSVar.ts +0 -8
  125. package/src/event-emitter/EventEmitter.ts +0 -146
  126. package/src/event-emitter/__tests__/EventEmitter.ts +0 -145
  127. package/src/event-emitter/index.ts +0 -2
  128. package/src/event-emitter/types.ts +0 -60
  129. package/src/globals.ts +0 -38
  130. package/src/haptic-feedback/HapticFeedback.ts +0 -70
  131. package/src/haptic-feedback/__tests__/HapticFeedback.ts +0 -68
  132. package/src/haptic-feedback/index.ts +0 -1
  133. package/src/index.ts +0 -185
  134. package/src/init/catchCustomStyles.ts +0 -17
  135. package/src/init/creators/__tests__/createViewport.ts +0 -96
  136. package/src/init/creators/createBackButton.ts +0 -25
  137. package/src/init/creators/createClosingBehavior.ts +0 -24
  138. package/src/init/creators/createMainButton.ts +0 -51
  139. package/src/init/creators/createMiniApp.ts +0 -48
  140. package/src/init/creators/createRequestIdGenerator.ts +0 -13
  141. package/src/init/creators/createSettingsButton.ts +0 -25
  142. package/src/init/creators/createThemeParams.ts +0 -11
  143. package/src/init/creators/createViewport.ts +0 -94
  144. package/src/init/creators/index.ts +0 -8
  145. package/src/init/css/index.ts +0 -1
  146. package/src/init/css/processCSSVarsOption.ts +0 -55
  147. package/src/init/index.ts +0 -2
  148. package/src/init/init.ts +0 -134
  149. package/src/init/types.ts +0 -94
  150. package/src/init-data/InitData.ts +0 -96
  151. package/src/init-data/__tests__/InitData.ts +0 -98
  152. package/src/init-data/__tests__/chatParser.ts +0 -102
  153. package/src/init-data/__tests__/initDataParser.ts +0 -136
  154. package/src/init-data/__tests__/parseInitData.ts +0 -136
  155. package/src/init-data/__tests__/userParser.ts +0 -96
  156. package/src/init-data/chatParser.ts +0 -19
  157. package/src/init-data/index.ts +0 -6
  158. package/src/init-data/initDataParser.ts +0 -41
  159. package/src/init-data/parseInitData.ts +0 -10
  160. package/src/init-data/types.ts +0 -164
  161. package/src/init-data/userParser.ts +0 -45
  162. package/src/invoice/Invoice.ts +0 -123
  163. package/src/invoice/index.ts +0 -2
  164. package/src/invoice/types.ts +0 -11
  165. package/src/launch-params/__tests__/retrieveFromUrl.ts +0 -19
  166. package/src/launch-params/computeLaunchData.ts +0 -81
  167. package/src/launch-params/computePageReload.ts +0 -13
  168. package/src/launch-params/getFirstNavigationEntry.ts +0 -10
  169. package/src/launch-params/index.ts +0 -13
  170. package/src/launch-params/launchParamsParser.ts +0 -45
  171. package/src/launch-params/parseLaunchParams.ts +0 -10
  172. package/src/launch-params/retrieveCurrent.ts +0 -27
  173. package/src/launch-params/retrieveFromLocation.ts +0 -10
  174. package/src/launch-params/retrieveFromPerformance.ts +0 -18
  175. package/src/launch-params/retrieveFromUrl.ts +0 -19
  176. package/src/launch-params/retrieveLaunchData.ts +0 -30
  177. package/src/launch-params/serializeLaunchParams.ts +0 -37
  178. package/src/launch-params/storage.ts +0 -33
  179. package/src/launch-params/types.ts +0 -62
  180. package/src/logger/Logger.ts +0 -72
  181. package/src/logger/__tests__/Logger.ts +0 -107
  182. package/src/logger/index.ts +0 -1
  183. package/src/main-button/MainButton.ts +0 -239
  184. package/src/main-button/__tests__/MainButton.ts +0 -346
  185. package/src/main-button/index.ts +0 -2
  186. package/src/main-button/types.ts +0 -26
  187. package/src/mini-app/MiniApp.ts +0 -348
  188. package/src/mini-app/__tests__/MiniApp.ts +0 -140
  189. package/src/mini-app/contactParser.ts +0 -29
  190. package/src/mini-app/index.ts +0 -2
  191. package/src/mini-app/types.ts +0 -38
  192. package/src/misc/__tests__/isRecord.ts +0 -21
  193. package/src/misc/index.ts +0 -2
  194. package/src/misc/isRecord.ts +0 -7
  195. package/src/misc/isTMA.ts +0 -13
  196. package/src/navigation/HashNavigator/HashNavigator.ts +0 -220
  197. package/src/navigation/HashNavigator/__tests__/HashNavigator.ts +0 -144
  198. package/src/navigation/HashNavigator/__tests__/drop.ts +0 -42
  199. package/src/navigation/HashNavigator/__tests__/go.ts +0 -9
  200. package/src/navigation/HashNavigator/drop.ts +0 -36
  201. package/src/navigation/HashNavigator/go.ts +0 -28
  202. package/src/navigation/HashNavigator/index.ts +0 -2
  203. package/src/navigation/HashNavigator/types.ts +0 -41
  204. package/src/navigation/Navigator/Navigator.ts +0 -282
  205. package/src/navigation/Navigator/index.ts +0 -2
  206. package/src/navigation/Navigator/types.ts +0 -55
  207. package/src/navigation/ensurePrefix.ts +0 -9
  208. package/src/navigation/getHash.ts +0 -17
  209. package/src/navigation/index.ts +0 -4
  210. package/src/parsing/ArrayValueParser.ts +0 -79
  211. package/src/parsing/ParseError.ts +0 -27
  212. package/src/parsing/ParseSchemaFieldError.ts +0 -21
  213. package/src/parsing/ValueParser.ts +0 -71
  214. package/src/parsing/__tests__/ArrayValueParser.ts +0 -18
  215. package/src/parsing/__tests__/toRecord.ts +0 -10
  216. package/src/parsing/createValueParserGenerator.ts +0 -16
  217. package/src/parsing/index.ts +0 -10
  218. package/src/parsing/parseBySchema.ts +0 -65
  219. package/src/parsing/parsers/__tests__/array.ts +0 -39
  220. package/src/parsing/parsers/__tests__/boolean.ts +0 -31
  221. package/src/parsing/parsers/__tests__/date.ts +0 -25
  222. package/src/parsing/parsers/__tests__/json.ts +0 -80
  223. package/src/parsing/parsers/__tests__/number.ts +0 -23
  224. package/src/parsing/parsers/__tests__/rgb.ts +0 -22
  225. package/src/parsing/parsers/__tests__/searchParams.ts +0 -105
  226. package/src/parsing/parsers/__tests__/string.ts +0 -25
  227. package/src/parsing/parsers/array.ts +0 -9
  228. package/src/parsing/parsers/boolean.ts +0 -22
  229. package/src/parsing/parsers/date.ts +0 -11
  230. package/src/parsing/parsers/index.ts +0 -8
  231. package/src/parsing/parsers/json.ts +0 -17
  232. package/src/parsing/parsers/number.ts +0 -21
  233. package/src/parsing/parsers/rgb.ts +0 -10
  234. package/src/parsing/parsers/searchParams.ts +0 -24
  235. package/src/parsing/parsers/string.ts +0 -12
  236. package/src/parsing/toRecord.ts +0 -27
  237. package/src/parsing/types.ts +0 -32
  238. package/src/parsing/unexpectedTypeError.ts +0 -6
  239. package/src/popup/Popup.ts +0 -91
  240. package/src/popup/__tests__/Popup.ts +0 -130
  241. package/src/popup/__tests__/preparePopupParams.ts +0 -85
  242. package/src/popup/index.ts +0 -2
  243. package/src/popup/preparePopupParams.ts +0 -59
  244. package/src/popup/types.ts +0 -69
  245. package/src/qr-scanner/QRScanner.ts +0 -95
  246. package/src/qr-scanner/index.ts +0 -2
  247. package/src/qr-scanner/types.ts +0 -11
  248. package/src/settings-button/SettingsButton.ts +0 -85
  249. package/src/settings-button/index.ts +0 -2
  250. package/src/settings-button/types.ts +0 -15
  251. package/src/state/State.ts +0 -67
  252. package/src/state/index.ts +0 -2
  253. package/src/state/types.ts +0 -31
  254. package/src/storage.ts +0 -69
  255. package/src/supports/__tests__/supports.ts +0 -123
  256. package/src/supports/createSupportsFunc.ts +0 -18
  257. package/src/supports/createSupportsParamFunc.ts +0 -27
  258. package/src/supports/index.ts +0 -4
  259. package/src/supports/supports.ts +0 -84
  260. package/src/supports/types.ts +0 -1
  261. package/src/theme-params/ThemeParams.ts +0 -131
  262. package/src/theme-params/__tests__/keys.ts +0 -19
  263. package/src/theme-params/__tests__/parseThemeParams.ts +0 -29
  264. package/src/theme-params/__tests__/serializeThemeParams.ts +0 -29
  265. package/src/theme-params/__tests__/themeParamsParser.ts +0 -29
  266. package/src/theme-params/index.ts +0 -6
  267. package/src/theme-params/keys.ts +0 -24
  268. package/src/theme-params/parseThemeParams.ts +0 -10
  269. package/src/theme-params/requestThemeParams.ts +0 -13
  270. package/src/theme-params/serializeThemeParams.ts +0 -20
  271. package/src/theme-params/themeParamsParser.ts +0 -22
  272. package/src/theme-params/types.ts +0 -33
  273. package/src/timeout/TimeoutError.ts +0 -6
  274. package/src/timeout/__tests__/isTimeoutError.ts +0 -9
  275. package/src/timeout/__tests__/withTimeout.ts +0 -28
  276. package/src/timeout/index.ts +0 -4
  277. package/src/timeout/isTimeoutError.ts +0 -9
  278. package/src/timeout/sleep.ts +0 -10
  279. package/src/timeout/withTimeout.ts +0 -24
  280. package/src/types/index.ts +0 -4
  281. package/src/types/methods.ts +0 -18
  282. package/src/types/platform.ts +0 -14
  283. package/src/types/request-id.ts +0 -10
  284. package/src/types/utils.ts +0 -50
  285. package/src/utils/Utils.ts +0 -107
  286. package/src/utils/index.ts +0 -1
  287. package/src/version/__tests__/compareVersions.ts +0 -19
  288. package/src/version/compareVersions.ts +0 -28
  289. package/src/version/index.ts +0 -2
  290. package/src/version/types.ts +0 -4
  291. package/src/viewport/Viewport.ts +0 -171
  292. package/src/viewport/__tests__/isStableViewportPlatform.ts +0 -15
  293. package/src/viewport/__tests__/utils.ts +0 -12
  294. package/src/viewport/index.ts +0 -4
  295. package/src/viewport/isStableViewportPlatform.ts +0 -10
  296. package/src/viewport/requestViewport.ts +0 -23
  297. package/src/viewport/types.ts +0 -23
  298. package/src/viewport/utils.ts +0 -7
@@ -1,39 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
-
3
- import {
4
- logger,
5
- setDebug,
6
- setTargetOrigin,
7
- targetOrigin,
8
- } from '../globals';
9
-
10
- afterEach(() => {
11
- vi.restoreAllMocks();
12
- });
13
-
14
- describe('logger', () => {
15
- it('should log message in case, debug mode is enabled. Otherwise no output should be shown', () => {
16
- const spy = vi
17
- .spyOn(console, 'log')
18
- .mockImplementation(() => {
19
- });
20
-
21
- logger.log(123);
22
- expect(spy).not.toHaveBeenCalled();
23
-
24
- setDebug(true);
25
- logger.log('Some log');
26
- expect(spy).toHaveBeenCalledTimes(1);
27
-
28
- setDebug(false);
29
- logger.log('Another log');
30
- expect(spy).toHaveBeenCalledTimes(1);
31
- });
32
- });
33
-
34
- describe('setTargetOrigin', () => {
35
- it('should return set value via targetOrigin() function', () => {
36
- setTargetOrigin('my test');
37
- expect(targetOrigin()).toEqual('my test');
38
- });
39
- });
@@ -1,90 +0,0 @@
1
- import {
2
- off,
3
- on,
4
- type PostEvent,
5
- postEvent as defaultPostEvent,
6
- } from '~/bridge/index.js';
7
- import { EventEmitter } from '~/event-emitter/index.js';
8
- import { State } from '~/state/index.js';
9
- import { createSupportsFunc, type SupportsFunc } from '~/supports/index.js';
10
- import type { Version } from '~/version/index.js';
11
-
12
- import type { BackButtonEvents, BackButtonState } from './types.js';
13
-
14
- type Emitter = EventEmitter<BackButtonEvents>;
15
-
16
- /**
17
- * Class which controls the back button displayed in the header of the Mini App in the Telegram
18
- * interface. It is mostly used in case, when you want to provide a way to go bach in routing
19
- * history or "rollback" some action.
20
- */
21
- export class BackButton {
22
- private readonly ee: Emitter = new EventEmitter();
23
-
24
- private readonly state: State<BackButtonState>;
25
-
26
- constructor(
27
- isVisible: boolean,
28
- version: Version,
29
- private readonly postEvent: PostEvent = defaultPostEvent,
30
- ) {
31
- this.state = new State({ isVisible }, this.ee);
32
- this.supports = createSupportsFunc(version, {
33
- show: 'web_app_setup_back_button',
34
- hide: 'web_app_setup_back_button',
35
- });
36
- }
37
-
38
- private set isVisible(visible: boolean) {
39
- this.state.set('isVisible', visible);
40
- this.postEvent('web_app_setup_back_button', { is_visible: visible });
41
- }
42
-
43
- /**
44
- * True if BackButton is currently visible.
45
- */
46
- get isVisible(): boolean {
47
- return this.state.get('isVisible');
48
- }
49
-
50
- /**
51
- * Hides the BackButton.
52
- */
53
- hide(): void {
54
- this.isVisible = false;
55
- }
56
-
57
- /**
58
- * Adds event listener.
59
- * @param event - event name.
60
- * @param listener - event listener.
61
- */
62
- on: Emitter['on'] = (event, listener) => (
63
- event === 'click'
64
- ? on('back_button_pressed', listener)
65
- : this.ee.on(event, listener)
66
- );
67
-
68
- /**
69
- * Removes event listener.
70
- * @param event - event name.
71
- * @param listener - event listener.
72
- */
73
- off: Emitter['off'] = (event, listener) => (
74
- event === 'click'
75
- ? off('back_button_pressed', listener)
76
- : this.ee.off(event, listener)
77
- );
78
-
79
- /**
80
- * Shows the BackButton.
81
- */
82
- show(): void {
83
- this.isVisible = true;
84
- }
85
-
86
- /**
87
- * Checks if specified method is supported by current component.
88
- */
89
- supports: SupportsFunc<'show' | 'hide'>;
90
- }
@@ -1,129 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
-
3
- import { BackButton } from '../BackButton';
4
-
5
- describe('hide', () => {
6
- it('should call "web_app_setup_back_button" method with "is_visible" equal to false', () => {
7
- const postEvent = vi.fn();
8
- const backButton = new BackButton(false, '', postEvent);
9
-
10
- expect(postEvent).toHaveBeenCalledTimes(0);
11
- backButton.hide();
12
- expect(postEvent).toHaveBeenCalledTimes(1);
13
- expect(postEvent).toHaveBeenCalledWith('web_app_setup_back_button', { is_visible: false });
14
- });
15
-
16
- it('should emit "isVisibleChanged" event with false value', () => {
17
- const backButton = new BackButton(true, '', vi.fn());
18
- const listener = vi.fn();
19
-
20
- backButton.on('change:isVisible', listener);
21
- expect(listener).toHaveBeenCalledTimes(0);
22
- backButton.hide();
23
- expect(listener).toHaveBeenCalledTimes(1);
24
- expect(listener).toHaveBeenCalledWith(false);
25
- });
26
- });
27
-
28
- describe('show', () => {
29
- it('should call "web_app_setup_back_button" method with "is_visible" equal to true', () => {
30
- const postEvent = vi.fn();
31
- const backButton = new BackButton(false, '', postEvent);
32
-
33
- expect(postEvent).toHaveBeenCalledTimes(0);
34
- backButton.show();
35
- expect(postEvent).toHaveBeenCalledTimes(1);
36
- expect(postEvent).toHaveBeenCalledWith('web_app_setup_back_button', { is_visible: true });
37
- });
38
-
39
- it('should emit "isVisibleChanged" event with true value', () => {
40
- const backButton = new BackButton(false, '', vi.fn());
41
- const listener = vi.fn();
42
-
43
- backButton.on('change:isVisible', listener);
44
- expect(listener).toHaveBeenCalledTimes(0);
45
- backButton.show();
46
- expect(listener).toHaveBeenCalledTimes(1);
47
- expect(listener).toHaveBeenCalledWith(true);
48
- });
49
- });
50
-
51
- // FIXME
52
- // it('on', () => {
53
- // it('"click" event', () => {
54
- // it('should add event listener to bridge\'s '
55
- // + '"back_button_pressed" event', () => {
56
- // const on = vi.fn();
57
- // const backButton = new BackButton({ on } as any, '');
58
- // const listener = vi.fn();
59
- //
60
- // expect(on).toHaveBeenCalledTimes(0);
61
- // backButton.on('click', listener);
62
- // expect(on).toHaveBeenCalledTimes(1);
63
- // expect(on).toHaveBeenCalledWith('back_button_pressed', listener);
64
- // });
65
- // });
66
- // });
67
-
68
- describe('off', () => {
69
- // FIXME
70
- // it('"click" event', () => {
71
- // it('should remove event listener from bridge\'s '
72
- // + '"back_button_pressed" event', () => {
73
- // const on = vi.fn();
74
- // const off = vi.fn();
75
- // const backButton = new BackButton({ on, off } as any, '');
76
- // const listener = vi.fn();
77
- //
78
- // expect(on).toHaveBeenCalledTimes(0);
79
- // backButton.on('click', listener);
80
- // expect(on).toHaveBeenCalledTimes(1);
81
- // expect(on).toHaveBeenCalledWith('back_button_pressed', listener);
82
- //
83
- // // TODO: We should probably emit back_button_pressed event to
84
- // // make sure, listener was removed.
85
- //
86
- // expect(off).toHaveBeenCalledTimes(0);
87
- // backButton.off('click', listener);
88
- // expect(off).toHaveBeenCalledTimes(1);
89
- // expect(off).toHaveBeenCalledWith('back_button_pressed', listener);
90
- // });
91
- // });
92
-
93
- describe('"isVisibleChanged" event', () => {
94
- it('should remove event listener from event', () => {
95
- const listener = vi.fn();
96
- const backButton = new BackButton(false, '', vi.fn());
97
-
98
- backButton.on('change:isVisible', listener);
99
-
100
- expect(listener).toHaveBeenCalledTimes(0);
101
- backButton.show();
102
- expect(listener).toHaveBeenCalledTimes(1);
103
-
104
- backButton.off('change:isVisible', listener);
105
-
106
- expect(listener).toHaveBeenCalledTimes(1);
107
- backButton.hide();
108
- expect(listener).toHaveBeenCalledTimes(1);
109
- });
110
- });
111
- });
112
-
113
- describe('supports', () => {
114
- describe('show / hide', () => {
115
- it('should return true in case, BackButton version is 6.1 or higher. False, otherwise', () => {
116
- const backButton1 = new BackButton(false, '6.0');
117
- expect(backButton1.supports('show')).toBe(false);
118
- expect(backButton1.supports('hide')).toBe(false);
119
-
120
- const backButton2 = new BackButton(false, '6.1');
121
- expect(backButton2.supports('show')).toBe(true);
122
- expect(backButton2.supports('hide')).toBe(true);
123
-
124
- const backButton3 = new BackButton(false, '6.2');
125
- expect(backButton3.supports('show')).toBe(true);
126
- expect(backButton3.supports('hide')).toBe(true);
127
- });
128
- });
129
- });
@@ -1,2 +0,0 @@
1
- export * from './BackButton.js';
2
- export * from './types.js';
@@ -1,14 +0,0 @@
1
- import type { MiniAppsEventListener } from '~/bridge/index.js';
2
- import type { StateEvents } from '~/state/index.js';
3
-
4
- export interface BackButtonState {
5
- isVisible: boolean;
6
- }
7
-
8
- export interface BackButtonEvents extends StateEvents<BackButtonState> {
9
- click: MiniAppsEventListener<'main_button_pressed'>;
10
- }
11
-
12
- export type BackButtonEventName = keyof BackButtonEvents;
13
-
14
- export type BackButtonEventListener<E extends BackButtonEventName> = BackButtonEvents[E];
@@ -1,23 +0,0 @@
1
- import { it, expect } from 'vitest';
2
-
3
- import { parseMessage } from '../parseMessage';
4
-
5
- it('should parse value as JSON with properties { eventType: string; eventData?: unknown }', () => {
6
- expect(parseMessage({ eventType: 1 })).toEqual({ eventType: '1' });
7
- expect(parseMessage({ eventType: 'test' })).toEqual({ eventType: 'test' });
8
- expect(parseMessage({ eventType: 'test', eventData: 123 })).toEqual({
9
- eventType: 'test',
10
- eventData: 123,
11
- });
12
-
13
- expect(parseMessage('{"eventType":1}')).toEqual({ eventType: '1' });
14
- expect(parseMessage('{"eventType":"test"}')).toEqual({ eventType: 'test' });
15
- expect(parseMessage('{"eventType":"test","eventData":123}')).toEqual({
16
- eventType: 'test',
17
- eventData: 123,
18
- });
19
- });
20
-
21
- it('should throw if eventType property is missing', () => {
22
- expect(() => parseMessage({})).toThrow();
23
- });
@@ -1,236 +0,0 @@
1
- /* eslint-disable */
2
- import {
3
- expect,
4
- it,
5
- vi,
6
- SpyInstance,
7
- beforeEach,
8
- afterEach,
9
- describe,
10
- beforeAll,
11
- afterAll,
12
- } from 'vitest';
13
-
14
- import { request } from '../request';
15
- import { type PostEvent, postEvent as globalPostEvent } from '../methods/postEvent';
16
- import { createWindow } from '../../../test-utils/createWindow';
17
- import { dispatchWindowMessageEvent } from '../../../test-utils/dispatchWindowMessageEvent';
18
-
19
- vi.mock('../methods/postEvent.js', async () => {
20
- const { postEvent: actualPostEvent } = await vi
21
- .importActual('../methods/postEvent.js') as { postEvent: PostEvent };
22
-
23
- return {
24
- postEvent: vi.fn(actualPostEvent),
25
- };
26
- });
27
-
28
- let windowSpy: SpyInstance<[], Window & typeof globalThis>;
29
-
30
- beforeAll(() => {
31
- vi.useFakeTimers();
32
- });
33
-
34
- afterAll(() => {
35
- vi.useRealTimers();
36
- });
37
-
38
- beforeEach(() => {
39
- windowSpy = createWindow({ env: 'iframe' });
40
- });
41
-
42
- afterEach(() => {
43
- windowSpy.mockRestore();
44
- });
45
-
46
- function emptyCatch() {
47
-
48
- }
49
-
50
- describe('options', () => {
51
- describe('timeout', () => {
52
- it('should throw an error in case, timeout was reached', () => {
53
- const promise = request('web_app_request_phone', 'phone_requested', {
54
- timeout: 1000,
55
- });
56
-
57
- vi.advanceTimersByTime(1500);
58
-
59
- return promise.catch(emptyCatch).finally(() => {
60
- expect(promise).rejects.toEqual(new Error('Async call timeout exceeded. Timeout: 1000'));
61
- });
62
- });
63
-
64
- it('should not throw an error in case, data was received before timeout', () => {
65
- const promise = request('web_app_request_phone', 'phone_requested', {
66
- timeout: 1000,
67
- });
68
-
69
- vi.advanceTimersByTime(500);
70
- dispatchWindowMessageEvent('phone_requested', { status: 'allowed' });
71
- vi.advanceTimersByTime(1000);
72
-
73
- return promise.catch(emptyCatch).finally(() => {
74
- expect(promise).resolves.toStrictEqual({ status: 'allowed' });
75
- });
76
- });
77
- });
78
-
79
- describe('postEvent', () => {
80
- it('should use specified postEvent property', () => {
81
- const postEvent = vi.fn();
82
- request('web_app_request_phone', 'phone_requested', { postEvent });
83
- expect(postEvent).toHaveBeenCalledWith('web_app_request_phone', undefined);
84
- });
85
-
86
- it('should use global postEvent function if according property was not specified', () => {
87
- request('web_app_request_phone', 'phone_requested');
88
- expect(globalPostEvent).toHaveBeenCalledWith('web_app_request_phone', undefined);
89
- });
90
-
91
- it('should reject promise in case, postEvent threw an error', () => {
92
- const promise = request('web_app_request_phone', 'phone_requested', {
93
- postEvent: () => {
94
- throw new Error('Nope!');
95
- },
96
- });
97
- expect(promise).rejects.toStrictEqual(Error('Nope!'));
98
- });
99
- });
100
-
101
- describe('capture', () => {
102
- it('should capture an event in case, capture method returned true', () => {
103
- const promise = request('web_app_request_phone', 'phone_requested', {
104
- timeout: 1000,
105
- capture: ({ status }) => status === 'allowed',
106
- });
107
-
108
- vi.advanceTimersByTime(500);
109
- dispatchWindowMessageEvent('phone_requested', { status: 'allowed' });
110
- vi.advanceTimersByTime(1000);
111
-
112
- return promise.catch(emptyCatch).finally(() => {
113
- expect(promise).resolves.toStrictEqual({ status: 'allowed' });
114
- });
115
- });
116
-
117
- it('should not capture an event in case, capture method returned false', () => {
118
- const promise = request('web_app_request_phone', 'phone_requested', {
119
- timeout: 500,
120
- capture: ({ status }) => status === 'allowed',
121
- });
122
-
123
- dispatchWindowMessageEvent('phone_requested', { status: 'declined' });
124
- vi.advanceTimersByTime(1000);
125
-
126
- return promise.catch(emptyCatch).finally(() => {
127
- expect(promise).rejects.toEqual(new Error('Async call timeout exceeded. Timeout: 500'));
128
- });
129
- });
130
- });
131
- });
132
-
133
- describe('with request id', () => {
134
- it('should ignore event with the different request id', () => {
135
- const promise = request('web_app_read_text_from_clipboard', { req_id: 'a' }, 'clipboard_text_received', {
136
- timeout: 1000,
137
- });
138
-
139
- dispatchWindowMessageEvent('clipboard_text_received', { req_id: 'b' });
140
- vi.advanceTimersByTime(1500);
141
-
142
- return promise.catch(emptyCatch).finally(() => {
143
- expect(promise).rejects.toEqual(new Error('Async call timeout exceeded. Timeout: 1000'));
144
- });
145
- });
146
-
147
- it('should capture event with the same request id', () => {
148
- const promise = request('web_app_read_text_from_clipboard', { req_id: 'a' }, 'clipboard_text_received', {
149
- timeout: 1000,
150
- });
151
-
152
- dispatchWindowMessageEvent('clipboard_text_received', {
153
- req_id: 'a',
154
- data: 'from clipboard',
155
- });
156
- vi.advanceTimersByTime(1500);
157
-
158
- return promise.catch(emptyCatch).finally(() => {
159
- expect(promise).resolves.toStrictEqual({
160
- req_id: 'a',
161
- data: 'from clipboard',
162
- });
163
- });
164
- });
165
- });
166
-
167
- describe('multiple events', () => {
168
- describe('no params', () => {
169
- it('should handle any of the specified events', () => {
170
- const promise = request(
171
- 'web_app_request_phone',
172
- ['phone_requested', 'write_access_requested'],
173
- { timeout: 1000 },
174
- );
175
- const promise2 = request(
176
- 'web_app_request_phone',
177
- ['phone_requested', 'write_access_requested'],
178
- { timeout: 1000 },
179
- );
180
-
181
- dispatchWindowMessageEvent('phone_requested', { status: 'allowed' });
182
- dispatchWindowMessageEvent('write_access_requested', { status: 'declined' });
183
- vi.advanceTimersByTime(1500);
184
-
185
- return Promise
186
- .all([promise, promise2])
187
- .catch(emptyCatch)
188
- .finally(() => {
189
- expect(promise).resolves.toStrictEqual({ status: 'allowed' });
190
- expect(promise2).resolves.toStrictEqual({ status: 'declined' });
191
- });
192
- });
193
- });
194
-
195
- describe('with params', () => {
196
- it('should handle any of the specified events', () => {
197
- const promise = request(
198
- 'web_app_data_send',
199
- { data: 'abc' },
200
- ['phone_requested', 'write_access_requested'],
201
- { timeout: 1000 },
202
- );
203
- const promise2 = request(
204
- 'web_app_data_send',
205
- { data: 'abc' },
206
- ['phone_requested', 'write_access_requested'],
207
- { timeout: 1000 },
208
- );
209
-
210
- dispatchWindowMessageEvent('phone_requested', { status: 'allowed' });
211
- dispatchWindowMessageEvent('write_access_requested', { status: 'declined' });
212
- vi.advanceTimersByTime(1500);
213
-
214
- return Promise
215
- .all([promise, promise2])
216
- .catch(emptyCatch)
217
- .finally(() => {
218
- expect(promise).resolves.toStrictEqual({ status: 'allowed' });
219
- expect(promise2).resolves.toStrictEqual({ status: 'declined' });
220
- });
221
- });
222
- });
223
- });
224
-
225
- // it('no params methods', () => {
226
- // it('should properly handle ')
227
- // });
228
-
229
- // it('with request id', () => {
230
- // const promise = request('web_app_read_text_from_clipboard', { req_id: 'a' }, 'clipboard_text_received');
231
- //
232
- // dispatchWindowEvent('clipboard_text_received', { req_id: 'b' });
233
- // expect(promise).resolves.toHaveLength(0);
234
- // dispatchWindowEvent('clipboard_text_received', { req_id: 'a' });
235
- // expect(promise).resolves.toHaveLength(1);
236
- // });
@@ -1,15 +0,0 @@
1
- import { expect, it } from 'vitest';
2
-
3
- import { hasExternalNotify } from '../hasExternalNotify.js';
4
-
5
- it('should return true if passed object contains path property "external.notify" and "notify" is a function property.', () => {
6
- expect(hasExternalNotify({})).toBe(false);
7
- expect(hasExternalNotify({ external: {} })).toBe(false);
8
- expect(hasExternalNotify({ external: { notify: [] } })).toBe(false);
9
- expect(hasExternalNotify({
10
- external: {
11
- notify: () => {
12
- },
13
- },
14
- })).toBe(true);
15
- });
@@ -1,15 +0,0 @@
1
- import { expect, it } from 'vitest';
2
-
3
- import { hasWebviewProxy } from '../hasWebviewProxy.js';
4
-
5
- it('should return true if passed object contains path property "TelegramWebviewProxy.postEvent" and "postEvent" is a function property.', () => {
6
- expect(hasWebviewProxy({})).toBe(false);
7
- expect(hasWebviewProxy({ TelegramWebviewProxy: {} })).toBe(false);
8
- expect(hasWebviewProxy({ TelegramWebviewProxy: { postEvent: [] } })).toBe(false);
9
- expect(hasWebviewProxy({
10
- TelegramWebviewProxy: {
11
- postEvent: () => {
12
- },
13
- },
14
- })).toBe(true);
15
- });
@@ -1,30 +0,0 @@
1
- import { afterAll, afterEach, expect, it, vi } from 'vitest';
2
-
3
- import { isIframe } from '../isIframe.js';
4
-
5
- const windowSpy = vi.spyOn(window, 'window', 'get');
6
-
7
- afterEach(() => {
8
- windowSpy.mockReset();
9
- });
10
-
11
- afterAll(() => {
12
- windowSpy.mockRestore();
13
- });
14
-
15
- it('should return true in case window.self !== window.top. Otherwise, false.', () => {
16
- windowSpy.mockImplementation(() => ({ self: 900, top: 1000 }) as any);
17
- expect(isIframe()).toBe(true);
18
-
19
- windowSpy.mockImplementation(() => ({ self: 900, top: 900 }) as any);
20
- expect(isIframe()).toBe(false);
21
- });
22
-
23
- it('should return true in case window.self getter threw an error', () => {
24
- windowSpy.mockImplementation(() => ({
25
- get self() {
26
- throw new Error();
27
- },
28
- }) as any);
29
- expect(isIframe()).toBe(true);
30
- });
@@ -1,19 +0,0 @@
1
- import { isRecord } from '~/misc/index.js';
2
-
3
- type WithExternalNotify<T> = T & {
4
- external: {
5
- notify: (...args: any) => any;
6
- };
7
- };
8
-
9
- /**
10
- * Returns true in case, passed value contains path `external.notify` property and `notify` is a
11
- * function.
12
- * @param value - value to check.
13
- */
14
- export function hasExternalNotify<T extends {}>(value: T): value is WithExternalNotify<T> {
15
- return 'external' in value
16
- && isRecord(value.external)
17
- && 'notify' in value.external
18
- && typeof value.external.notify === 'function';
19
- }
@@ -1,19 +0,0 @@
1
- import { isRecord } from '~/misc/index.js';
2
-
3
- type WithWebviewProxy<T> = T & {
4
- TelegramWebviewProxy: {
5
- postEvent: (...args: any) => any;
6
- }
7
- };
8
-
9
- /**
10
- * Returns true in case, passed value contains path `TelegramWebviewProxy.postEvent` property and
11
- * `postEvent` is a function.
12
- * @param value - value to check.
13
- */
14
- export function hasWebviewProxy<T extends {}>(value: T): value is WithWebviewProxy<T> {
15
- return 'TelegramWebviewProxy' in value
16
- && isRecord(value.TelegramWebviewProxy)
17
- && 'postEvent' in value.TelegramWebviewProxy
18
- && typeof value.TelegramWebviewProxy.postEvent === 'function';
19
- }
@@ -1,3 +0,0 @@
1
- export * from './hasExternalNotify.js';
2
- export * from './hasWebviewProxy.js';
3
- export * from './isIframe.js';
@@ -1,11 +0,0 @@
1
- /**
2
- * Returns true in case, current environment is iframe.
3
- * @see https://stackoverflow.com/a/326076
4
- */
5
- export function isIframe(): boolean {
6
- try {
7
- return window.self !== window.top;
8
- } catch (e) {
9
- return true;
10
- }
11
- }
@@ -1,13 +0,0 @@
1
- import type { Version } from '~/version/index.js';
2
-
3
- import type { MiniAppsMethodName } from '../methods/index.js';
4
-
5
- /**
6
- * Error thrown in case, unsupported method was called.
7
- */
8
- export class MethodUnsupportedError extends Error {
9
- constructor(method: MiniAppsMethodName, version: Version) {
10
- super(`Method "${method}" is unsupported in the Mini Apps version ${version}.`);
11
- Object.setPrototypeOf(this, MethodUnsupportedError.prototype);
12
- }
13
- }