From 894ed83efcc02cf179862830261e0a458f254561 Mon Sep 17 00:00:00 2001 From: Ricardo Georgel Date: Sat, 5 Jun 2021 14:33:12 -0300 Subject: [PATCH 001/252] Add Schema Registry to the Kafka consumer --- .../nodes/Kafka/KafkaTrigger.node.ts | 34 +++++++++++++++++++ packages/nodes-base/package.json | 1 + packages/nodes-base/tsconfig.json | 1 + 3 files changed, 36 insertions(+) diff --git a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts index 32f3b7a9c981b..ffc48ceea11cf 100644 --- a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts +++ b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts @@ -5,6 +5,8 @@ import { SASLOptions, } from 'kafkajs'; +import { SchemaRegistry } from '@kafkajs/confluent-schema-registry'; + import { ITriggerFunctions, } from 'n8n-core'; @@ -98,6 +100,27 @@ export class KafkaTrigger implements INodeType { default: 30000, description: 'The time to await a response in ms.', }, + { + displayName: 'Use Schema Registry', + name: 'useSchemaRegistry', + type: 'boolean', + default: false, + description: 'Use Apache Avro serialization format and Confluent\' wire formats.', + }, + { + displayName: 'Schema Registry URL', + name: 'schemaRegistryUrl', + type: 'string', + displayOptions: { + show: { + useSchemaRegistry: [ + true, + ], + }, + }, + default: '', + description: 'URL of the schema registry.', + }, ], }, ], @@ -147,6 +170,11 @@ export class KafkaTrigger implements INodeType { const options = this.getNodeParameter('options', {}) as IDataObject; + let registry: SchemaRegistry; + if (options.useSchemaRegistry) { + registry = new SchemaRegistry({ host: options.schemaRegistryUrl as string }); + } + const startConsumer = async () => { await consumer.run({ eachMessage: async ({ topic, message }) => { @@ -160,6 +188,12 @@ export class KafkaTrigger implements INodeType { } catch (error) { } } + if (options.useSchemaRegistry) { + try { + value = await registry.decode(message.value as Buffer); + } catch (error) { } + } + data.message = value; data.topic = topic; diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index a52a1781e6738..5780a74da4bbf 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -607,6 +607,7 @@ "typescript": "~3.9.7" }, "dependencies": { + "@kafkajs/confluent-schema-registry": "1.0.6", "@types/lossless-json": "^1.0.0", "@types/promise-ftp": "^1.3.4", "@types/snowflake-sdk": "^1.5.1", diff --git a/packages/nodes-base/tsconfig.json b/packages/nodes-base/tsconfig.json index cbcbf98937d3d..6edb1080a45e0 100644 --- a/packages/nodes-base/tsconfig.json +++ b/packages/nodes-base/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "lib": [ + "dom", "es2017", "es2019.array" ], From 4af53d1b951c81e3690d8619c305c73ed44e108d Mon Sep 17 00:00:00 2001 From: Ricardo Georgel Date: Sat, 5 Jun 2021 16:46:06 -0300 Subject: [PATCH 002/252] Add Schema Registry to the Kafka producer --- packages/nodes-base/nodes/Kafka/Kafka.node.ts | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Kafka/Kafka.node.ts b/packages/nodes-base/nodes/Kafka/Kafka.node.ts index 6270da679ace1..1763d1a85a260 100644 --- a/packages/nodes-base/nodes/Kafka/Kafka.node.ts +++ b/packages/nodes-base/nodes/Kafka/Kafka.node.ts @@ -6,6 +6,8 @@ import { TopicMessages, } from 'kafkajs'; +import { SchemaRegistry } from '@kafkajs/confluent-schema-registry'; + import { IExecuteFunctions, } from 'n8n-core'; @@ -74,6 +76,43 @@ export class Kafka implements INodeType { type: 'boolean', default: false, }, + { + displayName: 'Use Schema Registry', + name: 'useSchemaRegistry', + type: 'boolean', + default: false, + description: 'Use Apache Avro serialization format and Confluent\' wire formats.', + }, + { + displayName: 'Schema Registry URL', + name: 'schemaRegistryUrl', + type: 'string', + required: true, + displayOptions: { + show: { + useSchemaRegistry: [ + true, + ], + }, + }, + default: '', + description: 'URL of the schema registry.', + }, + { + displayName: 'Event Name', + name: 'eventName', + type: 'string', + required: true, + displayOptions: { + show: { + useSchemaRegistry: [ + true, + ], + }, + }, + default: '', + description: 'Namespace and Name of Schema in Schema Registry (namespace.name).', + }, { displayName: 'Headers', name: 'headersUi', @@ -170,6 +209,8 @@ export class Kafka implements INodeType { const options = this.getNodeParameter('options', 0) as IDataObject; const sendInputData = this.getNodeParameter('sendInputData', 0) as boolean; + const useSchemaRegistry = this.getNodeParameter('useSchemaRegistry', 0) as boolean; + const timeout = options.timeout as number; let compression = CompressionTypes.None; @@ -211,7 +252,7 @@ export class Kafka implements INodeType { await producer.connect(); - let message: string; + let message: string | Buffer; for (let i = 0; i < length; i++) { if (sendInputData === true) { @@ -220,6 +261,18 @@ export class Kafka implements INodeType { message = this.getNodeParameter('message', i) as string; } + if (useSchemaRegistry) { + try { + const schemaRegistryUrl = this.getNodeParameter('schemaRegistryUrl', 0) as string; + const eventName = this.getNodeParameter('eventName', 0) as string; + + const registry = new SchemaRegistry({ host: schemaRegistryUrl }); + const id = await registry.getLatestSchemaId(eventName); + + message = await registry.encode(id, JSON.parse(message)); + } catch (error) {} + } + const topic = this.getNodeParameter('topic', i) as string; const jsonParameters = this.getNodeParameter('jsonParameters', i) as boolean; From e5e09293326698db6613b477103a9c0dddf4e4df Mon Sep 17 00:00:00 2001 From: Ricardo Georgel Date: Sat, 5 Jun 2021 18:48:00 -0300 Subject: [PATCH 003/252] Move useSchemaRegistry out of the options to be easier to see the extra fields --- .../nodes/Kafka/KafkaTrigger.node.ts | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts index ffc48ceea11cf..c2ab8db7516db 100644 --- a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts +++ b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts @@ -58,6 +58,28 @@ export class KafkaTrigger implements INodeType { placeholder: 'n8n-kafka', description: 'ID of the consumer group.', }, + { + displayName: 'Use Schema Registry', + name: 'useSchemaRegistry', + type: 'boolean', + default: false, + description: 'Use Apache Avro serialization format and Confluent\' wire formats.', + }, + { + displayName: 'Schema Registry URL', + name: 'schemaRegistryUrl', + type: 'string', + required: true, + displayOptions: { + show: { + useSchemaRegistry: [ + true, + ], + }, + }, + default: '', + description: 'URL of the schema registry.', + }, { displayName: 'Options', name: 'options', @@ -100,27 +122,6 @@ export class KafkaTrigger implements INodeType { default: 30000, description: 'The time to await a response in ms.', }, - { - displayName: 'Use Schema Registry', - name: 'useSchemaRegistry', - type: 'boolean', - default: false, - description: 'Use Apache Avro serialization format and Confluent\' wire formats.', - }, - { - displayName: 'Schema Registry URL', - name: 'schemaRegistryUrl', - type: 'string', - displayOptions: { - show: { - useSchemaRegistry: [ - true, - ], - }, - }, - default: '', - description: 'URL of the schema registry.', - }, ], }, ], @@ -170,9 +171,13 @@ export class KafkaTrigger implements INodeType { const options = this.getNodeParameter('options', {}) as IDataObject; + const useSchemaRegistry = this.getNodeParameter('useSchemaRegistry', 0) as boolean; + + const schemaRegistryUrl = this.getNodeParameter('schemaRegistryUrl', 0) as string; + let registry: SchemaRegistry; - if (options.useSchemaRegistry) { - registry = new SchemaRegistry({ host: options.schemaRegistryUrl as string }); + if (useSchemaRegistry) { + registry = new SchemaRegistry({ host: schemaRegistryUrl }); } const startConsumer = async () => { From 87b0e9992323dbd259d52f09199624b54aa06797 Mon Sep 17 00:00:00 2001 From: Ricardo Georgel Date: Sat, 5 Jun 2021 21:22:32 -0300 Subject: [PATCH 004/252] fix typo options.useSchemaRegistry -> useSchemaRegistry --- packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts index c2ab8db7516db..c4587beca3371 100644 --- a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts +++ b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts @@ -193,7 +193,7 @@ export class KafkaTrigger implements INodeType { } catch (error) { } } - if (options.useSchemaRegistry) { + if (useSchemaRegistry) { try { value = await registry.decode(message.value as Buffer); } catch (error) { } From 23b9e7bbe151e2edd9436619c19d3fd11f6d9b80 Mon Sep 17 00:00:00 2001 From: Ricardo Georgel Date: Sun, 27 Jun 2021 15:18:58 -0300 Subject: [PATCH 005/252] Add option to return the headers of the message --- .../nodes-base/nodes/Kafka/KafkaTrigger.node.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts index c4587beca3371..10a003422316d 100644 --- a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts +++ b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts @@ -122,6 +122,13 @@ export class KafkaTrigger implements INodeType { default: 30000, description: 'The time to await a response in ms.', }, + { + displayName: 'Return headers', + name: 'returnHeaders', + type: 'boolean', + default: false, + description: 'Return the headers received from Kafka', + }, ], }, ], @@ -199,6 +206,16 @@ export class KafkaTrigger implements INodeType { } catch (error) { } } + if (options.returnHeaders) { + const headers: {[key: string]: string} = {}; + for (const key in message.headers) { + const header = message.headers[key]; + headers[key] = header?.toString('utf8') || ''; + } + + data.headers = headers; + } + data.message = value; data.topic = topic; From 882d1eca8e5087ddab3ce6ef0432f926fa7ac87e Mon Sep 17 00:00:00 2001 From: Ricardo Georgel Date: Fri, 2 Jul 2021 13:24:28 -0300 Subject: [PATCH 006/252] PR Suggestions --- packages/nodes-base/nodes/Kafka/Kafka.node.ts | 8 +++++--- packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts | 10 +++------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/nodes-base/nodes/Kafka/Kafka.node.ts b/packages/nodes-base/nodes/Kafka/Kafka.node.ts index 1763d1a85a260..473103d4ecddf 100644 --- a/packages/nodes-base/nodes/Kafka/Kafka.node.ts +++ b/packages/nodes-base/nodes/Kafka/Kafka.node.ts @@ -81,7 +81,7 @@ export class Kafka implements INodeType { name: 'useSchemaRegistry', type: 'boolean', default: false, - description: 'Use Apache Avro serialization format and Confluent\' wire formats.', + description: 'Use Confluent Schema Registry.', }, { displayName: 'Schema Registry URL', @@ -95,7 +95,7 @@ export class Kafka implements INodeType { ], }, }, - default: '', + default: 'https://schema-registry-domain:8081', description: 'URL of the schema registry.', }, { @@ -270,7 +270,9 @@ export class Kafka implements INodeType { const id = await registry.getLatestSchemaId(eventName); message = await registry.encode(id, JSON.parse(message)); - } catch (error) {} + } catch (exception) { + throw new NodeOperationError(this.getNode(), 'Verify your Schema Registry configuration'); + } } const topic = this.getNodeParameter('topic', i) as string; diff --git a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts index 10a003422316d..a6ffb37c969be 100644 --- a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts +++ b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts @@ -63,7 +63,7 @@ export class KafkaTrigger implements INodeType { name: 'useSchemaRegistry', type: 'boolean', default: false, - description: 'Use Apache Avro serialization format and Confluent\' wire formats.', + description: 'Use Confluent Schema Registry.', }, { displayName: 'Schema Registry URL', @@ -77,7 +77,7 @@ export class KafkaTrigger implements INodeType { ], }, }, - default: '', + default: 'https://schema-registry-domain:8081', description: 'URL of the schema registry.', }, { @@ -182,11 +182,6 @@ export class KafkaTrigger implements INodeType { const schemaRegistryUrl = this.getNodeParameter('schemaRegistryUrl', 0) as string; - let registry: SchemaRegistry; - if (useSchemaRegistry) { - registry = new SchemaRegistry({ host: schemaRegistryUrl }); - } - const startConsumer = async () => { await consumer.run({ eachMessage: async ({ topic, message }) => { @@ -202,6 +197,7 @@ export class KafkaTrigger implements INodeType { if (useSchemaRegistry) { try { + const registry = new SchemaRegistry({ host: schemaRegistryUrl }); value = await registry.decode(message.value as Buffer); } catch (error) { } } From 7239e4f355aaa437aa6bb9a640024d57d2670e5d Mon Sep 17 00:00:00 2001 From: Ricardo Georgel Date: Mon, 5 Jul 2021 11:54:37 -0300 Subject: [PATCH 007/252] PR suggestions - add placeholder --- packages/nodes-base/nodes/Kafka/Kafka.node.ts | 3 ++- packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/nodes/Kafka/Kafka.node.ts b/packages/nodes-base/nodes/Kafka/Kafka.node.ts index 473103d4ecddf..55bd5dc735d74 100644 --- a/packages/nodes-base/nodes/Kafka/Kafka.node.ts +++ b/packages/nodes-base/nodes/Kafka/Kafka.node.ts @@ -95,7 +95,8 @@ export class Kafka implements INodeType { ], }, }, - default: 'https://schema-registry-domain:8081', + placeholder: 'https://schema-registry-domain:8081', + default: '', description: 'URL of the schema registry.', }, { diff --git a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts index a6ffb37c969be..7640bcd7fc72b 100644 --- a/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts +++ b/packages/nodes-base/nodes/Kafka/KafkaTrigger.node.ts @@ -77,7 +77,8 @@ export class KafkaTrigger implements INodeType { ], }, }, - default: 'https://schema-registry-domain:8081', + placeholder: 'https://schema-registry-domain:8081', + default: '', description: 'URL of the schema registry.', }, { From c63f365a658031fcb51202f062fe3e66885f9058 Mon Sep 17 00:00:00 2001 From: Arpad Gabor Date: Sat, 23 Oct 2021 18:38:46 +0300 Subject: [PATCH 008/252] feat: replace function node code editor with monaco --- packages/editor-ui/package.json | 4 +- .../editor-ui/src/components/CodeEdit.vue | 128 ++++++++++++------ .../src/components/ParameterInput.vue | 4 +- packages/editor-ui/vue.config.js | 5 + 4 files changed, 97 insertions(+), 44 deletions(-) diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 2f381b5740b62..69eb7c1521258 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -27,6 +27,7 @@ "dependencies": { "@fontsource/open-sans": "^4.5.0", "n8n-design-system": "~0.5.0", + "monaco-editor": "^0.29.1", "timeago.js": "^4.0.2", "v-click-outside": "^3.1.2", "vue-fragment": "^1.5.2" @@ -72,11 +73,12 @@ "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", "n8n-workflow": "~0.73.0", - "sass": "^1.26.5", + "monaco-editor-webpack-plugin": "^5.0.0", "normalize-wheel": "^1.0.1", "prismjs": "^1.17.1", "quill": "^2.0.0-dev.3", "quill-autoformat": "^0.1.1", + "sass": "^1.26.5", "sass-loader": "^8.0.2", "string-template-parser": "^1.2.6", "ts-jest": "^26.3.0", diff --git a/packages/editor-ui/src/components/CodeEdit.vue b/packages/editor-ui/src/components/CodeEdit.vue index fb1c02521de02..85c7cc1c25691 100644 --- a/packages/editor-ui/src/components/CodeEdit.vue +++ b/packages/editor-ui/src/components/CodeEdit.vue @@ -1,61 +1,107 @@ diff --git a/packages/editor-ui/src/components/ParameterInput.vue b/packages/editor-ui/src/components/ParameterInput.vue index 5ea58f5f4c6c6..30008448add2a 100644 --- a/packages/editor-ui/src/components/ParameterInput.vue +++ b/packages/editor-ui/src/components/ParameterInput.vue @@ -13,7 +13,7 @@ />
- +
@@ -597,7 +597,7 @@ export default mixins( parameter_field_type: this.parameter.type, new_expression: !this.isValueExpression, workflow_id: this.$store.getters.workflowId, - }); + }); } }, closeTextEditDialog () { diff --git a/packages/editor-ui/vue.config.js b/packages/editor-ui/vue.config.js index d1233395fec73..ef36eb00bc67e 100644 --- a/packages/editor-ui/vue.config.js +++ b/packages/editor-ui/vue.config.js @@ -1,3 +1,5 @@ +const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); + module.exports = { chainWebpack: config => config.resolve.symlinks(false), // transpileDependencies: [ @@ -13,6 +15,9 @@ module.exports = { devServer: { disableHostCheck: true, }, + plugins: [ + new MonacoWebpackPlugin(), + ], }, css: { loaderOptions: { From 7a020d079fa564f895564c14339df2617ce470f5 Mon Sep 17 00:00:00 2001 From: Arpad Gabor Date: Sat, 23 Oct 2021 18:39:34 +0300 Subject: [PATCH 009/252] fix: set autocomplete data as empty array --- packages/editor-ui/src/components/CodeEdit.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor-ui/src/components/CodeEdit.vue b/packages/editor-ui/src/components/CodeEdit.vue index 85c7cc1c25691..b3cfac943ebad 100644 --- a/packages/editor-ui/src/components/CodeEdit.vue +++ b/packages/editor-ui/src/components/CodeEdit.vue @@ -71,7 +71,7 @@ export default mixins(genericHelpers).extend({ loadAutocompleteData(): void { const executedWorkflow: IExecutionResponse | null = this.$store.getters.getWorkflowExecution; - let autocompleteData: INodeExecutionData[] = [{ json: { myNewField: 2 } }]; + let autocompleteData: INodeExecutionData[] = []; if (executedWorkflow) { const lastNodeExecuted = executedWorkflow.data.resultData.lastNodeExecuted; From 62f0899e100b11ba45509df796c1c5d342b1c78d Mon Sep 17 00:00:00 2001 From: Arpad Gabor Date: Sat, 23 Oct 2021 18:48:45 +0300 Subject: [PATCH 010/252] fix: forgot readonly to editor --- packages/editor-ui/src/components/CodeEdit.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/editor-ui/src/components/CodeEdit.vue b/packages/editor-ui/src/components/CodeEdit.vue index b3cfac943ebad..3a32ed78627bf 100644 --- a/packages/editor-ui/src/components/CodeEdit.vue +++ b/packages/editor-ui/src/components/CodeEdit.vue @@ -54,6 +54,7 @@ export default mixins(genericHelpers).extend({ value: this.value, language: 'javascript', tabSize: 2, + readOnly: this.isReadOnly, }); this.monacoInstance.onDidChangeModelContent((ev) => { From f811992527e15aa310fcef1603a69776adff6a7c Mon Sep 17 00:00:00 2001 From: Arpad Gabor Date: Sat, 23 Oct 2021 19:06:02 +0300 Subject: [PATCH 011/252] fix: monaco build problems --- packages/editor-ui/src/components/CodeEdit.vue | 11 +++++------ packages/editor-ui/vue.config.js | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/editor-ui/src/components/CodeEdit.vue b/packages/editor-ui/src/components/CodeEdit.vue index 3a32ed78627bf..b5bfd9a94e4b4 100644 --- a/packages/editor-ui/src/components/CodeEdit.vue +++ b/packages/editor-ui/src/components/CodeEdit.vue @@ -57,12 +57,11 @@ export default mixins(genericHelpers).extend({ readOnly: this.isReadOnly, }); - this.monacoInstance.onDidChangeModelContent((ev) => { - if (this.monacoInstance) { - const model = this.monacoInstance.getModel(); - if (model) { - this.$emit('valueChanged', model.getValue()); - } + this.monacoInstance.onDidChangeModelContent(() => { + const model = this.monacoInstance!.getModel(); + + if (model) { + this.$emit('valueChanged', model.getValue()); } }); diff --git a/packages/editor-ui/vue.config.js b/packages/editor-ui/vue.config.js index ef36eb00bc67e..6f2e10804cfc2 100644 --- a/packages/editor-ui/vue.config.js +++ b/packages/editor-ui/vue.config.js @@ -16,7 +16,7 @@ module.exports = { disableHostCheck: true, }, plugins: [ - new MonacoWebpackPlugin(), + new MonacoWebpackPlugin({ languages: ['javascript', 'html', 'typescript'] }), ], }, css: { @@ -28,5 +28,5 @@ module.exports = { }, }, }, - publicPath: process.env.VUE_APP_PUBLIC_PATH ? process.env.VUE_APP_PUBLIC_PATH : '/', + publicPath: process.env.VUE_APP_PUBLIC_PATH && process.env.VUE_APP_PUBLIC_PATH !== '/%BASE_PATH%/' ? process.env.VUE_APP_PUBLIC_PATH : '/', }; From 1de9ecf4ec625685d26faea9c70ea8d5f3bc9dda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Tue, 9 Nov 2021 09:59:48 +0100 Subject: [PATCH 012/252] :sparkles: Set up i18n --- .gitignore | 3 - .vscode/settings.json | 3 + packages/cli/config/index.ts | 7 + packages/cli/src/Interfaces.ts | 1 + packages/cli/src/Server.ts | 1 + packages/editor-ui/package.json | 3 +- packages/editor-ui/src/Interface.ts | 2 + packages/editor-ui/src/components/About.vue | 16 +- .../src/components/mixins/genericHelpers.ts | 3 +- .../src/components/mixins/translate.ts | 203 +++++ packages/editor-ui/src/i18n/index.ts | 56 ++ packages/editor-ui/src/i18n/locales/de.ts | 787 ++++++++++++++++++ packages/editor-ui/src/i18n/locales/en.ts | 784 +++++++++++++++++ packages/editor-ui/src/main.ts | 2 + packages/editor-ui/src/modules/settings.ts | 1 + packages/editor-ui/src/store.ts | 7 + packages/editor-ui/src/views/NodeView.vue | 9 + packages/editor-ui/vue.config.js | 11 +- vetur.config.js | 5 + 19 files changed, 1891 insertions(+), 13 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 packages/editor-ui/src/components/mixins/translate.ts create mode 100644 packages/editor-ui/src/i18n/index.ts create mode 100644 packages/editor-ui/src/i18n/locales/de.ts create mode 100644 packages/editor-ui/src/i18n/locales/en.ts create mode 100644 vetur.config.js diff --git a/.gitignore b/.gitignore index 359d346deaafc..f1cb86f2ed4c0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,8 +10,5 @@ yarn.lock google-generated-credentials.json _START_PACKAGE .env -.vscode/* -!.vscode/extensions.json .idea -vetur.config.js nodelinter.config.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000..4e85cee348724 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "vetur.experimental.templateInterpolationService": true, +} \ No newline at end of file diff --git a/packages/cli/config/index.ts b/packages/cli/config/index.ts index c4b822ffa8573..c06c1e200e018 100644 --- a/packages/cli/config/index.ts +++ b/packages/cli/config/index.ts @@ -689,6 +689,13 @@ const config = convict({ }, }, }, + + defaultLocale: { + doc: 'Default locale for the UI', + format: String, + default: 'en', + env: 'N8N_DEFAULT_LOCALE', + }, }); // Overwrite default configuration with settings which got defined in diff --git a/packages/cli/src/Interfaces.ts b/packages/cli/src/Interfaces.ts index d5c11a8f3f249..0424f9751b9f7 100644 --- a/packages/cli/src/Interfaces.ts +++ b/packages/cli/src/Interfaces.ts @@ -394,6 +394,7 @@ export interface IN8nUISettings { instanceId: string; telemetry: ITelemetrySettings; personalizationSurvey: IPersonalizationSurvey; + defaultLocale: string; } export interface IPersonalizationSurveyAnswers { diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts index e9de494f44a6a..2f095006f6808 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/Server.ts @@ -280,6 +280,7 @@ class App { personalizationSurvey: { shouldShow: false, }, + defaultLocale: config.get('defaultLocale'), }; } diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 60e7485c891c3..94b10f17a332d 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -29,7 +29,8 @@ "n8n-design-system": "~0.6.0", "timeago.js": "^4.0.2", "v-click-outside": "^3.1.2", - "vue-fragment": "^1.5.2" + "vue-fragment": "^1.5.2", + "vue-i18n": "^8.26.7" }, "devDependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.35", diff --git a/packages/editor-ui/src/Interface.ts b/packages/editor-ui/src/Interface.ts index 02fe67ec4f298..055603a4718b3 100644 --- a/packages/editor-ui/src/Interface.ts +++ b/packages/editor-ui/src/Interface.ts @@ -470,6 +470,7 @@ export interface IN8nUISettings { instanceId: string; personalizationSurvey?: IPersonalizationSurvey; telemetry: ITelemetrySettings; + defaultLocale: string; } export interface IWorkflowSettings extends IWorkflowSettingsWorkflow { @@ -583,6 +584,7 @@ export interface IRootState { activeActions: string[]; activeNode: string | null; baseUrl: string; + defaultLocale: string; endpointWebhook: string; endpointWebhookTest: string; executionId: string | null; diff --git a/packages/editor-ui/src/components/About.vue b/packages/editor-ui/src/components/About.vue index b2c079dbf2601..79c60f8213550 100644 --- a/packages/editor-ui/src/components/About.vue +++ b/packages/editor-ui/src/components/About.vue @@ -1,18 +1,18 @@