Files
orca/mobile/scripts/mock-server-git-state.ts
T
Neil 755c1562c3 fix(lint): enable anti-slop/no-pass-through-type-alias
`anti-slop/no-pass-through-type-alias` rejects a type alias whose entire
right-hand side is a bare reference to another named type, including the
generic form where every type parameter is forwarded positionally and
unchanged (`type A<T> = B<T>`). Those aliases add a second name for one
type: readers have to resolve the indirection, "go to definition" lands on
a rename rather than the shape, and the two names drift apart in review.

Flipped the rule from "off" to "error" in `config/oxlint-anti-slop.json`
and fixed all 195 violations reported across `src`, `config`, `tests`, and
`mobile`.

Fix approach, in order of preference per site:

- Delete the alias and use the target type directly at every reference,
  updating imports. This covers the large majority of the 195.
- Where the alias name was the better or more widely used name, rename the
  target declaration to the alias name instead of renaming call sites (for
  example `GitUncommittedEntry` -> `GitStatusEntry` in
  `src/shared/git-status-types.ts`).
- Where a pass-through sat in front of a type that was itself only used
  through that alias, collapse the pair into a single declaration that
  keeps the real shape (intersection, `Pick`/`Omit`, or union) under one
  name.

No alias was converted into an equivalent `interface X extends Y` to dodge
the rule, and no new pass-through was introduced.

No suppressions were added. The vendored anti-slop plugin source under
`config/oxlint-plugins/anti-slop/` is excluded from the audit by the
`--ignore-pattern` flag in `audit:anti-slop`, and stays byte-identical to
upstream.

Verified:

- `npx oxlint --config config/oxlint-anti-slop.json --ignore-pattern
  'config/oxlint-plugins/anti-slop/**' src config tests mobile` exits 0 (195 -> 0; baseline counted on a scratch worktree of
  `nwparker/2x-lint` with the rule flipped on).
- `node config/scripts/run-typecheck-projects-in-parallel.mjs` exits 0.
- `cd mobile && pnpm typecheck` exits 0 (the parallel script covers only the
  three desktop tsconfigs).
- Root vitest over the changed files and their sibling tests: 210 files,
  4072 passed, 1 skipped.
- Mobile vitest over the changed files and their sibling tests: 36 files,
  445 passed.
- `npx oxlint` with the repo's default config over every changed file
  (root and mobile) exits 0.
- `npx oxfmt --write` run over the changed files in both workspaces.
2026-09-14 17:14:11 -07:00

165 lines
4.6 KiB
TypeScript

import type { GitStatusEntry } from '../../src/shared/git-status-types'
type FakeGitEntry = GitStatusEntry & {
stagedFromUntracked?: boolean
}
type MockGitRequest = {
id: string
method: string
params?: Record<string, unknown>
}
type MockGitResponse = {
id: string
ok: boolean
result?: unknown
error?: { code: string; message: string }
_meta: { runtimeId: string }
}
type MockGitRespond = (response: MockGitResponse) => void
type MockGitSuccess = (id: string, result: unknown) => MockGitResponse
let fakeGitEntries: FakeGitEntry[] = [
{ path: 'src/auth/middleware.ts', status: 'modified', area: 'unstaged' },
{ path: 'src/auth/jwt.ts', status: 'untracked', area: 'untracked' },
{ path: 'README.md', status: 'modified', area: 'staged' }
]
let fakeAhead = 1
let fakeBehind = 0
let fakeHasUpstream = true
function toGitStatusEntry(entry: FakeGitEntry): GitStatusEntry {
const { stagedFromUntracked: _stagedFromUntracked, ...statusEntry } = entry
return statusEntry
}
function stageFakeGitEntry(entry: FakeGitEntry, filePaths: Set<string>): FakeGitEntry {
if (!filePaths.has(entry.path)) {
return entry
}
if (entry.area === 'untracked') {
return { ...entry, area: 'staged', status: 'added', stagedFromUntracked: true }
}
return { ...entry, area: 'staged' }
}
function unstageFakeGitEntry(entry: FakeGitEntry, filePaths: Set<string>): FakeGitEntry {
if (!filePaths.has(entry.path)) {
return entry
}
if (entry.stagedFromUntracked) {
return { ...entry, area: 'untracked', status: 'untracked', stagedFromUntracked: false }
}
return { ...entry, area: 'unstaged' }
}
export function handleMockGitRequest(
request: MockGitRequest,
respond: MockGitRespond,
success: MockGitSuccess
): boolean {
switch (request.method) {
case 'git.status':
respond(
success(request.id, {
entries: fakeGitEntries.map(toGitStatusEntry),
conflictOperation: 'unknown',
branch: 'refs/heads/feature/auth-refactor',
upstreamStatus: {
hasUpstream: fakeHasUpstream,
upstreamName: 'origin/feature/auth-refactor',
ahead: fakeAhead,
behind: fakeBehind
}
})
)
return true
case 'git.upstreamStatus':
respond(
success(request.id, {
hasUpstream: fakeHasUpstream,
upstreamName: 'origin/feature/auth-refactor',
ahead: fakeAhead,
behind: fakeBehind
})
)
return true
case 'git.stage': {
const filePath = String(request.params?.filePath ?? '')
fakeGitEntries = fakeGitEntries.map((entry) => stageFakeGitEntry(entry, new Set([filePath])))
respond(success(request.id, { ok: true }))
return true
}
case 'git.bulkStage': {
const filePaths = new Set((request.params?.filePaths as string[] | undefined) ?? [])
fakeGitEntries = fakeGitEntries.map((entry) => stageFakeGitEntry(entry, filePaths))
respond(success(request.id, { ok: true }))
return true
}
case 'git.unstage': {
const filePath = String(request.params?.filePath ?? '')
fakeGitEntries = fakeGitEntries.map((entry) =>
unstageFakeGitEntry(entry, new Set([filePath]))
)
respond(success(request.id, { ok: true }))
return true
}
case 'git.bulkUnstage': {
const filePaths = new Set((request.params?.filePaths as string[] | undefined) ?? [])
fakeGitEntries = fakeGitEntries.map((entry) => unstageFakeGitEntry(entry, filePaths))
respond(success(request.id, { ok: true }))
return true
}
case 'git.discard': {
const filePath = String(request.params?.filePath ?? '')
fakeGitEntries = fakeGitEntries.filter((entry) => entry.path !== filePath)
respond(success(request.id, { ok: true }))
return true
}
case 'git.commit':
fakeGitEntries = fakeGitEntries.filter((entry) => entry.area !== 'staged')
fakeAhead += 1
respond(success(request.id, { success: true }))
return true
case 'git.fetch':
respond(success(request.id, { ok: true }))
return true
case 'git.pull':
fakeBehind = 0
respond(success(request.id, { ok: true }))
return true
case 'git.diff':
respond(
success(request.id, {
kind: 'text',
originalContent: 'const status = "old"\\n',
modifiedContent: 'const status = "new"\\n',
originalIsBinary: false,
modifiedIsBinary: false
})
)
return true
case 'git.push':
fakeHasUpstream = true
fakeAhead = 0
respond(success(request.id, { ok: true }))
return true
default:
return false
}
}