/** * Copyright (c) Microsoft Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ const fs = require('fs'); const browserFetcher = require('./lib/server/browserFetcher.js'); const packageJSON = require('./package.json'); async function downloadBrowserWithProgressBar(downloadPath, browser, version = '') { let progressBar = null; let lastDownloadedBytes = 0; const revision = packageJSON.playwright[`${browser}_revision`]; function progress(downloadedBytes, totalBytes) { if (!progressBar) { const ProgressBar = require('progress'); progressBar = new ProgressBar(`Downloading ${browser} r${revision} - ${toMegabytes(totalBytes)} [:bar] :percent :etas `, { complete: '=', incomplete: ' ', width: 20, total: totalBytes, host: getFromENV('PLAYWRIGHT_DOWNLOAD_HOST'), }); } const delta = downloadedBytes - lastDownloadedBytes; lastDownloadedBytes = downloadedBytes; progressBar.tick(delta); } const executablePath = await browserFetcher.downloadBrowser({ downloadPath, browser, revision, progress, }); logPolitely(`${browser} downloaded to ${downloadPath}`); return executablePath; } function toMegabytes(bytes) { const mb = bytes / 1024 / 1024; return `${Math.round(mb * 10) / 10} Mb`; } function logPolitely(toBeLogged) { const logLevel = process.env.npm_config_loglevel; const logLevelDisplay = ['silent', 'error', 'warn'].indexOf(logLevel) > -1; if (!logLevelDisplay) console.log(toBeLogged); } function getFromENV(name) { let value = process.env[name]; value = value || process.env[`npm_config_${name.toLowerCase()}`]; value = value || process.env[`npm_package_config_${name.toLowerCase()}`]; return value; } module.exports = {downloadBrowserWithProgressBar};