Initial commit: Torrent search and download application
This commit is contained in:
commit
e38be704ff
4313 changed files with 791544 additions and 0 deletions
14
Dockerfile
Normal file
14
Dockerfile
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
FROM python:3.12-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
ENV HOST=0.0.0.0
|
||||||
|
ENV PORT=8000
|
||||||
|
|
||||||
|
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||||
|
|
||||||
126
README.md
Normal file
126
README.md
Normal file
|
|
@ -0,0 +1,126 @@
|
||||||
|
# Movie Search API
|
||||||
|
|
||||||
|
Проект для поиска фильмов с использованием The Movie Database (TMDB) API.
|
||||||
|
|
||||||
|
## Возможности
|
||||||
|
|
||||||
|
- 🔍 Поиск фильмов по названию через TMDB API
|
||||||
|
- 🎬 Отображение информации о фильмах (постер, описание, рейтинг)
|
||||||
|
- 🔗 Поиск торрентов для выбранного фильма
|
||||||
|
- 📊 Отображение детальной информации о торрентах (размер, разрешение, качество)
|
||||||
|
- 🚀 Интеграция с torAPI для добавления торрентов в клиент
|
||||||
|
- 🌐 Веб-интерфейс для удобного поиска
|
||||||
|
- 📱 Адаптивный дизайн
|
||||||
|
- 🐳 Запуск в Docker контейнере
|
||||||
|
- 🔌 REST API для интеграции
|
||||||
|
|
||||||
|
## Запуск
|
||||||
|
|
||||||
|
### С помощью Docker Compose
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up --build -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Доступ к приложению
|
||||||
|
|
||||||
|
- **Веб-интерфейс**: http://localhost:8089
|
||||||
|
- **API**: http://localhost:8089/api/search/{название_фильма}
|
||||||
|
|
||||||
|
## API Endpoints
|
||||||
|
|
||||||
|
### GET /
|
||||||
|
Главная страница с формой поиска
|
||||||
|
|
||||||
|
### POST /search
|
||||||
|
Поиск фильмов через веб-форму
|
||||||
|
|
||||||
|
**Параметры:**
|
||||||
|
- `movie_title` (form) - название фильма для поиска
|
||||||
|
|
||||||
|
### GET /api/search/{movie_title}
|
||||||
|
API endpoint для поиска фильмов
|
||||||
|
|
||||||
|
**Параметры:**
|
||||||
|
- `movie_title` (path) - название фильма для поиска
|
||||||
|
|
||||||
|
### GET /api/torrents/{movie_title}
|
||||||
|
API endpoint для поиска торрентов фильма
|
||||||
|
|
||||||
|
**Параметры:**
|
||||||
|
- `movie_title` (path) - название фильма для поиска
|
||||||
|
- `year` (query, optional) - год выпуска фильма
|
||||||
|
|
||||||
|
### GET /torrents/{movie_title}
|
||||||
|
Страница с результатами поиска торрентов
|
||||||
|
|
||||||
|
**Параметры:**
|
||||||
|
- `movie_title` (path) - название фильма для поиска
|
||||||
|
- `year` (query, optional) - год выпуска фильма
|
||||||
|
|
||||||
|
**Пример ответа API торрентов:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"torrents": [
|
||||||
|
{
|
||||||
|
"title": "Inception (2010) - 1080p - BluRay",
|
||||||
|
"size_bytes": 2684354560,
|
||||||
|
"size_readable": "2.5 GB",
|
||||||
|
"resolution": "1080p",
|
||||||
|
"quality": "BluRay",
|
||||||
|
"seeds": 150,
|
||||||
|
"peers": 25,
|
||||||
|
"magnet": "magnet:?xt=urn:btih:example0",
|
||||||
|
"download_url": "http://example.com/torrent0.torrent"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"movie_title": "Inception",
|
||||||
|
"year": "2010"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
Приложение использует следующие переменные окружения:
|
||||||
|
|
||||||
|
- `TMDB_API_KEY` - API ключ для TMDB (по умолчанию: 6d58225585fb77af5945a964de41849f)
|
||||||
|
- `HOST` - хост для запуска (по умолчанию: 0.0.0.0)
|
||||||
|
- `PORT` - порт для запуска (по умолчанию: 8000)
|
||||||
|
|
||||||
|
## Технологии
|
||||||
|
|
||||||
|
- **FastAPI** - веб-фреймворк
|
||||||
|
- **Jinja2** - шаблонизатор
|
||||||
|
- **httpx** - HTTP клиент
|
||||||
|
- **Docker** - контейнеризация
|
||||||
|
- **TMDB API** - источник данных о фильмах
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
### Поиск фильмов и торрентов
|
||||||
|
|
||||||
|
1. **Поиск фильма**: Введите название фильма на главной странице
|
||||||
|
2. **Выбор фильма**: Нажмите кнопку "🔍 Найти торренты" на понравившемся фильме
|
||||||
|
3. **Просмотр торрентов**: Изучите доступные торренты с информацией о размере, разрешении и качестве
|
||||||
|
4. **Скачивание**: Используйте кнопки для скачивания .torrent файла или magnet-ссылки
|
||||||
|
5. **Добавление в клиент**: Нажмите "Добавить в клиент" для автоматического добавления в qBittorrent
|
||||||
|
|
||||||
|
### Интеграция с torAPI
|
||||||
|
|
||||||
|
Приложение интегрировано с вашим torAPI сервисом (порт 8088) для автоматического добавления торрентов в qBittorrent клиент.
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
|
```
|
||||||
|
searchTorrentDownl/
|
||||||
|
├── app.py # Основное приложение
|
||||||
|
├── requirements.txt # Python зависимости
|
||||||
|
├── Dockerfile # Docker образ
|
||||||
|
├── docker-compose.yml # Docker Compose конфигурация
|
||||||
|
├── templates/ # HTML шаблоны
|
||||||
|
│ ├── index.html # Главная страница
|
||||||
|
│ ├── results.html # Страница результатов поиска фильмов
|
||||||
|
│ ├── torrents.html # Страница результатов поиска торрентов
|
||||||
|
│ └── error.html # Страница ошибок
|
||||||
|
└── README.md # Документация
|
||||||
|
```
|
||||||
BIN
__pycache__/app.cpython-312.pyc
Normal file
BIN
__pycache__/app.cpython-312.pyc
Normal file
Binary file not shown.
669
app.py
Normal file
669
app.py
Normal file
|
|
@ -0,0 +1,669 @@
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import httpx
|
||||||
|
import requests
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
from fastapi import FastAPI, Request, Form, HTTPException
|
||||||
|
from fastapi.responses import HTMLResponse
|
||||||
|
from fastapi.templating import Jinja2Templates
|
||||||
|
from fastapi.staticfiles import StaticFiles
|
||||||
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
|
|
||||||
|
app = FastAPI(title="Movie Search API", version="1.0.0")
|
||||||
|
|
||||||
|
# Настройка CORS
|
||||||
|
app.add_middleware(
|
||||||
|
CORSMiddleware,
|
||||||
|
allow_origins=["*"], # В продакшене лучше указать конкретные домены
|
||||||
|
allow_credentials=True,
|
||||||
|
allow_methods=["*"],
|
||||||
|
allow_headers=["*"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Настройка шаблонов
|
||||||
|
templates = Jinja2Templates(directory="templates")
|
||||||
|
|
||||||
|
# API ключ TMDB
|
||||||
|
TMDB_API_KEY = os.getenv("TMDB_API_KEY", "6d58225585fb77af5945a964de41849f")
|
||||||
|
TMDB_BASE_URL = "https://api.themoviedb.org/3"
|
||||||
|
|
||||||
|
# URL torAPI
|
||||||
|
TORAPI_URL = os.getenv("TORAPI_URL", "http://localhost:8088")
|
||||||
|
|
||||||
|
# URL Torrent Search API
|
||||||
|
TORRENT_SEARCH_URL = os.getenv("TORRENT_SEARCH_URL", "http://localhost:8443")
|
||||||
|
TORRENT_ADD_URL = os.getenv("TORRENT_ADD_URL", "http://localhost:8444")
|
||||||
|
|
||||||
|
async def search_movies(query: str) -> dict:
|
||||||
|
"""Поиск фильмов через TMDB API"""
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
try:
|
||||||
|
response = await client.get(
|
||||||
|
f"{TMDB_BASE_URL}/search/movie",
|
||||||
|
params={
|
||||||
|
"api_key": TMDB_API_KEY,
|
||||||
|
"query": query,
|
||||||
|
"language": "ru-RU",
|
||||||
|
"include_adult": False
|
||||||
|
}
|
||||||
|
)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.json()
|
||||||
|
except httpx.HTTPError as e:
|
||||||
|
raise HTTPException(status_code=500, detail=f"TMDB API error: {str(e)}")
|
||||||
|
|
||||||
|
async def get_movie_details(movie_id: int) -> dict:
|
||||||
|
"""Получение детальной информации о фильме из TMDB"""
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
try:
|
||||||
|
response = await client.get(
|
||||||
|
f"{TMDB_BASE_URL}/movie/{movie_id}",
|
||||||
|
params={
|
||||||
|
"api_key": TMDB_API_KEY,
|
||||||
|
"language": "ru-RU",
|
||||||
|
"append_to_response": "external_ids"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.json()
|
||||||
|
except httpx.HTTPError as e:
|
||||||
|
raise HTTPException(status_code=500, detail=f"TMDB API error: {str(e)}")
|
||||||
|
|
||||||
|
def parse_size(size_str: str) -> tuple:
|
||||||
|
"""Парсинг размера файла и возврат в байтах и читаемом виде"""
|
||||||
|
if not size_str:
|
||||||
|
return 0, "Неизвестно"
|
||||||
|
|
||||||
|
size_str = size_str.upper().strip()
|
||||||
|
multipliers = {
|
||||||
|
'KB': 1024,
|
||||||
|
'MB': 1024**2,
|
||||||
|
'GB': 1024**3,
|
||||||
|
'TB': 1024**4
|
||||||
|
}
|
||||||
|
|
||||||
|
for unit, multiplier in multipliers.items():
|
||||||
|
if unit in size_str:
|
||||||
|
try:
|
||||||
|
number = float(re.findall(r'[\d.]+', size_str)[0])
|
||||||
|
bytes_size = int(number * multiplier)
|
||||||
|
return bytes_size, size_str
|
||||||
|
except (ValueError, IndexError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
return 0, size_str
|
||||||
|
|
||||||
|
def extract_resolution(title: str) -> str:
|
||||||
|
"""Извлечение разрешения из названия торрента"""
|
||||||
|
title_upper = title.upper()
|
||||||
|
|
||||||
|
# Поиск разрешений
|
||||||
|
resolutions = ['2160P', '4K', '1080P', '720P', '480P', '360P']
|
||||||
|
for res in resolutions:
|
||||||
|
if res in title_upper:
|
||||||
|
if res == '4K':
|
||||||
|
return '2160p'
|
||||||
|
return res.lower()
|
||||||
|
|
||||||
|
# Поиск по паттернам
|
||||||
|
if re.search(r'\b(2160|4k)\b', title_upper):
|
||||||
|
return '2160p'
|
||||||
|
elif re.search(r'\b1080\b', title_upper):
|
||||||
|
return '1080p'
|
||||||
|
elif re.search(r'\b720\b', title_upper):
|
||||||
|
return '720p'
|
||||||
|
elif re.search(r'\b480\b', title_upper):
|
||||||
|
return '480p'
|
||||||
|
|
||||||
|
return 'Неизвестно'
|
||||||
|
|
||||||
|
def normalize_search_term(term: str) -> str:
|
||||||
|
"""Нормализация поискового термина для сцены"""
|
||||||
|
if not term:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
# Убираем артикли
|
||||||
|
term = re.sub(r'\b(the|a|an)\b', '', term, flags=re.IGNORECASE)
|
||||||
|
|
||||||
|
# Заменяем пробелы на точки и дефисы
|
||||||
|
term = re.sub(r'\s+', '.', term.strip())
|
||||||
|
|
||||||
|
# Убираем лишние точки
|
||||||
|
term = re.sub(r'\.+', '.', term)
|
||||||
|
|
||||||
|
# Убираем точки в начале и конце
|
||||||
|
term = term.strip('.')
|
||||||
|
|
||||||
|
return term
|
||||||
|
|
||||||
|
def generate_search_variants(title: str, original_title: str = None, year: str = None) -> list:
|
||||||
|
"""Генерация вариантов названий для поиска"""
|
||||||
|
variants = []
|
||||||
|
|
||||||
|
# Базовые варианты
|
||||||
|
variants.extend([title, original_title] if original_title else [title])
|
||||||
|
|
||||||
|
# Варианты с годом
|
||||||
|
if year:
|
||||||
|
variants.extend([f"{title} {year}", f"{original_title} {year}"] if original_title else [f"{title} {year}"])
|
||||||
|
|
||||||
|
# Нормализованные варианты
|
||||||
|
normalized_variants = [normalize_search_term(v) for v in variants if v]
|
||||||
|
variants.extend(normalized_variants)
|
||||||
|
|
||||||
|
# Специальные варианты для известных фильмов
|
||||||
|
title_lower = title.lower()
|
||||||
|
if 'терминатор' in title_lower or 'terminator' in title_lower:
|
||||||
|
variants.extend(['T2', 'T2.Judgment.Day', 'T2.Judgement.Day'])
|
||||||
|
if '2' in title_lower or 'второй' in title_lower:
|
||||||
|
variants.extend(['Terminator.2', 'Терминатор.2'])
|
||||||
|
|
||||||
|
# Убираем дубликаты и пустые значения
|
||||||
|
return list(set([v for v in variants if v and v.strip()]))
|
||||||
|
|
||||||
|
def score_torrent(torrent: dict, movie_title: str, original_title: str = None, year: str = None) -> float:
|
||||||
|
"""Скоринг торрента по релевантности"""
|
||||||
|
score = 0.0
|
||||||
|
torrent_name = torrent.get('title', '').lower()
|
||||||
|
movie_title_lower = movie_title.lower()
|
||||||
|
original_title_lower = original_title.lower() if original_title else ""
|
||||||
|
|
||||||
|
# Скоринг по названию (0-1)
|
||||||
|
if movie_title_lower in torrent_name:
|
||||||
|
score += 0.8
|
||||||
|
if original_title_lower and original_title_lower in torrent_name:
|
||||||
|
score += 0.9
|
||||||
|
|
||||||
|
# Скоринг по году (0-0.5)
|
||||||
|
if year and year in torrent_name:
|
||||||
|
score += 0.5
|
||||||
|
|
||||||
|
# Скоринг по качеству (0-0.3)
|
||||||
|
quality = torrent.get('quality', '').lower()
|
||||||
|
if 'bluray' in quality or 'remux' in quality:
|
||||||
|
score += 0.3
|
||||||
|
elif 'web-dl' in quality or 'webdl' in quality:
|
||||||
|
score += 0.2
|
||||||
|
elif 'hdtv' in quality:
|
||||||
|
score += 0.1
|
||||||
|
|
||||||
|
# Скоринг по разрешению (0-0.2)
|
||||||
|
resolution = torrent.get('resolution', '').lower()
|
||||||
|
if '2160p' in resolution or '4k' in resolution:
|
||||||
|
score += 0.2
|
||||||
|
elif '1080p' in resolution:
|
||||||
|
score += 0.15
|
||||||
|
elif '720p' in resolution:
|
||||||
|
score += 0.1
|
||||||
|
|
||||||
|
# Скоринг по сидам (0-0.1)
|
||||||
|
seeds = torrent.get('seeds', 0)
|
||||||
|
if seeds > 100:
|
||||||
|
score += 0.1
|
||||||
|
elif seeds > 50:
|
||||||
|
score += 0.05
|
||||||
|
|
||||||
|
return min(score, 1.0) # Ограничиваем максимум 1.0
|
||||||
|
|
||||||
|
def generate_demo_torrents(movie_title: str, year: str = None, original_title: str = None) -> list:
|
||||||
|
"""Генерация демо-данных для тестирования (когда API не работает)"""
|
||||||
|
torrents = []
|
||||||
|
|
||||||
|
# Создаем реалистичные варианты торрентов
|
||||||
|
quality_variants = [
|
||||||
|
{"quality": "BluRay", "resolution": "1080p", "size": "8.5 GB", "seeds": 150, "peers": 25},
|
||||||
|
{"quality": "WEB-DL", "resolution": "1080p", "size": "6.2 GB", "seeds": 120, "peers": 20},
|
||||||
|
{"quality": "BluRay", "resolution": "2160p", "size": "25.3 GB", "seeds": 200, "peers": 35},
|
||||||
|
{"quality": "WEBRip", "resolution": "720p", "size": "3.8 GB", "seeds": 80, "peers": 15},
|
||||||
|
{"quality": "HDTV", "resolution": "720p", "size": "2.1 GB", "seeds": 50, "peers": 8}
|
||||||
|
]
|
||||||
|
|
||||||
|
# Генерируем варианты названий
|
||||||
|
title_variants = [movie_title]
|
||||||
|
if original_title and original_title != movie_title:
|
||||||
|
title_variants.append(original_title)
|
||||||
|
|
||||||
|
for i, variant in enumerate(quality_variants):
|
||||||
|
# Выбираем случайное название
|
||||||
|
base_title = title_variants[i % len(title_variants)]
|
||||||
|
|
||||||
|
# Создаем реалистичное название торрента
|
||||||
|
torrent_title = f"{base_title} ({year or '2020'}) - {variant['resolution']} - {variant['quality']}"
|
||||||
|
|
||||||
|
# Создаем fake magnet hash
|
||||||
|
fake_hash = f"08ada5a7a6183aae1e09d831df6748d566095a10{i:02d}"
|
||||||
|
|
||||||
|
torrent = {
|
||||||
|
"title": torrent_title,
|
||||||
|
"size_bytes": parse_size_to_bytes(variant['size']),
|
||||||
|
"size_readable": variant['size'],
|
||||||
|
"resolution": variant['resolution'],
|
||||||
|
"quality": variant['quality'],
|
||||||
|
"seeds": variant['seeds'],
|
||||||
|
"peers": variant['peers'],
|
||||||
|
"magnet": f"magnet:?xt=urn:btih:{fake_hash}&dn={base_title.replace(' ', '+')}&tr=udp://tracker.openbittorrent.com:80",
|
||||||
|
"download_url": f"https://example.com/torrent/{fake_hash}/",
|
||||||
|
"category": "Фильмы",
|
||||||
|
"date": "2025-01-05",
|
||||||
|
"provider": "Demo",
|
||||||
|
"relevance_score": 0.9 - (i * 0.1) # Убывающий скор
|
||||||
|
}
|
||||||
|
torrents.append(torrent)
|
||||||
|
|
||||||
|
return torrents
|
||||||
|
|
||||||
|
async def search_torrents(movie_title: str, year: str = None, original_title: str = None, genres: list = None, imdb_id: str = None) -> list:
|
||||||
|
"""Поиск торрентов для фильма через Torrent Search API"""
|
||||||
|
torrents = []
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Генерируем варианты поисковых запросов
|
||||||
|
search_queries = generate_search_variants(movie_title, original_title, year)
|
||||||
|
print(f"Generated search variants: {search_queries}")
|
||||||
|
|
||||||
|
# Добавляем IMDB ID если есть
|
||||||
|
if imdb_id:
|
||||||
|
search_queries.append(imdb_id)
|
||||||
|
|
||||||
|
# Получаем список доступных провайдеров
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
providers_response = await client.get(f"{TORRENT_SEARCH_URL}/api/provider/list")
|
||||||
|
if providers_response.status_code != 200:
|
||||||
|
print(f"Failed to get providers: {providers_response.status_code}")
|
||||||
|
return torrents
|
||||||
|
|
||||||
|
providers = providers_response.json()
|
||||||
|
print(f"Available providers: {[p['Provider'] for p in providers]}")
|
||||||
|
|
||||||
|
# Ищем торренты на всех доступных провайдерах
|
||||||
|
for provider in providers:
|
||||||
|
provider_name = provider['Provider'].lower()
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Пробуем каждый вариант поискового запроса
|
||||||
|
for search_query in search_queries:
|
||||||
|
print(f"Searching '{search_query}' on {provider_name}")
|
||||||
|
|
||||||
|
# Поиск на конкретном провайдере - исправленный эндпоинт
|
||||||
|
search_response = await client.get(
|
||||||
|
f"{TORRENT_SEARCH_URL}/api/search/title/{provider_name}",
|
||||||
|
params={"query": search_query}
|
||||||
|
)
|
||||||
|
|
||||||
|
if search_response.status_code == 200:
|
||||||
|
results = search_response.json()
|
||||||
|
if not isinstance(results, list):
|
||||||
|
print(f"Unexpected response format from {provider_name}: {type(results)}")
|
||||||
|
continue
|
||||||
|
print(f"Found {len(results)} results for '{search_query}' on {provider_name}")
|
||||||
|
|
||||||
|
# Обрабатываем все результаты и скорим их
|
||||||
|
for result in results[:20]: # Берем больше результатов для скоринга
|
||||||
|
print(f"Processing torrent: {result['Name'][:100]}...")
|
||||||
|
torrent = parse_torrent_result(result, movie_title, year)
|
||||||
|
if torrent:
|
||||||
|
# Скорим торрент
|
||||||
|
score = score_torrent(torrent, movie_title, original_title, year)
|
||||||
|
torrent['relevance_score'] = score
|
||||||
|
size_mb = torrent.get('size_bytes', 0) / (1024 * 1024)
|
||||||
|
print(f"Torrent score: {score:.2f}, size: {size_mb:.1f}MB, seeds: {torrent.get('seeds', 0)} - {result['Name'][:100]}...")
|
||||||
|
|
||||||
|
# Добавляем только если скор больше 0.1 и размер больше 100MB
|
||||||
|
if score > 0.1 and torrent.get('size_bytes', 0) > 100 * 1024 * 1024:
|
||||||
|
torrents.append(torrent)
|
||||||
|
print(f" ✅ Added to results")
|
||||||
|
else:
|
||||||
|
print(f" ❌ Filtered out (score: {score:.2f}, size: {size_mb:.1f}MB)")
|
||||||
|
|
||||||
|
# Если нашли достаточно результатов, переходим к следующему провайдеру
|
||||||
|
if len(torrents) >= 20:
|
||||||
|
break
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error searching on {provider_name}: {e}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Сортируем по количеству сидов и ограничиваем общее количество
|
||||||
|
torrents.sort(key=lambda x: x.get('seeds', 0), reverse=True)
|
||||||
|
return torrents[:30] # Возвращаем топ-30 результатов
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error searching torrents: {e}")
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
return torrents
|
||||||
|
|
||||||
|
async def search_torrent_by_id(torrent_id: str) -> dict:
|
||||||
|
"""Поиск торрента по ID через Torrent Search API"""
|
||||||
|
try:
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
print(f"Searching torrent by ID: {torrent_id}")
|
||||||
|
|
||||||
|
# Используем правильный эндпоинт для поиска по ID
|
||||||
|
response = await client.get(
|
||||||
|
f"{TORRENT_SEARCH_URL}/api/search/id/rutracker",
|
||||||
|
params={"query": torrent_id}
|
||||||
|
)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
results = response.json()
|
||||||
|
if results and len(results) > 0:
|
||||||
|
# Берем первый результат
|
||||||
|
result = results[0]
|
||||||
|
print(f"Found torrent by ID: {result.get('Name', 'Unknown')[:100]}...")
|
||||||
|
|
||||||
|
# Получаем magnet-ссылку и добавляем публичные трекеры
|
||||||
|
magnet = result.get('Magnet', '')
|
||||||
|
if magnet and not magnet.startswith('magnet:'):
|
||||||
|
# Если нет magnet-ссылки, генерируем из хэша
|
||||||
|
hash_value = result.get('Hash', '')
|
||||||
|
if hash_value:
|
||||||
|
magnet = f"magnet:?xt=urn:btih:{hash_value}"
|
||||||
|
|
||||||
|
# Создаем чистую magnet-ссылку только с хэшем для использования DHT
|
||||||
|
if magnet and magnet.startswith('magnet:'):
|
||||||
|
# Извлекаем только хэш из magnet-ссылки
|
||||||
|
import re
|
||||||
|
hash_match = re.search(r'xt=urn:btih:([A-F0-9]+)', magnet)
|
||||||
|
if hash_match:
|
||||||
|
hash_value = hash_match.group(1)
|
||||||
|
# Создаем чистую magnet-ссылку только с хэшем (DHT будет искать пиров)
|
||||||
|
magnet = f"magnet:?xt=urn:btih:{hash_value}"
|
||||||
|
|
||||||
|
# Парсим результат в стандартный формат
|
||||||
|
torrent = {
|
||||||
|
"title": result.get('Name', ''),
|
||||||
|
"url": result.get('Url', ''),
|
||||||
|
"hash": result.get('Hash', ''),
|
||||||
|
"magnet": magnet,
|
||||||
|
"torrent_url": result.get('Torrent', ''),
|
||||||
|
"imdb_url": result.get('IMDb_link', ''),
|
||||||
|
"kinopoisk_url": result.get('Kinopoisk_link', ''),
|
||||||
|
"poster": result.get('Poster', ''),
|
||||||
|
"year": result.get('Year', ''),
|
||||||
|
"release": result.get('Release', ''),
|
||||||
|
"type": result.get('Type', ''),
|
||||||
|
"duration": result.get('Duration', ''),
|
||||||
|
"audio": result.get('Audio', ''),
|
||||||
|
"director": result.get('Directer', ''),
|
||||||
|
"actors": result.get('Actors', ''),
|
||||||
|
"description": result.get('Description', ''),
|
||||||
|
"quality": result.get('Quality', ''),
|
||||||
|
"video": result.get('Video', ''),
|
||||||
|
"files": result.get('Files', []),
|
||||||
|
"provider": "rutracker",
|
||||||
|
"id": torrent_id
|
||||||
|
}
|
||||||
|
return torrent
|
||||||
|
else:
|
||||||
|
print(f"No results found for ID: {torrent_id}")
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
print(f"Error searching by ID: {response.status_code} - {response.text}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error searching torrent by ID: {e}")
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
return None
|
||||||
|
|
||||||
|
def is_movie_torrent(torrent_name: str, movie_title: str, original_title: str = None) -> bool:
|
||||||
|
"""Проверяет, является ли торрент фильмом"""
|
||||||
|
torrent_name_lower = torrent_name.lower()
|
||||||
|
movie_title_lower = movie_title.lower()
|
||||||
|
original_title_lower = original_title.lower() if original_title else ""
|
||||||
|
|
||||||
|
# Исключаем только явно не-фильмы
|
||||||
|
exclude_keywords = ['игра', 'game', 'музыка', 'music', 'программа', 'program', 'софт', 'software']
|
||||||
|
for keyword in exclude_keywords:
|
||||||
|
if keyword in torrent_name_lower:
|
||||||
|
print(f"Excluding due to keyword '{keyword}': {torrent_name[:100]}...")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Проверяем, что название содержит название фильма (русское или оригинальное)
|
||||||
|
contains_title = movie_title_lower in torrent_name_lower
|
||||||
|
if original_title_lower and not contains_title:
|
||||||
|
contains_title = original_title_lower in torrent_name_lower
|
||||||
|
|
||||||
|
print(f"Title '{movie_title_lower}' or '{original_title_lower}' in torrent: {contains_title}")
|
||||||
|
return contains_title
|
||||||
|
|
||||||
|
def parse_torrent_result(result: dict, movie_title: str, year: str = None) -> dict:
|
||||||
|
"""Парсит результат поиска торрентов"""
|
||||||
|
try:
|
||||||
|
# Извлекаем разрешение из названия
|
||||||
|
resolution = extract_resolution(result['Name'])
|
||||||
|
|
||||||
|
# Извлекаем качество из названия
|
||||||
|
quality = extract_quality(result['Name'])
|
||||||
|
|
||||||
|
# Парсим размер
|
||||||
|
size_bytes = parse_size_to_bytes(result['Size'])
|
||||||
|
|
||||||
|
# Создаем magnet-ссылку (используем поле Magnet если есть, иначе генерируем из хэша)
|
||||||
|
magnet = None
|
||||||
|
if 'Magnet' in result and result['Magnet']:
|
||||||
|
magnet = result['Magnet']
|
||||||
|
elif 'Hash' in result and result['Hash']:
|
||||||
|
# Генерируем magnet-ссылку из хэша
|
||||||
|
hash_value = result['Hash']
|
||||||
|
magnet = f"magnet:?xt=urn:btih:{hash_value}"
|
||||||
|
elif 'Torrent' in result and result['Torrent']:
|
||||||
|
# Используем URL на .torrent файл как fallback
|
||||||
|
magnet = result['Torrent']
|
||||||
|
|
||||||
|
# Определяем провайдера по URL
|
||||||
|
provider = 'Unknown'
|
||||||
|
torrent_url = result.get('Torrent', '')
|
||||||
|
if 'rutracker.org' in torrent_url:
|
||||||
|
provider = 'rutracker'
|
||||||
|
elif 'kinozal.tv' in torrent_url:
|
||||||
|
provider = 'kinozal'
|
||||||
|
elif 'rutor.info' in torrent_url:
|
||||||
|
provider = 'rutor'
|
||||||
|
elif 'nnmclub.to' in torrent_url:
|
||||||
|
provider = 'nonameclub'
|
||||||
|
|
||||||
|
return {
|
||||||
|
"title": result['Name'],
|
||||||
|
"size_bytes": size_bytes,
|
||||||
|
"size_readable": result['Size'],
|
||||||
|
"resolution": resolution,
|
||||||
|
"quality": quality,
|
||||||
|
"seeds": int(result.get('Seeds', 0)),
|
||||||
|
"peers": int(result.get('Peers', 0)),
|
||||||
|
"magnet": magnet,
|
||||||
|
"download_url": result.get('Torrent', ''),
|
||||||
|
"category": result.get('Category', ''),
|
||||||
|
"date": result.get('Date', ''),
|
||||||
|
"provider": provider,
|
||||||
|
"id": result.get('Id', '')
|
||||||
|
}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error parsing torrent result: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def extract_quality(title: str) -> str:
|
||||||
|
"""Извлекает качество из названия торрента"""
|
||||||
|
title_upper = title.upper()
|
||||||
|
|
||||||
|
if 'BLURAY' in title_upper or 'BDRIP' in title_upper:
|
||||||
|
return 'BluRay'
|
||||||
|
elif 'WEB-DL' in title_upper or 'WEBDL' in title_upper:
|
||||||
|
return 'WEB-DL'
|
||||||
|
elif 'WEBRIP' in title_upper or 'WEB-RIP' in title_upper:
|
||||||
|
return 'WEBRip'
|
||||||
|
elif 'HDTV' in title_upper:
|
||||||
|
return 'HDTV'
|
||||||
|
elif 'DVDRIP' in title_upper or 'DVD-RIP' in title_upper:
|
||||||
|
return 'DVDRip'
|
||||||
|
else:
|
||||||
|
return 'Unknown'
|
||||||
|
|
||||||
|
def parse_size_to_bytes(size_str: str) -> int:
|
||||||
|
"""Конвертирует строку размера в байты"""
|
||||||
|
size_str = size_str.upper().strip()
|
||||||
|
multipliers = {
|
||||||
|
'KB': 1024,
|
||||||
|
'MB': 1024**2,
|
||||||
|
'GB': 1024**3,
|
||||||
|
'TB': 1024**4
|
||||||
|
}
|
||||||
|
|
||||||
|
for unit, multiplier in multipliers.items():
|
||||||
|
if unit in size_str:
|
||||||
|
try:
|
||||||
|
number = float(re.findall(r'[\d.]+', size_str)[0])
|
||||||
|
return int(number * multiplier)
|
||||||
|
except (ValueError, IndexError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
@app.get("/", response_class=HTMLResponse)
|
||||||
|
async def home(request: Request):
|
||||||
|
"""Главная страница с формой поиска"""
|
||||||
|
return templates.TemplateResponse("index.html", {"request": request})
|
||||||
|
|
||||||
|
@app.post("/search", response_class=HTMLResponse)
|
||||||
|
async def search(request: Request, movie_title: str = Form(...)):
|
||||||
|
"""Обработка поиска фильмов"""
|
||||||
|
try:
|
||||||
|
search_results = await search_movies(movie_title)
|
||||||
|
return templates.TemplateResponse(
|
||||||
|
"results.html",
|
||||||
|
{
|
||||||
|
"request": request,
|
||||||
|
"query": movie_title,
|
||||||
|
"movies": search_results.get("results", []),
|
||||||
|
"total_results": search_results.get("total_results", 0)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
except HTTPException as e:
|
||||||
|
return templates.TemplateResponse(
|
||||||
|
"error.html",
|
||||||
|
{
|
||||||
|
"request": request,
|
||||||
|
"error": str(e.detail)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
@app.get("/api/search/{movie_title}")
|
||||||
|
async def api_search(movie_title: str):
|
||||||
|
"""API endpoint для поиска фильмов (возвращает JSON)"""
|
||||||
|
try:
|
||||||
|
search_results = await search_movies(movie_title)
|
||||||
|
return search_results
|
||||||
|
except HTTPException as e:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
@app.get("/api/torrents/{movie_title}")
|
||||||
|
async def api_search_torrents(movie_title: str, year: str = None, original_title: str = None, genres: str = None, imdb_id: str = None):
|
||||||
|
"""API endpoint для поиска торрентов фильма"""
|
||||||
|
try:
|
||||||
|
# Парсим жанры из строки
|
||||||
|
genres_list = None
|
||||||
|
if genres:
|
||||||
|
genres_list = [g.strip() for g in genres.split(',')]
|
||||||
|
|
||||||
|
torrents = await search_torrents(movie_title, year, original_title, genres_list, imdb_id)
|
||||||
|
return {"torrents": torrents, "movie_title": movie_title, "year": year}
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(status_code=500, detail=f"Torrent search error: {str(e)}")
|
||||||
|
|
||||||
|
@app.get("/api/torrent/id/{torrent_id}")
|
||||||
|
async def api_search_torrent_by_id(torrent_id: str):
|
||||||
|
"""API endpoint для поиска торрента по ID"""
|
||||||
|
try:
|
||||||
|
torrent = await search_torrent_by_id(torrent_id)
|
||||||
|
if torrent:
|
||||||
|
return {"status": "success", "torrent": torrent}
|
||||||
|
else:
|
||||||
|
return {"status": "error", "message": f"Торрент с ID {torrent_id} не найден"}
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(status_code=500, detail=f"Torrent ID search error: {str(e)}")
|
||||||
|
|
||||||
|
@app.get("/torrents/{movie_title}", response_class=HTMLResponse)
|
||||||
|
async def torrents_page(request: Request, movie_title: str, year: str = None):
|
||||||
|
"""Страница с результатами поиска торрентов"""
|
||||||
|
try:
|
||||||
|
torrents = await search_torrents(movie_title, year)
|
||||||
|
return templates.TemplateResponse(
|
||||||
|
"torrents.html",
|
||||||
|
{
|
||||||
|
"request": request,
|
||||||
|
"movie_title": movie_title,
|
||||||
|
"year": year,
|
||||||
|
"torrents": torrents
|
||||||
|
}
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
return templates.TemplateResponse(
|
||||||
|
"error.html",
|
||||||
|
{
|
||||||
|
"request": request,
|
||||||
|
"error": f"Ошибка поиска торрентов: {str(e)}"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
@app.post("/api/add-torrent")
|
||||||
|
async def add_torrent_to_client(torrent_id: str = Form(...)):
|
||||||
|
"""Добавление торрента в qBittorrent через прямое API"""
|
||||||
|
try:
|
||||||
|
print(f"Attempting to add torrent with ID: {torrent_id}")
|
||||||
|
|
||||||
|
# Получаем magnet-ссылку по ID
|
||||||
|
torrent_info = await search_torrent_by_id(torrent_id)
|
||||||
|
if not torrent_info:
|
||||||
|
return {"status": "error", "message": f"Торрент с ID {torrent_id} не найден"}
|
||||||
|
|
||||||
|
magnet = torrent_info.get('magnet')
|
||||||
|
if not magnet:
|
||||||
|
return {"status": "error", "message": f"Magnet-ссылка не найдена для торрента {torrent_id}"}
|
||||||
|
|
||||||
|
print(f"Found magnet link: {magnet[:100]}...")
|
||||||
|
|
||||||
|
# Получаем учетные данные из переменных окружения
|
||||||
|
qb_username = os.getenv("QBITTORRENT_USERNAME", "admin")
|
||||||
|
qb_password = os.getenv("QBITTORRENT_PASSWORD", "vrubel07")
|
||||||
|
qb_host = os.getenv("QBITTORRENT_HOST", "172.17.0.1")
|
||||||
|
qb_port = os.getenv("QBITTORRENT_PORT", "8080")
|
||||||
|
qb_url = f"http://{qb_host}:{qb_port}"
|
||||||
|
|
||||||
|
async with httpx.AsyncClient(timeout=60.0) as client:
|
||||||
|
# Аутентификация в qBittorrent
|
||||||
|
auth_response = await client.post(
|
||||||
|
f"{qb_url}/api/v2/auth/login",
|
||||||
|
data={"username": qb_username, "password": qb_password}
|
||||||
|
)
|
||||||
|
|
||||||
|
if auth_response.status_code != 200 or auth_response.text.strip() != "Ok.":
|
||||||
|
return {"status": "error", "message": f"Ошибка аутентификации в qBittorrent: {auth_response.text}"}
|
||||||
|
|
||||||
|
print("Successfully authenticated with qBittorrent")
|
||||||
|
|
||||||
|
# Добавляем торрент по magnet-ссылке
|
||||||
|
add_response = await client.post(
|
||||||
|
f"{qb_url}/api/v2/torrents/add",
|
||||||
|
data={"urls": magnet}
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f"Add response status: {add_response.status_code}")
|
||||||
|
print(f"Add response text: {add_response.text}")
|
||||||
|
|
||||||
|
if add_response.status_code == 200:
|
||||||
|
return {"status": "success", "message": f"Торрент '{torrent_info.get('title', 'Unknown')[:50]}...' добавлен в qBittorrent!"}
|
||||||
|
else:
|
||||||
|
return {"status": "error", "message": f"Ошибка добавления торрента (HTTP {add_response.status_code}): {add_response.text}"}
|
||||||
|
|
||||||
|
except httpx.ConnectError as e:
|
||||||
|
print(f"Connection error: {e}")
|
||||||
|
raise HTTPException(status_code=503, detail=f"qBittorrent недоступен по адресу {qb_url}. Убедитесь, что сервис запущен")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Unexpected error: {e}")
|
||||||
|
raise HTTPException(status_code=500, detail=f"Ошибка при добавлении торрента: {str(e)}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import uvicorn
|
||||||
|
uvicorn.run(app, host="0.0.0.0", port=8000)
|
||||||
5
cookies.txt
Normal file
5
cookies.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
# Netscape HTTP Cookie File
|
||||||
|
# https://curl.se/docs/http-cookies.html
|
||||||
|
# This file was generated by libcurl! Edit at your own risk.
|
||||||
|
|
||||||
|
#HttpOnly_localhost FALSE / FALSE 0 SID bvwY9x+Qz/w9Lvz+bD0XH1WVH1RD2GFD
|
||||||
55
docker-compose.yml
Normal file
55
docker-compose.yml
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
services:
|
||||||
|
movie-search:
|
||||||
|
build: .
|
||||||
|
container_name: movie-search
|
||||||
|
environment:
|
||||||
|
- TMDB_API_KEY=6d58225585fb77af5945a964de41849f
|
||||||
|
- HOST=0.0.0.0
|
||||||
|
- PORT=8000
|
||||||
|
- TORAPI_URL=http://torrent-api:8000
|
||||||
|
- TORRENT_SEARCH_URL=http://host.docker.internal:8443
|
||||||
|
- TORRENT_ADD_URL=http://host.docker.internal:8088
|
||||||
|
- QBITTORRENT_USERNAME=admin
|
||||||
|
- QBITTORRENT_PASSWORD=vrubel07
|
||||||
|
- QBITTORRENT_HOST=host.docker.internal
|
||||||
|
- QBITTORRENT_PORT=8080
|
||||||
|
ports:
|
||||||
|
- "8089:8000"
|
||||||
|
restart: unless-stopped
|
||||||
|
extra_hosts:
|
||||||
|
- "host.docker.internal:host-gateway"
|
||||||
|
networks:
|
||||||
|
- torrentvideo_default
|
||||||
|
- default
|
||||||
|
|
||||||
|
torapi-search:
|
||||||
|
image: lifailon/torapi:latest
|
||||||
|
container_name: TorAPI-Search
|
||||||
|
environment:
|
||||||
|
- USERNAME=
|
||||||
|
- PASSWORD=
|
||||||
|
ports:
|
||||||
|
- "8443:8443"
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- torrentvideo_default
|
||||||
|
- default
|
||||||
|
|
||||||
|
torapi-qbittorrent:
|
||||||
|
image: lifailon/torapi:latest
|
||||||
|
container_name: TorAPI-qBittorrent
|
||||||
|
environment:
|
||||||
|
- USERNAME=admin
|
||||||
|
- PASSWORD=vrubel07
|
||||||
|
- PROXY_ADDRESS=172.17.0.1
|
||||||
|
- PROXY_PORT=8080
|
||||||
|
ports:
|
||||||
|
- "8444:8443"
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- torrentvideo_default
|
||||||
|
- default
|
||||||
|
|
||||||
|
networks:
|
||||||
|
torrentvideo_default:
|
||||||
|
external: true
|
||||||
50
get_rutracker_cookie.js
Normal file
50
get_rutracker_cookie.js
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
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
Symbolic link
1
node_modules/.bin/browsers
generated
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../@puppeteer/browsers/lib/cjs/main-cli.js
|
||||||
1
node_modules/.bin/escodegen
generated
vendored
Symbolic link
1
node_modules/.bin/escodegen
generated
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../escodegen/bin/escodegen.js
|
||||||
1
node_modules/.bin/esgenerate
generated
vendored
Symbolic link
1
node_modules/.bin/esgenerate
generated
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../escodegen/bin/esgenerate.js
|
||||||
1
node_modules/.bin/esparse
generated
vendored
Symbolic link
1
node_modules/.bin/esparse
generated
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../esprima/bin/esparse.js
|
||||||
1
node_modules/.bin/esvalidate
generated
vendored
Symbolic link
1
node_modules/.bin/esvalidate
generated
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../esprima/bin/esvalidate.js
|
||||||
1
node_modules/.bin/extract-zip
generated
vendored
Symbolic link
1
node_modules/.bin/extract-zip
generated
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../extract-zip/cli.js
|
||||||
1
node_modules/.bin/js-yaml
generated
vendored
Symbolic link
1
node_modules/.bin/js-yaml
generated
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../js-yaml/bin/js-yaml.js
|
||||||
1
node_modules/.bin/puppeteer
generated
vendored
Symbolic link
1
node_modules/.bin/puppeteer
generated
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../puppeteer/lib/cjs/puppeteer/node/cli.js
|
||||||
1
node_modules/.bin/semver
generated
vendored
Symbolic link
1
node_modules/.bin/semver
generated
vendored
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../semver/bin/semver.js
|
||||||
1012
node_modules/.package-lock.json
generated
vendored
Normal file
1012
node_modules/.package-lock.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
22
node_modules/@babel/code-frame/LICENSE
generated
vendored
Normal file
22
node_modules/@babel/code-frame/LICENSE
generated
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
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
Normal file
19
node_modules/@babel/code-frame/README.md
generated
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
# @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
Normal file
216
node_modules/@babel/code-frame/lib/index.js
generated
vendored
Normal file
|
|
@ -0,0 +1,216 @@
|
||||||
|
'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
Normal file
1
node_modules/@babel/code-frame/lib/index.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
31
node_modules/@babel/code-frame/package.json
generated
vendored
Normal file
31
node_modules/@babel/code-frame/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"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
Normal file
22
node_modules/@babel/helper-validator-identifier/LICENSE
generated
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
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
Normal file
19
node_modules/@babel/helper-validator-identifier/README.md
generated
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
# @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
Normal file
70
node_modules/@babel/helper-validator-identifier/lib/identifier.js
generated
vendored
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
"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
Normal file
1
node_modules/@babel/helper-validator-identifier/lib/identifier.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
57
node_modules/@babel/helper-validator-identifier/lib/index.js
generated
vendored
Normal file
57
node_modules/@babel/helper-validator-identifier/lib/index.js
generated
vendored
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
"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
Normal file
1
node_modules/@babel/helper-validator-identifier/lib/index.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
35
node_modules/@babel/helper-validator-identifier/lib/keyword.js
generated
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
"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
Normal file
1
node_modules/@babel/helper-validator-identifier/lib/keyword.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
31
node_modules/@babel/helper-validator-identifier/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"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
Normal file
88
node_modules/@puppeteer/browsers/README.md
generated
vendored
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
# @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
Normal file
29
node_modules/@puppeteer/browsers/lib/cjs/CLI.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/CLI.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
362
node_modules/@puppeteer/browsers/lib/cjs/CLI.js
generated
vendored
Normal file
|
|
@ -0,0 +1,362 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/CLI.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
86
node_modules/@puppeteer/browsers/lib/cjs/Cache.d.ts
generated
vendored
Normal file
86
node_modules/@puppeteer/browsers/lib/cjs/Cache.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/Cache.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
191
node_modules/@puppeteer/browsers/lib/cjs/Cache.js
generated
vendored
Normal file
|
|
@ -0,0 +1,191 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/Cache.js.map
generated
vendored
Normal file
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
Normal file
61
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
241
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.js
generated
vendored
Normal file
|
|
@ -0,0 +1,241 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/browser-data.js.map
generated
vendored
Normal file
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
Normal file
6
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
58
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.js
generated
vendored
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome-headless-shell.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
30
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
149
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.js
generated
vendored
Normal file
|
|
@ -0,0 +1,149 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chrome.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
6
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
54
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.js
generated
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromedriver.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
12
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
73
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.js
generated
vendored
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/chromium.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
20
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
381
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.js
generated
vendored
Normal file
|
|
@ -0,0 +1,381 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/firefox.js.map
generated
vendored
Normal file
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
Normal file
66
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
66
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.js
generated
vendored
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/browser-data/types.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
8
node_modules/@puppeteer/browsers/lib/cjs/debug.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/debug.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
14
node_modules/@puppeteer/browsers/lib/cjs/debug.js
generated
vendored
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/debug.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
11
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
53
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.js
generated
vendored
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/detectPlatform.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
17
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
196
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.js
generated
vendored
Normal file
|
|
@ -0,0 +1,196 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/fileUtil.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"fileUtil.js","sourceRoot":"","sources":["../../src/fileUtil.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBH,sCAgCC;AA9CD,2DAAoD;AACpD,qCAAyC;AACzC,+CAAgD;AAChD,gDAAkC;AAElC,6CAAmC;AAEnC,kDAA0B;AAE1B,MAAM,aAAa,GAAG,IAAA,eAAK,EAAC,6BAA6B,CAAC,CAAC;AAE3D;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,WAAmB,EACnB,UAAkB;IAElB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,EAAC,GAAG,EAAE,UAAU,EAAC,CAAC,CAAC;IAC3D,CAAC;SAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5C,MAAM,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,MAAM,IAAA,gBAAK,EAAC,UAAU,CAAC,CAAC;QACxB,MAAM,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,sBAAsB;QACtB,MAAM,MAAM,GAAG,IAAA,8BAAS,EAAC,WAAW,EAAE,CAAC,eAAe,UAAU,EAAE,CAAC,EAAE;YACnE,GAAG,EAAE;gBACH,cAAc,EAAE,cAAc;aAC/B;SACF,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,qBAAqB,WAAW,OAAO,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,CACtE,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,MAAM,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAoD;IAEpD,MAAM,MAAM,GAAG,IAAI,oBAAM,CAAC,SAAS,CAAC;QAClC,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ;YACjC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,KAAK,CAAC,QAAQ;YACZ,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC3B,QAAQ,EAAE,CAAC;YACb,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBAClB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;QAC1B,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACtC,wDAAwD;YACxD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,MAAM;SACT,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;QACjB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;SACD,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;QACf,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;QACvB,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACU,QAAA,2BAA2B,GAAG;IACzC,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,OAAO;CACf,CAAC;AAEF;;GAEG;AACH,KAAK,UAAU,UAAU,CACvB,OAAe,EACf,UAAkB,EAClB,qBAA+D;IAE/D,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACjD,SAAS,WAAW,CAAC,WAAmB;YACtC,OAAO,CAAC,KAAY,EAAE,EAAE;gBACtB,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC/C,KAAK,GAAG,IAAI,KAAK,CACf,KAAK,WAAW,+CAA+C,EAC/D;wBACE,KAAK,EAAE,KAAK;qBACb,CACF,CAAC;gBACJ,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,0BAAK,EAClB,mCAA2B,CAAC,qBAAqB,CAAC,EAClD,CAAC,IAAI,CAAC,EACN;YACE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;SACnC,CACF;aACE,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAC;aACjD,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;YACnB,aAAa,CAAC,GAAG,qBAAqB,iBAAiB,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEL,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5B,IAAA,0BAAgB,EAAC,OAAO,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,UAAkB;IAC3D,MAAM,EAAC,MAAM,EAAC,GAAG,IAAA,8BAAS,EAAC,SAAS,EAAE;QACpC,QAAQ;QACR,WAAW;QACX,aAAa;QACb,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,IAAA,kBAAO,EAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACpC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAU,EAAE,OAAO,CAAC,CAAC;QAEnD,IAAA,8BAAS,EAAC,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QACT,IAAA,8BAAS,EAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
|
||||||
5
node_modules/@puppeteer/browsers/lib/cjs/generated/version.d.ts
generated
vendored
Normal file
5
node_modules/@puppeteer/browsers/lib/cjs/generated/version.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/generated/version.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
8
node_modules/@puppeteer/browsers/lib/cjs/generated/version.js
generated
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/generated/version.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
16
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
172
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.js
generated
vendored
Normal file
|
|
@ -0,0 +1,172 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/httpUtil.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"httpUtil.js","sourceRoot":"","sources":["../../src/httpUtil.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASH,0CAgBC;AAED,kCAsCC;AAKD,oCAiDC;AAED,0BAOC;AAED,0BA2BC;AA3JD,qCAA0C;AAC1C,gDAAkC;AAClC,kDAAoC;AACpC,uCAA+C;AAE/C,6CAAuC;AAEvC,SAAgB,eAAe,CAAC,GAAQ;IACtC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,OAAO,GAAG,WAAW,CACzB,GAAG,EACH,MAAM,EACN,QAAQ,CAAC,EAAE;YACT,0CAA0C;YAC1C,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,QAAQ,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC;QACvC,CAAC,EACD,KAAK,CACN,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,WAAW,CACzB,GAAQ,EACR,MAAc,EACd,QAA2C,EAC3C,SAAS,GAAG,IAAI;IAEhB,MAAM,OAAO,GAAwB;QACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM;QAC/B,MAAM;QACN,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAC,UAAU,EAAE,YAAY,EAAC,CAAC,CAAC,CAAC,SAAS;QAC3D,IAAI,EAAE,IAAA,2BAAgB,EAAC,GAAG,CAAC,CAAC,IAAI;QAChC,KAAK,EAAE,IAAI,wBAAU,EAAE;KACxB,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,GAAyB,EAAQ,EAAE;QAC1D,IACE,GAAG,CAAC,UAAU;YACd,GAAG,CAAC,UAAU,IAAI,GAAG;YACrB,GAAG,CAAC,UAAU,GAAG,GAAG;YACpB,GAAG,CAAC,OAAO,CAAC,QAAQ,EACpB,CAAC;YACD,WAAW,CAAC,IAAI,cAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC7D,0CAA0C;YAC1C,oDAAoD;YACpD,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC;QACzC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAC1B,GAAQ,EACR,eAAuB,EACvB,gBAAwE;IAExE,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,SAAS,MAAM,CAAC,KAAa;YAC3B,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC;YAChC,gBAAiB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE;YACjD,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAChC,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,yCAAyC,QAAQ,CAAC,UAAU,UAAU,GAAG,EAAE,CAC5E,CAAC;gBACF,0CAA0C;gBAC1C,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,IAAA,2BAAiB,EAAC,eAAe,CAAC,CAAC;YAChD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACpB,8DAA8D;gBAC9D,kEAAkE;gBAClE,uEAAuE;gBACvE,qCAAqC;gBACrC,OAAO,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;gBACvB,uEAAuE;gBACvE,wEAAwE;gBACxE,wEAAwE;gBACxE,4DAA4D;gBAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAE,EAAE,EAAE,CAAC,CAAC;YAC/D,IAAI,gBAAgB,EAAE,CAAC;gBACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;YAC1B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,OAAO,CAAC,GAAQ;IACpC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,SAAgB,OAAO,CAAC,GAAQ;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,WAAW,CACzB,GAAG,EACH,KAAK,EACL,QAAQ,CAAC,EAAE;YACT,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;gBACtD,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;gBAC1B,IAAI,IAAI,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC;oBACH,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EACD,KAAK,CACN,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;YACxB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
||||||
157
node_modules/@puppeteer/browsers/lib/cjs/install.d.ts
generated
vendored
Normal file
157
node_modules/@puppeteer/browsers/lib/cjs/install.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,157 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/install.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
294
node_modules/@puppeteer/browsers/lib/cjs/install.js
generated
vendored
Normal file
|
|
@ -0,0 +1,294 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/install.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
186
node_modules/@puppeteer/browsers/lib/cjs/launch.d.ts
generated
vendored
Normal file
186
node_modules/@puppeteer/browsers/lib/cjs/launch.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,186 @@
|
||||||
|
/**
|
||||||
|
* @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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/launch.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Normal file
426
node_modules/@puppeteer/browsers/lib/cjs/launch.js
generated
vendored
Normal file
|
|
@ -0,0 +1,426 @@
|
||||||
|
"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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/launch.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
8
node_modules/@puppeteer/browsers/lib/cjs/main-cli.d.ts
generated
vendored
Normal file
8
node_modules/@puppeteer/browsers/lib/cjs/main-cli.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/main-cli.d.ts.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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
Executable file
11
node_modules/@puppeteer/browsers/lib/cjs/main-cli.js
generated
vendored
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/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
Normal file
1
node_modules/@puppeteer/browsers/lib/cjs/main-cli.js.map
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"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