@kwiz/common 1.0.107 → 1.0.109

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/.github/workflows/npm-publish.yml +24 -24
  2. package/.madgerc +2 -2
  3. package/LICENSE +21 -21
  4. package/fix-folder-imports.js +26 -26
  5. package/lib/cjs/helpers/browser.js +9 -5
  6. package/lib/cjs/helpers/browser.js.map +1 -1
  7. package/lib/cjs/types/libs/msal.types.js +26 -26
  8. package/lib/cjs/types/libs/msal.types.js.map +1 -1
  9. package/lib/cjs/types/sharepoint.utils.types.js +9 -1
  10. package/lib/cjs/types/sharepoint.utils.types.js.map +1 -1
  11. package/lib/cjs/utils/sharepoint.rest/file.folder.js +4 -4
  12. package/lib/cjs/utils/sharepoint.rest/file.folder.js.map +1 -1
  13. package/lib/cjs/utils/sharepoint.rest/list.js +60 -1
  14. package/lib/cjs/utils/sharepoint.rest/list.js.map +1 -1
  15. package/lib/cjs/utils/sharepoint.rest/user.js +11 -11
  16. package/lib/esm/helpers/browser.js +9 -5
  17. package/lib/esm/helpers/browser.js.map +1 -1
  18. package/lib/esm/types/libs/msal.types.js +26 -26
  19. package/lib/esm/types/libs/msal.types.js.map +1 -1
  20. package/lib/esm/types/sharepoint.utils.types.js +8 -0
  21. package/lib/esm/types/sharepoint.utils.types.js.map +1 -1
  22. package/lib/esm/utils/sharepoint.rest/file.folder.js +4 -4
  23. package/lib/esm/utils/sharepoint.rest/file.folder.js.map +1 -1
  24. package/lib/esm/utils/sharepoint.rest/list.js +57 -0
  25. package/lib/esm/utils/sharepoint.rest/list.js.map +1 -1
  26. package/lib/esm/utils/sharepoint.rest/user.js +11 -11
  27. package/lib/types/types/libs/msal.types.d.ts +8 -3
  28. package/lib/types/types/sharepoint.utils.types.d.ts +17 -0
  29. package/lib/types/utils/sharepoint.rest/list.d.ts +7 -1
  30. package/package.json +81 -81
  31. package/readme.md +17 -17
  32. package/src/_dependencies.ts +12 -12
  33. package/src/config.ts +17 -17
  34. package/src/helpers/Guid.ts +181 -181
  35. package/src/helpers/base64.ts +173 -173
  36. package/src/helpers/browser.test.js +13 -13
  37. package/src/helpers/browser.ts +1448 -1448
  38. package/src/helpers/browserinfo.ts +292 -292
  39. package/src/helpers/collections.base.test.js +25 -25
  40. package/src/helpers/collections.base.ts +437 -437
  41. package/src/helpers/collections.ts +107 -107
  42. package/src/helpers/color.ts +54 -54
  43. package/src/helpers/cookies.ts +59 -59
  44. package/src/helpers/date.test.js +119 -119
  45. package/src/helpers/date.ts +188 -188
  46. package/src/helpers/debug.ts +186 -186
  47. package/src/helpers/diagrams.ts +43 -43
  48. package/src/helpers/emails.ts +6 -6
  49. package/src/helpers/eval.ts +5 -5
  50. package/src/helpers/file.test.js +50 -50
  51. package/src/helpers/file.ts +63 -63
  52. package/src/helpers/flatted.ts +149 -149
  53. package/src/helpers/functions.ts +16 -16
  54. package/src/helpers/graph/calendar.types.ts +10 -10
  55. package/src/helpers/http.ts +69 -69
  56. package/src/helpers/images.ts +22 -22
  57. package/src/helpers/json.ts +44 -44
  58. package/src/helpers/md5.ts +189 -189
  59. package/src/helpers/objects.test.js +33 -33
  60. package/src/helpers/objects.ts +274 -274
  61. package/src/helpers/promises.test.js +37 -37
  62. package/src/helpers/promises.ts +165 -165
  63. package/src/helpers/random.ts +27 -27
  64. package/src/helpers/scheduler/scheduler.test.js +103 -103
  65. package/src/helpers/scheduler/scheduler.ts +131 -131
  66. package/src/helpers/sharepoint.ts +785 -785
  67. package/src/helpers/strings.test.js +122 -122
  68. package/src/helpers/strings.ts +337 -337
  69. package/src/helpers/typecheckers.test.js +34 -34
  70. package/src/helpers/typecheckers.ts +266 -266
  71. package/src/helpers/url.test.js +43 -43
  72. package/src/helpers/url.ts +207 -207
  73. package/src/helpers/urlhelper.ts +111 -111
  74. package/src/index.ts +6 -6
  75. package/src/types/auth.ts +54 -54
  76. package/src/types/common.types.ts +15 -15
  77. package/src/types/flatted.types.ts +59 -59
  78. package/src/types/globals.types.ts +6 -6
  79. package/src/types/graph/calendar.types.ts +80 -80
  80. package/src/types/knownscript.types.ts +18 -18
  81. package/src/types/libs/datajs.types.ts +28 -28
  82. package/src/types/libs/ics.types.ts +30 -30
  83. package/src/types/libs/msal.types.ts +57 -49
  84. package/src/types/locales.ts +125 -125
  85. package/src/types/localstoragecache.types.ts +8 -8
  86. package/src/types/location.types.ts +27 -27
  87. package/src/types/moment.ts +11 -11
  88. package/src/types/regex.types.ts +16 -16
  89. package/src/types/rest.types.ts +95 -95
  90. package/src/types/sharepoint.types.ts +1466 -1466
  91. package/src/types/sharepoint.utils.types.ts +306 -287
  92. package/src/utils/auth/common.ts +74 -74
  93. package/src/utils/auth/discovery.test.js +12 -12
  94. package/src/utils/auth/discovery.ts +132 -132
  95. package/src/utils/base64.ts +27 -27
  96. package/src/utils/consolelogger.ts +320 -320
  97. package/src/utils/date.ts +172 -172
  98. package/src/utils/emails.ts +24 -24
  99. package/src/utils/knownscript.ts +286 -286
  100. package/src/utils/localstoragecache.ts +446 -446
  101. package/src/utils/rest.ts +501 -501
  102. package/src/utils/script.ts +170 -170
  103. package/src/utils/sharepoint.rest/common.ts +154 -154
  104. package/src/utils/sharepoint.rest/date.ts +62 -62
  105. package/src/utils/sharepoint.rest/file.folder.ts +598 -598
  106. package/src/utils/sharepoint.rest/item.ts +547 -547
  107. package/src/utils/sharepoint.rest/list.ts +1548 -1482
  108. package/src/utils/sharepoint.rest/listutils/GetListItemsByCaml.ts +774 -774
  109. package/src/utils/sharepoint.rest/listutils/GetListItemsById.ts +275 -275
  110. package/src/utils/sharepoint.rest/listutils/common.ts +206 -206
  111. package/src/utils/sharepoint.rest/location.ts +141 -141
  112. package/src/utils/sharepoint.rest/navigation-links.ts +86 -86
  113. package/src/utils/sharepoint.rest/user-search.ts +252 -252
  114. package/src/utils/sharepoint.rest/user.ts +491 -491
  115. package/src/utils/sharepoint.rest/web.ts +1384 -1384
  116. package/src/utils/sod.ts +194 -194
