|
|
@@ -306,10 +306,12 @@ function ciWindowsObservationalGates(): Gate[] {
|
|
|
}
|
|
|
|
|
|
function lintGate(eslintTargets: readonly string[] = ['.']): Gate {
|
|
|
+ const concurrencyArgs = eslintConcurrencyArgs()
|
|
|
if (process.env.DSH_ESLINT_CACHE === '1') {
|
|
|
return pnpmExec('lint', [
|
|
|
'eslint',
|
|
|
...eslintTargets,
|
|
|
+ ...concurrencyArgs,
|
|
|
'--cache',
|
|
|
'--cache-location',
|
|
|
'.cache/eslint/',
|
|
|
@@ -320,11 +322,28 @@ function lintGate(eslintTargets: readonly string[] = ['.']): Gate {
|
|
|
env: { NODE_OPTIONS: nodeOptions('--max-old-space-size=8192') },
|
|
|
})
|
|
|
}
|
|
|
+ if (concurrencyArgs.length > 0) {
|
|
|
+ return pnpmExec('lint', ['eslint', ...eslintTargets, ...concurrencyArgs], {
|
|
|
+ label: 'lint',
|
|
|
+ env: { NODE_OPTIONS: nodeOptions('--max-old-space-size=8192') },
|
|
|
+ })
|
|
|
+ }
|
|
|
return pnpmScript('lint', 'lint', {
|
|
|
env: { NODE_OPTIONS: nodeOptions('--max-old-space-size=8192') },
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+function eslintConcurrencyArgs(): string[] {
|
|
|
+ const raw = process.env.DSH_ESLINT_CONCURRENCY
|
|
|
+ if (raw === undefined || raw === '') return []
|
|
|
+ if (raw === 'auto') return ['--concurrency=auto']
|
|
|
+ const parsed = Number.parseInt(raw, 10)
|
|
|
+ if (!Number.isSafeInteger(parsed) || parsed < 1 || String(parsed) !== raw) {
|
|
|
+ throw new Error(`run-gates: DSH_ESLINT_CONCURRENCY must be a positive integer or auto, got ${JSON.stringify(raw)}.`)
|
|
|
+ }
|
|
|
+ return [`--concurrency=${raw}`]
|
|
|
+}
|
|
|
+
|
|
|
function coverageGate(): Gate {
|
|
|
const shard = process.env.DSH_COVERAGE_SHARD
|
|
|
return pnpmExec('coverage', [
|