This is an automated email from the ASF dual-hosted git repository.

msciabarra pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/openserverless-vscode-extension.git

commit 81ce6a26d97b3911b0fa87143752fe34808225a3
Author: William Grienti <[email protected]>
AuthorDate: Wed Mar 6 15:09:18 2024 +0100

    login webview
    
    - Implement login form che fa invoke di nuv -login as in nuv autologin
    - Save in ENV variables
---
 esbuild.js                |  63 ++++
 package-lock.json         | 802 ++++++++++++++++++++++++++++++++++++++++++++++
 package.json              |  11 +-
 src/constants.ts          |   6 +
 src/extension.ts          |  67 +++-
 src/panels/Login.ts       | 150 +++++++++
 src/utilities/getNonce.ts |   8 +
 src/utilities/getUri.ts   |   5 +
 src/webview/main.ts       |  44 +++
 tsconfig.json             |   2 +-
 10 files changed, 1150 insertions(+), 8 deletions(-)

diff --git a/esbuild.js b/esbuild.js
new file mode 100644
index 0000000..2b76e99
--- /dev/null
+++ b/esbuild.js
@@ -0,0 +1,63 @@
+
+const { build } = require("esbuild");
+
+const baseConfig = {
+  bundle: true,
+  minify: process.env.NODE_ENV === "production",
+  sourcemap: process.env.NODE_ENV !== "production",
+};
+
+const extensionConfig = {
+  ...baseConfig,
+  platform: "node",
+  mainFields: ["module", "main"],
+  format: "cjs",
+  entryPoints: ["./src/extension.ts"],
+  outfile: "./out/extension.js",
+  external: ["vscode"],
+};
+
+(async () => {
+  try {
+    await build(extensionConfig);
+    console.log("build complete");
+  } catch (err) {
+    process.stderr.write(err.stderr);
+    process.exit(1);
+  }
+})();
+
+const webviewConfig = {
+    ...baseConfig,
+    target: "es2020",
+    format: "esm",
+    entryPoints: ["./src/webview/main.ts"],
+    outfile: "./out/webview.js",
+  };
+  
+  (async () => {
+    const args = process.argv.slice(2);
+    try {
+      if (args.includes("--watch")) {
+        // Build and watch extension and webview code
+        console.log("[watch] build started");
+        await build({
+          ...extensionConfig,
+          ...watchConfig,
+        });
+        await build({
+          ...webviewConfig,
+          ...watchConfig,
+        });
+        console.log("[watch] build finished");
+      } else {
+        // Build extension and webview code
+        await build(extensionConfig);
+        await build(webviewConfig);
+        console.log("build complete");
+      }
+    } catch (err) {
+      process.stderr.write(err.stderr);
+      process.exit(1);
+    }
+  })();
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 1efd358..3a208a2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,8 +10,11 @@
                        "devDependencies": {
                                "@types/node": "^16.18.34",
                                "@types/vscode": "^1.73.0",
+                               "@types/vscode-webview": "^1.57.5",
                                "@typescript-eslint/eslint-plugin": "^6.7.0",
                                "@typescript-eslint/parser": "^6.7.0",
+                               "@vscode/webview-ui-toolkit": "^1.4.0",
+                               "esbuild": "^0.16.17",
                                "eslint": "^8.26.0",
                                "typescript": "^5.3.2"
                        },
@@ -19,6 +22,358 @@
                                "vscode": "^1.74.0"
                        }
                },
