Compare commits
5 Commits
v1.656.0
...
fix/inline
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1aac43977e | ||
|
|
05d4d6dd48 | ||
|
|
b6da492d1b | ||
|
|
87215193ca | ||
|
|
5df37fb0db |
@@ -1,5 +1,12 @@
|
||||
# Changelog
|
||||
|
||||
## [1.657.0](https://github.com/windmill-labs/windmill/compare/v1.656.0...v1.657.0) (2026-03-14)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add datatable config support to CLI settings sync and backend export ([#8024](https://github.com/windmill-labs/windmill/issues/8024)) ([5df37fb](https://github.com/windmill-labs/windmill/commit/5df37fb0dbf9190a430f066cf2d3c48914782e53))
|
||||
|
||||
## [1.656.0](https://github.com/windmill-labs/windmill/compare/v1.655.0...v1.656.0) (2026-03-13)
|
||||
|
||||
|
||||
|
||||
198
backend/Cargo.lock
generated
198
backend/Cargo.lock
generated
@@ -169,9 +169,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anstream"
|
||||
version = "0.6.21"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
|
||||
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"anstyle-parse",
|
||||
@@ -184,15 +184,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anstyle"
|
||||
version = "1.0.13"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
|
||||
checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-parse"
|
||||
version = "0.2.7"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
|
||||
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
|
||||
dependencies = [
|
||||
"utf8parse",
|
||||
]
|
||||
@@ -1860,9 +1860,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "bon"
|
||||
version = "3.9.0"
|
||||
version = "3.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2d13a61f2963b88eef9c1be03df65d42f6996dfeac1054870d950fcf66686f83"
|
||||
checksum = "f47dbe92550676ee653353c310dfb9cf6ba17ee70396e1f7cf0a2020ad49b2fe"
|
||||
dependencies = [
|
||||
"bon-macros",
|
||||
"rustversion",
|
||||
@@ -1870,9 +1870,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "bon-macros"
|
||||
version = "3.9.0"
|
||||
version = "3.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d314cc62af2b6b0c65780555abb4d02a03dd3b799cd42419044f0c38d99738c0"
|
||||
checksum = "519bd3116aeeb42d5372c29d982d16d0170d3d4a5ed85fc7dd91642ffff3c67c"
|
||||
dependencies = [
|
||||
"darling 0.23.0",
|
||||
"ident_case",
|
||||
@@ -2208,9 +2208,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.56"
|
||||
version = "1.2.57"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2"
|
||||
checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"jobserver",
|
||||
@@ -2323,9 +2323,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.5.60"
|
||||
version = "4.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a"
|
||||
checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
"clap_derive",
|
||||
@@ -2333,9 +2333,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.5.60"
|
||||
version = "4.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876"
|
||||
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@@ -2345,9 +2345,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_derive"
|
||||
version = "4.5.55"
|
||||
version = "4.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5"
|
||||
checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a"
|
||||
dependencies = [
|
||||
"heck 0.5.0",
|
||||
"proc-macro2",
|
||||
@@ -2357,9 +2357,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_lex"
|
||||
version = "1.0.0"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831"
|
||||
checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
|
||||
|
||||
[[package]]
|
||||
name = "clipboard-win"
|
||||
@@ -2418,9 +2418,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
||||
|
||||
[[package]]
|
||||
name = "colorchoice"
|
||||
version = "1.0.4"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
|
||||
checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
|
||||
|
||||
[[package]]
|
||||
name = "combine"
|
||||
@@ -14697,9 +14697,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tracing-subscriber"
|
||||
version = "0.3.22"
|
||||
version = "0.3.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e"
|
||||
checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
|
||||
dependencies = [
|
||||
"matchers",
|
||||
"nu-ansi-term",
|
||||
@@ -15741,7 +15741,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-nats",
|
||||
@@ -15808,7 +15808,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-alerting"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -15821,7 +15821,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"argon2",
|
||||
@@ -15962,7 +15962,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-agent-workers"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -15985,7 +15985,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-assets"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -15998,7 +15998,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-auth"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"axum 0.7.9",
|
||||
@@ -16024,7 +16024,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-client"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"reqwest 0.12.28",
|
||||
"serde",
|
||||
@@ -16034,7 +16034,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-configs"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -16051,7 +16051,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-debug"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"base64 0.22.1",
|
||||
@@ -16074,7 +16074,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-embeddings"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"axum 0.7.9",
|
||||
@@ -16097,7 +16097,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-flow-conversations"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -16113,7 +16113,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-flows"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -16133,7 +16133,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-groups"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -16153,7 +16153,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-inputs"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -16167,7 +16167,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-integration-tests"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-nats",
|
||||
@@ -16195,7 +16195,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-jobs"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"axum 0.7.9",
|
||||
@@ -16220,7 +16220,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-npm-proxy"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"flate2",
|
||||
@@ -16238,7 +16238,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-openapi"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"axum 0.7.9",
|
||||
@@ -16259,7 +16259,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-schedule"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -16279,7 +16279,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-scripts"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -16309,7 +16309,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-settings"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"axum 0.7.9",
|
||||
@@ -16336,7 +16336,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-sse"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
"serde",
|
||||
@@ -16348,7 +16348,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-users"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"argon2",
|
||||
"axum 0.7.9",
|
||||
@@ -16371,7 +16371,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-workers"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -16385,7 +16385,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-api-workspaces"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"axum 0.7.9",
|
||||
"chrono",
|
||||
@@ -16416,7 +16416,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-audit"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"lazy_static",
|
||||
@@ -16430,7 +16430,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-autoscaling"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"axum 0.7.9",
|
||||
@@ -16449,7 +16449,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-common"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"aes-gcm",
|
||||
"anyhow",
|
||||
@@ -16548,7 +16548,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-dep-map"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"itertools 0.14.0",
|
||||
@@ -16567,7 +16567,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-git-sync"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"regex",
|
||||
"serde",
|
||||
@@ -16582,7 +16582,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-indexer"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"astral-tokio-tar",
|
||||
@@ -16606,7 +16606,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-jseval"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"futures",
|
||||
@@ -16623,7 +16623,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-macros"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"lazy_static",
|
||||
@@ -16639,7 +16639,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-mcp"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -16660,7 +16660,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-native-triggers"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -16691,7 +16691,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-oauth"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-oauth2",
|
||||
@@ -16715,7 +16715,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-object-store"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-stream",
|
||||
@@ -16749,7 +16749,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-operator"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"futures",
|
||||
@@ -16767,7 +16767,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"convert_case 0.6.0",
|
||||
"serde",
|
||||
@@ -16776,7 +16776,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-bash"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"lazy_static",
|
||||
@@ -16788,7 +16788,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-csharp"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"serde_json",
|
||||
@@ -16800,7 +16800,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-go"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"gosyn",
|
||||
@@ -16812,7 +16812,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-graphql"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"lazy_static",
|
||||
@@ -16824,7 +16824,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-java"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"serde_json",
|
||||
@@ -16836,7 +16836,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-nu"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"nu-parser",
|
||||
@@ -16847,7 +16847,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-php"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"itertools 0.14.0",
|
||||
@@ -16858,7 +16858,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-py"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"itertools 0.14.0",
|
||||
@@ -16870,7 +16870,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-py-asset"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"rustpython-ast",
|
||||
@@ -16881,7 +16881,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-py-imports"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-recursion",
|
||||
@@ -16905,7 +16905,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-ruby"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"lazy_static",
|
||||
@@ -16919,7 +16919,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-rust"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"convert_case 0.6.0",
|
||||
@@ -16936,7 +16936,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-sql"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"lazy_static",
|
||||
@@ -16950,7 +16950,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-sql-asset"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"serde",
|
||||
@@ -16962,7 +16962,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-ts"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"lazy_static",
|
||||
@@ -16980,7 +16980,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-ts-asset"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"serde-wasm-bindgen",
|
||||
@@ -16996,7 +16996,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-wac"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"rustpython-ast",
|
||||
@@ -17012,7 +17012,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-parser-yaml"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"serde",
|
||||
@@ -17023,7 +17023,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-queue"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-recursion",
|
||||
@@ -17060,7 +17060,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-runtime-nativets"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"const_format",
|
||||
@@ -17098,7 +17098,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-sql-datatype-parser-wasm"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"getrandom 0.3.4",
|
||||
"wasm-bindgen",
|
||||
@@ -17109,7 +17109,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-store"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-recursion",
|
||||
@@ -17138,7 +17138,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-test-utils"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"axum 0.7.9",
|
||||
@@ -17161,7 +17161,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-trigger"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -17194,7 +17194,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-trigger-email"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -17214,7 +17214,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-trigger-gcp"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -17248,7 +17248,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-trigger-http"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -17283,7 +17283,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-trigger-kafka"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -17306,7 +17306,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-trigger-mqtt"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -17330,7 +17330,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-trigger-nats"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-nats",
|
||||
@@ -17354,7 +17354,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-trigger-postgres"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -17389,7 +17389,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-trigger-sqs"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -17417,7 +17417,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-trigger-websocket"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@@ -17440,7 +17440,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-types"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bitflags 2.9.4",
|
||||
@@ -17458,7 +17458,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-worker"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-once-cell",
|
||||
@@ -17564,7 +17564,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windmill-worker-volumes"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "windmill"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
|
||||
@@ -82,7 +82,7 @@ members = [
|
||||
exclude = ["./windmill-duckdb-ffi-internal"]
|
||||
|
||||
[workspace.package]
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
authors = ["Ruben Fiszel <ruben@windmill.dev>"]
|
||||
edition = "2021"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
openapi: "3.0.3"
|
||||
|
||||
info:
|
||||
version: 1.655.0
|
||||
version: 1.657.0
|
||||
title: Windmill API
|
||||
|
||||
contact:
|
||||
|
||||
@@ -283,6 +283,8 @@ struct SimplifiedSettings {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
operator_settings: Option<serde_json::Value>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
datatable: Option<Value>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
slack_team_id: Option<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
slack_name: Option<String>,
|
||||
@@ -323,6 +325,8 @@ struct SimplifiedSettingsLegacy {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
operator_settings: Option<serde_json::Value>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
datatable: Option<Value>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
slack_team_id: Option<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
slack_name: Option<String>,
|
||||
@@ -347,6 +351,7 @@ struct SettingsRow {
|
||||
mute_critical_alerts: Option<bool>,
|
||||
color: Option<String>,
|
||||
operator_settings: Option<serde_json::Value>,
|
||||
datatable: Option<Value>,
|
||||
slack_team_id: Option<String>,
|
||||
slack_name: Option<String>,
|
||||
slack_command_script: Option<String>,
|
||||
@@ -955,6 +960,7 @@ pub(crate) async fn tarball_workspace(
|
||||
mute_critical_alerts,
|
||||
color,
|
||||
operator_settings,
|
||||
datatable,
|
||||
slack_team_id,
|
||||
slack_name,
|
||||
slack_command_script
|
||||
@@ -983,6 +989,7 @@ pub(crate) async fn tarball_workspace(
|
||||
mute_critical_alerts: row.mute_critical_alerts,
|
||||
color: row.color.clone(),
|
||||
operator_settings: row.operator_settings.clone(),
|
||||
datatable: row.datatable.clone(),
|
||||
slack_team_id: row.slack_team_id.clone(),
|
||||
slack_name: row.slack_name.clone(),
|
||||
slack_command_script: row.slack_command_script.clone(),
|
||||
@@ -1045,6 +1052,7 @@ pub(crate) async fn tarball_workspace(
|
||||
mute_critical_alerts: row.mute_critical_alerts,
|
||||
color: row.color,
|
||||
operator_settings: row.operator_settings,
|
||||
datatable: row.datatable,
|
||||
slack_team_id: row.slack_team_id,
|
||||
slack_name: row.slack_name,
|
||||
slack_command_script: row.slack_command_script,
|
||||
|
||||
@@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts";
|
||||
import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts";
|
||||
import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts";
|
||||
|
||||
export const VERSION = "v1.655.0";
|
||||
export const VERSION = "v1.657.0";
|
||||
|
||||
export async function login(email: string, password: string): Promise<string> {
|
||||
return await windmill.UserService.login({
|
||||
|
||||
@@ -29,7 +29,10 @@ import { FlowFile } from "./flow.ts";
|
||||
import { FlowValue } from "../../../gen/types.gen.ts";
|
||||
import { replaceInlineScripts } from "../../../windmill-utils-internal/src/inline-scripts/replacer.ts";
|
||||
import { workspaceDependenciesLanguages } from "../../utils/script_common.ts";
|
||||
import { extractNameFromFolder, getFolderSuffix } from "../../utils/resource_folders.ts";
|
||||
import {
|
||||
extractNameFromFolder,
|
||||
getNonDottedPaths,
|
||||
} from "../../utils/resource_folders.ts";
|
||||
|
||||
const TOP_HASH = "__flow_hash";
|
||||
async function generateFlowHash(
|
||||
@@ -157,7 +160,9 @@ export async function generateFlowLockInternal(
|
||||
filteredDeps
|
||||
);
|
||||
|
||||
const lockAssigner = newPathAssigner(opts.defaultTs ?? "bun");
|
||||
const lockAssigner = newPathAssigner(opts.defaultTs ?? "bun", {
|
||||
skipInlineScriptSuffix: getNonDottedPaths(),
|
||||
});
|
||||
const inlineScripts = extractInlineScriptsForFlows(
|
||||
flowValue.value.modules,
|
||||
{},
|
||||
|
||||
@@ -53,6 +53,7 @@ export interface SimplifiedSettings {
|
||||
mute_critical_alerts?: boolean;
|
||||
color?: string;
|
||||
operator_settings?: any;
|
||||
datatable?: any;
|
||||
slack_team_id?: string;
|
||||
slack_name?: string;
|
||||
slack_command_script?: string;
|
||||
@@ -100,6 +101,7 @@ export function migrateToGroupedFormat(settings: any): SimplifiedSettings {
|
||||
if (settings.mute_critical_alerts !== undefined) result.mute_critical_alerts = settings.mute_critical_alerts;
|
||||
if (settings.color !== undefined) result.color = settings.color;
|
||||
if (settings.operator_settings !== undefined) result.operator_settings = settings.operator_settings;
|
||||
if (settings.datatable !== undefined) result.datatable = settings.datatable;
|
||||
if (settings.slack_team_id !== undefined) result.slack_team_id = settings.slack_team_id;
|
||||
if (settings.slack_name !== undefined) result.slack_name = settings.slack_name;
|
||||
if (settings.slack_command_script !== undefined) result.slack_command_script = settings.slack_command_script;
|
||||
@@ -192,6 +194,7 @@ export async function pushWorkspaceSettings(
|
||||
mute_critical_alerts: remoteSettings.mute_critical_alerts,
|
||||
color: remoteSettings.color,
|
||||
operator_settings: remoteSettings.operator_settings,
|
||||
datatable: remoteSettings.datatable,
|
||||
slack_team_id: remoteSettings.slack_team_id,
|
||||
slack_name: remoteSettings.slack_name,
|
||||
slack_command_script: remoteSettings.slack_command_script,
|
||||
@@ -382,6 +385,14 @@ export async function pushWorkspaceSettings(
|
||||
});
|
||||
}
|
||||
|
||||
if (!deepEqual(localSettings.datatable, settings.datatable)) {
|
||||
log.debug(`Updating datatable config...`);
|
||||
await wmill.editDataTableConfig({
|
||||
workspace,
|
||||
requestBody: { settings: localSettings.datatable ?? { datatables: {} } },
|
||||
});
|
||||
}
|
||||
|
||||
if (localSettings.slack_command_script != settings.slack_command_script) {
|
||||
log.debug(`Updating slack command script...`);
|
||||
await wmill.editSlackCommand({
|
||||
|
||||
@@ -5072,6 +5072,23 @@ folder related commands
|
||||
- \`folder add-missing\` - create default folder.meta.yaml for all subdirectories of f/ that are missing one
|
||||
- \`-y, --yes\` - skip confirmation prompt
|
||||
|
||||
### generate-metadata
|
||||
|
||||
Generate metadata (locks, schemas) for all scripts, flows, and apps
|
||||
|
||||
**Arguments:** \`[folder:string]\`
|
||||
|
||||
**Options:**
|
||||
- \`--yes\` - Skip confirmation prompt
|
||||
- \`--dry-run\` - Show what would be updated without making changes
|
||||
- \`--lock-only\` - Re-generate only the lock files
|
||||
- \`--schema-only\` - Re-generate only script schemas (skips flows and apps)
|
||||
- \`--skip-scripts\` - Skip processing scripts
|
||||
- \`--skip-flows\` - Skip processing flows
|
||||
- \`--skip-apps\` - Skip processing apps
|
||||
- \`-i --includes <patterns:file[]>\` - Comma separated patterns to specify which files to include
|
||||
- \`-e --excludes <patterns:file[]>\` - Comma separated patterns to specify which files to exclude
|
||||
|
||||
### gitsync-settings
|
||||
|
||||
Manage git-sync settings between local wmill.yaml and Windmill backend
|
||||
|
||||
@@ -68,7 +68,7 @@ export {
|
||||
workspaceAdd,
|
||||
};
|
||||
|
||||
export const VERSION = "1.655.0";
|
||||
export const VERSION = "1.657.0";
|
||||
|
||||
// Re-exported from constants.ts to maintain backwards compatibility
|
||||
export { WM_FORK_PREFIX } from "./core/constants.ts";
|
||||
|
||||
226
cli/test/datatable_settings_sync.test.ts
Normal file
226
cli/test/datatable_settings_sync.test.ts
Normal file
@@ -0,0 +1,226 @@
|
||||
/**
|
||||
* Datatable settings sync tests
|
||||
*
|
||||
* Tests that datatable config is correctly synced via settings.yaml during pull/push operations.
|
||||
*/
|
||||
|
||||
import { expect, test } from "bun:test";
|
||||
import { writeFile, readFile } from "node:fs/promises";
|
||||
import { parse, stringify } from "yaml";
|
||||
import { withTestBackend } from "./test_backend.ts";
|
||||
import { shouldSkipOnCI } from "./cargo_backend.ts";
|
||||
import { addWorkspace } from "../workspace.ts";
|
||||
|
||||
test.skipIf(shouldSkipOnCI())("Datatable config: included in sync pull settings.yaml", async () => {
|
||||
await withTestBackend(async (backend, tempDir) => {
|
||||
const testWorkspace = {
|
||||
remote: backend.baseUrl,
|
||||
workspaceId: backend.workspace,
|
||||
name: "datatable_pull_test",
|
||||
token: backend.token
|
||||
};
|
||||
await addWorkspace(testWorkspace, { force: true, configDir: backend.testConfigDir });
|
||||
|
||||
// Configure datatable on backend
|
||||
const datatableConfig = {
|
||||
datatables: {
|
||||
main: {
|
||||
database: {
|
||||
resource_path: "u/test/test_db",
|
||||
resource_type: "postgresql"
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const configResp = await backend.apiRequest!(
|
||||
`/api/w/${backend.workspace}/workspaces/edit_datatable_config`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ settings: datatableConfig })
|
||||
}
|
||||
);
|
||||
expect(configResp.ok).toBe(true);
|
||||
|
||||
// Create wmill.yaml with includeSettings
|
||||
await writeFile(`${tempDir}/wmill.yaml`, `defaultTs: bun
|
||||
includes:
|
||||
- "**"
|
||||
includeSettings: true`, "utf-8");
|
||||
|
||||
// Pull settings
|
||||
const result = await backend.runCLICommand(['sync', 'pull', '--yes'], tempDir);
|
||||
expect(result.code).toEqual(0);
|
||||
|
||||
// Verify settings.yaml was created and contains datatable
|
||||
const settingsContent = await readFile(`${tempDir}/settings.yaml`, "utf-8");
|
||||
expect(settingsContent).toContain("datatable:");
|
||||
expect(settingsContent).toContain("u/test/test_db");
|
||||
expect(settingsContent).toContain("postgresql");
|
||||
});
|
||||
});
|
||||
|
||||
test.skipIf(shouldSkipOnCI())("Datatable config: pushed correctly from settings.yaml", async () => {
|
||||
await withTestBackend(async (backend, tempDir) => {
|
||||
const testWorkspace = {
|
||||
remote: backend.baseUrl,
|
||||
workspaceId: backend.workspace,
|
||||
name: "datatable_push_test",
|
||||
token: backend.token
|
||||
};
|
||||
await addWorkspace(testWorkspace, { force: true, configDir: backend.testConfigDir });
|
||||
|
||||
// Create wmill.yaml with includeSettings
|
||||
await writeFile(`${tempDir}/wmill.yaml`, `defaultTs: bun
|
||||
includes:
|
||||
- "**"
|
||||
includeSettings: true`, "utf-8");
|
||||
|
||||
// First pull to get baseline settings
|
||||
const pullResult = await backend.runCLICommand(['sync', 'pull', '--yes'], tempDir);
|
||||
expect(pullResult.code).toEqual(0);
|
||||
|
||||
// Read existing settings and add datatable config
|
||||
const settingsContent = await readFile(`${tempDir}/settings.yaml`, "utf-8");
|
||||
const existingSettings = parse(settingsContent) as Record<string, unknown>;
|
||||
|
||||
existingSettings.datatable = {
|
||||
datatables: {
|
||||
analytics: {
|
||||
database: {
|
||||
resource_path: "u/admin/analytics_db",
|
||||
resource_type: "postgresql"
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
await writeFile(`${tempDir}/settings.yaml`, stringify(existingSettings), "utf-8");
|
||||
|
||||
// Push the modified settings
|
||||
const pushResult = await backend.runCLICommand(['sync', 'push', '--yes'], tempDir);
|
||||
expect(pushResult.code).toEqual(0);
|
||||
|
||||
// Verify the backend has the updated datatable config
|
||||
const settingsResp = await backend.apiRequest!(
|
||||
`/api/w/${backend.workspace}/workspaces/get_settings`
|
||||
);
|
||||
expect(settingsResp.ok).toBe(true);
|
||||
const settings = await settingsResp.json();
|
||||
|
||||
expect(settings.datatable).toBeDefined();
|
||||
expect(settings.datatable.datatables).toBeDefined();
|
||||
expect(settings.datatable.datatables.analytics).toBeDefined();
|
||||
expect(settings.datatable.datatables.analytics.database.resource_path).toEqual("u/admin/analytics_db");
|
||||
expect(settings.datatable.datatables.analytics.database.resource_type).toEqual("postgresql");
|
||||
});
|
||||
});
|
||||
|
||||
test.skipIf(shouldSkipOnCI())("Datatable config: empty/undefined doesn't cause errors", async () => {
|
||||
await withTestBackend(async (backend, tempDir) => {
|
||||
const testWorkspace = {
|
||||
remote: backend.baseUrl,
|
||||
workspaceId: backend.workspace,
|
||||
name: "datatable_empty_test",
|
||||
token: backend.token
|
||||
};
|
||||
await addWorkspace(testWorkspace, { force: true, configDir: backend.testConfigDir });
|
||||
|
||||
// Ensure datatable config is empty/cleared on backend
|
||||
const clearResp = await backend.apiRequest!(
|
||||
`/api/w/${backend.workspace}/workspaces/edit_datatable_config`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ settings: { datatables: {} } })
|
||||
}
|
||||
);
|
||||
expect(clearResp.ok).toBe(true);
|
||||
|
||||
// Create wmill.yaml with includeSettings
|
||||
await writeFile(`${tempDir}/wmill.yaml`, `defaultTs: bun
|
||||
includes:
|
||||
- "**"
|
||||
includeSettings: true`, "utf-8");
|
||||
|
||||
// Pull should succeed even with empty datatable config
|
||||
const pullResult = await backend.runCLICommand(['sync', 'pull', '--yes'], tempDir);
|
||||
expect(pullResult.code).toEqual(0);
|
||||
|
||||
// Settings.yaml should exist
|
||||
const settingsContent = await readFile(`${tempDir}/settings.yaml`, "utf-8");
|
||||
expect(settingsContent.length).toBeGreaterThan(0);
|
||||
|
||||
// Push should also succeed
|
||||
const pushResult = await backend.runCLICommand(['sync', 'push', '--yes'], tempDir);
|
||||
expect(pushResult.code).toEqual(0);
|
||||
});
|
||||
});
|
||||
|
||||
test.skipIf(shouldSkipOnCI())("Datatable config: round-trip preserves structure", async () => {
|
||||
await withTestBackend(async (backend, tempDir) => {
|
||||
const testWorkspace = {
|
||||
remote: backend.baseUrl,
|
||||
workspaceId: backend.workspace,
|
||||
name: "datatable_roundtrip_test",
|
||||
token: backend.token
|
||||
};
|
||||
await addWorkspace(testWorkspace, { force: true, configDir: backend.testConfigDir });
|
||||
|
||||
// Set up a complex datatable config on backend with multiple datatables
|
||||
const originalConfig = {
|
||||
datatables: {
|
||||
users: {
|
||||
database: {
|
||||
resource_path: "f/shared/users_db",
|
||||
resource_type: "postgresql"
|
||||
}
|
||||
},
|
||||
logs: {
|
||||
database: {
|
||||
resource_path: "f/shared/logs_db",
|
||||
resource_type: "instance"
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const configResp = await backend.apiRequest!(
|
||||
`/api/w/${backend.workspace}/workspaces/edit_datatable_config`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ settings: originalConfig })
|
||||
}
|
||||
);
|
||||
expect(configResp.ok).toBe(true);
|
||||
|
||||
// Create wmill.yaml with includeSettings
|
||||
await writeFile(`${tempDir}/wmill.yaml`, `defaultTs: bun
|
||||
includes:
|
||||
- "**"
|
||||
includeSettings: true`, "utf-8");
|
||||
|
||||
// Pull
|
||||
const pullResult = await backend.runCLICommand(['sync', 'pull', '--yes'], tempDir);
|
||||
expect(pullResult.code).toEqual(0);
|
||||
|
||||
// Push back without modification
|
||||
const pushResult = await backend.runCLICommand(['sync', 'push', '--yes'], tempDir);
|
||||
expect(pushResult.code).toEqual(0);
|
||||
|
||||
// Verify the config is preserved
|
||||
const settingsResp = await backend.apiRequest!(
|
||||
`/api/w/${backend.workspace}/workspaces/get_settings`
|
||||
);
|
||||
expect(settingsResp.ok).toBe(true);
|
||||
const settings = await settingsResp.json();
|
||||
|
||||
expect(settings.datatable).toBeDefined();
|
||||
expect(settings.datatable.datatables.users).toBeDefined();
|
||||
expect(settings.datatable.datatables.logs).toBeDefined();
|
||||
expect(settings.datatable.datatables.users.database.resource_path).toEqual("f/shared/users_db");
|
||||
expect(settings.datatable.datatables.logs.database.resource_type).toEqual("instance");
|
||||
});
|
||||
});
|
||||
@@ -1768,6 +1768,66 @@ excludes: []
|
||||
});
|
||||
});
|
||||
|
||||
test("Integration: Sync pull with nonDottedPaths uses non-dotted inline script filenames", async () => {
|
||||
await withTestBackend(async (backend, tempDir) => {
|
||||
// Push a flow using default dotted paths
|
||||
await writeFile(
|
||||
`${tempDir}/wmill.yaml`,
|
||||
`defaultTs: bun
|
||||
includes:
|
||||
- "**"
|
||||
excludes: []
|
||||
`,
|
||||
"utf-8",
|
||||
);
|
||||
|
||||
const uniqueId = Date.now();
|
||||
const flowName = `f/test/nondot_pull_inline_${uniqueId}`;
|
||||
const flowFixture = createFlowFixture(flowName);
|
||||
await mkdir(`${tempDir}/f/test/nondot_pull_inline_${uniqueId}${getFolderSuffix("flow")}`, { recursive: true });
|
||||
for (const file of Object.values(flowFixture)) {
|
||||
await writeFile(`${tempDir}/${file.path}`, file.content, "utf-8");
|
||||
}
|
||||
|
||||
const pushResult = await backend.runCLICommand(
|
||||
["sync", "push", "--yes", "--includes", `f/test/nondot_pull_inline_${uniqueId}*/**`],
|
||||
tempDir,
|
||||
);
|
||||
expect(pushResult.code).toEqual(0);
|
||||
|
||||
// Pull into a fresh directory with nonDottedPaths enabled
|
||||
const tempDir2 = await mkdtemp(join(tmpdir(), "wmill_nondot_inline_"));
|
||||
try {
|
||||
await writeFile(
|
||||
`${tempDir2}/wmill.yaml`,
|
||||
`defaultTs: bun
|
||||
nonDottedPaths: true
|
||||
includes:
|
||||
- "**"
|
||||
excludes: []
|
||||
`,
|
||||
"utf-8",
|
||||
);
|
||||
|
||||
const pullResult = await backend.runCLICommand(["sync", "pull", "--yes"], tempDir2);
|
||||
expect(pullResult.code).toEqual(0);
|
||||
|
||||
// Verify pulled files use non-dotted inline script naming
|
||||
const files = await listFilesRecursive(tempDir2);
|
||||
const flowFiles = files.filter((f) => f.includes(`nondot_pull_inline_${uniqueId}`));
|
||||
|
||||
expect(flowFiles.length > 0).toBeTruthy();
|
||||
// Should use __flow folder, not .flow
|
||||
expect(flowFiles.some((f) => f.includes("__flow/"))).toBeTruthy();
|
||||
// No files should have .inline_script. in their name
|
||||
const dottedInlineFiles = flowFiles.filter((f) => f.includes(".inline_script."));
|
||||
expect(dottedInlineFiles.length).toEqual(0);
|
||||
} finally {
|
||||
await cleanupTempDir(tempDir2);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// =============================================================================
|
||||
// ws_error_handler_muted Persistence Tests
|
||||
// =============================================================================
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
import { expect, test, describe } from "bun:test";
|
||||
import { withTestBackend } from "./test_backend.ts";
|
||||
import { addWorkspace } from "../workspace.ts";
|
||||
import { writeFile } from "node:fs/promises";
|
||||
import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
||||
import {
|
||||
createLocalScript,
|
||||
createLocalFlow,
|
||||
@@ -19,7 +19,12 @@ import {
|
||||
/**
|
||||
* Helper to set up a workspace with wmill.yaml
|
||||
*/
|
||||
async function setupWorkspace(backend: any, tempDir: string, workspaceName: string) {
|
||||
async function setupWorkspace(
|
||||
backend: any,
|
||||
tempDir: string,
|
||||
workspaceName: string,
|
||||
nonDottedPaths = false
|
||||
) {
|
||||
const testWorkspace = {
|
||||
remote: backend.baseUrl,
|
||||
workspaceId: backend.workspace,
|
||||
@@ -29,11 +34,88 @@ async function setupWorkspace(backend: any, tempDir: string, workspaceName: stri
|
||||
await addWorkspace(testWorkspace, { force: true, configDir: backend.testConfigDir });
|
||||
|
||||
await writeFile(`${tempDir}/wmill.yaml`, `defaultTs: bun
|
||||
includes:
|
||||
${nonDottedPaths ? "nonDottedPaths: true\n" : ""}includes:
|
||||
- "**"
|
||||
excludes: []`, "utf-8");
|
||||
}
|
||||
|
||||
async function createLocalNonDottedFlow(tempDir: string, name: string) {
|
||||
const flowDir = `${tempDir}/f/test/${name}__flow`;
|
||||
await mkdir(flowDir, { recursive: true });
|
||||
|
||||
await writeFile(
|
||||
`${flowDir}/a.ts`,
|
||||
`export async function main() {\n return "Hello from flow ${name}";\n}`,
|
||||
"utf-8"
|
||||
);
|
||||
|
||||
await writeFile(
|
||||
`${flowDir}/flow.yaml`,
|
||||
`summary: "${name} flow"
|
||||
description: "A flow for testing"
|
||||
value:
|
||||
modules:
|
||||
- id: a
|
||||
value:
|
||||
type: rawscript
|
||||
content: "!inline a.ts"
|
||||
language: bun
|
||||
input_transforms: {}
|
||||
schema:
|
||||
$schema: "https://json-schema.org/draft/2020-12/schema"
|
||||
type: object
|
||||
properties: {}
|
||||
required: []
|
||||
`,
|
||||
"utf-8"
|
||||
);
|
||||
}
|
||||
|
||||
async function createLocalNonDottedApp(tempDir: string, name: string) {
|
||||
const appDir = `${tempDir}/f/test/${name}__app`;
|
||||
await mkdir(appDir, { recursive: true });
|
||||
|
||||
await writeFile(
|
||||
`${appDir}/app.yaml`,
|
||||
`summary: "${name} app"
|
||||
value:
|
||||
type: app
|
||||
grid:
|
||||
- id: button1
|
||||
data:
|
||||
type: buttoncomponent
|
||||
componentInput:
|
||||
type: runnable
|
||||
runnable:
|
||||
type: runnableByName
|
||||
inlineScript:
|
||||
content: |
|
||||
export async function main() {
|
||||
return "hello from app";
|
||||
}
|
||||
language: bun
|
||||
hiddenInlineScripts: []
|
||||
css: {}
|
||||
norefreshbar: false
|
||||
policy:
|
||||
on_behalf_of: null
|
||||
on_behalf_of_email: null
|
||||
triggerables: {}
|
||||
execution_mode: viewer
|
||||
`,
|
||||
"utf-8"
|
||||
);
|
||||
}
|
||||
|
||||
async function fileExists(filePath: string): Promise<boolean> {
|
||||
try {
|
||||
await stat(filePath);
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// Main test: processes scripts, flows, and apps together
|
||||
// =============================================================================
|
||||
@@ -156,6 +238,87 @@ describe("generate-metadata flags", () => {
|
||||
});
|
||||
});
|
||||
|
||||
test("--lock-only preserves non-dotted flow filenames", async () => {
|
||||
await withTestBackend(async (backend, tempDir) => {
|
||||
await setupWorkspace(backend, tempDir, "lock_only_non_dotted_test", true);
|
||||
|
||||
await createLocalNonDottedFlow(tempDir, "my_flow");
|
||||
|
||||
const result = await backend.runCLICommand(
|
||||
["generate-metadata", "--yes", "--lock-only"],
|
||||
tempDir,
|
||||
"lock_only_non_dotted_test"
|
||||
);
|
||||
|
||||
expect(result.code).toEqual(0);
|
||||
|
||||
const flowDir = `${tempDir}/f/test/my_flow__flow`;
|
||||
const flowYaml = await readFile(`${flowDir}/flow.yaml`, "utf-8");
|
||||
|
||||
expect(flowYaml).toContain("!inline a.ts");
|
||||
expect(flowYaml).toContain("!inline a.lock");
|
||||
expect(flowYaml).not.toContain(".inline_script.");
|
||||
expect(await fileExists(`${flowDir}/a.lock`)).toEqual(true);
|
||||
expect(await fileExists(`${flowDir}/a.inline_script.ts`)).toEqual(false);
|
||||
expect(await fileExists(`${flowDir}/a.inline_script.lock`)).toEqual(false);
|
||||
});
|
||||
});
|
||||
|
||||
test("generate-metadata preserves non-dotted flow inline script filenames", async () => {
|
||||
await withTestBackend(async (backend, tempDir) => {
|
||||
await setupWorkspace(backend, tempDir, "full_gen_non_dotted_flow_test", true);
|
||||
|
||||
await createLocalNonDottedFlow(tempDir, "my_flow");
|
||||
|
||||
const result = await backend.runCLICommand(
|
||||
["generate-metadata", "--yes"],
|
||||
tempDir,
|
||||
"full_gen_non_dotted_flow_test"
|
||||
);
|
||||
|
||||
expect(result.code).toEqual(0);
|
||||
|
||||
const flowDir = `${tempDir}/f/test/my_flow__flow`;
|
||||
const flowYaml = await readFile(`${flowDir}/flow.yaml`, "utf-8");
|
||||
|
||||
// Inline script references should use non-dotted naming
|
||||
expect(flowYaml).toContain("!inline a.ts");
|
||||
expect(flowYaml).toContain("!inline a.lock");
|
||||
expect(flowYaml).not.toContain(".inline_script.");
|
||||
expect(await fileExists(`${flowDir}/a.ts`)).toEqual(true);
|
||||
expect(await fileExists(`${flowDir}/a.lock`)).toEqual(true);
|
||||
expect(await fileExists(`${flowDir}/a.inline_script.ts`)).toEqual(false);
|
||||
expect(await fileExists(`${flowDir}/a.inline_script.lock`)).toEqual(false);
|
||||
});
|
||||
});
|
||||
|
||||
test("generate-metadata uses non-dotted app inline script filenames", async () => {
|
||||
await withTestBackend(async (backend, tempDir) => {
|
||||
await setupWorkspace(backend, tempDir, "non_dotted_app_gen_test", true);
|
||||
|
||||
await createLocalNonDottedApp(tempDir, "my_app");
|
||||
|
||||
const result = await backend.runCLICommand(
|
||||
["generate-metadata", "--yes"],
|
||||
tempDir,
|
||||
"non_dotted_app_gen_test"
|
||||
);
|
||||
|
||||
expect(result.code).toEqual(0);
|
||||
|
||||
const appDir = `${tempDir}/f/test/my_app__app`;
|
||||
const appYaml = await readFile(`${appDir}/app.yaml`, "utf-8");
|
||||
|
||||
// Inline script references should use non-dotted naming
|
||||
expect(appYaml).not.toContain(".inline_script.");
|
||||
// Verify no dotted inline script files were created
|
||||
const { readdir: readdirAsync } = await import("node:fs/promises");
|
||||
const files = await readdirAsync(appDir);
|
||||
const dottedFiles = files.filter((f: string) => f.includes(".inline_script."));
|
||||
expect(dottedFiles.length).toEqual(0);
|
||||
});
|
||||
});
|
||||
|
||||
test("--schema-only only processes scripts (skips flows and apps)", async () => {
|
||||
await withTestBackend(async (backend, tempDir) => {
|
||||
await setupWorkspace(backend, tempDir, "schema_only_test");
|
||||
|
||||
4
frontend/package-lock.json
generated
4
frontend/package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "windmill-components",
|
||||
"version": "1.655.0",
|
||||
"version": "1.657.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "windmill-components",
|
||||
"version": "1.655.0",
|
||||
"version": "1.657.0",
|
||||
"hasInstallScript": true,
|
||||
"license": "AGPL-3.0",
|
||||
"dependencies": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "windmill-components",
|
||||
"version": "1.655.0",
|
||||
"version": "1.657.0",
|
||||
"scripts": {
|
||||
"dev": "vite dev",
|
||||
"build": "vite build",
|
||||
|
||||
@@ -4,7 +4,7 @@ verify_ssl = true
|
||||
name = "pypi"
|
||||
|
||||
[packages]
|
||||
wmill = ">=1.655.0"
|
||||
wmill = ">=1.657.0"
|
||||
sendgrid = "*"
|
||||
mysql-connector-python = "*"
|
||||
pymongo = "*"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
openapi: '3.0.3'
|
||||
|
||||
info:
|
||||
version: 1.655.0
|
||||
version: 1.657.0
|
||||
title: OpenFlow Spec
|
||||
contact:
|
||||
name: Ruben Fiszel
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
RootModule = 'WindmillClient.psm1'
|
||||
|
||||
# Version number of this module.
|
||||
ModuleVersion = '1.655.0'
|
||||
ModuleVersion = '1.657.0'
|
||||
|
||||
# Supported PSEditions
|
||||
# CompatiblePSEditions = @()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "wmill"
|
||||
version = "1.655.0"
|
||||
version = "1.657.0"
|
||||
description = "A client library for accessing Windmill server wrapping the Windmill client API"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://windmill.dev"
|
||||
|
||||
@@ -119,6 +119,23 @@ folder related commands
|
||||
- `folder add-missing` - create default folder.meta.yaml for all subdirectories of f/ that are missing one
|
||||
- `-y, --yes` - skip confirmation prompt
|
||||
|
||||
### generate-metadata
|
||||
|
||||
Generate metadata (locks, schemas) for all scripts, flows, and apps
|
||||
|
||||
**Arguments:** `[folder:string]`
|
||||
|
||||
**Options:**
|
||||
- `--yes` - Skip confirmation prompt
|
||||
- `--dry-run` - Show what would be updated without making changes
|
||||
- `--lock-only` - Re-generate only the lock files
|
||||
- `--schema-only` - Re-generate only script schemas (skips flows and apps)
|
||||
- `--skip-scripts` - Skip processing scripts
|
||||
- `--skip-flows` - Skip processing flows
|
||||
- `--skip-apps` - Skip processing apps
|
||||
- `-i --includes <patterns:file[]>` - Comma separated patterns to specify which files to include
|
||||
- `-e --excludes <patterns:file[]>` - Comma separated patterns to specify which files to exclude
|
||||
|
||||
### gitsync-settings
|
||||
|
||||
Manage git-sync settings between local wmill.yaml and Windmill backend
|
||||
|
||||
@@ -1493,6 +1493,23 @@ folder related commands
|
||||
- \`folder add-missing\` - create default folder.meta.yaml for all subdirectories of f/ that are missing one
|
||||
- \`-y, --yes\` - skip confirmation prompt
|
||||
|
||||
### generate-metadata
|
||||
|
||||
Generate metadata (locks, schemas) for all scripts, flows, and apps
|
||||
|
||||
**Arguments:** \`[folder:string]\`
|
||||
|
||||
**Options:**
|
||||
- \`--yes\` - Skip confirmation prompt
|
||||
- \`--dry-run\` - Show what would be updated without making changes
|
||||
- \`--lock-only\` - Re-generate only the lock files
|
||||
- \`--schema-only\` - Re-generate only script schemas (skips flows and apps)
|
||||
- \`--skip-scripts\` - Skip processing scripts
|
||||
- \`--skip-flows\` - Skip processing flows
|
||||
- \`--skip-apps\` - Skip processing apps
|
||||
- \`-i --includes <patterns:file[]>\` - Comma separated patterns to specify which files to include
|
||||
- \`-e --excludes <patterns:file[]>\` - Comma separated patterns to specify which files to exclude
|
||||
|
||||
### gitsync-settings
|
||||
|
||||
Manage git-sync settings between local wmill.yaml and Windmill backend
|
||||
|
||||
@@ -124,6 +124,23 @@ folder related commands
|
||||
- `folder add-missing` - create default folder.meta.yaml for all subdirectories of f/ that are missing one
|
||||
- `-y, --yes` - skip confirmation prompt
|
||||
|
||||
### generate-metadata
|
||||
|
||||
Generate metadata (locks, schemas) for all scripts, flows, and apps
|
||||
|
||||
**Arguments:** `[folder:string]`
|
||||
|
||||
**Options:**
|
||||
- `--yes` - Skip confirmation prompt
|
||||
- `--dry-run` - Show what would be updated without making changes
|
||||
- `--lock-only` - Re-generate only the lock files
|
||||
- `--schema-only` - Re-generate only script schemas (skips flows and apps)
|
||||
- `--skip-scripts` - Skip processing scripts
|
||||
- `--skip-flows` - Skip processing flows
|
||||
- `--skip-apps` - Skip processing apps
|
||||
- `-i --includes <patterns:file[]>` - Comma separated patterns to specify which files to include
|
||||
- `-e --excludes <patterns:file[]>` - Comma separated patterns to specify which files to exclude
|
||||
|
||||
### gitsync-settings
|
||||
|
||||
Manage git-sync settings between local wmill.yaml and Windmill backend
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@windmill/windmill",
|
||||
"version": "1.655.0",
|
||||
"version": "1.657.0",
|
||||
"exports": "./src/index.ts",
|
||||
"publish": {
|
||||
"exclude": ["!src", "./s3Types.ts", "./sqlUtils.ts", "./client.ts"]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "windmill-client",
|
||||
"description": "Windmill SDK client for browsers and Node.js",
|
||||
"version": "1.655.0",
|
||||
"version": "1.657.0",
|
||||
"author": "Ruben Fiszel",
|
||||
"license": "Apache 2.0",
|
||||
"sideEffects": false,
|
||||
|
||||
@@ -1 +1 @@
|
||||
1.656.0
|
||||
1.657.0
|
||||
|
||||
Reference in New Issue
Block a user