-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
86 lines (71 loc) · 2.47 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import { minutesToMillis } from '@cityssm/to-millis'
import browserLauncher from '@httptoolkit/browser-launcher'
import { type ApplicationVersion, parseVersion } from './utilities.js'
export type InstalledWebBrowser = browserLauncher.Browser & ApplicationVersion
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
const installedWebBrowsersExpiryMillis = minutesToMillis(5)
let installedWebBrowsers: InstalledWebBrowser[] = []
let installedWebBrowsersMillis = 0
export const possibleWebBrowserTypes = [
'chrome',
'chromium',
'firefox',
'phantomjs',
'safari',
'ie',
'msedge',
'brave',
'opera',
'arc'
] as const
export const chromeWebBrowserTypes = [
'chrome',
'chromium'
] as const satisfies Array<(typeof possibleWebBrowserTypes)[number]>
async function _loadInstalledWebBrowsers(): Promise<InstalledWebBrowser[]> {
if (
Date.now() - installedWebBrowsersMillis <=
installedWebBrowsersExpiryMillis ||
installedWebBrowsers.length > 0
) {
return installedWebBrowsers
}
// eslint-disable-next-line promise/avoid-new
return await new Promise((resolve) => {
browserLauncher.detect((browsers) => {
const installedWebBrowsersTemp: InstalledWebBrowser[] = []
for (const browser of browsers) {
installedWebBrowsersTemp.push(
Object.assign(browser, parseVersion(browser.version))
)
}
installedWebBrowsers = installedWebBrowsersTemp
installedWebBrowsersMillis = Date.now()
resolve(installedWebBrowsersTemp)
})
})
}
/**
* Retrieves a list of installed web browsers that optionally match the given types.
* @param webBrowserTypes - An optional web browser type or list of web browser types to filter by.
* @param minimumMajorVersion - An optional minimum major version number.
* @returns - An array of installed web browsers.
*/
export async function getInstalledWebBrowsers(
webBrowserTypes?:
| (typeof possibleWebBrowserTypes)[number]
| Array<(typeof possibleWebBrowserTypes)[number]>,
minimumMajorVersion = 0
): Promise<InstalledWebBrowser[]> {
const browsers = await _loadInstalledWebBrowsers()
if (webBrowserTypes === undefined) {
return browsers
}
const webBrowserTypesToSearch =
typeof webBrowserTypes === 'string' ? [webBrowserTypes] : webBrowserTypes
return browsers.filter(
(possibleBrowser) =>
(webBrowserTypesToSearch as string[]).includes(possibleBrowser.type) &&
(possibleBrowser.majorVersion ?? 0) >= minimumMajorVersion
)
}