regressify
Version:
Visual regression tests support
70 lines • 3.25 kB
JavaScript
import chalk from 'chalk';
import fs from 'fs';
import { spawnSync } from 'child_process';
import { createRequire } from 'module';
import path from 'path';
import { exit } from 'process';
const supportedBrowsers = ['chromium', 'firefox', 'webkit'];
export function getDependencyResolver() {
const currentModuleRequire = createRequire(import.meta.url);
try {
currentModuleRequire.resolve('playwright/package.json');
currentModuleRequire.resolve('playwright-core/package.json');
return currentModuleRequire;
}
catch {
const backstopPackageJsonPath = currentModuleRequire.resolve('backstopjs/package.json');
return createRequire(backstopPackageJsonPath);
}
}
export function getBrowserInstallTargets(dependencyResolver = getDependencyResolver(), readFileSync = fs.readFileSync) {
const playwrightCorePackageJsonPath = dependencyResolver.resolve('playwright-core/package.json');
const browsersJsonPath = path.join(path.dirname(playwrightCorePackageJsonPath), 'browsers.json');
const browsers = JSON.parse(readFileSync(browsersJsonPath, 'utf-8'));
return supportedBrowsers.map((browserName) => {
const browser = browsers.browsers.find((candidate) => candidate.name === browserName);
if (!browser?.browserVersion) {
throw new Error(`Unable to determine the installed Playwright browser version for ${browserName}.`);
}
return {
name: browserName,
browserVersion: browser.browserVersion,
};
});
}
export function installBrowsers({ dependencyResolver, readFileSync = fs.readFileSync, spawn = spawnSync, exitFn = exit, env = process.env, execPath = process.execPath, log = console.log, } = {}) {
try {
const resolver = dependencyResolver ?? getDependencyResolver();
const playwrightPackageJsonPath = resolver.resolve('playwright/package.json');
const playwrightCliPath = path.join(path.dirname(playwrightPackageJsonPath), 'cli.js');
const browserInstallTargets = getBrowserInstallTargets(resolver, readFileSync);
log(chalk.blue('Installing browser binaries used by this regressify release:'));
browserInstallTargets.forEach((target) => {
log(`- ${target.name}: ${target.browserVersion}`);
});
log(chalk.blue('Use these versions for BrowserStack browserVersion values when you need parity.'));
const result = spawn(execPath, [playwrightCliPath, 'install', ...browserInstallTargets.map((target) => target.name)], {
stdio: 'inherit',
env,
});
if (result.error) {
throw result.error;
}
if (result.signal) {
throw new Error(`Playwright install was interrupted by signal ${result.signal}.`);
}
if (typeof result.status !== 'number') {
throw new Error('Playwright install exited without a status code.');
}
if (result.status !== 0) {
exitFn(result.status);
return;
}
}
catch (error) {
const message = error instanceof Error ? error.message : String(error);
log(chalk.red(message));
exitFn(1);
}
}
//# sourceMappingURL=install.js.map