@24i/bigscreen-sdk 1.0.33 → 1.0.34-alpha.2563
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/.vscode/settings.json +6 -0
- package/package.json +2 -1
- package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +1 -1
- package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +161 -0
- package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +95 -0
- package/packages/analytics/src/clients/TealiumAnalytics/index.ts +2 -0
- package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +31 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +40 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/helper.ts +21 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteAdd.ts +11 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteRemove.ts +11 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerClose.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerOpen.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchFailed.ts +13 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchSuccess.ts +13 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoPause.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoProgress.ts +18 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoResume.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStart.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStop.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/types.ts +136 -0
- package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +1 -1
- package/packages/create-package/dist/createPackage.js +66 -0
- package/packages/create-package/dist/createPackage.js.map +1 -0
- package/packages/create-package/dist/index.js +5 -0
- package/packages/create-package/dist/index.js.map +1 -0
- package/packages/create-package/dist/questionnaire/questions.js +35 -0
- package/packages/create-package/dist/questionnaire/questions.js.map +1 -0
- package/packages/create-package/dist/settings/Settings.js +10 -0
- package/packages/create-package/dist/settings/Settings.js.map +1 -0
- package/packages/create-package/dist/types.js +3 -0
- package/packages/create-package/dist/types.js.map +1 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/arabic.ts +27 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/burmese.ts +27 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/dari.ts +28 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +6 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/pashto.ts +27 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/persian.ts +27 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/ukrainian.ts +27 -0
- package/packages/router/src/utils.ts +1 -1
- package/packages/analytics/src/clients/TwentyFourIQ/generateSessionId.ts +0 -8
- /package/packages/analytics/src/{clients/GoogleAnalytics → utils}/generateSessionId.ts +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@24i/bigscreen-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.34-alpha.2563",
|
|
4
4
|
"description": "SmartApps BIGscreen SDK monorepo",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -90,6 +90,7 @@
|
|
|
90
90
|
"./analytics/interface": "./packages/analytics/src/interface.ts",
|
|
91
91
|
"./analytics/ConsoleAnalytics": "./packages/analytics/src/clients/ConsoleAnalytics/index.ts",
|
|
92
92
|
"./analytics/GoogleAnalytics": "./packages/analytics/src/clients/GoogleAnalytics/index.ts",
|
|
93
|
+
"./analytics/TealiumAnalytics": "./packages/analytics/src/clients/TealiumAnalytics/index.ts",
|
|
93
94
|
"./analytics/TwentyFourIQ": "./packages/analytics/src/clients/TwentyFourIQ/index.ts",
|
|
94
95
|
"./analytics": "./packages/analytics/src/index.ts",
|
|
95
96
|
"./animations/mock": "./packages/animations/src/__mocks__/JSAnimations.ts",
|
|
@@ -9,7 +9,7 @@ import type { AnalyticsClient, AnalyticsEventsMap, SceneInfo } from '../../inter
|
|
|
9
9
|
import { mapEventParamsToUrlParams, mapPayload } from './mapPayload';
|
|
10
10
|
import { prepareBody } from './prepareBody';
|
|
11
11
|
import { getUrl } from './getUrl';
|
|
12
|
-
import { generateSessionId } from '
|
|
12
|
+
import { generateSessionId } from '../../utils/generateSessionId';
|
|
13
13
|
import { GOOGLE_ANALYTICS_TRIGGERS, TRIGGER_NAME_TO_GA_EVENTS } from './constants';
|
|
14
14
|
import {
|
|
15
15
|
GAEventsNames,
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { Storage } from '@24i/bigscreen-sdk/storage';
|
|
2
|
+
import { MINUTE_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
|
|
3
|
+
import { createTimeout } from '@24i/bigscreen-sdk/utils/timers';
|
|
4
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
5
|
+
import {
|
|
6
|
+
BIGSCREEN_APP_TYPE,
|
|
7
|
+
BIGSCREEN_OTT_TYPE,
|
|
8
|
+
BIGSCREEN_PLATFORM_SHORT,
|
|
9
|
+
BIGSCREEN_PLATFORM_TYPE,
|
|
10
|
+
TRIGGER_NAME_TO_TEALIUM_EVENTS,
|
|
11
|
+
} from './constants';
|
|
12
|
+
import { EVENTS_MAPPING } from './interface';
|
|
13
|
+
import type { AnalyticsClient, AnyPayload } from '../../interface';
|
|
14
|
+
import type {
|
|
15
|
+
BaseResult,
|
|
16
|
+
Payload,
|
|
17
|
+
TealiumAnalyticsConfiguration,
|
|
18
|
+
UtagWindow,
|
|
19
|
+
} from './types';
|
|
20
|
+
|
|
21
|
+
declare const window: Window & UtagWindow;
|
|
22
|
+
|
|
23
|
+
// eslint-disable-next-line no-magic-numbers
|
|
24
|
+
const SESSION_TIMEOUT = 30 * MINUTE_IN_MS;
|
|
25
|
+
|
|
26
|
+
const TEALIUM_SESSION_COUNTER = 'tealium_session_counter';
|
|
27
|
+
|
|
28
|
+
const DEFAULT_PAYLOAD = {
|
|
29
|
+
language: '',
|
|
30
|
+
language_service: '',
|
|
31
|
+
entity: '',
|
|
32
|
+
property_id: '',
|
|
33
|
+
short_language_service: '',
|
|
34
|
+
platform_short: BIGSCREEN_PLATFORM_SHORT,
|
|
35
|
+
platform_type: BIGSCREEN_PLATFORM_TYPE,
|
|
36
|
+
app_type: BIGSCREEN_APP_TYPE,
|
|
37
|
+
ott_type: BIGSCREEN_OTT_TYPE,
|
|
38
|
+
app_id: '',
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export class TealiumAnalytics implements AnalyticsClient {
|
|
42
|
+
name = 'TealiumAnalytics';
|
|
43
|
+
|
|
44
|
+
constantPayload: BaseResult = DEFAULT_PAYLOAD;
|
|
45
|
+
|
|
46
|
+
sessionTimeout = createTimeout();
|
|
47
|
+
|
|
48
|
+
isSessionActive = false;
|
|
49
|
+
|
|
50
|
+
sessionStartSent = false;
|
|
51
|
+
|
|
52
|
+
constructor(private config: TealiumAnalyticsConfiguration, private appVersion: string = '') {
|
|
53
|
+
this.init();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async init() {
|
|
57
|
+
// Typically set "noview" flag to true for Single Page Apps (SPAs)
|
|
58
|
+
window.utag_cfg_ovrd = { noview: true };
|
|
59
|
+
window.utag_data = {};
|
|
60
|
+
this.loadScript();
|
|
61
|
+
this.prepareDatasetPayload();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
prepareDatasetPayload() {
|
|
65
|
+
const { entity, language } = this.config.options;
|
|
66
|
+
this.constantPayload = {
|
|
67
|
+
language,
|
|
68
|
+
language_service: `${entity} ${language}`,
|
|
69
|
+
entity,
|
|
70
|
+
property_id: '',
|
|
71
|
+
short_language_service: language,
|
|
72
|
+
platform_short: BIGSCREEN_PLATFORM_SHORT,
|
|
73
|
+
platform_type: BIGSCREEN_PLATFORM_TYPE,
|
|
74
|
+
app_type: BIGSCREEN_APP_TYPE,
|
|
75
|
+
ott_type: BIGSCREEN_OTT_TYPE,
|
|
76
|
+
app_id: `${entity} ${language} ${this.appVersion}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async startSession() {
|
|
81
|
+
const sessionNumber = parseInt(
|
|
82
|
+
await Storage.getItem(TEALIUM_SESSION_COUNTER) ?? '0', 10,
|
|
83
|
+
) + 1;
|
|
84
|
+
await Storage.setItem(TEALIUM_SESSION_COUNTER, sessionNumber.toString());
|
|
85
|
+
this.isSessionActive = true;
|
|
86
|
+
this.setSessionTimeout();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
setSessionTimeout() {
|
|
90
|
+
this.sessionTimeout.set(() => {
|
|
91
|
+
this.isSessionActive = false;
|
|
92
|
+
this.sessionStartSent = false;
|
|
93
|
+
}, SESSION_TIMEOUT);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
loadScript() {
|
|
97
|
+
const { account, profile, environment } = this.config.options;
|
|
98
|
+
const url = `//tags.tiqcdn.com/utag/${account}/${profile}/${environment}/utag.js`;
|
|
99
|
+
|
|
100
|
+
const script = document.createElement('script');
|
|
101
|
+
script.type = 'text/javascript';
|
|
102
|
+
script.async = true;
|
|
103
|
+
script.src = url;
|
|
104
|
+
script.addEventListener('load', async () => {
|
|
105
|
+
console.log('Tealium was loaded.');
|
|
106
|
+
await this.startSession();
|
|
107
|
+
}, false);
|
|
108
|
+
const scriptElements = document.getElementsByTagName('script');
|
|
109
|
+
if (scriptElements.length > 0) {
|
|
110
|
+
const scriptElement = scriptElements[0];
|
|
111
|
+
scriptElement.parentNode!.insertBefore(script, scriptElement);
|
|
112
|
+
} else {
|
|
113
|
+
document.body.appendChild(script);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
track(tealiumEvent: string, payload?: AnyPayload) {
|
|
118
|
+
if (window.utag === undefined) {
|
|
119
|
+
console.warn('Tealium is not available');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
window.utag_data = this.constantPayload;
|
|
123
|
+
window.utag!.track(tealiumEvent, payload);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
view(payload?: AnyPayload) {
|
|
127
|
+
this.track('view', payload);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
link(payload?: AnyPayload) {
|
|
131
|
+
this.track('link', payload);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async onEvent(triggerName: AnalyticsTriggers, payload: AnyPayload): Promise<void> {
|
|
135
|
+
const events = TRIGGER_NAME_TO_TEALIUM_EVENTS[triggerName];
|
|
136
|
+
if (this.isSessionActive) {
|
|
137
|
+
this.setSessionTimeout();
|
|
138
|
+
} else {
|
|
139
|
+
await this.startSession();
|
|
140
|
+
}
|
|
141
|
+
if (!events) return;
|
|
142
|
+
await Promise.all(
|
|
143
|
+
events.map(async (event) => {
|
|
144
|
+
const mappingFunction = EVENTS_MAPPING[event];
|
|
145
|
+
try {
|
|
146
|
+
const eventBody = mappingFunction?.(triggerName, {
|
|
147
|
+
...this.constantPayload,
|
|
148
|
+
...payload,
|
|
149
|
+
} as unknown as Payload);
|
|
150
|
+
if ((eventBody as unknown as AnyPayload).track_event_type === 'view') {
|
|
151
|
+
this.view(eventBody as Payload);
|
|
152
|
+
} else {
|
|
153
|
+
this.link(eventBody as Payload);
|
|
154
|
+
}
|
|
155
|
+
} catch (e) {
|
|
156
|
+
console.warn(`[${this.name}] Error onEvent: `, e);
|
|
157
|
+
}
|
|
158
|
+
}),
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
|
|
3
|
+
export const BIGSCREEN_OTT_TYPE = 'SmartTV';
|
|
4
|
+
|
|
5
|
+
export const BIGSCREEN_APP_TYPE = 'HTML5';
|
|
6
|
+
|
|
7
|
+
export const BIGSCREEN_PLATFORM_SHORT = 'o';
|
|
8
|
+
|
|
9
|
+
export const BIGSCREEN_PLATFORM_TYPE = 'ott';
|
|
10
|
+
|
|
11
|
+
export const TEALIUM_TRIGGERS = [
|
|
12
|
+
// App
|
|
13
|
+
AnalyticsTriggers.APP_CLOSE,
|
|
14
|
+
AnalyticsTriggers.APP_ERROR,
|
|
15
|
+
|
|
16
|
+
// Scenes
|
|
17
|
+
AnalyticsTriggers.SCENE_VIEW,
|
|
18
|
+
|
|
19
|
+
// Search
|
|
20
|
+
AnalyticsTriggers.SEARCH,
|
|
21
|
+
|
|
22
|
+
// Playback
|
|
23
|
+
AnalyticsTriggers.PLAYBACK_10,
|
|
24
|
+
AnalyticsTriggers.PLAYBACK_50,
|
|
25
|
+
AnalyticsTriggers.PLAYBACK_90,
|
|
26
|
+
AnalyticsTriggers.PLAYBACK_PAUSE,
|
|
27
|
+
AnalyticsTriggers.PLAYBACK_START,
|
|
28
|
+
AnalyticsTriggers.PLAYBACK_STOP,
|
|
29
|
+
|
|
30
|
+
// Player
|
|
31
|
+
AnalyticsTriggers.PLAYER_CLOSE,
|
|
32
|
+
AnalyticsTriggers.PLAYER_OPEN,
|
|
33
|
+
|
|
34
|
+
// Favorites
|
|
35
|
+
AnalyticsTriggers.FAVORITE_ADD,
|
|
36
|
+
AnalyticsTriggers.FAVORITE_REMOVE,
|
|
37
|
+
|
|
38
|
+
AnalyticsTriggers.SELECT_CONTENT,
|
|
39
|
+
'playback_unpause',
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
export const AppEvents: { [key: string]: string } = {
|
|
43
|
+
[AnalyticsTriggers.PLAYBACK_10]: 'media_milestone_10_video',
|
|
44
|
+
[AnalyticsTriggers.PLAYBACK_50]: 'media_milestone_50_video',
|
|
45
|
+
[AnalyticsTriggers.PLAYBACK_90]: 'media_milestone_90_video',
|
|
46
|
+
[AnalyticsTriggers.PLAYBACK_STOP]: 'video_stop',
|
|
47
|
+
[AnalyticsTriggers.PLAYBACK_PAUSE]: 'video_pause',
|
|
48
|
+
[AnalyticsTriggers.PLAYBACK_START]: 'video_play',
|
|
49
|
+
[AnalyticsTriggers.PLAYER_OPEN]: 'player_x',
|
|
50
|
+
[AnalyticsTriggers.PLAYER_CLOSE]: 'player_x',
|
|
51
|
+
[AnalyticsTriggers.FAVORITE_ADD]: 'subscribe_to_fav',
|
|
52
|
+
[AnalyticsTriggers.FAVORITE_REMOVE]: 'subscribe_to_fav',
|
|
53
|
+
[AnalyticsTriggers.APP_ERROR]: 'app_events',
|
|
54
|
+
[AnalyticsTriggers.SELECT_CONTENT]: 'app_events',
|
|
55
|
+
[AnalyticsTriggers.SEARCH]: 'search_success',
|
|
56
|
+
unpause: 'video_resume',
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export enum EVENTS {
|
|
60
|
+
SCENE_VIEW = 'scene_view',
|
|
61
|
+
VIDEO_PROGRESS = 'video_progress',
|
|
62
|
+
VIDEO_START = 'video_start',
|
|
63
|
+
VIDEO_STOP = 'video_stop',
|
|
64
|
+
VIDEO_PAUSE = 'video_pause',
|
|
65
|
+
VIDEO_UNPAUSE = 'video_unpause',
|
|
66
|
+
PLAYER_CLOSE = 'player_close',
|
|
67
|
+
PLAYER_OPEN = 'player_open',
|
|
68
|
+
SEARCH_SUCCESS = 'search_success',
|
|
69
|
+
SEARCH_FAILED = 'search_failed',
|
|
70
|
+
FAVORITE_ADD = 'favorite_add',
|
|
71
|
+
FAVORITE_REMOVE = 'favorite_remove',
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export enum TrackEventType {
|
|
75
|
+
VIEW = 'view',
|
|
76
|
+
ACTIVITY = 'activity',
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export const TRIGGER_NAME_TO_TEALIUM_EVENTS: { [K in AnalyticsTriggers]?: EVENTS[]; } = {
|
|
80
|
+
[AnalyticsTriggers.SCENE_VIEW]: [EVENTS.SCENE_VIEW],
|
|
81
|
+
[AnalyticsTriggers.PLAYBACK_10]: [EVENTS.VIDEO_PROGRESS],
|
|
82
|
+
[AnalyticsTriggers.PLAYBACK_50]: [EVENTS.VIDEO_PROGRESS],
|
|
83
|
+
[AnalyticsTriggers.PLAYBACK_90]: [EVENTS.VIDEO_PROGRESS],
|
|
84
|
+
[AnalyticsTriggers.PLAYBACK_PAUSE]: [EVENTS.VIDEO_PAUSE],
|
|
85
|
+
[AnalyticsTriggers.PLAYBACK_START]: [EVENTS.VIDEO_START],
|
|
86
|
+
[AnalyticsTriggers.PLAYBACK_STOP]: [EVENTS.VIDEO_STOP],
|
|
87
|
+
[AnalyticsTriggers.PLAYER_CLOSE]: [EVENTS.PLAYER_CLOSE],
|
|
88
|
+
[AnalyticsTriggers.PLAYER_OPEN]: [EVENTS.PLAYER_OPEN],
|
|
89
|
+
[AnalyticsTriggers.APP_CLOSE]: [EVENTS.VIDEO_STOP, EVENTS.PLAYER_CLOSE],
|
|
90
|
+
[AnalyticsTriggers.FAVORITE_ADD]: [EVENTS.FAVORITE_ADD],
|
|
91
|
+
[AnalyticsTriggers.FAVORITE_REMOVE]: [EVENTS.FAVORITE_REMOVE],
|
|
92
|
+
[AnalyticsTriggers.SEARCH]: [EVENTS.SEARCH_SUCCESS, EVENTS.SEARCH_FAILED],
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export const HUNDRED_PERCENT = 100;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EVENTS,
|
|
3
|
+
} from './constants';
|
|
4
|
+
import { mapSceneView } from './mappers/mapSceneView';
|
|
5
|
+
import { mapVideoProgress } from './mappers/mapVideoProgress';
|
|
6
|
+
import { mapVideoStop } from './mappers/mapVideoStop';
|
|
7
|
+
import { mapPlayerOpen } from './mappers/mapPlayerOpen';
|
|
8
|
+
import { mapPlayerClose } from './mappers/mapPlayerClose';
|
|
9
|
+
import { mapVideoStart } from './mappers/mapVideoStart';
|
|
10
|
+
import { mapVideoPause } from './mappers/mapVideoPause';
|
|
11
|
+
import { mapFavoriteAdd } from './mappers/mapFavoriteAdd';
|
|
12
|
+
import { mapFavoriteRemove } from './mappers/mapFavoriteRemove';
|
|
13
|
+
import { mapVideoResume } from './mappers/mapVideoResume';
|
|
14
|
+
import { mapSearchSuccess } from './mappers/mapSearchSuccess';
|
|
15
|
+
import { mapSearchFailed } from './mappers/mapSearchFailed';
|
|
16
|
+
import { EventMappingFunction } from './types';
|
|
17
|
+
|
|
18
|
+
export const EVENTS_MAPPING: Record<EVENTS, EventMappingFunction> = {
|
|
19
|
+
[EVENTS.SCENE_VIEW]: mapSceneView,
|
|
20
|
+
[EVENTS.PLAYER_OPEN]: mapPlayerOpen,
|
|
21
|
+
[EVENTS.PLAYER_CLOSE]: mapPlayerClose,
|
|
22
|
+
[EVENTS.VIDEO_START]: mapVideoStart,
|
|
23
|
+
[EVENTS.VIDEO_STOP]: mapVideoStop,
|
|
24
|
+
[EVENTS.VIDEO_PROGRESS]: mapVideoProgress,
|
|
25
|
+
[EVENTS.VIDEO_PAUSE]: mapVideoPause,
|
|
26
|
+
[EVENTS.FAVORITE_ADD]: mapFavoriteAdd,
|
|
27
|
+
[EVENTS.FAVORITE_REMOVE]: mapFavoriteRemove,
|
|
28
|
+
[EVENTS.VIDEO_UNPAUSE]: mapVideoResume,
|
|
29
|
+
[EVENTS.SEARCH_SUCCESS]: mapSearchSuccess,
|
|
30
|
+
[EVENTS.SEARCH_FAILED]: mapSearchFailed,
|
|
31
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Payload } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const MEDIA_PAYLOAD: Payload = {
|
|
4
|
+
duration: 120,
|
|
5
|
+
currentTime: 60,
|
|
6
|
+
title: 'Test Video',
|
|
7
|
+
url: 'https://example.com/video',
|
|
8
|
+
contentType: 'video/mp4',
|
|
9
|
+
externalId: '',
|
|
10
|
+
percent: 2,
|
|
11
|
+
provider: 'provider',
|
|
12
|
+
assetId: '12345',
|
|
13
|
+
app_id: 'app_id',
|
|
14
|
+
app_type: 'app_type',
|
|
15
|
+
sceneName: '',
|
|
16
|
+
sceneId: '',
|
|
17
|
+
sceneType: '',
|
|
18
|
+
sessionId: 1,
|
|
19
|
+
sessionNumber: 1,
|
|
20
|
+
userId: '10',
|
|
21
|
+
userProfileId: 'a1',
|
|
22
|
+
applicationId: 'app',
|
|
23
|
+
appVersion: 'v1.0',
|
|
24
|
+
deviceId: 'ott',
|
|
25
|
+
deviceType: 'smarttv',
|
|
26
|
+
search: '',
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const TEALIUM_MEDIA_PAYLOAD = {
|
|
30
|
+
article_uid: '12345',
|
|
31
|
+
byline: 'N/A',
|
|
32
|
+
canonical_url: 'https://example.com/video',
|
|
33
|
+
media_type: 'video/mp4',
|
|
34
|
+
pub_date: '',
|
|
35
|
+
tags: '',
|
|
36
|
+
video_length: 120,
|
|
37
|
+
video_name: 'Test Video',
|
|
38
|
+
video_position: 60,
|
|
39
|
+
video_series_title: '',
|
|
40
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Payload, MediaResult } from '../types';
|
|
2
|
+
|
|
3
|
+
export const mapMediaPayload = (
|
|
4
|
+
payload: Payload,
|
|
5
|
+
): MediaResult => {
|
|
6
|
+
const {
|
|
7
|
+
duration, currentTime, title, url, contentType, assetId,
|
|
8
|
+
} = payload;
|
|
9
|
+
return {
|
|
10
|
+
video_name: title || '',
|
|
11
|
+
video_length: duration,
|
|
12
|
+
video_position: currentTime,
|
|
13
|
+
media_type: contentType,
|
|
14
|
+
canonical_url: url,
|
|
15
|
+
video_series_title: '',
|
|
16
|
+
byline: 'N/A',
|
|
17
|
+
pub_date: '',
|
|
18
|
+
article_uid: assetId,
|
|
19
|
+
tags: '',
|
|
20
|
+
};
|
|
21
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { CoreResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
|
|
5
|
+
export const mapFavoriteAdd = (
|
|
6
|
+
triggerName: AnalyticsTriggers,
|
|
7
|
+
): CoreResult => ({
|
|
8
|
+
app_events: AppEvents.favorite_add,
|
|
9
|
+
event_trigger: triggerName,
|
|
10
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
11
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { CoreResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
|
|
5
|
+
export const mapFavoriteRemove = (
|
|
6
|
+
triggerName: AnalyticsTriggers,
|
|
7
|
+
): CoreResult => ({
|
|
8
|
+
app_events: AppEvents.favorite_remove,
|
|
9
|
+
event_trigger: triggerName,
|
|
10
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
11
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { Payload, VideoResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
import { mapMediaPayload } from './helper';
|
|
5
|
+
|
|
6
|
+
export const mapPlayerClose = (
|
|
7
|
+
triggerName: AnalyticsTriggers,
|
|
8
|
+
payload: Payload,
|
|
9
|
+
): VideoResult => ({
|
|
10
|
+
app_events: AppEvents.player_close,
|
|
11
|
+
event_trigger: triggerName,
|
|
12
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
13
|
+
video_event: AppEvents.player_close,
|
|
14
|
+
...(mapMediaPayload(payload)),
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { Payload, VideoResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
import { mapMediaPayload } from './helper';
|
|
5
|
+
|
|
6
|
+
export const mapPlayerOpen = (
|
|
7
|
+
triggerName: AnalyticsTriggers,
|
|
8
|
+
payload: Payload,
|
|
9
|
+
): VideoResult => ({
|
|
10
|
+
app_events: AppEvents.player_open,
|
|
11
|
+
event_trigger: triggerName,
|
|
12
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
13
|
+
video_event: AppEvents.player_open,
|
|
14
|
+
...(mapMediaPayload(payload)),
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { Payload, SceneViewResult } from '../types';
|
|
3
|
+
import { TrackEventType } from '../constants';
|
|
4
|
+
|
|
5
|
+
export const mapSceneView = (
|
|
6
|
+
triggerName: AnalyticsTriggers,
|
|
7
|
+
payload: Payload,
|
|
8
|
+
): SceneViewResult | undefined => ({
|
|
9
|
+
event_trigger: AnalyticsTriggers.SCENE_VIEW,
|
|
10
|
+
track_event_type: TrackEventType.VIEW,
|
|
11
|
+
page_title: payload.sceneType || '',
|
|
12
|
+
content_type: payload.sceneType || '',
|
|
13
|
+
section: payload.sceneType || '',
|
|
14
|
+
categories: payload.sceneName,
|
|
15
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { Payload, SearchResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
|
|
5
|
+
export const mapSearchFailed = (
|
|
6
|
+
triggerName: AnalyticsTriggers,
|
|
7
|
+
payload: Payload,
|
|
8
|
+
): SearchResult => ({
|
|
9
|
+
app_events: AppEvents.search,
|
|
10
|
+
event_trigger: triggerName,
|
|
11
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
12
|
+
search_keyword: payload.search,
|
|
13
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { Payload, SearchResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
|
|
5
|
+
export const mapSearchSuccess = (
|
|
6
|
+
triggerName: AnalyticsTriggers,
|
|
7
|
+
payload: Payload,
|
|
8
|
+
): SearchResult => ({
|
|
9
|
+
app_events: AppEvents.search,
|
|
10
|
+
event_trigger: triggerName,
|
|
11
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
12
|
+
search_keyword: payload.search,
|
|
13
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { Payload, VideoResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
import { mapMediaPayload } from './helper';
|
|
5
|
+
|
|
6
|
+
export const mapVideoPause = (
|
|
7
|
+
triggerName: AnalyticsTriggers,
|
|
8
|
+
payload: Payload,
|
|
9
|
+
): VideoResult => ({
|
|
10
|
+
app_events: AppEvents.playback_pause,
|
|
11
|
+
event_trigger: triggerName,
|
|
12
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
13
|
+
video_event: AppEvents.playback_pause,
|
|
14
|
+
...(mapMediaPayload(payload)),
|
|
15
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { Payload, VideoResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
import { mapMediaPayload } from './helper';
|
|
5
|
+
|
|
6
|
+
export const mapVideoProgress = (
|
|
7
|
+
triggerName: AnalyticsTriggers,
|
|
8
|
+
payload: Payload,
|
|
9
|
+
): VideoResult => {
|
|
10
|
+
const appEvent = AppEvents[triggerName.toLowerCase()];
|
|
11
|
+
return {
|
|
12
|
+
app_events: appEvent,
|
|
13
|
+
event_trigger: triggerName,
|
|
14
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
15
|
+
video_event: appEvent,
|
|
16
|
+
...(mapMediaPayload(payload)),
|
|
17
|
+
};
|
|
18
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { Payload, VideoResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
import { mapMediaPayload } from './helper';
|
|
5
|
+
|
|
6
|
+
export const mapVideoResume = (
|
|
7
|
+
triggerName: AnalyticsTriggers,
|
|
8
|
+
payload: Payload,
|
|
9
|
+
): VideoResult => ({
|
|
10
|
+
app_events: AppEvents.unpause,
|
|
11
|
+
event_trigger: triggerName,
|
|
12
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
13
|
+
video_event: AppEvents.unpause,
|
|
14
|
+
...(mapMediaPayload(payload)),
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { Payload, VideoResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
import { mapMediaPayload } from './helper';
|
|
5
|
+
|
|
6
|
+
export const mapVideoStart = (
|
|
7
|
+
triggerName: AnalyticsTriggers,
|
|
8
|
+
payload: Payload,
|
|
9
|
+
): VideoResult => ({
|
|
10
|
+
app_events: AppEvents.playback_start,
|
|
11
|
+
event_trigger: triggerName,
|
|
12
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
13
|
+
video_event: AppEvents.playback_start,
|
|
14
|
+
...(mapMediaPayload(payload)),
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import { Payload, VideoResult } from '../types';
|
|
3
|
+
import { AppEvents, TrackEventType } from '../constants';
|
|
4
|
+
import { mapMediaPayload } from './helper';
|
|
5
|
+
|
|
6
|
+
export const mapVideoStop = (
|
|
7
|
+
triggerName: AnalyticsTriggers,
|
|
8
|
+
payload: Payload,
|
|
9
|
+
): VideoResult => ({
|
|
10
|
+
app_events: AppEvents.playback_stop,
|
|
11
|
+
event_trigger: triggerName,
|
|
12
|
+
track_event_type: TrackEventType.ACTIVITY,
|
|
13
|
+
video_event: AppEvents.playback_stop,
|
|
14
|
+
...(mapMediaPayload(payload)),
|
|
15
|
+
});
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
|
+
import type { AnyPayload, UserInfo, AppInfo } from '../../interface';
|
|
3
|
+
|
|
4
|
+
export interface UtagWindow {
|
|
5
|
+
utag_cfg_ovrd?: {
|
|
6
|
+
noview: boolean;
|
|
7
|
+
};
|
|
8
|
+
utag_data?: {};
|
|
9
|
+
utag?: {
|
|
10
|
+
track: (eventName: string, payload?: AnyPayload) => {};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type TealiumAnalyticsOptions = {
|
|
15
|
+
account: string, // e.g: 'bbg'
|
|
16
|
+
profile: string, // e.g: 'main'
|
|
17
|
+
environment: string, // e.g: 'dev'
|
|
18
|
+
app_type: string, // e.g. 'HTML5' for bigscreen
|
|
19
|
+
entity: string, // e.g: 'rfe'
|
|
20
|
+
language: string, // e.g: 'russian'
|
|
21
|
+
short_language_service: string, // e.g: 'rus'
|
|
22
|
+
property_id: number, // e.g: 414
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type TealiumAnalyticsConfiguration = {
|
|
26
|
+
name: string, // Telium
|
|
27
|
+
baseURL: string, // e.g: 'https://collect.tealiumiq.com/event',
|
|
28
|
+
enabled: boolean,
|
|
29
|
+
options: TealiumAnalyticsOptions,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export interface CorePayload {
|
|
33
|
+
app_id: string;
|
|
34
|
+
app_type: string;
|
|
35
|
+
}
|
|
36
|
+
export interface MediaPayload {
|
|
37
|
+
title: string;
|
|
38
|
+
externalId: string;
|
|
39
|
+
contentType: string;
|
|
40
|
+
currentTime: number;
|
|
41
|
+
duration: number;
|
|
42
|
+
percent: number;
|
|
43
|
+
assetId: string;
|
|
44
|
+
provider: string,
|
|
45
|
+
url: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface SessionInfo {
|
|
49
|
+
sessionId: number;
|
|
50
|
+
sessionNumber: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface DeviceInfo {
|
|
54
|
+
appVersion: string,
|
|
55
|
+
manufacturer: string,
|
|
56
|
+
platform: string,
|
|
57
|
+
platformVersion: string,
|
|
58
|
+
deviceId: string,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface SceneInfo {
|
|
62
|
+
sceneName: string,
|
|
63
|
+
sceneId: string,
|
|
64
|
+
sceneType?: string,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface SearchInfo {
|
|
68
|
+
search?: string,
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type Payload = CorePayload &
|
|
72
|
+
SceneInfo &
|
|
73
|
+
SessionInfo &
|
|
74
|
+
MediaPayload &
|
|
75
|
+
UserInfo &
|
|
76
|
+
AppInfo &
|
|
77
|
+
SearchInfo;
|
|
78
|
+
|
|
79
|
+
export type EventBody = AnyPayload;
|
|
80
|
+
|
|
81
|
+
export type EventMappingFunction = (
|
|
82
|
+
triggerName: AnalyticsTriggers,
|
|
83
|
+
payload: Payload
|
|
84
|
+
) => AnyPayload | void;
|
|
85
|
+
|
|
86
|
+
export type BaseResult = {
|
|
87
|
+
language: string;
|
|
88
|
+
language_service: string;
|
|
89
|
+
entity: string;
|
|
90
|
+
property_id: string;
|
|
91
|
+
short_language_service: string;
|
|
92
|
+
platform_short: string;
|
|
93
|
+
platform_type: string;
|
|
94
|
+
app_type: string;
|
|
95
|
+
ott_type: string;
|
|
96
|
+
app_id: string;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export type CoreResult = {
|
|
100
|
+
event_trigger: string,
|
|
101
|
+
track_event_type: string,
|
|
102
|
+
app_events?: string,
|
|
103
|
+
video_event?: string,
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export type SceneViewResult = CoreResult & {
|
|
107
|
+
page_title: string,
|
|
108
|
+
content_type: string,
|
|
109
|
+
section: string,
|
|
110
|
+
categories: string,
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export type MediaResult = {
|
|
114
|
+
video_name: string,
|
|
115
|
+
video_length: number,
|
|
116
|
+
video_position: number,
|
|
117
|
+
media_type: string,
|
|
118
|
+
canonical_url: string,
|
|
119
|
+
video_series_title?: string,
|
|
120
|
+
byline?: string,
|
|
121
|
+
pub_date?: string,
|
|
122
|
+
article_uid?: string,
|
|
123
|
+
tags?: string,
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export type VideoResult = CoreResult & MediaResult;
|
|
127
|
+
|
|
128
|
+
export type PlayerOpenResult = CoreResult & {
|
|
129
|
+
thing_id: string;
|
|
130
|
+
source_page: string;
|
|
131
|
+
source_rail?: string | null;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export type SearchResult = CoreResult & {
|
|
135
|
+
search_keyword?: string;
|
|
136
|
+
};
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
} from './constants';
|
|
9
9
|
import { EVENTS_MAPPING } from './interface';
|
|
10
10
|
import type { AnalyticsClient, AnyPayload } from '../../interface';
|
|
11
|
-
import { generateSessionId } from '
|
|
11
|
+
import { generateSessionId } from '../../utils/generateSessionId';
|
|
12
12
|
import { CorePayload, DeviceInfo, EventBody, Payload, SessionInfo } from './types';
|
|
13
13
|
|
|
14
14
|
// eslint-disable-next-line no-magic-numbers
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.main = void 0;
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const fs = require("fs");
|
|
7
|
+
const fse = require("fs-extra");
|
|
8
|
+
const chalk = require("chalk");
|
|
9
|
+
const minimist = require("minimist");
|
|
10
|
+
const questions_1 = require("./questionnaire/questions");
|
|
11
|
+
const Settings_1 = require("./settings/Settings");
|
|
12
|
+
async function isDirectoryEmpty(dirPath) {
|
|
13
|
+
const files = await fs.promises.readdir(dirPath);
|
|
14
|
+
return !files.length;
|
|
15
|
+
}
|
|
16
|
+
async function copyTemplateFiles(templateDir, targetDir) {
|
|
17
|
+
return fse.copy(templateDir, targetDir);
|
|
18
|
+
}
|
|
19
|
+
function updatePackageJsonFile(filePath, options) {
|
|
20
|
+
let data = fs.readFileSync(filePath, 'utf8');
|
|
21
|
+
const keywords = options.keywords.map((word) => `"${word}"`).join(', ');
|
|
22
|
+
data = data.replace(/("name": ")(.*)(")/, `$1${options.name}$3`);
|
|
23
|
+
data = data.replace(/("version": ")(.*)(")/, `$1${options.version}$3`);
|
|
24
|
+
data = data.replace(/("description": ")(.*)(")/, `$1${options.description}$3`);
|
|
25
|
+
data = data.replace(/("keywords": \[)(.*)(\])/, `$1${keywords}$3`);
|
|
26
|
+
data = data.replace(/("author": ")(.*)(")/, `$1${options.author}$3`);
|
|
27
|
+
fs.writeFileSync(filePath, data);
|
|
28
|
+
}
|
|
29
|
+
function parseArguments(rawArgv) {
|
|
30
|
+
const argv = minimist(rawArgv.slice(2));
|
|
31
|
+
const dirName = argv._[0];
|
|
32
|
+
if (!dirName) {
|
|
33
|
+
console.error('Error: Missing package name');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
dirName,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async function main() {
|
|
41
|
+
const { dirName: destDirName } = parseArguments(process.argv);
|
|
42
|
+
const destDir = path.join(process.cwd(), 'packages/', destDirName);
|
|
43
|
+
if (fs.existsSync(destDir)) {
|
|
44
|
+
console.error(`Error: Target directory "${destDir}" already exists`);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
48
|
+
const isDirEmpty = await isDirectoryEmpty(destDir);
|
|
49
|
+
if (!isDirEmpty) {
|
|
50
|
+
console.error(`Error: Target directory "${destDir}" is not empty.`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
const settings = Object.assign({}, Settings_1.Settings);
|
|
54
|
+
settings.name = `${Settings_1.Settings.name}${destDirName}`.toLowerCase();
|
|
55
|
+
const details = await (0, questions_1.promptPackageDetails)(settings);
|
|
56
|
+
const templateDir = path.join(__dirname, '..', 'templates/typescript');
|
|
57
|
+
await copyTemplateFiles(templateDir, destDir);
|
|
58
|
+
const packageJsonFile = path.join(destDir, 'package.json');
|
|
59
|
+
updatePackageJsonFile(packageJsonFile, details);
|
|
60
|
+
const docsSymlinkTarget = path.join('../../../packages/', destDirName, '/README.md');
|
|
61
|
+
const docsSymlinkPath = path.join(process.cwd(), 'docs/packages/', destDirName, '/README.md');
|
|
62
|
+
await fse.ensureSymlink(docsSymlinkTarget, docsSymlinkPath);
|
|
63
|
+
console.log(`${chalk.green('Success')}, package has been initialized!`);
|
|
64
|
+
}
|
|
65
|
+
exports.main = main;
|
|
66
|
+
//# sourceMappingURL=createPackage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPackage.js","sourceRoot":"","sources":["../src/createPackage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,mDAAuC;AAEvC,IAAA,oBAAI,GAAE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.promptPackageDetails = void 0;
|
|
4
|
+
const inquirer = require("inquirer");
|
|
5
|
+
async function promptPackageDetails(defaultValues) {
|
|
6
|
+
return inquirer.prompt([
|
|
7
|
+
{
|
|
8
|
+
type: 'input',
|
|
9
|
+
name: 'name',
|
|
10
|
+
message: 'Package name:',
|
|
11
|
+
default: defaultValues.name,
|
|
12
|
+
}, {
|
|
13
|
+
type: 'input',
|
|
14
|
+
name: 'version',
|
|
15
|
+
message: 'Version:',
|
|
16
|
+
default: defaultValues.version,
|
|
17
|
+
}, {
|
|
18
|
+
type: 'input',
|
|
19
|
+
name: 'description',
|
|
20
|
+
message: 'Description:',
|
|
21
|
+
}, {
|
|
22
|
+
type: 'input',
|
|
23
|
+
name: 'keywords',
|
|
24
|
+
message: 'Keywords:',
|
|
25
|
+
filter: (ans) => ans.split(/[\s,]+/),
|
|
26
|
+
}, {
|
|
27
|
+
type: 'input',
|
|
28
|
+
name: 'author',
|
|
29
|
+
message: 'Author:',
|
|
30
|
+
default: defaultValues.author,
|
|
31
|
+
},
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
exports.promptPackageDetails = promptPackageDetails;
|
|
35
|
+
//# sourceMappingURL=questions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questions.js","sourceRoot":"","sources":["../../src/questionnaire/questions.ts"],"names":[],"mappings":";;;AAAA,qCAAqC;AAWrC,KAAK,UAAU,oBAAoB,CAAC,aAA4C;IAC5E,OAAO,QAAQ,CAAC,MAAM,CAAC;QACnB;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,aAAa,CAAC,IAAI;SAC9B,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,aAAa,CAAC,OAAO;SACjC,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,cAAc;SAC1B,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;SACvC,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,aAAa,CAAC,MAAM;SAChC;KACJ,CAAC,CAAC;AACP,CAAC;AAEQ,oDAAoB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Settings = void 0;
|
|
4
|
+
const Settings = {
|
|
5
|
+
name: '@24i/smartapps-bigscreen-',
|
|
6
|
+
version: '0.0.1',
|
|
7
|
+
author: '24i',
|
|
8
|
+
};
|
|
9
|
+
exports.Settings = Settings;
|
|
10
|
+
//# sourceMappingURL=Settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../src/settings/Settings.ts"],"names":[],"mappings":";;;AAAA,MAAM,QAAQ,GAAG;IACb,IAAI,EAAE,2BAA2B;IACjC,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,KAAK;CAChB,CAAC;AAEO,4BAAQ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
import { KeyMatrixCell } from '../../types';
|
|
3
|
+
|
|
4
|
+
const keyboardLayout = [
|
|
5
|
+
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.'],
|
|
6
|
+
['ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س'],
|
|
7
|
+
['ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ك', 'ل', 'م'],
|
|
8
|
+
['ن', 'ه', 'و', 'ي', 'ء', 'آ', 'إ', 'ة', 'ؤ', 'ئ', 'ى', 'أ'],
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
/* eslint-disable max-len */
|
|
12
|
+
const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
|
|
13
|
+
['', '', ...layout[0], 'backspace', 'backspace'],
|
|
14
|
+
['abc', 'abc', ...layout[1], 'clear', 'clear'],
|
|
15
|
+
['special', 'special', ...layout[2], 'left', 'right'],
|
|
16
|
+
['', '', ...layout[3], '', ''],
|
|
17
|
+
[
|
|
18
|
+
...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
|
|
19
|
+
'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export const arabic = {
|
|
23
|
+
className: 'wide',
|
|
24
|
+
keyText: 'ابت',
|
|
25
|
+
layout: keyboardLayout,
|
|
26
|
+
makeFocusStrings,
|
|
27
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
import { KeyMatrixCell } from '../../types';
|
|
3
|
+
|
|
4
|
+
const keyboardLayout = [
|
|
5
|
+
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
|
|
6
|
+
['က', 'ခ', 'ဂ', 'ဃ', 'င', 'စ', 'ဆ', 'ဇ', 'စ်', 'ည', 'ဋ'],
|
|
7
|
+
['႒', 'ဍ', 'ဏ', 'တ', 'ထ', 'ဒ', 'ဓ', 'န', 'ပ', 'ဖ', 'ဗ'],
|
|
8
|
+
['ဘ', 'မ', 'ယ', 'ရ', 'လ', 'ဝ', 'သ', 'ဟ', 'ဠ', 'အ', '-'],
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
/* eslint-disable max-len */
|
|
12
|
+
const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
|
|
13
|
+
['', '', ...layout[0], 'backspace', 'backspace'],
|
|
14
|
+
['abc', 'abc', ...layout[1], 'clear', 'clear'],
|
|
15
|
+
['special', 'special', ...layout[2], 'left', 'right'],
|
|
16
|
+
['', '', ...layout[3], '', ''],
|
|
17
|
+
[
|
|
18
|
+
...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
|
|
19
|
+
'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export const burmese = {
|
|
23
|
+
className: 'wide',
|
|
24
|
+
keyText: 'ကခဂ',
|
|
25
|
+
layout: keyboardLayout,
|
|
26
|
+
makeFocusStrings,
|
|
27
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
import { KeyMatrixCell } from '../../types';
|
|
3
|
+
|
|
4
|
+
const keyboardLayout = [
|
|
5
|
+
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
|
|
6
|
+
['ا', 'ب', 'پ', 'ت', 'ث', 'ج', 'چ', 'ح', 'خ', 'د', 'ذ'],
|
|
7
|
+
['ر', 'ز', 'ژ', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ'],
|
|
8
|
+
['ف', 'ق', 'ک', 'گ', 'ل', 'م', 'ن', 'و', 'ه', 'ی', '-'],
|
|
9
|
+
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
/* eslint-disable max-len */
|
|
13
|
+
const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
|
|
14
|
+
['', '', ...layout[0], 'backspace', 'backspace'],
|
|
15
|
+
['abc', 'abc', ...layout[1], 'clear', 'clear'],
|
|
16
|
+
['special', 'special', ...layout[2], 'left', 'right'],
|
|
17
|
+
['', '', ...layout[3], '', ''],
|
|
18
|
+
[
|
|
19
|
+
...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
|
|
20
|
+
'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
export const dari = {
|
|
24
|
+
className: 'wide',
|
|
25
|
+
keyText: 'ابپ',
|
|
26
|
+
layout: keyboardLayout,
|
|
27
|
+
makeFocusStrings,
|
|
28
|
+
};
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
export { arabic } from './arabic';
|
|
2
|
+
export { burmese } from './burmese';
|
|
3
|
+
export { dari } from './dari';
|
|
1
4
|
export { hebrew } from './hebrew';
|
|
2
5
|
export { korean } from './korean';
|
|
3
6
|
export { latin } from './latin';
|
|
7
|
+
export { pashto } from './pashto';
|
|
8
|
+
export { persian } from './persian';
|
|
4
9
|
export { russian } from './russian';
|
|
5
10
|
export { special } from './special';
|
|
6
11
|
export { tibetan } from './tibetan';
|
|
7
12
|
export { turkish } from './turkish';
|
|
13
|
+
export { ukrainian } from './ukrainian';
|
|
8
14
|
export { urdu } from './urdu';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
import { KeyMatrixCell } from '../../types';
|
|
3
|
+
|
|
4
|
+
const keyboardLayout = [
|
|
5
|
+
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
|
|
6
|
+
['ا', 'ب', 'پ', 'ت', 'ث', 'ج', 'چ', 'ح', 'خ', 'د', 'ذ'],
|
|
7
|
+
['ر', 'ز', 'ژ', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ'],
|
|
8
|
+
['ف', 'ق', 'ک', 'گ', 'ل', 'م', 'ن', 'و', 'ه', 'ی', '-'],
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
/* eslint-disable max-len */
|
|
12
|
+
const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
|
|
13
|
+
['', '', ...layout[0], 'backspace', 'backspace'],
|
|
14
|
+
['abc', 'abc', ...layout[1], 'clear', 'clear'],
|
|
15
|
+
['special', 'special', ...layout[2], 'left', 'right'],
|
|
16
|
+
['', '', ...layout[3], '', ''],
|
|
17
|
+
[
|
|
18
|
+
...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
|
|
19
|
+
'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export const pashto = {
|
|
23
|
+
className: 'wide',
|
|
24
|
+
keyText: 'ابپ',
|
|
25
|
+
layout: keyboardLayout,
|
|
26
|
+
makeFocusStrings,
|
|
27
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
import { KeyMatrixCell } from '../../types';
|
|
3
|
+
|
|
4
|
+
const keyboardLayout = [
|
|
5
|
+
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.'],
|
|
6
|
+
['ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س'],
|
|
7
|
+
['ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ك', 'ل', 'م'],
|
|
8
|
+
['ن', 'ه', 'و', 'ي', 'ء', 'آ', 'إ', 'ة', 'ؤ', 'ئ', 'ى', 'أ'],
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
/* eslint-disable max-len */
|
|
12
|
+
const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
|
|
13
|
+
['', '', ...layout[0], 'backspace', 'backspace'],
|
|
14
|
+
['abc', 'abc', ...layout[1], 'clear', 'clear'],
|
|
15
|
+
['special', 'special', ...layout[2], 'left', 'right'],
|
|
16
|
+
['', '', ...layout[3], '', ''],
|
|
17
|
+
[
|
|
18
|
+
...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
|
|
19
|
+
'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export const persian = {
|
|
23
|
+
className: 'wide',
|
|
24
|
+
keyText: 'ابپ',
|
|
25
|
+
layout: keyboardLayout,
|
|
26
|
+
makeFocusStrings,
|
|
27
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
import { KeyMatrixCell } from '../../types';
|
|
3
|
+
|
|
4
|
+
const keyboardLayout = [
|
|
5
|
+
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
|
|
6
|
+
['а', 'б', 'в', 'г', 'ґ', 'д', 'е', 'є', 'ж', 'з', 'и'],
|
|
7
|
+
['і', 'ї', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с'],
|
|
8
|
+
['т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ю', 'я'],
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
/* eslint-disable max-len */
|
|
12
|
+
const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
|
|
13
|
+
['', '', ...layout[0], 'backspace', 'backspace'],
|
|
14
|
+
['abc', 'abc', ...layout[1], 'clear', 'clear'],
|
|
15
|
+
['special', 'special', ...layout[2], 'left', 'right'],
|
|
16
|
+
['', '', ...layout[3], '', ''],
|
|
17
|
+
[
|
|
18
|
+
...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
|
|
19
|
+
'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export const ukrainian = {
|
|
23
|
+
className: 'wide',
|
|
24
|
+
keyText: 'абв',
|
|
25
|
+
layout: keyboardLayout,
|
|
26
|
+
makeFocusStrings,
|
|
27
|
+
};
|
|
@@ -6,7 +6,7 @@ export const isPathVisible = (hash: string, regexpPath?: RegExp) => (
|
|
|
6
6
|
|
|
7
7
|
export const getCurrentHash = () => window.location.href.split('#')[1] || '';
|
|
8
8
|
|
|
9
|
-
const PARAM = '([a-zA-Z0-9
|
|
9
|
+
const PARAM = '([a-zA-Z0-9+-=.:%_()\\[\\]{}]+)';
|
|
10
10
|
|
|
11
11
|
export const pathToRegExp = (path: string) => {
|
|
12
12
|
const regexpParts: string[] = [];
|
|
File without changes
|