brave-real-launcher 1.2.51 → 1.2.52
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.
- package/README.md +100 -35
- package/bin/print-brave-path.cjs +0 -0
- package/dist/brave-finder.d.ts +19 -0
- package/dist/brave-finder.js +133 -7
- package/dist/brave-finder.mjs +125 -1
- package/dist/brave-installer.js +33 -12
- package/dist/brave-installer.mjs +16 -5
- package/dist/brave-launcher.d.ts +0 -3
- package/dist/brave-launcher.js +25 -15
- package/dist/brave-launcher.mjs +2 -2
- package/dist/chrome-launcher.d.ts +0 -3
- package/dist/chrome-launcher.js +22 -12
- package/dist/chrome-launcher.mjs +1 -1
- package/dist/chrome-version.js +9 -9
- package/dist/chrome-version.mjs +1 -1
- package/dist/errors.js +19 -19
- package/dist/errors.mjs +1 -1
- package/dist/extension-manager.js +18 -8
- package/dist/extension-manager.mjs +1 -1
- package/dist/index.js +18 -8
- package/dist/logger.js +1 -1
- package/dist/logger.mjs +1 -1
- package/dist/random-port.js +2 -3
- package/dist/stealth-utils.js +6 -6
- package/dist/stealth-utils.mjs +1 -1
- package/dist/utils.d.ts +0 -1
- package/dist/utils.js +10 -10
- package/dist/utils.mjs +1 -1
- package/dist/xvfb-support.js +18 -8
- package/dist/xvfb-support.mjs +1 -1
- package/package.json +4 -5
- package/scripts/postinstall.cjs +80 -0
- package/test.cjs +102 -53
- package/CHANGELOG.md +0 -142
- package/GITHUB_ACTION_SETUP.md +0 -221
- package/GITHUB_SETUP.md +0 -125
package/README.md
CHANGED
|
@@ -10,9 +10,10 @@ Launch Brave Browser with ease from Node.js. Based on [chrome-launcher](https://
|
|
|
10
10
|
- 🎯 **Launch Modes**: Headless mode, GUI mode, or automatic detection
|
|
11
11
|
- 🔄 **Auto-Sync**: Automatically syncs with chrome-launcher updates while preserving Brave-specific features
|
|
12
12
|
- 📦 **uBlock Origin**: Automatic download and loading of uBlock Origin ad blocker
|
|
13
|
-
- 🛡️ **Stealth Mode**: Anti-bot-detection capabilities
|
|
14
|
-
- ⬇️ **Auto-Install**: Automatically install Brave if not present (
|
|
13
|
+
- 🛡️ **Stealth Mode**: Anti-bot-detection capabilities (enabled by default)
|
|
14
|
+
- ⬇️ **Auto-Install**: Automatically install Brave if not present (enabled by default)
|
|
15
15
|
- 🔇 **P3A Disabled**: Private analytics notifications disabled by default
|
|
16
|
+
- 🔍 **Chrome/Chromium Fallback**: Detect Chrome and Chromium as fallback browsers
|
|
16
17
|
|
|
17
18
|
## Installation
|
|
18
19
|
|
|
@@ -20,6 +21,23 @@ Launch Brave Browser with ease from Node.js. Based on [chrome-launcher](https://
|
|
|
20
21
|
npm install brave-real-launcher
|
|
21
22
|
```
|
|
22
23
|
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
```javascript
|
|
27
|
+
const { launch, killAll } = require('brave-real-launcher');
|
|
28
|
+
|
|
29
|
+
// Basic launch - auto-installs Brave if missing, stealth mode enabled
|
|
30
|
+
const brave = await launch({
|
|
31
|
+
startingUrl: 'https://example.com',
|
|
32
|
+
logLevel: 'info'
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
console.log(`Brave running on port ${brave.port}`);
|
|
36
|
+
|
|
37
|
+
// Clean up
|
|
38
|
+
brave.kill();
|
|
39
|
+
```
|
|
40
|
+
|
|
23
41
|
## API
|
|
24
42
|
|
|
25
43
|
### `launch(options)`
|
|
@@ -38,9 +56,9 @@ Launches Brave Browser with the specified options.
|
|
|
38
56
|
| `launchMode` | `'auto'\|'headless'\|'gui'` | `'auto'` | Launch mode |
|
|
39
57
|
| `enableXvfb` | `boolean` | `false` | Enable Xvfb on Linux |
|
|
40
58
|
| `autoLoadUBlock` | `boolean` | `false` | Auto-load uBlock Origin |
|
|
41
|
-
| `enableStealth` | `boolean` |
|
|
42
|
-
| `autoInstall` | `boolean` |
|
|
43
|
-
| `userAgent` | `string` |
|
|
59
|
+
| `enableStealth` | `boolean` | **`true`** | Enable stealth mode |
|
|
60
|
+
| `autoInstall` | `boolean` | **`true`** | Auto-install Brave if not found |
|
|
61
|
+
| `userAgent` | `string` | dynamic | Custom user agent |
|
|
44
62
|
| `logLevel` | `'verbose'\|'info'\|'error'\|'silent'` | `'silent'` | Log level |
|
|
45
63
|
|
|
46
64
|
**Returns:** `LaunchedBrave` object with:
|
|
@@ -50,9 +68,59 @@ Launches Brave Browser with the specified options.
|
|
|
50
68
|
- `extensions`: Loaded extensions info
|
|
51
69
|
- `kill()`: Function to kill browser
|
|
52
70
|
|
|
53
|
-
###
|
|
71
|
+
### Other Exports
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
const {
|
|
75
|
+
// Core functions
|
|
76
|
+
launch,
|
|
77
|
+
killAll,
|
|
78
|
+
getBravePath,
|
|
79
|
+
getInstallations,
|
|
80
|
+
findBrave,
|
|
81
|
+
|
|
82
|
+
// Classes
|
|
83
|
+
BraveLauncher, // Launcher class
|
|
84
|
+
BraveInstaller, // Auto-install helper
|
|
85
|
+
ExtensionManager, // Extension loader
|
|
86
|
+
XvfbManager, // Xvfb for Linux
|
|
87
|
+
|
|
88
|
+
// Flags
|
|
89
|
+
DEFAULT_FLAGS, // 32 default flags
|
|
90
|
+
|
|
91
|
+
// Stealth utilities
|
|
92
|
+
STEALTH_FLAGS,
|
|
93
|
+
STEALTH_SCRIPTS,
|
|
94
|
+
USER_AGENTS,
|
|
95
|
+
getStealthFlags,
|
|
96
|
+
getDynamicUserAgents,
|
|
97
|
+
getLatestChromeVersion,
|
|
98
|
+
|
|
99
|
+
// Browser detection
|
|
100
|
+
braveFinder, // findChrome, findChromium, findAnyChromiumBrowser
|
|
101
|
+
|
|
102
|
+
// Utilities
|
|
103
|
+
getRandomPort,
|
|
104
|
+
getPlatform,
|
|
105
|
+
detectDesktopEnvironment
|
|
106
|
+
} = require('brave-real-launcher');
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Chrome/Chromium Fallback
|
|
110
|
+
|
|
111
|
+
If Brave is not available, you can use Chrome or Chromium:
|
|
54
112
|
|
|
55
|
-
|
|
113
|
+
```javascript
|
|
114
|
+
const { braveFinder } = require('brave-real-launcher');
|
|
115
|
+
|
|
116
|
+
// Find any Chromium-based browser (Brave → Chrome → Chromium)
|
|
117
|
+
const browser = braveFinder.findAnyChromiumBrowser();
|
|
118
|
+
// Returns: { browser: 'brave'|'chrome'|'chromium', path: '...' }
|
|
119
|
+
|
|
120
|
+
// Or find specific browsers
|
|
121
|
+
const chromePaths = braveFinder.findChrome();
|
|
122
|
+
const chromiumPaths = braveFinder.findChromium();
|
|
123
|
+
```
|
|
56
124
|
|
|
57
125
|
## Platform Support
|
|
58
126
|
|
|
@@ -67,7 +135,7 @@ Returns the path to the Brave Browser executable.
|
|
|
67
135
|
### Path Detection
|
|
68
136
|
|
|
69
137
|
| Platform | Detection Paths |
|
|
70
|
-
|
|
138
|
+
|----------|-----------------||
|
|
71
139
|
| **Windows** | `%LOCALAPPDATA%\BraveSoftware\...`, `%PROGRAMFILES%\...` |
|
|
72
140
|
| **Linux** | `/usr/bin/brave-browser`, `/opt/brave.com/brave/...`, Flatpak, Snap |
|
|
73
141
|
| **macOS** | `/Applications/Brave Browser.app/...` |
|
|
@@ -75,22 +143,33 @@ Returns the path to the Brave Browser executable.
|
|
|
75
143
|
## Testing
|
|
76
144
|
|
|
77
145
|
```bash
|
|
78
|
-
#
|
|
79
|
-
|
|
146
|
+
# Run comprehensive tests (10 tests)
|
|
147
|
+
node test.cjs
|
|
80
148
|
|
|
81
|
-
#
|
|
82
|
-
npm run
|
|
83
|
-
|
|
84
|
-
#
|
|
85
|
-
npm test
|
|
86
|
-
|
|
87
|
-
# Test Brave detection
|
|
88
|
-
npm run test:detection
|
|
149
|
+
# Quick test commands
|
|
150
|
+
npm run test:detection # Test Brave detection
|
|
151
|
+
npm run test:exports # Test module exports
|
|
152
|
+
npm run test:ci # Full CI test suite
|
|
89
153
|
|
|
90
154
|
# Test with uBlock Origin
|
|
91
155
|
node -e "const {launch} = require('./dist'); launch({autoLoadUBlock:true, startingUrl:'https://example.com', logLevel:'info'}).then(b => setTimeout(() => b.kill(), 5000))"
|
|
92
156
|
```
|
|
93
157
|
|
|
158
|
+
### Test Coverage
|
|
159
|
+
|
|
160
|
+
| Test | Description |
|
|
161
|
+
|------|-------------|
|
|
162
|
+
| Brave Installations Check | Detects all Brave installations |
|
|
163
|
+
| Basic Launch & Kill | Launch and terminate browser |
|
|
164
|
+
| Headless Mode | Headless browser operation |
|
|
165
|
+
| Custom Configuration | Custom flags and preferences |
|
|
166
|
+
| Port Management | Multiple instances on different ports |
|
|
167
|
+
| API Validation | All exports work correctly |
|
|
168
|
+
| Remote Debugging Pipes | Debugging pipes functionality |
|
|
169
|
+
| Multiple Instances | Run 3+ instances simultaneously |
|
|
170
|
+
| Kill All Functionality | Terminate all instances |
|
|
171
|
+
| Performance Test | < 1s launch time |
|
|
172
|
+
|
|
94
173
|
## Environment Variables
|
|
95
174
|
|
|
96
175
|
| Variable | Description |
|
|
@@ -98,23 +177,8 @@ node -e "const {launch} = require('./dist'); launch({autoLoadUBlock:true, starti
|
|
|
98
177
|
| `BRAVE_PATH` | Path to Brave executable |
|
|
99
178
|
| `HEADLESS` | Force headless mode when set |
|
|
100
179
|
| `DISPLAY` | X11 display (Linux) |
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
# Clone repository
|
|
106
|
-
git clone https://github.com/codeiva4u/Brave-Real-Launcher.git
|
|
107
|
-
cd brave-real-launcher
|
|
108
|
-
|
|
109
|
-
# Install dependencies
|
|
110
|
-
npm install
|
|
111
|
-
|
|
112
|
-
# Build
|
|
113
|
-
npm run build
|
|
114
|
-
|
|
115
|
-
# Run CI tests
|
|
116
|
-
npm run test:ci
|
|
117
|
-
```
|
|
180
|
+
| `CI` | Skip postinstall in CI environments |
|
|
181
|
+
| `SKIP_BRAVE_INSTALL` | Skip auto-install on npm install |
|
|
118
182
|
|
|
119
183
|
## Auto-Sync with chrome-launcher
|
|
120
184
|
|
|
@@ -129,3 +193,4 @@ This project automatically syncs with chrome-launcher updates while preserving B
|
|
|
129
193
|
## License
|
|
130
194
|
|
|
131
195
|
Apache-2.0 - Based on chrome-launcher by The Chromium Authors
|
|
196
|
+
|
package/bin/print-brave-path.cjs
CHANGED
|
File without changes
|
package/dist/brave-finder.d.ts
CHANGED
|
@@ -13,3 +13,22 @@ export declare function darwin(): string[];
|
|
|
13
13
|
export declare function linux(): string[];
|
|
14
14
|
export declare function wsl(): string[];
|
|
15
15
|
export declare function win32(): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Chrome/Chromium Fallback Detection
|
|
18
|
+
* These functions can be used to find Chrome or Chromium when Brave is not available
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Find Chrome browser installations
|
|
22
|
+
*/
|
|
23
|
+
export declare function findChrome(): string[];
|
|
24
|
+
/**
|
|
25
|
+
* Find Chromium browser installations
|
|
26
|
+
*/
|
|
27
|
+
export declare function findChromium(): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Find any Chromium-based browser with fallback chain: Brave -> Chrome -> Chromium
|
|
30
|
+
*/
|
|
31
|
+
export declare function findAnyChromiumBrowser(): {
|
|
32
|
+
browser: string;
|
|
33
|
+
path: string;
|
|
34
|
+
} | null;
|
package/dist/brave-finder.js
CHANGED
|
@@ -8,7 +8,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
8
8
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
9
|
};
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.
|
|
11
|
+
exports.darwinFast = darwinFast;
|
|
12
|
+
exports.darwin = darwin;
|
|
13
|
+
exports.linux = linux;
|
|
14
|
+
exports.wsl = wsl;
|
|
15
|
+
exports.win32 = win32;
|
|
16
|
+
exports.findChrome = findChrome;
|
|
17
|
+
exports.findChromium = findChromium;
|
|
18
|
+
exports.findAnyChromiumBrowser = findAnyChromiumBrowser;
|
|
12
19
|
const fs_1 = __importDefault(require("fs"));
|
|
13
20
|
const path_1 = __importDefault(require("path"));
|
|
14
21
|
const os_1 = require("os");
|
|
@@ -37,7 +44,6 @@ function darwinFast() {
|
|
|
37
44
|
}
|
|
38
45
|
return darwin()[0];
|
|
39
46
|
}
|
|
40
|
-
exports.darwinFast = darwinFast;
|
|
41
47
|
function darwin() {
|
|
42
48
|
const suffixes = [
|
|
43
49
|
'/Contents/MacOS/Brave Browser',
|
|
@@ -97,7 +103,6 @@ function darwin() {
|
|
|
97
103
|
// clang-format on
|
|
98
104
|
return sort(installations, priorities);
|
|
99
105
|
}
|
|
100
|
-
exports.darwin = darwin;
|
|
101
106
|
function resolveBravePath() {
|
|
102
107
|
if (canAccess(process.env.BRAVE_PATH)) {
|
|
103
108
|
return process.env.BRAVE_PATH;
|
|
@@ -206,7 +211,6 @@ function linux() {
|
|
|
206
211
|
}
|
|
207
212
|
return sort(uniq(installations.filter(Boolean)), priorities);
|
|
208
213
|
}
|
|
209
|
-
exports.linux = linux;
|
|
210
214
|
function wsl() {
|
|
211
215
|
// Manually populate the environment variables assuming it's the default config
|
|
212
216
|
process.env.LOCALAPPDATA = (0, utils_js_1.getWSLLocalAppDataPath)(`${process.env.PATH}`);
|
|
@@ -215,7 +219,6 @@ function wsl() {
|
|
|
215
219
|
(0, utils_js_1.toWSLPath)('C:/Program Files (x86)', '/mnt/c/Program Files (x86)');
|
|
216
220
|
return win32();
|
|
217
221
|
}
|
|
218
|
-
exports.wsl = wsl;
|
|
219
222
|
function win32() {
|
|
220
223
|
const installations = [];
|
|
221
224
|
// Brave Browser installation paths for different architectures
|
|
@@ -261,7 +264,6 @@ function win32() {
|
|
|
261
264
|
}
|
|
262
265
|
return installations;
|
|
263
266
|
}
|
|
264
|
-
exports.win32 = win32;
|
|
265
267
|
function getWindowsRegistryBravePaths() {
|
|
266
268
|
const paths = [];
|
|
267
269
|
// Registry keys where Brave might be registered
|
|
@@ -348,4 +350,128 @@ function findBraveExecutables(folder) {
|
|
|
348
350
|
}
|
|
349
351
|
return installations;
|
|
350
352
|
}
|
|
351
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhdmUtZmluZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JyYXZlLWZpbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsWUFBWSxDQUFDOzs7Ozs7QUFFYiw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLDJCQUEyQjtBQUMzQixpREFBdUM7QUFDdkMsZ0ZBQWdEO0FBQ2hELDREQUE4QjtBQUM5QixrREFBMEI7QUFFMUIseUNBQW1GO0FBRW5GLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQztBQUk3Qjs7R0FFRztBQUNILFNBQWdCLFVBQVU7SUFDeEIsTUFBTSxlQUFlLEdBQTRCO1FBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVTtRQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQjtRQUNqQyxzQkFBc0I7UUFDdEIsOERBQThEO1FBQzlELHdFQUF3RTtRQUN4RSw4RUFBOEU7UUFDOUUsc0VBQXNFO0tBQ3ZFLENBQUM7SUFFRixLQUFLLE1BQU0sU0FBUyxJQUFJLGVBQWUsRUFBRTtRQUN2QyxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7S0FDekQ7SUFFRCxPQUFPLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3BCLENBQUM7QUFoQkQsZ0NBZ0JDO0FBRUQsU0FBZ0IsTUFBTTtJQUNwQixNQUFNLFFBQVEsR0FBRztRQUNmLCtCQUErQjtRQUMvQixvQ0FBb0M7UUFDcEMsdUNBQXVDO1FBQ3ZDLG1DQUFtQztLQUNwQyxDQUFDO0lBRUYsTUFBTSxVQUFVLEdBQUcsbURBQW1EO1FBQ2xFLGlEQUFpRDtRQUNqRCxnQ0FBZ0MsQ0FBQztJQUVyQyxNQUFNLGFBQWEsR0FBa0IsRUFBRSxDQUFDO0lBRXhDLE1BQU0sZUFBZSxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDM0MsSUFBSSxlQUFlLEVBQUU7UUFDbkIsYUFBYSxDQUFD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
|
|
353
|
+
/**
|
|
354
|
+
* Chrome/Chromium Fallback Detection
|
|
355
|
+
* These functions can be used to find Chrome or Chromium when Brave is not available
|
|
356
|
+
*/
|
|
357
|
+
/**
|
|
358
|
+
* Find Chrome browser installations
|
|
359
|
+
*/
|
|
360
|
+
function findChrome() {
|
|
361
|
+
const installations = [];
|
|
362
|
+
const platform = process.platform;
|
|
363
|
+
if (platform === 'win32') {
|
|
364
|
+
const suffixes = [
|
|
365
|
+
`${path_1.default.sep}Google${path_1.default.sep}Chrome${path_1.default.sep}Application${path_1.default.sep}chrome.exe`,
|
|
366
|
+
`${path_1.default.sep}Google${path_1.default.sep}Chrome Beta${path_1.default.sep}Application${path_1.default.sep}chrome.exe`,
|
|
367
|
+
`${path_1.default.sep}Google${path_1.default.sep}Chrome Dev${path_1.default.sep}Application${path_1.default.sep}chrome.exe`,
|
|
368
|
+
`${path_1.default.sep}Google${path_1.default.sep}Chrome Canary${path_1.default.sep}Application${path_1.default.sep}chrome.exe`,
|
|
369
|
+
];
|
|
370
|
+
const prefixes = [
|
|
371
|
+
process.env.LOCALAPPDATA,
|
|
372
|
+
process.env.PROGRAMFILES,
|
|
373
|
+
process.env['PROGRAMFILES(X86)'],
|
|
374
|
+
].filter(Boolean);
|
|
375
|
+
prefixes.forEach(prefix => suffixes.forEach(suffix => {
|
|
376
|
+
const chromePath = path_1.default.join(prefix, suffix);
|
|
377
|
+
if (canAccess(chromePath))
|
|
378
|
+
installations.push(chromePath);
|
|
379
|
+
}));
|
|
380
|
+
}
|
|
381
|
+
else if (platform === 'darwin') {
|
|
382
|
+
const paths = [
|
|
383
|
+
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
384
|
+
'/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta',
|
|
385
|
+
'/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary',
|
|
386
|
+
];
|
|
387
|
+
paths.forEach(p => canAccess(p) && installations.push(p));
|
|
388
|
+
}
|
|
389
|
+
else if (platform === 'linux') {
|
|
390
|
+
const paths = [
|
|
391
|
+
'/usr/bin/google-chrome',
|
|
392
|
+
'/usr/bin/google-chrome-stable',
|
|
393
|
+
'/usr/bin/google-chrome-beta',
|
|
394
|
+
'/usr/bin/google-chrome-dev',
|
|
395
|
+
'/opt/google/chrome/chrome',
|
|
396
|
+
'/opt/google/chrome-beta/chrome',
|
|
397
|
+
];
|
|
398
|
+
paths.forEach(p => canAccess(p) && installations.push(p));
|
|
399
|
+
try {
|
|
400
|
+
const chromePath = which_1.default.sync('google-chrome', { nothrow: true });
|
|
401
|
+
if (chromePath && canAccess(chromePath))
|
|
402
|
+
installations.push(chromePath);
|
|
403
|
+
}
|
|
404
|
+
catch (e) { /* ignore */ }
|
|
405
|
+
}
|
|
406
|
+
return uniq(installations);
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Find Chromium browser installations
|
|
410
|
+
*/
|
|
411
|
+
function findChromium() {
|
|
412
|
+
const installations = [];
|
|
413
|
+
const platform = process.platform;
|
|
414
|
+
if (platform === 'win32') {
|
|
415
|
+
const paths = [
|
|
416
|
+
path_1.default.join(process.env.LOCALAPPDATA || '', 'Chromium', 'Application', 'chrome.exe'),
|
|
417
|
+
path_1.default.join(process.env.PROGRAMFILES || '', 'Chromium', 'Application', 'chrome.exe'),
|
|
418
|
+
];
|
|
419
|
+
paths.forEach(p => canAccess(p) && installations.push(p));
|
|
420
|
+
}
|
|
421
|
+
else if (platform === 'darwin') {
|
|
422
|
+
const paths = [
|
|
423
|
+
'/Applications/Chromium.app/Contents/MacOS/Chromium',
|
|
424
|
+
path_1.default.join((0, os_1.homedir)(), 'Applications', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'),
|
|
425
|
+
];
|
|
426
|
+
paths.forEach(p => canAccess(p) && installations.push(p));
|
|
427
|
+
}
|
|
428
|
+
else if (platform === 'linux') {
|
|
429
|
+
const paths = [
|
|
430
|
+
'/usr/bin/chromium',
|
|
431
|
+
'/usr/bin/chromium-browser',
|
|
432
|
+
'/snap/bin/chromium',
|
|
433
|
+
'/opt/chromium/chrome',
|
|
434
|
+
];
|
|
435
|
+
paths.forEach(p => canAccess(p) && installations.push(p));
|
|
436
|
+
try {
|
|
437
|
+
const chromiumPath = which_1.default.sync('chromium', { nothrow: true }) ||
|
|
438
|
+
which_1.default.sync('chromium-browser', { nothrow: true });
|
|
439
|
+
if (chromiumPath && canAccess(chromiumPath))
|
|
440
|
+
installations.push(chromiumPath);
|
|
441
|
+
}
|
|
442
|
+
catch (e) { /* ignore */ }
|
|
443
|
+
}
|
|
444
|
+
return uniq(installations);
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Find any Chromium-based browser with fallback chain: Brave -> Chrome -> Chromium
|
|
448
|
+
*/
|
|
449
|
+
function findAnyChromiumBrowser() {
|
|
450
|
+
// Try Brave first
|
|
451
|
+
try {
|
|
452
|
+
const platform = process.platform;
|
|
453
|
+
let braveInstallations = [];
|
|
454
|
+
if (platform === 'win32')
|
|
455
|
+
braveInstallations = win32();
|
|
456
|
+
else if (platform === 'darwin')
|
|
457
|
+
braveInstallations = darwin();
|
|
458
|
+
else if (platform === 'linux')
|
|
459
|
+
braveInstallations = linux();
|
|
460
|
+
if (braveInstallations.length > 0) {
|
|
461
|
+
return { browser: 'brave', path: braveInstallations[0] };
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
catch (e) { /* Brave not found */ }
|
|
465
|
+
// Try Chrome
|
|
466
|
+
const chromeInstallations = findChrome();
|
|
467
|
+
if (chromeInstallations.length > 0) {
|
|
468
|
+
return { browser: 'chrome', path: chromeInstallations[0] };
|
|
469
|
+
}
|
|
470
|
+
// Try Chromium
|
|
471
|
+
const chromiumInstallations = findChromium();
|
|
472
|
+
if (chromiumInstallations.length > 0) {
|
|
473
|
+
return { browser: 'chromium', path: chromiumInstallations[0] };
|
|
474
|
+
}
|
|
475
|
+
return null;
|
|
476
|
+
}
|
|
477
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhdmUtZmluZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JyYXZlLWZpbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsWUFBWSxDQUFDOzs7OztBQW1CYixnQ0FnQkM7QUFFRCx3QkFrRUM7QUF3QkQsc0JBcUdDO0FBRUQsa0JBUUM7QUFFRCxzQkFpREM7QUE0R0QsZ0NBOENDO0FBS0Qsb0NBaUNDO0FBS0Qsd0RBNEJDO0FBaGdCRCw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLDJCQUE2QjtBQUM3QixpREFBeUM7QUFDekMsZ0ZBQWdEO0FBQ2hELDREQUE4QjtBQUM5QixrREFBMEI7QUFFMUIseUNBQXFGO0FBRXJGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQztBQUk3Qjs7R0FFRztBQUNILFNBQWdCLFVBQVU7SUFDeEIsTUFBTSxlQUFlLEdBQThCO1FBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVTtRQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQjtRQUNqQyxzQkFBc0I7UUFDdEIsOERBQThEO1FBQzlELHdFQUF3RTtRQUN4RSw4RUFBOEU7UUFDOUUsc0VBQXNFO0tBQ3ZFLENBQUM7SUFFRixLQUFLLE1BQU0sU0FBUyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3hDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNwQixDQUFDO0FBRUQsU0FBZ0IsTUFBTTtJQUNwQixNQUFNLFFBQVEsR0FBRztRQUNmLCtCQUErQjtRQUMvQixvQ0FBb0M7UUFDcEMsdUNBQXVDO1FBQ3ZDLG1DQUFtQztLQUNwQyxDQUFDO0lBRUYsTUFBTSxVQUFVLEdBQUcsbURBQW1EO1FBQ3BFLGlEQUFpRDtRQUNqRCxnQ0FBZ0MsQ0FBQztJQUVuQyxNQUFN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
|