squint-cli
Version:
Squint makes visual reviews of web app releases easy
84 lines (83 loc) • 3.47 kB
JavaScript
;
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;