This is an automated email from the ASF dual-hosted git repository. marat pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-karavan.git
The following commit(s) were added to refs/heads/main by this push: new 46049890 Crete Kamelet in VS Code #315 46049890 is described below commit 4604989047729a2780872d39d587cdaa1bc9ff78 Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Tue Oct 31 18:14:59 2023 -0400 Crete Kamelet in VS Code #315 --- karavan-vscode/package.json | 16 ++++++++++++++++ karavan-vscode/src/designerView.ts | 28 ++++++++++++++++++++++------ karavan-vscode/src/extension.ts | 10 +++++++++- karavan-vscode/src/openapiView.ts | 2 +- karavan-vscode/src/utils.ts | 21 ++++++++++++++++++--- 5 files changed, 66 insertions(+), 11 deletions(-) diff --git a/karavan-vscode/package.json b/karavan-vscode/package.json index fc243f81..02f67a60 100644 --- a/karavan-vscode/package.json +++ b/karavan-vscode/package.json @@ -41,6 +41,7 @@ ], "activationEvents": [ "onCommand:karavan.create-yaml", + "onCommand:karavan.create-kamelet", "onCommand:karavan.create-application", "onCommand:karavan.deploy", "onCommand:karavan.open", @@ -470,6 +471,11 @@ "title": "Karavan: Create Integration", "icon": "$(add)" }, + { + "command": "karavan.create-kamelet", + "title": "Karavan: Create Kamelet", + "icon": "$(add)" + }, { "command": "karavan.create-application", "title": "Karavan: Create Application", @@ -539,6 +545,11 @@ "when": "explorerResourceIsFolder || explorerResourceIsRoot", "group": "karavan@2" }, + { + "command": "karavan.create-kamelet", + "when": "explorerResourceIsFolder || explorerResourceIsRoot", + "group": "karavan@2" + }, { "command": "karavan.topology", "when": "explorerResourceIsFolder || explorerResourceIsRoot || resourceFilename =~ /.camel.yaml$/", @@ -613,6 +624,11 @@ "when": "view == integrations", "group": "navigation@0" }, + { + "command": "karavan.create-kamelet", + "when": "view == integrations", + "group": "navigation@0" + }, { "command": "karavan.run-project-jbang", "when": "view == integrations", diff --git a/karavan-vscode/src/designerView.ts b/karavan-vscode/src/designerView.ts index 944b5d9e..6b832fc1 100644 --- a/karavan-vscode/src/designerView.ts +++ b/karavan-vscode/src/designerView.ts @@ -18,7 +18,7 @@ import {Uri, window, commands, WebviewPanel, ExtensionContext, ViewColumn, Webvi import * as path from "path"; import * as utils from "./utils"; import { CamelDefinitionYaml } from "core/api/CamelDefinitionYaml"; -import { Integration } from "core/model/IntegrationDefinition"; +import { Integration, KameletTypesArray, KameletTypes, Metadata, MetadataLabels } from "core/model/IntegrationDefinition"; import { getWebviewContent } from "./webviewContent"; const KARAVAN_LOADED = "karavan:loaded"; @@ -58,11 +58,24 @@ export class DesignerView { } createIntegration(type: 'crd' | 'plain' | 'kamelet', rootPath?: string) { + if (type === 'kamelet') { + const kameletTypes = ["sink", "source", "action"]; + window.showQuickPick(kameletTypes, { title: "Select Type", canPickMany: false }).then((kameletType) => { + if (kameletType) { + this.inputIntegrationName(type, rootPath, (kameletType as KameletTypes)); + } + }) + } else { + this.inputIntegrationName(type, rootPath); + } + } + + inputIntegrationName(type: 'crd' | 'plain' | 'kamelet', rootPath?: string, kameletType?: KameletTypes) { window .showInputBox({ - title: type === 'crd' ? "Create Camel Integration CRD" : "Create Camel Integration YAML", + title: type === 'kamelet' ? 'Create Kamelet' : "Create Integration", ignoreFocusOut: true, - prompt: "Integration name", + prompt: type === 'kamelet' ? 'Kamelet Name' : "Integration name", validateInput: (text: string): string | undefined => { if (!text || text.length === 0) { return 'Name should not be empty'; @@ -72,11 +85,14 @@ export class DesignerView { } }).then(value => { if (value) { - const name = utils.nameFromTitle(value); - const i = Integration.createNew(name); + const name = utils.nameFromTitle(type, value, kameletType); + const filename = utils.fileNameFromName(type, name, kameletType); + const i:Integration = Integration.createNew(name, type); + if (type === 'kamelet' && i.metadata && kameletType) { + i.metadata.labels = new MetadataLabels({"camel.apache.org/kamelet.type": kameletType}); + } i.type = type; const yaml = CamelDefinitionYaml.integrationToYaml(i); - const filename = name.toLocaleLowerCase().endsWith('.camel.yaml') ? name : name.split('.')[0] + '.camel.yaml'; const relativePath = (this.rootPath ? rootPath?.replace(this.rootPath, "") : rootPath) + path.sep + filename; const fullPath = (rootPath ? rootPath : this.rootPath) + path.sep + filename; utils.save(relativePath, yaml); diff --git a/karavan-vscode/src/extension.ts b/karavan-vscode/src/extension.ts index ae52d15f..ca716fbf 100644 --- a/karavan-vscode/src/extension.ts +++ b/karavan-vscode/src/extension.ts @@ -53,12 +53,20 @@ export function activate(context: ExtensionContext) { }); context.subscriptions.push(topologyCommand); - // Create new Integration YAML command + // Create new Integration command const createYaml = commands.registerCommand("karavan.create-yaml", (...args: any[]) => { designer.createIntegration("plain", args[0]?.fsPath) }); context.subscriptions.push(createYaml); + + // Create new Kamelet command + const createKamelet = commands.registerCommand("karavan.create-kamelet", (...args: any[]) => { + designer.createIntegration("kamelet", args[0]?.fsPath) + }); + context.subscriptions.push(createKamelet); + + // Open integration in designer command const open = commands.registerCommand("karavan.open", (...args: any[]) => { designer.karavanOpen(args[0].fsPath, args[0].tab); diff --git a/karavan-vscode/src/openapiView.ts b/karavan-vscode/src/openapiView.ts index 89cf70b1..77b54601 100644 --- a/karavan-vscode/src/openapiView.ts +++ b/karavan-vscode/src/openapiView.ts @@ -141,7 +141,7 @@ export async function inputFileName(rootPath?: string, openApi?: OpenApiItem) { } }).then(value => { if (value && openApi?.fsPath && rootPath) { - const name = utils.nameFromTitle(value); + const name = utils.nameFromTitle('plain', value); const filename = name.toLocaleLowerCase().endsWith('.camel.yaml') ? name : name.split('.')[0] + '.camel.yaml'; const fullPath = rootPath + path.sep + filename; selectRouteGeneration(rootPath, openApi.fsPath, fullPath, false); diff --git a/karavan-vscode/src/utils.ts b/karavan-vscode/src/utils.ts index 21bbd538..c55901ee 100644 --- a/karavan-vscode/src/utils.ts +++ b/karavan-vscode/src/utils.ts @@ -17,7 +17,7 @@ import * as path from "path"; import { workspace, Uri, window, ExtensionContext, FileType } from "vscode"; import { CamelDefinitionYaml } from "core/api/CamelDefinitionYaml"; -import { Integration } from "core/model/IntegrationDefinition"; +import { KameletTypes } from "webview/core/model/IntegrationDefinition"; export function getRoot(): string | undefined { return (workspace.workspaceFolders && (workspace.workspaceFolders.length > 0)) @@ -152,8 +152,23 @@ export function toCliFilename(filename: string): string { : filename.replace(/\s/g, "\\ "); } -export function nameFromTitle(title: string): string { - return title.replace(/[^a-z0-9+]+/gi, "-").toLowerCase(); +export function nameFromTitle(type: 'crd' | 'plain' | 'kamelet', title: string, kameletType?: KameletTypes): string { + title = title.replace(/[^a-z0-9+]+/gi, "-").toLowerCase(); + if (type === 'kamelet') { + const suffix = '-' + kameletType; + return title.toLocaleLowerCase().endsWith(suffix) ? title : title + suffix; + } else { + return title; + } +} + +export function fileNameFromName(type: 'crd' | 'plain' | 'kamelet', name: string, kameletType?: KameletTypes): string { + if (type === 'kamelet') { + const suffix = '.kamelet.yaml' + return name.toLocaleLowerCase().endsWith(suffix) ? name : name.split('.')[0] + suffix; + } else { + return name.toLocaleLowerCase().endsWith('.camel.yaml') ? name : name.split('.')[0] + '.camel.yaml'; + } } export async function getAllFiles(dirPath, arrayOfFiles: string[]) {