@tma.js/sdk 1.4.4 → 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 (282) 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-data/types.d.ts +3 -3
  6. package/dist/dts/launch-params/types.d.ts +1 -1
  7. package/dist/dts/theme-params/types.d.ts +1 -1
  8. package/dist/index.cjs +0 -1
  9. package/dist/index.iife.js +0 -1
  10. package/dist/index.mjs +0 -1
  11. package/package.json +2 -3
  12. package/dist/index.cjs.map +0 -1
  13. package/dist/index.iife.js.map +0 -1
  14. package/dist/index.mjs.map +0 -1
  15. package/src/__tests__/globals.ts +0 -39
  16. package/src/back-button/BackButton.ts +0 -90
  17. package/src/back-button/__tests__/BackButton.ts +0 -129
  18. package/src/back-button/index.ts +0 -2
  19. package/src/back-button/types.ts +0 -14
  20. package/src/bridge/__tests__/parseMessage.ts +0 -23
  21. package/src/bridge/__tests__/request.ts +0 -236
  22. package/src/bridge/env/__tests__/hasExternalNotify.ts +0 -15
  23. package/src/bridge/env/__tests__/hasWebviewProxy.ts +0 -15
  24. package/src/bridge/env/__tests__/isIframe.ts +0 -30
  25. package/src/bridge/env/hasExternalNotify.ts +0 -19
  26. package/src/bridge/env/hasWebviewProxy.ts +0 -19
  27. package/src/bridge/env/index.ts +0 -3
  28. package/src/bridge/env/isIframe.ts +0 -11
  29. package/src/bridge/errors/MethodUnsupportedError.ts +0 -13
  30. package/src/bridge/errors/ParameterUnsupportedError.ts +0 -13
  31. package/src/bridge/errors/index.ts +0 -2
  32. package/src/bridge/events/__tests__/createEmitter.ts +0 -143
  33. package/src/bridge/events/__tests__/off.ts +0 -34
  34. package/src/bridge/events/__tests__/on.ts +0 -49
  35. package/src/bridge/events/__tests__/onTelegramEvent.ts +0 -49
  36. package/src/bridge/events/__tests__/once.ts +0 -64
  37. package/src/bridge/events/__tests__/singletonEmitter.ts +0 -22
  38. package/src/bridge/events/__tests__/subscribe.ts +0 -49
  39. package/src/bridge/events/__tests__/unsubscribe.ts +0 -34
  40. package/src/bridge/events/createEmitter.ts +0 -108
  41. package/src/bridge/events/events.ts +0 -170
  42. package/src/bridge/events/index.ts +0 -9
  43. package/src/bridge/events/off.ts +0 -14
  44. package/src/bridge/events/on.ts +0 -19
  45. package/src/bridge/events/onTelegramEvent.ts +0 -81
  46. package/src/bridge/events/once.ts +0 -18
  47. package/src/bridge/events/parsers/__tests__/clipboardTextReceived.ts +0 -21
  48. package/src/bridge/events/parsers/__tests__/invoiceClosed.ts +0 -12
  49. package/src/bridge/events/parsers/__tests__/popupClosed.ts +0 -10
  50. package/src/bridge/events/parsers/__tests__/qrTextReceived.ts +0 -9
  51. package/src/bridge/events/parsers/__tests__/theme-changed.ts +0 -42
  52. package/src/bridge/events/parsers/__tests__/viewportChanged.ts +0 -49
  53. package/src/bridge/events/parsers/clipboardTextReceived.ts +0 -26
  54. package/src/bridge/events/parsers/customMethodInvoked.ts +0 -25
  55. package/src/bridge/events/parsers/index.ts +0 -9
  56. package/src/bridge/events/parsers/invoiceClosed.ts +0 -26
  57. package/src/bridge/events/parsers/phoneRequested.ts +0 -14
  58. package/src/bridge/events/parsers/popupClosed.ts +0 -19
  59. package/src/bridge/events/parsers/qrTextReceived.ts +0 -14
  60. package/src/bridge/events/parsers/theme-changed.ts +0 -58
  61. package/src/bridge/events/parsers/viewportChanged.ts +0 -33
  62. package/src/bridge/events/parsers/writeAccessRequested.ts +0 -14
  63. package/src/bridge/events/singletonEmitter.ts +0 -19
  64. package/src/bridge/events/subscribe.ts +0 -15
  65. package/src/bridge/events/unsubscribe.ts +0 -10
  66. package/src/bridge/index.ts +0 -7
  67. package/src/bridge/invokeCustomMethod.ts +0 -56
  68. package/src/bridge/methods/__tests__/createPostEvent.ts +0 -37
  69. package/src/bridge/methods/__tests__/postEvent.ts +0 -137
  70. package/src/bridge/methods/createPostEvent.ts +0 -40
  71. package/src/bridge/methods/custom-methods.ts +0 -68
  72. package/src/bridge/methods/haptic.ts +0 -52
  73. package/src/bridge/methods/index.ts +0 -6
  74. package/src/bridge/methods/methods.ts +0 -370
  75. package/src/bridge/methods/popup.ts +0 -53
  76. package/src/bridge/methods/postEvent.ts +0 -101
  77. package/src/bridge/parseMessage.ts +0 -28
  78. package/src/bridge/request.ts +0 -176
  79. package/src/classnames/__tests__/classNames.ts +0 -20
  80. package/src/classnames/__tests__/mergeClassNames.ts +0 -21
  81. package/src/classnames/classNames.ts +0 -34
  82. package/src/classnames/index.ts +0 -2
  83. package/src/classnames/mergeClassNames.ts +0 -60
  84. package/src/closing-behavior/ClosingBehavior.ts +0 -64
  85. package/src/closing-behavior/__tests__/ClosingBehavior.ts +0 -86
  86. package/src/closing-behavior/index.ts +0 -2
  87. package/src/closing-behavior/types.ts +0 -12
  88. package/src/cloud-storage/CloudStorage.ts +0 -138
  89. package/src/cloud-storage/index.ts +0 -1
  90. package/src/colors/__tests__/isColorDark.ts +0 -12
  91. package/src/colors/__tests__/isRGB.ts +0 -13
  92. package/src/colors/__tests__/isRGBShort.ts +0 -13
  93. package/src/colors/__tests__/toRGB.ts +0 -23
  94. package/src/colors/index.ts +0 -5
  95. package/src/colors/isColorDark.ts +0 -22
  96. package/src/colors/isRGB.ts +0 -9
  97. package/src/colors/isRGBShort.ts +0 -9
  98. package/src/colors/toRGB.ts +0 -49
  99. package/src/colors/types.ts +0 -9
  100. package/src/css/__tests__/bindMiniAppCSSVars.ts +0 -175
  101. package/src/css/__tests__/bindThemeCSSVars.ts +0 -52
  102. package/src/css/__tests__/bindViewportCSSVars.ts +0 -55
  103. package/src/css/__tests__/setCSSVar.ts +0 -14
  104. package/src/css/bindMiniAppCSSVars.ts +0 -51
  105. package/src/css/bindThemeCSSVars.ts +0 -31
  106. package/src/css/bindViewportCSSVars.ts +0 -36
  107. package/src/css/index.ts +0 -4
  108. package/src/css/setCSSVar.ts +0 -8
  109. package/src/event-emitter/EventEmitter.ts +0 -146
  110. package/src/event-emitter/__tests__/EventEmitter.ts +0 -145
  111. package/src/event-emitter/index.ts +0 -2
  112. package/src/event-emitter/types.ts +0 -60
  113. package/src/globals.ts +0 -38
  114. package/src/haptic-feedback/HapticFeedback.ts +0 -70
  115. package/src/haptic-feedback/__tests__/HapticFeedback.ts +0 -68
  116. package/src/haptic-feedback/index.ts +0 -1
  117. package/src/index.ts +0 -185
  118. package/src/init/catchCustomStyles.ts +0 -17
  119. package/src/init/creators/__tests__/createViewport.ts +0 -96
  120. package/src/init/creators/createBackButton.ts +0 -25
  121. package/src/init/creators/createClosingBehavior.ts +0 -24
  122. package/src/init/creators/createMainButton.ts +0 -51
  123. package/src/init/creators/createMiniApp.ts +0 -48
  124. package/src/init/creators/createRequestIdGenerator.ts +0 -13
  125. package/src/init/creators/createSettingsButton.ts +0 -25
  126. package/src/init/creators/createThemeParams.ts +0 -11
  127. package/src/init/creators/createViewport.ts +0 -94
  128. package/src/init/creators/index.ts +0 -8
  129. package/src/init/css/index.ts +0 -1
  130. package/src/init/css/processCSSVarsOption.ts +0 -55
  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
