@pixsame/cypress-plugin-visual-regression-diff 0.0.0-canary-20261007-tvtlvt3u
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +563 -0
- package/bin/cli.js +4 -0
- package/dist/commands.d.ts +60 -0
- package/dist/constants.d.ts +28 -0
- package/dist/constants.js +43 -0
- package/dist/constants.js.map +1 -0
- package/dist/constants.mjs +34 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/migrate.d.ts +22 -0
- package/dist/migrate.js +554 -0
- package/dist/migrate.js.map +1 -0
- package/dist/plugins.d.ts +1 -0
- package/dist/plugins.js +575 -0
- package/dist/plugins.js.map +1 -0
- package/dist/plugins.mjs +567 -0
- package/dist/plugins.mjs.map +1 -0
- package/dist/support.d.ts +12 -0
- package/dist/support.js +647 -0
- package/dist/support.js.map +1 -0
- package/dist/support.mjs +633 -0
- package/dist/support.mjs.map +1 -0
- package/dist/types.d.ts +20 -0
- package/package.json +126 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.js","sources":["../src/constants.ts","../src/version.utils.ts","../../../node_modules/.pnpm/truncate-utf8-bytes@1.0.2/node_modules/truncate-utf8-bytes/lib/truncate.js","../../../node_modules/.pnpm/truncate-utf8-bytes@1.0.2/node_modules/truncate-utf8-bytes/index.js","../../../node_modules/.pnpm/sanitize-filename@1.6.4/node_modules/sanitize-filename/index.js","../src/screenshotPath.utils.ts","../src/image.utils.ts","../src/task.hook.ts","../src/afterScreenshot.hook.ts","../src/plugins.ts"],"sourcesContent":["const PLUGIN_NAME = 'cp-visual-regression-diff';\nexport const LINK_PREFIX = `#${PLUGIN_NAME}-`;\nexport const OVERLAY_CLASS = `${PLUGIN_NAME}-overlay`;\nexport const FAB_CLASS = `${PLUGIN_NAME}-fab`;\nexport const FAB_BADGE_CLASS = `${PLUGIN_NAME}-fab-badge`;\nexport const IMAGE_SNAPSHOT_PREFIX = `__${PLUGIN_NAME}_snapshots__`;\n\nexport enum FILE_SUFFIX {\n diff = '.diff',\n actual = '.actual',\n}\n\nexport const TASK = {\n getScreenshotPathInfo: `${PLUGIN_NAME}-getScreenshotPathInfo`,\n compareImages: `${PLUGIN_NAME}-compareImages`,\n approveImage: `${PLUGIN_NAME}-approveImage`,\n cleanupImages: `${PLUGIN_NAME}-cleanupImages`,\n doesFileExist: `${PLUGIN_NAME}-doesFileExist`,\n processImgPath: `${PLUGIN_NAME}-processImgPath`,\n recordPendingDiff: `${PLUGIN_NAME}-recordPendingDiff`,\n getPendingDiffs: `${PLUGIN_NAME}-getPendingDiffs`,\n clearPendingDiffs: `${PLUGIN_NAME}-clearPendingDiffs`,\n /* c8 ignore next */\n};\n\nexport const PATH_VARIABLES = {\n specPath: '{spec_path}',\n unixSystemRootPath: '{unix_system_root_path}',\n winSystemRootPath: '{win_system_root_path}',\n} as const;\n\nexport const WINDOWS_LIKE_DRIVE_REGEX = /^[A-Z]:$/;\n\nexport const METADATA_KEY = 'FRSOURCE_CPVRD_V';\n\nexport const LS_SHOW_NON_FAILING_DIFFS = 'cp-vrd-show-non-failing-diffs';\n","export const supportsExpose = (version: string): boolean => {\n const [major, minor] = version.split('.').map(Number);\n return major > 15 || (major === 15 && minor >= 10);\n};\n\nexport const getPluginConfig = (\n config: Cypress.PluginConfigOptions,\n key: string,\n): unknown => {\n if (supportsExpose(config.version ?? '')) {\n return config.expose?.[key];\n }\n return config.env?.[key];\n};\n","'use strict';\n\nfunction isHighSurrogate(codePoint) {\n return codePoint >= 0xd800 && codePoint <= 0xdbff;\n}\n\nfunction isLowSurrogate(codePoint) {\n return codePoint >= 0xdc00 && codePoint <= 0xdfff;\n}\n\n// Truncate string by size in bytes\nmodule.exports = function truncate(getLength, string, byteLength) {\n if (typeof string !== \"string\") {\n throw new Error(\"Input must be string\");\n }\n\n var charLength = string.length;\n var curByteLength = 0;\n var codePoint;\n var segment;\n\n for (var i = 0; i < charLength; i += 1) {\n codePoint = string.charCodeAt(i);\n segment = string[i];\n\n if (isHighSurrogate(codePoint) && isLowSurrogate(string.charCodeAt(i + 1))) {\n i += 1;\n segment += string[i];\n }\n\n curByteLength += getLength(segment);\n\n if (curByteLength === byteLength) {\n return string.slice(0, i + 1);\n }\n else if (curByteLength > byteLength) {\n return string.slice(0, i - segment.length + 1);\n }\n }\n\n return string;\n};\n\n","'use strict';\n\nvar truncate = require(\"./lib/truncate\");\nvar getLength = Buffer.byteLength.bind(Buffer);\nmodule.exports = truncate.bind(null, getLength);\n","/*jshint node:true*/\n'use strict';\n\n/**\n * Replaces characters in strings that are illegal/unsafe for filenames.\n * Unsafe characters are either removed or replaced by a substitute set\n * in the optional `options` object.\n *\n * Illegal Characters on Various Operating Systems\n * / ? < > \\ : * | \"\n * https://kb.acronis.com/content/39790\n *\n * Unicode Control codes\n * C0 0x00-0x1f & C1 (0x80-0x9f)\n * http://en.wikipedia.org/wiki/C0_and_C1_control_codes\n *\n * Reserved filenames on Unix-based systems (\".\", \"..\")\n * Reserved filenames in Windows (\"CON\", \"PRN\", \"AUX\", \"NUL\", \"COM1\",\n * \"COM2\", \"COM3\", \"COM4\", \"COM5\", \"COM6\", \"COM7\", \"COM8\", \"COM9\",\n * \"LPT1\", \"LPT2\", \"LPT3\", \"LPT4\", \"LPT5\", \"LPT6\", \"LPT7\", \"LPT8\", and\n * \"LPT9\") case-insesitively and with or without filename extensions.\n *\n * Capped at 255 characters in length.\n * http://unix.stackexchange.com/questions/32795/what-is-the-maximum-allowed-filename-and-folder-size-with-ecryptfs\n *\n * @param {String} input Original filename\n * @param {Object} options {replacement: String | Function }\n * @return {String} Sanitized filename\n */\n\nvar truncate = require(\"truncate-utf8-bytes\");\n\nvar illegalRe = /[\\/\\?<>\\\\:\\*\\|\"]/g;\nvar controlRe = /[\\x00-\\x1f\\x80-\\x9f]/g;\nvar reservedRe = /^\\.+$/;\nvar windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\\..*)?$/i;\n\n/**\n * Strip trailing spaces and dots, which are not allowed on some Windows file\n * systems. Does not use a regex to avoid a quadratic ReDoS vulnerability\n * (CWE-1333).\n */\nfunction replaceTrailingDotsAndSpaces(str, replacement) {\n var end = str.length;\n while (end > 0 && (str[end - 1] === '.' || str[end - 1] === ' ')) end--;\n return end < str.length ? str.slice(0, end) + replacement : str;\n}\n\nfunction sanitize(input, replacement) {\n if (typeof input !== 'string') {\n throw new Error('Input must be string');\n }\n var sanitized = input\n .replace(illegalRe, replacement)\n .replace(controlRe, replacement)\n .replace(reservedRe, replacement)\n .replace(windowsReservedRe, replacement);\n sanitized = replaceTrailingDotsAndSpaces(sanitized, replacement);\n return truncate(sanitized, 255);\n}\n\nmodule.exports = function (input, options) {\n var replacement = (options && options.replacement) || '';\n var output = sanitize(input, replacement);\n if (replacement === '') {\n return output;\n }\n return sanitize(output, '');\n};\n","import path from 'path';\nimport {\n FILE_SUFFIX,\n IMAGE_SNAPSHOT_PREFIX,\n PATH_VARIABLES,\n WINDOWS_LIKE_DRIVE_REGEX,\n} from './constants';\nimport sanitize from 'sanitize-filename';\n\n// highest `_#n` index handed out per screenshot path during the current spec\nconst nameCacheCounter: Record<string, number> = {};\n// counters as they were before the current test attempt started, for every\n// path the attempt touched - a retry restores them so the regenerated\n// screenshots get the same names again\nconst countersBeforeAttempt: Record<string, number> = {};\nlet currentAttempt: { testId: string; retry: number } | undefined;\n\nconst resetMap = (map: Record<string, unknown>) => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n for (const key in map) delete map[key];\n};\n\nconst parsePathPartVariables = (\n specPath: string,\n pathPart: string,\n i: number,\n) => {\n if (pathPart === PATH_VARIABLES.specPath) {\n return path.dirname(specPath);\n } else if (i === 0 && !pathPart) {\n // when unix-like absolute path\n return PATH_VARIABLES.unixSystemRootPath;\n } else if (i === 0 && WINDOWS_LIKE_DRIVE_REGEX.test(pathPart)) {\n // when win-like absolute path\n return path.join(PATH_VARIABLES.winSystemRootPath, pathPart[0]);\n }\n\n return pathPart;\n};\n\nconst startAttempt = (testId: string, retry: number) => {\n const isSameTest = currentAttempt?.testId === testId;\n if (isSameTest && currentAttempt && retry > currentAttempt.retry) {\n for (const screenshotPath in countersBeforeAttempt) {\n nameCacheCounter[screenshotPath] = countersBeforeAttempt[screenshotPath];\n }\n }\n if (!isSameTest || (currentAttempt && retry !== currentAttempt.retry)) {\n resetMap(countersBeforeAttempt);\n }\n currentAttempt = { testId, retry };\n};\n\nexport const generateScreenshotPath = ({\n titleFromOptions,\n imagesPath,\n specPath,\n currentRetryNumber,\n testId,\n}: {\n titleFromOptions: string;\n imagesPath: string;\n specPath: string;\n currentRetryNumber: number;\n /** Stable id of the test being run; used to tell a retry from the next test. */\n testId: string;\n}) => {\n const screenshotPath = path.join(\n ...imagesPath.split('/').map(parsePathPartVariables.bind(void 0, specPath)),\n sanitize(titleFromOptions),\n );\n\n startAttempt(testId, currentRetryNumber);\n\n if (typeof nameCacheCounter[screenshotPath] === 'undefined') {\n nameCacheCounter[screenshotPath] = -1;\n }\n if (!(screenshotPath in countersBeforeAttempt)) {\n countersBeforeAttempt[screenshotPath] = nameCacheCounter[screenshotPath];\n }\n\n return path.join(\n IMAGE_SNAPSHOT_PREFIX,\n `${screenshotPath}_#${++nameCacheCounter[screenshotPath]}${FILE_SUFFIX.actual}.png`,\n );\n};\n\nconst screenshotPathRegex = new RegExp(\n `^([\\\\s\\\\S]+?)_#([0-9]+)(?:(?:\\\\${FILE_SUFFIX.diff})|(?:\\\\${FILE_SUFFIX.actual}))?\\\\.(?:png|PNG)$`,\n);\nexport const wasScreenshotUsed = (imagePath: string) => {\n const matched = imagePath.match(screenshotPathRegex);\n /* c8 ignore next */ if (!matched) return false;\n const [, screenshotPath, numString] = matched;\n const num = parseInt(numString);\n /* c8 ignore next */ if (!screenshotPath || isNaN(num)) return false;\n return (\n screenshotPath in nameCacheCounter &&\n num <= nameCacheCounter[screenshotPath]\n );\n};\n\nexport const resetScreenshotNameCache = () => {\n currentAttempt = undefined;\n resetMap(nameCacheCounter);\n resetMap(countersBeforeAttempt);\n};\n","import path from 'path';\nimport fs from 'fs';\nimport { PNG, PNGWithMetadata } from 'pngjs';\nimport sharp from 'sharp';\nimport metaPngPkg from 'meta-png';\nconst { addMetadata, getMetadata } = metaPngPkg;\nimport { globSync } from 'glob';\nimport { wasScreenshotUsed } from './screenshotPath.utils';\nimport { METADATA_KEY } from './constants';\n\n// version of images generated by this plugin\n// bump only when there is a breaking change to:\n// image comparison or image generation algorithms\nconst DIFF_IMAGES_VERSION = '1';\n\ntype PluginMetadata = {\n version: string;\n testingType?: 'e2e' | 'component';\n};\n\ntype PluginMetadataConfig = {\n testingType?: string;\n};\n\nexport const addPNGMetadata = (config: PluginMetadataConfig, png: Buffer) =>\n addMetadata(\n new Uint8Array(png),\n METADATA_KEY,\n JSON.stringify({\n version: DIFF_IMAGES_VERSION,\n testingType: config.testingType || 'e2e',\n } as PluginMetadata) /* c8 ignore next */,\n );\nexport const getPNGMetadata = (png: Buffer): PluginMetadata | undefined => {\n const metadataString = getMetadata(\n new Uint8Array(png),\n METADATA_KEY /* c8 ignore next */,\n );\n if (metadataString === undefined) return;\n try {\n return JSON.parse(metadataString);\n } catch /* v8 ignore next 2 */ {\n return { version: metadataString };\n }\n};\nexport const isImageCurrentVersion = (png: Buffer) =>\n getPNGMetadata(png)?.version === DIFF_IMAGES_VERSION;\nexport const isImageGeneratedByPlugin = (png: Buffer) =>\n !!getPNGMetadata(png /* c8 ignore next */);\nexport const isImageOfTestType = (\n png: Buffer,\n testingType?: PluginMetadataConfig['testingType'],\n) => {\n if (!isImageGeneratedByPlugin(png)) return false;\n const imageTestingType = getPNGMetadata(\n png /* c8 ignore next */,\n )?.testingType;\n return imageTestingType === testingType || testingType === undefined;\n};\n\nexport const writePNG = (\n config: PluginMetadataConfig,\n name: string,\n png: PNG | Buffer,\n) =>\n fs.writeFileSync(\n name,\n addPNGMetadata(config, png instanceof PNG ? PNG.sync.write(png) : png),\n );\n\nconst inArea = (x: number, y: number, height: number, width: number) =>\n y > height || x > width;\n\nexport const fillSizeDifference = (\n image: PNG,\n width: number,\n height: number,\n) => {\n for (let y = 0; y < image.height; y++) {\n for (let x = 0; x < image.width; x++) {\n if (inArea(x, y, height, width)) {\n const idx = (image.width * y + x) << 2;\n image.data[idx] = 0;\n image.data[idx + 1] = 0;\n image.data[idx + 2] = 0;\n image.data[idx + 3] = 64;\n }\n }\n }\n return image;\n /* c8 ignore next */\n};\n\nexport const createImageResizer =\n (width: number, height: number) => (source: PNG) => {\n const resized = new PNG({ width, height, fill: true });\n PNG.bitblt(source, resized, 0, 0, source.width, source.height, 0, 0);\n return resized;\n /* c8 ignore next */\n };\n\nexport const scaleImageAndWrite = async ({\n scaleFactor,\n path,\n}: {\n scaleFactor: number;\n path: string;\n}) => {\n const imgBuffer = fs.readFileSync(path);\n if (scaleFactor === 1) return imgBuffer;\n\n const rawImgNew = PNG.sync.read(imgBuffer);\n const newImageWidth = Math.ceil(rawImgNew.width * scaleFactor);\n const newImageHeight = Math.ceil(rawImgNew.height * scaleFactor);\n await sharp(imgBuffer).resize(newImageWidth, newImageHeight).toFile(path);\n\n return fs.readFileSync(path);\n};\n\nexport const alignImagesToSameSize = (\n firstImage: PNGWithMetadata,\n secondImage: PNGWithMetadata,\n) => {\n const firstImageWidth = firstImage.width;\n const firstImageHeight = firstImage.height;\n const secondImageWidth = secondImage.width;\n const secondImageHeight = secondImage.height;\n\n const resizeToSameSize = createImageResizer(\n Math.max(firstImageWidth, secondImageWidth),\n Math.max(firstImageHeight, secondImageHeight),\n );\n\n const resizedFirst = resizeToSameSize(firstImage);\n const resizedSecond = resizeToSameSize(secondImage);\n\n return [\n fillSizeDifference(resizedFirst, firstImageWidth, firstImageHeight),\n fillSizeDifference(resizedSecond, secondImageWidth, secondImageHeight),\n ];\n};\n\nexport const cleanupUnused = (\n config: PluginMetadataConfig & { projectRoot: string },\n) => {\n globSync('**/*.png', {\n cwd: config.projectRoot,\n ignore: 'node_modules/**/*',\n }).forEach((pngPath) => {\n const absolutePath = path.join(config.projectRoot, pngPath);\n if (\n !wasScreenshotUsed(pngPath) &&\n isImageOfTestType(fs.readFileSync(absolutePath), config.testingType)\n ) {\n fs.unlinkSync(absolutePath);\n }\n });\n};\n","import fs from 'fs';\nimport { PNG } from 'pngjs';\nimport pixelmatch from 'pixelmatch';\n\ntype PixelmatchOptions = NonNullable<Parameters<typeof pixelmatch>[5]>;\nimport { moveFile } from 'move-file';\nimport path from 'path';\nimport { FILE_SUFFIX, TASK } from './constants';\nimport { getPluginConfig } from './version.utils';\nimport {\n cleanupUnused,\n alignImagesToSameSize,\n scaleImageAndWrite,\n isImageCurrentVersion,\n addPNGMetadata,\n writePNG,\n} from './image.utils';\nimport {\n generateScreenshotPath,\n resetScreenshotNameCache,\n} from './screenshotPath.utils';\nimport type { CompareImagesTaskReturn, PendingDiffRecord } from './types';\n\nlet pendingDiffs: PendingDiffRecord[] = [];\n\nexport type CompareImagesCfg = {\n scaleFactor: number;\n title: string;\n imgNew: string;\n imgOld: string;\n createMissingImages: boolean;\n updateImages: boolean | 'failures-only';\n maxDiffThreshold: number;\n diffConfig: PixelmatchOptions;\n};\n\nconst round = (n: number) => Math.ceil(n * 1000) / 1000;\n\nconst unlinkSyncSafe = (path: string) =>\n fs.existsSync(path) && fs.unlinkSync(path);\n\n// `.diff.png` sibling of an `.actual.png`; null when the name has no `.actual`\n// suffix (only happens with hand-picked paths), so nothing else gets deleted\nconst diffPathFor = (actualPath: string) => {\n const diffPath = actualPath.replace(FILE_SUFFIX.actual, FILE_SUFFIX.diff);\n return diffPath === actualPath ? null : diffPath;\n};\n\nconst removeStaleDiff = (actualPath: string) => {\n const diffPath = diffPathFor(actualPath);\n if (diffPath) unlinkSyncSafe(diffPath);\n};\n\nexport const getScreenshotPathInfoTask = (cfg: {\n titleFromOptions: string;\n imagesPath: string;\n specPath: string;\n currentRetryNumber: number;\n testId: string;\n}) => {\n const screenshotPath = generateScreenshotPath(cfg);\n\n return { screenshotPath, title: path.basename(screenshotPath, '.png') };\n};\n\nexport const cleanupImagesTask = (config: Cypress.PluginConfigOptions) => {\n if (getPluginConfig(config, 'pluginVisualRegressionCleanupUnusedImages')) {\n cleanupUnused(config);\n }\n\n resetScreenshotNameCache();\n\n return null;\n};\n\nexport const approveImageTask = async ({\n img,\n imgOld,\n}: {\n img: string;\n imgOld?: string;\n}) => {\n const oldImg = imgOld ?? img.replace(FILE_SUFFIX.actual, '');\n unlinkSyncSafe(oldImg);\n\n const diffImg = img.replace(FILE_SUFFIX.actual, FILE_SUFFIX.diff);\n unlinkSyncSafe(diffImg);\n\n await moveFile(img, oldImg);\n\n return null;\n};\n\nexport const compareImagesTask = async (\n cypressConfig: { testingType?: string },\n cfg: CompareImagesCfg,\n): Promise<CompareImagesTaskReturn> => {\n const messages = [] as string[];\n // Stamp the screenshot with plugin metadata exactly once, so that every file\n // derived from it (baseline via moveFile, kept .actual.png, manual rename)\n // carries FRSOURCE_CPVRD_V and won't be silently rewritten on the next run.\n const stampedImgNew = addPNGMetadata(\n cypressConfig,\n await scaleImageAndWrite({\n scaleFactor: cfg.scaleFactor,\n path: cfg.imgNew,\n }),\n );\n fs.writeFileSync(cfg.imgNew, stampedImgNew);\n const rawImgNewBuffer = Buffer.from(stampedImgNew);\n let imgDiff: number | undefined;\n let imgNewBase64: string, imgOldBase64: string, imgDiffBase64: string;\n let error = false;\n\n if (fs.existsSync(cfg.imgOld) && cfg.updateImages !== true) {\n const rawImgNew = PNG.sync.read(rawImgNewBuffer);\n const rawImgOldBuffer = fs.readFileSync(cfg.imgOld);\n const rawImgOld = PNG.sync.read(rawImgOldBuffer);\n const isImgSizeDifferent =\n rawImgNew.height !== rawImgOld.height ||\n rawImgNew.width !== rawImgOld.width;\n\n const [imgNew, imgOld] = isImgSizeDifferent\n ? alignImagesToSameSize(rawImgNew, rawImgOld)\n : [rawImgNew, rawImgOld];\n\n const { width, height } = imgNew;\n const diff = new PNG({ width, height });\n const diffConfig = Object.assign({ includeAA: true }, cfg.diffConfig);\n\n const diffPixels = pixelmatch(\n new Uint8Array(imgNew.data),\n new Uint8Array(imgOld.data),\n diff.data as unknown as Uint8Array,\n width,\n height,\n diffConfig,\n );\n imgDiff = diffPixels / (width * height);\n\n if (isImgSizeDifferent) {\n messages.push(\n `Warning: Images size mismatch - new screenshot is ${rawImgNew.width}px by ${rawImgNew.height}px while old one is ${rawImgOld.width}px by ${rawImgOld.height} (width x height).`,\n );\n }\n\n if (imgDiff > cfg.maxDiffThreshold) {\n messages.unshift(\n `Image diff factor (${round(\n imgDiff * 100,\n )}%) is bigger than maximum threshold option ${round(cfg.maxDiffThreshold * 100)}%.`,\n );\n error = true;\n }\n\n const diffBuffer = PNG.sync.write(diff);\n imgNewBase64 = PNG.sync.write(imgNew).toString('base64');\n imgDiffBase64 = diffBuffer.toString('base64');\n imgOldBase64 = PNG.sync.write(imgOld).toString('base64');\n\n if (error && cfg.updateImages === 'failures-only') {\n await moveFile(cfg.imgNew, cfg.imgOld);\n // a diff image left by an earlier failed attempt is stale now\n removeStaleDiff(cfg.imgNew);\n error = false;\n messages[0] = messages[0].replace(\n 'is bigger than maximum threshold option',\n 'was bigger than maximum threshold option (baseline updated):',\n );\n } else if (error) {\n writePNG(\n cypressConfig,\n cfg.imgNew.replace(FILE_SUFFIX.actual, FILE_SUFFIX.diff),\n diffBuffer,\n );\n } else {\n removeStaleDiff(cfg.imgNew);\n if (rawImgOld && !isImageCurrentVersion(rawImgOldBuffer)) {\n await moveFile(cfg.imgNew, cfg.imgOld);\n } else {\n // don't overwrite file if it's the same (imgDiff < cfg.maxDiffThreshold && !isImgSizeDifferent)\n fs.unlinkSync(cfg.imgNew);\n }\n }\n } else {\n // there is no \"old screenshot\" or screenshots should be immediately updated\n imgDiff = 0;\n imgNewBase64 = '';\n imgDiffBase64 = '';\n imgOldBase64 = '';\n if (cfg.createMissingImages) {\n await moveFile(cfg.imgNew, cfg.imgOld);\n removeStaleDiff(cfg.imgNew);\n } else {\n error = true;\n messages.unshift(\n `Baseline image is missing at path: \"${cfg.imgOld}\". Provide a baseline image or enable \"createMissingImages\" option in plugin configuration.`,\n );\n }\n }\n\n if (typeof imgDiff !== 'undefined') {\n if (!error) {\n messages.unshift(\n `Image diff factor (${round(\n imgDiff * 100,\n )}%) is within boundaries of maximum threshold option ${round(cfg.maxDiffThreshold * 100)}%.`,\n );\n }\n\n return {\n error,\n message: messages.join('\\n'),\n imgDiff,\n imgNewBase64,\n imgDiffBase64,\n imgOldBase64,\n maxDiffThreshold: cfg.maxDiffThreshold,\n };\n }\n\n /* c8 ignore next */\n return null;\n};\n\nexport const doesFileExistTask = ({ path }: { path: string }) =>\n fs.existsSync(path);\n\nexport const processImgPathTask = ({ path }: { path: string }) => path;\n\nexport const recordPendingDiffTask = (record: PendingDiffRecord): number => {\n pendingDiffs.push(record);\n return pendingDiffs.filter((d) => !d.passed).length;\n};\n\nexport const getPendingDiffsTask = (): PendingDiffRecord[] => [...pendingDiffs];\n\nexport const clearPendingDiffsTask = (): null => {\n pendingDiffs = [];\n return null;\n};\n\n/* c8 ignore start */\nexport const initTaskHook = (config: Cypress.PluginConfigOptions) => ({\n [TASK.getScreenshotPathInfo]: getScreenshotPathInfoTask,\n [TASK.cleanupImages]: cleanupImagesTask.bind(undefined, config),\n [TASK.doesFileExist]: doesFileExistTask,\n [TASK.approveImage]: approveImageTask,\n [TASK.compareImages]: compareImagesTask.bind(undefined, config),\n [TASK.processImgPath]: processImgPathTask,\n [TASK.recordPendingDiff]: recordPendingDiffTask,\n [TASK.getPendingDiffs]: getPendingDiffsTask,\n [TASK.clearPendingDiffs]: clearPendingDiffsTask,\n});\n/* c8 ignore stop */\n","import path from 'path';\nimport { promises as fs } from 'fs';\nimport { moveFile } from 'move-file';\nimport { IMAGE_SNAPSHOT_PREFIX, PATH_VARIABLES } from './constants';\n\ntype NotFalsy<T> = T extends false | null | undefined ? never : T;\n\nconst MIMIC_ROOT_WIN_REGEX = new RegExp(\n `^${PATH_VARIABLES.winSystemRootPath}\\\\${path.sep}([A-Z])\\\\${path.sep}`,\n);\nconst MIMIC_ROOT_UNIX_REGEX = new RegExp(\n `^${PATH_VARIABLES.unixSystemRootPath}\\\\${path.sep}`,\n);\n\nconst getConfigVariableOrThrow = <K extends keyof Cypress.PluginConfigOptions>(\n config: Cypress.PluginConfigOptions,\n name: K,\n) => {\n if (config[name]) {\n return config[name] as NotFalsy<Cypress.PluginConfigOptions[K]>;\n }\n\n /* c8 ignore start */\n throw `[@pixsame/cypress-plugin-visual-regression-diff] CypressConfig.${name} cannot be missing or \\`false\\`!`;\n};\n/* c8 ignore stop */\n\nexport const parseAbsolutePath = ({\n screenshotPath,\n projectRoot,\n}: {\n screenshotPath: string;\n projectRoot: string;\n}) => {\n let newAbsolutePath: string;\n const matchedMimicingWinRoot = screenshotPath.match(MIMIC_ROOT_WIN_REGEX);\n const matchedMimicingUnixRoot = screenshotPath.match(MIMIC_ROOT_UNIX_REGEX);\n if (matchedMimicingWinRoot && matchedMimicingWinRoot[1]) {\n const driveLetter = matchedMimicingWinRoot[1];\n newAbsolutePath = path.join(\n `${driveLetter}:\\\\`,\n screenshotPath.substring(matchedMimicingWinRoot[0].length),\n );\n } else if (matchedMimicingUnixRoot) {\n newAbsolutePath =\n path.sep + screenshotPath.substring(matchedMimicingUnixRoot[0].length);\n } else {\n newAbsolutePath = path.join(projectRoot, screenshotPath);\n }\n return path.normalize(newAbsolutePath);\n};\n\nexport const initAfterScreenshotHook =\n (config: Cypress.PluginConfigOptions) =>\n (\n details: Cypress.ScreenshotDetails,\n ):\n | void\n | Cypress.AfterScreenshotReturnObject\n | Promise<Cypress.AfterScreenshotReturnObject> => {\n // it's not a screenshot generated by FRSOURCE Cypress Plugin Visual Regression Diff\n /* c8 ignore start */\n if (details.name?.indexOf(IMAGE_SNAPSHOT_PREFIX) !== 0) return;\n /* c8 ignore stop */\n const screenshotsFolder = getConfigVariableOrThrow(\n config,\n 'screenshotsFolder',\n );\n const screenshotPath = details.name.substring(\n IMAGE_SNAPSHOT_PREFIX.length + path.sep.length,\n );\n const newAbsolutePath = parseAbsolutePath({\n screenshotPath,\n projectRoot: config.projectRoot,\n });\n\n return (async () => {\n await moveFile(details.path, newAbsolutePath);\n await fs.rm(path.join(screenshotsFolder, IMAGE_SNAPSHOT_PREFIX), {\n recursive: true,\n force: true,\n });\n\n return { path: newAbsolutePath };\n })();\n };\n","import { initTaskHook } from './task.hook';\nimport { initAfterScreenshotHook } from './afterScreenshot.hook';\nimport { getPluginConfig } from './version.utils';\n\n/* c8 ignore start */\nconst initForceDeviceScaleFactor = (on: Cypress.PluginEvents) => {\n // based on https://github.com/cypress-io/cypress/issues/2102#issuecomment-521299946\n on('before:browser:launch', (browser, launchOptions) => {\n if (browser.name === 'chrome' || browser.name === 'chromium') {\n launchOptions.args.push('--force-device-scale-factor=1');\n launchOptions.args.push('--high-dpi-support=1');\n return launchOptions;\n } else if (browser.name === 'electron' && browser.isHeaded) {\n // eslint-disable-next-line no-console\n console.log(\n \"There isn't currently a way of setting the device scale factor in Cypress when running headed electron so we disable the image regression commands.\",\n );\n }\n });\n};\n/* c8 ignore stop */\n\nexport const initPlugin = (\n on: Cypress.PluginEvents,\n config: Cypress.PluginConfigOptions,\n) => {\n /* c8 ignore start */\n if (\n getPluginConfig(config, 'pluginVisualRegressionForceDeviceScaleFactor') !==\n false\n ) {\n initForceDeviceScaleFactor(on);\n }\n /* c8 ignore stop */\n on('task', initTaskHook(config));\n on('after:screenshot', initAfterScreenshotHook(config));\n};\n"],"names":["PLUGIN_NAME","IMAGE_SNAPSHOT_PREFIX","FILE_SUFFIX","TASK","getScreenshotPathInfo","compareImages","approveImage","cleanupImages","doesFileExist","processImgPath","recordPendingDiff","getPendingDiffs","clearPendingDiffs","PATH_VARIABLES","specPath","unixSystemRootPath","winSystemRootPath","WINDOWS_LIKE_DRIVE_REGEX","METADATA_KEY","supportsExpose","version","major","minor","split","map","Number","getPluginConfig","config","key","_config$version","_config$env","_config$expose","expose","env","truncate","nameCacheCounter","countersBeforeAttempt","currentAttempt","resetMap","parsePathPartVariables","pathPart","i","path","dirname","test","join","startAttempt","testId","retry","_currentAttempt","isSameTest","screenshotPath","generateScreenshotPath","titleFromOptions","imagesPath","currentRetryNumber","bind","sanitize","actual","screenshotPathRegex","RegExp","diff","wasScreenshotUsed","imagePath","matched","match","numString","num","parseInt","isNaN","resetScreenshotNameCache","undefined","addMetadata","getMetadata","metaPngPkg","DIFF_IMAGES_VERSION","addPNGMetadata","png","Uint8Array","JSON","stringify","testingType","getPNGMetadata","metadataString","parse","isImageCurrentVersion","_getPNGMetadata","isImageGeneratedByPlugin","isImageOfTestType","_getPNGMetadata2","imageTestingType","writePNG","name","fs","writeFileSync","PNG","sync","write","inArea","x","y","height","width","fillSizeDifference","image","idx","data","createImageResizer","source","resized","fill","bitblt","scaleImageAndWrite","scaleFactor","imgBuffer","readFileSync","rawImgNew","read","newImageWidth","Math","ceil","newImageHeight","sharp","resize","toFile","alignImagesToSameSize","firstImage","secondImage","firstImageWidth","firstImageHeight","secondImageWidth","secondImageHeight","resizeToSameSize","max","resizedFirst","resizedSecond","cleanupUnused","globSync","cwd","projectRoot","ignore","forEach","pngPath","absolutePath","unlinkSync","pendingDiffs","round","n","unlinkSyncSafe","existsSync","diffPathFor","actualPath","diffPath","replace","removeStaleDiff","getScreenshotPathInfoTask","cfg","title","basename","cleanupImagesTask","approveImageTask","img","imgOld","oldImg","diffImg","moveFile","compareImagesTask","cypressConfig","messages","stampedImgNew","imgNew","rawImgNewBuffer","Buffer","from","imgDiff","imgNewBase64","imgOldBase64","imgDiffBase64","error","updateImages","rawImgOldBuffer","rawImgOld","isImgSizeDifferent","diffConfig","Object","assign","includeAA","diffPixels","pixelmatch","push","maxDiffThreshold","unshift","diffBuffer","toString","createMissingImages","message","doesFileExistTask","processImgPathTask","recordPendingDiffTask","record","filter","d","passed","length","getPendingDiffsTask","clearPendingDiffsTask","initTaskHook","MIMIC_ROOT_WIN_REGEX","sep","MIMIC_ROOT_UNIX_REGEX","getConfigVariableOrThrow","parseAbsolutePath","newAbsolutePath","matchedMimicingWinRoot","matchedMimicingUnixRoot","driveLetter","substring","normalize","initAfterScreenshotHook","details","_details$name","indexOf","screenshotsFolder","rm","recursive","force","initForceDeviceScaleFactor","on","browser","launchOptions","args","isHeaded","console","log","initPlugin"],"mappings":"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"}
|