Buckets:
| import {promisify} from 'node:util'; | |
| import {execFile} from 'node:child_process'; | |
| const execFileAsync = promisify(execFile); | |
| // TODO: Fix the casing of bundle identifiers in the next major version. | |
| // Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake | |
| // ones that look real and match the macOS/Linux versions for cross-platform apps. | |
| const windowsBrowserProgIds = { | |
| MSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // The missing `L` is correct. | |
| MSEdgeBHTML: {name: 'Edge Beta', id: 'com.microsoft.edge.beta'}, | |
| MSEdgeDHTML: {name: 'Edge Dev', id: 'com.microsoft.edge.dev'}, | |
| AppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'}, | |
| ChromeHTML: {name: 'Chrome', id: 'com.google.chrome'}, | |
| ChromeBHTML: {name: 'Chrome Beta', id: 'com.google.chrome.beta'}, | |
| ChromeDHTML: {name: 'Chrome Dev', id: 'com.google.chrome.dev'}, | |
| ChromiumHTM: {name: 'Chromium', id: 'org.chromium.Chromium'}, | |
| BraveHTML: {name: 'Brave', id: 'com.brave.Browser'}, | |
| BraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'}, | |
| BraveDHTML: {name: 'Brave Dev', id: 'com.brave.Browser.dev'}, | |
| BraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'}, | |
| FirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'}, | |
| OperaStable: {name: 'Opera', id: 'com.operasoftware.Opera'}, | |
| VivaldiHTM: {name: 'Vivaldi', id: 'com.vivaldi.Vivaldi'}, | |
| 'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'}, | |
| }; | |
| export const _windowsBrowserProgIdMap = new Map(Object.entries(windowsBrowserProgIds)); | |
| export class UnknownBrowserError extends Error {} | |
| export default async function defaultBrowser(_execFileAsync = execFileAsync) { | |
| const {stdout} = await _execFileAsync('reg', [ | |
| 'QUERY', | |
| ' HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice', | |
| '/v', | |
| 'ProgId', | |
| ]); | |
| const match = /ProgId\s*REG_SZ\s*(?<id>\S+)/.exec(stdout); | |
| if (!match) { | |
| throw new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`); | |
| } | |
| const {id} = match.groups; | |
| const browser = windowsBrowserProgIds[id]; | |
| if (!browser) { | |
| throw new UnknownBrowserError(`Unknown browser ID: ${id}`); | |
| } | |
| return browser; | |
| } | |
Xet Storage Details
- Size:
- 2.22 kB
- Xet hash:
- 39a030233d3ef47b7f5a332a18d081e69c037a67c8bbc33951a933125ff946ba
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.