Merge branch 'merge/1829-master' into merge/1990-1829

# Conflicts:
#	vitest.config.ts
This commit is contained in:
Huanqi Cao
2026-08-10 11:24:58 +08:00
86 changed files with 1031 additions and 367 deletions

View File

@@ -97,14 +97,14 @@ function repositoryState(root: string): Record<string, string> {
}
describe('change-scope', () => {
it('uses an explicit base on a fresh branch without a same-name remote and after its first push', () => {
it('uses an explicit base on a fresh branch without a same-name remote and after its first push', { timeout: 20_000 }, () => {
const { root } = fixture()
git(root, ['switch', '-c', 'feature'])
git(root, ['branch', '--set-upstream-to=origin/master'])
const headSha = commit(root, 'feature.txt', 'feature\n')
const fresh = jsonReport(root, 'origin/master')
expect(fresh.repositoryRoot).toBe(realpathSync(root))
expect(realpathSync.native(fresh.repositoryRoot)).toBe(realpathSync.native(root))
expect(fresh.resolved).toEqual({
baseSha: git(root, ['rev-parse', 'origin/master']),
headSha,
@@ -122,7 +122,7 @@ describe('change-scope', () => {
const { root } = fixture('worktree ')
const report = jsonReport(root, 'HEAD')
expect(report.repositoryRoot).toBe(realpathSync(root))
expect(realpathSync.native(report.repositoryRoot)).toBe(realpathSync.native(root))
expect(report.paths).toEqual({ committed: [], staged: [], unstaged: [], untracked: [] })
})

View File

@@ -51,10 +51,15 @@ describe('CI workflow', () => {
expect(windows.if).toBe("github.event_name == 'pull_request'")
expect(JSON.stringify(windows)).toContain('bash scripts/wine-windows-gates.sh')
expect(workflow.jobs).toHaveProperty('wine-apt-cache')
expect(windowsNative['runs-on']).toBe('windows-2025')
expect(windowsNative['runs-on']).toBe('dsh-windows-2025-16core')
expect(windowsNative.name).toBe('windows node 24 / native complete')
expect(windowsNative['timeout-minutes']).toBe(60)
expect(windowsNative.if).toBe("github.event_name == 'pull_request'")
expect(windowsNative.env).toMatchObject({
DSH_COVERAGE_MAX_WORKERS: '2',
DSH_GATE_CONCURRENCY: '2',
DSH_PUBLINT_CONCURRENCY: '8',
})
expect(windowsNative).not.toHaveProperty('continue-on-error')
expect(nativeCommandSteps).toHaveLength(3)
expect(nativeCommandSteps.every(step => step.shell === 'pwsh')).toBe(true)
@@ -63,6 +68,21 @@ describe('CI workflow', () => {
expect(aggregate.needs).toContain('windows')
expect(aggregate.needs).not.toContain('windows-native')
})
it('keeps supported LSP source under native Windows coverage', () => {
const config = readFileSync(resolve(root, 'vitest.config.ts'), 'utf8')
expect(config).not.toContain('packages/lsp/lsp-local/src/connection.ts')
expect(config).not.toContain('packages/lsp/lsp-local/src/index.ts')
expect(config).not.toContain('packages/lsp/lsp-local/src/instance.ts')
})
it('keeps every Vitest project process-isolated on native Windows', () => {
const config = readFileSync(resolve(root, 'vitest.config.ts'), 'utf8')
expect(config).not.toContain("pool: process.platform === 'win32' ? 'threads' : 'forks'")
expect(config.match(/pool: 'forks'/g)).toHaveLength(2)
})
})
describe('E2B e2e workflow', () => {

View File

@@ -1,7 +1,7 @@
/** Regression coverage for source declarations owned by the client test aggregate. */
import { existsSync, readdirSync } from 'node:fs'
import { resolve } from 'node:path'
import { resolve, sep } from 'node:path'
import { fileURLToPath } from 'node:url'
import ts from 'typescript'
import { describe, expect, it } from 'vitest'
@@ -14,6 +14,7 @@ function clientCssDeclarations(): string[] {
.filter(entry => entry.isDirectory())
.map(entry => resolve(clientRoot, entry.name, 'src/css-modules.d.ts'))
.filter(existsSync)
.map(file => file.replaceAll(sep, '/'))
.sort()
}
@@ -26,6 +27,7 @@ describe('client TypeScript aggregate', () => {
}
const parsed = ts.parseJsonConfigFileContent(read.config, ts.sys, root)
const loaded = parsed.fileNames
.map(file => file.replaceAll(sep, '/'))
.filter(file => file.endsWith('/src/css-modules.d.ts'))
.sort()
expect(loaded).toEqual(clientCssDeclarations())

View File

@@ -610,7 +610,7 @@ describe('worktree-local Lefthook installer', { timeout: 15_000 }, () => {
expect(result.status).toBe(1)
expect(result.stderr).toContain('sibling dormant worktree config')
expect(result.stderr).toContain(linkedConfig)
expect(result.stderr).toContain(JSON.stringify(linkedConfig))
expect(gitResult(fixture, fixture.main, ['config', '--get', 'extensions.worktreeConfig']).status).toBe(1)
expect(gitResult(fixture, fixture.linked, ['config', '--get', 'core.hooksPath']).status).toBe(1)
expect(git(fixture, fixture.main, ['config', '--file', linkedConfig, '--get', 'core.hooksPath'])).toBe(linkedHooks)

View File

@@ -249,7 +249,7 @@ export const longProbe = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +
rm(configPath, { force: true }),
])
}
})
}, 20_000)
it('accepts an ignored-only staged selection', () => {
const result = runOxlint([

View File

@@ -83,6 +83,15 @@ describe('gate graph validation', () => {
expect(ids).toContain('public-repository-links')
})
it('keeps native Windows coverage blocking while portability inventory remains observational', () => {
const gates = withPnpmEntrypoint(() => gatesForMode('ci-windows-complete'))
const byId = new Map(gates.map(subject => [subject.id, subject]))
expect(byId.get('coverage')?.allowFailure).not.toBe(true)
expect(byId.get('coverage-exempt-heavy')?.allowFailure).not.toBe(true)
expect(byId.get('duplication')?.allowFailure).toBe(true)
})
it.each([
['empty', [], /gate graph has no gates/],
['duplicate ids', [gate('same'), gate('same')], /duplicate gate id "same"/],

View File

@@ -435,6 +435,7 @@ function ciWindowsCompleteGates(): Gate[] {
return [
pnpmScript('build', 'build'),
pnpmScript('windows-site', 'docs:build', { label: 'production site' }),
...coverageGates(),
...observational,
]
}
@@ -442,7 +443,7 @@ function ciWindowsCompleteGates(): Gate[] {
function ciWindowsObservationalGates(): Gate[] {
return [
...ciStaticGates({ ownsBuild: true }),
// Linux owns required lint, coverage, and snapshots; Windows omits those duplicates.
// Linux owns required lint and snapshots; Windows omits those duplicates.
pnpmScript('duplication', 'duplication'),
pnpmScript('publint', 'publint', { needs: ['build'] }),
pnpmScript('node-next-types', 'verify-node-next-types', {

View File

@@ -19,7 +19,7 @@ import {
const driver = fileURLToPath(new URL('./merge-translation-pairing.ts', import.meta.url))
const driverLauncher = fileURLToPath(new URL('./merge-translation-pairing-driver.sh', import.meta.url))
const workspaceRoot = fileURLToPath(new URL('../', import.meta.url))
const tsxLoader = fileURLToPath(import.meta.resolve('tsx/esm'))
const tsxLoader = import.meta.resolve('tsx/esm')
const fixtures: string[] = []
interface Fixture {
@@ -231,7 +231,7 @@ function expectMergedPair(fixture: Fixture): void {
)
}
describe('translation pairing merge composition', () => {
describe('translation pairing merge composition', { timeout: 15_000 }, () => {
it('rejects a pairing-record path outside the repository', () => {
const fixture = createFixture(false)