Очистка проекта и улучшение документации
- Удалены ненужные файлы: node_modules, package.json, package-lock.json, get_rutracker_cookie.js, __pycache__ - Создан скрипт автоматического развертывания deploy.sh - Создан файл .gitignore для исключения временных файлов - Создан env.example с примером конфигурации - Полностью переписана документация README.md с подробными инструкциями - Обновлен PROJECT_SUMMARY.md с инструкциями по развертыванию - Проект готов к развертыванию на новом компьютере
This commit is contained in:
parent
215b471a5e
commit
90ad38bca7
4308 changed files with 829 additions and 790415 deletions
133
.gitignore
vendored
133
.gitignore
vendored
|
|
@ -1,8 +1,12 @@
|
||||||
# Python
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
*$py.class
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
*.so
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
.Python
|
.Python
|
||||||
build/
|
build/
|
||||||
develop-eggs/
|
develop-eggs/
|
||||||
|
|
@ -16,32 +20,145 @@ parts/
|
||||||
sdist/
|
sdist/
|
||||||
var/
|
var/
|
||||||
wheels/
|
wheels/
|
||||||
|
pip-wheel-metadata/
|
||||||
|
share/python-wheels/
|
||||||
*.egg-info/
|
*.egg-info/
|
||||||
.installed.cfg
|
.installed.cfg
|
||||||
*.egg
|
*.egg
|
||||||
MANIFEST
|
MANIFEST
|
||||||
|
|
||||||
# Virtual environments
|
# PyInstaller
|
||||||
venv/
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
*.py,cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
|
db.sqlite3-journal
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# IPython
|
||||||
|
profile_default/
|
||||||
|
ipython_config.py
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# pipenv
|
||||||
|
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||||
|
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||||
|
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||||
|
# install all needed dependencies.
|
||||||
|
#Pipfile.lock
|
||||||
|
|
||||||
|
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
||||||
|
__pypackages__/
|
||||||
|
|
||||||
|
# Celery stuff
|
||||||
|
celerybeat-schedule
|
||||||
|
celerybeat.pid
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
env/
|
env/
|
||||||
|
venv/
|
||||||
ENV/
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
dmypy.json
|
||||||
|
|
||||||
|
# Pyre type checker
|
||||||
|
.pyre/
|
||||||
|
|
||||||
|
# Node.js
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
.dockerignore
|
||||||
|
|
||||||
# IDE
|
# IDE
|
||||||
.vscode/
|
.vscode/
|
||||||
.idea/
|
.idea/
|
||||||
*.swp
|
*.swp
|
||||||
*.swo
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
# OS
|
# OS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
.DS_Store?
|
||||||
|
._*
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
||||||
|
ehthumbs.db
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
# Project specific
|
# Project specific
|
||||||
cookies.txt
|
cookies.txt
|
||||||
*.log
|
*.log
|
||||||
*.tmp
|
logs/
|
||||||
|
temp/
|
||||||
|
tmp/
|
||||||
|
|
||||||
# Test files
|
# qBittorrent
|
||||||
advanced_torrent_test.py
|
.qbittorrent/
|
||||||
fix_qbittorrent_port.py
|
|
||||||
qbittorrent_diagnostics.py
|
|
||||||
|
|
@ -96,19 +96,35 @@
|
||||||
|
|
||||||
## 🔧 Установка и запуск
|
## 🔧 Установка и запуск
|
||||||
|
|
||||||
### Быстрый старт:
|
### Автоматическое развертывание (рекомендуется):
|
||||||
```bash
|
```bash
|
||||||
# 1. Клонирование репозитория
|
# 1. Клонирование репозитория
|
||||||
git clone <repository-url>
|
git clone <repository-url>
|
||||||
cd searchTorrentDownl
|
cd searchTorrentDownl
|
||||||
|
|
||||||
# 2. Создание сети Docker
|
# 2. Запуск скрипта развертывания
|
||||||
|
chmod +x deploy.sh
|
||||||
|
./deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ручное развертывание:
|
||||||
|
```bash
|
||||||
|
# 1. Клонирование репозитория
|
||||||
|
git clone <repository-url>
|
||||||
|
cd searchTorrentDownl
|
||||||
|
|
||||||
|
# 2. Установка зависимостей (см. README.md)
|
||||||
|
# 3. Создание сети Docker
|
||||||
docker network create torrentvideo_default
|
docker network create torrentvideo_default
|
||||||
|
|
||||||
# 3. Запуск всех сервисов
|
# 4. Настройка конфигурации
|
||||||
|
cp env.example .env
|
||||||
|
nano .env
|
||||||
|
|
||||||
|
# 5. Запуск всех сервисов
|
||||||
docker compose up -d --build
|
docker compose up -d --build
|
||||||
|
|
||||||
# 4. Проверка статуса
|
# 6. Проверка статуса
|
||||||
docker ps
|
docker ps
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
699
README.md
699
README.md
|
|
@ -1,394 +1,469 @@
|
||||||
# 📚 searchTorrentDownl - Полная документация
|
# 🎬 searchTorrentDownl
|
||||||
|
|
||||||
|
**Полнофункциональная система для поиска и загрузки фильмов через торренты с Telegram ботом**
|
||||||
|
|
||||||
|
[](https://www.docker.com/)
|
||||||
|
[](https://python.org/)
|
||||||
|
[](https://fastapi.tiangolo.com/)
|
||||||
|
[](https://telegram.org/)
|
||||||
|
|
||||||
## 🎯 Описание проекта
|
## 🎯 Описание проекта
|
||||||
|
|
||||||
**searchTorrentDownl** - это полнофункциональная система для поиска и загрузки фильмов через торренты. Приложение интегрирует поиск фильмов через TMDB API с поиском торрентов на популярных трекерах и автоматическим добавлением в qBittorrent клиент.
|
**searchTorrentDownl** - это современная система для поиска и загрузки фильмов, которая объединяет:
|
||||||
|
- 🌐 **Веб-интерфейс** с адаптивным дизайном
|
||||||
|
- 🤖 **Telegram бот** с полной функциональностью
|
||||||
|
- 🔍 **Поиск фильмов** через TMDB API
|
||||||
|
- 🎬 **Поиск торрентов** на популярных трекерах
|
||||||
|
- ⬇️ **Автоматическое добавление** в qBittorrent
|
||||||
|
- 🔔 **Уведомления** о завершении загрузки
|
||||||
|
|
||||||
### 🎬 Бизнес-логика:
|
### ✨ Основные возможности
|
||||||
1. **Поиск фильмов** - пользователь вводит название фильма
|
|
||||||
2. **Выбор фильма** - из результатов поиска выбирается нужный фильм
|
|
||||||
3. **Поиск торрентов** - система ищет доступные торренты на всех подключенных трекерах
|
|
||||||
4. **Фильтрация и ранжирование** - торренты сортируются по качеству, размеру и количеству сидов
|
|
||||||
5. **Автоматическое добавление** - выбранный торрент автоматически добавляется в qBittorrent
|
|
||||||
6. **Загрузка** - файлы загружаются в настроенную папку
|
|
||||||
|
|
||||||
### 🔧 Техническая составляющая:
|
- **🎬 Поиск фильмов** - интеллектуальный поиск с постерами и описаниями
|
||||||
- **Frontend**: HTML/CSS/JavaScript с адаптивным дизайном
|
- **🔍 Поиск торрентов** - на всех популярных трекерах (RuTracker, Kinozal, RuTor, NoNameClub)
|
||||||
- **Backend**: FastAPI с асинхронной обработкой запросов
|
- **📱 Telegram бот** - полная функциональность в мессенджере
|
||||||
- **Поиск фильмов**: TMDB API для получения метаданных
|
- **🌐 Веб-интерфейс** - удобный поиск и навигация
|
||||||
- **Поиск торрентов**: TorAPI для работы с трекерами (RuTracker, Kinozal, RuTor, NoNameClub)
|
- **⬇️ Автоматическая загрузка** - добавление торрентов в qBittorrent одним кликом
|
||||||
- **Клиент**: qBittorrent-nox на хосте для загрузки
|
- **🔔 Уведомления** - сообщения о завершении загрузки в Telegram
|
||||||
- **Контейнеризация**: Docker для изоляции сервисов
|
- **🐳 Docker** - полная контейнеризация для простого развертывания
|
||||||
- **Сеть**: Docker networks для связи между компонентами
|
|
||||||
|
|
||||||
## 🏗️ Архитектура системы
|
## 🏗️ Архитектура системы
|
||||||
|
|
||||||
### Компоненты системы:
|
```
|
||||||
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||||
|
│ Telegram Bot │ │ Web Interface │ │ qBittorrent │
|
||||||
|
│ (Docker) │ │ (Docker) │ │ (Host) │
|
||||||
|
└─────────┬───────┘ └─────────┬───────┘ └─────────┬───────┘
|
||||||
|
│ │ │
|
||||||
|
└──────────────────────┼──────────────────────┘
|
||||||
|
│
|
||||||
|
┌─────────────┴─────────────┐
|
||||||
|
│ FastAPI App │
|
||||||
|
│ (Movie Search API) │
|
||||||
|
└─────────────┬─────────────┘
|
||||||
|
│
|
||||||
|
┌─────────────┴─────────────┐
|
||||||
|
│ TMDB API │
|
||||||
|
│ (Movie Information) │
|
||||||
|
└─────────────┬─────────────┘
|
||||||
|
│
|
||||||
|
┌─────────────┴─────────────┐
|
||||||
|
│ TorAPI │
|
||||||
|
│ (Torrent Search) │
|
||||||
|
└───────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
1. **FastAPI приложение** (Docker контейнер) - основной веб-сервис
|
### 🔧 Компоненты системы
|
||||||
2. **TorAPI-Search** (Docker контейнер) - поиск торрентов по названию
|
|
||||||
3. **TorAPI-qBittorrent** (Docker контейнер) - получение magnet ссылок по ID
|
|
||||||
4. **qBittorrent-nox** (хостовая система) - клиент для загрузки торрентов
|
|
||||||
|
|
||||||
## 📋 Технические требования
|
1. **FastAPI приложение** (Docker) - основной веб-сервис и API
|
||||||
|
2. **Telegram Bot** (Docker) - бот для мессенджера
|
||||||
|
3. **TorAPI-Search** (Docker) - поиск торрентов по названию
|
||||||
|
4. **TorAPI-qBittorrent** (Docker) - получение magnet ссылок
|
||||||
|
5. **qBittorrent-nox** (Host) - клиент для загрузки торрентов
|
||||||
|
|
||||||
### Системные требования:
|
## 📋 Системные требования
|
||||||
- **ОС**: Linux (Ubuntu/Debian)
|
|
||||||
|
### Минимальные требования
|
||||||
|
- **ОС**: Linux (Ubuntu 20.04+, Debian 11+)
|
||||||
|
- **RAM**: 2GB
|
||||||
|
- **Диск**: 10GB свободного места
|
||||||
|
- **CPU**: 2 ядра
|
||||||
|
|
||||||
|
### Необходимое ПО
|
||||||
- **Docker**: 20.10+
|
- **Docker**: 20.10+
|
||||||
- **Docker Compose**: 2.0+
|
- **Docker Compose**: 2.0+
|
||||||
- **Python**: 3.12+
|
- **qBittorrent-nox**: 4.6.7+
|
||||||
- **RAM**: минимум 2GB
|
|
||||||
- **Диск**: минимум 10GB свободного места
|
|
||||||
|
|
||||||
### Зависимости:
|
## 🚀 Быстрый старт
|
||||||
- FastAPI 0.115.0
|
|
||||||
- Uvicorn 0.30.6
|
|
||||||
- httpx 0.27.2
|
|
||||||
- BeautifulSoup4 4.12.3
|
|
||||||
- qBittorrent-nox 4.6.7+
|
|
||||||
|
|
||||||
## 🚀 Установка и настройка
|
### 1️⃣ Автоматическое развертывание (рекомендуется)
|
||||||
|
|
||||||
### 1. Установка qBittorrent на хост
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Установка qBittorrent-nox
|
# Клонируйте репозиторий
|
||||||
sudo apt update
|
git clone <repository-url>
|
||||||
sudo apt install qbittorrent-nox
|
cd searchTorrentDownl
|
||||||
|
|
||||||
# Создание пользователя для qBittorrent
|
# Запустите скрипт развертывания
|
||||||
|
chmod +x deploy.sh
|
||||||
|
./deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрипт автоматически:
|
||||||
|
- Установит все зависимости
|
||||||
|
- Настроит qBittorrent
|
||||||
|
- Запустит все сервисы
|
||||||
|
- Покажет статус системы
|
||||||
|
|
||||||
|
### 2️⃣ Ручное развертывание
|
||||||
|
|
||||||
|
#### Шаг 1: Установка зависимостей
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Обновление системы
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
|
||||||
|
# Установка Docker
|
||||||
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||||
|
sudo sh get-docker.sh
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
|
||||||
|
# Установка Docker Compose
|
||||||
|
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||||
|
sudo chmod +x /usr/local/bin/docker-compose
|
||||||
|
|
||||||
|
# Установка qBittorrent
|
||||||
|
sudo apt install -y qbittorrent-nox
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Шаг 2: Настройка qBittorrent
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание пользователя
|
||||||
sudo useradd -r -s /bin/false qbittorrent
|
sudo useradd -r -s /bin/false qbittorrent
|
||||||
sudo mkdir -p /home/qbittorrent/Downloads
|
|
||||||
sudo chown -R qbittorrent:qbittorrent /home/qbittorrent
|
|
||||||
|
|
||||||
# Создание systemd сервиса
|
# Создание systemd сервиса
|
||||||
sudo tee /etc/systemd/system/qbittorrent.service > /dev/null <<EOF
|
sudo tee /etc/systemd/system/qbittorrent.service > /dev/null <<EOF
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=qBittorrent Command Line Client
|
Description=qBittorrent-nox
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=forking
|
Type=simple
|
||||||
User=qbittorrent
|
User=qbittorrent
|
||||||
Group=qbittorrent
|
Group=qbittorrent
|
||||||
UMask=007
|
ExecStart=/usr/bin/qbittorrent-nox --webui-port=8080
|
||||||
ExecStart=/usr/bin/qbittorrent-nox -d --webui-port=8080
|
Restart=always
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
TimeoutStopSec=300
|
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Включение и запуск сервиса
|
# Запуск сервиса
|
||||||
|
sudo systemctl daemon-reload
|
||||||
sudo systemctl enable qbittorrent
|
sudo systemctl enable qbittorrent
|
||||||
sudo systemctl start qbittorrent
|
sudo systemctl start qbittorrent
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Настройка qBittorrent
|
#### Шаг 3: Настройка проекта
|
||||||
|
|
||||||
1. Откройте браузер: http://localhost:8080
|
|
||||||
2. Войдите с логином `admin` и паролем `vrubel07`
|
|
||||||
3. Настройте параметры:
|
|
||||||
- **Connection**: порт 6881, включить UPnP/NAT-PMP
|
|
||||||
- **BitTorrent**: включить DHT, PeX, Local Peer Discovery
|
|
||||||
- **Downloads**: папка `/home/qbittorrent/Downloads` (настроена автоматически)
|
|
||||||
|
|
||||||
**Важно**: Все загруженные файлы сохраняются в `/home/qbittorrent/Downloads/`
|
|
||||||
|
|
||||||
### 3. Запуск Docker контейнеров
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Клонирование репозитория
|
# Создание Docker сети
|
||||||
git clone <repository-url>
|
|
||||||
cd searchTorrentDownl
|
|
||||||
|
|
||||||
# Создание сети для TorAPI
|
|
||||||
docker network create torrentvideo_default
|
docker network create torrentvideo_default
|
||||||
|
|
||||||
|
# Копирование конфигурации
|
||||||
|
cp env.example .env
|
||||||
|
|
||||||
|
# Редактирование конфигурации
|
||||||
|
nano .env
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Шаг 4: Запуск сервисов
|
||||||
|
|
||||||
|
```bash
|
||||||
# Запуск всех сервисов
|
# Запуск всех сервисов
|
||||||
docker compose up -d --build
|
docker compose up -d --build
|
||||||
|
|
||||||
|
# Проверка статуса
|
||||||
|
docker ps
|
||||||
```
|
```
|
||||||
|
|
||||||
## ⚙️ Конфигурация
|
## ⚙️ Конфигурация
|
||||||
|
|
||||||
### Переменные окружения
|
### 🔑 Получение API ключей
|
||||||
|
|
||||||
|
#### TMDB API Key
|
||||||
|
1. Зарегистрируйтесь на [themoviedb.org](https://www.themoviedb.org/)
|
||||||
|
2. Перейдите в [Settings > API](https://www.themoviedb.org/settings/api)
|
||||||
|
3. Создайте новый API ключ
|
||||||
|
4. Скопируйте ключ в файл `.env`
|
||||||
|
|
||||||
|
#### Telegram Bot Token
|
||||||
|
1. Найдите [@BotFather](https://t.me/BotFather) в Telegram
|
||||||
|
2. Отправьте команду `/newbot`
|
||||||
|
3. Следуйте инструкциям для создания бота
|
||||||
|
4. Скопируйте токен в файл `.env`
|
||||||
|
|
||||||
|
### 📝 Файл конфигурации (.env)
|
||||||
|
|
||||||
#### Основное приложение (movie-search):
|
|
||||||
```bash
|
```bash
|
||||||
TMDB_API_KEY=6d58225585fb77af5945a964de41849f
|
# TMDB API Key
|
||||||
TORAPI_URL=http://localhost:8088
|
TMDB_API_KEY=your_tmdb_api_key_here
|
||||||
TORRENT_SEARCH_URL=http://localhost:8443
|
|
||||||
TORRENT_ADD_URL=http://localhost:8444
|
# Telegram Bot Token
|
||||||
QBITTORRENT_HOST=localhost
|
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
|
||||||
QBITTORRENT_PORT=8080
|
|
||||||
|
# qBittorrent настройки
|
||||||
QBITTORRENT_USERNAME=admin
|
QBITTORRENT_USERNAME=admin
|
||||||
QBITTORRENT_PASSWORD=vrubel07
|
QBITTORRENT_PASSWORD=admin
|
||||||
|
QBITTORRENT_HOST=host.docker.internal
|
||||||
|
QBITTORRENT_PORT=8080
|
||||||
|
|
||||||
|
# TorAPI настройки
|
||||||
|
TORRENT_SEARCH_URL=http://host.docker.internal:8443
|
||||||
|
TORRENT_ADD_URL=http://host.docker.internal:8088
|
||||||
```
|
```
|
||||||
|
|
||||||
#### TorAPI-qBittorrent:
|
## 🌐 Использование
|
||||||
```bash
|
|
||||||
PROXY_ADDRESS=172.17.0.1
|
|
||||||
PROXY_PORT=8080
|
|
||||||
USERNAME=admin
|
|
||||||
PASSWORD=vrubel07
|
|
||||||
```
|
|
||||||
|
|
||||||
### Docker Compose конфигурация
|
### Веб-интерфейс
|
||||||
|
1. Откройте http://localhost:8089
|
||||||
|
2. Введите название фильма
|
||||||
|
3. Выберите фильм из результатов
|
||||||
|
4. Выберите торрент для скачивания
|
||||||
|
5. Торрент автоматически добавится в qBittorrent
|
||||||
|
|
||||||
```yaml
|
### Telegram Bot
|
||||||
version: '3.8'
|
1. Найдите вашего бота в Telegram
|
||||||
services:
|
2. Отправьте команду `/start` или `/find`
|
||||||
movie-search:
|
3. Введите название фильма
|
||||||
build: .
|
4. Выберите фильм из списка
|
||||||
ports:
|
5. Нажмите "Найти торренты"
|
||||||
- "8089:8000"
|
6. Выберите нужный торрент
|
||||||
environment:
|
7. Получите уведомление о завершении загрузки
|
||||||
- TMDB_API_KEY=6d58225585fb77af5945a964de41849f
|
|
||||||
- TORAPI_URL=http://localhost:8088
|
|
||||||
- TORRENT_SEARCH_URL=http://localhost:8443
|
|
||||||
- TORRENT_ADD_URL=http://localhost:8444
|
|
||||||
- QBITTORRENT_HOST=localhost
|
|
||||||
- QBITTORRENT_PORT=8080
|
|
||||||
- QBITTORRENT_USERNAME=admin
|
|
||||||
- QBITTORRENT_PASSWORD=vrubel07
|
|
||||||
networks:
|
|
||||||
- torrentvideo_default
|
|
||||||
|
|
||||||
TorAPI-Search:
|
### qBittorrent
|
||||||
image: lifailon/torapi:latest
|
- **Веб-интерфейс**: http://localhost:8080
|
||||||
ports:
|
- **Логин по умолчанию**: admin / admin
|
||||||
- "8443:8443"
|
- **Настройка папок**: Settings > Downloads
|
||||||
networks:
|
|
||||||
- torrentvideo_default
|
|
||||||
|
|
||||||
TorAPI-qBittorrent:
|
|
||||||
image: lifailon/torapi:latest
|
|
||||||
ports:
|
|
||||||
- "8444:8443"
|
|
||||||
environment:
|
|
||||||
- PROXY_ADDRESS=172.17.0.1
|
|
||||||
- PROXY_PORT=8080
|
|
||||||
- USERNAME=admin
|
|
||||||
- PASSWORD=vrubel07
|
|
||||||
networks:
|
|
||||||
- torrentvideo_default
|
|
||||||
|
|
||||||
networks:
|
|
||||||
torrentvideo_default:
|
|
||||||
external: true
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔧 API Endpoints
|
|
||||||
|
|
||||||
### Основное приложение (порт 8089)
|
|
||||||
|
|
||||||
#### Веб-интерфейс:
|
|
||||||
- `GET /` - главная страница поиска
|
|
||||||
- `POST /search` - поиск фильмов
|
|
||||||
- `GET /torrents/{movie_title}` - страница с торрентами
|
|
||||||
|
|
||||||
#### API:
|
|
||||||
- `GET /api/search/{movie_title}` - поиск фильмов через TMDB
|
|
||||||
- `GET /api/torrents/{movie_title}` - поиск торрентов
|
|
||||||
- `GET /api/torrent/id/{torrent_id}` - получение информации о торренте по ID
|
|
||||||
- `POST /api/add-torrent` - добавление торрента в qBittorrent
|
|
||||||
|
|
||||||
### TorAPI-Search (порт 8443)
|
|
||||||
- `GET /api/search/title/{provider}?q={query}` - поиск торрентов по названию
|
|
||||||
- `GET /api/provider/list` - список доступных провайдеров
|
|
||||||
|
|
||||||
### TorAPI-qBittorrent (порт 8444)
|
|
||||||
- `GET /api/search/id/{provider}?id={torrent_id}` - получение magnet ссылки по ID
|
|
||||||
|
|
||||||
## 🎬 Поддерживаемые трекеры
|
|
||||||
|
|
||||||
- **RuTracker** - rutracker.org, rutracker.net, rutracker.nl
|
|
||||||
- **Kinozal** - kinozal.tv, kinozal.me, kinozal.guru
|
|
||||||
- **RuTor** - rutor.info, rutor.is
|
|
||||||
- **NoNameClub** - nnmclub.to
|
|
||||||
|
|
||||||
## 🔄 Алгоритм работы
|
|
||||||
|
|
||||||
### 1. Поиск фильма:
|
|
||||||
1. Пользователь вводит название фильма в веб-форму
|
|
||||||
2. FastAPI приложение обращается к TMDB API с запросом
|
|
||||||
3. Получает список фильмов с метаданными (постер, описание, рейтинг, год)
|
|
||||||
4. Отображает результаты в удобном интерфейсе
|
|
||||||
|
|
||||||
### 2. Поиск торрентов:
|
|
||||||
1. Пользователь выбирает фильм и нажимает "Найти торренты"
|
|
||||||
2. Приложение обращается к TorAPI-Search (порт 8443)
|
|
||||||
3. TorAPI ищет торренты на всех подключенных трекерах:
|
|
||||||
- RuTracker (rutracker.org, rutracker.net, rutracker.nl)
|
|
||||||
- Kinozal (kinozal.tv, kinozal.me, kinozal.guru)
|
|
||||||
- RuTor (rutor.info, rutor.is)
|
|
||||||
- NoNameClub (nnmclub.to)
|
|
||||||
4. Результаты фильтруются и ранжируются по релевантности, качеству и количеству сидов
|
|
||||||
|
|
||||||
### 3. Добавление торрента:
|
|
||||||
1. Пользователь нажимает "Добавить в клиент" на выбранном торренте
|
|
||||||
2. Приложение получает ID торрента и обращается к TorAPI-qBittorrent (порт 8444)
|
|
||||||
3. TorAPI-qBittorrent получает magnet ссылку по ID торрента
|
|
||||||
4. Приложение генерирует "чистую" magnet ссылку с публичными трекерами
|
|
||||||
5. Через qBittorrent Web API торрент добавляется в клиент
|
|
||||||
6. qBittorrent начинает загрузку в папку `/home/qbittorrent/Downloads`
|
|
||||||
|
|
||||||
### 4. Мониторинг загрузки:
|
|
||||||
1. Пользователь может отслеживать прогресс через qBittorrent веб-интерфейс
|
|
||||||
2. Файлы автоматически сохраняются в настроенную папку
|
|
||||||
3. После завершения загрузки файлы готовы к просмотру
|
|
||||||
|
|
||||||
## 🛠️ Устранение неполадок
|
|
||||||
|
|
||||||
### Проблема: qBittorrent не может добавить торренты
|
|
||||||
**Решение:**
|
|
||||||
1. Проверьте настройки qBittorrent (DHT, PeX, LPD включены)
|
|
||||||
2. Убедитесь, что порт 6881 открыт
|
|
||||||
3. Проверьте подключение к интернету
|
|
||||||
|
|
||||||
### Проблема: TorAPI не может подключиться к трекерам
|
|
||||||
**Решение:**
|
|
||||||
1. Проверьте, что трекеры доступны
|
|
||||||
2. Убедитесь, что нет блокировки на уровне роутера/провайдера
|
|
||||||
3. Проверьте логи контейнеров: `docker logs TorAPI-Search`
|
|
||||||
|
|
||||||
### Проблема: Приложение не может подключиться к qBittorrent
|
|
||||||
**Решение:**
|
|
||||||
1. Проверьте, что qBittorrent запущен: `sudo systemctl status qbittorrent`
|
|
||||||
2. Проверьте доступность: `curl http://localhost:8080/api/v2/app/version`
|
|
||||||
3. Проверьте учетные данные в переменных окружения
|
|
||||||
|
|
||||||
## 📊 Мониторинг
|
|
||||||
|
|
||||||
### Проверка статуса сервисов:
|
|
||||||
```bash
|
|
||||||
# qBittorrent
|
|
||||||
sudo systemctl status qbittorrent
|
|
||||||
|
|
||||||
# Docker контейнеры
|
|
||||||
docker ps
|
|
||||||
|
|
||||||
# Логи приложения
|
|
||||||
docker logs movie-search --tail 50
|
|
||||||
|
|
||||||
# Логи TorAPI
|
|
||||||
docker logs TorAPI-Search --tail 50
|
|
||||||
docker logs TorAPI-qBittorrent --tail 50
|
|
||||||
```
|
|
||||||
|
|
||||||
### Проверка торрентов в qBittorrent:
|
|
||||||
```bash
|
|
||||||
curl -s -X POST "http://localhost:8080/api/v2/auth/login" -d "username=admin&password=vrubel07" -c cookies.txt
|
|
||||||
curl -s -b cookies.txt "http://localhost:8080/api/v2/torrents/info" | jq '.[] | {name: .name, state: .state, progress: .progress}'
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔒 Безопасность
|
|
||||||
|
|
||||||
### Рекомендации:
|
|
||||||
1. Измените пароли по умолчанию
|
|
||||||
2. Настройте файрвол для ограничения доступа
|
|
||||||
3. Используйте HTTPS в продакшене
|
|
||||||
4. Регулярно обновляйте зависимости
|
|
||||||
|
|
||||||
### Настройка файрвола:
|
|
||||||
```bash
|
|
||||||
# Разрешить доступ к веб-интерфейсам
|
|
||||||
sudo ufw allow 8080/tcp # qBittorrent
|
|
||||||
sudo ufw allow 8089/tcp # Приложение
|
|
||||||
sudo ufw allow 6881/tcp # BitTorrent
|
|
||||||
sudo ufw allow 6881/udp # BitTorrent
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📈 Производительность
|
|
||||||
|
|
||||||
### Оптимизация:
|
|
||||||
1. Настройте лимиты загрузки в qBittorrent
|
|
||||||
2. Используйте SSD для папки загрузок
|
|
||||||
3. Настройте кэширование в браузере
|
|
||||||
4. Мониторьте использование ресурсов
|
|
||||||
|
|
||||||
### Рекомендуемые настройки qBittorrent:
|
|
||||||
- Максимальная скорость загрузки: 80% от пропускной способности
|
|
||||||
- Максимальная скорость отдачи: 20% от пропускной способности
|
|
||||||
- Максимальное количество активных торрентов: 10-20
|
|
||||||
- Максимальное количество подключений: 200-500
|
|
||||||
|
|
||||||
## 🆘 Поддержка
|
|
||||||
|
|
||||||
При возникновении проблем:
|
|
||||||
1. Проверьте логи всех сервисов
|
|
||||||
2. Убедитесь, что все порты доступны
|
|
||||||
3. Проверьте настройки сети и файрвола
|
|
||||||
4. Создайте issue в репозитории проекта
|
|
||||||
|
|
||||||
## 📁 Структура проекта
|
## 📁 Структура проекта
|
||||||
|
|
||||||
```
|
```
|
||||||
searchTorrentDownl/
|
searchTorrentDownl/
|
||||||
├── app.py # Основное приложение
|
├── app.py # Основное FastAPI приложение
|
||||||
├── telegram_bot.py # Telegram бот
|
├── telegram_bot.py # Telegram бот
|
||||||
├── run_telegram_bot.py # Скрипт запуска бота
|
├── run_telegram_bot.py # Скрипт запуска бота
|
||||||
├── test_telegram_bot.py # Тестирование бота
|
├── deploy.sh # Скрипт автоматического развертывания
|
||||||
|
├── start_all.sh # Скрипт запуска (локально)
|
||||||
├── requirements.txt # Python зависимости
|
├── requirements.txt # Python зависимости
|
||||||
|
├── env.example # Пример конфигурации
|
||||||
├── Dockerfile # Docker образ основного приложения
|
├── Dockerfile # Docker образ основного приложения
|
||||||
├── Dockerfile.telegram # Docker образ Telegram бота
|
├── Dockerfile.telegram # Docker образ Telegram бота
|
||||||
├── docker-compose.yml # Docker Compose конфигурация
|
├── docker-compose.yml # Docker Compose конфигурация
|
||||||
├── templates/ # HTML шаблоны
|
├── templates/ # HTML шаблоны
|
||||||
│ ├── index.html # Главная страница
|
│ ├── index.html # Главная страница
|
||||||
│ ├── results.html # Страница результатов поиска фильмов
|
│ ├── results.html # Результаты поиска фильмов
|
||||||
│ ├── torrents.html # Страница результатов поиска торрентов
|
│ ├── torrents.html # Результаты поиска торрентов
|
||||||
│ └── error.html # Страница ошибок
|
│ └── error.html # Страница ошибок
|
||||||
├── README.md # Основная документация
|
├── README.md # Основная документация
|
||||||
└── TELEGRAM_BOT_README.md # Документация Telegram бота
|
├── TELEGRAM_BOT_README.md # Документация Telegram бота
|
||||||
|
└── PROJECT_SUMMARY.md # Сводка проекта
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🎯 Возможности
|
## 🔧 Управление сервисами
|
||||||
|
|
||||||
- 🔍 **Поиск фильмов** по названию через TMDB API с полными метаданными
|
### Основные команды
|
||||||
- 🎬 **Информация о фильмах** - постер, описание, рейтинг, год выпуска, актеры
|
|
||||||
- 🔗 **Поиск торрентов** на 4 популярных трекерах одновременно
|
|
||||||
- 📊 **Детальная информация** о торрентах - размер, разрешение, качество, количество сидов
|
|
||||||
- 🚀 **Автоматическое добавление** торрентов в qBittorrent одним кликом
|
|
||||||
- 🌐 **Веб-интерфейс** с удобным поиском и навигацией
|
|
||||||
- 📱 **Адаптивный дизайн** для работы на любых устройствах
|
|
||||||
- 🤖 **Telegram Bot** - полная функциональность в мессенджере
|
|
||||||
- 🐳 **Контейнеризация** для простого развертывания
|
|
||||||
- 🔌 **REST API** для интеграции с другими системами
|
|
||||||
- ⚡ **Асинхронная обработка** для высокой производительности
|
|
||||||
- 🛡️ **Безопасность** - генерация чистых magnet ссылок с публичными трекерами
|
|
||||||
|
|
||||||
## ✅ Статус проекта
|
|
||||||
|
|
||||||
**🟢 ПРОЕКТ ПОЛНОСТЬЮ ФУНКЦИОНАЛЕН**
|
|
||||||
|
|
||||||
- ✅ Поиск фильмов работает
|
|
||||||
- ✅ Поиск торрентов работает
|
|
||||||
- ✅ Добавление торрентов в qBittorrent работает
|
|
||||||
- ✅ Загрузка файлов работает
|
|
||||||
- ✅ Веб-интерфейс работает
|
|
||||||
- ✅ API работает
|
|
||||||
- ✅ Telegram Bot работает
|
|
||||||
- ✅ Все сервисы интегрированы
|
|
||||||
|
|
||||||
## 🚀 Быстрый старт
|
|
||||||
|
|
||||||
### Запуск с помощью Docker Compose
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose up --build -d
|
# Запуск всех сервисов
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# Остановка всех сервисов
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
# Перезапуск сервисов
|
||||||
|
docker compose restart
|
||||||
|
|
||||||
|
# Просмотр логов
|
||||||
|
docker compose logs -f
|
||||||
|
|
||||||
|
# Просмотр статуса
|
||||||
|
docker ps
|
||||||
```
|
```
|
||||||
|
|
||||||
### Доступ к приложению
|
### Управление отдельными сервисами
|
||||||
|
|
||||||
- **Веб-интерфейс**: http://localhost:8089
|
```bash
|
||||||
- **qBittorrent**: http://localhost:8080 (admin/vrubel07)
|
# Запуск только веб-приложения
|
||||||
- **API**: http://localhost:8089/api/search/{название_фильма}
|
docker compose up -d movie-search
|
||||||
- **Telegram Bot**: @your_bot_username (команда /start)
|
|
||||||
|
# Запуск только Telegram бота
|
||||||
|
docker compose up -d telegram-bot
|
||||||
|
|
||||||
|
# Перезапуск TorAPI
|
||||||
|
docker compose restart torapi-search torapi-qbittorrent
|
||||||
|
```
|
||||||
|
|
||||||
|
### Управление qBittorrent
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Запуск
|
||||||
|
sudo systemctl start qbittorrent
|
||||||
|
|
||||||
|
# Остановка
|
||||||
|
sudo systemctl stop qbittorrent
|
||||||
|
|
||||||
|
# Статус
|
||||||
|
sudo systemctl status qbittorrent
|
||||||
|
|
||||||
|
# Логи
|
||||||
|
sudo journalctl -u qbittorrent -f
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🐛 Устранение неполадок
|
||||||
|
|
||||||
|
### Проблемы с Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка статуса контейнеров
|
||||||
|
docker ps -a
|
||||||
|
|
||||||
|
# Просмотр логов
|
||||||
|
docker logs <container_name>
|
||||||
|
|
||||||
|
# Пересборка контейнеров
|
||||||
|
docker compose up -d --build --force-recreate
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с qBittorrent
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка статуса
|
||||||
|
sudo systemctl status qbittorrent
|
||||||
|
|
||||||
|
# Перезапуск
|
||||||
|
sudo systemctl restart qbittorrent
|
||||||
|
|
||||||
|
# Проверка портов
|
||||||
|
netstat -tlnp | grep 8080
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с сетью
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка Docker сетей
|
||||||
|
docker network ls
|
||||||
|
|
||||||
|
# Создание сети заново
|
||||||
|
docker network rm torrentvideo_default
|
||||||
|
docker network create torrentvideo_default
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с API
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка TMDB API
|
||||||
|
curl "https://api.themoviedb.org/3/movie/550?api_key=YOUR_API_KEY"
|
||||||
|
|
||||||
|
# Проверка Telegram Bot
|
||||||
|
curl "https://api.telegram.org/botYOUR_BOT_TOKEN/getMe"
|
||||||
|
|
||||||
|
# Проверка TorAPI
|
||||||
|
curl "http://localhost:8443/api/provider/list"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Мониторинг
|
||||||
|
|
||||||
|
### Логи сервисов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Все сервисы
|
||||||
|
docker compose logs -f
|
||||||
|
|
||||||
|
# Конкретный сервис
|
||||||
|
docker logs -f movie-search
|
||||||
|
docker logs -f telegram-bot
|
||||||
|
docker logs -f TorAPI-Search
|
||||||
|
docker logs -f TorAPI-qBittorrent
|
||||||
|
```
|
||||||
|
|
||||||
|
### Мониторинг ресурсов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Использование ресурсов контейнерами
|
||||||
|
docker stats
|
||||||
|
|
||||||
|
# Использование диска
|
||||||
|
df -h
|
||||||
|
|
||||||
|
# Использование памяти
|
||||||
|
free -h
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔒 Безопасность
|
||||||
|
|
||||||
|
### Рекомендации
|
||||||
|
|
||||||
|
1. **Измените пароли по умолчанию**
|
||||||
|
```bash
|
||||||
|
# В файле .env
|
||||||
|
QBITTORRENT_PASSWORD=your_secure_password
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Настройте файрвол**
|
||||||
|
```bash
|
||||||
|
sudo ufw allow 8080 # qBittorrent
|
||||||
|
sudo ufw allow 8089 # Web interface
|
||||||
|
sudo ufw enable
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Используйте HTTPS в продакшене**
|
||||||
|
- Настройте reverse proxy (nginx)
|
||||||
|
- Получите SSL сертификат
|
||||||
|
|
||||||
|
4. **Регулярно обновляйте зависимости**
|
||||||
|
```bash
|
||||||
|
docker compose pull
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Развертывание в продакшене
|
||||||
|
|
||||||
|
### Настройка reverse proxy (nginx)
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name your-domain.com;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://localhost:8089;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Использование Docker Swarm
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Инициализация Swarm
|
||||||
|
docker swarm init
|
||||||
|
|
||||||
|
# Развертывание стека
|
||||||
|
docker stack deploy -c docker-compose.yml searchtorrentdownl
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🤝 Вклад в проект
|
||||||
|
|
||||||
|
1. Форкните репозиторий
|
||||||
|
2. Создайте ветку для новой функции
|
||||||
|
3. Внесите изменения
|
||||||
|
4. Создайте Pull Request
|
||||||
|
|
||||||
|
## 📄 Лицензия
|
||||||
|
|
||||||
|
Этот проект распространяется под лицензией MIT. См. файл [LICENSE](LICENSE) для подробностей.
|
||||||
|
|
||||||
|
## 🆘 Поддержка
|
||||||
|
|
||||||
|
При возникновении проблем:
|
||||||
|
|
||||||
|
1. Проверьте [раздел устранения неполадок](#-устранение-неполадок)
|
||||||
|
2. Изучите логи сервисов
|
||||||
|
3. Создайте issue в репозитории
|
||||||
|
4. Опишите проблему и приложите логи
|
||||||
|
|
||||||
|
## 📈 Планы развития
|
||||||
|
|
||||||
|
- [ ] Поддержка дополнительных трекеров
|
||||||
|
- [ ] Веб-интерфейс для управления ботом
|
||||||
|
- [ ] Система уведомлений по email
|
||||||
|
- [ ] API для интеграции с другими приложениями
|
||||||
|
- [ ] Поддержка сериалов и аниме
|
||||||
|
- [ ] Мобильное приложение
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Версия документации**: 1.0
|
**Создано с ❤️ для удобного поиска и загрузки фильмов**
|
||||||
**Дата обновления**: $(date)
|
|
||||||
**Автор**: AI Assistant
|
|
||||||
Binary file not shown.
263
deploy.sh
Executable file
263
deploy.sh
Executable file
|
|
@ -0,0 +1,263 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 🚀 Скрипт развертывания searchTorrentDownl на новом компьютере
|
||||||
|
# Автор: AI Assistant
|
||||||
|
# Версия: 1.0
|
||||||
|
|
||||||
|
set -e # Остановка при ошибке
|
||||||
|
|
||||||
|
echo "🎬 searchTorrentDownl - Скрипт развертывания"
|
||||||
|
echo "=============================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Цвета для вывода
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Функция для вывода сообщений
|
||||||
|
log_info() {
|
||||||
|
echo -e "${BLUE}ℹ️ $1${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_success() {
|
||||||
|
echo -e "${GREEN}✅ $1${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warning() {
|
||||||
|
echo -e "${YELLOW}⚠️ $1${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
echo -e "${RED}❌ $1${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Проверка операционной системы
|
||||||
|
check_os() {
|
||||||
|
log_info "Проверка операционной системы..."
|
||||||
|
|
||||||
|
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||||||
|
log_success "Linux обнаружен"
|
||||||
|
else
|
||||||
|
log_error "Этот скрипт предназначен для Linux. Обнаружена ОС: $OSTYPE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Проверка прав root
|
||||||
|
check_root() {
|
||||||
|
if [[ $EUID -eq 0 ]]; then
|
||||||
|
log_warning "Скрипт запущен от root. Рекомендуется запускать от обычного пользователя."
|
||||||
|
read -p "Продолжить? (y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Обновление системы
|
||||||
|
update_system() {
|
||||||
|
log_info "Обновление системы..."
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
log_success "Система обновлена"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Установка Docker
|
||||||
|
install_docker() {
|
||||||
|
log_info "Проверка Docker..."
|
||||||
|
|
||||||
|
if command -v docker &> /dev/null; then
|
||||||
|
log_success "Docker уже установлен"
|
||||||
|
else
|
||||||
|
log_info "Установка Docker..."
|
||||||
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||||
|
sudo sh get-docker.sh
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
rm get-docker.sh
|
||||||
|
log_success "Docker установлен"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка Docker Compose
|
||||||
|
if command -v docker-compose &> /dev/null; then
|
||||||
|
log_success "Docker Compose уже установлен"
|
||||||
|
else
|
||||||
|
log_info "Установка Docker Compose..."
|
||||||
|
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||||
|
sudo chmod +x /usr/local/bin/docker-compose
|
||||||
|
log_success "Docker Compose установлен"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Установка qBittorrent
|
||||||
|
install_qbittorrent() {
|
||||||
|
log_info "Проверка qBittorrent..."
|
||||||
|
|
||||||
|
if command -v qbittorrent-nox &> /dev/null; then
|
||||||
|
log_success "qBittorrent уже установлен"
|
||||||
|
else
|
||||||
|
log_info "Установка qBittorrent-nox..."
|
||||||
|
sudo apt install -y qbittorrent-nox
|
||||||
|
log_success "qBittorrent установлен"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Настройка qBittorrent
|
||||||
|
setup_qbittorrent() {
|
||||||
|
log_info "Настройка qBittorrent..."
|
||||||
|
|
||||||
|
# Создание пользователя qbittorrent если не существует
|
||||||
|
if ! id "qbittorrent" &>/dev/null; then
|
||||||
|
sudo useradd -r -s /bin/false qbittorrent
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Создание директории для конфигурации
|
||||||
|
sudo mkdir -p /home/qbittorrent/.config/qBittorrent
|
||||||
|
sudo chown -R qbittorrent:qbittorrent /home/qbittorrent
|
||||||
|
|
||||||
|
# Создание systemd сервиса
|
||||||
|
sudo tee /etc/systemd/system/qbittorrent.service > /dev/null <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=qBittorrent-nox
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=qbittorrent
|
||||||
|
Group=qbittorrent
|
||||||
|
ExecStart=/usr/bin/qbittorrent-nox --webui-port=8080
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Перезагрузка systemd и запуск сервиса
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable qbittorrent
|
||||||
|
sudo systemctl start qbittorrent
|
||||||
|
|
||||||
|
log_success "qBittorrent настроен и запущен"
|
||||||
|
log_info "Веб-интерфейс: http://localhost:8080"
|
||||||
|
log_info "Логин по умолчанию: admin / admin"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Создание Docker сети
|
||||||
|
create_docker_network() {
|
||||||
|
log_info "Создание Docker сети..."
|
||||||
|
|
||||||
|
if docker network ls | grep -q "torrentvideo_default"; then
|
||||||
|
log_success "Сеть torrentvideo_default уже существует"
|
||||||
|
else
|
||||||
|
docker network create torrentvideo_default
|
||||||
|
log_success "Сеть torrentvideo_default создана"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Клонирование репозитория
|
||||||
|
clone_repository() {
|
||||||
|
if [ -f "app.py" ]; then
|
||||||
|
log_success "Проект уже находится в текущей директории"
|
||||||
|
else
|
||||||
|
log_error "Проект не найден в текущей директории"
|
||||||
|
log_info "Пожалуйста, клонируйте репозиторий:"
|
||||||
|
log_info "git clone <repository-url>"
|
||||||
|
log_info "cd searchTorrentDownl"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Настройка переменных окружения
|
||||||
|
setup_environment() {
|
||||||
|
log_info "Настройка переменных окружения..."
|
||||||
|
|
||||||
|
if [ ! -f ".env" ]; then
|
||||||
|
log_info "Создание файла .env..."
|
||||||
|
cat > .env <<EOF
|
||||||
|
# TMDB API Key (получите на https://www.themoviedb.org/settings/api)
|
||||||
|
TMDB_API_KEY=your_tmdb_api_key_here
|
||||||
|
|
||||||
|
# Telegram Bot Token (получите у @BotFather)
|
||||||
|
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
|
||||||
|
|
||||||
|
# qBittorrent настройки
|
||||||
|
QBITTORRENT_USERNAME=admin
|
||||||
|
QBITTORRENT_PASSWORD=admin
|
||||||
|
QBITTORRENT_HOST=host.docker.internal
|
||||||
|
QBITTORRENT_PORT=8080
|
||||||
|
|
||||||
|
# TorAPI настройки
|
||||||
|
TORRENT_SEARCH_URL=http://host.docker.internal:8443
|
||||||
|
TORRENT_ADD_URL=http://host.docker.internal:8088
|
||||||
|
EOF
|
||||||
|
log_warning "Файл .env создан. Пожалуйста, отредактируйте его с вашими настройками!"
|
||||||
|
else
|
||||||
|
log_success "Файл .env уже существует"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Запуск сервисов
|
||||||
|
start_services() {
|
||||||
|
log_info "Запуск сервисов..."
|
||||||
|
|
||||||
|
# Остановка существующих контейнеров
|
||||||
|
docker compose down 2>/dev/null || true
|
||||||
|
|
||||||
|
# Сборка и запуск
|
||||||
|
docker compose up -d --build
|
||||||
|
|
||||||
|
log_success "Сервисы запущены"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Проверка статуса
|
||||||
|
check_status() {
|
||||||
|
log_info "Проверка статуса сервисов..."
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "📊 Статус контейнеров:"
|
||||||
|
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🌐 Доступные сервисы:"
|
||||||
|
echo " • Веб-интерфейс: http://localhost:8089"
|
||||||
|
echo " • qBittorrent: http://localhost:8080 (admin/admin)"
|
||||||
|
echo " • Telegram Bot: @your_bot_username (команда /start)"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "📝 Следующие шаги:"
|
||||||
|
echo " 1. Откройте http://localhost:8080 и настройте qBittorrent"
|
||||||
|
echo " 2. Отредактируйте .env файл с вашими API ключами"
|
||||||
|
echo " 3. Перезапустите сервисы: docker compose restart"
|
||||||
|
echo " 4. Откройте http://localhost:8089 для тестирования"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Основная функция
|
||||||
|
main() {
|
||||||
|
echo "🚀 Начинаем развертывание searchTorrentDownl..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
check_os
|
||||||
|
check_root
|
||||||
|
update_system
|
||||||
|
install_docker
|
||||||
|
install_qbittorrent
|
||||||
|
setup_qbittorrent
|
||||||
|
create_docker_network
|
||||||
|
clone_repository
|
||||||
|
setup_environment
|
||||||
|
start_services
|
||||||
|
check_status
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
log_success "🎉 Развертывание завершено успешно!"
|
||||||
|
echo ""
|
||||||
|
log_info "Для остановки сервисов: docker compose down"
|
||||||
|
log_info "Для просмотра логов: docker compose logs -f"
|
||||||
|
log_info "Для перезапуска: docker compose restart"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Запуск
|
||||||
|
main "$@"
|
||||||
24
env.example
Normal file
24
env.example
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
# 🔧 Конфигурация searchTorrentDownl
|
||||||
|
# Скопируйте этот файл в .env и заполните своими данными
|
||||||
|
|
||||||
|
# 🎬 TMDB API Key
|
||||||
|
# Получите на https://www.themoviedb.org/settings/api
|
||||||
|
TMDB_API_KEY=your_tmdb_api_key_here
|
||||||
|
|
||||||
|
# 🤖 Telegram Bot Token
|
||||||
|
# Получите у @BotFather в Telegram
|
||||||
|
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
|
||||||
|
|
||||||
|
# 🐳 qBittorrent настройки
|
||||||
|
QBITTORRENT_USERNAME=admin
|
||||||
|
QBITTORRENT_PASSWORD=admin
|
||||||
|
QBITTORRENT_HOST=host.docker.internal
|
||||||
|
QBITTORRENT_PORT=8080
|
||||||
|
|
||||||
|
# 🔍 TorAPI настройки
|
||||||
|
TORRENT_SEARCH_URL=http://host.docker.internal:8443
|
||||||
|
TORRENT_ADD_URL=http://host.docker.internal:8088
|
||||||
|
|
||||||
|
# 🌐 Основное приложение
|
||||||
|
HOST=0.0.0.0
|
||||||
|
PORT=8000
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
const puppeteer = require('puppeteer');
|
|
||||||
|
|
||||||
async function getRuTrackerCookie() {
|
|
||||||
const browser = await puppeteer.launch({
|
|
||||||
headless: false, // Показываем браузер для ввода капчи
|
|
||||||
args: ['--no-sandbox', '--disable-setuid-sandbox']
|
|
||||||
});
|
|
||||||
|
|
||||||
const page = await browser.newPage();
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Переходим на страницу входа
|
|
||||||
await page.goto('https://rutracker.org/forum/login.php');
|
|
||||||
|
|
||||||
// Ждем загрузки формы
|
|
||||||
await page.waitForSelector('input[name="login_username"]');
|
|
||||||
|
|
||||||
// Вводим логин
|
|
||||||
await page.type('input[name="login_username"]', 'vrubelroman');
|
|
||||||
|
|
||||||
// Вводим пароль
|
|
||||||
await page.type('input[name="login_password"]', 'nlTEk');
|
|
||||||
|
|
||||||
// Нажимаем кнопку входа
|
|
||||||
await page.click('input[name="login"]');
|
|
||||||
|
|
||||||
// Ждем перенаправления
|
|
||||||
await page.waitForNavigation();
|
|
||||||
|
|
||||||
// Получаем cookies
|
|
||||||
const cookies = await page.cookies();
|
|
||||||
const bbSession = cookies.find(cookie => cookie.name === 'bb_session');
|
|
||||||
|
|
||||||
if (bbSession) {
|
|
||||||
console.log('bb_session cookie:', bbSession.value);
|
|
||||||
console.log('Domain:', bbSession.domain);
|
|
||||||
console.log('Path:', bbSession.path);
|
|
||||||
} else {
|
|
||||||
console.log('Cookie bb_session не найден');
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Ошибка:', error);
|
|
||||||
} finally {
|
|
||||||
await browser.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getRuTrackerCookie();
|
|
||||||
|
|
||||||
1
node_modules/.bin/browsers
generated
vendored
1
node_modules/.bin/browsers
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
../@puppeteer/browsers/lib/cjs/main-cli.js
|
|
||||||
1
node_modules/.bin/escodegen
generated
vendored
1
node_modules/.bin/escodegen
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
../escodegen/bin/escodegen.js
|
|
||||||
1
node_modules/.bin/esgenerate
generated
vendored
1
node_modules/.bin/esgenerate
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
../escodegen/bin/esgenerate.js
|
|
||||||
1
node_modules/.bin/esparse
generated
vendored
1
node_modules/.bin/esparse
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
../esprima/bin/esparse.js
|
|
||||||
1
node_modules/.bin/esvalidate
generated
vendored
1
node_modules/.bin/esvalidate
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
../esprima/bin/esvalidate.js
|
|
||||||
1
node_modules/.bin/extract-zip
generated
vendored
1
node_modules/.bin/extract-zip
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
../extract-zip/cli.js
|
|
||||||
1
node_modules/.bin/js-yaml
generated
vendored
1
node_modules/.bin/js-yaml
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
../js-yaml/bin/js-yaml.js
|
|
||||||
1
node_modules/.bin/puppeteer
generated
vendored
1
node_modules/.bin/puppeteer
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
../puppeteer/lib/cjs/puppeteer/node/cli.js
|
|
||||||
1
node_modules/.bin/semver
generated
vendored
1
node_modules/.bin/semver
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
../semver/bin/semver.js
|
|
||||||
1012
node_modules/.package-lock.json
generated
vendored
1012
node_modules/.package-lock.json
generated
vendored
File diff suppressed because it is too large
Load diff
22
node_modules/@babel/code-frame/LICENSE
generated
vendored
22
node_modules/@babel/code-frame/LICENSE
generated
vendored
|
|
@ -1,22 +0,0 @@
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2014-present Sebastian McKenzie and other contributors
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
19
node_modules/@babel/code-frame/README.md
generated
vendored
19
node_modules/@babel/code-frame/README.md
generated
vendored
|
|
@ -1,19 +0,0 @@
|
||||||
# @babel/code-frame
|
|
||||||
|
|
||||||
> Generate errors that contain a code frame that point to source locations.
|
|
||||||
|
|
||||||
See our website [@babel/code-frame](https://babeljs.io/docs/babel-code-frame) for more information.
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
Using npm:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install --save-dev @babel/code-frame
|
|
||||||
```
|
|
||||||
|
|
||||||
or using yarn:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
yarn add @babel/code-frame --dev
|
|
||||||
```
|
|
||||||
216
node_modules/@babel/code-frame/lib/index.js
generated
vendored
216
node_modules/@babel/code-frame/lib/index.js
generated
vendored
|
|
@ -1,216 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
|
||||||
|
|
||||||
var picocolors = require('picocolors');
|
|
||||||
var jsTokens = require('js-tokens');
|
|
||||||
var helperValidatorIdentifier = require('@babel/helper-validator-identifier');
|
|
||||||
|
|
||||||
function isColorSupported() {
|
|
||||||
return (typeof process === "object" && (process.env.FORCE_COLOR === "0" || process.env.FORCE_COLOR === "false") ? false : picocolors.isColorSupported
|
|
||||||
);
|
|
||||||
}
|
|
||||||
const compose = (f, g) => v => f(g(v));
|
|
||||||
function buildDefs(colors) {
|
|
||||||
return {
|
|
||||||
keyword: colors.cyan,
|
|
||||||
capitalized: colors.yellow,
|
|
||||||
jsxIdentifier: colors.yellow,
|
|
||||||
punctuator: colors.yellow,
|
|
||||||
number: colors.magenta,
|
|
||||||
string: colors.green,
|
|
||||||
regex: colors.magenta,
|
|
||||||
comment: colors.gray,
|
|
||||||
invalid: compose(compose(colors.white, colors.bgRed), colors.bold),
|
|
||||||
gutter: colors.gray,
|
|
||||||
marker: compose(colors.red, colors.bold),
|
|
||||||
message: compose(colors.red, colors.bold),
|
|
||||||
reset: colors.reset
|
|
||||||
};
|
|
||||||
}
|
|
||||||
const defsOn = buildDefs(picocolors.createColors(true));
|
|
||||||
const defsOff = buildDefs(picocolors.createColors(false));
|
|
||||||
function getDefs(enabled) {
|
|
||||||
return enabled ? defsOn : defsOff;
|
|
||||||
}
|
|
||||||
|
|
||||||
const sometimesKeywords = new Set(["as", "async", "from", "get", "of", "set"]);
|
|
||||||
const NEWLINE$1 = /\r\n|[\n\r\u2028\u2029]/;
|
|
||||||
const BRACKET = /^[()[\]{}]$/;
|
|
||||||
let tokenize;
|
|
||||||
{
|
|
||||||
const JSX_TAG = /^[a-z][\w-]*$/i;
|
|
||||||
const getTokenType = function (token, offset, text) {
|
|
||||||
if (token.type === "name") {
|
|
||||||
if (helperValidatorIdentifier.isKeyword(token.value) || helperValidatorIdentifier.isStrictReservedWord(token.value, true) || sometimesKeywords.has(token.value)) {
|
|
||||||
return "keyword";
|
|
||||||
}
|
|
||||||
if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.slice(offset - 2, offset) === "</")) {
|
|
||||||
return "jsxIdentifier";
|
|
||||||
}
|
|
||||||
if (token.value[0] !== token.value[0].toLowerCase()) {
|
|
||||||
return "capitalized";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (token.type === "punctuator" && BRACKET.test(token.value)) {
|
|
||||||
return "bracket";
|
|
||||||
}
|
|
||||||
if (token.type === "invalid" && (token.value === "@" || token.value === "#")) {
|
|
||||||
return "punctuator";
|
|
||||||
}
|
|
||||||
return token.type;
|
|
||||||
};
|
|
||||||
tokenize = function* (text) {
|
|
||||||
let match;
|
|
||||||
while (match = jsTokens.default.exec(text)) {
|
|
||||||
const token = jsTokens.matchToToken(match);
|
|
||||||
yield {
|
|
||||||
type: getTokenType(token, match.index, text),
|
|
||||||
value: token.value
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function highlight(text) {
|
|
||||||
if (text === "") return "";
|
|
||||||
const defs = getDefs(true);
|
|
||||||
let highlighted = "";
|
|
||||||
for (const {
|
|
||||||
type,
|
|
||||||
value
|
|
||||||
} of tokenize(text)) {
|
|
||||||
if (type in defs) {
|
|
||||||
highlighted += value.split(NEWLINE$1).map(str => defs[type](str)).join("\n");
|
|
||||||
} else {
|
|
||||||
highlighted += value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return highlighted;
|
|
||||||
}
|
|
||||||
|
|
||||||
let deprecationWarningShown = false;
|
|
||||||
const NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
|
|
||||||
function getMarkerLines(loc, source, opts) {
|
|
||||||
const startLoc = Object.assign({
|
|
||||||
column: 0,
|
|
||||||
line: -1
|
|
||||||
}, loc.start);
|
|
||||||
const endLoc = Object.assign({}, startLoc, loc.end);
|
|
||||||
const {
|
|
||||||
linesAbove = 2,
|
|
||||||
linesBelow = 3
|
|
||||||
} = opts || {};
|
|
||||||
const startLine = startLoc.line;
|
|
||||||
const startColumn = startLoc.column;
|
|
||||||
const endLine = endLoc.line;
|
|
||||||
const endColumn = endLoc.column;
|
|
||||||
let start = Math.max(startLine - (linesAbove + 1), 0);
|
|
||||||
let end = Math.min(source.length, endLine + linesBelow);
|
|
||||||
if (startLine === -1) {
|
|
||||||
start = 0;
|
|
||||||
}
|
|
||||||
if (endLine === -1) {
|
|
||||||
end = source.length;
|
|
||||||
}
|
|
||||||
const lineDiff = endLine - startLine;
|
|
||||||
const markerLines = {};
|
|
||||||
if (lineDiff) {
|
|
||||||
for (let i = 0; i <= lineDiff; i++) {
|
|
||||||
const lineNumber = i + startLine;
|
|
||||||
if (!startColumn) {
|
|
||||||
markerLines[lineNumber] = true;
|
|
||||||
} else if (i === 0) {
|
|
||||||
const sourceLength = source[lineNumber - 1].length;
|
|
||||||
markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1];
|
|
||||||
} else if (i === lineDiff) {
|
|
||||||
markerLines[lineNumber] = [0, endColumn];
|
|
||||||
} else {
|
|
||||||
const sourceLength = source[lineNumber - i].length;
|
|
||||||
markerLines[lineNumber] = [0, sourceLength];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (startColumn === endColumn) {
|
|
||||||
if (startColumn) {
|
|
||||||
markerLines[startLine] = [startColumn, 0];
|
|
||||||
} else {
|
|
||||||
markerLines[startLine] = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
markerLines[startLine] = [startColumn, endColumn - startColumn];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
markerLines
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function codeFrameColumns(rawLines, loc, opts = {}) {
|
|
||||||
const shouldHighlight = opts.forceColor || isColorSupported() && opts.highlightCode;
|
|
||||||
const defs = getDefs(shouldHighlight);
|
|
||||||
const lines = rawLines.split(NEWLINE);
|
|
||||||
const {
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
markerLines
|
|
||||||
} = getMarkerLines(loc, lines, opts);
|
|
||||||
const hasColumns = loc.start && typeof loc.start.column === "number";
|
|
||||||
const numberMaxWidth = String(end).length;
|
|
||||||
const highlightedLines = shouldHighlight ? highlight(rawLines) : rawLines;
|
|
||||||
let frame = highlightedLines.split(NEWLINE, end).slice(start, end).map((line, index) => {
|
|
||||||
const number = start + 1 + index;
|
|
||||||
const paddedNumber = ` ${number}`.slice(-numberMaxWidth);
|
|
||||||
const gutter = ` ${paddedNumber} |`;
|
|
||||||
const hasMarker = markerLines[number];
|
|
||||||
const lastMarkerLine = !markerLines[number + 1];
|
|
||||||
if (hasMarker) {
|
|
||||||
let markerLine = "";
|
|
||||||
if (Array.isArray(hasMarker)) {
|
|
||||||
const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " ");
|
|
||||||
const numberOfMarkers = hasMarker[1] || 1;
|
|
||||||
markerLine = ["\n ", defs.gutter(gutter.replace(/\d/g, " ")), " ", markerSpacing, defs.marker("^").repeat(numberOfMarkers)].join("");
|
|
||||||
if (lastMarkerLine && opts.message) {
|
|
||||||
markerLine += " " + defs.message(opts.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return [defs.marker(">"), defs.gutter(gutter), line.length > 0 ? ` ${line}` : "", markerLine].join("");
|
|
||||||
} else {
|
|
||||||
return ` ${defs.gutter(gutter)}${line.length > 0 ? ` ${line}` : ""}`;
|
|
||||||
}
|
|
||||||
}).join("\n");
|
|
||||||
if (opts.message && !hasColumns) {
|
|
||||||
frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`;
|
|
||||||
}
|
|
||||||
if (shouldHighlight) {
|
|
||||||
return defs.reset(frame);
|
|
||||||
} else {
|
|
||||||
return frame;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function index (rawLines, lineNumber, colNumber, opts = {}) {
|
|
||||||
if (!deprecationWarningShown) {
|
|
||||||
deprecationWarningShown = true;
|
|
||||||
const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`.";
|
|
||||||
if (process.emitWarning) {
|
|
||||||
process.emitWarning(message, "DeprecationWarning");
|
|
||||||
} else {
|
|
||||||
const deprecationError = new Error(message);
|
|
||||||
deprecationError.name = "DeprecationWarning";
|
|
||||||
console.warn(new Error(message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
colNumber = Math.max(colNumber, 0);
|
|
||||||
const location = {
|
|
||||||
start: {
|
|
||||||
column: colNumber,
|
|
||||||
line: lineNumber
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return codeFrameColumns(rawLines, location, opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.codeFrameColumns = codeFrameColumns;
|
|
||||||
exports.default = index;
|
|
||||||
exports.highlight = highlight;
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
1
node_modules/@babel/code-frame/lib/index.js.map
generated
vendored
1
node_modules/@babel/code-frame/lib/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
31
node_modules/@babel/code-frame/package.json
generated
vendored
31
node_modules/@babel/code-frame/package.json
generated
vendored
|
|
@ -1,31 +0,0 @@
|
||||||
{
|
|
||||||
"name": "@babel/code-frame",
|
|
||||||
"version": "7.27.1",
|
|
||||||
"description": "Generate errors that contain a code frame that point to source locations.",
|
|
||||||
"author": "The Babel Team (https://babel.dev/team)",
|
|
||||||
"homepage": "https://babel.dev/docs/en/next/babel-code-frame",
|
|
||||||
"bugs": "https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen",
|
|
||||||
"license": "MIT",
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/babel/babel.git",
|
|
||||||
"directory": "packages/babel-code-frame"
|
|
||||||
},
|
|
||||||
"main": "./lib/index.js",
|
|
||||||
"dependencies": {
|
|
||||||
"@babel/helper-validator-identifier": "^7.27.1",
|
|
||||||
"js-tokens": "^4.0.0",
|
|
||||||
"picocolors": "^1.1.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"import-meta-resolve": "^4.1.0",
|
|
||||||
"strip-ansi": "^4.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6.9.0"
|
|
||||||
},
|
|
||||||
"type": "commonjs"
|
|
||||||
}
|
|
||||||
22
node_modules/@babel/helper-validator-identifier/LICENSE
generated
vendored
22
node_modules/@babel/helper-validator-identifier/LICENSE
generated
vendored
|
|
@ -1,22 +0,0 @@
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2014-present Sebastian McKenzie and other contributors
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
19
node_modules/@babel/helper-validator-identifier/README.md
generated
vendored
19
node_modules/@babel/helper-validator-identifier/README.md
generated
vendored
|
|
@ -1,19 +0,0 @@
|
||||||
# @babel/helper-validator-identifier
|
|
||||||
|
|
||||||
> Validate identifier/keywords name
|
|
||||||
|
|
||||||
See our website [@babel/helper-validator-identifier](https://babeljs.io/docs/babel-helper-validator-identifier) for more information.
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
Using npm:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install --save @babel/helper-validator-identifier
|
|
||||||
```
|
|
||||||
|
|
||||||
or using yarn:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
yarn add @babel/helper-validator-identifier
|
|
||||||
```
|
|
||||||
70
node_modules/@babel/helper-validator-identifier/lib/identifier.js
generated
vendored
70
node_modules/@babel/helper-validator-identifier/lib/identifier.js
generated
vendored
|
|
@ -1,70 +0,0 @@
|
||||||
"use strict";
|
|
||||||
|
|
||||||
Object.defineProperty(exports, "__esModule", {
|
|
||||||
value: true
|
|
||||||
});
|
|
||||||
exports.isIdentifierChar = isIdentifierChar;
|
|
||||||
exports.isIdentifierName = isIdentifierName;
|
|
||||||
exports.isIdentifierStart = isIdentifierStart;
|
|
||||||
let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7cd\ua7d0\ua7d1\ua7d3\ua7d5-\ua7dc\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
|
|
||||||
let nonASCIIidentifierChars = "\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65";
|
|
||||||
const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
|
|
||||||
const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
|
|
||||||
nonASCIIidentifierStartChars = nonASCIIidentifierChars = null;
|
|
||||||
const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191];
|
|
||||||
const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
|
|
||||||
function isInAstralSet(code, set) {
|
|
||||||
let pos = 0x10000;
|
|
||||||
for (let i = 0, length = set.length; i < length; i += 2) {
|
|
||||||
pos += set[i];
|
|
||||||
if (pos > code) return false;
|
|
||||||
pos += set[i + 1];
|
|
||||||
if (pos >= code) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
function isIdentifierStart(code) {
|
|
||||||
if (code < 65) return code === 36;
|
|
||||||
if (code <= 90) return true;
|
|
||||||
if (code < 97) return code === 95;
|
|
||||||
if (code <= 122) return true;
|
|
||||||
if (code <= 0xffff) {
|
|
||||||
return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code));
|
|
||||||
}
|
|
||||||
return isInAstralSet(code, astralIdentifierStartCodes);
|
|
||||||
}
|
|
||||||
function isIdentifierChar(code) {
|
|
||||||
if (code < 48) return code === 36;
|
|
||||||
if (code < 58) return true;
|
|
||||||
if (code < 65) return false;
|
|
||||||
if (code <= 90) return true;
|
|
||||||
if (code < 97) return code === 95;
|
|
||||||
if (code <= 122) return true;
|
|
||||||
if (code <= 0xffff) {
|
|
||||||
return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));
|
|
||||||
}
|
|
||||||
return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes);
|
|
||||||
}
|
|
||||||
function isIdentifierName(name) {
|
|
||||||
let isFirst = true;
|
|
||||||
for (let i = 0; i < name.length; i++) {
|
|
||||||
let cp = name.charCodeAt(i);
|
|
||||||
if ((cp & 0xfc00) === 0xd800 && i + 1 < name.length) {
|
|
||||||
const trail = name.charCodeAt(++i);
|
|
||||||
if ((trail & 0xfc00) === 0xdc00) {
|
|
||||||
cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isFirst) {
|
|
||||||
isFirst = false;
|
|
||||||
if (!isIdentifierStart(cp)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else if (!isIdentifierChar(cp)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return !isFirst;
|
|
||||||
}
|
|
||||||
|
|
||||||
//# sourceMappingURL=identifier.js.map
|
|
||||||
1
node_modules/@babel/helper-validator-identifier/lib/identifier.js.map
generated
vendored
1
node_modules/@babel/helper-validator-identifier/lib/identifier.js.map
generated
vendored
File diff suppressed because one or more lines are too long
57
node_modules/@babel/helper-validator-identifier/lib/index.js
generated
vendored
57
node_modules/@babel/helper-validator-identifier/lib/index.js
generated
vendored
|
|
@ -1,57 +0,0 @@
|
||||||
"use strict";
|
|
||||||
|
|
||||||
Object.defineProperty(exports, "__esModule", {
|
|
||||||
value: true
|
|
||||||
});
|
|
||||||
Object.defineProperty(exports, "isIdentifierChar", {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return _identifier.isIdentifierChar;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Object.defineProperty(exports, "isIdentifierName", {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return _identifier.isIdentifierName;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Object.defineProperty(exports, "isIdentifierStart", {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return _identifier.isIdentifierStart;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Object.defineProperty(exports, "isKeyword", {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return _keyword.isKeyword;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Object.defineProperty(exports, "isReservedWord", {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return _keyword.isReservedWord;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Object.defineProperty(exports, "isStrictBindOnlyReservedWord", {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return _keyword.isStrictBindOnlyReservedWord;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Object.defineProperty(exports, "isStrictBindReservedWord", {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return _keyword.isStrictBindReservedWord;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Object.defineProperty(exports, "isStrictReservedWord", {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return _keyword.isStrictReservedWord;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
var _identifier = require("./identifier.js");
|
|
||||||
var _keyword = require("./keyword.js");
|
|
||||||
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
1
node_modules/@babel/helper-validator-identifier/lib/index.js.map
generated
vendored
1
node_modules/@babel/helper-validator-identifier/lib/index.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"names":["_identifier","require","_keyword"],"sources":["../src/index.ts"],"sourcesContent":["export {\n isIdentifierName,\n isIdentifierChar,\n isIdentifierStart,\n} from \"./identifier.ts\";\nexport {\n isReservedWord,\n isStrictBindOnlyReservedWord,\n isStrictBindReservedWord,\n isStrictReservedWord,\n isKeyword,\n} from \"./keyword.ts\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAKA,IAAAC,QAAA,GAAAD,OAAA","ignoreList":[]}
|
|
||||||
35
node_modules/@babel/helper-validator-identifier/lib/keyword.js
generated
vendored
35
node_modules/@babel/helper-validator-identifier/lib/keyword.js
generated
vendored
|
|
@ -1,35 +0,0 @@
|
||||||
"use strict";
|
|
||||||
|
|
||||||
Object.defineProperty(exports, "__esModule", {
|
|
||||||
value: true
|
|
||||||
});
|
|
||||||
exports.isKeyword = isKeyword;
|
|
||||||
exports.isReservedWord = isReservedWord;
|
|
||||||
exports.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord;
|
|
||||||
exports.isStrictBindReservedWord = isStrictBindReservedWord;
|
|
||||||
exports.isStrictReservedWord = isStrictReservedWord;
|
|
||||||
const reservedWords = {
|
|
||||||
keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"],
|
|
||||||
strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"],
|
|
||||||
strictBind: ["eval", "arguments"]
|
|
||||||
};
|
|
||||||
const keywords = new Set(reservedWords.keyword);
|
|
||||||
const reservedWordsStrictSet = new Set(reservedWords.strict);
|
|
||||||
const reservedWordsStrictBindSet = new Set(reservedWords.strictBind);
|
|
||||||
function isReservedWord(word, inModule) {
|
|
||||||
return inModule && word === "await" || word === "enum";
|
|
||||||
}
|
|
||||||
function isStrictReservedWord(word, inModule) {
|
|
||||||
return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);
|
|
||||||
}
|
|
||||||
function isStrictBindOnlyReservedWord(word) {
|
|
||||||
return reservedWordsStrictBindSet.has(word);
|
|
||||||
}
|
|
||||||
function isStrictBindReservedWord(word, inModule) {
|
|
||||||
return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word);
|
|
||||||
}
|
|
||||||
function isKeyword(word) {
|
|
||||||
return keywords.has(word);
|
|
||||||
}
|
|
||||||
|
|
||||||
//# sourceMappingURL=keyword.js.map
|
|
||||||
1
node_modules/@babel/helper-validator-identifier/lib/keyword.js.map
generated
vendored
1
node_modules/@babel/helper-validator-identifier/lib/keyword.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"names":["reservedWords","keyword","strict","strictBind","keywords","Set","reservedWordsStrictSet","reservedWordsStrictBindSet","isReservedWord","word","inModule","isStrictReservedWord","has","isStrictBindOnlyReservedWord","isStrictBindReservedWord","isKeyword"],"sources":["../src/keyword.ts"],"sourcesContent":["const reservedWords = {\n keyword: [\n \"break\",\n \"case\",\n \"catch\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"do\",\n \"else\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"return\",\n \"switch\",\n \"throw\",\n \"try\",\n \"var\",\n \"const\",\n \"while\",\n \"with\",\n \"new\",\n \"this\",\n \"super\",\n \"class\",\n \"extends\",\n \"export\",\n \"import\",\n \"null\",\n \"true\",\n \"false\",\n \"in\",\n \"instanceof\",\n \"typeof\",\n \"void\",\n \"delete\",\n ],\n strict: [\n \"implements\",\n \"interface\",\n \"let\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"static\",\n \"yield\",\n ],\n strictBind: [\"eval\", \"arguments\"],\n};\nconst keywords = new Set(reservedWords.keyword);\nconst reservedWordsStrictSet = new Set(reservedWords.strict);\nconst reservedWordsStrictBindSet = new Set(reservedWords.strictBind);\n\n/**\n * Checks if word is a reserved word in non-strict mode\n */\nexport function isReservedWord(word: string, inModule: boolean): boolean {\n return (inModule && word === \"await\") || word === \"enum\";\n}\n\n/**\n * Checks if word is a reserved word in non-binding strict mode\n *\n * Includes non-strict reserved words\n */\nexport function isStrictReservedWord(word: string, inModule: boolean): boolean {\n return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);\n}\n\n/**\n * Checks if word is a reserved word in binding strict mode, but it is allowed as\n * a normal identifier.\n */\nexport function isStrictBindOnlyReservedWord(word: string): boolean {\n return reservedWordsStrictBindSet.has(word);\n}\n\n/**\n * Checks if word is a reserved word in binding strict mode\n *\n * Includes non-strict reserved words and non-binding strict reserved words\n */\nexport function isStrictBindReservedWord(\n word: string,\n inModule: boolean,\n): boolean {\n return (\n isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word)\n );\n}\n\nexport function isKeyword(word: string): boolean {\n return keywords.has(word);\n}\n"],"mappings":";;;;;;;;;;AAAA,MAAMA,aAAa,GAAG;EACpBC,OAAO,EAAE,CACP,OAAO,EACP,MAAM,EACN,OAAO,EACP,UAAU,EACV,UAAU,EACV,SAAS,EACT,IAAI,EACJ,MAAM,EACN,SAAS,EACT,KAAK,EACL,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,KAAK,EACL,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,MAAM,EACN,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,QAAQ,CACT;EACDC,MAAM,EAAE,CACN,YAAY,EACZ,WAAW,EACX,KAAK,EACL,SAAS,EACT,SAAS,EACT,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,OAAO,CACR;EACDC,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW;AAClC,CAAC;AACD,MAAMC,QAAQ,GAAG,IAAIC,GAAG,CAACL,aAAa,CAACC,OAAO,CAAC;AAC/C,MAAMK,sBAAsB,GAAG,IAAID,GAAG,CAACL,aAAa,CAACE,MAAM,CAAC;AAC5D,MAAMK,0BAA0B,GAAG,IAAIF,GAAG,CAACL,aAAa,CAACG,UAAU,CAAC;AAK7D,SAASK,cAAcA,CAACC,IAAY,EAAEC,QAAiB,EAAW;EACvE,OAAQA,QAAQ,IAAID,IAAI,KAAK,OAAO,IAAKA,IAAI,KAAK,MAAM;AAC1D;AAOO,SAASE,oBAAoBA,CAACF,IAAY,EAAEC,QAAiB,EAAW;EAC7E,OAAOF,cAAc,CAACC,IAAI,EAAEC,QAAQ,CAAC,IAAIJ,sBAAsB,CAACM,GAAG,CAACH,IAAI,CAAC;AAC3E;AAMO,SAASI,4BAA4BA,CAACJ,IAAY,EAAW;EAClE,OAAOF,0BAA0B,CAACK,GAAG,CAACH,IAAI,CAAC;AAC7C;AAOO,SAASK,wBAAwBA,CACtCL,IAAY,EACZC,QAAiB,EACR;EACT,OACEC,oBAAoB,CAACF,IAAI,EAAEC,QAAQ,CAAC,IAAIG,4BAA4B,CAACJ,IAAI,CAAC;AAE9E;AAEO,SAASM,SAASA,CAACN,IAAY,EAAW;EAC/C,OAAOL,QAAQ,CAACQ,GAAG,CAACH,IAAI,CAAC;AAC3B","ignoreList":[]}
|
|
||||||
31
node_modules/@babel/helper-validator-identifier/package.json
generated
vendored
31
node_modules/@babel/helper-validator-identifier/package.json
generated
vendored
|
|
@ -1,31 +0,0 @@
|
||||||
{
|
|
||||||
"name": "@babel/helper-validator-identifier",
|
|
||||||
"version": "7.27.1",
|
|
||||||
"description": "Validate identifier/keywords name",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/babel/babel.git",
|
|
||||||
"directory": "packages/babel-helper-validator-identifier"
|
|
||||||
},
|
|
||||||
"license": "MIT",
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
},
|
|
||||||
"main": "./lib/index.js",
|
|
||||||
"exports": {
|
|
||||||
".": {
|
|
||||||
"types": "./lib/index.d.ts",
|
|
||||||
"default": "./lib/index.js"
|
|
||||||
},
|
|
||||||
"./package.json": "./package.json"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@unicode/unicode-16.0.0": "^1.0.0",
|
|
||||||
"charcodes": "^0.2.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6.9.0"
|
|
||||||
},
|
|
||||||
"author": "The Babel Team (https://babel.dev/team)",
|
|
||||||
"type": "commonjs"
|
|
||||||
}
|
|
||||||
88
node_modules/@puppeteer/browsers/README.md
generated
vendored
88
node_modules/@puppeteer/browsers/README.md
generated
vendored
|
|
@ -1,88 +0,0 @@
|
||||||
# @puppeteer/browsers
|
|
||||||
|
|
||||||
Manage and launch browsers/drivers from a CLI or programmatically.
|
|
||||||
|
|
||||||
## System requirements
|
|
||||||
|
|
||||||
- A compatible Node version (see `engines` in `package.json`).
|
|
||||||
- For Firefox downloads:
|
|
||||||
- Linux builds: `xz` and `bzip2` utilities are required to unpack `.tar.gz` and `.tar.bz2` archives.
|
|
||||||
- MacOS builds: `hdiutil` is required to unpack `.dmg` archives.
|
|
||||||
|
|
||||||
## CLI
|
|
||||||
|
|
||||||
Use `npx` to run the CLI:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# This will install and run the @puppeteer/browsers package.
|
|
||||||
# If it is already installed in the current directory, the installed
|
|
||||||
# version will be used.
|
|
||||||
npx @puppeteer/browsers --help
|
|
||||||
```
|
|
||||||
|
|
||||||
Built-in per-command `help` will provide all documentation you need to use the CLI.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npx @puppeteer/browsers --help # help for all commands
|
|
||||||
npx @puppeteer/browsers install --help # help for the install command
|
|
||||||
npx @puppeteer/browsers launch --help # help for the launch command
|
|
||||||
npx @puppeteer/browsers clear --help # help for the clear command
|
|
||||||
npx @puppeteer/browsers list --help # help for the list command
|
|
||||||
```
|
|
||||||
|
|
||||||
You can specify the version of the `@puppeteer/browsers` when using
|
|
||||||
`npx`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Always install and use the latest version from the registry.
|
|
||||||
npx @puppeteer/browsers@latest --help
|
|
||||||
# Always use a specifc version.
|
|
||||||
npx @puppeteer/browsers@2.4.1 --help
|
|
||||||
# Always install the latest version and automatically confirm the installation.
|
|
||||||
npx --yes @puppeteer/browsers@latest --help
|
|
||||||
```
|
|
||||||
|
|
||||||
To clear all installed browsers, use the `clear` command:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npx @puppeteer/browsers clear
|
|
||||||
```
|
|
||||||
|
|
||||||
To list all installed browsers, use the `list` command:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npx @puppeteer/browsers list
|
|
||||||
```
|
|
||||||
|
|
||||||
Some example to give an idea of what the CLI looks like (use the `--help` command for more examples):
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# Download the latest available Chrome for Testing binary corresponding to the Stable channel.
|
|
||||||
npx @puppeteer/browsers install chrome@stable
|
|
||||||
|
|
||||||
# Download a specific Chrome for Testing version.
|
|
||||||
npx @puppeteer/browsers install chrome@116.0.5793.0
|
|
||||||
|
|
||||||
# Download the latest Chrome for Testing version for the given milestone.
|
|
||||||
npx @puppeteer/browsers install chrome@117
|
|
||||||
|
|
||||||
# Download the latest available ChromeDriver version corresponding to the Canary channel.
|
|
||||||
npx @puppeteer/browsers install chromedriver@canary
|
|
||||||
|
|
||||||
# Download a specific ChromeDriver version.
|
|
||||||
npx @puppeteer/browsers install chromedriver@116.0.5793.0
|
|
||||||
|
|
||||||
# On Ubuntu/Debian and only for Chrome, install the browser and required system dependencies.
|
|
||||||
# If the browser version has already been installed, the command
|
|
||||||
# will still attempt to install system dependencies.
|
|
||||||
# Requires root privileges.
|
|
||||||
npx puppeteer browsers install chrome --install-deps
|
|
||||||
```
|
|
||||||
|
|
||||||
## Known limitations
|
|
||||||
|
|
||||||
1. Launching the system browsers is only possible for Chrome/Chromium.
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
The programmatic API allows installing and launching browsers from your code. See the `test` folder for examples on how to use the `install`, `canInstall`, `launch`, `computeExecutablePath`, `computeSystemExecutablePath` and other methods.
|
|
||||||
29
node_modules/@puppeteer/browsers/lib/cjs/CLI.d.ts
generated
vendored
29
node_modules/@puppeteer/browsers/lib/cjs/CLI.d.ts
generated
vendored
|
|
@ -1,29 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import * as readline from 'node:readline';
|
|
||||||
import { Browser } from './browser-data/browser-data.js';
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare class CLI {
|
|
||||||
#private;
|
|
||||||
constructor(opts?: string | {
|
|
||||||
cachePath?: string;
|
|
||||||
scriptName?: string;
|
|
||||||
version?: string;
|
|
||||||
prefixCommand?: {
|
|
||||||
cmd: string;
|
|
||||||
description: string;
|
|
||||||
};
|
|
||||||
allowCachePathOverride?: boolean;
|
|
||||||
pinnedBrowsers?: Partial<Record<Browser, {
|
|
||||||
buildId: string;
|
|
||||||
skipDownload: boolean;
|
|
||||||
}>>;
|
|
||||||
}, rl?: readline.Interface);
|
|
||||||
run(argv: string[]): Promise<void>;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=CLI.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/CLI.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/CLI.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../src/CLI.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAI1C,OAAO,EACL,OAAO,EAIR,MAAM,gCAAgC,CAAC;AA+BxC;;GAEG;AACH,qBAAa,GAAG;;gBAkBZ,IAAI,CAAC,EACD,MAAM,GACN;QACE,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAC,CAAC;QACnD,sBAAsB,CAAC,EAAE,OAAO,CAAC;QACjC,cAAc,CAAC,EAAE,OAAO,CACtB,MAAM,CACJ,OAAO,EACP;YACE,OAAO,EAAE,MAAM,CAAC;YAChB,YAAY,EAAE,OAAO,CAAC;SACvB,CACF,CACF,CAAC;KACH,EACL,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS;IA+EnB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAoYzC"}
|
|
||||||
362
node_modules/@puppeteer/browsers/lib/cjs/CLI.js
generated
vendored
362
node_modules/@puppeteer/browsers/lib/cjs/CLI.js
generated
vendored
|
|
@ -1,362 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
||||||
if (k2 === undefined) k2 = k;
|
|
||||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
||||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
||||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
||||||
}
|
|
||||||
Object.defineProperty(o, k2, desc);
|
|
||||||
}) : (function(o, m, k, k2) {
|
|
||||||
if (k2 === undefined) k2 = k;
|
|
||||||
o[k2] = m[k];
|
|
||||||
}));
|
|
||||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
||||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
||||||
}) : function(o, v) {
|
|
||||||
o["default"] = v;
|
|
||||||
});
|
|
||||||
var __importStar = (this && this.__importStar) || (function () {
|
|
||||||
var ownKeys = function(o) {
|
|
||||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
||||||
var ar = [];
|
|
||||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
||||||
return ar;
|
|
||||||
};
|
|
||||||
return ownKeys(o);
|
|
||||||
};
|
|
||||||
return function (mod) {
|
|
||||||
if (mod && mod.__esModule) return mod;
|
|
||||||
var result = {};
|
|
||||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
||||||
__setModuleDefault(result, mod);
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.CLI = void 0;
|
|
||||||
const node_process_1 = require("node:process");
|
|
||||||
const readline = __importStar(require("node:readline"));
|
|
||||||
const browser_data_js_1 = require("./browser-data/browser-data.js");
|
|
||||||
const Cache_js_1 = require("./Cache.js");
|
|
||||||
const detectPlatform_js_1 = require("./detectPlatform.js");
|
|
||||||
const version_js_1 = require("./generated/version.js");
|
|
||||||
const install_js_1 = require("./install.js");
|
|
||||||
const launch_js_1 = require("./launch.js");
|
|
||||||
function isValidBrowser(browser) {
|
|
||||||
return Object.values(browser_data_js_1.Browser).includes(browser);
|
|
||||||
}
|
|
||||||
function isValidPlatform(platform) {
|
|
||||||
return Object.values(browser_data_js_1.BrowserPlatform).includes(platform);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
class CLI {
|
|
||||||
#cachePath;
|
|
||||||
#rl;
|
|
||||||
#scriptName;
|
|
||||||
#version;
|
|
||||||
#allowCachePathOverride;
|
|
||||||
#pinnedBrowsers;
|
|
||||||
#prefixCommand;
|
|
||||||
constructor(opts, rl) {
|
|
||||||
if (!opts) {
|
|
||||||
opts = {};
|
|
||||||
}
|
|
||||||
if (typeof opts === 'string') {
|
|
||||||
opts = {
|
|
||||||
cachePath: opts,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
this.#cachePath = opts.cachePath ?? process.cwd();
|
|
||||||
this.#rl = rl;
|
|
||||||
this.#scriptName = opts.scriptName ?? '@puppeteer/browsers';
|
|
||||||
this.#version = opts.version ?? version_js_1.packageVersion;
|
|
||||||
this.#allowCachePathOverride = opts.allowCachePathOverride ?? true;
|
|
||||||
this.#pinnedBrowsers = opts.pinnedBrowsers;
|
|
||||||
this.#prefixCommand = opts.prefixCommand;
|
|
||||||
}
|
|
||||||
#defineBrowserParameter(yargs, required) {
|
|
||||||
return yargs.positional('browser', {
|
|
||||||
description: 'Which browser to install <browser>[@<buildId|latest>]. `latest` will try to find the latest available build. `buildId` is a browser-specific identifier such as a version or a revision.',
|
|
||||||
type: 'string',
|
|
||||||
coerce: (opt) => {
|
|
||||||
const browser = {
|
|
||||||
name: this.#parseBrowser(opt),
|
|
||||||
buildId: this.#parseBuildId(opt),
|
|
||||||
};
|
|
||||||
if (!isValidBrowser(browser.name)) {
|
|
||||||
throw new Error(`Unsupported browser '${browser.name}'`);
|
|
||||||
}
|
|
||||||
return browser;
|
|
||||||
},
|
|
||||||
demandOption: required,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
#definePlatformParameter(yargs) {
|
|
||||||
return yargs.option('platform', {
|
|
||||||
type: 'string',
|
|
||||||
desc: 'Platform that the binary needs to be compatible with.',
|
|
||||||
choices: Object.values(browser_data_js_1.BrowserPlatform),
|
|
||||||
default: (0, detectPlatform_js_1.detectBrowserPlatform)(),
|
|
||||||
coerce: platform => {
|
|
||||||
if (!isValidPlatform(platform)) {
|
|
||||||
throw new Error(`Unsupported platform '${platform}'`);
|
|
||||||
}
|
|
||||||
return platform;
|
|
||||||
},
|
|
||||||
defaultDescription: 'Auto-detected',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
#definePathParameter(yargs, required = false) {
|
|
||||||
if (!this.#allowCachePathOverride) {
|
|
||||||
return yargs;
|
|
||||||
}
|
|
||||||
return yargs.option('path', {
|
|
||||||
type: 'string',
|
|
||||||
desc: 'Path to the root folder for the browser downloads and installation. If a relative path is provided, it will be resolved relative to the current working directory. The installation folder structure is compatible with the cache structure used by Puppeteer.',
|
|
||||||
defaultDescription: 'Current working directory',
|
|
||||||
...(required ? {} : { default: process.cwd() }),
|
|
||||||
demandOption: required,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
async run(argv) {
|
|
||||||
const { default: yargs } = await import('yargs');
|
|
||||||
const { hideBin } = await import('yargs/helpers');
|
|
||||||
const yargsInstance = yargs(hideBin(argv));
|
|
||||||
let target = yargsInstance
|
|
||||||
.scriptName(this.#scriptName)
|
|
||||||
.version(this.#version);
|
|
||||||
if (this.#prefixCommand) {
|
|
||||||
target = target.command(this.#prefixCommand.cmd, this.#prefixCommand.description, yargs => {
|
|
||||||
return this.#build(yargs);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
target = this.#build(target);
|
|
||||||
}
|
|
||||||
await target
|
|
||||||
.demandCommand(1)
|
|
||||||
.help()
|
|
||||||
.wrap(Math.min(120, yargsInstance.terminalWidth()))
|
|
||||||
.parseAsync();
|
|
||||||
}
|
|
||||||
#build(yargs) {
|
|
||||||
const latestOrPinned = this.#pinnedBrowsers ? 'pinned' : 'latest';
|
|
||||||
// If there are pinned browsers allow the positional arg to be optional
|
|
||||||
const browserArgType = this.#pinnedBrowsers ? '[browser]' : '<browser>';
|
|
||||||
return yargs
|
|
||||||
.command(`install ${browserArgType}`, 'Download and install the specified browser. If successful, the command outputs the actual browser buildId that was installed and the absolute path to the browser executable (format: <browser>@<buildID> <path>).', yargs => {
|
|
||||||
if (this.#pinnedBrowsers) {
|
|
||||||
yargs.example('$0 install', 'Install all pinned browsers');
|
|
||||||
}
|
|
||||||
yargs
|
|
||||||
.example('$0 install chrome', `Install the ${latestOrPinned} available build of the Chrome browser.`)
|
|
||||||
.example('$0 install chrome@latest', 'Install the latest available build for the Chrome browser.')
|
|
||||||
.example('$0 install chrome@stable', 'Install the latest available build for the Chrome browser from the stable channel.')
|
|
||||||
.example('$0 install chrome@beta', 'Install the latest available build for the Chrome browser from the beta channel.')
|
|
||||||
.example('$0 install chrome@dev', 'Install the latest available build for the Chrome browser from the dev channel.')
|
|
||||||
.example('$0 install chrome@canary', 'Install the latest available build for the Chrome Canary browser.')
|
|
||||||
.example('$0 install chrome@115', 'Install the latest available build for Chrome 115.')
|
|
||||||
.example('$0 install chromedriver@canary', 'Install the latest available build for ChromeDriver Canary.')
|
|
||||||
.example('$0 install chromedriver@115', 'Install the latest available build for ChromeDriver 115.')
|
|
||||||
.example('$0 install chromedriver@115.0.5790', 'Install the latest available patch (115.0.5790.X) build for ChromeDriver.')
|
|
||||||
.example('$0 install chrome-headless-shell', 'Install the latest available chrome-headless-shell build.')
|
|
||||||
.example('$0 install chrome-headless-shell@beta', 'Install the latest available chrome-headless-shell build corresponding to the Beta channel.')
|
|
||||||
.example('$0 install chrome-headless-shell@118', 'Install the latest available chrome-headless-shell 118 build.')
|
|
||||||
.example('$0 install chromium@1083080', 'Install the revision 1083080 of the Chromium browser.')
|
|
||||||
.example('$0 install firefox', 'Install the latest nightly available build of the Firefox browser.')
|
|
||||||
.example('$0 install firefox@stable', 'Install the latest stable build of the Firefox browser.')
|
|
||||||
.example('$0 install firefox@beta', 'Install the latest beta build of the Firefox browser.')
|
|
||||||
.example('$0 install firefox@devedition', 'Install the latest devedition build of the Firefox browser.')
|
|
||||||
.example('$0 install firefox@esr', 'Install the latest ESR build of the Firefox browser.')
|
|
||||||
.example('$0 install firefox@nightly', 'Install the latest nightly build of the Firefox browser.')
|
|
||||||
.example('$0 install firefox@stable_111.0.1', 'Install a specific version of the Firefox browser.')
|
|
||||||
.example('$0 install firefox --platform mac', 'Install the latest Mac (Intel) build of the Firefox browser.');
|
|
||||||
if (this.#allowCachePathOverride) {
|
|
||||||
yargs.example('$0 install firefox --path /tmp/my-browser-cache', 'Install to the specified cache directory.');
|
|
||||||
}
|
|
||||||
const yargsWithBrowserParam = this.#defineBrowserParameter(yargs, !Boolean(this.#pinnedBrowsers));
|
|
||||||
const yargsWithPlatformParam = this.#definePlatformParameter(yargsWithBrowserParam);
|
|
||||||
return this.#definePathParameter(yargsWithPlatformParam, false)
|
|
||||||
.option('base-url', {
|
|
||||||
type: 'string',
|
|
||||||
desc: 'Base URL to download from',
|
|
||||||
})
|
|
||||||
.option('install-deps', {
|
|
||||||
type: 'boolean',
|
|
||||||
desc: 'Whether to attempt installing system dependencies (only supported on Linux, requires root privileges).',
|
|
||||||
default: false,
|
|
||||||
});
|
|
||||||
}, async (args) => {
|
|
||||||
if (this.#pinnedBrowsers && !args.browser) {
|
|
||||||
// Use allSettled to avoid scenarios that
|
|
||||||
// a browser may fail early and leave the other
|
|
||||||
// installation in a faulty state
|
|
||||||
const result = await Promise.allSettled(Object.entries(this.#pinnedBrowsers).map(async ([browser, options]) => {
|
|
||||||
if (options.skipDownload) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await this.#install({
|
|
||||||
...args,
|
|
||||||
browser: {
|
|
||||||
name: browser,
|
|
||||||
buildId: options.buildId,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
for (const install of result) {
|
|
||||||
if (install.status === 'rejected') {
|
|
||||||
throw install.reason;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
await this.#install(args);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.command('launch <browser>', 'Launch the specified browser', yargs => {
|
|
||||||
yargs
|
|
||||||
.example('$0 launch chrome@115.0.5790.170', 'Launch Chrome 115.0.5790.170')
|
|
||||||
.example('$0 launch firefox@112.0a1', 'Launch the Firefox browser identified by the milestone 112.0a1.')
|
|
||||||
.example('$0 launch chrome@115.0.5790.170 --detached', 'Launch the browser but detach the sub-processes.')
|
|
||||||
.example('$0 launch chrome@canary --system', 'Try to locate the Canary build of Chrome installed on the system and launch it.')
|
|
||||||
.example('$0 launch chrome@115.0.5790.170 -- --version', 'Launch Chrome 115.0.5790.170 and pass custom argument to the binary.');
|
|
||||||
const yargsWithExtraAgs = yargs.parserConfiguration({
|
|
||||||
'populate--': true,
|
|
||||||
// Yargs does not have the correct overload for this.
|
|
||||||
});
|
|
||||||
const yargsWithBrowserParam = this.#defineBrowserParameter(yargsWithExtraAgs, true);
|
|
||||||
const yargsWithPlatformParam = this.#definePlatformParameter(yargsWithBrowserParam);
|
|
||||||
return this.#definePathParameter(yargsWithPlatformParam)
|
|
||||||
.option('detached', {
|
|
||||||
type: 'boolean',
|
|
||||||
desc: 'Detach the child process.',
|
|
||||||
default: false,
|
|
||||||
})
|
|
||||||
.option('system', {
|
|
||||||
type: 'boolean',
|
|
||||||
desc: 'Search for a browser installed on the system instead of the cache folder.',
|
|
||||||
default: false,
|
|
||||||
})
|
|
||||||
.option('dumpio', {
|
|
||||||
type: 'boolean',
|
|
||||||
desc: "Forwards the browser's process stdout and stderr",
|
|
||||||
default: false,
|
|
||||||
});
|
|
||||||
}, async (args) => {
|
|
||||||
const extraArgs = args['--']?.filter(arg => {
|
|
||||||
return typeof arg === 'string';
|
|
||||||
});
|
|
||||||
args.browser.buildId = this.#resolvePinnedBrowserIfNeeded(args.browser.buildId, args.browser.name);
|
|
||||||
const executablePath = args.system
|
|
||||||
? (0, launch_js_1.computeSystemExecutablePath)({
|
|
||||||
browser: args.browser.name,
|
|
||||||
// TODO: throw an error if not a ChromeReleaseChannel is provided.
|
|
||||||
channel: args.browser.buildId,
|
|
||||||
platform: args.platform,
|
|
||||||
})
|
|
||||||
: (0, launch_js_1.computeExecutablePath)({
|
|
||||||
browser: args.browser.name,
|
|
||||||
buildId: args.browser.buildId,
|
|
||||||
cacheDir: args.path ?? this.#cachePath,
|
|
||||||
platform: args.platform,
|
|
||||||
});
|
|
||||||
(0, launch_js_1.launch)({
|
|
||||||
args: extraArgs,
|
|
||||||
executablePath,
|
|
||||||
dumpio: args.dumpio,
|
|
||||||
detached: args.detached,
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.command('clear', this.#allowCachePathOverride
|
|
||||||
? 'Removes all installed browsers from the specified cache directory'
|
|
||||||
: `Removes all installed browsers from ${this.#cachePath}`, yargs => {
|
|
||||||
return this.#definePathParameter(yargs, true);
|
|
||||||
}, async (args) => {
|
|
||||||
const cacheDir = args.path ?? this.#cachePath;
|
|
||||||
const rl = this.#rl ?? readline.createInterface({ input: node_process_1.stdin, output: node_process_1.stdout });
|
|
||||||
rl.question(`Do you want to permanently and recursively delete the content of ${cacheDir} (yes/No)? `, answer => {
|
|
||||||
rl.close();
|
|
||||||
if (!['y', 'yes'].includes(answer.toLowerCase().trim())) {
|
|
||||||
console.log('Cancelled.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const cache = new Cache_js_1.Cache(cacheDir);
|
|
||||||
cache.clear();
|
|
||||||
console.log(`${cacheDir} cleared.`);
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.command('list', 'List all installed browsers in the cache directory', yargs => {
|
|
||||||
yargs.example('$0 list', 'List all installed browsers in the cache directory');
|
|
||||||
if (this.#allowCachePathOverride) {
|
|
||||||
yargs.example('$0 list --path /tmp/my-browser-cache', 'List browsers installed in the specified cache directory');
|
|
||||||
}
|
|
||||||
return this.#definePathParameter(yargs);
|
|
||||||
}, async (args) => {
|
|
||||||
const cacheDir = args.path ?? this.#cachePath;
|
|
||||||
const cache = new Cache_js_1.Cache(cacheDir);
|
|
||||||
const browsers = cache.getInstalledBrowsers();
|
|
||||||
for (const browser of browsers) {
|
|
||||||
console.log(`${browser.browser}@${browser.buildId} (${browser.platform}) ${browser.executablePath}`);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.demandCommand(1)
|
|
||||||
.help();
|
|
||||||
}
|
|
||||||
#parseBrowser(version) {
|
|
||||||
return version.split('@').shift();
|
|
||||||
}
|
|
||||||
#parseBuildId(version) {
|
|
||||||
const parts = version.split('@');
|
|
||||||
return parts.length === 2
|
|
||||||
? parts[1]
|
|
||||||
: this.#pinnedBrowsers
|
|
||||||
? 'pinned'
|
|
||||||
: 'latest';
|
|
||||||
}
|
|
||||||
#resolvePinnedBrowserIfNeeded(buildId, browserName) {
|
|
||||||
if (buildId === 'pinned') {
|
|
||||||
const options = this.#pinnedBrowsers?.[browserName];
|
|
||||||
if (!options || !options.buildId) {
|
|
||||||
throw new Error(`No pinned version found for ${browserName}`);
|
|
||||||
}
|
|
||||||
return options.buildId;
|
|
||||||
}
|
|
||||||
return buildId;
|
|
||||||
}
|
|
||||||
async #install(args) {
|
|
||||||
if (!args.browser) {
|
|
||||||
throw new Error(`No browser arg provided`);
|
|
||||||
}
|
|
||||||
if (!args.platform) {
|
|
||||||
throw new Error(`Could not resolve the current platform`);
|
|
||||||
}
|
|
||||||
args.browser.buildId = this.#resolvePinnedBrowserIfNeeded(args.browser.buildId, args.browser.name);
|
|
||||||
const originalBuildId = args.browser.buildId;
|
|
||||||
args.browser.buildId = await (0, browser_data_js_1.resolveBuildId)(args.browser.name, args.platform, args.browser.buildId);
|
|
||||||
await (0, install_js_1.install)({
|
|
||||||
browser: args.browser.name,
|
|
||||||
buildId: args.browser.buildId,
|
|
||||||
platform: args.platform,
|
|
||||||
cacheDir: args.path ?? this.#cachePath,
|
|
||||||
downloadProgressCallback: 'default',
|
|
||||||
baseUrl: args.baseUrl,
|
|
||||||
buildIdAlias: originalBuildId !== args.browser.buildId ? originalBuildId : undefined,
|
|
||||||
installDeps: args.installDeps,
|
|
||||||
});
|
|
||||||
console.log(`${args.browser.name}@${args.browser.buildId} ${(0, launch_js_1.computeExecutablePath)({
|
|
||||||
browser: args.browser.name,
|
|
||||||
buildId: args.browser.buildId,
|
|
||||||
cacheDir: args.path ?? this.#cachePath,
|
|
||||||
platform: args.platform,
|
|
||||||
})}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.CLI = CLI;
|
|
||||||
//# sourceMappingURL=CLI.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/CLI.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/CLI.js.map
generated
vendored
File diff suppressed because one or more lines are too long
86
node_modules/@puppeteer/browsers/lib/cjs/Cache.d.ts
generated
vendored
86
node_modules/@puppeteer/browsers/lib/cjs/Cache.d.ts
generated
vendored
|
|
@ -1,86 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import { Browser, type BrowserPlatform } from './browser-data/browser-data.js';
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare class InstalledBrowser {
|
|
||||||
#private;
|
|
||||||
browser: Browser;
|
|
||||||
buildId: string;
|
|
||||||
platform: BrowserPlatform;
|
|
||||||
readonly executablePath: string;
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
constructor(cache: Cache, browser: Browser, buildId: string, platform: BrowserPlatform);
|
|
||||||
/**
|
|
||||||
* Path to the root of the installation folder. Use
|
|
||||||
* {@link computeExecutablePath} to get the path to the executable binary.
|
|
||||||
*/
|
|
||||||
get path(): string;
|
|
||||||
readMetadata(): Metadata;
|
|
||||||
writeMetadata(metadata: Metadata): void;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
export interface ComputeExecutablePathOptions {
|
|
||||||
/**
|
|
||||||
* Determines which platform the browser will be suited for.
|
|
||||||
*
|
|
||||||
* @defaultValue **Auto-detected.**
|
|
||||||
*/
|
|
||||||
platform?: BrowserPlatform;
|
|
||||||
/**
|
|
||||||
* Determines which browser to launch.
|
|
||||||
*/
|
|
||||||
browser: Browser;
|
|
||||||
/**
|
|
||||||
* Determines which buildId to download. BuildId should uniquely identify
|
|
||||||
* binaries and they are used for caching.
|
|
||||||
*/
|
|
||||||
buildId: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export interface Metadata {
|
|
||||||
aliases: Record<string, string>;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* The cache used by Puppeteer relies on the following structure:
|
|
||||||
*
|
|
||||||
* - rootDir
|
|
||||||
* -- <browser1> | browserRoot(browser1)
|
|
||||||
* ---- <platform>-<buildId> | installationDir()
|
|
||||||
* ------ the browser-platform-buildId
|
|
||||||
* ------ specific structure.
|
|
||||||
* -- <browser2> | browserRoot(browser2)
|
|
||||||
* ---- <platform>-<buildId> | installationDir()
|
|
||||||
* ------ the browser-platform-buildId
|
|
||||||
* ------ specific structure.
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
export declare class Cache {
|
|
||||||
#private;
|
|
||||||
constructor(rootDir: string);
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
get rootDir(): string;
|
|
||||||
browserRoot(browser: Browser): string;
|
|
||||||
metadataFile(browser: Browser): string;
|
|
||||||
readMetadata(browser: Browser): Metadata;
|
|
||||||
writeMetadata(browser: Browser, metadata: Metadata): void;
|
|
||||||
resolveAlias(browser: Browser, alias: string): string | undefined;
|
|
||||||
installationDir(browser: Browser, platform: BrowserPlatform, buildId: string): string;
|
|
||||||
clear(): void;
|
|
||||||
uninstall(browser: Browser, platform: BrowserPlatform, buildId: string): void;
|
|
||||||
getInstalledBrowsers(): InstalledBrowser[];
|
|
||||||
computeExecutablePath(options: ComputeExecutablePathOptions): string;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=Cache.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/Cache.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/Cache.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../src/Cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EACL,OAAO,EACP,KAAK,eAAe,EAGrB,MAAM,gCAAgC,CAAC;AAKxC;;GAEG;AACH,qBAAa,gBAAgB;;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAIhC;;OAEG;gBAED,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,eAAe;IAa3B;;;OAGG;IACH,IAAI,IAAI,IAAI,MAAM,CAMjB;IAED,YAAY,IAAI,QAAQ;IAIxB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;CAGxC;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IAEvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,KAAK;;gBAGJ,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAIrC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAItC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ;IAaxC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAMzD,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAUjE,eAAe,CACb,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,MAAM;IAIT,KAAK,IAAI,IAAI;IASb,SAAS,CACP,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,IAAI;IAeP,oBAAoB,IAAI,gBAAgB,EAAE;IA+B1C,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM;CA0BrE"}
|
|
||||||
191
node_modules/@puppeteer/browsers/lib/cjs/Cache.js
generated
vendored
191
node_modules/@puppeteer/browsers/lib/cjs/Cache.js
generated
vendored
|
|
@ -1,191 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.Cache = exports.InstalledBrowser = void 0;
|
|
||||||
const node_fs_1 = __importDefault(require("node:fs"));
|
|
||||||
const node_os_1 = __importDefault(require("node:os"));
|
|
||||||
const node_path_1 = __importDefault(require("node:path"));
|
|
||||||
const debug_1 = __importDefault(require("debug"));
|
|
||||||
const browser_data_js_1 = require("./browser-data/browser-data.js");
|
|
||||||
const detectPlatform_js_1 = require("./detectPlatform.js");
|
|
||||||
const debugCache = (0, debug_1.default)('puppeteer:browsers:cache');
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
class InstalledBrowser {
|
|
||||||
browser;
|
|
||||||
buildId;
|
|
||||||
platform;
|
|
||||||
executablePath;
|
|
||||||
#cache;
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
constructor(cache, browser, buildId, platform) {
|
|
||||||
this.#cache = cache;
|
|
||||||
this.browser = browser;
|
|
||||||
this.buildId = buildId;
|
|
||||||
this.platform = platform;
|
|
||||||
this.executablePath = cache.computeExecutablePath({
|
|
||||||
browser,
|
|
||||||
buildId,
|
|
||||||
platform,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Path to the root of the installation folder. Use
|
|
||||||
* {@link computeExecutablePath} to get the path to the executable binary.
|
|
||||||
*/
|
|
||||||
get path() {
|
|
||||||
return this.#cache.installationDir(this.browser, this.platform, this.buildId);
|
|
||||||
}
|
|
||||||
readMetadata() {
|
|
||||||
return this.#cache.readMetadata(this.browser);
|
|
||||||
}
|
|
||||||
writeMetadata(metadata) {
|
|
||||||
this.#cache.writeMetadata(this.browser, metadata);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.InstalledBrowser = InstalledBrowser;
|
|
||||||
/**
|
|
||||||
* The cache used by Puppeteer relies on the following structure:
|
|
||||||
*
|
|
||||||
* - rootDir
|
|
||||||
* -- <browser1> | browserRoot(browser1)
|
|
||||||
* ---- <platform>-<buildId> | installationDir()
|
|
||||||
* ------ the browser-platform-buildId
|
|
||||||
* ------ specific structure.
|
|
||||||
* -- <browser2> | browserRoot(browser2)
|
|
||||||
* ---- <platform>-<buildId> | installationDir()
|
|
||||||
* ------ the browser-platform-buildId
|
|
||||||
* ------ specific structure.
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
class Cache {
|
|
||||||
#rootDir;
|
|
||||||
constructor(rootDir) {
|
|
||||||
this.#rootDir = rootDir;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
get rootDir() {
|
|
||||||
return this.#rootDir;
|
|
||||||
}
|
|
||||||
browserRoot(browser) {
|
|
||||||
return node_path_1.default.join(this.#rootDir, browser);
|
|
||||||
}
|
|
||||||
metadataFile(browser) {
|
|
||||||
return node_path_1.default.join(this.browserRoot(browser), '.metadata');
|
|
||||||
}
|
|
||||||
readMetadata(browser) {
|
|
||||||
const metatadaPath = this.metadataFile(browser);
|
|
||||||
if (!node_fs_1.default.existsSync(metatadaPath)) {
|
|
||||||
return { aliases: {} };
|
|
||||||
}
|
|
||||||
// TODO: add type-safe parsing.
|
|
||||||
const data = JSON.parse(node_fs_1.default.readFileSync(metatadaPath, 'utf8'));
|
|
||||||
if (typeof data !== 'object') {
|
|
||||||
throw new Error('.metadata is not an object');
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
writeMetadata(browser, metadata) {
|
|
||||||
const metatadaPath = this.metadataFile(browser);
|
|
||||||
node_fs_1.default.mkdirSync(node_path_1.default.dirname(metatadaPath), { recursive: true });
|
|
||||||
node_fs_1.default.writeFileSync(metatadaPath, JSON.stringify(metadata, null, 2));
|
|
||||||
}
|
|
||||||
resolveAlias(browser, alias) {
|
|
||||||
const metadata = this.readMetadata(browser);
|
|
||||||
if (alias === 'latest') {
|
|
||||||
return Object.values(metadata.aliases || {})
|
|
||||||
.sort((0, browser_data_js_1.getVersionComparator)(browser))
|
|
||||||
.at(-1);
|
|
||||||
}
|
|
||||||
return metadata.aliases[alias];
|
|
||||||
}
|
|
||||||
installationDir(browser, platform, buildId) {
|
|
||||||
return node_path_1.default.join(this.browserRoot(browser), `${platform}-${buildId}`);
|
|
||||||
}
|
|
||||||
clear() {
|
|
||||||
node_fs_1.default.rmSync(this.#rootDir, {
|
|
||||||
force: true,
|
|
||||||
recursive: true,
|
|
||||||
maxRetries: 10,
|
|
||||||
retryDelay: 500,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
uninstall(browser, platform, buildId) {
|
|
||||||
const metadata = this.readMetadata(browser);
|
|
||||||
for (const alias of Object.keys(metadata.aliases)) {
|
|
||||||
if (metadata.aliases[alias] === buildId) {
|
|
||||||
delete metadata.aliases[alias];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
node_fs_1.default.rmSync(this.installationDir(browser, platform, buildId), {
|
|
||||||
force: true,
|
|
||||||
recursive: true,
|
|
||||||
maxRetries: 10,
|
|
||||||
retryDelay: 500,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
getInstalledBrowsers() {
|
|
||||||
if (!node_fs_1.default.existsSync(this.#rootDir)) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
const types = node_fs_1.default.readdirSync(this.#rootDir);
|
|
||||||
const browsers = types.filter((t) => {
|
|
||||||
return Object.values(browser_data_js_1.Browser).includes(t);
|
|
||||||
});
|
|
||||||
return browsers.flatMap(browser => {
|
|
||||||
const files = node_fs_1.default.readdirSync(this.browserRoot(browser));
|
|
||||||
return files
|
|
||||||
.map(file => {
|
|
||||||
const result = parseFolderPath(node_path_1.default.join(this.browserRoot(browser), file));
|
|
||||||
if (!result) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return new InstalledBrowser(this, browser, result.buildId, result.platform);
|
|
||||||
})
|
|
||||||
.filter((item) => {
|
|
||||||
return item !== null;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
computeExecutablePath(options) {
|
|
||||||
options.platform ??= (0, detectPlatform_js_1.detectBrowserPlatform)();
|
|
||||||
if (!options.platform) {
|
|
||||||
throw new Error(`Cannot download a binary for the provided platform: ${node_os_1.default.platform()} (${node_os_1.default.arch()})`);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
options.buildId =
|
|
||||||
this.resolveAlias(options.browser, options.buildId) ?? options.buildId;
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
debugCache('could not read .metadata file for the browser');
|
|
||||||
}
|
|
||||||
const installationDir = this.installationDir(options.browser, options.platform, options.buildId);
|
|
||||||
return node_path_1.default.join(installationDir, browser_data_js_1.executablePathByBrowser[options.browser](options.platform, options.buildId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.Cache = Cache;
|
|
||||||
function parseFolderPath(folderPath) {
|
|
||||||
const name = node_path_1.default.basename(folderPath);
|
|
||||||
const splits = name.split('-');
|
|
||||||
if (splits.length !== 2) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const [platform, buildId] = splits;
|
|
||||||
if (!buildId || !platform) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return { platform, buildId };
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=Cache.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/Cache.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/Cache.js.map
generated
vendored
File diff suppressed because one or more lines are too long
61
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.d.ts
generated
vendored
61
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.d.ts
generated
vendored
|
|
@ -1,61 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import * as chromeHeadlessShell from './chrome-headless-shell.js';
|
|
||||||
import * as chrome from './chrome.js';
|
|
||||||
import * as chromedriver from './chromedriver.js';
|
|
||||||
import * as chromium from './chromium.js';
|
|
||||||
import * as firefox from './firefox.js';
|
|
||||||
import { Browser, BrowserPlatform, BrowserTag, ChromeReleaseChannel, type ProfileOptions } from './types.js';
|
|
||||||
export type { ProfileOptions };
|
|
||||||
export declare const downloadUrls: {
|
|
||||||
chromedriver: typeof chromedriver.resolveDownloadUrl;
|
|
||||||
"chrome-headless-shell": typeof chromeHeadlessShell.resolveDownloadUrl;
|
|
||||||
chrome: typeof chrome.resolveDownloadUrl;
|
|
||||||
chromium: typeof chromium.resolveDownloadUrl;
|
|
||||||
firefox: typeof firefox.resolveDownloadUrl;
|
|
||||||
};
|
|
||||||
export declare const downloadPaths: {
|
|
||||||
chromedriver: typeof chromedriver.resolveDownloadPath;
|
|
||||||
"chrome-headless-shell": typeof chromeHeadlessShell.resolveDownloadPath;
|
|
||||||
chrome: typeof chrome.resolveDownloadPath;
|
|
||||||
chromium: typeof chromium.resolveDownloadPath;
|
|
||||||
firefox: typeof firefox.resolveDownloadPath;
|
|
||||||
};
|
|
||||||
export declare const executablePathByBrowser: {
|
|
||||||
chromedriver: typeof chromedriver.relativeExecutablePath;
|
|
||||||
"chrome-headless-shell": typeof chromeHeadlessShell.relativeExecutablePath;
|
|
||||||
chrome: typeof chrome.relativeExecutablePath;
|
|
||||||
chromium: typeof chromium.relativeExecutablePath;
|
|
||||||
firefox: typeof firefox.relativeExecutablePath;
|
|
||||||
};
|
|
||||||
export declare const versionComparators: {
|
|
||||||
chromedriver: typeof chromeHeadlessShell.compareVersions;
|
|
||||||
"chrome-headless-shell": typeof chromeHeadlessShell.compareVersions;
|
|
||||||
chrome: typeof chromeHeadlessShell.compareVersions;
|
|
||||||
chromium: typeof chromium.compareVersions;
|
|
||||||
firefox: typeof firefox.compareVersions;
|
|
||||||
};
|
|
||||||
export { Browser, BrowserPlatform, ChromeReleaseChannel };
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function resolveBuildId(browser: Browser, platform: BrowserPlatform, tag: string | BrowserTag): Promise<string>;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function createProfile(browser: Browser, opts: ProfileOptions): Promise<void>;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function resolveSystemExecutablePath(browser: Browser, platform: BrowserPlatform, channel: ChromeReleaseChannel): string;
|
|
||||||
/**
|
|
||||||
* Returns a version comparator for the given browser that can be used to sort
|
|
||||||
* browser versions.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function getVersionComparator(browser: Browser): (a: string, b: string) => number;
|
|
||||||
//# sourceMappingURL=browser-data.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"browser-data.d.ts","sourceRoot":"","sources":["../../../src/browser-data/browser-data.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,mBAAmB,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,EACL,OAAO,EACP,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAC,cAAc,EAAC,CAAC;AAE7B,eAAO,MAAM,YAAY;;;;;;CAMxB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;CAMzB,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;CAMnC,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;CAM9B,CAAC;AAEF,OAAO,EAAC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAC,CAAC;AA+GxD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,eAAe,EACzB,GAAG,EAAE,MAAM,GAAG,UAAU,GACvB,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAYR;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,GACf,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAElC"}
|
|
||||||
241
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.js
generated
vendored
241
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.js
generated
vendored
|
|
@ -1,241 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
||||||
if (k2 === undefined) k2 = k;
|
|
||||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
||||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
||||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
||||||
}
|
|
||||||
Object.defineProperty(o, k2, desc);
|
|
||||||
}) : (function(o, m, k, k2) {
|
|
||||||
if (k2 === undefined) k2 = k;
|
|
||||||
o[k2] = m[k];
|
|
||||||
}));
|
|
||||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
||||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
||||||
}) : function(o, v) {
|
|
||||||
o["default"] = v;
|
|
||||||
});
|
|
||||||
var __importStar = (this && this.__importStar) || (function () {
|
|
||||||
var ownKeys = function(o) {
|
|
||||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
||||||
var ar = [];
|
|
||||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
||||||
return ar;
|
|
||||||
};
|
|
||||||
return ownKeys(o);
|
|
||||||
};
|
|
||||||
return function (mod) {
|
|
||||||
if (mod && mod.__esModule) return mod;
|
|
||||||
var result = {};
|
|
||||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
||||||
__setModuleDefault(result, mod);
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.ChromeReleaseChannel = exports.BrowserPlatform = exports.Browser = exports.versionComparators = exports.executablePathByBrowser = exports.downloadPaths = exports.downloadUrls = void 0;
|
|
||||||
exports.resolveBuildId = resolveBuildId;
|
|
||||||
exports.createProfile = createProfile;
|
|
||||||
exports.resolveSystemExecutablePath = resolveSystemExecutablePath;
|
|
||||||
exports.getVersionComparator = getVersionComparator;
|
|
||||||
const chromeHeadlessShell = __importStar(require("./chrome-headless-shell.js"));
|
|
||||||
const chrome = __importStar(require("./chrome.js"));
|
|
||||||
const chromedriver = __importStar(require("./chromedriver.js"));
|
|
||||||
const chromium = __importStar(require("./chromium.js"));
|
|
||||||
const firefox = __importStar(require("./firefox.js"));
|
|
||||||
const types_js_1 = require("./types.js");
|
|
||||||
Object.defineProperty(exports, "Browser", { enumerable: true, get: function () { return types_js_1.Browser; } });
|
|
||||||
Object.defineProperty(exports, "BrowserPlatform", { enumerable: true, get: function () { return types_js_1.BrowserPlatform; } });
|
|
||||||
Object.defineProperty(exports, "ChromeReleaseChannel", { enumerable: true, get: function () { return types_js_1.ChromeReleaseChannel; } });
|
|
||||||
exports.downloadUrls = {
|
|
||||||
[types_js_1.Browser.CHROMEDRIVER]: chromedriver.resolveDownloadUrl,
|
|
||||||
[types_js_1.Browser.CHROMEHEADLESSSHELL]: chromeHeadlessShell.resolveDownloadUrl,
|
|
||||||
[types_js_1.Browser.CHROME]: chrome.resolveDownloadUrl,
|
|
||||||
[types_js_1.Browser.CHROMIUM]: chromium.resolveDownloadUrl,
|
|
||||||
[types_js_1.Browser.FIREFOX]: firefox.resolveDownloadUrl,
|
|
||||||
};
|
|
||||||
exports.downloadPaths = {
|
|
||||||
[types_js_1.Browser.CHROMEDRIVER]: chromedriver.resolveDownloadPath,
|
|
||||||
[types_js_1.Browser.CHROMEHEADLESSSHELL]: chromeHeadlessShell.resolveDownloadPath,
|
|
||||||
[types_js_1.Browser.CHROME]: chrome.resolveDownloadPath,
|
|
||||||
[types_js_1.Browser.CHROMIUM]: chromium.resolveDownloadPath,
|
|
||||||
[types_js_1.Browser.FIREFOX]: firefox.resolveDownloadPath,
|
|
||||||
};
|
|
||||||
exports.executablePathByBrowser = {
|
|
||||||
[types_js_1.Browser.CHROMEDRIVER]: chromedriver.relativeExecutablePath,
|
|
||||||
[types_js_1.Browser.CHROMEHEADLESSSHELL]: chromeHeadlessShell.relativeExecutablePath,
|
|
||||||
[types_js_1.Browser.CHROME]: chrome.relativeExecutablePath,
|
|
||||||
[types_js_1.Browser.CHROMIUM]: chromium.relativeExecutablePath,
|
|
||||||
[types_js_1.Browser.FIREFOX]: firefox.relativeExecutablePath,
|
|
||||||
};
|
|
||||||
exports.versionComparators = {
|
|
||||||
[types_js_1.Browser.CHROMEDRIVER]: chromedriver.compareVersions,
|
|
||||||
[types_js_1.Browser.CHROMEHEADLESSSHELL]: chromeHeadlessShell.compareVersions,
|
|
||||||
[types_js_1.Browser.CHROME]: chrome.compareVersions,
|
|
||||||
[types_js_1.Browser.CHROMIUM]: chromium.compareVersions,
|
|
||||||
[types_js_1.Browser.FIREFOX]: firefox.compareVersions,
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
async function resolveBuildIdForBrowserTag(browser, platform, tag) {
|
|
||||||
switch (browser) {
|
|
||||||
case types_js_1.Browser.FIREFOX:
|
|
||||||
switch (tag) {
|
|
||||||
case types_js_1.BrowserTag.LATEST:
|
|
||||||
return await firefox.resolveBuildId(firefox.FirefoxChannel.NIGHTLY);
|
|
||||||
case types_js_1.BrowserTag.BETA:
|
|
||||||
return await firefox.resolveBuildId(firefox.FirefoxChannel.BETA);
|
|
||||||
case types_js_1.BrowserTag.NIGHTLY:
|
|
||||||
return await firefox.resolveBuildId(firefox.FirefoxChannel.NIGHTLY);
|
|
||||||
case types_js_1.BrowserTag.DEVEDITION:
|
|
||||||
return await firefox.resolveBuildId(firefox.FirefoxChannel.DEVEDITION);
|
|
||||||
case types_js_1.BrowserTag.STABLE:
|
|
||||||
return await firefox.resolveBuildId(firefox.FirefoxChannel.STABLE);
|
|
||||||
case types_js_1.BrowserTag.ESR:
|
|
||||||
return await firefox.resolveBuildId(firefox.FirefoxChannel.ESR);
|
|
||||||
case types_js_1.BrowserTag.CANARY:
|
|
||||||
case types_js_1.BrowserTag.DEV:
|
|
||||||
throw new Error(`${tag.toUpperCase()} is not available for Firefox`);
|
|
||||||
}
|
|
||||||
case types_js_1.Browser.CHROME: {
|
|
||||||
switch (tag) {
|
|
||||||
case types_js_1.BrowserTag.LATEST:
|
|
||||||
return await chrome.resolveBuildId(types_js_1.ChromeReleaseChannel.CANARY);
|
|
||||||
case types_js_1.BrowserTag.BETA:
|
|
||||||
return await chrome.resolveBuildId(types_js_1.ChromeReleaseChannel.BETA);
|
|
||||||
case types_js_1.BrowserTag.CANARY:
|
|
||||||
return await chrome.resolveBuildId(types_js_1.ChromeReleaseChannel.CANARY);
|
|
||||||
case types_js_1.BrowserTag.DEV:
|
|
||||||
return await chrome.resolveBuildId(types_js_1.ChromeReleaseChannel.DEV);
|
|
||||||
case types_js_1.BrowserTag.STABLE:
|
|
||||||
return await chrome.resolveBuildId(types_js_1.ChromeReleaseChannel.STABLE);
|
|
||||||
case types_js_1.BrowserTag.NIGHTLY:
|
|
||||||
case types_js_1.BrowserTag.DEVEDITION:
|
|
||||||
case types_js_1.BrowserTag.ESR:
|
|
||||||
throw new Error(`${tag.toUpperCase()} is not available for Chrome`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case types_js_1.Browser.CHROMEDRIVER: {
|
|
||||||
switch (tag) {
|
|
||||||
case types_js_1.BrowserTag.LATEST:
|
|
||||||
case types_js_1.BrowserTag.CANARY:
|
|
||||||
return await chromedriver.resolveBuildId(types_js_1.ChromeReleaseChannel.CANARY);
|
|
||||||
case types_js_1.BrowserTag.BETA:
|
|
||||||
return await chromedriver.resolveBuildId(types_js_1.ChromeReleaseChannel.BETA);
|
|
||||||
case types_js_1.BrowserTag.DEV:
|
|
||||||
return await chromedriver.resolveBuildId(types_js_1.ChromeReleaseChannel.DEV);
|
|
||||||
case types_js_1.BrowserTag.STABLE:
|
|
||||||
return await chromedriver.resolveBuildId(types_js_1.ChromeReleaseChannel.STABLE);
|
|
||||||
case types_js_1.BrowserTag.NIGHTLY:
|
|
||||||
case types_js_1.BrowserTag.DEVEDITION:
|
|
||||||
case types_js_1.BrowserTag.ESR:
|
|
||||||
throw new Error(`${tag.toUpperCase()} is not available for ChromeDriver`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case types_js_1.Browser.CHROMEHEADLESSSHELL: {
|
|
||||||
switch (tag) {
|
|
||||||
case types_js_1.BrowserTag.LATEST:
|
|
||||||
case types_js_1.BrowserTag.CANARY:
|
|
||||||
return await chromeHeadlessShell.resolveBuildId(types_js_1.ChromeReleaseChannel.CANARY);
|
|
||||||
case types_js_1.BrowserTag.BETA:
|
|
||||||
return await chromeHeadlessShell.resolveBuildId(types_js_1.ChromeReleaseChannel.BETA);
|
|
||||||
case types_js_1.BrowserTag.DEV:
|
|
||||||
return await chromeHeadlessShell.resolveBuildId(types_js_1.ChromeReleaseChannel.DEV);
|
|
||||||
case types_js_1.BrowserTag.STABLE:
|
|
||||||
return await chromeHeadlessShell.resolveBuildId(types_js_1.ChromeReleaseChannel.STABLE);
|
|
||||||
case types_js_1.BrowserTag.NIGHTLY:
|
|
||||||
case types_js_1.BrowserTag.DEVEDITION:
|
|
||||||
case types_js_1.BrowserTag.ESR:
|
|
||||||
throw new Error(`${tag} is not available for chrome-headless-shell`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case types_js_1.Browser.CHROMIUM:
|
|
||||||
switch (tag) {
|
|
||||||
case types_js_1.BrowserTag.LATEST:
|
|
||||||
return await chromium.resolveBuildId(platform);
|
|
||||||
case types_js_1.BrowserTag.NIGHTLY:
|
|
||||||
case types_js_1.BrowserTag.CANARY:
|
|
||||||
case types_js_1.BrowserTag.DEV:
|
|
||||||
case types_js_1.BrowserTag.DEVEDITION:
|
|
||||||
case types_js_1.BrowserTag.BETA:
|
|
||||||
case types_js_1.BrowserTag.STABLE:
|
|
||||||
case types_js_1.BrowserTag.ESR:
|
|
||||||
throw new Error(`${tag} is not supported for Chromium. Use 'latest' instead.`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
async function resolveBuildId(browser, platform, tag) {
|
|
||||||
const browserTag = tag;
|
|
||||||
if (Object.values(types_js_1.BrowserTag).includes(browserTag)) {
|
|
||||||
return await resolveBuildIdForBrowserTag(browser, platform, browserTag);
|
|
||||||
}
|
|
||||||
switch (browser) {
|
|
||||||
case types_js_1.Browser.FIREFOX:
|
|
||||||
return tag;
|
|
||||||
case types_js_1.Browser.CHROME:
|
|
||||||
const chromeResult = await chrome.resolveBuildId(tag);
|
|
||||||
if (chromeResult) {
|
|
||||||
return chromeResult;
|
|
||||||
}
|
|
||||||
return tag;
|
|
||||||
case types_js_1.Browser.CHROMEDRIVER:
|
|
||||||
const chromeDriverResult = await chromedriver.resolveBuildId(tag);
|
|
||||||
if (chromeDriverResult) {
|
|
||||||
return chromeDriverResult;
|
|
||||||
}
|
|
||||||
return tag;
|
|
||||||
case types_js_1.Browser.CHROMEHEADLESSSHELL:
|
|
||||||
const chromeHeadlessShellResult = await chromeHeadlessShell.resolveBuildId(tag);
|
|
||||||
if (chromeHeadlessShellResult) {
|
|
||||||
return chromeHeadlessShellResult;
|
|
||||||
}
|
|
||||||
return tag;
|
|
||||||
case types_js_1.Browser.CHROMIUM:
|
|
||||||
return tag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
async function createProfile(browser, opts) {
|
|
||||||
switch (browser) {
|
|
||||||
case types_js_1.Browser.FIREFOX:
|
|
||||||
return await firefox.createProfile(opts);
|
|
||||||
case types_js_1.Browser.CHROME:
|
|
||||||
case types_js_1.Browser.CHROMIUM:
|
|
||||||
throw new Error(`Profile creation is not support for ${browser} yet`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
function resolveSystemExecutablePath(browser, platform, channel) {
|
|
||||||
switch (browser) {
|
|
||||||
case types_js_1.Browser.CHROMEDRIVER:
|
|
||||||
case types_js_1.Browser.CHROMEHEADLESSSHELL:
|
|
||||||
case types_js_1.Browser.FIREFOX:
|
|
||||||
case types_js_1.Browser.CHROMIUM:
|
|
||||||
throw new Error(`System browser detection is not supported for ${browser} yet.`);
|
|
||||||
case types_js_1.Browser.CHROME:
|
|
||||||
return chrome.resolveSystemExecutablePath(platform, channel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a version comparator for the given browser that can be used to sort
|
|
||||||
* browser versions.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
function getVersionComparator(browser) {
|
|
||||||
return exports.versionComparators[browser];
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=browser-data.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.js.map
generated
vendored
File diff suppressed because one or more lines are too long
6
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.d.ts
generated
vendored
6
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.d.ts
generated
vendored
|
|
@ -1,6 +0,0 @@
|
||||||
import { BrowserPlatform } from './types.js';
|
|
||||||
export declare function resolveDownloadUrl(platform: BrowserPlatform, buildId: string, baseUrl?: string): string;
|
|
||||||
export declare function resolveDownloadPath(platform: BrowserPlatform, buildId: string): string[];
|
|
||||||
export declare function relativeExecutablePath(platform: BrowserPlatform, _buildId: string): string;
|
|
||||||
export { resolveBuildId, compareVersions } from './chrome.js';
|
|
||||||
//# sourceMappingURL=chrome-headless-shell.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"chrome-headless-shell.d.ts","sourceRoot":"","sources":["../../../src/browser-data/chrome-headless-shell.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAkB3C,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,SAA6D,GACnE,MAAM,CAER;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAMV;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,GACf,MAAM,CAqBR;AAED,OAAO,EAAC,cAAc,EAAE,eAAe,EAAC,MAAM,aAAa,CAAC"}
|
|
||||||
58
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.js
generated
vendored
58
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.js
generated
vendored
|
|
@ -1,58 +0,0 @@
|
||||||
"use strict";
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.compareVersions = exports.resolveBuildId = void 0;
|
|
||||||
exports.resolveDownloadUrl = resolveDownloadUrl;
|
|
||||||
exports.resolveDownloadPath = resolveDownloadPath;
|
|
||||||
exports.relativeExecutablePath = relativeExecutablePath;
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
const node_path_1 = __importDefault(require("node:path"));
|
|
||||||
const types_js_1 = require("./types.js");
|
|
||||||
function folder(platform) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return 'linux64';
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
return 'mac-arm64';
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
return 'mac-x64';
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
return 'win32';
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return 'win64';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function resolveDownloadUrl(platform, buildId, baseUrl = 'https://storage.googleapis.com/chrome-for-testing-public') {
|
|
||||||
return `${baseUrl}/${resolveDownloadPath(platform, buildId).join('/')}`;
|
|
||||||
}
|
|
||||||
function resolveDownloadPath(platform, buildId) {
|
|
||||||
return [
|
|
||||||
buildId,
|
|
||||||
folder(platform),
|
|
||||||
`chrome-headless-shell-${folder(platform)}.zip`,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
function relativeExecutablePath(platform, _buildId) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
return node_path_1.default.join('chrome-headless-shell-' + folder(platform), 'chrome-headless-shell');
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return node_path_1.default.join('chrome-headless-shell-linux64', 'chrome-headless-shell');
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return node_path_1.default.join('chrome-headless-shell-' + folder(platform), 'chrome-headless-shell.exe');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var chrome_js_1 = require("./chrome.js");
|
|
||||||
Object.defineProperty(exports, "resolveBuildId", { enumerable: true, get: function () { return chrome_js_1.resolveBuildId; } });
|
|
||||||
Object.defineProperty(exports, "compareVersions", { enumerable: true, get: function () { return chrome_js_1.compareVersions; } });
|
|
||||||
//# sourceMappingURL=chrome-headless-shell.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"chrome-headless-shell.js","sourceRoot":"","sources":["../../../src/browser-data/chrome-headless-shell.ts"],"names":[],"mappings":";;;;;;AAyBA,gDAMC;AAED,kDASC;AAED,wDAwBC;AApED;;;;GAIG;AACH,0DAA6B;AAE7B,yCAA2C;AAE3C,SAAS,MAAM,CAAC,QAAyB;IACvC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,0BAAe,CAAC,SAAS,CAAC;QAC/B,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,SAAS,CAAC;QACnB,KAAK,0BAAe,CAAC,OAAO;YAC1B,OAAO,WAAW,CAAC;QACrB,KAAK,0BAAe,CAAC,GAAG;YACtB,OAAO,SAAS,CAAC;QACnB,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,OAAO,CAAC;QACjB,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAChC,QAAyB,EACzB,OAAe,EACf,OAAO,GAAG,0DAA0D;IAEpE,OAAO,GAAG,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,SAAgB,mBAAmB,CACjC,QAAyB,EACzB,OAAe;IAEf,OAAO;QACL,OAAO;QACP,MAAM,CAAC,QAAQ,CAAC;QAChB,yBAAyB,MAAM,CAAC,QAAQ,CAAC,MAAM;KAChD,CAAC;AACJ,CAAC;AAED,SAAgB,sBAAsB,CACpC,QAAyB,EACzB,QAAgB;IAEhB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,0BAAe,CAAC,GAAG,CAAC;QACzB,KAAK,0BAAe,CAAC,OAAO;YAC1B,OAAO,mBAAI,CAAC,IAAI,CACd,wBAAwB,GAAG,MAAM,CAAC,QAAQ,CAAC,EAC3C,uBAAuB,CACxB,CAAC;QACJ,KAAK,0BAAe,CAAC,SAAS,CAAC;QAC/B,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,mBAAI,CAAC,IAAI,CACd,+BAA+B,EAC/B,uBAAuB,CACxB,CAAC;QACJ,KAAK,0BAAe,CAAC,KAAK,CAAC;QAC3B,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,mBAAI,CAAC,IAAI,CACd,wBAAwB,GAAG,MAAM,CAAC,QAAQ,CAAC,EAC3C,2BAA2B,CAC5B,CAAC;IACN,CAAC;AACH,CAAC;AAED,yCAA4D;AAApD,2GAAA,cAAc,OAAA;AAAE,4GAAA,eAAe,OAAA"}
|
|
||||||
30
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.d.ts
generated
vendored
30
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.d.ts
generated
vendored
|
|
@ -1,30 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import { BrowserPlatform, ChromeReleaseChannel } from './types.js';
|
|
||||||
export declare function resolveDownloadUrl(platform: BrowserPlatform, buildId: string, baseUrl?: string): string;
|
|
||||||
export declare function resolveDownloadPath(platform: BrowserPlatform, buildId: string): string[];
|
|
||||||
export declare function relativeExecutablePath(platform: BrowserPlatform, _buildId: string): string;
|
|
||||||
export declare function getLastKnownGoodReleaseForChannel(channel: ChromeReleaseChannel): Promise<{
|
|
||||||
version: string;
|
|
||||||
revision: string;
|
|
||||||
}>;
|
|
||||||
export declare function getLastKnownGoodReleaseForMilestone(milestone: string): Promise<{
|
|
||||||
version: string;
|
|
||||||
revision: string;
|
|
||||||
} | undefined>;
|
|
||||||
export declare function getLastKnownGoodReleaseForBuild(
|
|
||||||
/**
|
|
||||||
* @example `112.0.23`,
|
|
||||||
*/
|
|
||||||
buildPrefix: string): Promise<{
|
|
||||||
version: string;
|
|
||||||
revision: string;
|
|
||||||
} | undefined>;
|
|
||||||
export declare function resolveBuildId(channel: ChromeReleaseChannel): Promise<string>;
|
|
||||||
export declare function resolveBuildId(channel: string): Promise<string | undefined>;
|
|
||||||
export declare function resolveSystemExecutablePath(platform: BrowserPlatform, channel: ChromeReleaseChannel): string;
|
|
||||||
export declare function compareVersions(a: string, b: string): number;
|
|
||||||
//# sourceMappingURL=chrome.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../../src/browser-data/chrome.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAC,eAAe,EAAE,oBAAoB,EAAC,MAAM,YAAY,CAAC;AAkBjE,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,SAA6D,GACnE,MAAM,CAER;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAEV;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,GACf,MAAM,CAkBR;AAED,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAAC,CAsB9C;AAED,wBAAsB,mCAAmC,CACvD,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAAC,CAW1D;AAED,wBAAsB,+BAA+B;AACnD;;GAEG;AACH,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAAC,CAW1D;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAAC;AACnB,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAwB/B,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAuCR;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAc5D"}
|
|
||||||
149
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.js
generated
vendored
149
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.js
generated
vendored
|
|
@ -1,149 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.resolveDownloadUrl = resolveDownloadUrl;
|
|
||||||
exports.resolveDownloadPath = resolveDownloadPath;
|
|
||||||
exports.relativeExecutablePath = relativeExecutablePath;
|
|
||||||
exports.getLastKnownGoodReleaseForChannel = getLastKnownGoodReleaseForChannel;
|
|
||||||
exports.getLastKnownGoodReleaseForMilestone = getLastKnownGoodReleaseForMilestone;
|
|
||||||
exports.getLastKnownGoodReleaseForBuild = getLastKnownGoodReleaseForBuild;
|
|
||||||
exports.resolveBuildId = resolveBuildId;
|
|
||||||
exports.resolveSystemExecutablePath = resolveSystemExecutablePath;
|
|
||||||
exports.compareVersions = compareVersions;
|
|
||||||
const node_path_1 = __importDefault(require("node:path"));
|
|
||||||
const semver_1 = __importDefault(require("semver"));
|
|
||||||
const httpUtil_js_1 = require("../httpUtil.js");
|
|
||||||
const types_js_1 = require("./types.js");
|
|
||||||
function folder(platform) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return 'linux64';
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
return 'mac-arm64';
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
return 'mac-x64';
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
return 'win32';
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return 'win64';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function resolveDownloadUrl(platform, buildId, baseUrl = 'https://storage.googleapis.com/chrome-for-testing-public') {
|
|
||||||
return `${baseUrl}/${resolveDownloadPath(platform, buildId).join('/')}`;
|
|
||||||
}
|
|
||||||
function resolveDownloadPath(platform, buildId) {
|
|
||||||
return [buildId, folder(platform), `chrome-${folder(platform)}.zip`];
|
|
||||||
}
|
|
||||||
function relativeExecutablePath(platform, _buildId) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
return node_path_1.default.join('chrome-' + folder(platform), 'Google Chrome for Testing.app', 'Contents', 'MacOS', 'Google Chrome for Testing');
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return node_path_1.default.join('chrome-linux64', 'chrome');
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return node_path_1.default.join('chrome-' + folder(platform), 'chrome.exe');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async function getLastKnownGoodReleaseForChannel(channel) {
|
|
||||||
const data = (await (0, httpUtil_js_1.getJSON)(new URL('https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions.json')));
|
|
||||||
for (const channel of Object.keys(data.channels)) {
|
|
||||||
data.channels[channel.toLowerCase()] = data.channels[channel];
|
|
||||||
delete data.channels[channel];
|
|
||||||
}
|
|
||||||
return data.channels[channel];
|
|
||||||
}
|
|
||||||
async function getLastKnownGoodReleaseForMilestone(milestone) {
|
|
||||||
const data = (await (0, httpUtil_js_1.getJSON)(new URL('https://googlechromelabs.github.io/chrome-for-testing/latest-versions-per-milestone.json')));
|
|
||||||
return data.milestones[milestone];
|
|
||||||
}
|
|
||||||
async function getLastKnownGoodReleaseForBuild(
|
|
||||||
/**
|
|
||||||
* @example `112.0.23`,
|
|
||||||
*/
|
|
||||||
buildPrefix) {
|
|
||||||
const data = (await (0, httpUtil_js_1.getJSON)(new URL('https://googlechromelabs.github.io/chrome-for-testing/latest-patch-versions-per-build.json')));
|
|
||||||
return data.builds[buildPrefix];
|
|
||||||
}
|
|
||||||
async function resolveBuildId(channel) {
|
|
||||||
if (Object.values(types_js_1.ChromeReleaseChannel).includes(channel)) {
|
|
||||||
return (await getLastKnownGoodReleaseForChannel(channel)).version;
|
|
||||||
}
|
|
||||||
if (channel.match(/^\d+$/)) {
|
|
||||||
// Potentially a milestone.
|
|
||||||
return (await getLastKnownGoodReleaseForMilestone(channel))?.version;
|
|
||||||
}
|
|
||||||
if (channel.match(/^\d+\.\d+\.\d+$/)) {
|
|
||||||
// Potentially a build prefix without the patch version.
|
|
||||||
return (await getLastKnownGoodReleaseForBuild(channel))?.version;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
function resolveSystemExecutablePath(platform, channel) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
switch (channel) {
|
|
||||||
case types_js_1.ChromeReleaseChannel.STABLE:
|
|
||||||
return `${process.env['PROGRAMFILES']}\\Google\\Chrome\\Application\\chrome.exe`;
|
|
||||||
case types_js_1.ChromeReleaseChannel.BETA:
|
|
||||||
return `${process.env['PROGRAMFILES']}\\Google\\Chrome Beta\\Application\\chrome.exe`;
|
|
||||||
case types_js_1.ChromeReleaseChannel.CANARY:
|
|
||||||
return `${process.env['PROGRAMFILES']}\\Google\\Chrome SxS\\Application\\chrome.exe`;
|
|
||||||
case types_js_1.ChromeReleaseChannel.DEV:
|
|
||||||
return `${process.env['PROGRAMFILES']}\\Google\\Chrome Dev\\Application\\chrome.exe`;
|
|
||||||
}
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
switch (channel) {
|
|
||||||
case types_js_1.ChromeReleaseChannel.STABLE:
|
|
||||||
return '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome';
|
|
||||||
case types_js_1.ChromeReleaseChannel.BETA:
|
|
||||||
return '/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta';
|
|
||||||
case types_js_1.ChromeReleaseChannel.CANARY:
|
|
||||||
return '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary';
|
|
||||||
case types_js_1.ChromeReleaseChannel.DEV:
|
|
||||||
return '/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev';
|
|
||||||
}
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
switch (channel) {
|
|
||||||
case types_js_1.ChromeReleaseChannel.STABLE:
|
|
||||||
return '/opt/google/chrome/chrome';
|
|
||||||
case types_js_1.ChromeReleaseChannel.BETA:
|
|
||||||
return '/opt/google/chrome-beta/chrome';
|
|
||||||
case types_js_1.ChromeReleaseChannel.CANARY:
|
|
||||||
return '/opt/google/chrome-canary/chrome';
|
|
||||||
case types_js_1.ChromeReleaseChannel.DEV:
|
|
||||||
return '/opt/google/chrome-unstable/chrome';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function compareVersions(a, b) {
|
|
||||||
if (!semver_1.default.valid(a)) {
|
|
||||||
throw new Error(`Version ${a} is not a valid semver version`);
|
|
||||||
}
|
|
||||||
if (!semver_1.default.valid(b)) {
|
|
||||||
throw new Error(`Version ${b} is not a valid semver version`);
|
|
||||||
}
|
|
||||||
if (semver_1.default.gt(a, b)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else if (semver_1.default.lt(a, b)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=chrome.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../../src/browser-data/chrome.ts"],"names":[],"mappings":"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"}
|
|
||||||
6
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.d.ts
generated
vendored
6
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.d.ts
generated
vendored
|
|
@ -1,6 +0,0 @@
|
||||||
import { BrowserPlatform } from './types.js';
|
|
||||||
export declare function resolveDownloadUrl(platform: BrowserPlatform, buildId: string, baseUrl?: string): string;
|
|
||||||
export declare function resolveDownloadPath(platform: BrowserPlatform, buildId: string): string[];
|
|
||||||
export declare function relativeExecutablePath(platform: BrowserPlatform, _buildId: string): string;
|
|
||||||
export { resolveBuildId, compareVersions } from './chrome.js';
|
|
||||||
//# sourceMappingURL=chromedriver.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"chromedriver.d.ts","sourceRoot":"","sources":["../../../src/browser-data/chromedriver.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAkB3C,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,SAA6D,GACnE,MAAM,CAER;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAEV;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,GACf,MAAM,CAYR;AAED,OAAO,EAAC,cAAc,EAAE,eAAe,EAAC,MAAM,aAAa,CAAC"}
|
|
||||||
54
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.js
generated
vendored
54
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.js
generated
vendored
|
|
@ -1,54 +0,0 @@
|
||||||
"use strict";
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.compareVersions = exports.resolveBuildId = void 0;
|
|
||||||
exports.resolveDownloadUrl = resolveDownloadUrl;
|
|
||||||
exports.resolveDownloadPath = resolveDownloadPath;
|
|
||||||
exports.relativeExecutablePath = relativeExecutablePath;
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
const node_path_1 = __importDefault(require("node:path"));
|
|
||||||
const types_js_1 = require("./types.js");
|
|
||||||
function folder(platform) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return 'linux64';
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
return 'mac-arm64';
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
return 'mac-x64';
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
return 'win32';
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return 'win64';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function resolveDownloadUrl(platform, buildId, baseUrl = 'https://storage.googleapis.com/chrome-for-testing-public') {
|
|
||||||
return `${baseUrl}/${resolveDownloadPath(platform, buildId).join('/')}`;
|
|
||||||
}
|
|
||||||
function resolveDownloadPath(platform, buildId) {
|
|
||||||
return [buildId, folder(platform), `chromedriver-${folder(platform)}.zip`];
|
|
||||||
}
|
|
||||||
function relativeExecutablePath(platform, _buildId) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
return node_path_1.default.join('chromedriver-' + folder(platform), 'chromedriver');
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return node_path_1.default.join('chromedriver-linux64', 'chromedriver');
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return node_path_1.default.join('chromedriver-' + folder(platform), 'chromedriver.exe');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var chrome_js_1 = require("./chrome.js");
|
|
||||||
Object.defineProperty(exports, "resolveBuildId", { enumerable: true, get: function () { return chrome_js_1.resolveBuildId; } });
|
|
||||||
Object.defineProperty(exports, "compareVersions", { enumerable: true, get: function () { return chrome_js_1.compareVersions; } });
|
|
||||||
//# sourceMappingURL=chromedriver.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"chromedriver.js","sourceRoot":"","sources":["../../../src/browser-data/chromedriver.ts"],"names":[],"mappings":";;;;;;AAyBA,gDAMC;AAED,kDAKC;AAED,wDAeC;AAvDD;;;;GAIG;AACH,0DAA6B;AAE7B,yCAA2C;AAE3C,SAAS,MAAM,CAAC,QAAyB;IACvC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,0BAAe,CAAC,SAAS,CAAC;QAC/B,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,SAAS,CAAC;QACnB,KAAK,0BAAe,CAAC,OAAO;YAC1B,OAAO,WAAW,CAAC;QACrB,KAAK,0BAAe,CAAC,GAAG;YACtB,OAAO,SAAS,CAAC;QACnB,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,OAAO,CAAC;QACjB,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAChC,QAAyB,EACzB,OAAe,EACf,OAAO,GAAG,0DAA0D;IAEpE,OAAO,GAAG,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,SAAgB,mBAAmB,CACjC,QAAyB,EACzB,OAAe;IAEf,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,gBAAgB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,sBAAsB,CACpC,QAAyB,EACzB,QAAgB;IAEhB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,0BAAe,CAAC,GAAG,CAAC;QACzB,KAAK,0BAAe,CAAC,OAAO;YAC1B,OAAO,mBAAI,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;QACvE,KAAK,0BAAe,CAAC,SAAS,CAAC;QAC/B,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,mBAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,cAAc,CAAC,CAAC;QAC3D,KAAK,0BAAe,CAAC,KAAK,CAAC;QAC3B,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,mBAAI,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,yCAA4D;AAApD,2GAAA,cAAc,OAAA;AAAE,4GAAA,eAAe,OAAA"}
|
|
||||||
12
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.d.ts
generated
vendored
12
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.d.ts
generated
vendored
|
|
@ -1,12 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import { BrowserPlatform } from './types.js';
|
|
||||||
export declare function resolveDownloadUrl(platform: BrowserPlatform, buildId: string, baseUrl?: string): string;
|
|
||||||
export declare function resolveDownloadPath(platform: BrowserPlatform, buildId: string): string[];
|
|
||||||
export declare function relativeExecutablePath(platform: BrowserPlatform, _buildId: string): string;
|
|
||||||
export declare function resolveBuildId(platform: BrowserPlatform): Promise<string>;
|
|
||||||
export declare function compareVersions(a: string, b: string): number;
|
|
||||||
//# sourceMappingURL=chromium.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"chromium.d.ts","sourceRoot":"","sources":["../../../src/browser-data/chromium.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAiC3C,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,SAA8D,GACpE,MAAM,CAER;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAEV;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,GACf,MAAM,CAkBR;AACD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D"}
|
|
||||||
73
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.js
generated
vendored
73
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.js
generated
vendored
|
|
@ -1,73 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.resolveDownloadUrl = resolveDownloadUrl;
|
|
||||||
exports.resolveDownloadPath = resolveDownloadPath;
|
|
||||||
exports.relativeExecutablePath = relativeExecutablePath;
|
|
||||||
exports.resolveBuildId = resolveBuildId;
|
|
||||||
exports.compareVersions = compareVersions;
|
|
||||||
const node_path_1 = __importDefault(require("node:path"));
|
|
||||||
const httpUtil_js_1 = require("../httpUtil.js");
|
|
||||||
const types_js_1 = require("./types.js");
|
|
||||||
function archive(platform, buildId) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return 'chrome-linux';
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
return 'chrome-mac';
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
// Windows archive name changed at r591479.
|
|
||||||
return parseInt(buildId, 10) > 591479 ? 'chrome-win' : 'chrome-win32';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function folder(platform) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return 'Linux_x64';
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
return 'Mac_Arm';
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
return 'Mac';
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
return 'Win';
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return 'Win_x64';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function resolveDownloadUrl(platform, buildId, baseUrl = 'https://storage.googleapis.com/chromium-browser-snapshots') {
|
|
||||||
return `${baseUrl}/${resolveDownloadPath(platform, buildId).join('/')}`;
|
|
||||||
}
|
|
||||||
function resolveDownloadPath(platform, buildId) {
|
|
||||||
return [folder(platform), buildId, `${archive(platform, buildId)}.zip`];
|
|
||||||
}
|
|
||||||
function relativeExecutablePath(platform, _buildId) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
return node_path_1.default.join('chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium');
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return node_path_1.default.join('chrome-linux', 'chrome');
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return node_path_1.default.join('chrome-win', 'chrome.exe');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async function resolveBuildId(platform) {
|
|
||||||
return await (0, httpUtil_js_1.getText)(new URL(`https://storage.googleapis.com/chromium-browser-snapshots/${folder(platform)}/LAST_CHANGE`));
|
|
||||||
}
|
|
||||||
function compareVersions(a, b) {
|
|
||||||
return Number(a) - Number(b);
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=chromium.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"chromium.js","sourceRoot":"","sources":["../../../src/browser-data/chromium.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;AAuCH,gDAMC;AAED,kDAKC;AAED,wDAqBC;AACD,wCAUC;AAED,0CAEC;AAxFD,0DAA6B;AAE7B,gDAAuC;AAEvC,yCAA2C;AAE3C,SAAS,OAAO,CAAC,QAAyB,EAAE,OAAe;IACzD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,0BAAe,CAAC,SAAS,CAAC;QAC/B,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,cAAc,CAAC;QACxB,KAAK,0BAAe,CAAC,OAAO,CAAC;QAC7B,KAAK,0BAAe,CAAC,GAAG;YACtB,OAAO,YAAY,CAAC;QACtB,KAAK,0BAAe,CAAC,KAAK,CAAC;QAC3B,KAAK,0BAAe,CAAC,KAAK;YACxB,2CAA2C;YAC3C,OAAO,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,QAAyB;IACvC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,0BAAe,CAAC,SAAS,CAAC;QAC/B,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,WAAW,CAAC;QACrB,KAAK,0BAAe,CAAC,OAAO;YAC1B,OAAO,SAAS,CAAC;QACnB,KAAK,0BAAe,CAAC,GAAG;YACtB,OAAO,KAAK,CAAC;QACf,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,KAAK,CAAC;QACf,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAChC,QAAyB,EACzB,OAAe,EACf,OAAO,GAAG,2DAA2D;IAErE,OAAO,GAAG,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,SAAgB,mBAAmB,CACjC,QAAyB,EACzB,OAAe;IAEf,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,SAAgB,sBAAsB,CACpC,QAAyB,EACzB,QAAgB;IAEhB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,0BAAe,CAAC,GAAG,CAAC;QACzB,KAAK,0BAAe,CAAC,OAAO;YAC1B,OAAO,mBAAI,CAAC,IAAI,CACd,YAAY,EACZ,cAAc,EACd,UAAU,EACV,OAAO,EACP,UAAU,CACX,CAAC;QACJ,KAAK,0BAAe,CAAC,SAAS,CAAC;QAC/B,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,mBAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC7C,KAAK,0BAAe,CAAC,KAAK,CAAC;QAC3B,KAAK,0BAAe,CAAC,KAAK;YACxB,OAAO,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AACM,KAAK,UAAU,cAAc,CAClC,QAAyB;IAEzB,OAAO,MAAM,IAAA,qBAAO,EAClB,IAAI,GAAG,CACL,6DAA6D,MAAM,CACjE,QAAQ,CACT,cAAc,CAChB,CACF,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
||||||
20
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.d.ts
generated
vendored
20
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.d.ts
generated
vendored
|
|
@ -1,20 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import { BrowserPlatform, type ProfileOptions } from './types.js';
|
|
||||||
export declare function resolveDownloadUrl(platform: BrowserPlatform, buildId: string, baseUrl?: string): string;
|
|
||||||
export declare function resolveDownloadPath(platform: BrowserPlatform, buildId: string): string[];
|
|
||||||
export declare function relativeExecutablePath(platform: BrowserPlatform, buildId: string): string;
|
|
||||||
export declare enum FirefoxChannel {
|
|
||||||
STABLE = "stable",
|
|
||||||
ESR = "esr",
|
|
||||||
DEVEDITION = "devedition",
|
|
||||||
BETA = "beta",
|
|
||||||
NIGHTLY = "nightly"
|
|
||||||
}
|
|
||||||
export declare function resolveBuildId(channel?: FirefoxChannel): Promise<string>;
|
|
||||||
export declare function createProfile(options: ProfileOptions): Promise<void>;
|
|
||||||
export declare function compareVersions(a: string, b: string): number;
|
|
||||||
//# sourceMappingURL=firefox.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"firefox.d.ts","sourceRoot":"","sources":["../../../src/browser-data/firefox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAC,eAAe,EAAE,KAAK,cAAc,EAAC,MAAM,YAAY,CAAC;AA8DhE,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAiBR;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAgBV;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,MAAM,CAoCR;AAED,oBAAY,cAAc;IACxB,MAAM,WAAW;IACjB,GAAG,QAAQ;IACX,UAAU,eAAe;IACzB,IAAI,SAAS;IACb,OAAO,YAAY;CACpB;AAED,wBAAsB,cAAc,CAClC,OAAO,GAAE,cAAuC,GAC/C,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAa1E;AAkQD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG5D"}
|
|
||||||
381
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.js
generated
vendored
381
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.js
generated
vendored
|
|
@ -1,381 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.FirefoxChannel = void 0;
|
|
||||||
exports.resolveDownloadUrl = resolveDownloadUrl;
|
|
||||||
exports.resolveDownloadPath = resolveDownloadPath;
|
|
||||||
exports.relativeExecutablePath = relativeExecutablePath;
|
|
||||||
exports.resolveBuildId = resolveBuildId;
|
|
||||||
exports.createProfile = createProfile;
|
|
||||||
exports.compareVersions = compareVersions;
|
|
||||||
const node_fs_1 = __importDefault(require("node:fs"));
|
|
||||||
const node_path_1 = __importDefault(require("node:path"));
|
|
||||||
const httpUtil_js_1 = require("../httpUtil.js");
|
|
||||||
const types_js_1 = require("./types.js");
|
|
||||||
function getFormat(buildId) {
|
|
||||||
const majorVersion = Number(buildId.split('.').shift());
|
|
||||||
return majorVersion >= 135 ? 'xz' : 'bz2';
|
|
||||||
}
|
|
||||||
function archiveNightly(platform, buildId) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return `firefox-${buildId}.en-US.linux-x86_64.tar.${getFormat(buildId)}`;
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
return `firefox-${buildId}.en-US.linux-aarch64.tar.${getFormat(buildId)}`;
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
return `firefox-${buildId}.en-US.mac.dmg`;
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return `firefox-${buildId}.en-US.${platform}.zip`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function archive(platform, buildId) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return `firefox-${buildId}.tar.${getFormat(buildId)}`;
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
return `Firefox ${buildId}.dmg`;
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return `Firefox Setup ${buildId}.exe`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function platformName(platform) {
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return `linux-x86_64`;
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
return `linux-aarch64`;
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
return `mac`;
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return platform;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function parseBuildId(buildId) {
|
|
||||||
for (const value of Object.values(FirefoxChannel)) {
|
|
||||||
if (buildId.startsWith(value + '_')) {
|
|
||||||
buildId = buildId.substring(value.length + 1);
|
|
||||||
return [value, buildId];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Older versions do not have channel as the prefix.«
|
|
||||||
return [FirefoxChannel.NIGHTLY, buildId];
|
|
||||||
}
|
|
||||||
function resolveDownloadUrl(platform, buildId, baseUrl) {
|
|
||||||
const [channel] = parseBuildId(buildId);
|
|
||||||
switch (channel) {
|
|
||||||
case FirefoxChannel.NIGHTLY:
|
|
||||||
baseUrl ??=
|
|
||||||
'https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central';
|
|
||||||
break;
|
|
||||||
case FirefoxChannel.DEVEDITION:
|
|
||||||
baseUrl ??= 'https://archive.mozilla.org/pub/devedition/releases';
|
|
||||||
break;
|
|
||||||
case FirefoxChannel.BETA:
|
|
||||||
case FirefoxChannel.STABLE:
|
|
||||||
case FirefoxChannel.ESR:
|
|
||||||
baseUrl ??= 'https://archive.mozilla.org/pub/firefox/releases';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return `${baseUrl}/${resolveDownloadPath(platform, buildId).join('/')}`;
|
|
||||||
}
|
|
||||||
function resolveDownloadPath(platform, buildId) {
|
|
||||||
const [channel, resolvedBuildId] = parseBuildId(buildId);
|
|
||||||
switch (channel) {
|
|
||||||
case FirefoxChannel.NIGHTLY:
|
|
||||||
return [archiveNightly(platform, resolvedBuildId)];
|
|
||||||
case FirefoxChannel.DEVEDITION:
|
|
||||||
case FirefoxChannel.BETA:
|
|
||||||
case FirefoxChannel.STABLE:
|
|
||||||
case FirefoxChannel.ESR:
|
|
||||||
return [
|
|
||||||
resolvedBuildId,
|
|
||||||
platformName(platform),
|
|
||||||
'en-US',
|
|
||||||
archive(platform, resolvedBuildId),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function relativeExecutablePath(platform, buildId) {
|
|
||||||
const [channel] = parseBuildId(buildId);
|
|
||||||
switch (channel) {
|
|
||||||
case FirefoxChannel.NIGHTLY:
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
return node_path_1.default.join('Firefox Nightly.app', 'Contents', 'MacOS', 'firefox');
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return node_path_1.default.join('firefox', 'firefox');
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return node_path_1.default.join('firefox', 'firefox.exe');
|
|
||||||
}
|
|
||||||
case FirefoxChannel.BETA:
|
|
||||||
case FirefoxChannel.DEVEDITION:
|
|
||||||
case FirefoxChannel.ESR:
|
|
||||||
case FirefoxChannel.STABLE:
|
|
||||||
switch (platform) {
|
|
||||||
case types_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.MAC:
|
|
||||||
return node_path_1.default.join('Firefox.app', 'Contents', 'MacOS', 'firefox');
|
|
||||||
case types_js_1.BrowserPlatform.LINUX_ARM:
|
|
||||||
case types_js_1.BrowserPlatform.LINUX:
|
|
||||||
return node_path_1.default.join('firefox', 'firefox');
|
|
||||||
case types_js_1.BrowserPlatform.WIN32:
|
|
||||||
case types_js_1.BrowserPlatform.WIN64:
|
|
||||||
return node_path_1.default.join('core', 'firefox.exe');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var FirefoxChannel;
|
|
||||||
(function (FirefoxChannel) {
|
|
||||||
FirefoxChannel["STABLE"] = "stable";
|
|
||||||
FirefoxChannel["ESR"] = "esr";
|
|
||||||
FirefoxChannel["DEVEDITION"] = "devedition";
|
|
||||||
FirefoxChannel["BETA"] = "beta";
|
|
||||||
FirefoxChannel["NIGHTLY"] = "nightly";
|
|
||||||
})(FirefoxChannel || (exports.FirefoxChannel = FirefoxChannel = {}));
|
|
||||||
async function resolveBuildId(channel = FirefoxChannel.NIGHTLY) {
|
|
||||||
const channelToVersionKey = {
|
|
||||||
[FirefoxChannel.ESR]: 'FIREFOX_ESR',
|
|
||||||
[FirefoxChannel.STABLE]: 'LATEST_FIREFOX_VERSION',
|
|
||||||
[FirefoxChannel.DEVEDITION]: 'FIREFOX_DEVEDITION',
|
|
||||||
[FirefoxChannel.BETA]: 'FIREFOX_DEVEDITION',
|
|
||||||
[FirefoxChannel.NIGHTLY]: 'FIREFOX_NIGHTLY',
|
|
||||||
};
|
|
||||||
const versions = (await (0, httpUtil_js_1.getJSON)(new URL('https://product-details.mozilla.org/1.0/firefox_versions.json')));
|
|
||||||
const version = versions[channelToVersionKey[channel]];
|
|
||||||
if (!version) {
|
|
||||||
throw new Error(`Channel ${channel} is not found.`);
|
|
||||||
}
|
|
||||||
return channel + '_' + version;
|
|
||||||
}
|
|
||||||
async function createProfile(options) {
|
|
||||||
if (!node_fs_1.default.existsSync(options.path)) {
|
|
||||||
await node_fs_1.default.promises.mkdir(options.path, {
|
|
||||||
recursive: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
await syncPreferences({
|
|
||||||
preferences: {
|
|
||||||
...defaultProfilePreferences(options.preferences),
|
|
||||||
...options.preferences,
|
|
||||||
},
|
|
||||||
path: options.path,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function defaultProfilePreferences(extraPrefs) {
|
|
||||||
const server = 'dummy.test';
|
|
||||||
const defaultPrefs = {
|
|
||||||
// Make sure Shield doesn't hit the network.
|
|
||||||
'app.normandy.api_url': '',
|
|
||||||
// Disable Firefox old build background check
|
|
||||||
'app.update.checkInstallTime': false,
|
|
||||||
// Disable automatically upgrading Firefox
|
|
||||||
'app.update.disabledForTesting': true,
|
|
||||||
// Increase the APZ content response timeout to 1 minute
|
|
||||||
'apz.content_response_timeout': 60000,
|
|
||||||
// Disables backup service to improve startup performance and stability. See
|
|
||||||
// https://github.com/puppeteer/puppeteer/issues/14194. TODO: can be removed
|
|
||||||
// once the service is disabled on the Firefox side for WebDriver (see
|
|
||||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1988250).
|
|
||||||
'browser.backup.enabled': false,
|
|
||||||
// Prevent various error message on the console
|
|
||||||
// jest-puppeteer asserts that no error message is emitted by the console
|
|
||||||
'browser.contentblocking.features.standard': '-tp,tpPrivate,cookieBehavior0,-cryptoTP,-fp',
|
|
||||||
// Enable the dump function: which sends messages to the system
|
|
||||||
// console
|
|
||||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1543115
|
|
||||||
'browser.dom.window.dump.enabled': true,
|
|
||||||
// Disable topstories
|
|
||||||
'browser.newtabpage.activity-stream.feeds.system.topstories': false,
|
|
||||||
// Always display a blank page
|
|
||||||
'browser.newtabpage.enabled': false,
|
|
||||||
// Background thumbnails in particular cause grief: and disabling
|
|
||||||
// thumbnails in general cannot hurt
|
|
||||||
'browser.pagethumbnails.capturing_disabled': true,
|
|
||||||
// Disable safebrowsing components.
|
|
||||||
'browser.safebrowsing.blockedURIs.enabled': false,
|
|
||||||
'browser.safebrowsing.downloads.enabled': false,
|
|
||||||
'browser.safebrowsing.malware.enabled': false,
|
|
||||||
'browser.safebrowsing.phishing.enabled': false,
|
|
||||||
// Disable updates to search engines.
|
|
||||||
'browser.search.update': false,
|
|
||||||
// Do not restore the last open set of tabs if the browser has crashed
|
|
||||||
'browser.sessionstore.resume_from_crash': false,
|
|
||||||
// Skip check for default browser on startup
|
|
||||||
'browser.shell.checkDefaultBrowser': false,
|
|
||||||
// Disable newtabpage
|
|
||||||
'browser.startup.homepage': 'about:blank',
|
|
||||||
// Do not redirect user when a milstone upgrade of Firefox is detected
|
|
||||||
'browser.startup.homepage_override.mstone': 'ignore',
|
|
||||||
// Start with a blank page about:blank
|
|
||||||
'browser.startup.page': 0,
|
|
||||||
// Do not allow background tabs to be zombified on Android: otherwise for
|
|
||||||
// tests that open additional tabs: the test harness tab itself might get
|
|
||||||
// unloaded
|
|
||||||
'browser.tabs.disableBackgroundZombification': false,
|
|
||||||
// Do not warn when closing all other open tabs
|
|
||||||
'browser.tabs.warnOnCloseOtherTabs': false,
|
|
||||||
// Do not warn when multiple tabs will be opened
|
|
||||||
'browser.tabs.warnOnOpen': false,
|
|
||||||
// Do not automatically offer translations, as tests do not expect this.
|
|
||||||
'browser.translations.automaticallyPopup': false,
|
|
||||||
// Disable the UI tour.
|
|
||||||
'browser.uitour.enabled': false,
|
|
||||||
// Turn off search suggestions in the location bar so as not to trigger
|
|
||||||
// network connections.
|
|
||||||
'browser.urlbar.suggest.searches': false,
|
|
||||||
// Disable first run splash page on Windows 10
|
|
||||||
'browser.usedOnWindows10.introURL': '',
|
|
||||||
// Do not warn on quitting Firefox
|
|
||||||
'browser.warnOnQuit': false,
|
|
||||||
// Defensively disable data reporting systems
|
|
||||||
'datareporting.healthreport.documentServerURI': `http://${server}/dummy/healthreport/`,
|
|
||||||
'datareporting.healthreport.logging.consoleEnabled': false,
|
|
||||||
'datareporting.healthreport.service.enabled': false,
|
|
||||||
'datareporting.healthreport.service.firstRun': false,
|
|
||||||
'datareporting.healthreport.uploadEnabled': false,
|
|
||||||
// Do not show datareporting policy notifications which can interfere with tests
|
|
||||||
'datareporting.policy.dataSubmissionEnabled': false,
|
|
||||||
'datareporting.policy.dataSubmissionPolicyBypassNotification': true,
|
|
||||||
// DevTools JSONViewer sometimes fails to load dependencies with its require.js.
|
|
||||||
// This doesn't affect Puppeteer but spams console (Bug 1424372)
|
|
||||||
'devtools.jsonview.enabled': false,
|
|
||||||
// Disable popup-blocker
|
|
||||||
'dom.disable_open_during_load': false,
|
|
||||||
// Enable the support for File object creation in the content process
|
|
||||||
// Required for |Page.setFileInputFiles| protocol method.
|
|
||||||
'dom.file.createInChild': true,
|
|
||||||
// Disable the ProcessHangMonitor
|
|
||||||
'dom.ipc.reportProcessHangs': false,
|
|
||||||
// Disable slow script dialogues
|
|
||||||
'dom.max_chrome_script_run_time': 0,
|
|
||||||
'dom.max_script_run_time': 0,
|
|
||||||
// Only load extensions from the application and user profile
|
|
||||||
// AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION
|
|
||||||
'extensions.autoDisableScopes': 0,
|
|
||||||
'extensions.enabledScopes': 5,
|
|
||||||
// Disable metadata caching for installed add-ons by default
|
|
||||||
'extensions.getAddons.cache.enabled': false,
|
|
||||||
// Disable installing any distribution extensions or add-ons.
|
|
||||||
'extensions.installDistroAddons': false,
|
|
||||||
// Turn off extension updates so they do not bother tests
|
|
||||||
'extensions.update.enabled': false,
|
|
||||||
// Turn off extension updates so they do not bother tests
|
|
||||||
'extensions.update.notifyUser': false,
|
|
||||||
// Make sure opening about:addons will not hit the network
|
|
||||||
'extensions.webservice.discoverURL': `http://${server}/dummy/discoveryURL`,
|
|
||||||
// Allow the application to have focus even it runs in the background
|
|
||||||
'focusmanager.testmode': true,
|
|
||||||
// Disable useragent updates
|
|
||||||
'general.useragent.updates.enabled': false,
|
|
||||||
// Always use network provider for geolocation tests so we bypass the
|
|
||||||
// macOS dialog raised by the corelocation provider
|
|
||||||
'geo.provider.testing': true,
|
|
||||||
// Do not scan Wifi
|
|
||||||
'geo.wifi.scan': false,
|
|
||||||
// No hang monitor
|
|
||||||
'hangmonitor.timeout': 0,
|
|
||||||
// Show chrome errors and warnings in the error console
|
|
||||||
'javascript.options.showInConsole': true,
|
|
||||||
// Disable download and usage of OpenH264: and Widevine plugins
|
|
||||||
'media.gmp-manager.updateEnabled': false,
|
|
||||||
// Disable the GFX sanity window
|
|
||||||
'media.sanity-test.disabled': true,
|
|
||||||
// Disable experimental feature that is only available in Nightly
|
|
||||||
'network.cookie.sameSite.laxByDefault': false,
|
|
||||||
// Do not prompt for temporary redirects
|
|
||||||
'network.http.prompt-temp-redirect': false,
|
|
||||||
// Disable speculative connections so they are not reported as leaking
|
|
||||||
// when they are hanging around
|
|
||||||
'network.http.speculative-parallel-limit': 0,
|
|
||||||
// Do not automatically switch between offline and online
|
|
||||||
'network.manage-offline-status': false,
|
|
||||||
// Make sure SNTP requests do not hit the network
|
|
||||||
'network.sntp.pools': server,
|
|
||||||
// Disable Flash.
|
|
||||||
'plugin.state.flash': 0,
|
|
||||||
'privacy.trackingprotection.enabled': false,
|
|
||||||
// Can be removed once Firefox 89 is no longer supported
|
|
||||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1710839
|
|
||||||
'remote.enabled': true,
|
|
||||||
// Disabled screenshots component
|
|
||||||
'screenshots.browser.component.enabled': false,
|
|
||||||
// Don't do network connections for mitm priming
|
|
||||||
'security.certerrors.mitm.priming.enabled': false,
|
|
||||||
// Local documents have access to all other local documents,
|
|
||||||
// including directory listings
|
|
||||||
'security.fileuri.strict_origin_policy': false,
|
|
||||||
// Do not wait for the notification button security delay
|
|
||||||
'security.notification_enable_delay': 0,
|
|
||||||
// Ensure blocklist updates do not hit the network
|
|
||||||
'services.settings.server': `http://${server}/dummy/blocklist/`,
|
|
||||||
// Do not automatically fill sign-in forms with known usernames and
|
|
||||||
// passwords
|
|
||||||
'signon.autofillForms': false,
|
|
||||||
// Disable password capture, so that tests that include forms are not
|
|
||||||
// influenced by the presence of the persistent doorhanger notification
|
|
||||||
'signon.rememberSignons': false,
|
|
||||||
// Disable first-run welcome page
|
|
||||||
'startup.homepage_welcome_url': 'about:blank',
|
|
||||||
// Disable first-run welcome page
|
|
||||||
'startup.homepage_welcome_url.additional': '',
|
|
||||||
// Disable browser animations (tabs, fullscreen, sliding alerts)
|
|
||||||
'toolkit.cosmeticAnimations.enabled': false,
|
|
||||||
// Prevent starting into safe mode after application crashes
|
|
||||||
'toolkit.startup.max_resumed_crashes': -1,
|
|
||||||
};
|
|
||||||
return Object.assign(defaultPrefs, extraPrefs);
|
|
||||||
}
|
|
||||||
async function backupFile(input) {
|
|
||||||
if (!node_fs_1.default.existsSync(input)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await node_fs_1.default.promises.copyFile(input, input + '.puppeteer');
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Populates the user.js file with custom preferences as needed to allow
|
|
||||||
* Firefox's support to properly function. These preferences will be
|
|
||||||
* automatically copied over to prefs.js during startup of Firefox. To be
|
|
||||||
* able to restore the original values of preferences a backup of prefs.js
|
|
||||||
* will be created.
|
|
||||||
*/
|
|
||||||
async function syncPreferences(options) {
|
|
||||||
const prefsPath = node_path_1.default.join(options.path, 'prefs.js');
|
|
||||||
const userPath = node_path_1.default.join(options.path, 'user.js');
|
|
||||||
const lines = Object.entries(options.preferences).map(([key, value]) => {
|
|
||||||
return `user_pref(${JSON.stringify(key)}, ${JSON.stringify(value)});`;
|
|
||||||
});
|
|
||||||
// Use allSettled to prevent corruption.
|
|
||||||
const result = await Promise.allSettled([
|
|
||||||
backupFile(userPath).then(async () => {
|
|
||||||
await node_fs_1.default.promises.writeFile(userPath, lines.join('\n'));
|
|
||||||
}),
|
|
||||||
backupFile(prefsPath),
|
|
||||||
]);
|
|
||||||
for (const command of result) {
|
|
||||||
if (command.status === 'rejected') {
|
|
||||||
throw command.reason;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function compareVersions(a, b) {
|
|
||||||
// TODO: this is a not very reliable check.
|
|
||||||
return parseInt(a.replace('.', ''), 16) - parseInt(b.replace('.', ''), 16);
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=firefox.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.js.map
generated
vendored
File diff suppressed because one or more lines are too long
66
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.d.ts
generated
vendored
66
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.d.ts
generated
vendored
|
|
@ -1,66 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Supported browsers.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare enum Browser {
|
|
||||||
CHROME = "chrome",
|
|
||||||
CHROMEHEADLESSSHELL = "chrome-headless-shell",
|
|
||||||
CHROMIUM = "chromium",
|
|
||||||
FIREFOX = "firefox",
|
|
||||||
CHROMEDRIVER = "chromedriver"
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Platform names used to identify a OS platform x architecture combination in the way
|
|
||||||
* that is relevant for the browser download.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare enum BrowserPlatform {
|
|
||||||
LINUX = "linux",
|
|
||||||
LINUX_ARM = "linux_arm",
|
|
||||||
MAC = "mac",
|
|
||||||
MAC_ARM = "mac_arm",
|
|
||||||
WIN32 = "win32",
|
|
||||||
WIN64 = "win64"
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Enum describing a release channel for a browser.
|
|
||||||
*
|
|
||||||
* You can use this in combination with {@link resolveBuildId} to resolve
|
|
||||||
* a build ID based on a release channel.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare enum BrowserTag {
|
|
||||||
CANARY = "canary",
|
|
||||||
NIGHTLY = "nightly",
|
|
||||||
BETA = "beta",
|
|
||||||
DEV = "dev",
|
|
||||||
DEVEDITION = "devedition",
|
|
||||||
STABLE = "stable",
|
|
||||||
ESR = "esr",
|
|
||||||
LATEST = "latest"
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export interface ProfileOptions {
|
|
||||||
preferences: Record<string, unknown>;
|
|
||||||
path: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare enum ChromeReleaseChannel {
|
|
||||||
STABLE = "stable",
|
|
||||||
DEV = "dev",
|
|
||||||
CANARY = "canary",
|
|
||||||
BETA = "beta"
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=types.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/browser-data/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,oBAAY,OAAO;IACjB,MAAM,WAAW;IACjB,mBAAmB,0BAA0B;IAC7C,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,YAAY,iBAAiB;CAC9B;AAED;;;;;GAKG;AACH,oBAAY,eAAe;IACzB,KAAK,UAAU;IACf,SAAS,cAAc;IACvB,GAAG,QAAQ;IACX,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED;;;;;;;GAOG;AACH,oBAAY,UAAU;IACpB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,GAAG,QAAQ;IACX,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,oBAAY,oBAAoB;IAC9B,MAAM,WAAW;IACjB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,IAAI,SAAS;CACd"}
|
|
||||||
66
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.js
generated
vendored
66
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.js
generated
vendored
|
|
@ -1,66 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.ChromeReleaseChannel = exports.BrowserTag = exports.BrowserPlatform = exports.Browser = void 0;
|
|
||||||
/**
|
|
||||||
* Supported browsers.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
var Browser;
|
|
||||||
(function (Browser) {
|
|
||||||
Browser["CHROME"] = "chrome";
|
|
||||||
Browser["CHROMEHEADLESSSHELL"] = "chrome-headless-shell";
|
|
||||||
Browser["CHROMIUM"] = "chromium";
|
|
||||||
Browser["FIREFOX"] = "firefox";
|
|
||||||
Browser["CHROMEDRIVER"] = "chromedriver";
|
|
||||||
})(Browser || (exports.Browser = Browser = {}));
|
|
||||||
/**
|
|
||||||
* Platform names used to identify a OS platform x architecture combination in the way
|
|
||||||
* that is relevant for the browser download.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
var BrowserPlatform;
|
|
||||||
(function (BrowserPlatform) {
|
|
||||||
BrowserPlatform["LINUX"] = "linux";
|
|
||||||
BrowserPlatform["LINUX_ARM"] = "linux_arm";
|
|
||||||
BrowserPlatform["MAC"] = "mac";
|
|
||||||
BrowserPlatform["MAC_ARM"] = "mac_arm";
|
|
||||||
BrowserPlatform["WIN32"] = "win32";
|
|
||||||
BrowserPlatform["WIN64"] = "win64";
|
|
||||||
})(BrowserPlatform || (exports.BrowserPlatform = BrowserPlatform = {}));
|
|
||||||
/**
|
|
||||||
* Enum describing a release channel for a browser.
|
|
||||||
*
|
|
||||||
* You can use this in combination with {@link resolveBuildId} to resolve
|
|
||||||
* a build ID based on a release channel.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
var BrowserTag;
|
|
||||||
(function (BrowserTag) {
|
|
||||||
BrowserTag["CANARY"] = "canary";
|
|
||||||
BrowserTag["NIGHTLY"] = "nightly";
|
|
||||||
BrowserTag["BETA"] = "beta";
|
|
||||||
BrowserTag["DEV"] = "dev";
|
|
||||||
BrowserTag["DEVEDITION"] = "devedition";
|
|
||||||
BrowserTag["STABLE"] = "stable";
|
|
||||||
BrowserTag["ESR"] = "esr";
|
|
||||||
BrowserTag["LATEST"] = "latest";
|
|
||||||
})(BrowserTag || (exports.BrowserTag = BrowserTag = {}));
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
var ChromeReleaseChannel;
|
|
||||||
(function (ChromeReleaseChannel) {
|
|
||||||
ChromeReleaseChannel["STABLE"] = "stable";
|
|
||||||
ChromeReleaseChannel["DEV"] = "dev";
|
|
||||||
ChromeReleaseChannel["CANARY"] = "canary";
|
|
||||||
ChromeReleaseChannel["BETA"] = "beta";
|
|
||||||
})(ChromeReleaseChannel || (exports.ChromeReleaseChannel = ChromeReleaseChannel = {}));
|
|
||||||
//# sourceMappingURL=types.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/browser-data/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH;;;;GAIG;AACH,IAAY,OAMX;AAND,WAAY,OAAO;IACjB,4BAAiB,CAAA;IACjB,wDAA6C,CAAA;IAC7C,gCAAqB,CAAA;IACrB,8BAAmB,CAAA;IACnB,wCAA6B,CAAA;AAC/B,CAAC,EANW,OAAO,uBAAP,OAAO,QAMlB;AAED;;;;;GAKG;AACH,IAAY,eAOX;AAPD,WAAY,eAAe;IACzB,kCAAe,CAAA;IACf,0CAAuB,CAAA;IACvB,8BAAW,CAAA;IACX,sCAAmB,CAAA;IACnB,kCAAe,CAAA;IACf,kCAAe,CAAA;AACjB,CAAC,EAPW,eAAe,+BAAf,eAAe,QAO1B;AAED;;;;;;;GAOG;AACH,IAAY,UASX;AATD,WAAY,UAAU;IACpB,+BAAiB,CAAA;IACjB,iCAAmB,CAAA;IACnB,2BAAa,CAAA;IACb,yBAAW,CAAA;IACX,uCAAyB,CAAA;IACzB,+BAAiB,CAAA;IACjB,yBAAW,CAAA;IACX,+BAAiB,CAAA;AACnB,CAAC,EATW,UAAU,0BAAV,UAAU,QASrB;AAUD;;GAEG;AACH,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,yCAAiB,CAAA;IACjB,mCAAW,CAAA;IACX,yCAAiB,CAAA;IACjB,qCAAa,CAAA;AACf,CAAC,EALW,oBAAoB,oCAApB,oBAAoB,QAK/B"}
|
|
||||||
8
node_modules/@puppeteer/browsers/lib/cjs/debug.d.ts
generated
vendored
8
node_modules/@puppeteer/browsers/lib/cjs/debug.d.ts
generated
vendored
|
|
@ -1,8 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import debug from 'debug';
|
|
||||||
export { debug };
|
|
||||||
//# sourceMappingURL=debug.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/debug.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/debug.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/debug.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAC,KAAK,EAAC,CAAC"}
|
|
||||||
14
node_modules/@puppeteer/browsers/lib/cjs/debug.js
generated
vendored
14
node_modules/@puppeteer/browsers/lib/cjs/debug.js
generated
vendored
|
|
@ -1,14 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.debug = void 0;
|
|
||||||
const debug_1 = __importDefault(require("debug"));
|
|
||||||
exports.debug = debug_1.default;
|
|
||||||
//# sourceMappingURL=debug.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/debug.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/debug.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/debug.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAEH,kDAA0B;AAElB,gBAFD,eAAK,CAEC"}
|
|
||||||
11
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.d.ts
generated
vendored
11
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.d.ts
generated
vendored
|
|
@ -1,11 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import { BrowserPlatform } from './browser-data/browser-data.js';
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function detectBrowserPlatform(): BrowserPlatform | undefined;
|
|
||||||
//# sourceMappingURL=detectPlatform.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"detectPlatform.d.ts","sourceRoot":"","sources":["../../src/detectPlatform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,GAAG,SAAS,CAmBnE"}
|
|
||||||
53
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.js
generated
vendored
53
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.js
generated
vendored
|
|
@ -1,53 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.detectBrowserPlatform = detectBrowserPlatform;
|
|
||||||
const node_os_1 = __importDefault(require("node:os"));
|
|
||||||
const browser_data_js_1 = require("./browser-data/browser-data.js");
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
function detectBrowserPlatform() {
|
|
||||||
const platform = node_os_1.default.platform();
|
|
||||||
const arch = node_os_1.default.arch();
|
|
||||||
switch (platform) {
|
|
||||||
case 'darwin':
|
|
||||||
return arch === 'arm64' ? browser_data_js_1.BrowserPlatform.MAC_ARM : browser_data_js_1.BrowserPlatform.MAC;
|
|
||||||
case 'linux':
|
|
||||||
return arch === 'arm64'
|
|
||||||
? browser_data_js_1.BrowserPlatform.LINUX_ARM
|
|
||||||
: browser_data_js_1.BrowserPlatform.LINUX;
|
|
||||||
case 'win32':
|
|
||||||
return arch === 'x64' ||
|
|
||||||
// Windows 11 for ARM supports x64 emulation
|
|
||||||
(arch === 'arm64' && isWindows11(node_os_1.default.release()))
|
|
||||||
? browser_data_js_1.BrowserPlatform.WIN64
|
|
||||||
: browser_data_js_1.BrowserPlatform.WIN32;
|
|
||||||
default:
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Windows 11 is identified by the version 10.0.22000 or greater
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
function isWindows11(version) {
|
|
||||||
const parts = version.split('.');
|
|
||||||
if (parts.length > 2) {
|
|
||||||
const major = parseInt(parts[0], 10);
|
|
||||||
const minor = parseInt(parts[1], 10);
|
|
||||||
const patch = parseInt(parts[2], 10);
|
|
||||||
return (major > 10 ||
|
|
||||||
(major === 10 && minor > 0) ||
|
|
||||||
(major === 10 && minor === 0 && patch >= 22000));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=detectPlatform.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"detectPlatform.js","sourceRoot":"","sources":["../../src/detectPlatform.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;AASH,sDAmBC;AA1BD,sDAAyB;AAEzB,oEAA+D;AAE/D;;GAEG;AACH,SAAgB,qBAAqB;IACnC,MAAM,QAAQ,GAAG,iBAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,iBAAE,CAAC,IAAI,EAAE,CAAC;IACvB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,iCAAe,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAe,CAAC,GAAG,CAAC;QAC1E,KAAK,OAAO;YACV,OAAO,IAAI,KAAK,OAAO;gBACrB,CAAC,CAAC,iCAAe,CAAC,SAAS;gBAC3B,CAAC,CAAC,iCAAe,CAAC,KAAK,CAAC;QAC5B,KAAK,OAAO;YACV,OAAO,IAAI,KAAK,KAAK;gBACnB,4CAA4C;gBAC5C,CAAC,IAAI,KAAK,OAAO,IAAI,WAAW,CAAC,iBAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/C,CAAC,CAAC,iCAAe,CAAC,KAAK;gBACvB,CAAC,CAAC,iCAAe,CAAC,KAAK,CAAC;QAC5B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,CACL,KAAK,GAAG,EAAE;YACV,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;YAC3B,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAChD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
||||||
17
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.d.ts
generated
vendored
17
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.d.ts
generated
vendored
|
|
@ -1,17 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
export declare function unpackArchive(archivePath: string, folderPath: string): Promise<void>;
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
export declare const internalConstantsForTesting: {
|
|
||||||
xz: string;
|
|
||||||
bzip2: string;
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=fileUtil.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"fileUtil.d.ts","sourceRoot":"","sources":["../../src/fileUtil.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAgDD;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;CAGvC,CAAC"}
|
|
||||||
196
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.js
generated
vendored
196
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.js
generated
vendored
|
|
@ -1,196 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
||||||
if (k2 === undefined) k2 = k;
|
|
||||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
||||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
||||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
||||||
}
|
|
||||||
Object.defineProperty(o, k2, desc);
|
|
||||||
}) : (function(o, m, k, k2) {
|
|
||||||
if (k2 === undefined) k2 = k;
|
|
||||||
o[k2] = m[k];
|
|
||||||
}));
|
|
||||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
||||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
||||||
}) : function(o, v) {
|
|
||||||
o["default"] = v;
|
|
||||||
});
|
|
||||||
var __importStar = (this && this.__importStar) || (function () {
|
|
||||||
var ownKeys = function(o) {
|
|
||||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
||||||
var ar = [];
|
|
||||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
||||||
return ar;
|
|
||||||
};
|
|
||||||
return ownKeys(o);
|
|
||||||
};
|
|
||||||
return function (mod) {
|
|
||||||
if (mod && mod.__esModule) return mod;
|
|
||||||
var result = {};
|
|
||||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
||||||
__setModuleDefault(result, mod);
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.internalConstantsForTesting = void 0;
|
|
||||||
exports.unpackArchive = unpackArchive;
|
|
||||||
const node_child_process_1 = require("node:child_process");
|
|
||||||
const node_fs_1 = require("node:fs");
|
|
||||||
const promises_1 = require("node:fs/promises");
|
|
||||||
const path = __importStar(require("node:path"));
|
|
||||||
const node_stream_1 = require("node:stream");
|
|
||||||
const debug_1 = __importDefault(require("debug"));
|
|
||||||
const debugFileUtil = (0, debug_1.default)('puppeteer:browsers:fileUtil');
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
async function unpackArchive(archivePath, folderPath) {
|
|
||||||
if (!path.isAbsolute(folderPath)) {
|
|
||||||
folderPath = path.resolve(process.cwd(), folderPath);
|
|
||||||
}
|
|
||||||
if (archivePath.endsWith('.zip')) {
|
|
||||||
const extractZip = await import('extract-zip');
|
|
||||||
await extractZip.default(archivePath, { dir: folderPath });
|
|
||||||
}
|
|
||||||
else if (archivePath.endsWith('.tar.bz2')) {
|
|
||||||
await extractTar(archivePath, folderPath, 'bzip2');
|
|
||||||
}
|
|
||||||
else if (archivePath.endsWith('.dmg')) {
|
|
||||||
await (0, promises_1.mkdir)(folderPath);
|
|
||||||
await installDMG(archivePath, folderPath);
|
|
||||||
}
|
|
||||||
else if (archivePath.endsWith('.exe')) {
|
|
||||||
// Firefox on Windows.
|
|
||||||
const result = (0, node_child_process_1.spawnSync)(archivePath, [`/ExtractDir=${folderPath}`], {
|
|
||||||
env: {
|
|
||||||
__compat_layer: 'RunAsInvoker',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (result.status !== 0) {
|
|
||||||
throw new Error(`Failed to extract ${archivePath} to ${folderPath}: ${result.output}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (archivePath.endsWith('.tar.xz')) {
|
|
||||||
await extractTar(archivePath, folderPath, 'xz');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new Error(`Unsupported archive format: ${archivePath}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function createTransformStream(child) {
|
|
||||||
const stream = new node_stream_1.Stream.Transform({
|
|
||||||
transform(chunk, encoding, callback) {
|
|
||||||
if (!child.stdin.write(chunk, encoding)) {
|
|
||||||
child.stdin.once('drain', callback);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
flush(callback) {
|
|
||||||
if (child.stdout.destroyed) {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
child.stdin.end();
|
|
||||||
child.stdout.on('close', callback);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
child.stdin.on('error', e => {
|
|
||||||
if ('code' in e && e.code === 'EPIPE') {
|
|
||||||
// finished before reading the file finished (i.e. head)
|
|
||||||
stream.emit('end');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
stream.destroy(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
child.stdout
|
|
||||||
.on('data', data => {
|
|
||||||
return stream.push(data);
|
|
||||||
})
|
|
||||||
.on('error', e => {
|
|
||||||
return stream.destroy(e);
|
|
||||||
});
|
|
||||||
child.once('close', () => {
|
|
||||||
return stream.end();
|
|
||||||
});
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
exports.internalConstantsForTesting = {
|
|
||||||
xz: 'xz',
|
|
||||||
bzip2: 'bzip2',
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
async function extractTar(tarPath, folderPath, decompressUtilityName) {
|
|
||||||
const tarFs = await import('tar-fs');
|
|
||||||
return await new Promise((fulfill, reject) => {
|
|
||||||
function handleError(utilityName) {
|
|
||||||
return (error) => {
|
|
||||||
if ('code' in error && error.code === 'ENOENT') {
|
|
||||||
error = new Error(`\`${utilityName}\` utility is required to unpack this archive`, {
|
|
||||||
cause: error,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
reject(error);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
const unpack = (0, node_child_process_1.spawn)(exports.internalConstantsForTesting[decompressUtilityName], ['-d'], {
|
|
||||||
stdio: ['pipe', 'pipe', 'inherit'],
|
|
||||||
})
|
|
||||||
.once('error', handleError(decompressUtilityName))
|
|
||||||
.once('exit', code => {
|
|
||||||
debugFileUtil(`${decompressUtilityName} exited, code=${code}`);
|
|
||||||
});
|
|
||||||
const tar = tarFs.extract(folderPath);
|
|
||||||
tar.once('error', handleError('tar'));
|
|
||||||
tar.once('finish', fulfill);
|
|
||||||
(0, node_fs_1.createReadStream)(tarPath).pipe(createTransformStream(unpack)).pipe(tar);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
async function installDMG(dmgPath, folderPath) {
|
|
||||||
const { stdout } = (0, node_child_process_1.spawnSync)(`hdiutil`, [
|
|
||||||
'attach',
|
|
||||||
'-nobrowse',
|
|
||||||
'-noautoopen',
|
|
||||||
dmgPath,
|
|
||||||
]);
|
|
||||||
const volumes = stdout.toString('utf8').match(/\/Volumes\/(.*)/m);
|
|
||||||
if (!volumes) {
|
|
||||||
throw new Error(`Could not find volume path in ${stdout}`);
|
|
||||||
}
|
|
||||||
const mountPath = volumes[0];
|
|
||||||
try {
|
|
||||||
const fileNames = await (0, promises_1.readdir)(mountPath);
|
|
||||||
const appName = fileNames.find(item => {
|
|
||||||
return typeof item === 'string' && item.endsWith('.app');
|
|
||||||
});
|
|
||||||
if (!appName) {
|
|
||||||
throw new Error(`Cannot find app in ${mountPath}`);
|
|
||||||
}
|
|
||||||
const mountedPath = path.join(mountPath, appName);
|
|
||||||
(0, node_child_process_1.spawnSync)('cp', ['-R', mountedPath, folderPath]);
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
(0, node_child_process_1.spawnSync)('hdiutil', ['detach', mountPath, '-quiet']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=fileUtil.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"fileUtil.js","sourceRoot":"","sources":["../../src/fileUtil.ts"],"names":[],"mappings":"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"}
|
|
||||||
5
node_modules/@puppeteer/browsers/lib/cjs/generated/version.d.ts
generated
vendored
5
node_modules/@puppeteer/browsers/lib/cjs/generated/version.d.ts
generated
vendored
|
|
@ -1,5 +0,0 @@
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
export declare const packageVersion = "2.10.10";
|
|
||||||
//# sourceMappingURL=version.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/generated/version.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/generated/version.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/generated/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,cAAc,YAAY,CAAC"}
|
|
||||||
8
node_modules/@puppeteer/browsers/lib/cjs/generated/version.js
generated
vendored
8
node_modules/@puppeteer/browsers/lib/cjs/generated/version.js
generated
vendored
|
|
@ -1,8 +0,0 @@
|
||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.packageVersion = void 0;
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
exports.packageVersion = '2.10.10';
|
|
||||||
//# sourceMappingURL=version.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/generated/version.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/generated/version.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/generated/version.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,cAAc,GAAG,SAAS,CAAC"}
|
|
||||||
16
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.d.ts
generated
vendored
16
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.d.ts
generated
vendored
|
|
@ -1,16 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import * as http from 'node:http';
|
|
||||||
import { URL } from 'node:url';
|
|
||||||
export declare function headHttpRequest(url: URL): Promise<boolean>;
|
|
||||||
export declare function httpRequest(url: URL, method: string, response: (x: http.IncomingMessage) => void, keepAlive?: boolean): http.ClientRequest;
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
export declare function downloadFile(url: URL, destinationPath: string, progressCallback?: (downloadedBytes: number, totalBytes: number) => void): Promise<void>;
|
|
||||||
export declare function getJSON(url: URL): Promise<unknown>;
|
|
||||||
export declare function getText(url: URL): Promise<string>;
|
|
||||||
//# sourceMappingURL=httpUtil.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"httpUtil.d.ts","sourceRoot":"","sources":["../../src/httpUtil.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAC,GAAG,EAAmB,MAAM,UAAU,CAAC;AAI/C,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB1D;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,KAAK,IAAI,EAC3C,SAAS,UAAO,GACf,IAAI,CAAC,aAAa,CAiCpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,GAAG,EACR,eAAe,EAAE,MAAM,EACvB,gBAAgB,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GACvE,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BjD"}
|
|
||||||
172
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.js
generated
vendored
172
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.js
generated
vendored
|
|
@ -1,172 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
||||||
if (k2 === undefined) k2 = k;
|
|
||||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
||||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
||||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
||||||
}
|
|
||||||
Object.defineProperty(o, k2, desc);
|
|
||||||
}) : (function(o, m, k, k2) {
|
|
||||||
if (k2 === undefined) k2 = k;
|
|
||||||
o[k2] = m[k];
|
|
||||||
}));
|
|
||||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
||||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
||||||
}) : function(o, v) {
|
|
||||||
o["default"] = v;
|
|
||||||
});
|
|
||||||
var __importStar = (this && this.__importStar) || (function () {
|
|
||||||
var ownKeys = function(o) {
|
|
||||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
||||||
var ar = [];
|
|
||||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
||||||
return ar;
|
|
||||||
};
|
|
||||||
return ownKeys(o);
|
|
||||||
};
|
|
||||||
return function (mod) {
|
|
||||||
if (mod && mod.__esModule) return mod;
|
|
||||||
var result = {};
|
|
||||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
||||||
__setModuleDefault(result, mod);
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.headHttpRequest = headHttpRequest;
|
|
||||||
exports.httpRequest = httpRequest;
|
|
||||||
exports.downloadFile = downloadFile;
|
|
||||||
exports.getJSON = getJSON;
|
|
||||||
exports.getText = getText;
|
|
||||||
const node_fs_1 = require("node:fs");
|
|
||||||
const http = __importStar(require("node:http"));
|
|
||||||
const https = __importStar(require("node:https"));
|
|
||||||
const node_url_1 = require("node:url");
|
|
||||||
const proxy_agent_1 = require("proxy-agent");
|
|
||||||
function headHttpRequest(url) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
const request = httpRequest(url, 'HEAD', response => {
|
|
||||||
// consume response data free node process
|
|
||||||
response.resume();
|
|
||||||
resolve(response.statusCode === 200);
|
|
||||||
}, false);
|
|
||||||
request.on('error', () => {
|
|
||||||
resolve(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function httpRequest(url, method, response, keepAlive = true) {
|
|
||||||
const options = {
|
|
||||||
protocol: url.protocol,
|
|
||||||
hostname: url.hostname,
|
|
||||||
port: url.port,
|
|
||||||
path: url.pathname + url.search,
|
|
||||||
method,
|
|
||||||
headers: keepAlive ? { Connection: 'keep-alive' } : undefined,
|
|
||||||
auth: (0, node_url_1.urlToHttpOptions)(url).auth,
|
|
||||||
agent: new proxy_agent_1.ProxyAgent(),
|
|
||||||
};
|
|
||||||
const requestCallback = (res) => {
|
|
||||||
if (res.statusCode &&
|
|
||||||
res.statusCode >= 300 &&
|
|
||||||
res.statusCode < 400 &&
|
|
||||||
res.headers.location) {
|
|
||||||
httpRequest(new node_url_1.URL(res.headers.location), method, response);
|
|
||||||
// consume response data to free up memory
|
|
||||||
// And prevents the connection from being kept alive
|
|
||||||
res.resume();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
response(res);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const request = options.protocol === 'https:'
|
|
||||||
? https.request(options, requestCallback)
|
|
||||||
: http.request(options, requestCallback);
|
|
||||||
request.end();
|
|
||||||
return request;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
function downloadFile(url, destinationPath, progressCallback) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
let downloadedBytes = 0;
|
|
||||||
let totalBytes = 0;
|
|
||||||
function onData(chunk) {
|
|
||||||
downloadedBytes += chunk.length;
|
|
||||||
progressCallback(downloadedBytes, totalBytes);
|
|
||||||
}
|
|
||||||
const request = httpRequest(url, 'GET', response => {
|
|
||||||
if (response.statusCode !== 200) {
|
|
||||||
const error = new Error(`Download failed: server returned code ${response.statusCode}. URL: ${url}`);
|
|
||||||
// consume response data to free up memory
|
|
||||||
response.resume();
|
|
||||||
reject(error);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const file = (0, node_fs_1.createWriteStream)(destinationPath);
|
|
||||||
file.on('close', () => {
|
|
||||||
// The 'close' event is emitted when the stream and any of its
|
|
||||||
// underlying resources (a file descriptor, for example) have been
|
|
||||||
// closed. The event indicates that no more events will be emitted, and
|
|
||||||
// no further computation will occur.
|
|
||||||
return resolve();
|
|
||||||
});
|
|
||||||
file.on('error', error => {
|
|
||||||
// The 'error' event may be emitted by a Readable implementation at any
|
|
||||||
// time. Typically, this may occur if the underlying stream is unable to
|
|
||||||
// generate data due to an underlying internal failure, or when a stream
|
|
||||||
// implementation attempts to push an invalid chunk of data.
|
|
||||||
return reject(error);
|
|
||||||
});
|
|
||||||
response.pipe(file);
|
|
||||||
totalBytes = parseInt(response.headers['content-length'], 10);
|
|
||||||
if (progressCallback) {
|
|
||||||
response.on('data', onData);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
request.on('error', error => {
|
|
||||||
return reject(error);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
async function getJSON(url) {
|
|
||||||
const text = await getText(url);
|
|
||||||
try {
|
|
||||||
return JSON.parse(text);
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
throw new Error('Could not parse JSON from ' + url.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function getText(url) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const request = httpRequest(url, 'GET', response => {
|
|
||||||
let data = '';
|
|
||||||
if (response.statusCode && response.statusCode >= 400) {
|
|
||||||
return reject(new Error(`Got status code ${response.statusCode}`));
|
|
||||||
}
|
|
||||||
response.on('data', chunk => {
|
|
||||||
data += chunk;
|
|
||||||
});
|
|
||||||
response.on('end', () => {
|
|
||||||
try {
|
|
||||||
return resolve(String(data));
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
return reject(new Error('Chrome version not found'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, false);
|
|
||||||
request.on('error', err => {
|
|
||||||
reject(err);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=httpUtil.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"httpUtil.js","sourceRoot":"","sources":["../../src/httpUtil.ts"],"names":[],"mappings":"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"}
|
|
||||||
157
node_modules/@puppeteer/browsers/lib/cjs/install.d.ts
generated
vendored
157
node_modules/@puppeteer/browsers/lib/cjs/install.d.ts
generated
vendored
|
|
@ -1,157 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2017 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import { Browser, BrowserPlatform } from './browser-data/browser-data.js';
|
|
||||||
import { InstalledBrowser } from './Cache.js';
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export interface InstallOptions {
|
|
||||||
/**
|
|
||||||
* Determines the path to download browsers to.
|
|
||||||
*/
|
|
||||||
cacheDir: string;
|
|
||||||
/**
|
|
||||||
* Determines which platform the browser will be suited for.
|
|
||||||
*
|
|
||||||
* @defaultValue **Auto-detected.**
|
|
||||||
*/
|
|
||||||
platform?: BrowserPlatform;
|
|
||||||
/**
|
|
||||||
* Determines which browser to install.
|
|
||||||
*/
|
|
||||||
browser: Browser;
|
|
||||||
/**
|
|
||||||
* Determines which buildId to download. BuildId should uniquely identify
|
|
||||||
* binaries and they are used for caching.
|
|
||||||
*/
|
|
||||||
buildId: string;
|
|
||||||
/**
|
|
||||||
* An alias for the provided `buildId`. It will be used to maintain local
|
|
||||||
* metadata to support aliases in the `launch` command.
|
|
||||||
*
|
|
||||||
* @example 'canary'
|
|
||||||
*/
|
|
||||||
buildIdAlias?: string;
|
|
||||||
/**
|
|
||||||
* Provides information about the progress of the download. If set to
|
|
||||||
* 'default', the default callback implementing a progress bar will be
|
|
||||||
* used.
|
|
||||||
*/
|
|
||||||
downloadProgressCallback?: 'default' | ((downloadedBytes: number, totalBytes: number) => void);
|
|
||||||
/**
|
|
||||||
* Determines the host that will be used for downloading.
|
|
||||||
*
|
|
||||||
* @defaultValue Either
|
|
||||||
*
|
|
||||||
* - https://storage.googleapis.com/chrome-for-testing-public or
|
|
||||||
* - https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
baseUrl?: string;
|
|
||||||
/**
|
|
||||||
* Whether to unpack and install browser archives.
|
|
||||||
*
|
|
||||||
* @defaultValue `true`
|
|
||||||
*/
|
|
||||||
unpack?: boolean;
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
* @defaultValue `false`
|
|
||||||
*/
|
|
||||||
forceFallbackForTesting?: boolean;
|
|
||||||
/**
|
|
||||||
* Whether to attempt to install system-level dependencies required
|
|
||||||
* for the browser.
|
|
||||||
*
|
|
||||||
* Only supported for Chrome on Debian or Ubuntu.
|
|
||||||
* Requires system-level privileges to run `apt-get`.
|
|
||||||
*
|
|
||||||
* @defaultValue `false`
|
|
||||||
*/
|
|
||||||
installDeps?: boolean;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Downloads and unpacks the browser archive according to the
|
|
||||||
* {@link InstallOptions}.
|
|
||||||
*
|
|
||||||
* @returns a {@link InstalledBrowser} instance.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function install(options: InstallOptions & {
|
|
||||||
unpack?: true;
|
|
||||||
}): Promise<InstalledBrowser>;
|
|
||||||
/**
|
|
||||||
* Downloads the browser archive according to the {@link InstallOptions} without
|
|
||||||
* unpacking.
|
|
||||||
*
|
|
||||||
* @returns the absolute path to the archive.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function install(options: InstallOptions & {
|
|
||||||
unpack: false;
|
|
||||||
}): Promise<string>;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export interface UninstallOptions {
|
|
||||||
/**
|
|
||||||
* Determines the platform for the browser binary.
|
|
||||||
*
|
|
||||||
* @defaultValue **Auto-detected.**
|
|
||||||
*/
|
|
||||||
platform?: BrowserPlatform;
|
|
||||||
/**
|
|
||||||
* The path to the root of the cache directory.
|
|
||||||
*/
|
|
||||||
cacheDir: string;
|
|
||||||
/**
|
|
||||||
* Determines which browser to uninstall.
|
|
||||||
*/
|
|
||||||
browser: Browser;
|
|
||||||
/**
|
|
||||||
* The browser build to uninstall
|
|
||||||
*/
|
|
||||||
buildId: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function uninstall(options: UninstallOptions): Promise<void>;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export interface GetInstalledBrowsersOptions {
|
|
||||||
/**
|
|
||||||
* The path to the root of the cache directory.
|
|
||||||
*/
|
|
||||||
cacheDir: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns metadata about browsers installed in the cache directory.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function getInstalledBrowsers(options: GetInstalledBrowsersOptions): Promise<InstalledBrowser[]>;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function canDownload(options: InstallOptions): Promise<boolean>;
|
|
||||||
/**
|
|
||||||
* Retrieves a URL for downloading the binary archive of a given browser.
|
|
||||||
*
|
|
||||||
* The archive is bound to the specific platform and build ID specified.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function getDownloadUrl(browser: Browser, platform: BrowserPlatform, buildId: string, baseUrl?: string): URL;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function makeProgressCallback(browser: Browser, buildId: string): (downloadedBytes: number, totalBytes: number) => void;
|
|
||||||
//# sourceMappingURL=install.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/install.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/install.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/install.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,EACL,OAAO,EACP,eAAe,EAEhB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAQ,gBAAgB,EAAC,MAAM,YAAY,CAAC;AAwBnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,wBAAwB,CAAC,EACrB,SAAS,GACT,CAAC,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;IAC5D;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,cAAc,GAAG;IAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAC,GACxC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC7B;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,cAAc,GAAG;IAAC,MAAM,EAAE,KAAK,CAAA;CAAC,GACxC,OAAO,CAAC,MAAM,CAAC,CAAC;AA0PnB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAaxE;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAE7B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAe3E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,GAAG,CAEL;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,GACd,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAsBvD"}
|
|
||||||
294
node_modules/@puppeteer/browsers/lib/cjs/install.js
generated
vendored
294
node_modules/@puppeteer/browsers/lib/cjs/install.js
generated
vendored
|
|
@ -1,294 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2017 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.install = install;
|
|
||||||
exports.uninstall = uninstall;
|
|
||||||
exports.getInstalledBrowsers = getInstalledBrowsers;
|
|
||||||
exports.canDownload = canDownload;
|
|
||||||
exports.getDownloadUrl = getDownloadUrl;
|
|
||||||
exports.makeProgressCallback = makeProgressCallback;
|
|
||||||
const node_assert_1 = __importDefault(require("node:assert"));
|
|
||||||
const node_child_process_1 = require("node:child_process");
|
|
||||||
const node_fs_1 = require("node:fs");
|
|
||||||
const promises_1 = require("node:fs/promises");
|
|
||||||
const node_os_1 = __importDefault(require("node:os"));
|
|
||||||
const node_path_1 = __importDefault(require("node:path"));
|
|
||||||
const progress_1 = __importDefault(require("progress"));
|
|
||||||
const browser_data_js_1 = require("./browser-data/browser-data.js");
|
|
||||||
const Cache_js_1 = require("./Cache.js");
|
|
||||||
const debug_js_1 = require("./debug.js");
|
|
||||||
const detectPlatform_js_1 = require("./detectPlatform.js");
|
|
||||||
const fileUtil_js_1 = require("./fileUtil.js");
|
|
||||||
const httpUtil_js_1 = require("./httpUtil.js");
|
|
||||||
const debugInstall = (0, debug_js_1.debug)('puppeteer:browsers:install');
|
|
||||||
const times = new Map();
|
|
||||||
function debugTime(label) {
|
|
||||||
times.set(label, process.hrtime());
|
|
||||||
}
|
|
||||||
function debugTimeEnd(label) {
|
|
||||||
const end = process.hrtime();
|
|
||||||
const start = times.get(label);
|
|
||||||
if (!start) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const duration = end[0] * 1000 + end[1] / 1e6 - (start[0] * 1000 + start[1] / 1e6); // calculate duration in milliseconds
|
|
||||||
debugInstall(`Duration for ${label}: ${duration}ms`);
|
|
||||||
}
|
|
||||||
async function install(options) {
|
|
||||||
options.platform ??= (0, detectPlatform_js_1.detectBrowserPlatform)();
|
|
||||||
options.unpack ??= true;
|
|
||||||
if (!options.platform) {
|
|
||||||
throw new Error(`Cannot download a binary for the provided platform: ${node_os_1.default.platform()} (${node_os_1.default.arch()})`);
|
|
||||||
}
|
|
||||||
const url = getDownloadUrl(options.browser, options.platform, options.buildId, options.baseUrl);
|
|
||||||
try {
|
|
||||||
return await installUrl(url, options);
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
// If custom baseUrl is provided, do not fall back to CfT dashboard.
|
|
||||||
if (options.baseUrl && !options.forceFallbackForTesting) {
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
debugInstall(`Error downloading from ${url}.`);
|
|
||||||
switch (options.browser) {
|
|
||||||
case browser_data_js_1.Browser.CHROME:
|
|
||||||
case browser_data_js_1.Browser.CHROMEDRIVER:
|
|
||||||
case browser_data_js_1.Browser.CHROMEHEADLESSSHELL: {
|
|
||||||
debugInstall(`Trying to find download URL via https://googlechromelabs.github.io/chrome-for-testing.`);
|
|
||||||
const version = (await (0, httpUtil_js_1.getJSON)(new URL(`https://googlechromelabs.github.io/chrome-for-testing/${options.buildId}.json`)));
|
|
||||||
let platform = '';
|
|
||||||
switch (options.platform) {
|
|
||||||
case browser_data_js_1.BrowserPlatform.LINUX:
|
|
||||||
platform = 'linux64';
|
|
||||||
break;
|
|
||||||
case browser_data_js_1.BrowserPlatform.MAC_ARM:
|
|
||||||
platform = 'mac-arm64';
|
|
||||||
break;
|
|
||||||
case browser_data_js_1.BrowserPlatform.MAC:
|
|
||||||
platform = 'mac-x64';
|
|
||||||
break;
|
|
||||||
case browser_data_js_1.BrowserPlatform.WIN32:
|
|
||||||
platform = 'win32';
|
|
||||||
break;
|
|
||||||
case browser_data_js_1.BrowserPlatform.WIN64:
|
|
||||||
platform = 'win64';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
const backupUrl = version.downloads[options.browser]?.find(link => {
|
|
||||||
return link['platform'] === platform;
|
|
||||||
})?.url;
|
|
||||||
if (backupUrl) {
|
|
||||||
// If the URL is the same, skip the retry.
|
|
||||||
if (backupUrl === url.toString()) {
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
debugInstall(`Falling back to downloading from ${backupUrl}.`);
|
|
||||||
return await installUrl(new URL(backupUrl), options);
|
|
||||||
}
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async function installDeps(installedBrowser) {
|
|
||||||
if (process.platform !== 'linux' ||
|
|
||||||
installedBrowser.platform !== browser_data_js_1.BrowserPlatform.LINUX) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Currently, only Debian-like deps are supported.
|
|
||||||
const depsPath = node_path_1.default.join(node_path_1.default.dirname(installedBrowser.executablePath), 'deb.deps');
|
|
||||||
if (!(0, node_fs_1.existsSync)(depsPath)) {
|
|
||||||
debugInstall(`deb.deps file was not found at ${depsPath}`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const data = (0, node_fs_1.readFileSync)(depsPath, 'utf-8').split('\n').join(',');
|
|
||||||
if (process.getuid?.() !== 0) {
|
|
||||||
throw new Error('Installing system dependencies requires root privileges');
|
|
||||||
}
|
|
||||||
let result = (0, node_child_process_1.spawnSync)('apt-get', ['-v']);
|
|
||||||
if (result.status !== 0) {
|
|
||||||
throw new Error('Failed to install system dependencies: apt-get does not seem to be available');
|
|
||||||
}
|
|
||||||
debugInstall(`Trying to install dependencies: ${data}`);
|
|
||||||
result = (0, node_child_process_1.spawnSync)('apt-get', [
|
|
||||||
'satisfy',
|
|
||||||
'-y',
|
|
||||||
data,
|
|
||||||
'--no-install-recommends',
|
|
||||||
]);
|
|
||||||
if (result.status !== 0) {
|
|
||||||
throw new Error(`Failed to install system dependencies: status=${result.status},error=${result.error},stdout=${result.stdout.toString('utf8')},stderr=${result.stderr.toString('utf8')}`);
|
|
||||||
}
|
|
||||||
debugInstall(`Installed system dependencies ${data}`);
|
|
||||||
}
|
|
||||||
async function installUrl(url, options) {
|
|
||||||
options.platform ??= (0, detectPlatform_js_1.detectBrowserPlatform)();
|
|
||||||
if (!options.platform) {
|
|
||||||
throw new Error(`Cannot download a binary for the provided platform: ${node_os_1.default.platform()} (${node_os_1.default.arch()})`);
|
|
||||||
}
|
|
||||||
let downloadProgressCallback = options.downloadProgressCallback;
|
|
||||||
if (downloadProgressCallback === 'default') {
|
|
||||||
downloadProgressCallback = await makeProgressCallback(options.browser, options.buildIdAlias ?? options.buildId);
|
|
||||||
}
|
|
||||||
const fileName = decodeURIComponent(url.toString()).split('/').pop();
|
|
||||||
(0, node_assert_1.default)(fileName, `A malformed download URL was found: ${url}.`);
|
|
||||||
const cache = new Cache_js_1.Cache(options.cacheDir);
|
|
||||||
const browserRoot = cache.browserRoot(options.browser);
|
|
||||||
const archivePath = node_path_1.default.join(browserRoot, `${options.buildId}-${fileName}`);
|
|
||||||
if (!(0, node_fs_1.existsSync)(browserRoot)) {
|
|
||||||
await (0, promises_1.mkdir)(browserRoot, { recursive: true });
|
|
||||||
}
|
|
||||||
if (!options.unpack) {
|
|
||||||
if ((0, node_fs_1.existsSync)(archivePath)) {
|
|
||||||
return archivePath;
|
|
||||||
}
|
|
||||||
debugInstall(`Downloading binary from ${url}`);
|
|
||||||
debugTime('download');
|
|
||||||
await (0, httpUtil_js_1.downloadFile)(url, archivePath, downloadProgressCallback);
|
|
||||||
debugTimeEnd('download');
|
|
||||||
return archivePath;
|
|
||||||
}
|
|
||||||
const outputPath = cache.installationDir(options.browser, options.platform, options.buildId);
|
|
||||||
try {
|
|
||||||
if ((0, node_fs_1.existsSync)(outputPath)) {
|
|
||||||
const installedBrowser = new Cache_js_1.InstalledBrowser(cache, options.browser, options.buildId, options.platform);
|
|
||||||
if (!(0, node_fs_1.existsSync)(installedBrowser.executablePath)) {
|
|
||||||
throw new Error(`The browser folder (${outputPath}) exists but the executable (${installedBrowser.executablePath}) is missing`);
|
|
||||||
}
|
|
||||||
await runSetup(installedBrowser);
|
|
||||||
if (options.installDeps) {
|
|
||||||
await installDeps(installedBrowser);
|
|
||||||
}
|
|
||||||
return installedBrowser;
|
|
||||||
}
|
|
||||||
debugInstall(`Downloading binary from ${url}`);
|
|
||||||
try {
|
|
||||||
debugTime('download');
|
|
||||||
await (0, httpUtil_js_1.downloadFile)(url, archivePath, downloadProgressCallback);
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
debugTimeEnd('download');
|
|
||||||
}
|
|
||||||
debugInstall(`Installing ${archivePath} to ${outputPath}`);
|
|
||||||
try {
|
|
||||||
debugTime('extract');
|
|
||||||
await (0, fileUtil_js_1.unpackArchive)(archivePath, outputPath);
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
debugTimeEnd('extract');
|
|
||||||
}
|
|
||||||
const installedBrowser = new Cache_js_1.InstalledBrowser(cache, options.browser, options.buildId, options.platform);
|
|
||||||
if (options.buildIdAlias) {
|
|
||||||
const metadata = installedBrowser.readMetadata();
|
|
||||||
metadata.aliases[options.buildIdAlias] = options.buildId;
|
|
||||||
installedBrowser.writeMetadata(metadata);
|
|
||||||
}
|
|
||||||
await runSetup(installedBrowser);
|
|
||||||
if (options.installDeps) {
|
|
||||||
await installDeps(installedBrowser);
|
|
||||||
}
|
|
||||||
return installedBrowser;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if ((0, node_fs_1.existsSync)(archivePath)) {
|
|
||||||
await (0, promises_1.unlink)(archivePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async function runSetup(installedBrowser) {
|
|
||||||
// On Windows for Chrome invoke setup.exe to configure sandboxes.
|
|
||||||
if ((installedBrowser.platform === browser_data_js_1.BrowserPlatform.WIN32 ||
|
|
||||||
installedBrowser.platform === browser_data_js_1.BrowserPlatform.WIN64) &&
|
|
||||||
installedBrowser.browser === browser_data_js_1.Browser.CHROME &&
|
|
||||||
installedBrowser.platform === (0, detectPlatform_js_1.detectBrowserPlatform)()) {
|
|
||||||
try {
|
|
||||||
debugTime('permissions');
|
|
||||||
const browserDir = node_path_1.default.dirname(installedBrowser.executablePath);
|
|
||||||
const setupExePath = node_path_1.default.join(browserDir, 'setup.exe');
|
|
||||||
if (!(0, node_fs_1.existsSync)(setupExePath)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
(0, node_child_process_1.spawnSync)(node_path_1.default.join(browserDir, 'setup.exe'), [`--configure-browser-in-directory=` + browserDir], {
|
|
||||||
shell: true,
|
|
||||||
});
|
|
||||||
// TODO: Handle error here. Currently the setup.exe sometimes
|
|
||||||
// errors although it sets the permissions correctly.
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
debugTimeEnd('permissions');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
async function uninstall(options) {
|
|
||||||
options.platform ??= (0, detectPlatform_js_1.detectBrowserPlatform)();
|
|
||||||
if (!options.platform) {
|
|
||||||
throw new Error(`Cannot detect the browser platform for: ${node_os_1.default.platform()} (${node_os_1.default.arch()})`);
|
|
||||||
}
|
|
||||||
new Cache_js_1.Cache(options.cacheDir).uninstall(options.browser, options.platform, options.buildId);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns metadata about browsers installed in the cache directory.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
async function getInstalledBrowsers(options) {
|
|
||||||
return new Cache_js_1.Cache(options.cacheDir).getInstalledBrowsers();
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
async function canDownload(options) {
|
|
||||||
options.platform ??= (0, detectPlatform_js_1.detectBrowserPlatform)();
|
|
||||||
if (!options.platform) {
|
|
||||||
throw new Error(`Cannot download a binary for the provided platform: ${node_os_1.default.platform()} (${node_os_1.default.arch()})`);
|
|
||||||
}
|
|
||||||
return await (0, httpUtil_js_1.headHttpRequest)(getDownloadUrl(options.browser, options.platform, options.buildId, options.baseUrl));
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Retrieves a URL for downloading the binary archive of a given browser.
|
|
||||||
*
|
|
||||||
* The archive is bound to the specific platform and build ID specified.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
function getDownloadUrl(browser, platform, buildId, baseUrl) {
|
|
||||||
return new URL(browser_data_js_1.downloadUrls[browser](platform, buildId, baseUrl));
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
function makeProgressCallback(browser, buildId) {
|
|
||||||
let progressBar;
|
|
||||||
let lastDownloadedBytes = 0;
|
|
||||||
return (downloadedBytes, totalBytes) => {
|
|
||||||
if (!progressBar) {
|
|
||||||
progressBar = new progress_1.default(`Downloading ${browser} ${buildId} - ${toMegabytes(totalBytes)} [:bar] :percent :etas `, {
|
|
||||||
complete: '=',
|
|
||||||
incomplete: ' ',
|
|
||||||
width: 20,
|
|
||||||
total: totalBytes,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const delta = downloadedBytes - lastDownloadedBytes;
|
|
||||||
lastDownloadedBytes = downloadedBytes;
|
|
||||||
progressBar.tick(delta);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function toMegabytes(bytes) {
|
|
||||||
const mb = bytes / 1000 / 1000;
|
|
||||||
return `${Math.round(mb * 10) / 10} MB`;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=install.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/install.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/install.js.map
generated
vendored
File diff suppressed because one or more lines are too long
186
node_modules/@puppeteer/browsers/lib/cjs/launch.d.ts
generated
vendored
186
node_modules/@puppeteer/browsers/lib/cjs/launch.d.ts
generated
vendored
|
|
@ -1,186 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
import childProcess from 'node:child_process';
|
|
||||||
import { type Browser, type BrowserPlatform, type ChromeReleaseChannel } from './browser-data/browser-data.js';
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export interface ComputeExecutablePathOptions {
|
|
||||||
/**
|
|
||||||
* Root path to the storage directory.
|
|
||||||
*
|
|
||||||
* Can be set to `null` if the executable path should be relative
|
|
||||||
* to the extracted download location. E.g. `./chrome-linux64/chrome`.
|
|
||||||
*/
|
|
||||||
cacheDir: string | null;
|
|
||||||
/**
|
|
||||||
* Determines which platform the browser will be suited for.
|
|
||||||
*
|
|
||||||
* @defaultValue **Auto-detected.**
|
|
||||||
*/
|
|
||||||
platform?: BrowserPlatform;
|
|
||||||
/**
|
|
||||||
* Determines which browser to launch.
|
|
||||||
*/
|
|
||||||
browser: Browser;
|
|
||||||
/**
|
|
||||||
* Determines which buildId to download. BuildId should uniquely identify
|
|
||||||
* binaries and they are used for caching.
|
|
||||||
*/
|
|
||||||
buildId: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function computeExecutablePath(options: ComputeExecutablePathOptions): string;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export interface SystemOptions {
|
|
||||||
/**
|
|
||||||
* Determines which platform the browser will be suited for.
|
|
||||||
*
|
|
||||||
* @defaultValue **Auto-detected.**
|
|
||||||
*/
|
|
||||||
platform?: BrowserPlatform;
|
|
||||||
/**
|
|
||||||
* Determines which browser to launch.
|
|
||||||
*/
|
|
||||||
browser: Browser;
|
|
||||||
/**
|
|
||||||
* Release channel to look for on the system.
|
|
||||||
*/
|
|
||||||
channel: ChromeReleaseChannel;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a path to a system-wide Chrome installation given a release channel
|
|
||||||
* name by checking known installation locations (using
|
|
||||||
* {@link https://pptr.dev/browsers-api/browsers.computesystemexecutablepath}).
|
|
||||||
* If Chrome instance is not found at the expected path, an error is thrown.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function computeSystemExecutablePath(options: SystemOptions): string;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export interface LaunchOptions {
|
|
||||||
/**
|
|
||||||
* Absolute path to the browser's executable.
|
|
||||||
*/
|
|
||||||
executablePath: string;
|
|
||||||
/**
|
|
||||||
* Configures stdio streams to open two additional streams for automation over
|
|
||||||
* those streams instead of WebSocket.
|
|
||||||
*
|
|
||||||
* @defaultValue `false`.
|
|
||||||
*/
|
|
||||||
pipe?: boolean;
|
|
||||||
/**
|
|
||||||
* If true, forwards the browser's process stdout and stderr to the Node's
|
|
||||||
* process stdout and stderr.
|
|
||||||
*
|
|
||||||
* @defaultValue `false`.
|
|
||||||
*/
|
|
||||||
dumpio?: boolean;
|
|
||||||
/**
|
|
||||||
* Additional arguments to pass to the executable when launching.
|
|
||||||
*/
|
|
||||||
args?: string[];
|
|
||||||
/**
|
|
||||||
* Environment variables to set for the browser process.
|
|
||||||
*/
|
|
||||||
env?: Record<string, string | undefined>;
|
|
||||||
/**
|
|
||||||
* Handles SIGINT in the Node process and tries to kill the browser process.
|
|
||||||
*
|
|
||||||
* @defaultValue `true`.
|
|
||||||
*/
|
|
||||||
handleSIGINT?: boolean;
|
|
||||||
/**
|
|
||||||
* Handles SIGTERM in the Node process and tries to gracefully close the browser
|
|
||||||
* process.
|
|
||||||
*
|
|
||||||
* @defaultValue `true`.
|
|
||||||
*/
|
|
||||||
handleSIGTERM?: boolean;
|
|
||||||
/**
|
|
||||||
* Handles SIGHUP in the Node process and tries to gracefully close the browser process.
|
|
||||||
*
|
|
||||||
* @defaultValue `true`.
|
|
||||||
*/
|
|
||||||
handleSIGHUP?: boolean;
|
|
||||||
/**
|
|
||||||
* Whether to spawn process in the {@link https://nodejs.org/api/child_process.html#optionsdetached | detached}
|
|
||||||
* mode.
|
|
||||||
*
|
|
||||||
* @defaultValue `true` except on Windows.
|
|
||||||
*/
|
|
||||||
detached?: boolean;
|
|
||||||
/**
|
|
||||||
* A callback to run after the browser process exits or before the process
|
|
||||||
* will be closed via the {@link Process.close} call (including when handling
|
|
||||||
* signals). The callback is only run once.
|
|
||||||
*/
|
|
||||||
onExit?: () => Promise<void>;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Launches a browser process according to {@link LaunchOptions}.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare function launch(opts: LaunchOptions): Process;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare const CDP_WEBSOCKET_ENDPOINT_REGEX: RegExp;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare const WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX: RegExp;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare class Process {
|
|
||||||
#private;
|
|
||||||
constructor(opts: LaunchOptions);
|
|
||||||
get nodeProcess(): childProcess.ChildProcess;
|
|
||||||
close(): Promise<void>;
|
|
||||||
hasClosed(): Promise<void>;
|
|
||||||
kill(): void;
|
|
||||||
/**
|
|
||||||
* Get recent logs (stderr + stdout) emitted by the browser.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
getRecentLogs(): string[];
|
|
||||||
waitForLineOutput(regex: RegExp, timeout?: number): Promise<string>;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
export interface ErrorLike extends Error {
|
|
||||||
name: string;
|
|
||||||
message: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
export declare function isErrorLike(obj: unknown): obj is ErrorLike;
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
export declare function isErrnoException(obj: unknown): obj is NodeJS.ErrnoException;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
export declare class TimeoutError extends Error {
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
constructor(message?: string);
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=launch.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/launch.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/launch.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/launch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAO9C,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAEpB,KAAK,oBAAoB,EAE1B,MAAM,gCAAgC,CAAC;AAOxC;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,MAAM,CAeR;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,OAAO,EAAE,oBAAoB,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAoB1E;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,eAAO,MAAM,4BAA4B,QACF,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,uCAAuC,QACP,CAAC;AAuD9C;;GAEG;AACH,qBAAa,OAAO;;gBAeN,IAAI,EAAE,aAAa;IAwF/B,IAAI,WAAW,IAAI,YAAY,CAAC,YAAY,CAE3C;IAiCK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B,IAAI,IAAI,IAAI;IAmFZ;;;;OAIG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CA4D/D;AAuBD;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,KAAK;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,SAAS,CAI1D;AACD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,cAAc,CAK3E;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC;;OAEG;gBACS,OAAO,CAAC,EAAE,MAAM;CAK7B"}
|
|
||||||
426
node_modules/@puppeteer/browsers/lib/cjs/launch.js
generated
vendored
426
node_modules/@puppeteer/browsers/lib/cjs/launch.js
generated
vendored
|
|
@ -1,426 +0,0 @@
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.TimeoutError = exports.Process = exports.WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX = exports.CDP_WEBSOCKET_ENDPOINT_REGEX = void 0;
|
|
||||||
exports.computeExecutablePath = computeExecutablePath;
|
|
||||||
exports.computeSystemExecutablePath = computeSystemExecutablePath;
|
|
||||||
exports.launch = launch;
|
|
||||||
exports.isErrorLike = isErrorLike;
|
|
||||||
exports.isErrnoException = isErrnoException;
|
|
||||||
const node_child_process_1 = __importDefault(require("node:child_process"));
|
|
||||||
const node_events_1 = require("node:events");
|
|
||||||
const node_fs_1 = require("node:fs");
|
|
||||||
const node_os_1 = __importDefault(require("node:os"));
|
|
||||||
const node_readline_1 = __importDefault(require("node:readline"));
|
|
||||||
const browser_data_js_1 = require("./browser-data/browser-data.js");
|
|
||||||
const Cache_js_1 = require("./Cache.js");
|
|
||||||
const debug_js_1 = require("./debug.js");
|
|
||||||
const detectPlatform_js_1 = require("./detectPlatform.js");
|
|
||||||
const debugLaunch = (0, debug_js_1.debug)('puppeteer:browsers:launcher');
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
function computeExecutablePath(options) {
|
|
||||||
if (options.cacheDir === null) {
|
|
||||||
options.platform ??= (0, detectPlatform_js_1.detectBrowserPlatform)();
|
|
||||||
if (options.platform === undefined) {
|
|
||||||
throw new Error(`No platform specified. Couldn't auto-detect browser platform.`);
|
|
||||||
}
|
|
||||||
return browser_data_js_1.executablePathByBrowser[options.browser](options.platform, options.buildId);
|
|
||||||
}
|
|
||||||
return new Cache_js_1.Cache(options.cacheDir).computeExecutablePath(options);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a path to a system-wide Chrome installation given a release channel
|
|
||||||
* name by checking known installation locations (using
|
|
||||||
* {@link https://pptr.dev/browsers-api/browsers.computesystemexecutablepath}).
|
|
||||||
* If Chrome instance is not found at the expected path, an error is thrown.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
function computeSystemExecutablePath(options) {
|
|
||||||
options.platform ??= (0, detectPlatform_js_1.detectBrowserPlatform)();
|
|
||||||
if (!options.platform) {
|
|
||||||
throw new Error(`Cannot download a binary for the provided platform: ${node_os_1.default.platform()} (${node_os_1.default.arch()})`);
|
|
||||||
}
|
|
||||||
const path = (0, browser_data_js_1.resolveSystemExecutablePath)(options.browser, options.platform, options.channel);
|
|
||||||
try {
|
|
||||||
(0, node_fs_1.accessSync)(path);
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
throw new Error(`Could not find Google Chrome executable for channel '${options.channel}' at '${path}'.`);
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Launches a browser process according to {@link LaunchOptions}.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
function launch(opts) {
|
|
||||||
return new Process(opts);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
exports.CDP_WEBSOCKET_ENDPOINT_REGEX = /^DevTools listening on (ws:\/\/.*)$/;
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
exports.WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX = /^WebDriver BiDi listening on (ws:\/\/.*)$/;
|
|
||||||
const processListeners = new Map();
|
|
||||||
const dispatchers = {
|
|
||||||
exit: (...args) => {
|
|
||||||
processListeners.get('exit')?.forEach(handler => {
|
|
||||||
return handler(...args);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
SIGINT: (...args) => {
|
|
||||||
processListeners.get('SIGINT')?.forEach(handler => {
|
|
||||||
return handler(...args);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
SIGHUP: (...args) => {
|
|
||||||
processListeners.get('SIGHUP')?.forEach(handler => {
|
|
||||||
return handler(...args);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
SIGTERM: (...args) => {
|
|
||||||
processListeners.get('SIGTERM')?.forEach(handler => {
|
|
||||||
return handler(...args);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
||||||
function subscribeToProcessEvent(event, handler) {
|
|
||||||
const listeners = processListeners.get(event) || [];
|
|
||||||
if (listeners.length === 0) {
|
|
||||||
process.on(event, dispatchers[event]);
|
|
||||||
}
|
|
||||||
listeners.push(handler);
|
|
||||||
processListeners.set(event, listeners);
|
|
||||||
}
|
|
||||||
function unsubscribeFromProcessEvent(event, handler) {
|
|
||||||
const listeners = processListeners.get(event) || [];
|
|
||||||
const existingListenerIdx = listeners.indexOf(handler);
|
|
||||||
if (existingListenerIdx === -1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
listeners.splice(existingListenerIdx, 1);
|
|
||||||
processListeners.set(event, listeners);
|
|
||||||
if (listeners.length === 0) {
|
|
||||||
process.off(event, dispatchers[event]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
class Process {
|
|
||||||
#executablePath;
|
|
||||||
#args;
|
|
||||||
#browserProcess;
|
|
||||||
#exited = false;
|
|
||||||
// The browser process can be closed externally or from the driver process. We
|
|
||||||
// need to invoke the hooks only once though but we don't know how many times
|
|
||||||
// we will be invoked.
|
|
||||||
#hooksRan = false;
|
|
||||||
#onExitHook = async () => { };
|
|
||||||
#browserProcessExiting;
|
|
||||||
#logs = [];
|
|
||||||
#maxLogLinesSize = 1000;
|
|
||||||
#lineEmitter = new node_events_1.EventEmitter();
|
|
||||||
constructor(opts) {
|
|
||||||
this.#executablePath = opts.executablePath;
|
|
||||||
this.#args = opts.args ?? [];
|
|
||||||
opts.pipe ??= false;
|
|
||||||
opts.dumpio ??= false;
|
|
||||||
opts.handleSIGINT ??= true;
|
|
||||||
opts.handleSIGTERM ??= true;
|
|
||||||
opts.handleSIGHUP ??= true;
|
|
||||||
// On non-windows platforms, `detached: true` makes child process a
|
|
||||||
// leader of a new process group, making it possible to kill child
|
|
||||||
// process tree with `.kill(-pid)` command. @see
|
|
||||||
// https://nodejs.org/api/child_process.html#child_process_options_detached
|
|
||||||
opts.detached ??= process.platform !== 'win32';
|
|
||||||
const stdio = this.#configureStdio({
|
|
||||||
pipe: opts.pipe,
|
|
||||||
});
|
|
||||||
const env = opts.env || {};
|
|
||||||
debugLaunch(`Launching ${this.#executablePath} ${this.#args.join(' ')}`, {
|
|
||||||
detached: opts.detached,
|
|
||||||
env: Object.keys(env).reduce((res, key) => {
|
|
||||||
if (key.toLowerCase().startsWith('puppeteer_')) {
|
|
||||||
res[key] = env[key];
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}, {}),
|
|
||||||
stdio,
|
|
||||||
});
|
|
||||||
this.#browserProcess = node_child_process_1.default.spawn(this.#executablePath, this.#args, {
|
|
||||||
detached: opts.detached,
|
|
||||||
env,
|
|
||||||
stdio,
|
|
||||||
});
|
|
||||||
this.#recordStream(this.#browserProcess.stderr);
|
|
||||||
this.#recordStream(this.#browserProcess.stdout);
|
|
||||||
debugLaunch(`Launched ${this.#browserProcess.pid}`);
|
|
||||||
if (opts.dumpio) {
|
|
||||||
this.#browserProcess.stderr?.pipe(process.stderr);
|
|
||||||
this.#browserProcess.stdout?.pipe(process.stdout);
|
|
||||||
}
|
|
||||||
subscribeToProcessEvent('exit', this.#onDriverProcessExit);
|
|
||||||
if (opts.handleSIGINT) {
|
|
||||||
subscribeToProcessEvent('SIGINT', this.#onDriverProcessSignal);
|
|
||||||
}
|
|
||||||
if (opts.handleSIGTERM) {
|
|
||||||
subscribeToProcessEvent('SIGTERM', this.#onDriverProcessSignal);
|
|
||||||
}
|
|
||||||
if (opts.handleSIGHUP) {
|
|
||||||
subscribeToProcessEvent('SIGHUP', this.#onDriverProcessSignal);
|
|
||||||
}
|
|
||||||
if (opts.onExit) {
|
|
||||||
this.#onExitHook = opts.onExit;
|
|
||||||
}
|
|
||||||
this.#browserProcessExiting = new Promise((resolve, reject) => {
|
|
||||||
this.#browserProcess.once('exit', async () => {
|
|
||||||
debugLaunch(`Browser process ${this.#browserProcess.pid} onExit`);
|
|
||||||
this.#clearListeners();
|
|
||||||
this.#exited = true;
|
|
||||||
try {
|
|
||||||
await this.#runHooks();
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
reject(err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
resolve();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
async #runHooks() {
|
|
||||||
if (this.#hooksRan) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.#hooksRan = true;
|
|
||||||
await this.#onExitHook();
|
|
||||||
}
|
|
||||||
get nodeProcess() {
|
|
||||||
return this.#browserProcess;
|
|
||||||
}
|
|
||||||
#configureStdio(opts) {
|
|
||||||
if (opts.pipe) {
|
|
||||||
return ['pipe', 'pipe', 'pipe', 'pipe', 'pipe'];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return ['pipe', 'pipe', 'pipe'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#clearListeners() {
|
|
||||||
unsubscribeFromProcessEvent('exit', this.#onDriverProcessExit);
|
|
||||||
unsubscribeFromProcessEvent('SIGINT', this.#onDriverProcessSignal);
|
|
||||||
unsubscribeFromProcessEvent('SIGTERM', this.#onDriverProcessSignal);
|
|
||||||
unsubscribeFromProcessEvent('SIGHUP', this.#onDriverProcessSignal);
|
|
||||||
}
|
|
||||||
#onDriverProcessExit = (_code) => {
|
|
||||||
this.kill();
|
|
||||||
};
|
|
||||||
#onDriverProcessSignal = (signal) => {
|
|
||||||
switch (signal) {
|
|
||||||
case 'SIGINT':
|
|
||||||
this.kill();
|
|
||||||
process.exit(130);
|
|
||||||
case 'SIGTERM':
|
|
||||||
case 'SIGHUP':
|
|
||||||
void this.close();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
async close() {
|
|
||||||
await this.#runHooks();
|
|
||||||
if (!this.#exited) {
|
|
||||||
this.kill();
|
|
||||||
}
|
|
||||||
return await this.#browserProcessExiting;
|
|
||||||
}
|
|
||||||
hasClosed() {
|
|
||||||
return this.#browserProcessExiting;
|
|
||||||
}
|
|
||||||
kill() {
|
|
||||||
debugLaunch(`Trying to kill ${this.#browserProcess.pid}`);
|
|
||||||
// If the process failed to launch (for example if the browser executable path
|
|
||||||
// is invalid), then the process does not get a pid assigned. A call to
|
|
||||||
// `proc.kill` would error, as the `pid` to-be-killed can not be found.
|
|
||||||
if (this.#browserProcess &&
|
|
||||||
this.#browserProcess.pid &&
|
|
||||||
pidExists(this.#browserProcess.pid)) {
|
|
||||||
try {
|
|
||||||
debugLaunch(`Browser process ${this.#browserProcess.pid} exists`);
|
|
||||||
if (process.platform === 'win32') {
|
|
||||||
try {
|
|
||||||
node_child_process_1.default.execSync(`taskkill /pid ${this.#browserProcess.pid} /T /F`);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
debugLaunch(`Killing ${this.#browserProcess.pid} using taskkill failed`, error);
|
|
||||||
// taskkill can fail to kill the process e.g. due to missing permissions.
|
|
||||||
// Let's kill the process via Node API. This delays killing of all child
|
|
||||||
// processes of `this.proc` until the main Node.js process dies.
|
|
||||||
this.#browserProcess.kill();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// on linux the process group can be killed with the group id prefixed with
|
|
||||||
// a minus sign. The process group id is the group leader's pid.
|
|
||||||
const processGroupId = -this.#browserProcess.pid;
|
|
||||||
try {
|
|
||||||
process.kill(processGroupId, 'SIGKILL');
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
debugLaunch(`Killing ${this.#browserProcess.pid} using process.kill failed`, error);
|
|
||||||
// Killing the process group can fail due e.g. to missing permissions.
|
|
||||||
// Let's kill the process via Node API. This delays killing of all child
|
|
||||||
// processes of `this.proc` until the main Node.js process dies.
|
|
||||||
this.#browserProcess.kill('SIGKILL');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
throw new Error(`${PROCESS_ERROR_EXPLANATION}\nError cause: ${isErrorLike(error) ? error.stack : error}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.#clearListeners();
|
|
||||||
}
|
|
||||||
#recordStream(stream) {
|
|
||||||
const rl = node_readline_1.default.createInterface(stream);
|
|
||||||
const cleanup = () => {
|
|
||||||
rl.off('line', onLine);
|
|
||||||
rl.off('close', onClose);
|
|
||||||
try {
|
|
||||||
rl.close();
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
};
|
|
||||||
const onLine = (line) => {
|
|
||||||
if (line.trim() === '') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.#logs.push(line);
|
|
||||||
const delta = this.#logs.length - this.#maxLogLinesSize;
|
|
||||||
if (delta) {
|
|
||||||
this.#logs.splice(0, delta);
|
|
||||||
}
|
|
||||||
this.#lineEmitter.emit('line', line);
|
|
||||||
};
|
|
||||||
const onClose = () => {
|
|
||||||
cleanup();
|
|
||||||
};
|
|
||||||
rl.on('line', onLine);
|
|
||||||
rl.on('close', onClose);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get recent logs (stderr + stdout) emitted by the browser.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
getRecentLogs() {
|
|
||||||
return [...this.#logs];
|
|
||||||
}
|
|
||||||
waitForLineOutput(regex, timeout = 0) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const onClose = (errorOrCode) => {
|
|
||||||
cleanup();
|
|
||||||
reject(new Error([
|
|
||||||
`Failed to launch the browser process: ${errorOrCode instanceof Error
|
|
||||||
? ` ${errorOrCode.message}`
|
|
||||||
: ` Code: ${errorOrCode}`}`,
|
|
||||||
'',
|
|
||||||
`stderr:`,
|
|
||||||
this.getRecentLogs().join('\n'),
|
|
||||||
'',
|
|
||||||
'TROUBLESHOOTING: https://pptr.dev/troubleshooting',
|
|
||||||
'',
|
|
||||||
].join('\n')));
|
|
||||||
};
|
|
||||||
this.#browserProcess.on('exit', onClose);
|
|
||||||
this.#browserProcess.on('error', onClose);
|
|
||||||
const timeoutId = timeout > 0 ? setTimeout(onTimeout, timeout) : undefined;
|
|
||||||
this.#lineEmitter.on('line', onLine);
|
|
||||||
const cleanup = () => {
|
|
||||||
clearTimeout(timeoutId);
|
|
||||||
this.#lineEmitter.off('line', onLine);
|
|
||||||
this.#browserProcess.off('exit', onClose);
|
|
||||||
this.#browserProcess.off('error', onClose);
|
|
||||||
};
|
|
||||||
function onTimeout() {
|
|
||||||
cleanup();
|
|
||||||
reject(new TimeoutError(`Timed out after ${timeout} ms while waiting for the WS endpoint URL to appear in stdout!`));
|
|
||||||
}
|
|
||||||
for (const line of this.#logs) {
|
|
||||||
onLine(line);
|
|
||||||
}
|
|
||||||
function onLine(line) {
|
|
||||||
const match = line.match(regex);
|
|
||||||
if (!match) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cleanup();
|
|
||||||
// The RegExp matches, so this will obviously exist.
|
|
||||||
resolve(match[1]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.Process = Process;
|
|
||||||
const PROCESS_ERROR_EXPLANATION = `Puppeteer was unable to kill the process which ran the browser binary.
|
|
||||||
This means that, on future Puppeteer launches, Puppeteer might not be able to launch the browser.
|
|
||||||
Please check your open processes and ensure that the browser processes that Puppeteer launched have been killed.
|
|
||||||
If you think this is a bug, please report it on the Puppeteer issue tracker.`;
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
function pidExists(pid) {
|
|
||||||
try {
|
|
||||||
return process.kill(pid, 0);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
if (isErrnoException(error)) {
|
|
||||||
if (error.code && error.code === 'ESRCH') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
function isErrorLike(obj) {
|
|
||||||
return (typeof obj === 'object' && obj !== null && 'name' in obj && 'message' in obj);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
function isErrnoException(obj) {
|
|
||||||
return (isErrorLike(obj) &&
|
|
||||||
('errno' in obj || 'code' in obj || 'path' in obj || 'syscall' in obj));
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
class TimeoutError extends Error {
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
constructor(message) {
|
|
||||||
super(message);
|
|
||||||
this.name = this.constructor.name;
|
|
||||||
Error.captureStackTrace(this, this.constructor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.TimeoutError = TimeoutError;
|
|
||||||
//# sourceMappingURL=launch.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/launch.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/launch.js.map
generated
vendored
File diff suppressed because one or more lines are too long
8
node_modules/@puppeteer/browsers/lib/cjs/main-cli.d.ts
generated
vendored
8
node_modules/@puppeteer/browsers/lib/cjs/main-cli.d.ts
generated
vendored
|
|
@ -1,8 +0,0 @@
|
||||||
#!/usr/bin/env node
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
export {};
|
|
||||||
//# sourceMappingURL=main-cli.d.ts.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/main-cli.d.ts.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/main-cli.d.ts.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"main-cli.d.ts","sourceRoot":"","sources":["../../src/main-cli.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
|
|
||||||
11
node_modules/@puppeteer/browsers/lib/cjs/main-cli.js
generated
vendored
11
node_modules/@puppeteer/browsers/lib/cjs/main-cli.js
generated
vendored
|
|
@ -1,11 +0,0 @@
|
||||||
#!/usr/bin/env node
|
|
||||||
"use strict";
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright 2023 Google Inc.
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const CLI_js_1 = require("./CLI.js");
|
|
||||||
void new CLI_js_1.CLI().run(process.argv);
|
|
||||||
//# sourceMappingURL=main-cli.js.map
|
|
||||||
1
node_modules/@puppeteer/browsers/lib/cjs/main-cli.js.map
generated
vendored
1
node_modules/@puppeteer/browsers/lib/cjs/main-cli.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"main-cli.js","sourceRoot":"","sources":["../../src/main-cli.ts"],"names":[],"mappings":";;AAEA;;;;GAIG;;AAEH,qCAA6B;AAE7B,KAAK,IAAI,YAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue