chore: Remove --runner flag from janitor test scoping (#33373)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matsu 2026-07-09 09:24:12 +03:00 committed by GitHub
parent e7e44fed83
commit 29e0e32e3b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 19 additions and 68 deletions

View File

@ -24,9 +24,9 @@
"start": "node ../../scripts/os-normalize.mjs --dir bin n8n",
"test": "N8N_LOG_LEVEL=silent DB_SQLITE_POOL_SIZE=4 DB_TYPE=sqlite vitest run",
"test:unit": "N8N_LOG_LEVEL=silent DB_SQLITE_POOL_SIZE=4 DB_TYPE=sqlite vitest run",
"test:unit:changed": "N8N_LOG_LEVEL=silent DB_SQLITE_POOL_SIZE=4 DB_TYPE=sqlite janitor test-scoped --runner=vitest",
"test:unit:changed": "N8N_LOG_LEVEL=silent DB_SQLITE_POOL_SIZE=4 DB_TYPE=sqlite janitor test-scoped",
"test:integration": "N8N_LOG_LEVEL=silent DB_SQLITE_POOL_SIZE=4 DB_TYPE=sqlite vitest run --config vitest.config.integration.ts",
"test:integration:changed": "N8N_LOG_LEVEL=silent DB_SQLITE_POOL_SIZE=4 DB_TYPE=sqlite janitor test-scoped --runner=vitest -- --config vitest.config.integration.ts",
"test:integration:changed": "N8N_LOG_LEVEL=silent DB_SQLITE_POOL_SIZE=4 DB_TYPE=sqlite janitor test-scoped -- --config vitest.config.integration.ts",
"test:dev": "N8N_LOG_LEVEL=silent DB_SQLITE_POOL_SIZE=4 DB_TYPE=sqlite vitest --silent=false",
"test:sqlite": "N8N_LOG_LEVEL=silent DB_SQLITE_POOL_SIZE=4 DB_TYPE=sqlite vitest run --config vitest.config.integration.ts",
"test:sqlite:migrations": "N8N_LOG_LEVEL=silent DB_SQLITE_POOL_SIZE=4 DB_TYPE=sqlite vitest run --config vitest.config.migration.ts --coverage.enabled=false",

View File

@ -23,7 +23,7 @@
"watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\"",
"test": "vitest run",
"test:unit": "vitest run",
"test:changed": "janitor test-scoped --runner=vitest",
"test:changed": "janitor test-scoped",
"test:dev": "vitest --silent=false"
},
"files": [

View File

@ -11,7 +11,7 @@
"preview": "vite preview",
"test:dev": "vitest",
"test": "vitest run",
"test:changed": "janitor test-scoped --runner=vitest",
"test:changed": "janitor test-scoped",
"typecheck": "vue-tsc --noEmit",
"lint": "eslint src --quiet",
"lint:fix": "eslint src --fix",

View File

@ -20,7 +20,7 @@
"preview": "vite preview",
"typecheck": "vue-tsc --noEmit",
"test": "vitest run",
"test:changed": "janitor test-scoped --runner=vitest",
"test:changed": "janitor test-scoped",
"test:dev": "vitest --silent=false",
"lint": "eslint src --quiet",
"lint:fix": "eslint src --fix",

View File

@ -12,7 +12,7 @@
"typecheck": "vue-tsc --noEmit",
"typecheck:watch": "vue-tsc --watch --noEmit",
"test": "vitest run",
"test:changed": "janitor test-scoped --runner=vitest",
"test:changed": "janitor test-scoped",
"test:dev": "vitest",
"chromatic": "chromatic",
"format": "biome format --write . && prettier --write . --ignore-path ../../../../.prettierignore",

View File

@ -28,7 +28,7 @@
"preview": "vite preview",
"typecheck": "vue-tsc --noEmit",
"test": "vitest run",
"test:changed": "janitor test-scoped --runner=vitest",
"test:changed": "janitor test-scoped",
"test:dev": "vitest --silent=false",
"lint": "eslint src --quiet",
"lint:fix": "eslint src --fix",

View File

@ -28,7 +28,7 @@
"preview": "vite preview",
"typecheck": "vue-tsc --noEmit",
"test": "vitest run",
"test:changed": "janitor test-scoped --runner=vitest",
"test:changed": "janitor test-scoped",
"test:dev": "vitest --silent=false",
"lint": "eslint src --quiet",
"lint:fix": "eslint src --fix",

View File

@ -28,7 +28,7 @@
"preview": "vite preview",
"typecheck": "vue-tsc --noEmit",
"test": "vitest run",
"test:changed": "janitor test-scoped --runner=vitest",
"test:changed": "janitor test-scoped",
"test:dev": "vitest --silent=false",
"lint": "eslint src --quiet",
"lint:fix": "eslint src --fix",

View File

@ -20,7 +20,7 @@
"format:check": "biome ci . && prettier --check . --ignore-path ../../../.prettierignore",
"serve": "cross-env VUE_APP_URL_BASE_API=http://localhost:5678/ vite --host 0.0.0.0 --port 8080 dev",
"test": "vitest run",
"test:changed": "janitor test-scoped --runner=vitest",
"test:changed": "janitor test-scoped",
"test:dev": "vitest --silent=false"
},
"dependencies": {

View File

@ -24,7 +24,7 @@
"watch": "tsc-watch -p tsconfig.build.cjs.json --onCompilationComplete \"pnpm copy-nodes-json && tsc-alias -p tsconfig.build.cjs.json\" --onSuccess \"pnpm n8n-generate-metadata\"",
"test": "vitest run",
"test:unit": "vitest run",
"test:changed": "janitor test-scoped --runner=vitest",
"test:changed": "janitor test-scoped",
"test:dev": "vitest --silent=false",
"test:integration:skip": "vitest run --config vitest.integration.config.ts"
},

