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 0abac84  JBang run experimental (#63)
0abac84 is described below

commit 0abac8483e451831d9afaab4d80e2b3a37157749
Author: Marat Gubaidullin <[email protected]>
AuthorDate: Tue Nov 2 09:24:49 2021 -0400

    JBang run experimental (#63)
---
 karavan-vscode/icons/run.png    | Bin 0 -> 16012 bytes
 karavan-vscode/icons/run.svg    |   2 ++
 karavan-vscode/package.json     |  17 ++++++++-
 karavan-vscode/src/extension.ts |  75 +++++++++++++++++++++++++++++++---------
 karavan-vscode/webview/App.tsx  |   6 ++++
 5 files changed, 82 insertions(+), 18 deletions(-)

diff --git a/karavan-vscode/icons/run.png b/karavan-vscode/icons/run.png
new file mode 100644
index 0000000..647d31e
Binary files /dev/null and b/karavan-vscode/icons/run.png differ
diff --git a/karavan-vscode/icons/run.svg b/karavan-vscode/icons/run.svg
new file mode 100644
index 0000000..271f6b5
--- /dev/null
+++ b/karavan-vscode/icons/run.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?>
+<svg fill="#F69923" height="100%" width="100%" viewBox="0 0 448 512" 
aria-hidden="true" role="img" style="vertical-align: -0.125em;" 
aria-describedby="pf-tooltip-368" xmlns="http://www.w3.org/2000/svg";><path 
d="M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 
41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z"></path></svg>
\ No newline at end of file
diff --git a/karavan-vscode/package.json b/karavan-vscode/package.json
index 22757a8..e03193a 100644
--- a/karavan-vscode/package.json
+++ b/karavan-vscode/package.json
@@ -42,7 +42,8 @@
   ],
   "activationEvents": [
     "onCommand:karavan.create",
-    "onCommand:karavan.open"
+    "onCommand:karavan.open",
+    "onCommand:karavan.jbang-run"
   ],
   "main": "./dist/extension.js",
   "contributes": {
@@ -58,6 +59,11 @@
           "light": "./icons/icon.png",
           "dark": "./icons/icon.png"
         }
+      },
+      {
+        "command": "karavan.jbang-run",
+        "title": "Run with JBang",
+        "icon": "./icons/run.png"
       }
     ],
     "menus": {
@@ -69,6 +75,10 @@
         {
           "command": "karavan.open",
           "when": "resourceExtname == .yaml"
+        },
+        {
+          "command": "karavan.jbang-run",
+          "when": "resourceExtname == .yaml"
         }
       ],
       "editor/title": [
@@ -76,6 +86,11 @@
           "command": "karavan.open",
           "when": "resourceExtname == .yaml",
           "group": "navigation"
+        },
+        {
+          "command": "karavan.jbang-run",
+          "when": "resourceExtname == .yaml || karavan:loaded",
+          "group": "navigation"
         }
       ]
     },
diff --git a/karavan-vscode/src/extension.ts b/karavan-vscode/src/extension.ts
index 4c76cb9..f7fe044 100644
--- a/karavan-vscode/src/extension.ts
+++ b/karavan-vscode/src/extension.ts
@@ -17,25 +17,28 @@
 import * as vscode from "vscode";
 import * as fs from "fs";
 import * as path from "path";
-import {CamelYaml} from "../designer/api/CamelYaml";
+import { CamelYaml } from "../designer/api/CamelYaml";
 import { CamelUi } from "../designer/api/CamelUi";
 
+const KARAVAN_LOADED = "karavan:loaded";
+const KARAVAN_PANELS: Map<any, string> = new Map<string, string>();
+
 export function activate(context: vscode.ExtensionContext) {
     const webviewContent = fs
         .readFileSync(
             vscode.Uri.joinPath(context.extensionUri, 
"dist/index.html").fsPath,
-            {encoding: "utf-8"}
+            { encoding: "utf-8" }
         )
         .replace(
             "styleUri",
             vscode.Uri.joinPath(context.extensionUri, "/dist/main.css")
-                .with({scheme: "vscode-resource"})
+                .with({ scheme: "vscode-resource" })
                 .toString()
         )
         .replace(
             "scriptUri",
             vscode.Uri.joinPath(context.extensionUri, "/dist/webview.js")
-                .with({scheme: "vscode-resource"})
+                .with({ scheme: "vscode-resource" })
                 .toString()
         );
 
@@ -56,8 +59,8 @@ export function activate(context: vscode.ExtensionContext) {
                         }
                     }
                 }).then(value => {
-                    if (value) openKaravanWebView(context, webviewContent, 
value || '', undefined);
-            });
+                    if (value) openKaravanWebView(context, webviewContent, 
value, value + '.yaml', undefined);
+                });
         }
     );
 
