tiny-essentials 1.28.7 → 1.28.9
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/changelog/1/28/9.md +17 -0
- package/dist/v1/TinyBasicsEs.min.js +1 -1
- package/dist/v1/TinyDebugger.min.js +1 -0
- package/dist/v1/TinyEssentials.min.js +1 -1
- package/dist/v1/TinyMediaPlayer.min.js +1 -1
- package/dist/v1/TinyRadioFm.min.js +1 -1
- package/dist/v1/TinyUploadClicker.min.js +1 -1
- package/dist/v1/basics/browserDetector.cjs +228 -0
- package/dist/v1/basics/browserDetector.d.mts +66 -0
- package/dist/v1/basics/browserDetector.mjs +207 -0
- package/dist/v1/basics/index.cjs +6 -0
- package/dist/v1/basics/index.d.mts +2 -1
- package/dist/v1/basics/index.mjs +2 -1
- package/dist/v1/build/TinyDebugger.cjs +7 -0
- package/dist/v1/build/TinyDebugger.d.mts +3 -0
- package/dist/v1/build/TinyDebugger.mjs +2 -0
- package/dist/v1/index.cjs +8 -0
- package/dist/v1/index.d.mts +3 -1
- package/dist/v1/index.mjs +4 -2
- package/dist/v1/libs/TinyDebugger.cjs +380 -0
- package/dist/v1/libs/TinyDebugger.d.mts +132 -0
- package/dist/v1/libs/TinyDebugger.mjs +351 -0
- package/dist/v1/libs/TinyMediaPlayer/HtmlAudio.cjs +39 -3
- package/dist/v1/libs/TinyMediaPlayer/HtmlAudio.d.mts +10 -0
- package/dist/v1/libs/TinyMediaPlayer/HtmlAudio.mjs +35 -3
- package/dist/v1/libs/TinyMediaPlayer/HtmlVideo.cjs +39 -3
- package/dist/v1/libs/TinyMediaPlayer/HtmlVideo.d.mts +10 -0
- package/dist/v1/libs/TinyMediaPlayer/HtmlVideo.mjs +35 -3
- package/dist/v1/libs/TinyMediaPlayer/Mock.cjs +333 -0
- package/dist/v1/libs/TinyMediaPlayer/Mock.d.mts +154 -0
- package/dist/v1/libs/TinyMediaPlayer/Mock.mjs +296 -0
- package/dist/v1/libs/TinyMediaPlayer/SoundCloud.cjs +30 -0
- package/dist/v1/libs/TinyMediaPlayer/SoundCloud.d.mts +10 -0
- package/dist/v1/libs/TinyMediaPlayer/SoundCloud.mjs +26 -0
- package/dist/v1/libs/TinyMediaPlayer/Youtube.cjs +39 -3
- package/dist/v1/libs/TinyMediaPlayer/Youtube.d.mts +10 -0
- package/dist/v1/libs/TinyMediaPlayer/Youtube.mjs +32 -3
- package/dist/v1/libs/TinyMediaPlayer/index.cjs +18 -0
- package/dist/v1/libs/TinyMediaPlayer/index.d.mts +10 -0
- package/dist/v1/libs/TinyMediaPlayer/index.mjs +16 -0
- package/dist/v1/libs/TinyMediaPlayer.cjs +156 -31
- package/dist/v1/libs/TinyMediaPlayer.d.mts +43 -7
- package/dist/v1/libs/TinyMediaPlayer.mjs +148 -31
- package/dist/v1/libs/TinyPromiseQueue.cjs +6 -4
- package/dist/v1/libs/TinyPromiseQueue.d.mts +8 -6
- package/dist/v1/libs/TinyPromiseQueue.mjs +6 -4
- package/dist/v1/libs/TinyRadioFm.cjs +271 -138
- package/dist/v1/libs/TinyRadioFm.d.mts +67 -3
- package/dist/v1/libs/TinyRadioFm.mjs +239 -123
- package/docs/v1/README.md +2 -0
- package/docs/v1/basics/browserDetector.md +135 -0
- package/docs/v1/libs/TinyDebugger.md +119 -0
- package/docs/v1/libs/TinyMediaPlayer.md +26 -22
- package/docs/v1/libs/TinyRadioFm.md +25 -3
- package/package.json +13 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Credits: https://code-boxx.com/detect-browser-with-javascript/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {'chrome'|'firefox'|'ie'|'edge'|'safari'|'opera'|'yandex'|'other'} BrowserDetected
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {Object} DuckTypingResult
|
|
11
|
+
* @property {boolean} isOpera - True if Opera is detected.
|
|
12
|
+
* @property {boolean} isFirefox - True if Firefox is detected.
|
|
13
|
+
* @property {boolean} isSafari - True if Safari is detected.
|
|
14
|
+
* @property {boolean} isIE - True if Internet Explorer is detected.
|
|
15
|
+
* @property {boolean} isEdge - True if Edge is detected.
|
|
16
|
+
* @property {boolean} isChrome - True if Chrome is detected.
|
|
17
|
+
* @property {boolean} isBlink - True if the Blink engine is detected.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const VALID_BROWSERS = ['chrome', 'firefox', 'ie', 'edge', 'safari', 'opera', 'yandex', 'other'];
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Detects the browser name by parsing the `navigator.userAgent` string.
|
|
24
|
+
*
|
|
25
|
+
* @returns {BrowserDetected} The detected browser name.
|
|
26
|
+
*/
|
|
27
|
+
function isBrowserAgent() {
|
|
28
|
+
const ua = navigator.userAgent;
|
|
29
|
+
|
|
30
|
+
// CHROME
|
|
31
|
+
if (ua.indexOf('Chrome') !== -1) {
|
|
32
|
+
return 'chrome';
|
|
33
|
+
}
|
|
34
|
+
// FIREFOX
|
|
35
|
+
else if (ua.indexOf('Firefox') !== -1) {
|
|
36
|
+
return 'firefox';
|
|
37
|
+
}
|
|
38
|
+
// INTERNET EXPLORER
|
|
39
|
+
else if (ua.indexOf('MSIE') !== -1) {
|
|
40
|
+
return 'ie';
|
|
41
|
+
}
|
|
42
|
+
// EDGE
|
|
43
|
+
else if (ua.indexOf('Edge') !== -1) {
|
|
44
|
+
return 'edge';
|
|
45
|
+
}
|
|
46
|
+
// SAFARI
|
|
47
|
+
else if (ua.indexOf('Safari') !== -1) {
|
|
48
|
+
return 'safari';
|
|
49
|
+
}
|
|
50
|
+
// OPERA
|
|
51
|
+
else if (ua.indexOf('Opera') !== -1) {
|
|
52
|
+
return 'opera';
|
|
53
|
+
}
|
|
54
|
+
// YANDEX BROWSER
|
|
55
|
+
else if (ua.indexOf('YaBrowser') !== -1) {
|
|
56
|
+
return 'yandex';
|
|
57
|
+
}
|
|
58
|
+
// OTHERS
|
|
59
|
+
return 'other';
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Determines the browser's CSS rendering engine prefix by inspecting computed styles.
|
|
64
|
+
*
|
|
65
|
+
* @returns {'gecko'|'webkit'|'trident'|'other'} The detected CSS engine prefix.
|
|
66
|
+
*/
|
|
67
|
+
function getBrowserCssPrefix() {
|
|
68
|
+
const prefix = (Array.prototype.slice
|
|
69
|
+
.call(window.getComputedStyle(document.documentElement, ''))
|
|
70
|
+
.join('')
|
|
71
|
+
.match(/-(moz|webkit|ms)-/) ?? ['', ''])[1];
|
|
72
|
+
|
|
73
|
+
// Firefox (Gecko engine)
|
|
74
|
+
if (prefix === 'moz') {
|
|
75
|
+
return 'gecko';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Webkit engines (Chrome, Safari, Opera, Edge)
|
|
79
|
+
if (prefix === 'webkit') {
|
|
80
|
+
return 'webkit';
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Internet Explorer & Legacy Edge (Trident engine)
|
|
84
|
+
if (prefix === 'ms') {
|
|
85
|
+
return 'trident';
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return 'other';
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Performs feature detection (duck typing) to identify the browser based on specific API availability.
|
|
93
|
+
*
|
|
94
|
+
* @returns {DuckTypingResult} An object containing boolean flags for various browser features.
|
|
95
|
+
*/
|
|
96
|
+
function getDuckTyping() {
|
|
97
|
+
// OPERA 8.0+
|
|
98
|
+
const isOpera =
|
|
99
|
+
// @ts-ignore
|
|
100
|
+
(!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
|
|
101
|
+
|
|
102
|
+
// FIREFOX 1.0+
|
|
103
|
+
// @ts-ignore
|
|
104
|
+
const isFirefox = typeof InstallTrigger !== 'undefined';
|
|
105
|
+
|
|
106
|
+
// SAFARI 3.0+
|
|
107
|
+
const isSafari =
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
/constructor/i.test(window.HTMLElement) ||
|
|
110
|
+
(function (p) {
|
|
111
|
+
return p.toString() === '[object SafariRemoteNotification]';
|
|
112
|
+
// @ts-ignore
|
|
113
|
+
})(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification));
|
|
114
|
+
|
|
115
|
+
// INTERNET EXPLORER 6-11
|
|
116
|
+
// @ts-ignore
|
|
117
|
+
const isIE = /*@cc_on!@*/ !!document.documentMode;
|
|
118
|
+
|
|
119
|
+
// EDGE 20+
|
|
120
|
+
// @ts-ignore
|
|
121
|
+
const isEdge = !isIE && !!window.StyleMedia;
|
|
122
|
+
|
|
123
|
+
// CHROME 1+
|
|
124
|
+
// @ts-ignore
|
|
125
|
+
const isChrome = !!window.chrome;
|
|
126
|
+
|
|
127
|
+
// BLINK ENGINE DETECTION
|
|
128
|
+
const isBlink = (isChrome || isOpera) && !!window.CSS;
|
|
129
|
+
|
|
130
|
+
return { isOpera, isFirefox, isSafari, isIE, isEdge, isChrome, isBlink };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Aggregates detection results from multiple methods to provide a count of "pings" per browser.
|
|
135
|
+
*
|
|
136
|
+
* @param {BrowserDetected[]} [disable=[]] An array of browser names to exclude from the count.
|
|
137
|
+
* @returns {Object<BrowserDetected, number>} An object where keys are browser names and values are their detection counts.
|
|
138
|
+
* @throws {TypeError} If the `disable` argument is not an array or contains invalid browser names.
|
|
139
|
+
*/
|
|
140
|
+
function getBrowserPings(disable = []) {
|
|
141
|
+
// Argument Validation
|
|
142
|
+
if (!Array.isArray(disable)) {
|
|
143
|
+
throw new TypeError('The "disable" argument must be an array.');
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
for (const browser of disable) {
|
|
147
|
+
if (!VALID_BROWSERS.includes(browser)) {
|
|
148
|
+
throw new TypeError(`Invalid browser name provided in disable array: ${browser}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const browsers = {
|
|
153
|
+
chrome: 0,
|
|
154
|
+
firefox: 0,
|
|
155
|
+
ie: 0,
|
|
156
|
+
edge: 0,
|
|
157
|
+
safari: 0,
|
|
158
|
+
opera: 0,
|
|
159
|
+
yandex: 0,
|
|
160
|
+
other: 0,
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// 1. Count by User Agent
|
|
164
|
+
browsers[isBrowserAgent()]++;
|
|
165
|
+
|
|
166
|
+
// 2. Count by CSS Prefix
|
|
167
|
+
const browserCssPrefix = getBrowserCssPrefix();
|
|
168
|
+
if (browserCssPrefix === 'gecko') {
|
|
169
|
+
if (disable.indexOf('firefox') < 0) browsers.firefox++;
|
|
170
|
+
} else if (browserCssPrefix === 'webkit') {
|
|
171
|
+
if (disable.indexOf('chrome') < 0) browsers.chrome++;
|
|
172
|
+
if (disable.indexOf('safari') < 0) browsers.safari++;
|
|
173
|
+
if (disable.indexOf('opera') < 0) browsers.opera++;
|
|
174
|
+
if (disable.indexOf('edge') < 0) browsers.edge++;
|
|
175
|
+
} else if (browserCssPrefix === 'trident') {
|
|
176
|
+
if (disable.indexOf('ie') < 0) browsers.ie++;
|
|
177
|
+
} else {
|
|
178
|
+
if (disable.indexOf('other') < 0) browsers.other++;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// 3. Count by Duck Typing
|
|
182
|
+
const duckTyping = getDuckTyping();
|
|
183
|
+
|
|
184
|
+
if (duckTyping.isOpera) {
|
|
185
|
+
if (disable.indexOf('opera') < 0) browsers.opera++;
|
|
186
|
+
}
|
|
187
|
+
if (duckTyping.isFirefox) {
|
|
188
|
+
if (disable.indexOf('firefox') < 0) browsers.firefox++;
|
|
189
|
+
}
|
|
190
|
+
if (duckTyping.isSafari) {
|
|
191
|
+
if (disable.indexOf('safari') < 0) browsers.safari++;
|
|
192
|
+
}
|
|
193
|
+
if (duckTyping.isIE) {
|
|
194
|
+
if (disable.indexOf('ie') < 0) browsers.ie++;
|
|
195
|
+
}
|
|
196
|
+
if (duckTyping.isEdge) {
|
|
197
|
+
if (disable.indexOf('edge') < 0) browsers.edge++;
|
|
198
|
+
}
|
|
199
|
+
if (duckTyping.isChrome) {
|
|
200
|
+
if (disable.indexOf('chrome') < 0) browsers.chrome++;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return browsers;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Determines the most likely browser by identifying the one with the highest number of detection "pings".
|
|
208
|
+
*
|
|
209
|
+
* @param {BrowserDetected[]} [disable=[]] An array of browser names to exclude from the count.
|
|
210
|
+
* @returns {BrowserDetected} The name of the browser with the maximum count.
|
|
211
|
+
* @throws {TypeError} If the `disable` argument is not an array or contains invalid browser names.
|
|
212
|
+
*/
|
|
213
|
+
function browserIs(disable = []) {
|
|
214
|
+
const pings = getBrowserPings(disable);
|
|
215
|
+
|
|
216
|
+
// Returns the key with the maximum value in the pings object
|
|
217
|
+
// @ts-ignore
|
|
218
|
+
return Object.keys(pings).reduce((highest, current) =>
|
|
219
|
+
// @ts-ignore
|
|
220
|
+
pings[current] > pings[highest] ? current : highest,
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
exports.browserIs = browserIs;
|
|
225
|
+
exports.getBrowserCssPrefix = getBrowserCssPrefix;
|
|
226
|
+
exports.getBrowserPings = getBrowserPings;
|
|
227
|
+
exports.getDuckTyping = getDuckTyping;
|
|
228
|
+
exports.isBrowserAgent = isBrowserAgent;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export type BrowserDetected = 'chrome' | 'firefox' | 'ie' | 'edge' | 'safari' | 'opera' | 'yandex' | 'other';
|
|
2
|
+
export type DuckTypingResult = {
|
|
3
|
+
/**
|
|
4
|
+
* - True if Opera is detected.
|
|
5
|
+
*/
|
|
6
|
+
isOpera: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* - True if Firefox is detected.
|
|
9
|
+
*/
|
|
10
|
+
isFirefox: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* - True if Safari is detected.
|
|
13
|
+
*/
|
|
14
|
+
isSafari: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* - True if Internet Explorer is detected.
|
|
17
|
+
*/
|
|
18
|
+
isIE: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* - True if Edge is detected.
|
|
21
|
+
*/
|
|
22
|
+
isEdge: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* - True if Chrome is detected.
|
|
25
|
+
*/
|
|
26
|
+
isChrome: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* - True if the Blink engine is detected.
|
|
29
|
+
*/
|
|
30
|
+
isBlink: boolean;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Detects the browser name by parsing the `navigator.userAgent` string.
|
|
34
|
+
*
|
|
35
|
+
* @returns {BrowserDetected} The detected browser name.
|
|
36
|
+
*/
|
|
37
|
+
export declare function isBrowserAgent(): BrowserDetected;
|
|
38
|
+
/**
|
|
39
|
+
* Determines the browser's CSS rendering engine prefix by inspecting computed styles.
|
|
40
|
+
*
|
|
41
|
+
* @returns {'gecko'|'webkit'|'trident'|'other'} The detected CSS engine prefix.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getBrowserCssPrefix(): 'gecko' | 'webkit' | 'trident' | 'other';
|
|
44
|
+
/**
|
|
45
|
+
* Performs feature detection (duck typing) to identify the browser based on specific API availability.
|
|
46
|
+
*
|
|
47
|
+
* @returns {DuckTypingResult} An object containing boolean flags for various browser features.
|
|
48
|
+
*/
|
|
49
|
+
export declare function getDuckTyping(): DuckTypingResult;
|
|
50
|
+
/**
|
|
51
|
+
* Aggregates detection results from multiple methods to provide a count of "pings" per browser.
|
|
52
|
+
*
|
|
53
|
+
* @param {BrowserDetected[]} [disable=[]] An array of browser names to exclude from the count.
|
|
54
|
+
* @returns {Object<BrowserDetected, number>} An object where keys are browser names and values are their detection counts.
|
|
55
|
+
* @throws {TypeError} If the `disable` argument is not an array or contains invalid browser names.
|
|
56
|
+
*/
|
|
57
|
+
export declare function getBrowserPings(disable?: BrowserDetected[]): any;
|
|
58
|
+
/**
|
|
59
|
+
* Determines the most likely browser by identifying the one with the highest number of detection "pings".
|
|
60
|
+
*
|
|
61
|
+
* @param {BrowserDetected[]} [disable=[]] An array of browser names to exclude from the count.
|
|
62
|
+
* @returns {BrowserDetected} The name of the browser with the maximum count.
|
|
63
|
+
* @throws {TypeError} If the `disable` argument is not an array or contains invalid browser names.
|
|
64
|
+
*/
|
|
65
|
+
export declare function browserIs(disable?: BrowserDetected[]): BrowserDetected;
|
|
66
|
+
//# sourceMappingURL=browserDetector.d.mts.map
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// Credits: https://code-boxx.com/detect-browser-with-javascript/
|
|
2
|
+
/**
|
|
3
|
+
* @typedef {'chrome'|'firefox'|'ie'|'edge'|'safari'|'opera'|'yandex'|'other'} BrowserDetected
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {Object} DuckTypingResult
|
|
7
|
+
* @property {boolean} isOpera - True if Opera is detected.
|
|
8
|
+
* @property {boolean} isFirefox - True if Firefox is detected.
|
|
9
|
+
* @property {boolean} isSafari - True if Safari is detected.
|
|
10
|
+
* @property {boolean} isIE - True if Internet Explorer is detected.
|
|
11
|
+
* @property {boolean} isEdge - True if Edge is detected.
|
|
12
|
+
* @property {boolean} isChrome - True if Chrome is detected.
|
|
13
|
+
* @property {boolean} isBlink - True if the Blink engine is detected.
|
|
14
|
+
*/
|
|
15
|
+
const VALID_BROWSERS = ['chrome', 'firefox', 'ie', 'edge', 'safari', 'opera', 'yandex', 'other'];
|
|
16
|
+
/**
|
|
17
|
+
* Detects the browser name by parsing the `navigator.userAgent` string.
|
|
18
|
+
*
|
|
19
|
+
* @returns {BrowserDetected} The detected browser name.
|
|
20
|
+
*/
|
|
21
|
+
export function isBrowserAgent() {
|
|
22
|
+
const ua = navigator.userAgent;
|
|
23
|
+
// CHROME
|
|
24
|
+
if (ua.indexOf('Chrome') !== -1) {
|
|
25
|
+
return 'chrome';
|
|
26
|
+
}
|
|
27
|
+
// FIREFOX
|
|
28
|
+
else if (ua.indexOf('Firefox') !== -1) {
|
|
29
|
+
return 'firefox';
|
|
30
|
+
}
|
|
31
|
+
// INTERNET EXPLORER
|
|
32
|
+
else if (ua.indexOf('MSIE') !== -1) {
|
|
33
|
+
return 'ie';
|
|
34
|
+
}
|
|
35
|
+
// EDGE
|
|
36
|
+
else if (ua.indexOf('Edge') !== -1) {
|
|
37
|
+
return 'edge';
|
|
38
|
+
}
|
|
39
|
+
// SAFARI
|
|
40
|
+
else if (ua.indexOf('Safari') !== -1) {
|
|
41
|
+
return 'safari';
|
|
42
|
+
}
|
|
43
|
+
// OPERA
|
|
44
|
+
else if (ua.indexOf('Opera') !== -1) {
|
|
45
|
+
return 'opera';
|
|
46
|
+
}
|
|
47
|
+
// YANDEX BROWSER
|
|
48
|
+
else if (ua.indexOf('YaBrowser') !== -1) {
|
|
49
|
+
return 'yandex';
|
|
50
|
+
}
|
|
51
|
+
// OTHERS
|
|
52
|
+
return 'other';
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Determines the browser's CSS rendering engine prefix by inspecting computed styles.
|
|
56
|
+
*
|
|
57
|
+
* @returns {'gecko'|'webkit'|'trident'|'other'} The detected CSS engine prefix.
|
|
58
|
+
*/
|
|
59
|
+
export function getBrowserCssPrefix() {
|
|
60
|
+
const prefix = (Array.prototype.slice
|
|
61
|
+
.call(window.getComputedStyle(document.documentElement, ''))
|
|
62
|
+
.join('')
|
|
63
|
+
.match(/-(moz|webkit|ms)-/) ?? ['', ''])[1];
|
|
64
|
+
// Firefox (Gecko engine)
|
|
65
|
+
if (prefix === 'moz') {
|
|
66
|
+
return 'gecko';
|
|
67
|
+
}
|
|
68
|
+
// Webkit engines (Chrome, Safari, Opera, Edge)
|
|
69
|
+
if (prefix === 'webkit') {
|
|
70
|
+
return 'webkit';
|
|
71
|
+
}
|
|
72
|
+
// Internet Explorer & Legacy Edge (Trident engine)
|
|
73
|
+
if (prefix === 'ms') {
|
|
74
|
+
return 'trident';
|
|
75
|
+
}
|
|
76
|
+
return 'other';
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Performs feature detection (duck typing) to identify the browser based on specific API availability.
|
|
80
|
+
*
|
|
81
|
+
* @returns {DuckTypingResult} An object containing boolean flags for various browser features.
|
|
82
|
+
*/
|
|
83
|
+
export function getDuckTyping() {
|
|
84
|
+
// OPERA 8.0+
|
|
85
|
+
const isOpera =
|
|
86
|
+
// @ts-ignore
|
|
87
|
+
(!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
|
|
88
|
+
// FIREFOX 1.0+
|
|
89
|
+
// @ts-ignore
|
|
90
|
+
const isFirefox = typeof InstallTrigger !== 'undefined';
|
|
91
|
+
// SAFARI 3.0+
|
|
92
|
+
const isSafari =
|
|
93
|
+
// @ts-ignore
|
|
94
|
+
/constructor/i.test(window.HTMLElement) ||
|
|
95
|
+
(function (p) {
|
|
96
|
+
return p.toString() === '[object SafariRemoteNotification]';
|
|
97
|
+
// @ts-ignore
|
|
98
|
+
})(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification));
|
|
99
|
+
// INTERNET EXPLORER 6-11
|
|
100
|
+
// @ts-ignore
|
|
101
|
+
const isIE = /*@cc_on!@*/ false || !!document.documentMode;
|
|
102
|
+
// EDGE 20+
|
|
103
|
+
// @ts-ignore
|
|
104
|
+
const isEdge = !isIE && !!window.StyleMedia;
|
|
105
|
+
// CHROME 1+
|
|
106
|
+
// @ts-ignore
|
|
107
|
+
const isChrome = !!window.chrome;
|
|
108
|
+
// BLINK ENGINE DETECTION
|
|
109
|
+
const isBlink = (isChrome || isOpera) && !!window.CSS;
|
|
110
|
+
return { isOpera, isFirefox, isSafari, isIE, isEdge, isChrome, isBlink };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Aggregates detection results from multiple methods to provide a count of "pings" per browser.
|
|
114
|
+
*
|
|
115
|
+
* @param {BrowserDetected[]} [disable=[]] An array of browser names to exclude from the count.
|
|
116
|
+
* @returns {Object<BrowserDetected, number>} An object where keys are browser names and values are their detection counts.
|
|
117
|
+
* @throws {TypeError} If the `disable` argument is not an array or contains invalid browser names.
|
|
118
|
+
*/
|
|
119
|
+
export function getBrowserPings(disable = []) {
|
|
120
|
+
// Argument Validation
|
|
121
|
+
if (!Array.isArray(disable)) {
|
|
122
|
+
throw new TypeError('The "disable" argument must be an array.');
|
|
123
|
+
}
|
|
124
|
+
for (const browser of disable) {
|
|
125
|
+
if (!VALID_BROWSERS.includes(browser)) {
|
|
126
|
+
throw new TypeError(`Invalid browser name provided in disable array: ${browser}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const browsers = {
|
|
130
|
+
chrome: 0,
|
|
131
|
+
firefox: 0,
|
|
132
|
+
ie: 0,
|
|
133
|
+
edge: 0,
|
|
134
|
+
safari: 0,
|
|
135
|
+
opera: 0,
|
|
136
|
+
yandex: 0,
|
|
137
|
+
other: 0,
|
|
138
|
+
};
|
|
139
|
+
// 1. Count by User Agent
|
|
140
|
+
browsers[isBrowserAgent()]++;
|
|
141
|
+
// 2. Count by CSS Prefix
|
|
142
|
+
const browserCssPrefix = getBrowserCssPrefix();
|
|
143
|
+
if (browserCssPrefix === 'gecko') {
|
|
144
|
+
if (disable.indexOf('firefox') < 0)
|
|
145
|
+
browsers.firefox++;
|
|
146
|
+
}
|
|
147
|
+
else if (browserCssPrefix === 'webkit') {
|
|
148
|
+
if (disable.indexOf('chrome') < 0)
|
|
149
|
+
browsers.chrome++;
|
|
150
|
+
if (disable.indexOf('safari') < 0)
|
|
151
|
+
browsers.safari++;
|
|
152
|
+
if (disable.indexOf('opera') < 0)
|
|
153
|
+
browsers.opera++;
|
|
154
|
+
if (disable.indexOf('edge') < 0)
|
|
155
|
+
browsers.edge++;
|
|
156
|
+
}
|
|
157
|
+
else if (browserCssPrefix === 'trident') {
|
|
158
|
+
if (disable.indexOf('ie') < 0)
|
|
159
|
+
browsers.ie++;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
if (disable.indexOf('other') < 0)
|
|
163
|
+
browsers.other++;
|
|
164
|
+
}
|
|
165
|
+
// 3. Count by Duck Typing
|
|
166
|
+
const duckTyping = getDuckTyping();
|
|
167
|
+
if (duckTyping.isOpera) {
|
|
168
|
+
if (disable.indexOf('opera') < 0)
|
|
169
|
+
browsers.opera++;
|
|
170
|
+
}
|
|
171
|
+
if (duckTyping.isFirefox) {
|
|
172
|
+
if (disable.indexOf('firefox') < 0)
|
|
173
|
+
browsers.firefox++;
|
|
174
|
+
}
|
|
175
|
+
if (duckTyping.isSafari) {
|
|
176
|
+
if (disable.indexOf('safari') < 0)
|
|
177
|
+
browsers.safari++;
|
|
178
|
+
}
|
|
179
|
+
if (duckTyping.isIE) {
|
|
180
|
+
if (disable.indexOf('ie') < 0)
|
|
181
|
+
browsers.ie++;
|
|
182
|
+
}
|
|
183
|
+
if (duckTyping.isEdge) {
|
|
184
|
+
if (disable.indexOf('edge') < 0)
|
|
185
|
+
browsers.edge++;
|
|
186
|
+
}
|
|
187
|
+
if (duckTyping.isChrome) {
|
|
188
|
+
if (disable.indexOf('chrome') < 0)
|
|
189
|
+
browsers.chrome++;
|
|
190
|
+
}
|
|
191
|
+
return browsers;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Determines the most likely browser by identifying the one with the highest number of detection "pings".
|
|
195
|
+
*
|
|
196
|
+
* @param {BrowserDetected[]} [disable=[]] An array of browser names to exclude from the count.
|
|
197
|
+
* @returns {BrowserDetected} The name of the browser with the maximum count.
|
|
198
|
+
* @throws {TypeError} If the `disable` argument is not an array or contains invalid browser names.
|
|
199
|
+
*/
|
|
200
|
+
export function browserIs(disable = []) {
|
|
201
|
+
const pings = getBrowserPings(disable);
|
|
202
|
+
// Returns the key with the maximum value in the pings object
|
|
203
|
+
// @ts-ignore
|
|
204
|
+
return Object.keys(pings).reduce((highest, current) =>
|
|
205
|
+
// @ts-ignore
|
|
206
|
+
pings[current] > pings[highest] ? current : highest);
|
|
207
|
+
}
|
package/dist/v1/basics/index.cjs
CHANGED
|
@@ -11,6 +11,7 @@ var text = require('./text.cjs');
|
|
|
11
11
|
var collision = require('./collision.cjs');
|
|
12
12
|
var mediaContent = require('./mediaContent.cjs');
|
|
13
13
|
var promiseUtils = require('./promiseUtils.cjs');
|
|
14
|
+
var browserDetector = require('./browserDetector.cjs');
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
|
|
@@ -85,3 +86,8 @@ exports.valMediaContentMetadata = mediaContent.valMediaContentMetadata;
|
|
|
85
86
|
exports.valMediaContentMetadataPartial = mediaContent.valMediaContentMetadataPartial;
|
|
86
87
|
exports.createSingletonTask = promiseUtils.createSingletonTask;
|
|
87
88
|
exports.waitForTrue = promiseUtils.waitForTrue;
|
|
89
|
+
exports.browserIs = browserDetector.browserIs;
|
|
90
|
+
exports.getBrowserCssPrefix = browserDetector.getBrowserCssPrefix;
|
|
91
|
+
exports.getBrowserPings = browserDetector.getBrowserPings;
|
|
92
|
+
exports.getDuckTyping = browserDetector.getDuckTyping;
|
|
93
|
+
exports.isBrowserAgent = browserDetector.isBrowserAgent;
|
|
@@ -9,5 +9,6 @@ import { addAiMarkerShortcut, diffStrings, diffObjList, safeTextTrim, toTitleCas
|
|
|
9
9
|
import { areElsCollTop, areElsCollBottom, areElsCollLeft, areElsCollRight, areElsCollPerfTop, areElsCollPerfBottom, areElsCollPerfLeft, areElsCollPerfRight, areElsColliding, areElsPerfColliding, getElsColliding, getElsPerfColliding, getElsCollOverlap, getElsCollOverlapPos, getRectCenter, getElsRelativeCenterOffset, getElsCollDirDepth, getElsCollDetails } from './collision.mjs';
|
|
10
10
|
import { extractMediaId3Tags, parseMediaMetadata, valMediaContentMetadata, valMediaContentMetadataPartial } from './mediaContent.mjs';
|
|
11
11
|
import { createSingletonTask, waitForTrue } from './promiseUtils.mjs';
|
|
12
|
-
|
|
12
|
+
import { browserIs, getBrowserCssPrefix, getBrowserPings, getDuckTyping, isBrowserAgent } from './browserDetector.mjs';
|
|
13
|
+
export { getBrowserPings, isBrowserAgent, getBrowserCssPrefix, getDuckTyping, browserIs, isValidObj, createSingletonTask, waitForTrue, multiplyArrayBlocks, valMediaContentMetadata, valMediaContentMetadataPartial, parseMediaMetadata, extractMediaId3Tags, diffStrings, diffObjList, diffArrayList, breakdownDuration, calculateMarketcap, compareMarketcap, getPercentage, areElsCollTop, areElsCollBottom, areElsCollLeft, areElsCollRight, areElsCollPerfTop, areElsCollPerfBottom, areElsCollPerfLeft, areElsCollPerfRight, areElsColliding, areElsPerfColliding, getElsColliding, getElsPerfColliding, getElsCollOverlap, getElsCollOverlapPos, getRectCenter, getElsRelativeCenterOffset, getElsCollDirDepth, getElsCollDetails, safeTextTrim, installWindowHiddenScript, genFibonacciSeq, fetchJson, fetchText, readJsonBlob, readFileBlob, readBase64Blob, saveJsonFile, documentIsFullScreen, isScreenFilled, requestFullScreen, exitFullScreen, isFullScreenMode, onFullScreenChange, offFullScreenChange, isJsonObject, arraySortPositions, formatBytes, addAiMarkerShortcut, extendObjType, reorderObjTypeOrder, cloneObjTypeOrder, countObj, isObjType, objTypeName, objType, ruleOfThree, getSimplePerc, asyncReplace, getAge, formatCustomTimer, formatDayTimer, formatTimer, getTimeDuration, shuffleArray, toTitleCase, toTitleCaseLowerFirst, };
|
|
13
14
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/v1/basics/index.mjs
CHANGED
|
@@ -9,4 +9,5 @@ import { addAiMarkerShortcut, diffStrings, diffObjList, safeTextTrim, toTitleCas
|
|
|
9
9
|
import { areElsCollTop, areElsCollBottom, areElsCollLeft, areElsCollRight, areElsCollPerfTop, areElsCollPerfBottom, areElsCollPerfLeft, areElsCollPerfRight, areElsColliding, areElsPerfColliding, getElsColliding, getElsPerfColliding, getElsCollOverlap, getElsCollOverlapPos, getRectCenter, getElsRelativeCenterOffset, getElsCollDirDepth, getElsCollDetails, } from './collision.mjs';
|
|
10
10
|
import { extractMediaId3Tags, parseMediaMetadata, valMediaContentMetadata, valMediaContentMetadataPartial, } from './mediaContent.mjs';
|
|
11
11
|
import { createSingletonTask, waitForTrue } from './promiseUtils.mjs';
|
|
12
|
-
|
|
12
|
+
import { browserIs, getBrowserCssPrefix, getBrowserPings, getDuckTyping, isBrowserAgent, } from './browserDetector.mjs';
|
|
13
|
+
export { getBrowserPings, isBrowserAgent, getBrowserCssPrefix, getDuckTyping, browserIs, isValidObj, createSingletonTask, waitForTrue, multiplyArrayBlocks, valMediaContentMetadata, valMediaContentMetadataPartial, parseMediaMetadata, extractMediaId3Tags, diffStrings, diffObjList, diffArrayList, breakdownDuration, calculateMarketcap, compareMarketcap, getPercentage, areElsCollTop, areElsCollBottom, areElsCollLeft, areElsCollRight, areElsCollPerfTop, areElsCollPerfBottom, areElsCollPerfLeft, areElsCollPerfRight, areElsColliding, areElsPerfColliding, getElsColliding, getElsPerfColliding, getElsCollOverlap, getElsCollOverlapPos, getRectCenter, getElsRelativeCenterOffset, getElsCollDirDepth, getElsCollDetails, safeTextTrim, installWindowHiddenScript, genFibonacciSeq, fetchJson, fetchText, readJsonBlob, readFileBlob, readBase64Blob, saveJsonFile, documentIsFullScreen, isScreenFilled, requestFullScreen, exitFullScreen, isFullScreenMode, onFullScreenChange, offFullScreenChange, isJsonObject, arraySortPositions, formatBytes, addAiMarkerShortcut, extendObjType, reorderObjTypeOrder, cloneObjTypeOrder, countObj, isObjType, objTypeName, objType, ruleOfThree, getSimplePerc, asyncReplace, getAge, formatCustomTimer, formatDayTimer, formatTimer, getTimeDuration, shuffleArray, toTitleCase, toTitleCaseLowerFirst, };
|
package/dist/v1/index.cjs
CHANGED
|
@@ -56,6 +56,8 @@ var TinyRadioFm = require('./libs/TinyRadioFm.cjs');
|
|
|
56
56
|
var TinyMediaPlayer = require('./libs/TinyMediaPlayer.cjs');
|
|
57
57
|
var utils = require('./libs/utils.cjs');
|
|
58
58
|
var promiseUtils = require('./basics/promiseUtils.cjs');
|
|
59
|
+
var TinyDebugger = require('./libs/TinyDebugger.cjs');
|
|
60
|
+
var browserDetector = require('./basics/browserDetector.cjs');
|
|
59
61
|
|
|
60
62
|
|
|
61
63
|
|
|
@@ -205,3 +207,9 @@ exports.TinyMediaPlayer = TinyMediaPlayer;
|
|
|
205
207
|
exports.createCheckDestroyed = utils.createCheckDestroyed;
|
|
206
208
|
exports.createSingletonTask = promiseUtils.createSingletonTask;
|
|
207
209
|
exports.waitForTrue = promiseUtils.waitForTrue;
|
|
210
|
+
exports.TinyDebugger = TinyDebugger;
|
|
211
|
+
exports.browserIs = browserDetector.browserIs;
|
|
212
|
+
exports.getBrowserCssPrefix = browserDetector.getBrowserCssPrefix;
|
|
213
|
+
exports.getBrowserPings = browserDetector.getBrowserPings;
|
|
214
|
+
exports.getDuckTyping = browserDetector.getDuckTyping;
|
|
215
|
+
exports.isBrowserAgent = browserDetector.isBrowserAgent;
|
package/dist/v1/index.d.mts
CHANGED
|
@@ -54,5 +54,7 @@ import TinyRadioFm from './libs/TinyRadioFm.mjs';
|
|
|
54
54
|
import TinyMediaPlayer from './libs/TinyMediaPlayer.mjs';
|
|
55
55
|
import { createCheckDestroyed } from './libs/utils.mjs';
|
|
56
56
|
import { createSingletonTask, waitForTrue } from './basics/promiseUtils.mjs';
|
|
57
|
-
|
|
57
|
+
import TinyDebugger from './libs/TinyDebugger.mjs';
|
|
58
|
+
import { browserIs, getBrowserCssPrefix, getBrowserPings, getDuckTyping, isBrowserAgent } from './basics/browserDetector.mjs';
|
|
59
|
+
export { TinyDebugger, TinyMediaPlayer, TinyRadioFm, TinyClassManager, FuzzySet, MamdaniInferenceSystem, TinyArrayComparator, TinyTextDiffer, TinyAnalogClock, TinyColorValidator, TinyLoadingScreen, TinyElementObserver, TinySimpleDice, TinyNeedBar, TinyI18, TinyCookieConsent, TinyInventory, TinyInventoryTrader, TinyArrayPaginator, TinyAdvancedRaffle, TinyDayNightCycle, TinyGamepad, TinyTextarea, TinyNewWinEvents, TinyIframeEvents, TinyLocalStorage, TinyTimeout, TinyColorConverter, TinyClipboard, TinyTextRangeEditor, TinySmartScroller, UltraRandomMsgGen, TinyAfterScrollWatcher, TinyHtml, TinyNotifications, TinyDomReadyManager, TinyDragger, TinyDragDropDetector, TinyToastNotify, TinyNotifyCenter, TinyRateLimiter, ColorSafeStringify, TinyPromiseQueue, TinyLevelUp, getBrowserPings, isBrowserAgent, getBrowserCssPrefix, getDuckTyping, browserIs, isValidObj, createSingletonTask, waitForTrue, multiplyArrayBlocks, createCheckDestroyed, valMediaContentMetadata, valMediaContentMetadataPartial, parseMediaMetadata, extractMediaId3Tags, defuzzifyCentroid, trapezoid, diffArrayList, diffStrings, diffObjList, breakdownDuration, calculateMarketcap, compareMarketcap, getPercentage, areElsCollTop, areElsCollBottom, areElsCollLeft, areElsCollRight, areElsCollPerfTop, areElsCollPerfBottom, areElsCollPerfLeft, areElsCollPerfRight, areElsColliding, areElsPerfColliding, getElsColliding, getElsPerfColliding, getElsCollOverlap, getElsCollOverlapPos, getRectCenter, getElsRelativeCenterOffset, getElsCollDirDepth, getElsCollDetails, safeTextTrim, installWindowHiddenScript, genFibonacciSeq, isDirEmptyAsync, fileSizeAsync, dirSizeAsync, listFilesAsync, listDirsAsync, getLatestBackupPath, fetchJson, fetchText, readJsonBlob, readFileBlob, readBase64Blob, saveJsonFile, readJsonFile, writeJsonFile, ensureDirectory, clearDirectoryAsync, clearDirectory, fileExists, dirExists, isDirEmpty, ensureCopyFile, tryDeleteFile, writeTextFile, listFiles, listDirs, fileSize, dirSize, backupFile, restoreLatestBackup, renameFileBatch, renameFileRegex, renameFileAddPrefixSuffix, renameFileNormalizeCase, renameFilePadNumbers, documentIsFullScreen, isScreenFilled, requestFullScreen, exitFullScreen, isFullScreenMode, onFullScreenChange, offFullScreenChange, isJsonObject, arraySortPositions, formatBytes, addAiMarkerShortcut, extendObjType, reorderObjTypeOrder, cloneObjTypeOrder, countObj, checkObj, objTypeName, isObjType, objType, ruleOfThree, getSimplePerc, asyncReplace, getAge, formatCustomTimer, formatDayTimer, formatTimer, getTimeDuration, shuffleArray, toTitleCase, toTitleCaseLowerFirst, };
|
|
58
60
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/v1/index.mjs
CHANGED
|
@@ -54,7 +54,9 @@ import TinyRadioFm from './libs/TinyRadioFm.mjs';
|
|
|
54
54
|
import TinyMediaPlayer from './libs/TinyMediaPlayer.mjs';
|
|
55
55
|
import { createCheckDestroyed } from './libs/utils.mjs';
|
|
56
56
|
import { createSingletonTask, waitForTrue } from './basics/promiseUtils.mjs';
|
|
57
|
+
import TinyDebugger from './libs/TinyDebugger.mjs';
|
|
58
|
+
import { browserIs, getBrowserCssPrefix, getBrowserPings, getDuckTyping, isBrowserAgent, } from './basics/browserDetector.mjs';
|
|
57
59
|
// import TinyHtmlElems from './libs/TinyHtml/index.mjs';
|
|
58
|
-
export { TinyMediaPlayer, TinyRadioFm, TinyClassManager, FuzzySet, MamdaniInferenceSystem, TinyArrayComparator, TinyTextDiffer, TinyAnalogClock,
|
|
60
|
+
export { TinyDebugger, TinyMediaPlayer, TinyRadioFm, TinyClassManager, FuzzySet, MamdaniInferenceSystem, TinyArrayComparator, TinyTextDiffer, TinyAnalogClock,
|
|
59
61
|
// TinyHtmlElems,
|
|
60
|
-
TinyColorValidator, TinyLoadingScreen, TinyElementObserver, TinySimpleDice, TinyNeedBar, TinyI18, TinyCookieConsent, TinyInventory, TinyInventoryTrader, TinyArrayPaginator, TinyAdvancedRaffle, TinyDayNightCycle, TinyGamepad, TinyTextarea, TinyNewWinEvents, TinyIframeEvents, TinyLocalStorage, TinyTimeout, TinyColorConverter, TinyClipboard, TinyTextRangeEditor, TinySmartScroller, UltraRandomMsgGen, TinyAfterScrollWatcher, TinyHtml, TinyNotifications, TinyDomReadyManager, TinyDragger, TinyDragDropDetector, TinyToastNotify, TinyNotifyCenter, TinyRateLimiter, ColorSafeStringify, TinyPromiseQueue, TinyLevelUp, isValidObj, createSingletonTask, waitForTrue, multiplyArrayBlocks, createCheckDestroyed, valMediaContentMetadata, valMediaContentMetadataPartial, parseMediaMetadata, extractMediaId3Tags, defuzzifyCentroid, trapezoid, diffArrayList, diffStrings, diffObjList, breakdownDuration, calculateMarketcap, compareMarketcap, getPercentage, areElsCollTop, areElsCollBottom, areElsCollLeft, areElsCollRight, areElsCollPerfTop, areElsCollPerfBottom, areElsCollPerfLeft, areElsCollPerfRight, areElsColliding, areElsPerfColliding, getElsColliding, getElsPerfColliding, getElsCollOverlap, getElsCollOverlapPos, getRectCenter, getElsRelativeCenterOffset, getElsCollDirDepth, getElsCollDetails, safeTextTrim, installWindowHiddenScript, genFibonacciSeq, isDirEmptyAsync, fileSizeAsync, dirSizeAsync, listFilesAsync, listDirsAsync, getLatestBackupPath, fetchJson, fetchText, readJsonBlob, readFileBlob, readBase64Blob, saveJsonFile, readJsonFile, writeJsonFile, ensureDirectory, clearDirectoryAsync, clearDirectory, fileExists, dirExists, isDirEmpty, ensureCopyFile, tryDeleteFile, writeTextFile, listFiles, listDirs, fileSize, dirSize, backupFile, restoreLatestBackup, renameFileBatch, renameFileRegex, renameFileAddPrefixSuffix, renameFileNormalizeCase, renameFilePadNumbers, documentIsFullScreen, isScreenFilled, requestFullScreen, exitFullScreen, isFullScreenMode, onFullScreenChange, offFullScreenChange, isJsonObject, arraySortPositions, formatBytes, addAiMarkerShortcut, extendObjType, reorderObjTypeOrder, cloneObjTypeOrder, countObj, checkObj, objTypeName, isObjType, objType, ruleOfThree, getSimplePerc, asyncReplace, getAge, formatCustomTimer, formatDayTimer, formatTimer, getTimeDuration, shuffleArray, toTitleCase, toTitleCaseLowerFirst, };
|
|
62
|
+
TinyColorValidator, TinyLoadingScreen, TinyElementObserver, TinySimpleDice, TinyNeedBar, TinyI18, TinyCookieConsent, TinyInventory, TinyInventoryTrader, TinyArrayPaginator, TinyAdvancedRaffle, TinyDayNightCycle, TinyGamepad, TinyTextarea, TinyNewWinEvents, TinyIframeEvents, TinyLocalStorage, TinyTimeout, TinyColorConverter, TinyClipboard, TinyTextRangeEditor, TinySmartScroller, UltraRandomMsgGen, TinyAfterScrollWatcher, TinyHtml, TinyNotifications, TinyDomReadyManager, TinyDragger, TinyDragDropDetector, TinyToastNotify, TinyNotifyCenter, TinyRateLimiter, ColorSafeStringify, TinyPromiseQueue, TinyLevelUp, getBrowserPings, isBrowserAgent, getBrowserCssPrefix, getDuckTyping, browserIs, isValidObj, createSingletonTask, waitForTrue, multiplyArrayBlocks, createCheckDestroyed, valMediaContentMetadata, valMediaContentMetadataPartial, parseMediaMetadata, extractMediaId3Tags, defuzzifyCentroid, trapezoid, diffArrayList, diffStrings, diffObjList, breakdownDuration, calculateMarketcap, compareMarketcap, getPercentage, areElsCollTop, areElsCollBottom, areElsCollLeft, areElsCollRight, areElsCollPerfTop, areElsCollPerfBottom, areElsCollPerfLeft, areElsCollPerfRight, areElsColliding, areElsPerfColliding, getElsColliding, getElsPerfColliding, getElsCollOverlap, getElsCollOverlapPos, getRectCenter, getElsRelativeCenterOffset, getElsCollDirDepth, getElsCollDetails, safeTextTrim, installWindowHiddenScript, genFibonacciSeq, isDirEmptyAsync, fileSizeAsync, dirSizeAsync, listFilesAsync, listDirsAsync, getLatestBackupPath, fetchJson, fetchText, readJsonBlob, readFileBlob, readBase64Blob, saveJsonFile, readJsonFile, writeJsonFile, ensureDirectory, clearDirectoryAsync, clearDirectory, fileExists, dirExists, isDirEmpty, ensureCopyFile, tryDeleteFile, writeTextFile, listFiles, listDirs, fileSize, dirSize, backupFile, restoreLatestBackup, renameFileBatch, renameFileRegex, renameFileAddPrefixSuffix, renameFileNormalizeCase, renameFilePadNumbers, documentIsFullScreen, isScreenFilled, requestFullScreen, exitFullScreen, isFullScreenMode, onFullScreenChange, offFullScreenChange, isJsonObject, arraySortPositions, formatBytes, addAiMarkerShortcut, extendObjType, reorderObjTypeOrder, cloneObjTypeOrder, countObj, checkObj, objTypeName, isObjType, objType, ruleOfThree, getSimplePerc, asyncReplace, getAge, formatCustomTimer, formatDayTimer, formatTimer, getTimeDuration, shuffleArray, toTitleCase, toTitleCaseLowerFirst, };
|