View File

@ -211,7 +211,7 @@ ci-filter (in install-and-build)
│
└─→ CHANGED_FILES forwarded to test jobs
│
└─→ janitor test-scoped --runner=vitest (per-package)
└─→ janitor test-scoped (per-package)
│
├─→ SKIP → exit 0 (no in-package changes)
├─→ RUN_FULL → spawn runner with no scope flags
@ -225,10 +225,10 @@ ci-filter (in install-and-build)
CHANGED_FILES="packages/workflow/src/x.ts" janitor affected-packages
# Compute scope for the cwd package. Output: SKIP | RUN_FULL | <files>
janitor scope --runner=vitest
janitor scope
# Compute scope AND spawn the runner. Unrecognised flags forward to runner.
janitor test-scoped --runner=vitest --shard=1/2 --coverage
janitor test-scoped --shard=1/2 --coverage
```
**Bailout triggers (force ALL packages):** `pnpm-lock.yaml`, root `package.json`.

View File

@ -629,14 +629,9 @@ function runAffectedPackages(options: CliOptions): void {
}
function runTestScopedCmd(options: CliOptions): void {
if (!options.runner) {
console.error('Error: --runner=vitest is required');
process.exit(1);
}
const packageDir = options.packageDir ?? process.cwd();
const changedFiles = readChangedFiles(options);
const exitCode = runTestScoped({
runner: options.runner,
packageDir,
rootDir: findWorkspaceRoot(process.cwd()),
changedFiles,
@ -646,13 +641,7 @@ function runTestScopedCmd(options: CliOptions): void {
}
function runScope(options: CliOptions): void {
if (!options.runner) {
console.error('Error: --runner=vitest is required');
process.exit(1);
}
const result = computeScope({
runner: options.runner,
packageDir: options.packageDir ?? process.cwd(),
changedFiles: readChangedFiles(options),
rootDir: findWorkspaceRoot(process.cwd()),

View File

@ -197,17 +197,6 @@ describe('arg-parser', () => {
const result = parseArgs();
expect(result.testCommand).toBe('pnpm test');
});
it('parses --runner=vitest', () => {
setArgs(['--runner=vitest']);
const result = parseArgs();
expect(result.runner).toBe('vitest');
});
it('throws on unknown --runner value', () => {
setArgs(['--runner=jest']);
expect(() => parseArgs()).toThrow(/Unknown --runner=jest/);
});
});
describe('combined arguments', () => {

View File

@ -56,7 +56,6 @@ export interface CliOptions {
impact: boolean;
// Affected-packages / scope options
changedFiles?: string;
runner?: 'vitest';
packageDir?: string;
/** Anything after `--` — forwarded to the test runner by `test-scoped`. */
passthroughArgs: string[];
@ -190,13 +189,6 @@ const VALUE_FLAG_HANDLERS: Record<string, (options: CliOptions, value: string) =
'--changed-files=': (opts, value) => {
opts.changedFiles = value;
},
'--runner=': (opts, value) => {
if (value === 'vitest') {
opts.runner = value;
} else {
throw new Error(`Unknown --runner=${value}. Expected 'vitest'.`);
}
},
'--package-dir=': (opts, value) => {
opts.packageDir = value;
},
@ -250,7 +242,6 @@ function createDefaultOptions(): CliOptions {
shardIndex: undefined,
impact: false,
changedFiles: undefined,
runner: undefined,
packageDir: undefined,
passthroughArgs: [],
url: undefined,

View File

@ -239,7 +239,7 @@ export function showScopeHelp(): void {
Scope - Per-package vitest scope from changed files
Usage:
janitor scope --runner=vitest [--package-dir=<dir>] [--changed-files=<list>]
janitor scope [--package-dir=<dir>] [--changed-files=<list>]
--package-dir: defaults to cwd (matches how pnpm/turbo invoke test scripts).
--changed-files: newline- OR comma-separated repo-root-relative paths.
@ -257,7 +257,7 @@ export function showTestScopedHelp(): void {
Test-Scoped - Compute scope and spawn vitest with the right flags
Usage:
janitor test-scoped --runner=vitest [--package-dir=<dir>] [--changed-files=<list>] [extra runner args]
janitor test-scoped [--package-dir=<dir>] [--changed-files=<list>] [extra runner args]
--package-dir: defaults to cwd (matches how pnpm/turbo invoke test scripts).
--changed-files: newline- OR comma-separated repo-root-relative paths.

View File

@ -17,7 +17,6 @@ describe('computeScope', () => {
it('returns full when CHANGED_FILES signal is missing (local dev)', () => {
const rootDir = makePackageDir('packages/cli');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/cli',
rootDir,
changedFiles: null,
@ -29,7 +28,6 @@ describe('computeScope', () => {
it('returns skip when no in-package files changed', () => {
const rootDir = makePackageDir('packages/cli');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/cli',
rootDir,
changedFiles: ['packages/other/src/x.ts'],
@ -41,7 +39,6 @@ describe('computeScope', () => {
it('returns scoped list when only source files changed', () => {
const rootDir = makePackageDir('packages/cli');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/cli',
rootDir,
changedFiles: ['packages/cli/src/a.ts', 'packages/cli/src/b.ts'],
@ -56,7 +53,6 @@ describe('computeScope', () => {
it('bails to full on package.json change', () => {
const rootDir = makePackageDir('packages/cli');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/cli',
rootDir,
changedFiles: ['packages/cli/package.json'],
@ -67,7 +63,6 @@ describe('computeScope', () => {
it('bails to full on tsconfig change', () => {
const rootDir = makePackageDir('packages/cli');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/cli',
rootDir,
changedFiles: ['packages/cli/tsconfig.build.json'],
@ -78,7 +73,6 @@ describe('computeScope', () => {
it('ignores files outside the package even when configs match', () => {
const rootDir = makePackageDir('packages/cli');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/cli',
rootDir,
changedFiles: ['packages/other/package.json'],
@ -89,7 +83,6 @@ describe('computeScope', () => {
it('bails to full on vitest.config change', () => {
const rootDir = makePackageDir('packages/cli');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/cli',
rootDir,
changedFiles: ['packages/cli/vitest.config.ts'],
@ -100,7 +93,6 @@ describe('computeScope', () => {
it('bails to full on vite.config change (vitest reads vite.config)', () => {
const rootDir = makePackageDir('packages/frontend/editor-ui');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/frontend/editor-ui',
rootDir,
changedFiles: ['packages/frontend/editor-ui/vite.config.mts'],
@ -111,7 +103,6 @@ describe('computeScope', () => {
it('bails to full on src/__tests__/setup.ts change', () => {
const rootDir = makePackageDir('packages/frontend/editor-ui');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/frontend/editor-ui',
rootDir,
changedFiles: ['packages/frontend/editor-ui/src/__tests__/setup.ts'],
@ -129,7 +120,6 @@ describe('computeScope', () => {
])('bails to full on %s even when nothing changed in-package', (_label, changed) => {
const rootDir = makePackageDir('packages/cli');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/cli',
rootDir,
changedFiles: [changed],
@ -141,7 +131,6 @@ describe('computeScope', () => {
it('a universal-sink change forces full for a downstream package too', () => {
const rootDir = makePackageDir('packages/nodes-base');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/nodes-base',
rootDir,
changedFiles: ['packages/workflow/src/Workflow.ts'],
@ -152,7 +141,6 @@ describe('computeScope', () => {
it('does NOT treat a per-package package.json as a global trigger', () => {
const rootDir = makePackageDir('packages/cli');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/cli',
rootDir,
changedFiles: ['packages/other/package.json'],
@ -163,7 +151,6 @@ describe('computeScope', () => {
it('still SKIPs an unrelated cross-package change', () => {
const rootDir = makePackageDir('packages/cli');
const result = computeScope({
runner: 'vitest',
packageDir: 'packages/cli',
rootDir,
changedFiles: ['packages/nodes-base/nodes/Slack/Slack.node.ts'],

View File

@ -10,8 +10,6 @@ import { isAbsolute, relative, resolve } from 'node:path';
import { matchesGlobalTrigger } from './global-triggers.js';
import { toPosix } from './path-utils.js';
export type Runner = 'vitest';
// Bailout patterns are centralised here (vs the original DEVP-194 spec's
// per-package `n8nTestChanged.inPackageBailouts` field) because the n8n
// workspace shares the same vitest config helpers + setup file layout via
@ -36,7 +34,6 @@ const VITEST_BAILOUT = [
];
export interface ComputeScopeOptions {
runner: Runner;
packageDir: string;
rootDir: string;
/** `null` = no signal → RUN_FULL (local dev with unset env). */

View File

@ -3,10 +3,9 @@
import { spawnSync } from 'node:child_process';
import { isAbsolute, resolve } from 'node:path';
import { computeScope, type Runner, type ScopeResult } from './scope-analyzer.js';
import { computeScope, type ScopeResult } from './scope-analyzer.js';
export interface TestScopedOptions {
runner: Runner;
packageDir: string;
rootDir: string;
changedFiles: string[] | null;
@ -35,7 +34,6 @@ export function buildRunnerArgs(
export function runTestScoped(options: TestScopedOptions): number {
const scope = computeScope({
runner: options.runner,
packageDir: options.packageDir,
rootDir: options.rootDir,
changedFiles: options.changedFiles,
@ -56,5 +54,5 @@ export function runTestScoped(options: TestScopedOptions): number {
// Pass cwd explicitly so an override via --package-dir is honoured
// (otherwise spawnSync inherits the caller's cwd and vitest would
// resolve config + tests from the wrong project).
return spawnSync(options.runner, args, { stdio: 'inherit', cwd: options.packageDir }).status ?? 1;
return spawnSync('vitest', args, { stdio: 'inherit', cwd: options.packageDir }).status ?? 1;
}

View File

@ -37,7 +37,7 @@
"watch": "tsc --build tsconfig.build.esm.json tsconfig.build.cjs.json --watch",
"test": "vitest run",
"test:unit": "vitest run",
"test:changed": "janitor test-scoped --runner=vitest",
"test:changed": "janitor test-scoped",
"test:dev": "vitest --watch",
"mutate": "node ../../scripts/mutation-health/mutate.mjs --package-dir packages/workflow"
},