@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.
- package/README.md +2 -2
- package/dist/dts/bridge/events/events.d.ts +16 -16
- package/dist/dts/bridge/methods/methods.d.ts +27 -27
- package/dist/dts/bridge/methods/popup.d.ts +1 -1
- package/dist/dts/init-data/types.d.ts +3 -3
- package/dist/dts/launch-params/types.d.ts +1 -1
- package/dist/dts/theme-params/types.d.ts +1 -1
- package/dist/index.cjs +0 -1
- package/dist/index.iife.js +0 -1
- package/dist/index.mjs +0 -1
- package/package.json +2 -3
- package/dist/index.cjs.map +0 -1
- package/dist/index.iife.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/src/__tests__/globals.ts +0 -39
- package/src/back-button/BackButton.ts +0 -90
- package/src/back-button/__tests__/BackButton.ts +0 -129
- package/src/back-button/index.ts +0 -2
- package/src/back-button/types.ts +0 -14
- package/src/bridge/__tests__/parseMessage.ts +0 -23
- package/src/bridge/__tests__/request.ts +0 -236
- package/src/bridge/env/__tests__/hasExternalNotify.ts +0 -15
- package/src/bridge/env/__tests__/hasWebviewProxy.ts +0 -15
- package/src/bridge/env/__tests__/isIframe.ts +0 -30
- package/src/bridge/env/hasExternalNotify.ts +0 -19
- package/src/bridge/env/hasWebviewProxy.ts +0 -19
- package/src/bridge/env/index.ts +0 -3
- package/src/bridge/env/isIframe.ts +0 -11
- package/src/bridge/errors/MethodUnsupportedError.ts +0 -13
- package/src/bridge/errors/ParameterUnsupportedError.ts +0 -13
- package/src/bridge/errors/index.ts +0 -2
- package/src/bridge/events/__tests__/createEmitter.ts +0 -143
- package/src/bridge/events/__tests__/off.ts +0 -34
- package/src/bridge/events/__tests__/on.ts +0 -49
- package/src/bridge/events/__tests__/onTelegramEvent.ts +0 -49
- package/src/bridge/events/__tests__/once.ts +0 -64
- package/src/bridge/events/__tests__/singletonEmitter.ts +0 -22
- package/src/bridge/events/__tests__/subscribe.ts +0 -49
- package/src/bridge/events/__tests__/unsubscribe.ts +0 -34
- package/src/bridge/events/createEmitter.ts +0 -108
- package/src/bridge/events/events.ts +0 -170
- package/src/bridge/events/index.ts +0 -9
- package/src/bridge/events/off.ts +0 -14
- package/src/bridge/events/on.ts +0 -19
- package/src/bridge/events/onTelegramEvent.ts +0 -81
- package/src/bridge/events/once.ts +0 -18
- package/src/bridge/events/parsers/__tests__/clipboardTextReceived.ts +0 -21
- package/src/bridge/events/parsers/__tests__/invoiceClosed.ts +0 -12
- package/src/bridge/events/parsers/__tests__/popupClosed.ts +0 -10
- package/src/bridge/events/parsers/__tests__/qrTextReceived.ts +0 -9
- package/src/bridge/events/parsers/__tests__/theme-changed.ts +0 -42
- package/src/bridge/events/parsers/__tests__/viewportChanged.ts +0 -49
- package/src/bridge/events/parsers/clipboardTextReceived.ts +0 -26
- package/src/bridge/events/parsers/customMethodInvoked.ts +0 -25
- package/src/bridge/events/parsers/index.ts +0 -9
- package/src/bridge/events/parsers/invoiceClosed.ts +0 -26
- package/src/bridge/events/parsers/phoneRequested.ts +0 -14
- package/src/bridge/events/parsers/popupClosed.ts +0 -19
- package/src/bridge/events/parsers/qrTextReceived.ts +0 -14
- package/src/bridge/events/parsers/theme-changed.ts +0 -58
- package/src/bridge/events/parsers/viewportChanged.ts +0 -33
- package/src/bridge/events/parsers/writeAccessRequested.ts +0 -14
- package/src/bridge/events/singletonEmitter.ts +0 -19
- package/src/bridge/events/subscribe.ts +0 -15
- package/src/bridge/events/unsubscribe.ts +0 -10
- package/src/bridge/index.ts +0 -7
- package/src/bridge/invokeCustomMethod.ts +0 -56
- package/src/bridge/methods/__tests__/createPostEvent.ts +0 -37
- package/src/bridge/methods/__tests__/postEvent.ts +0 -137
- package/src/bridge/methods/createPostEvent.ts +0 -40
- package/src/bridge/methods/custom-methods.ts +0 -68
- package/src/bridge/methods/haptic.ts +0 -52
- package/src/bridge/methods/index.ts +0 -6
- package/src/bridge/methods/methods.ts +0 -370
- package/src/bridge/methods/popup.ts +0 -53
- package/src/bridge/methods/postEvent.ts +0 -101
- package/src/bridge/parseMessage.ts +0 -28
- package/src/bridge/request.ts +0 -176
- package/src/classnames/__tests__/classNames.ts +0 -20
- package/src/classnames/__tests__/mergeClassNames.ts +0 -21
- package/src/classnames/classNames.ts +0 -34
- package/src/classnames/index.ts +0 -2
- package/src/classnames/mergeClassNames.ts +0 -60
- package/src/closing-behavior/ClosingBehavior.ts +0 -64
- package/src/closing-behavior/__tests__/ClosingBehavior.ts +0 -86
- package/src/closing-behavior/index.ts +0 -2
- package/src/closing-behavior/types.ts +0 -12
- package/src/cloud-storage/CloudStorage.ts +0 -138
- package/src/cloud-storage/index.ts +0 -1
- package/src/colors/__tests__/isColorDark.ts +0 -12
- package/src/colors/__tests__/isRGB.ts +0 -13
- package/src/colors/__tests__/isRGBShort.ts +0 -13
- package/src/colors/__tests__/toRGB.ts +0 -23
- package/src/colors/index.ts +0 -5
- package/src/colors/isColorDark.ts +0 -22
- package/src/colors/isRGB.ts +0 -9
- package/src/colors/isRGBShort.ts +0 -9
- package/src/colors/toRGB.ts +0 -49
- package/src/colors/types.ts +0 -9
- package/src/css/__tests__/bindMiniAppCSSVars.ts +0 -175
- package/src/css/__tests__/bindThemeCSSVars.ts +0 -52
- package/src/css/__tests__/bindViewportCSSVars.ts +0 -55
- package/src/css/__tests__/setCSSVar.ts +0 -14
- package/src/css/bindMiniAppCSSVars.ts +0 -51
- package/src/css/bindThemeCSSVars.ts +0 -31
- package/src/css/bindViewportCSSVars.ts +0 -36
- package/src/css/index.ts +0 -4
- package/src/css/setCSSVar.ts +0 -8
- package/src/event-emitter/EventEmitter.ts +0 -146
- package/src/event-emitter/__tests__/EventEmitter.ts +0 -145
- package/src/event-emitter/index.ts +0 -2
- package/src/event-emitter/types.ts +0 -60
- package/src/globals.ts +0 -38
- package/src/haptic-feedback/HapticFeedback.ts +0 -70
- package/src/haptic-feedback/__tests__/HapticFeedback.ts +0 -68
- package/src/haptic-feedback/index.ts +0 -1
- package/src/index.ts +0 -185
- package/src/init/catchCustomStyles.ts +0 -17
- package/src/init/creators/__tests__/createViewport.ts +0 -96
- package/src/init/creators/createBackButton.ts +0 -25
- package/src/init/creators/createClosingBehavior.ts +0 -24
- package/src/init/creators/createMainButton.ts +0 -51
- package/src/init/creators/createMiniApp.ts +0 -48
- package/src/init/creators/createRequestIdGenerator.ts +0 -13
- package/src/init/creators/createSettingsButton.ts +0 -25
- package/src/init/creators/createThemeParams.ts +0 -11
- package/src/init/creators/createViewport.ts +0 -94
- package/src/init/creators/index.ts +0 -8
- package/src/init/css/index.ts +0 -1
- package/src/init/css/processCSSVarsOption.ts +0 -55
- package/src/init/index.ts +0 -2
- package/src/init/init.ts +0 -134
- package/src/init/types.ts +0 -94
- package/src/init-data/InitData.ts +0 -96
- package/src/init-data/__tests__/InitData.ts +0 -98
- package/src/init-data/__tests__/chatParser.ts +0 -102
- package/src/init-data/__tests__/initDataParser.ts +0 -136
- package/src/init-data/__tests__/parseInitData.ts +0 -136
- package/src/init-data/__tests__/userParser.ts +0 -96
- package/src/init-data/chatParser.ts +0 -19
- package/src/init-data/index.ts +0 -6
- package/src/init-data/initDataParser.ts +0 -41
- package/src/init-data/parseInitData.ts +0 -10
- package/src/init-data/types.ts +0 -164
- package/src/init-data/userParser.ts +0 -45
- package/src/invoice/Invoice.ts +0 -123
- package/src/invoice/index.ts +0 -2
- package/src/invoice/types.ts +0 -11
- package/src/launch-params/__tests__/retrieveFromUrl.ts +0 -19
- package/src/launch-params/computeLaunchData.ts +0 -81
- package/src/launch-params/computePageReload.ts +0 -13
- package/src/launch-params/getFirstNavigationEntry.ts +0 -10
- package/src/launch-params/index.ts +0 -13
- package/src/launch-params/launchParamsParser.ts +0 -45
- package/src/launch-params/parseLaunchParams.ts +0 -10
- package/src/launch-params/retrieveCurrent.ts +0 -27
- package/src/launch-params/retrieveFromLocation.ts +0 -10
- package/src/launch-params/retrieveFromPerformance.ts +0 -18
- package/src/launch-params/retrieveFromUrl.ts +0 -19
- package/src/launch-params/retrieveLaunchData.ts +0 -30
- package/src/launch-params/serializeLaunchParams.ts +0 -37
- package/src/launch-params/storage.ts +0 -33
- package/src/launch-params/types.ts +0 -62
- package/src/logger/Logger.ts +0 -72
- package/src/logger/__tests__/Logger.ts +0 -107
- package/src/logger/index.ts +0 -1
- package/src/main-button/MainButton.ts +0 -239
- package/src/main-button/__tests__/MainButton.ts +0 -346
- package/src/main-button/index.ts +0 -2
- package/src/main-button/types.ts +0 -26
- package/src/mini-app/MiniApp.ts +0 -348
- package/src/mini-app/__tests__/MiniApp.ts +0 -140
- package/src/mini-app/contactParser.ts +0 -29
- package/src/mini-app/index.ts +0 -2
- package/src/mini-app/types.ts +0 -38
- package/src/misc/__tests__/isRecord.ts +0 -21
- package/src/misc/index.ts +0 -2
- package/src/misc/isRecord.ts +0 -7
- package/src/misc/isTMA.ts +0 -13
- package/src/navigation/HashNavigator/HashNavigator.ts +0 -220
- package/src/navigation/HashNavigator/__tests__/HashNavigator.ts +0 -144
- package/src/navigation/HashNavigator/__tests__/drop.ts +0 -42
- package/src/navigation/HashNavigator/__tests__/go.ts +0 -9
- package/src/navigation/HashNavigator/drop.ts +0 -36
- package/src/navigation/HashNavigator/go.ts +0 -28
- package/src/navigation/HashNavigator/index.ts +0 -2
- package/src/navigation/HashNavigator/types.ts +0 -41
- package/src/navigation/Navigator/Navigator.ts +0 -282
- package/src/navigation/Navigator/index.ts +0 -2
- package/src/navigation/Navigator/types.ts +0 -55
- package/src/navigation/ensurePrefix.ts +0 -9
- package/src/navigation/getHash.ts +0 -17
- package/src/navigation/index.ts +0 -4
- package/src/parsing/ArrayValueParser.ts +0 -79
- package/src/parsing/ParseError.ts +0 -27
- package/src/parsing/ParseSchemaFieldError.ts +0 -21
- package/src/parsing/ValueParser.ts +0 -71
- package/src/parsing/__tests__/ArrayValueParser.ts +0 -18
- package/src/parsing/__tests__/toRecord.ts +0 -10
- package/src/parsing/createValueParserGenerator.ts +0 -16
- package/src/parsing/index.ts +0 -10
- package/src/parsing/parseBySchema.ts +0 -65
- package/src/parsing/parsers/__tests__/array.ts +0 -39
- package/src/parsing/parsers/__tests__/boolean.ts +0 -31
- package/src/parsing/parsers/__tests__/date.ts +0 -25
- package/src/parsing/parsers/__tests__/json.ts +0 -80
- package/src/parsing/parsers/__tests__/number.ts +0 -23
- package/src/parsing/parsers/__tests__/rgb.ts +0 -22
- package/src/parsing/parsers/__tests__/searchParams.ts +0 -105
- package/src/parsing/parsers/__tests__/string.ts +0 -25
- package/src/parsing/parsers/array.ts +0 -9
- package/src/parsing/parsers/boolean.ts +0 -22
- package/src/parsing/parsers/date.ts +0 -11
- package/src/parsing/parsers/index.ts +0 -8
- package/src/parsing/parsers/json.ts +0 -17
- package/src/parsing/parsers/number.ts +0 -21
- package/src/parsing/parsers/rgb.ts +0 -10
- package/src/parsing/parsers/searchParams.ts +0 -24
- package/src/parsing/parsers/string.ts +0 -12
- package/src/parsing/toRecord.ts +0 -27
- package/src/parsing/types.ts +0 -32
- package/src/parsing/unexpectedTypeError.ts +0 -6
- package/src/popup/Popup.ts +0 -91
- package/src/popup/__tests__/Popup.ts +0 -130
- package/src/popup/__tests__/preparePopupParams.ts +0 -85
- package/src/popup/index.ts +0 -2
- package/src/popup/preparePopupParams.ts +0 -59
- package/src/popup/types.ts +0 -69
- package/src/qr-scanner/QRScanner.ts +0 -95
- package/src/qr-scanner/index.ts +0 -2
- package/src/qr-scanner/types.ts +0 -11
- package/src/settings-button/SettingsButton.ts +0 -85
- package/src/settings-button/index.ts +0 -2
- package/src/settings-button/types.ts +0 -15
- package/src/state/State.ts +0 -67
- package/src/state/index.ts +0 -2
- package/src/state/types.ts +0 -31
- package/src/storage.ts +0 -69
- package/src/supports/__tests__/supports.ts +0 -123
- package/src/supports/createSupportsFunc.ts +0 -18
- package/src/supports/createSupportsParamFunc.ts +0 -27
- package/src/supports/index.ts +0 -4
- package/src/supports/supports.ts +0 -84
- package/src/supports/types.ts +0 -1
- package/src/theme-params/ThemeParams.ts +0 -131
- package/src/theme-params/__tests__/keys.ts +0 -19
- package/src/theme-params/__tests__/parseThemeParams.ts +0 -29
- package/src/theme-params/__tests__/serializeThemeParams.ts +0 -29
- package/src/theme-params/__tests__/themeParamsParser.ts +0 -29
- package/src/theme-params/index.ts +0 -6
- package/src/theme-params/keys.ts +0 -24
- package/src/theme-params/parseThemeParams.ts +0 -10
- package/src/theme-params/requestThemeParams.ts +0 -13
- package/src/theme-params/serializeThemeParams.ts +0 -20
- package/src/theme-params/themeParamsParser.ts +0 -22
- package/src/theme-params/types.ts +0 -33
- package/src/timeout/TimeoutError.ts +0 -6
- package/src/timeout/__tests__/isTimeoutError.ts +0 -9
- package/src/timeout/__tests__/withTimeout.ts +0 -28
- package/src/timeout/index.ts +0 -4
- package/src/timeout/isTimeoutError.ts +0 -9
- package/src/timeout/sleep.ts +0 -10
- package/src/timeout/withTimeout.ts +0 -24
- package/src/types/index.ts +0 -4
- package/src/types/methods.ts +0 -18
- package/src/types/platform.ts +0 -14
- package/src/types/request-id.ts +0 -10
- package/src/types/utils.ts +0 -50
- package/src/utils/Utils.ts +0 -107
- package/src/utils/index.ts +0 -1
- package/src/version/__tests__/compareVersions.ts +0 -19
- package/src/version/compareVersions.ts +0 -28
- package/src/version/index.ts +0 -2
- package/src/version/types.ts +0 -4
- package/src/viewport/Viewport.ts +0 -171
- package/src/viewport/__tests__/isStableViewportPlatform.ts +0 -15
- package/src/viewport/__tests__/utils.ts +0 -12
- package/src/viewport/index.ts +0 -4
- package/src/viewport/isStableViewportPlatform.ts +0 -10
- package/src/viewport/requestViewport.ts +0 -23
- package/src/viewport/types.ts +0 -23
- package/src/viewport/utils.ts +0 -7
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { Version } from '~/version/index.js';
|
|
2
|
-
|
|
3
|
-
import type { MiniAppsMethodName } from '../methods/index.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Error thrown in case, unsupported parameter was used.
|
|
7
|
-
*/
|
|
8
|
-
export class ParameterUnsupportedError extends Error {
|
|
9
|
-
constructor(method: MiniAppsMethodName, param: string, version: Version) {
|
|
10
|
-
super(`Parameter "${param}" in method "${method}" is unsupported in the Mini Apps version ${version}.`);
|
|
11
|
-
Object.setPrototypeOf(this, ParameterUnsupportedError.prototype);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
@@ -1,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
|
-
}
|