[{"data":1,"prerenderedAt":4442},["ShallowReactive",2],{"readme:pl":3},{"id":4,"title":5,"body":6,"description":29,"extension":4434,"meta":4435,"navigation":65,"path":4436,"reviewed":4437,"seo":4438,"source":4439,"stem":4440,"__hash__":4441,"fallback":4437},"readme\u002Freadme\u002FREADME-pl.md","README Pl",{"type":7,"value":8,"toc":4402},"minimark",[9,14,19,23,110,113,124,173,185,348,357,361,364,391,394,407,413,417,427,431,434,479,483,497,524,535,1268,1423,1426,1609,1612,1879,1889,1940,1943,1947,1950,1958,2345,2360,2417,2427,2499,2568,2575,2579,2585,2669,2692,2706,2744,2792,2800,2803,2876,2897,2901,2908,2912,2915,2938,2945,2961,2965,2980,3019,3079,3138,3142,3155,3162,3200,3260,3263,3267,3274,3329,3338,3344,3368,3396,3417,3420,3458,3518,3521,3540,3544,3551,3554,3571,3575,3578,3588,3598,3616,3619,3657,3672,3757,3763,3770,3782,3906,3910,3921,3934,4034,4038,4046,4064,4067,4105,4109,4115,4121,4133,4137,4145,4164,4173,4277,4281,4297,4316,4319,4357,4379,4383,4386,4398],[10,11,13],"h2",{"id":12},"getting-started","Pierwsze kroki",[15,16,18],"h3",{"id":17},"installation","Instalacja",[20,21,22],"p",{},"Plugin wymaga Node.js 20.9 lub nowszego. Bibliotekę zainstalujesz swoim ulubionym menedżerem pakietów:",[24,25,30],"pre",{"className":26,"code":27,"language":28,"meta":29,"style":29},"language-bash shiki shiki-themes github-light-high-contrast github-dark-high-contrast","# npm\nnpm install --save-dev @pixsame\u002Fcypress-plugin-visual-regression-diff\n\n# yarn\nyarn add -D @pixsame\u002Fcypress-plugin-visual-regression-diff\n\n# pnpm\npnpm add -D @pixsame\u002Fcypress-plugin-visual-regression-diff\n","bash","",[31,32,33,42,60,67,73,87,92,98],"code",{"__ignoreMap":29},[34,35,38],"span",{"class":36,"line":37},"line",1,[34,39,41],{"class":40},"sLBg1","# npm\n",[34,43,45,49,53,57],{"class":36,"line":44},2,[34,46,48],{"class":47},"soyes","npm",[34,50,52],{"class":51},"sT6z2"," install",[34,54,56],{"class":55},"s-5SL"," --save-dev",[34,58,59],{"class":51}," @pixsame\u002Fcypress-plugin-visual-regression-diff\n",[34,61,63],{"class":36,"line":62},3,[34,64,66],{"emptyLinePlaceholder":65},true,"\n",[34,68,70],{"class":36,"line":69},4,[34,71,72],{"class":40},"# yarn\n",[34,74,76,79,82,85],{"class":36,"line":75},5,[34,77,78],{"class":47},"yarn",[34,80,81],{"class":51}," add",[34,83,84],{"class":55}," -D",[34,86,59],{"class":51},[34,88,90],{"class":36,"line":89},6,[34,91,66],{"emptyLinePlaceholder":65},[34,93,95],{"class":36,"line":94},7,[34,96,97],{"class":40},"# pnpm\n",[34,99,101,104,106,108],{"class":36,"line":100},8,[34,102,103],{"class":47},"pnpm",[34,105,81],{"class":51},[34,107,84],{"class":55},[34,109,59],{"class":51},[20,111,112],{},"Następnie musisz zaimportować bibliotekę:",[114,115,116],"ul",{},[117,118,119,120,123],"li",{},"najpierw w pliku support (domyślnie znajduje się w ",[31,121,122],{},"cypress\u002Fsupport\u002Findex.js","):",[24,125,129],{"className":126,"code":127,"language":128,"meta":29,"style":29},"language-ts shiki shiki-themes github-light-high-contrast github-dark-high-contrast","\u002F\u002F typescript \u002F ES6\nimport '@pixsame\u002Fcypress-plugin-visual-regression-diff';\n\n\u002F\u002F javascript\nrequire('@pixsame\u002Fcypress-plugin-visual-regression-diff');\n","ts",[31,130,131,136,149,153,158],{"__ignoreMap":29},[34,132,133],{"class":36,"line":37},[34,134,135],{"class":40},"\u002F\u002F typescript \u002F ES6\n",[34,137,138,142,145],{"class":36,"line":44},[34,139,141],{"class":140},"sHUrx","import",[34,143,144],{"class":51}," '@pixsame\u002Fcypress-plugin-visual-regression-diff'",[34,146,148],{"class":147},"suds8",";\n",[34,150,151],{"class":36,"line":62},[34,152,66],{"emptyLinePlaceholder":65},[34,154,155],{"class":36,"line":69},[34,156,157],{"class":40},"\u002F\u002F javascript\n",[34,159,160,164,167,170],{"class":36,"line":75},[34,161,163],{"class":162},"sKwhi","require",[34,165,166],{"class":147},"(",[34,168,169],{"class":51},"'@pixsame\u002Fcypress-plugin-visual-regression-diff'",[34,171,172],{"class":147},");\n",[114,174,175],{},[117,176,177,178,181,182,123],{},"a potem w ",[31,179,180],{},"cypress.config.js"," (lub ",[31,183,184],{},"cypress.config.ts",[24,186,188],{"className":126,"code":187,"language":128,"meta":29,"style":29},"\u002F\u002F typescript \u002F ES6\nimport { defineConfig } from 'cypress';\nimport { initPlugin as initVisualRegressionPlugin } from '@pixsame\u002Fcypress-plugin-visual-regression-diff\u002Fplugins';\n\nexport default defineConfig({\n  \u002F\u002F initPlugin trzeba wywołać w tej sekcji, w której jest używany: e2e lub component\n  e2e: {\n    setupNodeEvents(on, config) {\n      initVisualRegressionPlugin(on, config);\n    },\n  },\n  component: {\n    setupNodeEvents(on, config) {\n      initVisualRegressionPlugin(on, config);\n    },\n  },\n});\n",[31,189,190,194,209,229,233,247,252,257,276,285,291,300,306,321,328,333,340],{"__ignoreMap":29},[34,191,192],{"class":36,"line":37},[34,193,135],{"class":40},[34,195,196,198,201,204,207],{"class":36,"line":44},[34,197,141],{"class":140},[34,199,200],{"class":147}," { defineConfig } ",[34,202,203],{"class":140},"from",[34,205,206],{"class":51}," 'cypress'",[34,208,148],{"class":147},[34,210,211,213,216,219,222,224,227],{"class":36,"line":62},[34,212,141],{"class":140},[34,214,215],{"class":147}," { initPlugin ",[34,217,218],{"class":140},"as",[34,220,221],{"class":147}," initVisualRegressionPlugin } ",[34,223,203],{"class":140},[34,225,226],{"class":51}," '@pixsame\u002Fcypress-plugin-visual-regression-diff\u002Fplugins'",[34,228,148],{"class":147},[34,230,231],{"class":36,"line":69},[34,232,66],{"emptyLinePlaceholder":65},[34,234,235,238,241,244],{"class":36,"line":75},[34,236,237],{"class":140},"export",[34,239,240],{"class":140}," default",[34,242,243],{"class":162}," defineConfig",[34,245,246],{"class":47},"({\n",[34,248,249],{"class":36,"line":89},[34,250,251],{"class":40},"  \u002F\u002F initPlugin trzeba wywołać w tej sekcji, w której jest używany: e2e lub component\n",[34,253,254],{"class":36,"line":94},[34,255,256],{"class":147},"  e2e: {\n",[34,258,259,262,264,267,270,273],{"class":36,"line":100},[34,260,261],{"class":162},"    setupNodeEvents",[34,263,166],{"class":147},[34,265,266],{"class":47},"on",[34,268,269],{"class":147},", ",[34,271,272],{"class":47},"config",[34,274,275],{"class":147},") {\n",[34,277,279,282],{"class":36,"line":278},9,[34,280,281],{"class":162},"      initVisualRegressionPlugin",[34,283,284],{"class":147},"(on, config);\n",[34,286,288],{"class":36,"line":287},10,[34,289,290],{"class":147},"    },\n",[34,292,294,297],{"class":36,"line":293},11,[34,295,296],{"class":147},"  }",[34,298,299],{"class":47},",\n",[34,301,303],{"class":36,"line":302},12,[34,304,305],{"class":147},"  component: {\n",[34,307,309,311,313,315,317,319],{"class":36,"line":308},13,[34,310,261],{"class":162},[34,312,166],{"class":147},[34,314,266],{"class":47},[34,316,269],{"class":147},[34,318,272],{"class":47},[34,320,275],{"class":147},[34,322,324,326],{"class":36,"line":323},14,[34,325,281],{"class":162},[34,327,284],{"class":147},[34,329,331],{"class":36,"line":330},15,[34,332,290],{"class":147},[34,334,336,338],{"class":36,"line":335},16,[34,337,296],{"class":147},[34,339,299],{"class":47},[34,341,343,346],{"class":36,"line":342},17,[34,344,345],{"class":47},"})",[34,347,148],{"class":147},[20,349,350,351,356],{},"To wszystko - teraz zobaczmy, jak korzystać z biblioteki, w ",[352,353,355],"a",{"href":354},"#usage","sekcji o użyciu",".",[10,358,360],{"id":359},"usage","Użycie",[20,362,363],{},"Po instalacji wystarczy, że w teście napiszesz:",[24,365,367],{"className":126,"code":366,"language":128,"meta":29,"style":29},"cy.get('.an-element-of-your-choice').matchImage();\n",[31,368,369],{"__ignoreMap":29},[34,370,371,374,377,379,382,385,388],{"class":36,"line":37},[34,372,373],{"class":147},"cy.",[34,375,376],{"class":162},"get",[34,378,166],{"class":147},[34,380,381],{"class":51},"'.an-element-of-your-choice'",[34,383,384],{"class":147},").",[34,386,387],{"class":162},"matchImage",[34,389,390],{"class":147},"();\n",[20,392,393],{},"Albo, jeśli chcesz zrobić zrzut ekranu całego dokumentu:",[24,395,397],{"className":126,"code":396,"language":128,"meta":29,"style":29},"cy.matchImage();\n",[31,398,399],{"__ignoreMap":29},[34,400,401,403,405],{"class":36,"line":37},[34,402,373],{"class":147},[34,404,387],{"class":162},[34,406,390],{"class":147},[20,408,409,410,412],{},"Komenda ",[31,411,387],{}," robi zrzut ekranu i porównuje go z obrazem z poprzedniego uruchomienia. W razie regresji test nie przejdzie, a ty dostaniesz przycisk \"See comparison\", który pokaże, gdzie leży problem.",[10,414,416],{"id":415},"example","Przykład",[20,418,419,420,426],{},"Nadal masz problemy z instalacją? Zajrzyj do ",[352,421,425],{"href":422,"rel":423},"https:\u002F\u002Fgithub.com\u002Fpixsame\u002Fpixsame\u002Ftree\u002Fmain\u002Fexamples",[424],"nofollow","katalogu examples w tym repozytorium",", żeby zobaczyć, jak użyć tego pluginu w środowisku Cypress przy testach e2e lub komponentowych w twoim projekcie.",[10,428,430],{"id":429},"automatic-clean-up-of-unused-images","Automatyczne usuwanie nieużywanych obrazów",[20,432,433],{},"Warto usuwać zrzuty ekranu wygenerowane przez plugin, z których nie korzysta już żaden test.\nWłącz tę funkcję przez zmienną expose i ciesz się odzyskanym miejscem na dysku 🚀:",[24,435,437],{"className":26,"code":436,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionCleanupUnusedImages=true\"\n# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\nnpx cypress run --env \"pluginVisualRegressionCleanupUnusedImages=true\"\n",[31,438,439,444,461,466],{"__ignoreMap":29},[34,440,441],{"class":36,"line":37},[34,442,443],{"class":40},"# Cypress 15.10+\n",[34,445,446,449,452,455,458],{"class":36,"line":44},[34,447,448],{"class":47},"npx",[34,450,451],{"class":51}," cypress",[34,453,454],{"class":51}," run",[34,456,457],{"class":55}," --expose",[34,459,460],{"class":51}," \"pluginVisualRegressionCleanupUnusedImages=true\"\n",[34,462,463],{"class":36,"line":62},[34,464,465],{"class":40},"# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\n",[34,467,468,470,472,474,477],{"class":36,"line":69},[34,469,448],{"class":47},[34,471,451],{"class":51},[34,473,454],{"class":51},[34,475,476],{"class":55}," --env",[34,478,460],{"class":51},[10,480,482],{"id":481},"run-manifest-ci-integration","Manifest uruchomienia (integracja z CI)",[20,484,485,486,488,489,492,493,496],{},"Od wersji 1.1 każde uruchomienie zapisuje manifest JSON z listą wszystkich porównań ",[31,487,387],{},": z którego testu pochodzi dane porównanie, czy przeszło, oblało, utworzyło lub zaktualizowało swój baseline, jaki był współczynnik diffa oraz ścieżki (względem projektu) do plików baseline, ",[31,490,491],{},".actual.png"," i ",[31,494,495],{},".diff.png",". Obok wpisów zapisuje też, gdzie odbyło się uruchomienie (dostawca CI, repozytorium, commit, pull request, id uruchomienia) i z czym zostało uruchomione (przeglądarka, pliki spec, plik konfiguracyjny, opcje pluginu), dzięki czemu narzędzie czytające plik może zaraportować wynik do właściwego PR-a, pobrać właściwy artefakt albo ponownie uruchomić te same porównania. Manifest jest przeznaczony dla narzędzi CI (komentarze w PR-ach, dashboardy do przeglądu, boty zatwierdzające), które działają po zakończeniu Cypressa.",[20,498,499,500,505,506,511,512,519,520,523],{},"Format to otwarty, niezależny od runnera standard oparty na ",[352,501,504],{"href":502,"rel":503},"https:\u002F\u002Fctrf.io",[424],"CTRF"," i udokumentowany na ",[352,507,510],{"href":508,"rel":509},"https:\u002F\u002Fvisual-regression.dev\u002Fmanifest",[424],"visual-regression.dev\u002Fmanifest",". Pakiet npm ",[352,513,516],{"href":514,"rel":515},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fvisual-regression-manifest",[424],[31,517,518],{},"visual-regression-manifest"," dostarcza JSON Schema, typy TypeScript, walidujący reader, merger dla manifestów z całego uruchomienia oraz konwertery dla narzędzi, które nie piszą własnego manifestu (",[31,521,522],{},"toHaveScreenshot"," z Playwrighta, Vitest, jest-image-snapshot, BackstopJS, raporty CTRF, zwykłe pliki obrazów). Swoje narzędzia buduj na tym pakiecie, a nie na tym pluginie.",[20,525,526,527,530,531,534],{},"Domyślnie plik ląduje obok pozostałych artefaktów Cypressa, w ",[31,528,529],{},"\u003CscreenshotsFolder>\u002Fvisual-regression-manifest.\u003CtestingType>.json"," (np. ",[31,532,533],{},"cypress\u002Fscreenshots\u002Fvisual-regression-manifest.e2e.json","). Wgraj go razem z katalogiem snapshotów jako artefakt CI.",[24,536,540],{"className":537,"code":538,"language":539,"meta":29,"style":29},"language-jsonc shiki shiki-themes github-light-high-contrast github-dark-high-contrast","{\n  \"reportFormat\": \"visual-regression-manifest\",\n  \"specVersion\": \"1.0.0-beta.1\",\n  \"createdAt\": \"2026-09-22T10:00:00.000Z\",\n  \"updatedAt\": \"2026-09-22T10:03:12.481Z\",\n  \"projectRoot\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\",\n  \"platform\": {\n    \"osPlatform\": \"linux\",\n    \"arch\": \"x64\",\n    \"osRelease\": \"6.8.0-1021-azure\",\n  },\n  \"ci\": {\n    \"provider\": \"github\",\n    \"repositoryName\": \"acme\u002Fapp\",\n    \"repositoryUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\",\n    \"commit\": \"0f1e2d…\", \u002F\u002F przy zdarzeniach pull_request: commit merge\n    \"ref\": \"refs\u002Fpull\u002F42\u002Fmerge\",\n    \"branchName\": \"feat\u002Fnew-header\",\n    \"pullRequest\": {\n      \"number\": 42,\n      \"headSha\": \"9a8b7c…\",\n      \"headRef\": \"feat\u002Fnew-header\",\n      \"baseRef\": \"main\",\n    },\n    \"event\": \"pull_request\",\n    \"buildId\": \"1234567890\",\n    \"buildName\": \"CI\",\n    \"buildUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\u002Factions\u002Fruns\u002F1234567890\u002Fattempts\u002F1\",\n    \"runAttempt\": \"1\",\n    \"job\": \"e2e\",\n    \"workspace\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\",\n  },\n  \"tool\": {\n    \"name\": \"@pixsame\u002Fcypress-plugin-visual-regression-diff\",\n    \"version\": \"1.1.0\",\n  }, \u002F\u002F co zapisało plik\n  \"options\": { \"updateImages\": \"failures-only\" }, \u002F\u002F globalne opcje pluginVisualRegression*, bez prefiksu\n  \"runner\": {\n    \"name\": \"cypress\",\n    \"version\": \"16.1.0\",\n    \"testingType\": \"e2e\",\n    \"mode\": \"run\",\n    \"configFile\": \"cypress.config.ts\",\n    \"browser\": {\n      \"name\": \"chrome\",\n      \"version\": \"130.0.0.0\",\n      \"family\": \"chromium\",\n      \"headless\": true,\n    },\n    \"specs\": [\"cypress\u002Fe2e\u002Fhome.cy.ts\"],\n    \"specPattern\": \"cypress\u002Fe2e\u002F**\u002F*.cy.{js,jsx,ts,tsx}\",\n    \"baseUrl\": \"http:\u002F\u002Flocalhost:3000\",\n    \"viewport\": { \"width\": 1280, \"height\": 720 },\n  },\n  \"summary\": {\n    \"entries\": 1,\n    \"passed\": 0,\n    \"failed\": 1,\n    \"missingBaseline\": 0,\n    \"created\": 0,\n    \"updated\": 0,\n    \"approved\": 0,\n    \"needsHuman\": 1,\n  },\n  \"entries\": [\n    {\n      \"name\": \"home page renders_#0\",\n      \"test\": {\n        \"filePath\": \"cypress\u002Fe2e\u002Fhome.cy.ts\",\n        \"titlePath\": [\"home page\", \"renders\"],\n        \"retry\": 0,\n      },\n      \"status\": \"failed\",\n      \"comparison\": { \"diffRatio\": 0.0231, \"threshold\": 0.01 },\n      \"images\": {\n        \"baseline\": {\n          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.png\",\n          \"width\": 1280,\n          \"height\": 720,\n        },\n        \"actual\": {\n          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.actual.png\",\n          \"width\": 1280,\n          \"height\": 720,\n        },\n        \"diff\": {\n          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.diff.png\",\n        },\n      },\n      \"baselineWritten\": false,\n      \"recordedAt\": \"2026-09-22T10:03:12.480Z\",\n      \"platform\": {\n        \"osPlatform\": \"linux\",\n        \"arch\": \"x64\",\n        \"browser\": {\n          \"name\": \"chrome\",\n          \"version\": \"130.0.0.0\",\n          \"family\": \"chromium\",\n          \"headless\": true,\n        },\n      },\n      \"viewport\": { \"width\": 1280, \"height\": 720 },\n      \"options\": {\n        \"imagesPath\": \"{spec_path}\u002F__image_snapshots__\",\n        \"maxDiffThreshold\": 0.01,\n        \"diffConfig\": {},\n        \"createMissingImages\": true,\n        \"updateImages\": false,\n        \"forceDeviceScaleFactor\": true,\n        \"screenshotConfig\": {},\n      },\n      \"renderer\": {\n        \"backend\": \"native\",\n        \"browser\": \"chrome\",\n        \"browserVersion\": \"130.0.0.0\",\n      },\n      \"hashes\": {\n        \"baseline\": \"3b7e…\", \u002F\u002F sha256 plików wymienionych w `images`, tylko dla plików, które istnieją\n        \"actual\": \"9d21…\",\n        \"diff\": \"c0ff…\",\n      },\n      \"message\": \"2310 pixels (2.31%) differ; the limit is 1%.\",\n    },\n  ],\n}\n","jsonc",[31,541,542,547,552,557,562,567,572,577,582,587,592,597,602,607,612,617,625,630,636,642,648,654,660,666,671,677,683,689,695,701,707,713,718,724,730,736,742,751,757,763,769,775,781,787,793,799,805,811,817,822,828,834,840,846,851,857,863,869,875,881,887,893,899,905,910,916,922,928,934,940,946,952,958,964,970,976,982,988,994,1000,1006,1012,1018,1023,1028,1033,1039,1045,1050,1055,1061,1067,1073,1079,1085,1091,1097,1103,1109,1115,1120,1125,1131,1137,1143,1149,1155,1161,1167,1173,1179,1184,1190,1196,1202,1208,1213,1219,1228,1234,1240,1245,1251,1256,1262],{"__ignoreMap":29},[34,543,544],{"class":36,"line":37},[34,545,546],{},"{\n",[34,548,549],{"class":36,"line":44},[34,550,551],{},"  \"reportFormat\": \"visual-regression-manifest\",\n",[34,553,554],{"class":36,"line":62},[34,555,556],{},"  \"specVersion\": \"1.0.0-beta.1\",\n",[34,558,559],{"class":36,"line":69},[34,560,561],{},"  \"createdAt\": \"2026-09-22T10:00:00.000Z\",\n",[34,563,564],{"class":36,"line":75},[34,565,566],{},"  \"updatedAt\": \"2026-09-22T10:03:12.481Z\",\n",[34,568,569],{"class":36,"line":89},[34,570,571],{},"  \"projectRoot\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\",\n",[34,573,574],{"class":36,"line":94},[34,575,576],{},"  \"platform\": {\n",[34,578,579],{"class":36,"line":100},[34,580,581],{},"    \"osPlatform\": \"linux\",\n",[34,583,584],{"class":36,"line":278},[34,585,586],{},"    \"arch\": \"x64\",\n",[34,588,589],{"class":36,"line":287},[34,590,591],{},"    \"osRelease\": \"6.8.0-1021-azure\",\n",[34,593,594],{"class":36,"line":293},[34,595,596],{},"  },\n",[34,598,599],{"class":36,"line":302},[34,600,601],{},"  \"ci\": {\n",[34,603,604],{"class":36,"line":308},[34,605,606],{},"    \"provider\": \"github\",\n",[34,608,609],{"class":36,"line":323},[34,610,611],{},"    \"repositoryName\": \"acme\u002Fapp\",\n",[34,613,614],{"class":36,"line":330},[34,615,616],{},"    \"repositoryUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\",\n",[34,618,619,622],{"class":36,"line":335},[34,620,621],{},"    \"commit\": \"0f1e2d…\",",[34,623,624],{}," \u002F\u002F przy zdarzeniach pull_request: commit merge\n",[34,626,627],{"class":36,"line":342},[34,628,629],{},"    \"ref\": \"refs\u002Fpull\u002F42\u002Fmerge\",\n",[34,631,633],{"class":36,"line":632},18,[34,634,635],{},"    \"branchName\": \"feat\u002Fnew-header\",\n",[34,637,639],{"class":36,"line":638},19,[34,640,641],{},"    \"pullRequest\": {\n",[34,643,645],{"class":36,"line":644},20,[34,646,647],{},"      \"number\": 42,\n",[34,649,651],{"class":36,"line":650},21,[34,652,653],{},"      \"headSha\": \"9a8b7c…\",\n",[34,655,657],{"class":36,"line":656},22,[34,658,659],{},"      \"headRef\": \"feat\u002Fnew-header\",\n",[34,661,663],{"class":36,"line":662},23,[34,664,665],{},"      \"baseRef\": \"main\",\n",[34,667,669],{"class":36,"line":668},24,[34,670,290],{},[34,672,674],{"class":36,"line":673},25,[34,675,676],{},"    \"event\": \"pull_request\",\n",[34,678,680],{"class":36,"line":679},26,[34,681,682],{},"    \"buildId\": \"1234567890\",\n",[34,684,686],{"class":36,"line":685},27,[34,687,688],{},"    \"buildName\": \"CI\",\n",[34,690,692],{"class":36,"line":691},28,[34,693,694],{},"    \"buildUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\u002Factions\u002Fruns\u002F1234567890\u002Fattempts\u002F1\",\n",[34,696,698],{"class":36,"line":697},29,[34,699,700],{},"    \"runAttempt\": \"1\",\n",[34,702,704],{"class":36,"line":703},30,[34,705,706],{},"    \"job\": \"e2e\",\n",[34,708,710],{"class":36,"line":709},31,[34,711,712],{},"    \"workspace\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\",\n",[34,714,716],{"class":36,"line":715},32,[34,717,596],{},[34,719,721],{"class":36,"line":720},33,[34,722,723],{},"  \"tool\": {\n",[34,725,727],{"class":36,"line":726},34,[34,728,729],{},"    \"name\": \"@pixsame\u002Fcypress-plugin-visual-regression-diff\",\n",[34,731,733],{"class":36,"line":732},35,[34,734,735],{},"    \"version\": \"1.1.0\",\n",[34,737,739],{"class":36,"line":738},36,[34,740,741],{},"  }, \u002F\u002F co zapisało plik\n",[34,743,745,748],{"class":36,"line":744},37,[34,746,747],{},"  \"options\": { \"updateImages\": \"failures-only\" },",[34,749,750],{}," \u002F\u002F globalne opcje pluginVisualRegression*, bez prefiksu\n",[34,752,754],{"class":36,"line":753},38,[34,755,756],{},"  \"runner\": {\n",[34,758,760],{"class":36,"line":759},39,[34,761,762],{},"    \"name\": \"cypress\",\n",[34,764,766],{"class":36,"line":765},40,[34,767,768],{},"    \"version\": \"16.1.0\",\n",[34,770,772],{"class":36,"line":771},41,[34,773,774],{},"    \"testingType\": \"e2e\",\n",[34,776,778],{"class":36,"line":777},42,[34,779,780],{},"    \"mode\": \"run\",\n",[34,782,784],{"class":36,"line":783},43,[34,785,786],{},"    \"configFile\": \"cypress.config.ts\",\n",[34,788,790],{"class":36,"line":789},44,[34,791,792],{},"    \"browser\": {\n",[34,794,796],{"class":36,"line":795},45,[34,797,798],{},"      \"name\": \"chrome\",\n",[34,800,802],{"class":36,"line":801},46,[34,803,804],{},"      \"version\": \"130.0.0.0\",\n",[34,806,808],{"class":36,"line":807},47,[34,809,810],{},"      \"family\": \"chromium\",\n",[34,812,814],{"class":36,"line":813},48,[34,815,816],{},"      \"headless\": true,\n",[34,818,820],{"class":36,"line":819},49,[34,821,290],{},[34,823,825],{"class":36,"line":824},50,[34,826,827],{},"    \"specs\": [\"cypress\u002Fe2e\u002Fhome.cy.ts\"],\n",[34,829,831],{"class":36,"line":830},51,[34,832,833],{},"    \"specPattern\": \"cypress\u002Fe2e\u002F**\u002F*.cy.{js,jsx,ts,tsx}\",\n",[34,835,837],{"class":36,"line":836},52,[34,838,839],{},"    \"baseUrl\": \"http:\u002F\u002Flocalhost:3000\",\n",[34,841,843],{"class":36,"line":842},53,[34,844,845],{},"    \"viewport\": { \"width\": 1280, \"height\": 720 },\n",[34,847,849],{"class":36,"line":848},54,[34,850,596],{},[34,852,854],{"class":36,"line":853},55,[34,855,856],{},"  \"summary\": {\n",[34,858,860],{"class":36,"line":859},56,[34,861,862],{},"    \"entries\": 1,\n",[34,864,866],{"class":36,"line":865},57,[34,867,868],{},"    \"passed\": 0,\n",[34,870,872],{"class":36,"line":871},58,[34,873,874],{},"    \"failed\": 1,\n",[34,876,878],{"class":36,"line":877},59,[34,879,880],{},"    \"missingBaseline\": 0,\n",[34,882,884],{"class":36,"line":883},60,[34,885,886],{},"    \"created\": 0,\n",[34,888,890],{"class":36,"line":889},61,[34,891,892],{},"    \"updated\": 0,\n",[34,894,896],{"class":36,"line":895},62,[34,897,898],{},"    \"approved\": 0,\n",[34,900,902],{"class":36,"line":901},63,[34,903,904],{},"    \"needsHuman\": 1,\n",[34,906,908],{"class":36,"line":907},64,[34,909,596],{},[34,911,913],{"class":36,"line":912},65,[34,914,915],{},"  \"entries\": [\n",[34,917,919],{"class":36,"line":918},66,[34,920,921],{},"    {\n",[34,923,925],{"class":36,"line":924},67,[34,926,927],{},"      \"name\": \"home page renders_#0\",\n",[34,929,931],{"class":36,"line":930},68,[34,932,933],{},"      \"test\": {\n",[34,935,937],{"class":36,"line":936},69,[34,938,939],{},"        \"filePath\": \"cypress\u002Fe2e\u002Fhome.cy.ts\",\n",[34,941,943],{"class":36,"line":942},70,[34,944,945],{},"        \"titlePath\": [\"home page\", \"renders\"],\n",[34,947,949],{"class":36,"line":948},71,[34,950,951],{},"        \"retry\": 0,\n",[34,953,955],{"class":36,"line":954},72,[34,956,957],{},"      },\n",[34,959,961],{"class":36,"line":960},73,[34,962,963],{},"      \"status\": \"failed\",\n",[34,965,967],{"class":36,"line":966},74,[34,968,969],{},"      \"comparison\": { \"diffRatio\": 0.0231, \"threshold\": 0.01 },\n",[34,971,973],{"class":36,"line":972},75,[34,974,975],{},"      \"images\": {\n",[34,977,979],{"class":36,"line":978},76,[34,980,981],{},"        \"baseline\": {\n",[34,983,985],{"class":36,"line":984},77,[34,986,987],{},"          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.png\",\n",[34,989,991],{"class":36,"line":990},78,[34,992,993],{},"          \"width\": 1280,\n",[34,995,997],{"class":36,"line":996},79,[34,998,999],{},"          \"height\": 720,\n",[34,1001,1003],{"class":36,"line":1002},80,[34,1004,1005],{},"        },\n",[34,1007,1009],{"class":36,"line":1008},81,[34,1010,1011],{},"        \"actual\": {\n",[34,1013,1015],{"class":36,"line":1014},82,[34,1016,1017],{},"          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.actual.png\",\n",[34,1019,1021],{"class":36,"line":1020},83,[34,1022,993],{},[34,1024,1026],{"class":36,"line":1025},84,[34,1027,999],{},[34,1029,1031],{"class":36,"line":1030},85,[34,1032,1005],{},[34,1034,1036],{"class":36,"line":1035},86,[34,1037,1038],{},"        \"diff\": {\n",[34,1040,1042],{"class":36,"line":1041},87,[34,1043,1044],{},"          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.diff.png\",\n",[34,1046,1048],{"class":36,"line":1047},88,[34,1049,1005],{},[34,1051,1053],{"class":36,"line":1052},89,[34,1054,957],{},[34,1056,1058],{"class":36,"line":1057},90,[34,1059,1060],{},"      \"baselineWritten\": false,\n",[34,1062,1064],{"class":36,"line":1063},91,[34,1065,1066],{},"      \"recordedAt\": \"2026-09-22T10:03:12.480Z\",\n",[34,1068,1070],{"class":36,"line":1069},92,[34,1071,1072],{},"      \"platform\": {\n",[34,1074,1076],{"class":36,"line":1075},93,[34,1077,1078],{},"        \"osPlatform\": \"linux\",\n",[34,1080,1082],{"class":36,"line":1081},94,[34,1083,1084],{},"        \"arch\": \"x64\",\n",[34,1086,1088],{"class":36,"line":1087},95,[34,1089,1090],{},"        \"browser\": {\n",[34,1092,1094],{"class":36,"line":1093},96,[34,1095,1096],{},"          \"name\": \"chrome\",\n",[34,1098,1100],{"class":36,"line":1099},97,[34,1101,1102],{},"          \"version\": \"130.0.0.0\",\n",[34,1104,1106],{"class":36,"line":1105},98,[34,1107,1108],{},"          \"family\": \"chromium\",\n",[34,1110,1112],{"class":36,"line":1111},99,[34,1113,1114],{},"          \"headless\": true,\n",[34,1116,1118],{"class":36,"line":1117},100,[34,1119,1005],{},[34,1121,1123],{"class":36,"line":1122},101,[34,1124,957],{},[34,1126,1128],{"class":36,"line":1127},102,[34,1129,1130],{},"      \"viewport\": { \"width\": 1280, \"height\": 720 },\n",[34,1132,1134],{"class":36,"line":1133},103,[34,1135,1136],{},"      \"options\": {\n",[34,1138,1140],{"class":36,"line":1139},104,[34,1141,1142],{},"        \"imagesPath\": \"{spec_path}\u002F__image_snapshots__\",\n",[34,1144,1146],{"class":36,"line":1145},105,[34,1147,1148],{},"        \"maxDiffThreshold\": 0.01,\n",[34,1150,1152],{"class":36,"line":1151},106,[34,1153,1154],{},"        \"diffConfig\": {},\n",[34,1156,1158],{"class":36,"line":1157},107,[34,1159,1160],{},"        \"createMissingImages\": true,\n",[34,1162,1164],{"class":36,"line":1163},108,[34,1165,1166],{},"        \"updateImages\": false,\n",[34,1168,1170],{"class":36,"line":1169},109,[34,1171,1172],{},"        \"forceDeviceScaleFactor\": true,\n",[34,1174,1176],{"class":36,"line":1175},110,[34,1177,1178],{},"        \"screenshotConfig\": {},\n",[34,1180,1182],{"class":36,"line":1181},111,[34,1183,957],{},[34,1185,1187],{"class":36,"line":1186},112,[34,1188,1189],{},"      \"renderer\": {\n",[34,1191,1193],{"class":36,"line":1192},113,[34,1194,1195],{},"        \"backend\": \"native\",\n",[34,1197,1199],{"class":36,"line":1198},114,[34,1200,1201],{},"        \"browser\": \"chrome\",\n",[34,1203,1205],{"class":36,"line":1204},115,[34,1206,1207],{},"        \"browserVersion\": \"130.0.0.0\",\n",[34,1209,1211],{"class":36,"line":1210},116,[34,1212,957],{},[34,1214,1216],{"class":36,"line":1215},117,[34,1217,1218],{},"      \"hashes\": {\n",[34,1220,1222,1225],{"class":36,"line":1221},118,[34,1223,1224],{},"        \"baseline\": \"3b7e…\",",[34,1226,1227],{}," \u002F\u002F sha256 plików wymienionych w `images`, tylko dla plików, które istnieją\n",[34,1229,1231],{"class":36,"line":1230},119,[34,1232,1233],{},"        \"actual\": \"9d21…\",\n",[34,1235,1237],{"class":36,"line":1236},120,[34,1238,1239],{},"        \"diff\": \"c0ff…\",\n",[34,1241,1243],{"class":36,"line":1242},121,[34,1244,957],{},[34,1246,1248],{"class":36,"line":1247},122,[34,1249,1250],{},"      \"message\": \"2310 pixels (2.31%) differ; the limit is 1%.\",\n",[34,1252,1254],{"class":36,"line":1253},123,[34,1255,290],{},[34,1257,1259],{"class":36,"line":1258},124,[34,1260,1261],{},"  ],\n",[34,1263,1265],{"class":36,"line":1264},125,[34,1266,1267],{},"}\n",[1269,1270,1271,1296],"table",{},[1272,1273,1274],"thead",{},[1275,1276,1277,1283,1286,1291],"tr",{},[1278,1279,1280],"th",{},[31,1281,1282],{},"status",[1278,1284,1285],{},"znaczenie",[1278,1287,1288],{},[31,1289,1290],{},"images.actual.path",[1278,1292,1293],{},[31,1294,1295],{},"images.diff.path",[1297,1298,1299,1319,1339,1358,1379,1405],"tbody",{},[1275,1300,1301,1307,1310,1315],{},[1302,1303,1304],"td",{},[31,1305,1306],{},"passed",[1302,1308,1309],{},"w granicach progu",[1302,1311,1312],{},[31,1313,1314],{},"null",[1302,1316,1317],{},[31,1318,1314],{},[1275,1320,1321,1326,1334,1337],{},[1302,1322,1323],{},[31,1324,1325],{},"failed",[1302,1327,1328,1329,492,1331,1333],{},"powyżej progu, ",[31,1330,491],{},[31,1332,495],{}," zostają do przeglądu",[1302,1335,1336],{},"ścieżka",[1302,1338,1336],{},[1275,1340,1341,1346,1352,1354],{},[1302,1342,1343],{},[31,1344,1345],{},"missing-baseline",[1302,1347,1348,1349],{},"brak baseline'u i ",[31,1350,1351],{},"createMissingImages: false",[1302,1353,1336],{},[1302,1355,1356],{},[31,1357,1314],{},[1275,1359,1360,1365,1371,1375],{},[1302,1361,1362],{},[31,1363,1364],{},"created",[1302,1366,1367,1368,1370],{},"brak baseline'u, ",[31,1369,491],{}," stał się baseline'em",[1302,1372,1373],{},[31,1374,1314],{},[1302,1376,1377],{},[31,1378,1314],{},[1275,1380,1381,1386,1397,1401],{},[1302,1382,1383],{},[31,1384,1385],{},"updated",[1302,1387,1388,1389,1392,1393,1396],{},"baseline nadpisany (",[31,1390,1391],{},"updateImages: true"," lub ",[31,1394,1395],{},"'failures-only'",")",[1302,1398,1399],{},[31,1400,1314],{},[1302,1402,1403],{},[31,1404,1314],{},[1275,1406,1407,1412,1415,1419],{},[1302,1408,1409],{},[31,1410,1411],{},"approved",[1302,1413,1414],{},"baseline zastąpiony z UI przeglądu w trybie headed (\"Replace image\")",[1302,1416,1417],{},[31,1418,1314],{},[1302,1420,1421],{},[31,1422,1314],{},[20,1424,1425],{},"Pola na poziomie uruchomienia:",[1269,1427,1428,1437],{},[1272,1429,1430],{},[1275,1431,1432,1435],{},[1278,1433,1434],{},"pole",[1278,1436,1285],{},[1297,1438,1439,1452,1486,1496,1516,1538,1589],{},[1275,1440,1441,1449],{},[1302,1442,1443,269,1446],{},[31,1444,1445],{},"createdAt",[31,1447,1448],{},"updatedAt",[1302,1450,1451],{},"kiedy uruchomienie się zaczęło i kiedy plik został ostatnio przepisany (ISO 8601)",[1275,1453,1454,1459],{},[1302,1455,1456],{},[31,1457,1458],{},"platform",[1302,1460,1461,1464,1465,269,1468,269,1471,1474,1475,269,1478,1481,1482,1485],{},[31,1462,1463],{},"osPlatform"," (",[31,1466,1467],{},"linux",[31,1469,1470],{},"darwin",[31,1472,1473],{},"win32","), ",[31,1476,1477],{},"arch",[31,1479,1480],{},"osRelease"," jądra oraz, w trybie run, czytelna dla człowieka ",[31,1483,1484],{},"osVersion"," maszyny, która uruchomiła testy",[1275,1487,1488,1493],{},[1302,1489,1490],{},[31,1491,1492],{},"tool",[1302,1494,1495],{},"co zapisało plik: ten plugin i jego wersja",[1275,1497,1498,1503],{},[1302,1499,1500],{},[31,1501,1502],{},"ci",[1302,1504,1505,1506,1509,1510,1474,1513,1515],{},"wykrywane ze zmiennych środowiskowych na GitHub Actions i GitLab CI; ",[31,1507,1508],{},"{ \"provider\": null }"," na innych systemach CI (ustawione jest tylko ",[31,1511,1512],{},"CI",[31,1514,1314],{}," poza CI. Ze środowiska kopiowane są wyłącznie wymienione klucze",[1275,1517,1518,1523],{},[1302,1519,1520],{},[31,1521,1522],{},"options",[1302,1524,1525,1526,1529,1530,1533,1534,1537],{},"każda opcja ",[31,1527,1528],{},"pluginVisualRegression*"," z ",[31,1531,1532],{},"expose","\u002F",[31,1535,1536],{},"env",", bez prefiksu, wartości takie, jak skonfigurowano (wartości z CLI pozostają stringami)",[1275,1539,1540,1545],{},[1302,1541,1542],{},[31,1543,1544],{},"runner",[1302,1546,1547,1548,1551,1552,1392,1555,1558,1559,1562,1563,1566,1567,492,1570,1572,1573,1576,1577,269,1580,269,1583,269,1586],{},"co uruchomiło testy. ",[31,1549,1550],{},"mode"," to ",[31,1553,1554],{},"run",[31,1556,1557],{},"open","; ",[31,1560,1561],{},"browser"," to uruchomiona przeglądarka; ",[31,1564,1565],{},"specs"," jest znane tylko w trybie run; ",[31,1568,1569],{},"configFile",[31,1571,1565],{}," są względne wobec ",[31,1574,1575],{},"projectRoot",". Uruchomienia w Cypress Cloud dostają też ",[31,1578,1579],{},"cloud.runUrl",[31,1581,1582],{},"group",[31,1584,1585],{},"tag",[31,1587,1588],{},"parallel",[1275,1590,1591,1596],{},[1302,1592,1593],{},[31,1594,1595],{},"summary",[1302,1597,1598,1599,1551,1602,1604,1605,1608],{},"liczba wpisów dla każdego statusu; ",[31,1600,1601],{},"needsHuman",[31,1603,1325],{}," + ",[31,1606,1607],{},"missingBaseline",", więc konsument może podjąć decyzję bez czytania wpisów",[20,1610,1611],{},"Uwagi dla konsumentów:",[114,1613,1614,1642,1656,1664,1714,1735,1770,1780,1812,1826,1845,1866],{},[117,1615,1616,1617,1619,1620,1622,1623,1626,1627,1630,1631,1633,1634,1637,1638,1641],{},"Wszystkie ścieżki są względne wobec ",[31,1618,1575],{}," i używają separatora ",[31,1621,1533],{},"; mogą wskazywać poza projekt (",[31,1624,1625],{},"..\u002F…","), gdy ",[31,1628,1629],{},"imagesPath"," jest bezwzględna. ",[31,1632,1575],{}," to projekt Cypressa, niekoniecznie katalog główny repozytorium: ",[31,1635,1636],{},"ci.workspace"," to katalog checkoutu, więc ",[31,1639,1640],{},"relative(ci.workspace, projectRoot)"," daje prefiks ścieżki wewnątrz repozytorium.",[117,1643,1644,492,1646,1648,1649,1651,1652,1655],{},[31,1645,1325],{},[31,1647,1345],{}," to wpisy, które wymagają człowieka: skopiowanie ",[31,1650,1290],{}," w miejsce ",[31,1653,1654],{},"images.baseline.path"," je zatwierdza.",[117,1657,1658,1661,1662,356],{},[31,1659,1660],{},"baselineWritten"," mówi, czy drzewo robocze zmieniło się dla danego zrzutu ekranu, niezależnie od ",[31,1663,1282],{},[117,1665,1666,1667,1670,1671,1674,1675,1464,1678,269,1681,269,1684,1392,1687,1690,1691,1694,1695,1698,1699,1702,1703,1706,1707,1529,1710,1713],{},"Wpis, którego porównanie wykryło różnice, zawiera ",[31,1668,1669],{},"extra.pixsame.analysis"," (o ile opcja ",[31,1672,1673],{},"analysis"," nie jest wyłączona): ",[31,1676,1677],{},"label",[31,1679,1680],{},"content-change",[31,1682,1683],{},"moved",[31,1685,1686],{},"noise-like",[31,1688,1689],{},"size-change","), jednozdaniowy ",[31,1692,1693],{},"description",", zmienione obszary ",[31,1696,1697],{},"regions"," wraz z ich ramkami, wykryte przesunięcie ",[31,1700,1701],{},"shift"," oraz ",[31,1704,1705],{},"bundleKey",", który jest taki sam dla wpisów zmienionych w ten sam sposób. Funkcja ",[31,1708,1709],{},"bundle()",[31,1711,1712],{},"@pixsame\u002Fanalysis"," grupuje wpisy według niego.",[117,1715,1716,1717,492,1719,1722,1723,1725,1726,1464,1728,1730,1731,1734],{},"Każdy wpis niesie własne ",[31,1718,1458],{},[31,1720,1721],{},"viewport",", więc po sklejeniu kilku manifestów da się odróżnić wpisy z macierzy maszyn. ",[31,1724,1522],{}," we wpisie to dokładne wejście ",[31,1727,387],{},[31,1729,1629],{}," zachowuje nierozwinięte tokeny); ",[31,1732,1733],{},"comparison"," to wynik.",[117,1736,1737,1739,1740,1743,1744,1551,1747,1750,1751,1754,1755,1758,1759,492,1762,1765,1766,1769],{},[31,1738,1458],{}," to miejsce, gdzie uruchomił się test, ",[31,1741,1742],{},"renderer"," to miejsce, skąd pochodzą piksele. Dziś każdy zrzut ekranu robi przeglądarka sterowana przez Cypressa, więc ",[31,1745,1746],{},"renderer.backend",[31,1748,1749],{},"native",", a ",[31,1752,1753],{},"renderer.browser"," powtarza ",[31,1756,1757],{},"platform.browser.name",". Pole istnieje po to, żeby renderer inny niż lokalna przeglądarka (przypięty obraz Dockera, hostowany renderer) mógł się zidentyfikować przez ",[31,1760,1761],{},"rendererVersion",[31,1763,1764],{},"imageDigest",", a uruchomienie, które musiało wrócić do lokalnej przeglądarki, mogło zostać oznaczone ",[31,1767,1768],{},"renderer.fallback: true",". Wpisy z różnymi rendererami traktuj jako różne baseline'y.",[117,1771,1772,1775,1776,1779],{},[31,1773,1774],{},"hashes"," zawiera sha256 każdego pliku z ",[31,1777,1778],{},"images",", który istnieje na dysku. Użyj ich, żeby pominąć ponowne wgrywanie niezmienionych baseline'ów, sprawdzić, czy artefakt zgadza się z manifestem, albo wykryć dwa wpisy, które dały identyczne piksele.",[117,1781,1782,1783,492,1786,1789,1790,1793,1794,1797,1798,1801,1802,1805,1806,492,1809,356],{},"Mapowanie na pull requesta: użyj ",[31,1784,1785],{},"ci.repositoryName",[31,1787,1788],{},"ci.pullRequest.number",". Przy zdarzeniach ",[31,1791,1792],{},"pull_request"," na GitHubie ",[31,1795,1796],{},"ci.commit"," to tymczasowy commit merge, więc wszystko, co pushuje do gałęzi PR-a, musi używać ",[31,1799,1800],{},"ci.pullRequest.headSha"," \u002F ",[31,1803,1804],{},"headRef",". Artefakt workflow znajdziesz przez ",[31,1807,1808],{},"ci.buildId",[31,1810,1811],{},"ci.runAttempt",[117,1813,1814,1815,1818,1819,1822,1823,1825],{},"Odtworzenie uruchomienia: ",[31,1816,1817],{},"npx cypress run --\u003Crunner.testingType> --browser \u003Crunner.browser.name> --config-file \u003Crunner.configFile> --spec \u003Crunner.specs joined with ,>",", plus jedno ",[31,1820,1821],{},"--expose \"pluginVisualRegression\u003CKey>=\u003Cvalue>\""," na każdy wpis z ",[31,1824,1522],{},". Manifest przechowuje je jako osobne części, a nie jako string polecenia, więc cytowanie w shellu i menedżer pakietów pozostają twoim wyborem.",[117,1827,1828,1829,1464,1832,1835,1836,1604,1839,1529,1842,1844],{},"Plik jest przepisywany po każdym porównaniu, więc jest kompletny nawet wtedy, gdy uruchomienie zostanie przerwane. Gdy pliki spec działają równolegle na kilku maszynach, każda maszyna zapisuje własny manifest; ",[31,1830,1831],{},"**\u002Fvisual-regression-manifest{,.*}.json",[31,1833,1834],{},"MANIFEST_FILE_GLOB"," w pakiecie) znajduje je wszystkie w artefakcie, a ",[31,1837,1838],{},"readManifestFiles",[31,1840,1841],{},"mergeManifests",[31,1843,518],{}," łączą je w jedną listę, w której późniejsza próba CI wygrywa z wcześniejszą.",[117,1846,1847,1848,1850,1851,1853,1854,1857,1858,1861,1862,1865],{},"Tylko blok ",[31,1849,1544],{}," i klucze ",[31,1852,1522],{}," są specyficzne dla Cypressa; reszta formatu jest wspólna dla wszystkich pozostałych narzędzi zapisujących manifest. ",[31,1855,1856],{},"specVersion"," trzyma się semver, a jego major jest podbijany wyłącznie przy łamiących zmianach formatu; konsumenci ignorują klucze, których nie znają. Ponieważ nazwy pól są zgodne z CTRF, ",[31,1859,1860],{},"toCtrf"," z pakietu zamienia manifest w raport ",[352,1863,504],{"href":502,"rel":1864},[424]," dla narzędzi, które czytają ten format.",[117,1867,1868,1869,1872,1873,1876,1877,356],{},"Typy ",[31,1870,1871],{},"Manifest*"," są dla wygody re-eksportowane z ",[31,1874,1875],{},"@pixsame\u002Fcypress-plugin-visual-regression-diff\u002Fplugins","; to te same typy, co w ",[31,1878,518],{},[20,1880,1881,1882,1464,1885,1888],{},"Manifest jest domyślnie włączony. Żeby zapisać go gdzie indziej (ścieżki są rozwiązywane względem katalogu głównego projektu) albo go wyłączyć, użyj klucza ",[31,1883,1884],{},"pluginVisualRegressionManifestPath",[31,1886,1887],{},"false"," go wyłącza, nic innego się nie zmienia):",[24,1890,1892],{"className":26,"code":1891,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionManifestPath=reports\u002Fvisual-regression.json\"\nnpx cypress run --expose \"pluginVisualRegressionManifestPath=false\"\n# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\nnpx cypress run --env \"pluginVisualRegressionManifestPath=false\"\n",[31,1893,1894,1898,1911,1924,1928],{"__ignoreMap":29},[34,1895,1896],{"class":36,"line":37},[34,1897,443],{"class":40},[34,1899,1900,1902,1904,1906,1908],{"class":36,"line":44},[34,1901,448],{"class":47},[34,1903,451],{"class":51},[34,1905,454],{"class":51},[34,1907,457],{"class":55},[34,1909,1910],{"class":51}," \"pluginVisualRegressionManifestPath=reports\u002Fvisual-regression.json\"\n",[34,1912,1913,1915,1917,1919,1921],{"class":36,"line":62},[34,1914,448],{"class":47},[34,1916,451],{"class":51},[34,1918,454],{"class":51},[34,1920,457],{"class":55},[34,1922,1923],{"class":51}," \"pluginVisualRegressionManifestPath=false\"\n",[34,1925,1926],{"class":36,"line":69},[34,1927,465],{"class":40},[34,1929,1930,1932,1934,1936,1938],{"class":36,"line":75},[34,1931,448],{"class":47},[34,1933,451],{"class":51},[34,1935,454],{"class":51},[34,1937,476],{"class":55},[34,1939,1923],{"class":51},[20,1941,1942],{},"Gdy z własną ścieżką uruchamiasz zarówno testy e2e, jak i komponentowe, sam dodaj do niej typ testów; w przeciwnym razie uruchomienia nadpisywałyby sobie nawzajem plik.",[10,1944,1946],{"id":1945},"configuration","Konfiguracja",[20,1948,1949],{},"Plugin skonfigurujesz:",[114,1951,1952],{},[117,1953,1954,1955,1957],{},"przekazując konfigurację jako argument komendy ",[31,1956,387],{},":",[24,1959,1961],{"className":126,"code":1960,"language":128,"meta":29,"style":29},"cy.matchImage({\n  \u002F\u002F konfiguracja zrzutu ekranu, przekazywana bezpośrednio do metody screenshot w Cypress: https:\u002F\u002Fdocs.cypress.io\u002Fapi\u002Fcypress-api\u002Fscreenshot-api#Arguments\n  \u002F\u002F domyślnie: { }\n  screenshotConfig: {\n    blackout: ['.element-to-be-blackouted'],\n  },\n  \u002F\u002F opcje pixelmatch, zobacz: https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fpixelmatch#pixelmatchimg1-img2-output-width-height-options\n  \u002F\u002F domyślnie: {} - domyślne ustawienia pixelmatch, w tym includeAA: false (piksele krawędzi z anti-aliasingiem nie są liczone jako różnice)\n  diffConfig: {\n    threshold: 0.01,\n  },\n  \u002F\u002F czy automatycznie tworzyć brakujące obrazy baseline\n  \u002F\u002F domyślnie: true\n  createMissingImages: false,\n  \u002F\u002F czy automatycznie aktualizować obrazy - przydatne na CI\n  \u002F\u002F - true: nadpisuj wszystkie baseline'y bez porównywania (najszybsze)\n  \u002F\u002F - 'failures-only': najpierw porównaj, aktualizuj baseline tylko wtedy, gdy diff przekroczy próg\n  \u002F\u002F - false: nigdy nie aktualizuj baseline'ów automatycznie\n  \u002F\u002F domyślnie: false\n  updateImages: true,\n  \u002F\u002F ścieżka katalogu, w którym będą zapisywane zrzuty ekranu\n  \u002F\u002F ścieżki względne są rozwiązywane względem katalogu głównego projektu\n  \u002F\u002F ścieżki bezwzględne (zarówno na unixie, jak i na Windowsie) są obsługiwane\n  \u002F\u002F separatory ścieżek plugin znormalizuje zależnie od systemu; zawsze używaj \u002F jako separatora, np.: C:\u002Fmy-directory\u002Fnested dla notacji dyskowej w stylu Windows\n  \u002F\u002F w ścieżce można użyć tych zmiennych:\n  \u002F\u002F - {spec_path} - ścieżka względna od katalogu głównego projektu do katalogu bieżącego pliku spec (np. `\u002Fsrc\u002Fcomponents\u002Fmy-tested-component`); musi stanowić cały segment ścieżki\n  \u002F\u002F - {platform} - `{os}-{browser}`, np. `linux-chrome`, `darwin-electron`, `win32-firefox`\n  \u002F\u002F - {os} - Cypress.platform: `linux`, `darwin` albo `win32`\n  \u002F\u002F - {browser} - przeglądarka, w której Cypress uruchamia spec (Cypress.browser.name): `electron`, o ile `--browser` nie mówi inaczej, `chrome`, `firefox`, `edge`, ...\n  \u002F\u002F {platform}, {os} i {browser} mogą też być częścią segmentu (`shots-{platform}`); `matchAgainstPath` nigdy nie jest rozwijana\n  \u002F\u002F używaj ich, żeby trzymać osobno baseline'y z różnych systemów\u002Fprzeglądarek, zobacz \"Osobne baseline'y dla każdej platformy\" poniżej\n  \u002F\u002F domyślnie: '{spec_path}\u002F__image_snapshots__'\n  imagesPath: 'this-might-be-your-custom\u002Fmaybe-nested-directory',\n  \u002F\u002F maksymalny próg, powyżej którego test ma nie przejść\n  \u002F\u002F domyślnie: 0.01\n  maxDiffThreshold: 0.1,\n  \u002F\u002F opisuje, co się zmieniło, gdy porównanie wykryje różnice, np. \"Everything below y=340 moved down by 12 px.\"\n  \u002F\u002F zdanie kończy komunikat błędu, jest widoczne w karuzeli przeglądu i trafia do manifestu przebiegu\n  \u002F\u002F nigdy nie wpływa na to, czy porównanie przechodzi\n  \u002F\u002F domyślnie: true\n  analysis: false,\n  \u002F\u002F wymusza ustawienie współczynnika skalowania na wartość \"1\"\n  \u002F\u002F pomaga, gdy zrzuty ekranu są skalowane 2x na ekranach o wysokiej gęstości, np. Mac Retina\n  \u002F\u002F domyślnie: true\n  forceDeviceScaleFactor: false,\n  \u002F\u002F włącza preset deterministycznego renderowania, zobacz \"Reducing cross-OS rendering noise\" poniżej\n  \u002F\u002F dla pojedynczego wywołania kontroluje tylko CSS wstrzykiwany do strony na czas zrzutu ekranu (kursor, animacje, paski przewijania);\n  \u002F\u002F przełączniki przeglądarki działają na poziomie całego procesu i zależą od globalnej opcji pluginVisualRegressionDeterministicRendering\n  \u002F\u002F domyślnie: true\n  deterministicRendering: false,\n  \u002F\u002F tytuł używany do nazwania pliku obrazu\n  \u002F\u002F domyślnie: Cypress.currentTest.titlePath (tytuł twojego testu)\n  title: `${Cypress.currentTest.titlePath.join(' ')} (${Cypress.browser.displayName})`,\n  \u002F\u002F ścieżka do własnego obrazu, z którym ma być robione porównanie\n  \u002F\u002F zamiast porównywania z obrazem z poprzedniego uruchomienia\n  \u002F\u002F domyślnie: undefined\n  matchAgainstPath: '\u002Fpath\u002Fto\u002Freference-image.png',\n});\n",[31,1962,1963,1971,1976,1981,1986,1997,2001,2006,2011,2016,2026,2030,2035,2040,2049,2054,2059,2064,2069,2074,2084,2089,2094,2099,2104,2109,2114,2119,2124,2129,2134,2139,2144,2154,2159,2164,2174,2179,2184,2189,2193,2202,2207,2212,2216,2225,2230,2235,2240,2244,2253,2258,2263,2315,2320,2325,2330,2340],{"__ignoreMap":29},[34,1964,1965,1967,1969],{"class":36,"line":37},[34,1966,373],{"class":147},[34,1968,387],{"class":162},[34,1970,246],{"class":147},[34,1972,1973],{"class":36,"line":44},[34,1974,1975],{"class":40},"  \u002F\u002F konfiguracja zrzutu ekranu, przekazywana bezpośrednio do metody screenshot w Cypress: https:\u002F\u002Fdocs.cypress.io\u002Fapi\u002Fcypress-api\u002Fscreenshot-api#Arguments\n",[34,1977,1978],{"class":36,"line":62},[34,1979,1980],{"class":40},"  \u002F\u002F domyślnie: { }\n",[34,1982,1983],{"class":36,"line":69},[34,1984,1985],{"class":147},"  screenshotConfig: {\n",[34,1987,1988,1991,1994],{"class":36,"line":75},[34,1989,1990],{"class":147},"    blackout: [",[34,1992,1993],{"class":51},"'.element-to-be-blackouted'",[34,1995,1996],{"class":147},"],\n",[34,1998,1999],{"class":36,"line":89},[34,2000,596],{"class":147},[34,2002,2003],{"class":36,"line":94},[34,2004,2005],{"class":40},"  \u002F\u002F opcje pixelmatch, zobacz: https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fpixelmatch#pixelmatchimg1-img2-output-width-height-options\n",[34,2007,2008],{"class":36,"line":100},[34,2009,2010],{"class":40},"  \u002F\u002F domyślnie: {} - domyślne ustawienia pixelmatch, w tym includeAA: false (piksele krawędzi z anti-aliasingiem nie są liczone jako różnice)\n",[34,2012,2013],{"class":36,"line":278},[34,2014,2015],{"class":147},"  diffConfig: {\n",[34,2017,2018,2021,2024],{"class":36,"line":287},[34,2019,2020],{"class":147},"    threshold: ",[34,2022,2023],{"class":55},"0.01",[34,2025,299],{"class":147},[34,2027,2028],{"class":36,"line":293},[34,2029,596],{"class":147},[34,2031,2032],{"class":36,"line":302},[34,2033,2034],{"class":40},"  \u002F\u002F czy automatycznie tworzyć brakujące obrazy baseline\n",[34,2036,2037],{"class":36,"line":308},[34,2038,2039],{"class":40},"  \u002F\u002F domyślnie: true\n",[34,2041,2042,2045,2047],{"class":36,"line":323},[34,2043,2044],{"class":147},"  createMissingImages: ",[34,2046,1887],{"class":55},[34,2048,299],{"class":147},[34,2050,2051],{"class":36,"line":330},[34,2052,2053],{"class":40},"  \u002F\u002F czy automatycznie aktualizować obrazy - przydatne na CI\n",[34,2055,2056],{"class":36,"line":335},[34,2057,2058],{"class":40},"  \u002F\u002F - true: nadpisuj wszystkie baseline'y bez porównywania (najszybsze)\n",[34,2060,2061],{"class":36,"line":342},[34,2062,2063],{"class":40},"  \u002F\u002F - 'failures-only': najpierw porównaj, aktualizuj baseline tylko wtedy, gdy diff przekroczy próg\n",[34,2065,2066],{"class":36,"line":632},[34,2067,2068],{"class":40},"  \u002F\u002F - false: nigdy nie aktualizuj baseline'ów automatycznie\n",[34,2070,2071],{"class":36,"line":638},[34,2072,2073],{"class":40},"  \u002F\u002F domyślnie: false\n",[34,2075,2076,2079,2082],{"class":36,"line":644},[34,2077,2078],{"class":147},"  updateImages: ",[34,2080,2081],{"class":55},"true",[34,2083,299],{"class":147},[34,2085,2086],{"class":36,"line":650},[34,2087,2088],{"class":40},"  \u002F\u002F ścieżka katalogu, w którym będą zapisywane zrzuty ekranu\n",[34,2090,2091],{"class":36,"line":656},[34,2092,2093],{"class":40},"  \u002F\u002F ścieżki względne są rozwiązywane względem katalogu głównego projektu\n",[34,2095,2096],{"class":36,"line":662},[34,2097,2098],{"class":40},"  \u002F\u002F ścieżki bezwzględne (zarówno na unixie, jak i na Windowsie) są obsługiwane\n",[34,2100,2101],{"class":36,"line":668},[34,2102,2103],{"class":40},"  \u002F\u002F separatory ścieżek plugin znormalizuje zależnie od systemu; zawsze używaj \u002F jako separatora, np.: C:\u002Fmy-directory\u002Fnested dla notacji dyskowej w stylu Windows\n",[34,2105,2106],{"class":36,"line":673},[34,2107,2108],{"class":40},"  \u002F\u002F w ścieżce można użyć tych zmiennych:\n",[34,2110,2111],{"class":36,"line":679},[34,2112,2113],{"class":40},"  \u002F\u002F - {spec_path} - ścieżka względna od katalogu głównego projektu do katalogu bieżącego pliku spec (np. `\u002Fsrc\u002Fcomponents\u002Fmy-tested-component`); musi stanowić cały segment ścieżki\n",[34,2115,2116],{"class":36,"line":685},[34,2117,2118],{"class":40},"  \u002F\u002F - {platform} - `{os}-{browser}`, np. `linux-chrome`, `darwin-electron`, `win32-firefox`\n",[34,2120,2121],{"class":36,"line":691},[34,2122,2123],{"class":40},"  \u002F\u002F - {os} - Cypress.platform: `linux`, `darwin` albo `win32`\n",[34,2125,2126],{"class":36,"line":697},[34,2127,2128],{"class":40},"  \u002F\u002F - {browser} - przeglądarka, w której Cypress uruchamia spec (Cypress.browser.name): `electron`, o ile `--browser` nie mówi inaczej, `chrome`, `firefox`, `edge`, ...\n",[34,2130,2131],{"class":36,"line":703},[34,2132,2133],{"class":40},"  \u002F\u002F {platform}, {os} i {browser} mogą też być częścią segmentu (`shots-{platform}`); `matchAgainstPath` nigdy nie jest rozwijana\n",[34,2135,2136],{"class":36,"line":709},[34,2137,2138],{"class":40},"  \u002F\u002F używaj ich, żeby trzymać osobno baseline'y z różnych systemów\u002Fprzeglądarek, zobacz \"Osobne baseline'y dla każdej platformy\" poniżej\n",[34,2140,2141],{"class":36,"line":715},[34,2142,2143],{"class":40},"  \u002F\u002F domyślnie: '{spec_path}\u002F__image_snapshots__'\n",[34,2145,2146,2149,2152],{"class":36,"line":720},[34,2147,2148],{"class":147},"  imagesPath: ",[34,2150,2151],{"class":51},"'this-might-be-your-custom\u002Fmaybe-nested-directory'",[34,2153,299],{"class":147},[34,2155,2156],{"class":36,"line":726},[34,2157,2158],{"class":40},"  \u002F\u002F maksymalny próg, powyżej którego test ma nie przejść\n",[34,2160,2161],{"class":36,"line":732},[34,2162,2163],{"class":40},"  \u002F\u002F domyślnie: 0.01\n",[34,2165,2166,2169,2172],{"class":36,"line":738},[34,2167,2168],{"class":147},"  maxDiffThreshold: ",[34,2170,2171],{"class":55},"0.1",[34,2173,299],{"class":147},[34,2175,2176],{"class":36,"line":744},[34,2177,2178],{"class":40},"  \u002F\u002F opisuje, co się zmieniło, gdy porównanie wykryje różnice, np. \"Everything below y=340 moved down by 12 px.\"\n",[34,2180,2181],{"class":36,"line":753},[34,2182,2183],{"class":40},"  \u002F\u002F zdanie kończy komunikat błędu, jest widoczne w karuzeli przeglądu i trafia do manifestu przebiegu\n",[34,2185,2186],{"class":36,"line":759},[34,2187,2188],{"class":40},"  \u002F\u002F nigdy nie wpływa na to, czy porównanie przechodzi\n",[34,2190,2191],{"class":36,"line":765},[34,2192,2039],{"class":40},[34,2194,2195,2198,2200],{"class":36,"line":771},[34,2196,2197],{"class":147},"  analysis: ",[34,2199,1887],{"class":55},[34,2201,299],{"class":147},[34,2203,2204],{"class":36,"line":777},[34,2205,2206],{"class":40},"  \u002F\u002F wymusza ustawienie współczynnika skalowania na wartość \"1\"\n",[34,2208,2209],{"class":36,"line":783},[34,2210,2211],{"class":40},"  \u002F\u002F pomaga, gdy zrzuty ekranu są skalowane 2x na ekranach o wysokiej gęstości, np. Mac Retina\n",[34,2213,2214],{"class":36,"line":789},[34,2215,2039],{"class":40},[34,2217,2218,2221,2223],{"class":36,"line":795},[34,2219,2220],{"class":147},"  forceDeviceScaleFactor: ",[34,2222,1887],{"class":55},[34,2224,299],{"class":147},[34,2226,2227],{"class":36,"line":801},[34,2228,2229],{"class":40},"  \u002F\u002F włącza preset deterministycznego renderowania, zobacz \"Reducing cross-OS rendering noise\" poniżej\n",[34,2231,2232],{"class":36,"line":807},[34,2233,2234],{"class":40},"  \u002F\u002F dla pojedynczego wywołania kontroluje tylko CSS wstrzykiwany do strony na czas zrzutu ekranu (kursor, animacje, paski przewijania);\n",[34,2236,2237],{"class":36,"line":813},[34,2238,2239],{"class":40},"  \u002F\u002F przełączniki przeglądarki działają na poziomie całego procesu i zależą od globalnej opcji pluginVisualRegressionDeterministicRendering\n",[34,2241,2242],{"class":36,"line":819},[34,2243,2039],{"class":40},[34,2245,2246,2249,2251],{"class":36,"line":824},[34,2247,2248],{"class":147},"  deterministicRendering: ",[34,2250,1887],{"class":55},[34,2252,299],{"class":147},[34,2254,2255],{"class":36,"line":830},[34,2256,2257],{"class":40},"  \u002F\u002F tytuł używany do nazwania pliku obrazu\n",[34,2259,2260],{"class":36,"line":836},[34,2261,2262],{"class":40},"  \u002F\u002F domyślnie: Cypress.currentTest.titlePath (tytuł twojego testu)\n",[34,2264,2265,2268,2271,2274,2276,2279,2281,2284,2286,2289,2291,2294,2296,2299,2301,2303,2305,2307,2310,2313],{"class":36,"line":842},[34,2266,2267],{"class":147},"  title: ",[34,2269,2270],{"class":51},"`${",[34,2272,2273],{"class":147},"Cypress",[34,2275,356],{"class":51},[34,2277,2278],{"class":147},"currentTest",[34,2280,356],{"class":51},[34,2282,2283],{"class":147},"titlePath",[34,2285,356],{"class":51},[34,2287,2288],{"class":162},"join",[34,2290,166],{"class":51},[34,2292,2293],{"class":51},"' '",[34,2295,1396],{"class":51},[34,2297,2298],{"class":51},"} (${",[34,2300,2273],{"class":147},[34,2302,356],{"class":51},[34,2304,1561],{"class":147},[34,2306,356],{"class":51},[34,2308,2309],{"class":147},"displayName",[34,2311,2312],{"class":51},"})`",[34,2314,299],{"class":147},[34,2316,2317],{"class":36,"line":848},[34,2318,2319],{"class":40},"  \u002F\u002F ścieżka do własnego obrazu, z którym ma być robione porównanie\n",[34,2321,2322],{"class":36,"line":853},[34,2323,2324],{"class":40},"  \u002F\u002F zamiast porównywania z obrazem z poprzedniego uruchomienia\n",[34,2326,2327],{"class":36,"line":859},[34,2328,2329],{"class":40},"  \u002F\u002F domyślnie: undefined\n",[34,2331,2332,2335,2338],{"class":36,"line":865},[34,2333,2334],{"class":147},"  matchAgainstPath: ",[34,2336,2337],{"class":51},"'\u002Fpath\u002Fto\u002Freference-image.png'",[34,2339,299],{"class":147},[34,2341,2342],{"class":36,"line":871},[34,2343,2344],{"class":147},"});\n",[114,2346,2347],{},[117,2348,2349,2350,2355,2356,2359],{},"przez ",[352,2351,2354],{"href":2352,"rel":2353},"https:\u002F\u002Fon.cypress.io\u002Fexpose",[424],"globalną konfigurację expose"," (Cypress 15.10+). Nazwy kluczy konfiguracji są takie same jak klucze obiektu konfiguracji powyżej, tylko z dodanym prefiksem ",[31,2357,2358],{},"pluginVisualRegression",", np.:",[24,2361,2363],{"className":26,"code":2362,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionUpdateImages=true,pluginVisualRegressionDiffConfig={\\\"threshold\\\":0.01}\"\n# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\nnpx cypress run --env \"pluginVisualRegressionUpdateImages=true,pluginVisualRegressionDiffConfig={\\\"threshold\\\":0.01}\"\n",[31,2364,2365,2369,2393,2397],{"__ignoreMap":29},[34,2366,2367],{"class":36,"line":37},[34,2368,443],{"class":40},[34,2370,2371,2373,2375,2377,2379,2382,2385,2388,2390],{"class":36,"line":44},[34,2372,448],{"class":47},[34,2374,451],{"class":51},[34,2376,454],{"class":51},[34,2378,457],{"class":55},[34,2380,2381],{"class":51}," \"pluginVisualRegressionUpdateImages=true,pluginVisualRegressionDiffConfig={",[34,2383,2384],{"class":140},"\\\"",[34,2386,2387],{"class":51},"threshold",[34,2389,2384],{"class":140},[34,2391,2392],{"class":51},":0.01}\"\n",[34,2394,2395],{"class":36,"line":62},[34,2396,465],{"class":40},[34,2398,2399,2401,2403,2405,2407,2409,2411,2413,2415],{"class":36,"line":69},[34,2400,448],{"class":47},[34,2402,451],{"class":51},[34,2404,454],{"class":51},[34,2406,476],{"class":55},[34,2408,2381],{"class":51},[34,2410,2384],{"class":140},[34,2412,2387],{"class":51},[34,2414,2384],{"class":140},[34,2416,2392],{"class":51},[20,2418,2419,2420,181,2423,2426],{},"Kilka opcji przekazuj w jednej fladze, rozdzielone przecinkami. Gdy ",[31,2421,2422],{},"--expose",[31,2424,2425],{},"--env",") powtórzy się, Cypress weźmie pod uwagę tylko ostatnie wystąpienie.",[24,2428,2430],{"className":126,"code":2429,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress 15.10+)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  expose: {\n    pluginVisualRegressionUpdateImages: true,\n    pluginVisualRegressionDiffConfig: { threshold: 0.01 },\n  },\n});\n",[31,2431,2432,2437,2449,2453,2463,2468,2477,2487,2493],{"__ignoreMap":29},[34,2433,2434],{"class":36,"line":37},[34,2435,2436],{"class":40},"\u002F\u002F cypress.config.ts (Cypress 15.10+)\n",[34,2438,2439,2441,2443,2445,2447],{"class":36,"line":44},[34,2440,141],{"class":140},[34,2442,200],{"class":147},[34,2444,203],{"class":140},[34,2446,206],{"class":51},[34,2448,148],{"class":147},[34,2450,2451],{"class":36,"line":62},[34,2452,66],{"emptyLinePlaceholder":65},[34,2454,2455,2457,2459,2461],{"class":36,"line":69},[34,2456,237],{"class":140},[34,2458,240],{"class":140},[34,2460,243],{"class":162},[34,2462,246],{"class":47},[34,2464,2465],{"class":36,"line":75},[34,2466,2467],{"class":147},"  expose: {\n",[34,2469,2470,2473,2475],{"class":36,"line":89},[34,2471,2472],{"class":147},"    pluginVisualRegressionUpdateImages: ",[34,2474,2081],{"class":55},[34,2476,299],{"class":147},[34,2478,2479,2482,2484],{"class":36,"line":94},[34,2480,2481],{"class":147},"    pluginVisualRegressionDiffConfig: { threshold: ",[34,2483,2023],{"class":55},[34,2485,2486],{"class":147}," },\n",[34,2488,2489,2491],{"class":36,"line":100},[34,2490,296],{"class":147},[34,2492,299],{"class":47},[34,2494,2495,2497],{"class":36,"line":278},[34,2496,345],{"class":47},[34,2498,148],{"class":147},[24,2500,2502],{"className":126,"code":2501,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress \u003C15.10, przestarzałe w nowszych wersjach)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  env: {\n    pluginVisualRegressionUpdateImages: true,\n    pluginVisualRegressionDiffConfig: { threshold: 0.01 },\n  },\n});\n",[31,2503,2504,2509,2521,2525,2535,2540,2548,2556,2562],{"__ignoreMap":29},[34,2505,2506],{"class":36,"line":37},[34,2507,2508],{"class":40},"\u002F\u002F cypress.config.ts (Cypress \u003C15.10, przestarzałe w nowszych wersjach)\n",[34,2510,2511,2513,2515,2517,2519],{"class":36,"line":44},[34,2512,141],{"class":140},[34,2514,200],{"class":147},[34,2516,203],{"class":140},[34,2518,206],{"class":51},[34,2520,148],{"class":147},[34,2522,2523],{"class":36,"line":62},[34,2524,66],{"emptyLinePlaceholder":65},[34,2526,2527,2529,2531,2533],{"class":36,"line":69},[34,2528,237],{"class":140},[34,2530,240],{"class":140},[34,2532,243],{"class":162},[34,2534,246],{"class":47},[34,2536,2537],{"class":36,"line":75},[34,2538,2539],{"class":147},"  env: {\n",[34,2541,2542,2544,2546],{"class":36,"line":89},[34,2543,2472],{"class":147},[34,2545,2081],{"class":55},[34,2547,299],{"class":147},[34,2549,2550,2552,2554],{"class":36,"line":94},[34,2551,2481],{"class":147},[34,2553,2023],{"class":55},[34,2555,2486],{"class":147},[34,2557,2558,2560],{"class":36,"line":100},[34,2559,296],{"class":147},[34,2561,299],{"class":47},[34,2563,2564,2566],{"class":36,"line":278},[34,2565,345],{"class":47},[34,2567,148],{"class":147},[20,2569,2570,2571,356],{},"Więcej sposobów ustawiania zmiennych expose ",[352,2572,2574],{"href":2352,"rel":2573},[424],"znajdziesz tutaj",[10,2576,2578],{"id":2577},"per-platform-baselines","Osobne baseline'y dla każdej platformy",[20,2580,2581,2582,2584],{},"Chrome zostawia rasteryzację tekstu systemowi operacyjnemu, więc ta sama strona nigdy nie renderuje się bajt w bajt identycznie na macOS, Linuksie i Windowsie, a do tego przeglądarki różnią się jeszcze między sobą. Baseline nagrany na Macu developera rzadko więc pasuje do zrzutu ekranu tej samej strony zrobionego przez linuksowy job CI. ",[31,2583,1629],{}," rozumie trzy tokeny, które trzymają baseline'y różnych platform osobno, zamiast pozwalać im się wzajemnie nadpisywać:",[1269,2586,2587,2597],{},[1272,2588,2589],{},[1275,2590,2591,2594],{},[1278,2592,2593],{},"token",[1278,2595,2596],{},"rozwija się do",[1297,2598,2599,2619,2650],{},[1275,2600,2601,2606],{},[1302,2602,2603],{},[31,2604,2605],{},"{os}",[1302,2607,2608,2611,2612,269,2614,2616,2617],{},[31,2609,2610],{},"Cypress.platform",": ",[31,2613,1467],{},[31,2615,1470],{}," albo ",[31,2618,1473],{},[1275,2620,2621,2626],{},[1302,2622,2623],{},[31,2624,2625],{},"{browser}",[1302,2627,2628,2631,2632,2635,2636,2639,2640,269,2643,269,2646,2649],{},[31,2629,2630],{},"Cypress.browser.name",", czyli przeglądarka, w której Cypress uruchamia spec: ",[31,2633,2634],{},"electron",", o ile nie przekażesz ",[31,2637,2638],{},"--browser",", w przeciwnym razie ",[31,2641,2642],{},"chrome",[31,2644,2645],{},"firefox",[31,2647,2648],{},"edge",", ...",[1275,2651,2652,2657],{},[1302,2653,2654],{},[31,2655,2656],{},"{platform}",[1302,2658,2659,2662,2663,269,2666],{},[31,2660,2661],{},"{os}-{browser}",", np. ",[31,2664,2665],{},"linux-chrome",[31,2667,2668],{},"darwin-electron",[20,2670,2671,2672,2674,2675,2678,2679,2681,2682,2684,2685,2688,2689,356],{},"Każdy zrzut ekranu robi przeglądarka sterowana przez Cypressa, więc ",[31,2673,2625],{}," to właśnie ta przeglądarka; ",[31,2676,2677],{},"cypress run"," bez ",[31,2680,2638],{}," używa Electrona, dlatego katalog nazywa się ",[31,2683,2668],{},", a nie ",[31,2686,2687],{},"darwin-chrome",", chyba że CI przekaże ",[31,2690,2691],{},"--browser chrome",[20,2693,2694,2695,2697,2698,2701,2702,2705],{},"Tokeny są opcjonalne: domyślny ",[31,2696,1629],{}," to nadal ",[31,2699,2700],{},"{spec_path}\u002F__image_snapshots__",", czyli jeden zestaw baseline'ów dla wszystkich. To właściwy układ, gdy każde uruchomienie odbywa się na tym samym systemie i w tej samej przeglądarce (na przykład w kontenerze, zobacz FAQ) albo gdy pozostałe różnice mieszczą się w twoim ",[31,2703,2704],{},"maxDiffThreshold",". Żeby podzielić baseline'y według platformy, dodaj token globalnie:",[24,2707,2709],{"className":26,"code":2708,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{platform}\"\n# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\nnpx cypress run --env \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{platform}\"\n",[31,2710,2711,2715,2728,2732],{"__ignoreMap":29},[34,2712,2713],{"class":36,"line":37},[34,2714,443],{"class":40},[34,2716,2717,2719,2721,2723,2725],{"class":36,"line":44},[34,2718,448],{"class":47},[34,2720,451],{"class":51},[34,2722,454],{"class":51},[34,2724,457],{"class":55},[34,2726,2727],{"class":51}," \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{platform}\"\n",[34,2729,2730],{"class":36,"line":62},[34,2731,465],{"class":40},[34,2733,2734,2736,2738,2740,2742],{"class":36,"line":69},[34,2735,448],{"class":47},[34,2737,451],{"class":51},[34,2739,454],{"class":51},[34,2741,476],{"class":55},[34,2743,2727],{"class":51},[24,2745,2747],{"className":126,"code":2746,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress 15.10+; na Cypress \u003C15.10 użyj `env` zamiast `expose`)\nexport default defineConfig({\n  expose: {\n    pluginVisualRegressionImagesPath:\n      '{spec_path}\u002F__image_snapshots__\u002F{platform}',\n  },\n});\n",[31,2748,2749,2754,2764,2768,2773,2780,2786],{"__ignoreMap":29},[34,2750,2751],{"class":36,"line":37},[34,2752,2753],{"class":40},"\u002F\u002F cypress.config.ts (Cypress 15.10+; na Cypress \u003C15.10 użyj `env` zamiast `expose`)\n",[34,2755,2756,2758,2760,2762],{"class":36,"line":44},[34,2757,237],{"class":140},[34,2759,240],{"class":140},[34,2761,243],{"class":162},[34,2763,246],{"class":47},[34,2765,2766],{"class":36,"line":62},[34,2767,2467],{"class":147},[34,2769,2770],{"class":36,"line":69},[34,2771,2772],{"class":147},"    pluginVisualRegressionImagesPath:\n",[34,2774,2775,2778],{"class":36,"line":75},[34,2776,2777],{"class":51},"      '{spec_path}\u002F__image_snapshots__\u002F{platform}'",[34,2779,299],{"class":147},[34,2781,2782,2784],{"class":36,"line":89},[34,2783,296],{"class":147},[34,2785,299],{"class":47},[34,2787,2788,2790],{"class":36,"line":94},[34,2789,345],{"class":47},[34,2791,148],{"class":147},[24,2793,2798],{"className":2794,"code":2796,"language":2797},[2795],"language-text","cypress\u002Fe2e\u002F__image_snapshots__\u002F\n├── darwin-electron\u002F   # to, co `cypress open` zapisuje na Macu\n│   └── home page renders_#0.png\n└── linux-chrome\u002F      # to, co zapisuje twój job CI\n    └── home page renders_#0.png\n","text",[31,2799,2796],{"__ignoreMap":29},[20,2801,2802],{},"Co trzeba ustalić po podziale:",[114,2804,2805,2842,2856],{},[117,2806,2807,2811,2812,2834,2837,2838,384],{},[2808,2809,2810],"strong",{},"Które baseline'y commitować."," Większość zespołów commituje tylko platformę CI, a lokalne baseline'y trzyma poza gitem, dzięki czemu każdy developer ma własny zestaw bez zaśmiecania repozytorium:",[24,2813,2817],{"className":2814,"code":2815,"language":2816,"meta":29,"style":29},"language-gitignore shiki shiki-themes github-light-high-contrast github-dark-high-contrast","# ignoruj wszystkie katalogi platform poza tym, który produkuje CI\n**\u002F__image_snapshots__\u002F*\u002F\n!**\u002F__image_snapshots__\u002Flinux-chrome\u002F\n","gitignore",[31,2818,2819,2824,2829],{"__ignoreMap":29},[34,2820,2821],{"class":36,"line":37},[34,2822,2823],{},"# ignoruj wszystkie katalogi platform poza tym, który produkuje CI\n",[34,2825,2826],{"class":36,"line":44},[34,2827,2828],{},"**\u002F__image_snapshots__\u002F*\u002F\n",[34,2830,2831],{"class":36,"line":62},[34,2832,2833],{},"!**\u002F__image_snapshots__\u002Flinux-chrome\u002F\n",[2835,2836],"br",{},"Nowe baseline'y CI trzeba wtedy wygenerować na CI i stamtąd je zacommitować (albo zatwierdzić z poziomu PR-a, zobacz ",[352,2839,2841],{"href":2840},"#run-manifest-ci-integration","Manifest uruchomienia",[117,2843,2844,2847,2848,2850,2851,2662,2853,356],{},[2808,2845,2846],{},"Podział tylko według przeglądarki albo tylko według systemu."," Użyj samego ",[31,2849,2625],{}," albo samego ",[31,2852,2605],{},[31,2854,2855],{},"{spec_path}\u002F__image_snapshots__\u002F{browser}",[117,2857,2858,2861,2862,2865,2866,2868,2869,2872,2873,356],{},[2808,2859,2860],{},"Czyszczenie usuwa baseline'y pozostałych platform."," ",[31,2863,2864],{},"pluginVisualRegressionCleanupUnusedImages"," przeszukuje cały projekt w poszukiwaniu PNG-ów stworzonych przez plugin i nic nie wie o platformach: uruchomienie na ",[31,2867,2668],{}," traktuje każdy plik w ",[31,2870,2871],{},"linux-chrome\u002F"," jako nieużywany i go usuwa. Trzymaj tę opcję wyłączoną na maszynach, które mają katalogi więcej niż jednej platformy (checkout developera z zacommitowanymi baseline'ami CI to dokładnie taki przypadek), a włączaj ją tylko tam, gdzie leżą baseline'y jednej platformy, zwykle w jobie CI, który je produkuje. Jeśli jednak coś zostanie usunięte, skasowane katalogi wrócą po ",[31,2874,2875],{},"git checkout -- \u003Cfolder>",[20,2877,2878,2879,2884,2885,2887,2888,2890,2891,2893,2894,2896],{},"Dokąd to zmierza: plan dla ",[352,2880,2883],{"href":2881,"rel":2882},"https:\u002F\u002Fgithub.com\u002FFRSOURCE\u002Fcypress-plugin-visual-regression-diff\u002Fissues\u002F212",[424],"#212"," to renderer, który produkuje piksele w przypiętym obrazie Dockera niezależnie od tego, gdzie działa Cypress, więc obrazy lokalne i z CI przestają się rozjeżdżać z samej konstrukcji. ",[31,2886,2625],{}," nazywa wtedy przeglądarkę renderera, a nie tę sterowaną przez Cypressa, a ",[31,2889,2656],{}," nadal przydaje się do trzymania osobno kilku renderowanych przeglądarek, a nie do różnic lokalne-vs-CI. Manifest już zapisuje obie strony: ",[31,2892,1458],{}," to miejsce, gdzie uruchomiono test, ",[31,2895,1742],{}," to miejsce, skąd pochodzą piksele.",[10,2898,2900],{"id":2899},"batch-review-mode","Tryb Batch Review",[20,2902,2903,2904,2907],{},"Tryb Batch Review jest ",[2808,2905,2906],{},"domyślnie włączony",". Pozwala uruchomić cały zestaw testów bez zatrzymywania się na pierwszym nieudanym porównaniu wizualnym. Zamiast tego wszystkie nieudane snapshoty są zbierane i po zakończeniu testów prezentowane w interaktywnym UI do przeglądu, dzięki czemu zmiany możesz zatwierdzać lub pomijać hurtowo.",[15,2909,2911],{"id":2910},"additions-in-headed-mode-non-ci-environments","Dodatki w trybie headed (środowiska poza CI)",[20,2913,2914],{},"W prawym dolnym rogu runnera Cypress pojawia się pływający przycisk akcji (FAB). W trakcie działania testów:",[114,2916,2917,2924,2927],{},[117,2918,2919,2920,2923],{},"Za każdym razem, gdy wywołanie ",[31,2921,2922],{},"matchImage()"," przekroczy próg diffa, licznik na FAB-ie się zwiększa, zamiast od razu rzucać błąd.",[117,2925,2926],{},"Gdy wszystkie testy się skończą, rzucany jest błąd z łączną liczbą niepowodzeń.",[117,2928,2929,2930,2933,2934,2937],{},"Kliknięcie FAB-a otwiera karuzelę, w której przejrzysz każdy nieudany snapshot obok siebie (nowy vs. stary) i albo ",[2808,2931,2932],{},"zastąpisz"," baseline, albo ",[2808,2935,2936],{},"pominiesz"," zmianę.",[20,2939,2940],{},[2941,2942],"img",{"alt":2943,"src":2944},"Demo Trybu Batch Review","https:\u002F\u002Fraw.githubusercontent.com\u002Fpixsame\u002Fpixsame\u002Fmain\u002Fassets\u002Fbatch-review-mode.gif",[2946,2947,2948],"blockquote",{},[20,2949,2950,2951,2954,2955,2960],{},"Uwaga: przed wersją 2 pakietu ",[31,2952,2953],{},"@pixsame\u002Fcypress-plugin-visual-regression-diff"," tryb Batch Review był opt-in. Zobacz ",[352,2956,2959],{"href":2957,"rel":2958},"https:\u002F\u002Fgithub.com\u002Fpixsame\u002Fpixsame\u002Fblob\u002Fmain\u002Fpackages\u002Fcypress-plugin-visual-regression-diff\u002FMIGRATION.md#4x---5x",[424],"przewodnik migracji",", jeśli aktualizujesz z 4.x.",[15,2962,2964],{"id":2963},"how-to-disable","Jak wyłączyć",[20,2966,2967,2968,2970,2971,2973,2974,2977,2978,1957],{},"Tryb Batch Review to opcja globalna (nie da się jej przekazać bezpośrednio do ",[31,2969,387],{},"). Żeby wrócić do natychmiastowego oblewania ",[31,2972,2922],{}," przy pierwszej różnicy, ustaw klucz ",[31,2975,2976],{},"pluginVisualRegressionBatchReviewMode"," na ",[31,2979,1887],{},[24,2981,2983],{"className":26,"code":2982,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress open --expose \"pluginVisualRegressionBatchReviewMode=false\"\n# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\nnpx cypress open --env \"pluginVisualRegressionBatchReviewMode=false\"\n",[31,2984,2985,2989,3003,3007],{"__ignoreMap":29},[34,2986,2987],{"class":36,"line":37},[34,2988,443],{"class":40},[34,2990,2991,2993,2995,2998,3000],{"class":36,"line":44},[34,2992,448],{"class":47},[34,2994,451],{"class":51},[34,2996,2997],{"class":51}," open",[34,2999,457],{"class":55},[34,3001,3002],{"class":51}," \"pluginVisualRegressionBatchReviewMode=false\"\n",[34,3004,3005],{"class":36,"line":62},[34,3006,465],{"class":40},[34,3008,3009,3011,3013,3015,3017],{"class":36,"line":69},[34,3010,448],{"class":47},[34,3012,451],{"class":51},[34,3014,2997],{"class":51},[34,3016,476],{"class":55},[34,3018,3002],{"class":51},[24,3020,3022],{"className":126,"code":3021,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress 15.10+)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  expose: {\n    pluginVisualRegressionBatchReviewMode: false,\n  },\n});\n",[31,3023,3024,3028,3040,3044,3054,3058,3067,3073],{"__ignoreMap":29},[34,3025,3026],{"class":36,"line":37},[34,3027,2436],{"class":40},[34,3029,3030,3032,3034,3036,3038],{"class":36,"line":44},[34,3031,141],{"class":140},[34,3033,200],{"class":147},[34,3035,203],{"class":140},[34,3037,206],{"class":51},[34,3039,148],{"class":147},[34,3041,3042],{"class":36,"line":62},[34,3043,66],{"emptyLinePlaceholder":65},[34,3045,3046,3048,3050,3052],{"class":36,"line":69},[34,3047,237],{"class":140},[34,3049,240],{"class":140},[34,3051,243],{"class":162},[34,3053,246],{"class":47},[34,3055,3056],{"class":36,"line":75},[34,3057,2467],{"class":147},[34,3059,3060,3063,3065],{"class":36,"line":89},[34,3061,3062],{"class":147},"    pluginVisualRegressionBatchReviewMode: ",[34,3064,1887],{"class":55},[34,3066,299],{"class":147},[34,3068,3069,3071],{"class":36,"line":94},[34,3070,296],{"class":147},[34,3072,299],{"class":47},[34,3074,3075,3077],{"class":36,"line":100},[34,3076,345],{"class":47},[34,3078,148],{"class":147},[24,3080,3082],{"className":126,"code":3081,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress \u003C15.10, przestarzałe w nowszych wersjach)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  env: {\n    pluginVisualRegressionBatchReviewMode: false,\n  },\n});\n",[31,3083,3084,3088,3100,3104,3114,3118,3126,3132],{"__ignoreMap":29},[34,3085,3086],{"class":36,"line":37},[34,3087,2508],{"class":40},[34,3089,3090,3092,3094,3096,3098],{"class":36,"line":44},[34,3091,141],{"class":140},[34,3093,200],{"class":147},[34,3095,203],{"class":140},[34,3097,206],{"class":51},[34,3099,148],{"class":147},[34,3101,3102],{"class":36,"line":62},[34,3103,66],{"emptyLinePlaceholder":65},[34,3105,3106,3108,3110,3112],{"class":36,"line":69},[34,3107,237],{"class":140},[34,3109,240],{"class":140},[34,3111,243],{"class":162},[34,3113,246],{"class":47},[34,3115,3116],{"class":36,"line":75},[34,3117,2539],{"class":147},[34,3119,3120,3122,3124],{"class":36,"line":89},[34,3121,3062],{"class":147},[34,3123,1887],{"class":55},[34,3125,299],{"class":147},[34,3127,3128,3130],{"class":36,"line":94},[34,3129,296],{"class":147},[34,3131,299],{"class":47},[34,3133,3134,3136],{"class":36,"line":100},[34,3135,345],{"class":47},[34,3137,148],{"class":147},[15,3139,3141],{"id":3140},"reviewing-passing-images","Przeglądanie obrazów, które przeszły",[20,3143,3144,3145,3147,3148,3151,3152,3154],{},"Obrazy, które różnią się od baseline'u, ale mieszczą się w ",[31,3146,2704],{},", nie oblewają testu, a mimo to są zbierane. Karuzela ma checkbox ",[2808,3149,3150],{},"Show passing",", który pozwala je przejrzeć (każdy ma odznakę ",[31,3153,1306],{},") i również zastąpić ich baseline, np. żeby pozbyć się drobnego, nawarstwiającego się dryfu.",[20,3156,3157,3158,3161],{},"Checkbox jest domyślnie odznaczony. Użyj klucza ",[31,3159,3160],{},"pluginVisualRegressionBatchReviewModeShowPassingImages",", żeby był domyślnie zaznaczony:",[24,3163,3165],{"className":26,"code":3164,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress open --expose \"pluginVisualRegressionBatchReviewModeShowPassingImages=true\"\n# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\nnpx cypress open --env \"pluginVisualRegressionBatchReviewModeShowPassingImages=true\"\n",[31,3166,3167,3171,3184,3188],{"__ignoreMap":29},[34,3168,3169],{"class":36,"line":37},[34,3170,443],{"class":40},[34,3172,3173,3175,3177,3179,3181],{"class":36,"line":44},[34,3174,448],{"class":47},[34,3176,451],{"class":51},[34,3178,2997],{"class":51},[34,3180,457],{"class":55},[34,3182,3183],{"class":51}," \"pluginVisualRegressionBatchReviewModeShowPassingImages=true\"\n",[34,3185,3186],{"class":36,"line":62},[34,3187,465],{"class":40},[34,3189,3190,3192,3194,3196,3198],{"class":36,"line":69},[34,3191,448],{"class":47},[34,3193,451],{"class":51},[34,3195,2997],{"class":51},[34,3197,476],{"class":55},[34,3199,3183],{"class":51},[24,3201,3203],{"className":126,"code":3202,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress 15.10+)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  expose: {\n    pluginVisualRegressionBatchReviewModeShowPassingImages: true,\n  },\n});\n",[31,3204,3205,3209,3221,3225,3235,3239,3248,3254],{"__ignoreMap":29},[34,3206,3207],{"class":36,"line":37},[34,3208,2436],{"class":40},[34,3210,3211,3213,3215,3217,3219],{"class":36,"line":44},[34,3212,141],{"class":140},[34,3214,200],{"class":147},[34,3216,203],{"class":140},[34,3218,206],{"class":51},[34,3220,148],{"class":147},[34,3222,3223],{"class":36,"line":62},[34,3224,66],{"emptyLinePlaceholder":65},[34,3226,3227,3229,3231,3233],{"class":36,"line":69},[34,3228,237],{"class":140},[34,3230,240],{"class":140},[34,3232,243],{"class":162},[34,3234,246],{"class":47},[34,3236,3237],{"class":36,"line":75},[34,3238,2467],{"class":147},[34,3240,3241,3244,3246],{"class":36,"line":89},[34,3242,3243],{"class":147},"    pluginVisualRegressionBatchReviewModeShowPassingImages: ",[34,3245,2081],{"class":55},[34,3247,299],{"class":147},[34,3249,3250,3252],{"class":36,"line":94},[34,3251,296],{"class":147},[34,3253,299],{"class":47},[34,3255,3256,3258],{"class":36,"line":100},[34,3257,345],{"class":47},[34,3259,148],{"class":147},[20,3261,3262],{},"Przełączenie checkboxa w runnerze jest zapamiętywane w local storage przeglądarki i przy kolejnych uruchomieniach ma pierwszeństwo przed wartością z konfiguracji.",[10,3264,3266],{"id":3265},"reducing-cross-os-rendering-noise","Reducing cross-OS rendering noise",[20,3268,3269,3270,3273],{},"Przeglądarki oddają rasteryzację tekstu systemowi operacyjnemu (CoreText na macOS, DirectWrite na Windows, FreeType na Linuksie), więc ta sama strona nigdy nie wyrenderuje się bajt w bajt identycznie na laptopie developera i na linuksowym runnerze CI. Plugin nie jest w stanie całkowicie tego wyeliminować, ale preset ",[31,3271,3272],{},"deterministicRendering"," (domyślnie włączony) usuwa tę część szumu, która leży po stronie samej przeglądarki:",[114,3275,3276,3296,3306,3319],{},[117,3277,3278,3281,3282,3285,3286,3289,3290,1529,3293,356],{},[2808,3279,3280],{},"Chrome, Chromium, Edge"," są uruchamiane z ",[31,3283,3284],{},"--font-render-hinting=none --disable-font-subpixel-positioning --disable-lcd-text --force-color-profile=srgb --disable-gpu"," (tekst bez hintingu systemowego i sztuczek subpikselowych, bez zarządzania kolorem, rasteryzacja na CPU), a w trybie headless dodatkowo ",[31,3287,3288],{},"--hide-scrollbars",". Lista jest eksportowana jako ",[31,3291,3292],{},"DETERMINISTIC_RENDERING_CHROMIUM_ARGS",[31,3294,3295],{},"@pixsame\u002Fcypress-plugin-visual-regression-diff\u002Fconstants",[117,3297,3298,3301,3302,3305],{},[2808,3299,3300],{},"Firefox"," dostaje preferencję ",[31,3303,3304],{},"gfx.webrender.software"," (renderowanie na CPU). Firefox nie ma międzyplatformowego przełącznika hintingu fontów, więc tekst może nadal różnić się między systemami operacyjnymi.",[117,3307,3308,3311,3312,3314,3315,3318],{},[2808,3309,3310],{},"Każda przeglądarka",": na czas zrzutu ekranu z ",[31,3313,387],{}," do testowanej strony wstrzykiwany jest element ",[31,3316,3317],{},"\u003Cstyle>",", który ukrywa kursor tekstowy, wyłącza przejścia CSS, animacje i płynne przewijanie oraz ukrywa paski przewijania. Zaraz po zrzucie jest usuwany.",[117,3320,3321,3322,1529,3325,3328],{},"Porównanie uruchamia ",[31,3323,3324],{},"pixelmatch",[31,3326,3327],{},"includeAA: false",", więc piksele krawędzi z anti-aliasingiem są wykrywane i nie są liczone jako różnice.",[20,3330,3331,3332,492,3335,3337],{},"Czego preset nie rozwiązuje: różnych plików fontów i fallbacków na poszczególnych systemach (klasyczny przypadek Arial vs. Liberation Sans), fontów emoji, rasteryzacji tekstu w WebKit i Firefoxie oraz obrazów rysowanych przez WebGL. W takich przypadkach trzymaj osobny baseline dla każdej platformy (zobacz opcje ",[31,3333,3334],{},"title",[31,3336,1629],{}," oraz wpis w FAQ o nazwach przeglądarek) albo generuj baseline'y w tym samym środowisku, w którym działa twoje CI.",[20,3339,3340,3343],{},[2808,3341,3342],{},"Electron"," ignoruje przełączniki ustawiane przez pluginy. Przekaż je zamiast tego przez zmienną środowiskową:",[24,3345,3347],{"className":26,"code":3346,"language":28,"meta":29,"style":29},"ELECTRON_EXTRA_LAUNCH_ARGS=\"--font-render-hinting=none --disable-font-subpixel-positioning --disable-lcd-text --force-color-profile=srgb --disable-gpu --hide-scrollbars\" npx cypress run\n",[31,3348,3349],{"__ignoreMap":29},[34,3350,3351,3354,3357,3360,3363,3365],{"class":36,"line":37},[34,3352,3353],{"class":147},"ELECTRON_EXTRA_LAUNCH_ARGS",[34,3355,3356],{"class":140},"=",[34,3358,3359],{"class":51},"\"--font-render-hinting=none --disable-font-subpixel-positioning --disable-lcd-text --force-color-profile=srgb --disable-gpu --hide-scrollbars\"",[34,3361,3362],{"class":47}," npx",[34,3364,451],{"class":51},[34,3366,3367],{"class":51}," run\n",[20,3369,3370,2611,3373,3376,3377,3380,3381,3384,3385,3388,3389,356],{},[2808,3371,3372],{},"WebGL",[31,3374,3375],{},"--disable-gpu"," może sprawić, że strony zależne od WebGL zostaną bez kontekstu renderowania. Albo wyłącz preset, albo dodaj ",[31,3378,3379],{},"--use-gl=angle --use-angle=swiftshader"," (nowsze Chrome wymaga też ",[31,3382,3383],{},"--enable-unsafe-swiftshader",") we własnym handlerze ",[31,3386,3387],{},"before:browser:launch",", połączonym z handlerem pluginu przez ",[352,3390,3393],{"href":3391,"rel":3392},"https:\u002F\u002Fgithub.com\u002Fbahmutov\u002Fcypress-on-fix",[424],[31,3394,3395],{},"cypress-on-fix",[20,3397,3398,3401,3402,492,3405,3408,3409,3412,3413,3416],{},[2808,3399,3400],{},"Hooki zrzutów ekranu",": plugin przekazuje własne ",[31,3403,3404],{},"onBeforeScreenshot",[31,3406,3407],{},"onAfterScreenshot"," do każdego zrzutu, który robi. Hooki podane przez ",[31,3410,3411],{},"screenshotConfig"," są nadal wywoływane, a hooki ustawione globalnie przez ",[31,3414,3415],{},"Cypress.Screenshot.defaults()"," nie.",[20,3418,3419],{},"Żeby wyłączyć preset globalnie (przełączniki przeglądarki i CSS):",[24,3421,3423],{"className":26,"code":3422,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionDeterministicRendering=false\"\n# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\nnpx cypress run --env \"pluginVisualRegressionDeterministicRendering=false\"\n",[31,3424,3425,3429,3442,3446],{"__ignoreMap":29},[34,3426,3427],{"class":36,"line":37},[34,3428,443],{"class":40},[34,3430,3431,3433,3435,3437,3439],{"class":36,"line":44},[34,3432,448],{"class":47},[34,3434,451],{"class":51},[34,3436,454],{"class":51},[34,3438,457],{"class":55},[34,3440,3441],{"class":51}," \"pluginVisualRegressionDeterministicRendering=false\"\n",[34,3443,3444],{"class":36,"line":62},[34,3445,465],{"class":40},[34,3447,3448,3450,3452,3454,3456],{"class":36,"line":69},[34,3449,448],{"class":47},[34,3451,451],{"class":51},[34,3453,454],{"class":51},[34,3455,476],{"class":55},[34,3457,3441],{"class":51},[24,3459,3461],{"className":126,"code":3460,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress 15.10+)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  expose: {\n    pluginVisualRegressionDeterministicRendering: false,\n  },\n});\n",[31,3462,3463,3467,3479,3483,3493,3497,3506,3512],{"__ignoreMap":29},[34,3464,3465],{"class":36,"line":37},[34,3466,2436],{"class":40},[34,3468,3469,3471,3473,3475,3477],{"class":36,"line":44},[34,3470,141],{"class":140},[34,3472,200],{"class":147},[34,3474,203],{"class":140},[34,3476,206],{"class":51},[34,3478,148],{"class":147},[34,3480,3481],{"class":36,"line":62},[34,3482,66],{"emptyLinePlaceholder":65},[34,3484,3485,3487,3489,3491],{"class":36,"line":69},[34,3486,237],{"class":140},[34,3488,240],{"class":140},[34,3490,243],{"class":162},[34,3492,246],{"class":47},[34,3494,3495],{"class":36,"line":75},[34,3496,2467],{"class":147},[34,3498,3499,3502,3504],{"class":36,"line":89},[34,3500,3501],{"class":147},"    pluginVisualRegressionDeterministicRendering: ",[34,3503,1887],{"class":55},[34,3505,299],{"class":147},[34,3507,3508,3510],{"class":36,"line":94},[34,3509,296],{"class":147},[34,3511,299],{"class":47},[34,3513,3514,3516],{"class":36,"line":100},[34,3515,345],{"class":47},[34,3517,148],{"class":147},[20,3519,3520],{},"Żeby zachować przełączniki przeglądarki, ale pominąć CSS dla pojedynczego zrzutu (np. gdy chcesz złapać stan końcowy animacji):",[24,3522,3524],{"className":126,"code":3523,"language":128,"meta":29,"style":29},"cy.matchImage({ deterministicRendering: false });\n",[31,3525,3526],{"__ignoreMap":29},[34,3527,3528,3530,3532,3535,3537],{"class":36,"line":37},[34,3529,373],{"class":147},[34,3531,387],{"class":162},[34,3533,3534],{"class":147},"({ deterministicRendering: ",[34,3536,1887],{"class":55},[34,3538,3539],{"class":147}," });\n",[10,3541,3543],{"id":3542},"faq","FAQ",[15,3545,3547,3548,3550],{"id":3546},"why-screenshots-doesnt-conform-to-the-viewport-set-in-my-cypress-configuration","Dlaczego zrzuty ekranu nie trzymają się ",[31,3549,1721],{}," ustawionego w mojej konfiguracji Cypress?",[20,3552,3553],{},"Zrzuty ekranu w Cypress domyślnie nie skalują się do rozmiaru viewportu. Możesz to zmienić:",[114,3555,3556,3562],{},[117,3557,3558,3559],{},"globalnie, zmieniając domyślną konfigurację zrzutów ekranu: ",[31,3560,3561],{},"Cypress.Screenshot.defaults({ capture: 'viewport' });",[117,3563,3564,3565,2611,3568],{},"lokalnie, przekazując konfigurację zrzutu ekranu bezpośrednio do komendy ",[31,3566,3567],{},".matchImage",[31,3569,3570],{},"cy.matchImage({ screenshotConfig: { capture: 'viewport' } });",[15,3572,3574],{"id":3573},"ive-upgraded-version-of-this-plugin-and-all-on-my-baseline-images-has-been-automatically-updated-why","Zaktualizowałem wersję pluginu i wszystkie moje obrazy baseline zostały automatycznie podmienione. Dlaczego?",[20,3576,3577],{},"Czasem musimy wprowadzić zmianę łamiącą kompatybilność w algorytmach porównywania lub generowania obrazów. Żeby aktualizacja była dla ciebie jak najprostsza, plugin sam aktualizuje twoje baseline'y. Po aktualizacji pluginu po prostu zacommituj je do repozytorium i gotowe!",[15,3579,3581,3582,492,3584,3587],{"id":3580},"screenshots-look-different-between-cypress-run-and-cypress-open-how-do-i-fix-it","Zrzuty ekranu wyglądają inaczej w ",[31,3583,2677],{},[31,3585,3586],{},"cypress open",". Jak to naprawić?",[20,3589,3590,3591,3594,3595,1957],{},"Zwykle wynika to z różnic w device pixel ratio między trybem headless a headed. Użyj opcji ",[31,3592,3593],{},"forceDeviceScaleFactor",", żeby znormalizować współczynnik skalowania do ",[31,3596,3597],{},"1",[24,3599,3601],{"className":126,"code":3600,"language":128,"meta":29,"style":29},"cy.matchImage({ forceDeviceScaleFactor: true });\n",[31,3602,3603],{"__ignoreMap":29},[34,3604,3605,3607,3609,3612,3614],{"class":36,"line":37},[34,3606,373],{"class":147},[34,3608,387],{"class":162},[34,3610,3611],{"class":147},"({ forceDeviceScaleFactor: ",[34,3613,2081],{"class":55},[34,3615,3539],{"class":147},[20,3617,3618],{},"Albo ustaw to globalnie przez zmienną expose:",[24,3620,3622],{"className":26,"code":3621,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionForceDeviceScaleFactor=true\"\n# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\nnpx cypress run --env \"pluginVisualRegressionForceDeviceScaleFactor=true\"\n",[31,3623,3624,3628,3641,3645],{"__ignoreMap":29},[34,3625,3626],{"class":36,"line":37},[34,3627,443],{"class":40},[34,3629,3630,3632,3634,3636,3638],{"class":36,"line":44},[34,3631,448],{"class":47},[34,3633,451],{"class":51},[34,3635,454],{"class":51},[34,3637,457],{"class":55},[34,3639,3640],{"class":51}," \"pluginVisualRegressionForceDeviceScaleFactor=true\"\n",[34,3642,3643],{"class":36,"line":62},[34,3644,465],{"class":40},[34,3646,3647,3649,3651,3653,3655],{"class":36,"line":69},[34,3648,448],{"class":47},[34,3650,451],{"class":51},[34,3652,454],{"class":51},[34,3654,476],{"class":55},[34,3656,3640],{"class":51},[20,3658,3659,3660,3663,3664,3666,3667,123],{},"Jeśli różnice w rozmiarze viewportu nie znikają, rozważ jawne ustawienie rozmiaru okna przeglądarki w ",[31,3661,3662],{},"setupNodeEvents"," (połącz to z własnym handlerem ",[31,3665,3387],{}," pluginu przez ",[352,3668,3670],{"href":3391,"rel":3669},[424],[31,3671,3395],{},[24,3673,3675],{"className":126,"code":3674,"language":128,"meta":29,"style":29},"on('before:browser:launch', (browser, launchOptions) => {\n  if (browser.family === 'chromium' && browser.isHeadless) {\n    launchOptions.args.push('--window-size=1280,720');\n  }\n  return launchOptions;\n});\n",[31,3676,3677,3705,3725,3740,3745,3753],{"__ignoreMap":29},[34,3678,3679,3681,3683,3686,3689,3691,3693,3696,3699,3702],{"class":36,"line":37},[34,3680,266],{"class":162},[34,3682,166],{"class":147},[34,3684,3685],{"class":51},"'before:browser:launch'",[34,3687,3688],{"class":147},", (",[34,3690,1561],{"class":47},[34,3692,269],{"class":147},[34,3694,3695],{"class":47},"launchOptions",[34,3697,3698],{"class":147},") ",[34,3700,3701],{"class":140},"=>",[34,3703,3704],{"class":147}," {\n",[34,3706,3707,3710,3713,3716,3719,3722],{"class":36,"line":44},[34,3708,3709],{"class":140},"  if",[34,3711,3712],{"class":147}," (browser.family ",[34,3714,3715],{"class":140},"===",[34,3717,3718],{"class":51}," 'chromium'",[34,3720,3721],{"class":140}," &&",[34,3723,3724],{"class":147}," browser.isHeadless) {\n",[34,3726,3727,3730,3733,3735,3738],{"class":36,"line":62},[34,3728,3729],{"class":147},"    launchOptions.args.",[34,3731,3732],{"class":162},"push",[34,3734,166],{"class":147},[34,3736,3737],{"class":51},"'--window-size=1280,720'",[34,3739,172],{"class":147},[34,3741,3742],{"class":36,"line":69},[34,3743,3744],{"class":147},"  }\n",[34,3746,3747,3750],{"class":36,"line":75},[34,3748,3749],{"class":140},"  return",[34,3751,3752],{"class":147}," launchOptions;\n",[34,3754,3755],{"class":36,"line":89},[34,3756,2344],{"class":147},[20,3758,3759,3760,356],{},"Jeśli oba uruchomienia odbywają się na różnych systemach operacyjnych (laptop z macOS vs. linuksowy runner CI), pozostałe różnice wynikają z renderowania fontów. Zobacz ",[352,3761,3266],{"href":3762},"#reducing-cross-os-rendering-noise",[15,3764,3766,3767,3769],{"id":3765},"how-do-i-use-this-plugin-alongside-other-cypress-plugins-that-also-register-setupnodeevents-events","Jak używać tego pluginu razem z innymi pluginami Cypress, które też rejestrują zdarzenia w ",[31,3768,3662],{},"?",[20,3771,3772,3773,3776,3777,1957],{},"Cypress obsługuje tylko jeden handler na zdarzenie. Jeśli kilka pluginów zarejestruje to samo zdarzenie (np. ",[31,3774,3775],{},"after:screenshot","), wywołany zostanie tylko ostatni z nich. Żeby bezpiecznie połączyć kilka pluginów, użyj ",[352,3778,3780],{"href":3391,"rel":3779},[424],[31,3781,3395],{},[24,3783,3785],{"className":126,"code":3784,"language":128,"meta":29,"style":29},"import { defineConfig } from 'cypress';\nimport { initPlugin as initVisualRegressionPlugin } from '@pixsame\u002Fcypress-plugin-visual-regression-diff\u002Fplugins';\nimport fix from 'cypress-on-fix';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(on, config) {\n      const fixedOn = fix(on);\n      initVisualRegressionPlugin(fixedOn, config);\n      \u002F\u002F tutaj zarejestruj pozostałe pluginy, używając fixedOn\n    },\n  },\n});\n",[31,3786,3787,3799,3815,3829,3833,3843,3847,3861,3878,3885,3890,3894,3900],{"__ignoreMap":29},[34,3788,3789,3791,3793,3795,3797],{"class":36,"line":37},[34,3790,141],{"class":140},[34,3792,200],{"class":147},[34,3794,203],{"class":140},[34,3796,206],{"class":51},[34,3798,148],{"class":147},[34,3800,3801,3803,3805,3807,3809,3811,3813],{"class":36,"line":44},[34,3802,141],{"class":140},[34,3804,215],{"class":147},[34,3806,218],{"class":140},[34,3808,221],{"class":147},[34,3810,203],{"class":140},[34,3812,226],{"class":51},[34,3814,148],{"class":147},[34,3816,3817,3819,3822,3824,3827],{"class":36,"line":62},[34,3818,141],{"class":140},[34,3820,3821],{"class":147}," fix ",[34,3823,203],{"class":140},[34,3825,3826],{"class":51}," 'cypress-on-fix'",[34,3828,148],{"class":147},[34,3830,3831],{"class":36,"line":69},[34,3832,66],{"emptyLinePlaceholder":65},[34,3834,3835,3837,3839,3841],{"class":36,"line":75},[34,3836,237],{"class":140},[34,3838,240],{"class":140},[34,3840,243],{"class":162},[34,3842,246],{"class":47},[34,3844,3845],{"class":36,"line":89},[34,3846,256],{"class":147},[34,3848,3849,3851,3853,3855,3857,3859],{"class":36,"line":94},[34,3850,261],{"class":162},[34,3852,166],{"class":147},[34,3854,266],{"class":47},[34,3856,269],{"class":147},[34,3858,272],{"class":47},[34,3860,275],{"class":147},[34,3862,3863,3866,3869,3872,3875],{"class":36,"line":100},[34,3864,3865],{"class":140},"      const",[34,3867,3868],{"class":55}," fixedOn",[34,3870,3871],{"class":140}," =",[34,3873,3874],{"class":162}," fix",[34,3876,3877],{"class":147},"(on);\n",[34,3879,3880,3882],{"class":36,"line":278},[34,3881,281],{"class":162},[34,3883,3884],{"class":147},"(fixedOn, config);\n",[34,3886,3887],{"class":36,"line":287},[34,3888,3889],{"class":40},"      \u002F\u002F tutaj zarejestruj pozostałe pluginy, używając fixedOn\n",[34,3891,3892],{"class":36,"line":293},[34,3893,290],{"class":147},[34,3895,3896,3898],{"class":36,"line":302},[34,3897,296],{"class":147},[34,3899,299],{"class":47},[34,3901,3902,3904],{"class":36,"line":308},[34,3903,345],{"class":47},[34,3905,148],{"class":147},[15,3907,3909],{"id":3908},"how-do-i-integrate-with-mochawesome-or-other-reporters-that-embed-screenshot-images","Jak zintegrować plugin z mochawesome lub innymi reporterami, które osadzają zrzuty ekranu?",[20,3911,3912,3913,3916,3917,3920],{},"Plugin przechowuje obrazy baseline poza domyślnym katalogiem ",[31,3914,3915],{},"cypress\u002Fscreenshots\u002F",". Niektóre reportery (np. ",[31,3918,3919],{},"cypress-mochawesome-reporter",") oczekują, że zrzuty ekranu będą właśnie w tym folderze.",[20,3922,3923,3924,3927,3928,3930,3931,1957],{},"Użyj hooka taska ",[31,3925,3926],{},"processImgPath",", żeby kontrolować, gdzie trafia plik zrzutu ekranu. Nadpisz go w ",[31,3929,3662],{}," po wywołaniu ",[31,3932,3933],{},"initPlugin",[24,3935,3937],{"className":126,"code":3936,"language":128,"meta":29,"style":29},"setupNodeEvents(on, config) {\n  initVisualRegressionPlugin(on, config);\n\n  \u002F\u002F nadpisz przetwarzanie ścieżki, żeby zrzuty ekranu pozostały dostępne dla reportera\n  on('task', {\n    'cp-visual-regression-diff-processImgPath': ({ path }: { path: string }) => {\n      \u002F\u002F zwróć nową ścieżkę albo tę samą, żeby zachować domyślne zachowanie\n      return path;\n    },\n  });\n}\n",[31,3938,3939,3946,3953,3957,3962,3975,4008,4013,4021,4025,4030],{"__ignoreMap":29},[34,3940,3941,3943],{"class":36,"line":37},[34,3942,3662],{"class":162},[34,3944,3945],{"class":147},"(on, config) {\n",[34,3947,3948,3951],{"class":36,"line":44},[34,3949,3950],{"class":162},"  initVisualRegressionPlugin",[34,3952,284],{"class":147},[34,3954,3955],{"class":36,"line":62},[34,3956,66],{"emptyLinePlaceholder":65},[34,3958,3959],{"class":36,"line":69},[34,3960,3961],{"class":40},"  \u002F\u002F nadpisz przetwarzanie ścieżki, żeby zrzuty ekranu pozostały dostępne dla reportera\n",[34,3963,3964,3967,3969,3972],{"class":36,"line":75},[34,3965,3966],{"class":162},"  on",[34,3968,166],{"class":147},[34,3970,3971],{"class":51},"'task'",[34,3973,3974],{"class":147},", {\n",[34,3976,3977,3980,3983,3986,3989,3991,3994,3996,3998,4001,4004,4006],{"class":36,"line":89},[34,3978,3979],{"class":51},"    'cp-visual-regression-diff-processImgPath'",[34,3981,3982],{"class":147},": ({ ",[34,3984,3985],{"class":47},"path",[34,3987,3988],{"class":147}," }",[34,3990,1957],{"class":140},[34,3992,3993],{"class":147}," { ",[34,3995,3985],{"class":47},[34,3997,1957],{"class":140},[34,3999,4000],{"class":55}," string",[34,4002,4003],{"class":147}," }) ",[34,4005,3701],{"class":140},[34,4007,3704],{"class":147},[34,4009,4010],{"class":36,"line":94},[34,4011,4012],{"class":40},"      \u002F\u002F zwróć nową ścieżkę albo tę samą, żeby zachować domyślne zachowanie\n",[34,4014,4015,4018],{"class":36,"line":100},[34,4016,4017],{"class":140},"      return",[34,4019,4020],{"class":147}," path;\n",[34,4022,4023],{"class":36,"line":278},[34,4024,290],{"class":147},[34,4026,4027],{"class":36,"line":287},[34,4028,4029],{"class":147},"  });\n",[34,4031,4032],{"class":36,"line":293},[34,4033,1267],{"class":147},[15,4035,4037],{"id":4036},"how-to-fail-on-any-visual-difference-no-matter-how-small","Jak oblać test przy każdej różnicy wizualnej, nawet najmniejszej?",[20,4039,4040,4041,2977,4043,1957],{},"Ustaw ",[31,4042,2704],{},[31,4044,4045],{},"0",[24,4047,4049],{"className":126,"code":4048,"language":128,"meta":29,"style":29},"cy.matchImage({ maxDiffThreshold: 0 });\n",[31,4050,4051],{"__ignoreMap":29},[34,4052,4053,4055,4057,4060,4062],{"class":36,"line":37},[34,4054,373],{"class":147},[34,4056,387],{"class":162},[34,4058,4059],{"class":147},"({ maxDiffThreshold: ",[34,4061,4045],{"class":55},[34,4063,3539],{"class":147},[20,4065,4066],{},"Albo globalnie przez zmienną expose:",[24,4068,4070],{"className":26,"code":4069,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionMaxDiffThreshold=0\"\n# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\nnpx cypress run --env \"pluginVisualRegressionMaxDiffThreshold=0\"\n",[31,4071,4072,4076,4089,4093],{"__ignoreMap":29},[34,4073,4074],{"class":36,"line":37},[34,4075,443],{"class":40},[34,4077,4078,4080,4082,4084,4086],{"class":36,"line":44},[34,4079,448],{"class":47},[34,4081,451],{"class":51},[34,4083,454],{"class":51},[34,4085,457],{"class":55},[34,4087,4088],{"class":51}," \"pluginVisualRegressionMaxDiffThreshold=0\"\n",[34,4090,4091],{"class":36,"line":62},[34,4092,465],{"class":40},[34,4094,4095,4097,4099,4101,4103],{"class":36,"line":69},[34,4096,448],{"class":47},[34,4098,451],{"class":51},[34,4100,454],{"class":51},[34,4102,476],{"class":55},[34,4104,4088],{"class":51},[15,4106,4108],{"id":4107},"why-is-the-actual-screenshot-deleted-after-a-successful-image-comparison","Dlaczego aktualny zrzut ekranu jest usuwany po udanym porównaniu obrazów?",[20,4110,4111,4112,4114],{},"Gdy obrazy się zgadzają, plik ",[31,4113,491],{}," jest tymczasowy i po porównaniu jest sprzątany. Zostaje tylko obraz baseline (bez sufiksu). Dzięki temu nie trzymamy zbędnych plików.",[20,4116,4117,4118,4120],{},"Gdy obrazy się nie zgadzają, plik ",[31,4119,491],{}," zostaje i niesie te same metadane pluginu co obraz baseline. Możesz go bezpiecznie przemianować lub skopiować w miejsce baseline'u (np. w jobie CI, który otwiera pull requesta ze zaktualizowanymi baseline'ami) - plugin potraktuje go jako aktualny baseline i nie nadpisze go przy następnym uruchomieniu.",[20,4122,4123,4124,4126,4127,4129,4130],{},"Jeśli potrzebujesz, żeby aktualne zrzuty ekranu pozostały dostępne dla reportera (np. ",[31,4125,3919],{},"), użyj hooka taska ",[31,4128,3926],{},", żeby kontrolować, gdzie są zapisywane. Zobacz ",[352,4131,3909],{"href":4132},"#how-do-i-integrate-with-mochawesome-or-other-reporters-that-embed-screenshot-images",[15,4134,4136],{"id":4135},"how-to-remove-spaces-from-screenshot-filenames","Jak usunąć spacje z nazw plików zrzutów ekranu?",[20,4138,4139,4140,4142,4143,1957],{},"Nazwy plików zrzutów ekranu pochodzą od tytułów testów Cypress, które mogą zawierać spacje. Żeby użyć nazwy pliku bez spacji, przekaż własną opcję ",[31,4141,3334],{}," do każdego wywołania ",[31,4144,387],{},[24,4146,4148],{"className":126,"code":4147,"language":128,"meta":29,"style":29},"cy.matchImage({ title: 'my-screenshot-without-spaces' });\n",[31,4149,4150],{"__ignoreMap":29},[34,4151,4152,4154,4156,4159,4162],{"class":36,"line":37},[34,4153,373],{"class":147},[34,4155,387],{"class":162},[34,4157,4158],{"class":147},"({ title: ",[34,4160,4161],{"class":51},"'my-screenshot-without-spaces'",[34,4163,3539],{"class":147},[20,4165,4166,4167,4169,4170,123],{},"Żeby zastosować to globalnie dla wszystkich wywołań ",[31,4168,387],{},", nadpisz komendę w pliku support (",[31,4171,4172],{},"cypress\u002Fsupport\u002Fcommands.ts",[24,4174,4176],{"className":126,"code":4175,"language":128,"meta":29,"style":29},"Cypress.Commands.overwrite('matchImage', (originalFn, subject, options = {}) =>\n  originalFn(subject, {\n    title: Cypress.currentTest.titlePath.join(' ').replace(\u002F\\s+\u002Fg, '-'),\n    ...options,\n  }),\n);\n",[31,4177,4178,4213,4221,4260,4268,4273],{"__ignoreMap":29},[34,4179,4180,4183,4186,4188,4191,4193,4196,4198,4201,4203,4205,4207,4210],{"class":36,"line":37},[34,4181,4182],{"class":147},"Cypress.Commands.",[34,4184,4185],{"class":162},"overwrite",[34,4187,166],{"class":147},[34,4189,4190],{"class":51},"'matchImage'",[34,4192,3688],{"class":147},[34,4194,4195],{"class":47},"originalFn",[34,4197,269],{"class":147},[34,4199,4200],{"class":47},"subject",[34,4202,269],{"class":147},[34,4204,1522],{"class":47},[34,4206,3871],{"class":140},[34,4208,4209],{"class":147}," {}) ",[34,4211,4212],{"class":140},"=>\n",[34,4214,4215,4218],{"class":36,"line":44},[34,4216,4217],{"class":162},"  originalFn",[34,4219,4220],{"class":147},"(subject, {\n",[34,4222,4223,4226,4228,4230,4232,4234,4237,4239,4241,4244,4247,4249,4252,4254,4257],{"class":36,"line":62},[34,4224,4225],{"class":147},"    title: Cypress.currentTest.titlePath.",[34,4227,2288],{"class":162},[34,4229,166],{"class":147},[34,4231,2293],{"class":51},[34,4233,384],{"class":147},[34,4235,4236],{"class":162},"replace",[34,4238,166],{"class":147},[34,4240,1533],{"class":51},[34,4242,4243],{"class":55},"\\s",[34,4245,4246],{"class":140},"+",[34,4248,1533],{"class":51},[34,4250,4251],{"class":140},"g",[34,4253,269],{"class":147},[34,4255,4256],{"class":51},"'-'",[34,4258,4259],{"class":147},"),\n",[34,4261,4262,4265],{"class":36,"line":69},[34,4263,4264],{"class":140},"    ...",[34,4266,4267],{"class":147},"options,\n",[34,4269,4270],{"class":36,"line":75},[34,4271,4272],{"class":147},"  }),\n",[34,4274,4275],{"class":36,"line":89},[34,4276,172],{"class":147},[15,4278,4280],{"id":4279},"how-to-include-the-browser-name-in-image-filenames-for-cross-browser-testing","Jak dodać nazwę przeglądarki do nazw plików obrazów (testy cross-browser)?",[20,4282,4283,4284,4286,4287,4289,4290,269,4292,269,4294,4296],{},"Użyj tokenu ",[31,4285,2625],{}," w ",[31,4288,1629],{},"; rozwija się on do nazwy przeglądarki, która wyrenderowała zrzut ekranu (",[31,4291,2642],{},[31,4293,2645],{},[31,4295,2634],{},", ...):",[24,4298,4300],{"className":126,"code":4299,"language":128,"meta":29,"style":29},"cy.matchImage({ imagesPath: '{spec_path}\u002F__image_snapshots__\u002F{browser}' });\n",[31,4301,4302],{"__ignoreMap":29},[34,4303,4304,4306,4308,4311,4314],{"class":36,"line":37},[34,4305,373],{"class":147},[34,4307,387],{"class":162},[34,4309,4310],{"class":147},"({ imagesPath: ",[34,4312,4313],{"class":51},"'{spec_path}\u002F__image_snapshots__\u002F{browser}'",[34,4315,3539],{"class":147},[20,4317,4318],{},"Albo globalnie:",[24,4320,4322],{"className":26,"code":4321,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{browser}\"\n# Cypress \u003C15.10 (przestarzałe od 15.10, usunięte w 16)\nnpx cypress run --env \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{browser}\"\n",[31,4323,4324,4328,4341,4345],{"__ignoreMap":29},[34,4325,4326],{"class":36,"line":37},[34,4327,443],{"class":40},[34,4329,4330,4332,4334,4336,4338],{"class":36,"line":44},[34,4331,448],{"class":47},[34,4333,451],{"class":51},[34,4335,454],{"class":51},[34,4337,457],{"class":55},[34,4339,4340],{"class":51}," \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{browser}\"\n",[34,4342,4343],{"class":36,"line":62},[34,4344,465],{"class":40},[34,4346,4347,4349,4351,4353,4355],{"class":36,"line":69},[34,4348,448],{"class":47},[34,4350,451],{"class":51},[34,4352,454],{"class":51},[34,4354,476],{"class":55},[34,4356,4340],{"class":51},[20,4358,4359,4360,269,4363,4366,4367,4370,4371,492,4373,4375,4376,4378],{},"W ten sposób powstają osobne katalogi obrazów dla każdej przeglądarki (",[31,4361,4362],{},"__image_snapshots__\u002Fchrome\u002F",[31,4364,4365],{},"__image_snapshots__\u002Ffirefox\u002F","). W sekcji ",[352,4368,2578],{"href":4369},"#per-platform-baselines"," znajdziesz ",[31,4372,2656],{},[31,4374,2605],{},", które dzielą baseline'y także według systemu operacyjnego, informację o tym, które katalogi commitować, oraz wyjaśnienie, dlaczego ",[31,4377,2864],{}," musi pozostać wyłączone na maszynie, która ma katalogi więcej niż jednej przeglądarki (usunęłoby baseline'y pozostałych przeglądarek).",[15,4380,4382],{"id":4381},"how-to-generate-an-html-report-showing-baseline-diff-and-actual-images","Jak wygenerować raport HTML z obrazami baseline, diff i aktualnym?",[20,4384,4385],{},"Plugin ma wbudowaną nakładkę porównania wizualnego w UI Cypress: kliknięcie \"See comparison\" przy nieudanym teście pokazuje obok siebie obraz baseline, diff i aktualny.",[20,4387,4388,4389,4395,4396,356],{},"Na CI albo do raportów HTML, którymi chcesz się dzielić, zintegruj plugin z reporterem takim jak ",[352,4390,4393],{"href":4391,"rel":4392},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcypress-mochawesome-reporter",[424],[31,4394,3919],{},". Szczegóły konfiguracji znajdziesz w ",[352,4397,3909],{"href":4132},[4399,4400,4401],"style",{},"html pre.shiki code .sLBg1, html code.shiki .sLBg1{--shiki-default:#66707B;--shiki-dark:#BDC4CC}html pre.shiki code .soyes, html code.shiki .soyes{--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .sT6z2, html code.shiki .sT6z2{--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .s-5SL, html code.shiki .s-5SL{--shiki-default:#023B95;--shiki-dark:#91CBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHUrx, html code.shiki .sHUrx{--shiki-default:#A0111F;--shiki-dark:#FF9492}html pre.shiki code .suds8, html code.shiki .suds8{--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sKwhi, html code.shiki .sKwhi{--shiki-default:#622CBC;--shiki-dark:#DBB7FF}",{"title":29,"searchDepth":44,"depth":44,"links":4403},[4404,4407,4408,4409,4410,4411,4412,4413,4418,4419],{"id":12,"depth":44,"text":13,"children":4405},[4406],{"id":17,"depth":62,"text":18},{"id":359,"depth":44,"text":360},{"id":415,"depth":44,"text":416},{"id":429,"depth":44,"text":430},{"id":481,"depth":44,"text":482},{"id":1945,"depth":44,"text":1946},{"id":2577,"depth":44,"text":2578},{"id":2899,"depth":44,"text":2900,"children":4414},[4415,4416,4417],{"id":2910,"depth":62,"text":2911},{"id":2963,"depth":62,"text":2964},{"id":3140,"depth":62,"text":3141},{"id":3265,"depth":44,"text":3266},{"id":3542,"depth":44,"text":3543,"children":4420},[4421,4423,4424,4426,4428,4429,4430,4431,4432,4433],{"id":3546,"depth":62,"text":4422},"Dlaczego zrzuty ekranu nie trzymają się viewport ustawionego w mojej konfiguracji Cypress?",{"id":3573,"depth":62,"text":3574},{"id":3580,"depth":62,"text":4425},"Zrzuty ekranu wyglądają inaczej w cypress run i cypress open. Jak to naprawić?",{"id":3765,"depth":62,"text":4427},"Jak używać tego pluginu razem z innymi pluginami Cypress, które też rejestrują zdarzenia w setupNodeEvents?",{"id":3908,"depth":62,"text":3909},{"id":4036,"depth":62,"text":4037},{"id":4107,"depth":62,"text":4108},{"id":4135,"depth":62,"text":4136},{"id":4279,"depth":62,"text":4280},{"id":4381,"depth":62,"text":4382},"md",{},"\u002Freadme\u002Freadme-pl",false,{"description":29},"3f4ca9c7906dc926","readme\u002FREADME-pl","jZdeuMt7VnSoSG_n7Y-CR_baL7TytrZlaPD_FulmdMU",1794530806895]