@@ -1,293 +1,293 @@
1
- //Unused file
2
- export interface DetectedInfo<N extends string, O, V = null> {
3
- readonly name: N;
4
- readonly version: V;
5
- readonly os: O;
6
- }
7
-
8
- export class BrowserInfo
9
- implements DetectedInfo<Browser, OperatingSystem | null, string> {
10
- public constructor(
11
- public readonly name: Browser,
12
- public readonly version: string,
13
- public readonly os: OperatingSystem | null
14
- ) { }
15
- }
16
-
17
- export class BotInfo implements DetectedInfo<'bot', null, null> {
18
- public readonly bot = true as const; // NOTE: deprecated test name instead
19
- public readonly name = 'bot' as const;
20
- public readonly version: null = null;
21
- public readonly os: null = null;
22
- }
23
-
24
- export type Browser =
25
- | 'aol'
26
- | 'edge'
27
- | 'yandexbrowser'
28
- | 'vivaldi'
29
- | 'kakaotalk'
30
- | 'samsung'
31
- | 'silk'
32
- | 'miui'
33
- | 'beaker'
34
- | 'edge-chromium'
35
- | 'chrome'
36
- | 'chromium-webview'
37
- | 'phantomjs'
38
- | 'crios'
39
- | 'firefox'
40
- | 'fxios'
41
- | 'opera-mini'
42
- | 'opera'
43
- | 'ie'
44
- | 'bb10'
45
- | 'android'
46
- | 'ios'
47
- | 'safari'
48
- | 'facebook'
49
- | 'instagram'
50
- | 'ios-webview'
51
- | 'searchbot'
52
- | 'unknown';
53
- export type OperatingSystem =
54
- | 'iOS'
55
- | 'Android OS'
56
- | 'BlackBerry OS'
57
- | 'Windows Mobile'
58
- | 'Amazon OS'
59
- | 'Windows 3.11'
60
- | 'Windows 95'
61
- | 'Windows 98'
62
- | 'Windows 2000'
63
- | 'Windows XP'
64
- | 'Windows Server 2003'
65
- | 'Windows Vista'
66
- | 'Windows 7'
67
- | 'Windows 8'
68
- | 'Windows 8.1'
69
- | 'Windows 10'
70
- | 'Windows ME'
71
- | 'Open BSD'
72
- | 'Sun OS'
73
- | 'Linux'
74
- | 'Mac OS'
75
- | 'QNX'
76
- | 'BeOS'
77
- | 'OS/2'
78
- | 'Chrome OS'
79
- | 'Search Bot'
80
- | 'unknown';
81
- type UserAgentRule = [Browser, RegExp];
82
- type UserAgentMatch = [Browser, RegExpExecArray] | false;
83
- type OperatingSystemRule = [OperatingSystem, RegExp];
84
-
85
- const SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/;
86
- const SEARCHBOT_OS_REGEX = /(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves\/Teoma)|(ia_archiver)/;
87
- const REQUIRED_VERSION_PARTS = 3;
88
-
89
- const userAgentRules: UserAgentRule[] = [
90
- ['aol', /AOLShield\/([0-9._]+)/],
91
- ['edge', /Edge\/([0-9._]+)/],
92
- ['yandexbrowser', /YaBrowser\/([0-9._]+)/],
93
- ['vivaldi', /Vivaldi\/([0-9.]+)/],
94
- ['kakaotalk', /KAKAOTALK\s([0-9.]+)/],
95
- ['samsung', /SamsungBrowser\/([0-9.]+)/],
96
- ['silk', /\bSilk\/([0-9._-]+)\b/],
97
- ['miui', /MiuiBrowser\/([0-9.]+)$/],
98
- ['beaker', /BeakerBrowser\/([0-9.]+)/],
99
- ['edge-chromium', /Edg\/([0-9.]+)/],
100
- [
101
- 'chromium-webview',
102
- /(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9.]+)(:?\s|$)/,
103
- ],
104
- ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9.]+)(:?\s|$)/],
105
- ['phantomjs', /PhantomJS\/([0-9.]+)(:?\s|$)/],
106
- ['crios', /CriOS\/([0-9.]+)(:?\s|$)/],
107
- ['firefox', /Firefox\/([0-9.]+)(?:\s|$)/],
108
- ['fxios', /FxiOS\/([0-9.]+)/],
109
- ['opera-mini', /Opera Mini.*Version\/([0-9.]+)/],
110
- ['opera', /Opera\/([0-9.]+)(?:\s|$)/],
111
- ['opera', /OPR\/([0-9.]+)(:?\s|$)/],
112
- ['ie', /Trident\/7\.0.*rv:([0-9.]+).*\).*Gecko$/],
113
- ['ie', /MSIE\s([0-9.]+);.*Trident\/[4-7].0/],
114
- ['ie', /MSIE\s(7\.0)/],
115
- ['bb10', /BB10;\sTouch.*Version\/([0-9.]+)/],
116
- ['android', /Android\s([0-9.]+)/],
117
- ['ios', /Version\/([0-9._]+).*Mobile.*Safari.*/],
118
- ['safari', /Version\/([0-9._]+).*Safari/],
119
- ['facebook', /FBAV\/([0-9.]+)/],
120
- ['instagram', /Instagram\s([0-9.]+)/],
121
- ['ios-webview', /AppleWebKit\/([0-9.]+).*Mobile/],
122
- ['ios-webview', /AppleWebKit\/([0-9.]+).*Gecko\)$/],
123
- ['searchbot', SEARCHBOX_UA_REGEX]
124
- ];
125
- const operatingSystemRules: OperatingSystemRule[] = [
126
- ['iOS', /iP(hone|od|ad)/],
127
- ['Android OS', /Android/],
128
- ['BlackBerry OS', /BlackBerry|BB10/],
129
- ['Windows Mobile', /IEMobile/],
130
- ['Amazon OS', /Kindle/],
131
- ['Windows 3.11', /Win16/],
132
- ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/],
133
- ['Windows 98', /(Windows 98)|(Win98)/],
134
- ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/],
135
- ['Windows XP', /(Windows NT 5.1)|(Windows XP)/],
136
- ['Windows Server 2003', /(Windows NT 5.2)/],
137
- ['Windows Vista', /(Windows NT 6.0)/],
138
- ['Windows 7', /(Windows NT 6.1)/],
139
- ['Windows 8', /(Windows NT 6.2)/],
140
- ['Windows 8.1', /(Windows NT 6.3)/],
141
- ['Windows 10', /(Windows NT 10.0)/],
142
- ['Windows ME', /Windows ME/],
143
- ['Open BSD', /OpenBSD/],
144
- ['Sun OS', /SunOS/],
145
- ['Chrome OS', /CrOS/],
146
- ['Linux', /(Linux)|(X11)/],
147
- ['Mac OS', /(Mac_PowerPC)|(Macintosh)/],
148
- ['QNX', /QNX/],
149
- ['BeOS', /BeOS/],
150
- ['OS/2', /OS\/2/],
151
- ['Search Bot', SEARCHBOT_OS_REGEX],
152
- ];
153
-
154
- export function detect(userAgent?: string): BrowserInfo | BotInfo | null {
155
- if (userAgent) {
156
- return parseUserAgent(userAgent);
157
- }
158
-
159
- if (typeof navigator !== 'undefined') {
160
- return parseUserAgent(navigator.userAgent);
161
- }
162
-
163
- //return getNodeVersion();
164
- return new BrowserInfo("unknown", "unknown", "unknown");
165
- }
166
-
167
- export function parseUserAgent(ua: string): BrowserInfo | BotInfo | null {
168
- // opted for using reduce here rather than Array#first with a regex.test call
169
- // this is primarily because using the reduce we only perform the regex
170
- // execution once rather than once for the test and for the exec again below
171
- // probably something that needs to be benchmarked though
172
- const matchedRule: UserAgentMatch =
173
- ua !== '' &&
174
- userAgentRules.reduce<UserAgentMatch>(
175
- (matched: UserAgentMatch, [browser, regex]) => {
176
- if (matched) {
177
- return matched;
178
- }
179
-
180
- const uaMatch = regex.exec(ua);
181
- return !!uaMatch && [browser, uaMatch];
182
- },
183
- false,
184
- );
185
-
186
- if (!matchedRule) {
187
- return null;
188
- }
189
-
190
- const [name, match] = matchedRule;
191
- if (name === 'searchbot') {
192
- return new BotInfo();
193
- }
194
- let versionParts = match[1] && match[1].split(/[._]/).slice(0, 3);
195
- if (versionParts) {
196
- if (versionParts.length < REQUIRED_VERSION_PARTS) {
197
- versionParts = [
198
- ...versionParts,
199
- ...createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length),
200
- ];
201
- }
202
- } else {
203
- versionParts = [];
204
- }
205
-
206
- return new BrowserInfo(name, versionParts.join('.'), detectOS(ua));
207
- }
208
-
209
- export function detectOS(ua: string): OperatingSystem | null {
210
- for (let ii = 0, count = operatingSystemRules.length; ii < count; ii++) {
211
- const [os, regex] = operatingSystemRules[ii];
212
- const match = regex.test(ua);
213
- if (match) {
214
- return os;
215
- }
216
- }
217
-
218
- return null;
219
- }
220
-
221
- export function detectPDF() {
222
- var browserInfo = parseUserAgent(navigator.userAgent);
223
-
224
- if (browserInfo.name === 'ie') {
225
- // load the activeX control
226
- // AcroPDF.PDF is used by version 7 and later
227
- // PDF.PdfCtrl is used by version 6 and earlier
228
- return getActiveXObject('AcroPDF.PDF')
229
- || getActiveXObject('AcroPDF.PDF.1')
230
- || getActiveXObject('PDF.PdfCtrl')
231
- || getActiveXObject('PDF.PdfCtrl.1')
232
- || getActiveXObject('PDF.PdfCtrl.2')
233
- || getActiveXObject('PDF.PdfCtrl.3')
234
- || getActiveXObject('PDF.PdfCtrl.4')
235
- || getActiveXObject('PDF.PdfCtrl.5')
236
- || getActiveXObject('PDF.PdfCtrl.6')
237
- || getActiveXObject('PDF.PdfCtrl.7')
238
- || getActiveXObject('PDF.PdfCtrl.8')
239
- || getActiveXObject('PDF.PdfCtrl.9');
240
- } else {
241
- return getNavigatorPluginByMimeType("application/pdf");
242
- }
243
- }
244
- function supportsActiveX() {
245
- var _supportsActiveX = false;
246
- try {
247
- _supportsActiveX = (<any>window).ActiveXObject !== undefined;
248
- } catch (e) {
249
-
250
- }
251
- return _supportsActiveX;
252
- }
253
-
254
- function getActiveXObject(name: string) {
255
- if (supportsActiveX()) {
256
- try {
257
- return new (<any>window).ActiveXObject(name);
258
- } catch (e) {
259
- }
260
- }
261
- }
262
-
263
- function getNavigatorPluginByMimeType(mimeTypeName: string) {
264
- if (navigator && navigator.plugins) {
265
- // eslint-disable-next-line guard-for-in
266
- for (var key in navigator.plugins) {
267
- var plugin = navigator.plugins[key];
268
- var pdfMimeType = (plugin as any)[mimeTypeName];
269
-
270
- if (!pdfMimeType && plugin.length) {
271
- for (var mimeTypeIndex = 0; mimeTypeIndex < plugin.length; mimeTypeIndex++) {
272
- var mimeType = plugin[mimeTypeIndex];
273
- if (mimeType.type === mimeTypeName) {
274
- pdfMimeType = mimeType;
275
- break;
276
- }
277
- }
278
- }
279
-
280
- if (pdfMimeType) return plugin;
281
- }
282
- }
283
- return null;
284
- }
285
-
286
- function createVersionParts(count: number): string[] {
287
- const output = [];
288
- for (let ii = 0; ii < count; ii++) {
289
- output.push('0');
290
- }
291
-
292
- return output;
1
+ //Unused file
2
+ export interface DetectedInfo<N extends string, O, V = null> {
3
+ readonly name: N;
4
+ readonly version: V;
5
+ readonly os: O;
6
+ }
7
+
8
+ export class BrowserInfo
9
+ implements DetectedInfo<Browser, OperatingSystem | null, string> {
10
+ public constructor(
11
+ public readonly name: Browser,
12
+ public readonly version: string,
13
+ public readonly os: OperatingSystem | null
14
+ ) { }
15
+ }
16
+
17
+ export class BotInfo implements DetectedInfo<'bot', null, null> {
18
+ public readonly bot = true as const; // NOTE: deprecated test name instead
19
+ public readonly name = 'bot' as const;
20
+ public readonly version: null = null;
21
+ public readonly os: null = null;
22
+ }
23
+
24
+ export type Browser =
25
+ | 'aol'
26
+ | 'edge'
27
+ | 'yandexbrowser'
28
+ | 'vivaldi'
29
+ | 'kakaotalk'
30
+ | 'samsung'
31
+ | 'silk'
32
+ | 'miui'
33
+ | 'beaker'
34
+ | 'edge-chromium'
35
+ | 'chrome'
36
+ | 'chromium-webview'
37
+ | 'phantomjs'
38
+ | 'crios'
39
+ | 'firefox'
40
+ | 'fxios'
41
+ | 'opera-mini'
42
+ | 'opera'
43
+ | 'ie'
44
+ | 'bb10'
45
+ | 'android'
46
+ | 'ios'
47
+ | 'safari'
48
+ | 'facebook'
49
+ | 'instagram'
50
+ | 'ios-webview'
51
+ | 'searchbot'
52
+ | 'unknown';
53
+ export type OperatingSystem =
54
+ | 'iOS'
55
+ | 'Android OS'
56
+ | 'BlackBerry OS'
57
+ | 'Windows Mobile'
58
+ | 'Amazon OS'
59
+ | 'Windows 3.11'
60
+ | 'Windows 95'
61
+ | 'Windows 98'
62
+ | 'Windows 2000'
63
+ | 'Windows XP'
64
+ | 'Windows Server 2003'
65
+ | 'Windows Vista'
66
+ | 'Windows 7'
67
+ | 'Windows 8'
68
+ | 'Windows 8.1'
69
+ | 'Windows 10'
70
+ | 'Windows ME'
71
+ | 'Open BSD'
72
+ | 'Sun OS'
73
+ | 'Linux'
74
+ | 'Mac OS'
75
+ | 'QNX'
76
+ | 'BeOS'
77
+ | 'OS/2'
78
+ | 'Chrome OS'
79
+ | 'Search Bot'
80
+ | 'unknown';
81
+ type UserAgentRule = [Browser, RegExp];
82
+ type UserAgentMatch = [Browser, RegExpExecArray] | false;
83
+ type OperatingSystemRule = [OperatingSystem, RegExp];
84
+
85
+ const SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/;
86
+ const SEARCHBOT_OS_REGEX = /(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves\/Teoma)|(ia_archiver)/;
87
+ const REQUIRED_VERSION_PARTS = 3;
88
+
89
+ const userAgentRules: UserAgentRule[] = [
90
+ ['aol', /AOLShield\/([0-9._]+)/],
91
+ ['edge', /Edge\/([0-9._]+)/],
92
+ ['yandexbrowser', /YaBrowser\/([0-9._]+)/],
93
+ ['vivaldi', /Vivaldi\/([0-9.]+)/],
94
+ ['kakaotalk', /KAKAOTALK\s([0-9.]+)/],
95
+ ['samsung', /SamsungBrowser\/([0-9.]+)/],
96
+ ['silk', /\bSilk\/([0-9._-]+)\b/],
97
+ ['miui', /MiuiBrowser\/([0-9.]+)$/],
98
+ ['beaker', /BeakerBrowser\/([0-9.]+)/],
99
+ ['edge-chromium', /Edg\/([0-9.]+)/],
100
+ [
101
+ 'chromium-webview',
102
+ /(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9.]+)(:?\s|$)/,
103
+ ],
104
+ ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9.]+)(:?\s|$)/],
105
+ ['phantomjs', /PhantomJS\/([0-9.]+)(:?\s|$)/],
106
+ ['crios', /CriOS\/([0-9.]+)(:?\s|$)/],
107
+ ['firefox', /Firefox\/([0-9.]+)(?:\s|$)/],
108
+ ['fxios', /FxiOS\/([0-9.]+)/],
109
+ ['opera-mini', /Opera Mini.*Version\/([0-9.]+)/],
110
+ ['opera', /Opera\/([0-9.]+)(?:\s|$)/],
111
+ ['opera', /OPR\/([0-9.]+)(:?\s|$)/],
112
+ ['ie', /Trident\/7\.0.*rv:([0-9.]+).*\).*Gecko$/],
113
+ ['ie', /MSIE\s([0-9.]+);.*Trident\/[4-7].0/],
114
+ ['ie', /MSIE\s(7\.0)/],
115
+ ['bb10', /BB10;\sTouch.*Version\/([0-9.]+)/],
116
+ ['android', /Android\s([0-9.]+)/],
117
+ ['ios', /Version\/([0-9._]+).*Mobile.*Safari.*/],
118
+ ['safari', /Version\/([0-9._]+).*Safari/],
119
+ ['facebook', /FBAV\/([0-9.]+)/],
120
+ ['instagram', /Instagram\s([0-9.]+)/],
121
+ ['ios-webview', /AppleWebKit\/([0-9.]+).*Mobile/],
122
+ ['ios-webview', /AppleWebKit\/([0-9.]+).*Gecko\)$/],
123
+ ['searchbot', SEARCHBOX_UA_REGEX]
124
+ ];
125
+ const operatingSystemRules: OperatingSystemRule[] = [
126
+ ['iOS', /iP(hone|od|ad)/],
127
+ ['Android OS', /Android/],
128
+ ['BlackBerry OS', /BlackBerry|BB10/],
129
+ ['Windows Mobile', /IEMobile/],
130
+ ['Amazon OS', /Kindle/],
131
+ ['Windows 3.11', /Win16/],
132
+ ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/],
133
+ ['Windows 98', /(Windows 98)|(Win98)/],
134
+ ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/],
135
+ ['Windows XP', /(Windows NT 5.1)|(Windows XP)/],
136
+ ['Windows Server 2003', /(Windows NT 5.2)/],
137
+ ['Windows Vista', /(Windows NT 6.0)/],
138
+ ['Windows 7', /(Windows NT 6.1)/],
139
+ ['Windows 8', /(Windows NT 6.2)/],
140
+ ['Windows 8.1', /(Windows NT 6.3)/],
141
+ ['Windows 10', /(Windows NT 10.0)/],
142
+ ['Windows ME', /Windows ME/],
143
+ ['Open BSD', /OpenBSD/],
144
+ ['Sun OS', /SunOS/],
145
+ ['Chrome OS', /CrOS/],
146
+ ['Linux', /(Linux)|(X11)/],
147
+ ['Mac OS', /(Mac_PowerPC)|(Macintosh)/],
148
+ ['QNX', /QNX/],
149
+ ['BeOS', /BeOS/],
150
+ ['OS/2', /OS\/2/],
151
+ ['Search Bot', SEARCHBOT_OS_REGEX],
152
+ ];
153
+
154
+ export function detect(userAgent?: string): BrowserInfo | BotInfo | null {
155
+ if (userAgent) {
156
+ return parseUserAgent(userAgent);
157
+ }
158
+
159
+ if (typeof navigator !== 'undefined') {
160
+ return parseUserAgent(navigator.userAgent);
161
+ }
162
+
163
+ //return getNodeVersion();
164
+ return new BrowserInfo("unknown", "unknown", "unknown");
165
+ }
166
+
167
+ export function parseUserAgent(ua: string): BrowserInfo | BotInfo | null {
168
+ // opted for using reduce here rather than Array#first with a regex.test call
169
+ // this is primarily because using the reduce we only perform the regex
170
+ // execution once rather than once for the test and for the exec again below
171
+ // probably something that needs to be benchmarked though
172
+ const matchedRule: UserAgentMatch =
173
+ ua !== '' &&
174
+ userAgentRules.reduce<UserAgentMatch>(
175
+ (matched: UserAgentMatch, [browser, regex]) => {
176
+ if (matched) {
177
+ return matched;
178
+ }
179
+
180
+ const uaMatch = regex.exec(ua);
181
+ return !!uaMatch && [browser, uaMatch];
182
+ },
183
+ false,
184
+ );
185
+
186
+ if (!matchedRule) {
187
+ return null;
188
+ }
189
+
190
+ const [name, match] = matchedRule;
191
+ if (name === 'searchbot') {
192
+ return new BotInfo();
193
+ }
194
+ let versionParts = match[1] && match[1].split(/[._]/).slice(0, 3);
195
+ if (versionParts) {
196
+ if (versionParts.length < REQUIRED_VERSION_PARTS) {
197
+ versionParts = [
198
+ ...versionParts,
199
+ ...createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length),
200
+ ];
201
+ }
202
+ } else {
203
+ versionParts = [];
204
+ }
205
+
206
+ return new BrowserInfo(name, versionParts.join('.'), detectOS(ua));
207
+ }
208
+
209
+ export function detectOS(ua: string): OperatingSystem | null {
210
+ for (let ii = 0, count = operatingSystemRules.length; ii < count; ii++) {
211
+ const [os, regex] = operatingSystemRules[ii];
212
+ const match = regex.test(ua);
213
+ if (match) {
214
+ return os;
215
+ }
216
+ }
217
+
218
+ return null;
219
+ }
220
+
221
+ export function detectPDF() {
222
+ var browserInfo = parseUserAgent(navigator.userAgent);
223
+
224
+ if (browserInfo.name === 'ie') {
225
+ // load the activeX control
226
+ // AcroPDF.PDF is used by version 7 and later
227
+ // PDF.PdfCtrl is used by version 6 and earlier
228
+ return getActiveXObject('AcroPDF.PDF')
229
+ || getActiveXObject('AcroPDF.PDF.1')
230
+ || getActiveXObject('PDF.PdfCtrl')
231
+ || getActiveXObject('PDF.PdfCtrl.1')
232
+ || getActiveXObject('PDF.PdfCtrl.2')
233
+ || getActiveXObject('PDF.PdfCtrl.3')
234
+ || getActiveXObject('PDF.PdfCtrl.4')
235
+ || getActiveXObject('PDF.PdfCtrl.5')
236
+ || getActiveXObject('PDF.PdfCtrl.6')
237
+ || getActiveXObject('PDF.PdfCtrl.7')
238
+ || getActiveXObject('PDF.PdfCtrl.8')
239
+ || getActiveXObject('PDF.PdfCtrl.9');
240
+ } else {
241
+ return getNavigatorPluginByMimeType("application/pdf");
242
+ }
243
+ }
244
+ function supportsActiveX() {
245
+ var _supportsActiveX = false;
246
+ try {
247
+ _supportsActiveX = (<any>window).ActiveXObject !== undefined;
248
+ } catch (e) {
249
+
250
+ }
251
+ return _supportsActiveX;
252
+ }
253
+
254
+ function getActiveXObject(name: string) {
255
+ if (supportsActiveX()) {
256
+ try {
257
+ return new (<any>window).ActiveXObject(name);
258
+ } catch (e) {
259
+ }
260
+ }
261
+ }
262
+
263
+ function getNavigatorPluginByMimeType(mimeTypeName: string) {
264
+ if (navigator && navigator.plugins) {
265
+ // eslint-disable-next-line guard-for-in
266
+ for (var key in navigator.plugins) {
267
+ var plugin = navigator.plugins[key];
268
+ var pdfMimeType = (plugin as any)[mimeTypeName];
269
+
270
+ if (!pdfMimeType && plugin.length) {
271
+ for (var mimeTypeIndex = 0; mimeTypeIndex < plugin.length; mimeTypeIndex++) {
272
+ var mimeType = plugin[mimeTypeIndex];
273
+ if (mimeType.type === mimeTypeName) {
274
+ pdfMimeType = mimeType;
275
+ break;
276
+ }
277
+ }
278
+ }
279
+
280
+ if (pdfMimeType) return plugin;
281
+ }
282
+ }
283
+ return null;
284
+ }
285
+
286
+ function createVersionParts(count: number): string[] {
287
+ const output = [];
288
+ for (let ii = 0; ii < count; ii++) {
289
+ output.push('0');
290
+ }
291
+
292
+ return output;
293
293
  }
