UNPKG

squint-cli

Version:

Squint makes visual reviews of web app releases easy

84 lines (83 loc) 3.47 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.compareUrls = exports.clean = exports.resolveUrl = void 0; const path_1 = __importDefault(require("path")); const slugify_1 = __importDefault(require("@sindresorhus/slugify")); const url_1 = require("url"); const bluebird_1 = __importDefault(require("bluebird")); const isString_1 = __importDefault(require("lodash/isString")); const blink_diff_1 = __importDefault(require("blink-diff")); const fs_1 = __importDefault(require("fs")); const utils_1 = require("../utils"); const util_1 = require("util"); const glob_1 = __importDefault(require("glob")); const screenshot_1 = require("./screenshot"); const slugifyWithCounter = slugify_1.default.counter(); const globAsync = util_1.promisify(glob_1.default); function resolveUrl(baseUrl, urlPath) { if (isString_1.default(baseUrl)) { return new url_1.URL(urlPath, baseUrl).toString(); } return baseUrl(urlPath); } exports.resolveUrl = resolveUrl; async function clean(config) { const pattern = path_1.default.join(config.outDir, '*.png'); const files = await globAsync(pattern); await utils_1.promiseEachSeries(files, async (filePath) => { try { await fs_1.default.promises.unlink(filePath); } catch (e) { // ignore } }); try { await fs_1.default.promises.mkdir(config.outDir, { recursive: true }); } catch (e) { // ignore } } exports.clean = clean; async function compareUrls(pagePool, oldUrl, newUrl, config) { const pathname = new url_1.URL(newUrl).pathname; const makePath = (version) => path_1.default.join(config.outDir, `${slugifyWithCounter(`${version}-${pathname}`)}.png`); // Slufigy only once per iteration, to not increase slug counter inside one page diff const paths = { a: makePath('a'), b: makePath('b'), diff: makePath('diff'), }; await pagePool.use(async (page) => { await screenshot_1.takeScreenshot(page, oldUrl, paths.a, config); await screenshot_1.takeScreenshot(page, newUrl, paths.b, config); const diff = new blink_diff_1.default({ imageAPath: paths.a, imageBPath: paths.b, thresholdType: blink_diff_1.default.THRESHOLD_PERCENT, threshold: 0.02, imageOutputPath: paths.diff, }); // stdlib util.promisify didn't work const promisifiedDiff = bluebird_1.default.promisifyAll(diff); const result = await promisifiedDiff.runAsync(); await fs_1.default.promises.unlink(paths.a); await fs_1.default.promises.unlink(paths.b); if (result.differences < 1) { console.error(`Found ${result.differences} differences. No diff image saved.`); await fs_1.default.promises.unlink(paths.diff); } else if (config.singlePage && config.outFile) { await fs_1.default.promises.rename(paths.diff, config.outFile); console.error(`Found ${result.differences} differences. Diff image saved to ${path_1.default.resolve(config.outFile)}`); } else { console.error(`Found ${result.differences} differences. Diff image saved to ${paths.diff}`); } }); } exports.compareUrls = compareUrls;