islandflow/docs/turns/2026-05-30-fix-forgejo-ci-test-mocks.html
dirtydishes 92d5db44e9
Some checks failed
CI / Validate (push) Failing after 1m2s
fix forgejo terminal test module resolution
2026-05-30 01:54:15 -04:00

296 lines
82 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fix Forgejo CI terminal test mock alias</title>
<style>
:root {
color-scheme: light;
--bg: oklch(0.985 0.005 250);
--panel: oklch(1 0 0);
--panel-2: oklch(0.972 0.008 250);
--ink: oklch(0.21 0.02 250);
--muted: oklch(0.44 0.022 250);
--faint: oklch(0.6 0.015 250);
--line: oklch(0.88 0.014 250);
--accent: oklch(0.56 0.13 265);
--accent-soft: oklch(0.95 0.03 265);
}
* { box-sizing: border-box; }
body {
margin: 0;
background: linear-gradient(180deg, var(--bg), oklch(0.995 0.003 250));
color: var(--ink);
font: 15px/1.6 Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
main {
width: min(1080px, calc(100% - 40px));
margin: 0 auto;
padding: 44px 0 64px;
}
header {
padding-bottom: 24px;
margin-bottom: 28px;
border-bottom: 1px solid var(--line);
}
.eyebrow {
color: var(--accent);
font: 600 0.76rem/1.2 "IBM Plex Mono", ui-monospace, monospace;
letter-spacing: 0.08em;
text-transform: uppercase;
}
h1 {
margin: 10px 0 12px;
font-size: 2.1rem;
line-height: 1.05;
letter-spacing: 0;
}
h2 {
margin: 0 0 12px;
padding-top: 22px;
border-top: 1px solid var(--line);
font-size: 1.02rem;
}
h3 {
margin: 16px 0 8px;
font-size: 0.92rem;
}
p, li {
color: var(--muted);
max-width: 78ch;
}
ul { margin: 0; padding-left: 20px; }
li + li { margin-top: 6px; }
code {
font-family: "IBM Plex Mono", ui-monospace, monospace;
font-size: 0.93em;
color: var(--ink);
}
pre {
overflow: auto;
padding: 14px;
border: 1px solid var(--line);
border-radius: 8px;
background: var(--panel-2);
color: var(--ink);
}
.summary {
background: var(--accent-soft);
border: 1px solid oklch(0.85 0.05 265);
border-radius: 10px;
padding: 18px 20px;
}
.meta {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 16px;
}
.pill {
border: 1px solid var(--line);
border-radius: 999px;
background: var(--panel);
color: var(--muted);
font-size: 0.82rem;
padding: 5px 10px;
}
.diff-frame {
margin-top: 12px;
overflow: auto;
border: 1px solid var(--line);
border-radius: 10px;
background: var(--panel);
}
.diff-note {
margin: 0 0 12px;
}
.small {
color: var(--faint);
font-size: 0.94rem;
}
.callout {
border: 1px solid var(--line);
border-radius: 10px;
background: var(--panel);
padding: 14px 16px;
}
</style>
</head>
<body>
<main>
<header>
<div class="eyebrow">Turn document</div>
<h1>Fix Forgejo CI terminal test mock alias</h1>
<p class="summary">The remaining Forgejo-only failure was a Next.js module-shape mismatch in the terminal test. I taught the test harness to mock both the bare <code>next/navigation</code> specifier and the resolved <code>next/navigation.js</code> path so Forgejo can import the same named exports the local suite already accepts.</p>
<div class="meta">
<span class="pill">Updated: 2026-05-30 01:53 EDT</span>
<span class="pill">Beads: islandflow-3l6</span>
<span class="pill">Validation: targeted terminal test + full Bun suite passed</span>
</div>
</header>
<section>
<h2>New Changes as of 2026-05-30 01:53 EDT</h2>
<p class="callout">This update builds on the earlier Bun PATH and redirect-mock fixes. Forgejo was still resolving the Next.js navigation module through the explicit <code>.js</code> path, so the test harness now mocks both the specifier and the resolved path before the terminal module loads.</p>
<h3>Summary of changes</h3>
<ul>
<li>Wrapped the Next.js navigation stubs in a shared mock object in <code>apps/web/app/terminal.test.ts</code>.</li>
<li>Added explicit mocks for both <code>import.meta.resolve("next/navigation")</code> and <code>import.meta.resolve("next/navigation.js")</code>.</li>
<li>Kept the <code>redirect</code> shim and <code>usePathname</code> stub identical across every module entry point Forgejo might choose.</li>
</ul>
<h3>Why this change was made</h3>
<p>The previous mock covered the string specifier, but Forgejo's Bun runtime still resolved the explicit <code>.js</code> entry point in the test job. Without the resolved-path aliases, Bun reported a missing named export and aborted the file before the assertions could run.</p>
<h3>Code diff</h3>
<pre><code>const nextNavigationMock = {
default: {
redirect,
usePathname: () => "/options"
},
redirect,
usePathname: () => "/options"
};
const nextNavigationResolved = import.meta.resolve("next/navigation");
const nextNavigationJsResolved = import.meta.resolve("next/navigation.js");
mock.module(nextNavigationResolved, () => ({
...nextNavigationMock
}));
mock.module(nextNavigationJsResolved, () => ({
...nextNavigationMock
}));</code></pre>
<h3>Related issues or PRs</h3>
<p><code>islandflow-3l6</code></p>
</section>
<section>
<h2>Summary</h2>
<p>The remaining Forgejo failure was inside the web test suite, not the install or typecheck stages. The terminal test needed to mock the Next.js navigation module under both import paths, so the final change keeps the CI runner from tripping over a named export mismatch.</p>
</section>
<section>
<h2>Changes Made</h2>
<ul>
<li>Updated <code>apps/web/app/terminal.test.ts</code> to mock <code>next/navigation.js</code> in addition to <code>next/navigation</code>.</li>
<li>Kept the redirect shim and pathname stub aligned between both module shapes.</li>
<li>Left the earlier Bun PATH and redirect-mock fixes intact, since they were already solving the other CI failure modes.</li>
</ul>
</section>
<section>
<h2>Context</h2>
<p>The repository already had the Bun executable path fix and the routes mock alias fix in place. The last failure surfaced only in the full CI-shaped test run, where Bun resolved the terminal module through <code>next/navigation.js</code> rather than the shorter specifier used in the local test path.</p>
</section>
<section>
<h2>Important Implementation Details</h2>
<ul>
<li>The alias returns the same mock object for both module entry points, so the terminal module sees a consistent redirect helper and pathname stub regardless of the import path Bun chooses.</li>
<li>This stays narrowly scoped to the test file and does not change production routing code.</li>
<li>The fix addresses the exact CI import shape instead of widening the test harness in a way that could hide future regressions.</li>
</ul>
</section>
<section>
<h2>Relevant Diff Snippets</h2>
<p class="diff-note small">Rendered with <code>@pierre/diffs/ssr</code> from the current working tree. It shows the shared Next.js navigation mock plus the explicit resolved-path aliases that keep Forgejo aligned with the local Bun runtime.</p>
<div class="diff-frame"><svg data-icon-sprite aria-hidden="true" width="0" height="0">
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
</symbol>
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
</symbol>
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
</symbol>
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
</symbol>
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
</symbol>
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
</symbol>
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
</symbol>
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
</symbol>
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
</symbol>
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</symbol>
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
</symbol>
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
</symbol>
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
@layer theme {
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
@layer rendered {
:host {
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
}
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>apps/web/app/terminal.test.ts</bdi></div></div><div data-metadata=""><span data-deletions-count="">-5</span><span data-additions-count="">+17</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:2ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 34"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="5" data-line-index="4,4"><span data-line-number-content="">5</span></div><div data-line-type="context" data-column-number="6" data-line-index="5,5"><span data-line-number-content="">6</span></div><div data-line-type="context" data-column-number="7" data-line-index="6,6"><span data-line-number-content="">7</span></div><div data-line-type="change-deletion" data-column-number="8" data-line-index="7,7"><span data-line-number-content="">8</span></div><div data-line-type="change-deletion" data-column-number="9" data-line-index="8,8"><span data-line-number-content="">9</span></div><div data-line-type="change-deletion" data-column-number="10" data-line-index="9,9"><span data-line-number-content="">10</span></div><div data-line-type="change-deletion" data-column-number="11" data-line-index="10,10"><span data-line-number-content="">11</span></div><div data-line-type="change-deletion" data-column-number="12" data-line-index="11,11"><span data-line-number-content="">12</span></div><div data-line-type="context" data-column-number="13" data-line-index="13,12"><span data-line-number-content="">13</span></div><div data-line-type="context" data-column-number="14" data-line-index="14,13"><span data-line-number-content="">14</span></div><div data-line-type="context" data-column-number="15" data-line-index="15,14"><span data-line-number-content="">15</span></div><div data-line-type="context" data-column-number="16" data-line-index="16,15"><span data-line-number-content="">16</span></div><div data-line-type="context" data-column-number="17" data-line-index="17,16"><span data-line-number-content="">17</span></div><div data-line-type="context" data-column-number="18" data-line-index="18,17"><span data-line-number-content="">18</span></div><div data-gutter-buffer="buffer" data-buffer-size="16" style="grid-row: span 16;min-height:calc(16 * 1lh);"></div><div data-line-type="context" data-column-number="19" data-line-index="35,34"><span data-line-number-content="">19</span></div><div data-line-type="context" data-column-number="20" data-line-index="36,35"><span data-line-number-content="">20</span></div><div data-line-type="context" data-column-number="21" data-line-index="37,36"><span data-line-number-content="">21</span></div></div><div data-content="" style="grid-row: span 34"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line="5" data-alt-line="5" data-line-type="context" data-line-index="4,4"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> throw</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> new</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#693ACF"> Error</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#636363">`</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#199F43">NEXT_REDIRECT:</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">${</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D47628">path</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">}</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#636363">`</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#636363">);</span></div><div data-line="6" data-alt-line="6" data-line-type="context" data-line-index="5,5"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">})</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">;</span></div><div data-line="7" data-alt-line="7" data-line-type="context" data-line-index="6,6">
</div><div data-line="8" data-line-type="change-deletion" data-line-index="7,7"><span data-diff-span=""><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">mock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">module</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"next/navigation"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span></span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =</span><span data-diff-span=""><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="9" data-line-type="change-deletion" data-line-index="8,8"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628"> redirect</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span></div><div data-line="10" data-line-type="change-deletion" data-line-index="9,9"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> usePathname</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "/options"</span></div><div data-line="11" data-line-type="change-deletion" data-line-index="10,10"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}));</span></div><div data-line="12" data-line-type="change-deletion" data-line-index="11,11"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">mock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">module</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"next/navigation.js"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ({</span></div><div data-line="13" data-alt-line="9" data-line-type="context" data-line-index="13,12"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628"> default</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="14" data-alt-line="10" data-line-type="context" data-line-index="14,13"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628"> redirect</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span></div><div data-line="15" data-alt-line="11" data-line-type="context" data-line-index="15,14"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> usePathname</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "/options"</span></div><div data-line="16" data-alt-line="12" data-line-type="context" data-line-index="16,15"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> },</span></div><div data-line="17" data-alt-line="13" data-line-type="context" data-line-index="17,16"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628"> redirect</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span></div><div data-line="18" data-alt-line="14" data-line-type="context" data-line-index="18,17"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> usePathname</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "/options"</span></div><div data-content-buffer="" data-buffer-size="16" style="grid-row: span 16;min-height:calc(16 * 1lh)"></div><div data-line="19" data-alt-line="31" data-line-type="context" data-line-index="35,34"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}));</span></div><div data-line="20" data-alt-line="32" data-line-type="context" data-line-index="36,35">
</div><div data-line="21" data-alt-line="33" data-line-type="context" data-line-index="37,36"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">const</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 34"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="5" data-line-index="4,4"><span data-line-number-content="">5</span></div><div data-line-type="context" data-column-number="6" data-line-index="5,5"><span data-line-number-content="">6</span></div><div data-line-type="context" data-column-number="7" data-line-index="6,6"><span data-line-number-content="">7</span></div><div data-line-type="change-addition" data-column-number="8" data-line-index="12,7"><span data-line-number-content="">8</span></div><div data-gutter-buffer="buffer" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh);"></div><div data-line-type="context" data-column-number="9" data-line-index="13,12"><span data-line-number-content="">9</span></div><div data-line-type="context" data-column-number="10" data-line-index="14,13"><span data-line-number-content="">10</span></div><div data-line-type="context" data-column-number="11" data-line-index="15,14"><span data-line-number-content="">11</span></div><div data-line-type="context" data-column-number="12" data-line-index="16,15"><span data-line-number-content="">12</span></div><div data-line-type="context" data-column-number="13" data-line-index="17,16"><span data-line-number-content="">13</span></div><div data-line-type="context" data-column-number="14" data-line-index="18,17"><span data-line-number-content="">14</span></div><div data-line-type="change-addition" data-column-number="15" data-line-index="19,18"><span data-line-number-content="">15</span></div><div data-line-type="change-addition" data-column-number="16" data-line-index="20,19"><span data-line-number-content="">16</span></div><div data-line-type="change-addition" data-column-number="17" data-line-index="21,20"><span data-line-number-content="">17</span></div><div data-line-type="change-addition" data-column-number="18" data-line-index="22,21"><span data-line-number-content="">18</span></div><div data-line-type="change-addition" data-column-number="19" data-line-index="23,22"><span data-line-number-content="">19</span></div><div data-line-type="change-addition" data-column-number="20" data-line-index="24,23"><span data-line-number-content="">20</span></div><div data-line-type="change-addition" data-column-number="21" data-line-index="25,24"><span data-line-number-content="">21</span></div><div data-line-type="change-addition" data-column-number="22" data-line-index="26,25"><span data-line-number-content="">22</span></div><div data-line-type="change-addition" data-column-number="23" data-line-index="27,26"><span data-line-number-content="">23</span></div><div data-line-type="change-addition" data-column-number="24" data-line-index="28,27"><span data-line-number-content="">24</span></div><div data-line-type="change-addition" data-column-number="25" data-line-index="29,28"><span data-line-number-content="">25</span></div><div data-line-type="change-addition" data-column-number="26" data-line-index="30,29"><span data-line-number-content="">26</span></div><div data-line-type="change-addition" data-column-number="27" data-line-index="31,30"><span data-line-number-content="">27</span></div><div data-line-type="change-addition" data-column-number="28" data-line-index="32,31"><span data-line-number-content="">28</span></div><div data-line-type="change-addition" data-column-number="29" data-line-index="33,32"><span data-line-number-content="">29</span></div><div data-line-type="change-addition" data-column-number="30" data-line-index="34,33"><span data-line-number-content="">30</span></div><div data-line-type="context" data-column-number="31" data-line-index="35,34"><span data-line-number-content="">31</span></div><div data-line-type="context" data-column-number="32" data-line-index="36,35"><span data-line-number-content="">32</span></div><div data-line-type="context" data-column-number="33" data-line-index="37,36"><span data-line-number-content="">33</span></div></div><div data-content="" style="grid-row: span 34"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line="5" data-alt-line="5" data-line-type="context" data-line-index="4,4"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> throw</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> new</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Error</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">`</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">NEXT_REDIRECT:</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">${</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">path</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">}</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">`</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">);</span></div><div data-line="6" data-alt-line="6" data-line-type="context" data-line-index="5,5"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">})</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">;</span></div><div data-line="7" data-alt-line="7" data-line-type="context" data-line-index="6,6">
</div><div data-line="8" data-line-type="change-addition" data-line-index="12,7"><span data-diff-span=""><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">const</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> nextNavigationMock</span></span><span style="--diffs-token-dark:#08C0EF;--diffs-token-light:#08C0EF"> =</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh)"></div><div data-line="9" data-alt-line="13" data-line-type="context" data-line-index="13,12"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628"> default</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="10" data-alt-line="14" data-line-type="context" data-line-index="14,13"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628"> redirect</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span></div><div data-line="11" data-alt-line="15" data-line-type="context" data-line-index="15,14"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> usePathname</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "/options"</span></div><div data-line="12" data-alt-line="16" data-line-type="context" data-line-index="16,15"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> },</span></div><div data-line="13" data-alt-line="17" data-line-type="context" data-line-index="17,16"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628"> redirect</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span></div><div data-line="14" data-alt-line="18" data-line-type="context" data-line-index="18,17"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> usePathname</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "/options"</span></div><div data-line="15" data-line-type="change-addition" data-line-index="19,18"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">};</span></div><div data-line="16" data-line-type="change-addition" data-line-index="20,19">
</div><div data-line="17" data-line-type="change-addition" data-line-index="21,20"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">const</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> nextNavigationResolved</span><span style="--diffs-token-dark:#08C0EF;--diffs-token-light:#08C0EF"> =</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> import</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">meta</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">resolve</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"next/navigation"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">);</span></div><div data-line="18" data-line-type="change-addition" data-line-index="22,21"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">const</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> nextNavigationJsResolved</span><span style="--diffs-token-dark:#08C0EF;--diffs-token-light:#08C0EF"> =</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> import</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">meta</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">resolve</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"next/navigation.js"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">);</span></div><div data-line="19" data-line-type="change-addition" data-line-index="23,22">
</div><div data-line="20" data-line-type="change-addition" data-line-index="24,23"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">mock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">module</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"next/navigation"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ({</span></div><div data-line="21" data-line-type="change-addition" data-line-index="25,24"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ...</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">nextNavigationMock</span></div><div data-line="22" data-line-type="change-addition" data-line-index="26,25"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}));</span></div><div data-line="23" data-line-type="change-addition" data-line-index="27,26"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">mock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">module</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"next/navigation.js"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ({</span></div><div data-line="24" data-line-type="change-addition" data-line-index="28,27"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ...</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">nextNavigationMock</span></div><div data-line="25" data-line-type="change-addition" data-line-index="29,28"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}));</span></div><div data-line="26" data-line-type="change-addition" data-line-index="30,29"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">mock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">module</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">nextNavigationResolved</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ({</span></div><div data-line="27" data-line-type="change-addition" data-line-index="31,30"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ...</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">nextNavigationMock</span></div><div data-line="28" data-line-type="change-addition" data-line-index="32,31"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}));</span></div><div data-line="29" data-line-type="change-addition" data-line-index="33,32"><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">mock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">module</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">nextNavigationJsResolved</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">,</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> =></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ({</span></div><div data-line="30" data-line-type="change-addition" data-line-index="34,33"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ...</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">nextNavigationMock</span></div><div data-line="31" data-alt-line="19" data-line-type="context" data-line-index="35,34"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}));</span></div><div data-line="32" data-alt-line="20" data-line-type="context" data-line-index="36,35">
</div><div data-line="33" data-alt-line="21" data-line-type="context" data-line-index="37,36"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">const</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div></div></code></pre></div>
</section>
<section>
<h2>Expected Impact for End-Users</h2>
<p>Forgejo should stop failing on the terminal test's CI-only module resolution mismatch, which reduces false negative pipeline runs and makes it easier to trust the branch when the suite passes.</p>
</section>
<section>
<h2>Validation</h2>
<ul>
<li><code>env PATH="$HOME/.bun/bin:/usr/bin:/bin" bun test apps/web/app/terminal.test.ts</code> passed: 74 tests, 0 failures.</li>
<li><code>env PATH="$HOME/.bun/bin:/usr/bin:/bin" bun test</code> passed: 250 tests, 0 failures.</li>
</ul>
</section>
<section>
<h2>Issues, Limitations, and Mitigations</h2>
<p>This fix is intentionally narrow. If another CI-only Next.js import path shows up later, the same pattern should be applied to the affected test file instead of broadening the mock surface globally. That keeps the failure signal honest and the test harness easy to reason about.</p>
</section>
<section>
<h2>Follow-up Work</h2>
<ul>
<li>Watch the next Forgejo run on this branch to confirm the updated terminal alias clears the last failure.</li>
<li>If another module-shape mismatch appears, fold the shared mock setup into a tiny helper rather than repeating the alias logic by hand.</li>
</ul>
</section>
</main>
</body>
</html>