@@ -1,26 +1,26 @@
1
- import assert from 'assert/strict';
2
- import test from 'node:test';
3
- import { forEachAsync, makeUniqueArray, numbersArray } from "./collections.base";
4
-
5
- test('forEachAsync', async t => {
6
- let results = await forEachAsync([1, 2, 3], num => Promise.resolve(num * 2));
7
- assert.deepEqual(results, [2, 4, 6]);
8
- results = await forEachAsync([1, 2, 3], num => Promise.resolve(num * 2), { parallel: true });
9
- assert.deepEqual(results, [2, 4, 6]);
10
- results = await forEachAsync(null, num => Promise.resolve(num * 2), { parallel: true });
11
- assert.deepEqual(results, []);
12
- results = await forEachAsync("test", str => Promise.resolve(`Char: ${str}`), { parallel: true });
13
- assert.deepEqual(results, ["Char: t", "Char: e", "Char: s", "Char: t"]);
14
- });
15
-
16
- test('makeUniqueArray', async t => {
17
- assert.strictEqual(makeUniqueArray([1, 2, 5, 5, 2]).length, 3);
18
- assert.strictEqual(makeUniqueArray([]).length, 0);
19
- assert.strictEqual(makeUniqueArray([1]).length, 1);
20
- });
21
-
22
- test('numbersArray', t => {
23
- assert.deepEqual(numbersArray(), []);
24
- assert.deepEqual(numbersArray(2), [0, 1]);
25
- assert.deepEqual(numbersArray(2, 2), [2, 3]);
1
+ import assert from 'assert/strict';
2
+ import test from 'node:test';
3
+ import { forEachAsync, makeUniqueArray, numbersArray } from "./collections.base";
4
+
5
+ test('forEachAsync', async t => {
6
+ let results = await forEachAsync([1, 2, 3], num => Promise.resolve(num * 2));
7
+ assert.deepEqual(results, [2, 4, 6]);
8
+ results = await forEachAsync([1, 2, 3], num => Promise.resolve(num * 2), { parallel: true });
9
+ assert.deepEqual(results, [2, 4, 6]);
10
+ results = await forEachAsync(null, num => Promise.resolve(num * 2), { parallel: true });
11
+ assert.deepEqual(results, []);
12
+ results = await forEachAsync("test", str => Promise.resolve(`Char: ${str}`), { parallel: true });
13
+ assert.deepEqual(results, ["Char: t", "Char: e", "Char: s", "Char: t"]);
14
+ });
15
+
16
+ test('makeUniqueArray', async t => {
17
+ assert.strictEqual(makeUniqueArray([1, 2, 5, 5, 2]).length, 3);
18
+ assert.strictEqual(makeUniqueArray([]).length, 0);
19
+ assert.strictEqual(makeUniqueArray([1]).length, 1);
20
+ });
21
+
22
+ test('numbersArray', t => {
23
+ assert.deepEqual(numbersArray(), []);
24
+ assert.deepEqual(numbersArray(2), [0, 1]);
25
+ assert.deepEqual(numbersArray(2, 2), [2, 3]);
26
26
  });