@leanbase.com/js 0.1.3 → 0.2.0-alpha.0

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 (137) hide show
  1. package/LICENSE +37 -0
  2. package/dist/autocapture-utils.d.ts +17 -0
  3. package/dist/autocapture.d.ts +35 -0
  4. package/dist/config.d.ts +5 -0
  5. package/dist/constants.d.ts +54 -0
  6. package/dist/entrypoints/main.cjs.d.ts +4 -0
  7. package/dist/entrypoints/module.es.d.ts +4 -0
  8. package/dist/extensions/rageclick.d.ts +9 -0
  9. package/dist/iife.d.ts +19 -0
  10. package/dist/index.d.ts +2 -779
  11. package/dist/leanbase-logger.d.ts +6 -0
  12. package/dist/leanbase-persistence.d.ts +64 -0
  13. package/dist/leanbase.d.ts +49 -0
  14. package/dist/leanbase.iife.js +1 -4747
  15. package/dist/leanbase.iife.js.map +1 -1
  16. package/dist/main.js +2 -0
  17. package/dist/main.js.map +1 -0
  18. package/dist/module.d.ts +780 -0
  19. package/dist/module.js +2 -0
  20. package/dist/module.js.map +1 -0
  21. package/dist/page-view.d.ts +29 -0
  22. package/dist/scroll-manager.d.ts +21 -0
  23. package/dist/session-props.d.ts +32 -0
  24. package/dist/sessionid.d.ts +50 -0
  25. package/dist/storage.d.ts +24 -0
  26. package/{src/types.ts → dist/types.d.ts} +145 -235
  27. package/dist/utils/blocked-uas.d.ts +17 -0
  28. package/dist/utils/element-utils.d.ts +5 -0
  29. package/dist/utils/event-utils.d.ts +22 -0
  30. package/dist/utils/index.d.ts +44 -0
  31. package/dist/utils/request-utils.d.ts +12 -0
  32. package/dist/utils/simple-event-emitter.d.ts +6 -0
  33. package/dist/utils/user-agent-utils.d.ts +18 -0
  34. package/dist/uuidv7.d.ts +43 -0
  35. package/dist/version.d.ts +1 -0
  36. package/lib/autocapture-utils.d.ts +17 -0
  37. package/{src/autocapture-utils.ts → lib/autocapture-utils.js} +196 -280
  38. package/lib/autocapture-utils.js.map +1 -0
  39. package/lib/autocapture.d.ts +35 -0
  40. package/lib/autocapture.js +311 -0
  41. package/lib/autocapture.js.map +1 -0
  42. package/lib/config.d.ts +5 -0
  43. package/lib/config.js +7 -0
  44. package/lib/config.js.map +1 -0
  45. package/lib/constants.d.ts +54 -0
  46. package/{src/constants.ts → lib/constants.js} +50 -57
  47. package/lib/constants.js.map +1 -0
  48. package/lib/entrypoints/main.cjs.d.ts +4 -0
  49. package/lib/entrypoints/main.cjs.js +3 -0
  50. package/lib/entrypoints/main.cjs.js.map +1 -0
  51. package/lib/entrypoints/module.es.d.ts +4 -0
  52. package/lib/entrypoints/module.es.js +3 -0
  53. package/lib/entrypoints/module.es.js.map +1 -0
  54. package/lib/extensions/rageclick.d.ts +9 -0
  55. package/lib/extensions/rageclick.js +27 -0
  56. package/lib/extensions/rageclick.js.map +1 -0
  57. package/lib/iife.d.ts +19 -0
  58. package/lib/iife.js +67 -0
  59. package/lib/iife.js.map +1 -0
  60. package/{src/index.ts → lib/index.d.ts} +2 -2
  61. package/lib/index.js +2 -0
  62. package/lib/index.js.map +1 -0
  63. package/lib/leanbase-logger.d.ts +6 -0
  64. package/lib/leanbase-logger.js +25 -0
  65. package/lib/leanbase-logger.js.map +1 -0
  66. package/lib/leanbase-persistence.d.ts +64 -0
  67. package/lib/leanbase-persistence.js +287 -0
  68. package/lib/leanbase-persistence.js.map +1 -0
  69. package/lib/leanbase.d.ts +49 -0
  70. package/lib/leanbase.js +294 -0
  71. package/lib/leanbase.js.map +1 -0
  72. package/lib/page-view.d.ts +29 -0
  73. package/lib/page-view.js +81 -0
  74. package/lib/page-view.js.map +1 -0
  75. package/lib/scroll-manager.d.ts +21 -0
  76. package/lib/scroll-manager.js +79 -0
  77. package/lib/scroll-manager.js.map +1 -0
  78. package/lib/session-props.d.ts +32 -0
  79. package/lib/session-props.js +73 -0
  80. package/lib/session-props.js.map +1 -0
  81. package/lib/sessionid.d.ts +50 -0
  82. package/{src/sessionid.ts → lib/sessionid.js} +128 -204
  83. package/lib/sessionid.js.map +1 -0
  84. package/lib/storage.d.ts +24 -0
  85. package/{src/storage.ts → lib/storage.js} +182 -225
  86. package/lib/storage.js.map +1 -0
  87. package/lib/types.d.ts +544 -0
  88. package/lib/types.js +7 -0
  89. package/lib/types.js.map +1 -0
  90. package/lib/utils/blocked-uas.d.ts +17 -0
  91. package/{src/utils/blocked-uas.ts → lib/utils/blocked-uas.js} +19 -48
  92. package/lib/utils/blocked-uas.js.map +1 -0
  93. package/lib/utils/element-utils.d.ts +5 -0
  94. package/{src/utils/element-utils.ts → lib/utils/element-utils.js} +13 -17
  95. package/lib/utils/element-utils.js.map +1 -0
  96. package/lib/utils/event-utils.d.ts +22 -0
  97. package/lib/utils/event-utils.js +258 -0
  98. package/lib/utils/event-utils.js.map +1 -0
  99. package/lib/utils/index.d.ts +44 -0
  100. package/lib/utils/index.js +183 -0
  101. package/lib/utils/index.js.map +1 -0
  102. package/lib/utils/request-utils.d.ts +12 -0
  103. package/lib/utils/request-utils.js +107 -0
  104. package/lib/utils/request-utils.js.map +1 -0
  105. package/lib/utils/simple-event-emitter.d.ts +6 -0
  106. package/lib/utils/simple-event-emitter.js +24 -0
  107. package/lib/utils/simple-event-emitter.js.map +1 -0
  108. package/lib/utils/user-agent-utils.d.ts +18 -0
  109. package/lib/utils/user-agent-utils.js +369 -0
  110. package/lib/utils/user-agent-utils.js.map +1 -0
  111. package/lib/uuidv7.d.ts +43 -0
  112. package/{src/uuidv7.ts → lib/uuidv7.js} +103 -131
  113. package/lib/uuidv7.js.map +1 -0
  114. package/lib/version.d.ts +1 -0
  115. package/lib/version.js +2 -0
  116. package/lib/version.js.map +1 -0
  117. package/package.json +56 -45
  118. package/dist/index.cjs +0 -3034
  119. package/dist/index.cjs.map +0 -1
  120. package/dist/index.mjs +0 -3032
  121. package/dist/index.mjs.map +0 -1
  122. package/src/autocapture.ts +0 -415
  123. package/src/config.ts +0 -8
  124. package/src/extensions/rageclick.ts +0 -34
  125. package/src/iife.ts +0 -87
  126. package/src/leanbase-logger.ts +0 -26
  127. package/src/leanbase-persistence.ts +0 -374
  128. package/src/leanbase.ts +0 -424
  129. package/src/page-view.ts +0 -124
  130. package/src/scroll-manager.ts +0 -103
  131. package/src/session-props.ts +0 -114
  132. package/src/utils/event-utils.ts +0 -304
  133. package/src/utils/index.ts +0 -222
  134. package/src/utils/request-utils.ts +0 -128
  135. package/src/utils/simple-event-emitter.ts +0 -27
  136. package/src/utils/user-agent-utils.ts +0 -357
  137. package/src/version.ts +0 -1
