diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 48a3c640e0..affc3a0793 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -10701,6 +10701,7 @@ dependencies = [ name = "windmill-parser" version = "1.385.0" dependencies = [ + "convert_case 0.6.0", "serde", "serde_json", ] @@ -10712,6 +10713,7 @@ dependencies = [ "anyhow", "lazy_static", "regex", + "regex-lite", "serde_json", "windmill-parser", ] @@ -10735,6 +10737,7 @@ dependencies = [ "anyhow", "lazy_static", "regex", + "regex-lite", "serde_json", "windmill-parser", ] @@ -10744,11 +10747,8 @@ name = "windmill-parser-php" version = "1.385.0" dependencies = [ "anyhow", - "convert_case 0.6.0", "itertools 0.13.0", - "lazy_static", "php-parser-rs", - "regex", "serde_json", "windmill-parser", ] @@ -10774,6 +10774,7 @@ dependencies = [ "lazy_static", "phf", "regex", + "regex-lite", "rustpython-parser", "serde_json", "sqlx", @@ -10788,6 +10789,7 @@ dependencies = [ "anyhow", "lazy_static", "regex", + "regex-lite", "serde_json", "windmill-parser", ] @@ -10797,7 +10799,6 @@ name = "windmill-parser-ts" version = "1.385.0" dependencies = [ "anyhow", - "convert_case 0.6.0", "lazy_static", "regex", "serde-wasm-bindgen", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 54583b089d..baeb9064fb 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -266,3 +266,4 @@ tikv-jemalloc-ctl = { version = "^0.5" } triomphe = "<0.1.12" tantivy = "0.22.0" +regex-lite = "0.1.6" diff --git a/backend/parsers/windmill-parser-bash/Cargo.toml b/backend/parsers/windmill-parser-bash/Cargo.toml index 9d2070f6c8..4c7db23313 100644 --- a/backend/parsers/windmill-parser-bash/Cargo.toml +++ b/backend/parsers/windmill-parser-bash/Cargo.toml @@ -8,9 +8,14 @@ authors.workspace = true name = "windmill_parser_bash" path = "./src/lib.rs" +[target.'cfg(target_arch = "wasm32")'.dependencies] +regex-lite.workspace = true + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +regex.workspace = true + [dependencies] windmill-parser.workspace = true anyhow.workspace = true -regex.workspace = true lazy_static.workspace = true -serde_json.workspace = true \ No newline at end of file +serde_json.workspace = true diff --git a/backend/parsers/windmill-parser-bash/src/lib.rs b/backend/parsers/windmill-parser-bash/src/lib.rs index fa5eb3973d..515ef3822a 100644 --- a/backend/parsers/windmill-parser-bash/src/lib.rs +++ b/backend/parsers/windmill-parser-bash/src/lib.rs @@ -1,7 +1,12 @@ #![allow(non_snake_case)] // TODO: switch to parse_* function naming use anyhow::anyhow; + +#[cfg(not(target_arch = "wasm32"))] use regex::Regex; +#[cfg(target_arch = "wasm32")] +use regex_lite::Regex; + use serde_json::json; use std::collections::HashMap; diff --git a/backend/parsers/windmill-parser-graphql/Cargo.toml b/backend/parsers/windmill-parser-graphql/Cargo.toml index da1a8bf9c6..7f0a93b6f3 100644 --- a/backend/parsers/windmill-parser-graphql/Cargo.toml +++ b/backend/parsers/windmill-parser-graphql/Cargo.toml @@ -8,9 +8,14 @@ authors.workspace = true name = "windmill_parser_graphql" path = "./src/lib.rs" +[target.'cfg(target_arch = "wasm32")'.dependencies] +regex-lite.workspace = true + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +regex.workspace = true + [dependencies] windmill-parser.workspace = true anyhow.workspace = true -regex.workspace = true lazy_static.workspace = true -serde_json.workspace = true \ No newline at end of file +serde_json.workspace = true diff --git a/backend/parsers/windmill-parser-graphql/src/lib.rs b/backend/parsers/windmill-parser-graphql/src/lib.rs index 99eb8db261..060ae294d1 100644 --- a/backend/parsers/windmill-parser-graphql/src/lib.rs +++ b/backend/parsers/windmill-parser-graphql/src/lib.rs @@ -1,7 +1,12 @@ #![allow(non_snake_case)] // TODO: switch to parse_* function naming use anyhow::anyhow; + +#[cfg(not(target_arch = "wasm32"))] use regex::Regex; +#[cfg(target_arch = "wasm32")] +use regex_lite::Regex; + use serde_json::json; use windmill_parser::{Arg, MainArgSignature, Typ}; diff --git a/backend/parsers/windmill-parser-php/Cargo.toml b/backend/parsers/windmill-parser-php/Cargo.toml index 05d86a6c67..8bd3182f91 100644 --- a/backend/parsers/windmill-parser-php/Cargo.toml +++ b/backend/parsers/windmill-parser-php/Cargo.toml @@ -14,6 +14,3 @@ itertools.workspace = true serde_json.workspace = true anyhow.workspace = true php-parser-rs.workspace = true -convert_case.workspace = true -lazy_static.workspace = true -regex.workspace = true \ No newline at end of file diff --git a/backend/parsers/windmill-parser-php/src/lib.rs b/backend/parsers/windmill-parser-php/src/lib.rs index 27befc1ea7..5adf1dc0d7 100644 --- a/backend/parsers/windmill-parser-php/src/lib.rs +++ b/backend/parsers/windmill-parser-php/src/lib.rs @@ -1,7 +1,5 @@ -use convert_case::{Case, Casing}; -use regex::Regex; use serde_json::Value; -use windmill_parser::{Arg, MainArgSignature, Typ}; +use windmill_parser::{to_snake_case, Arg, MainArgSignature, Typ}; use php_parser_rs::parser::{ self, @@ -13,17 +11,6 @@ use php_parser_rs::parser::{ }, }; -lazy_static::lazy_static! { - static ref RE_SNK_CASE: Regex = Regex::new(r"_(\d)").unwrap(); -} - -fn to_snake_case(s: String) -> String { - let r = s.to_case(Case::Snake); - - // s_3 => s3 - RE_SNK_CASE.replace_all(&r, "$1").to_string() -} - fn parse_php_type(e: Type) -> Typ { match e { Type::Float(_) => Typ::Float, @@ -32,7 +19,7 @@ fn parse_php_type(e: Type) -> Typ { Type::String(_) => Typ::Str(None), Type::Array(_) => Typ::List(Box::new(Typ::Str(None))), Type::Object(_) => Typ::Object(vec![]), - Type::Named(_, name) => Typ::Resource(to_snake_case(name.to_string())), + Type::Named(_, name) => Typ::Resource(to_snake_case(name.to_string().as_ref())), _ => Typ::Unknown, } } diff --git a/backend/parsers/windmill-parser-py-imports/Cargo.toml b/backend/parsers/windmill-parser-py-imports/Cargo.toml index 665b6df211..078b15418b 100644 --- a/backend/parsers/windmill-parser-py-imports/Cargo.toml +++ b/backend/parsers/windmill-parser-py-imports/Cargo.toml @@ -8,13 +8,18 @@ authors.workspace = true name = "windmill_parser_py_imports" path = "./src/lib.rs" +[target.'cfg(target_arch = "wasm32")'.dependencies] +regex-lite.workspace = true + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +regex.workspace = true + [dependencies] windmill-parser.workspace = true windmill-common.workspace = true rustpython-parser.workspace = true phf.workspace = true itertools.workspace = true -regex.workspace = true serde_json.workspace = true anyhow.workspace = true lazy_static.workspace = true diff --git a/backend/parsers/windmill-parser-py-imports/src/lib.rs b/backend/parsers/windmill-parser-py-imports/src/lib.rs index 00810a7858..34487e04ef 100644 --- a/backend/parsers/windmill-parser-py-imports/src/lib.rs +++ b/backend/parsers/windmill-parser-py-imports/src/lib.rs @@ -10,7 +10,11 @@ use async_recursion::async_recursion; use itertools::Itertools; use lazy_static::lazy_static; use phf::phf_map; + +#[cfg(not(target_arch = "wasm32"))] use regex::Regex; +#[cfg(target_arch = "wasm32")] +use regex_lite::Regex; use rustpython_parser::{ ast::{Stmt, StmtImport, StmtImportFrom, Suite}, diff --git a/backend/parsers/windmill-parser-sql/Cargo.toml b/backend/parsers/windmill-parser-sql/Cargo.toml index 421aff33a2..085b709faa 100644 --- a/backend/parsers/windmill-parser-sql/Cargo.toml +++ b/backend/parsers/windmill-parser-sql/Cargo.toml @@ -8,9 +8,14 @@ authors.workspace = true name = "windmill_parser_sql" path = "./src/lib.rs" +[target.'cfg(target_arch = "wasm32")'.dependencies] +regex-lite.workspace = true + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +regex.workspace = true + [dependencies] windmill-parser.workspace = true anyhow.workspace = true -regex.workspace = true lazy_static.workspace = true -serde_json.workspace = true \ No newline at end of file +serde_json.workspace = true diff --git a/backend/parsers/windmill-parser-sql/src/lib.rs b/backend/parsers/windmill-parser-sql/src/lib.rs index 8f22bd1faa..fbb4ac5d40 100644 --- a/backend/parsers/windmill-parser-sql/src/lib.rs +++ b/backend/parsers/windmill-parser-sql/src/lib.rs @@ -1,7 +1,12 @@ #![allow(non_snake_case)] // TODO: switch to parse_* function naming use anyhow::anyhow; + +#[cfg(not(target_arch = "wasm32"))] use regex::Regex; +#[cfg(target_arch = "wasm32")] +use regex_lite::Regex; + use serde_json::json; use std::{ diff --git a/backend/parsers/windmill-parser-ts/Cargo.toml b/backend/parsers/windmill-parser-ts/Cargo.toml index 2a84c4e542..5f04b14f3b 100644 --- a/backend/parsers/windmill-parser-ts/Cargo.toml +++ b/backend/parsers/windmill-parser-ts/Cargo.toml @@ -22,6 +22,5 @@ swc_ecma_ast.workspace = true swc_ecma_visit.workspace = true serde_json.workspace = true anyhow.workspace = true -convert_case.workspace = true regex.workspace = true lazy_static.workspace = true diff --git a/backend/parsers/windmill-parser-ts/src/lib.rs b/backend/parsers/windmill-parser-ts/src/lib.rs index 56d645edf4..41ad759f0a 100644 --- a/backend/parsers/windmill-parser-ts/src/lib.rs +++ b/backend/parsers/windmill-parser-ts/src/lib.rs @@ -1,5 +1,3 @@ -use convert_case::{Case, Casing}; -use regex::Regex; /* * Author: Ruben Fiszel * Copyright: Windmill Labs, Inc 2022 @@ -11,7 +9,9 @@ use regex::Regex; use serde_json::Value; use std::collections::HashSet; use swc_ecma_visit::{noop_visit_type, Visit, VisitWith}; -use windmill_parser::{json_to_typ, Arg, MainArgSignature, ObjectProperty, OneOfVariant, Typ}; +use windmill_parser::{ + json_to_typ, to_snake_case, Arg, MainArgSignature, ObjectProperty, OneOfVariant, Typ, +}; use swc_common::{sync::Lrc, FileName, SourceMap, SourceMapper, Span, Spanned}; use swc_ecma_ast::{ @@ -23,6 +23,7 @@ use swc_ecma_ast::{ }; use swc_ecma_parser::{lexer::Lexer, EsConfig, Parser, StringInput, Syntax, TsConfig}; +use regex::Regex; #[cfg(target_arch = "wasm32")] use wasm_bindgen::prelude::*; @@ -294,7 +295,6 @@ fn binding_ident_to_arg(BindingIdent { id, type_ann }: &BindingIdent) -> (String } lazy_static::lazy_static! { - static ref RE_SNK_CASE: Regex = Regex::new(r"_(\d)").unwrap(); static ref IMPORTS_VERSION: Regex = Regex::new(r"^((?:\@[^\/\@]+\/[^\/\@]+)|(?:[^\/\@]+))(?:\@(?:[^\/]+))?(.*)$").unwrap(); } @@ -320,13 +320,6 @@ pub fn remove_pinned_imports(code: &str) -> anyhow::Result { Ok(content) } -fn to_snake_case(s: &str) -> String { - let r = s.to_case(Case::Snake); - - // s_3 => s3 - RE_SNK_CASE.replace_all(&r, "$1").to_string() -} - fn tstype_to_typ(ts_type: &TsType) -> (Typ, bool) { match ts_type { TsType::TsKeywordType(t) => ( diff --git a/backend/parsers/windmill-parser-wasm/Cargo.toml b/backend/parsers/windmill-parser-wasm/Cargo.toml index a42672e7af..7fd0e01202 100644 --- a/backend/parsers/windmill-parser-wasm/Cargo.toml +++ b/backend/parsers/windmill-parser-wasm/Cargo.toml @@ -10,19 +10,35 @@ crate-type = ["cdylib"] name = "windmill_parser_wasm" path = "./src/lib.rs" +[profile.release] +lto = true +opt-level = 's' + [dev-dependencies] wasm-bindgen-test.workspace = true +windmill-parser-ts.workspace = true +windmill-parser-bash.workspace = true + +[features] +default = [] +go-parser = [ "dep:windmill-parser-go"] +bash-parser = [ "dep:windmill-parser-bash"] +sql-parser = [ "dep:windmill-parser-sql"] +py-parser = [ "dep:windmill-parser-py"] +ts-parser = [ "dep:windmill-parser-ts"] +php-parser = [ "dep:windmill-parser-php"] +graphql-parser = [ "dep:windmill-parser-graphql"] [dependencies] anyhow.workspace = true windmill-parser.workspace = true -windmill-parser-go.workspace = true -windmill-parser-bash.workspace = true -windmill-parser-sql.workspace = true -windmill-parser-py.workspace = true -windmill-parser-ts.workspace = true -windmill-parser-php.workspace = true -windmill-parser-graphql.workspace = true +windmill-parser-go = { workspace = true, optional = true } +windmill-parser-bash = { workspace = true, optional = true } +windmill-parser-sql = { workspace = true, optional = true } +windmill-parser-py = { workspace = true, optional = true } +windmill-parser-ts = { workspace = true, optional = true } +windmill-parser-php = { workspace = true, optional = true } +windmill-parser-graphql = { workspace = true, optional = true } wasm-bindgen.workspace = true serde_json.workspace = true getrandom = { workspace = true, features = ["js"] } diff --git a/backend/parsers/windmill-parser-wasm/build-pkgs.sh b/backend/parsers/windmill-parser-wasm/build-pkgs.sh new file mode 100755 index 0000000000..636b5bf93b --- /dev/null +++ b/backend/parsers/windmill-parser-wasm/build-pkgs.sh @@ -0,0 +1,38 @@ +#!/bin/bash +set -eou pipefail + +# full pkg +OUT_DIR="pkg" +wasm-pack build --release --target web --out-dir $OUT_DIR --all-features \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort + +# bun and deno +OUT_DIR="pkg-ts" +wasm-pack build --release --target web --out-dir $OUT_DIR --features "ts-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-ts"/' $OUT_DIR/package.json + +# sql languages, graphql and bash/powershell, since they all use regex +OUT_DIR="pkg-regex" +wasm-pack build --release --target web --out-dir $OUT_DIR \ + --features "sql-parser,graphql-parser,bash-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-regex"/' $OUT_DIR/package.json + +# python +OUT_DIR="pkg-py" +wasm-pack build --release --target web --out-dir $OUT_DIR --features "py-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-py"/' $OUT_DIR/package.json + +# go +OUT_DIR="pkg-go" +wasm-pack build --release --target web --out-dir $OUT_DIR --features "go-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-go"/' $OUT_DIR/package.json + +# php +OUT_DIR="pkg-php" +wasm-pack build --release --target web --out-dir $OUT_DIR --features "php-parser" \ + -Z build-std=panic_abort,std -Z build-std-features=panic_immediate_abort +sed -i 's/"windmill-parser-wasm"/"windmill-parser-wasm-php"/' $OUT_DIR/package.json diff --git a/backend/parsers/windmill-parser-wasm/pkg/package.json b/backend/parsers/windmill-parser-wasm/pkg/package.json index 0c70400479..e63340cf07 100644 --- a/backend/parsers/windmill-parser-wasm/pkg/package.json +++ b/backend/parsers/windmill-parser-wasm/pkg/package.json @@ -3,7 +3,7 @@ "collaborators": [ "Ruben Fiszel " ], - "version": "1.367.2", + "version": "1.385.0", "files": [ "windmill_parser_wasm_bg.wasm", "windmill_parser_wasm.js", diff --git a/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm.d.ts b/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm.d.ts index 30e4bc2f54..6b6125640a 100644 --- a/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm.d.ts +++ b/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm.d.ts @@ -107,18 +107,18 @@ export type SyncInitInput = BufferSource | WebAssembly.Module; * Instantiates the given `module`, which can either be bytes or * a precompiled `WebAssembly.Module`. * -* @param {SyncInitInput} module +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. * * @returns {InitOutput} */ -export function initSync(module: SyncInitInput): InitOutput; +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; /** * If `module_or_path` is {RequestInfo} or {URL}, makes a request and * for everything else, calls `WebAssembly.instantiate` directly. * -* @param {InitInput | Promise} module_or_path +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. * * @returns {Promise} */ -export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm.js b/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm.js index a945347d31..ae0865a76c 100644 --- a/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm.js +++ b/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm.js @@ -22,13 +22,13 @@ function takeObject(idx) { let WASM_VECTOR_LEN = 0; -let cachedUint8Memory0 = null; +let cachedUint8ArrayMemory0 = null; -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); } - return cachedUint8Memory0; + return cachedUint8ArrayMemory0; } const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); @@ -51,7 +51,7 @@ function passStringToWasm0(arg, malloc, realloc) { if (realloc === undefined) { const buf = cachedTextEncoder.encode(arg); const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); WASM_VECTOR_LEN = buf.length; return ptr; } @@ -59,7 +59,7 @@ function passStringToWasm0(arg, malloc, realloc) { let len = arg.length; let ptr = malloc(len, 1) >>> 0; - const mem = getUint8Memory0(); + const mem = getUint8ArrayMemory0(); let offset = 0; @@ -74,7 +74,7 @@ function passStringToWasm0(arg, malloc, realloc) { arg = arg.slice(offset); } ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); const ret = encodeString(arg, view); offset += ret.written; @@ -89,22 +89,13 @@ function isLikeNone(x) { return x === undefined || x === null; } -let cachedInt32Memory0 = null; +let cachedDataViewMemory0 = null; -function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); } - return cachedInt32Memory0; -} - -let cachedFloat64Memory0 = null; - -function getFloat64Memory0() { - if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { - cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); - } - return cachedFloat64Memory0; + return cachedDataViewMemory0; } function addHeapObject(obj) { @@ -122,16 +113,7 @@ if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); -} - -let cachedBigInt64Memory0 = null; - -function getBigInt64Memory0() { - if (cachedBigInt64Memory0 === null || cachedBigInt64Memory0.byteLength === 0) { - cachedBigInt64Memory0 = new BigInt64Array(wasm.memory.buffer); - } - return cachedBigInt64Memory0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } function debugString(val) { @@ -210,8 +192,8 @@ export function parse_deno(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_deno(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -233,8 +215,8 @@ export function parse_outputs(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_outputs(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -256,8 +238,8 @@ export function parse_ts_imports(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_ts_imports(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -279,8 +261,8 @@ export function parse_bash(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_bash(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -302,8 +284,8 @@ export function parse_powershell(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_powershell(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -325,8 +307,8 @@ export function parse_go(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_go(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -348,8 +330,8 @@ export function parse_python(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_python(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -371,8 +353,8 @@ export function parse_sql(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_sql(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -394,8 +376,8 @@ export function parse_mysql(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_mysql(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -417,8 +399,8 @@ export function parse_bigquery(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_bigquery(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -440,8 +422,8 @@ export function parse_snowflake(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_snowflake(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -463,8 +445,8 @@ export function parse_mssql(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_mssql(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -484,8 +466,8 @@ export function parse_db_resource(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_db_resource(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); let v2; if (r0 !== 0) { v2 = getStringFromWasm0(r0, r1).slice(); @@ -509,8 +491,8 @@ export function parse_graphql(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_graphql(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -532,8 +514,8 @@ export function parse_php(code) { const ptr0 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; wasm.parse_php(retptr, ptr0, len0); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); deferred2_0 = r0; deferred2_1 = r1; return getStringFromWasm0(r0, r1); @@ -585,7 +567,7 @@ async function __wbg_load(module, imports) { function __wbg_get_imports() { const imports = {}; imports.wbg = {}; - imports.wbg.__wbg_eval_aa725d466edcea2c = function(arg0, arg1) { + imports.wbg.__wbg_eval_204ec87eadeaef4a = function(arg0, arg1) { const ret = eval(getStringFromWasm0(arg0, arg1)); return addHeapObject(ret); }; @@ -597,8 +579,8 @@ function __wbg_get_imports() { const ret = typeof(obj) === 'string' ? obj : undefined; var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); var len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }; imports.wbg.__wbindgen_boolean_get = function(arg0) { const v = getObject(arg0); @@ -612,8 +594,8 @@ function __wbg_get_imports() { imports.wbg.__wbindgen_number_get = function(arg0, arg1) { const obj = getObject(arg1); const ret = typeof(obj) === 'number' ? obj : undefined; - getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); }; imports.wbg.__wbindgen_is_object = function(arg0) { const val = getObject(arg0); @@ -644,11 +626,11 @@ function __wbg_get_imports() { const ret = getObject(arg0) == getObject(arg1); return ret; }; - imports.wbg.__wbg_get_bd8e338fbd5f5cc8 = function(arg0, arg1) { + imports.wbg.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { const ret = getObject(arg0)[arg1 >>> 0]; return addHeapObject(ret); }; - imports.wbg.__wbg_length_cd7af8117672b8b8 = function(arg0) { + imports.wbg.__wbg_length_ae22078168b726f5 = function(arg0) { const ret = getObject(arg0).length; return ret; }; @@ -656,39 +638,39 @@ function __wbg_get_imports() { const ret = typeof(getObject(arg0)) === 'function'; return ret; }; - imports.wbg.__wbg_next_40fc327bfc8770e6 = function(arg0) { + imports.wbg.__wbg_next_de3e9db4440638b2 = function(arg0) { const ret = getObject(arg0).next; return addHeapObject(ret); }; - imports.wbg.__wbg_next_196c84450b364254 = function() { return handleError(function (arg0) { + imports.wbg.__wbg_next_f9cb570345655b9a = function() { return handleError(function (arg0) { const ret = getObject(arg0).next(); return addHeapObject(ret); }, arguments) }; - imports.wbg.__wbg_done_298b57d23c0fc80c = function(arg0) { + imports.wbg.__wbg_done_bfda7aa8f252b39f = function(arg0) { const ret = getObject(arg0).done; return ret; }; - imports.wbg.__wbg_value_d93c65011f51a456 = function(arg0) { + imports.wbg.__wbg_value_6d39332ab4788d86 = function(arg0) { const ret = getObject(arg0).value; return addHeapObject(ret); }; - imports.wbg.__wbg_iterator_2cee6dadfd956dfa = function() { + imports.wbg.__wbg_iterator_888179a48810a9fe = function() { const ret = Symbol.iterator; return addHeapObject(ret); }; - imports.wbg.__wbg_get_e3c254076557e348 = function() { return handleError(function (arg0, arg1) { + imports.wbg.__wbg_get_224d16597dbbfd96 = function() { return handleError(function (arg0, arg1) { const ret = Reflect.get(getObject(arg0), getObject(arg1)); return addHeapObject(ret); }, arguments) }; - imports.wbg.__wbg_call_27c0f87801dedf93 = function() { return handleError(function (arg0, arg1) { + imports.wbg.__wbg_call_1084a111329e68ce = function() { return handleError(function (arg0, arg1) { const ret = getObject(arg0).call(getObject(arg1)); return addHeapObject(ret); }, arguments) }; - imports.wbg.__wbg_isArray_2ab64d95e09ea0ae = function(arg0) { + imports.wbg.__wbg_isArray_8364a5371e9737d8 = function(arg0) { const ret = Array.isArray(getObject(arg0)); return ret; }; - imports.wbg.__wbg_instanceof_ArrayBuffer_836825be07d4c9d2 = function(arg0) { + imports.wbg.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { let result; try { result = getObject(arg0) instanceof ArrayBuffer; @@ -698,7 +680,7 @@ function __wbg_get_imports() { const ret = result; return ret; }; - imports.wbg.__wbg_instanceof_Map_87917e0a7aaf4012 = function(arg0) { + imports.wbg.__wbg_instanceof_Map_763ce0e95960d55e = function(arg0) { let result; try { result = getObject(arg0) instanceof Map; @@ -708,30 +690,30 @@ function __wbg_get_imports() { const ret = result; return ret; }; - imports.wbg.__wbg_isSafeInteger_f7b04ef02296c4d2 = function(arg0) { + imports.wbg.__wbg_isSafeInteger_7f1ed56200d90674 = function(arg0) { const ret = Number.isSafeInteger(getObject(arg0)); return ret; }; - imports.wbg.__wbg_entries_95cc2c823b285a09 = function(arg0) { + imports.wbg.__wbg_entries_7a0e06255456ebcd = function(arg0) { const ret = Object.entries(getObject(arg0)); return addHeapObject(ret); }; - imports.wbg.__wbg_buffer_12d079cc21e14bdb = function(arg0) { + imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { const ret = getObject(arg0).buffer; return addHeapObject(ret); }; - imports.wbg.__wbg_new_63b92bc8671ed464 = function(arg0) { + imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { const ret = new Uint8Array(getObject(arg0)); return addHeapObject(ret); }; - imports.wbg.__wbg_set_a47bac70306a19a7 = function(arg0, arg1, arg2) { + imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { getObject(arg0).set(getObject(arg1), arg2 >>> 0); }; - imports.wbg.__wbg_length_c20a40f15020d68a = function(arg0) { + imports.wbg.__wbg_length_8339fcf5d8ecd12e = function(arg0) { const ret = getObject(arg0).length; return ret; }; - imports.wbg.__wbg_instanceof_Uint8Array_2b3bbecd033d19f6 = function(arg0) { + imports.wbg.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { let result; try { result = getObject(arg0) instanceof Uint8Array; @@ -744,15 +726,15 @@ function __wbg_get_imports() { imports.wbg.__wbindgen_bigint_get_as_i64 = function(arg0, arg1) { const v = getObject(arg1); const ret = typeof(v) === 'bigint' ? v : undefined; - getBigInt64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? BigInt(0) : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); + getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); }; imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { const ret = debugString(getObject(arg1)); const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }; imports.wbg.__wbindgen_throw = function(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); @@ -765,17 +747,16 @@ function __wbg_get_imports() { return imports; } -function __wbg_init_memory(imports, maybe_memory) { +function __wbg_init_memory(imports, memory) { } function __wbg_finalize_init(instance, module) { wasm = instance.exports; __wbg_init.__wbindgen_wasm_module = module; - cachedBigInt64Memory0 = null; - cachedFloat64Memory0 = null; - cachedInt32Memory0 = null; - cachedUint8Memory0 = null; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + return wasm; @@ -784,6 +765,12 @@ function __wbg_finalize_init(instance, module) { function initSync(module) { if (wasm !== undefined) return wasm; + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + const imports = __wbg_get_imports(); __wbg_init_memory(imports); @@ -797,24 +784,30 @@ function initSync(module) { return __wbg_finalize_init(instance, module); } -async function __wbg_init(input) { +async function __wbg_init(module_or_path) { if (wasm !== undefined) return wasm; - if (typeof input === 'undefined') { - input = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('windmill_parser_wasm_bg.wasm', import.meta.url); } const imports = __wbg_get_imports(); - if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { - input = fetch(input); + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); } __wbg_init_memory(imports); - const { instance, module } = await __wbg_load(await input, imports); + const { instance, module } = await __wbg_load(await module_or_path, imports); return __wbg_finalize_init(instance, module); } -export { initSync } +export { initSync }; export default __wbg_init; diff --git a/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm_bg.wasm b/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm_bg.wasm index eb64263b45..501033c565 100644 Binary files a/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm_bg.wasm and b/backend/parsers/windmill-parser-wasm/pkg/windmill_parser_wasm_bg.wasm differ diff --git a/backend/parsers/windmill-parser-wasm/publish-pkgs.sh b/backend/parsers/windmill-parser-wasm/publish-pkgs.sh new file mode 100755 index 0000000000..6e4f029a87 --- /dev/null +++ b/backend/parsers/windmill-parser-wasm/publish-pkgs.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -eou pipefail +script_dirpath="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +args=${1:-} + +# bun and deno +pushd "pkg-ts" && npm publish ${args} +popd + +pushd "pkg-regex" && npm publish ${args} +popd + +pushd "pkg-py" && npm publish ${args} +popd + +pushd "pkg-go" && npm publish ${args} +popd + +pushd "pkg-php" && npm publish ${args} +popd diff --git a/backend/parsers/windmill-parser-wasm/src/lib.rs b/backend/parsers/windmill-parser-wasm/src/lib.rs index 5218357656..ddd555cfbf 100644 --- a/backend/parsers/windmill-parser-wasm/src/lib.rs +++ b/backend/parsers/windmill-parser-wasm/src/lib.rs @@ -1,8 +1,12 @@ +#[cfg(feature = "ts-parser")] use serde_json::json; +#[allow(unused_imports)] use wasm_bindgen::prelude::*; use windmill_parser::MainArgSignature; +#[cfg(feature = "ts-parser")] use windmill_parser_ts::{parse_expr_for_ids, parse_expr_for_imports}; +#[allow(dead_code)] fn wrap_sig(r: anyhow::Result) -> String { if let Ok(r) = r { return serde_json::to_string(&r).unwrap(); @@ -11,11 +15,13 @@ fn wrap_sig(r: anyhow::Result) -> String { } } +#[cfg(feature = "ts-parser")] #[wasm_bindgen] pub fn parse_deno(code: &str) -> String { wrap_sig(windmill_parser_ts::parse_deno_signature(code, false, None)) } +#[cfg(feature = "ts-parser")] #[wasm_bindgen] pub fn parse_outputs(code: &str) -> String { let parsed = parse_expr_for_ids(code); @@ -27,6 +33,7 @@ pub fn parse_outputs(code: &str) -> String { return serde_json::to_string(&r).unwrap(); } +#[cfg(feature = "ts-parser")] #[wasm_bindgen] pub fn parse_ts_imports(code: &str) -> String { let parsed = parse_expr_for_imports(code); @@ -38,61 +45,73 @@ pub fn parse_ts_imports(code: &str) -> String { return serde_json::to_string(&r).unwrap(); } +#[cfg(feature = "bash-parser")] #[wasm_bindgen] pub fn parse_bash(code: &str) -> String { wrap_sig(windmill_parser_bash::parse_bash_sig(code)) } +#[cfg(feature = "bash-parser")] #[wasm_bindgen] pub fn parse_powershell(code: &str) -> String { wrap_sig(windmill_parser_bash::parse_powershell_sig(code)) } +#[cfg(feature = "go-parser")] #[wasm_bindgen] pub fn parse_go(code: &str) -> String { wrap_sig(windmill_parser_go::parse_go_sig(code)) } +#[cfg(feature = "py-parser")] #[wasm_bindgen] pub fn parse_python(code: &str) -> String { wrap_sig(windmill_parser_py::parse_python_signature(code, None)) } +#[cfg(feature = "sql-parser")] #[wasm_bindgen] pub fn parse_sql(code: &str) -> String { wrap_sig(windmill_parser_sql::parse_pgsql_sig(code)) } +#[cfg(feature = "sql-parser")] #[wasm_bindgen] pub fn parse_mysql(code: &str) -> String { wrap_sig(windmill_parser_sql::parse_mysql_sig(code)) } +#[cfg(feature = "sql-parser")] #[wasm_bindgen] pub fn parse_bigquery(code: &str) -> String { wrap_sig(windmill_parser_sql::parse_bigquery_sig(code)) } +#[cfg(feature = "sql-parser")] #[wasm_bindgen] pub fn parse_snowflake(code: &str) -> String { wrap_sig(windmill_parser_sql::parse_snowflake_sig(code)) } +#[cfg(feature = "sql-parser")] #[wasm_bindgen] pub fn parse_mssql(code: &str) -> String { wrap_sig(windmill_parser_sql::parse_mssql_sig(code)) } +#[cfg(feature = "sql-parser")] #[wasm_bindgen] pub fn parse_db_resource(code: &str) -> Option { windmill_parser_sql::parse_db_resource(code) } +#[cfg(feature = "graphql-parser")] #[wasm_bindgen] pub fn parse_graphql(code: &str) -> String { wrap_sig(windmill_parser_graphql::parse_graphql_sig(code)) } +#[cfg(feature = "php-parser")] #[wasm_bindgen] pub fn parse_php(code: &str) -> String { wrap_sig(windmill_parser_php::parse_php_signature(code, None)) diff --git a/backend/parsers/windmill-parser/Cargo.toml b/backend/parsers/windmill-parser/Cargo.toml index 9bf4ad5eba..7dc464a4b3 100644 --- a/backend/parsers/windmill-parser/Cargo.toml +++ b/backend/parsers/windmill-parser/Cargo.toml @@ -11,3 +11,4 @@ path = "./src/lib.rs" [dependencies] serde = { version = "1.0", features = ["derive"] } serde_json.workspace = true +convert_case.workspace = true diff --git a/backend/parsers/windmill-parser/src/lib.rs b/backend/parsers/windmill-parser/src/lib.rs index a739dc53d2..c65b95d07c 100644 --- a/backend/parsers/windmill-parser/src/lib.rs +++ b/backend/parsers/windmill-parser/src/lib.rs @@ -6,6 +6,7 @@ * LICENSE-AGPL for a copy of the license. */ +use convert_case::{Boundary, Case, Casing}; use serde::Serialize; use serde_json::Value; @@ -75,3 +76,88 @@ pub fn json_to_typ(js: &Value) -> Typ { _ => Typ::Unknown, } } + +pub fn to_snake_case(s: &str) -> String { + s.with_boundaries(&Boundary::defaults()) + .without_boundaries(&Boundary::letter_digit()) + .to_case(Case::Snake) +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_snake_case() { + assert_eq!("s3", to_snake_case("S3")); + assert_eq!("s3", to_snake_case("s3")); + assert_eq!("s_3", to_snake_case("S_3")); + assert_eq!("type_name_here", to_snake_case("typeNameHere")); + } + + #[test] + fn test_empty_string() { + assert_eq!(to_snake_case(""), ""); + } + + #[test] + fn test_single_char_lowercase() { + assert_eq!(to_snake_case("a"), "a"); + } + + #[test] + fn test_single_char_uppercase() { + assert_eq!(to_snake_case("A"), "a"); + } + + #[test] + fn test_all_uppercase() { + assert_eq!(to_snake_case("TEST"), "test"); + } + + #[test] + fn test_all_lowercase() { + assert_eq!(to_snake_case("test"), "test"); + } + + #[test] + fn test_mixed_case() { + assert_eq!(to_snake_case("testCase"), "test_case"); + } + + #[test] + fn test_mixed_case_with_numbers() { + assert_eq!(to_snake_case("testCase1"), "test_case1"); + assert_eq!(to_snake_case("Test123Case"), "test123_case"); + } + + #[test] + fn test_numbers_with_hyphen() { + assert_eq!(to_snake_case("test-3"), "test_3"); + } + + #[test] + fn test_string_with_spaces() { + assert_eq!(to_snake_case("This is a Test"), "this_is_a_test"); + } + + #[test] + fn test_snake_case_input() { + assert_eq!(to_snake_case("already_snake_case"), "already_snake_case"); + } + + #[test] + fn test_kebab_case_input() { + assert_eq!(to_snake_case("already-kebab-case"), "already_kebab_case"); + } + + #[test] + fn test_mixed_delimiters() { + assert_eq!(to_snake_case("test-Case_with Spaces"), "test_case_with_spaces"); + } + + #[test] + fn test_leading_and_trailing_spaces() { + assert_eq!(to_snake_case(" test case "), "test_case"); + } +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 22a65a9f95..efa0851f49 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -66,7 +66,11 @@ "vscode-languageclient": "~9.0.1", "vscode-uri": "~3.0.8", "vscode-ws-jsonrpc": "~3.3.2", - "windmill-parser-wasm": "^1.367.2", + "windmill-parser-wasm-go": "^1.382.2", + "windmill-parser-wasm-php": "^1.382.2", + "windmill-parser-wasm-py": "^1.382.2", + "windmill-parser-wasm-regex": "^1.382.2", + "windmill-parser-wasm-ts": "^1.382.2", "windmill-sql-datatype-parser-wasm": "^1.318.0", "y-monaco": "^0.1.4", "y-websocket": "^1.5.0", @@ -13402,10 +13406,30 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/windmill-parser-wasm": { - "version": "1.367.2", - "resolved": "https://registry.npmjs.org/windmill-parser-wasm/-/windmill-parser-wasm-1.367.2.tgz", - "integrity": "sha512-If/IXXXADC0jWq4Vj6IN1IRZ1GTWCpE4oMnyZAkVzZUJ2ZbQLw5maLhAmm4iAMpmMHRb4U4kd68D1h30Iy4MNQ==" + "node_modules/windmill-parser-wasm-go": { + "version": "1.385.0", + "resolved": "https://registry.npmjs.org/windmill-parser-wasm-go/-/windmill-parser-wasm-go-1.385.0.tgz", + "integrity": "sha512-au+i0TDbhnklDrpGTYSXVwqaY4DSKC17anHFLjeG8oHJ9xlc/kNG+2PASs2sqc5m7e6G6D78LDt/5FYs1b9b+g==" + }, + "node_modules/windmill-parser-wasm-php": { + "version": "1.385.0", + "resolved": "https://registry.npmjs.org/windmill-parser-wasm-php/-/windmill-parser-wasm-php-1.385.0.tgz", + "integrity": "sha512-3x6fFy19BXNfLhzctFEh5fozrKBoWUla/JsZpYaKPw7AKbQ/aP1o+SKZDSrXStaNDHfipdsPYLZ0MIxjZY6p1Q==" + }, + "node_modules/windmill-parser-wasm-py": { + "version": "1.385.0", + "resolved": "https://registry.npmjs.org/windmill-parser-wasm-py/-/windmill-parser-wasm-py-1.385.0.tgz", + "integrity": "sha512-v+6hZNGBp+8KMoAkWIlt5Eu+0n1mNf7vrk/bHr0X2s78cM4JhTXZ24eR7xx69eesQpO7X87pEn/HJHIUHC0kAQ==" + }, + "node_modules/windmill-parser-wasm-regex": { + "version": "1.385.0", + "resolved": "https://registry.npmjs.org/windmill-parser-wasm-regex/-/windmill-parser-wasm-regex-1.385.0.tgz", + "integrity": "sha512-rgqTANyiYNgdh2Hcgk8xFt/rmLCMGMnIlnZe+/9z2oggfkOKB9oAt49cyCLD9MZeXdTJuNPKn+IVMeSAOn6WYQ==" + }, + "node_modules/windmill-parser-wasm-ts": { + "version": "1.385.0", + "resolved": "https://registry.npmjs.org/windmill-parser-wasm-ts/-/windmill-parser-wasm-ts-1.385.0.tgz", + "integrity": "sha512-DKQZQzJmSqi7jCbROl9B8ZE/T6sG951zxs1/StWAJmnQazA0FJrdjTj0niiFQNkLaQ2aAPZUkSULZJG+7x1Jow==" }, "node_modules/windmill-sql-datatype-parser-wasm": { "version": "1.318.0", diff --git a/frontend/package.json b/frontend/package.json index f8d1ceb79e..e06025b26a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -139,7 +139,11 @@ "vscode-languageclient": "~9.0.1", "vscode-uri": "~3.0.8", "vscode-ws-jsonrpc": "~3.3.2", - "windmill-parser-wasm": "^1.367.2", + "windmill-parser-wasm-php": "^1.382.2", + "windmill-parser-wasm-go": "^1.382.2", + "windmill-parser-wasm-py": "^1.382.2", + "windmill-parser-wasm-regex": "^1.382.2", + "windmill-parser-wasm-ts": "^1.382.2", "windmill-sql-datatype-parser-wasm": "^1.318.0", "y-monaco": "^0.1.4", "y-websocket": "^1.5.0", diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index 0d2617f2be..11253e4610 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -169,7 +169,7 @@ SNOWFLAKE_TYPES } from '$lib/consts' import { setupTypeAcquisition } from '$lib/ata/index' - import { initWasm, parseDeps } from '$lib/infer' + import { initWasmTs, parseDeps } from '$lib/infer' import { initVim } from './monaco_keybindings' // import EditorTheme from './EditorTheme.svelte' @@ -1232,7 +1232,7 @@ } } } - await initWasm() + await initWasmTs() const root = await genRoot(hostname) console.log('SETUP TYPE ACQUISITION', { root, path }) ata = setupTypeAcquisition({ diff --git a/frontend/src/lib/infer.ts b/frontend/src/lib/infer.ts index 067f834b34..e0777caa98 100644 --- a/frontend/src/lib/infer.ts +++ b/frontend/src/lib/infer.ts @@ -3,33 +3,61 @@ import { get, writable } from 'svelte/store' import type { Schema, SupportedLanguage } from './common.js' import { emptySchema, sortObject } from './utils.js' import { tick } from 'svelte' -import init, { + +import initTsParser, { parse_deno, - parse_bash, - parse_go, - parse_python, + parse_outputs, + parse_ts_imports +} from 'windmill-parser-wasm-ts' +import initRegexParsers, { parse_sql, parse_mysql, parse_bigquery, parse_snowflake, parse_graphql, - parse_powershell, - parse_outputs, parse_mssql, - parse_ts_imports, parse_db_resource, - parse_php -} from 'windmill-parser-wasm' -import wasmUrl from 'windmill-parser-wasm/windmill_parser_wasm_bg.wasm?url' + parse_bash, + parse_powershell, +} from 'windmill-parser-wasm-regex' +import initPythonParser, { + parse_python, +} from 'windmill-parser-wasm-py' +import initGoParser, { + parse_go, +} from 'windmill-parser-wasm-go' +import initPhpParser, { + parse_php, +} from 'windmill-parser-wasm-php' + +import wasmUrlTs from 'windmill-parser-wasm-ts/windmill_parser_wasm_bg.wasm?url' +import wasmUrlRegex from 'windmill-parser-wasm-regex/windmill_parser_wasm_bg.wasm?url' +import wasmUrlPy from 'windmill-parser-wasm-py/windmill_parser_wasm_bg.wasm?url' +import wasmUrlGo from 'windmill-parser-wasm-go/windmill_parser_wasm_bg.wasm?url' +import wasmUrlPhp from 'windmill-parser-wasm-php/windmill_parser_wasm_bg.wasm?url' import { workspaceStore } from './stores.js' import { argSigToJsonSchemaType } from './inferArgSig.js' -init(wasmUrl) - const loadSchemaLastRun = writable<[string | undefined, MainArgSignature | undefined]>(undefined) -export async function initWasm() { - await init(wasmUrl) +let initializeTsPromise : Promise | undefined = undefined; +export async function initWasmTs() { + if (initializeTsPromise == undefined) { + initializeTsPromise = initTsParser(wasmUrlTs) + } + await initializeTsPromise +} +async function initWasmRegex() { + await initRegexParsers(wasmUrlRegex) +} +async function initWasmPython() { + await initPythonParser(wasmUrlPy) +} +async function initWasmPhp() { + await initPhpParser(wasmUrlPhp) +} +async function initWasmGo() { + await initGoParser(wasmUrlGo) } export function parseDeps(code: string): string[] { @@ -47,7 +75,6 @@ export async function inferArgs( code: string, schema: Schema ): Promise { - await init(wasmUrl) const lastRun = get(loadSchemaLastRun) let inferedSchema: MainArgSignature if (lastRun && code == lastRun[0] && lastRun[1]) { @@ -59,15 +86,20 @@ export async function inferArgs( let inlineDBResource: string | undefined = undefined if (['postgresql', 'mysql', 'bigquery', 'snowflake', 'mssql'].includes(language ?? '')) { + await initWasmRegex() inlineDBResource = parse_db_resource(code) } if (language == 'python3') { + await initWasmPython() inferedSchema = JSON.parse(parse_python(code)) } else if (language == 'deno') { + await initWasmTs() inferedSchema = JSON.parse(parse_deno(code)) } else if (language == 'nativets') { + await initWasmTs() inferedSchema = JSON.parse(parse_deno(code)) } else if (language == 'bun' || language == 'bunnative') { + await initWasmTs() inferedSchema = JSON.parse(parse_deno(code)) } else if (language == 'postgresql') { inferedSchema = JSON.parse(parse_sql(code)) @@ -113,15 +145,20 @@ export async function inferArgs( ] } } else if (language == 'graphql') { + await initWasmRegex() inferedSchema = JSON.parse(parse_graphql(code)) inferedSchema.args = [{ name: 'api', typ: { resource: 'graphql' } }, ...inferedSchema.args] } else if (language == 'go') { + await initWasmGo() inferedSchema = JSON.parse(parse_go(code)) } else if (language == 'bash') { + await initWasmRegex() inferedSchema = JSON.parse(parse_bash(code)) } else if (language == 'powershell') { + await initWasmRegex() inferedSchema = JSON.parse(parse_powershell(code)) } else if (language == 'php') { + await initWasmPhp() inferedSchema = JSON.parse(parse_php(code)) } else { return null @@ -233,7 +270,7 @@ export async function parseOutputs( code: string, ignoreError ): Promise<[string, string][] | undefined> { - await init(wasmUrl) + await initWasmTs() const getOutputs = await parse_outputs(code) const outputs = JSON.parse(getOutputs) if (outputs.error) {