mirror of
https://github.com/stablyai/orca.git
synced 2026-09-25 00:02:35 +00:00
`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.
165 lines
4.6 KiB
TypeScript
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
|
|
}
|
|
}
|