@@ -1,128 +0,0 @@
1
- import { logger } from '../leanbase-logger'
2
- import { each, document } from './'
3
-
4
- import { isArray, isFile, isUndefined } from '@posthog/core'
5
-
6
- const localDomains = ['localhost', '127.0.0.1']
7
-
8
- /**
9
- * IE11 doesn't support `new URL`
10
- * so we can create an anchor element and use that to parse the URL
11
- * there's a lot of overlap between HTMLHyperlinkElementUtils and URL
12
- * meaning useful properties like `pathname` are available on both
13
- */
14
- export const convertToURL = (url: string): HTMLAnchorElement | null => {
15
- const location = document?.createElement('a')
16
- if (isUndefined(location)) {
17
- return null
18
- }
19
-
20
- location.href = url
21
- return location
22
- }
23
-
24
- export const formDataToQuery = function (formdata: Record<string, any> | FormData, arg_separator = '&'): string {
25
- let use_val: string
26
- let use_key: string
27
- const tph_arr: string[] = []
28
-
29
- each(formdata, function (val: File | string | undefined, key: string | undefined) {
30
- // the key might be literally the string undefined for e.g. if {undefined: 'something'}
31
- if (isUndefined(val) || isUndefined(key) || key === 'undefined') {
32
- return
33
- }
34
-
35
- use_val = encodeURIComponent(isFile(val) ? val.name : val.toString())
36
- use_key = encodeURIComponent(key)
37
- tph_arr[tph_arr.length] = use_key + '=' + use_val
38
- })
39
-
40
- return tph_arr.join(arg_separator)
41
- }
42
-
43
- // NOTE: Once we get rid of IE11/op_mini we can start using URLSearchParams
44
- export const getQueryParam = function (url: string, param: string): string {
45
- const withoutHash: string = url.split('#')[0] || ''
46
-
47
- // Split only on the first ? to sort problem out for those with multiple ?s
48
- // and then remove them
49
- const queryParams: string = withoutHash.split(/\?(.*)/)[1] || ''
50
- const cleanedQueryParams = queryParams.replace(/^\?+/g, '')
51
-
52
- const queryParts = cleanedQueryParams.split('&')
53
- let keyValuePair
54
-
55
- for (let i = 0; i < queryParts.length; i++) {
56
- const parts = queryParts[i].split('=')
57
- if (parts[0] === param) {
58
- keyValuePair = parts
59
- break
60
- }
61
- }
62
-
63
- if (!isArray(keyValuePair) || keyValuePair.length < 2) {
64
- return ''
65
- } else {
66
- let result = keyValuePair[1]
67
- try {
68
- result = decodeURIComponent(result)
69
- } catch {
70
- logger.error('Skipping decoding for malformed query param: ' + result)
71
- }
72
- return result.replace(/\+/g, ' ')
73
- }
74
- }
75
-
76
- // replace any query params in the url with the provided mask value. Tries to keep the URL as instant as possible,
77
- // including preserving malformed text in most cases
78
- export const maskQueryParams = function <T extends string | undefined>(
79
- url: T,
80
- maskedParams: string[] | undefined,
81
- mask: string
82
- ): T extends string ? string : undefined {
83
- if (!url || !maskedParams || !maskedParams.length) {
84
- return url as any
85
- }
86
-
87
- const splitHash = url.split('#')
88
- const withoutHash: string = splitHash[0] || ''
89
- const hash = splitHash[1]
90
-
91
- const splitQuery: string[] = withoutHash.split('?')
92
- const queryString: string = splitQuery[1]
93
- const urlWithoutQueryAndHash: string = splitQuery[0]
94
- const queryParts = (queryString || '').split('&')
95
-
96
- // use an array of strings rather than an object to preserve ordering and duplicates
97
- const paramStrings: string[] = []
98
-
99
- for (let i = 0; i < queryParts.length; i++) {
100
- const keyValuePair = queryParts[i].split('=')
101
- if (!isArray(keyValuePair)) {
102
- continue
103
- } else if (maskedParams.includes(keyValuePair[0])) {
104
- paramStrings.push(keyValuePair[0] + '=' + mask)
105
- } else {
106
- paramStrings.push(queryParts[i])
107
- }
108
- }
109
-
110
- let result = urlWithoutQueryAndHash
111
- if (queryString != null) {
112
- result += '?' + paramStrings.join('&')
113
- }
114
- if (hash != null) {
115
- result += '#' + hash
116
- }
117
-
118
- return result as any
119
- }
120
-
121
- export const _getHashParam = function (hash: string, param: string): string | null {
122
- const matches = hash.match(new RegExp(param + '=([^&]*)'))
123
- return matches ? matches[1] : null
124
- }
125
-
126
- export const isLocalhost = (): boolean => {
127
- return localDomains.includes(location.hostname)
128
- }
@@ -1,27 +0,0 @@
1
- export class SimpleEventEmitter {
2
- private _events: { [key: string]: ((...args: any[]) => void)[] } = {}
3
-
4
- constructor() {
5
- this._events = {}
6
- }
7
-
8
- on(event: string, listener: (...args: any[]) => void): () => void {
9
- if (!this._events[event]) {
10
- this._events[event] = []
11
- }
12
- this._events[event].push(listener)
13
-
14
- return () => {
15
- this._events[event] = this._events[event].filter((x) => x !== listener)
16
- }
17
- }
18
-
19
- emit(event: string, payload: any): void {
20
- for (const listener of this._events[event] || []) {
21
- listener(payload)
22
- }
23
- for (const listener of this._events['*'] || []) {
24
- listener(event, payload)
25
- }
26
- }
27
- }
@@ -1,357 +0,0 @@
1
- import { isFunction, isUndefined, includes } from '@posthog/core'
2
-
3
- /**
4
- * this device detection code is (at time of writing) about 3% of the size of the entire library
5
- * this is mostly because the identifiers user in regexes and results can't be minified away since
6
- * they have meaning
7
- *
8
- * so, there are some pre-uglifying choices in the code to help reduce the size
9
- * e.g. many repeated strings are stored as variables and then old-fashioned concatenated together
10
- *
11
- * TL;DR here be dragons
12
- */
13
- const FACEBOOK = 'Facebook'
14
- const MOBILE = 'Mobile'
15
- const IOS = 'iOS'
16
- const ANDROID = 'Android'
17
- const TABLET = 'Tablet'
18
- const ANDROID_TABLET = ANDROID + ' ' + TABLET
19
- const IPAD = 'iPad'
20
- const APPLE = 'Apple'
21
- const APPLE_WATCH = APPLE + ' Watch'
22
- const SAFARI = 'Safari'
23
- const BLACKBERRY = 'BlackBerry'
24
- const SAMSUNG = 'Samsung'
25
- const SAMSUNG_BROWSER = SAMSUNG + 'Browser'
26
- const SAMSUNG_INTERNET = SAMSUNG + ' Internet'
27
- const CHROME = 'Chrome'
28
- const CHROME_OS = CHROME + ' OS'
29
- const CHROME_IOS = CHROME + ' ' + IOS
30
- const INTERNET_EXPLORER = 'Internet Explorer'
31
- const INTERNET_EXPLORER_MOBILE = INTERNET_EXPLORER + ' ' + MOBILE
32
- const OPERA = 'Opera'
33
- const OPERA_MINI = OPERA + ' Mini'
34
- const EDGE = 'Edge'
35
- const MICROSOFT_EDGE = 'Microsoft ' + EDGE
36
- const FIREFOX = 'Firefox'
37
- const FIREFOX_IOS = FIREFOX + ' ' + IOS
38
- const NINTENDO = 'Nintendo'
39
- const PLAYSTATION = 'PlayStation'
40
- const XBOX = 'Xbox'
41
- const ANDROID_MOBILE = ANDROID + ' ' + MOBILE
42
- const MOBILE_SAFARI = MOBILE + ' ' + SAFARI
43
- const WINDOWS = 'Windows'
44
- const WINDOWS_PHONE = WINDOWS + ' Phone'
45
- const NOKIA = 'Nokia'
46
- const OUYA = 'Ouya'
47
- const GENERIC = 'Generic'
48
- const GENERIC_MOBILE = GENERIC + ' ' + MOBILE.toLowerCase()
49
- const GENERIC_TABLET = GENERIC + ' ' + TABLET.toLowerCase()
50
- const KONQUEROR = 'Konqueror'
51
-
52
- const BROWSER_VERSION_REGEX_SUFFIX = '(\\d+(\\.\\d+)?)'
53
- const DEFAULT_BROWSER_VERSION_REGEX = new RegExp('Version/' + BROWSER_VERSION_REGEX_SUFFIX)
54
-
55
- const XBOX_REGEX = new RegExp(XBOX, 'i')
56
- const PLAYSTATION_REGEX = new RegExp(PLAYSTATION + ' \\w+', 'i')
57
- const NINTENDO_REGEX = new RegExp(NINTENDO + ' \\w+', 'i')
58
- const BLACKBERRY_REGEX = new RegExp(BLACKBERRY + '|PlayBook|BB10', 'i')
59
-
60
- const windowsVersionMap: Record<string, string> = {
61
- 'NT3.51': 'NT 3.11',
62
- 'NT4.0': 'NT 4.0',
63
- '5.0': '2000',
64
- '5.1': 'XP',
65
- '5.2': 'XP',
66
- '6.0': 'Vista',
67
- '6.1': '7',
68
- '6.2': '8',
69
- '6.3': '8.1',
70
- '6.4': '10',
71
- '10.0': '10',
72
- }
73
-
74
- /**
75
- * Safari detection turns out to be complicated. For e.g. https://stackoverflow.com/a/29696509
76
- * We can be slightly loose because some options have been ruled out (e.g. firefox on iOS)
77
- * before this check is made
78
- */
79
- function isSafari(userAgent: string): boolean {
80
- return includes(userAgent, SAFARI) && !includes(userAgent, CHROME) && !includes(userAgent, ANDROID)
81
- }
82
-
83
- const safariCheck = (ua: string, vendor?: string) => (vendor && includes(vendor, APPLE)) || isSafari(ua)
84
-
85
- /**
86
- * This function detects which browser is running this script.
87
- * The order of the checks are important since many user agents
88
- * include keywords used in later checks.
89
- */
90
- export const detectBrowser = function (user_agent: string, vendor: string | undefined): string {
91
- vendor = vendor || '' // vendor is undefined for at least IE9
92
-
93
- if (includes(user_agent, ' OPR/') && includes(user_agent, 'Mini')) {
94
- return OPERA_MINI
95
- } else if (includes(user_agent, ' OPR/')) {
96
- return OPERA
97
- } else if (BLACKBERRY_REGEX.test(user_agent)) {
98
- return BLACKBERRY
99
- } else if (includes(user_agent, 'IE' + MOBILE) || includes(user_agent, 'WPDesktop')) {
100
- return INTERNET_EXPLORER_MOBILE
101
- }
102
- // https://developer.samsung.com/internet/user-agent-string-format
103
- else if (includes(user_agent, SAMSUNG_BROWSER)) {
104
- return SAMSUNG_INTERNET
105
- } else if (includes(user_agent, EDGE) || includes(user_agent, 'Edg/')) {
106
- return MICROSOFT_EDGE
107
- } else if (includes(user_agent, 'FBIOS')) {
108
- return FACEBOOK + ' ' + MOBILE
109
- } else if (includes(user_agent, 'UCWEB') || includes(user_agent, 'UCBrowser')) {
110
- return 'UC Browser'
111
- } else if (includes(user_agent, 'CriOS')) {
112
- return CHROME_IOS // why not just Chrome?
113
- } else if (includes(user_agent, 'CrMo')) {
114
- return CHROME
115
- } else if (includes(user_agent, CHROME)) {
116
- return CHROME
117
- } else if (includes(user_agent, ANDROID) && includes(user_agent, SAFARI)) {
118
- return ANDROID_MOBILE
119
- } else if (includes(user_agent, 'FxiOS')) {
120
- return FIREFOX_IOS
121
- } else if (includes(user_agent.toLowerCase(), KONQUEROR.toLowerCase())) {
122
- return KONQUEROR
123
- } else if (safariCheck(user_agent, vendor)) {
124
- return includes(user_agent, MOBILE) ? MOBILE_SAFARI : SAFARI
125
- } else if (includes(user_agent, FIREFOX)) {
126
- return FIREFOX
127
- } else if (includes(user_agent, 'MSIE') || includes(user_agent, 'Trident/')) {
128
- return INTERNET_EXPLORER
129
- } else if (includes(user_agent, 'Gecko')) {
130
- return FIREFOX
131
- }
132
-
133
- return ''
134
- }
135
-
136
- const versionRegexes: Record<string, RegExp[]> = {
137
- [INTERNET_EXPLORER_MOBILE]: [new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)],
138
- [MICROSOFT_EDGE]: [new RegExp(EDGE + '?\\/' + BROWSER_VERSION_REGEX_SUFFIX)],
139
- [CHROME]: [new RegExp('(' + CHROME + '|CrMo)\\/' + BROWSER_VERSION_REGEX_SUFFIX)],
140
- [CHROME_IOS]: [new RegExp('CriOS\\/' + BROWSER_VERSION_REGEX_SUFFIX)],
141
- 'UC Browser': [new RegExp('(UCBrowser|UCWEB)\\/' + BROWSER_VERSION_REGEX_SUFFIX)],
142
- [SAFARI]: [DEFAULT_BROWSER_VERSION_REGEX],
143
- [MOBILE_SAFARI]: [DEFAULT_BROWSER_VERSION_REGEX],
144
- [OPERA]: [new RegExp('(' + OPERA + '|OPR)\\/' + BROWSER_VERSION_REGEX_SUFFIX)],
145
- [FIREFOX]: [new RegExp(FIREFOX + '\\/' + BROWSER_VERSION_REGEX_SUFFIX)],
146
- [FIREFOX_IOS]: [new RegExp('FxiOS\\/' + BROWSER_VERSION_REGEX_SUFFIX)],
147
- [KONQUEROR]: [new RegExp('Konqueror[:/]?' + BROWSER_VERSION_REGEX_SUFFIX, 'i')],
148
- // not every blackberry user agent has the version after the name
149
- [BLACKBERRY]: [new RegExp(BLACKBERRY + ' ' + BROWSER_VERSION_REGEX_SUFFIX), DEFAULT_BROWSER_VERSION_REGEX],
150
- [ANDROID_MOBILE]: [new RegExp('android\\s' + BROWSER_VERSION_REGEX_SUFFIX, 'i')],
151
- [SAMSUNG_INTERNET]: [new RegExp(SAMSUNG_BROWSER + '\\/' + BROWSER_VERSION_REGEX_SUFFIX)],
152
- [INTERNET_EXPLORER]: [new RegExp('(rv:|MSIE )' + BROWSER_VERSION_REGEX_SUFFIX)],
153
- Mozilla: [new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)],
154
- }
155
-
156
- /**
157
- * This function detects which browser version is running this script,
158
- * parsing major and minor version (e.g., 42.1). User agent strings from:
159
- * http://www.useragentstring.com/pages/useragentstring.php
160
- *
161
- * `navigator.vendor` is passed in and used to help with detecting certain browsers
162
- * NB `navigator.vendor` is deprecated and not present in every browser
163
- */
164
- export const detectBrowserVersion = function (userAgent: string, vendor: string | undefined): number | null {
165
- const browser = detectBrowser(userAgent, vendor)
166
- const regexes: RegExp[] | undefined = versionRegexes[browser as keyof typeof versionRegexes]
167
- if (isUndefined(regexes)) {
168
- return null
169
- }
170
-
171
- for (let i = 0; i < regexes.length; i++) {
172
- const regex = regexes[i]
173
- const matches = userAgent.match(regex)
174
- if (matches) {
175
- return parseFloat(matches[matches.length - 2])
176
- }
177
- }
178
- return null
179
- }
180
-
181
- // to avoid repeating regexes or calling them twice, we have an array of matches
182
- // the first regex that matches uses its matcher function to return the result
183
- const osMatchers: [
184
- RegExp,
185
- [string, string] | ((match: RegExpMatchArray | null, user_agent: string) => [string, string]),
186
- ][] = [
187
- [
188
- new RegExp(XBOX + '; ' + XBOX + ' (.*?)[);]', 'i'),
189
- (match) => {
190
- return [XBOX, (match && match[1]) || '']
191
- },
192
- ],
193
- [new RegExp(NINTENDO, 'i'), [NINTENDO, '']],
194
- [new RegExp(PLAYSTATION, 'i'), [PLAYSTATION, '']],
195
- [BLACKBERRY_REGEX, [BLACKBERRY, '']],
196
- [
197
- new RegExp(WINDOWS, 'i'),
198
- (_, user_agent) => {
199
- if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) {
200
- return [WINDOWS_PHONE, '']
201
- }
202
- // not all JS versions support negative lookbehind, so we need two checks here
203
- if (new RegExp(MOBILE).test(user_agent) && !/IEMobile\b/.test(user_agent)) {
204
- return [WINDOWS + ' ' + MOBILE, '']
205
- }
206
- const match = /Windows NT ([0-9.]+)/i.exec(user_agent)
207
- if (match && match[1]) {
208
- const version = match[1]
209
- let osVersion = windowsVersionMap[version] || ''
210
- if (/arm/i.test(user_agent)) {
211
- osVersion = 'RT'
212
- }
213
- return [WINDOWS, osVersion]
214
- }
215
- return [WINDOWS, '']
216
- },
217
- ],
218
- [
219
- /((iPhone|iPad|iPod).*?OS (\d+)_(\d+)_?(\d+)?|iPhone)/,
220
- (match) => {
221
- if (match && match[3]) {
222
- const versionParts = [match[3], match[4], match[5] || '0']
223
- return [IOS, versionParts.join('.')]
224
- }
225
- return [IOS, '']
226
- },
227
- ],
228
- [
229
- /(watch.*\/(\d+\.\d+\.\d+)|watch os,(\d+\.\d+),)/i,
230
- (match) => {
231
- // e.g. Watch4,3/5.3.8 (16U680)
232
- let version = ''
233
- if (match && match.length >= 3) {
234
- version = isUndefined(match[2]) ? match[3] : match[2]
235
- }
236
- return ['watchOS', version]
237
- },
238
- ],
239
- [
240
- new RegExp('(' + ANDROID + ' (\\d+)\\.(\\d+)\\.?(\\d+)?|' + ANDROID + ')', 'i'),
241
- (match) => {
242
- if (match && match[2]) {
243
- const versionParts = [match[2], match[3], match[4] || '0']
244
- return [ANDROID, versionParts.join('.')]
245
- }
246
- return [ANDROID, '']
247
- },
248
- ],
249
- [
250
- /Mac OS X (\d+)[_.](\d+)[_.]?(\d+)?/i,
251
- (match) => {
252
- const result: [string, string] = ['Mac OS X', '']
253
- if (match && match[1]) {
254
- const versionParts = [match[1], match[2], match[3] || '0']
255
- result[1] = versionParts.join('.')
256
- }
257
- return result
258
- },
259
- ],
260
- [
261
- /Mac/i,
262
- // mop up a few non-standard UAs that should match mac
263
- ['Mac OS X', ''],
264
- ],
265
- [/CrOS/, [CHROME_OS, '']],
266
- [/Linux|debian/i, ['Linux', '']],
267
- ]
268
-
269
- export const detectOS = function (user_agent: string): [string, string] {
270
- for (let i = 0; i < osMatchers.length; i++) {
271
- const [rgex, resultOrFn] = osMatchers[i]
272
- const match = rgex.exec(user_agent)
273
- const result = match && (isFunction(resultOrFn) ? resultOrFn(match, user_agent) : resultOrFn)
274
- if (result) {
275
- return result
276
- }
277
- }
278
- return ['', '']
279
- }
280
-
281
- export const detectDevice = function (user_agent: string): string {
282
- if (NINTENDO_REGEX.test(user_agent)) {
283
- return NINTENDO
284
- } else if (PLAYSTATION_REGEX.test(user_agent)) {
285
- return PLAYSTATION
286
- } else if (XBOX_REGEX.test(user_agent)) {
287
- return XBOX
288
- } else if (new RegExp(OUYA, 'i').test(user_agent)) {
289
- return OUYA
290
- } else if (new RegExp('(' + WINDOWS_PHONE + '|WPDesktop)', 'i').test(user_agent)) {
291
- return WINDOWS_PHONE
292
- } else if (/iPad/.test(user_agent)) {
293
- return IPAD
294
- } else if (/iPod/.test(user_agent)) {
295
- return 'iPod Touch'
296
- } else if (/iPhone/.test(user_agent)) {
297
- return 'iPhone'
298
- } else if (/(watch)(?: ?os[,/]|\d,\d\/)[\d.]+/i.test(user_agent)) {
299
- return APPLE_WATCH
300
- } else if (BLACKBERRY_REGEX.test(user_agent)) {
301
- return BLACKBERRY
302
- } else if (/(kobo)\s(ereader|touch)/i.test(user_agent)) {
303
- return 'Kobo'
304
- } else if (new RegExp(NOKIA, 'i').test(user_agent)) {
305
- return NOKIA
306
- } else if (
307
- // Kindle Fire without Silk / Echo Show
308
- /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i.test(user_agent) ||
309
- // Kindle Fire HD
310
- /(kf[a-z]+)( bui|\)).+silk\//i.test(user_agent)
311
- ) {
312
- return 'Kindle Fire'
313
- } else if (/(Android|ZTE)/i.test(user_agent)) {
314
- if (
315
- !new RegExp(MOBILE).test(user_agent) ||
316
- /(9138B|TB782B|Nexus [97]|pixel c|HUAWEISHT|BTV|noble nook|smart ultra 6)/i.test(user_agent)
317
- ) {
318
- if (
319
- (/pixel[\daxl ]{1,6}/i.test(user_agent) && !/pixel c/i.test(user_agent)) ||
320
- /(huaweimed-al00|tah-|APA|SM-G92|i980|zte|U304AA)/i.test(user_agent) ||
321
- (/lmy47v/i.test(user_agent) && !/QTAQZ3/i.test(user_agent))
322
- ) {
323
- return ANDROID
324
- }
325
- return ANDROID_TABLET
326
- } else {
327
- return ANDROID
328
- }
329
- } else if (new RegExp('(pda|' + MOBILE + ')', 'i').test(user_agent)) {
330
- return GENERIC_MOBILE
331
- } else if (new RegExp(TABLET, 'i').test(user_agent) && !new RegExp(TABLET + ' pc', 'i').test(user_agent)) {
332
- return GENERIC_TABLET
333
- } else {
334
- return ''
335
- }
336
- }
337
-
338
- export const detectDeviceType = function (user_agent: string): string {
339
- const device = detectDevice(user_agent)
340
- if (
341
- device === IPAD ||
342
- device === ANDROID_TABLET ||
343
- device === 'Kobo' ||
344
- device === 'Kindle Fire' ||
345
- device === GENERIC_TABLET
346
- ) {
347
- return TABLET
348
- } else if (device === NINTENDO || device === XBOX || device === PLAYSTATION || device === OUYA) {
349
- return 'Console'
350
- } else if (device === APPLE_WATCH) {
351
- return 'Wearable'
352
- } else if (device) {
353
- return MOBILE
354
- } else {
355
- return 'Desktop'
356
- }
357
- }
package/src/version.ts DELETED
@@ -1 +0,0 @@
1
- export const version = '0.1.3'