stable-chromium
Version:
A library to install stable Chromium for testing via Gauge and Taiko
119 lines (92 loc) • 5.68 kB
Markdown
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
**stable-chromium** is an npm library for automated Chrome browser installation in testing environments. The package copies a pre-tested stable Chrome build from a network share and extracts it locally during `postinstall`.
**Purpose**: Provides a controlled, stable Chrome version for automated testing frameworks (Gauge/Taiko), avoiding issues from frequent Chrome auto-updates.
**Critical Context**: This is **not** a standard Chrome downloader. It copies a **specific pre-validated build** from a corporate network share (configured in `config.json`), ensuring all testing environments use an identical, manually tested Chrome version.
**Multi-Platform Support**: The library automatically detects the platform (Windows/Linux) and uses the appropriate archive format and extraction method.
## Architecture
### Core Components
- **index.js**: Main entry point with three functions:
- `downloadChrome()`: Downloads Chrome ZIP archive (via HTTP) or copies from network share
- `extractChrome()`: Unpacks downloaded ZIP archive and cleans up
- `installChrome()`: Orchestrates download → extract flow
- **config.json**: Configuration file with platform-specific paths:
- `platforms.win32`: Windows configuration
- `Chrome_URL`: Source UNC path to Chrome zip on network share (e.g., `\\server\share\chrome.zip`)
- `DOWNLOAD_PATH`: Temporary local path for downloaded zip
- `EXTRACT_PATH`: Target directory for extracted Chrome files
- `platforms.linux`: Linux configuration
- `Chrome_URL`: HTTP(S) URL to Chrome zip for download (e.g., Google Cloud Storage URL)
- `DOWNLOAD_PATH`: Temporary local path for downloaded zip
- `EXTRACT_PATH`: Target directory for extracted Chrome files
- **package.json**:
- `postinstall` hook automatically runs `index.js` after npm install
- `version` field indicates Chrome major version (e.g., "126.0.0")
### Workflow
1. User runs `npm install stable-chromium`
2. `postinstall` hook triggers → executes `index.js`
3. Script detects platform using `os.platform()` (win32/linux)
4. Loads platform-specific configuration from `config.json`
5. Downloads/copies Chrome ZIP archive:
- **Windows**: Copies from network share (UNC path)
- **Linux**: Downloads from HTTP(S) URL (Google Cloud Storage)
6. Extracts ZIP archive to `EXTRACT_PATH`
7. Deletes temporary ZIP file
### Key Implementation Details
- **Platform Detection**: Uses `os.platform()` to determine OS and select appropriate config
- **Dual Download Mode**:
- **HTTP(S) URLs**: Downloads via `axios` with progress tracking
- **Local/Network Paths**: Copies files using `fs.createReadStream`
- Automatically detects mode based on URL format (http/https prefix)
- **UNC Path Handling**: Normalizes Windows UNC paths (ensures `\\` prefix for network shares)
- **ZIP Extraction**: Uses `extract-zip` for all platforms (both Windows and Linux use .zip format)
- **Progress Tracking**: Shows download progress percentage for HTTP downloads
- **Error Handling**: Each stage (download/extract) logs errors and stops installation on failure
- **Automatic Cleanup**: Downloaded archive is deleted after successful extraction
- **Directory Creation**: Auto-creates directories if they don't exist (`ensureDirExists`)
## Development Commands
### Testing the Installation
```bash
node index.js
```
Runs the Chrome installation process manually (useful for testing changes).
### Publishing Updates
When updating Chrome version:
1. Update `package.json` version to match new Chrome major version
2. Update `Chrome_URL` in both `platforms.win32` and `platforms.linux` sections in `config.json`
3. Ensure both Windows and Linux builds are tested and validated
4. Update README.md with new version info (if documented)
### Dependencies
```bash
npm install
```
Installs required packages:
- `axios`: Handles HTTP(S) downloads for Linux platform
- `extract-zip`: Handles ZIP extraction for all platforms
- `tar`: Legacy dependency (can be removed)
## Important Notes
- **Multi-Platform Support**: Works on Windows (win32) and Linux platforms
- **Archive Format**: Both platforms use .zip format
- **Download Methods**:
- **Windows**: Copies from corporate network share (UNC path)
- **Linux**: Downloads from internet (Google Cloud Storage)
- **Network Requirements**:
- **Windows**: Requires access to corporate network share
- **Linux**: Requires internet connection
- **Manual Validation**: Chrome builds are manually tested by library author before distribution
- **Configuration Required**: Users must configure `config.json` paths/URLs for their environment
## Common Modification Scenarios
### Changing Chrome Source Location
Edit `config.json` → `platforms.win32.Chrome_URL` or `platforms.linux.Chrome_URL` with new network path.
### Changing Extraction Target
Edit `config.json` → `platforms.{platform}.EXTRACT_PATH` field (default: current directory `./`).
### Adding Support for Other Platforms
1. Add new platform entry in `config.json` under `platforms` (e.g., `darwin` for macOS)
2. Provide Chrome ZIP archive path for the new platform
3. Script will automatically detect and use the configuration (uses .zip extraction)
### Switching Between HTTP and Network Share
The `Chrome_URL` field supports both HTTP(S) URLs and local/network paths:
- **HTTP(S) URL**: `"https://example.com/chrome.zip"` → Downloads via axios
- **Network Path**: `"\\\\server\\share\\chrome.zip"` or `/mnt/share/chrome.zip` → Copies via fs
- Script automatically detects mode based on URL format