From 51a4cd359e52c71c90a87d0048db9c2ec897bd4b Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 17 May 2022 20:42:05 +0200 Subject: [PATCH] feat: Typescript support for scripts (alpha) * typescript support * frontend * type inference * type inference * v0 works * v0 typescript * v0 typescript * deno-client v0 * deno-client v0 * build_deno * rm autogenerated files * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * test workflow * on tags * createResource * createResource * createResource2 * typescript support * templates * include version --- .github/workflows/deno_on_release.yml | 49 ++ backend/Cargo.lock | 477 +++++++++++++++++- backend/Cargo.toml | 3 + ...20220504193929_typescript_support.down.sql | 12 + .../20220504193929_typescript_support.up.sql | 11 + backend/openapi.yaml | 50 +- backend/sqlx-data.json | 162 +++--- backend/src/jobs.rs | 43 +- backend/src/parser.rs | 164 +++++- backend/src/scripts.rs | 42 +- backend/src/worker.rs | 320 ++++++++---- backend/v8.snap | Bin 85896 -> 86529 bytes deno-client/.gitignore | 1 + deno-client/.vscode/settings.json | 5 + deno-client/generate.sh | 5 + deno-client/index.ts | 46 ++ deno-client/openapitools.json | 7 + frontend/Caddyfile | 4 + frontend/package-lock.json | 4 +- frontend/src/infer.ts | 26 +- frontend/src/routes/components/Editor.svelte | 100 ++-- .../src/routes/components/GroupModal.svelte | 4 +- .../routes/components/ScriptBuilder.svelte | 75 ++- .../src/routes/components/ScriptEditor.svelte | 69 ++- .../src/routes/components/ScriptPicker.svelte | 18 +- frontend/src/routes/run/[...run].svelte | 13 +- frontend/src/routes/scripts.svelte | 3 +- frontend/src/routes/scripts/add.svelte | 80 +-- .../src/routes/scripts/edit/[...hash].svelte | 27 +- .../src/routes/scripts/get/[...hash].svelte | 8 +- .../src/routes/scripts/run/[...hash].svelte | 2 +- frontend/svelte.config.js | 12 + lsp/pyls_launcher.py | 5 + nsjail/run.deno.config.proto | 108 ++++ ....config.proto => run.python3.config.proto} | 0 35 files changed, 1566 insertions(+), 389 deletions(-) create mode 100644 .github/workflows/deno_on_release.yml create mode 100644 backend/migrations/20220504193929_typescript_support.down.sql create mode 100644 backend/migrations/20220504193929_typescript_support.up.sql create mode 100644 deno-client/.gitignore create mode 100644 deno-client/.vscode/settings.json create mode 100755 deno-client/generate.sh create mode 100644 deno-client/index.ts create mode 100644 deno-client/openapitools.json create mode 100644 nsjail/run.deno.config.proto rename nsjail/{run.config.proto => run.python3.config.proto} (100%) diff --git a/.github/workflows/deno_on_release.yml b/.github/workflows/deno_on_release.yml new file mode 100644 index 0000000000..f194b96567 --- /dev/null +++ b/.github/workflows/deno_on_release.yml @@ -0,0 +1,49 @@ +name: Publish deno-client +on: + push: + tags: + - "v*" +env: + repo: windmill-deno-client + +jobs: + build_deno_and_push_to_repo: + runs-on: ubuntu-latest + container: openapitools/openapi-generator-cli:v6.0.0-beta + steps: + - uses: actions/checkout@v3 + - name: generate_deno + run: | + cd deno-client + rm .gitignore + ./generate.sh + - name: Pushes to another repository + id: push_directory + uses: cpina/github-action-push-to-another-repository@devel + env: + API_TOKEN_GITHUB: ${{ secrets.DENO_PAT }} + with: + source-directory: deno-client/ + destination-github-username: ${{ github.repository_owner }} + destination-repository-name: ${{ env.repo }} + user-email: ruben@windmill.dev + commit-message: See ORIGIN_COMMIT from $GITHUB_REF + target-branch: main + + tag_repo: + needs: [build_deno_and_push_to_repo] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + repository: ${{ github.repository_owner }}/${{ env.repo }} + token: ${{ secrets.DENO_PAT }} + path: ./client + + - name: Push client + run: | + cd ./client + git config --global user.email "ruben@windmill.dev" + git config --global user.name "rubenfiszel[bot]" + git tag -a ${{ github.ref_name }} -m "${{ github.ref_name }}" + git push --tags diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 50a7d6db2f..a15f3d6e30 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -2,6 +2,16 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "adler" version = "1.0.2" @@ -87,6 +97,20 @@ dependencies = [ "term", ] +[[package]] +name = "ast_node" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc4c00309ed1c8104732df4a5fa9acc3b796b6f8531dfbd5ce0078c86f997244" +dependencies = [ + "darling", + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + [[package]] name = "async-lock" version = "2.5.0" @@ -255,6 +279,15 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +[[package]] +name = "better_scoped_tls" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73e8ecdec39e98aa3b19e8cd0b8ed8f77ccb86a6b0b2dc7cd86d105438a2123" +dependencies = [ + "scoped-tls", +] + [[package]] name = "bit-set" version = "0.5.2" @@ -606,6 +639,41 @@ dependencies = [ "subtle 1.0.0", ] +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.9.3", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "data-encoding" version = "2.3.2" @@ -618,6 +686,15 @@ version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" +[[package]] +name = "debug_unreachable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a032eac705ca39214d169f83e3d3da290af06d8d1d344d1baad2fd002dca4b3" +dependencies = [ + "unreachable", +] + [[package]] name = "deno_core" version = "0.110.0" @@ -725,7 +802,7 @@ dependencies = [ "lazy_static", "regex", "serde", - "strsim", + "strsim 0.10.0", ] [[package]] @@ -782,6 +859,18 @@ dependencies = [ "syn", ] +[[package]] +name = "enum_kind" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b940da354ae81ef0926c5eaa428207b8f4f091d3956c891dfbd124162bed99" +dependencies = [ + "pmutil", + "proc-macro2", + "swc_macros_common", + "syn", +] + [[package]] name = "event-listener" version = "2.5.2" @@ -880,6 +969,18 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "from_variant" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0951635027ca477be98f8774abd6f0345233439d63f307e47101acb40c7cc63d" +dependencies = [ + "pmutil", + "proc-macro2", + "swc_macros_common", + "syn", +] + [[package]] name = "fslock" version = "0.1.8" @@ -1402,6 +1503,12 @@ dependencies = [ "tokio-native-tls", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.2.3" @@ -1472,6 +1579,19 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35e70ee094dc02fd9c13fdad4940090f22dbd6ac7c9e7094a46cf0232a50bc7c" +[[package]] +name = "is-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b2c46692aee0d1b3aad44e781ac0f0e7db42ef27adaa0a877b627040019813" +dependencies = [ + "Inflector", + "pmutil", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "itertools" version = "0.8.2" @@ -1550,7 +1670,7 @@ dependencies = [ "serde", "serde_derive", "sha2 0.8.2", - "string_cache", + "string_cache 0.7.5", "term", "unicode-xid 0.1.0", ] @@ -1593,6 +1713,79 @@ dependencies = [ "webpki-roots 0.22.3", ] +[[package]] +name = "lexical" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd3e434c16f0164124ade12dcdee324fcc3dafb1cad0c7f1d8c2451a1aa6886" +dependencies = [ + "lexical-core", +] + +[[package]] +name = "lexical-core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92912c4af2e7d9075be3e5e3122c4d7263855fa6cce34fbece4dd08e5884624d" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f518eed87c3be6debe6d26b855c97358d8a11bf05acec137e5f53080f5ad2dd8" +dependencies = [ + "lexical-parse-integer", + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc852ec67c6538bbb2b9911116a385b24510e879a69ab516e6a151b15a79168" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-util" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c72a9d52c5c4e62fa2cdc2cb6c694a39ae1382d9c2a17a466f18e272a0930eb1" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "lexical-write-float" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a89ec1d062e481210c309b672f73a0567b7855f21e7d2fae636df44d12e97f9" +dependencies = [ + "lexical-util", + "lexical-write-integer", + "static_assertions", +] + +[[package]] +name = "lexical-write-integer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "094060bd2a7c2ff3a16d5304a6ae82727cb3cc9d1c70f813cc73f744c319337e" +dependencies = [ + "lexical-util", + "static_assertions", +] + [[package]] name = "libc" version = "0.2.123" @@ -1853,6 +2046,18 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg 1.1.0", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "num-integer" version = "0.1.44" @@ -2055,17 +2260,36 @@ version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" dependencies = [ - "phf_shared", + "phf_shared 0.7.24", "rand 0.6.5", ] +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + [[package]] name = "phf_shared" version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" dependencies = [ - "siphasher", + "siphasher 0.2.3", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.10", ] [[package]] @@ -2112,6 +2336,17 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +[[package]] +name = "pmutil" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3894e5d549cccbe44afecf72922f277f603cd4bb0219c8342631ef18fffbe004" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ppv-lite86" version = "0.2.16" @@ -2569,6 +2804,12 @@ dependencies = [ "walkdir", ] +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustls" version = "0.19.1" @@ -2612,7 +2853,7 @@ dependencies = [ "lalrpop", "lalrpop-util", "log", - "num-bigint", + "num-bigint 0.2.6", "num-traits", "unic-emoji-char", "unic-ucd-ident", @@ -2644,6 +2885,12 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + [[package]] name = "scopeguard" version = "1.1.0" @@ -2837,6 +3084,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + [[package]] name = "slab" version = "0.4.6" @@ -3008,6 +3261,12 @@ dependencies = [ "tokio-rustls 0.22.0", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "string_cache" version = "0.7.5" @@ -3016,32 +3275,71 @@ checksum = "89c058a82f9fd69b1becf8c274f412281038877c553182f1d02eb027045a2d67" dependencies = [ "lazy_static", "new_debug_unreachable", - "phf_shared", + "phf_shared 0.7.24", "precomputed-hash", "serde", - "string_cache_codegen", + "string_cache_codegen 0.4.4", "string_cache_shared", ] +[[package]] +name = "string_cache" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot 0.12.0", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + [[package]] name = "string_cache_codegen" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f45ed1b65bf9a4bf2f7b7dc59212d1926e9eaf00fa998988e420fd124467c6" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.7.24", + "phf_shared 0.7.24", "proc-macro2", "quote", "string_cache_shared", ] +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + [[package]] name = "string_cache_shared" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc" +[[package]] +name = "string_enum" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f584cc881e9e5f1fd6bf827b0444aa94c30d8fe6378cf241071b5f5700b2871f" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + [[package]] name = "stringprep" version = "0.1.2" @@ -3052,6 +3350,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" + [[package]] name = "strsim" version = "0.10.0" @@ -3070,6 +3374,125 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +[[package]] +name = "swc_atoms" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8735ce37e421749498e038955abc1135eec6a4af0b54a173e55d2e5542d472" +dependencies = [ + "string_cache 0.8.4", + "string_cache_codegen 0.5.2", +] + +[[package]] +name = "swc_common" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5988fd245a86176271951c089f9144b7b48014bc1212872f9bd194f5f0f9dfd" +dependencies = [ + "ahash", + "ast_node", + "better_scoped_tls", + "cfg-if 1.0.0", + "debug_unreachable", + "either", + "from_variant", + "num-bigint 0.4.3", + "once_cell", + "rustc-hash", + "serde", + "siphasher 0.3.10", + "string_cache 0.8.4", + "swc_eq_ignore_macros", + "swc_visit", + "tracing", + "unicode-width", + "url", +] + +[[package]] +name = "swc_ecma_ast" +version = "0.78.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed68ad13e4489f309ffed9d302337d7c8bde11d00b8b275b7aa7fda4da035bf" +dependencies = [ + "is-macro", + "num-bigint 0.4.3", + "serde", + "string_enum", + "swc_atoms", + "swc_common", + "unicode-id", +] + +[[package]] +name = "swc_ecma_parser" +version = "0.104.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb97dc6efc95313dedc5158055cc811da77395ef7b54be61948b5ad097a3671" +dependencies = [ + "either", + "enum_kind", + "lexical", + "num-bigint 0.4.3", + "serde", + "smallvec", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "tracing", + "typed-arena", + "unicode-id", +] + +[[package]] +name = "swc_eq_ignore_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c8f200a2eaed938e7c1a685faaa66e6d42fa9e17da5f62572d3cbc335898f5e" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_macros_common" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5dca3f08d02da4684c3373150f7c045128f81ea00f0c434b1b012bc65a6cce3" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_visit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c639379dd2a8a0221fa1e12fafbdd594ba53a0cace6560054da52409dfcc1a" +dependencies = [ + "either", + "swc_visit_macros", +] + +[[package]] +name = "swc_visit_macros" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b9b72892df873972549838bf84d6c56234c7502148a7e23b5a3da6e0fedfb8" +dependencies = [ + "Inflector", + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + [[package]] name = "syn" version = "1.0.91" @@ -3607,6 +4030,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "typed-arena" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae" + [[package]] name = "typenum" version = "1.15.0" @@ -3691,6 +4120,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +[[package]] +name = "unicode-id" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69fe8d9274f490a36442acb4edfd0c4e473fdfc6a8b5cd32f28a0235761aedbe" + [[package]] name = "unicode-normalization" version = "0.1.19" @@ -3706,6 +4141,12 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + [[package]] name = "unicode-xid" version = "0.1.0" @@ -3730,6 +4171,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87d6678d7916394abad0d4b19df4d3802e1fd84abd7d701f39b75ee71b9e8cf1" +[[package]] +name = "unreachable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" +dependencies = [ + "void", +] + [[package]] name = "untrusted" version = "0.7.1" @@ -3796,6 +4246,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "walkdir" version = "2.3.2" @@ -4066,6 +4522,9 @@ dependencies = [ "slack-http-verifier", "sql-builder", "sqlx", + "swc_common", + "swc_ecma_ast", + "swc_ecma_parser", "tempfile", "thiserror", "time 0.3.9", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index c1aebc4154..c7526aec41 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -55,6 +55,9 @@ regex = "^1" deno_core = "^0" indexmap = "~1.6.2" async-recursion = "^1" +swc_common = "^0" +swc_ecma_parser = "^0" +swc_ecma_ast = "^0" sqlx = { version = "^0", features = ["macros", "offline", "migrate", "uuid", "json", "chrono", "postgres", "runtime-tokio-rustls"]} dotenv = "^0" diff --git a/backend/migrations/20220504193929_typescript_support.down.sql b/backend/migrations/20220504193929_typescript_support.down.sql new file mode 100644 index 0000000000..ffee7499ec --- /dev/null +++ b/backend/migrations/20220504193929_typescript_support.down.sql @@ -0,0 +1,12 @@ +-- Add down migration script here +DROP TYPE SCRIPT_LANG; + +ALTER TABLE script +DROP COLUMN language SCRIPT_LANG; + +ALTER TABLE queue +DROP COLUMN language SCRIPT_LANG; + +ALTER TABLE completed_job +DROP COLUMN language SCRIPT_LANG; + diff --git a/backend/migrations/20220504193929_typescript_support.up.sql b/backend/migrations/20220504193929_typescript_support.up.sql new file mode 100644 index 0000000000..7be9d83390 --- /dev/null +++ b/backend/migrations/20220504193929_typescript_support.up.sql @@ -0,0 +1,11 @@ +-- Add up migration script here +CREATE TYPE SCRIPT_LANG AS ENUM ('python3', 'deno'); + +ALTER TABLE script +ADD COLUMN language SCRIPT_LANG NOT NULL DEFAULT 'python3'; + +ALTER TABLE queue +ADD COLUMN language SCRIPT_LANG NOT NULL DEFAULT 'python3'; + +ALTER TABLE completed_job +ADD COLUMN language SCRIPT_LANG NOT NULL DEFAULT 'python3'; diff --git a/backend/openapi.yaml b/backend/openapi.yaml index f137653e52..0b4e737f19 100644 --- a/backend/openapi.yaml +++ b/backend/openapi.yaml @@ -1317,11 +1317,16 @@ paths: type: array items: type: string + language: + type: string + enum: [python3, deno] + required: - path - summary - description - content + - language responses: "201": description: script created @@ -1330,14 +1335,35 @@ paths: schema: type: string - /scripts/tojsonschema: + /scripts/python/tojsonschema: post: - summary: inspect code to infer jsonschema of arguments - operationId: toJsonschema + summary: inspect python code to infer jsonschema of arguments + operationId: pythonToJsonschema tags: - script requestBody: - description: code with the main function + description: python code with the main function + required: true + content: + application/json: + schema: + type: string + responses: + "200": + description: parsed args + content: + application/json: + schema: + $ref: "#/components/schemas/MainArgSignature" + + /scripts/deno/tojsonschema: + post: + summary: inspect deno code to infer jsonschema of arguments + operationId: denoToJsonschema + tags: + - script + requestBody: + description: deno code with the main function required: true content: application/json: @@ -2654,6 +2680,9 @@ components: type: string lock_error_logs: type: string + language: + type: string + enum: [python3, deno] required: - hash - path @@ -2665,10 +2694,11 @@ components: - deleted - is_template - extra_perms + - language ScriptArgs: type: object - additionalProperties: true + additionalProperties: {} QueuedJob: type: object @@ -2729,6 +2759,9 @@ components: $ref: "#/components/schemas/FlowValue" is_flow_step: type: boolean + language: + type: string + enum: [python3, deno] required: - id - running @@ -2796,6 +2829,9 @@ components: $ref: "#/components/schemas/FlowValue" is_flow_step: type: boolean + language: + type: string + enum: [python3, deno] required: - id - created_by @@ -3057,10 +3093,14 @@ components: type: string args: $ref: "#/components/schemas/ScriptArgs" + language: + type: string + enum: [python3, deno] required: - content - args + - language CreateResource: type: object diff --git a/backend/sqlx-data.json b/backend/sqlx-data.json index 658d76db61..8bbb702e08 100644 --- a/backend/sqlx-data.json +++ b/backend/sqlx-data.json @@ -436,6 +436,64 @@ ] } }, + "2420cb110a116dfbc6b8658a6d2d35db60c6aadd157488cb72eb9116ae7e9f54": { + "query": "INSERT INTO queue\n (workspace_id, id, parent_job, created_by, permissioned_as, scheduled_for, \n script_hash, script_path, raw_code, args, job_kind, schedule_path, raw_flow, flow_status, is_flow_step, language)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Uuid", + "Uuid", + "Varchar", + "Varchar", + "Timestamptz", + "Int8", + "Varchar", + "Text", + "Jsonb", + { + "Custom": { + "name": "job_kind", + "kind": { + "Enum": [ + "script", + "preview", + "flow", + "dependencies", + "flowpreview" + ] + } + } + }, + "Varchar", + "Jsonb", + "Jsonb", + "Bool", + { + "Custom": { + "name": "script_lang", + "kind": { + "Enum": [ + "python3", + "deno" + ] + } + } + } + ] + }, + "nullable": [ + false + ] + } + }, "255aafff962738317f3227ae4eb871830d89b4c12c73d8dbabe6836da124e54d": { "query": "select path from script where hash = $1 AND (workspace_id = $2 OR workspace_id = 'starter')", "describe": { @@ -1902,53 +1960,6 @@ "nullable": [] } }, - "a151ceeddfd4a2825d4528542d3adc5c0a6947573558a2fd62429ba5da369617": { - "query": "INSERT INTO queue\n (workspace_id, id, parent_job, created_by, permissioned_as, scheduled_for, \n script_hash, script_path, raw_code, args, job_kind, schedule_path, raw_flow, flow_status, is_flow_step)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) RETURNING id", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Uuid" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Uuid", - "Uuid", - "Varchar", - "Varchar", - "Timestamptz", - "Int8", - "Varchar", - "Text", - "Jsonb", - { - "Custom": { - "name": "job_kind", - "kind": { - "Enum": [ - "script", - "preview", - "flow", - "dependencies", - "flowpreview" - ] - } - } - }, - "Varchar", - "Jsonb", - "Jsonb", - "Bool" - ] - }, - "nullable": [ - false - ] - } - }, "a1d46b44718a63d6ce5a9054d493dadbffb205500dc8fb55e9816bcdb613e0d5": { "query": "DELETE FROM queue WHERE schedule_path = $1", "describe": { @@ -2300,6 +2311,40 @@ ] } }, + "be33c6eb702c149044650d49b3c50493d7538d590be3f4ff6242fea85c57c667": { + "query": "INSERT INTO script (workspace_id, hash, path, parent_hashes, summary, description, content, created_by, schema, is_template, extra_perms, lock, language) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::text::json, $10, $11, $12, $13)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Int8", + "Varchar", + "Int8Array", + "Text", + "Text", + "Text", + "Varchar", + "Text", + "Bool", + "Jsonb", + "Text", + { + "Custom": { + "name": "script_lang", + "kind": { + "Enum": [ + "python3", + "deno" + ] + } + } + } + ] + }, + "nullable": [] + } + }, "bf1d8e043338867e1da1ed236ff6c85a566d5fd58d4b0d5c3a10454513811ba3": { "query": "UPDATE workspace_settings\n SET slack_team_id = null, slack_name = null WHERE workspace_id = $1", "describe": { @@ -2802,29 +2847,6 @@ ] } }, - "f12e710a0c2b2e13b98fd522028b6af8be74a9126a8207aa2974b47fd36e1845": { - "query": "INSERT INTO script (workspace_id, hash, path, parent_hashes, summary, description, content, created_by, schema, is_template, extra_perms, lock) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::text::json, $10, $11, $12)", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Int8", - "Varchar", - "Int8Array", - "Text", - "Text", - "Text", - "Varchar", - "Text", - "Bool", - "Jsonb", - "Text" - ] - }, - "nullable": [] - } - }, "f325a1262084bd3468e12dc8bcc289a96536f172b679af54dd0fbc82d4d7c987": { "query": "DELETE FROM usr_to_group WHERE usr = $1 AND group_ = $2 AND workspace_id = $3", "describe": { diff --git a/backend/src/jobs.rs b/backend/src/jobs.rs index e3902a5716..524ca2274c 100644 --- a/backend/src/jobs.rs +++ b/backend/src/jobs.rs @@ -12,6 +12,7 @@ use sqlx::{query_scalar, Postgres, Transaction}; use std::collections::HashMap; use crate::js_eval::eval_timeout; +use crate::scripts::ScriptLang; use crate::users::create_token_for_owner; use crate::{ audit::{audit_log, ActionKind}, @@ -83,6 +84,7 @@ pub struct QueuedJob { pub flow_status: Option, pub raw_flow: Option, pub is_flow_step: bool, + pub language: ScriptLang, } #[derive(Debug, sqlx::FromRow, Serialize)] @@ -111,6 +113,7 @@ struct CompletedJob { flow_status: Option, raw_flow: Option, is_flow_step: bool, + language: ScriptLang, } #[derive(Deserialize, Clone, Copy)] @@ -264,6 +267,7 @@ async fn run_preview_job( JobPayload::Code(RawCode { content: preview.content, path: preview.path, + language: preview.language, }), preview.args, &authed.username, @@ -417,6 +421,7 @@ async fn list_jobs( "permissioned_as", "flow_status", "is_flow_step", + "language", ], ); let sqlc = list_completed_jobs_query( @@ -450,6 +455,7 @@ async fn list_jobs( "permissioned_as", "flow_status", "is_flow_step", + "language", ], ); let sql = format!( @@ -564,6 +570,7 @@ async fn list_completed_jobs( "null as flow_status", "null as raw_flow", "is_flow_step", + "language", ], ) .sql()?; @@ -857,6 +864,7 @@ struct UnifiedJob { permissioned_as: String, flow_status: Option, is_flow_step: bool, + language: ScriptLang, } impl From for Job { @@ -887,6 +895,7 @@ impl From for Job { flow_status: uj.flow_status, raw_flow: None, is_flow_step: uj.is_flow_step, + language: uj.language, }), "QueuedJob" => Job::QueuedJob(QueuedJob { workspace_id: uj.workspace_id, @@ -912,6 +921,7 @@ impl From for Job { flow_status: uj.flow_status, raw_flow: None, is_flow_step: uj.is_flow_step, + language: uj.language, }), t => panic!("job type {} not valid", t), } @@ -925,6 +935,7 @@ struct CancelJob { pub struct RawCode { content: String, path: Option, + language: ScriptLang, } #[derive(Deserialize)] @@ -932,6 +943,7 @@ struct Preview { content: String, path: Option, args: Option>, + language: ScriptLang, } #[derive(Deserialize)] @@ -1004,22 +1016,32 @@ pub async fn push<'c>( } } - let (script_hash, script_path, raw_code, job_kind, raw_flow) = match job_payload { + let (script_hash, script_path, raw_code, job_kind, raw_flow, language) = match job_payload { JobPayload::ScriptHash { hash, path } => { - (Some(hash.0), Some(path), None, JobKind::Script, None) - } - JobPayload::Code(RawCode { content, path }) => { - (None, path, Some(content), JobKind::Preview, None) + (Some(hash.0), Some(path), None, JobKind::Script, None, None) } + JobPayload::Code(RawCode { + content, + path, + language, + }) => ( + None, + path, + Some(content), + JobKind::Preview, + None, + Some(language), + ), JobPayload::Dependencies { hash, dependencies } => ( Some(hash.0), None, Some(dependencies.join("\n")), JobKind::Dependencies, None, + Some(ScriptLang::Python3), ), JobPayload::RawFlow { value, path } => { - (None, path, None, JobKind::FlowPreview, Some(value)) + (None, path, None, JobKind::FlowPreview, Some(value), None) } JobPayload::Flow(flow) => { let value_json = sqlx::query_scalar!("SELECT value FROM flow WHERE path = $1 AND (workspace_id = $2 OR workspace_id = 'starter')", @@ -1032,7 +1054,7 @@ pub async fn push<'c>( "could not convert json to flow for {flow}: {err:?}" )) })?; - (None, Some(flow), None, JobKind::Flow, Some(value)) + (None, Some(flow), None, JobKind::Flow, Some(value), None) } }; @@ -1046,8 +1068,8 @@ pub async fn push<'c>( let uuid = sqlx::query_scalar!( "INSERT INTO queue (workspace_id, id, parent_job, created_by, permissioned_as, scheduled_for, - script_hash, script_path, raw_code, args, job_kind, schedule_path, raw_flow, flow_status, is_flow_step) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) RETURNING id", + script_hash, script_path, raw_code, args, job_kind, schedule_path, raw_flow, flow_status, is_flow_step, language) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) RETURNING id", workspace_id, job_id, parent_job, @@ -1062,7 +1084,8 @@ pub async fn push<'c>( schedule_path, raw_flow.map(|f| serde_json::json!(f)), flow_status.map(|f| serde_json::json!(f)), - is_flow_step + is_flow_step, + language: ScriptLang ) .fetch_one(&mut tx) .await?; diff --git a/backend/src/parser.rs b/backend/src/parser.rs index 3b5ef04a3e..a2118832c5 100644 --- a/backend/src/parser.rs +++ b/backend/src/parser.rs @@ -25,7 +25,7 @@ pub struct MainArgSignature { pub args: Vec, } -#[derive(Serialize)] +#[derive(Serialize, Clone)] #[serde(rename_all(serialize = "lowercase"))] pub enum Typ { Str, @@ -39,7 +39,7 @@ pub enum Typ { Unknown, } -#[derive(Serialize)] +#[derive(Serialize, Clone)] pub struct Arg { pub name: String, pub typ: Typ, @@ -47,7 +47,7 @@ pub struct Arg { pub has_default: bool, } -pub fn parse_signature(code: &str) -> error::Result { +pub fn parse_python_signature(code: &str) -> error::Result { let ast = parser::parse_program(code) .map_err(|e| error::Error::ExecutionErr(format!("Error parsing code: {}", e.to_string())))? .statements; @@ -115,6 +115,136 @@ pub fn parse_signature(code: &str) -> error::Result { } } +use swc_common::sync::Lrc; +use swc_common::{FileName, SourceMap}; +use swc_ecma_ast::{ + AssignPat, BindingIdent, Decl, ExportDecl, FnDecl, Ident, ModuleDecl, ModuleItem, Pat, Stmt, + TsKeywordTypeKind, TsType, +}; +use swc_ecma_parser::{lexer::Lexer, Parser, StringInput, Syntax, TsConfig}; + +pub fn parse_deno_signature(code: &str) -> error::Result { + let cm: Lrc = Default::default(); + let fm = cm.new_source_file(FileName::Custom("test.ts".into()), code.into()); + let lexer = Lexer::new( + // We want to parse ecmascript + Syntax::Typescript(TsConfig::default()), + // EsVersion defaults to es5 + Default::default(), + StringInput::from(&*fm), + None, + ); + + let mut parser = Parser::new_from(lexer); + + let mut err_s = "".to_string(); + for e in parser.take_errors() { + err_s += &e.into_kind().msg().to_string(); + } + + let ast = parser + .parse_module() + .map_err(|e| { + error::Error::ExecutionErr(format!("impossible to parse module: {err_s}\n{e:?}")) + })? + .body; + + // println!("{ast:?}"); + let params = ast.into_iter().find_map(|x| match x { + ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl { + decl: + Decl::Fn(FnDecl { + ident: + Ident { + span: _, + sym, + optional: _, + }, + declare: _, + function, + }), + span: _, + })) if &sym.to_string() == "main" => Some(function.params), + _ => None, + }); + if let Some(params) = params { + Ok(MainArgSignature { + star_args: false, + star_kwargs: false, + args: params + .into_iter() + .map(|x| match x.pat { + Pat::Ident(ident) => { + let (name, typ) = binding_ident_to_arg(&ident)?; + Ok(Arg { + name, + typ, + default: None, + has_default: false, + }) + } + Pat::Assign(AssignPat { + span: _, + left, + right, + type_ann: _, + }) => { + let (name, typ) = + left.as_ident().map(binding_ident_to_arg).ok_or_else(|| { + error::Error::ExecutionErr(format!( + "Arg {left:?} has unexepected syntax" + )) + })??; + Ok(Arg { + name, + typ, + default: serde_json::to_value(right) + .map_err(|e| error::Error::ExecutionErr(e.to_string()))? + .as_object() + .and_then(|x| x.get("value").to_owned()) + .cloned(), + + has_default: true, + }) + } + _ => Err(error::Error::ExecutionErr(format!( + "Arg {x:?} has unexepected syntax" + ))), + }) + .collect::, error::Error>>()?, + }) + } else { + Err(error::Error::ExecutionErr( + "main function was not findable (expected to find 'export main function(...)'" + .to_string(), + )) + } +} + +fn binding_ident_to_arg( + BindingIdent { id, type_ann }: &BindingIdent, +) -> anyhow::Result<(String, Typ)> { + Ok(( + id.sym.to_string(), + type_ann + .as_ref() + .map(|x| match &*x.type_ann { + TsType::TsKeywordType(t) => match t.kind { + TsKeywordTypeKind::TsObjectKeyword => Typ::Dict, + TsKeywordTypeKind::TsBooleanKeyword => Typ::Bool, + TsKeywordTypeKind::TsBigIntKeyword => Typ::Int, + TsKeywordTypeKind::TsNumberKeyword => Typ::Float, + TsKeywordTypeKind::TsStringKeyword => Typ::Str, + _ => Typ::Unknown, + }, + // TODO: we can do better here and extract the inner type of array + TsType::TsArrayType(_) => Typ::List, + _ => Typ::Unknown, + }) + .unwrap_or(Typ::Unknown), + )) +} + const STDIMPORTS: [&str; 301] = [ "__future__", "_abc", @@ -468,7 +598,7 @@ fn to_value(et: &ExpressionType) -> Option { } } -pub fn parse_imports(code: &str) -> error::Result> { +pub fn parse_python_imports(code: &str) -> error::Result> { let find_requirements = code .lines() .find_position(|x| x.starts_with("#requirements:")); @@ -527,7 +657,7 @@ mod tests { use super::*; #[test] - fn test_parse_sig() -> anyhow::Result<()> { + fn test_parse_python_sig() -> anyhow::Result<()> { //let code = "print(2 + 3, fd=sys.stderr)"; let code = " @@ -540,13 +670,13 @@ def main(test1: str, name: datetime.datetime = datetime.now(), byte: bytes = byt return {\"len\": len(name), \"splitted\": name.split() } "; - println!("{}", serde_json::to_string(&parse_signature(code)?)?); + println!("{}", serde_json::to_string(&parse_python_signature(code)?)?); Ok(()) } #[test] - fn test_parse_imports() -> anyhow::Result<()> { + fn test_parse_python_imports() -> anyhow::Result<()> { //let code = "print(2 + 3, fd=sys.stderr)"; let code = " @@ -559,14 +689,14 @@ def main(): pass "; - let r = parse_imports(code)?; + let r = parse_python_imports(code)?; println!("{}", serde_json::to_string(&r)?); assert_eq!(r, vec!["wmill", "zanzibar", "matplotlib"]); Ok(()) } #[test] - fn test_parse_imports2() -> anyhow::Result<()> { + fn test_parse_python_imports2() -> anyhow::Result<()> { //let code = "print(2 + 3, fd=sys.stderr)"; let code = " #requirements: @@ -583,10 +713,24 @@ def main(): pass "; - let r = parse_imports(code)?; + let r = parse_python_imports(code)?; println!("{}", serde_json::to_string(&r)?); assert_eq!(r, vec!["burkina=0.4", "nigeria"]); Ok(()) } + + #[test] + fn test_parse_deno_sig() -> anyhow::Result<()> { + let code = " + +export function main(test1: string, test2: string = \"burkina\") { + console.log(42) +} + +"; + println!("{}", serde_json::to_string(&parse_deno_signature(code)?)?); + + Ok(()) + } } diff --git a/backend/src/scripts.rs b/backend/src/scripts.rs index fb5e34a915..068ddbdc30 100644 --- a/backend/src/scripts.rs +++ b/backend/src/scripts.rs @@ -35,7 +35,12 @@ use std::{ const MAX_HASH_HISTORY_LENGTH_STORED: usize = 20; pub fn global_service() -> Router { - Router::new().route("/tojsonschema", post(parse_code_to_jsonschema)) + Router::new() + .route( + "/python/tojsonschema", + post(parse_python_code_to_jsonschema), + ) + .route("/deno/tojsonschema", post(parse_deno_code_to_jsonschema)) } pub fn workspaced_service() -> Router { @@ -50,6 +55,13 @@ pub fn workspaced_service() -> Router { .route("/deployment_status/h/:hash", get(get_deployment_status)) } +#[derive(sqlx::Type, Serialize, Deserialize, Debug, PartialEq, Clone, Hash)] +#[sqlx(type_name = "SCRIPT_LANG", rename_all = "lowercase")] +#[serde(rename_all(serialize = "lowercase", deserialize = "lowercase"))] +pub enum ScriptLang { + Deno, + Python3, +} #[derive(sqlx::Type, PartialEq, Debug, Hash, Clone, Copy)] #[sqlx(transparent)] pub struct ScriptHash(pub i64); @@ -113,6 +125,7 @@ pub struct Script { pub extra_perms: serde_json::Value, pub lock: Option, pub lock_error_logs: Option, + pub language: ScriptLang, } #[derive(Serialize, Deserialize, sqlx::Type, Debug)] @@ -138,6 +151,7 @@ pub struct NewScript { pub schema: Option, pub is_template: Option, pub lock: Option>, + pub language: ScriptLang, } #[derive(Deserialize)] @@ -181,6 +195,7 @@ async fn list_scripts( "extra_perms", "null as lock", "CASE WHEN lock_error_logs IS NOT NULL THEN 'error' ELSE null END as lock_error_logs", + "language", ]) .order_by("created_at", lq.order_desc.unwrap_or(true)) .and_where("workspace_id = ? OR workspace_id = 'starter'".bind(&w_id)) @@ -344,10 +359,16 @@ async fn create_script( .map(|v| v.1.clone()) .unwrap_or(json!({})); + let lock = if ns.language == ScriptLang::Deno { + Some("".to_string()) + } else { + ns.lock.as_ref().map(|x| x.join("\n")) + }; //::text::json is to ensure we use serde_json with preserve order sqlx::query!( "INSERT INTO script (workspace_id, hash, path, parent_hashes, summary, description, content, \ - created_by, schema, is_template, extra_perms, lock) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::text::json, $10, $11, $12)", + created_by, schema, is_template, extra_perms, lock, language) VALUES \ + ($1, $2, $3, $4, $5, $6, $7, $8, $9::text::json, $10, $11, $12, $13)", &w_id, &hash.0, ns.path, @@ -359,13 +380,14 @@ async fn create_script( ns.schema.and_then(|x| serde_json::to_string(&x.0).ok()), ns.is_template.unwrap_or(false), extra_perms, - ns.lock.as_ref().map(|x| x.join("\n")) + lock, + ns.language: ScriptLang ) .execute(&mut tx) .await?; - let mut tx = if ns.lock.is_none() { - let dependencies = parser::parse_imports(&ns.content)?; + let mut tx = if ns.lock.is_none() && ns.language == ScriptLang::Python3 { + let dependencies = parser::parse_python_imports(&ns.content)?; let (_, tx) = jobs::push( tx, &w_id, @@ -593,10 +615,16 @@ async fn delete_script_by_hash( Ok(Json(script)) } -async fn parse_code_to_jsonschema( +async fn parse_python_code_to_jsonschema( Json(code): Json, ) -> JsonResult { - parser::parse_signature(&code).map(Json) + parser::parse_python_signature(&code).map(Json) +} + +async fn parse_deno_code_to_jsonschema( + Json(code): Json, +) -> JsonResult { + parser::parse_deno_signature(&code).map(Json) } pub fn to_i64(s: &str) -> Result { diff --git a/backend/src/worker.rs b/backend/src/worker.rs index a47d981f22..65d117637a 100644 --- a/backend/src/worker.rs +++ b/backend/src/worker.rs @@ -24,7 +24,7 @@ use crate::{ QueuedJob, }, parser::{self, Typ}, - scripts::ScriptHash, + scripts::{ScriptHash, ScriptLang}, users::{create_token_for_owner, get_email_from_username}, variables, }; @@ -44,11 +44,14 @@ use tokio::sync::mpsc; const TMP_DIR: &str = "/tmp/windmill"; const PIP_CACHE_DIR: &str = "/tmp/windmill/cache/pip"; +const DENO_CACHE_DIR: &str = "/tmp/windmill/cache/deno"; const NUM_SECS_ENV_CHECK: u64 = 15; const INCLUDE_DEPS_SH_CONTENT: &str = include_str!("../../nsjail/download_deps.sh"); const NSJAIL_CONFIG_DOWNLOAD_CONTENT: &str = include_str!("../../nsjail/download.config.proto"); -const NSJAIL_CONFIG_RUN_CONTENT: &str = include_str!("../../nsjail/run.config.proto"); +const NSJAIL_CONFIG_RUN_PYTHON3_CONTENT: &str = + include_str!("../../nsjail/run.python3.config.proto"); +const NSJAIL_CONFIG_RUN_DENO_CONTENT: &str = include_str!("../../nsjail/run.deno.config.proto"); pub async fn run_worker( db: &DB, @@ -66,17 +69,13 @@ pub async fn run_worker( let worker_dir = format!("{TMP_DIR}/{worker_name}"); tracing::debug!(worker_dir = %worker_dir, worker_name = %worker_name, "Creating worker dir"); - DirBuilder::new() - .recursive(true) - .create(&worker_dir) - .await - .expect("could not create initial worker dir"); - - DirBuilder::new() - .recursive(true) - .create(&PIP_CACHE_DIR) - .await - .expect("could not create initial worker dir"); + for x in [&worker_dir, PIP_CACHE_DIR, DENO_CACHE_DIR] { + DirBuilder::new() + .recursive(true) + .create(x) + .await + .expect("could not create initial worker dir"); + } let _ = write_file(&worker_dir, "download_deps.sh", INCLUDE_DEPS_SH_CONTENT).await; @@ -289,6 +288,7 @@ async fn handle_job( .expect("could not create initial job dir"); let mut status: Result; + if matches!(job.job_kind, JobKind::Dependencies) { let requirements = job .raw_code @@ -344,12 +344,17 @@ async fn handle_job( .await?; } } else { - let (inner_content, requirements_o) = if matches!(job.job_kind, JobKind::Preview) { + let (inner_content, requirements_o, language) = if matches!(job.job_kind, JobKind::Preview) + { let code = (job.raw_code.as_ref().unwrap_or(&"no raw code".to_owned())).to_owned(); - let reqs = parser::parse_imports(&code)?.join("\n"); - (code, Some(reqs)) + let reqs = if job.language == ScriptLang::Python3 { + Some(parser::parse_python_imports(&code)?.join("\n")) + } else { + None + }; + (code, reqs, job.language.to_owned()) } else { - sqlx::query_as::<_, (String, Option)>("SELECT content, lock FROM script WHERE hash = $1 AND (workspace_id = $2 OR workspace_id = 'starter')") + sqlx::query_as::<_, (String, Option, ScriptLang)>("SELECT content, lock, language FROM script WHERE hash = $1 AND (workspace_id = $2 OR workspace_id = 'starter')") .bind(&job.script_hash.unwrap_or(ScriptHash(0)).0) .bind(&job.workspace_id) .fetch_optional(db) @@ -357,69 +362,76 @@ async fn handle_job( .ok_or_else(|| Error::InternalErr(format!("expected content and lock")))? }; - let requirements = - requirements_o.ok_or_else(|| Error::InternalErr(format!("lockfile missing")))?; + match language { + ScriptLang::Python3 => { + let requirements = requirements_o + .ok_or_else(|| Error::InternalErr(format!("lockfile missing")))?; - let _ = write_file( - &job_dir, - "download.config.proto", - &NSJAIL_CONFIG_DOWNLOAD_CONTENT - .replace("{JOB_DIR}", &job_dir) - .replace("{WORKER_DIR}", &worker_dir) - .replace("{CACHE_DIR}", PIP_CACHE_DIR), - ) - .await?; - let _ = write_file(&job_dir, "requirements.txt", &requirements).await?; + let _ = write_file( + &job_dir, + "download.config.proto", + &NSJAIL_CONFIG_DOWNLOAD_CONTENT + .replace("{JOB_DIR}", &job_dir) + .replace("{WORKER_DIR}", &worker_dir) + .replace("{CACHE_DIR}", PIP_CACHE_DIR), + ) + .await?; + let _ = write_file(&job_dir, "requirements.txt", &requirements).await?; - let child = Command::new("nsjail") - .current_dir(&job_dir) - .args(vec!["--config", "download.config.proto"]) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn()?; + let child = Command::new("nsjail") + .current_dir(&job_dir) + .args(vec!["--config", "download.config.proto"]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn()?; - logs.push_str("\n--- DEPENDENCIES INSTALL ---\n"); - status = handle_child(job, db, &mut logs, &mut last_line, timeout, child).await; - if status.is_ok() { - logs.push_str("\n\n--- CODE EXECUTION ---\n"); + logs.push_str("\n--- PIP DEPENDENCIES INSTALL ---\n"); + status = handle_child(job, db, &mut logs, &mut last_line, timeout, child).await; - set_logs(logs, job.id, db).await; + if status.is_ok() { + logs.push_str("\n\n--- PTHON CODE EXECUTION ---\n"); - let _ = write_file(&job_dir, "inner.py", &inner_content).await?; + set_logs(logs, job.id, db).await; - let sig = crate::parser::parse_signature(&inner_content)?; - let transforms = sig.args.into_iter().map(|x| match x.typ { + let _ = write_file(&job_dir, "inner.py", &inner_content).await?; + + let sig = crate::parser::parse_python_signature(&inner_content)?; + let transforms = sig.args.into_iter().map(|x| match x.typ { Typ::Bytes => format!("if \"{}\" in kwargs and kwargs[\"{}\"] is not None:\n kwargs[\"{}\"] = base64.b64decode(kwargs[\"{}\"])\n", x.name, x.name, x.name, x.name), Typ::Datetime => format!("if \"{}\" in kwargs and kwargs[\"{}\"] is not None:\n kwargs[\"{}\"] = datetime.strptime(kwargs[\"{}\"], '%Y-%m-%dT%H:%M')\n", x.name, x.name, x.name, x.name), _ => "".to_string() }).collect::>().join(""); - let tx = db.begin().await?; + let tx = db.begin().await?; - let token = create_token_for_owner( - &db, - &job.workspace_id, - &job.permissioned_as, - crate::users::NewToken { - label: Some("ephemeral-script".to_string()), - expiration: Some( - chrono::Utc::now() + chrono::Duration::seconds((timeout * 2).into()), - ), - }, - &job.created_by, - ) - .await?; + let token = create_token_for_owner( + &db, + &job.workspace_id, + &job.permissioned_as, + crate::users::NewToken { + label: Some("ephemeral-script".to_string()), + expiration: Some( + chrono::Utc::now() + + chrono::Duration::seconds((timeout * 2).into()), + ), + }, + &job.created_by, + ) + .await?; - let args = if let Some(args) = &job.args { - Some(transform_json_value(&token, &job.workspace_id, base_url, args.clone()).await) - } else { - None - }; - let ser_args = serde_json::to_string(&args) - .map_err(|e| Error::ExecutionErr(e.to_string()))? - .replace("\\\"", "\\\\\""); - let wrapper_content: String = format!( - r#" + let args = if let Some(args) = &job.args { + Some( + transform_json_value(&token, &job.workspace_id, base_url, args.clone()) + .await, + ) + } else { + None + }; + let ser_args = serde_json::to_string(&args) + .map_err(|e| Error::ExecutionErr(e.to_string()))? + .replace("\\\"", "\\\\\""); + let wrapper_content: String = format!( + r#" import json import base64 from datetime import datetime @@ -443,44 +455,150 @@ print() print("result:") print(res_json) "#, - ); - write_file(&job_dir, "main.py", &wrapper_content).await?; + ); + write_file(&job_dir, "main.py", &wrapper_content).await?; - tx.commit().await?; - let reserved_variables = variables::get_reserved_variables( - &job.workspace_id, - &token, - &get_email_from_username(&job.created_by, db) - .await? - .unwrap_or_else(|| "nosuitable@email.xyz".to_string()), - &job.created_by, - &job.id.to_string(), - ) - .into_iter() - .map(|rv| (rv.name, rv.value)); + tx.commit().await?; + let reserved_variables = variables::get_reserved_variables( + &job.workspace_id, + &token, + &get_email_from_username(&job.created_by, db) + .await? + .unwrap_or_else(|| "nosuitable@email.xyz".to_string()), + &job.created_by, + &job.id.to_string(), + ) + .into_iter() + .map(|rv| (rv.name, rv.value)); + let _ = write_file( + &job_dir, + "run.config.proto", + &NSJAIL_CONFIG_RUN_PYTHON3_CONTENT.replace("{JOB_DIR}", &job_dir), + ) + .await?; - let _ = write_file( - &job_dir, - "run.config.proto", - &NSJAIL_CONFIG_RUN_CONTENT.replace("{JOB_DIR}", &job_dir), - ) - .await?; + let child = Command::new("nsjail") + .current_dir(&job_dir) + .envs(reserved_variables) + .args(vec![ + "--config", + "run.config.proto", + "--", + "/usr/local/bin/python3", + "-u", + "/tmp/main.py", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn()?; + status = handle_child(job, db, &mut logs, &mut last_line, timeout, child).await; + } + } + ScriptLang::Deno => { + logs.push_str("\n\n--- DENO CODE EXECUTION ---\n"); - let child = Command::new("nsjail") - .current_dir(&job_dir) - .envs(reserved_variables) - .args(vec![ - "--config", + set_logs(logs, job.id, db).await; + + let _ = write_file(&job_dir, "inner.ts", &inner_content).await?; + + let sig = crate::parser::parse_deno_signature(&inner_content)?; + // let transforms = sig.args.clone().into_iter().map(|x| match x.typ { + // Typ::Bytes => format!("if \"{}\" in kwargs and kwargs[\"{}\"] is not None:\n kwargs[\"{}\"] = base64.b64decode(kwargs[\"{}\"])\n", x.name, x.name, x.name, x.name), + // Typ::Datetime => format!("if \"{}\" in kwargs and kwargs[\"{}\"] is not None:\n kwargs[\"{}\"] = datetime.strptime(kwargs[\"{}\"], '%Y-%m-%dT%H:%M')\n", x.name, x.name, x.name, x.name), + // _ => "".to_string() + // }).collect::>().join(""); + + let tx = db.begin().await?; + + let token = create_token_for_owner( + &db, + &job.workspace_id, + &job.permissioned_as, + crate::users::NewToken { + label: Some("ephemeral-script".to_string()), + expiration: Some( + chrono::Utc::now() + chrono::Duration::seconds((timeout * 2).into()), + ), + }, + &job.created_by, + ) + .await?; + + let args = if let Some(args) = &job.args { + Some( + transform_json_value(&token, &job.workspace_id, base_url, args.clone()) + .await, + ) + } else { + None + }; + let ser_args = serde_json::to_string(&args) + .map_err(|e| Error::ExecutionErr(e.to_string()))? + .replace("\\\"", "\\\\\""); + let spread = sig.args.into_iter().map(|x| x.name).join(","); + let wrapper_content: String = format!( + r#" +import {{ main }} from "./inner.ts"; +const {{{spread}}}= JSON.parse(`{ser_args}`); + +async function run() {{ + let res: any = await main({spread}); + if (res == undefined) {{ + res = {{}} + }} + if (typeof res !== 'object') {{ + res = {{ res1: res }} + }} + + const res_json = JSON.stringify(res); + console.log(); + console.log("result:"); + console.log(res_json); +}} +run(); +"#, + ); + write_file(&job_dir, "main.ts", &wrapper_content).await?; + + tx.commit().await?; + let reserved_variables = variables::get_reserved_variables( + &job.workspace_id, + &token, + &get_email_from_username(&job.created_by, db) + .await? + .unwrap_or_else(|| "nosuitable@email.xyz".to_string()), + &job.created_by, + &job.id.to_string(), + ) + .into_iter() + .map(|rv| (rv.name, rv.value)); + let _ = write_file( + &job_dir, "run.config.proto", - "--", - "/usr/local/bin/python3", - "-u", - "/tmp/main.py", - ]) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn()?; - status = handle_child(job, db, &mut logs, &mut last_line, timeout, child).await; + &NSJAIL_CONFIG_RUN_DENO_CONTENT + .replace("{JOB_DIR}", &job_dir) + .replace("{CACHE_DIR}", DENO_CACHE_DIR), + ) + .await?; + + let child = Command::new("nsjail") + .current_dir(&job_dir) + .envs(reserved_variables) + .args(vec![ + "--config", + "run.config.proto", + "--", + "/usr/bin/deno", + "run", + "--v8-flags=--max-heap-size=2048", + "-A", + "/tmp/main.ts", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn()?; + status = handle_child(job, db, &mut logs, &mut last_line, timeout, child).await; + } } } tokio::fs::remove_dir_all(job_dir).await?; diff --git a/backend/v8.snap b/backend/v8.snap index d623db64b8ba52f7b6bbe32c74c19d42dd56a6b8..703b15cc5e1785b01ba7f5c3772b9f81344bc876 100644 GIT binary patch delta 85318 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 Hz~BE1VJQ;4 delta 84645 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%0D><%?fZQW zZ$z#!5Y2u|XSYTM=@U_7#7~EBhGZ;mMeh`uHJ<7RZOESQ?;GzeZ`k)`;cCB20*|7; zZy^K@rNAspuy|*9=I&)6rIg+v<$(%N>_fzN5wiZy=x^Os~VSL2*^s{DQ2( zl+!nVJbL>#F6Uw$i&wc0kk^S*Ke!^&Qj%f{V@tm6`%JXgR>_t6=(3y@tA26I5v2{I zzT_$54r$6!=R{>{wOcwI->+x5zXTVvQm9 zAVBGYKvOMa7|Q8{o6bf&WDg>)XIC*Ym1tm(w=tz$9SW8LP3%kpx7PQ>a)Q$Y&eZs0 zjd_#=+pLN$PsweS44SAX?^o`GORQuWwhE|c>Sihxc0t|>e~pk8Z2#QS)53IliHZgd zmcDx0Zq>HN4<8Jm6p&Z^2rVk^64yB^3Er!ojFMG4eFBAcWR;5yNGy(bl)J6x;3U|-Dw_mMY*t-$p zwE|-Y%$V>yA!pOaRG^&Z)9@PCMu~h`&y9|pvR(C9YyK9Mavi`tpK@4MP&b!3a!+l? z?I{Tnq_~gHym-Z;?Ue=%w7n5My918SIYDl>)@|{%oJduGiAf^GM#cNye+AJ2F8&Le z^eY|0*mtV8EDoos7(q!pvOdN}9{)pLL zVt0pM`+0J&b9#jyO>eQpTT&k_=IvMBm3FPcGifzoerJlX_O{S#UmD0D7BC^~LDucx zvH4}O&f?1j7TaZ4%6}G}%-F+I68zERnkk2qwG`_h%y;;ta`X8_9s8sF_XC5Mt6RJ{ z?NMXE&?gd@?Z6%mAEF69s*1KldN$VP3RtVchI9Wth*y8LFji@@YLiu%tjc5^DvRUk zPL}UsMf>DZTPWe7({%*CA32KAP8NRr_07Z*AoCpQ22(~m;D7ktzK4InU!==RHRap$ z*puum+f>*k1y2s~uPE6hp8TTEeY)MuXRvOKb?Q5Y8SHi)yIuP9i5AoTNCQbLak;{8 zHq*d*-EN56x6&5V_;O5!)im4Y1ZqQKENSGI%kFiwU=>I72&)ecq&LF2&IcvEF=e%L zH%Y}3a*BUqDOvrAq}2AAky6tUy-KSO4t`Q8#S>B*`ovQDGfAoaGb5!g&?UV-82hAB y8cIm%{3n*uUr0(FpBX8Q9no7rO7T5P2_rGix-lwaZ?3+k40b0cYHnBJ@Bal8&+Wee diff --git a/deno-client/.gitignore b/deno-client/.gitignore new file mode 100644 index 0000000000..87ca018220 --- /dev/null +++ b/deno-client/.gitignore @@ -0,0 +1 @@ +windmill-api diff --git a/deno-client/.vscode/settings.json b/deno-client/.vscode/settings.json new file mode 100644 index 0000000000..52ca21d5c4 --- /dev/null +++ b/deno-client/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "deno.enable": true, + "deno.lint": true, + "deno.unstable": true +} diff --git a/deno-client/generate.sh b/deno-client/generate.sh new file mode 100755 index 0000000000..882ad1bad7 --- /dev/null +++ b/deno-client/generate.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -e + +/usr/local/bin/docker-entrypoint.sh generate -i ../backend/openapi.yaml -g typescript --additional-properties platform=deno -o windmill-api +sed -i 's/this\.type = "Job";//' windmill-api/models/Job.ts diff --git a/deno-client/index.ts b/deno-client/index.ts new file mode 100644 index 0000000000..15643c5c60 --- /dev/null +++ b/deno-client/index.ts @@ -0,0 +1,46 @@ +import { ResourceApi, VariableApi, ServerConfiguration } from './windmill-api/index.ts' +import { createConfiguration, type Configuration as Configuration } from './windmill-api/configuration.ts' + +export * from './windmill-api/index.ts' + +export function createConf(): Configuration & { workspace_id: string } { + const token = Deno.env.get("WM_TOKEN") ?? 'no_token' + return { + ...createConfiguration({ + baseServer: new ServerConfiguration(Deno.env.get("BASE_URL") ?? 'http://localhost:8000/api', {}), + authMethods: { bearerAuth: { tokenProvider: { getToken() { return token } } } }, + }), workspace_id: Deno.env.get("WM_WORKSPACE") ?? 'no_workspace' + } +} + +export async function getResource(path: string): Promise { + const conf = createConf() + const resource = await new ResourceApi(conf).getResource(conf.workspace_id, path) + return await transformLeaves(resource.value) +} + +export async function getVariable(path: string): Promise { + const conf = createConf() + const variable = await new VariableApi(conf).getVariable(conf.workspace_id, path) + return variable.value +} + +export async function transformLeaves(d: { [key: string]: any }): Promise<{ [key: string]: any }> { + for (const k in d) { + d[k] = await _transformLeaf(d[k]) + } + return d +} + +const VAR_RESOURCE_PREFIX = "$var:" +async function _transformLeaf(v: any): Promise { + if (typeof v === 'object') { + return transformLeaves(v) + } + else if (typeof v === 'string' && v.startsWith(VAR_RESOURCE_PREFIX)) { + const varName = v.substring(VAR_RESOURCE_PREFIX.length) + return await getVariable(varName) + } else { + return v + } +} diff --git a/deno-client/openapitools.json b/deno-client/openapitools.json new file mode 100644 index 0000000000..4a3fac0798 --- /dev/null +++ b/deno-client/openapitools.json @@ -0,0 +1,7 @@ +{ + "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", + "spaces": 2, + "generator-cli": { + "version": "6.0.0-beta" + } +} diff --git a/frontend/Caddyfile b/frontend/Caddyfile index dd015fd2c2..7495ec5d5a 100644 --- a/frontend/Caddyfile +++ b/frontend/Caddyfile @@ -5,4 +5,8 @@ bind {$ADDRESS} reverse_proxy /api/* http://localhost:8000 reverse_proxy /* http://localhost:3000 + reverse_proxy /ws/* http://localhost:3001 { + lb_policy header "Authorization" + } + } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3d43985ec5..04f062d5ca 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "windmill", - "version": "1.6.0", + "version": "1.6.1", "dependencies": { "@codingame/monaco-jsonrpc": "^0.3.1", "@codingame/monaco-languageclient": "^0.17.0", diff --git a/frontend/src/infer.ts b/frontend/src/infer.ts index eeaf6f353e..bff07ff73d 100644 --- a/frontend/src/infer.ts +++ b/frontend/src/infer.ts @@ -1,12 +1,22 @@ import type { Schema, SchemaProperty } from './common' -import { ScriptService } from './gen' +import { ScriptService, type MainArgSignature } from './gen' import { sendUserToast } from './utils' -export async function inferArgs(code: string, schema: Schema): Promise { +export async function inferArgs(language: "python3" | "deno", code: string, schema: Schema): Promise { try { - const inferedSchema = await ScriptService.toJsonschema({ - requestBody: code - }) + let inferedSchema: MainArgSignature + if (language == "python3") { + inferedSchema = await ScriptService.pythonToJsonschema({ + requestBody: code + }) + } else if (language == "deno") { + inferedSchema = await ScriptService.denoToJsonschema({ + requestBody: code + }) + } else { + return + } + schema.required = [] const oldProperties = Object.assign({}, schema.properties) schema.properties = {} @@ -30,12 +40,6 @@ export async function inferArgs(code: string, schema: Schema): Promise { } } -function array_move(arr: T[], fromIndex: number, toIndex: number) { - var element = arr[fromIndex] - arr.splice(fromIndex, 1) - arr.splice(toIndex, 0, element) -} - function pythonToJsonSchemaType(t: string, s: SchemaProperty): void { if (t === 'int') { s.type = 'integer' diff --git a/frontend/src/routes/components/Editor.svelte b/frontend/src/routes/components/Editor.svelte index aeae558dce..c4a5814434 100644 --- a/frontend/src/routes/components/Editor.svelte +++ b/frontend/src/routes/components/Editor.svelte @@ -12,7 +12,9 @@ let divEl: HTMLDivElement | null = null let editor: monaco.editor.IStandaloneCodeEditor let monaco - export let lang = 'python' + + export let deno = false + export let lang = deno ? 'typescript' : 'python' export let code: string export let readOnly = false export let hash: string = (Math.random() + 1).toString(36).substring(2) @@ -76,7 +78,7 @@ export async function reloadWebsocket() { closeWebsockets() - if (lang == 'python') { + if (lang == 'python' || deno) { // install Monaco language client services const { MonacoLanguageClient, CloseAction, ErrorAction, createConnection } = await import( '@codingame/monaco-languageclient' @@ -86,7 +88,7 @@ return new MonacoLanguageClient({ name: name, clientOptions: { - documentSelector: ['python'], + documentSelector: deno ? ['typescript'] : ['python'], errorHandler: { error: () => ErrorAction.Shutdown, closed: () => CloseAction.Restart @@ -95,7 +97,18 @@ isTrusted: true }, // workspaceFolder: { uri: Uri.parse(`/tmp/${name}`), name: 'tmp', index: 0 }, - initializationOptions + initializationOptions, + middleware: { + workspace: { + configuration: (params, token, configuration) => { + return [ + { + enable: true + } + ] + } + } + } }, connectionProvider: { get: (errorHandler, closeHandler) => { @@ -132,28 +145,38 @@ console.error(`connection to ${name} language server failed`) } } - connectToLanguageServer(`wss://${$page.url.host}/ws/pyright`, 'pyright', { - executionEnvironments: [ - { - root: '/tmp/pyright', - pythonVersion: '3.7', - pythonPlatform: 'platform', - extraPaths: [] - } - ] - }) - connectToLanguageServer(`wss://${$page.url.host}/ws/black`, 'black', { - formatters: { - black: { - command: 'black', - args: ['--quiet', '-'] + if (deno) { + connectToLanguageServer(`ws://${$page.url.host}/ws/deno`, 'deno', { + deno: { + enable: true, + lint: true } - }, - formatFiletypes: { - python: 'black' - } - }) + }) + } else { + connectToLanguageServer(`wss://${$page.url.host}/ws/pyright`, 'pyright', { + executionEnvironments: [ + { + root: '/tmp/pyright', + pythonVersion: '3.7', + pythonPlatform: 'platform', + extraPaths: [] + } + ] + }) + + connectToLanguageServer(`wss://${$page.url.host}/ws/black`, 'black', { + formatters: { + black: { + command: 'black', + args: ['--quiet', '-'] + } + }, + formatFiletypes: { + python: 'black' + } + }) + } } } @@ -232,15 +255,20 @@ } if (lang == 'typescript') { - // compiler options - monaco.languages.typescript.typescriptDefaults.setCompilerOptions({ - target: monaco.languages.typescript.ScriptTarget.ES6, - allowNonTsExtensions: true, - noLib: true - }) + if (deno) { + monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({ + diagnosticCodesToIgnore: [2691] + }) + } else { + // compiler options + monaco.languages.typescript.typescriptDefaults.setCompilerOptions({ + target: monaco.languages.typescript.ScriptTarget.ES6, + allowNonTsExtensions: true, + noLib: true + }) - monaco.languages.typescript.typescriptDefaults.addExtraLib( - ` + monaco.languages.typescript.typescriptDefaults.addExtraLib( + ` /** * get variable (including secret) at path * @param {string} path - path of the variable (e.g: g/all/pretty_secret) @@ -276,11 +304,11 @@ export const previous_result: any; */ export const params: any; `, - 'file:///node_modules/@types/windmill/index.d.ts' - ) + 'file:///node_modules/@types/windmill/index.d.ts' + ) + } } - - if (lang == 'python') { + if (lang == 'python' || deno) { const { MonacoServices } = await import('@codingame/monaco-languageclient') MonacoServices.install(monaco) diff --git a/frontend/src/routes/components/GroupModal.svelte b/frontend/src/routes/components/GroupModal.svelte index 0c86b85117..0e65396c86 100644 --- a/frontend/src/routes/components/GroupModal.svelte +++ b/frontend/src/routes/components/GroupModal.svelte @@ -1,10 +1,8 @@ + - +{#if script} + +{/if} diff --git a/frontend/src/routes/scripts/get/[...hash].svelte b/frontend/src/routes/scripts/get/[...hash].svelte index 46b986c029..3c6ab60203 100644 --- a/frontend/src/routes/scripts/get/[...hash].svelte +++ b/frontend/src/routes/scripts/get/[...hash].svelte @@ -14,7 +14,7 @@ faSpinner } from '@fortawesome/free-solid-svg-icons' import Highlight from 'svelte-highlight' - import python from 'svelte-highlight/src/languages/python' + import { typescript, python } from 'svelte-highlight/src/languages' import github from 'svelte-highlight/src/styles/github' import Tooltip from '../../components/Tooltip.svelte' @@ -327,7 +327,11 @@

Code

- + {#if script.language == 'python3'} + + {:else if script.language == 'deno'} + + {/if}

Dependencies lock file

diff --git a/frontend/src/routes/scripts/run/[...hash].svelte b/frontend/src/routes/scripts/run/[...hash].svelte index 0c826451bb..044cb96584 100644 --- a/frontend/src/routes/scripts/run/[...hash].svelte +++ b/frontend/src/routes/scripts/run/[...hash].svelte @@ -18,7 +18,7 @@ script = await ScriptService.getScriptByHash({ workspace: $workspaceStore!, hash }) if (script.schema == undefined) { script.schema = emptySchema() - inferArgs(script.content, script.schema) + inferArgs(script.language, script.content, script.schema) script = script } } else { diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js index 1757a28dd1..3d4f4c0ca3 100644 --- a/frontend/svelte.config.js +++ b/frontend/svelte.config.js @@ -2,6 +2,15 @@ import preprocess from 'svelte-preprocess' import adapter from '@sveltejs/adapter-static' const ppath = process.env.PREVIEW_PATH +import { readFileSync } from 'fs'; +import { fileURLToPath } from 'url'; + +const file = fileURLToPath(new URL('package.json', import.meta.url)); +const json = readFileSync(file, 'utf8'); +const version = JSON.parse(json) + + + /** @type {import('@sveltejs/kit').Config} */ const config = { // Consult https://github.com/sveltejs/svelte-preprocess @@ -17,6 +26,9 @@ const config = { base: ppath ? ppath : '' }, vite: { + define: { + '__pkg__': version + }, ssr: { noExternal: ['dayjs'] }, diff --git a/lsp/pyls_launcher.py b/lsp/pyls_launcher.py index 021cf279f9..44f7d13875 100644 --- a/lsp/pyls_launcher.py +++ b/lsp/pyls_launcher.py @@ -71,10 +71,15 @@ class DiagnosticLS(LanguageServerWebSocketHandler): procargs = ["diagnostic-languageserver", "--stdio"] +class DenoLS(LanguageServerWebSocketHandler): + procargs = ["deno", "lsp"] + + if __name__ == "__main__": app = web.Application([ (r"/ws/pyright", PyrightLS), (r"/ws/black", DiagnosticLS), + (r"/ws/deno", DenoLS), ]) app.listen(3001, address="0.0.0.0") ioloop.IOLoop.current().start() diff --git a/nsjail/run.deno.config.proto b/nsjail/run.deno.config.proto new file mode 100644 index 0000000000..09f778a69d --- /dev/null +++ b/nsjail/run.deno.config.proto @@ -0,0 +1,108 @@ +name: "deno run script" + +mode: ONCE +hostname: "deno" +log_level: ERROR +time_limit: 300 + +rlimit_as: 16000 +rlimit_cpu: 1000 +rlimit_fsize: 1024 +rlimit_nofile: 64 + +cwd: "/tmp" + + +clone_newnet: false +keep_caps: false +keep_env: true +mount_proc: true + +mount { + src: "/bin" + dst: "/bin" + is_bind: true +} + +mount { + src: "/lib" + dst: "/lib" + is_bind: true +} + + +mount { + src: "/lib64" + dst: "/lib64" + is_bind: true +} + + +mount { + src: "/usr" + dst: "/usr" + is_bind: true +} + +mount { + src: "/dev/null" + dst: "/dev/null" + is_bind: true + rw: true +} + +mount { + dst: "/tmp" + fstype: "tmpfs" + rw: true + options: "size=500000000" +} + + +mount { + src: "{JOB_DIR}/inner.ts" + dst: "/tmp/inner.ts" + is_bind: true +} + +mount { + src: "{JOB_DIR}/main.ts" + dst: "/tmp/main.ts" + is_bind: true +} + + +mount { + src: "/etc/ssl" + dst: "/etc/ssl" + is_bind: true +} + +mount { + src: "/etc/resolv.conf" + dst: "/etc/resolv.conf" + is_bind: true +} + +mount { + src: "/dev/random" + dst: "/dev/random" + is_bind: true +} + +mount { + src: "{CACHE_DIR}" + dst: "/tmp/.cache/deno" + is_bind: true + rw: true + mandatory: false +} + + +iface_no_lo: true + +envar: "DENO_DIR=/tmp/.cache/deno" +envar: "NO_COLOR=true" + + + diff --git a/nsjail/run.config.proto b/nsjail/run.python3.config.proto similarity index 100% rename from nsjail/run.config.proto rename to nsjail/run.python3.config.proto