chore: Migrate the rest of packages/@n8n to typescript 7 (#34332)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matsu
2026-07-17 10:45:58 +03:00
committed by GitHub
parent 84ee0632a3
commit 9b2b78f8d5
75 changed files with 2076 additions and 187 deletions
+8 -1
View File
@@ -251,8 +251,15 @@ runs:
shell: bash
run: echo "running=${TURBOGHA_PORT:+true}" >> "$GITHUB_OUTPUT"
# Skipped on Windows: the turbogha server binds IPv4 while `localhost`
# resolves to IPv6 first there, so turbo can never reach it (the build
# logs `failed to contact remote cache` for every artifact and falls back
# to a local cache). The remote cache is inert, but the action's post-run
# still fetches the unreachable server to save it and dies with a bare
# `fetch failed`, turning the whole job red. Skip it so the one Windows
# build job stays green; Linux/Blacksmith jobs keep remote caching.
- name: Configure Turborepo Cache
if: steps.turbo-server.outputs.running != 'true'
if: steps.turbo-server.outputs.running != 'true' && runner.os != 'Windows'
uses: rharkor/caching-for-turbo@5d14fba18e450c09393333cfd4242e8b3cb455a6 # v2.4.2
with:
server-port: 0
@@ -12,7 +12,9 @@
"n8n-playwright",
"n8n-workflow",
"typescript",
"@typescript/*"
"@typescript/*",
"tsdown",
"rolldown-plugin-dts"
]
}
}
+1 -1
View File
@@ -83,7 +83,7 @@
"@types/qs": "catalog:",
"@vitest/coverage-v8": "catalog:",
"nock": "catalog:",
"typescript": "catalog:",
"typescript": "catalog:typescript",
"vitest": "catalog:",
"vitest-mock-extended": "catalog:"
},
@@ -1,5 +1,5 @@
{
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.json"],
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.go.json"],
"compilerOptions": {
"composite": true,
"rootDir": "src",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"types": ["node", "vitest/globals"],
"tsBuildInfoFile": "dist/typecheck.tsbuildinfo",
+2 -1
View File
@@ -60,7 +60,8 @@
"@vitest/coverage-v8": "catalog:",
"express": "catalog:",
"testcontainers": "catalog:",
"typescript": "catalog:",
"@typescript/native": "catalog:typescript-tooling",
"typescript": "catalog:typescript-tooling",
"vite": "catalog:",
"vitest": "catalog:",
"vitest-mock-extended": "catalog:"
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.json"],
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.go.json"],
"compilerOptions": {
"composite": true,
"rootDir": "src",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"types": ["node", "vitest/globals", "vite/client"],
"experimentalDecorators": true,
+1 -1
View File
@@ -27,7 +27,7 @@
"@n8n/vitest-config": "workspace:*",
"@types/express": "catalog:",
"@types/lodash": "catalog:",
"typescript": "catalog:",
"typescript": "catalog:typescript",
"vitest": "catalog:",
"zod": "catalog:"
},
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.json"],
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.go.json"],
"compilerOptions": {
"composite": true,
"rootDir": "src",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"types": ["node", "vitest/globals"],
"experimentalDecorators": true,
+1 -1
View File
@@ -28,7 +28,7 @@
"devDependencies": {
"@n8n/vitest-config": "workspace:*",
"@vitest/coverage-v8": "catalog:",
"typescript": "catalog:",
"typescript": "catalog:typescript",
"vitest": "catalog:",
"vitest-mock-extended": "catalog:",
"@n8n/typescript-config": "workspace:*"
+1 -1
View File
@@ -31,7 +31,7 @@ const instances = new Map<ServiceIdentifier, Metadata>();
* @returns A class decorator to be applied to the target class
*/
// eslint-disable-next-line @typescript-eslint/no-restricted-types
export function Service<T = unknown>(): Function;
export function Service(): Function;
// eslint-disable-next-line @typescript-eslint/no-restricted-types
export function Service<T = unknown>(options: Options<T>): Function;
export function Service<T>({ factory }: Options<T> = {}) {
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.json"],
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.go.json"],
"compilerOptions": {
"composite": true,
"rootDir": "src",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"types": ["node", "vitest/globals"],
"experimentalDecorators": true,
+1
View File
@@ -38,6 +38,7 @@
"@types/eslint": "^9.6.1",
"@types/node": "catalog:",
"@typescript-eslint/eslint-plugin": "^8.35.0",
"@typescript-eslint/parser": "^8.35.0",
"@typescript-eslint/rule-tester": "^8.35.0",
"@typescript-eslint/utils": "^8.35.0",
"@typescript/native": "catalog:typescript-tooling",
@@ -42,6 +42,15 @@ export const baseConfig = tseslint.config(
},
settings: {
'import-x/resolver-next': [createTypeScriptImportResolver()],
// Neutralize the string-based parser mapping added by import-x's TS preset.
// A string parser path makes import-x re-`require('@typescript-eslint/parser')`
// when parsing imported modules, which resolves a parser copy peered to the
// leaf package's tsgo `typescript` (no programmatic API in TS7) and crashes
// reading `ts.Extension.Cjs`. ESLint deep-merges settings, so we can't drop
// the key — instead empty its extension list so import-x matches nothing here
// and falls back to the already-loaded parser object from languageOptions
// (backed by TS6).
'import-x/parsers': { '@typescript-eslint/parser': [] },
},
rules: {
// ******************************************************************
+2 -1
View File
@@ -51,7 +51,8 @@
"@vue/tsconfig": "catalog:frontend",
"prettier": "catalog:",
"tsdown": "catalog:",
"typescript": "catalog:",
"@typescript/native": "catalog:typescript-tooling",
"typescript": "catalog:typescript-tooling",
"rimraf": "catalog:",
"vite": "catalog:",
"vue": "catalog:frontend",
@@ -1,9 +1,10 @@
import { extensionManifestSchema } from '../src/schema';
import { zodToJsonSchema } from 'zod-to-json-schema';
import { writeFile } from 'fs/promises';
import { dirname, resolve } from 'path';
import { fileURLToPath } from 'url';
import { format, resolveConfig } from 'prettier';
import { fileURLToPath } from 'url';
import { zodToJsonSchema } from 'zod-to-json-schema';
import { extensionManifestSchema } from '../src/schema.js';
const __dirname = dirname(fileURLToPath(import.meta.url));
const rootDir = resolve(__dirname, '..');
@@ -1,2 +1,2 @@
export * from './define';
export type * from './types';
export * from './define.js';
export type * from './types.ts';
+1 -1
View File
@@ -1 +1 @@
export * from './schema';
export * from './schema.js';
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"composite": true,
"declaration": true,
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"composite": true,
"declaration": true,
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.backend.json",
"extends": "@n8n/typescript-config/tsconfig.backend.go.json",
"compilerOptions": {
"noEmit": true
},
+2 -1
View File
@@ -55,7 +55,8 @@
"@vue/test-utils": "catalog:frontend",
"rimraf": "catalog:",
"semver": "catalog:",
"typescript": "catalog:",
"@typescript/native": "catalog:typescript-tooling",
"typescript": "catalog:typescript-tooling",
"unplugin-icons": "catalog:frontend",
"vite": "catalog:",
"vite-plugin-singlefile": "catalog:",
+2 -2
View File
@@ -1,9 +1,9 @@
{
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.json"],
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.go.json"],
"compilerOptions": {
"composite": true,
"module": "CommonJS",
"moduleResolution": "node",
"moduleResolution": "bundler",
"noEmit": false,
"rootDir": "src",
"outDir": "dist"
+2 -3
View File
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"noEmit": true,
"module": "ESNext",
@@ -15,9 +15,8 @@
"../../frontend/@n8n/design-system/src/shims-modules.d.ts"
],
"skipLibCheck": true,
"baseUrl": ".",
"paths": {
"@mcp-apps/*": ["src/*"],
"@mcp-apps/*": ["./src/*"],
"@n8n/design-system*": ["../../frontend/@n8n/design-system/src*"]
}
},
@@ -29,7 +29,8 @@
"@vitejs/plugin-vue": "catalog:frontend",
"@vue/test-utils": "catalog:frontend",
"unplugin-icons": "catalog:frontend",
"typescript": "catalog:",
"@typescript/native": "catalog:typescript-tooling",
"typescript": "catalog:typescript-tooling",
"vite": "catalog:",
"vite-svg-loader": "catalog:frontend",
"vitest": "catalog:"
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"rootDir": "src",
"outDir": "dist",
+1 -1
View File
@@ -29,7 +29,7 @@
"@n8n/typescript-config": "workspace:*",
"@n8n/vitest-config": "workspace:*",
"@vitest/coverage-v8": "catalog:",
"typescript": "catalog:",
"typescript": "catalog:typescript",
"vite": "catalog:",
"vitest": "catalog:",
"vitest-mock-extended": "catalog:"
@@ -1,5 +1,5 @@
{
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.json"],
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.go.json"],
"compilerOptions": {
"composite": true,
"rootDir": "src",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"types": ["node", "vitest/globals", "vite/client"],
"paths": {
@@ -19,7 +19,7 @@
"@typescript-eslint/parser": "^8.35.0",
"eslint-plugin-n8n-nodes-base": "catalog:",
"semver": "catalog:",
"typescript": "catalog:",
"typescript": "catalog:typescript",
"tmp": "0.2.4"
},
"devDependencies": {
+1 -1
View File
@@ -44,7 +44,7 @@
"@types/luxon": "catalog:",
"@vitest/coverage-v8": "catalog:",
"fast-check": "catalog:",
"typescript": "catalog:",
"typescript": "catalog:typescript",
"vitest": "catalog:",
"vitest-mock-extended": "catalog:"
},
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.json"],
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.go.json"],
"compilerOptions": {
"composite": true,
"rootDir": "src",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"types": ["node", "vitest/globals"],
"paths": {
+1 -1
View File
@@ -35,7 +35,7 @@
},
"devDependencies": {
"@n8n/typescript-config": "workspace:*",
"typescript": "catalog:",
"typescript": "catalog:typescript",
"rimraf": "catalog:",
"@n8n/vitest-config": "workspace:*",
"@vitest/coverage-v8": "catalog:",
+1 -3
View File
@@ -1,9 +1,8 @@
{
"compilerOptions": {
"ignoreDeprecations": "6.0",
"target": "ES2015",
"module": "ESNext",
"moduleResolution": "node",
"moduleResolution": "bundler",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": false,
@@ -11,7 +10,6 @@
"rootDir": "src",
"declaration": true,
"declarationMap": true,
"downlevelIteration": true,
"skipLibCheck": true,
"types": ["node", "vitest/globals"]
},
+1 -1
View File
@@ -59,7 +59,7 @@
"@types/luxon": "catalog:",
"@types/ws": "catalog:",
"@vitest/coverage-v8": "catalog:",
"typescript": "catalog:",
"typescript": "catalog:typescript",
"vite": "catalog:",
"vitest": "catalog:",
"vitest-mock-extended": "catalog:"
+1 -1
View File
@@ -95,7 +95,7 @@ void (async function start() {
const { enabled, host, port } = config.baseRunnerConfig.healthcheckServer;
if (enabled) {
const { HealthCheckServer } = await import('./health-check-server');
const { HealthCheckServer } = await import('./health-check-server.js');
healthCheckServer = new HealthCheckServer();
await healthCheckServer.start(host, port);
}
@@ -1,5 +1,5 @@
{
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.json"],
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.go.json"],
"compilerOptions": {
"composite": true,
"rootDir": "src",
+2 -2
View File
@@ -1,7 +1,7 @@
{
"extends": [
"@n8n/typescript-config/tsconfig.common.json",
"@n8n/typescript-config/tsconfig.backend.json"
"@n8n/typescript-config/tsconfig.common.go.json",
"@n8n/typescript-config/tsconfig.backend.go.json"
],
"compilerOptions": {
"emitDecoratorMetadata": true,
+1 -1
View File
@@ -44,7 +44,7 @@
"vite": "catalog:",
"vitest": "catalog:",
"vitest-mock-extended": "catalog:",
"typescript": "catalog:"
"typescript": "catalog:typescript"
},
"dependencies": {
"ast-types": "^0.16.1",
+6 -4
View File
@@ -1,9 +1,8 @@
{
"compilerOptions": {
"ignoreDeprecations": "6.0",
"strict": true,
"module": "commonjs",
"moduleResolution": "node",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"target": "es2019",
"lib": ["es2019", "es2020", "es2022.error"],
"removeComments": true,
@@ -21,7 +20,10 @@
"sourceMap": true,
"skipLibCheck": true,
"tsBuildInfoFile": "dist/typecheck.tsbuildinfo",
"types": ["node", "vitest/globals", "vite/client"]
"types": ["node", "vitest/globals", "vite/client"],
"paths": {
"esprima-next": ["./node_modules/esprima-next/dist/esm/esprima.d.ts"]
}
},
"include": ["src/**/*.ts", "test/**/*.ts"],
"exclude": ["**/dist/**/*", "**/node_modules/**/*"]
+2 -2
View File
@@ -49,8 +49,8 @@
"@n8n/vitest-config": "workspace:*",
"@testing-library/jest-dom": "catalog:frontend",
"@testing-library/user-event": "catalog:frontend",
"tsdown": "catalog:",
"typescript": "catalog:",
"tsdown": "catalog:typescript",
"typescript": "catalog:typescript",
"vite": "catalog:",
"vitest": "catalog:"
},
+1
View File
@@ -1,6 +1,7 @@
{
"extends": "@n8n/typescript-config/tsconfig.frontend.json",
"compilerOptions": {
"moduleResolution": "bundler",
"outDir": "dist",
"types": ["vite/client", "vitest/globals"],
"isolatedModules": true
+1 -1
View File
@@ -9,7 +9,7 @@
"dependencies": {},
"devDependencies": {
"@n8n/typescript-config": "workspace:*",
"typescript": "catalog:",
"typescript": "catalog:typescript",
"vite": "catalog:",
"vitest": "catalog:"
},
@@ -1,5 +1,5 @@
{
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.json"],
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.go.json"],
"compilerOptions": {
"composite": true,
"rootDir": ".",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"types": ["node"],
"module": "ESNext",
+1 -1
View File
@@ -94,7 +94,7 @@
"@types/lodash": "catalog:",
"@vitest/coverage-v8": "catalog:",
"adm-zip": "^0.5.16",
"typescript": "catalog:",
"typescript": "catalog:typescript",
"vitest": "catalog:"
},
"dependencies": {
@@ -362,7 +362,7 @@ describe('generate-types', () => {
beforeAll(async () => {
// Dynamic import to handle module not existing yet
try {
generateTypes = await import('../generate-types/generate-types');
generateTypes = await import('../generate-types/generate-types.js');
} catch {
// Module doesn't export functions yet - tests will fail as expected in TDD
}
@@ -5376,7 +5376,7 @@ describe('orchestrateGeneration', () => {
let mod: typeof GenerateTypesModule;
beforeAll(async () => {
mod = await import('../generate-types/generate-types');
mod = await import('../generate-types/generate-types.js');
// Cold module compilation can exceed the default 10s hook timeout on a
// loaded CI runner, so give the import ample headroom.
}, 30_000);
@@ -350,7 +350,7 @@ describe('workflowToMermaid', () => {
describe('ai-root shapes', () => {
it('classifies the extractor/classifier/sentiment chains as AI roots', async () => {
const { isAiRootNodeType, describeAiRootShape } = await import('./ai-root-shapes');
const { isAiRootNodeType, describeAiRootShape } = await import('./ai-root-shapes.js');
for (const type of [
'@n8n/n8n-nodes-langchain.informationExtractor',
@@ -369,7 +369,7 @@ describe('ai-root shapes', () => {
});
it('derives the structured envelope key from a with-parser schema', async () => {
const { findEnvelopeKey } = await import('./ai-root-shapes');
const { findEnvelopeKey } = await import('./ai-root-shapes.js');
const agentVariant = {
type: 'object',
@@ -455,7 +455,7 @@ describe('ai-root shapes', () => {
});
it('classifies the assistant and vendor LLM nodes as AI roots', async () => {
const { isAiRootNodeType, describeAiRootShape } = await import('./ai-root-shapes');
const { isAiRootNodeType, describeAiRootShape } = await import('./ai-root-shapes.js');
// Mirrors the editor's canonical AI_ROOT_NODE_TYPES list
// (evaluation.ee/evaluation.constants.ts).
@@ -20,7 +20,7 @@ describe('subnode factories', () => {
beforeAll(async () => {
try {
subnodeBuilders = await import('./subnode-builders');
subnodeBuilders = await import('./subnode-builders.js');
} catch {
// Module doesn't exist yet - tests will fail as expected in TDD
}
@@ -224,7 +224,7 @@ describe('SubnodeConfig type safety', () => {
beforeAll(async () => {
try {
subnodeBuilders = await import('./subnode-builders');
subnodeBuilders = await import('./subnode-builders.js');
} catch {
// Module doesn't exist yet
}
@@ -287,8 +287,8 @@ describe('subnode integration with node builder', () => {
beforeAll(async () => {
try {
subnodeBuilders = await import('./subnode-builders');
nodeBuilders = await import('./node-builder');
subnodeBuilders = await import('./subnode-builders.js');
nodeBuilders = await import('./node-builder.js');
} catch {
// Modules don't exist yet
}
@@ -355,7 +355,7 @@ describe('tool() with fromAi() support', () => {
beforeAll(async () => {
try {
subnodeBuilders = await import('./subnode-builders');
subnodeBuilders = await import('./subnode-builders.js');
} catch {
// Module doesn't exist yet
}
@@ -527,9 +527,9 @@ describe('subnode reuse across multiple parents', () => {
let workflowBuilders: typeof WorkflowBuilderModule;
beforeAll(async () => {
subnodeBuilders = await import('./subnode-builders');
nodeBuilders = await import('./node-builder');
workflowBuilders = await import('../../workflow-builder');
subnodeBuilders = await import('./subnode-builders.js');
nodeBuilders = await import('./node-builder.js');
workflowBuilders = await import('../../workflow-builder.js');
});
it('should connect same embedding to multiple parent nodes', () => {
@@ -220,7 +220,7 @@ describe('pluginRegistry singleton', () => {
it('returns the same instance on multiple imports', async () => {
// Import again to verify the module-level singleton is shared across imports
const { pluginRegistry: anotherRegistry } = await import('./registry');
const { pluginRegistry: anotherRegistry } = await import('./registry.js');
expect(anotherRegistry).toBe(pluginRegistry);
});
});
@@ -1,5 +1,5 @@
{
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.json"],
"extends": ["./tsconfig.json", "@n8n/typescript-config/tsconfig.build.go.json"],
"compilerOptions": {
"composite": true,
"rootDir": "src",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"extends": "@n8n/typescript-config/tsconfig.common.go.json",
"compilerOptions": {
"types": ["node", "vitest/globals"]
},
@@ -1,4 +1,5 @@
import { ApplicationError as ErrorsApplicationError } from '@n8n/errors';
import { ApplicationError } from 'n8n-workflow';
// This file is the compatibility boundary, exempt from the `no-application-error` lint rule.
+931 -82
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -217,6 +217,7 @@ catalogMode: strict
catalogs:
typescript:
typescript: 7.0.2
tsdown: ^0.22.8
# Side-by-side TS7: tsgo `tsc` for typecheck/build, plus the real TS6 JS API
# (as `typescript`) for tooling that needs the programmatic compiler API —
# e.g. @typescript-eslint/typescript-estree, which TS7 does not yet provide.
@@ -279,3 +280,5 @@ minimumReleaseAgeExclude:
- '@n8n_io/*'
- 'typescript'
- '@typescript/*'
- 'tsdown'
- 'rolldown-plugin-dts'
+184 -6
View File
@@ -1,6 +1,6 @@
# TypeScript 6 → 7 migration benchmarks
Generated 2026-07-16T08:25:04.413Z from `scripts/typescript-migration/results/`.
Generated 2026-07-16T10:36:32.332Z from `scripts/typescript-migration/results/`.
| Package | typecheck Δ | build Δ |
| --- | --- | --- |
@@ -10,7 +10,7 @@ Generated 2026-07-16T08:25:04.413Z from `scripts/typescript-migration/results/`.
| `@n8n/ai-workflow-builder` | -69.3% | -33.1% |
| `@n8n/api-types` | -64.6% | -66.6% |
| `@n8n/backend-common` | -57.0% | -54.5% |
| `@n8n/backend-network` | -57.0% | -54.9% |
| `@n8n/backend-network` | -59.8% | -55.9% |
| `@n8n/backend-test-utils` | -51.4% | -53.1% |
| `@n8n/chat-hub` | -50.4% | -50.5% |
| `@n8n/cli` | -45.7% | -45.7% |
@@ -22,20 +22,34 @@ Generated 2026-07-16T08:25:04.413Z from `scripts/typescript-migration/results/`.
| `@n8n/config` | -48.2% | -37.9% |
| `@n8n/constants` | -35.8% | -36.6% |
| `@n8n/crdt` | -40.8% | -41.0% |
| `@n8n/db` | -61.6% | -34.0% |
| `@n8n/decorators` | -56.6% | -53.5% |
| `@n8n/di` | -34.0% | -31.0% |
| `@n8n/engine` | -37.2% | -40.8% |
| `@n8n/errors` | -39.0% | -40.6% |
| `@n8n/eslint-config` | -71.1% | -61.5% |
| `@n8n/eslint-plugin-community-nodes` | -50.6% | -47.1% |
| `@n8n/expression-runtime` | -57.1% | -42.4% |
| `@n8n/extension-sdk` | — | -5.2% |
| `@n8n/imap` | -48.6% | -36.7% |
| `@n8n/instance-ai` | -70.0% | -40.3% |
| `@n8n/json-schema-to-zod` | -43.9% | -34.7% |
| `@n8n/local-gateway` | -46.1% | -42.1% |
| `@n8n/mcp-apps` | -12.4% | -20.2% |
| `@n8n/mcp-browser` | -57.6% | -55.6% |
| `@n8n/mcp-browser-extension` | -46.3% | +3.0% |
| `@n8n/n8n-benchmark` | -49.2% | -39.0% |
| `@n8n/n8n-nodes-langchain` | -74.2% | -21.6% |
| `@n8n/node-cli` | -55.3% | -48.3% |
| `@n8n/permissions` | -34.1% | -28.5% |
| `@n8n/scheduler` | -56.6% | -51.7% |
| `@n8n/stylelint-config` | -39.9% | -40.8% |
| `@n8n/task-runner` | -54.3% | -44.6% |
| `@n8n/tournament` | -32.0% | -34.8% |
| `@n8n/typeorm` | -37.9% | -68.7% |
| `@n8n/utils` | -49.8% | -19.6% |
| `@n8n/vitest-config` | -48.1% | -43.5% |
| `@n8n/workflow-sdk` | -67.1% | -63.3% |
| `n8n` | -75.5% | -71.3% |
```
@@ -114,12 +128,12 @@ build:
=== @n8n/backend-network — median times (Δ vs "before") ===
typecheck:
before 1.52s
after 656ms -868ms (-57.0%)
before 1.64s
after 659ms -980ms (-59.8%)
build:
before 1.28s
after 576ms -701ms (-54.9%)
before 1.39s
after 611ms -776ms (-55.9%)
```
```
@@ -250,6 +264,42 @@ build:
after 477ms -331ms (-41.0%)
```
```
=== @n8n/db — median times (Δ vs "before") ===
typecheck:
before 2.76s
after 1.06s -1701ms (-61.6%)
build:
before 3.05s
after 2.02s -1038ms (-34.0%)
```
```
=== @n8n/decorators — median times (Δ vs "before") ===
typecheck:
before 1.40s
after 606ms -790ms (-56.6%)
build:
before 1.26s
after 588ms -677ms (-53.5%)
```
```
=== @n8n/di — median times (Δ vs "before") ===
typecheck:
before 780ms
after 515ms -265ms (-34.0%)
build:
before 713ms
after 492ms -221ms (-31.0%)
```
```
=== @n8n/engine — median times (Δ vs "before") ===
@@ -310,6 +360,14 @@ build:
after 1.66s -1225ms (-42.4%)
```
```
=== @n8n/extension-sdk — median times (Δ vs "before") ===
build:
before 2.65s
after 2.51s -139ms (-5.2%)
```
```
=== @n8n/imap — median times (Δ vs "before") ===
@@ -358,6 +416,18 @@ build:
after 1.16s -844ms (-42.1%)
```
```
=== @n8n/mcp-apps — median times (Δ vs "before") ===
typecheck:
before 8.15s
after 7.14s -1011ms (-12.4%)
build:
before 3.62s
after 2.88s -731ms (-20.2%)
```
```
=== @n8n/mcp-browser — median times (Δ vs "before") ===
@@ -370,6 +440,18 @@ build:
after 597ms -749ms (-55.6%)
```
```
=== @n8n/mcp-browser-extension — median times (Δ vs "before") ===
typecheck:
before 984ms
after 528ms -456ms (-46.3%)
build:
before 2.80s
after 2.89s +84ms (+3.0%)
```
```
=== @n8n/n8n-benchmark — median times (Δ vs "before") ===
@@ -406,6 +488,66 @@ build:
after 911ms -851ms (-48.3%)
```
```
=== @n8n/permissions — median times (Δ vs "before") ===
typecheck:
before 965ms
after 636ms -329ms (-34.1%)
build:
before 918ms
after 656ms -262ms (-28.5%)
```
```
=== @n8n/scheduler — median times (Δ vs "before") ===
typecheck:
before 1.36s
after 590ms -771ms (-56.6%)
build:
before 1.14s
after 552ms -590ms (-51.7%)
```
```
=== @n8n/stylelint-config — median times (Δ vs "before") ===
typecheck:
before 781ms
after 469ms -312ms (-39.9%)
build:
before 790ms
after 468ms -322ms (-40.8%)
```
```
=== @n8n/task-runner — median times (Δ vs "before") ===
typecheck:
before 1.64s
after 749ms -890ms (-54.3%)
build:
before 1.55s
after 862ms -693ms (-44.6%)
```
```
=== @n8n/tournament — median times (Δ vs "before") ===
typecheck:
before 724ms
after 492ms -232ms (-32.0%)
build:
before 759ms
after 495ms -264ms (-34.8%)
```
```
=== @n8n/typeorm — median times (Δ vs "before") ===
@@ -418,6 +560,42 @@ build:
after 890ms -1949ms (-68.7%)
```
```
=== @n8n/utils — median times (Δ vs "before") ===
typecheck:
before 1.12s
after 562ms -558ms (-49.8%)
build:
before 911ms
after 732ms -179ms (-19.6%)
```
```
=== @n8n/vitest-config — median times (Δ vs "before") ===
typecheck:
before 950ms
after 493ms -457ms (-48.1%)
build:
before 898ms
after 507ms -391ms (-43.5%)
```
```
=== @n8n/workflow-sdk — median times (Δ vs "before") ===
typecheck:
before 2.42s
after 798ms -1625ms (-67.1%)
build:
before 1.91s
after 699ms -1207ms (-63.3%)
```
```
=== n8n — median times (Δ vs "before") ===
@@ -5,27 +5,27 @@
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-14T08:17:32.701Z",
"timestamp": "2026-07-16T10:06:30.845Z",
"tasks": {
"typecheck": {
"runsMs": [
1598,
1524,
1514
1779,
1577,
1639
],
"min": 1514,
"median": 1524,
"mean": 1545
"min": 1577,
"median": 1639,
"mean": 1665
},
"build": {
"runsMs": [
1302,
1262,
1277
1387,
1445,
1376
],
"min": 1262,
"median": 1277,
"mean": 1281
"min": 1376,
"median": 1387,
"mean": 1403
}
}
},
@@ -33,27 +33,27 @@
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-14T08:42:01.850Z",
"timestamp": "2026-07-16T10:08:15.231Z",
"tasks": {
"typecheck": {
"runsMs": [
656,
688,
625,
659
],
"min": 625,
"median": 656,
"mean": 646
"median": 659,
"mean": 657
},
"build": {
"runsMs": [
582,
576,
575
611,
616,
605
],
"min": 575,
"median": 576,
"mean": 578
"min": 605,
"median": 611,
"mean": 611
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/db",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:09:01.003Z",
"tasks": {
"typecheck": {
"runsMs": [
2761,
2678,
2849
],
"min": 2678,
"median": 2761,
"mean": 2763
},
"build": {
"runsMs": [
3053,
3707,
2791
],
"min": 2791,
"median": 3053,
"mean": 3184
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:11:40.914Z",
"tasks": {
"typecheck": {
"runsMs": [
1146,
1043,
1060
],
"min": 1043,
"median": 1060,
"mean": 1083
},
"build": {
"runsMs": [
1064,
2015,
2380
],
"min": 1064,
"median": 2015,
"mean": 1820
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/decorators",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:12:09.541Z",
"tasks": {
"typecheck": {
"runsMs": [
1444,
1396,
1373
],
"min": 1373,
"median": 1396,
"mean": 1404
},
"build": {
"runsMs": [
1278,
1252,
1265
],
"min": 1252,
"median": 1265,
"mean": 1265
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:13:02.187Z",
"tasks": {
"typecheck": {
"runsMs": [
655,
606,
602
],
"min": 602,
"median": 606,
"mean": 621
},
"build": {
"runsMs": [
588,
631,
572
],
"min": 572,
"median": 588,
"mean": 597
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/di",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:13:31.136Z",
"tasks": {
"typecheck": {
"runsMs": [
780,
780,
780
],
"min": 780,
"median": 780,
"mean": 780
},
"build": {
"runsMs": [
713,
716,
710
],
"min": 710,
"median": 713,
"mean": 713
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:15:01.891Z",
"tasks": {
"typecheck": {
"runsMs": [
542,
515,
485
],
"min": 485,
"median": 515,
"mean": 514
},
"build": {
"runsMs": [
492,
491,
500
],
"min": 491,
"median": 492,
"mean": 494
}
}
}
}
}
@@ -0,0 +1,41 @@
{
"package": "@n8n/extension-sdk",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:24:45.207Z",
"tasks": {
"build": {
"runsMs": [
4397,
2652,
2648
],
"min": 2648,
"median": 2652,
"mean": 3232
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:26:40.515Z",
"tasks": {
"build": {
"runsMs": [
3258,
2513,
2479
],
"min": 2479,
"median": 2513,
"mean": 2750
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/mcp-apps",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:27:47.067Z",
"tasks": {
"typecheck": {
"runsMs": [
8405,
7543,
8147
],
"min": 7543,
"median": 8147,
"mean": 8032
},
"build": {
"runsMs": [
3889,
3235,
3615
],
"min": 3235,
"median": 3615,
"mean": 3580
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:30:54.963Z",
"tasks": {
"typecheck": {
"runsMs": [
7398,
7136,
7054
],
"min": 7054,
"median": 7136,
"mean": 7196
},
"build": {
"runsMs": [
3397,
2884,
2883
],
"min": 2883,
"median": 2884,
"mean": 3054
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/mcp-browser-extension",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:16:01.941Z",
"tasks": {
"typecheck": {
"runsMs": [
918,
984,
1162
],
"min": 918,
"median": 984,
"mean": 1022
},
"build": {
"runsMs": [
3623,
2804,
2781
],
"min": 2781,
"median": 2804,
"mean": 3070
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T10:17:59.341Z",
"tasks": {
"typecheck": {
"runsMs": [
528,
501,
556
],
"min": 501,
"median": 528,
"mean": 529
},
"build": {
"runsMs": [
3636,
2888,
2877
],
"min": 2877,
"median": 2888,
"mean": 3133
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/permissions",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T08:51:01.528Z",
"tasks": {
"typecheck": {
"runsMs": [
1016,
956,
965
],
"min": 956,
"median": 965,
"mean": 979
},
"build": {
"runsMs": [
993,
918,
879
],
"min": 879,
"median": 918,
"mean": 930
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T08:51:37.138Z",
"tasks": {
"typecheck": {
"runsMs": [
639,
636,
607
],
"min": 607,
"median": 636,
"mean": 627
},
"build": {
"runsMs": [
656,
687,
596
],
"min": 596,
"median": 656,
"mean": 646
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/scheduler",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T08:53:01.463Z",
"tasks": {
"typecheck": {
"runsMs": [
1572,
1361,
1360
],
"min": 1360,
"median": 1361,
"mean": 1431
},
"build": {
"runsMs": [
1158,
1142,
1141
],
"min": 1141,
"median": 1142,
"mean": 1147
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T08:53:43.684Z",
"tasks": {
"typecheck": {
"runsMs": [
639,
583,
590
],
"min": 583,
"median": 590,
"mean": 604
},
"build": {
"runsMs": [
612,
545,
552
],
"min": 545,
"median": 552,
"mean": 570
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/stylelint-config",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T08:54:39.332Z",
"tasks": {
"typecheck": {
"runsMs": [
781,
793,
753
],
"min": 753,
"median": 781,
"mean": 776
},
"build": {
"runsMs": [
817,
778,
790
],
"min": 778,
"median": 790,
"mean": 795
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T08:55:38.571Z",
"tasks": {
"typecheck": {
"runsMs": [
469,
467,
480
],
"min": 467,
"median": 469,
"mean": 472
},
"build": {
"runsMs": [
457,
482,
468
],
"min": 457,
"median": 468,
"mean": 469
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/task-runner",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T08:56:23.946Z",
"tasks": {
"typecheck": {
"runsMs": [
1657,
1627,
1639
],
"min": 1627,
"median": 1639,
"mean": 1641
},
"build": {
"runsMs": [
1555,
1566,
1554
],
"min": 1554,
"median": 1555,
"mean": 1558
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T08:57:37.671Z",
"tasks": {
"typecheck": {
"runsMs": [
799,
749,
739
],
"min": 739,
"median": 749,
"mean": 762
},
"build": {
"runsMs": [
950,
862,
840
],
"min": 840,
"median": 862,
"mean": 884
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/tournament",
"runs": {
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T09:28:57.670Z",
"tasks": {
"typecheck": {
"runsMs": [
505,
492,
475
],
"min": 475,
"median": 492,
"mean": 491
},
"build": {
"runsMs": [
495,
504,
491
],
"min": 491,
"median": 495,
"mean": 496
}
}
},
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T08:59:29.660Z",
"tasks": {
"typecheck": {
"runsMs": [
724,
709,
728
],
"min": 709,
"median": 724,
"mean": 720
},
"build": {
"runsMs": [
764,
723,
759
],
"min": 723,
"median": 759,
"mean": 749
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/utils",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T09:33:42.675Z",
"tasks": {
"typecheck": {
"runsMs": [
1265,
1120,
1116
],
"min": 1116,
"median": 1120,
"mean": 1167
},
"build": {
"runsMs": [
1298,
911,
911
],
"min": 911,
"median": 911,
"mean": 1040
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T09:39:45.263Z",
"tasks": {
"typecheck": {
"runsMs": [
568,
562,
554
],
"min": 554,
"median": 562,
"mean": 561
},
"build": {
"runsMs": [
1758,
714,
732
],
"min": 714,
"median": 732,
"mean": 1068
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/vitest-config",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T09:46:09.399Z",
"tasks": {
"typecheck": {
"runsMs": [
1087,
891,
950
],
"min": 891,
"median": 950,
"mean": 976
},
"build": {
"runsMs": [
898,
895,
898
],
"min": 895,
"median": 898,
"mean": 897
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T09:46:55.861Z",
"tasks": {
"typecheck": {
"runsMs": [
498,
492,
493
],
"min": 492,
"median": 493,
"mean": 494
},
"build": {
"runsMs": [
509,
495,
507
],
"min": 495,
"median": 507,
"mean": 503
}
}
}
}
}
@@ -0,0 +1,61 @@
{
"package": "@n8n/workflow-sdk",
"runs": {
"before": {
"label": "before",
"tsVersion": "6.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T09:47:39.891Z",
"tasks": {
"typecheck": {
"runsMs": [
2825,
2423,
2384
],
"min": 2384,
"median": 2423,
"mean": 2544
},
"build": {
"runsMs": [
1847,
2391,
1906
],
"min": 1847,
"median": 1906,
"mean": 2048
}
}
},
"after": {
"label": "after",
"tsVersion": "7.0.2",
"node": "v24.13.0",
"timestamp": "2026-07-16T09:50:01.066Z",
"tasks": {
"typecheck": {
"runsMs": [
798,
823,
763
],
"min": 763,
"median": 798,
"mean": 795
},
"build": {
"runsMs": [
699,
698,
751
],
"min": 698,
"median": 699,
"mean": 716
}
}
}
}
}