diff --git a/packages/backend/code-execution.patch b/packages/backend/code-execution.patch deleted file mode 100644 index 163b3d4c..00000000 --- a/packages/backend/code-execution.patch +++ /dev/null @@ -1,332 +0,0 @@ -diff --git a/packages/backend/code-execution.patch b/packages/backend/code-execution.patch -index 646bc6dd..e69de29b 100644 ---- a/packages/backend/code-execution.patch -+++ b/packages/backend/code-execution.patch -@@ -1,327 +0,0 @@ --diff --git a/docker/Dockerfile b/docker/Dockerfile --index f4aa6577..e3b9c10f 100644 ----- a/docker/Dockerfile --+++ b/docker/Dockerfile --@@ -4,7 +4,7 @@ FROM node:18-alpine -- ENV PORT 3000 -- -- RUN \ --- apk --no-cache add --virtual build-dependencies python3 build-base git --+ apk --no-cache add --virtual build-dependencies python3 build-base git make g++ -- -- WORKDIR /automatisch -- --diff --git a/packages/backend/package.json b/packages/backend/package.json --index 50b8109f..677f5325 100644 ----- a/packages/backend/package.json --+++ b/packages/backend/package.json --@@ -49,6 +49,7 @@ -- "http-errors": "~1.6.3", -- "http-proxy-agent": "^7.0.0", -- "https-proxy-agent": "^7.0.1", --+ "isolated-vm": "^5.0.1", -- "jsonwebtoken": "^9.0.0", -- "knex": "^2.4.0", -- "libphonenumber-js": "^1.10.48", --diff --git a/yarn.lock b/yarn.lock --index 7904bbef..30e88cd9 100644 ----- a/yarn.lock --+++ b/yarn.lock --@@ -5816,6 +5816,11 @@ base16@^1.0.0: -- resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz" -- integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= -- --+base64-js@^1.3.1: --+ version "1.5.1" --+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" --+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== --+ -- basic-auth@^2.0.1, basic-auth@~2.0.1: -- version "2.0.1" -- resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" --@@ -5868,6 +5873,15 @@ binary-extensions@^2.0.0: -- resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" -- integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -- --+bl@^4.0.3: --+ version "4.1.0" --+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" --+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== --+ dependencies: --+ buffer "^5.5.0" --+ inherits "^2.0.4" --+ readable-stream "^3.4.0" --+ -- bluebird@^3.5.5: -- version "3.7.2" -- resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" --@@ -6008,6 +6022,14 @@ buffer-writer@2.0.0: -- resolved "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz" -- integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== -- --+buffer@^5.5.0: --+ version "5.7.1" --+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" --+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== --+ dependencies: --+ base64-js "^1.3.1" --+ ieee754 "^1.1.13" --+ -- builtin-modules@^3.1.0: -- version "3.2.0" -- resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz" --@@ -6304,7 +6326,7 @@ chokidar@^3.4.2, chokidar@^3.5.2: -- optionalDependencies: -- fsevents "~2.3.2" -- ---chownr@^1.1.4: --+chownr@^1.1.1, chownr@^1.1.4: -- version "1.1.4" -- resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" -- integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== --@@ -7283,6 +7305,13 @@ decompress-response@^3.3.0: -- dependencies: -- mimic-response "^1.0.0" -- --+decompress-response@^6.0.0: --+ version "6.0.0" --+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" --+ integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== --+ dependencies: --+ mimic-response "^3.1.0" --+ -- dedent@^0.7.0: -- version "0.7.0" -- resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" --@@ -7770,7 +7799,7 @@ encoding@^0.1.12, encoding@^0.1.13: -- dependencies: -- iconv-lite "^0.6.2" -- ---end-of-stream@^1.1.0: --+end-of-stream@^1.1.0, end-of-stream@^1.4.1: -- version "1.4.4" -- resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" -- integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== --@@ -8488,6 +8517,11 @@ exit@^0.1.2: -- resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" -- integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -- --+expand-template@^2.0.3: --+ version "2.0.3" --+ resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" --+ integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== --+ -- expect@^27.4.6: -- version "27.4.6" -- resolved "https://registry.npmjs.org/expect/-/expect-27.4.6.tgz" --@@ -8914,6 +8948,11 @@ fresh@0.5.2: -- resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" -- integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -- --+fs-constants@^1.0.0: --+ version "1.0.0" --+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" --+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== --+ -- fs-extra@^10.0.0: -- version "10.0.0" -- resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz" --@@ -9169,6 +9208,11 @@ gitconfiglocal@^1.0.0: -- dependencies: -- ini "^1.3.2" -- --+github-from-package@0.0.0: --+ version "0.0.0" --+ resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" --+ integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== --+ -- glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: -- version "5.1.2" -- resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" --@@ -9717,6 +9761,11 @@ identity-obj-proxy@^3.0.0: -- dependencies: -- harmony-reflect "^1.4.6" -- --+ieee754@^1.1.13: --+ version "1.2.1" --+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" --+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== --+ -- ignore-by-default@^1.0.1: -- version "1.0.1" -- resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" --@@ -10238,6 +10287,13 @@ isobject@^3.0.1: -- resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" -- integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -- --+isolated-vm@^5.0.1: --+ version "5.0.1" --+ resolved "https://registry.yarnpkg.com/isolated-vm/-/isolated-vm-5.0.1.tgz#d87b12cf8889e351cb1598a4aeea00bb458bf20c" --+ integrity sha512-hs7+ff59Z2zDvavfcjuot/r1gm6Bmpt+GoZxmVfxUmXaX5scOvUq/Rnme+mUtSh5lW41hH8gAuvk/yTJDYO8Fg== --+ dependencies: --+ prebuild-install "^7.1.1" --+ -- isstream@~0.1.2: -- version "0.1.2" -- resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" --@@ -11616,6 +11672,11 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: -- resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" -- integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -- --+mimic-response@^3.1.0: --+ version "3.1.0" --+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" --+ integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== --+ -- min-indent@^1.0.0: -- version "1.0.1" -- resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" --@@ -11675,6 +11736,11 @@ minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: -- resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" -- integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -- --+minimist@^1.2.3: --+ version "1.2.8" --+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" --+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== --+ -- minipass-collect@^1.0.2: -- version "1.0.2" -- resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" --@@ -11780,6 +11846,11 @@ minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: -- minipass "^3.0.0" -- yallist "^4.0.0" -- --+mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: --+ version "0.5.3" --+ resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" --+ integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== --+ -- mkdirp-infer-owner@^2.0.0: -- version "2.0.0" -- resolved "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz" --@@ -11995,6 +12066,11 @@ nanoid@^3.3.7: -- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" -- integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== -- --+napi-build-utils@^1.0.1: --+ version "1.0.2" --+ resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" --+ integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== --+ -- natural-compare@^1.4.0: -- version "1.4.0" -- resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" --@@ -12023,6 +12099,13 @@ no-case@^3.0.4: -- lower-case "^2.0.2" -- tslib "^2.0.3" -- --+node-abi@^3.3.0: --+ version "3.65.0" --+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.65.0.tgz#ca92d559388e1e9cab1680a18c1a18757cdac9d3" --+ integrity sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA== --+ dependencies: --+ semver "^7.3.5" --+ -- node-addon-api@^5.0.0: -- version "5.1.0" -- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" --@@ -13683,6 +13766,24 @@ preact@^10.0.0: -- resolved "https://registry.npmjs.org/preact/-/preact-10.10.2.tgz" -- integrity sha512-GUXSsfwq4NKhlLYY5ctfNE0IjFk7Xo4952yPI8yMkXdhzeQmQ+FahZITe7CeHXMPyKBVQ8SoCmGNIy9TSOdhgQ== -- --+prebuild-install@^7.1.1: --+ version "7.1.2" --+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" --+ integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== --+ dependencies: --+ detect-libc "^2.0.0" --+ expand-template "^2.0.3" --+ github-from-package "0.0.0" --+ minimist "^1.2.3" --+ mkdirp-classic "^0.5.3" --+ napi-build-utils "^1.0.1" --+ node-abi "^3.3.0" --+ pump "^3.0.0" --+ rc "^1.2.7" --+ simple-get "^4.0.0" --+ tar-fs "^2.0.0" --+ tunnel-agent "^0.6.0" --+ -- prelude-ls@^1.2.1: -- version "1.2.1" -- resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" --@@ -13989,7 +14090,7 @@ raw-body@^2.5.2: -- iconv-lite "0.4.24" -- unpipe "1.0.0" -- ---rc@^1.2.8: --+rc@^1.2.7, rc@^1.2.8: -- version "1.2.8" -- resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" -- integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== --@@ -14342,6 +14443,15 @@ readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable -- string_decoder "~1.1.1" -- util-deprecate "~1.0.1" -- --+readable-stream@^3.1.1: --+ version "3.6.2" --+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" --+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== --+ dependencies: --+ inherits "^2.0.3" --+ string_decoder "^1.1.1" --+ util-deprecate "^1.0.1" --+ -- readdir-scoped-modules@^1.0.0: -- version "1.1.0" -- resolved "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz" --@@ -15054,6 +15164,20 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: -- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" -- integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -- --+simple-concat@^1.0.0: --+ version "1.0.1" --+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" --+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== --+ --+simple-get@^4.0.0: --+ version "4.0.1" --+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" --+ integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== --+ dependencies: --+ decompress-response "^6.0.0" --+ once "^1.3.1" --+ simple-concat "^1.0.0" --+ -- simple-swizzle@^0.2.2: -- version "0.2.2" -- resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" --@@ -15799,6 +15923,27 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: -- resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" -- integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -- --+tar-fs@^2.0.0: --+ version "2.1.1" --+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" --+ integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== --+ dependencies: --+ chownr "^1.1.1" --+ mkdirp-classic "^0.5.2" --+ pump "^3.0.0" --+ tar-stream "^2.1.4" --+ --+tar-stream@^2.1.4: --+ version "2.2.0" --+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" --+ integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== --+ dependencies: --+ bl "^4.0.3" --+ end-of-stream "^1.4.1" --+ fs-constants "^1.0.0" --+ inherits "^2.0.3" --+ readable-stream "^3.1.1" --+ -- tar@^4.4.12: -- version "4.4.19" -- resolved "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz" diff --git a/packages/backend/src/apps/code/actions/run-javascript/index.js b/packages/backend/src/apps/code/actions/run-javascript/index.js index 1f1b7200..5d436b21 100644 --- a/packages/backend/src/apps/code/actions/run-javascript/index.js +++ b/packages/backend/src/apps/code/actions/run-javascript/index.js @@ -39,7 +39,7 @@ export default defineAction({ { label: 'Code Snippet', key: 'codeSnippet', - type: 'string', + type: 'code', required: true, variables: false, value: 'const code = async (inputs) => { return true; };', @@ -49,31 +49,22 @@ export default defineAction({ async run($) { const { inputs = [], codeSnippet } = $.step.parameters; + const objectifiedInput = {}; + for (const input of inputs) { + objectifiedInput[input.key] = input.value; + } + const ivm = (await import('isolated-vm')).default; const isolate = new ivm.Isolate({ memoryLimit: 128 }); try { const context = await isolate.createContext(); + await context.global.set('inputs', new ivm.ExternalCopy(objectifiedInput).copyInto()) - const externalData = new ivm.ExternalCopy(inputs).copyInto(); + const compiledCodeSnippet = await isolate.compileScript(`${codeSnippet}; code(inputs);`); + const codeFunction = await compiledCodeSnippet.run(context, { reference: true, promise: true }); - const compiledCodeSnippet = await isolate.compileScript(codeSnippet); - - const codeRun = await compiledCodeSnippet.run(context); - - const codeFunction = await context.global.get('code', { - reference: true, - promise: true, - }); - - const result = await codeFunction.apply(undefined, [externalData], {}); - - // const codeReturn = await outRef.copy(); - const codeReturn = await result.copy(); - - // console.log(codeReturn); - - $.setActionItem({ raw: { output: codeReturn } }); + $.setActionItem({ raw: { output: await codeFunction.copy() } }); } finally { isolate.dispose(); } diff --git a/packages/web/package.json b/packages/web/package.json index e8068493..a785985b 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -11,6 +11,7 @@ "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", "@hookform/resolvers": "^2.8.8", + "@monaco-editor/react": "^4.6.0", "@mui/icons-material": "^5.11.9", "@mui/lab": "^5.0.0-alpha.120", "@mui/material": "^5.11.10", diff --git a/packages/web/src/components/CodeEditor/index.jsx b/packages/web/src/components/CodeEditor/index.jsx new file mode 100644 index 00000000..10ef11c1 --- /dev/null +++ b/packages/web/src/components/CodeEditor/index.jsx @@ -0,0 +1,104 @@ +import PropTypes from 'prop-types'; +import * as React from 'react'; +import InputLabel from '@mui/material/InputLabel'; +import { Controller, useFormContext } from 'react-hook-form'; +import Editor from '@monaco-editor/react'; +import { InputLabelWrapper } from './style'; + +function CodeEditor(props) { + const containerRef = React.useRef(null); + const editorRef = React.useRef(null); + const [containerHeight, setContainerHeight] = React.useState(20); + const { control } = useFormContext(); + const { + required, + name, + label, + defaultValue, + shouldUnregister = false, + disabled, + 'data-test': dataTest, + } = props; + + const handleEditorOnMount = (editor, monaco) => { + editorRef.current = editor; + + editor.onDidContentSizeChange((event) => { + const { + contentHeight, + contentHeightChanged, + } = event; + + if (contentHeightChanged) { + // cap the editor height at 500px + const editorContentHeight = Math.min(500, contentHeight); + + setContainerHeight(editorContentHeight); + }; + }); + }; + + return ( + ( +
+ + + {`${label}${required ? ' *' : ''}`} + + + +
+ { field.onChange(value, event); }} + options={{ + automaticLayout: true, + bracketPairColorization: true, + formatOnPaste: true, + minimap: { + enabled: false + }, + overviewRulerLanes: 0, + readOnly: disabled, + scrollBeyondLastLine: false, + wordWrap: 'on', + wrappingStrategy: 'advanced', + }} + /> +
+
+ + )} + /> + ); +} + +CodeEditor.propTypes = { + required: PropTypes.bool, + defaultValue: PropTypes.string, + shouldUnregister: PropTypes.bool, + name: PropTypes.string.isRequired, + label: PropTypes.string.isRequired, + readOnly: PropTypes.bool, + 'data-test': PropTypes.string, + disabled: PropTypes.bool, +}; + +export default CodeEditor; diff --git a/packages/web/src/components/CodeEditor/style.js b/packages/web/src/components/CodeEditor/style.js new file mode 100644 index 00000000..eb37e442 --- /dev/null +++ b/packages/web/src/components/CodeEditor/style.js @@ -0,0 +1,9 @@ +import { styled } from '@mui/material/styles'; + +export const InputLabelWrapper = styled('div')` + position: absolute; + top: ${({ theme }) => theme.spacing(1.75)}; + inset: 0; + left: -6px; + top: 16px; +`; diff --git a/packages/web/src/components/InputCreator/index.jsx b/packages/web/src/components/InputCreator/index.jsx index af82f000..70eeed70 100644 --- a/packages/web/src/components/InputCreator/index.jsx +++ b/packages/web/src/components/InputCreator/index.jsx @@ -6,6 +6,7 @@ import PropTypes from 'prop-types'; import useDynamicFields from 'hooks/useDynamicFields'; import useDynamicData from 'hooks/useDynamicData'; import PowerInput from 'components/PowerInput'; +import CodeEditor from 'components/CodeEditor'; import TextField from 'components/TextField'; import ControlledAutocomplete from 'components/ControlledAutocomplete'; import ControlledCustomAutocomplete from 'components/ControlledCustomAutocomplete'; @@ -126,6 +127,26 @@ function InputCreator(props) { ); } + if (type === 'code') { + return ( + + + + ); + } + if (type === 'string') { if (schema.variables) { return ( diff --git a/yarn.lock b/yarn.lock index 30e88cd9..a2cf496f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2934,6 +2934,20 @@ semver "^7.3.5" tar "^6.1.11" +"@monaco-editor/loader@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.4.0.tgz#f08227057331ec890fa1e903912a5b711a2ad558" + integrity sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg== + dependencies: + state-local "^1.0.6" + +"@monaco-editor/react@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.6.0.tgz#bcc68671e358a21c3814566b865a54b191e24119" + integrity sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw== + dependencies: + "@monaco-editor/loader" "^1.4.0" + "@msgpackr-extract/msgpackr-extract-darwin-arm64@2.1.2": version "2.1.2" resolved "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.1.2.tgz" @@ -15533,6 +15547,11 @@ standard-as-callback@^2.1.0: resolved "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz" integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== +state-local@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" + integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== + statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"