diff --git a/packages/cli/src/NodeTypes.ts b/packages/cli/src/NodeTypes.ts index 8bb2335355..0f1d6ebddc 100644 --- a/packages/cli/src/NodeTypes.ts +++ b/packages/cli/src/NodeTypes.ts @@ -10,6 +10,9 @@ import { NodeHelpers } from 'n8n-workflow'; import { Service } from 'typedi'; import { RESPONSE_ERROR_MESSAGES } from './constants'; import { LoadNodesAndCredentials } from './LoadNodesAndCredentials'; +import { join, dirname } from 'path'; +import { readdir } from 'fs/promises'; +import type { Dirent } from 'fs'; @Service() export class NodeTypes implements INodeTypes { @@ -78,4 +81,46 @@ export class NodeTypes implements INodeTypes { private get knownNodes() { return this.nodesAndCredentials.known.nodes; } + + async getNodeTranslationPath({ + nodeSourcePath, + longNodeType, + locale, + }: { + nodeSourcePath: string; + longNodeType: string; + locale: string; + }) { + const nodeDir = dirname(nodeSourcePath); + const maxVersion = await this.getMaxVersion(nodeDir); + const nodeType = longNodeType.replace('n8n-nodes-base.', ''); + + return maxVersion + ? join(nodeDir, `v${maxVersion}`, 'translations', locale, `${nodeType}.json`) + : join(nodeDir, 'translations', locale, `${nodeType}.json`); + } + + private async getMaxVersion(dir: string) { + const entries = await readdir(dir, { withFileTypes: true }); + + const dirnames = entries.reduce((acc, cur) => { + if (this.isVersionedDirname(cur)) acc.push(cur.name); + return acc; + }, []); + + if (!dirnames.length) return null; + + return Math.max(...dirnames.map((d) => parseInt(d.charAt(1), 10))); + } + + private isVersionedDirname(dirent: Dirent) { + if (!dirent.isDirectory()) return false; + + const ALLOWED_VERSIONED_DIRNAME_LENGTH = [2, 3]; // e.g. v1, v10 + + return ( + ALLOWED_VERSIONED_DIRNAME_LENGTH.includes(dirent.name.length) && + dirent.name.toLowerCase().startsWith('v') + ); + } } diff --git a/packages/cli/src/TranslationHelpers.ts b/packages/cli/src/TranslationHelpers.ts deleted file mode 100644 index dd829534a6..0000000000 --- a/packages/cli/src/TranslationHelpers.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { join, dirname } from 'path'; -import { readdir } from 'fs/promises'; -import type { Dirent } from 'fs'; - -const ALLOWED_VERSIONED_DIRNAME_LENGTH = [2, 3]; // e.g. v1, v10 - -function isVersionedDirname(dirent: Dirent) { - if (!dirent.isDirectory()) return false; - - return ( - ALLOWED_VERSIONED_DIRNAME_LENGTH.includes(dirent.name.length) && - dirent.name.toLowerCase().startsWith('v') - ); -} - -async function getMaxVersion(from: string) { - const entries = await readdir(from, { withFileTypes: true }); - - const dirnames = entries.reduce((acc, cur) => { - if (isVersionedDirname(cur)) acc.push(cur.name); - return acc; - }, []); - - if (!dirnames.length) return null; - - return Math.max(...dirnames.map((d) => parseInt(d.charAt(1), 10))); -} - -/** - * Get the full path to a node translation file in `/dist`. - */ -export async function getNodeTranslationPath({ - nodeSourcePath, - longNodeType, - locale, -}: { - nodeSourcePath: string; - longNodeType: string; - locale: string; -}): Promise { - const nodeDir = dirname(nodeSourcePath); - const maxVersion = await getMaxVersion(nodeDir); - const nodeType = longNodeType.replace('n8n-nodes-base.', ''); - - return maxVersion - ? join(nodeDir, `v${maxVersion}`, 'translations', locale, `${nodeType}.json`) - : join(nodeDir, 'translations', locale, `${nodeType}.json`); -} diff --git a/packages/cli/src/controllers/nodeTypes.controller.ts b/packages/cli/src/controllers/nodeTypes.controller.ts index 675d0f9741..029f4d8790 100644 --- a/packages/cli/src/controllers/nodeTypes.controller.ts +++ b/packages/cli/src/controllers/nodeTypes.controller.ts @@ -3,7 +3,6 @@ import get from 'lodash/get'; import { Request } from 'express'; import type { INodeTypeDescription, INodeTypeNameVersion } from 'n8n-workflow'; import { Authorized, Post, RestController } from '@/decorators'; -import { getNodeTranslationPath } from '@/TranslationHelpers'; import { Config } from '@/config'; import { NodeTypes } from '@/NodeTypes'; @@ -35,7 +34,7 @@ export class NodeTypesController { nodeTypes: INodeTypeDescription[], ) => { const { description, sourcePath } = this.nodeTypes.getWithSourcePath(name, version); - const translationPath = await getNodeTranslationPath({ + const translationPath = await this.nodeTypes.getNodeTranslationPath({ nodeSourcePath: sourcePath, longNodeType: description.name, locale: defaultLocale,