@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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support.js","sources":["../src/constants.ts","../src/version.utils.ts","../src/commands.ts","../src/support.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","import { FAB_BADGE_CLASS, FILE_SUFFIX, LINK_PREFIX, TASK } from './constants';\nimport { supportsExpose } from './version.utils';\nimport type pixelmatch from 'pixelmatch';\nimport * as Base64 from '@frsource/base64';\nimport type { CompareImagesTaskReturn, PendingDiffRecord } from './types';\n\ndeclare global {\n interface Window {\n /** Number of deferred visual diffs recorded during the current spec run. */\n __cpvrdDeferredCount?: number;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Cypress {\n type MatchImageOptions = {\n screenshotConfig?: Partial<Cypress.ScreenshotDefaultsOptions>;\n diffConfig?: Parameters<typeof pixelmatch>[5];\n createMissingImages?: boolean;\n updateImages?: boolean | 'failures-only';\n imagesPath?: string;\n maxDiffThreshold?: number;\n forceDeviceScaleFactor?: boolean;\n title?: string;\n matchAgainstPath?: string;\n showPassingImages?: boolean;\n // IDEA: to be implemented if support for files NOT from filesystem needed\n // matchAgainst?: string | Buffer;\n };\n\n type MatchImageReturn = {\n diffValue: number | undefined;\n imgNewPath: string;\n imgPath: string;\n imgDiffPath: string;\n imgNewBase64: string | undefined;\n imgBase64: string | undefined;\n imgDiffBase64: string | undefined;\n imgNew: InstanceType<Cypress['Buffer']> | undefined;\n img: InstanceType<Cypress['Buffer']> | undefined;\n imgDiff: InstanceType<Cypress['Buffer']> | undefined;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Chainable<Subject> {\n /**\n * Command to create and compare image snapshots.\n * @memberof Cypress.Chainable\n * @example cy.get('.my-element').matchImage();\n */\n matchImage(\n options?: Cypress.MatchImageOptions,\n ): Chainable<MatchImageReturn>;\n }\n }\n}\n\nconst constructCypressError = (log: Cypress.Log, err: Error) => {\n // only way to throw & log the message properly in Cypress\n // https://github.com/cypress-io/cypress/blob/5f94cad3cb4126e0567290b957050c33e3a78e3c/packages/driver/src/cypress/error_utils.ts#L214-L216\n (err as unknown as { onFail: (e: Error) => void }).onFail = (err: Error) =>\n log.error(err);\n return err;\n};\n\nconst capitalize = (text: string) =>\n text.charAt(0).toUpperCase() + text.slice(1);\n\nconst getPluginEnv = <K extends keyof Cypress.MatchImageOptions>(key: K) => {\n const envKey = `pluginVisualRegression${capitalize(key)}`;\n if (supportsExpose(Cypress.version)) {\n return Cypress.expose(envKey) as Cypress.MatchImageOptions[K] | undefined;\n }\n\n return Cypress.env(envKey) as Cypress.MatchImageOptions[K] | undefined;\n};\n\nconst booleanOption = <K extends keyof Cypress.MatchImageOptions, Return>(\n options: Cypress.MatchImageOptions,\n key: K,\n truthyValue: Return,\n falsyValue: Return,\n) =>\n options[key] === false || getPluginEnv(key) === false\n ? truthyValue\n : falsyValue;\n\nconst optionWithDefaults = <K extends keyof Cypress.MatchImageOptions>(\n options: Cypress.MatchImageOptions,\n key: K,\n defaultValue: NonNullable<Cypress.MatchImageOptions[K]>,\n) => options[key] ?? getPluginEnv(key) ?? defaultValue;\n\nconst getImagesPath = (options: Cypress.MatchImageOptions) =>\n optionWithDefaults(options, 'imagesPath', '{spec_path}/__image_snapshots__');\n\nexport const getConfig = (options: Cypress.MatchImageOptions) => ({\n scaleFactor: booleanOption(\n options,\n 'forceDeviceScaleFactor',\n 1,\n 1 / window.devicePixelRatio,\n ),\n createMissingImages: optionWithDefaults(options, 'createMissingImages', true),\n updateImages: optionWithDefaults(options, 'updateImages', false),\n imagesPath: getImagesPath(options),\n maxDiffThreshold: optionWithDefaults(options, 'maxDiffThreshold', 0.01),\n diffConfig: optionWithDefaults(options, 'diffConfig', {}),\n screenshotConfig: optionWithDefaults(options, 'screenshotConfig', {}),\n matchAgainstPath: options.matchAgainstPath || undefined,\n});\n\nCypress.Commands.add(\n 'matchImage',\n { prevSubject: 'optional' },\n (subject, options = {}) => {\n const $el = subject as JQuery<HTMLElement> | undefined;\n let title: string;\n /* c8 ignore next */\n let pendingPassingRecord: PendingDiffRecord | null = null;\n\n const {\n scaleFactor,\n createMissingImages,\n updateImages,\n imagesPath,\n maxDiffThreshold,\n diffConfig,\n screenshotConfig,\n matchAgainstPath,\n } = getConfig(options);\n\n const test = (\n cy as unknown as {\n state: (s: string) => { id?: string; currentRetry: () => number };\n }\n ).state('test');\n const currentRetryNumber = test.currentRetry();\n // lets the plugin tell a retry of this test apart from the next test\n const testId =\n test.id ??\n [Cypress.spec.relative, ...Cypress.currentTest.titlePath].join(' ');\n\n return cy\n .then(() =>\n cy.task<{ screenshotPath: string; title: string }>(\n TASK.getScreenshotPathInfo,\n {\n titleFromOptions:\n options.title || Cypress.currentTest.titlePath.join(' '),\n imagesPath,\n specPath: Cypress.spec.relative,\n currentRetryNumber,\n testId,\n },\n { log: false },\n ),\n )\n .then(({ screenshotPath, title: titleFromTask }) => {\n title = titleFromTask;\n let imgPath: string;\n return (($el ? cy.wrap($el) : cy) as Cypress.Chainable<unknown>)\n .screenshot(screenshotPath, {\n ...screenshotConfig,\n onAfterScreenshot(el, props) {\n imgPath = props.path;\n screenshotConfig.onAfterScreenshot?.(el, props);\n },\n log: false,\n })\n .then(() =>\n cy\n .task<string>(\n TASK.processImgPath,\n { path: imgPath },\n { log: false },\n )\n .then((newImgPath) => {\n imgPath = newImgPath;\n return imgPath;\n }),\n );\n })\n .then((imgPath) =>\n cy\n .task<CompareImagesTaskReturn>(\n TASK.compareImages,\n {\n scaleFactor,\n imgNew: imgPath,\n imgOld:\n matchAgainstPath || imgPath.replace(FILE_SUFFIX.actual, ''),\n createMissingImages,\n updateImages,\n maxDiffThreshold,\n diffConfig,\n },\n { log: false },\n )\n .then((res) => ({\n res,\n imgPath,\n })),\n )\n .then(({ res, imgPath }) => {\n const log = Cypress.log({\n name: 'log',\n displayName: 'Match image',\n $el,\n });\n\n if (!res) {\n log.set('message', 'Unexpected error!');\n throw constructCypressError(log, new Error('Unexpected error!'));\n }\n\n const imgOldPath =\n matchAgainstPath || imgPath.replace(FILE_SUFFIX.actual, '');\n\n log.set(\n 'message',\n `[${title}] ${res.message}${\n res.imgDiffBase64 && res.imgNewBase64 && res.imgOldBase64\n ? `\\n[See comparison](${LINK_PREFIX}${Base64.encode(\n encodeURIComponent(\n JSON.stringify({\n title,\n imgPath,\n imgOldPath,\n imgDiffBase64: res.imgDiffBase64,\n imgNewBase64: res.imgNewBase64,\n imgOldBase64: res.imgOldBase64,\n error: res.error,\n }),\n ),\n )})`\n : ''\n }`,\n );\n\n const matchImageReturn = {\n diffValue: res.imgDiff,\n imgNewPath: imgPath,\n imgPath: imgPath.replace(FILE_SUFFIX.actual, ''),\n imgDiffPath: imgPath.replace(FILE_SUFFIX.actual, FILE_SUFFIX.diff),\n imgNewBase64: res.imgNewBase64,\n imgBase64: res.imgOldBase64,\n imgDiffBase64: res.imgDiffBase64,\n imgNew:\n typeof res.imgNewBase64 === 'string'\n ? Cypress.Buffer.from(res.imgNewBase64, 'base64')\n : undefined,\n img:\n typeof res.imgOldBase64 === 'string'\n ? Cypress.Buffer.from(res.imgOldBase64, 'base64')\n : undefined,\n imgDiff:\n typeof res.imgDiffBase64 === 'string'\n ? Cypress.Buffer.from(res.imgDiffBase64, 'base64')\n : undefined,\n };\n\n if (res.error) {\n log.set('consoleProps', () => res);\n\n const deferred = supportsExpose(Cypress.version)\n ? !!Cypress.expose('pluginVisualRegressionBatchReviewMode')\n : !!Cypress.env('pluginVisualRegressionBatchReviewMode');\n const record: PendingDiffRecord = {\n title,\n imgPath,\n imgOldPath,\n imgNewBase64: res.imgNewBase64 ?? '',\n imgOldBase64: res.imgOldBase64 ?? '',\n imgDiffBase64: res.imgDiffBase64 ?? '',\n message: res.message ?? '',\n deferred,\n };\n\n return cy\n .task<number>(TASK.recordPendingDiff, record, { log: false })\n .then((count) => {\n /* c8 ignore start */\n if (top) {\n const badge = top.document.querySelector(`.${FAB_BADGE_CLASS}`);\n if (badge) {\n badge.textContent = String(count);\n (badge as HTMLElement).style.display = 'flex';\n badge.classList.add(`${FAB_BADGE_CLASS}--pulse`);\n setTimeout(\n () => badge.classList.remove(`${FAB_BADGE_CLASS}--pulse`),\n 700,\n );\n }\n if (deferred) {\n top.__cpvrdDeferredCount =\n (top.__cpvrdDeferredCount || 0) + 1;\n }\n }\n /* c8 ignore stop */\n if (!deferred) {\n throw constructCypressError(log, new Error(res.message));\n }\n return matchImageReturn;\n }) as unknown as Cypress.MatchImageReturn;\n }\n\n /* c8 ignore start */\n if (res.imgDiffBase64 && res.imgNewBase64 && res.imgOldBase64) {\n pendingPassingRecord = {\n title,\n imgPath,\n imgOldPath,\n imgNewBase64: res.imgNewBase64,\n imgOldBase64: res.imgOldBase64,\n imgDiffBase64: res.imgDiffBase64,\n message: res.message ?? '',\n passed: true,\n };\n }\n /* c8 ignore stop */\n\n return matchImageReturn;\n })\n .then((result) => {\n /* c8 ignore start */\n if (!pendingPassingRecord) return cy.wrap(result, { log: false });\n const record = pendingPassingRecord;\n pendingPassingRecord = null;\n return cy\n .task<number>(TASK.recordPendingDiff, record, { log: false })\n .then(() => result);\n /* c8 ignore stop */\n });\n },\n);\n","import * as Base64 from '@frsource/base64';\nimport './commands';\nimport { supportsExpose } from './version.utils';\nimport {\n FAB_CLASS,\n FAB_BADGE_CLASS,\n LINK_PREFIX,\n LS_SHOW_NON_FAILING_DIFFS,\n OVERLAY_CLASS,\n TASK,\n} from './constants';\nimport type { PendingDiffRecord } from './types';\n\nconst CAROUSEL_CLASS = 'cp-visual-regression-diff-carousel';\n\nconst LOGO_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" viewBox=\"0 0 72 72\"><circle cx=\"35.5\" cy=\"36.5\" r=\"27.5\" fill=\"#4A4A4D\" stroke=\"#FFF\"/><g fill=\"#FFF\" transform=\"matrix(.075 0 0 .075 16 17)\"><circle cx=\"259.8\" cy=\"259.9\" r=\"80\"/><path d=\"M511.7 237.7C450.2 163.4 357 92 259.8 92 162.5 91.9 69.4 163.4 8 237.7A34.8 34.8 0 0 0 8 282a520.8 520.8 0 0 0 91 86.2c109 79.3 212.4 79.5 321.6 0a520.8 520.8 0 0 0 91-86.2 34.8 34.8 0 0 0 0-44.3zM259.8 148a112.1 112.1 0 0 1 0 224 112.1 112.1 0 0 1 0-224z\"/></g></svg>`;\n\nconst CHECK_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>`;\n\n/* c8 ignore start */\nfunction queueClear() {\n (cy as unknown as { queue: { reset: () => void } }).queue.reset?.();\n (cy as unknown as { queue: { clear: () => void } }).queue.clear();\n (cy as unknown as { state: (k: string, value: unknown) => void }).state(\n 'index',\n 0,\n );\n}\n\nfunction queueRun() {\n // needed to run a task outside of the test processing flow\n (cy as unknown as { queue: { run: () => void } }).queue.run();\n}\n/* c8 ignore stop */\n\nexport const getShowPassingImagesConfig = (): boolean => {\n const key = 'pluginVisualRegressionBatchReviewModeShowPassingImages';\n if (supportsExpose(Cypress.version)) {\n return !!(Cypress.expose(key) as boolean | undefined);\n }\n return !!(Cypress.env(key) as boolean | undefined);\n};\n\nexport const getBatchReviewMode = (): boolean => {\n const key = 'pluginVisualRegressionBatchReviewMode';\n if (supportsExpose(Cypress.version)) {\n return !!(Cypress.expose(key) as boolean | undefined);\n }\n return !!(Cypress.env(key) as boolean | undefined);\n};\n\nexport const getEffectiveShowPassingImages = (): boolean => {\n if (!top) return getShowPassingImagesConfig();\n const stored = top.localStorage.getItem(LS_SHOW_NON_FAILING_DIFFS);\n if (stored !== null) return stored === 'true';\n return getShowPassingImagesConfig();\n};\n\nexport const generateOverlayTemplate = ({\n title,\n imgNewBase64,\n imgOldBase64,\n imgDiffBase64,\n wasImageNotUpdatedYet,\n error,\n}: {\n title: string;\n imgNewBase64: string;\n imgOldBase64: string;\n imgDiffBase64: string;\n wasImageNotUpdatedYet: boolean;\n error: boolean;\n}) => `<div class=\"${OVERLAY_CLASS}\" style=\"position:fixed;z-index:100000;top:0;bottom:0;left:0;right:0;display:flex;flex-flow:column;background:#1a202c;font-family:sans-serif\">\n <header style=\"background:#2d3748;padding:12px 16px;display:flex;align-items:center;justify-content:space-between;gap:12px;flex-shrink:0\">\n <div style=\"display:flex;align-items:center;gap:12px\">\n <div style=\"width:28px;height:28px;flex-shrink:0\">${LOGO_SVG}</div>\n <span style=\"font-weight:600;color:#fff;font-size:.95em\">${title} – screenshot diff</span>\n </div>\n <button type=\"button\" data-type=\"close\" style=\"background:transparent;border:1px solid #4a5568;color:#a0aec0;padding:6px 12px;border-radius:4px;cursor:pointer;font-size:.85em\">✕ Close</button>\n </header>\n <div data-diff-base64=\"${imgDiffBase64}\" style=\"flex:1;overflow:auto;padding:20px;color:#fff\">\n ${generateDiffPanelHTML({ imgNewBase64, imgOldBase64 })}\n </div>\n <div style=\"background:#1a202c;padding:0 16px 10px;display:flex;justify-content:flex-end;flex-shrink:0\">\n <button data-type=\"see-diff\" style=\"background:#4a5568;border:none;color:#fff;padding:6px 14px;border-radius:4px;cursor:pointer;font-size:.85em\">See diff image →</button>\n </div>\n <footer style=\"background:#2d3748;padding:12px 16px;display:flex;align-items:center;justify-content:space-between;gap:8px;flex-shrink:0\">\n <div></div>\n <div style=\"display:flex;gap:8px\">\n ${\n wasImageNotUpdatedYet\n ? `<button type=\"button\" data-type=\"replace\" style=\"background:#38a169;border:none;color:#fff;padding:8px 16px;border-radius:4px;cursor:pointer;font-weight:600\">✓ Replace image</button>`\n : error\n ? `<span style=\"color:#fc8181;font-size:.85em\">Image was already updated, rerun test to see new comparison</span>`\n : ''\n }\n </div>\n <div></div>\n </footer>\n</div>`;\n\n/* c8 ignore start */\nconst generateDiffPanelHTML = ({\n imgNewBase64,\n imgOldBase64,\n}: Pick<PendingDiffRecord, 'imgNewBase64' | 'imgOldBase64'>) =>\n `<div style=\"display:flex;justify-content:center;align-items:flex-start;gap:15px;flex-wrap:wrap\">\n <div\n style=\"position:relative;background:#fff;border:solid 15px #fff;overflow:hidden;color:#1a202c\"\n onmouseover=\"this.querySelector('div').style.opacity=0,this.querySelector('img').style.opacity=1\"\n onmouseleave=\"this.querySelector('div').style.opacity=1,this.querySelector('img').style.opacity=0\"\n >\n <h3 style=\"margin:0 0 8px\">New screenshot (hover off to see old one):</h3>\n <img style=\"min-width:200px;max-width:100%;opacity:0\" src=\"data:image/png;base64,${imgNewBase64}\" />\n <div style=\"position:absolute;top:0;left:0;width:100%;background:#fff\">\n <h3 style=\"margin:0 0 8px\">Old screenshot (hover to see new one):</h3>\n <img style=\"min-width:200px;max-width:100%\" src=\"data:image/png;base64,${imgOldBase64}\" />\n </div>\n </div>\n </div>`;\n\nconst generateFABTemplate = () =>\n `<button class=\"${FAB_CLASS}\" title=\"Cypress Plugin Visual Regression Diff\" style=\"position:fixed;bottom:20px;right:20px;z-index:99999;width:52px;height:52px;border-radius:50%;border:2px solid rgba(255,255,255,.2);background:#4A4A4D;cursor:pointer;padding:0;box-shadow:0 2px 10px rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;overflow:visible;transition:transform .15s\">\n <span class=\"${FAB_BADGE_CLASS}\" style=\"position:absolute;top:-6px;right:-6px;background:#e53e3e;color:#fff;font-size:11px;font-weight:700;min-width:18px;height:18px;border-radius:9px;display:none;align-items:center;justify-content:center;padding:0 4px;box-shadow:0 1px 3px rgba(0,0,0,.4);pointer-events:none\"></span>\n <span class=\"${FAB_CLASS}-logo\" style=\"display:flex;align-items:center;justify-content:center;width:36px;height:36px\">${LOGO_SVG}</span>\n <span class=\"${FAB_CLASS}-check\" style=\"display:none;align-items:center;justify-content:center;width:36px;height:36px\">${CHECK_SVG}</span>\n </button>\n <style>\n @keyframes ${FAB_BADGE_CLASS}-pulse {\n 0%,100%{transform:scale(1)}\n 50%{transform:scale(1.35)}\n }\n .${FAB_BADGE_CLASS}--pulse { animation: ${FAB_BADGE_CLASS}-pulse .5s ease; }\n @keyframes ${FAB_CLASS}-success {\n 0%{opacity:0;transform:scale(.5)}\n 40%{opacity:1;transform:scale(1.1)}\n 100%{opacity:1;transform:scale(1)}\n }\n .${FAB_CLASS}[data-success] .${FAB_CLASS}-logo { display:none!important; }\n .${FAB_CLASS}[data-success] .${FAB_CLASS}-check { display:flex!important; animation:${FAB_CLASS}-success .3s ease forwards; }\n .${FAB_CLASS}:hover { transform:scale(1.08); }\n .${FAB_CLASS}[data-running] { opacity:.45;pointer-events:none; }\n @keyframes ${FAB_CLASS}-attention {\n 0%,100%{transform:scale(1)}\n 20%{transform:scale(1.18)}\n 40%{transform:scale(1)}\n 60%{transform:scale(1.12)}\n 80%{transform:scale(1)}\n }\n .${FAB_CLASS}--attention { animation:${FAB_CLASS}-attention 1s ease 3; }\n </style>`;\n\nconst generateCarouselTemplate = () =>\n `<div class=\"${CAROUSEL_CLASS}\" style=\"position:fixed;z-index:100000;top:0;bottom:0;left:0;right:0;display:flex;flex-flow:column;background:#1a202c;font-family:sans-serif\">\n <header style=\"background:#2d3748;padding:12px 16px;display:flex;align-items:center;justify-content:space-between;gap:12px;flex-shrink:0\">\n <div style=\"display:flex;align-items:center;gap:12px\">\n <div style=\"width:28px;height:28px;flex-shrink:0\">${LOGO_SVG}</div>\n <div>\n <span data-carousel-counter style=\"font-size:.8em;color:#a0aec0;display:block;visibility:hidden\">Image</span>\n <span data-carousel-title style=\"font-weight:600;color:#fff;font-size:.95em;visibility:hidden\">placeholder</span>\n </div>\n </div>\n <div style=\"display:flex;align-items:center;gap:12px\">\n <label style=\"display:flex;align-items:center;gap:6px;color:#a0aec0;font-size:.8em;cursor:pointer;user-select:none;white-space:nowrap\">\n <input type=\"checkbox\" data-type=\"show-non-failing\" style=\"cursor:pointer;width:13px;height:13px;flex-shrink:0\" />\n Show passing\n </label>\n <button data-type=\"close\" style=\"background:transparent;border:1px solid #4a5568;color:#a0aec0;padding:6px 12px;border-radius:4px;cursor:pointer;font-size:.85em\">✕ Close</button>\n </div>\n </header>\n <div data-carousel-content style=\"flex:1;overflow:auto;padding:20px;color:#fff\"></div>\n <div data-see-diff-row style=\"background:#1a202c;padding:0 16px 10px;display:flex;justify-content:flex-end;flex-shrink:0\">\n <button data-type=\"see-diff\" style=\"background:#4a5568;border:none;color:#fff;padding:6px 14px;border-radius:4px;cursor:pointer;font-size:.85em\">See diff image →</button>\n </div>\n <footer style=\"background:#2d3748;padding:12px 16px;display:flex;align-items:center;justify-content:space-between;gap:8px;flex-shrink:0;flex-wrap:wrap\">\n <button data-type=\"prev\" style=\"background:transparent;border:1px solid #4a5568;color:#a0aec0;padding:8px 14px;border-radius:4px;cursor:pointer\">← Prev</button>\n <div style=\"display:flex;gap:8px\">\n <button data-type=\"skip\" style=\"background:#4a5568;border:none;color:#fff;padding:8px 16px;border-radius:4px;cursor:pointer\">Skip this change →</button>\n <span data-replaced-info style=\"display:none;align-items:center;color:#68d391;padding:8px 16px;font-size:.9em;font-weight:600\">✓ Image was already replaced</span>\n <button data-type=\"replace\" style=\"background:#38a169;border:none;color:#fff;padding:8px 16px;border-radius:4px;cursor:pointer;font-weight:600\">✓ Replace image</button>\n </div>\n <button data-type=\"next\" style=\"background:transparent;border:1px solid #4a5568;color:#a0aec0;padding:8px 14px;border-radius:4px;cursor:pointer\">Next →</button>\n </footer>\n </div>\n <style>\n .${CAROUSEL_CLASS} button[data-type=\"prev\"]:disabled,\n .${CAROUSEL_CLASS} button[data-type=\"next\"]:disabled {\n opacity:.3;cursor:not-allowed;pointer-events:none;\n }\n </style>`;\n/* c8 ignore stop */\n\n/* c8 ignore start */\nfunction showFABSuccess() {\n if (!top) return;\n const fab = top.document.querySelector(`.${FAB_CLASS}`);\n if (!fab) return;\n const badge = fab.querySelector(`.${FAB_BADGE_CLASS}`);\n if (badge) (badge as HTMLElement).style.display = 'none';\n fab.setAttribute('data-success', 'true');\n // Use the top window's timer: the spec iframe (and its timers) is torn down\n // when the spec is rerun, which would leave the FAB stuck in success state.\n top.setTimeout(() => fab.removeAttribute('data-success'), 1800);\n}\n\nfunction pulseFAB() {\n if (!top) return;\n const fab = top.document.querySelector(`.${FAB_CLASS}`);\n if (!fab) return;\n fab.classList.remove(`${FAB_CLASS}--attention`);\n // force reflow so re-adding the class restarts the animation\n void (fab as HTMLElement).offsetWidth;\n fab.classList.add(`${FAB_CLASS}--attention`);\n}\n\nfunction openDiffLightbox(imgBase64: string) {\n if (!top) return;\n Cypress.$(\n `<div style=\"position:fixed;z-index:200000;top:0;bottom:0;left:0;right:0;background:rgba(0,0,0,.92);display:flex;align-items:center;justify-content:center;cursor:zoom-out\">\n <img src=\"data:image/png;base64,${imgBase64}\" style=\"max-width:95vw;max-height:95vh;object-fit:contain\" />\n </div>`,\n )\n .appendTo(top.document.body)\n .on('click', function () {\n Cypress.$(this).remove();\n });\n}\n\nfunction openCarousel(\n initialDiffs: PendingDiffRecord[],\n allDiffs: PendingDiffRecord[] = initialDiffs,\n) {\n if (!top) return;\n\n let diffs = initialDiffs;\n let currentIndex = 0;\n let replacedCount = 0;\n const replacedDiffs = new Set<PendingDiffRecord>();\n\n const carouselEl = Cypress.$(generateCarouselTemplate()).appendTo(\n top.document.body,\n );\n\n function renderDiff(index: number) {\n currentIndex = index;\n const diff = diffs[index];\n carouselEl\n .find('[data-carousel-content]')\n .html(generateDiffPanelHTML(diff));\n carouselEl\n .find('[data-carousel-counter]')\n .css('visibility', '')\n .text(`Image ${index + 1} of ${diffs.length}`);\n const passedBadge = diff.passed\n ? ` <span style=\"background:#38a169;color:#fff;font-size:.7em;padding:2px 7px;border-radius:10px;vertical-align:middle;font-weight:600\">passed</span>`\n : '';\n carouselEl\n .find('[data-carousel-title]')\n .css('visibility', '')\n .html(`${diff.title} – screenshot diff${passedBadge}`);\n (carouselEl.find('[data-type=\"prev\"]')[0] as HTMLButtonElement).disabled =\n index === 0;\n (carouselEl.find('[data-type=\"next\"]')[0] as HTMLButtonElement).disabled =\n index === diffs.length - 1;\n const isReplaced = replacedDiffs.has(diff);\n carouselEl.find('[data-type=\"replace\"]').toggle(!isReplaced);\n carouselEl\n .find('[data-replaced-info]')\n .css('display', isReplaced ? 'flex' : 'none');\n }\n\n function closeCarousel() {\n if (!top) return;\n top.document.removeEventListener('keydown', handleKey);\n carouselEl.remove();\n if (replacedCount > 0) showFABSuccess();\n }\n\n function advance() {\n if (currentIndex < diffs.length - 1) {\n renderDiff(currentIndex + 1);\n } else {\n closeCarousel();\n }\n }\n\n function handleKey(e: KeyboardEvent) {\n if (inPlaceholderMode) {\n if (e.key === 'Escape') closeCarousel();\n return;\n }\n if (e.key === 'ArrowLeft' && currentIndex > 0) renderDiff(currentIndex - 1);\n else if (e.key === 'ArrowRight' && currentIndex < diffs.length - 1)\n renderDiff(currentIndex + 1);\n else if (e.key === 'Escape') closeCarousel();\n }\n\n top.document.addEventListener('keydown', handleKey);\n\n const showNonFailingCheckbox = carouselEl.find(\n '[data-type=\"show-non-failing\"]',\n )[0] as HTMLInputElement;\n if (showNonFailingCheckbox) {\n showNonFailingCheckbox.checked = getEffectiveShowPassingImages();\n }\n\n let inPlaceholderMode = false;\n\n function showPlaceholder() {\n inPlaceholderMode = true;\n carouselEl.find('[data-carousel-content]').html(\n `<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:#718096;text-align:center;padding:20px\">\n <div>\n <p style=\"margin:0 0 6px;color:#a0aec0;font-size:.95em\">No failing images to review.</p>\n <p style=\"margin:0;font-size:.85em\">Enable <strong style=\"color:#a0aec0\">Show passing</strong> to view passing captures.</p>\n </div>\n </div>`,\n );\n carouselEl.find('[data-carousel-counter]').css('visibility', 'hidden');\n carouselEl.find('[data-carousel-title]').css('visibility', 'hidden');\n carouselEl\n .find(\n '[data-see-diff-row],[data-type=\"skip\"],[data-type=\"replace\"],[data-replaced-info],[data-type=\"prev\"],[data-type=\"next\"]',\n )\n .hide();\n }\n\n function restoreFromPlaceholder() {\n inPlaceholderMode = false;\n carouselEl\n .find(\n '[data-see-diff-row],[data-type=\"skip\"],[data-type=\"replace\"],[data-type=\"prev\"],[data-type=\"next\"]',\n )\n .show();\n renderDiff(currentIndex);\n }\n\n if (diffs.length === 0) showPlaceholder();\n else renderDiff(0);\n\n carouselEl.on('change', '[data-type=\"show-non-failing\"]', function (e) {\n if (!top) return;\n const checked = (e.target as HTMLInputElement).checked;\n top.localStorage.setItem(LS_SHOW_NON_FAILING_DIFFS, String(checked));\n if (!checked) {\n const failingDiffs = allDiffs.filter((d) => !d.passed);\n diffs = failingDiffs;\n currentIndex = 0;\n if (failingDiffs.length === 0) showPlaceholder();\n else if (inPlaceholderMode) restoreFromPlaceholder();\n else renderDiff(0);\n } else {\n const passingDiffs = allDiffs.filter((d) => d.passed);\n if (passingDiffs.length > 0) {\n diffs = passingDiffs;\n currentIndex = 0;\n if (inPlaceholderMode) restoreFromPlaceholder();\n else renderDiff(0);\n }\n }\n });\n\n carouselEl.on('click', '[data-type=\"close\"]', closeCarousel);\n carouselEl.on('click', '[data-type=\"prev\"]', () =>\n renderDiff(currentIndex - 1),\n );\n carouselEl.on('click', '[data-type=\"next\"]', () =>\n renderDiff(currentIndex + 1),\n );\n carouselEl.on('click', '[data-type=\"skip\"]', advance);\n\n carouselEl.on('click', '[data-type=\"see-diff\"]', () => {\n openDiffLightbox(diffs[currentIndex].imgDiffBase64);\n });\n\n carouselEl.on('click', '[data-type=\"replace\"]', () => {\n queueClear();\n const diff = diffs[currentIndex];\n cy.task(TASK.approveImage, {\n img: diff.imgPath,\n imgOld: diff.imgOldPath,\n }).then(() => {\n replacedCount++;\n replacedDiffs.add(diff);\n advance();\n });\n queueRun();\n });\n}\n\n/* c8 ignore stop */\n\n/* c8 ignore start */\nbefore(() => {\n if (!top) return null;\n Cypress.$(`.${OVERLAY_CLASS}`, top.document.body).remove();\n\n if (getBatchReviewMode()) {\n // Inject the persistent FAB if not already present\n if (!top.document.querySelector(`.${FAB_CLASS}`)) {\n Cypress.$(generateFABTemplate()).appendTo(top.document.body);\n }\n\n // Reset badge and success state at the start of each spec run\n top.document\n .querySelector(`.${FAB_CLASS}`)\n ?.removeAttribute('data-success');\n const badge = top.document.querySelector(`.${FAB_BADGE_CLASS}`);\n if (badge) {\n (badge as HTMLElement).style.display = 'none';\n badge.textContent = '';\n }\n\n Cypress.$(top.document.body)\n .off('click', `.${FAB_CLASS}`)\n .on('click', `.${FAB_CLASS}`, () => {\n queueClear();\n cy.task<PendingDiffRecord[]>(TASK.getPendingDiffs, null, {\n log: false,\n }).then((diffs) => {\n const failingDiffs = diffs.filter((d) => !d.passed);\n if (failingDiffs.length > 0) {\n openCarousel(failingDiffs, diffs);\n } else if (getEffectiveShowPassingImages()) {\n const passingDiffs = diffs.filter((d) => d.passed);\n openCarousel(passingDiffs, diffs);\n } else {\n openCarousel([], diffs);\n }\n });\n queueRun();\n });\n }\n\n // Reset client-side deferred count and clean up artifacts from the previous spec\n if (top) top.__cpvrdDeferredCount = 0;\n cy.task(TASK.cleanupImages, { log: false });\n cy.task(TASK.clearPendingDiffs, null, { log: false });\n});\n\nbeforeEach(() => {\n if (!top || !getBatchReviewMode()) return null;\n top.document.querySelector(`.${FAB_CLASS}`)?.setAttribute('data-running', '');\n});\n\nafterEach(() => {\n if (!top || !getBatchReviewMode()) return null;\n top.document.querySelector(`.${FAB_CLASS}`)?.removeAttribute('data-running');\n});\n\nafter(() => {\n if (!top) return null;\n\n Cypress.$(top.document.body)\n .off('click', `a[href^=\"${LINK_PREFIX}\"]`)\n .on('click', `a[href^=\"${LINK_PREFIX}\"]`, function (e) {\n e.preventDefault();\n if (!top) return false;\n\n const {\n title,\n imgPath,\n imgOldPath,\n imgDiffBase64,\n imgNewBase64,\n imgOldBase64,\n error,\n } = JSON.parse(\n decodeURIComponent(\n Base64.decode(\n e.currentTarget.getAttribute('href').substring(LINK_PREFIX.length),\n ),\n ),\n );\n queueClear();\n\n cy.task<boolean>(\n TASK.doesFileExist,\n { path: imgPath },\n { log: false },\n ).then((wasImageNotUpdatedYet) => {\n if (!top) return false;\n\n Cypress.$(\n generateOverlayTemplate({\n title,\n imgNewBase64,\n imgOldBase64,\n imgDiffBase64,\n error,\n wasImageNotUpdatedYet,\n }),\n ).appendTo(top.document.body);\n\n const wrapper = Cypress.$(`.${OVERLAY_CLASS}`, top.document.body);\n wrapper.on('click', 'button[data-type=\"close\"]', function () {\n wrapper.remove();\n });\n\n wrapper.on('click', '[data-type=\"see-diff\"]', function () {\n const base64 =\n wrapper.find('[data-diff-base64]').attr('data-diff-base64') ?? '';\n openDiffLightbox(base64);\n });\n\n wrapper.on('click', 'button[data-type=\"replace\"]', function () {\n queueClear();\n\n cy.task(TASK.approveImage, {\n img: imgPath,\n imgOld: imgOldPath,\n }).then(() => wrapper.remove());\n\n queueRun();\n });\n });\n\n queueRun();\n\n return false;\n });\n\n const deferredCount = top?.__cpvrdDeferredCount || 0;\n if (deferredCount > 0) {\n pulseFAB();\n throw new Error(\n `[cypress-plugin-visual-regression-diff] ${deferredCount} image snapshot(s) exceeded the diff threshold. Review the changes using the plugin UI (bottom-right button).`,\n );\n }\n});\n/* c8 ignore stop */\n"],"names":["PLUGIN_NAME","LINK_PREFIX","OVERLAY_CLASS","FAB_CLASS","FAB_BADGE_CLASS","FILE_SUFFIX","TASK","getScreenshotPathInfo","compareImages","approveImage","cleanupImages","doesFileExist","processImgPath","recordPendingDiff","getPendingDiffs","clearPendingDiffs","LS_SHOW_NON_FAILING_DIFFS","supportsExpose","version","major","minor","split","map","Number","constructCypressError","log","err","onFail","error","capitalize","text","charAt","toUpperCase","slice","getPluginEnv","key","envKey","Cypress","expose","env","booleanOption","options","truthyValue","falsyValue","optionWithDefaults","defaultValue","_ref","_options$key","getImagesPath","getConfig","scaleFactor","window","devicePixelRatio","createMissingImages","updateImages","imagesPath","maxDiffThreshold","diffConfig","screenshotConfig","matchAgainstPath","undefined","Commands","add","prevSubject","subject","_test$id","$el","title","pendingPassingRecord","test","cy","state","currentRetryNumber","currentRetry","testId","id","spec","relative","currentTest","titlePath","join","then","task","titleFromOptions","specPath","screenshotPath","titleFromTask","imgPath","wrap","screenshot","onAfterScreenshot","el","props","path","newImgPath","imgNew","imgOld","replace","actual","res","name","displayName","set","Error","imgOldPath","message","imgDiffBase64","imgNewBase64","imgOldBase64","Base64","encode","encodeURIComponent","JSON","stringify","matchImageReturn","diffValue","imgDiff","imgNewPath","imgDiffPath","diff","imgBase64","Buffer","from","img","_res$imgNewBase","_res$imgOldBase","_res$imgDiffBase","_res$message","deferred","record","count","top","badge","document","querySelector","textContent","String","style","display","classList","setTimeout","remove","__cpvrdDeferredCount","_res$message2","passed","result","CAROUSEL_CLASS","LOGO_SVG","CHECK_SVG","queueClear","queue","reset","clear","queueRun","run","getShowPassingImagesConfig","getBatchReviewMode","getEffectiveShowPassingImages","stored","localStorage","getItem","generateOverlayTemplate","wasImageNotUpdatedYet","generateDiffPanelHTML","generateFABTemplate","generateCarouselTemplate","showFABSuccess","fab","setAttribute","removeAttribute","pulseFAB","openDiffLightbox","$","appendTo","body","on","openCarousel","initialDiffs","allDiffs","diffs","currentIndex","replacedCount","replacedDiffs","Set","carouselEl","renderDiff","index","find","html","css","length","passedBadge","disabled","isReplaced","has","toggle","closeCarousel","removeEventListener","handleKey","advance","e","inPlaceholderMode","addEventListener","showNonFailingCheckbox","checked","showPlaceholder","hide","restoreFromPlaceholder","show","target","setItem","failingDiffs","filter","d","passingDiffs","before","_top$document$querySe","off","beforeEach","_top$document$querySe2","afterEach","_top$document$querySe3","after","_top","preventDefault","parse","decodeURIComponent","decode","currentTarget","getAttribute","substring","wrapper","_wrapper$find$attr","base64","attr","deferredCount"],"mappings":"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"}