diff --git a/chimerapy/orchestrator/registry/utils.py b/chimerapy/orchestrator/registry/utils.py index 3518bfc..ddcdcea 100644 --- a/chimerapy/orchestrator/registry/utils.py +++ b/chimerapy/orchestrator/registry/utils.py @@ -1,4 +1,5 @@ -from typing import Optional, Type +import inspect +from typing import Any, Dict, Optional, Type from chimerapy.engine import Node from chimerapy.orchestrator.models.pipeline_models import NodeType, WrappedNode @@ -70,6 +71,7 @@ def __call__(self, node_class: Type[Node]): node_class, node_type=self.type, registry_name=name, + kwargs=self._parse_init_kwargs(node_class), ) qualified_name = f"{node_class.__module__}:{node_class.__name__}" @@ -82,3 +84,17 @@ def __call__(self, node_class: Type[Node]): ) return node_class + + def _parse_init_kwargs(self, node_class: Type[Node]) -> Dict[str, Any]: + signature = inspect.signature(node_class.__init__) + kwargs = {} + + for param in signature.parameters.values(): + + if param.name == "self": + continue + kwargs[param.name] = ( + param.default if param.default is not param.empty else None + ) + + return kwargs diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 23799c3..a72030d 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -40,6 +40,7 @@ "svelte": "^4.0.0", "svelte-check": "^3.4.3", "svelte-golden-layout": "^0.1.1", + "svelte-jsoneditor": "^0.17.8", "svelte-preprocess": "^5.0.3", "svelte-virtual-scroll-list": "github:umesh-timalsina/svelte-virtual-scroll-list#container-styles", "tailwind-scrollbar": "^3.0.0", @@ -65,6 +66,99 @@ "node": ">=6.0.0" } }, + "node_modules/@codemirror/autocomplete": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.9.0.tgz", + "integrity": "sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==", + "dev": true, + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.6.0", + "@lezer/common": "^1.0.0" + }, + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.2.4.tgz", + "integrity": "sha512-42lmDqVH0ttfilLShReLXsDfASKLXzfyC36bzwcqzox9PlHulMcsUOfHXNo2X2aFMVNUoQ7j+d4q5bnfseYoOA==", + "dev": true, + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.2.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-json": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.1.tgz", + "integrity": "sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==", + "dev": true, + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/json": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.8.0.tgz", + "integrity": "sha512-r1paAyWOZkfY0RaYEZj3Kul+MiQTEbDvYqf8gPGaRvNneHXCmfSaAVFjwRUPlgxS8yflMxw2CTu6uCMp8R8A2g==", + "dev": true, + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.4.0.tgz", + "integrity": "sha512-6VZ44Ysh/Zn07xrGkdtNfmHCbGSHZzFBdzWi0pbd7chAQ/iUcpLGX99NYRZTa7Ugqg4kEHCqiHhcZnH0gLIgSg==", + "dev": true, + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.0.tgz", + "integrity": "sha512-64/M40YeJPToKvGO6p3fijo2vwUEj4nACEAXElCaYQ50HrXSvRaK+NHEhSh73WFBGdvIdhrV+lL9PdJy2RfCYA==", + "dev": true, + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.1.tgz", + "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==", + "dev": true + }, + "node_modules/@codemirror/view": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.15.3.tgz", + "integrity": "sha512-chNgR8H7Ipx7AZUt0+Kknk7BCow/ron3mHd1VZdM7hQXiI79+UlWqcxpCiexTxZQ+iSkqndk3HHAclJOcjSuog==", + "dev": true, + "dependencies": { + "@codemirror/state": "^6.1.4", + "style-mod": "^4.0.0", + "w3c-keyname": "^2.2.4" + } + }, "node_modules/@esbuild/linux-x64": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", @@ -129,6 +223,57 @@ "npm": ">=6.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", + "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==", + "dev": true + }, + "node_modules/@floating-ui/dom": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.5.tgz", + "integrity": "sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==", + "dev": true, + "dependencies": { + "@floating-ui/core": "^1.3.1" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.0.tgz", + "integrity": "sha512-ZfycI7D0KWPZtf7wtMFnQxs8qjBXArRzczABuMQqecA/nXohquJ5J/RCR77PmY5qGWkxAZDxpnUFVXKwtY/jPw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -210,6 +355,40 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@lezer/common": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.3.tgz", + "integrity": "sha512-JH4wAXCgUOcCGNekQPLhVeUtIqjH0yPBs7vvUdSjyQama9618IOKFJwkv2kcqdhF0my8hQEgCTEJU0GIgnahvA==", + "dev": true + }, + "node_modules/@lezer/highlight": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.6.tgz", + "integrity": "sha512-cmSJYa2us+r3SePpRCjN5ymCqCPv+zyXmDl0ciWtVaNiORT/MxM7ZgOMQZADD0o51qOaOg24qc/zBViOIwAjJg==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/json": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.1.tgz", + "integrity": "sha512-nkVC27qiEZEjySbi6gQRuMwa2sDu2PtfjSgz0A4QF81QyRGm3kb2YRzLcOPcTEtmcwvrX/cej7mlhbwViA4WJw==", + "dev": true, + "dependencies": { + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.9.tgz", + "integrity": "sha512-XPz6dzuTHlnsbA5M2DZgjflNQ+9Hi5Swhic0RULdp3oOs3rh6bqGZolosVqN/fQIT8uNiepzINJDnS39oweTHQ==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -261,6 +440,23 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@replit/codemirror-indentation-markers": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@replit/codemirror-indentation-markers/-/codemirror-indentation-markers-6.4.2.tgz", + "integrity": "sha512-AoTzTGLkSg+B/6pKRYUa0gFoV8JjSC4AvnCzYlT/ueXwDU+cYbFeRCJtitNijwAbFgEsaFOlO9+WonZvwxfL2w==", + "dev": true, + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/@sphinxxxx/color-conversion": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==", + "dev": true + }, "node_modules/@sveltejs/adapter-auto": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-1.0.2.tgz", @@ -1152,6 +1348,21 @@ "periscopic": "^3.1.0" } }, + "node_modules/codemirror": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", + "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", + "dev": true, + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1206,6 +1417,12 @@ "node": ">= 0.6" } }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1423,6 +1640,15 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2405,6 +2631,18 @@ "node": ">= 4" } }, + "node_modules/immutable": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==", + "dev": true + }, + "node_modules/immutable-json-patch": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable-json-patch/-/immutable-json-patch-5.1.3.tgz", + "integrity": "sha512-95AsF9hJTPpwtBGAnHmw57PASL672tb+vGHR5xLhH2VPuHSsLho7grjlfgQ65DIhHP+UmLCjdmuuA6L1ndJbZg==", + "dev": true + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2620,6 +2858,15 @@ "ws": "*" } }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/jointjs": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/jointjs/-/jointjs-3.6.5.tgz", @@ -2712,12 +2959,27 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz", + "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==", + "dev": true + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/jsonrepair": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.2.0.tgz", + "integrity": "sha512-6eHBc2z5vipym4S8rzTcCXQBLWpkSzi9bk7I3xTdUxRzXyYvfjoVZzJ97N4C/9vcKI9NgNp3slPwHufDr0rFYw==", + "dev": true, + "bin": { + "jsonrepair": "bin/cli.js" + } + }, "node_modules/jszmq": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/jszmq/-/jszmq-0.1.2.tgz", @@ -2827,6 +3089,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2872,6 +3140,12 @@ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3552,6 +3826,15 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -3690,6 +3973,23 @@ "rimraf": "bin.js" } }, + "node_modules/sass": { + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -3878,6 +4178,12 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/style-mod": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.3.tgz", + "integrity": "sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw==", + "dev": true + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3926,6 +4232,15 @@ "node": ">=16" } }, + "node_modules/svelte-awesome": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/svelte-awesome/-/svelte-awesome-3.2.1.tgz", + "integrity": "sha512-4jckcBktldqgmHUWg1xvl3vCrZllt5YSSsPun4NW7dOp9VZx1mOqJ9ddkYCH7O3PJN4ntucJr5P9/6q2xvw/0A==", + "dev": true, + "peerDependencies": { + "svelte": "^3.43.1 || ^4.0.0" + } + }, "node_modules/svelte-check": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.4.4.tgz", @@ -4000,6 +4315,16 @@ "node": ">=4.0" } }, + "node_modules/svelte-floating-ui": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/svelte-floating-ui/-/svelte-floating-ui-1.2.8.tgz", + "integrity": "sha512-8Ifi5CD2Ui7FX7NjJRmutFtXjrB8T/FMNoS2H8P81t5LHK4I9G4NIs007rLWG/nRl7y+zJUXa3tWuTjYXw/O5A==", + "dev": true, + "dependencies": { + "@floating-ui/core": "^1.1.0", + "@floating-ui/dom": "^1.1.0" + } + }, "node_modules/svelte-golden-layout": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/svelte-golden-layout/-/svelte-golden-layout-0.1.1.tgz", @@ -4021,6 +4346,71 @@ "svelte": "^3.19.0 || ^4.0.0-next.0" } }, + "node_modules/svelte-jsoneditor": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/svelte-jsoneditor/-/svelte-jsoneditor-0.17.8.tgz", + "integrity": "sha512-GuX7lGJd4GVcQ0wiy+bLU+zfhBC7dEZQiGWnZMlWj7RIGxgLQQ1fCJpxT9g0gF7rqYfzDiz6vaiQFheyW3NehA==", + "dev": true, + "dependencies": { + "@codemirror/commands": "^6.2.4", + "@codemirror/lang-json": "^6.0.1", + "@codemirror/language": "^6.8.0", + "@codemirror/lint": "^6.2.2", + "@codemirror/search": "^6.5.0", + "@codemirror/state": "^6.2.1", + "@codemirror/view": "^6.13.2", + "@fortawesome/free-regular-svg-icons": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@replit/codemirror-indentation-markers": "6.4.2", + "ajv": "^8.12.0", + "codemirror": "^6.0.1", + "diff-sequences": "^29.4.3", + "immutable-json-patch": "^5.1.2", + "jmespath": "^0.16.0", + "json-source-map": "^0.6.1", + "jsonrepair": "^3.2.0", + "lodash-es": "^4.17.21", + "memoize-one": "^6.0.0", + "natural-compare-lite": "^1.4.0", + "sass": "^1.63.5", + "svelte": "^3.59.2", + "svelte-awesome": "^3.2.0", + "svelte-select": "^5.6.1", + "svelte-simple-modal": "^1.5.2", + "vanilla-picker": "^2.12.1" + } + }, + "node_modules/svelte-jsoneditor/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/svelte-jsoneditor/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/svelte-jsoneditor/node_modules/svelte": { + "version": "3.59.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.2.tgz", + "integrity": "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/svelte-preprocess": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz", @@ -4095,6 +4485,25 @@ "node": ">=12" } }, + "node_modules/svelte-select": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-5.6.1.tgz", + "integrity": "sha512-Powj91VAWyaNMSSOQ0E29UMTw/ExWsHEsA83H7yQgfji2S2DhG6Rs5qZHslZ+ihbCPxXel5uEzwLsSqDABkQDw==", + "dev": true, + "dependencies": { + "@floating-ui/dom": "^1.2.1", + "svelte-floating-ui": "1.2.8" + } + }, + "node_modules/svelte-simple-modal": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/svelte-simple-modal/-/svelte-simple-modal-1.6.1.tgz", + "integrity": "sha512-D4/Z7LQ6ThawYb7FlAeS/qGbcwVlqzRHn1zZgWPlEK0cp4l2UMcscqel58mp+gTuk4UX9gl516GYXcHFvuyslA==", + "dev": true, + "peerDependencies": { + "svelte": "^3.30.0 || ^4.0.0" + } + }, "node_modules/svelte-virtual-scroll-list": { "version": "1.1.0", "resolved": "git+ssh://git@github.com/umesh-timalsina/svelte-virtual-scroll-list.git#d4b42c73c5f97b0de0e320ea84ad13df7431a59e", @@ -4462,6 +4871,15 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/vanilla-picker": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.1.tgz", + "integrity": "sha512-2qrEP9VYylKXbyzXKsbu2dferBTvqnlsr29XjHwFE+/MEp0VNj6oEUESLDtKZ7DWzGdSv1x/+ujqFZF+KsO3cg==", + "dev": true, + "dependencies": { + "@sphinxxxx/color-conversion": "^2.2.2" + } + }, "node_modules/vite": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", @@ -4580,6 +4998,12 @@ } } }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", diff --git a/dashboard/package.json b/dashboard/package.json index 7f2fb6a..84f6914 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -43,6 +43,7 @@ "svelte": "^4.0.0", "svelte-check": "^3.4.3", "svelte-golden-layout": "^0.1.1", + "svelte-jsoneditor": "^0.17.8", "svelte-preprocess": "^5.0.3", "svelte-virtual-scroll-list": "github:umesh-timalsina/svelte-virtual-scroll-list#container-styles", "tailwind-scrollbar": "^3.0.0", diff --git a/dashboard/src/lib/Icons.ts b/dashboard/src/lib/Icons.ts index e826d55..208da0f 100644 --- a/dashboard/src/lib/Icons.ts +++ b/dashboard/src/lib/Icons.ts @@ -18,7 +18,9 @@ export enum Icons { stop = 'stop', upload = 'upload', eyeOpen = 'eyeOpen', - eyeClosed = 'eyeClosed' + eyeClosed = 'eyeClosed', + code = 'code', + graph = 'graph' } export type IconType = { @@ -72,7 +74,10 @@ const IconsPath: { [key in Icons]: string | string[] } = { 'M15 12a3 3 0 11-6 0 3 3 0 016 0z' ], [Icons.eyeClosed]: - 'M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88' + 'M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88', + [Icons.code]: 'M17.25 6.75L22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3l-4.5 16.5', + [Icons.graph]: + 'M21 7.5l-2.25-1.313M21 7.5v2.25m0-2.25l-2.25 1.313M3 7.5l2.25-1.313M3 7.5l2.25 1.313M3 7.5v2.25m9 3l2.25-1.313M12 12.75l-2.25-1.313M12 12.75V15m0 6.75l2.25-1.313M12 21.75V19.5m0 2.25l-2.25-1.313m0-16.875L12 2.25l2.25 1.313M21 14.25v2.25l-2.25 1.313m-13.5 0L3 16.5v-2.25' }; export const getIconPath = (icon: Icons): string | string[] => { diff --git a/dashboard/src/lib/Services/PipelineUtils.ts b/dashboard/src/lib/Services/PipelineUtils.ts index 2e081d1..19db993 100644 --- a/dashboard/src/lib/Services/PipelineUtils.ts +++ b/dashboard/src/lib/Services/PipelineUtils.ts @@ -1,6 +1,6 @@ import * as joint from 'jointjs'; import type { Result } from 'ts-monads/lib/Result'; -import type { PipelineNode, Pipeline, ResponseError } from '../models'; +import type {PipelineNode, Pipeline, ResponseError, EditablePipelineJSON} from '../models'; import { NodeType } from '../models'; export class PipelineUtils { @@ -156,4 +156,18 @@ export class PipelineUtils { }) ); } + + static pipelineToEditableJSON(pipeline: Pipeline): EditablePipelineJSON { + return { + name: pipeline.name, + description: pipeline.description, + nodes: pipeline.nodes.map((node) => { + return { + name: node.name, + kwargs: node.kwargs, + worker_id: node.worker_id, + }; + }), + }; + } } diff --git a/dashboard/src/lib/models.ts b/dashboard/src/lib/models.ts index ec7a7a9..6fceec7 100644 --- a/dashboard/src/lib/models.ts +++ b/dashboard/src/lib/models.ts @@ -35,6 +35,7 @@ export interface PipelineNode { type: NodeType; kwargs: { [key: string]: any }; package: string; + worker_id: string|null; } export interface Edge { @@ -125,6 +126,18 @@ export interface LifeCycle { pipeline: Pipeline; } +export interface EditablePipelineNode { + name: string; + worker_id: string|null; + kwargs: { [key: string]: any }; +} + +export interface EditablePipelineJSON { + name: string; + description: string; + nodes: EditablePipelineNode[]; +} + export interface NodeSourceCode { module: string; source_code: string; diff --git a/dashboard/src/routes/pipeline-design/Components/Designer.svelte b/dashboard/src/routes/pipeline-design/Components/Designer.svelte index 276fcc6..479f962 100644 --- a/dashboard/src/routes/pipeline-design/Components/Designer.svelte +++ b/dashboard/src/routes/pipeline-design/Components/Designer.svelte @@ -10,12 +10,31 @@ import { getStore } from '$lib/stores'; import Alert from './Alert.svelte'; import { Ok } from 'ts-monads'; + import { JSONEditor } from 'svelte-jsoneditor'; + + enum EditorModes { + SPLIT = 'split', + GRAPH = 'graph', + JSON = 'json' + + } + + let content = { + json: {}, + text: undefined + }; const selectedPipelineStore = getStore('selectedPipeline'); let modal: Alert | null = null; let pipelineGraph: EditableDagViewer; let editorContainer: HTMLElement, horizontalMenu: HTMLElement; + let editorMode: EditorModes = EditorModes.SPLIT; + + let viewSwitcherIcon = { + type: Icons.GRAPH, + + } onMount(async () => { const observer = new ResizeObserver((entries) => { @@ -28,6 +47,7 @@ observer.observe(editorContainer); renderSelectedPipelineGraph(true); + setPipelineJSONContent(); }); async function removeNodeFromPipeline(cell) { @@ -190,15 +210,41 @@ }); } + function setPipelineJSONContent() { + const pipeline = $selectedPipelineStore.pipeline; + content = { + json: pipeline ? PipelineUtils.pipelineToEditableJSON(pipeline): {}, + text: undefined + }; + } + + function toggleEditorMode() { + if (editorMode === EditorModes.GRAPH) { + editorMode = EditorModes.JSON; + setPipelineJSONContent(); + } else { + editorMode = EditorModes.GRAPH; + renderSelectedPipelineGraph(true); + } + } + + function setJSONEditorClasses(path, value) { + console.log(path, value); + } + + $: { if ($selectedPipelineStore.pipeline && $selectedPipelineStore.selectedNodeId === null) { - renderSelectedPipelineGraph(true); + if ([ EditorModes.GRAPH, EditorModes.SPLIT ].includes(editorMode)) { + renderSelectedPipelineGraph(true); + } else if ([ EditorModes.GRAPH, EditorModes.SPLIT ].includes(editorMode)) { + setPipelineJSONContent(); + } } else if ($selectedPipelineStore.pipeline === null) { pipelineGraph?.clearGraph(); } } -