@@ -1,146 +0,0 @@
1
- import type {
2
- AnySubscribeListener,
3
- EmptyEventName,
4
- EventListener, EventName,
5
- EventParams, NonEmptyEventName, RemoveEventListener,
6
- } from './types.js';
7
-
8
- type AddedEventListener = [listener: EventListener<any>, once: boolean];
9
-
10
- /**
11
- * Opinionated event emitter implementation.
12
- */
13
- export class EventEmitter<Schema> {
14
- private readonly listeners: Map<string, AddedEventListener[]> = new Map();
15
-
16
- private readonly subscribeListeners: AnySubscribeListener<Schema>[] = [];
17
-
18
- /**
19
- * Adds specified event listener.
20
- * @param event - event name.
21
- * @param listener - event listener.
22
- * @param once - should listener called only once.
23
- */
24
- private addListener<E extends EventName<Schema>>(
25
- event: E,
26
- listener: EventListener<Schema[E]>,
27
- once: boolean,
28
- ): RemoveEventListener {
29
- let listeners = this.listeners.get(event);
30
- if (!listeners) {
31
- listeners = [];
32
- this.listeners.set(event, listeners);
33
- }
34
-
35
- listeners.push([listener, once]);
36
-
37
- return () => this.off(event, listener);
38
- }
39
-
40
- /**
41
- * Emits known event which has no parameters.
42
- * @param event - event name.
43
- */
44
- emit<E extends EmptyEventName<Schema>>(event: E): void;
45
-
46
- /**
47
- * Emits known event which has parameters.
48
- * @param event - event name.
49
- * @param args - list of event listener arguments.
50
- */
51
- emit<E extends NonEmptyEventName<Schema>>(
52
- event: E,
53
- ...args: EventParams<Schema[E]>
54
- ): void;
55
-
56
- emit(event: EventName<Schema>, ...args: any[]): void {
57
- this.subscribeListeners.forEach((l) => (l as any)(event, ...args));
58
-
59
- const listeners = this.listeners.get(event);
60
- if (!listeners) {
61
- return;
62
- }
63
-
64
- listeners.forEach(([listener, once], idx) => {
65
- listener(...args);
66
- if (once) {
67
- listeners.splice(idx, 1);
68
- }
69
- });
70
- }
71
-
72
- /**
73
- * Adds event listener.
74
- * @param event - event name.
75
- * @param listener - event listener.
76
- * @returns Function to remove event listener.
77
- */
78
- on<E extends EventName<Schema>>(
79
- event: E,
80
- listener: EventListener<Schema[E]>,
81
- ): RemoveEventListener {
82
- return this.addListener(event, listener, false);
83
- }
84
-
85
- /**
86
- * Adds event listener following the logic, described in `on` method, but calls specified
87
- * listener only once, removing it after.
88
- * @param event - event name.
89
- * @param listener - event listener.
90
- * @returns Function to remove event listener.
91
- * @see on
92
- */
93
- once<E extends EventName<Schema>>(
94
- event: E,
95
- listener: EventListener<Schema[E]>,
96
- ): RemoveEventListener {
97
- return this.addListener(event, listener, true);
98
- }
99
-
100
- /**
101
- * Removes event listener. In case, specified listener was bound several times, it removes
102
- * only a single one.
103
- * @param event - event name.
104
- * @param listener - event listener.
105
- */
106
- off<E extends EventName<Schema>>(event: E, listener: EventListener<Schema[E]>): void {
107
- const listeners = this.listeners.get(event);
108
- if (!listeners) {
109
- return;
110
- }
111
-
112
- for (let i = 0; i < listeners.length; i += 1) {
113
- if (listener === listeners[i][0]) {
114
- listeners.splice(i, 1);
115
- return;
116
- }
117
- }
118
- }
119
-
120
- /**
121
- * Adds event listener to all events.
122
- * @param listener - events listener.
123
- * @returns Function to remove event listener.
124
- * @see on
125
- * @see once
126
- */
127
- subscribe(listener: AnySubscribeListener<Schema>): RemoveEventListener {
128
- this.subscribeListeners.push(listener);
129
- return () => this.unsubscribe(listener);
130
- }
131
-
132
- /**
133
- * Removes global event listener. In case, specified listener was bound several times, it removes
134
- * only a single one.
135
- * @param listener - events listener.
136
- * @returns Function to remove event listener.
137
- */
138
- unsubscribe(listener: AnySubscribeListener<Schema>): void {
139
- for (let i = 0; i < this.subscribeListeners.length; i += 1) {
140
- if (this.subscribeListeners[i] === listener) {
141
- this.subscribeListeners.splice(i, 1);
142
- return;
143
- }
144
- }
145
- }
146
- }
@@ -1,145 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest';
2
-
3
- import { EventEmitter } from '../EventEmitter';
4
-
5
- interface EventsMap {
6
- test: (a: number, b: boolean) => void;
7
- hey: never;
8
- }
9
-
10
- let ee: EventEmitter<EventsMap>;
11
-
12
- beforeEach(() => {
13
- ee = new EventEmitter<EventsMap>();
14
- });
15
-
16
- describe('on', () => {
17
- it('should emit bound listener with specified arguments', () => {
18
- const listener = vi.fn();
19
- ee.on('test', listener);
20
- ee.emit('test', 1, true);
21
- expect(listener).toHaveBeenCalledOnce();
22
- expect(listener).toBeCalledWith(1, true);
23
- });
24
-
25
- it('should emit bound listener with specified arguments as many times as it was bound', () => {
26
- const listener = vi.fn();
27
- ee.on('test', listener);
28
- ee.on('test', listener);
29
- ee.emit('test', 1, true);
30
- expect(listener).toHaveBeenCalledTimes(2);
31
- expect(listener).toHaveBeenNthCalledWith(1, 1, true);
32
- expect(listener).toHaveBeenNthCalledWith(2, 1, true);
33
- });
34
-
35
- it('should not emit bound listener in case, event name does not match', () => {
36
- const listener = vi.fn();
37
- ee.on('test', listener);
38
- ee.emit('hey');
39
- expect(listener).not.toBeCalled();
40
- });
41
-
42
- it('should remove listener if returned function was called', () => {
43
- const listener = vi.fn();
44
- const off = ee.on('test', listener);
45
-
46
- off();
47
- ee.emit('test', 1, true);
48
- expect(listener).not.toBeCalled();
49
- });
50
- });
51
-
52
- describe('once', () => {
53
- it('should emit bound listener with specified arguments only once', () => {
54
- const listener = vi.fn();
55
- ee.once('test', listener);
56
- ee.emit('test', 1, true);
57
- ee.emit('test', 1, true);
58
- ee.emit('test', 1, true);
59
- expect(listener).toHaveBeenCalledOnce();
60
- expect(listener).toBeCalledWith(1, true);
61
- });
62
-
63
- it('should emit bound listener with specified arguments as many times as it was bound', () => {
64
- const listener = vi.fn();
65
- ee.once('test', listener);
66
- ee.once('test', listener);
67
- ee.emit('test', 1, true);
68
- ee.emit('test', 1, true);
69
- expect(listener).toHaveBeenCalledTimes(2);
70
- expect(listener).toHaveBeenNthCalledWith(1, 1, true);
71
- expect(listener).toHaveBeenNthCalledWith(2, 1, true);
72
- });
73
-
74
- it('should not emit bound listener in case, event name does not match', () => {
75
- const listener = vi.fn();
76
- ee.once('test', listener);
77
- ee.emit('hey');
78
- expect(listener).not.toBeCalled();
79
- });
80
-
81
- it('should remove listener if returned function was called', () => {
82
- const listener = vi.fn();
83
- const off = ee.once('test', listener);
84
-
85
- off();
86
- ee.emit('test', 1, true);
87
- expect(listener).not.toBeCalled();
88
- });
89
- });
90
-
91
- describe('off', () => {
92
- it('should not emit bound listener in case, it was unbound', () => {
93
- const listener = vi.fn();
94
- ee.on('test', listener);
95
- ee.off('test', listener);
96
- ee.emit('test', 1, true);
97
- expect(listener).not.toBeCalled();
98
- });
99
-
100
- it('should not do anything in case, event has no listeners', () => {
101
- expect(() => {
102
- const listener = vi.fn();
103
- ee.off('test', listener);
104
- }).not.toThrow();
105
- });
106
-
107
- it('should remove event listener bound via "once" method', () => {
108
- const listener = vi.fn();
109
- ee.once('test', listener);
110
- ee.off('test', listener);
111
- ee.emit('test', 1, true);
112
- expect(listener).not.toBeCalled();
113
- });
114
-
115
- it('should not do anything if received not bound listener', () => {
116
- ee.on('test', vi.fn());
117
- expect(() => ee.off('test', vi.fn())).not.toThrow();
118
- });
119
- });
120
-
121
- describe('subscribe', () => {
122
- it('should catch any emitted event', () => {
123
- const listener = vi.fn();
124
- ee.subscribe(listener);
125
- ee.emit('test', 1, true);
126
- ee.emit('hey');
127
- expect(listener).toBeCalledTimes(2);
128
- expect(listener).toHaveBeenNthCalledWith(1, 'test', 1, true);
129
- expect(listener).toHaveBeenNthCalledWith(2, 'hey');
130
- });
131
- });
132
-
133
- describe('unsubscribe', () => {
134
- it('should not emit event if it was unbound', () => {
135
- const listener = vi.fn();
136
- ee.subscribe(listener);
137
- ee.unsubscribe(listener);
138
- ee.emit('test', 1, true);
139
- expect(listener).not.toBeCalled();
140
- });
141
-
142
- it('should not do anything if received not bound listener', () => {
143
- expect(() => ee.unsubscribe(vi.fn())).not.toThrow();
144
- });
145
- });
@@ -1,2 +0,0 @@
1
- export * from './EventEmitter.js';
2
- export * from './types.js';
@@ -1,60 +0,0 @@
1
- import type { IsNever } from '~/types/index.js';
2
-
3
- /**
4
- * Function accepting the list of passed arguments and returning nothing.
5
- */
6
- type VoidFunc<Args extends any[] = []> = (...args: Args) => void;
7
-
8
- /**
9
- * Accepts type assuming, it is responsible for describing event listener
10
- * parameters. Covers following cases:
11
- * 1. If function is passed, return its arguments.
12
- * 2. If never or void is passed, return empty tuple.
13
- * 3. If array is passed return this type.
14
- * 4. Otherwise, return tuple with passed type.
15
- */
16
- export type EventParams<Params> = Params extends any[]
17
- ? Params
18
- : Params extends (...args: any[]) => any
19
- ? Parameters<Params>
20
- : IsNever<Params> extends true
21
- ? []
22
- : Params extends void
23
- ? []
24
- : [Params];
25
-
26
- /**
27
- * Returns function that represents event listener with specified
28
- * list of parameters.
29
- */
30
- export type EventListener<Params> = VoidFunc<EventParams<Params>>;
31
-
32
- /**
33
- * Returns event names.
34
- */
35
- export type EventName<Schema> = Extract<keyof Schema, string>;
36
-
37
- /**
38
- * Returns event names which do not require any arguments.
39
- */
40
- export type EmptyEventName<Schema> = {
41
- [E in EventName<Schema>]: EventParams<Schema[E]> extends [] ? E : never;
42
- }[EventName<Schema>];
43
-
44
- /**
45
- * Returns event names which require arguments.
46
- */
47
- export type NonEmptyEventName<Schema> =
48
- Exclude<EventName<Schema>, EmptyEventName<Schema>>;
49
-
50
- /**
51
- * Represents any listener, which could be used in EventEmitter.subscribe.
52
- */
53
- export type AnySubscribeListener<Schema> = {
54
- [E in keyof Schema]: (event: E, ...args: EventParams<Schema[E]>) => void;
55
- }[keyof Schema];
56
-
57
- /**
58
- * Function which removes event listener.
59
- */
60
- export type RemoveEventListener = () => void;
package/src/globals.ts DELETED
@@ -1,38 +0,0 @@
1
- import { Logger } from '~/logger/index.js';
2
-
3
- let currentTargetOrigin = 'https://web.telegram.org';
4
-
5
- export const logger = new Logger('[SDK]', false);
6
-
7
- /**
8
- * Sets new debug mode. Enabling debug mode leads to printing
9
- * additional messages in console, related to the processes
10
- * inside the package.
11
- * @param value - should debug mode be enabled.
12
- */
13
- export function setDebug(value: boolean): void {
14
- if (value) {
15
- logger.enable();
16
- return;
17
- }
18
- logger.disable();
19
- }
20
-
21
- /**
22
- * Sets new global targetOrigin, used by `postEvent` method.
23
- * Default value is "https://web.telegram.org". You don't need to
24
- * use this method until you know what you are doing.
25
- *
26
- * This method could be used for test purposes.
27
- * @param value - new target origin.
28
- */
29
- export function setTargetOrigin(value: string): void {
30
- currentTargetOrigin = value;
31
- }
32
-
33
- /**
34
- * Returns current global target origin.
35
- */
36
- export function targetOrigin(): string {
37
- return currentTargetOrigin;
38
- }
@@ -1,70 +0,0 @@
1
- import {
2
- type ImpactHapticFeedbackStyle,
3
- type NotificationHapticFeedbackType,
4
- type PostEvent,
5
- postEvent as defaultPostEvent,
6
- } from '~/bridge/index.js';
7
- import {
8
- createSupportsFunc,
9
- type SupportsFunc,
10
- } from '~/supports/index.js';
11
- import type { Version } from '~/version/index.js';
12
-
13
- /**
14
- * Class which controls haptic feedback. It allows calling different types of
15
- * haptic notifications which usually occur after user interaction with
16
- * application.
17
- */
18
- export class HapticFeedback {
19
- constructor(
20
- version: Version,
21
- private readonly postEvent: PostEvent = defaultPostEvent,
22
- ) {
23
- this.supports = createSupportsFunc(version, {
24
- impactOccurred: 'web_app_trigger_haptic_feedback',
25
- notificationOccurred: 'web_app_trigger_haptic_feedback',
26
- selectionChanged: 'web_app_trigger_haptic_feedback',
27
- });
28
- }
29
-
30
- /**
31
- * A method tells that an impact occurred. The Telegram app may play the
32
- * appropriate haptics based on style value passed.
33
- * @param style - impact style.
34
- */
35
- impactOccurred(style: ImpactHapticFeedbackStyle): void {
36
- this.postEvent('web_app_trigger_haptic_feedback', {
37
- type: 'impact',
38
- impact_style: style,
39
- });
40
- }
41
-
42
- /**
43
- * A method tells that a task or action has succeeded, failed, or produced
44
- * a warning. The Telegram app may play the appropriate haptics based on
45
- * type value passed.
46
- * @param type - notification type.
47
- */
48
- notificationOccurred(type: NotificationHapticFeedbackType): void {
49
- this.postEvent('web_app_trigger_haptic_feedback', {
50
- type: 'notification',
51
- notification_type: type,
52
- });
53
- }
54
-
55
- /**
56
- * A method tells that the user has changed a selection. The Telegram app
57
- * may play the appropriate haptics.
58
- *
59
- * Do not use this feedback when the user makes or confirms a selection;
60
- * use it only when the selection changes.
61
- */
62
- selectionChanged(): void {
63
- this.postEvent('web_app_trigger_haptic_feedback', { type: 'selection_change' });
64
- }
65
-
66
- /**
67
- * Checks if specified method is supported by current component.
68
- */
69
- supports: SupportsFunc<'impactOccurred' | 'notificationOccurred' | 'selectionChanged'>;
70
- }
@@ -1,68 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
-
3
- import { HapticFeedback } from '../HapticFeedback';
4
-
5
- describe('impactOccurred', () => {
6
- it('should call "web_app_trigger_haptic_feedback" method with { type: "impact", style: {{style}} }', () => {
7
- const postEvent = vi.fn();
8
- const haptic = new HapticFeedback('', postEvent);
9
-
10
- expect(postEvent).toHaveBeenCalledTimes(0);
11
- haptic.impactOccurred('heavy');
12
- expect(postEvent).toHaveBeenCalledTimes(1);
13
- expect(postEvent).toHaveBeenCalledWith('web_app_trigger_haptic_feedback', {
14
- type: 'impact',
15
- impact_style: 'heavy',
16
- });
17
- });
18
- });
19
-
20
- describe('notificationOccurred', () => {
21
- it('should call "web_app_trigger_haptic_feedback" method with { type: "notification", notification_type: {{type}} }', () => {
22
- const postEvent = vi.fn();
23
- const haptic = new HapticFeedback('', postEvent);
24
-
25
- expect(postEvent).toHaveBeenCalledTimes(0);
26
- haptic.notificationOccurred('success');
27
- expect(postEvent).toHaveBeenCalledTimes(1);
28
- expect(postEvent).toHaveBeenCalledWith('web_app_trigger_haptic_feedback', {
29
- type: 'notification',
30
- notification_type: 'success',
31
- });
32
- });
33
- });
34
-
35
- describe('selectionChanged', () => {
36
- it('should call "web_app_trigger_haptic_feedback" method with { type: "selection_change" }', () => {
37
- const postEvent = vi.fn();
38
- const haptic = new HapticFeedback('', postEvent);
39
-
40
- expect(postEvent).toHaveBeenCalledTimes(0);
41
- haptic.selectionChanged();
42
- expect(postEvent).toHaveBeenCalledTimes(1);
43
- expect(postEvent).toHaveBeenCalledWith('web_app_trigger_haptic_feedback', {
44
- type: 'selection_change',
45
- });
46
- });
47
- });
48
-
49
- describe('supports', () => {
50
- describe('impactOccurred / notificationOccurred / selectionChanged', () => {
51
- it('should return true in case, HapticFeedback version is 6.1 or higher. False, otherwise', () => {
52
- const haptic1 = new HapticFeedback('6.0');
53
- expect(haptic1.supports('impactOccurred')).toBe(false);
54
- expect(haptic1.supports('notificationOccurred')).toBe(false);
55
- expect(haptic1.supports('selectionChanged')).toBe(false);
56
-
57
- const haptic2 = new HapticFeedback('6.1');
58
- expect(haptic2.supports('impactOccurred')).toBe(true);
59
- expect(haptic2.supports('notificationOccurred')).toBe(true);
60
- expect(haptic2.supports('selectionChanged')).toBe(true);
61
-
62
- const haptic3 = new HapticFeedback('6.2');
63
- expect(haptic3.supports('impactOccurred')).toBe(true);
64
- expect(haptic3.supports('notificationOccurred')).toBe(true);
65
- expect(haptic3.supports('selectionChanged')).toBe(true);
66
- });
67
- });
68
- });
@@ -1 +0,0 @@
1
- export * from './HapticFeedback.js';