From 2da0c86e4dcc463e285316901cfeba4ce36bd49c Mon Sep 17 00:00:00 2001 From: Alex Grozav Date: Thu, 27 Mar 2025 17:22:04 +0200 Subject: [PATCH] refactor: Migrate nodes build system to `tsup` (no-changelog) (#14192) --- .../MemoryPostgresChat.node.ts | 2 +- .../VectorStorePGVector.node.ts | 2 +- packages/@n8n/nodes-langchain/package.json | 8 +-- .../@n8n/nodes-langchain/tsconfig.build.json | 6 ++- packages/@n8n/nodes-langchain/tsconfig.json | 10 +++- packages/@n8n/nodes-langchain/tsup.config.ts | 11 ++++ packages/@n8n/utils/package.json | 2 +- .../frontend/@n8n/composables/package.json | 2 +- packages/nodes-base/package.json | 5 +- .../nodes-base/scripts/copy-nodes-json.js | 12 +++++ packages/nodes-base/tsconfig.build.json | 7 +-- packages/nodes-base/tsconfig.json | 5 +- packages/nodes-base/tsup.config.ts | 53 +++++++++++++++++++ pnpm-lock.yaml | 13 +++-- pnpm-workspace.yaml | 2 +- 15 files changed, 117 insertions(+), 23 deletions(-) create mode 100644 packages/@n8n/nodes-langchain/tsup.config.ts create mode 100644 packages/nodes-base/scripts/copy-nodes-json.js create mode 100644 packages/nodes-base/tsup.config.ts diff --git a/packages/@n8n/nodes-langchain/nodes/memory/MemoryPostgresChat/MemoryPostgresChat.node.ts b/packages/@n8n/nodes-langchain/nodes/memory/MemoryPostgresChat/MemoryPostgresChat.node.ts index a62d06d7af..f0ba8e9c94 100644 --- a/packages/@n8n/nodes-langchain/nodes/memory/MemoryPostgresChat/MemoryPostgresChat.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/memory/MemoryPostgresChat/MemoryPostgresChat.node.ts @@ -1,7 +1,7 @@ /* eslint-disable n8n-nodes-base/node-dirname-against-convention */ import { PostgresChatMessageHistory } from '@langchain/community/stores/message/postgres'; import { BufferMemory, BufferWindowMemory } from 'langchain/memory'; -import { configurePostgres } from 'n8n-nodes-base/dist/nodes/Postgres/transport'; +import { configurePostgres } from 'n8n-nodes-base/dist/nodes/Postgres/transport/index'; import type { PostgresNodeCredentials } from 'n8n-nodes-base/dist/nodes/Postgres/v2/helpers/interfaces'; import { postgresConnectionTest } from 'n8n-nodes-base/dist/nodes/Postgres/v2/methods/credentialTest'; import type { diff --git a/packages/@n8n/nodes-langchain/nodes/vector_store/VectorStorePGVector/VectorStorePGVector.node.ts b/packages/@n8n/nodes-langchain/nodes/vector_store/VectorStorePGVector/VectorStorePGVector.node.ts index dc5c919cff..b218787102 100644 --- a/packages/@n8n/nodes-langchain/nodes/vector_store/VectorStorePGVector/VectorStorePGVector.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/vector_store/VectorStorePGVector/VectorStorePGVector.node.ts @@ -4,7 +4,7 @@ import { type PGVectorStoreArgs, } from '@langchain/community/vectorstores/pgvector'; import type { EmbeddingsInterface } from '@langchain/core/embeddings'; -import { configurePostgres } from 'n8n-nodes-base/dist/nodes/Postgres/transport'; +import { configurePostgres } from 'n8n-nodes-base/dist/nodes/Postgres/transport/index'; import type { PostgresNodeCredentials } from 'n8n-nodes-base/dist/nodes/Postgres/v2/helpers/interfaces'; import type { INodeProperties } from 'n8n-workflow'; import type pg from 'pg'; diff --git a/packages/@n8n/nodes-langchain/package.json b/packages/@n8n/nodes-langchain/package.json index 00a8e9862b..7683735059 100644 --- a/packages/@n8n/nodes-langchain/package.json +++ b/packages/@n8n/nodes-langchain/package.json @@ -7,12 +7,13 @@ "clean": "rimraf dist .turbo", "dev": "pnpm run watch", "typecheck": "tsc --noEmit", - "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && pnpm n8n-copy-static-files && pnpm n8n-generate-metadata", + "copy-nodes-json": "node ../../nodes-base/scripts/copy-nodes-json.js .", + "build": "tsup --tsconfig tsconfig.build.json && pnpm copy-nodes-json && tsc-alias -p tsconfig.build.json && pnpm n8n-copy-static-files && pnpm n8n-generate-metadata", "format": "biome format --write .", "format:check": "biome ci .", "lint": "eslint nodes credentials utils --quiet", "lintfix": "eslint nodes credentials utils --fix", - "watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-metadata\"", + "watch": "tsup --watch --tsconfig tsconfig.build.json --onSuccess \"pnpm copy-nodes-json && tsc-alias -p tsconfig.build.json && pnpm n8n-generate-metadata\"", "test": "jest", "test:dev": "jest --watch" }, @@ -134,7 +135,8 @@ "@types/pg": "^8.11.6", "@types/sanitize-html": "^2.11.0", "@types/temp": "^0.9.1", - "n8n-core": "workspace:*" + "n8n-core": "workspace:*", + "tsup": "catalog:" }, "dependencies": { "@aws-sdk/client-sso-oidc": "3.666.0", diff --git a/packages/@n8n/nodes-langchain/tsconfig.build.json b/packages/@n8n/nodes-langchain/tsconfig.build.json index 5cc2c8fe19..af4aa35622 100644 --- a/packages/@n8n/nodes-langchain/tsconfig.build.json +++ b/packages/@n8n/nodes-langchain/tsconfig.build.json @@ -6,10 +6,12 @@ }, "include": [ "credentials/**/*.ts", + "credentials/translations/**/*.json", "nodes/**/*.ts", "nodes/**/*.json", - "credentials/translations/**/*.json", - "types/*.ts" + "test/**/*.ts", + "types/**/*.ts", + "utils/**/*.ts" ], "exclude": ["nodes/**/*.test.ts", "test/**"] } diff --git a/packages/@n8n/nodes-langchain/tsconfig.json b/packages/@n8n/nodes-langchain/tsconfig.json index 1f77400235..50ebc586c9 100644 --- a/packages/@n8n/nodes-langchain/tsconfig.json +++ b/packages/@n8n/nodes-langchain/tsconfig.json @@ -4,6 +4,7 @@ "@n8n/typescript-config/tsconfig.backend.json" ], "compilerOptions": { + "baseUrl": ".", "paths": { "@utils/*": ["./utils/*"] }, @@ -11,7 +12,14 @@ // TODO: remove all options below this line "useUnknownInCatchVariables": false }, - "include": ["credentials/**/*", "nodes/**/*", "utils/**/*.ts", "nodes/**/*.json", "types/*.ts"], + "include": [ + "credentials/**/*.ts", + "nodes/**/*.ts", + "nodes/**/*.json", + "test/**/*.ts", + "types/**/*.ts", + "utils/**/*.ts" + ], "references": [ { "path": "../../workflow/tsconfig.build.json" }, { "path": "../../core/tsconfig.build.json" } diff --git a/packages/@n8n/nodes-langchain/tsup.config.ts b/packages/@n8n/nodes-langchain/tsup.config.ts new file mode 100644 index 0000000000..2792d7e10b --- /dev/null +++ b/packages/@n8n/nodes-langchain/tsup.config.ts @@ -0,0 +1,11 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { defineConfig } from 'tsup'; + +// eslint-disable-next-line import/no-default-export +export default defineConfig({ + entry: ['{credentials,nodes,test,types,utils}/**/*.ts', '!**/*.d.ts', '!**/*.test.ts'], + format: ['cjs'], + clean: true, + dts: false, + bundle: false, +}); diff --git a/packages/@n8n/utils/package.json b/packages/@n8n/utils/package.json index aee911b205..458fe77903 100644 --- a/packages/@n8n/utils/package.json +++ b/packages/@n8n/utils/package.json @@ -30,7 +30,7 @@ "@n8n/vitest-config": "workspace:*", "@testing-library/jest-dom": "catalog:frontend", "@testing-library/user-event": "catalog:frontend", - "tsup": "catalog:frontend", + "tsup": "catalog:", "typescript": "catalog:frontend", "vite": "catalog:frontend", "vitest": "catalog:frontend" diff --git a/packages/frontend/@n8n/composables/package.json b/packages/frontend/@n8n/composables/package.json index 9e8c48f5bb..b96a085164 100644 --- a/packages/frontend/@n8n/composables/package.json +++ b/packages/frontend/@n8n/composables/package.json @@ -35,7 +35,7 @@ "@vue/tsconfig": "catalog:frontend", "@vueuse/core": "catalog:frontend", "vue": "catalog:frontend", - "tsup": "catalog:frontend", + "tsup": "catalog:", "typescript": "catalog:frontend", "vite": "catalog:frontend", "vitest": "catalog:frontend", diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index beb4670c92..1fe4783f00 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -5,14 +5,15 @@ "main": "index.js", "scripts": { "clean": "rimraf dist .turbo", + "copy-nodes-json": "node scripts/copy-nodes-json.js .", "dev": "pnpm watch", "typecheck": "tsc --noEmit", - "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && pnpm n8n-copy-static-files && pnpm n8n-generate-translations && pnpm n8n-generate-metadata", + "build": "tsup --tsconfig tsconfig.build.json && pnpm copy-nodes-json && tsc-alias -p tsconfig.build.json && pnpm n8n-copy-static-files && pnpm n8n-generate-translations && pnpm n8n-generate-metadata", "format": "biome format --write .", "format:check": "biome ci .", "lint": "eslint nodes credentials utils test --quiet && node ./scripts/validate-load-options-methods.js", "lintfix": "eslint nodes credentials utils test --fix", - "watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-metadata\"", + "watch": "tsup --watch --tsconfig tsconfig.build.json --onSuccess \"pnpm copy-nodes-json && tsc-alias -p tsconfig.build.json && pnpm n8n-generate-metadata\"", "test": "jest" }, "files": [ diff --git a/packages/nodes-base/scripts/copy-nodes-json.js b/packages/nodes-base/scripts/copy-nodes-json.js new file mode 100644 index 0000000000..a56528a059 --- /dev/null +++ b/packages/nodes-base/scripts/copy-nodes-json.js @@ -0,0 +1,12 @@ +const glob = require('fast-glob'); +const fs = require('fs'); +const path = require('path'); + +function copyJsonFiles(baseDir) { + const files = glob.sync('nodes/**/*.node.json', { cwd: baseDir }); + for (const file of files) { + fs.copyFileSync(path.resolve(baseDir, file), path.resolve(baseDir, 'dist', file)); + } +} + +copyJsonFiles(process.argv[2]); diff --git a/packages/nodes-base/tsconfig.build.json b/packages/nodes-base/tsconfig.build.json index c1cf715705..389832c3dc 100644 --- a/packages/nodes-base/tsconfig.build.json +++ b/packages/nodes-base/tsconfig.build.json @@ -6,10 +6,11 @@ }, "include": [ "credentials/**/*.ts", + "credentials/translations/**/*.json", "nodes/**/*.ts", "nodes/**/*.json", - "credentials/translations/**/*.json", - "types/**/*.ts" + "types/**/*.ts", + "utils/**/*.ts" ], - "exclude": ["nodes/**/*.test.ts", "credentials/**/*.test.ts", "test/**"] + "exclude": ["nodes/**/*.test.ts", "credentials/**/*.test.ts", "utils/**/*.test.ts", "test/**"] } diff --git a/packages/nodes-base/tsconfig.json b/packages/nodes-base/tsconfig.json index f575be4fcd..3ed7ddd987 100644 --- a/packages/nodes-base/tsconfig.json +++ b/packages/nodes-base/tsconfig.json @@ -16,9 +16,10 @@ "include": [ "credentials/**/*.ts", "nodes/**/*.ts", + "nodes/**/*.json", "test/**/*.ts", - "utils/**/*.ts", - "types/**/*.ts" + "types/**/*.ts", + "utils/**/*.ts" ], "references": [ { "path": "../@n8n/imap/tsconfig.build.json" }, diff --git a/packages/nodes-base/tsup.config.ts b/packages/nodes-base/tsup.config.ts new file mode 100644 index 0000000000..35e1134891 --- /dev/null +++ b/packages/nodes-base/tsup.config.ts @@ -0,0 +1,53 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { defineConfig } from 'tsup'; +import glob from 'fast-glob'; +import { resolve } from 'path'; +import { readFile } from 'fs/promises'; + +const packagesDir = resolve(__dirname, '..'); +const aiNodesDir = resolve(packagesDir, '@n8n', 'nodes-langchain'); + +const aiNodesFiles = await glob('nodes/**/*.ts', { cwd: aiNodesDir }); +const aiNodesFilesContents = aiNodesFiles.map((filePath) => + readFile(resolve(aiNodesDir, filePath), 'utf-8'), +); + +// Files used in @n8n/nodes-langchain package +const aiNodesPackageImports = (await Promise.all(aiNodesFilesContents)).reduce( + (acc, fileContents) => { + const regex = /from\s+['"](n8n-nodes-base[^'"]+)['"]/g; + let match; + while ((match = regex.exec(fileContents)) !== null) { + acc.add(match[1]); + } + + return acc; + }, + new Set(), +); + +const aiNodesPackageDependencies = Array.from(aiNodesPackageImports).map( + (i) => i.replace('n8n-nodes-base/dist/', '') + '.ts', +); + +const commonIgnoredFiles = ['!**/*.d.ts', '!**/*.test.ts']; + +// eslint-disable-next-line import/no-default-export +export default defineConfig([ + { + entry: [ + '{credentials,nodes,test,types,utils}/**/*.ts', + ...commonIgnoredFiles, + ...aiNodesPackageDependencies.map((path) => `!${path}`), + ], + format: ['cjs'], + dts: false, + bundle: false, + }, + { + entry: [...aiNodesPackageDependencies, ...commonIgnoredFiles], + format: ['cjs'], + dts: true, + bundle: false, + }, +]); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1741fd40ed..7dd6960ffd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,6 +63,9 @@ catalogs: reflect-metadata: specifier: 0.2.2 version: 0.2.2 + tsup: + specifier: ^8.4.0 + version: 8.4.0 uuid: specifier: 10.0.0 version: 10.0.0 @@ -103,9 +106,6 @@ catalogs: highlight.js: specifier: ^11.8.0 version: 11.9.0 - tsup: - specifier: ^8.4.0 - version: 8.4.0 vite: specifier: ^6.2.0 version: 6.2.1 @@ -691,6 +691,9 @@ importers: n8n-core: specifier: workspace:* version: link:../../core + tsup: + specifier: 'catalog:' + version: 8.4.0(@microsoft/api-extractor@7.52.1(@types/node@18.16.16))(jiti@1.21.0)(postcss@8.5.3)(typescript@5.8.2) packages/@n8n/permissions: devDependencies: @@ -806,7 +809,7 @@ importers: specifier: catalog:frontend version: 14.6.1(@testing-library/dom@10.4.0) tsup: - specifier: catalog:frontend + specifier: 'catalog:' version: 8.4.0(@microsoft/api-extractor@7.52.1(@types/node@18.16.16))(jiti@1.21.0)(postcss@8.5.3)(typescript@5.8.2) typescript: specifier: ^5.8.2 @@ -1397,7 +1400,7 @@ importers: specifier: catalog:frontend version: 10.11.0(vue@3.5.13(typescript@5.8.2)) tsup: - specifier: catalog:frontend + specifier: 'catalog:' version: 8.4.0(@microsoft/api-extractor@7.52.1(@types/node@18.16.16))(jiti@1.21.0)(postcss@8.5.3)(typescript@5.8.2) typescript: specifier: ^5.8.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9c6b447dbf..c46586e86d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -24,6 +24,7 @@ catalog: nanoid: 3.3.8 picocolors: 1.0.1 reflect-metadata: 0.2.2 + tsup: ^8.4.0 uuid: 10.0.0 xml2js: 0.6.2 xss: 1.0.15 @@ -40,7 +41,6 @@ catalogs: '@vitest/coverage-v8': ^3.0.7 '@vitejs/plugin-vue': ^5.2.1 '@sentry/vue': ^8.33.1 - tsup: ^8.4.0 typescript: ^5.8.2 vite: ^6.2.0 vitest: ^3.0.7