From c99b9dbe0a19add0e3cfed0d870765312ab291f5 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Mon, 29 Jul 2024 16:02:15 +0200 Subject: [PATCH 1/6] feat: Implement draft version of the code execution app --- docker/Dockerfile | 2 +- packages/backend/code-execution.patch | 332 ++++++++++++++++++ packages/backend/package.json | 1 + .../backend/src/apps/code/actions/index.js | 3 + .../apps/code/actions/run-javascript/index.js | 81 +++++ .../backend/src/apps/code/assets/favicon.svg | 5 + packages/backend/src/apps/code/index.js | 14 + yarn.lock | 151 +++++++- 8 files changed, 585 insertions(+), 4 deletions(-) create mode 100644 packages/backend/code-execution.patch create mode 100644 packages/backend/src/apps/code/actions/index.js create mode 100644 packages/backend/src/apps/code/actions/run-javascript/index.js create mode 100644 packages/backend/src/apps/code/assets/favicon.svg create mode 100644 packages/backend/src/apps/code/index.js diff --git a/docker/Dockerfile b/docker/Dockerfile index 64f47850..47e2f249 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/code-execution.patch b/packages/backend/code-execution.patch new file mode 100644 index 00000000..163b3d4c --- /dev/null +++ b/packages/backend/code-execution.patch @@ -0,0 +1,332 @@ +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/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/packages/backend/src/apps/code/actions/index.js b/packages/backend/src/apps/code/actions/index.js new file mode 100644 index 00000000..d2b42078 --- /dev/null +++ b/packages/backend/src/apps/code/actions/index.js @@ -0,0 +1,3 @@ +import runJavascript from './run-javascript/index.js'; + +export default [runJavascript]; diff --git a/packages/backend/src/apps/code/actions/run-javascript/index.js b/packages/backend/src/apps/code/actions/run-javascript/index.js new file mode 100644 index 00000000..1f1b7200 --- /dev/null +++ b/packages/backend/src/apps/code/actions/run-javascript/index.js @@ -0,0 +1,81 @@ +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Run Javascript', + key: 'runJavascript', + description: + 'Run browser Javascript code. You can not use NodeJS specific features and npm packages.', + arguments: [ + { + label: 'Inputs', + key: 'inputs', + type: 'dynamic', + required: false, + description: + 'To be able to use data from previous steps, you need to expose them as input entries. You can access these input values in your code by using the `inputs` argument.', + value: [ + { + key: '', + value: '', + }, + ], + fields: [ + { + label: 'Key', + key: 'key', + type: 'string', + required: true, + variables: true, + }, + { + label: 'Value', + key: 'value', + type: 'string', + required: true, + variables: true, + }, + ], + }, + { + label: 'Code Snippet', + key: 'codeSnippet', + type: 'string', + required: true, + variables: false, + value: 'const code = async (inputs) => { return true; };', + }, + ], + + async run($) { + const { inputs = [], codeSnippet } = $.step.parameters; + + const ivm = (await import('isolated-vm')).default; + const isolate = new ivm.Isolate({ memoryLimit: 128 }); + + try { + const context = await isolate.createContext(); + + const externalData = new ivm.ExternalCopy(inputs).copyInto(); + + 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 } }); + } finally { + isolate.dispose(); + } + }, +}); diff --git a/packages/backend/src/apps/code/assets/favicon.svg b/packages/backend/src/apps/code/assets/favicon.svg new file mode 100644 index 00000000..a3d20164 --- /dev/null +++ b/packages/backend/src/apps/code/assets/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/backend/src/apps/code/index.js b/packages/backend/src/apps/code/index.js new file mode 100644 index 00000000..36e9e5ed --- /dev/null +++ b/packages/backend/src/apps/code/index.js @@ -0,0 +1,14 @@ +import defineApp from '../../helpers/define-app.js'; +import actions from './actions/index.js'; + +export default defineApp({ + name: 'Code', + key: 'code', + baseUrl: '', + apiBaseUrl: '', + iconUrl: '{BASE_URL}/apps/code/assets/favicon.svg', + authDocUrl: '{DOCS_URL}/apps/code/connection', + primaryColor: '000000', + supportsConnections: false, + actions, +}); 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" From 49d4071928daaaa9926846270fb1b645272ec01b Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Mon, 29 Jul 2024 15:19:05 +0000 Subject: [PATCH 2/6] feat(code/run-javascript): run async code and introduce monaco editor --- packages/backend/code-execution.patch | 332 ------------------ .../apps/code/actions/run-javascript/index.js | 29 +- packages/web/package.json | 1 + .../web/src/components/CodeEditor/index.jsx | 104 ++++++ .../web/src/components/CodeEditor/style.js | 9 + .../web/src/components/InputCreator/index.jsx | 21 ++ yarn.lock | 19 + 7 files changed, 164 insertions(+), 351 deletions(-) delete mode 100644 packages/backend/code-execution.patch create mode 100644 packages/web/src/components/CodeEditor/index.jsx create mode 100644 packages/web/src/components/CodeEditor/style.js 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" From 268d8c8b7d7accca764fef7ec24d09f582ee10af Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Wed, 31 Jul 2024 13:10:19 +0200 Subject: [PATCH 3/6] feat(code): Add linebreaks to the default code value --- packages/backend/src/apps/code/actions/run-javascript/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5d436b21..ca36e50a 100644 --- a/packages/backend/src/apps/code/actions/run-javascript/index.js +++ b/packages/backend/src/apps/code/actions/run-javascript/index.js @@ -42,7 +42,7 @@ export default defineAction({ type: 'code', required: true, variables: false, - value: 'const code = async (inputs) => { return true; };', + value: 'const code = async (inputs) => { \n return true;\n};', }, ], From 60fdfc2b4894d61cc950b1c907fa6787b7cffc15 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Wed, 31 Jul 2024 13:10:36 +0200 Subject: [PATCH 4/6] chore(code): Make font size of the code editor a bit bigger --- .../web/src/components/CodeEditor/index.jsx | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/web/src/components/CodeEditor/index.jsx b/packages/web/src/components/CodeEditor/index.jsx index 10ef11c1..5b4fc985 100644 --- a/packages/web/src/components/CodeEditor/index.jsx +++ b/packages/web/src/components/CodeEditor/index.jsx @@ -24,17 +24,14 @@ function CodeEditor(props) { editorRef.current = editor; editor.onDidContentSizeChange((event) => { - const { - contentHeight, - contentHeightChanged, - } = event; + const { contentHeight, contentHeightChanged } = event; if (contentHeightChanged) { // cap the editor height at 500px const editorContentHeight = Math.min(500, contentHeight); setContainerHeight(editorContentHeight); - }; + } }); }; @@ -45,10 +42,8 @@ function CodeEditor(props) { defaultValue={defaultValue || ''} control={control} shouldUnregister={shouldUnregister} - render={({ - field, - }) => ( -
+ render={({ field }) => ( +
-
+
{ field.onChange(value, event); }} + onChange={(value, event) => { + field.onChange(value, event); + }} options={{ + fontSize: 13, automaticLayout: true, bracketPairColorization: true, formatOnPaste: true, minimap: { - enabled: false + enabled: false, }, overviewRulerLanes: 0, readOnly: disabled, @@ -84,7 +85,6 @@ function CodeEditor(props) { />
- )} /> ); From 4f6727810baf6cb4980d44a2638d0e14fc3a1fed Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Wed, 31 Jul 2024 16:29:15 +0200 Subject: [PATCH 5/6] feat(code): Improve the default code by adding usage comments --- .../apps/code/actions/run-javascript/index.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) 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 ca36e50a..64020cec 100644 --- a/packages/backend/src/apps/code/actions/run-javascript/index.js +++ b/packages/backend/src/apps/code/actions/run-javascript/index.js @@ -42,7 +42,8 @@ export default defineAction({ type: 'code', required: true, variables: false, - value: 'const code = async (inputs) => { \n return true;\n};', + value: + 'const code = async (inputs) => { \n // E.g. if you have an input called username,\n // you can access its value by calling inputs.username\n // Return value will be used as output of this step.\n\n return true;\n};', }, ], @@ -59,10 +60,18 @@ export default defineAction({ try { const context = await isolate.createContext(); - await context.global.set('inputs', new ivm.ExternalCopy(objectifiedInput).copyInto()) + await context.global.set( + 'inputs', + new ivm.ExternalCopy(objectifiedInput).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}; code(inputs);` + ); + const codeFunction = await compiledCodeSnippet.run(context, { + reference: true, + promise: true, + }); $.setActionItem({ raw: { output: await codeFunction.copy() } }); } finally { From 4b1e66add325dca86b663035d95f9265c93271c9 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Thu, 1 Aug 2024 09:50:09 +0000 Subject: [PATCH 6/6] feat(code/run-javascript): omit empty key entries --- .../backend/src/apps/code/actions/run-javascript/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 64020cec..3b940998 100644 --- a/packages/backend/src/apps/code/actions/run-javascript/index.js +++ b/packages/backend/src/apps/code/actions/run-javascript/index.js @@ -52,7 +52,9 @@ export default defineAction({ const objectifiedInput = {}; for (const input of inputs) { - objectifiedInput[input.key] = input.value; + if (input.key) { + objectifiedInput[input.key] = input.value; + } } const ivm = (await import('isolated-vm')).default;