| 
									
										
										
										
											2019-11-18 18:18:28 -08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2020-01-21 12:22:17 -08:00
										 |  |  |  * Copyright (c) Microsoft Corporation. | 
					
						
							| 
									
										
										
										
											2019-11-18 18:18:28 -08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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 | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2020-01-21 12:22:17 -08:00
										 |  |  |  * http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							| 
									
										
										
										
											2019-11-18 18:18:28 -08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-03-19 11:43:35 -07:00
										 |  |  | const fs = require('fs'); | 
					
						
							| 
									
										
										
										
											2020-03-23 12:49:53 -07:00
										 |  |  | const path = require('path'); | 
					
						
							| 
									
										
										
										
											2020-03-19 11:43:35 -07:00
										 |  |  | const browserFetcher = require('./lib/server/browserFetcher.js'); | 
					
						
							|  |  |  | const packageJSON = require('./package.json'); | 
					
						
							| 
									
										
										
										
											2019-11-18 18:18:28 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-24 00:08:00 -07:00
										 |  |  | function localDownloadOptions(browserName) { | 
					
						
							|  |  |  |   const revision = packageJSON.playwright[`${browserName}_revision`]; | 
					
						
							|  |  |  |   const downloadPath = path.join(__dirname, '.local-browsers', `${browserName}-${revision}`); | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     browser: browserName, | 
					
						
							|  |  |  |     progressBarBrowserName: `${browserName} r${revision}`, | 
					
						
							|  |  |  |     revision, | 
					
						
							|  |  |  |     downloadPath, | 
					
						
							|  |  |  |     executablePath: browserFetcher.executablePath({browser: browserName, downloadPath}), | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-03-23 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-24 00:08:00 -07:00
										 |  |  | function downloadOptionsFromENV(packagePath, browserName) { | 
					
						
							|  |  |  |   const browsersPath = getFromENV('PLAYWRIGHT_BROWSERS_PATH'); | 
					
						
							|  |  |  |   const downloadPath = browsersPath ? | 
					
						
							|  |  |  |       path.join(browsersPath, 'v' + packageJSON.version, browserName) : | 
					
						
							|  |  |  |       path.join(packagePath, '.local-browsers', browserName); | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     downloadPath, | 
					
						
							|  |  |  |     progressBarBrowserName: `${browserName} for playwright v${packageJSON.version}`, | 
					
						
							|  |  |  |     revision: packageJSON.playwright[`${browserName}_revision`], | 
					
						
							|  |  |  |     browser: browserName, | 
					
						
							|  |  |  |     host: getFromENV('PLAYWRIGHT_DOWNLOAD_HOST'), | 
					
						
							|  |  |  |     executablePath: browserFetcher.executablePath({browser: browserName, downloadPath}), | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | async function downloadBrowserWithProgressBar(options) { | 
					
						
							| 
									
										
										
										
											2019-11-18 18:18:28 -08:00
										 |  |  |   let progressBar = null; | 
					
						
							|  |  |  |   let lastDownloadedBytes = 0; | 
					
						
							| 
									
										
										
										
											2020-03-19 11:43:35 -07:00
										 |  |  |   function progress(downloadedBytes, totalBytes) { | 
					
						
							| 
									
										
										
										
											2019-11-18 18:18:28 -08:00
										 |  |  |     if (!progressBar) { | 
					
						
							|  |  |  |       const ProgressBar = require('progress'); | 
					
						
							| 
									
										
										
										
											2020-03-24 00:08:00 -07:00
										 |  |  |       progressBar = new ProgressBar(`Downloading ${options.progressBarBrowserName} - ${toMegabytes(totalBytes)} [:bar] :percent :etas `, { | 
					
						
							| 
									
										
										
										
											2019-11-18 18:18:28 -08:00
										 |  |  |         complete: '=', | 
					
						
							|  |  |  |         incomplete: ' ', | 
					
						
							|  |  |  |         width: 20, | 
					
						
							|  |  |  |         total: totalBytes, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     const delta = downloadedBytes - lastDownloadedBytes; | 
					
						
							|  |  |  |     lastDownloadedBytes = downloadedBytes; | 
					
						
							|  |  |  |     progressBar.tick(delta); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-03-24 00:08:00 -07:00
										 |  |  |   await browserFetcher.downloadBrowser({...options, progress}); | 
					
						
							|  |  |  |   logPolitely(`${options.progressBarBrowserName} downloaded to ${options.downloadPath}`); | 
					
						
							| 
									
										
										
										
											2019-11-18 18:18:28 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 11:43:35 -07:00
										 |  |  | 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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-24 00:08:00 -07:00
										 |  |  | module.exports = {downloadBrowserWithProgressBar, downloadOptionsFromENV, localDownloadOptions}; |