find-chrome-bin
Version:
Finds local Chromium binary to use it with puppeteer-core
66 lines (54 loc) • 1.79 kB
JavaScript
import { sep, join } from 'path'
import { execSync } from 'child_process'
import { canAccess } from '../utils/index.js'
export function findChromeBinaryOnWin32(canary) {
let suffix = canary
? `${sep}Google${sep}Chrome SxS${sep}Application${sep}chrome.exe`
: `${sep}Google${sep}Chrome${sep}Application${sep}chrome.exe`
let prefixes = [
process.env.LOCALAPPDATA,
process.env.PROGRAMFILES,
process.env['PROGRAMFILES(X86)']
].filter(Boolean)
let result
prefixes.forEach(prefix => {
let chromePath = join(prefix, suffix)
if (canAccess(chromePath)) result = chromePath
})
return result
}
export function getWin32ChromeVersionInfo(executablePath) {
let executablePathForNode = executablePath.replace(/\\/g, '\\\\')
let wmiResult = execSync(
`wmic datafile where name="${executablePathForNode}" GET Manufacturer,FileName,Version /format:csv`,
{ stdio: ['pipe', 'pipe', 'ignore'] }
)
let wmiResultAsStringArray = wmiResult
.toString()
.replace(/^\r\r\n/, '')
.replace(/\r\r\n$/, '')
.split('\r\r\n')
if (wmiResultAsStringArray.length === 2) {
let columnNames = wmiResultAsStringArray[0].split(',')
let values = wmiResultAsStringArray[1].split(',')
let manufacturer = ''
let version = ''
columnNames.forEach((columnName, index) => {
switch (columnName) {
case 'Manufacturer':
if (values[index].includes('Chromium')) {
manufacturer = 'Chromium'
} else {
manufacturer = 'Google Chrome'
}
break
case 'Version':
version = values[index]
break
}
})
return `${manufacturer} ${version}`
} else {
throw new Error(`No version information found for '${executablePath}'`)
}
}