refactor: Move node i18n logic to NodeTypes (no-changelog) (#7035)

This commit is contained in:
Iván Ovejero 2023-08-29 10:46:24 +02:00 committed by GitHub
parent b716241b42
commit 53361d1d62
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 50 deletions

View file

@ -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<string[]>((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')
);
}
}

View file

@ -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<string[]>((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<string> {
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`);
}

View file

@ -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,