brave-real-launcher 1.2.50 → 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 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 for automation
14
- - ⬇️ **Auto-Install**: Automatically install Brave if not present (Windows/Linux/macOS)
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` | `false` | Enable stealth mode |
42
- | `autoInstall` | `boolean` | `false` | Auto-install Brave if not found |
43
- | `userAgent` | `string` | default | Custom user agent |
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
- ### `getBravePath()`
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
- Returns the path to the Brave Browser executable.
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
- # Install dependencies
79
- npm install
146
+ # Run comprehensive tests (10 tests)
147
+ node test.cjs
80
148
 
81
- # Build project
82
- npm run build
83
-
84
- # Run tests
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
- ## Development
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
+
File without changes
@@ -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;
@@ -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.win32 = exports.wsl = exports.linux = exports.darwin = exports.darwinFast = void 0;
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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