@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,23 +0,0 @@
1
- import { expect, it } from 'vitest';
2
-
3
- import { toRGB } from '../toRGB';
4
-
5
- it('should return same value in case, full version of RGB is passed', () => {
6
- expect(toRGB('#ffffff')).toBe('#ffffff');
7
- });
8
-
9
- it('should return full RGB value in case, its short presentation is passed', () => {
10
- expect(toRGB('#abc')).toBe('#aabbcc');
11
- });
12
-
13
- it('should return RGB representation of rgb(*,*,*) pattern', () => {
14
- expect(toRGB('rgb(6,56,11)')).toBe('#06380b');
15
- });
16
-
17
- it('should return RGB representation of rgba(*,*,*) pattern', () => {
18
- expect(toRGB('rgba(6,56,11,22)')).toBe('#06380b');
19
- });
20
-
21
- it('should throw an error in other cases', () => {
22
- expect(() => toRGB('abc')).toThrow();
23
- });
@@ -1,5 +0,0 @@
1
- export * from './isColorDark.js';
2
- export * from './isRGB.js';
3
- export * from './isRGBShort.js';
4
- export * from './toRGB.js';
5
- export * from './types.js';
@@ -1,22 +0,0 @@
1
- import { toRGB } from './toRGB.js';
2
-
3
- /**
4
- * Returns true in case, the color is recognized as dark.
5
- * @param color - color in any format acceptable by toRGB function.
6
- * @see toRGB
7
- */
8
- export function isColorDark(color: string): boolean {
9
- // Convert color to RGB.
10
- const rgb = toRGB(color);
11
-
12
- // Real formula: hsp = Math.sqrt(0.299 * r * r + 0.587 * g * g + 0.114 * b * b)
13
- // See: https://stackoverflow.com/a/596243
14
- const hsp = Math.sqrt(
15
- [0.299, 0.587, 0.114].reduce<number>((acc, modifier, idx) => {
16
- // Extract part of #RRGGBB pattern and convert it to DEC.
17
- const dec = parseInt(rgb.slice(1 + idx * 2, 1 + (idx + 1) * 2), 16);
18
- return acc + dec * dec * modifier;
19
- }, 0),
20
- );
21
- return hsp < 120;
22
- }
@@ -1,9 +0,0 @@
1
- import type { RGB } from './types.js';
2
-
3
- /**
4
- * Returns true in case, passed value has #RRGGBB format.
5
- * @param value - value to check.
6
- */
7
- export function isRGB(value: string): value is RGB {
8
- return /^#[\da-f]{6}$/i.test(value);
9
- }
@@ -1,9 +0,0 @@
1
- import type { RGBShort } from './types.js';
2
-
3
- /**
4
- * Returns true in case, passed value has #RGB format.
5
- * @param value - value to check.
6
- */
7
- export function isRGBShort(value: string): value is RGBShort {
8
- return /^#[\da-f]{3}$/i.test(value);
9
- }
@@ -1,49 +0,0 @@
1
- import { isRGB } from './isRGB.js';
2
- import { isRGBShort } from './isRGBShort.js';
3
- import type { RGB } from './types.js';
4
-
5
- /**
6
- * Converts passed value to #RRGGBB format. Accepts following color formats:
7
- * - `#RGB`
8
- * - `#RRGGBB`
9
- * - `rgb(1,2,3)`
10
- * - `rgba(1,2,3,4)`
11
- * @param value - value to convert.
12
- * @throws {Error} Passed value does not satisfy any of known RGB formats.
13
- */
14
- export function toRGB(value: string): RGB {
15
- // Remove all spaces.
16
- const clean = value.replace(/\s/g, '').toLowerCase();
17
-
18
- // Value already has required format.
19
- if (isRGB(clean)) {
20
- return clean;
21
- }
22
-
23
- // Convert from #RGB.
24
- if (isRGBShort(clean)) {
25
- let color = '#';
26
-
27
- for (let i = 0; i < 3; i += 1) {
28
- color += clean[1 + i].repeat(2);
29
- }
30
- return color as RGB;
31
- }
32
-
33
- // Example valid values: rgb(0,3,10) rgba(32,114,8,0)
34
- const match = clean.match(/^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/)
35
- || clean.match(/^rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),\d{1,3}\)$/);
36
-
37
- // In case, this didn't work as well, we can't extract RGB color from passed
38
- // text.
39
- if (match === null) {
40
- throw new Error(`Value "${value}" does not satisfy any of known RGB formats.`);
41
- }
42
-
43
- // Otherwise, take R, G and B components, convert to hex and create #RRGGBB
44
- // string.
45
- return match.slice(1).reduce((acc, component) => {
46
- const formatted = parseInt(component, 10).toString(16);
47
- return acc + (formatted.length === 1 ? '0' : '') + formatted;
48
- }, '#') as RGB;
49
- }
@@ -1,9 +0,0 @@
1
- /**
2
- * Color in format #RGB.
3
- */
4
- export type RGBShort = `#${string}`;
5
-
6
- /**
7
- * Color in format #RRGGBB.
8
- */
9
- export type RGB = `#${string}`;
@@ -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';