@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,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 parameter was used.
7
- */
8
- export class ParameterUnsupportedError extends Error {
9
- constructor(method: MiniAppsMethodName, param: string, version: Version) {
10
- super(`Parameter "${param}" in method "${method}" is unsupported in the Mini Apps version ${version}.`);
11
- Object.setPrototypeOf(this, ParameterUnsupportedError.prototype);
12
- }
13
- }
@@ -1,2 +0,0 @@
1
- export * from './MethodUnsupportedError.js';
2
- export * from './ParameterUnsupportedError.js';
@@ -1,143 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
-
3
- import { createWindow, type WindowSpy } from '../../../../test-utils/createWindow';
4
- import { dispatchWindowMessageEvent } from '../../../../test-utils/dispatchWindowMessageEvent';
5
- import { createEmitter } from '../createEmitter';
6
- import type { MiniAppsEventName, MiniAppsEventParams } from '../events';
7
-
8
- type TestCase<E extends MiniAppsEventName> =
9
- | [input: any, expected: MiniAppsEventParams<E>]
10
- | MiniAppsEventParams<E>;
11
-
12
- type TestCases = {
13
- [E in MiniAppsEventName]: MiniAppsEventParams<E> extends undefined
14
- ? [E]
15
- : [E, TestCase<E> | TestCase<E>[]];
16
- }[MiniAppsEventName][];
17
-
18
- let windowSpy: WindowSpy;
19
-
20
- beforeEach(() => {
21
- windowSpy = createWindow({
22
- innerWidth: 1920,
23
- innerHeight: 1080,
24
- });
25
- });
26
-
27
- afterEach(() => {
28
- windowSpy.mockRestore();
29
- });
30
-
31
- it('should emit "viewport_changed" event in case, window changed its size', () => {
32
- const emitter = createEmitter();
33
- const spy = vi.fn();
34
-
35
- emitter.on('viewport_changed', spy);
36
-
37
- window.dispatchEvent(new CustomEvent('resize'));
38
-
39
- expect(spy).toHaveBeenCalledTimes(1);
40
- expect(spy).toHaveBeenCalledWith({
41
- width: 1920,
42
- height: 1080,
43
- is_state_stable: true,
44
- is_expanded: true,
45
- });
46
- });
47
-
48
- describe('events handling', () => {
49
- const testCases: TestCases = [
50
- ['viewport_changed', {
51
- height: 120,
52
- width: 300,
53
- is_expanded: true,
54
- is_state_stable: false,
55
- }],
56
- ['theme_changed', {
57
- theme_params: {
58
- bg_color: '#aabbdd',
59
- text_color: '#113322',
60
- hint_color: '#132245',
61
- link_color: '#133322',
62
- button_color: '#a23135',
63
- button_text_color: '#aa213f',
64
- },
65
- }],
66
- ['popup_closed', [
67
- [{ button_id: 'ok' }, { button_id: 'ok' }],
68
- [{ button_id: null }, {}],
69
- [{ button_id: undefined }, {}],
70
- [null, {}],
71
- [undefined, {}],
72
- ]],
73
- ['set_custom_style', '.scroll {}'],
74
- ['qr_text_received', { data: 'some QR data' }],
75
- ['main_button_pressed'],
76
- ['back_button_pressed'],
77
- ['settings_button_pressed'],
78
- ['scan_qr_popup_closed'],
79
- ['clipboard_text_received', {
80
- req_id: 'request id',
81
- data: 'clipboard value',
82
- }],
83
- ['invoice_closed', { slug: '&&*Sh1j213kx', status: 'PAID' }],
84
- ['phone_requested', { status: 'sent' }],
85
- ['custom_method_invoked', [
86
- [{ req_id: '1', result: 'My result' }],
87
- [{ req_id: '2', error: 'Something is wrong' }],
88
- ]],
89
- ['write_access_requested', { status: 'allowed' }],
90
- ['unknown_event', [
91
- ['hello', 'hello'],
92
- [{ there: true }, { there: true }],
93
- ]] as any,
94
- ];
95
-
96
- testCases.forEach(([event, inputOrCaseOrCases]) => {
97
- it(`should correctly handle "${event}" event data`, () => {
98
- const spy = vi.fn();
99
- const emitter = createEmitter();
100
-
101
- emitter.on(event, spy);
102
-
103
- // No expected data to be passed to listener.
104
- if (inputOrCaseOrCases === undefined) {
105
- dispatchWindowMessageEvent(event);
106
- expect(spy).toBeCalledWith();
107
- return;
108
- }
109
-
110
- // Input is equal to expected result.
111
- if (!Array.isArray(inputOrCaseOrCases)) {
112
- dispatchWindowMessageEvent(event, inputOrCaseOrCases);
113
- expect(spy).toBeCalledWith(inputOrCaseOrCases);
114
- return;
115
- }
116
-
117
- // Input differs from expected result.
118
- if (!Array.isArray(inputOrCaseOrCases[0])) {
119
- const [input, expected] = inputOrCaseOrCases;
120
- dispatchWindowMessageEvent(event, input);
121
- expect(spy).toBeCalledWith(expected);
122
- return;
123
- }
124
-
125
- // List of cases.
126
- inputOrCaseOrCases.forEach(([input, expected = input]) => {
127
- dispatchWindowMessageEvent(event, input);
128
- expect(spy).toBeCalledWith(expected);
129
- });
130
- });
131
- });
132
-
133
- it('should not emit event in case, it contains incorrect payload', () => {
134
- const spy = vi.fn();
135
- const emitter = createEmitter();
136
-
137
- emitter.on('viewport_changed', spy);
138
-
139
- dispatchWindowMessageEvent('viewport_changed', 'broken data');
140
-
141
- expect(spy).not.toBeCalled();
142
- });
143
- });
@@ -1,34 +0,0 @@
1
- import { afterEach, beforeEach, expect, it, vi } from 'vitest';
2
-
3
- import { createWindow, type WindowSpy } from '../../../../test-utils/createWindow';
4
- import { dispatchWindowMessageEvent } from '../../../../test-utils/dispatchWindowMessageEvent';
5
- import { off } from '../off';
6
- import { on } from '../on';
7
-
8
- let windowSpy: WindowSpy;
9
-
10
- beforeEach(() => {
11
- windowSpy = createWindow();
12
- });
13
-
14
- afterEach(() => {
15
- windowSpy.mockRestore();
16
- });
17
-
18
- it('should remove listener', () => {
19
- const listener = vi.fn();
20
- const emit = () => dispatchWindowMessageEvent('viewport_changed', {
21
- height: 123,
22
- width: 321,
23
- is_expanded: false,
24
- is_state_stable: false,
25
- });
26
-
27
- on('viewport_changed', listener);
28
- emit();
29
- expect(listener).toHaveBeenCalledTimes(1);
30
-
31
- off('viewport_changed', listener);
32
- emit();
33
- expect(listener).toHaveBeenCalledTimes(1);
34
- });
@@ -1,49 +0,0 @@
1
- import { afterEach, beforeEach, expect, it, vi } from 'vitest';
2
-
3
- import { createWindow, type WindowSpy } from '../../../../test-utils/createWindow';
4
- import { dispatchWindowMessageEvent } from '../../../../test-utils/dispatchWindowMessageEvent';
5
- import { on } from '../on';
6
-
7
- let windowSpy: WindowSpy;
8
-
9
- beforeEach(() => {
10
- windowSpy = createWindow();
11
- });
12
-
13
- afterEach(() => {
14
- windowSpy.mockRestore();
15
- });
16
-
17
- it('should call listener in case, Telegram event was created', () => {
18
- const listener = vi.fn();
19
- on('viewport_changed', listener);
20
-
21
- const eventData = {
22
- height: 123,
23
- width: 321,
24
- is_expanded: false,
25
- is_state_stable: false,
26
- };
27
- dispatchWindowMessageEvent('viewport_changed', eventData);
28
-
29
- expect(listener).toHaveBeenCalledTimes(1);
30
- expect(listener).toHaveBeenCalledWith(eventData);
31
- });
32
-
33
- it('should remove listener in case, returned callback was called', () => {
34
- const listener = vi.fn();
35
- const emit = () => dispatchWindowMessageEvent('viewport_changed', {
36
- height: 123,
37
- width: 321,
38
- is_expanded: false,
39
- is_state_stable: false,
40
- });
41
-
42
- const off = on('viewport_changed', listener);
43
- emit();
44
- expect(listener).toHaveBeenCalledTimes(1);
45
-
46
- off();
47
- emit();
48
- expect(listener).toHaveBeenCalledTimes(1);
49
- });
@@ -1,49 +0,0 @@
1
- import { afterEach, beforeEach, expect, it, vi } from 'vitest';
2
-
3
- import { createWindow, type WindowSpy } from '../../../../test-utils/createWindow';
4
- import { dispatchWindowMessageEvent } from '../../../../test-utils/dispatchWindowMessageEvent';
5
- import { onTelegramEvent } from '../onTelegramEvent';
6
-
7
- afterEach(() => {
8
- vi.restoreAllMocks()
9
- });
10
-
11
- it('should call passed callback with event type and data in case, window generated "message" event with data, presented as object with properties "eventType" (string) and "eventData" (unknown). Object is converted to string.', () => {
12
- createWindow({ env: 'iframe' });
13
- const callback = vi.fn();
14
- onTelegramEvent(callback);
15
-
16
- dispatchWindowMessageEvent('qr_text_received', {});
17
-
18
- expect(callback).toHaveBeenCalledTimes(1);
19
- expect(callback).toHaveBeenCalledWith('qr_text_received', {});
20
- });
21
-
22
- it('should not define event handlers twice in case, window object contains "TelegramGameProxy_receiveEvent" property.', () => {
23
- createWindow();
24
- (window as any).TelegramGameProxy_receiveEvent = true;
25
-
26
- onTelegramEvent(vi.fn());
27
- expect(window).not.toHaveProperty('Telegram');
28
- });
29
-
30
- it('should call passed callback with event type and data in case, external environment generated event.', () => {
31
- createWindow();
32
- const callback = vi.fn();
33
- onTelegramEvent(callback);
34
-
35
- (window as any).TelegramGameProxy_receiveEvent('test', false);
36
-
37
- expect(callback).toHaveBeenCalledTimes(1);
38
- expect(callback).toHaveBeenCalledWith('test', false);
39
- });
40
-
41
- it('should ignore a message event with unexpected data', () => {
42
- createWindow();
43
- const callback = vi.fn();
44
- onTelegramEvent(callback);
45
-
46
- window.dispatchEvent(new MessageEvent('message', { data: null }));
47
-
48
- expect(callback).toHaveBeenCalledTimes(0);
49
- });
@@ -1,64 +0,0 @@
1
- import { afterEach, beforeEach, expect, it, vi } from 'vitest';
2
-
3
- import { createWindow, type WindowSpy } from '../../../../test-utils/createWindow';
4
- import { dispatchWindowMessageEvent } from '../../../../test-utils/dispatchWindowMessageEvent';
5
- import { once } from '../once';
6
-
7
- let windowSpy: WindowSpy;
8
-
9
- beforeEach(() => {
10
- windowSpy = createWindow();
11
- });
12
-
13
- afterEach(() => {
14
- windowSpy.mockRestore();
15
- });
16
-
17
- it('should call listener in case, Telegram event was created', () => {
18
- const listener = vi.fn();
19
- once('viewport_changed', listener);
20
-
21
- const eventData = {
22
- height: 123,
23
- width: 321,
24
- is_expanded: false,
25
- is_state_stable: false,
26
- };
27
- dispatchWindowMessageEvent('viewport_changed', eventData);
28
-
29
- expect(listener).toHaveBeenCalledTimes(1);
30
- expect(listener).toHaveBeenCalledWith(eventData);
31
- });
32
-
33
- it('should remove listener in case, returned callback was called', () => {
34
- const listener = vi.fn();
35
- const emit = () => dispatchWindowMessageEvent('viewport_changed', {
36
- height: 123,
37
- width: 321,
38
- is_expanded: false,
39
- is_state_stable: false,
40
- });
41
-
42
- const off = once('viewport_changed', listener);
43
-
44
- off();
45
- emit();
46
- expect(listener).toHaveBeenCalledTimes(0);
47
- });
48
-
49
- it('should remove listener in case, listener was called', () => {
50
- const listener = vi.fn();
51
- const emit = () => dispatchWindowMessageEvent('viewport_changed', {
52
- height: 123,
53
- width: 321,
54
- is_expanded: false,
55
- is_state_stable: false,
56
- });
57
-
58
- once('viewport_changed', listener);
59
- emit();
60
- expect(listener).toHaveBeenCalledTimes(1);
61
-
62
- emit();
63
- expect(listener).toHaveBeenCalledTimes(1);
64
- });
@@ -1,22 +0,0 @@
1
- import { afterEach, beforeEach, expect, it } from 'vitest';
2
-
3
- import type { WindowSpy } from '../../../../test-utils/createWindow';
4
- import { createWindow } from '../../../../test-utils/createWindow';
5
- import { singletonEmitter } from '../singletonEmitter';
6
-
7
- let windowSpy: WindowSpy;
8
-
9
- beforeEach(() => {
10
- windowSpy = createWindow({
11
- innerWidth: 1920,
12
- innerHeight: 1080,
13
- });
14
- });
15
-
16
- afterEach(() => {
17
- windowSpy.mockRestore();
18
- });
19
-
20
- it('should return the same instance of emitter', () => {
21
- expect(singletonEmitter()).toEqual(singletonEmitter());
22
- });
@@ -1,49 +0,0 @@
1
- import { afterEach, beforeEach, expect, it, vi } from 'vitest';
2
-
3
- import { createWindow, type WindowSpy } from '../../../../test-utils/createWindow';
4
- import { dispatchWindowMessageEvent } from '../../../../test-utils/dispatchWindowMessageEvent';
5
- import { subscribe } from '../subscribe';
6
-
7
- let windowSpy: WindowSpy;
8
-
9
- beforeEach(() => {
10
- windowSpy = createWindow();
11
- });
12
-
13
- afterEach(() => {
14
- windowSpy.mockRestore();
15
- });
16
-
17
- it('should call listener in case, Telegram event was created', () => {
18
- const listener = vi.fn();
19
- subscribe(listener);
20
-
21
- const eventData = {
22
- height: 123,
23
- width: 321,
24
- is_expanded: false,
25
- is_state_stable: false,
26
- };
27
- dispatchWindowMessageEvent('viewport_changed', eventData);
28
-
29
- expect(listener).toHaveBeenCalledTimes(1);
30
- expect(listener).toHaveBeenCalledWith('viewport_changed', eventData);
31
- });
32
-
33
- it('should remove listener in case, returned callback was called', () => {
34
- const listener = vi.fn();
35
- const emit = () => dispatchWindowMessageEvent('viewport_changed', {
36
- height: 123,
37
- width: 321,
38
- is_expanded: false,
39
- is_state_stable: false,
40
- });
41
-
42
- const unsubscribe = subscribe(listener);
43
- emit();
44
- expect(listener).toHaveBeenCalledTimes(1);
45
-
46
- unsubscribe();
47
- emit();
48
- expect(listener).toHaveBeenCalledTimes(1);
49
- });
@@ -1,34 +0,0 @@
1
- import { afterEach, beforeEach, expect, it, vi } from 'vitest';
2
-
3
- import { createWindow, type WindowSpy } from '../../../../test-utils/createWindow';
4
- import { dispatchWindowMessageEvent } from '../../../../test-utils/dispatchWindowMessageEvent';
5
- import { subscribe } from '../subscribe';
6
- import { unsubscribe } from '../unsubscribe';
7
-
8
- let windowSpy: WindowSpy;
9
-
10
- beforeEach(() => {
11
- windowSpy = createWindow();
12
- });
13
-
14
- afterEach(() => {
15
- windowSpy.mockRestore();
16
- });
17
-
18
- it('should remove listener', () => {
19
- const listener = vi.fn();
20
- const emit = () => dispatchWindowMessageEvent('viewport_changed', {
21
- height: 123,
22
- width: 321,
23
- is_expanded: false,
24
- is_state_stable: false,
25
- });
26
-
27
- subscribe(listener);
28
- emit();
29
- expect(listener).toHaveBeenCalledTimes(1);
30
-
31
- unsubscribe(listener);
32
- emit();
33
- expect(listener).toHaveBeenCalledTimes(1);
34
- });
@@ -1,108 +0,0 @@
1
- import { EventEmitter } from '~/event-emitter/index.js';
2
- import { logger } from '~/globals.js';
3
- import { string } from '~/parsing/index.js';
4
-
5
- import type { MiniAppsEventEmitter, MiniAppsEventName } from './events.js';
6
- import { onTelegramEvent } from './onTelegramEvent.js';
7
- import {
8
- clipboardTextReceived,
9
- customMethodInvoked,
10
- invoiceClosed,
11
- phoneRequested,
12
- popupClosed,
13
- qrTextReceived,
14
- themeChanged,
15
- viewportChanged,
16
- writeAccessRequested,
17
- } from './parsers/index.js';
18
-
19
- /**
20
- * Returns event emitter which could be safely used, to process events from
21
- * Telegram native application.
22
- */
23
- export function createEmitter(): MiniAppsEventEmitter {
24
- const emitter: MiniAppsEventEmitter = new EventEmitter();
25
- const emit: MiniAppsEventEmitter['emit'] = (event: any, ...data: any[]) => {
26
- logger.log('Emitting processed event:', event, ...data);
27
- emitter.emit(event, ...data);
28
- };
29
-
30
- // Desktop version of Telegram is sometimes not sending the viewport_changed
31
- // event. For example, when main button is shown. That's why we should
32
- // add our own listener to make sure, viewport information is always fresh.
33
- // Issue: https://github.com/Telegram-Mini-Apps/tma.js/issues/10
34
- window.addEventListener('resize', () => {
35
- emit('viewport_changed', {
36
- width: window.innerWidth,
37
- height: window.innerHeight,
38
- is_state_stable: true,
39
- is_expanded: true,
40
- });
41
- });
42
-
43
- // In case, any Telegram event was received, we should prepare data before
44
- // passing it to emitter.
45
- onTelegramEvent((eventType: MiniAppsEventName | string, eventData): void => {
46
- logger.log('Received raw event:', eventType, eventData);
47
-
48
- try {
49
- switch (eventType) {
50
- case 'viewport_changed':
51
- return emit(eventType, viewportChanged().parse(eventData));
52
-
53
- case 'theme_changed':
54
- return emit(eventType, themeChanged().parse(eventData));
55
-
56
- case 'popup_closed':
57
- // FIXME: Payloads are different on different platforms.
58
- // Issue: https://github.com/Telegram-Mini-Apps/tma.js/issues/2
59
- if (
60
- // Sent on desktop.
61
- eventData === undefined
62
- // Sent on iOS.
63
- || eventData === null
64
- ) {
65
- return emit(eventType, {});
66
- }
67
- return emit(eventType, popupClosed().parse(eventData));
68
-
69
- case 'set_custom_style':
70
- return emit(eventType, string().parse(eventData));
71
-
72
- case 'qr_text_received':
73
- return emit(eventType, qrTextReceived().parse(eventData));
74
-
75
- case 'clipboard_text_received':
76
- return emit(eventType, clipboardTextReceived().parse(eventData));
77
-
78
- case 'invoice_closed':
79
- return emit(eventType, invoiceClosed().parse(eventData));
80
-
81
- case 'phone_requested':
82
- return emit('phone_requested', phoneRequested().parse(eventData));
83
-
84
- case 'custom_method_invoked':
85
- return emit('custom_method_invoked', customMethodInvoked().parse(eventData));
86
-
87
- case 'write_access_requested':
88
- return emit('write_access_requested', writeAccessRequested().parse(eventData));
89
-
90
- // Events which have no parameters.
91
- case 'main_button_pressed':
92
- case 'back_button_pressed':
93
- case 'settings_button_pressed':
94
- case 'scan_qr_popup_closed':
95
- case 'reload_iframe':
96
- return emit(eventType);
97
-
98
- // All other event listeners will receive unknown type of data.
99
- default:
100
- return emit(eventType as any, eventData);
101
- }
102
- } catch (cause) {
103
- logger.error('Error processing event:', cause);
104
- }
105
- });
106
-
107
- return emitter;
108
- }