+               "node_modules/@esbuild/android-arm": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz";,
+                       "integrity": 
"sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
+                       "cpu": [
+                               "arm"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "android"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/android-arm64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz";,
+                       "integrity": 
"sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
+                       "cpu": [
+                               "arm64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "android"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/android-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
+                       "cpu": [
+                               "x64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "android"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/darwin-arm64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz";,
+                       "integrity": 
"sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
+                       "cpu": [
+                               "arm64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "darwin"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/darwin-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
+                       "cpu": [
+                               "x64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "darwin"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/freebsd-arm64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz";,
+                       "integrity": 
"sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
+                       "cpu": [
+                               "arm64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "freebsd"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/freebsd-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
+                       "cpu": [
+                               "x64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "freebsd"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/linux-arm": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz";,
+                       "integrity": 
"sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
+                       "cpu": [
+                               "arm"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "linux"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/linux-arm64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz";,
+                       "integrity": 
"sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
+                       "cpu": [
+                               "arm64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "linux"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/linux-ia32": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz";,
+                       "integrity": 
"sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
+                       "cpu": [
+                               "ia32"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "linux"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/linux-loong64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz";,
+                       "integrity": 
"sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
+                       "cpu": [
+                               "loong64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "linux"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/linux-mips64el": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz";,
+                       "integrity": 
"sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
+                       "cpu": [
+                               "mips64el"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "linux"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/linux-ppc64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz";,
+                       "integrity": 
"sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
+                       "cpu": [
+                               "ppc64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "linux"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/linux-riscv64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz";,
+                       "integrity": 
"sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
+                       "cpu": [
+                               "riscv64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "linux"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/linux-s390x": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz";,
+                       "integrity": 
"sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
+                       "cpu": [
+                               "s390x"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "linux"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/linux-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
+                       "cpu": [
+                               "x64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "linux"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/netbsd-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
+                       "cpu": [
+                               "x64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "netbsd"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/openbsd-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
+                       "cpu": [
+                               "x64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "openbsd"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/sunos-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
+                       "cpu": [
+                               "x64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "sunos"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/win32-arm64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz";,
+                       "integrity": 
"sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
+                       "cpu": [
+                               "arm64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "win32"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/win32-ia32": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz";,
+                       "integrity": 
"sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
+                       "cpu": [
+                               "ia32"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "win32"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@esbuild/win32-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
+                       "cpu": [
+                               "x64"
+                       ],
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "win32"
+                       ],
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
                "node_modules/@eslint-community/eslint-utils": {
                        "version": "4.4.0",
                        "resolved": 
"https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz";,
@@ -99,6 +454,52 @@
                        "integrity": 
"sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
                        "dev": true
                },
+               "node_modules/@microsoft/fast-element": {
+                       "version": "1.12.0",
+                       "resolved": 
"https://registry.npmjs.org/@microsoft/fast-element/-/fast-element-1.12.0.tgz";,
+                       "integrity": 
"sha512-gQutuDHPKNxUEcQ4pypZT4Wmrbapus+P9s3bR/SEOLsMbNqNoXigGImITygI5zhb+aA5rzflM6O8YWkmRbGkPA==",
+                       "dev": true
+               },
+               "node_modules/@microsoft/fast-foundation": {
+                       "version": "2.49.5",
+                       "resolved": 
"https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.49.5.tgz";,
+                       "integrity": 
"sha512-3PpG1BNmZ5kUM1goYU3SsxjsM2H7Rk0ZmpDJ7mnRhWDgKiM5SzJ02KvALRUqDrJQoeDnkW0Q2Q+r9SkEd68Gpg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@microsoft/fast-element": "^1.12.0",
+                               "@microsoft/fast-web-utilities": "^5.4.1",
+                               "tabbable": "^5.2.0",
+                               "tslib": "^1.13.0"
+                       }
+               },
+               "node_modules/@microsoft/fast-foundation/node_modules/tslib": {
+                       "version": "1.14.1",
+                       "resolved": 
"https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz";,
+                       "integrity": 
"sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                       "dev": true
+               },
+               "node_modules/@microsoft/fast-react-wrapper": {
+                       "version": "0.3.23",
+                       "resolved": 
"https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.3.23.tgz";,
+                       "integrity": 
"sha512-iuL+J2AFKJ1mwUBxSp+bqzt4X93kQwj1jpVgHgw2VRzCOTl7wzta6X+lvRIVg4eoyLfmeVSMkB+q3PD87T/MyQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@microsoft/fast-element": "^1.12.0",
+                               "@microsoft/fast-foundation": "^2.49.5"
+                       },
+                       "peerDependencies": {
+                               "react": ">=16.9.0"
+                       }
+               },
+               "node_modules/@microsoft/fast-web-utilities": {
+                       "version": "5.4.1",
+                       "resolved": 
"https://registry.npmjs.org/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz";,
+                       "integrity": 
"sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==",
+                       "dev": true,
+                       "dependencies": {
+                               "exenv-es6": "^1.1.1"
+                       }
+               },
                "node_modules/@nodelib/fs.scandir": {
                        "version": "2.1.5",
                        "resolved": 
"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz";,
@@ -158,6 +559,12 @@
                        "integrity": 
"sha512-eArfOrAoZVV+Ao9zQOCaFNaeXj4kTCD+bGS2gyNgIFZH9xVMuLMlRrEkhb22NyxycFWKV1UyTh03vhaVHmqVMg==",
                        "dev": true
                },
+               "node_modules/@types/vscode-webview": {
+                       "version": "1.57.5",
+                       "resolved": 
"https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.5.tgz";,
+                       "integrity": 
"sha512-iBAUYNYkz+uk1kdsq05fEcoh8gJmwT3lqqFPN7MGyjQ3HVloViMdo7ZJ8DFIP8WOK74PjOEilosqAyxV2iUFUw==",
+                       "dev": true
+               },
                "node_modules/@typescript-eslint/eslint-plugin": {
                        "version": "6.7.0",
                        "resolved": 
"https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz";,
@@ -347,6 +754,21 @@
                                "url": 
"https://opencollective.com/typescript-eslint";
                        }
                },
+               "node_modules/@vscode/webview-ui-toolkit": {
+                       "version": "1.4.0",
+                       "resolved": 
"https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.4.0.tgz";,
+                       "integrity": 
"sha512-modXVHQkZLsxgmd5yoP3ptRC/G8NBDD+ob+ngPiWNQdlrH6H1xR/qgOBD85bfU3BhOB5sZzFWBwwhp9/SfoHww==",
+                       "dev": true,
+                       "dependencies": {
+                               "@microsoft/fast-element": "^1.12.0",
+                               "@microsoft/fast-foundation": "^2.49.4",
+                               "@microsoft/fast-react-wrapper": "^0.3.22",
+                               "tslib": "^2.6.2"
+                       },
+                       "peerDependencies": {
+                               "react": ">=16.9.0"
+                       }
+               },
                "node_modules/acorn": {
                        "version": "8.8.1",
                        "resolved": 
"https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz";,
@@ -561,6 +983,43 @@
                                "node": ">=6.0.0"
                        }
                },
+               "node_modules/esbuild": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz";,
+                       "integrity": 
"sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==",
+                       "dev": true,
+                       "hasInstallScript": true,
+                       "bin": {
+                               "esbuild": "bin/esbuild"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "optionalDependencies": {
+                               "@esbuild/android-arm": "0.16.17",
+                               "@esbuild/android-arm64": "0.16.17",
+                               "@esbuild/android-x64": "0.16.17",
+                               "@esbuild/darwin-arm64": "0.16.17",
+                               "@esbuild/darwin-x64": "0.16.17",
+                               "@esbuild/freebsd-arm64": "0.16.17",
+                               "@esbuild/freebsd-x64": "0.16.17",
+                               "@esbuild/linux-arm": "0.16.17",
+                               "@esbuild/linux-arm64": "0.16.17",
+                               "@esbuild/linux-ia32": "0.16.17",
+                               "@esbuild/linux-loong64": "0.16.17",
+                               "@esbuild/linux-mips64el": "0.16.17",
+                               "@esbuild/linux-ppc64": "0.16.17",
+                               "@esbuild/linux-riscv64": "0.16.17",
+                               "@esbuild/linux-s390x": "0.16.17",
+                               "@esbuild/linux-x64": "0.16.17",
+                               "@esbuild/netbsd-x64": "0.16.17",
+                               "@esbuild/openbsd-x64": "0.16.17",
+                               "@esbuild/sunos-x64": "0.16.17",
+                               "@esbuild/win32-arm64": "0.16.17",
+                               "@esbuild/win32-ia32": "0.16.17",
+                               "@esbuild/win32-x64": "0.16.17"
+                       }
+               },
                "node_modules/escape-string-regexp": {
                        "version": "4.0.0",
                        "resolved": 
"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz";,
@@ -758,6 +1217,12 @@
                                "node": ">=0.10.0"
                        }
                },
+               "node_modules/exenv-es6": {
+                       "version": "1.1.1",
+                       "resolved": 
"https://registry.npmjs.org/exenv-es6/-/exenv-es6-1.1.1.tgz";,
+                       "integrity": 
"sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==",
+                       "dev": true
+               },
                "node_modules/fast-deep-equal": {
                        "version": "3.1.3",
                        "resolved": 
"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz";,
@@ -1067,6 +1532,13 @@
                        "integrity": 
"sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==",
                        "dev": true
                },
+               "node_modules/js-tokens": {
+                       "version": "4.0.0",
+                       "resolved": 
"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz";,
+                       "integrity": 
"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+                       "dev": true,
+                       "peer": true
+               },
                "node_modules/js-yaml": {
                        "version": "4.1.0",
                        "resolved": 
"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz";,
@@ -1125,6 +1597,19 @@
                        "integrity": 
"sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
                        "dev": true
                },
+               "node_modules/loose-envify": {
+                       "version": "1.4.0",
+                       "resolved": 
"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz";,
+                       "integrity": 
"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+                       "dev": true,
+                       "peer": true,
+                       "dependencies": {
+                               "js-tokens": "^3.0.0 || ^4.0.0"
+                       },
+                       "bin": {
+                               "loose-envify": "cli.js"
+                       }
+               },
                "node_modules/lru-cache": {
                        "version": "6.0.0",
                        "resolved": 
"https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz";,
@@ -1337,6 +1822,19 @@
                                }
                        ]
                },
+               "node_modules/react": {
+                       "version": "18.2.0",
+                       "resolved": 
"https://registry.npmjs.org/react/-/react-18.2.0.tgz";,
+                       "integrity": 
"sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+                       "dev": true,
+                       "peer": true,
+                       "dependencies": {
+                               "loose-envify": "^1.1.0"
+                       },
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
                "node_modules/regexpp": {
                        "version": "3.2.0",
                        "resolved": 
"https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz";,
@@ -1487,6 +1985,12 @@
                                "node": ">=8"
                        }
                },
+               "node_modules/tabbable": {
+                       "version": "5.3.3",
+                       "resolved": 
"https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz";,
+                       "integrity": 
"sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==",
+                       "dev": true
+               },
                "node_modules/text-table": {
                        "version": "0.2.0",
                        "resolved": 
"https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz";,
@@ -1517,6 +2021,12 @@
                                "typescript": ">=4.2.0"
                        }
                },
+               "node_modules/tslib": {
+                       "version": "2.6.2",
+                       "resolved": 
"https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz";,
+                       "integrity": 
"sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+                       "dev": true
+               },
                "node_modules/type-check": {
                        "version": "0.4.0",
                        "resolved": 
"https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz";,
@@ -1613,6 +2123,160 @@
                }
        },
        "dependencies": {
+               "@esbuild/android-arm": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz";,
+                       "integrity": 
"sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/android-arm64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz";,
+                       "integrity": 
"sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/android-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/darwin-arm64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz";,
+                       "integrity": 
"sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/darwin-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/freebsd-arm64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz";,
+                       "integrity": 
"sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/freebsd-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/linux-arm": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz";,
+                       "integrity": 
"sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/linux-arm64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz";,
+                       "integrity": 
"sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/linux-ia32": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz";,
+                       "integrity": 
"sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/linux-loong64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz";,
+                       "integrity": 
"sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/linux-mips64el": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz";,
+                       "integrity": 
"sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/linux-ppc64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz";,
+                       "integrity": 
"sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/linux-riscv64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz";,
+                       "integrity": 
"sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/linux-s390x": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz";,
+                       "integrity": 
"sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/linux-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/netbsd-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/openbsd-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/sunos-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/win32-arm64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz";,
+                       "integrity": 
"sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/win32-ia32": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz";,
+                       "integrity": 
"sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@esbuild/win32-x64": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz";,
+                       "integrity": 
"sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
+                       "dev": true,
+                       "optional": true
+               },
                "@eslint-community/eslint-utils": {
                        "version": "4.4.0",
                        "resolved": 
"https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz";,
@@ -1668,6 +2332,51 @@
                        "integrity": 
"sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
                        "dev": true
                },
+               "@microsoft/fast-element": {
+                       "version": "1.12.0",
+                       "resolved": 
"https://registry.npmjs.org/@microsoft/fast-element/-/fast-element-1.12.0.tgz";,
+                       "integrity": 
"sha512-gQutuDHPKNxUEcQ4pypZT4Wmrbapus+P9s3bR/SEOLsMbNqNoXigGImITygI5zhb+aA5rzflM6O8YWkmRbGkPA==",
+                       "dev": true
+               },
+               "@microsoft/fast-foundation": {
+                       "version": "2.49.5",
+                       "resolved": 
"https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.49.5.tgz";,
+                       "integrity": 
"sha512-3PpG1BNmZ5kUM1goYU3SsxjsM2H7Rk0ZmpDJ7mnRhWDgKiM5SzJ02KvALRUqDrJQoeDnkW0Q2Q+r9SkEd68Gpg==",
+                       "dev": true,
+                       "requires": {
+                               "@microsoft/fast-element": "^1.12.0",
+                               "@microsoft/fast-web-utilities": "^5.4.1",
+                               "tabbable": "^5.2.0",
+                               "tslib": "^1.13.0"
+                       },
+                       "dependencies": {
+                               "tslib": {
+                                       "version": "1.14.1",
+                                       "resolved": 
"https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz";,
+                                       "integrity": 
"sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "@microsoft/fast-react-wrapper": {
+                       "version": "0.3.23",
+                       "resolved": 
"https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.3.23.tgz";,
+                       "integrity": 
"sha512-iuL+J2AFKJ1mwUBxSp+bqzt4X93kQwj1jpVgHgw2VRzCOTl7wzta6X+lvRIVg4eoyLfmeVSMkB+q3PD87T/MyQ==",
+                       "dev": true,
+                       "requires": {
+                               "@microsoft/fast-element": "^1.12.0",
+                               "@microsoft/fast-foundation": "^2.49.5"
+                       }
+               },
+               "@microsoft/fast-web-utilities": {
+                       "version": "5.4.1",
+                       "resolved": 
"https://registry.npmjs.org/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz";,
+                       "integrity": 
"sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==",
+                       "dev": true,
+                       "requires": {
+                               "exenv-es6": "^1.1.1"
+                       }
+               },
                "@nodelib/fs.scandir": {
                        "version": "2.1.5",
                        "resolved": 
"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz";,
@@ -1718,6 +2427,12 @@
                        "integrity": 
"sha512-eArfOrAoZVV+Ao9zQOCaFNaeXj4kTCD+bGS2gyNgIFZH9xVMuLMlRrEkhb22NyxycFWKV1UyTh03vhaVHmqVMg==",
                        "dev": true
                },
+               "@types/vscode-webview": {
+                       "version": "1.57.5",
+                       "resolved": 
"https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.5.tgz";,
+                       "integrity": 
"sha512-iBAUYNYkz+uk1kdsq05fEcoh8gJmwT3lqqFPN7MGyjQ3HVloViMdo7ZJ8DFIP8WOK74PjOEilosqAyxV2iUFUw==",
+                       "dev": true
+               },
                "@typescript-eslint/eslint-plugin": {
                        "version": "6.7.0",
                        "resolved": 
"https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz";,
@@ -1818,6 +2533,18 @@
                                "eslint-visitor-keys": "^3.4.1"
                        }
                },
+               "@vscode/webview-ui-toolkit": {
+                       "version": "1.4.0",
+                       "resolved": 
"https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.4.0.tgz";,
+                       "integrity": 
"sha512-modXVHQkZLsxgmd5yoP3ptRC/G8NBDD+ob+ngPiWNQdlrH6H1xR/qgOBD85bfU3BhOB5sZzFWBwwhp9/SfoHww==",
+                       "dev": true,
+                       "requires": {
+                               "@microsoft/fast-element": "^1.12.0",
+                               "@microsoft/fast-foundation": "^2.49.4",
+                               "@microsoft/fast-react-wrapper": "^0.3.22",
+                               "tslib": "^2.6.2"
+                       }
+               },
                "acorn": {
                        "version": "8.8.1",
                        "resolved": 
"https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz";,
@@ -1976,6 +2703,36 @@
                                "esutils": "^2.0.2"
                        }
                },
+               "esbuild": {
+                       "version": "0.16.17",
+                       "resolved": 
"https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz";,
+                       "integrity": 
"sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==",
+                       "dev": true,
+                       "requires": {
+                               "@esbuild/android-arm": "0.16.17",
+                               "@esbuild/android-arm64": "0.16.17",
+                               "@esbuild/android-x64": "0.16.17",
+                               "@esbuild/darwin-arm64": "0.16.17",
+                               "@esbuild/darwin-x64": "0.16.17",
+                               "@esbuild/freebsd-arm64": "0.16.17",
+                               "@esbuild/freebsd-x64": "0.16.17",
+                               "@esbuild/linux-arm": "0.16.17",
+                               "@esbuild/linux-arm64": "0.16.17",
+                               "@esbuild/linux-ia32": "0.16.17",
+                               "@esbuild/linux-loong64": "0.16.17",
+                               "@esbuild/linux-mips64el": "0.16.17",
+                               "@esbuild/linux-ppc64": "0.16.17",
+                               "@esbuild/linux-riscv64": "0.16.17",
+                               "@esbuild/linux-s390x": "0.16.17",
+                               "@esbuild/linux-x64": "0.16.17",
+                               "@esbuild/netbsd-x64": "0.16.17",
+                               "@esbuild/openbsd-x64": "0.16.17",
+                               "@esbuild/sunos-x64": "0.16.17",
+                               "@esbuild/win32-arm64": "0.16.17",
+                               "@esbuild/win32-ia32": "0.16.17",
+                               "@esbuild/win32-x64": "0.16.17"
+                       }
+               },
                "escape-string-regexp": {
                        "version": "4.0.0",
                        "resolved": 
"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz";,
@@ -2121,6 +2878,12 @@
                        "integrity": 
"sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
                        "dev": true
                },
+               "exenv-es6": {
+                       "version": "1.1.1",
+                       "resolved": 
"https://registry.npmjs.org/exenv-es6/-/exenv-es6-1.1.1.tgz";,
+                       "integrity": 
"sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==",
+                       "dev": true
+               },
                "fast-deep-equal": {
                        "version": "3.1.3",
                        "resolved": 
"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz";,
@@ -2363,6 +3126,13 @@
                        "integrity": 
"sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==",
                        "dev": true
                },
+               "js-tokens": {
+                       "version": "4.0.0",
+                       "resolved": 
"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz";,
+                       "integrity": 
"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+                       "dev": true,
+                       "peer": true
+               },
                "js-yaml": {
                        "version": "4.1.0",
                        "resolved": 
"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz";,
@@ -2409,6 +3179,16 @@
                        "integrity": 
"sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
                        "dev": true
                },
+               "loose-envify": {
+                       "version": "1.4.0",
+                       "resolved": 
"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz";,
+                       "integrity": 
"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+                       "dev": true,
+                       "peer": true,
+                       "requires": {
+                               "js-tokens": "^3.0.0 || ^4.0.0"
+                       }
+               },
                "lru-cache": {
                        "version": "6.0.0",
                        "resolved": 
"https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz";,
@@ -2553,6 +3333,16 @@
                        "integrity": 
"sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
                        "dev": true
                },
+               "react": {
+                       "version": "18.2.0",
+                       "resolved": 
"https://registry.npmjs.org/react/-/react-18.2.0.tgz";,
+                       "integrity": 
"sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+                       "dev": true,
+                       "peer": true,
+                       "requires": {
+                               "loose-envify": "^1.1.0"
+                       }
+               },
                "regexpp": {
                        "version": "3.2.0",
                        "resolved": 
"https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz";,
@@ -2643,6 +3433,12 @@
                                "has-flag": "^4.0.0"
                        }
                },
+               "tabbable": {
+                       "version": "5.3.3",
+                       "resolved": 
"https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz";,
+                       "integrity": 
"sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==",
+                       "dev": true
+               },
                "text-table": {
                        "version": "0.2.0",
                        "resolved": 
"https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz";,
@@ -2665,6 +3461,12 @@
                        "dev": true,
                        "requires": {}
                },
+               "tslib": {
+                       "version": "2.6.2",
+                       "resolved": 
"https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz";,
+                       "integrity": 
"sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+                       "dev": true
+               },
                "type-check": {
                        "version": "0.4.0",
                        "resolved": 
"https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz";,
diff --git a/package.json b/package.json
index bc688d0..6669e6b 100644
--- a/package.json
+++ b/package.json
@@ -30,7 +30,6 @@
                                        "name": "Command Palette"
                                }
                        ]
-                       
                },
                "viewsWelcome": [
                        {
@@ -40,16 +39,20 @@
                ]
        },
        "scripts": {
-               "vscode:prepublish": "npm run compile",
-               "compile": "tsc -p ./",
+               "vscode:prepublish": "npm run package",
+               "compile": "node ./esbuild.js",
+               "package": "set NODE_ENV=production && node ./esbuild.js",
                "lint": "eslint \"src/**/*.ts\"",
-               "watch": "tsc -watch -p ./"
+               "watch": "node ./esbuild.js --watch"
        },
        "devDependencies": {
                "@types/node": "^16.18.34",
                "@types/vscode": "^1.73.0",
+               "@types/vscode-webview": "^1.57.5",
                "@typescript-eslint/eslint-plugin": "^6.7.0",
                "@typescript-eslint/parser": "^6.7.0",
+               "@vscode/webview-ui-toolkit": "^1.4.0",
+               "esbuild": "^0.16.17",
                "eslint": "^8.26.0",
                "typescript": "^5.3.2"
        }
diff --git a/src/constants.ts b/src/constants.ts
index 976c5c7..e21666f 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -1,4 +1,10 @@
 export enum COMMANDS {
     DEPLOY = "nuv ide deploy",
     DEVEL = "nuv ide devel"
+}
+
+export interface NuvolarisLoginParams {
+    nuvUser: string | undefined,
+    nuvApiHost: string | undefined,
+    nuvPassword: string | undefined
 }
\ No newline at end of file
diff --git a/src/extension.ts b/src/extension.ts
index 6d96c1d..be20ac4 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -1,19 +1,80 @@
 import * as vscode from 'vscode';
-import { COMMANDS } from './constants';
+import { COMMANDS, NuvolarisLoginParams } from './constants';
+import { LoginPanel } from "./panels/Login";
 
-export function activate(context: vscode.ExtensionContext) {
+
+let nuvLoginParams: NuvolarisLoginParams = {
+       nuvUser: process.env.NUV_USER,
+       nuvApiHost: process.env.NUV_APIHOST,
+       nuvPassword: process.env.NUV_PASSWORD
+}
+export async function activate(context: vscode.ExtensionContext) {
+
+       vscode.window.showInformationMessage('Credenziali ' + 
nuvLoginParams.nuvUser + ' ' + nuvLoginParams.nuvApiHost + ' ' + 
nuvLoginParams.nuvPassword);
+
+       if (!validateNuvolarisCredentials()){
+               LoginPanel.render(handleLogin, context.extensionUri);
+       } else {
+               launchLoginTerminal()
+       }
+
+       // Check ENV variables
 
        // Registering the commands from the COMMANDS ENUM. Attaching the 
launchTerminal event to each command.
        Object.entries(COMMANDS).forEach(([name, command]) => 
        
context.subscriptions.push(vscode.commands.registerCommand(`nuvolaris.${name.toLowerCase()}`,
 () => 
                launchTerminal(command)
        )));
-}
 
+       
+       
+
+       
+}
+function handleLogin(username: string, password: string, apiHost: string) {
+       // Do something with the login details
+       storeNuvolarisCredentials(username, apiHost, password)
+}
 
 function launchTerminal(command: string){
        // If a terminal named "Nuvolaris" already exists, launch the command 
inside that one.
        const terminal = vscode.window.terminals.find(t=>t.name==="Nuvolaris") 
|| vscode.window.createTerminal("Nuvolaris");
        terminal.show();
        terminal.sendText(command, true);   
+}
+
+function validateNuvolarisCredentials(){
+       return nuvLoginParams.nuvUser && nuvLoginParams.nuvApiHost && 
nuvLoginParams.nuvPassword
+
+}
+
+function storeNuvolarisCredentials(nuvUser: string | undefined, nuvApiHost: 
string | undefined, nuvPassword: string | undefined){
+       vscode.window.showInformationMessage('Salvo credenziali ' + nuvUser + ' 
' + nuvApiHost + ' ' + nuvPassword);
+
+       
+       updateNuvLoginParams(nuvUser, nuvApiHost, nuvPassword);
+       vscode.window.showInformationMessage('Credenziali OBJ ' + 
nuvLoginParams.nuvUser + ' ' + nuvLoginParams.nuvApiHost + ' ' + 
nuvLoginParams.nuvPassword);
+       vscode.window.showInformationMessage('Credenziali ENV' + 
process.env.NUV_USER + ' ' + process.env.NUV_APIHOST + ' ' + 
process.env.NUV_PASSWORD);
+
+       launchLoginTerminal()
+       
+}
+
+function updateNuvLoginParams(nuvUser: string | undefined, nuvApiHost: string 
| undefined, nuvPassword: string | undefined){
+
+       nuvLoginParams = {
+               nuvUser: nuvUser,
+               nuvApiHost: nuvApiHost,
+               nuvPassword: nuvPassword
+       }
+
+       process.env.NUV_USER = nuvUser;
+       process.env.NUV_APIHOST = nuvApiHost;
+       process.env.NUV_PASSWORD = nuvPassword
+}
+
+function launchLoginTerminal(){
+       // launchTerminal('nuv -login')
+       launchTerminal(`nuv -login ${nuvLoginParams.nuvApiHost} 
${nuvLoginParams.nuvUser} ${nuvLoginParams.nuvPassword}`)
+
 }
\ No newline at end of file
diff --git a/src/panels/Login.ts b/src/panels/Login.ts
new file mode 100644
index 0000000..b1448d2
--- /dev/null
+++ b/src/panels/Login.ts
@@ -0,0 +1,150 @@
+
+import * as vscode from "vscode";
+import { getUri } from "../utilities/getUri";
+import { getNonce } from "../utilities/getNonce";
+
+export class LoginPanel {
+  public static currentPanel: LoginPanel | undefined;
+  private readonly _panel: vscode.WebviewPanel;
+  private _disposables: vscode.Disposable[] = [];
+
+  private constructor(panel: vscode.WebviewPanel, extensionUri: vscode.Uri) {
+    this._panel = panel;
+
+    this._panel.onDidDispose(() => this.dispose(), null, this._disposables);
+    this._panel.webview.html = this._getWebviewContent(this._panel.webview, 
extensionUri);
+    
+    this._setWebviewMessageListener(this._panel.webview);
+    // this._panel.webview.onDidReceiveMessage(message => {
+
+    //   switch (message.command) {
+        
+    //     case 'login':
+
+    //       // Handle login form submission
+    //       const { username, password, apiHost } = message;
+    //       console.log('Submitted login details:', username, password, 
apiHost);
+    //       // Pass the login details back to the extension
+    //       if (this._onLoginCallback) {
+    //         this._onLoginCallback(username, password, apiHost);
+    //       }
+    //       break;
+    //   }
+    // }, undefined, this._disposables);
+  }
+
+  private _setWebviewMessageListener(webview: vscode.Webview) {
+    webview.onDidReceiveMessage(
+      (message: any) => {
+        const command = message.command;
+
+        switch (command) {
+            case "login":
+            // Handle login form submission
+            const { username, password, apiHost } = message;
+            // Pass the login details back to the extension
+            if (this._onLoginCallback && username && password && apiHost) {
+              this._onLoginCallback(username, password, apiHost);
+            }
+            break;
+        }
+      },
+      undefined,
+      this._disposables
+    );
+  }
+
+  private _getWebviewContent(webview: vscode.Webview, extensionUri: 
vscode.Uri) {
+
+    const webviewUri = getUri(webview, extensionUri, ["out", "webview.js"]);
+    const nonce = getNonce();
+
+    return /*html*/ `
+    <!DOCTYPE html>
+    <html lang="en">
+      <head>
+        <meta charset="UTF-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
+        <meta http-equiv="Content-Security-Policy" content="default-src 
'none'; script-src 'nonce-${nonce}'; style-src 'self';">
+        <title>Nuvolaris - Login!</title>
+        <style>
+            body {
+              font-family: Arial, sans-serif;
+              background-color: transparent;
+              padding: 20px;
+            }
+            .login-container {
+              max-width: 400px;
+              margin: 0 auto;
+              background-color: #fff;
+              border-radius: 5px;
+              padding: 20px;
+              box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+            }
+            .login-container h2 {
+              text-align: center;
+            }
+            .login-form {
+              display: flex;
+              flex-direction: column;
+            }
+            .login-form input {
+              margin-bottom: 10px;
+              padding: 10px;
+              border: 1px solid #ccc;
+              border-radius: 3px;
+            }
+            .login-form vscode-button {
+              padding: 10px;
+              background-color: #007bff;
+              color: #fff;
+              border: none;
+              border-radius: 3px;
+              cursor: pointer;
+            }
+          </style>
+      </head>
+      <body>
+        <div class="login-container">
+        <h2>Login to Nuvolaris</h2>
+        <form class="login-form" id="loginForm">
+          <input type="text" id="username" placeholder="Username">
+          <input type="password" id="password" placeholder="Password">
+          <input type="text" id="apiHost" placeholder="API Host URL">
+          <vscode-button id="login-submit" type="submit">Login</vscode-button>
+        </form>
+      </div>
+        <script type="module" nonce="${nonce}" src="${webviewUri}"></script>
+      </body>
+    </html>
+  `;
+    
+  }
+
+  private _onLoginCallback: ((username: string, password: string, apiHost: 
string) => void) | undefined;
+
+  public static render(onLogin: (username: string, password: string, apiHost: 
string) => void, extensionUri: vscode.Uri) {
+    if (LoginPanel.currentPanel) {
+      LoginPanel.currentPanel._panel.reveal(vscode.ViewColumn.One);
+    } else {
+      const panel = vscode.window.createWebviewPanel("login-panel", "Login", 
vscode.ViewColumn.One, {
+        enableScripts: true,
+        // Restrict the webview to only load resources from the `out` directory
+        localResourceRoots: [vscode.Uri.joinPath(extensionUri, 'out')]
+      });
+      LoginPanel.currentPanel = new LoginPanel(panel, extensionUri);
+    }
+    LoginPanel.currentPanel._onLoginCallback = onLogin;
+  }
+
+  public dispose() {
+    LoginPanel.currentPanel = undefined;
+    this._panel.dispose();
+    while (this._disposables.length) {
+      const disposable = this._disposables.pop();
+      if (disposable) {
+        disposable.dispose();
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/utilities/getNonce.ts b/src/utilities/getNonce.ts
new file mode 100644
index 0000000..205ef23
--- /dev/null
+++ b/src/utilities/getNonce.ts
@@ -0,0 +1,8 @@
+export function getNonce() {
+    let text = "";
+    const possible = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+    for (let i = 0; i < 32; i++) {
+      text += possible.charAt(Math.floor(Math.random() * possible.length));
+    }
+    return text;
+  }
\ No newline at end of file
diff --git a/src/utilities/getUri.ts b/src/utilities/getUri.ts
new file mode 100644
index 0000000..f43ed04
--- /dev/null
+++ b/src/utilities/getUri.ts
@@ -0,0 +1,5 @@
+import { Uri, Webview } from "vscode";
+
+export function getUri(webview: Webview, extensionUri: Uri, pathList: 
string[]) {
+  return webview.asWebviewUri(Uri.joinPath(extensionUri, ...pathList));
+}
\ No newline at end of file
diff --git a/src/webview/main.ts b/src/webview/main.ts
new file mode 100644
index 0000000..b37de27
--- /dev/null
+++ b/src/webview/main.ts
@@ -0,0 +1,44 @@
+import { Button, provideVSCodeDesignSystem, vsCodeButton } from 
"@vscode/webview-ui-toolkit";
+
+provideVSCodeDesignSystem().register(vsCodeButton());
+
+
+const vscode = acquireVsCodeApi();
+
+window.addEventListener("load", main);
+
+function main() {
+  // To get improved type annotations/IntelliSense the associated class for
+  // a given toolkit component can be imported and used to type cast a 
reference
+  // to the element (i.e. the `as Button` syntax)
+  const submitButton = document.getElementById("login-submit") as Button;
+
+  submitButton?.addEventListener("click", handleLoginSubmit)
+}
+
+function handleLoginSubmit() {
+  const username = document.getElementById('username') as HTMLInputElement;
+  const password = document.getElementById('password') as HTMLInputElement;
+  const apiHost = document.getElementById('apiHost') as HTMLInputElement;
+
+  let credentials = {
+    username: username,
+    password: password,
+    apiHost: apiHost
+  }
+  if (username.value && password.value && apiHost.value) {
+    vscode.postMessage({
+      command: "login",
+      username: `${username.value}`,
+      password: `${password.value}`,
+      apiHost: `${apiHost.value}`,
+      text: `${username.value} ${password.value} ${apiHost.value} PASS`,
+    });
+  } else {
+    vscode.postMessage({
+      command: "login",
+      text: `${username.value} ${password.value} ${apiHost.value} NOT PASS`,
+    });
+  }
+
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index 378420b..ea42588 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,7 +2,7 @@
        "compilerOptions": {
                "module": "commonjs",
                "target": "es2020",
-               "lib": ["es2020"],
+               "lib": ["es2020", "dom"],
                "outDir": "out",
                "sourceMap": true,
                "strict": true,


Reply via email to