@tma.js/sdk 1.4.3 → 1.4.6

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 (283) hide show
  1. package/README.md +2 -2
  2. package/dist/dts/bridge/events/events.d.ts +16 -16
  3. package/dist/dts/bridge/methods/methods.d.ts +27 -27
  4. package/dist/dts/bridge/methods/popup.d.ts +1 -1
  5. package/dist/dts/{init/css → css}/bindMiniAppCSSVars.d.ts +2 -2
  6. package/dist/dts/{init/css → css}/bindThemeCSSVars.d.ts +1 -1
  7. package/dist/dts/{init/css → css}/bindViewportCSSVars.d.ts +1 -1
  8. package/dist/dts/css/index.d.ts +4 -0
  9. package/dist/dts/index.d.ts +1 -0
  10. package/dist/dts/init-data/types.d.ts +3 -3
  11. package/dist/dts/launch-params/types.d.ts +1 -1
  12. package/dist/dts/theme-params/types.d.ts +1 -1
  13. package/dist/index.cjs +1 -2
  14. package/dist/index.iife.js +1 -2
  15. package/dist/index.mjs +126 -115
  16. package/package.json +2 -3
  17. package/dist/index.cjs.map +0 -1
  18. package/dist/index.iife.js.map +0 -1
  19. package/dist/index.mjs.map +0 -1
  20. package/src/__tests__/globals.ts +0 -39
  21. package/src/back-button/BackButton.ts +0 -90
  22. package/src/back-button/__tests__/BackButton.ts +0 -129
  23. package/src/back-button/index.ts +0 -2
  24. package/src/back-button/types.ts +0 -14
  25. package/src/bridge/__tests__/parseMessage.ts +0 -23
  26. package/src/bridge/__tests__/request.ts +0 -236
  27. package/src/bridge/env/__tests__/hasExternalNotify.ts +0 -15
  28. package/src/bridge/env/__tests__/hasWebviewProxy.ts +0 -15
  29. package/src/bridge/env/__tests__/isIframe.ts +0 -30
  30. package/src/bridge/env/hasExternalNotify.ts +0 -19
  31. package/src/bridge/env/hasWebviewProxy.ts +0 -19
  32. package/src/bridge/env/index.ts +0 -3
  33. package/src/bridge/env/isIframe.ts +0 -11
  34. package/src/bridge/errors/MethodUnsupportedError.ts +0 -13
  35. package/src/bridge/errors/ParameterUnsupportedError.ts +0 -13
  36. package/src/bridge/errors/index.ts +0 -2
  37. package/src/bridge/events/__tests__/createEmitter.ts +0 -143
  38. package/src/bridge/events/__tests__/off.ts +0 -34
  39. package/src/bridge/events/__tests__/on.ts +0 -49
  40. package/src/bridge/events/__tests__/onTelegramEvent.ts +0 -49
  41. package/src/bridge/events/__tests__/once.ts +0 -64
  42. package/src/bridge/events/__tests__/singletonEmitter.ts +0 -22
  43. package/src/bridge/events/__tests__/subscribe.ts +0 -49
  44. package/src/bridge/events/__tests__/unsubscribe.ts +0 -34
  45. package/src/bridge/events/createEmitter.ts +0 -108
  46. package/src/bridge/events/events.ts +0 -170
  47. package/src/bridge/events/index.ts +0 -9
  48. package/src/bridge/events/off.ts +0 -14
  49. package/src/bridge/events/on.ts +0 -19
  50. package/src/bridge/events/onTelegramEvent.ts +0 -81
  51. package/src/bridge/events/once.ts +0 -18
  52. package/src/bridge/events/parsers/__tests__/clipboardTextReceived.ts +0 -21
  53. package/src/bridge/events/parsers/__tests__/invoiceClosed.ts +0 -12
  54. package/src/bridge/events/parsers/__tests__/popupClosed.ts +0 -10
  55. package/src/bridge/events/parsers/__tests__/qrTextReceived.ts +0 -9
  56. package/src/bridge/events/parsers/__tests__/theme-changed.ts +0 -42
  57. package/src/bridge/events/parsers/__tests__/viewportChanged.ts +0 -49
  58. package/src/bridge/events/parsers/clipboardTextReceived.ts +0 -26
  59. package/src/bridge/events/parsers/customMethodInvoked.ts +0 -25
  60. package/src/bridge/events/parsers/index.ts +0 -9
  61. package/src/bridge/events/parsers/invoiceClosed.ts +0 -26
  62. package/src/bridge/events/parsers/phoneRequested.ts +0 -14
  63. package/src/bridge/events/parsers/popupClosed.ts +0 -19
  64. package/src/bridge/events/parsers/qrTextReceived.ts +0 -14
  65. package/src/bridge/events/parsers/theme-changed.ts +0 -58
  66. package/src/bridge/events/parsers/viewportChanged.ts +0 -33
  67. package/src/bridge/events/parsers/writeAccessRequested.ts +0 -14
  68. package/src/bridge/events/singletonEmitter.ts +0 -19
  69. package/src/bridge/events/subscribe.ts +0 -15
  70. package/src/bridge/events/unsubscribe.ts +0 -10
  71. package/src/bridge/index.ts +0 -7
  72. package/src/bridge/invokeCustomMethod.ts +0 -56
  73. package/src/bridge/methods/__tests__/createPostEvent.ts +0 -37
  74. package/src/bridge/methods/__tests__/postEvent.ts +0 -137
  75. package/src/bridge/methods/createPostEvent.ts +0 -40
  76. package/src/bridge/methods/custom-methods.ts +0 -68
  77. package/src/bridge/methods/haptic.ts +0 -52
  78. package/src/bridge/methods/index.ts +0 -6
  79. package/src/bridge/methods/methods.ts +0 -370
  80. package/src/bridge/methods/popup.ts +0 -53
  81. package/src/bridge/methods/postEvent.ts +0 -101
  82. package/src/bridge/parseMessage.ts +0 -28
  83. package/src/bridge/request.ts +0 -176
  84. package/src/classnames/__tests__/classNames.ts +0 -20
  85. package/src/classnames/__tests__/mergeClassNames.ts +0 -21
  86. package/src/classnames/classNames.ts +0 -34
  87. package/src/classnames/index.ts +0 -2
  88. package/src/classnames/mergeClassNames.ts +0 -60
  89. package/src/closing-behavior/ClosingBehavior.ts +0 -64
  90. package/src/closing-behavior/__tests__/ClosingBehavior.ts +0 -86
  91. package/src/closing-behavior/index.ts +0 -2
  92. package/src/closing-behavior/types.ts +0 -12
  93. package/src/cloud-storage/CloudStorage.ts +0 -138
  94. package/src/cloud-storage/index.ts +0 -1
  95. package/src/colors/__tests__/isColorDark.ts +0 -12
  96. package/src/colors/__tests__/isRGB.ts +0 -13
  97. package/src/colors/__tests__/isRGBShort.ts +0 -13
  98. package/src/colors/__tests__/toRGB.ts +0 -23
  99. package/src/colors/index.ts +0 -5
  100. package/src/colors/isColorDark.ts +0 -22
  101. package/src/colors/isRGB.ts +0 -9
  102. package/src/colors/isRGBShort.ts +0 -9
  103. package/src/colors/toRGB.ts +0 -49
  104. package/src/colors/types.ts +0 -9
  105. package/src/event-emitter/EventEmitter.ts +0 -146
  106. package/src/event-emitter/__tests__/EventEmitter.ts +0 -145
  107. package/src/event-emitter/index.ts +0 -2
  108. package/src/event-emitter/types.ts +0 -60
  109. package/src/globals.ts +0 -38
  110. package/src/haptic-feedback/HapticFeedback.ts +0 -70
  111. package/src/haptic-feedback/__tests__/HapticFeedback.ts +0 -68
  112. package/src/haptic-feedback/index.ts +0 -1
  113. package/src/index.ts +0 -179
  114. package/src/init/catchCustomStyles.ts +0 -17
  115. package/src/init/creators/__tests__/createViewport.ts +0 -96
  116. package/src/init/creators/createBackButton.ts +0 -25
  117. package/src/init/creators/createClosingBehavior.ts +0 -24
  118. package/src/init/creators/createMainButton.ts +0 -51
  119. package/src/init/creators/createMiniApp.ts +0 -48
  120. package/src/init/creators/createRequestIdGenerator.ts +0 -13
  121. package/src/init/creators/createSettingsButton.ts +0 -25
  122. package/src/init/creators/createThemeParams.ts +0 -11
  123. package/src/init/creators/createViewport.ts +0 -94
  124. package/src/init/creators/index.ts +0 -8
  125. package/src/init/css/bindMiniAppCSSVars.ts +0 -48
  126. package/src/init/css/bindThemeCSSVars.ts +0 -31
  127. package/src/init/css/bindViewportCSSVars.ts +0 -36
  128. package/src/init/css/index.ts +0 -1
  129. package/src/init/css/processCSSVarsOption.ts +0 -57
  130. package/src/init/css/setCSSVar.ts +0 -8
  131. package/src/init/index.ts +0 -2
  132. package/src/init/init.ts +0 -134
  133. package/src/init/types.ts +0 -94
  134. package/src/init-data/InitData.ts +0 -96
  135. package/src/init-data/__tests__/InitData.ts +0 -98
  136. package/src/init-data/__tests__/chatParser.ts +0 -102
  137. package/src/init-data/__tests__/initDataParser.ts +0 -136
  138. package/src/init-data/__tests__/parseInitData.ts +0 -136
  139. package/src/init-data/__tests__/userParser.ts +0 -96
  140. package/src/init-data/chatParser.ts +0 -19
  141. package/src/init-data/index.ts +0 -6
  142. package/src/init-data/initDataParser.ts +0 -41
  143. package/src/init-data/parseInitData.ts +0 -10
  144. package/src/init-data/types.ts +0 -164
  145. package/src/init-data/userParser.ts +0 -45
  146. package/src/invoice/Invoice.ts +0 -123
  147. package/src/invoice/index.ts +0 -2
  148. package/src/invoice/types.ts +0 -11
  149. package/src/launch-params/__tests__/retrieveFromUrl.ts +0 -19
  150. package/src/launch-params/computeLaunchData.ts +0 -81
  151. package/src/launch-params/computePageReload.ts +0 -13
  152. package/src/launch-params/getFirstNavigationEntry.ts +0 -10
  153. package/src/launch-params/index.ts +0 -13
  154. package/src/launch-params/launchParamsParser.ts +0 -45
  155. package/src/launch-params/parseLaunchParams.ts +0 -10
  156. package/src/launch-params/retrieveCurrent.ts +0 -27
  157. package/src/launch-params/retrieveFromLocation.ts +0 -10
  158. package/src/launch-params/retrieveFromPerformance.ts +0 -18
  159. package/src/launch-params/retrieveFromUrl.ts +0 -19
  160. package/src/launch-params/retrieveLaunchData.ts +0 -30
  161. package/src/launch-params/serializeLaunchParams.ts +0 -37
  162. package/src/launch-params/storage.ts +0 -33
  163. package/src/launch-params/types.ts +0 -62
  164. package/src/logger/Logger.ts +0 -72
  165. package/src/logger/__tests__/Logger.ts +0 -107
  166. package/src/logger/index.ts +0 -1
  167. package/src/main-button/MainButton.ts +0 -239
  168. package/src/main-button/__tests__/MainButton.ts +0 -346
  169. package/src/main-button/index.ts +0 -2
  170. package/src/main-button/types.ts +0 -26
  171. package/src/mini-app/MiniApp.ts +0 -348
  172. package/src/mini-app/__tests__/MiniApp.ts +0 -140
  173. package/src/mini-app/contactParser.ts +0 -29
  174. package/src/mini-app/index.ts +0 -2
  175. package/src/mini-app/types.ts +0 -38
  176. package/src/misc/__tests__/isRecord.ts +0 -21
  177. package/src/misc/index.ts +0 -2
  178. package/src/misc/isRecord.ts +0 -7
  179. package/src/misc/isTMA.ts +0 -13
  180. package/src/navigation/HashNavigator/HashNavigator.ts +0 -220
  181. package/src/navigation/HashNavigator/__tests__/HashNavigator.ts +0 -144
  182. package/src/navigation/HashNavigator/__tests__/drop.ts +0 -42
  183. package/src/navigation/HashNavigator/__tests__/go.ts +0 -9
  184. package/src/navigation/HashNavigator/drop.ts +0 -36
  185. package/src/navigation/HashNavigator/go.ts +0 -28
  186. package/src/navigation/HashNavigator/index.ts +0 -2
  187. package/src/navigation/HashNavigator/types.ts +0 -41
  188. package/src/navigation/Navigator/Navigator.ts +0 -282
  189. package/src/navigation/Navigator/index.ts +0 -2
  190. package/src/navigation/Navigator/types.ts +0 -55
  191. package/src/navigation/ensurePrefix.ts +0 -9
  192. package/src/navigation/getHash.ts +0 -17
  193. package/src/navigation/index.ts +0 -4
  194. package/src/parsing/ArrayValueParser.ts +0 -79
  195. package/src/parsing/ParseError.ts +0 -27
  196. package/src/parsing/ParseSchemaFieldError.ts +0 -21
  197. package/src/parsing/ValueParser.ts +0 -71
  198. package/src/parsing/__tests__/ArrayValueParser.ts +0 -18
  199. package/src/parsing/__tests__/toRecord.ts +0 -10
  200. package/src/parsing/createValueParserGenerator.ts +0 -16
  201. package/src/parsing/index.ts +0 -10
  202. package/src/parsing/parseBySchema.ts +0 -65
  203. package/src/parsing/parsers/__tests__/array.ts +0 -39
  204. package/src/parsing/parsers/__tests__/boolean.ts +0 -31
  205. package/src/parsing/parsers/__tests__/date.ts +0 -25
  206. package/src/parsing/parsers/__tests__/json.ts +0 -80
  207. package/src/parsing/parsers/__tests__/number.ts +0 -23
  208. package/src/parsing/parsers/__tests__/rgb.ts +0 -22
  209. package/src/parsing/parsers/__tests__/searchParams.ts +0 -105
  210. package/src/parsing/parsers/__tests__/string.ts +0 -25
  211. package/src/parsing/parsers/array.ts +0 -9
  212. package/src/parsing/parsers/boolean.ts +0 -22
  213. package/src/parsing/parsers/date.ts +0 -11
  214. package/src/parsing/parsers/index.ts +0 -8
  215. package/src/parsing/parsers/json.ts +0 -17
  216. package/src/parsing/parsers/number.ts +0 -21
  217. package/src/parsing/parsers/rgb.ts +0 -10
  218. package/src/parsing/parsers/searchParams.ts +0 -24
  219. package/src/parsing/parsers/string.ts +0 -12
  220. package/src/parsing/toRecord.ts +0 -27
  221. package/src/parsing/types.ts +0 -32
  222. package/src/parsing/unexpectedTypeError.ts +0 -6
  223. package/src/popup/Popup.ts +0 -91
  224. package/src/popup/__tests__/Popup.ts +0 -130
  225. package/src/popup/__tests__/preparePopupParams.ts +0 -85
  226. package/src/popup/index.ts +0 -2
  227. package/src/popup/preparePopupParams.ts +0 -59
  228. package/src/popup/types.ts +0 -69
  229. package/src/qr-scanner/QRScanner.ts +0 -95
  230. package/src/qr-scanner/index.ts +0 -2
  231. package/src/qr-scanner/types.ts +0 -11
  232. package/src/settings-button/SettingsButton.ts +0 -85
  233. package/src/settings-button/index.ts +0 -2
  234. package/src/settings-button/types.ts +0 -15
  235. package/src/state/State.ts +0 -67
  236. package/src/state/index.ts +0 -2
  237. package/src/state/types.ts +0 -31
  238. package/src/storage.ts +0 -69
  239. package/src/supports/__tests__/supports.ts +0 -123
  240. package/src/supports/createSupportsFunc.ts +0 -18
  241. package/src/supports/createSupportsParamFunc.ts +0 -27
  242. package/src/supports/index.ts +0 -4
  243. package/src/supports/supports.ts +0 -84
  244. package/src/supports/types.ts +0 -1
  245. package/src/theme-params/ThemeParams.ts +0 -131
  246. package/src/theme-params/__tests__/keys.ts +0 -19
  247. package/src/theme-params/__tests__/parseThemeParams.ts +0 -29
  248. package/src/theme-params/__tests__/serializeThemeParams.ts +0 -29
  249. package/src/theme-params/__tests__/themeParamsParser.ts +0 -29
  250. package/src/theme-params/index.ts +0 -6
  251. package/src/theme-params/keys.ts +0 -24
  252. package/src/theme-params/parseThemeParams.ts +0 -10
  253. package/src/theme-params/requestThemeParams.ts +0 -13
  254. package/src/theme-params/serializeThemeParams.ts +0 -20
  255. package/src/theme-params/themeParamsParser.ts +0 -22
  256. package/src/theme-params/types.ts +0 -33
  257. package/src/timeout/TimeoutError.ts +0 -6
  258. package/src/timeout/__tests__/isTimeoutError.ts +0 -9
  259. package/src/timeout/__tests__/withTimeout.ts +0 -28
  260. package/src/timeout/index.ts +0 -4
  261. package/src/timeout/isTimeoutError.ts +0 -9
  262. package/src/timeout/sleep.ts +0 -10
  263. package/src/timeout/withTimeout.ts +0 -24
  264. package/src/types/index.ts +0 -4
  265. package/src/types/methods.ts +0 -18
  266. package/src/types/platform.ts +0 -14
  267. package/src/types/request-id.ts +0 -10
  268. package/src/types/utils.ts +0 -50
  269. package/src/utils/Utils.ts +0 -107
  270. package/src/utils/index.ts +0 -1
  271. package/src/version/__tests__/compareVersions.ts +0 -19
  272. package/src/version/compareVersions.ts +0 -28
  273. package/src/version/index.ts +0 -2
  274. package/src/version/types.ts +0 -4
  275. package/src/viewport/Viewport.ts +0 -171
  276. package/src/viewport/__tests__/isStableViewportPlatform.ts +0 -15
  277. package/src/viewport/__tests__/utils.ts +0 -12
  278. package/src/viewport/index.ts +0 -4
  279. package/src/viewport/isStableViewportPlatform.ts +0 -10
  280. package/src/viewport/requestViewport.ts +0 -23
  281. package/src/viewport/types.ts +0 -23
  282. package/src/viewport/utils.ts +0 -7
  283. /package/dist/dts/{init/css → css}/setCSSVar.d.ts +0 -0
@@ -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
- }