From 29e0e32e3b613813064a346fa09259497609c357 Mon Sep 17 00:00:00 2001 From: Matsu Date: Thu, 9 Jul 2026 09:24:12 +0300 Subject: [PATCH] chore: Remove --runner flag from janitor test scoping (#33373) Co-authored-by: Claude Opus 4.8 (1M context) --- packages/cli/package.json | 4 ++-- packages/core/package.json | 2 +- packages/frontend/@n8n/chat/package.json | 2 +- packages/frontend/@n8n/composables/package.json | 2 +- packages/frontend/@n8n/design-system/package.json | 2 +- packages/frontend/@n8n/i18n/package.json | 2 +- packages/frontend/@n8n/rest-api-client/package.json | 2 +- packages/frontend/@n8n/stores/package.json | 2 +- packages/frontend/editor-ui/package.json | 2 +- packages/nodes-base/package.json | 2 +- packages/testing/janitor/README.md | 6 +++--- packages/testing/janitor/src/cli.ts | 11 ----------- packages/testing/janitor/src/cli/arg-parser.test.ts | 11 ----------- packages/testing/janitor/src/cli/arg-parser.ts | 9 --------- packages/testing/janitor/src/cli/help.ts | 4 ++-- .../testing/janitor/src/core/scope-analyzer.test.ts | 13 ------------- packages/testing/janitor/src/core/scope-analyzer.ts | 3 --- .../testing/janitor/src/core/test-scoped-runner.ts | 6 ++---- packages/workflow/package.json | 2 +- 19 files changed, 19 insertions(+), 68 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 32c3680bd28..6f340f0f276 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -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", diff --git a/packages/core/package.json b/packages/core/package.json index 32450fed414..3cfd9fd98c8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -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": [ diff --git a/packages/frontend/@n8n/chat/package.json b/packages/frontend/@n8n/chat/package.json index d1864d8fbf6..d6b39f636ae 100644 --- a/packages/frontend/@n8n/chat/package.json +++ b/packages/frontend/@n8n/chat/package.json @@ -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", diff --git a/packages/frontend/@n8n/composables/package.json b/packages/frontend/@n8n/composables/package.json index 8485c1f84d0..e277aad827c 100644 --- a/packages/frontend/@n8n/composables/package.json +++ b/packages/frontend/@n8n/composables/package.json @@ -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", diff --git a/packages/frontend/@n8n/design-system/package.json b/packages/frontend/@n8n/design-system/package.json index b061942fe00..b635ae07e95 100644 --- a/packages/frontend/@n8n/design-system/package.json +++ b/packages/frontend/@n8n/design-system/package.json @@ -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", diff --git a/packages/frontend/@n8n/i18n/package.json b/packages/frontend/@n8n/i18n/package.json index 378c41d228a..1fd7212c16d 100644 --- a/packages/frontend/@n8n/i18n/package.json +++ b/packages/frontend/@n8n/i18n/package.json @@ -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", diff --git a/packages/frontend/@n8n/rest-api-client/package.json b/packages/frontend/@n8n/rest-api-client/package.json index 3c862b8b888..0fc64afa12e 100644 --- a/packages/frontend/@n8n/rest-api-client/package.json +++ b/packages/frontend/@n8n/rest-api-client/package.json @@ -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", diff --git a/packages/frontend/@n8n/stores/package.json b/packages/frontend/@n8n/stores/package.json index 7a7fadb893b..6f25ccf5f77 100644 --- a/packages/frontend/@n8n/stores/package.json +++ b/packages/frontend/@n8n/stores/package.json @@ -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", diff --git a/packages/frontend/editor-ui/package.json b/packages/frontend/editor-ui/package.json index c26b17df228..4326d595277 100644 --- a/packages/frontend/editor-ui/package.json +++ b/packages/frontend/editor-ui/package.json @@ -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": { diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 906fd19141d..eadc4f3cc47 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -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" }, diff --git a/packages/testing/janitor/README.md b/packages/testing/janitor/README.md index 6d995d66249..e8802e29124 100644 --- a/packages/testing/janitor/README.md +++ b/packages/testing/janitor/README.md @@ -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 | -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`. diff --git a/packages/testing/janitor/src/cli.ts b/packages/testing/janitor/src/cli.ts index 88666b013fe..e63d6bf2eb9 100644 --- a/packages/testing/janitor/src/cli.ts +++ b/packages/testing/janitor/src/cli.ts @@ -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()), diff --git a/packages/testing/janitor/src/cli/arg-parser.test.ts b/packages/testing/janitor/src/cli/arg-parser.test.ts index 11741ec5a0f..d18ffc62c0e 100644 --- a/packages/testing/janitor/src/cli/arg-parser.test.ts +++ b/packages/testing/janitor/src/cli/arg-parser.test.ts @@ -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', () => { diff --git a/packages/testing/janitor/src/cli/arg-parser.ts b/packages/testing/janitor/src/cli/arg-parser.ts index 18d77083f22..8713ab02daf 100644 --- a/packages/testing/janitor/src/cli/arg-parser.ts +++ b/packages/testing/janitor/src/cli/arg-parser.ts @@ -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 { 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, diff --git a/packages/testing/janitor/src/cli/help.ts b/packages/testing/janitor/src/cli/help.ts index 864cbf48424..601d3a2f087 100644 --- a/packages/testing/janitor/src/cli/help.ts +++ b/packages/testing/janitor/src/cli/help.ts @@ -239,7 +239,7 @@ export function showScopeHelp(): void { Scope - Per-package vitest scope from changed files Usage: - janitor scope --runner=vitest [--package-dir=] [--changed-files=] + janitor scope [--package-dir=] [--changed-files=] --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=] [--changed-files=] [extra runner args] + janitor test-scoped [--package-dir=] [--changed-files=] [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. diff --git a/packages/testing/janitor/src/core/scope-analyzer.test.ts b/packages/testing/janitor/src/core/scope-analyzer.test.ts index ae39bb7a825..7ba2fbfbc19 100644 --- a/packages/testing/janitor/src/core/scope-analyzer.test.ts +++ b/packages/testing/janitor/src/core/scope-analyzer.test.ts @@ -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'], diff --git a/packages/testing/janitor/src/core/scope-analyzer.ts b/packages/testing/janitor/src/core/scope-analyzer.ts index 64292f35fc7..98d8e4782ff 100644 --- a/packages/testing/janitor/src/core/scope-analyzer.ts +++ b/packages/testing/janitor/src/core/scope-analyzer.ts @@ -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). */ diff --git a/packages/testing/janitor/src/core/test-scoped-runner.ts b/packages/testing/janitor/src/core/test-scoped-runner.ts index 7f1d37d0cc4..f1f4cfc5fa1 100644 --- a/packages/testing/janitor/src/core/test-scoped-runner.ts +++ b/packages/testing/janitor/src/core/test-scoped-runner.ts @@ -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; } diff --git a/packages/workflow/package.json b/packages/workflow/package.json index 5fcf95c7611..76243a3e2e3 100644 --- a/packages/workflow/package.json +++ b/packages/workflow/package.json @@ -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" },