[{"data":1,"prerenderedAt":552},["ShallowReactive",2],{"navigation_docs":3,"-manifest-merging":93,"-manifest-merging-surround":547},[4,41,46,89],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":40},"Learn","i-lucide-book-open","\u002Flearn","1.learn",[10,15,20,25,30,35],{"title":11,"path":12,"stem":13,"icon":14},"What visual regression testing is","\u002Flearn\u002Fwhat-is-visual-regression-testing","1.learn\u002F1.what-is-visual-regression-testing","i-lucide-eye",{"title":16,"path":17,"stem":18,"icon":19},"How image diffing works","\u002Flearn\u002Fhow-image-diffing-works","1.learn\u002F2.how-image-diffing-works","i-lucide-diff",{"title":21,"path":22,"stem":23,"icon":24},"Why screenshots flake","\u002Flearn\u002Fwhy-screenshots-flake","1.learn\u002F3.why-screenshots-flake","i-lucide-shuffle",{"title":26,"path":27,"stem":28,"icon":29},"Baselines and approval","\u002Flearn\u002Fbaselines-and-approval","1.learn\u002F4.baselines-and-approval","i-lucide-check-check",{"title":31,"path":32,"stem":33,"icon":34},"Running in CI","\u002Flearn\u002Frunning-in-ci","1.learn\u002F5.running-in-ci","i-lucide-workflow",{"title":36,"path":37,"stem":38,"icon":39},"Choosing a tool","\u002Flearn\u002Fchoosing-a-tool","1.learn\u002F6.choosing-a-tool","i-lucide-list-checks",false,{"title":42,"path":43,"stem":44,"icon":45},"Compare the tools","\u002Fcompare","2.compare","i-lucide-scale",{"title":47,"path":48,"stem":49,"children":50,"icon":53},"Manifest","\u002Fmanifest","3.manifest\u002F1.index",[51,54,59,64,69,74,79,84],{"title":52,"path":48,"stem":49,"icon":53},"The run manifest","i-lucide-file-json",{"title":55,"path":56,"stem":57,"icon":58},"The format","\u002Fmanifest\u002Fformat","3.manifest\u002F2.format","i-lucide-file-code",{"title":60,"path":61,"stem":62,"icon":63},"Reading manifests","\u002Fmanifest\u002Freading","3.manifest\u002F3.reading","i-lucide-book-open-check",{"title":65,"path":66,"stem":67,"icon":68},"Merging the manifests of a run","\u002Fmanifest\u002Fmerging","3.manifest\u002F4.merging","i-lucide-merge",{"title":70,"path":71,"stem":72,"icon":73},"Writing manifests","\u002Fmanifest\u002Fwriting","3.manifest\u002F5.writing","i-lucide-pencil-line",{"title":75,"path":76,"stem":77,"icon":78},"Converting to and from other formats","\u002Fmanifest\u002Fconverting","3.manifest\u002F6.converting","i-lucide-arrow-left-right",{"title":80,"path":81,"stem":82,"icon":83},"Reference","\u002Fmanifest\u002Freference","3.manifest\u002F7.reference","i-lucide-list",{"title":85,"path":86,"stem":87,"icon":88},"Schema reference","\u002Fmanifest\u002Fschema","3.manifest\u002F8.schema","i-lucide-braces",{"title":90,"path":91,"stem":92,"icon":14},"Viewer","\u002Fviewer","4.viewer",{"id":94,"title":65,"body":95,"description":540,"extension":541,"links":542,"meta":543,"navigation":544,"path":66,"seo":545,"stem":67,"__hash__":546},"docs\u002F3.manifest\u002F4.merging.md",{"type":96,"value":97,"toc":538},"minimark",[98,107,523,534],[99,100,101,102,106],"p",{},"A run usually produces several manifests. ",[103,104,105],"code",{},"mergeManifests"," concatenates them into one list keyed by screenshot name, test file, platform and renderer, with a later CI attempt winning over an earlier one, and prepares what an approval tool needs:",[108,109,114],"pre",{"className":110,"code":111,"language":112,"meta":113,"style":113},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { mergeManifests, selectEntries } from 'visual-regression-manifest';\n\nconst run = mergeManifests(\n  found.map(({ file, manifest }) => ({ manifest, label: file })),\n  { headSha: pr.head.sha, buildId: workflowRun.id, repositoryName: 'acme\u002Fapp' },\n);\n\nrun.counts; \u002F\u002F { passed: 40, failed: 2, 'missing-baseline': 1, created: 0, updated: 0, approved: 0 }\nrun.needsHuman; \u002F\u002F the failed and missing-baseline entries\nrun.warnings; \u002F\u002F manifests written for another commit\u002Frun\u002Frepository, renderer fallbacks, unapprovable project roots\nfor (const {\n  entry,\n  repoPaths,\n  keyHash,\n  unapprovableReason,\n  collidesWith,\n} of run.needsHuman) {\n  \u002F\u002F repoPaths: baseline\u002Factual\u002Fdiff relative to the repository root (`null` when they escape it)\n  \u002F\u002F keyHash: a short stable id for buttons and commands\n  \u002F\u002F collidesWith: other entries writing the same baseline file (two platforms, one path)\n}\n\n\u002F\u002F `\u002Fapprove-visuals home_#0 \"about_#0 (darwin \u002F chrome)\"`\nconst { entries, unknown } = selectEntries(run, { names: ['home_#0'] });\n","ts","",[103,115,116,158,165,184,246,302,310,315,333,348,363,376,384,392,400,408,416,435,441,447,453,459,464,470],{"__ignoreMap":113},[117,118,121,125,129,133,136,139,142,145,148,152,155],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"s7zQu","import",[117,126,128],{"class":127},"sMK4o"," {",[117,130,132],{"class":131},"sTEyZ"," mergeManifests",[117,134,135],{"class":127},",",[117,137,138],{"class":131}," selectEntries",[117,140,141],{"class":127}," }",[117,143,144],{"class":123}," from",[117,146,147],{"class":127}," '",[117,149,151],{"class":150},"sfazB","visual-regression-manifest",[117,153,154],{"class":127},"'",[117,156,157],{"class":127},";\n",[117,159,161],{"class":119,"line":160},2,[117,162,164],{"emptyLinePlaceholder":163},true,"\n",[117,166,168,172,175,178,181],{"class":119,"line":167},3,[117,169,171],{"class":170},"spNyl","const",[117,173,174],{"class":131}," run ",[117,176,177],{"class":127},"=",[117,179,132],{"class":180},"s2Zo4",[117,182,183],{"class":131},"(\n",[117,185,187,190,193,196,199,202,206,208,211,214,217,220,223,225,227,231,234,237,240,243],{"class":119,"line":186},4,[117,188,189],{"class":131},"  found",[117,191,192],{"class":127},".",[117,194,195],{"class":180},"map",[117,197,198],{"class":131},"(",[117,200,201],{"class":127},"({",[117,203,205],{"class":204},"sHdIc"," file",[117,207,135],{"class":127},[117,209,210],{"class":204}," manifest",[117,212,213],{"class":127}," })",[117,215,216],{"class":170}," =>",[117,218,219],{"class":131}," (",[117,221,222],{"class":127},"{",[117,224,210],{"class":131},[117,226,135],{"class":127},[117,228,230],{"class":229},"swJcz"," label",[117,232,233],{"class":127},":",[117,235,236],{"class":131}," file ",[117,238,239],{"class":127},"}",[117,241,242],{"class":131},"))",[117,244,245],{"class":127},",\n",[117,247,249,252,255,257,260,262,265,267,270,272,275,277,280,282,285,287,290,292,294,297,299],{"class":119,"line":248},5,[117,250,251],{"class":127},"  {",[117,253,254],{"class":229}," headSha",[117,256,233],{"class":127},[117,258,259],{"class":131}," pr",[117,261,192],{"class":127},[117,263,264],{"class":131},"head",[117,266,192],{"class":127},[117,268,269],{"class":131},"sha",[117,271,135],{"class":127},[117,273,274],{"class":229}," buildId",[117,276,233],{"class":127},[117,278,279],{"class":131}," workflowRun",[117,281,192],{"class":127},[117,283,284],{"class":131},"id",[117,286,135],{"class":127},[117,288,289],{"class":229}," repositoryName",[117,291,233],{"class":127},[117,293,147],{"class":127},[117,295,296],{"class":150},"acme\u002Fapp",[117,298,154],{"class":127},[117,300,301],{"class":127}," },\n",[117,303,305,308],{"class":119,"line":304},6,[117,306,307],{"class":131},")",[117,309,157],{"class":127},[117,311,313],{"class":119,"line":312},7,[117,314,164],{"emptyLinePlaceholder":163},[117,316,318,321,323,326,329],{"class":119,"line":317},8,[117,319,320],{"class":131},"run",[117,322,192],{"class":127},[117,324,325],{"class":131},"counts",[117,327,328],{"class":127},";",[117,330,332],{"class":331},"sHwdD"," \u002F\u002F { passed: 40, failed: 2, 'missing-baseline': 1, created: 0, updated: 0, approved: 0 }\n",[117,334,336,338,340,343,345],{"class":119,"line":335},9,[117,337,320],{"class":131},[117,339,192],{"class":127},[117,341,342],{"class":131},"needsHuman",[117,344,328],{"class":127},[117,346,347],{"class":331}," \u002F\u002F the failed and missing-baseline entries\n",[117,349,351,353,355,358,360],{"class":119,"line":350},10,[117,352,320],{"class":131},[117,354,192],{"class":127},[117,356,357],{"class":131},"warnings",[117,359,328],{"class":127},[117,361,362],{"class":331}," \u002F\u002F manifests written for another commit\u002Frun\u002Frepository, renderer fallbacks, unapprovable project roots\n",[117,364,366,369,371,373],{"class":119,"line":365},11,[117,367,368],{"class":123},"for",[117,370,219],{"class":131},[117,372,171],{"class":170},[117,374,375],{"class":127}," {\n",[117,377,379,382],{"class":119,"line":378},12,[117,380,381],{"class":131},"  entry",[117,383,245],{"class":127},[117,385,387,390],{"class":119,"line":386},13,[117,388,389],{"class":131},"  repoPaths",[117,391,245],{"class":127},[117,393,395,398],{"class":119,"line":394},14,[117,396,397],{"class":131},"  keyHash",[117,399,245],{"class":127},[117,401,403,406],{"class":119,"line":402},15,[117,404,405],{"class":131},"  unapprovableReason",[117,407,245],{"class":127},[117,409,411,414],{"class":119,"line":410},16,[117,412,413],{"class":131},"  collidesWith",[117,415,245],{"class":127},[117,417,419,421,424,427,429,432],{"class":119,"line":418},17,[117,420,239],{"class":127},[117,422,423],{"class":127}," of",[117,425,426],{"class":131}," run",[117,428,192],{"class":127},[117,430,431],{"class":131},"needsHuman) ",[117,433,434],{"class":127},"{\n",[117,436,438],{"class":119,"line":437},18,[117,439,440],{"class":331},"  \u002F\u002F repoPaths: baseline\u002Factual\u002Fdiff relative to the repository root (`null` when they escape it)\n",[117,442,444],{"class":119,"line":443},19,[117,445,446],{"class":331},"  \u002F\u002F keyHash: a short stable id for buttons and commands\n",[117,448,450],{"class":119,"line":449},20,[117,451,452],{"class":331},"  \u002F\u002F collidesWith: other entries writing the same baseline file (two platforms, one path)\n",[117,454,456],{"class":119,"line":455},21,[117,457,458],{"class":127},"}\n",[117,460,462],{"class":119,"line":461},22,[117,463,164],{"emptyLinePlaceholder":163},[117,465,467],{"class":119,"line":466},23,[117,468,469],{"class":331},"\u002F\u002F `\u002Fapprove-visuals home_#0 \"about_#0 (darwin \u002F chrome)\"`\n",[117,471,473,475,477,480,482,485,487,490,492,495,497,499,502,504,507,509,512,514,517,519,521],{"class":119,"line":472},24,[117,474,171],{"class":170},[117,476,128],{"class":127},[117,478,479],{"class":131}," entries",[117,481,135],{"class":127},[117,483,484],{"class":131}," unknown ",[117,486,239],{"class":127},[117,488,489],{"class":127}," =",[117,491,138],{"class":180},[117,493,494],{"class":131},"(run",[117,496,135],{"class":127},[117,498,128],{"class":127},[117,500,501],{"class":229}," names",[117,503,233],{"class":127},[117,505,506],{"class":131}," [",[117,508,154],{"class":127},[117,510,511],{"class":150},"home_#0",[117,513,154],{"class":127},[117,515,516],{"class":131},"] ",[117,518,239],{"class":127},[117,520,307],{"class":131},[117,522,157],{"class":127},[99,524,525,526,529,530,533],{},"Any object with a ",[103,527,528],{},"manifest"," property is a source; extra properties (an artifact id, a zip path) come back on ",[103,531,532],{},"MergedEntry.source"," with their type.",[535,536,537],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}",{"title":113,"searchDepth":160,"depth":160,"links":539},[],"A run usually produces several manifests.","md",null,{"generated":163},{"icon":68},{"title":65,"description":540},"rdidKID70Xs56CtDGoO7M0Nx1rl5OEA3-nCOHNpSSVE",[548,550],{"title":60,"path":61,"stem":62,"description":549,"icon":63,"children":-1},"import {",{"title":70,"path":71,"stem":72,"description":551,"icon":73,"children":-1},"Test-runner integrations use ManifestWriter:",1791993875572]