@@ -65,26 +68,54 @@ export function activate(context: vscode.ExtensionContext) {
     const open = vscode.commands.registerCommand(
         "karavan.open",
         (...args: any[]) => {
-            if (args && args.length >0){
+            if (args && args.length > 0) {
                 const yaml = 
fs.readFileSync(path.resolve(args[0].path)).toString('utf8');
                 const parce = isIntegration(yaml);
-                if (parce[0]){
-                    openKaravanWebView(context, webviewContent, parce[1] || 
'', yaml);
+                const filename = path.basename(args[0].path);
+                if (parce[0]) {
+                    openKaravanWebView(context, webviewContent, parce[1] || 
'', filename || '', yaml);
                 } else {
                     vscode.window.showErrorMessage("File is not Camel-K 
Integration!")
                 }
             }
         }
     );
+
+    // Run Camel-K integration in designer
+    const run = vscode.commands.registerCommand(
+        "karavan.jbang-run",
+        (...args: any[]) => {
+            if (args && args.length > 0) {
+                if (args[0].path.startsWith('webview-panel/webview')) {
+                    const filename = KARAVAN_PANELS.get(args[0].path);
+                    console.log(filename)
+                    if (filename){
+                        runCamelJbang(filename);
+                    }
+                } else {
+                    const yaml = 
fs.readFileSync(path.resolve(args[0].path)).toString('utf8');
+                    const parce = isIntegration(yaml);
+                    const filename = path.basename(args[0].path);
+                    console.log(filename)
+                    if (parce[0]) {
+                        runCamelJbang(filename);
+                    } else {
+                        vscode.window.showErrorMessage("File is not Camel-K 
Integration!")
+                    }
+                }
+            }
+        }
+    );
     context.subscriptions.push(create);
     context.subscriptions.push(open);
+    context.subscriptions.push(run);
 }
 
-function openKaravanWebView(context: vscode.ExtensionContext, webviewContent: 
string, name: string, yaml?:string) {
+function openKaravanWebView(context: vscode.ExtensionContext, webviewContent: 
string, name: string, filename: string, yaml?: string) {
     // Karavan webview
     const panel = vscode.window.createWebviewPanel(
         "karavan",
-        CamelUi.nameFomTitle(name),
+        CamelUi.nameFomTitle(filename),
         vscode.ViewColumn.One,
         {
             enableScripts: true,
@@ -102,13 +133,13 @@ function openKaravanWebView(context: 
vscode.ExtensionContext, webviewContent: st
     );
 
     // Read and send Kamelets
-    panel.webview.postMessage({command: 'kamelets', kamelets: 
readKamelets(context)});
+    panel.webview.postMessage({ command: 'kamelets', kamelets: 
readKamelets(context) });
 
     // Read and send Components
-    panel.webview.postMessage({command: 'components', components: 
readComponents(context)});
+    panel.webview.postMessage({ command: 'components', components: 
readComponents(context) });
 
     // Send integration
-    panel.webview.postMessage({command: 'open', name: name, yaml: yaml});
+    panel.webview.postMessage({ command: 'open', name: name, yaml: yaml });
 
 
     // Handle messages from the webview
@@ -116,19 +147,22 @@ function openKaravanWebView(context: 
vscode.ExtensionContext, webviewContent: st
         message => {
             switch (message.command) {
                 case 'save':
-                    if (vscode.workspace.workspaceFolders){
-                        const uriFolder: vscode.Uri =  
vscode.workspace.workspaceFolders[0].uri;
+                    if (vscode.workspace.workspaceFolders) {
+                        const uriFolder: vscode.Uri = 
vscode.workspace.workspaceFolders[0].uri;
                         const uriFile: vscode.Uri = 
vscode.Uri.file(path.join(uriFolder.path, message.name + '.yaml'));
                         fs.writeFile(uriFile.path, message.yaml, err => {
                             if (err) vscode.window.showErrorMessage("Error: " 
+ err?.message);
                         });
                     }
                     return;
+                case 'url-mapping':
+                    KARAVAN_PANELS.set('webview-panel/webview-' + 
message.pathId, CamelUi.nameFomTitle(message.name) + '.yaml');
             }
         },
         undefined,
         context.subscriptions
     );
+    vscode.commands.executeCommand("setContext", KARAVAN_LOADED, true);
 }
 
 function readKamelets(context: vscode.ExtensionContext): string[] {
@@ -145,12 +179,19 @@ function readComponents(context: 
vscode.ExtensionContext): string[] {
 
 function isIntegration(yaml: string): [boolean, string?] {
     const i = CamelYaml.yamlToIntegration(yaml);
-    if (i.kind === 'Integration' && i.metadata.name){
+    if (i.kind === 'Integration' && i.metadata.name) {
         return [true, i.metadata.name];
     } else {
         return [false, undefined];
     }
 }
 
+function runCamelJbang(filename: string) {
+    const terminal = vscode.window.createTerminal(`Karavan: ` + filename);
+    terminal.show();
+    terminal.sendText("CamelJBang run " + filename);
+}
+
 export function deactivate() {
+    vscode.commands.executeCommand("setContext", KARAVAN_LOADED, false);
 }
diff --git a/karavan-vscode/webview/App.tsx b/karavan-vscode/webview/App.tsx
index 1a55e5a..6ba0cf9 100644
--- a/karavan-vscode/webview/App.tsx
+++ b/karavan-vscode/webview/App.tsx
@@ -55,12 +55,18 @@ class App extends React.Component<Props, State> {
         case 'open':
           if (this.state.name === '' && this.state.key === ''){
             this.setState({name: message.name, yaml: message.yaml, key: 
Math.random().toString()});
+            this.sendUrlMapping(message.name)
           }
           break;
       }
     });
   }
 
+  sendUrlMapping(name: string){
+    const url = new URL(window.location.href)
+    vscode.postMessage({ command: 'url-mapping', pathId: url.host, name: name 
})
+  }
+
   save(name: string, yaml: string) {
     vscode.postMessage({
       command: 'save',

Reply via email to