fix(gates): address TypeRT review gaps

This commit is contained in:
Tianyi Cui
2026-08-08 15:03:14 +08:00
parent 4b73aa153e
commit 0411196489
16 changed files with 81 additions and 55 deletions

View File

@@ -221,6 +221,39 @@ export const longProbe = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +
expect(result.status, normalizedOutput(result)).toBe(0)
})
it('keeps staged validation project-free while preserving source rules', async () => {
const configPath = join(repositoryRoot, '.oxlintrc.staged.json')
const result = parseConfigFileTextToJson(configPath, await readFile(configPath, 'utf8'))
if (result.error !== undefined) {
throw new Error(flattenDiagnosticMessageText(result.error.messageText, '\n'))
}
expect(result.config).toMatchObject({
extends: ['./.oxlintrc.json'],
options: { typeAware: false },
})
const suffix = randomUUID()
const path = join(repositoryRoot, 'scripts', `staged-lint-probe-${suffix}.ts`)
try {
await writeFile(path, 'export const value={answer:1};\n')
const lint = runOxlint([
'--config',
relative(repositoryRoot, configPath),
'--format',
'unix',
relative(repositoryRoot, path),
])
const output = normalizedOutput(lint)
expect(lint.error).toBeUndefined()
expect(lint.status, output).toBe(1)
expect(output).toContain('@stylistic')
expect(output).not.toContain('typescript(')
} finally {
await rm(path, { force: true })
}
})
it('applies staged stylistic fixes before Oxlint validation', async () => {
const suffix = randomUUID()
const configPath = await writeContractConfig(suffix)

View File

@@ -59,7 +59,6 @@ describe('gate graph validation', () => {
'ci-primary',
'ci-linux-primary',
'ci-static',
'ci-lint',
'ci-lint-contracts-ready',
'ci-coverage',
'ci-snapshot',
@@ -119,25 +118,25 @@ describe('gate graph validation', () => {
describe('Oxlint gate', () => {
it('uses the package script when no worker bound is configured', () => {
const subject = withEnv('DSH_OXLINT_THREADS', undefined, () =>
withPnpmEntrypoint(() => gatesForMode('ci-lint')[0]))
withPnpmEntrypoint(() => gatesForMode('ci-lint-contracts-ready')[0]))
expect(subject).toMatchObject({
id: 'lint',
displayCommand: 'pnpm run lint',
displayCommand: 'pnpm run lint:contracts-ready',
command: process.execPath,
args: ['/private/pnpm.cjs', 'run', 'lint'],
args: ['/private/pnpm.cjs', 'run', 'lint:contracts-ready'],
})
})
it('surfaces the configured worker bound on the shared package script', () => {
const subject = withEnv('DSH_OXLINT_THREADS', '4', () =>
withPnpmEntrypoint(() => gatesForMode('ci-lint')[0]))
withPnpmEntrypoint(() => gatesForMode('ci-lint-contracts-ready')[0]))
expect(subject).toMatchObject({
id: 'lint',
displayCommand: 'DSH_OXLINT_THREADS=4 pnpm run lint',
displayCommand: 'DSH_OXLINT_THREADS=4 pnpm run lint:contracts-ready',
command: process.execPath,
args: ['/private/pnpm.cjs', 'run', 'lint'],
args: ['/private/pnpm.cjs', 'run', 'lint:contracts-ready'],
})
})
})
@@ -182,15 +181,10 @@ describe('TypeRT contract preparation', () => {
})
})
it('keeps standalone aggregates responsible for preparation', () => {
const [lint, preparedLint, docTypecheck] = withEnv('DSH_OXLINT_THREADS', undefined, () => [
withPnpmEntrypoint(() => gatesForMode('ci-lint')[0]),
withPnpmEntrypoint(() => gatesForMode('ci-lint-contracts-ready')[0]),
withPnpmEntrypoint(() => gatesForMode('doc-sync').find(item => item.id === 'doc-typecheck')),
])
it('keeps standalone doc sync responsible for preparation', () => {
const docTypecheck = withPnpmEntrypoint(() =>
gatesForMode('doc-sync').find(item => item.id === 'doc-typecheck'))
expect(lint?.displayCommand).toBe('pnpm run lint')
expect(preparedLint?.displayCommand).toBe('pnpm run lint:contracts-ready')
expect(docTypecheck?.displayCommand).toBe('pnpm run doc-typecheck')
})
})

View File

@@ -16,7 +16,6 @@ export type Mode =
| 'ci-primary'
| 'ci-linux-primary'
| 'ci-static'
| 'ci-lint'
| 'ci-lint-contracts-ready'
| 'ci-coverage'
| 'ci-snapshot'
@@ -102,7 +101,6 @@ function parseMode(raw: string | undefined): Mode {
case 'ci-primary':
case 'ci-linux-primary':
case 'ci-static':
case 'ci-lint':
case 'ci-lint-contracts-ready':
case 'ci-coverage':
case 'ci-snapshot':
@@ -117,7 +115,7 @@ function parseMode(raw: string | undefined): Mode {
return raw
default:
throw new Error(
`run-gates: expected mode ci-primary | ci-linux-primary | ci-static | ci-lint | ci-lint-contracts-ready | ci-coverage | ci-snapshot | ci-artifacts | ci-consumers | ci-windows-blocking | ci-windows-complete | ci-windows-observational | node-compat | check-all | doc-sync, got ${JSON.stringify(raw)}.`,
`run-gates: expected mode ci-primary | ci-linux-primary | ci-static | ci-lint-contracts-ready | ci-coverage | ci-snapshot | ci-artifacts | ci-consumers | ci-windows-blocking | ci-windows-complete | ci-windows-observational | node-compat | check-all | doc-sync, got ${JSON.stringify(raw)}.`,
)
}
}
@@ -199,14 +197,9 @@ export function gatesForMode(selected: Mode): Gate[] {
return [...ciPrimaryGates(), webSnapshotGate(['built-package-invariants'])]
case 'ci-static':
return ciStaticGates({ ownsBuild: false })
case 'ci-lint':
return [
lintGate(),
pnpmScript('duplication', 'duplication'),
]
case 'ci-lint-contracts-ready':
return [
lintGate({ contractsReady: true }),
lintGate(),
pnpmScript('duplication', 'duplication'),
]
case 'ci-coverage':
@@ -264,7 +257,7 @@ function ciPrimaryGates(): Gate[] {
...ciSharedStaticGates(),
typertContractsGate(),
pnpmScript('typecheck', 'typecheck:contracts-ready', { needs: ['typert-contracts'] }),
lintGate({ contractsReady: true, needs: ['typert-contracts'] }),
lintGate({ needs: ['typert-contracts'] }),
pnpmScript('duplication', 'duplication'),
...coverageGates(),
...nodeCompatSmokeGates(),
@@ -464,9 +457,9 @@ function typertContractsGate(): Gate {
return pnpmScript('typert-contracts', 'build:lib:host', { label: 'TypeRT contracts' })
}
function lintGate(options: { contractsReady?: boolean; needs?: string[] } = {}): Gate {
function lintGate(options: { needs?: string[] } = {}): Gate {
const raw = process.env.DSH_OXLINT_THREADS
const script = options.contractsReady === true ? 'lint:contracts-ready' : 'lint'
const script = 'lint:contracts-ready'
return pnpmScript('lint', script, {
...raw === undefined || raw === ''
? {}

File diff suppressed because one or more lines are too long